Wikipidiya
bolwiki
https://bol.wikipedia.org/wiki/Peji_In_Siri
MediaWiki 1.48.0-wmf.4
first-letter
Media
Inmusamman
Mossa
Ruta
Rutta mossa
Wikipidiya
Wikipidiya mossa
Fayil
Fayil mossa
MediaWiki
MediaWiki mossa
Tempilet
Tempilet mossa
Taimako
Taimako mossa
Panni
Panni mossa
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Peji In Siri
0
1
33533
11515
2026-11-11T22:20:35Z
RAPTOR7762
18
33533
wikitext
text/x-wiki
__NOTOC__ __NOEDITSECTION__
<!--{{Protection padlock|small=yes}}-->
{{Top icon|image=Wikimedia Community Logo.svg|link=m:Bole Wikimedians User Group}}
{{Top icon|image=2023 Facebook icon.svg|link=https://www.facebook.com/61590521903033/}}
{{Top icon|image=Wiktionary small.svg|link=wiktionary:bol:}}
{{Top icon|image=Tango style Wikipedia Icon.svg|link=w:bol:}}
<div style="text-align:center;">
{{Clickable button|Special:Purge/Peji In Siri|Purge this page|class=mw-ui-progressive}}
</div>
<templatestyles src="Main page/Styles.css" />
<div style="position:relative; text-align:center; padding:3em 1em; background:#fff; overflow:hidden;">
<div style="position:absolute; top:-50px; left:0; right:0; text-align:center; opacity:0.1; z-index:0;">
[[File:Wikipedia-logo-v2.svg|650px|center|class=notpageimage|link=]]
</div>
<div style="position:relative; z-index:1;">
<div style="font-variant:small-caps; font-family:'Linux Libertine','Georgia',serif;"><div style="font-size:180%;">U'se ga nako</div>
<div style="font-size:270%; line-height:1;">[[Wikipidiya|<span style="display: inline-block; letter-spacing: -0.35em; margin-right: 0.2em; font-family: serif;">V<span style="margin-left: -0.1em;">V</span></span>ikipidiya]] in bòo pìkkà</div>
</div>
<div style="font-size:120%; line-height:1.2;"> Wikipidiya ensakulopidiya in lelo in [[Harshe Bole]] la lemalo agita ina ramayi.</div>
<div style="font-size:120%; line-height:1.2;"> Honsene Andi makaloli '''[[Special:AllPages|{{NUMBEROFARTICLES}}]]''' ga harshe Bole</div>
</div>
</div>
<div style="text-align:right;">
[[File:Wikimedia Community Logo.svg|30px|link=m:Bole Wikimedians User Group]] [[File:2023 Facebook icon.svg|30px|link=https://www.facebook.com/61590521903033/]] [[File:Tango style Wikipedia Icon.svg|30px|link=w:bol:]] [[File:Wiktionary small.svg|30px|link=wiktionary:bol:]]
</div>
<div style="margin:10px 0px 10px 0px; -moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.1); -webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.1); box-shadow:0 1px 1px rgba(0, 0, 0, 0.1); background-color:#FFFFFF;">
{| style="border-spacing: 1px; border-collapse: separate; width:100%; text-align:center; font-size:0.85em; padding:2px 3px 2px 3px;" class="hp-portalen"
| style="background-color:#F0F0F9; border-top:5px solid; border-color:#333399; padding:3px 0.15em; width:6.6%;" | [[:Category:Atiimala|<span style="color:#000000;">Atiimala</span>]]
| style="background-color:#F0F9F9; border-top:5px solid; border-color:#339999; padding:3px 0.15em; width:6.6%;" | [[:Category:Annoba|<span style="color:#000000;">Annoba</span>]]
| style="background-color:#F0F4F9; border-top:5px solid; border-color:#336699; padding:3px 0.15em; width:6.6%;" | [[:Category:Fasaha|<span style="color:#000000;">Fasaha</span>]]
| style="background-color:#F9F0F0; border-top:5px solid; border-color:#993333; padding:3px 0.15em; width:6.6%;" | [[:Category:Ilimi|<span style="color:#000000;">Ilimi</span>]]
| style="background-color:#F0F0F9; border-top:5px solid; border-color:#333399; padding:3px 0.15em; width:6.6%;" | [[:Category:Lamba|<span style="color:#000000;">Lamba</span>]]
| style="background-color:#F4F9F0; border-top:5px solid; border-color:#669933; padding:3px 0.15em; width:6.6%;" | [[:Category:Miyya|<span style="color:#000000;">Miyya</span>]]
| style="background-color:#F9F9F0; border-top:5px solid; border-color:#999933; padding:3px 0.15em; width:6.6%;" | [[:Category:Makami|<span style="color:#000000;">Makami</span>]]
| style="background-color:#F9F0F9; border-top:5px solid; border-color:#993399; padding:3px 0.15em; width:6.6%;" | [[:Category:Malunwa|<span style="color:#000000;">Malunwa</span>]]
| style="background-color:#F9F0F4; border-top:5px solid; border-color:#993366; padding:3px 0.15em; width:6.6%;" | [[:Category:Lelo'aji|<span style="color:#000000;">Lelo'aji</span>]]
| style="background-color:#F0F0F9; border-top:5px solid; border-color:#333399; padding:3px 0.15em; width:6.6%;" | [[:Category:Tarihi|<span style="color:#000000;">Tarihi</span>]]
| style="background-color:#F0F9F9; border-top:5px solid; border-color:#339999; padding:3px 0.15em; width:6.6%;" | [[:Category:Goma|<span style="color:#000000;">Goma</span>]]
| style="background-color:#F9F0F9; border-top:5px solid; border-color:#993399; padding:3px 0.15em; width:6.6%;" | [[:Category:Kimiyya|<span style="color:#000000;">Kimiyya</span>]]
| style="background-color:#F4F9F0; border-top:5px solid; border-color:#669933; padding:3px 0.15em; width:6.6%;" | [[:Category:Zane|<span style="color:#000000;">Zane</span>]]
|}
</div>
<templatestyles src="Main page/Styles.css" />
<div style="flex:1; min-width:300px; overflow:hidden; border-radius:4px; margin:8px 4px 4px 4px; box-shadow:0 0 8px rgba(0,0,0,0.15);">
<div class="image-carousel">
<ul>
<li>
<div style="background:#FFF; padding:5px; font-size:150%; font-family:'Arial',sans-serif; position: relative; z-index: 2;">
<div style="padding:5px 10px; color:#333333;">[[File:Star-alt-icon.png|20px|link=]] Featured Article</div>
</div>
<div class="carousel-image">
[[File:The City Gate of Abuja.jpg|center|class=carousel-image-wrapper|link=Nijeriya|Nijeriya]]
</div>
<div class="carousel-slide-content-wrapper">
<div class="carousel-slide-content">
<div class="carousel-slide-description">Nijeriya ko Nijeriya da (turanci: Nigeria): A Gwamanatance Tarayyar Najeriya, woli la ga take ga Africa ko zoni ita ji tetteke woli niger koga Arewa. Ga Chadi koga zoni koga aushi jam aji dar ga teku Atlantika.</div>
<div class="carousel-slide-title">[[Nijeriya]]</div>
</div>
</div>
</li>
<li>
<div style="background:#FFF; padding:5px; font-size:150%; font-family:'Arial',sans-serif; position: relative; z-index: 2;">
<div style="padding:5px 10px; color:#333333;">[[File:Paomedia small-n-flat sign-question.svg|20px|link=]] Kamontuwo?</div>
</div>
<div class="carousel-image">
[[File:Gooya mountain.jpg|center|class=carousel-image-wrapper|link=Gooya mountain]]
</div>
<div class="carousel-slide-content-wrapper">
<div class="carousel-slide-content">
<div class="carousel-slide-description">Gooya kam zoi wuro la tudu ga arewa [[Nijeriya]], inda Bòo pikka ye kam la yare miyya aji magana da yawa ga yankin da ke kewaye.
</div>
<div class="carousel-slide-title">[[Potiskum]]</div>
</div>
</div>
</li>
<li>
<div style="background:#FFF; padding:5px; font-size:150%; font-family:'Arial',sans-serif; position: relative; z-index: 2;">
<div style="padding:5px 10px; color:#333333;">[[File:Paomedia small-n-flat file-picture.svg|20px|link=]] Featured Picture</div>
</div>
<div class="carousel-image">
[[File:Daniski Festival 04.jpg|center|class=carousel-image-wrapper|link=File:Daniski Festival 04.jpg]]
</div>
<div class="carousel-slide-content-wrapper">
<div class="carousel-slide-content">
<div class="carousel-slide-description">Daniski Hills Annual Festival kam zoi tarayya la al’ada, ba Bòo pikka ga Fika Emirate ga Yobe State, [[Nijeriya]].
</div>
<div class="carousel-slide-title">[[:File:Daniski Festival 04.jpg|Daniski Festival Picture]]</div>
</div>
</div>
</li>
</ul>
</div>
</div>
<div style="display:flex; flex-wrap:wrap;">
{{Box
|header=[[File:Paomedia small-n-flat sign-info.svg|20px|link=]] Elle Wikipidiya?
|content=<span style="float: left; margin: 6px 12px 6px 0px; display: inline-block;">[[File:Wikipedia-logo-v2-bol.svg|100px]]</span>Wikipidiya shafi ji in Yana gizonla ona gudumawa inko rubutu mukalai kala aji gidan ga goggo gozi ilmi do ramu-ramu ga messesu. Gabo turanci ga unda shap Maddi la ramu ramu do gede ga ilmi ga shafuka Wikipedia ga sun Wikipedia, wikipidiya aji tattira ga harsuna GA duniya ga godon shafuka lemalo aji kirkira do ramu mukalai gabo kyauta inko taimako beyi wena ilmi bo kyauta, emeyye aji Wikipedia ga zarrar a shap ga duniya beyi wena ilmi koga asali beyi ilmi fetengo.
}}
{{Box
|header=[[File:Paomedia small-n-flat pencil.svg|20px|link=]] Kirkiru Foyo Article
|content=Kaji kume Harshe Bole? Kagita ina taimako beyi Bunƙasa kunsu eme Mona (ensakulopidiya) ko goggo kirkire foyo makaloli do fadada la aji Andi ga fatan aji doffa ka'idoji Al'umma lokaci ona ga gundumawa.<br><small><i></i></small>
<div style="margin-top:1em;">
<inputbox>
type=create
width=30
default=
buttonlabel=Kirkiru Foyo Makala
</inputbox>
</div>
}}
</div>
{{Box
|header=English speakers
|content=If you speak English, but you don't know anything about the Bole Language, you are also welcome to edit and assist in technical support, such as maintaining Templates or Modules. Your role is vital to the smooth running of the Bole Wikipedia!
}}
{{Box
|header=[[File:Wikimedia-logo.svg|20px|link=]] Project Modi
|content={{SisterProjects}}<br><span style="font-size:150%;"><b>Other Projects / Initiatives</b></span><br>{{OtherProjects}}
}}
{{Bole Wikimedians User Group}}
<div class="mobile-only">
{{Bole Wikimedians User Group/mobile}}
</div>
spg91u0a8ge9lsp5x1niv3v4vsjz4pb
Tempilet:Br separated entries
10
45
33476
98
2026-09-12T17:59:41Z
en>MusikBot II
0
Protected "[[Template:Br separated entries]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 1845910 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33476
wikitext
text/x-wiki
#redirect [[Template:Br-separated entries]]
{{R from move}}
c0u0qyecuumnh3v1pqtya3hbq3c437f
33477
33476
2026-11-11T22:00:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Br_separated_entries]]
33476
wikitext
text/x-wiki
#redirect [[Template:Br-separated entries]]
{{R from move}}
c0u0qyecuumnh3v1pqtya3hbq3c437f
Tempilet:Infobox country/sandbox
10
112
32920
8188
2026-11-11T21:06:47Z
RAPTOR7762
18
/* */
32920
wikitext
text/x-wiki
<includeonly>{{Infobox/sandbox
| above = {{{conventional_long_name|Infobox Country}}}
| subheader = {{#if:{{{native_name|}}}|'' {{{native_name|}}} ''}}
| image = [[Fayil:{{{image_flag|Flag of none.svg}}}|{{{flag_width|125px}}}|border]]
| caption = Tuta
| image2 = [[Fayil:{{{image_coat|Insigne incognitum.svg}}}|{{{coat_width|85px}}}]]
| caption2 = {{{emblem_type|Tambari woli}}}
| header1 = {{#if:{{{national_motto|{{{motto|}}}}}}|Take}}
| data1 = {{{national_motto|{{{motto|}}}}}}
| header2 = {{#if:{{{national_anthem|}}}|National anthem}}
| data2 = {{{national_anthem|}}}
| header3 = [[Fayil:{{{image_map|Blank borderless map of Africa (orthographic projection).svg}}}|{{{map_width|300px}}}]]{{#if:{{{image_map2|}}}|<br>[[Fayil:{{{image_map2|}}}|{{{map_width|300px}}}]]}}
| label4 = {{#if:{{{capital|}}}|<div style="text-align:center">Birni in Siri</div>}}
| data4 = {{{capital|}}}{{#if:{{{coordinates|}}}|<br>{{{coordinates|}}}}}
| label5 = {{#if:{{{largest_city|}}}| <div style="text-align:center">Birni la yatu Siri</div>}}
| data5 = {{{largest_city|}}}{{{coordinates2|}}}
| label6 = {{#if:{{{demonym|}}}|<div style="text-align:center">Sun miyya woli</div>}}
| data6 = {{{demonym|}}}
| label7 = {{#if:{{{official_languages|}}}|<div style="text-align:center">Harshe la lelo'aji kumeyi</div>}}
| data7 = {{{official_languages|}}}
| label8 = {{#if:{{{ethnic_groups|}}}|<div style="text-align:center">Kabilu</div>}}
| data8 = {{{ethnic_groups|}}}
| label9 = {{#if:{{{government|}}}|<div style="text-align:center">Gwamnati</div>}}
| data9 = {{{government|}}}
| label10 = {{#if:{{{leader1|}}}|</strong>• {{{leader1_type}}}<strong>}}
| data10 = {{{leader1|}}}
| label11 = {{#if:{{{leader2|}}}|</strong>• {{{leader2_type}}}<strong>}}
| data11 = {{{leader2|}}}
| label12 = {{#if:{{{leader3|}}}|</strong>• {{{leader3_type}}}<strong>}}
| data12 = {{{leader3|}}}
| header13 = {{{sovereignty_type|}}}
| label14 = {{#if:{{{established_event1|}}}|</strong>• {{{established_event1}}}<strong>}}
| data14 = {{{established_date1|}}}
| label15 = {{#if:{{{established_event2|}}}|</strong>• {{{established_event2}}}<strong>}}
| data15 = {{{established_date2|}}}
| label16 = {{#if:{{{established_event3|}}}|</strong>• {{{established_event3}}}<strong>}}
| data16 = {{{established_date3|}}}
| label17 = {{#if:{{{established_event4|}}}|</strong>• {{{established_event4}}}<strong>}}
| data17 = {{{established_date4|}}}
| label18 = {{#if:{{{established_event5|}}}|</strong>• {{{established_event5}}}<strong>}}
| data18 = {{{established_date5|}}}
| label19 = {{#if:{{{established_event6|}}}|</strong>• {{{established_event6}}}<strong>}}
| data19 = {{{established_date6|}}}
| header20 = {{#if:{{{area_sq_km|}}}| <div style="text-align:center">Fadi woli</div>}}
| label21 = {{#if:{{{area_sq_km|}}}|</strong>• {{{area_label|Jimilla ya maddi}}}<strong>}}
| data21 = {{{area_sq_km|}}}{{#if:{{{area_sq_mi|}}}|<br>({{{area_sq_mi|}}})}}{{#if:{{{area_rank|}}}|<br>({{{area_rank|}}})}}
}}{{#switch:{{FULLPAGENAME}}
| Tempilet:Infobox country =
| Tempilet:Infobox country/doc =
| Tempilet:Infobox country/sandbox =
| #default = [[Panni:Lelo'aji]]
}}
</includeonly>
13ai575c9ynyiss6wpwzi2ghci7o7e7
Tempilet:Longitem
10
126
32831
2023-05-09T01:38:28Z
en>Neveselbert
0
Undid revision 1153902556 by [[Special:Contributions/Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]]) - backlinked
32831
wikitext
text/x-wiki
<noinclude>{{#tag: code|
</noinclude>{{#ifeq: {{{1|+}}} | {{{1|-}}} | <div style="}}display: inline-block; line-height: 1.2em; padding: .1em 0; {{#ifeq: {{{1|+}}} | {{{1|-}}} | {{{style|}}}">{{{1|}}}</div> | <includeonly>width: 100%;</includeonly> }}<includeonly>{{#if:{{{2|}}}|[[Category:Pages using Template:Longitem with unnamed style parameter]]}}</includeonly><noinclude>
|lang=wikitext}}
{{documentation}}
</noinclude>
4su34d6iyeitkxv5kq4ju2g5b16lqss
32832
644
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Longitem]]
643
wikitext
text/x-wiki
<noinclude>{{#tag: code|
</noinclude>{{#ifeq: {{{1|+}}} | {{{1|-}}} | <div style="}}display: inline-block; line-height: 1.2em; padding: .1em 0; {{#ifeq: {{{1|+}}} | {{{1|-}}} | {{{style|}}}">{{{1|}}}</div> | <includeonly>width: 100%;</includeonly> }}<includeonly>{{#if:{{{2|}}}|[[Panni:Pages using Template:Longitem with unnamed style parameter]]}}</includeonly><noinclude>
|lang=wikitext}}
{{Documentation}}
</noinclude>
2vhskyvjn44rk8mq6upmh1mgvnjesq9
Tempilet:PAGENAMEBASE
10
155
32823
2024-10-28T10:45:21Z
en>Dinoguy1000
0
fix "|=foo" bug
32823
wikitext
text/x-wiki
{{safesubst:<noinclude/>#invoke:String|replace|{{{1|{{safesubst:<noinclude/>PAGENAME}}}}}|%s+%b()$||1|false}}<noinclude>
{{documentation}}
</noinclude>
hfmr5rmcuhdncvzny8x6n6ob8hddcpq
32824
800
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Template:PAGENAMEBASE]]
799
wikitext
text/x-wiki
{{safesubst:<noinclude/>#invoke:String|replace|{{{1|{{safesubst:<noinclude/>PAGENAME}}}}}|%s+%b()$||1|false}}<noinclude>
{{Documentation}}
</noinclude>
si0l67677d6qo3op6e2e7cpceofiq7h
Tempilet:Sup
10
172
33347
2025-11-07T21:16:10Z
en>Plastikspork
0
Closing TfD
33347
wikitext
text/x-wiki
<includeonly><sup>{{{1}}}</sup></includeonly><noinclude>
{{documentation}}
<!-- Add cats and interwikis to the /doc subpage, not here! -->
</noinclude>
p7jtnmtnj3q8sxqqsv78o732eq15smw
33348
8306
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sup]]
8306
wikitext
text/x-wiki
<sup>{{{1|}}}</sup><noinclude>
{{Documentation}}
</noinclude>
0i2fyuk1jk5qckgshx32jp5pax29xum
Tempilet:Template rating
10
177
33399
11644
2026-10-30T05:25:25Z
en>Axolitl
0
While replacing template redirects is generally unnecessary, in high-use templates it can be helpful as redirects use double database storage, and redirects are unnecessary here. See [[phab:T343131]] for a bit of info.
33399
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}<!-- Escape empty required first unnamed parameter -->|{{#switch:{{Namespace detect|template=t|module=m|demospace={{{demospace|}}}|page={{{demopage|}}}}}
|m
|t = <!-- ***** IF IN MODULE OR TEMPLATE NAMESPACE ***** -->{{ombox
| type = notice
| image = {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = [[File:Ambox warning blue construction.svg|40x40px|link=|alt=]]
| alpha | a = [[File:Greek lc alpha icon.svg|class=skin-invert|26x26px|link=|alt=]]
| beta | b = [[File:Greek lc beta icon.svg|class=skin-invert|40x40px|link=|alt=]]
| release | r | general | g | stable | protected | protect | p | semiprotected | semiprotect | semi = [[File:Green check.svg|40x40px|link=|alt=]]
| broken | br | unstable = [[File:Red x.svg|40x40px|link=|alt=]]
| deprecated | d | defunct = [[File:Historical.svg|40x40px|link=|alt=]]
}}
| style =
| textstyle =
| text = {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in pre-alpha development|pre-alpha]]. It is incomplete and may or may not be in active development. Do not use it in [[Wikipedia:Article namespace|article namespace]] pages. A {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}} remains in pre-alpha until its developer, or another editor who adopts it if it is abandoned for some time, considers the basic structure complete.
| alpha | a = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in alpha|alpha]]. It is ready for limited use and third-party feedback. It may be used on a small number of pages, but should be monitored closely. Suggestions for new features or adjustments to input and output are welcome.
| beta | b = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in beta|beta]]. It is considered ready for widespread use, but as it is still relatively new, it should be applied with some caution to ensure results are as expected.
| release | r | general | g | stable | protected | protect | p | semiprotected | semiprotect | semi = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s for general use|ready for general use]]. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on [[Wikipedia:Help pages|help pages]] and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through [[Wikipedia:Template sandbox and test cases|sandbox testing]] rather than repeated trial-and-error editing.
| broken | br | unstable = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:Unstable {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|unstable]]. It has missing dependencies, compatibility issues, or output errors that make it unusable. Editors are encouraged to [[Special:EditPage/{{FULLPAGENAME}}|improve its compatibility]] or [[Wikipedia:Templates for discussion|nominate it for deletion]] if it cannot be fixed.
| deprecated | d | defunct = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as '''[[:Category:Deprecated {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|deprecated]]''' and defunct.{{#if:{{{replaced|}}}|{{space}}It is recommended editors use [[{{{replaced}}}]].}}{{#if:{{{message|}}}|{{space}}{{{message}}}}}
| #default = {{error|Page using [[Template:Template rating]] with <u>invalid</u> template or module rating in {{para|1}} parameter.}}[[Category:Pages using template rating template with invalid rating|{{FULLPAGENAME}}]]
}}
}}<!-- Categorize.
-->{{#if:{{{demopage|}}}{{{demospace|}}}||
{{#switch: {{lc:{{SUBPAGENAME}}}}
| doc | sandbox =<!-- No category for /doc or /sandbox subpages -->
| {{#ifeq: {{{nocat|}}} | true
| <!-- No category if user sets nocat=true -->
| {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in pre-alpha development|{{PAGENAME}}]]
| alpha | a = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in alpha|{{PAGENAME}}]]
| beta | b = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in beta|{{PAGENAME}}]]
| release | r | general | g | stable | protected | p | semiprotected | semiprotect | semi = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s for general use|{{PAGENAME}}]]
| deprecated | d | defunct = [[Category:Deprecated {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|{{PAGENAME}}]]
| broken | br | unstable = [[Category:Unstable {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|{{PAGENAME}}]]
}}
}}
}}
}}
| #default = <!-- ***** Error not in Template or Module namespaces ***** -->{{if preview|1={{error|Error: {{tl|Template rating}} can only be used on pages in the [[Wikipedia:Template namespace|Template:]] or [[Wikipedia:Module namespace|Module: namespaces]].}}}}[[Category:Pages with templates in the wrong namespace]]
}}<!-- End switch. -->|{{If preview|1={{error|Page using [[Template:Template rating]] with <u>empty</u> {{para|1}} module rating parameter.}}}}[[Category:Pages using template rating template with invalid rating|{{FULLPAGENAME}}]]<!--
-->}}<!-- End if. Display protection template if necessary, this will obviously show it for /doc page too since it uses {{FULLPAGENAME}}: -->{{#switch:{{Namespace detect|template=t|module=m|demospace={{{demospace|}}}}}
|t|m = {{#if:{{{suppress-pp|}}}
|
|{{#switch:{{#invoke:Effective protection level|edit|1={{{demopage|{{FULLPAGENAME}}}}}}}
|*|user = <!-- If not protected page, do nothing. -->
|#default = {{#ifeq:{{lc:{{SUBPAGENAME}}}}|doc
|<!-- {{#if:{{{2|}}}{{{doc-reason|}}}{{{3|}}}{{{doc-action|}}} --><!--
--><!-- | -->{{Protected page|1={{{2|{{{doc-reason|}}}}}}|action={{{3|{{{doc-action|}}}}}}}}<!--
--><!-- }} -->
-->|{{Protected page|1={{{reason|{{{doc-reason|}}}}}}|action={{{action|{{{doc-action|}}}}}}|demolevel={{{demolevel|}}}}}<!--
-->}}<!--
-->}}<!--
-->}}
|#default = <!-- If not in template or module namespace, do nothing
-->}}<!--
End template, start tracking.
-->{{#invoke:Check for unknown parameters| check
| unknown = {{#if:{{{demopage|}}}{{{demospace|}}}||{{#switch:{{Namespace detect|template=t|module=m}}|m|t=[[Category:Pages using template rating template with unknown parameters|_VALUE_{{FULLPAGENAME}}]]}}}}
| preview = Page using [[Template:Template rating]] with unknown parameter "_VALUE_"
| ignoreblank=y | demospace | demopage | 1 | 2 | 3 | reason | action | doc-reason | doc-action | nocat | replaced | message | demolevel | suppress-pp | demopage
}}</includeonly><!-- End tracking. --><noinclude>
{{template rating/sandbox|release|nocat=true|demospace=template|demopage=template:template rating|demolevel=edit}}
{{mbox|text=The above template is a demo.}}
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
ac25mc3xnkpc2npduzhhvdd3p92d3ne
33400
33399
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Template_rating]]
33399
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}<!-- Escape empty required first unnamed parameter -->|{{#switch:{{Namespace detect|template=t|module=m|demospace={{{demospace|}}}|page={{{demopage|}}}}}
|m
|t = <!-- ***** IF IN MODULE OR TEMPLATE NAMESPACE ***** -->{{ombox
| type = notice
| image = {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = [[File:Ambox warning blue construction.svg|40x40px|link=|alt=]]
| alpha | a = [[File:Greek lc alpha icon.svg|class=skin-invert|26x26px|link=|alt=]]
| beta | b = [[File:Greek lc beta icon.svg|class=skin-invert|40x40px|link=|alt=]]
| release | r | general | g | stable | protected | protect | p | semiprotected | semiprotect | semi = [[File:Green check.svg|40x40px|link=|alt=]]
| broken | br | unstable = [[File:Red x.svg|40x40px|link=|alt=]]
| deprecated | d | defunct = [[File:Historical.svg|40x40px|link=|alt=]]
}}
| style =
| textstyle =
| text = {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in pre-alpha development|pre-alpha]]. It is incomplete and may or may not be in active development. Do not use it in [[Wikipedia:Article namespace|article namespace]] pages. A {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}} remains in pre-alpha until its developer, or another editor who adopts it if it is abandoned for some time, considers the basic structure complete.
| alpha | a = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in alpha|alpha]]. It is ready for limited use and third-party feedback. It may be used on a small number of pages, but should be monitored closely. Suggestions for new features or adjustments to input and output are welcome.
| beta | b = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in beta|beta]]. It is considered ready for widespread use, but as it is still relatively new, it should be applied with some caution to ensure results are as expected.
| release | r | general | g | stable | protected | protect | p | semiprotected | semiprotect | semi = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s for general use|ready for general use]]. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on [[Wikipedia:Help pages|help pages]] and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through [[Wikipedia:Template sandbox and test cases|sandbox testing]] rather than repeated trial-and-error editing.
| broken | br | unstable = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:Unstable {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|unstable]]. It has missing dependencies, compatibility issues, or output errors that make it unusable. Editors are encouraged to [[Special:EditPage/{{FULLPAGENAME}}|improve its compatibility]] or [[Wikipedia:Templates for discussion|nominate it for deletion]] if it cannot be fixed.
| deprecated | d | defunct = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as '''[[:Category:Deprecated {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|deprecated]]''' and defunct.{{#if:{{{replaced|}}}|{{space}}It is recommended editors use [[{{{replaced}}}]].}}{{#if:{{{message|}}}|{{space}}{{{message}}}}}
| #default = {{error|Page using [[Template:Template rating]] with <u>invalid</u> template or module rating in {{para|1}} parameter.}}[[Category:Pages using template rating template with invalid rating|{{FULLPAGENAME}}]]
}}
}}<!-- Categorize.
-->{{#if:{{{demopage|}}}{{{demospace|}}}||
{{#switch: {{lc:{{SUBPAGENAME}}}}
| doc | sandbox =<!-- No category for /doc or /sandbox subpages -->
| {{#ifeq: {{{nocat|}}} | true
| <!-- No category if user sets nocat=true -->
| {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in pre-alpha development|{{PAGENAME}}]]
| alpha | a = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in alpha|{{PAGENAME}}]]
| beta | b = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in beta|{{PAGENAME}}]]
| release | r | general | g | stable | protected | p | semiprotected | semiprotect | semi = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s for general use|{{PAGENAME}}]]
| deprecated | d | defunct = [[Category:Deprecated {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|{{PAGENAME}}]]
| broken | br | unstable = [[Category:Unstable {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|{{PAGENAME}}]]
}}
}}
}}
}}
| #default = <!-- ***** Error not in Template or Module namespaces ***** -->{{if preview|1={{error|Error: {{tl|Template rating}} can only be used on pages in the [[Wikipedia:Template namespace|Template:]] or [[Wikipedia:Module namespace|Module: namespaces]].}}}}[[Category:Pages with templates in the wrong namespace]]
}}<!-- End switch. -->|{{If preview|1={{error|Page using [[Template:Template rating]] with <u>empty</u> {{para|1}} module rating parameter.}}}}[[Category:Pages using template rating template with invalid rating|{{FULLPAGENAME}}]]<!--
-->}}<!-- End if. Display protection template if necessary, this will obviously show it for /doc page too since it uses {{FULLPAGENAME}}: -->{{#switch:{{Namespace detect|template=t|module=m|demospace={{{demospace|}}}}}
|t|m = {{#if:{{{suppress-pp|}}}
|
|{{#switch:{{#invoke:Effective protection level|edit|1={{{demopage|{{FULLPAGENAME}}}}}}}
|*|user = <!-- If not protected page, do nothing. -->
|#default = {{#ifeq:{{lc:{{SUBPAGENAME}}}}|doc
|<!-- {{#if:{{{2|}}}{{{doc-reason|}}}{{{3|}}}{{{doc-action|}}} --><!--
--><!-- | -->{{Protected page|1={{{2|{{{doc-reason|}}}}}}|action={{{3|{{{doc-action|}}}}}}}}<!--
--><!-- }} -->
-->|{{Protected page|1={{{reason|{{{doc-reason|}}}}}}|action={{{action|{{{doc-action|}}}}}}|demolevel={{{demolevel|}}}}}<!--
-->}}<!--
-->}}<!--
-->}}
|#default = <!-- If not in template or module namespace, do nothing
-->}}<!--
End template, start tracking.
-->{{#invoke:Check for unknown parameters| check
| unknown = {{#if:{{{demopage|}}}{{{demospace|}}}||{{#switch:{{Namespace detect|template=t|module=m}}|m|t=[[Category:Pages using template rating template with unknown parameters|_VALUE_{{FULLPAGENAME}}]]}}}}
| preview = Page using [[Template:Template rating]] with unknown parameter "_VALUE_"
| ignoreblank=y | demospace | demopage | 1 | 2 | 3 | reason | action | doc-reason | doc-action | nocat | replaced | message | demolevel | suppress-pp | demopage
}}</includeonly><!-- End tracking. --><noinclude>
{{template rating/sandbox|release|nocat=true|demospace=template|demopage=template:template rating|demolevel=edit}}
{{mbox|text=The above template is a demo.}}
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
ac25mc3xnkpc2npduzhhvdd3p92d3ne
33429
11644
2026-10-30T05:25:25Z
en>Axolitl
0
While replacing template redirects is generally unnecessary, in high-use templates it can be helpful as redirects use double database storage, and redirects are unnecessary here. See [[phab:T343131]] for a bit of info.
33429
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}<!-- Escape empty required first unnamed parameter -->|{{#switch:{{Namespace detect|template=t|module=m|demospace={{{demospace|}}}|page={{{demopage|}}}}}
|m
|t = <!-- ***** IF IN MODULE OR TEMPLATE NAMESPACE ***** -->{{ombox
| type = notice
| image = {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = [[File:Ambox warning blue construction.svg|40x40px|link=|alt=]]
| alpha | a = [[File:Greek lc alpha icon.svg|class=skin-invert|26x26px|link=|alt=]]
| beta | b = [[File:Greek lc beta icon.svg|class=skin-invert|40x40px|link=|alt=]]
| release | r | general | g | stable | protected | protect | p | semiprotected | semiprotect | semi = [[File:Green check.svg|40x40px|link=|alt=]]
| broken | br | unstable = [[File:Red x.svg|40x40px|link=|alt=]]
| deprecated | d | defunct = [[File:Historical.svg|40x40px|link=|alt=]]
}}
| style =
| textstyle =
| text = {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in pre-alpha development|pre-alpha]]. It is incomplete and may or may not be in active development. Do not use it in [[Wikipedia:Article namespace|article namespace]] pages. A {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}} remains in pre-alpha until its developer, or another editor who adopts it if it is abandoned for some time, considers the basic structure complete.
| alpha | a = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in alpha|alpha]]. It is ready for limited use and third-party feedback. It may be used on a small number of pages, but should be monitored closely. Suggestions for new features or adjustments to input and output are welcome.
| beta | b = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in beta|beta]]. It is considered ready for widespread use, but as it is still relatively new, it should be applied with some caution to ensure results are as expected.
| release | r | general | g | stable | protected | protect | p | semiprotected | semiprotect | semi = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s for general use|ready for general use]]. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on [[Wikipedia:Help pages|help pages]] and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through [[Wikipedia:Template sandbox and test cases|sandbox testing]] rather than repeated trial-and-error editing.
| broken | br | unstable = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as [[:Category:Unstable {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|unstable]]. It has missing dependencies, compatibility issues, or output errors that make it unusable. Editors are encouraged to [[Special:EditPage/{{FULLPAGENAME}}|improve its compatibility]] or [[Wikipedia:Templates for discussion|nominate it for deletion]] if it cannot be fixed.
| deprecated | d | defunct = This [[Wikipedia:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}|{{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}]] is rated as '''[[:Category:Deprecated {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|deprecated]]''' and defunct.{{#if:{{{replaced|}}}|{{space}}It is recommended editors use [[{{{replaced}}}]].}}{{#if:{{{message|}}}|{{space}}{{{message}}}}}
| #default = {{error|Page using [[Template:Template rating]] with <u>invalid</u> template or module rating in {{para|1}} parameter.}}[[Category:Pages using template rating template with invalid rating|{{FULLPAGENAME}}]]
}}
}}<!-- Categorize.
-->{{#if:{{{demopage|}}}{{{demospace|}}}||
{{#switch: {{lc:{{SUBPAGENAME}}}}
| doc | sandbox =<!-- No category for /doc or /sandbox subpages -->
| {{#ifeq: {{{nocat|}}} | true
| <!-- No category if user sets nocat=true -->
| {{#switch: {{lc:{{{1|}}}}}
| pre-alpha | prealpha | pa | experimental = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in pre-alpha development|{{PAGENAME}}]]
| alpha | a = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in alpha|{{PAGENAME}}]]
| beta | b = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s in beta|{{PAGENAME}}]]
| release | r | general | g | stable | protected | p | semiprotected | semiprotect | semi = [[Category:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}s for general use|{{PAGENAME}}]]
| deprecated | d | defunct = [[Category:Deprecated {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|{{PAGENAME}}]]
| broken | br | unstable = [[Category:Unstable {{lc:{{NAMESPACE:{{{demopage|{{FULLPAGENAME}}}}}}}}}s|{{PAGENAME}}]]
}}
}}
}}
}}
| #default = <!-- ***** Error not in Template or Module namespaces ***** -->{{if preview|1={{error|Error: {{tl|Template rating}} can only be used on pages in the [[Wikipedia:Template namespace|Template:]] or [[Wikipedia:Module namespace|Module: namespaces]].}}}}[[Category:Pages with templates in the wrong namespace]]
}}<!-- End switch. -->|{{If preview|1={{error|Page using [[Template:Template rating]] with <u>empty</u> {{para|1}} module rating parameter.}}}}[[Category:Pages using template rating template with invalid rating|{{FULLPAGENAME}}]]<!--
-->}}<!-- End if. Display protection template if necessary, this will obviously show it for /doc page too since it uses {{FULLPAGENAME}}: -->{{#switch:{{Namespace detect|template=t|module=m|demospace={{{demospace|}}}}}
|t|m = {{#if:{{{suppress-pp|}}}
|
|{{#switch:{{#invoke:Effective protection level|edit|1={{{demopage|{{FULLPAGENAME}}}}}}}
|*|user = <!-- If not protected page, do nothing. -->
|#default = {{#ifeq:{{lc:{{SUBPAGENAME}}}}|doc
|<!-- {{#if:{{{2|}}}{{{doc-reason|}}}{{{3|}}}{{{doc-action|}}} --><!--
--><!-- | -->{{Protected page|1={{{2|{{{doc-reason|}}}}}}|action={{{3|{{{doc-action|}}}}}}}}<!--
--><!-- }} -->
-->|{{Protected page|1={{{reason|{{{doc-reason|}}}}}}|action={{{action|{{{doc-action|}}}}}}|demolevel={{{demolevel|}}}}}<!--
-->}}<!--
-->}}<!--
-->}}
|#default = <!-- If not in template or module namespace, do nothing
-->}}<!--
End template, start tracking.
-->{{#invoke:Check for unknown parameters| check
| unknown = {{#if:{{{demopage|}}}{{{demospace|}}}||{{#switch:{{Namespace detect|template=t|module=m}}|m|t=[[Category:Pages using template rating template with unknown parameters|_VALUE_{{FULLPAGENAME}}]]}}}}
| preview = Page using [[Template:Template rating]] with unknown parameter "_VALUE_"
| ignoreblank=y | demospace | demopage | 1 | 2 | 3 | reason | action | doc-reason | doc-action | nocat | replaced | message | demolevel | suppress-pp | demopage
}}</includeonly><!-- End tracking. --><noinclude>
{{template rating/sandbox|release|nocat=true|demospace=template|demopage=template:template rating|demolevel=edit}}
{{mbox|text=The above template is a demo.}}
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
ac25mc3xnkpc2npduzhhvdd3p92d3ne
Tempilet:Uses TemplateStyles
10
190
33293
9499
2026-09-28T17:59:50Z
en>MusikBot II
0
Changed protection settings for "[[Template:Uses TemplateStyles]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2529 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
33293
wikitext
text/x-wiki
<includeonly>{{#invoke:Uses TemplateStyles|main}}</includeonly><noinclude>{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
bbov914irrnmmvc6pz3scgivkjsu4ve
33294
33293
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Uses_TemplateStyles]]
33293
wikitext
text/x-wiki
<includeonly>{{#invoke:Uses TemplateStyles|main}}</includeonly><noinclude>{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
bbov914irrnmmvc6pz3scgivkjsu4ve
Module:Check for conflicting parameters
828
222
32917
2025-12-28T03:34:01Z
en>Zackmann08
0
Zackmann08 moved page [[Module:Check for clobbered parameters]] to [[Module:Check for conflicting parameters]]: renaming module per [[special:Permalink/1329078454#Rename|discussion]]
32917
Scribunto
text/plain
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
local checknested = isnotempty(args['nested'])
local delimiter = isnotempty(args['delimiter']) and args['delimiter'] or ';'
local argpairs = {}
for k, v in pairs(args) do
if type(k) == 'number' then
local plist = mw.text.split(v, delimiter)
local pfound = {}
local count = 0
for ii, vv in ipairs(plist) do
vv = trim(vv)
if checknested and pargs[vv] or isnotempty(pargs[vv]) then
count = count + 1
table.insert(pfound, vv)
end
end
if count > 1 then
table.insert(argpairs, pfound)
end
end
end
local warnmsg = {}
local res = ''
local cat = ''
if args['cat'] and mw.ustring.match(args['cat'],'^[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]:') then
cat = args['cat']
end
local template = args['template'] and ' in ' .. args['template'] or ''
if #argpairs > 0 then
for i, v in ipairs( argpairs ) do
table.insert(
warnmsg,
mw.ustring.format(
'Using more than one of the following parameters%s: <code>%s</code>.',
template,
table.concat(v, '</code>, <code>')
)
)
if cat ~= '' then
res = res .. '[[' .. cat .. '|' .. (v[1] == '' and ' ' or '') .. v[1] .. ']]'
end
end
end
if #warnmsg > 0 then
res = require('Module:If preview')._warning({
table.concat(warnmsg, '<br>')
}) .. res
end
return res
end
return p
59n770hna40q9pw4oa0dsp86euaks0u
32918
1015
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Check_for_conflicting_parameters]]
1014
Scribunto
text/plain
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
local checknested = isnotempty(args['nested'])
local delimiter = isnotempty(args['delimiter']) and args['delimiter'] or ';'
local argpairs = {}
for k, v in pairs(args) do
if type(k) == 'number' then
local plist = mw.text.split(v, delimiter)
local pfound = {}
local count = 0
for ii, vv in ipairs(plist) do
vv = trim(vv)
if checknested and pargs[vv] or isnotempty(pargs[vv]) then
count = count + 1
table.insert(pfound, vv)
end
end
if count > 1 then
table.insert(argpairs, pfound)
end
end
end
local warnmsg = {}
local res = ''
local cat = ''
if args['cat'] and mw.ustring.match(args['cat'],'^[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]:') then
cat = args['cat']
end
local template = args['template'] and ' in ' .. args['template'] or ''
if #argpairs > 0 then
for i, v in ipairs( argpairs ) do
table.insert(
warnmsg,
mw.ustring.format(
'Using more than one of the following parameters%s: <code>%s</code>.',
template,
table.concat(v, '</code>, <code>')
)
)
if cat ~= '' then
res = res .. '[[' .. cat .. '|' .. (v[1] == '' and ' ' or '') .. v[1] .. ']]'
end
end
end
if #warnmsg > 0 then
res = require('Module:If preview')._warning({
table.concat(warnmsg, '<br>')
}) .. res
end
return res
end
return p
59n770hna40q9pw4oa0dsp86euaks0u
Module:Date
828
230
33230
2026-02-18T03:21:21Z
en>Krinkle
0
Fix nil minute/minute. While not covered by [[Module:Date/testcases]], I probably caused a bug, as observed when running `=require('Module:Date')._Date('currentdatetime')` which works fine against sandbox and previous revisions.
33230
Scribunto
text/plain
-- Date functions for use by other modules.
-- I18N and time zones are not supported.
local MINUS = '−' -- Unicode U+2212 MINUS SIGN
local floor = math.floor
local Date, DateDiff, diffmt -- forward declarations
local uniq = { 'unique identifier' }
local function is_date(t)
-- The system used to make a date read-only means there is no unique
-- metatable that is conveniently accessible to check.
return type(t) == 'table' and t._id == uniq
end
local function is_diff(t)
return type(t) == 'table' and getmetatable(t) == diffmt
end
local function _list_join(list, sep)
return table.concat(list, sep)
end
local function collection()
-- Return a table to hold items.
return {
n = 0,
add = function (self, item)
self.n = self.n + 1
self[self.n] = item
end,
join = _list_join,
}
end
local function strip_to_nil(text)
-- If text is a string, return its trimmed content, or nil if empty.
-- Otherwise return text (convenient when Date fields are provided from
-- another module which may pass a string, a number, or another type).
if type(text) == 'string' then
text = text:match('(%S.-)%s*$')
end
return text
end
local function is_leap_year(year, calname)
-- Return true if year is a leap year.
if calname == 'Julian' then
return year % 4 == 0
end
return (year % 4 == 0 and year % 100 ~= 0) or year % 400 == 0
end
local function days_in_month(year, month, calname)
-- Return number of days (1..31) in given month (1..12).
if month == 2 and is_leap_year(year, calname) then
return 29
end
return ({ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 })[month]
end
local function h_m_s(time)
-- Return hour, minute, second extracted from fraction of a day.
time = floor(time * 24 * 3600 + 0.5) -- number of seconds
local second = time % 60
time = floor(time / 60)
return floor(time / 60), time % 60, second
end
local function hms(date)
-- Return fraction of a day from date's time, where (0 <= fraction < 1)
-- if the values are valid, but could be anything if outside range.
return (date.hour + (date.minute + date.second / 60) / 60) / 24
end
local function julian_date(date)
-- Return jd, jdz from a Julian or Gregorian calendar date where
-- jd = Julian date and its fractional part is zero at noon
-- jdz = same, but assume time is 00:00:00 if no time given
-- http://www.tondering.dk/claus/cal/julperiod.php#formula
-- Testing shows this works for all dates from year -9999 to 9999!
-- JDN 0 is the 24-hour period starting at noon UTC on Monday
-- 1 January 4713 BC = (-4712, 1, 1) Julian calendar
-- 24 November 4714 BC = (-4713, 11, 24) Gregorian calendar
local offset
local a = floor((14 - date.month)/12)
local y = date.year + 4800 - a
if date.calendar == 'Julian' then
offset = floor(y/4) - 32083
else
offset = floor(y/4) - floor(y/100) + floor(y/400) - 32045
end
local m = date.month + 12*a - 3
local jd = date.day + floor((153*m + 2)/5) + 365*y + offset
if date.hastime then
jd = jd + hms(date) - 0.5
return jd, jd
end
return jd, jd - 0.5
end
local function set_date_from_jd(date)
-- Set the fields of table date from its Julian date field.
-- Return true if date is valid.
-- http://www.tondering.dk/claus/cal/julperiod.php#formula
-- This handles the proleptic Julian and Gregorian calendars.
-- Negative Julian dates are not defined but they work.
local calname = date.calendar
local low, high -- min/max limits for date ranges −9999-01-01 to 9999-12-31
if calname == 'Gregorian' then
low, high = -1930999.5, 5373484.49999
elseif calname == 'Julian' then
low, high = -1931076.5, 5373557.49999
else
return
end
local jd = date.jd
if not (type(jd) == 'number' and low <= jd and jd <= high) then
return
end
local jdn = floor(jd)
if date.hastime then
local time = jd - jdn -- 0 <= time < 1
if time >= 0.5 then -- if at or after midnight of next day
jdn = jdn + 1
time = time - 0.5
else
time = time + 0.5
end
date.hour, date.minute, date.second = h_m_s(time)
else
date.second = 0
date.minute = 0
date.hour = 0
end
local b, c
if calname == 'Julian' then
b = 0
c = jdn + 32082
else -- Gregorian
local a = jdn + 32044
b = floor((4*a + 3)/146097)
c = a - floor(146097*b/4)
end
local d = floor((4*c + 3)/1461)
local e = c - floor(1461*d/4)
local m = floor((5*e + 2)/153)
date.day = e - floor((153*m + 2)/5) + 1
date.month = m + 3 - 12*floor(m/10)
date.year = 100*b + d - 4800 + floor(m/10)
return true
end
local function fix_numbers(numbers, y, m, d, H, M, S, partial, hastime, calendar)
-- Put the result of normalizing the given values in table numbers.
-- The result will have valid m, d values if y is valid; caller checks y.
-- The logic of PHP mktime is followed where m or d can be zero to mean
-- the previous unit, and -1 is the one before that, etc.
-- Positive values carry forward.
local date
if not (1 <= m and m <= 12) then
date = Date(y, 1, 1)
if not date then return end
date = date + ((m - 1) .. 'm')
y, m = date.year, date.month
end
local days_hms
if not partial then
if hastime and H and M and S then
if not (0 <= H and H <= 23 and
0 <= M and M <= 59 and
0 <= S and S <= 59) then
days_hms = hms({ hour = H, minute = M, second = S })
end
end
if days_hms or not (1 <= d and d <= days_in_month(y, m, calendar)) then
date = date or Date(y, m, 1)
if not date then return end
date = date + (d - 1 + (days_hms or 0))
y, m, d = date.year, date.month, date.day
if days_hms then
H, M, S = date.hour, date.minute, date.second
end
end
end
numbers.year = y
numbers.month = m
numbers.day = d
if days_hms then
-- Don't set H unless it was valid because a valid H will set hastime.
numbers.hour = H
numbers.minute = M
numbers.second = S
end
end
local function set_date_from_numbers(date, numbers, options)
-- Set the fields of table date from numeric values.
-- Return true if date is valid.
if type(numbers) ~= 'table' then
return
end
local y = numbers.year or date.year
local m = numbers.month or date.month
local d = numbers.day or date.day
local H = numbers.hour
local M = numbers.minute or date.minute or 0
local S = numbers.second or date.second or 0
local need_fix
if y and m and d then
date.partial = nil
if not (-9999 <= y and y <= 9999 and
1 <= m and m <= 12 and
1 <= d and d <= days_in_month(y, m, date.calendar)) then
if not date.want_fix then
return
end
need_fix = true
end
elseif y and date.partial then
if d or not (-9999 <= y and y <= 9999) then
return
end
if m and not (1 <= m and m <= 12) then
if not date.want_fix then
return
end
need_fix = true
end
else
return
end
if date.partial then
H = nil -- ignore any time
M = nil
S = nil
else
if H then
-- It is not possible to set M or S without also setting H.
date.hastime = true
else
H = 0
end
if not (0 <= H and H <= 23 and
0 <= M and M <= 59 and
0 <= S and S <= 59) then
if date.want_fix then
need_fix = true
else
return
end
end
end
date.want_fix = nil
if need_fix then
fix_numbers(numbers, y, m, d, H, M, S, date.partial, date.hastime, date.calendar)
return set_date_from_numbers(date, numbers, options)
end
date.year = y -- -9999 to 9999 ('n BC' → year = 1 - n)
date.month = m -- 1 to 12 (may be nil if partial)
date.day = d -- 1 to 31 (* = nil if partial)
date.hour = H -- 0 to 59 (*)
date.minute = M -- 0 to 59 (*)
date.second = S -- 0 to 59 (*)
if type(options) == 'table' then
for _, k in ipairs({ 'am', 'era', 'format' }) do
if options[k] then
date.options[k] = options[k]
end
end
end
return true
end
local function make_option_table(options1, options2)
-- If options1 is a string, return a table with its settings, or
-- if it is a table, use its settings.
-- Missing options are set from table options2 or defaults.
-- If a default is used, a flag is set so caller knows the value was not intentionally set.
-- Valid option settings are:
-- am: 'am', 'a.m.', 'AM', 'A.M.'
-- 'pm', 'p.m.', 'PM', 'P.M.' (each has same meaning as corresponding item above)
-- era: 'BCMINUS', 'BCNEGATIVE', 'BC', 'B.C.', 'BCE', 'B.C.E.', 'AD', 'A.D.', 'CE', 'C.E.'
-- Option am = 'am' does not mean the hour is AM; it means 'am' or 'pm' is used, depending on the hour,
-- and am = 'pm' has the same meaning.
-- Similarly, era = 'BC' means 'BC' is used if year <= 0.
-- BCMINUS displays a MINUS if year < 0 and the display format does not include %{era}.
-- BCNEGATIVE is similar but displays a hyphen.
local result = { bydefault = {} }
if type(options1) == 'table' then
result.am = options1.am
result.era = options1.era
elseif type(options1) == 'string' then
-- Example: 'am:AM era:BC' or 'am=AM era=BC'.
for item in options1:gmatch('%S+') do
local lhs, rhs = item:match('^(%w+)[:=](.+)$')
if lhs then
result[lhs] = rhs
end
end
end
options2 = type(options2) == 'table' and options2 or {}
local defaults = { am = 'am', era = 'BC' }
for k, v in pairs(defaults) do
if not result[k] then
if options2[k] then
result[k] = options2[k]
else
result[k] = v
result.bydefault[k] = true
end
end
end
return result
end
local ampm_options = {
-- lhs = input text accepted as an am/pm option
-- rhs = code used internally
['am'] = 'am',
['AM'] = 'AM',
['a.m.'] = 'a.m.',
['A.M.'] = 'A.M.',
['pm'] = 'am', -- same as am
['PM'] = 'AM',
['p.m.'] = 'a.m.',
['P.M.'] = 'A.M.',
}
local era_text = {
-- Text for displaying an era with a positive year (after adjusting
-- by replacing year with 1 - year if date.year <= 0).
-- options.era = { year<=0 , year>0 }
['BCMINUS'] = { 'BC' , '' , isbc = true, sign = MINUS },
['BCNEGATIVE'] = { 'BC' , '' , isbc = true, sign = '-' },
['BC'] = { 'BC' , '' , isbc = true },
['B.C.'] = { 'B.C.' , '' , isbc = true },
['BCE'] = { 'BCE' , '' , isbc = true },
['B.C.E.'] = { 'B.C.E.', '' , isbc = true },
['AD'] = { 'BC' , 'AD' },
['A.D.'] = { 'B.C.' , 'A.D.' },
['CE'] = { 'BCE' , 'CE' },
['C.E.'] = { 'B.C.E.', 'C.E.' },
}
local function get_era_for_year(era, year)
return (era_text[era] or era_text['BC'])[year > 0 and 2 or 1] or ''
end
local function strftime(date, format, options)
-- Return date formatted as a string using codes similar to those
-- in the C strftime library function.
local sformat = string.format
local shortcuts = {
['%c'] = '%-I:%M %p %-d %B %-Y %{era}', -- date and time: 2:30 pm 1 April 2016
['%x'] = '%-d %B %-Y %{era}', -- date: 1 April 2016
['%X'] = '%-I:%M %p', -- time: 2:30 pm
}
if shortcuts[format] then
format = shortcuts[format]
end
local codes = {
a = { field = 'dayabbr' },
A = { field = 'dayname' },
b = { field = 'monthabbr' },
B = { field = 'monthname' },
u = { fmt = '%d' , field = 'dowiso' },
w = { fmt = '%d' , field = 'dow' },
d = { fmt = '%02d', fmt2 = '%d', field = 'day' },
m = { fmt = '%02d', fmt2 = '%d', field = 'month' },
Y = { fmt = '%04d', fmt2 = '%d', field = 'year' },
H = { fmt = '%02d', fmt2 = '%d', field = 'hour' },
M = { fmt = '%02d', fmt2 = '%d', field = 'minute' },
S = { fmt = '%02d', fmt2 = '%d', field = 'second' },
j = { fmt = '%03d', fmt2 = '%d', field = 'dayofyear' },
I = { fmt = '%02d', fmt2 = '%d', field = 'hour', special = 'hour12' },
p = { field = 'hour', special = 'am' },
}
options = make_option_table(options, date.options)
local amopt = options.am
local eraopt = options.era
local function replace_code(spaces, modifier, id)
local code = codes[id]
if code then
local fmt = code.fmt
if modifier == '-' and code.fmt2 then
fmt = code.fmt2
end
local value = date[code.field]
if not value then
return nil -- an undefined field in a partial date
end
local special = code.special
if special then
if special == 'hour12' then
value = value % 12
value = value == 0 and 12 or value
elseif special == 'am' then
local ap = ({
['a.m.'] = { 'a.m.', 'p.m.' },
['AM'] = { 'AM', 'PM' },
['A.M.'] = { 'A.M.', 'P.M.' },
})[ampm_options[amopt]] or { 'am', 'pm' }
return (spaces == '' and '' or ' ') .. (value < 12 and ap[1] or ap[2])
end
end
if code.field == 'year' then
local sign = (era_text[eraopt] or {}).sign
if not sign or format:find('%{era}', 1, true) then
sign = ''
if value <= 0 then
value = 1 - value
end
else
if value >= 0 then
sign = ''
else
value = -value
end
end
return spaces .. sign .. sformat(fmt, value)
end
return spaces .. (fmt and sformat(fmt, value) or value)
end
end
local function replace_property(spaces, id)
if id == 'era' then
-- Special case so can use local era option.
local result = get_era_for_year(eraopt, date.year)
if result == '' then
return ''
end
return (spaces == '' and '' or ' ') .. result
end
local result = date[id]
if type(result) == 'string' then
return spaces .. result
end
if type(result) == 'number' then
return spaces .. tostring(result)
end
if type(result) == 'boolean' then
return spaces .. (result and '1' or '0')
end
-- This occurs if id is an undefined field in a partial date, or is the name of a function.
return nil
end
local PERCENT = '\127PERCENT\127'
return (format
:gsub('%%%%', PERCENT)
:gsub('(%s*)%%{(%w+)}', replace_property)
:gsub('(%s*)%%(%-?)(%a)', replace_code)
:gsub(PERCENT, '%%')
)
end
local function _date_text(date, fmt, options)
-- Return a formatted string representing the given date.
if not is_date(date) then
error('date:text: need a date (use "date:text()" with a colon)', 2)
end
if type(fmt) == 'string' and fmt:match('%S') then
if fmt:find('%', 1, true) then
return strftime(date, fmt, options)
end
elseif date.partial then
fmt = date.month and 'my' or 'y'
else
fmt = 'dmy'
if date.hastime then
fmt = (date.second > 0 and 'hms ' or 'hm ') .. fmt
end
end
local function bad_format()
-- For consistency with other format processing, return given format
-- (or cleaned format if original was not a string) if invalid.
return mw.text.nowiki(fmt)
end
if date.partial then
-- Ignore days in standard formats like 'ymd'.
if fmt == 'ym' or fmt == 'ymd' then
fmt = date.month and '%Y-%m %{era}' or '%Y %{era}'
elseif fmt == 'my' or fmt == 'dmy' or fmt == 'mdy' then
fmt = date.month and '%B %-Y %{era}' or '%-Y %{era}'
elseif fmt == 'y' then
fmt = date.month and '%-Y %{era}' or '%-Y %{era}'
else
return bad_format()
end
return strftime(date, fmt, options)
end
local function hm_fmt()
local plain = make_option_table(options, date.options).bydefault.am
return plain and '%H:%M' or '%-I:%M %p'
end
local need_time = date.hastime
local t = collection()
for item in fmt:gmatch('%S+') do
local f
if item == 'hm' then
f = hm_fmt()
need_time = false
elseif item == 'hms' then
f = '%H:%M:%S'
need_time = false
elseif item == 'ymd' then
f = '%Y-%m-%d %{era}'
elseif item == 'mdy' then
f = '%B %-d, %-Y %{era}'
elseif item == 'dmy' then
f = '%-d %B %-Y %{era}'
else
return bad_format()
end
t:add(f)
end
fmt = t:join(' ')
if need_time then
fmt = hm_fmt() .. ' ' .. fmt
end
return strftime(date, fmt, options)
end
local day_info = {
-- 0=Sun to 6=Sat
[0] = { 'Sun', 'Sunday' },
{ 'Mon', 'Monday' },
{ 'Tue', 'Tuesday' },
{ 'Wed', 'Wednesday' },
{ 'Thu', 'Thursday' },
{ 'Fri', 'Friday' },
{ 'Sat', 'Saturday' },
}
local month_info = {
-- 1=Jan to 12=Dec
{ 'Jan', 'January' },
{ 'Feb', 'February' },
{ 'Mar', 'March' },
{ 'Apr', 'April' },
{ 'May', 'May' },
{ 'Jun', 'June' },
{ 'Jul', 'July' },
{ 'Aug', 'August' },
{ 'Sep', 'September' },
{ 'Oct', 'October' },
{ 'Nov', 'November' },
{ 'Dec', 'December' },
}
local function name_to_number(text, translate)
if type(text) == 'string' then
return translate[text:lower()]
end
end
local function day_number(text)
return name_to_number(text, {
sun = 0, sunday = 0,
mon = 1, monday = 1,
tue = 2, tuesday = 2,
wed = 3, wednesday = 3,
thu = 4, thursday = 4,
fri = 5, friday = 5,
sat = 6, saturday = 6,
})
end
local function month_number(text)
return name_to_number(text:gsub('%.', ''), {
jan = 1, january = 1,
feb = 2, february = 2,
mar = 3, march = 3,
apr = 4, april = 4,
may = 5,
jun = 6, june = 6,
jul = 7, july = 7,
aug = 8, august = 8,
sep = 9, september = 9, sept = 9,
oct = 10, october = 10,
nov = 11, november = 11,
dec = 12, december = 12,
})
end
local function _list_text(list, fmt)
-- Return a list of formatted strings from a list of dates.
if not type(list) == 'table' then
error('date:list:text: need "list:text()" with a colon', 2)
end
local result = { join = _list_join }
for i, date in ipairs(list) do
result[i] = date:text(fmt)
end
return result
end
local function _date_list(date, spec)
-- Return a possibly empty numbered table of dates meeting the specification.
-- Dates in the list are in ascending order (oldest date first).
-- The spec should be a string of form "<count> <day> <op>"
-- where each item is optional and
-- count = number of items wanted in list
-- day = abbreviation or name such as Mon or Monday
-- op = >, >=, <, <= (default is > meaning after date)
-- If no count is given, the list is for the specified days in date's month.
-- The default day is date's day.
-- The spec can also be a positive or negative number:
-- -5 is equivalent to '5 <'
-- 5 is equivalent to '5' which is '5 >'
if not is_date(date) then
error('date:list: need a date (use "date:list()" with a colon)', 2)
end
local list = { text = _list_text }
if date.partial then
return list
end
local count, offset, operation
local ops = {
['>='] = { before = false, include = true },
['>'] = { before = false, include = false },
['<='] = { before = true , include = true },
['<'] = { before = true , include = false },
}
if spec then
if type(spec) == 'number' then
count = floor(spec + 0.5)
if count < 0 then
count = -count
operation = ops['<']
end
elseif type(spec) == 'string' then
local num, day, op = spec:match('^%s*(%d*)%s*(%a*)%s*([<>=]*)%s*$')
if not num then
return list
end
if num ~= '' then
count = tonumber(num)
end
if day ~= '' then
local dow = day_number(day:gsub('[sS]$', '')) -- accept plural days
if not dow then
return list
end
offset = dow - date.dow
end
operation = ops[op]
else
return list
end
end
offset = offset or 0
operation = operation or ops['>']
local datefrom, dayfirst, daylast
if operation.before then
if offset > 0 or (offset == 0 and not operation.include) then
offset = offset - 7
end
if count then
if count > 1 then
offset = offset - 7*(count - 1)
end
datefrom = date + offset
else
daylast = date.day + offset
dayfirst = daylast % 7
if dayfirst == 0 then
dayfirst = 7
end
end
else
if offset < 0 or (offset == 0 and not operation.include) then
offset = offset + 7
end
if count then
datefrom = date + offset
else
dayfirst = date.day + offset
daylast = date.monthdays
end
end
if not count then
if daylast < dayfirst then
return list
end
count = floor((daylast - dayfirst)/7) + 1
datefrom = Date(date, {day = dayfirst})
end
for i = 1, count do
if not datefrom then break end -- exceeds date limits
list[i] = datefrom
datefrom = datefrom + 7
end
return list
end
-- Cache the current date/time (UTC).
--
-- Note that os.date() returns an empty object with optimized lazy getters for each field.
-- Avoid current.min or current.sec in articles! https://phabricator.wikimedia.org/T416616
--
-- Beware that while os.date() uses 'min' and 'sec', our Date() uses 'minute' and 'second'.
local current = os.date('!*t')
local function extract_date(newdate, text)
-- Parse the date/time in text and return n, o where
-- n = table of numbers with date/time fields
-- o = table of options for AM/PM or AD/BC or format, if any
-- or return nothing if date is known to be invalid.
-- Caller determines if the values in n are valid.
-- A year must be positive ('1' to '9999'); use 'BC' for BC.
-- In a y-m-d string, the year must be four digits to avoid ambiguity
-- ('0001' to '9999'). The only way to enter year <= 0 is by specifying
-- the date as three numeric parameters like ymd Date(-1, 1, 1).
-- Dates of form d/m/y, m/d/y, y/m/d are rejected as potentially ambiguous.
local date, options = {}, {}
if text:sub(-1) == 'Z' then
-- Extract date/time from a Wikidata timestamp.
-- The year can be 1 to 16 digits but this module handles 1 to 4 digits only.
-- Examples: '+2016-06-21T14:30:00Z', '-0000000180-00-00T00:00:00Z'.
local sign, y, m, d, H, M, S = text:match('^([+%-])(%d+)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)Z$')
if sign then
y = tonumber(y)
if sign == '-' and y > 0 then
y = -y
end
if y <= 0 then
options.era = 'BCE'
end
date.year = y
m = tonumber(m)
d = tonumber(d)
H = tonumber(H)
M = tonumber(M)
S = tonumber(S)
if m == 0 then
newdate.partial = true
return date, options
end
date.month = m
if d == 0 then
newdate.partial = true
return date, options
end
date.day = d
if H > 0 or M > 0 or S > 0 then
date.hour = H
date.minute = M
date.second = S
end
return date, options
end
return
end
local function extract_ymd(item)
-- Called when no day or month has been set.
local y, m, d = item:match('^(%d%d%d%d)%-(%w+)%-(%d%d?)$')
if y then
if date.year then
return
end
if m:match('^%d%d?$') then
m = tonumber(m)
else
m = month_number(m)
end
if m then
date.year = tonumber(y)
date.month = m
date.day = tonumber(d)
return true
end
end
end
local function extract_day_or_year(item)
-- Called when a day would be valid, or
-- when a year would be valid if no year has been set and partial is set.
local number, suffix = item:match('^(%d%d?%d?%d?)(.*)$')
if number then
local n = tonumber(number)
if #number <= 2 and n <= 31 then
suffix = suffix:lower()
if suffix == '' or suffix == 'st' or suffix == 'nd' or suffix == 'rd' or suffix == 'th' then
date.day = n
return true
end
elseif suffix == '' and newdate.partial and not date.year then
date.year = n
return true
end
end
end
local function extract_month(item)
-- A month must be given as a name or abbreviation; a number could be ambiguous.
local m = month_number(item)
if m then
date.month = m
return true
end
end
local function extract_time(item)
local h, m, s = item:match('^(%d%d?):(%d%d)(:?%d*)$')
if date.hour or not h then
return
end
if s ~= '' then
s = s:match('^:(%d%d)$')
if not s then
return
end
end
date.hour = tonumber(h)
date.minute = tonumber(m)
date.second = tonumber(s) -- nil if empty string
return true
end
local item_count = 0
local index_time
local function set_ampm(item)
local H = date.hour
if H and not options.am and index_time + 1 == item_count then
options.am = ampm_options[item] -- caller checked this is not nil
if item:match('^[Aa]') then
if not (1 <= H and H <= 12) then
return
end
if H == 12 then
date.hour = 0
end
else
if not (1 <= H and H <= 23) then
return
end
if H <= 11 then
date.hour = H + 12
end
end
return true
end
end
for item in text:gsub(',', ' '):gsub(' ', ' '):gmatch('%S+') do
item_count = item_count + 1
if era_text[item] then
-- Era is accepted in peculiar places.
if options.era then
return
end
options.era = item
elseif ampm_options[item] then
if not set_ampm(item) then
return
end
elseif item:find(':', 1, true) then
if not extract_time(item) then
return
end
index_time = item_count
elseif date.day and date.month then
if date.year then
return -- should be nothing more so item is invalid
end
if not item:match('^(%d%d?%d?%d?)$') then
return
end
date.year = tonumber(item)
elseif date.day then
if not extract_month(item) then
return
end
elseif date.month then
if not extract_day_or_year(item) then
return
end
elseif extract_month(item) then
options.format = 'mdy'
elseif extract_ymd(item) then
options.format = 'ymd'
elseif extract_day_or_year(item) then
if date.day then
options.format = 'dmy'
end
else
return
end
end
if not date.year or date.year == 0 then
return
end
local era = era_text[options.era]
if era and era.isbc then
date.year = 1 - date.year
end
return date, options
end
local function autofill(date1, date2)
-- Fill any missing month or day in each date using the
-- corresponding component from the other date, if present,
-- or with 1 if both dates are missing the month or day.
-- This gives a good result for calculating the difference
-- between two partial dates when no range is wanted.
-- Return filled date1, date2 (two full dates).
local function filled(a, b)
-- Return date a filled, if necessary, with month and/or day from date b.
-- The filled day is truncated to fit the number of days in the month.
local fillmonth, fillday
if not a.month then
fillmonth = b.month or 1
end
if not a.day then
fillday = b.day or 1
end
if fillmonth or fillday then -- need to create a new date
a = Date(a, {
month = fillmonth,
day = math.min(fillday or a.day, days_in_month(a.year, fillmonth or a.month, a.calendar))
})
end
return a
end
return filled(date1, date2), filled(date2, date1)
end
local function date_add_sub(lhs, rhs, is_sub)
-- Return a new date from calculating (lhs + rhs) or (lhs - rhs),
-- or return nothing if invalid.
-- The result is nil if the calculated date exceeds allowable limits.
-- Caller ensures that lhs is a date; its properties are copied for the new date.
if lhs.partial then
-- Adding to a partial is not supported.
-- Can subtract a date or partial from a partial, but this is not called for that.
return
end
local function is_prefix(text, word, minlen)
local n = #text
return (minlen or 1) <= n and n <= #word and text == word:sub(1, n)
end
local function do_days(n)
local forcetime, jd
if floor(n) == n then
jd = lhs.jd
else
forcetime = not lhs.hastime
jd = lhs.jdz
end
jd = jd + (is_sub and -n or n)
if forcetime then
jd = tostring(jd)
if not jd:find('.', 1, true) then
jd = jd .. '.0'
end
end
return Date(lhs, 'juliandate', jd)
end
if type(rhs) == 'number' then
-- Add/subtract days, including fractional days.
return do_days(rhs)
end
if type(rhs) == 'string' then
-- rhs is a single component like '26m' or '26 months' (with optional sign).
-- Fractions like '3.25d' are accepted for the units which are handled as days.
local sign, numstr, id = rhs:match('^%s*([+-]?)([%d%.]+)%s*(%a+)$')
if sign then
if sign == '-' then
is_sub = not (is_sub and true or false)
end
local y, m, days
local num = tonumber(numstr)
if not num then
return
end
id = id:lower()
if is_prefix(id, 'years') then
y = num
m = 0
elseif is_prefix(id, 'months') then
y = floor(num / 12)
m = num % 12
elseif is_prefix(id, 'weeks') then
days = num * 7
elseif is_prefix(id, 'days') then
days = num
elseif is_prefix(id, 'hours') then
days = num / 24
elseif is_prefix(id, 'minutes', 3) then
days = num / (24 * 60)
elseif is_prefix(id, 'seconds') then
days = num / (24 * 3600)
else
return
end
if days then
return do_days(days)
end
if numstr:find('.', 1, true) then
return
end
if is_sub then
y = -y
m = -m
end
assert(-11 <= m and m <= 11)
y = lhs.year + y
m = lhs.month + m
if m > 12 then
y = y + 1
m = m - 12
elseif m < 1 then
y = y - 1
m = m + 12
end
local d = math.min(lhs.day, days_in_month(y, m, lhs.calendar))
return Date(lhs, y, m, d)
end
end
if is_diff(rhs) then
local days = rhs.age_days
if (is_sub or false) ~= (rhs.isnegative or false) then
days = -days
end
return lhs + days
end
end
local full_date_only = {
dayabbr = true,
dayname = true,
dow = true,
dayofweek = true,
dowiso = true,
dayofweekiso = true,
dayofyear = true,
gsd = true,
juliandate = true,
jd = true,
jdz = true,
jdnoon = true,
}
-- Metatable for a date's calculated fields.
local datemt = {
__index = function (self, key)
if rawget(self, 'partial') then
if full_date_only[key] then return end
if key == 'monthabbr' or key == 'monthdays' or key == 'monthname' then
if not self.month then return end
end
end
local value
if key == 'dayabbr' then
value = day_info[self.dow][1]
elseif key == 'dayname' then
value = day_info[self.dow][2]
elseif key == 'dow' then
value = (self.jdnoon + 1) % 7 -- day-of-week 0=Sun to 6=Sat
elseif key == 'dayofweek' then
value = self.dow
elseif key == 'dowiso' then
value = (self.jdnoon % 7) + 1 -- ISO day-of-week 1=Mon to 7=Sun
elseif key == 'dayofweekiso' then
value = self.dowiso
elseif key == 'dayofyear' then
local first = Date(self.year, 1, 1, self.calendar).jdnoon
value = self.jdnoon - first + 1 -- day-of-year 1 to 366
elseif key == 'era' then
-- Era text (never a negative sign) from year and options.
value = get_era_for_year(self.options.era, self.year)
elseif key == 'format' then
value = self.options.format or 'dmy'
elseif key == 'gsd' then
-- GSD = 1 from 00:00:00 to 23:59:59 on 1 January 1 AD Gregorian calendar,
-- which is from jd 1721425.5 to 1721426.49999.
value = floor(self.jd - 1721424.5)
elseif key == 'juliandate' or key == 'jd' or key == 'jdz' then
local jd, jdz = julian_date(self)
rawset(self, 'juliandate', jd)
rawset(self, 'jd', jd)
rawset(self, 'jdz', jdz)
return key == 'jdz' and jdz or jd
elseif key == 'jdnoon' then
-- Julian date at noon (an integer) on the calendar day when jd occurs.
value = floor(self.jd + 0.5)
elseif key == 'isleapyear' then
value = is_leap_year(self.year, self.calendar)
elseif key == 'monthabbr' then
value = month_info[self.month][1]
elseif key == 'monthdays' then
value = days_in_month(self.year, self.month, self.calendar)
elseif key == 'monthname' then
value = month_info[self.month][2]
end
if value ~= nil then
rawset(self, key, value)
return value
end
end,
}
-- Date operators.
local function mt_date_add(lhs, rhs)
if not is_date(lhs) then
lhs, rhs = rhs, lhs -- put date on left (it must be a date for this to have been called)
end
return date_add_sub(lhs, rhs)
end
local function mt_date_sub(lhs, rhs)
if is_date(lhs) then
if is_date(rhs) then
return DateDiff(lhs, rhs)
end
return date_add_sub(lhs, rhs, true)
end
end
local function mt_date_concat(lhs, rhs)
return tostring(lhs) .. tostring(rhs)
end
local function mt_date_tostring(self)
return self:text()
end
local function mt_date_eq(lhs, rhs)
-- Return true if dates identify same date/time where, for example,
-- Date(-4712, 1, 1, 'Julian') == Date(-4713, 11, 24, 'Gregorian') is true.
-- This is called only if lhs and rhs have the same type and the same metamethod.
if lhs.partial or rhs.partial then
-- One date is partial; the other is a partial or a full date.
-- The months may both be nil, but must be the same.
return lhs.year == rhs.year and lhs.month == rhs.month and lhs.calendar == rhs.calendar
end
return lhs.jdz == rhs.jdz
end
local function mt_date_lt(lhs, rhs)
-- Return true if lhs < rhs, for example,
-- Date('1 Jan 2016') < Date('06:00 1 Jan 2016') is true.
-- This is called only if lhs and rhs have the same type and the same metamethod.
if lhs.partial or rhs.partial then
-- One date is partial; the other is a partial or a full date.
if lhs.calendar ~= rhs.calendar then
return lhs.calendar == 'Julian'
end
if lhs.partial then
lhs = lhs.partial.first
end
if rhs.partial then
rhs = rhs.partial.first
end
end
return lhs.jdz < rhs.jdz
end
--[[ Examples of syntax to construct a date:
Date(y, m, d, 'julian') default calendar is 'gregorian'
Date(y, m, d, H, M, S, 'julian')
Date('juliandate', jd, 'julian') if jd contains "." text output includes H:M:S
Date('currentdate')
Date('currentdatetime')
Date('1 April 1995', 'julian') parse date from text
Date('1 April 1995 AD', 'julian') using an era sets a flag to do the same for output
Date('04:30:59 1 April 1995', 'julian')
Date(date) copy of an existing date
Date(date, t) same, updated with y,m,d,H,M,S fields from table t
Date(t) date with y,m,d,H,M,S fields from table t
]]
function Date(...) -- for forward declaration above
-- Return a table holding a date assuming a uniform calendar always applies
-- (proleptic Gregorian calendar or proleptic Julian calendar), or
-- return nothing if date is invalid.
-- A partial date has a valid year, however its month may be nil, and
-- its day and time fields are nil.
-- Field partial is set to false (if a full date) or a table (if a partial date).
local calendars = { julian = 'Julian', gregorian = 'Gregorian' }
local newdate = {
_id = uniq,
calendar = 'Gregorian', -- default is Gregorian calendar
hastime = false, -- true if input sets a time
hour = 0, -- always set hour/minute/second so don't have to handle nil
minute = 0,
second = 0,
options = {},
list = _date_list,
subtract = function (self, rhs, options)
return DateDiff(self, rhs, options)
end,
text = _date_text,
}
local argtype, datetext, is_copy, jd_number, tnums
local numindex = 0
local numfields = { 'year', 'month', 'day', 'hour', 'minute', 'second' }
local numbers = {}
for _, v in ipairs({...}) do
v = strip_to_nil(v)
local vlower = type(v) == 'string' and v:lower() or nil
if v == nil then
-- Ignore empty arguments after stripping so modules can directly pass template parameters.
elseif calendars[vlower] then
newdate.calendar = calendars[vlower]
elseif vlower == 'partial' then
newdate.partial = true
elseif vlower == 'fix' then
newdate.want_fix = true
elseif is_date(v) then
-- Copy existing date (items can be overridden by other arguments).
if is_copy or tnums then
return
end
is_copy = true
newdate.calendar = v.calendar
newdate.partial = v.partial
newdate.hastime = v.hastime
newdate.options = v.options
newdate.year = v.year
newdate.month = v.month
newdate.day = v.day
newdate.hour = v.hour
newdate.minute = v.minute
newdate.second = v.second
elseif type(v) == 'table' then
if tnums then
return
end
tnums = {}
local tfields = { year=1, month=1, day=1, hour=2, minute=2, second=2 }
for tk, tv in pairs(v) do
if tfields[tk] then
tnums[tk] = tonumber(tv)
end
if tfields[tk] == 2 then
newdate.hastime = true
end
end
else
local num = tonumber(v)
if not num and argtype == 'setdate' and numindex == 1 then
num = month_number(v)
end
if num then
if not argtype then
argtype = 'setdate'
end
if argtype == 'setdate' and numindex < 6 then
numindex = numindex + 1
numbers[numfields[numindex]] = num
elseif argtype == 'juliandate' and not jd_number then
jd_number = num
if type(v) == 'string' then
if v:find('.', 1, true) then
newdate.hastime = true
end
elseif num ~= floor(num) then
-- The given value was a number. The time will be used
-- if the fractional part is nonzero.
newdate.hastime = true
end
else
return
end
elseif argtype then
return
elseif type(v) == 'string' then
if v == 'currentdate' or v == 'currentdatetime' or v == 'juliandate' then
argtype = v
else
argtype = 'datetext'
datetext = v
end
else
return
end
end
end
if argtype == 'datetext' then
if tnums or not set_date_from_numbers(newdate, extract_date(newdate, datetext)) then
return
end
elseif argtype == 'juliandate' then
newdate.partial = nil
newdate.jd = jd_number
if not set_date_from_jd(newdate) then
return
end
elseif argtype == 'currentdate' or argtype == 'currentdatetime' then
newdate.partial = nil
newdate.year = current.year
newdate.month = current.month
newdate.day = current.day
if argtype == 'currentdatetime' then
newdate.hour = current.hour
newdate.minute = current.min
newdate.second = current.sec
newdate.hastime = true
end
newdate.calendar = 'Gregorian' -- ignore any given calendar name
elseif argtype == 'setdate' then
if tnums or not set_date_from_numbers(newdate, numbers) then
return
end
elseif not (is_copy or tnums) then
return
end
if tnums then
newdate.jd = nil -- force recalculation in case jd was set before changes from tnums
if not set_date_from_numbers(newdate, tnums) then
return
end
end
if newdate.partial then
local year = newdate.year
local month = newdate.month
local first = Date(year, month or 1, 1, newdate.calendar)
month = month or 12
local last = Date(year, month, days_in_month(year, month), newdate.calendar)
newdate.partial = { first = first, last = last }
else
newdate.partial = false -- avoid index lookup
end
setmetatable(newdate, datemt)
local readonly = {}
local mt = {
__index = newdate,
__newindex = function(t, k, v) error('date.' .. tostring(k) .. ' is read-only', 2) end,
__add = mt_date_add,
__sub = mt_date_sub,
__concat = mt_date_concat,
__tostring = mt_date_tostring,
__eq = mt_date_eq,
__lt = mt_date_lt,
}
return setmetatable(readonly, mt)
end
local function _diff_age(diff, code, options)
-- Return a tuple of integer values from diff as specified by code, except that
-- each integer may be a list of two integers for a diff with a partial date, or
-- return nil if the code is not supported.
-- If want round, the least significant unit is rounded to nearest whole unit.
-- For a duration, an extra day is added.
local wantround, wantduration, wantrange
if type(options) == 'table' then
wantround = options.round
wantduration = options.duration
wantrange = options.range
else
wantround = options
end
if not is_diff(diff) then
local f = wantduration and 'duration' or 'age'
error(f .. ': need a date difference (use "diff:' .. f .. '()" with a colon)', 2)
end
if diff.partial then
-- Ignore wantround, wantduration.
local function choose(v)
if type(v) == 'table' then
if not wantrange or v[1] == v[2] then
-- Example: Date('partial', 2005) - Date('partial', 2001) gives
-- diff.years = { 3, 4 } to show the range of possible results.
-- If do not want a range, choose the second value as more expected.
return v[2]
end
end
return v
end
if code == 'ym' or code == 'ymd' then
if not wantrange and diff.iszero then
-- This avoids an unexpected result such as
-- Date('partial', 2001) - Date('partial', 2001)
-- giving diff = { years = 0, months = { 0, 11 } }
-- which would be reported as 0 years and 11 months.
return 0, 0
end
return choose(diff.partial.years), choose(diff.partial.months)
end
if code == 'y' then
return choose(diff.partial.years)
end
if code == 'm' or code == 'w' or code == 'd' then
return choose({ diff.partial.mindiff:age(code), diff.partial.maxdiff:age(code) })
end
return nil
end
local extra_days = wantduration and 1 or 0
if code == 'wd' or code == 'w' or code == 'd' then
local offset = wantround and 0.5 or 0
local days = diff.age_days + extra_days
if code == 'wd' or code == 'd' then
days = floor(days + offset)
if code == 'd' then
return days
end
return floor(days/7), days % 7
end
return floor(days/7 + offset)
end
local H, M, S = diff.hours, diff.minutes, diff.seconds
if code == 'dh' or code == 'dhm' or code == 'dhms' or code == 'h' or code == 'hm' or code == 'hms' or code == 'M' or code == 's' then
local days = floor(diff.age_days + extra_days)
local inc_hour
if wantround then
if code == 'dh' or code == 'h' then
if M >= 30 then
inc_hour = true
end
elseif code == 'dhm' or code == 'hm' then
if S >= 30 then
M = M + 1
if M >= 60 then
M = 0
inc_hour = true
end
end
elseif code == 'M' then
if S >= 30 then
M = M + 1
end
else
-- Nothing needed because S is an integer.
end
if inc_hour then
H = H + 1
if H >= 24 then
H = 0
days = days + 1
end
end
end
if code == 'dh' or code == 'dhm' or code == 'dhms' then
if code == 'dh' then
return days, H
elseif code == 'dhm' then
return days, H, M
else
return days, H, M, S
end
end
local hours = days * 24 + H
if code == 'h' then
return hours
elseif code == 'hm' then
return hours, M
elseif code == 'M' or code == 's' then
M = hours * 60 + M
if code == 'M' then
return M
end
return M * 60 + S
end
return hours, M, S
end
if wantround then
local inc_hour
if code == 'ymdh' or code == 'ymwdh' then
if M >= 30 then
inc_hour = true
end
elseif code == 'ymdhm' or code == 'ymwdhm' then
if S >= 30 then
M = M + 1
if M >= 60 then
M = 0
inc_hour = true
end
end
elseif code == 'ymd' or code == 'ymwd' or code == 'yd' or code == 'md' then
if H >= 12 then
extra_days = extra_days + 1
end
end
if inc_hour then
H = H + 1
if H >= 24 then
H = 0
extra_days = extra_days + 1
end
end
end
local y, m, d = diff.years, diff.months, diff.days
if extra_days > 0 then
d = d + extra_days
if d > 28 or code == 'yd' then
-- Recalculate in case have passed a month.
diff = diff.date1 + extra_days - diff.date2
y, m, d = diff.years, diff.months, diff.days
end
end
if code == 'ymd' then
return y, m, d
elseif code == 'yd' then
if y > 0 then
-- It is known that diff.date1 > diff.date2.
diff = diff.date1 - (diff.date2 + (y .. 'y'))
end
return y, floor(diff.age_days)
elseif code == 'md' then
return y * 12 + m, d
elseif code == 'ym' or code == 'm' then
if wantround then
if d >= 16 then
m = m + 1
if m >= 12 then
m = 0
y = y + 1
end
end
end
if code == 'ym' then
return y, m
end
return y * 12 + m
elseif code == 'ymw' then
local weeks = floor(d/7)
if wantround then
local days = d % 7
if days > 3 or (days == 3 and H >= 12) then
weeks = weeks + 1
end
end
return y, m, weeks
elseif code == 'ymwd' then
return y, m, floor(d/7), d % 7
elseif code == 'ymdh' then
return y, m, d, H
elseif code == 'ymwdh' then
return y, m, floor(d/7), d % 7, H
elseif code == 'ymdhm' then
return y, m, d, H, M
elseif code == 'ymwdhm' then
return y, m, floor(d/7), d % 7, H, M
end
if code == 'y' then
if wantround and m >= 6 then
y = y + 1
end
return y
end
return nil
end
local function _diff_duration(diff, code, options)
if type(options) ~= 'table' then
options = { round = options }
end
options.duration = true
return _diff_age(diff, code, options)
end
-- Metatable for some operations on date differences.
diffmt = { -- for forward declaration above
__concat = function (lhs, rhs)
return tostring(lhs) .. tostring(rhs)
end,
__tostring = function (self)
return tostring(self.age_days)
end,
__index = function (self, key)
local value
if key == 'age_days' then
if rawget(self, 'partial') then
local function jdz(date)
return (date.partial and date.partial.first or date).jdz
end
value = jdz(self.date1) - jdz(self.date2)
else
value = self.date1.jdz - self.date2.jdz
end
end
if value ~= nil then
rawset(self, key, value)
return value
end
end,
}
function DateDiff(date1, date2, options) -- for forward declaration above
-- Return a table with the difference between two dates (date1 - date2).
-- The difference is negative if date1 is older than date2.
-- Return nothing if invalid.
-- If d = date1 - date2 then
-- date1 = date2 + d
-- If date1 >= date2 and the dates have no H:M:S time specified then
-- date1 = date2 + (d.years..'y') + (d.months..'m') + d.days
-- where the larger time units are added first.
-- The result of Date(2015,1,x) + '1m' is Date(2015,2,28) for
-- x = 28, 29, 30, 31. That means, for example,
-- d = Date(2015,3,3) - Date(2015,1,31)
-- gives d.years, d.months, d.days = 0, 1, 3 (excluding date1).
if not (is_date(date1) and is_date(date2) and date1.calendar == date2.calendar) then
return
end
local wantfill
if type(options) == 'table' then
wantfill = options.fill
end
local isnegative = false
local iszero = false
if date1 < date2 then
isnegative = true
date1, date2 = date2, date1
elseif date1 == date2 then
iszero = true
end
-- It is known that date1 >= date2 (period is from date2 to date1).
if date1.partial or date2.partial then
-- Two partial dates might have timelines:
---------------------A=================B--- date1 is from A to B inclusive
--------C=======D-------------------------- date2 is from C to D inclusive
-- date1 > date2 iff A > C (date1.partial.first > date2.partial.first)
-- The periods can overlap ('April 2001' - '2001'):
-------------A===B------------------------- A=2001-04-01 B=2001-04-30
--------C=====================D------------ C=2001-01-01 D=2001-12-31
if wantfill then
date1, date2 = autofill(date1, date2)
else
local function zdiff(date1, date2)
local diff = date1 - date2
if diff.isnegative then
return date1 - date1 -- a valid diff in case we call its methods
end
return diff
end
local function getdate(date, which)
return date.partial and date.partial[which] or date
end
local maxdiff = zdiff(getdate(date1, 'last'), getdate(date2, 'first'))
local mindiff = zdiff(getdate(date1, 'first'), getdate(date2, 'last'))
local years, months
if maxdiff.years == mindiff.years then
years = maxdiff.years
if maxdiff.months == mindiff.months then
months = maxdiff.months
else
months = { mindiff.months, maxdiff.months }
end
else
years = { mindiff.years, maxdiff.years }
end
return setmetatable({
date1 = date1,
date2 = date2,
partial = {
years = years,
months = months,
maxdiff = maxdiff,
mindiff = mindiff,
},
isnegative = isnegative,
iszero = iszero,
age = _diff_age,
duration = _diff_duration,
}, diffmt)
end
end
local y1, m1 = date1.year, date1.month
local y2, m2 = date2.year, date2.month
local years = y1 - y2
local months = m1 - m2
local d1 = date1.day + hms(date1)
local d2 = date2.day + hms(date2)
local days, time
if d1 >= d2 then
days = d1 - d2
else
months = months - 1
-- Get days in previous month (before the "to" date) given December has 31 days.
local dpm = m1 > 1 and days_in_month(y1, m1 - 1, date1.calendar) or 31
if d2 >= dpm then
days = d1 - hms(date2)
else
days = dpm - d2 + d1
end
end
if months < 0 then
years = years - 1
months = months + 12
end
days, time = math.modf(days)
local H, M, S = h_m_s(time)
return setmetatable({
date1 = date1,
date2 = date2,
partial = false, -- avoid index lookup
years = years,
months = months,
days = days,
hours = H,
minutes = M,
seconds = S,
isnegative = isnegative,
iszero = iszero,
age = _diff_age,
duration = _diff_duration,
}, diffmt)
end
return {
_current = current,
_Date = Date,
_days_in_month = days_in_month,
}
p4lffcwq8w4s1hro04tf52ddm3itw32
33231
9090
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Date]]
1031
Scribunto
text/plain
-- Date functions for use by other modules.
-- I18N and time zones are not supported.
local MINUS = '−' -- Unicode U+2212 MINUS SIGN
local floor = math.floor
local Date, DateDiff, diffmt -- forward declarations
local uniq = { 'unique identifier' }
local function is_date(t)
-- The system used to make a date read-only means there is no unique
-- metatable that is conveniently accessible to check.
return type(t) == 'table' and t._id == uniq
end
local function is_diff(t)
return type(t) == 'table' and getmetatable(t) == diffmt
end
local function _list_join(list, sep)
return table.concat(list, sep)
end
local function collection()
-- Return a table to hold items.
return {
n = 0,
add = function (self, item)
self.n = self.n + 1
self[self.n] = item
end,
join = _list_join,
}
end
local function strip_to_nil(text)
-- If text is a string, return its trimmed content, or nil if empty.
-- Otherwise return text (convenient when Date fields are provided from
-- another module which may pass a string, a number, or another type).
if type(text) == 'string' then
text = text:match('(%S.-)%s*$')
end
return text
end
local function is_leap_year(year, calname)
-- Return true if year is a leap year.
if calname == 'Julian' then
return year % 4 == 0
end
return (year % 4 == 0 and year % 100 ~= 0) or year % 400 == 0
end
local function days_in_month(year, month, calname)
-- Return number of days (1..31) in given month (1..12).
if month == 2 and is_leap_year(year, calname) then
return 29
end
return ({ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 })[month]
end
local function h_m_s(time)
-- Return hour, minute, second extracted from fraction of a day.
time = floor(time * 24 * 3600 + 0.5) -- number of seconds
local second = time % 60
time = floor(time / 60)
return floor(time / 60), time % 60, second
end
local function hms(date)
-- Return fraction of a day from date's time, where (0 <= fraction < 1)
-- if the values are valid, but could be anything if outside range.
return (date.hour + (date.minute + date.second / 60) / 60) / 24
end
local function julian_date(date)
-- Return jd, jdz from a Julian or Gregorian calendar date where
-- jd = Julian date and its fractional part is zero at noon
-- jdz = same, but assume time is 00:00:00 if no time given
-- http://www.tondering.dk/claus/cal/julperiod.php#formula
-- Testing shows this works for all dates from year -9999 to 9999!
-- JDN 0 is the 24-hour period starting at noon UTC on Monday
-- 1 January 4713 BC = (-4712, 1, 1) Julian calendar
-- 24 November 4714 BC = (-4713, 11, 24) Gregorian calendar
local offset
local a = floor((14 - date.month)/12)
local y = date.year + 4800 - a
if date.calendar == 'Julian' then
offset = floor(y/4) - 32083
else
offset = floor(y/4) - floor(y/100) + floor(y/400) - 32045
end
local m = date.month + 12*a - 3
local jd = date.day + floor((153*m + 2)/5) + 365*y + offset
if date.hastime then
jd = jd + hms(date) - 0.5
return jd, jd
end
return jd, jd - 0.5
end
local function set_date_from_jd(date)
-- Set the fields of table date from its Julian date field.
-- Return true if date is valid.
-- http://www.tondering.dk/claus/cal/julperiod.php#formula
-- This handles the proleptic Julian and Gregorian calendars.
-- Negative Julian dates are not defined but they work.
local calname = date.calendar
local low, high -- min/max limits for date ranges −9999-01-01 to 9999-12-31
if calname == 'Gregorian' then
low, high = -1930999.5, 5373484.49999
elseif calname == 'Julian' then
low, high = -1931076.5, 5373557.49999
else
return
end
local jd = date.jd
if not (type(jd) == 'number' and low <= jd and jd <= high) then
return
end
local jdn = floor(jd)
if date.hastime then
local time = jd - jdn -- 0 <= time < 1
if time >= 0.5 then -- if at or after midnight of next day
jdn = jdn + 1
time = time - 0.5
else
time = time + 0.5
end
date.hour, date.minute, date.second = h_m_s(time)
else
date.second = 0
date.minute = 0
date.hour = 0
end
local b, c
if calname == 'Julian' then
b = 0
c = jdn + 32082
else -- Gregorian
local a = jdn + 32044
b = floor((4*a + 3)/146097)
c = a - floor(146097*b/4)
end
local d = floor((4*c + 3)/1461)
local e = c - floor(1461*d/4)
local m = floor((5*e + 2)/153)
date.day = e - floor((153*m + 2)/5) + 1
date.month = m + 3 - 12*floor(m/10)
date.year = 100*b + d - 4800 + floor(m/10)
return true
end
local function fix_numbers(numbers, y, m, d, H, M, S, partial, hastime, calendar)
-- Put the result of normalizing the given values in table numbers.
-- The result will have valid m, d values if y is valid; caller checks y.
-- The logic of PHP mktime is followed where m or d can be zero to mean
-- the previous unit, and -1 is the one before that, etc.
-- Positive values carry forward.
local date
if not (1 <= m and m <= 12) then
date = Date(y, 1, 1)
if not date then return end
date = date + ((m - 1) .. 'm')
y, m = date.year, date.month
end
local days_hms
if not partial then
if hastime and H and M and S then
if not (0 <= H and H <= 23 and
0 <= M and M <= 59 and
0 <= S and S <= 59) then
days_hms = hms({ hour = H, minute = M, second = S })
end
end
if days_hms or not (1 <= d and d <= days_in_month(y, m, calendar)) then
date = date or Date(y, m, 1)
if not date then return end
date = date + (d - 1 + (days_hms or 0))
y, m, d = date.year, date.month, date.day
if days_hms then
H, M, S = date.hour, date.minute, date.second
end
end
end
numbers.year = y
numbers.month = m
numbers.day = d
if days_hms then
-- Don't set H unless it was valid because a valid H will set hastime.
numbers.hour = H
numbers.minute = M
numbers.second = S
end
end
local function set_date_from_numbers(date, numbers, options)
-- Set the fields of table date from numeric values.
-- Return true if date is valid.
if type(numbers) ~= 'table' then
return
end
local y = numbers.year or date.year
local m = numbers.month or date.month
local d = numbers.day or date.day
local H = numbers.hour
local M = numbers.minute or date.minute or 0
local S = numbers.second or date.second or 0
local need_fix
if y and m and d then
date.partial = nil
if not (-9999 <= y and y <= 9999 and
1 <= m and m <= 12 and
1 <= d and d <= days_in_month(y, m, date.calendar)) then
if not date.want_fix then
return
end
need_fix = true
end
elseif y and date.partial then
if d or not (-9999 <= y and y <= 9999) then
return
end
if m and not (1 <= m and m <= 12) then
if not date.want_fix then
return
end
need_fix = true
end
else
return
end
if date.partial then
H = nil -- ignore any time
M = nil
S = nil
else
if H then
-- It is not possible to set M or S without also setting H.
date.hastime = true
else
H = 0
end
if not (0 <= H and H <= 23 and
0 <= M and M <= 59 and
0 <= S and S <= 59) then
if date.want_fix then
need_fix = true
else
return
end
end
end
date.want_fix = nil
if need_fix then
fix_numbers(numbers, y, m, d, H, M, S, date.partial, date.hastime, date.calendar)
return set_date_from_numbers(date, numbers, options)
end
date.year = y -- -9999 to 9999 ('n BC' → year = 1 - n)
date.month = m -- 1 to 12 (may be nil if partial)
date.day = d -- 1 to 31 (* = nil if partial)
date.hour = H -- 0 to 59 (*)
date.minute = M -- 0 to 59 (*)
date.second = S -- 0 to 59 (*)
if type(options) == 'table' then
for _, k in ipairs({ 'am', 'era', 'format' }) do
if options[k] then
date.options[k] = options[k]
end
end
end
return true
end
local function make_option_table(options1, options2)
-- If options1 is a string, return a table with its settings, or
-- if it is a table, use its settings.
-- Missing options are set from table options2 or defaults.
-- If a default is used, a flag is set so caller knows the value was not intentionally set.
-- Valid option settings are:
-- am: 'am', 'a.m.', 'AM', 'A.M.'
-- 'pm', 'p.m.', 'PM', 'P.M.' (each has same meaning as corresponding item above)
-- era: 'BCMINUS', 'BCNEGATIVE', 'BC', 'B.C.', 'BCE', 'B.C.E.', 'AD', 'A.D.', 'CE', 'C.E.'
-- Option am = 'am' does not mean the hour is AM; it means 'am' or 'pm' is used, depending on the hour,
-- and am = 'pm' has the same meaning.
-- Similarly, era = 'BC' means 'BC' is used if year <= 0.
-- BCMINUS displays a MINUS if year < 0 and the display format does not include %{era}.
-- BCNEGATIVE is similar but displays a hyphen.
local result = { bydefault = {} }
if type(options1) == 'table' then
result.am = options1.am
result.era = options1.era
elseif type(options1) == 'string' then
-- Example: 'am:AM era:BC' or 'am=AM era=BC'.
for item in options1:gmatch('%S+') do
local lhs, rhs = item:match('^(%w+)[:=](.+)$')
if lhs then
result[lhs] = rhs
end
end
end
options2 = type(options2) == 'table' and options2 or {}
local defaults = { am = 'am', era = 'BC' }
for k, v in pairs(defaults) do
if not result[k] then
if options2[k] then
result[k] = options2[k]
else
result[k] = v
result.bydefault[k] = true
end
end
end
return result
end
local ampm_options = {
-- lhs = input text accepted as an am/pm option
-- rhs = code used internally
['am'] = 'am',
['AM'] = 'AM',
['a.m.'] = 'a.m.',
['A.M.'] = 'A.M.',
['pm'] = 'am', -- same as am
['PM'] = 'AM',
['p.m.'] = 'a.m.',
['P.M.'] = 'A.M.',
}
local era_text = {
-- Text for displaying an era with a positive year (after adjusting
-- by replacing year with 1 - year if date.year <= 0).
-- options.era = { year<=0 , year>0 }
['BCMINUS'] = { 'BC' , '' , isbc = true, sign = MINUS },
['BCNEGATIVE'] = { 'BC' , '' , isbc = true, sign = '-' },
['BC'] = { 'BC' , '' , isbc = true },
['B.C.'] = { 'B.C.' , '' , isbc = true },
['BCE'] = { 'BCE' , '' , isbc = true },
['B.C.E.'] = { 'B.C.E.', '' , isbc = true },
['AD'] = { 'BC' , 'AD' },
['A.D.'] = { 'B.C.' , 'A.D.' },
['CE'] = { 'BCE' , 'CE' },
['C.E.'] = { 'B.C.E.', 'C.E.' },
}
local function get_era_for_year(era, year)
return (era_text[era] or era_text['BC'])[year > 0 and 2 or 1] or ''
end
local function strftime(date, format, options)
-- Return date formatted as a string using codes similar to those
-- in the C strftime library function.
local sformat = string.format
local shortcuts = {
['%c'] = '%-I:%M %p %-d %B %-Y %{era}', -- date and time: 2:30 pm 1 April 2016
['%x'] = '%-d %B %-Y %{era}', -- date: 1 April 2016
['%X'] = '%-I:%M %p', -- time: 2:30 pm
}
if shortcuts[format] then
format = shortcuts[format]
end
local codes = {
a = { field = 'dayabbr' },
A = { field = 'dayname' },
b = { field = 'monthabbr' },
B = { field = 'monthname' },
u = { fmt = '%d' , field = 'dowiso' },
w = { fmt = '%d' , field = 'dow' },
d = { fmt = '%02d', fmt2 = '%d', field = 'day' },
m = { fmt = '%02d', fmt2 = '%d', field = 'month' },
Y = { fmt = '%04d', fmt2 = '%d', field = 'year' },
H = { fmt = '%02d', fmt2 = '%d', field = 'hour' },
M = { fmt = '%02d', fmt2 = '%d', field = 'minute' },
S = { fmt = '%02d', fmt2 = '%d', field = 'second' },
j = { fmt = '%03d', fmt2 = '%d', field = 'dayofyear' },
I = { fmt = '%02d', fmt2 = '%d', field = 'hour', special = 'hour12' },
p = { field = 'hour', special = 'am' },
}
options = make_option_table(options, date.options)
local amopt = options.am
local eraopt = options.era
local function replace_code(spaces, modifier, id)
local code = codes[id]
if code then
local fmt = code.fmt
if modifier == '-' and code.fmt2 then
fmt = code.fmt2
end
local value = date[code.field]
if not value then
return nil -- an undefined field in a partial date
end
local special = code.special
if special then
if special == 'hour12' then
value = value % 12
value = value == 0 and 12 or value
elseif special == 'am' then
local ap = ({
['a.m.'] = { 'a.m.', 'p.m.' },
['AM'] = { 'AM', 'PM' },
['A.M.'] = { 'A.M.', 'P.M.' },
})[ampm_options[amopt]] or { 'am', 'pm' }
return (spaces == '' and '' or ' ') .. (value < 12 and ap[1] or ap[2])
end
end
if code.field == 'year' then
local sign = (era_text[eraopt] or {}).sign
if not sign or format:find('%{era}', 1, true) then
sign = ''
if value <= 0 then
value = 1 - value
end
else
if value >= 0 then
sign = ''
else
value = -value
end
end
return spaces .. sign .. sformat(fmt, value)
end
return spaces .. (fmt and sformat(fmt, value) or value)
end
end
local function replace_property(spaces, id)
if id == 'era' then
-- Special case so can use local era option.
local result = get_era_for_year(eraopt, date.year)
if result == '' then
return ''
end
return (spaces == '' and '' or ' ') .. result
end
local result = date[id]
if type(result) == 'string' then
return spaces .. result
end
if type(result) == 'number' then
return spaces .. tostring(result)
end
if type(result) == 'boolean' then
return spaces .. (result and '1' or '0')
end
-- This occurs if id is an undefined field in a partial date, or is the name of a function.
return nil
end
local PERCENT = '\127PERCENT\127'
return (format
:gsub('%%%%', PERCENT)
:gsub('(%s*)%%{(%w+)}', replace_property)
:gsub('(%s*)%%(%-?)(%a)', replace_code)
:gsub(PERCENT, '%%')
)
end
local function _date_text(date, fmt, options)
-- Return a formatted string representing the given date.
if not is_date(date) then
error('date:text: need a date (use "date:text()" with a colon)', 2)
end
if type(fmt) == 'string' and fmt:match('%S') then
if fmt:find('%', 1, true) then
return strftime(date, fmt, options)
end
elseif date.partial then
fmt = date.month and 'my' or 'y'
else
fmt = 'dmy'
if date.hastime then
fmt = (date.second > 0 and 'hms ' or 'hm ') .. fmt
end
end
local function bad_format()
-- For consistency with other format processing, return given format
-- (or cleaned format if original was not a string) if invalid.
return mw.text.nowiki(fmt)
end
if date.partial then
-- Ignore days in standard formats like 'ymd'.
if fmt == 'ym' or fmt == 'ymd' then
fmt = date.month and '%Y-%m %{era}' or '%Y %{era}'
elseif fmt == 'my' or fmt == 'dmy' or fmt == 'mdy' then
fmt = date.month and '%B %-Y %{era}' or '%-Y %{era}'
elseif fmt == 'y' then
fmt = date.month and '%-Y %{era}' or '%-Y %{era}'
else
return bad_format()
end
return strftime(date, fmt, options)
end
local function hm_fmt()
local plain = make_option_table(options, date.options).bydefault.am
return plain and '%H:%M' or '%-I:%M %p'
end
local need_time = date.hastime
local t = collection()
for item in fmt:gmatch('%S+') do
local f
if item == 'hm' then
f = hm_fmt()
need_time = false
elseif item == 'hms' then
f = '%H:%M:%S'
need_time = false
elseif item == 'ymd' then
f = '%Y-%m-%d %{era}'
elseif item == 'mdy' then
f = '%B %-d, %-Y %{era}'
elseif item == 'dmy' then
f = '%-d %B %-Y %{era}'
else
return bad_format()
end
t:add(f)
end
fmt = t:join(' ')
if need_time then
fmt = hm_fmt() .. ' ' .. fmt
end
return strftime(date, fmt, options)
end
local day_info = {
-- 0=Sun to 6=Sat
[0] = { 'Sun', 'Sunday' },
{ 'Mon', 'Monday' },
{ 'Tue', 'Tuesday' },
{ 'Wed', 'Wednesday' },
{ 'Thu', 'Thursday' },
{ 'Fri', 'Friday' },
{ 'Sat', 'Saturday' },
}
local month_info = {
-- 1=Jan to 12=Dec
{ 'Jan', 'January' },
{ 'Feb', 'February' },
{ 'Mar', 'March' },
{ 'Apr', 'April' },
{ 'May', 'May' },
{ 'Jun', 'June' },
{ 'Jul', 'July' },
{ 'Aug', 'August' },
{ 'Sep', 'September' },
{ 'Oct', 'October' },
{ 'Nov', 'November' },
{ 'Dec', 'December' },
}
local function name_to_number(text, translate)
if type(text) == 'string' then
return translate[text:lower()]
end
end
local function day_number(text)
return name_to_number(text, {
sun = 0, sunday = 0,
mon = 1, monday = 1,
tue = 2, tuesday = 2,
wed = 3, wednesday = 3,
thu = 4, thursday = 4,
fri = 5, friday = 5,
sat = 6, saturday = 6,
})
end
local function month_number(text)
return name_to_number(text:gsub('%.', ''), {
jan = 1, january = 1,
feb = 2, february = 2,
mar = 3, march = 3,
apr = 4, april = 4,
may = 5,
jun = 6, june = 6,
jul = 7, july = 7,
aug = 8, august = 8,
sep = 9, september = 9, sept = 9,
oct = 10, october = 10,
nov = 11, november = 11,
dec = 12, december = 12,
})
end
local function _list_text(list, fmt)
-- Return a list of formatted strings from a list of dates.
if not type(list) == 'table' then
error('date:list:text: need "list:text()" with a colon', 2)
end
local result = { join = _list_join }
for i, date in ipairs(list) do
result[i] = date:text(fmt)
end
return result
end
local function _date_list(date, spec)
-- Return a possibly empty numbered table of dates meeting the specification.
-- Dates in the list are in ascending order (oldest date first).
-- The spec should be a string of form "<count> <day> <op>"
-- where each item is optional and
-- count = number of items wanted in list
-- day = abbreviation or name such as Mon or Monday
-- op = >, >=, <, <= (default is > meaning after date)
-- If no count is given, the list is for the specified days in date's month.
-- The default day is date's day.
-- The spec can also be a positive or negative number:
-- -5 is equivalent to '5 <'
-- 5 is equivalent to '5' which is '5 >'
if not is_date(date) then
error('date:list: need a date (use "date:list()" with a colon)', 2)
end
local list = { text = _list_text }
if date.partial then
return list
end
local count, offset, operation
local ops = {
['>='] = { before = false, include = true },
['>'] = { before = false, include = false },
['<='] = { before = true , include = true },
['<'] = { before = true , include = false },
}
if spec then
if type(spec) == 'number' then
count = floor(spec + 0.5)
if count < 0 then
count = -count
operation = ops['<']
end
elseif type(spec) == 'string' then
local num, day, op = spec:match('^%s*(%d*)%s*(%a*)%s*([<>=]*)%s*$')
if not num then
return list
end
if num ~= '' then
count = tonumber(num)
end
if day ~= '' then
local dow = day_number(day:gsub('[sS]$', '')) -- accept plural days
if not dow then
return list
end
offset = dow - date.dow
end
operation = ops[op]
else
return list
end
end
offset = offset or 0
operation = operation or ops['>']
local datefrom, dayfirst, daylast
if operation.before then
if offset > 0 or (offset == 0 and not operation.include) then
offset = offset - 7
end
if count then
if count > 1 then
offset = offset - 7*(count - 1)
end
datefrom = date + offset
else
daylast = date.day + offset
dayfirst = daylast % 7
if dayfirst == 0 then
dayfirst = 7
end
end
else
if offset < 0 or (offset == 0 and not operation.include) then
offset = offset + 7
end
if count then
datefrom = date + offset
else
dayfirst = date.day + offset
daylast = date.monthdays
end
end
if not count then
if daylast < dayfirst then
return list
end
count = floor((daylast - dayfirst)/7) + 1
datefrom = Date(date, {day = dayfirst})
end
for i = 1, count do
if not datefrom then break end -- exceeds date limits
list[i] = datefrom
datefrom = datefrom + 7
end
return list
end
-- Cache the current date/time (UTC).
--
-- Note that os.date() returns an empty object with optimized lazy getters for each field.
-- Avoid current.min or current.sec in articles! https://phabricator.wikimedia.org/T416616
--
-- Beware that while os.date() uses 'min' and 'sec', our Date() uses 'minute' and 'second'.
local current = os.date('!*t')
local function extract_date(newdate, text)
-- Parse the date/time in text and return n, o where
-- n = table of numbers with date/time fields
-- o = table of options for AM/PM or AD/BC or format, if any
-- or return nothing if date is known to be invalid.
-- Caller determines if the values in n are valid.
-- A year must be positive ('1' to '9999'); use 'BC' for BC.
-- In a y-m-d string, the year must be four digits to avoid ambiguity
-- ('0001' to '9999'). The only way to enter year <= 0 is by specifying
-- the date as three numeric parameters like ymd Date(-1, 1, 1).
-- Dates of form d/m/y, m/d/y, y/m/d are rejected as potentially ambiguous.
local date, options = {}, {}
if text:sub(-1) == 'Z' then
-- Extract date/time from a Wikidata timestamp.
-- The year can be 1 to 16 digits but this module handles 1 to 4 digits only.
-- Examples: '+2016-06-21T14:30:00Z', '-0000000180-00-00T00:00:00Z'.
local sign, y, m, d, H, M, S = text:match('^([+%-])(%d+)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)Z$')
if sign then
y = tonumber(y)
if sign == '-' and y > 0 then
y = -y
end
if y <= 0 then
options.era = 'BCE'
end
date.year = y
m = tonumber(m)
d = tonumber(d)
H = tonumber(H)
M = tonumber(M)
S = tonumber(S)
if m == 0 then
newdate.partial = true
return date, options
end
date.month = m
if d == 0 then
newdate.partial = true
return date, options
end
date.day = d
if H > 0 or M > 0 or S > 0 then
date.hour = H
date.minute = M
date.second = S
end
return date, options
end
return
end
local function extract_ymd(item)
-- Called when no day or month has been set.
local y, m, d = item:match('^(%d%d%d%d)%-(%w+)%-(%d%d?)$')
if y then
if date.year then
return
end
if m:match('^%d%d?$') then
m = tonumber(m)
else
m = month_number(m)
end
if m then
date.year = tonumber(y)
date.month = m
date.day = tonumber(d)
return true
end
end
end
local function extract_day_or_year(item)
-- Called when a day would be valid, or
-- when a year would be valid if no year has been set and partial is set.
local number, suffix = item:match('^(%d%d?%d?%d?)(.*)$')
if number then
local n = tonumber(number)
if #number <= 2 and n <= 31 then
suffix = suffix:lower()
if suffix == '' or suffix == 'st' or suffix == 'nd' or suffix == 'rd' or suffix == 'th' then
date.day = n
return true
end
elseif suffix == '' and newdate.partial and not date.year then
date.year = n
return true
end
end
end
local function extract_month(item)
-- A month must be given as a name or abbreviation; a number could be ambiguous.
local m = month_number(item)
if m then
date.month = m
return true
end
end
local function extract_time(item)
local h, m, s = item:match('^(%d%d?):(%d%d)(:?%d*)$')
if date.hour or not h then
return
end
if s ~= '' then
s = s:match('^:(%d%d)$')
if not s then
return
end
end
date.hour = tonumber(h)
date.minute = tonumber(m)
date.second = tonumber(s) -- nil if empty string
return true
end
local item_count = 0
local index_time
local function set_ampm(item)
local H = date.hour
if H and not options.am and index_time + 1 == item_count then
options.am = ampm_options[item] -- caller checked this is not nil
if item:match('^[Aa]') then
if not (1 <= H and H <= 12) then
return
end
if H == 12 then
date.hour = 0
end
else
if not (1 <= H and H <= 23) then
return
end
if H <= 11 then
date.hour = H + 12
end
end
return true
end
end
for item in text:gsub(',', ' '):gsub(' ', ' '):gmatch('%S+') do
item_count = item_count + 1
if era_text[item] then
-- Era is accepted in peculiar places.
if options.era then
return
end
options.era = item
elseif ampm_options[item] then
if not set_ampm(item) then
return
end
elseif item:find(':', 1, true) then
if not extract_time(item) then
return
end
index_time = item_count
elseif date.day and date.month then
if date.year then
return -- should be nothing more so item is invalid
end
if not item:match('^(%d%d?%d?%d?)$') then
return
end
date.year = tonumber(item)
elseif date.day then
if not extract_month(item) then
return
end
elseif date.month then
if not extract_day_or_year(item) then
return
end
elseif extract_month(item) then
options.format = 'mdy'
elseif extract_ymd(item) then
options.format = 'ymd'
elseif extract_day_or_year(item) then
if date.day then
options.format = 'dmy'
end
else
return
end
end
if not date.year or date.year == 0 then
return
end
local era = era_text[options.era]
if era and era.isbc then
date.year = 1 - date.year
end
return date, options
end
local function autofill(date1, date2)
-- Fill any missing month or day in each date using the
-- corresponding component from the other date, if present,
-- or with 1 if both dates are missing the month or day.
-- This gives a good result for calculating the difference
-- between two partial dates when no range is wanted.
-- Return filled date1, date2 (two full dates).
local function filled(a, b)
-- Return date a filled, if necessary, with month and/or day from date b.
-- The filled day is truncated to fit the number of days in the month.
local fillmonth, fillday
if not a.month then
fillmonth = b.month or 1
end
if not a.day then
fillday = b.day or 1
end
if fillmonth or fillday then -- need to create a new date
a = Date(a, {
month = fillmonth,
day = math.min(fillday or a.day, days_in_month(a.year, fillmonth or a.month, a.calendar))
})
end
return a
end
return filled(date1, date2), filled(date2, date1)
end
local function date_add_sub(lhs, rhs, is_sub)
-- Return a new date from calculating (lhs + rhs) or (lhs - rhs),
-- or return nothing if invalid.
-- The result is nil if the calculated date exceeds allowable limits.
-- Caller ensures that lhs is a date; its properties are copied for the new date.
if lhs.partial then
-- Adding to a partial is not supported.
-- Can subtract a date or partial from a partial, but this is not called for that.
return
end
local function is_prefix(text, word, minlen)
local n = #text
return (minlen or 1) <= n and n <= #word and text == word:sub(1, n)
end
local function do_days(n)
local forcetime, jd
if floor(n) == n then
jd = lhs.jd
else
forcetime = not lhs.hastime
jd = lhs.jdz
end
jd = jd + (is_sub and -n or n)
if forcetime then
jd = tostring(jd)
if not jd:find('.', 1, true) then
jd = jd .. '.0'
end
end
return Date(lhs, 'juliandate', jd)
end
if type(rhs) == 'number' then
-- Add/subtract days, including fractional days.
return do_days(rhs)
end
if type(rhs) == 'string' then
-- rhs is a single component like '26m' or '26 months' (with optional sign).
-- Fractions like '3.25d' are accepted for the units which are handled as days.
local sign, numstr, id = rhs:match('^%s*([+-]?)([%d%.]+)%s*(%a+)$')
if sign then
if sign == '-' then
is_sub = not (is_sub and true or false)
end
local y, m, days
local num = tonumber(numstr)
if not num then
return
end
id = id:lower()
if is_prefix(id, 'years') then
y = num
m = 0
elseif is_prefix(id, 'months') then
y = floor(num / 12)
m = num % 12
elseif is_prefix(id, 'weeks') then
days = num * 7
elseif is_prefix(id, 'days') then
days = num
elseif is_prefix(id, 'hours') then
days = num / 24
elseif is_prefix(id, 'minutes', 3) then
days = num / (24 * 60)
elseif is_prefix(id, 'seconds') then
days = num / (24 * 3600)
else
return
end
if days then
return do_days(days)
end
if numstr:find('.', 1, true) then
return
end
if is_sub then
y = -y
m = -m
end
assert(-11 <= m and m <= 11)
y = lhs.year + y
m = lhs.month + m
if m > 12 then
y = y + 1
m = m - 12
elseif m < 1 then
y = y - 1
m = m + 12
end
local d = math.min(lhs.day, days_in_month(y, m, lhs.calendar))
return Date(lhs, y, m, d)
end
end
if is_diff(rhs) then
local days = rhs.age_days
if (is_sub or false) ~= (rhs.isnegative or false) then
days = -days
end
return lhs + days
end
end
local full_date_only = {
dayabbr = true,
dayname = true,
dow = true,
dayofweek = true,
dowiso = true,
dayofweekiso = true,
dayofyear = true,
gsd = true,
juliandate = true,
jd = true,
jdz = true,
jdnoon = true,
}
-- Metatable for a date's calculated fields.
local datemt = {
__index = function (self, key)
if rawget(self, 'partial') then
if full_date_only[key] then return end
if key == 'monthabbr' or key == 'monthdays' or key == 'monthname' then
if not self.month then return end
end
end
local value
if key == 'dayabbr' then
value = day_info[self.dow][1]
elseif key == 'dayname' then
value = day_info[self.dow][2]
elseif key == 'dow' then
value = (self.jdnoon + 1) % 7 -- day-of-week 0=Sun to 6=Sat
elseif key == 'dayofweek' then
value = self.dow
elseif key == 'dowiso' then
value = (self.jdnoon % 7) + 1 -- ISO day-of-week 1=Mon to 7=Sun
elseif key == 'dayofweekiso' then
value = self.dowiso
elseif key == 'dayofyear' then
local first = Date(self.year, 1, 1, self.calendar).jdnoon
value = self.jdnoon - first + 1 -- day-of-year 1 to 366
elseif key == 'era' then
-- Era text (never a negative sign) from year and options.
value = get_era_for_year(self.options.era, self.year)
elseif key == 'format' then
value = self.options.format or 'dmy'
elseif key == 'gsd' then
-- GSD = 1 from 00:00:00 to 23:59:59 on 1 January 1 AD Gregorian calendar,
-- which is from jd 1721425.5 to 1721426.49999.
value = floor(self.jd - 1721424.5)
elseif key == 'juliandate' or key == 'jd' or key == 'jdz' then
local jd, jdz = julian_date(self)
rawset(self, 'juliandate', jd)
rawset(self, 'jd', jd)
rawset(self, 'jdz', jdz)
return key == 'jdz' and jdz or jd
elseif key == 'jdnoon' then
-- Julian date at noon (an integer) on the calendar day when jd occurs.
value = floor(self.jd + 0.5)
elseif key == 'isleapyear' then
value = is_leap_year(self.year, self.calendar)
elseif key == 'monthabbr' then
value = month_info[self.month][1]
elseif key == 'monthdays' then
value = days_in_month(self.year, self.month, self.calendar)
elseif key == 'monthname' then
value = month_info[self.month][2]
end
if value ~= nil then
rawset(self, key, value)
return value
end
end,
}
-- Date operators.
local function mt_date_add(lhs, rhs)
if not is_date(lhs) then
lhs, rhs = rhs, lhs -- put date on left (it must be a date for this to have been called)
end
return date_add_sub(lhs, rhs)
end
local function mt_date_sub(lhs, rhs)
if is_date(lhs) then
if is_date(rhs) then
return DateDiff(lhs, rhs)
end
return date_add_sub(lhs, rhs, true)
end
end
local function mt_date_concat(lhs, rhs)
return tostring(lhs) .. tostring(rhs)
end
local function mt_date_tostring(self)
return self:text()
end
local function mt_date_eq(lhs, rhs)
-- Return true if dates identify same date/time where, for example,
-- Date(-4712, 1, 1, 'Julian') == Date(-4713, 11, 24, 'Gregorian') is true.
-- This is called only if lhs and rhs have the same type and the same metamethod.
if lhs.partial or rhs.partial then
-- One date is partial; the other is a partial or a full date.
-- The months may both be nil, but must be the same.
return lhs.year == rhs.year and lhs.month == rhs.month and lhs.calendar == rhs.calendar
end
return lhs.jdz == rhs.jdz
end
local function mt_date_lt(lhs, rhs)
-- Return true if lhs < rhs, for example,
-- Date('1 Jan 2016') < Date('06:00 1 Jan 2016') is true.
-- This is called only if lhs and rhs have the same type and the same metamethod.
if lhs.partial or rhs.partial then
-- One date is partial; the other is a partial or a full date.
if lhs.calendar ~= rhs.calendar then
return lhs.calendar == 'Julian'
end
if lhs.partial then
lhs = lhs.partial.first
end
if rhs.partial then
rhs = rhs.partial.first
end
end
return lhs.jdz < rhs.jdz
end
--[[ Examples of syntax to construct a date:
Date(y, m, d, 'julian') default calendar is 'gregorian'
Date(y, m, d, H, M, S, 'julian')
Date('juliandate', jd, 'julian') if jd contains "." text output includes H:M:S
Date('currentdate')
Date('currentdatetime')
Date('1 April 1995', 'julian') parse date from text
Date('1 April 1995 AD', 'julian') using an era sets a flag to do the same for output
Date('04:30:59 1 April 1995', 'julian')
Date(date) copy of an existing date
Date(date, t) same, updated with y,m,d,H,M,S fields from table t
Date(t) date with y,m,d,H,M,S fields from table t
]]
function Date(...) -- for forward declaration above
-- Return a table holding a date assuming a uniform calendar always applies
-- (proleptic Gregorian calendar or proleptic Julian calendar), or
-- return nothing if date is invalid.
-- A partial date has a valid year, however its month may be nil, and
-- its day and time fields are nil.
-- Field partial is set to false (if a full date) or a table (if a partial date).
local calendars = { julian = 'Julian', gregorian = 'Gregorian' }
local newdate = {
_id = uniq,
calendar = 'Gregorian', -- default is Gregorian calendar
hastime = false, -- true if input sets a time
hour = 0, -- always set hour/minute/second so don't have to handle nil
minute = 0,
second = 0,
options = {},
list = _date_list,
subtract = function (self, rhs, options)
return DateDiff(self, rhs, options)
end,
text = _date_text,
}
local argtype, datetext, is_copy, jd_number, tnums
local numindex = 0
local numfields = { 'year', 'month', 'day', 'hour', 'minute', 'second' }
local numbers = {}
for _, v in ipairs({...}) do
v = strip_to_nil(v)
local vlower = type(v) == 'string' and v:lower() or nil
if v == nil then
-- Ignore empty arguments after stripping so modules can directly pass template parameters.
elseif calendars[vlower] then
newdate.calendar = calendars[vlower]
elseif vlower == 'partial' then
newdate.partial = true
elseif vlower == 'fix' then
newdate.want_fix = true
elseif is_date(v) then
-- Copy existing date (items can be overridden by other arguments).
if is_copy or tnums then
return
end
is_copy = true
newdate.calendar = v.calendar
newdate.partial = v.partial
newdate.hastime = v.hastime
newdate.options = v.options
newdate.year = v.year
newdate.month = v.month
newdate.day = v.day
newdate.hour = v.hour
newdate.minute = v.minute
newdate.second = v.second
elseif type(v) == 'table' then
if tnums then
return
end
tnums = {}
local tfields = { year=1, month=1, day=1, hour=2, minute=2, second=2 }
for tk, tv in pairs(v) do
if tfields[tk] then
tnums[tk] = tonumber(tv)
end
if tfields[tk] == 2 then
newdate.hastime = true
end
end
else
local num = tonumber(v)
if not num and argtype == 'setdate' and numindex == 1 then
num = month_number(v)
end
if num then
if not argtype then
argtype = 'setdate'
end
if argtype == 'setdate' and numindex < 6 then
numindex = numindex + 1
numbers[numfields[numindex]] = num
elseif argtype == 'juliandate' and not jd_number then
jd_number = num
if type(v) == 'string' then
if v:find('.', 1, true) then
newdate.hastime = true
end
elseif num ~= floor(num) then
-- The given value was a number. The time will be used
-- if the fractional part is nonzero.
newdate.hastime = true
end
else
return
end
elseif argtype then
return
elseif type(v) == 'string' then
if v == 'currentdate' or v == 'currentdatetime' or v == 'juliandate' then
argtype = v
else
argtype = 'datetext'
datetext = v
end
else
return
end
end
end
if argtype == 'datetext' then
if tnums or not set_date_from_numbers(newdate, extract_date(newdate, datetext)) then
return
end
elseif argtype == 'juliandate' then
newdate.partial = nil
newdate.jd = jd_number
if not set_date_from_jd(newdate) then
return
end
elseif argtype == 'currentdate' or argtype == 'currentdatetime' then
newdate.partial = nil
newdate.year = current.year
newdate.month = current.month
newdate.day = current.day
if argtype == 'currentdatetime' then
newdate.hour = current.hour
newdate.minute = current.min
newdate.second = current.sec
newdate.hastime = true
end
newdate.calendar = 'Gregorian' -- ignore any given calendar name
elseif argtype == 'setdate' then
if tnums or not set_date_from_numbers(newdate, numbers) then
return
end
elseif not (is_copy or tnums) then
return
end
if tnums then
newdate.jd = nil -- force recalculation in case jd was set before changes from tnums
if not set_date_from_numbers(newdate, tnums) then
return
end
end
if newdate.partial then
local year = newdate.year
local month = newdate.month
local first = Date(year, month or 1, 1, newdate.calendar)
month = month or 12
local last = Date(year, month, days_in_month(year, month), newdate.calendar)
newdate.partial = { first = first, last = last }
else
newdate.partial = false -- avoid index lookup
end
setmetatable(newdate, datemt)
local readonly = {}
local mt = {
__index = newdate,
__newindex = function(t, k, v) error('date.' .. tostring(k) .. ' is read-only', 2) end,
__add = mt_date_add,
__sub = mt_date_sub,
__concat = mt_date_concat,
__tostring = mt_date_tostring,
__eq = mt_date_eq,
__lt = mt_date_lt,
}
return setmetatable(readonly, mt)
end
local function _diff_age(diff, code, options)
-- Return a tuple of integer values from diff as specified by code, except that
-- each integer may be a list of two integers for a diff with a partial date, or
-- return nil if the code is not supported.
-- If want round, the least significant unit is rounded to nearest whole unit.
-- For a duration, an extra day is added.
local wantround, wantduration, wantrange
if type(options) == 'table' then
wantround = options.round
wantduration = options.duration
wantrange = options.range
else
wantround = options
end
if not is_diff(diff) then
local f = wantduration and 'duration' or 'age'
error(f .. ': need a date difference (use "diff:' .. f .. '()" with a colon)', 2)
end
if diff.partial then
-- Ignore wantround, wantduration.
local function choose(v)
if type(v) == 'table' then
if not wantrange or v[1] == v[2] then
-- Example: Date('partial', 2005) - Date('partial', 2001) gives
-- diff.years = { 3, 4 } to show the range of possible results.
-- If do not want a range, choose the second value as more expected.
return v[2]
end
end
return v
end
if code == 'ym' or code == 'ymd' then
if not wantrange and diff.iszero then
-- This avoids an unexpected result such as
-- Date('partial', 2001) - Date('partial', 2001)
-- giving diff = { years = 0, months = { 0, 11 } }
-- which would be reported as 0 years and 11 months.
return 0, 0
end
return choose(diff.partial.years), choose(diff.partial.months)
end
if code == 'y' then
return choose(diff.partial.years)
end
if code == 'm' or code == 'w' or code == 'd' then
return choose({ diff.partial.mindiff:age(code), diff.partial.maxdiff:age(code) })
end
return nil
end
local extra_days = wantduration and 1 or 0
if code == 'wd' or code == 'w' or code == 'd' then
local offset = wantround and 0.5 or 0
local days = diff.age_days + extra_days
if code == 'wd' or code == 'd' then
days = floor(days + offset)
if code == 'd' then
return days
end
return floor(days/7), days % 7
end
return floor(days/7 + offset)
end
local H, M, S = diff.hours, diff.minutes, diff.seconds
if code == 'dh' or code == 'dhm' or code == 'dhms' or code == 'h' or code == 'hm' or code == 'hms' or code == 'M' or code == 's' then
local days = floor(diff.age_days + extra_days)
local inc_hour
if wantround then
if code == 'dh' or code == 'h' then
if M >= 30 then
inc_hour = true
end
elseif code == 'dhm' or code == 'hm' then
if S >= 30 then
M = M + 1
if M >= 60 then
M = 0
inc_hour = true
end
end
elseif code == 'M' then
if S >= 30 then
M = M + 1
end
else
-- Nothing needed because S is an integer.
end
if inc_hour then
H = H + 1
if H >= 24 then
H = 0
days = days + 1
end
end
end
if code == 'dh' or code == 'dhm' or code == 'dhms' then
if code == 'dh' then
return days, H
elseif code == 'dhm' then
return days, H, M
else
return days, H, M, S
end
end
local hours = days * 24 + H
if code == 'h' then
return hours
elseif code == 'hm' then
return hours, M
elseif code == 'M' or code == 's' then
M = hours * 60 + M
if code == 'M' then
return M
end
return M * 60 + S
end
return hours, M, S
end
if wantround then
local inc_hour
if code == 'ymdh' or code == 'ymwdh' then
if M >= 30 then
inc_hour = true
end
elseif code == 'ymdhm' or code == 'ymwdhm' then
if S >= 30 then
M = M + 1
if M >= 60 then
M = 0
inc_hour = true
end
end
elseif code == 'ymd' or code == 'ymwd' or code == 'yd' or code == 'md' then
if H >= 12 then
extra_days = extra_days + 1
end
end
if inc_hour then
H = H + 1
if H >= 24 then
H = 0
extra_days = extra_days + 1
end
end
end
local y, m, d = diff.years, diff.months, diff.days
if extra_days > 0 then
d = d + extra_days
if d > 28 or code == 'yd' then
-- Recalculate in case have passed a month.
diff = diff.date1 + extra_days - diff.date2
y, m, d = diff.years, diff.months, diff.days
end
end
if code == 'ymd' then
return y, m, d
elseif code == 'yd' then
if y > 0 then
-- It is known that diff.date1 > diff.date2.
diff = diff.date1 - (diff.date2 + (y .. 'y'))
end
return y, floor(diff.age_days)
elseif code == 'md' then
return y * 12 + m, d
elseif code == 'ym' or code == 'm' then
if wantround then
if d >= 16 then
m = m + 1
if m >= 12 then
m = 0
y = y + 1
end
end
end
if code == 'ym' then
return y, m
end
return y * 12 + m
elseif code == 'ymw' then
local weeks = floor(d/7)
if wantround then
local days = d % 7
if days > 3 or (days == 3 and H >= 12) then
weeks = weeks + 1
end
end
return y, m, weeks
elseif code == 'ymwd' then
return y, m, floor(d/7), d % 7
elseif code == 'ymdh' then
return y, m, d, H
elseif code == 'ymwdh' then
return y, m, floor(d/7), d % 7, H
elseif code == 'ymdhm' then
return y, m, d, H, M
elseif code == 'ymwdhm' then
return y, m, floor(d/7), d % 7, H, M
end
if code == 'y' then
if wantround and m >= 6 then
y = y + 1
end
return y
end
return nil
end
local function _diff_duration(diff, code, options)
if type(options) ~= 'table' then
options = { round = options }
end
options.duration = true
return _diff_age(diff, code, options)
end
-- Metatable for some operations on date differences.
diffmt = { -- for forward declaration above
__concat = function (lhs, rhs)
return tostring(lhs) .. tostring(rhs)
end,
__tostring = function (self)
return tostring(self.age_days)
end,
__index = function (self, key)
local value
if key == 'age_days' then
if rawget(self, 'partial') then
local function jdz(date)
return (date.partial and date.partial.first or date).jdz
end
value = jdz(self.date1) - jdz(self.date2)
else
value = self.date1.jdz - self.date2.jdz
end
end
if value ~= nil then
rawset(self, key, value)
return value
end
end,
}
function DateDiff(date1, date2, options) -- for forward declaration above
-- Return a table with the difference between two dates (date1 - date2).
-- The difference is negative if date1 is older than date2.
-- Return nothing if invalid.
-- If d = date1 - date2 then
-- date1 = date2 + d
-- If date1 >= date2 and the dates have no H:M:S time specified then
-- date1 = date2 + (d.years..'y') + (d.months..'m') + d.days
-- where the larger time units are added first.
-- The result of Date(2015,1,x) + '1m' is Date(2015,2,28) for
-- x = 28, 29, 30, 31. That means, for example,
-- d = Date(2015,3,3) - Date(2015,1,31)
-- gives d.years, d.months, d.days = 0, 1, 3 (excluding date1).
if not (is_date(date1) and is_date(date2) and date1.calendar == date2.calendar) then
return
end
local wantfill
if type(options) == 'table' then
wantfill = options.fill
end
local isnegative = false
local iszero = false
if date1 < date2 then
isnegative = true
date1, date2 = date2, date1
elseif date1 == date2 then
iszero = true
end
-- It is known that date1 >= date2 (period is from date2 to date1).
if date1.partial or date2.partial then
-- Two partial dates might have timelines:
---------------------A=================B--- date1 is from A to B inclusive
--------C=======D-------------------------- date2 is from C to D inclusive
-- date1 > date2 iff A > C (date1.partial.first > date2.partial.first)
-- The periods can overlap ('April 2001' - '2001'):
-------------A===B------------------------- A=2001-04-01 B=2001-04-30
--------C=====================D------------ C=2001-01-01 D=2001-12-31
if wantfill then
date1, date2 = autofill(date1, date2)
else
local function zdiff(date1, date2)
local diff = date1 - date2
if diff.isnegative then
return date1 - date1 -- a valid diff in case we call its methods
end
return diff
end
local function getdate(date, which)
return date.partial and date.partial[which] or date
end
local maxdiff = zdiff(getdate(date1, 'last'), getdate(date2, 'first'))
local mindiff = zdiff(getdate(date1, 'first'), getdate(date2, 'last'))
local years, months
if maxdiff.years == mindiff.years then
years = maxdiff.years
if maxdiff.months == mindiff.months then
months = maxdiff.months
else
months = { mindiff.months, maxdiff.months }
end
else
years = { mindiff.years, maxdiff.years }
end
return setmetatable({
date1 = date1,
date2 = date2,
partial = {
years = years,
months = months,
maxdiff = maxdiff,
mindiff = mindiff,
},
isnegative = isnegative,
iszero = iszero,
age = _diff_age,
duration = _diff_duration,
}, diffmt)
end
end
local y1, m1 = date1.year, date1.month
local y2, m2 = date2.year, date2.month
local years = y1 - y2
local months = m1 - m2
local d1 = date1.day + hms(date1)
local d2 = date2.day + hms(date2)
local days, time
if d1 >= d2 then
days = d1 - d2
else
months = months - 1
-- Get days in previous month (before the "to" date) given December has 31 days.
local dpm = m1 > 1 and days_in_month(y1, m1 - 1, date1.calendar) or 31
if d2 >= dpm then
days = d1 - hms(date2)
else
days = dpm - d2 + d1
end
end
if months < 0 then
years = years - 1
months = months + 12
end
days, time = math.modf(days)
local H, M, S = h_m_s(time)
return setmetatable({
date1 = date1,
date2 = date2,
partial = false, -- avoid index lookup
years = years,
months = months,
days = days,
hours = H,
minutes = M,
seconds = S,
isnegative = isnegative,
iszero = iszero,
age = _diff_age,
duration = _diff_duration,
}, diffmt)
end
return {
_current = current,
_Date = Date,
_days_in_month = days_in_month,
}
p4lffcwq8w4s1hro04tf52ddm3itw32
Module:If preview
828
237
32825
2024-09-09T19:58:02Z
en>MSGJ
0
requested enhancements by [[User:Awesome Aasim]]
32825
Scribunto
text/plain
local p = {}
local getArgs = require("Module:Arguments").getArgs
local yn = require("Module:Yesno")
local cfg = mw.loadData('Module:If preview/configuration')
--[[
main
This function returns either the first argument or second argument passed to
this module, depending on whether the page is being previewed.
]]
function p.main(frame)
local args = getArgs(frame)
if cfg.preview then
return args[1] or ''
else
return args[2] or ''
end
end
--[[
pmain
This function returns either the first argument or second argument passed to
this module's parent (i.e. template using this module), depending on whether it
is being previewed.
]]
function p.pmain(frame)
return p.main(frame:getParent())
end
local function warning_text(warning)
return mw.ustring.format(
cfg.warning_infrastructure,
cfg.templatestyles,
warning
)
end
function p._warning(args)
local warning = args[1] and args[1]:match('^%s*(.-)%s*$') or ''
if warning == '' then
return warning_text(cfg.missing_warning)
end
if not cfg.preview then return '' end
if yn(args['consolewarning']) then mw.addWarning(args[1] or cfg.missing_warning) end
return warning_text(warning)
end
--[[
warning
This function returns a "preview warning", which is the first argument marked
up with HTML and some supporting text, depending on whether the page is being previewed.
]]
-- function p.warning(frame)
-- mw.addWarning(frame.args[1] or cfg.missing_warning)
-- return p._warning(frame.args)
-- end
--[[
warning, but for pass-through templates like {{preview warning}}
]]
function p.pwarning(frame)
local args = getArgs(frame)
return p._warning(args)
end
--[[
Does both mw.addWarning and preview warning
]]
function p.warn(text)
if text == nil or text == "" then return "" end
mw.addWarning(text)
return p._warning({text})
end
--[[
Console warning
]]
function p.consoleWarning(frame)
local args = getArgs(frame)
mw.addWarning(args[1] or cfg.missing_warning)
return ''
end
return p
9xxiwh6yksz0t17svyd7nlq7rj3f5rk
32826
1052
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:If_preview]]
1051
Scribunto
text/plain
local p = {}
local getArgs = require("Module:Arguments").getArgs
local yn = require("Module:Yesno")
local cfg = mw.loadData('Module:If preview/configuration')
--[[
main
This function returns either the first argument or second argument passed to
this module, depending on whether the page is being previewed.
]]
function p.main(frame)
local args = getArgs(frame)
if cfg.preview then
return args[1] or ''
else
return args[2] or ''
end
end
--[[
pmain
This function returns either the first argument or second argument passed to
this module's parent (i.e. template using this module), depending on whether it
is being previewed.
]]
function p.pmain(frame)
return p.main(frame:getParent())
end
local function warning_text(warning)
return mw.ustring.format(
cfg.warning_infrastructure,
cfg.templatestyles,
warning
)
end
function p._warning(args)
local warning = args[1] and args[1]:match('^%s*(.-)%s*$') or ''
if warning == '' then
return warning_text(cfg.missing_warning)
end
if not cfg.preview then return '' end
if yn(args['consolewarning']) then mw.addWarning(args[1] or cfg.missing_warning) end
return warning_text(warning)
end
--[[
warning
This function returns a "preview warning", which is the first argument marked
up with HTML and some supporting text, depending on whether the page is being previewed.
]]
-- function p.warning(frame)
-- mw.addWarning(frame.args[1] or cfg.missing_warning)
-- return p._warning(frame.args)
-- end
--[[
warning, but for pass-through templates like {{preview warning}}
]]
function p.pwarning(frame)
local args = getArgs(frame)
return p._warning(args)
end
--[[
Does both mw.addWarning and preview warning
]]
function p.warn(text)
if text == nil or text == "" then return "" end
mw.addWarning(text)
return p._warning({text})
end
--[[
Console warning
]]
function p.consoleWarning(frame)
local args = getArgs(frame)
mw.addWarning(args[1] or cfg.missing_warning)
return ''
end
return p
9xxiwh6yksz0t17svyd7nlq7rj3f5rk
Module:If preview/configuration
828
238
32827
2021-05-05T18:56:00Z
en>Izno
0
Protected "[[Module:If preview/configuration]]": match parent ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32827
Scribunto
text/plain
--[[
We perform the actual check for whether this is a preview here since
preprocessing is relatively expensive.
]]
local frame = mw.getCurrentFrame()
local function is_preview()
local revision_id = frame:preprocess('{{REVISIONID}}')
-- {{REVISIONID}} is usually the empty string when previewed.
-- I don't know why we're checking for nil but hey, maybe someday things
-- would have broken
return revision_id == nil or revision_id == ''
end
local function templatestyles()
return frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:If preview/styles.css' }
}
end
return {
preview = is_preview(),
templatestyles = templatestyles(),
warning_infrastructure = '%s<div class="preview-warning"><strong>Preview warning:</strong> %s</div>',
missing_warning = 'The template has no warning text. Please add a warning.'
}
7ccf9c7e3yxw9p4ke6iw4ndcfniweno
32828
1055
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:If_preview/configuration]]
1053
Scribunto
text/plain
--[[
We perform the actual check for whether this is a preview here since
preprocessing is relatively expensive.
]]
local frame = mw.getCurrentFrame()
local function is_preview()
local revision_id = frame:preprocess('{{REVISIONID}}')
-- {{REVISIONID}} is usually the empty string when previewed.
-- I don't know why we're checking for nil but hey, maybe someday things
-- would have broken
return revision_id == nil or revision_id == ''
end
local function templatestyles()
return frame:extensionTag{
name = 'templatestyles', args = { src = 'Module:If preview/styles.css' }
}
end
return {
preview = is_preview(),
templatestyles = templatestyles(),
warning_infrastructure = '%s<div class="preview-warning"><strong>Preview warning:</strong> %s</div>',
missing_warning = 'The template has no warning text. Please add a warning.'
}
7ccf9c7e3yxw9p4ke6iw4ndcfniweno
Module:If preview/styles.css
828
239
32829
1056
2026-05-11T21:46:11Z
en>Izno
0
+
32829
sanitized-css
text/css
/* {{pp|small=yes}} */
.preview-warning {
font-style: italic;
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
color: var(--color-error, red);
}
/* The templatestyles causes an 'empty' span between hatnotes */
.preview-warning + span.mw-empty-elt + .preview-warning,
/* remove this selector when Parsoid is the only parser, see also [[phab:T200206]] */
.preview-warning + link + .preview-warning {
margin-top: -0.5em;
}
f1m5cy9ikp9xcry3obpmw1xl2aem71y
32830
1057
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:If_preview/styles.css]]
1056
sanitized-css
text/css
.preview-warning {
font-style: italic;
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
color: var(--color-error, red);
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.preview-warning + link + .preview-warning {
margin-top: -0.5em;
}
o5dbjg34jhzpirc43kqz3n4f79x8ute
Module:Person date
828
266
33260
2025-12-06T07:51:53Z
en>Zackmann08
0
no longer needed or supported
33260
Scribunto
text/plain
require("strict")
local p = {}
local TEMPLATES = {
birth_date = "Birth date",
birth_date_and_age = "Birth date and age",
birth_year = "Birth year",
birth_year_and_age = "Birth year and age",
death_date = "Death date",
death_date_text = "Death date text",
death_date_and_age = "Death date and age",
death_year = "Death year",
death_year_and_age = "Death year and age",
}
local invalid_date_category = ''
local tracking_category = ''
local Date = require('Module:Date')._Date
local getArgs = require('Module:Arguments').getArgs
if mw.title.getCurrentTitle():inNamespaces(0, 828, 829) then
-- Category only in namespaces: 0=article, 828=module & 829=module talk (last 2 needed for testcases)
tracking_category = '[[Category:Pages where birth or death is being automatically determined]]'
invalid_date_category = '[[Category:Pages with invalid birth or death dates]]'
end
local function check_for_invalid_date(str)
return mw.ustring.match(str, '^%?') or mw.ustring.match(str, '^%d%d%?') or mw.ustring.match(str, '^[Uu]nk')
end
local function expand_template(template, args)
return mw.getCurrentFrame():expandTemplate{title = template, args = args}
end
local function parse_date(str)
local date = Date(str)
if date then
return tostring(date.year), tostring(date.month), tostring(date.day)
end
-- TODO: Date has not been parsed. Need to work out what to do. For now, throw an error.
-- Example where this can occur: "birth_date = 22 December 1946" at [[Maurice Pasternak]].
-- There was a nonbreaking space after "22" whidh Date does not accept.
error('Module:Person_date parse_date invalid date: "' .. tostring(str) .. '"')
end
local function date_format(str)
if mw.ustring.match (str, '^%d+%s*%a+[%.]*%s*%d%d%d%d$') then
return 'df'
elseif mw.ustring.match(str, '^%a+[%.]*%s+%d+,%s*%d%d%d%d$') then
return 'mf'
else
return 'ERROR'
end
end
local function is_valid_month (str)
str = string.upper(mw.ustring.sub(str,1,1))..string.lower(mw.ustring.sub(str,2))
local months = {'Jan','Jan.','January','Feb','Feb.','February','Mar','March','Apr','Apr.','April','May','Jun','Jun.','June','Jul','Jul.','July','Aug','Aug.','August','Sep','Sept','Sep.','Sept.','September','Oct','Oct.','October','Nov','Nov','November','Dec','Dec.','December'}
for index, value in ipairs(months) do
if value == str then
return true
end
end
return false
end
local function is_month_year_only(str)
local month = mw.ustring.match(str, '^(%a+)[%.]*%s+%d%d%d%d$')
if month == nil then
return false
else
return is_valid_month(month)
end
end
local function is_valid_date(str)
local month = mw.ustring.match (str, '^%d+%s*(%a+)[%.]*%s*%d%d%d%d$') or mw.ustring.match(str, '^(%a+)[%.]*%s+%d+,%s*%d%d%d%d$')
if month == nil then
return false
else
return is_valid_month(month)
end
end
local function is_year_only(str)
return mw.ustring.match(str, '^%d%d%d%d$')
end
local function already_has_template(str)
str = mw.ustring.gsub(str, '&[Nn][Bb][Ss][Pp];', ' ')
return mw.ustring.match(str, '<span') or mw.ustring.match(str, '<time') or mw.ustring.match(str,'%(aged%s*%d+') or mw.ustring.match(str,'%(age%s*%d+')
end
local function sanatize_date(str)
-- Sanatize leading & trailing whitespace (this caused an issue before it was implemented)
str = mw.ustring.gsub(str,'^%s*','')
str = mw.ustring.gsub(str,'%s*$','')
-- Sanatize ordinals
str = mw.ustring.gsub(str, '(%d+)st([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)rd([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)th([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)nd([,%s])', '%1%2')
return str
end
local function parse_birth(args)
local birth_date = args['birth_date'] or ''
local death_date = args['death_date'] or ''
local disap_date = args['disappeared_date'] or ''
local original = birth_date
birth_date = sanatize_date(birth_date)
death_date = sanatize_date(death_date)
disap_date = sanatize_date(disap_date)
-- Check for bad inputs. This used to be covered by a switch statement in infoboxes
if check_for_invalid_date(birth_date) then
return original..invalid_date_category
end
if already_has_template(birth_date) then
return original
end
if is_valid_date(birth_date) then
local location = mw.ustring.find(birth_date, '%d%d%d%d')
local extra = mw.ustring.sub(birth_date, location+4) .. tracking_category
local date = mw.ustring.sub(birth_date, 1,location+3)
local year, month, day = parse_date(date)
local format = date_format(date)
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_date_and_age, {year, month, day, [format] = 'yes'}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) or is_month_year_only(death_date) then
return expand_template(TEMPLATES.birth_date, {year, month, day, [format] = 'yes'}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
if is_month_year_only(birth_date) then
local year = Date('1 '..birth_date):text('%Y')
local month = Date('1 '..birth_date):text('%-m')
local location = mw.ustring.find(birth_date, '%d%d%d%d')
local date = mw.ustring.sub(birth_date, 1,location+3)
local extra = mw.ustring.sub(birth_date, location+4) .. tracking_category
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_year_and_age, {year, month}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) or is_month_year_only(death_date) then
return expand_template(TEMPLATES.birth_year, {date}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
if is_year_only(birth_date) then
local date = mw.ustring.sub(birth_date, 1, 5)
local extra = mw.ustring.sub(birth_date, 5) .. tracking_category
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_year_and_age, {date}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) then
return expand_template(TEMPLATES.birth_year, {date}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
return original
end
local function parse_death(args)
local birth_date = args['birth_date'] or ''
local death_date = args['death_date'] or ''
local original = death_date
birth_date = sanatize_date(birth_date)
death_date = sanatize_date(death_date)
-- Check for bad inputs. This used to be covered by a switch statement in infoboxes
if check_for_invalid_date(death_date) then
return original..invalid_date_category
end
if already_has_template(death_date) then
return original
end
if is_valid_date(death_date) or is_month_year_only(death_date) then
local location = mw.ustring.find(death_date, '%d%d%d%d')
local date = mw.ustring.sub(death_date, 1,location+3)
local extra = mw.ustring.sub(death_date, location+4) .. tracking_category
local format = date_format(date)
if birth_date == '' then
if is_month_year_only(death_date) then
return expand_template(TEMPLATES.death_date_text, {date}) .. extra
end
local year, month, day = parse_date(date)
return expand_template(TEMPLATES.death_date, {year, month, day, [format] = 'yes'}) .. extra
else
if is_year_only(birth_date) then
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
if is_month_year_only(death_date) then
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
return expand_template(TEMPLATES.death_date_and_age, {date, bd, [format] = 'yes'}) .. extra
elseif is_valid_date(birth_date) or is_month_year_only(birth_date) then
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
if (is_month_year_only(death_date)) then
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
return expand_template(TEMPLATES.death_date_and_age, {date, bd, [format] = 'yes'}) .. extra
end
end
end
if is_year_only(death_date) then
if birth_date == '' then
return expand_template(TEMPLATES.death_year, {mw.ustring.sub(death_date, 1, 5)}) .. mw.ustring.sub(death_date, 5) .. tracking_category
else
if is_year_only(birth_date) then
return expand_template(TEMPLATES.death_year_and_age, {mw.ustring.sub(death_date, 1, 5), mw.ustring.sub(birth_date, 1, 5)}) .. mw.ustring.sub(death_date, 5) .. tracking_category
else
if is_valid_date(birth_date) then
local location = mw.ustring.find(death_date, '%d%d%d%d')
local date = mw.ustring.sub(death_date, 1,location+3)
local extra = mw.ustring.sub(death_date, location+4) .. tracking_category
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
end
end
end
return original
end
function p.birth(frame)
return parse_birth(getArgs(frame, {parentFirst = true}))
end
function p.death(frame)
return parse_death(getArgs(frame, {parentFirst = true}))
end
return p
qm4tcdz8g5vkfc018ay0tu8zlfditks
33261
1136
2026-11-11T21:49:26Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Person_date]]
1134
Scribunto
text/plain
require("strict")
local p = {}
local TEMPLATES = {
birth_date = "Birth date",
birth_date_and_age = "Birth date and age",
birth_year = "Birth year",
birth_year_and_age = "Birth year and age",
death_date = "Death date",
death_date_text = "Death date text",
death_date_and_age = "Death date and age",
death_year = "Death year",
death_year_and_age = "Death year and age",
}
local invalid_date_category = ''
local tracking_category = ''
local Date = require('Module:Date')._Date
local getArgs = require('Module:Arguments').getArgs
if mw.title.getCurrentTitle():inNamespaces(0, 828, 829) then
-- Category only in namespaces: 0=article, 828=module & 829=module talk (last 2 needed for testcases)
tracking_category = '[[Panni:Pages where birth or death is being automatically determined]]'
invalid_date_category = '[[Panni:Pages with invalid birth or death dates]]'
end
local function check_for_invalid_date(str)
return mw.ustring.match(str, '^%?') or mw.ustring.match(str, '^%d%d%?') or mw.ustring.match(str, '^[Uu]nk')
end
local function expand_template(template, args)
return mw.getCurrentFrame():expandTemplate{title = template, args = args}
end
local function parse_date(str)
local date = Date(str)
if date then
return tostring(date.year), tostring(date.month), tostring(date.day)
end
-- TODO: Date has not been parsed. Need to work out what to do. For now, throw an error.
-- Example where this can occur: "birth_date = 22 December 1946" at [[Maurice Pasternak]].
-- There was a nonbreaking space after "22" whidh Date does not accept.
error('Module:Person_date parse_date invalid date: "' .. tostring(str) .. '"')
end
local function date_format(str)
if mw.ustring.match (str, '^%d+%s*%a+[%.]*%s*%d%d%d%d$') then
return 'df'
elseif mw.ustring.match(str, '^%a+[%.]*%s+%d+,%s*%d%d%d%d$') then
return 'mf'
else
return 'ERROR'
end
end
local function is_valid_month (str)
str = string.upper(mw.ustring.sub(str,1,1))..string.lower(mw.ustring.sub(str,2))
local months = {'Jan','Jan.','January','Feb','Feb.','February','Mar','March','Apr','Apr.','April','May','Jun','Jun.','June','Jul','Jul.','July','Aug','Aug.','August','Sep','Sept','Sep.','Sept.','September','Oct','Oct.','October','Nov','Nov','November','Dec','Dec.','December'}
for index, value in ipairs(months) do
if value == str then
return true
end
end
return false
end
local function is_month_year_only(str)
local month = mw.ustring.match(str, '^(%a+)[%.]*%s+%d%d%d%d$')
if month == nil then
return false
else
return is_valid_month(month)
end
end
local function is_valid_date(str)
local month = mw.ustring.match (str, '^%d+%s*(%a+)[%.]*%s*%d%d%d%d$') or mw.ustring.match(str, '^(%a+)[%.]*%s+%d+,%s*%d%d%d%d$')
if month == nil then
return false
else
return is_valid_month(month)
end
end
local function is_year_only(str)
return mw.ustring.match(str, '^%d%d%d%d$')
end
local function already_has_template(str)
str = mw.ustring.gsub(str, '&[Nn][Bb][Ss][Pp];', ' ')
return mw.ustring.match(str, '<span') or mw.ustring.match(str, '<time') or mw.ustring.match(str,'%(aged%s*%d+') or mw.ustring.match(str,'%(age%s*%d+')
end
local function sanatize_date(str)
-- Sanatize leading & trailing whitespace (this caused an issue before it was implemented)
str = mw.ustring.gsub(str,'^%s*','')
str = mw.ustring.gsub(str,'%s*$','')
-- Sanatize ordinals
str = mw.ustring.gsub(str, '(%d+)st([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)rd([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)th([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)nd([,%s])', '%1%2')
return str
end
local function parse_birth(args)
local birth_date = args['birth_date'] or ''
local death_date = args['death_date'] or ''
local disap_date = args['disappeared_date'] or ''
local original = birth_date
birth_date = sanatize_date(birth_date)
death_date = sanatize_date(death_date)
disap_date = sanatize_date(disap_date)
-- Check for bad inputs. This used to be covered by a switch statement in infoboxes
if check_for_invalid_date(birth_date) then
return original..invalid_date_category
end
if already_has_template(birth_date) then
return original
end
if is_valid_date(birth_date) then
local location = mw.ustring.find(birth_date, '%d%d%d%d')
local extra = mw.ustring.sub(birth_date, location+4) .. tracking_category
local date = mw.ustring.sub(birth_date, 1,location+3)
local year, month, day = parse_date(date)
local format = date_format(date)
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_date_and_age, {year, month, day, [format] = 'yes'}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) or is_month_year_only(death_date) then
return expand_template(TEMPLATES.birth_date, {year, month, day, [format] = 'yes'}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
if is_month_year_only(birth_date) then
local year = Date('1 '..birth_date):text('%Y')
local month = Date('1 '..birth_date):text('%-m')
local location = mw.ustring.find(birth_date, '%d%d%d%d')
local date = mw.ustring.sub(birth_date, 1,location+3)
local extra = mw.ustring.sub(birth_date, location+4) .. tracking_category
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_year_and_age, {year, month}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) or is_month_year_only(death_date) then
return expand_template(TEMPLATES.birth_year, {date}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
if is_year_only(birth_date) then
local date = mw.ustring.sub(birth_date, 1, 5)
local extra = mw.ustring.sub(birth_date, 5) .. tracking_category
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_year_and_age, {date}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) then
return expand_template(TEMPLATES.birth_year, {date}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
return original
end
local function parse_death(args)
local birth_date = args['birth_date'] or ''
local death_date = args['death_date'] or ''
local original = death_date
birth_date = sanatize_date(birth_date)
death_date = sanatize_date(death_date)
-- Check for bad inputs. This used to be covered by a switch statement in infoboxes
if check_for_invalid_date(death_date) then
return original..invalid_date_category
end
if already_has_template(death_date) then
return original
end
if is_valid_date(death_date) or is_month_year_only(death_date) then
local location = mw.ustring.find(death_date, '%d%d%d%d')
local date = mw.ustring.sub(death_date, 1,location+3)
local extra = mw.ustring.sub(death_date, location+4) .. tracking_category
local format = date_format(date)
if birth_date == '' then
if is_month_year_only(death_date) then
return expand_template(TEMPLATES.death_date_text, {date}) .. extra
end
local year, month, day = parse_date(date)
return expand_template(TEMPLATES.death_date, {year, month, day, [format] = 'yes'}) .. extra
else
if is_year_only(birth_date) then
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
if is_month_year_only(death_date) then
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
return expand_template(TEMPLATES.death_date_and_age, {date, bd, [format] = 'yes'}) .. extra
elseif is_valid_date(birth_date) or is_month_year_only(birth_date) then
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
if (is_month_year_only(death_date)) then
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
return expand_template(TEMPLATES.death_date_and_age, {date, bd, [format] = 'yes'}) .. extra
end
end
end
if is_year_only(death_date) then
if birth_date == '' then
return expand_template(TEMPLATES.death_year, {mw.ustring.sub(death_date, 1, 5)}) .. mw.ustring.sub(death_date, 5) .. tracking_category
else
if is_year_only(birth_date) then
return expand_template(TEMPLATES.death_year_and_age, {mw.ustring.sub(death_date, 1, 5), mw.ustring.sub(birth_date, 1, 5)}) .. mw.ustring.sub(death_date, 5) .. tracking_category
else
if is_valid_date(birth_date) then
local location = mw.ustring.find(death_date, '%d%d%d%d')
local date = mw.ustring.sub(death_date, 1,location+3)
local extra = mw.ustring.sub(death_date, location+4) .. tracking_category
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
end
end
end
return original
end
function p.birth(frame)
return parse_birth(getArgs(frame, {parentFirst = true}))
end
function p.death(frame)
return parse_death(getArgs(frame, {parentFirst = true}))
end
return p
ta2v513t2r7yo167n14j551fmlel1ie
A
0
358
33607
8391
2026-11-12T07:29:53Z
RAPTOR7762
18
/* */
33607
wikitext
text/x-wiki
{{Infobox grapheme
| letter = A a
| script = [[Latin script]]
| type = [[Alphabet]]
| typedesc = ic
| language = [[Latin ]]language
| phonemes = {{flex list|width=2em|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}] [{{IPAlink|ɐ}}] | {{IPA|[eɪ]}} | {{IPA|[ɛɪ]}} | {{IPA|[æɪ]}} | {{IPA|[ɐɪ]}}}}
| unicode = U+0041, U+0061
| alphanumber = 1
| fam1 = '''<span style="font-size:x-large;">𓃾</span>'''
| fam2 = [[File:Proto-semiticA-01.svg|class=skin-invert-image|20px|Proto-Sinaitic 'alp]]
| fam3 = [[File:Protoalef.svg|class=skin-invert-image|20px|Proto-Caananite aleph]]
| fam4 = [[File:Phoenician_aleph.svg|class=skin-invert-image|20px|Phoenician aleph]]
| fam5 = [[Alpha|Α α]]
| fam6 = [[𐌀]][[File:Greek-uncial-1.jpg|class=skin-invert-image|20px|Greek classical uncial]]
| fam7 = [[File:Semitic-2.jpg|class=skin-invert-image|20px|Early Latin A]][[File:Latin-uncial-1.jpg|class=skin-invert-image|20px|Latin 300 AD uncial, version 1]]
| usageperiod = {{circa|700 BCE}}{{snd}}present
| children = {{flex list|[[Æ]]|[[Ä]]|[[Â]]|[[Ɑ]]|[[Ɒ]]|[[Ʌ]]|[[Ɐ]]|[[ª]]|[[Å]]|[[₳]]|[[@]]|[[Enclosed_Alphanumerics|<span>Ⓐ</span> <span>ⓐ</span> <span>⒜</span>]]|[[🅰]]}}
| sisters = {{flex list|[[𐌰]]|[[А]]|[[Ә]]|[[Ӑ]]|[[Aleph|<span>א</span> <span>ا</span> <span>ܐ</span>]]|[[ࠀ]]|[[𐎀]]|[[ℵ]]|[[አ]]|[[ء]]|[[Ա|Ա ա]]|[[અ]]|[[अ]]|[[অ]]|[[Mathematical Alphanumeric Symbols|𝑎]]}}
| associates = [[List of Latin-script digraphs#A|a(x)]], [[Ae (digraph)|ae]], [[Eau (trigraph)|eau]], [[Au (digraph)|au]]
| direction = Left-to-right
| image = Latin_letter_A.svg
| imageclass = skin-invert-image
}}
'''A''' - ita kalama Lamba modi [[1]] ga dallah haruffa VOWEL jam ita Lamba modi [[1]] ga dallah haruffa [[Yarenshe Turanci (English Language)|Turanci]] "Modern English Alphabet" Jam har incho ita ISO BASIC LATIN ALPHABET.<ref>https://www.britannica.com/topic/Latin-alphabet</ref>
== Ɗiwwa ==
kpsxb4s9iwkylbb6i9ksghrbfk8hu73
Jiha Adamawa
0
373
33531
8405
2026-11-11T22:12:05Z
RAPTOR7762
18
RAPTOR7762 moved page [[Adamawa]] to [[Jiha Adamawa]]
8405
wikitext
text/x-wiki
{{Databox|item=Q337514}}
[[Fayil:The Capture of Yola Benue (MeisterDrucke-309717).png|thumb]]
'''Adamawa''' Manshi Gongola, goru ga lardi Fulani ga woli la a pata dar lardi [[Nijeriya]], ba ka gada jihar [[Gombe]]. kafun ka lomi Taraba jihar. Adamawa a dalla Gombe ga Taraba.
== Ahre Adamawa ==
{| class="wikitable"
! LGA !! Languages
|-
| Demsa ||[[Bacama language|fulfulde]]; Bali; Bata; Bille; [[Mbula-Bwazza language|Mbula-Bwazza]]; Waka
|-
| Fufore || [[fulfulde]];
|-
| Ganye ||[[Fulfulde]], Gaa; Koma; Mumuye; Peere; [[Daka language|Chamba Daka]]
|-
| Girei || fulfulde
|-
| Gombi || fulfulde ; [[Bura language|Bura-Pabir]]; [[Ga'anda language|Ga'anda]]; Hwana; [[Lala-Roba language|Lala-Roba]]; Mboi; [[Ngwaba language|Ngwaba]]; [[Huba language|Nya Huba]]
|-
| Guduniya ||[[Ngwaba language|Ngwaba]]
|-
| Guyuk || Bacama; Bena; Dera; [[Ga'anda language|Ga'anda]]; [[Longuda people|Longuda]]; Voro
|-
| Hong || Boga; [[Nggwahyi language|Nggwahyi]]; Ngwaba; Nya Huba; Mafa, Kamwe
|-
| Jada || Fulfulde, Chamba ,Igbo
|-
| Lamurde || [[Fulfulde]], Kwa; [[Bambuka language|Kyak]]; Bacama; [[Dadiya language|Dadiya]]; [[Dikaka language|Dikaka]]; Dza; Jiba; Tso
|-
| Madagali || Fulfulde; Marghi ;Mafa
|-
| Maiha || [[Fulfulde]],Igbo
|-
| Mayo Belwa || [[Fulfulde]],Igbo
|-
| Michika || Kamwe, [[Gvoko language|Gvoko]]; Hide; Hya; [[Kamwe language|Kamwe]]; [[Lamang language|Lamang]]; [[Margi language|Marghi Central]]; Mafa; [[Margi South language|Marghi South]]; Putai; [[Vemgo-Mabas language|Vemgo-Mabas]]; Waja
|-
| Mubi || [[Fulfulde]], Kamwe Daba; [[Ga'anda language|Ga'anda]]; Mafa; Gude; [[Kirya-Konzəl language|Kirya-Konzel]]; Marghi Central; Marghi South; [[Huba language|Nya Huba]]
|-
| Mubi North || Fali, Fulfulde ; Kamwe Hya; [[Zizilivakan language|Zizilivakan]]
|-
| Mubi South || Gude,Igbo
|-
| Numan || Bachama; Bali; [[Jen language|Dza]]; [[Kpasam language|Kpasham]]; Kwa; [[Mbula-Bwazza language|Mbula-Bwazza]]; Mumuye; Waka; Kaan
|-
| Shelleng || Kaan; [[Hwana language|Hwana]]; Mbula-Bwazza,Igbo
|-
| Song || Bata; Bena; Ga'anda; Gudu; Hwana; Kaan; [[Kofa language|Kofa]]; Mboi; Mbula-Bwazza; Voro,Igbo
|-
| Toungo || Jibu,Igbo
|-
| Yola || [[Fulfulde]], Igbo
|-
| Yola North || [[fulfulde]],Igbo
|-
| Yola South || [[Fulfulde]], Vere,
|}
== Mulki ==
Fulbe Emirates Adamawa
== Addini ==
Musulum ga kirista
==Mikkya in asse ga gah guru Adamawa==
<!---♦♦♦ Only add a person to this list if they already have their own article on the English Wikipedia ♦♦♦--->
<!---♦♦♦ Please keep the list in alphabetical order by LAST NAME ♦♦♦--->* [[Atiku Abubakar]]<ref>{{Cite web|last=Abiola|first=Rahaman|date=2020-03-02|title=He remains a man of estimable character and virtue - Atiku hails Adeboye at 78|url=https://www.legit.ng/1307461-pastor-enoch-adeboye-78-atiku-abubakar-congratulates-rccg-go.html|access-date=2021-06-30|website=Legit.ng - Nigeria news.|language=en}}</ref>
* [[Iya Abubakar]]<ref>{{Cite web|last=Omotayo|first=Joseph|date=2019-10-08|title=Meet Nigerian mathematical genius, Iya Abubakar, who became a professor at 28|url=https://www.legit.ng/1264239-prof-iya-abubakar-mathematical-genius-2nd-indigenous-vc-abu.html|access-date=2021-06-30|website=Legit.ng - Nigeria news.|language=en}}</ref>
* [[Jibril Aminu]]<ref>{{Cite web|last=Idachaba|first=Eleojo|date=2020-05-01|title=Jubril Aminu, Oladipo Diya: Where are they now?|url=https://www.blueprint.ng/jubril-aminu-oladipo-diya-where-are-they-now/|access-date=2021-06-30|website=Blueprint Newspapers Limited|language=en-US}}</ref>
* [[Alex Badeh]]<ref>{{Cite web|date=2018-12-19|title=Alex Badeh 1957 to 2018|url=https://www.vanguardngr.com/2018/12/alexander-badeh-1957-to-2018/|access-date=2021-06-30|website=Vanguard News|language=en-US}}</ref>
* [[Mohammed Adamu Bello|Mohammed Bello]]
* [[Aisha Buhari]]<ref>{{Cite news|title=Aisha Buhari personal life story as she turn golden age today|work=BBC News Pidgin|url=https://www.bbc.com/pidgin/world-56094523|access-date=2021-06-30}}</ref>
* [[Done P. Dabale]]
* Sen. [[Aisha Dahiru Ahmad|Aisha Dahiru Binan]]<nowiki/>i<ref>https://punchng.com/just-in-appeal-court-affirms-fintiri-as-adamawa-gov-dismisses-binanis-appeal/</ref>
* [[Ahmadu Umaru Fintiri]]<ref>{{Cite web|date=2019-04-01|title=Fintiri To Govern Adamawa With Few Political Appointees|url=http://saharareporters.com/2019/04/01/fintiri-govern-adamawa-few-political-appointees|access-date=2021-06-30|website=Sahara Reporters}}</ref>
* [[Binta Masi Garba]]<ref>{{Cite web|title=Newly Elected Senators [FULL LIST]|url=https://independent.ng/newly-elected-senators-full-list/|access-date=2021-06-30|website=Independent Newspaper Nigeria|date=March 2019 |language=en-GB}}</ref>
* [[Boni Haruna]]<ref>{{Cite web|date=2021-06-14|title=Assembly moves to make Adamawa pay for WASSCE, NECO registration|url=https://punchng.com/assembly-moves-to-make-adamawa-pay-for-wassce-neco-registration/|access-date=2021-06-30|website=Punch Newspapers|language=en-US}}</ref>
* Aliyu Saidu Jauro
* [[Bindo Jibrilla]]
* [[Muhammadu Gambo Jimeta]]<ref>{{Cite web|date=2021-01-22|title=Buhari Mourns Former IG, Gambo Jimeta|url=https://www.thisdaylive.com/index.php/2021/01/22/buhari-mourns-former-ig-gambo-jimeta/|access-date=2021-06-30|website=THISDAYLIVE|language=en-US}}</ref>
* [[Aliyu Kama]]
* [[Babachir David Lawal]]<ref>{{Cite web|date=2015-08-28|title=Outrage grows across Nigeria as Buhari's lopsided appointments continue|work=Premium Times Nigeria|url=https://www.premiumtimesng.com/news/headlines/189117-outrage-grows-across-nigeria-as-buharis-lopsided-appointments-continue.html|access-date=2021-06-30|language=en-GB}}</ref>
* [[Tahir Mamman]]<ref>{{Cite web|date=2021-01-10|title=2023: APC Super Active, Will Send Out PDP From Adamawa - Prof Mamman|url=https://leadership.ng/2023-apc-super-active-will-send-out-pdp-from-adamawa-prof-mamman/|access-date=2021-06-30|website=Leadership News - Nigeria News, Breaking News, Politics and more|language=en-GB|archive-date=2021-03-03|archive-url=https://web.archive.org/web/20210303054353/https://leadership.ng/2023-apc-super-active-will-send-out-pdp-from-adamawa-prof-mamman/|url-status=dead}}</ref><ref>{{Cite web|date=2020-06-25|title=Meet members of the APC National Caretaker Committee|url=https://www.premiumtimesng.com/news/top-news/399621-meet-members-of-the-apc-national-caretaker-committee.html|access-date=2021-06-30|language=en-GB}}</ref>
* [[Mohammed Buba Marwa|Buba Marwa]]<ref>{{Cite web|last=Ukwu|first=Jerrywright|date=2021-01-16|title=Breaking: President Buhari appoints Buba Marwa as CEO of NDLEA|url=https://www.legit.ng/1398326-breaking-president-buhari-appoints-buba-marwa-dg-ndlea.html|access-date=2021-06-30|website=Legit.ng - Nigeria news.|language=en}}</ref><ref>{{Cite web|date=2021-01-18|title=NDLEA: Marwa resumes as chairman, silent on 5,000 shortlisted job seekers|url=https://www.premiumtimesng.com/news/more-news/437217-ndlea-marwa-resumes-as-chairman-silent-on-5000-shortlisted-job-seekers.html|access-date=2021-06-30|language=en-GB}}</ref><ref>{{Cite web|date=2021-01-24|title=Lagos Ex-MILAD, Buba Marwa Back to Relevance|url=https://www.thisdaylive.com/index.php/2021/01/24/lagos-ex-milad-buba-marwa-back-to-relevance/|access-date=2021-06-30|website=THISDAYLIVE|language=en-US}}</ref>
* [[Abubakar Saleh Michika]]<ref>{{Cite web|date=2018-03-11|title=UPDATED: Ex-Adamawa Governor Abubakar Michika is dead|work=Premium Times Nigeria|url=https://www.premiumtimesng.com/news/headlines/261392-just-ex-adamawa-governor-abubakar-michika-dead.html|access-date=2021-06-30|language=en-GB}}</ref><ref>{{Cite web|date=2012-02-03|title=Adamawa's past men of power|url=https://www.vanguardngr.com/2012/02/adamawas-past-men-of-power/|access-date=2021-06-30|website=Vanguard News|language=en-US}}</ref>
* [[Boss Mustapha]]<ref>{{Cite book|url=https://books.google.com/books?id=zmIuAQAAIAAJ&q=Boss+Mustapha+Adamawa+-wikipedia|title=Newswatch|date=2005|publisher=Newswatch Communications Limited|language=en}}</ref>
* [[Murtala Nyako]]<ref>{{Cite web|date=2014-07-15|title=Governor Murtala Nyako Of Adamawa State Impeached|url=http://saharareporters.com/2014/07/15/governor-murtala-nyako-adamawa-state-impeached|access-date=2021-06-30|website=Sahara Reporters}}</ref>
* [[Bamanga Tukur]]<ref>{{Cite web|date=2021-04-15|title=Mahmud Tukur: Homage To A Distinguished Accomplisher, By Muhammad Musa-Gombe|url=https://www.premiumtimesng.com/opinion/455166-mahmud-tukur-homage-to-a-distinguished-accomplisher-by-muhammad-musa-gombe.html|access-date=2021-06-30|language=en-GB}}</ref><ref>{{Cite web|date=2021-02-24|title=Tukur lauds Fintiri's performance in office|url=https://guardian.ng/politics/tukur-lauds-fintiris-performance-in-office/|access-date=2021-06-30|website=The Guardian Nigeria News - Nigeria and World News|language=en-US}}</ref>
* [[Mahmud Tukur]]
* [[Mohammed Sanusi Barkindo]]
* [[Nuhu Ribadu]]
* Dr Bala Takaya
* [[Ibrahim Lamorde]]
* [[Ahmed Joda]]
* Abubakar Isa (Buba Shafani)
<!---♦♦♦ Only add a person to this list if they already have their own article on the English Wikipedia ♦♦♦--->
<!---♦♦♦ Please keep the list in alphabetical order by LAST NAME ♦♦♦--->
== Ɗiwwa ==
4qf3skgtgagz717p38gfeqp3nde0hzu
Adamu Talba
0
376
33482
13167
2026-11-11T22:07:18Z
RAPTOR7762
18
/* */
33482
wikitext
text/x-wiki
{{Infobox officeholder
| name = Adamu Garba Talba
| image = Abdalla Uba Adamu, November 2023.jpg
| office1 = Senator of the Federal Republic of Nigeria from [[Jiha Yobe|Yobe State]] South District
| term_start1 = 29 May 2007
| term_end1 = May 2011
| predecessor1 = [[Mamman Bello Ali]]
| successor1 = [[Alkali Abdulkadir Jajere]]
| birth_date = {{birth date and age|1952|8|15|df=y}}
| birth_place = [[Jiha Yobe]], [[Nijeriya]]
| death_date = {{death date|2025|7|14}}
| party = [[Peoples Democratic Party (Nigeria)|Peoples Democratic Party]]
}}
'''Adamu Garba Talba''', (layannin futi 15 ga terren in an 8, ga sunin in an 1952. Mutu futi 14 ga terren yuli 2025)
Manshi senator ke an siyasa ji ga Nigeria, ishin feten ko fai aushi dar, feten ko ga yare kare-kare la a undu su Birkaye. Mallan tumbani ga tikau. Tikau la ita aga lardi Nengere LGA, Yobe state.<ref>Talba, A. G. (1952). ''Rayuwa da Siyasa a Najeriya: Tarihin Sanata Adamu Garba Talba''. Yobe Heritage Press.</ref> Ishin aga danee manshi MOI un tikau. La siyajini, an yele MOI, ALHAJI ABUBAKAR TALBA SHUWA, haryanxu ishin aga anin yele MOI un asse gaga Bani menee' un tikau. Ishin mabu sanata an wakilta YOBE ko fanni gudi, futii 29/05/2007. GA ull- ulli jam'iya PDP.<ref>https://dailypost.ng/2022/07/06/yobe-apc-loses-bigwig-senator-talba-to-pdp/</ref>
==Karatu==
TALBA ishin iyyi karatu Diploma ni gako fanni kule ga Lamar shugabanci, kutene ishin Rai ga ruta gomnati ga yobe, dan-dutu mena Bo chiarman ga Nengere LGA. Sau balau ga yobe state. U'nannin matsayi ankule ga Lamar gudanar ga fanni kule ga lapiya gaga Nigeria. Dan dutu mena bu darecta un NNDC, Kaduna. Har zuwa insu Dan dutu mena bu komishinan lapiya gaga YOBE.<ref>https://von.gov.ng/ex-senator-adamu-talba-defects-to-pdp/{{Dead link|date=June 2025 |bot=InternetArchiveBot |fix-attempted=yes }}</ref>
== Woona ==
# Bati Fatsuma Talba. Shiyaman Naageeri
# Sanata Naageeri fataskuma
# Fune fikka
== Ɗiwwa ==
4fgbvypza4dghqkngvyfa6r6acbjjml
B
0
440
33628
15117
2026-11-12T07:47:09Z
RAPTOR7762
18
/* */
33628
wikitext
text/x-wiki
{{Infobox grapheme
|name=B
|letter=B b
|variations=
|script=[[Latin script]]<br>[[English alphabet]]<br>[[ISO basic Latin alphabet]]
|type=[[Alphabet]]
|typedesc=ic
|language=[[Latin ]]language
|phonemes={{flex list|[{{IPAlink|b}}]|[{{IPAlink|p}}]|{{IPAblink|β}}|[{{IPAlink|ɓ}}]|[{{IPAlink|ʙ}}]}}([[#Other languages|Adapted variations]])
|unicode=U+0042, U+0062
|alphanumber=2
|number=2
|fam1=<hiero>O1</hiero>
|fam2=[[Image:Proto-semiticB-01.svg|class=skin-invert-image|20px|Bet]]
|fam3=[[File:Proto-Canaanite - bet.svg|class=skin-invert-image|20px]]
|fam4=[[File:Phoenician beth.svg|class=skin-invert-image|20px|Bet]]
|fam5=[[File:Greek Beta 16.svg|class=skin-invert-image|20px]]
|fam6=[[Beta|Β β]]
|fam7=[[𐌁]]
|fam8=[[File:RomanB-01.png|class=skin-invert-image|12px|B]]
|fam9=[[File:UncialB-01.png|class=skin-invert-image|12px|B]] [[File:Half-uncial b.png|class=skin-invert-image|10px|b]]
|usageperiod=unknown to present
|children={{flex list|[[♭]]|[[␢]]|[[฿]]|[[Enclosed_Alphanumerics|<span>Ⓑ</span> <span>ⓑ</span> <span>⒝</span>]]|[[🅱]]}}
|sisters={{flex list|[[Б]]|[[В]]|[[wikt:Բ|Բ]]|[[wikt:բ|բ]]|[[Bet (letter)|(<span>בּ</span> <span>ב</span> <span>ب</span> <span>ܒ</span>)]]}}
|equivalents=
|associates=[[Voiced bilabial affricate|bv]]<br>[[List of Latin-script digraphs#B|bh<br>bp<br>bm]]<br>[[Voiced labiodental affricate|bf]]
|direction=Left-to-right
|image=File:Latin_letter_B.svg
|imageclass=skin-invert-image
}}
{{Latin letter info|b}}
[[Fayil:Latin letter B.svg|thumb]]
'''B''' ko '''b'''<ref>Oxford English Dictionary, ''2nd ed.'' |location=Oxford |publisher=[[Oxford University Press]]|date=1989</ref><ref>Merriam-Webster's 3rd New International Dictionary of the English Language, Unabridged |date=1993</ref> itan dallah kalama ki ani bolo [[2]] gadallah Kalmomi, daga A kafa ita B. B itan dallah Kalmomi I bu ga Boo bam bam inda Gontu ga Turanci gake [[Hausa]] ga [[Bolewa]] gake masse yare I andi.
== Ɗiwwa ==
qbhp33vp1aoqzwokm2d3ka5zkbv68ud
BBC Hausa
0
441
33595
15493
2026-11-11T22:54:27Z
RAPTOR7762
18
/* */
33595
wikitext
text/x-wiki
{{Infobox broadcasting network
| name = BBC Hausa
| logo = BBC Hausa logo.jpg
| country = [[United Kingdom]]
| network_type = [[Radio network]] and [[website]]
| available = International
| owner = [[BBC]]
| key_people =
| language = [[Hausa language|Hausa]]
| launch_date = 13 March 1957
| website = {{URL|https://www.bbc.com/hausa/}}
| webcast = {{URL|https://www.bbc.com/hausa/bbc_hausa_radio/liveradio}}
}}
'''[[Bichi|BBC]] Hausa''' inke Be'i Yada labari Gabo yare [[Harshe Afino|Hausa]] mallaka Tasha bari BBC gake inbo Turanci wato (British broadcasting Corporation (BBC) World Service Inda itan ishe shiritto Gabo lisi Hausa musamman are Labari ishafu Oli [[Nijeriya|Najeriya]], [[Ghana]], [[Nijeriya|Nijer]], gake masse Oli i Andi Inda maten Zoni ga Africa maten kumche Bo Yare Hausa.
Matan Ruta ga Lisi Guda kò-kunu ga kunu [[33]], inda Guda badi [[5]] ko ga'anki inke Bo é lepa Africa maten mbatti Labarissu Gabo Hausa konki modi ga Tasha isiri In BBC Hausa Inda ita Goru London wato broadcasting Hausa gake tasha é An ga Oli Najeriya Ga [[Abubakar Tafawa Balewa|ABUJA]] gake shafitto Inda an yabar gizo Inda shakka an wallifice ga Abuja Nigeria.
==Ɗiwwa==
781q5vlqzu33ju3lhu2fmjujn9wlmj9
Donald Trump
0
505
33311
15138
2026-11-11T21:52:55Z
RAPTOR7762
18
/* */
33311
wikitext
text/x-wiki
{{stack begin}}<!-- DO NOT REMOVE. Required for correct vertical alignment of image at "Early life and education" in some user configurations. -->
{{infobox officeholder
| image = Official Presidential Portrait of President Donald J. Trump (2025).jpg
| caption = [[Official portraits of Donald Trump#2025 presidential portrait|Official portrait, 2025]]<!-- DO NOT CHANGE caption without prior consensus; see [[Talk:Donald Trump/Archive 196#Infobox image caption]]. -->
| alt = Head-and-shoulders shot of Trump with a serious facial expression, his right eye partly closed. He is wearing a dark blue suit, a pale blue dress shirt, a red necktie, and an American flag lapel pin. Parts of the image are slightly out of focus. The background is black.
| order = 45th & 47th<!-- DO NOT ADD A LINK. Please discuss any proposal on the talk page first. Most recent discussion at [[Talk:Donald Trump/Archive 65#Link-ifying "45th" in the Infobox?]] had a weak consensus to keep the status-quo (no link). -->
| office = President of the United States
| vice_president = [[JD Vance]]
| term_start = January 20, 2025
| predecessor = [[Joe Biden]]
| vice_president1 = [[Mike Pence]]
| term_start1 = January 20, 2017
| term_end1 = January 20, 2021
| predecessor1 = [[Barack Obama]]
| successor1 = Joe Biden
| birth_name = Donald John Trump
| birth_date = {{birth date and age|1946|6|14}}
| birth_place = [[Queens]], New York City, U.S.<!-- DO NOT CHANGE (or add to) this location without prior consensus; see [[Talk:Donald Trump#C2|consensus 2]]. -->
| party = [[Republican Party (United States)|Republican]] (1969–1978, 1987–1999, 2009–2011,<br>2012–present)
| other_party = {{unbulleted list
| [[Reform Party of the United States of America|Reform]] (1999–2001)
| [[Democratic Party (United States)|Democratic]] (2001–2009)
| [[Independent politician|Independent]] (2011–2012)
}}
<!-- DO NOT PIPE any of the following three links, per [[MOS:NOPIPE]]. -->
| spouse = {{unbulleted list|
{{marriage|[[Ivana Zelníčková]]|April 9, 1977|December 11, 1990|end=divorced}}
| {{marriage|[[Marla Maples]]|December 20, 1993|June 8, 1999|end=divorced}}
| {{marriage|[[Melania Knauss]]|January 22, 2005}}
}}
| children = {{hlist
| [[Donald Jr.]]
| [[Ivanka Trump|Ivanka]]
| [[Eric Trump|Eric]]
| [[Tiffany Trump|Tiffany]]
| [[Barron Trump|Barron]]
}}
| parents = {{unbulleted list
| [[Fred Trump]]
| [[Mary Anne MacLeod]]
}}
| relatives = [[Trump family]]
| education = [[University of Pennsylvania]] ([[Bachelor of Science|BS]])
| occupation = {{hlist
| [[Political career of Donald Trump|Politician]]
| [[Business career of Donald Trump|businessman]]
| [[Media career of Donald Trump|media personality]]
}}
| signature = Trumpsignature2025.svg
| signature_alt = Donald J. Trump stylized autograph, in ink
| website = {{unbulleted list|
{{URL|whitehouse.gov|White House website}}
| {{URL|trumplibrary.gov|Presidential library}}
| {{URL|trumpwhitehouse.archives.gov|White House archives (2017–2021)}}
}}
| module = {{listen voice
| name = Trump <!-- [[MOS:SURNAME]] -->
| filename = President Trump on the WHO's Declaration of COVID-19 as a Global Pandemic.wav
| description = Trump on the [[World Health Organization]]'s declaration of [[COVID-19]] as a global pandemic
| recorded = March 11, 2020
}}
}}
'''Donald John Trump''' nasaran lardi [[Amurka]] an dara rankata ke an goma ke manshi shugaba ga lardi Amurka.
== Lardi ==
*Ke manshi[[Fayil:Donald Trump official portrait.jpg|thumb]]
* Shugaba ga Amurka
* Lardi Latin
== Hoto ==
<gallery>
File:Donald Trump official portrait (cropped).jpg
File:Bradley Byrne and Donald Trump - 2016.jpg
File:Kelly Loeffler and Donald Trump.jpg
File:Donald Trump official portrait (cropped 2).jpg
File:Donald Trump Signature.svg
File:Bill Clinton and Donald Trump at the U.S. Open in Flushing, New York (P85027).jpg
File:Donald Trump Pentagon 2017.jpg
</gallery><gallery>
File:Bill Clinton and Donald Trump at the U.S. Open in Flushing, New York (P85027).jpg|Bill Clinton tare da Donald Trump a shekaran 2000
File:Jayanthi Sirisena, Maithripala Sirisena, Donald Trump, and Melania Trump.jpg|Jayanthi Sirisena da Donald Trump
File:NASA astronaut Kate Rubins visits Donald and Ivanka Trump, April 2017.jpg|Kate Rubins ta ziyarci Donald Trump
File:Trump at King Khalid International Airport.jpg| Trump a filin jirgin kasan Sarki Khalid
</gallery>
==Ɗiwwa==
bounu1feiwd01hk9vludw8hvln2m4wd
33312
33311
2026-11-11T21:53:51Z
RAPTOR7762
18
/* Lardi */
33312
wikitext
text/x-wiki
{{stack begin}}<!-- DO NOT REMOVE. Required for correct vertical alignment of image at "Early life and education" in some user configurations. -->
{{infobox officeholder
| image = Official Presidential Portrait of President Donald J. Trump (2025).jpg
| caption = [[Official portraits of Donald Trump#2025 presidential portrait|Official portrait, 2025]]<!-- DO NOT CHANGE caption without prior consensus; see [[Talk:Donald Trump/Archive 196#Infobox image caption]]. -->
| alt = Head-and-shoulders shot of Trump with a serious facial expression, his right eye partly closed. He is wearing a dark blue suit, a pale blue dress shirt, a red necktie, and an American flag lapel pin. Parts of the image are slightly out of focus. The background is black.
| order = 45th & 47th<!-- DO NOT ADD A LINK. Please discuss any proposal on the talk page first. Most recent discussion at [[Talk:Donald Trump/Archive 65#Link-ifying "45th" in the Infobox?]] had a weak consensus to keep the status-quo (no link). -->
| office = President of the United States
| vice_president = [[JD Vance]]
| term_start = January 20, 2025
| predecessor = [[Joe Biden]]
| vice_president1 = [[Mike Pence]]
| term_start1 = January 20, 2017
| term_end1 = January 20, 2021
| predecessor1 = [[Barack Obama]]
| successor1 = Joe Biden
| birth_name = Donald John Trump
| birth_date = {{birth date and age|1946|6|14}}
| birth_place = [[Queens]], New York City, U.S.<!-- DO NOT CHANGE (or add to) this location without prior consensus; see [[Talk:Donald Trump#C2|consensus 2]]. -->
| party = [[Republican Party (United States)|Republican]] (1969–1978, 1987–1999, 2009–2011,<br>2012–present)
| other_party = {{unbulleted list
| [[Reform Party of the United States of America|Reform]] (1999–2001)
| [[Democratic Party (United States)|Democratic]] (2001–2009)
| [[Independent politician|Independent]] (2011–2012)
}}
<!-- DO NOT PIPE any of the following three links, per [[MOS:NOPIPE]]. -->
| spouse = {{unbulleted list|
{{marriage|[[Ivana Zelníčková]]|April 9, 1977|December 11, 1990|end=divorced}}
| {{marriage|[[Marla Maples]]|December 20, 1993|June 8, 1999|end=divorced}}
| {{marriage|[[Melania Knauss]]|January 22, 2005}}
}}
| children = {{hlist
| [[Donald Jr.]]
| [[Ivanka Trump|Ivanka]]
| [[Eric Trump|Eric]]
| [[Tiffany Trump|Tiffany]]
| [[Barron Trump|Barron]]
}}
| parents = {{unbulleted list
| [[Fred Trump]]
| [[Mary Anne MacLeod]]
}}
| relatives = [[Trump family]]
| education = [[University of Pennsylvania]] ([[Bachelor of Science|BS]])
| occupation = {{hlist
| [[Political career of Donald Trump|Politician]]
| [[Business career of Donald Trump|businessman]]
| [[Media career of Donald Trump|media personality]]
}}
| signature = Trumpsignature2025.svg
| signature_alt = Donald J. Trump stylized autograph, in ink
| website = {{unbulleted list|
{{URL|whitehouse.gov|White House website}}
| {{URL|trumplibrary.gov|Presidential library}}
| {{URL|trumpwhitehouse.archives.gov|White House archives (2017–2021)}}
}}
| module = {{listen voice
| name = Trump <!-- [[MOS:SURNAME]] -->
| filename = President Trump on the WHO's Declaration of COVID-19 as a Global Pandemic.wav
| description = Trump on the [[World Health Organization]]'s declaration of [[COVID-19]] as a global pandemic
| recorded = March 11, 2020
}}
}}
'''Donald John Trump''' nasaran lardi [[Amurka]] an dara rankata ke an goma ke manshi shugaba ga lardi Amurka.
== Lardi ==
<gallery>
Donald Trump official portrait.jpg|Ke manshi
</gallery>
* Shugaba ga Amurka
* Lardi Latin
== Hoto ==
<gallery>
File:Donald Trump official portrait (cropped).jpg
File:Bradley Byrne and Donald Trump - 2016.jpg
File:Kelly Loeffler and Donald Trump.jpg
File:Donald Trump official portrait (cropped 2).jpg
File:Donald Trump Signature.svg
File:Bill Clinton and Donald Trump at the U.S. Open in Flushing, New York (P85027).jpg
File:Donald Trump Pentagon 2017.jpg
</gallery><gallery>
File:Bill Clinton and Donald Trump at the U.S. Open in Flushing, New York (P85027).jpg|Bill Clinton tare da Donald Trump a shekaran 2000
File:Jayanthi Sirisena, Maithripala Sirisena, Donald Trump, and Melania Trump.jpg|Jayanthi Sirisena da Donald Trump
File:NASA astronaut Kate Rubins visits Donald and Ivanka Trump, April 2017.jpg|Kate Rubins ta ziyarci Donald Trump
File:Trump at King Khalid International Airport.jpg| Trump a filin jirgin kasan Sarki Khalid
</gallery>
==Ɗiwwa==
csfhx58kx6v49pf1mokpar7pieecpsl
Harshe Bole
0
578
33111
13794
2026-11-11T21:27:14Z
RAPTOR7762
18
/* */
33111
wikitext
text/x-wiki
{{Infobox language
| name = Bole
| nativename = bòo pìkkà
| states = [[Nijeriya]]
| region = [[Jiha Bauchi]], [[Jiha Gombe]], [[Jiha Yobe]], [[Jiha Plateau]]
| speakers = {{sigfig|250,000|2}}
| date = 2023
| ref = e27
| dia1 = Bara
| dia2 = Fika
| familycolor = Afro-Asiatic
| fam2 = [[Chadic languages|Chadic]]
| fam3 = [[West Chadic languages|West Chadic]]
| fam4 = [[Bole–Angas languages|Bole–Angas]]
| fam5 = [[Bole–Tangale languages|Bole–Tangale (A.2)]]
| fam6 = [[Bole languages proper|Bole (North)]]
| iso3 = bol
| glotto = nucl1695
| glottorefname = Bole
}}
'''Bòo pìkkà''' An fikka Harshe Chadic ga najeriya ji.
==Harufa Harshe Bole==
{|class="wikitable"
|+ Bole alphabet<ref>{{Cite book |last1=Maina Gimba |first1=Alhaji |last2=Baba Ali |first2=Malam |last3=Bah |first3=Madu |editor-last1=Schuh |editor-first1=Russell G. |title=Bole-English-Hausa Dictionary and English-Bole Wordlist |date=2009 |location=Potiskum |publisher=Ajami Press |hdl=11858/00-001M-0000-0012-7677-1 |postscript=none}}, p. iv.</ref>
|-
| [[A (letter)|A]]|| [[B (letter)|B]]|| [[Ɓ]] || [[C (letter)|C]]|| [[D (letter)|D]]
| [[Ɗ]] || [[E (letter)|E]]|| [[G (letter)|G]]|| [[H (letter)|H]]|| [[I (letter)|I]]
| [[J (letter)|J]]|| [[K (letter)|K]]|| [[L (letter)|L]]|| [[M (letter)|M]]|| [[N (letter)|N]]
| [[O (letter)|O]]|| [[P (letter)|P]]|| [[R (letter)|R]]|| [[S (letter)|S]]|| [[T (letter)|T]]
| [[U (letter)|U]]|| [[V (letter)|V]]|| [[W (letter)|W]]|| [[Y (letter)|Y]]|| [[ʼY]]
| [[Z (letter)|Z]]
|-
| a || b || ɓ || c || d
| ɗ || e || g || h || i
| j || k || l || m || n
| o || p || r || s || t
| u || v || w || y || ʼy
| z
|}
==Zoi Bo Pikka==
Ita fah boo pikka eme la kaji kumetoye , ba kamonusa toh har honsene ga messeko gaga duniya eme, inko yareye zoi laka mana soni.
Andi labar la ba inforkawo kafora kana koko honsone kamajiko boo an pikka. Kamontutu yare miyyan Yemen ai, mu indun ka yanki yemen oli larabawa.
==Boii Kulan==
==Sauwi Karatu==
*Alhaji Maina Gimba. 2000. "Bole Verb Morphology," University of California, Los Angeles PhD dissertation.
*[http://aflang.linguistics.ucla.edu/Yobe/Dictionaries/Bole_english_hausa_2009.pdf Bole-English-Hausa dictionary] {{Webarchive|url=https://web.archive.org/web/20180708194126/http://aflang.linguistics.ucla.edu/Yobe/Dictionaries/Bole_english_hausa_2009.pdf |date=2018-07-08 }}
*[http://aflang.linguistics.ucla.edu/Yobe/Dictionaries/Bole_english_2009.pdf English-Bole Wordlist] {{Webarchive|url=https://web.archive.org/web/20180708192910/http://aflang.linguistics.ucla.edu/Yobe/Dictionaries/Bole_english_2009.pdf |date=2018-07-08 }}
*[http://aflang.linguistics.ucla.edu/Bole/bole.html Papers and Other Works on Bole from UCLA] {{Webarchive|url=https://archive.today/20161219004413/http://aflang.linguistics.ucla.edu/Bole/bole.html |date=2016-12-19 }}
*[http://www.language-archives.org/language/bol OLAC resources in and about the Bole language]
{{Authority control}}
{{DEFAULTSORT:Bole language}}
[[Panni:Harsunan Nijeriya]]
[[Panni:Harsunan Chadic]]
==Ɗiwwa==
{{Reflist}}
5c8rxfn4bfeo4ne6gupgjjaqd3n489s
Harshe Afino
0
581
33144
11663
2026-11-11T21:38:30Z
RAPTOR7762
18
/* */
33144
wikitext
text/x-wiki
{{Infobox language
| name = Hausa
| pronunciation = {{IPA|/hawˈsa/}} {{pronunciation|Ha-Hausa4.ogg|listen|help=no}}
| nativename = {{Script/Hausawi|{{lang|ha-Arab|هَرْشَن هَوْسَا}}}} {{lang|ha-Latn|Harshen}}/{{lang|ha-Latn|Halshen Hausa}}
| states = {{Plainlist|
* [[Nigeria]]
* [[Niger]]<ref name="e28">{{e28|hau}}</ref>
}}
| region = [[West Africa]]
| ethnicity = [[Hausa people|Hausa]]
| speakers_label = Speakers
| speakers = [[First language|L1]]: {{sigfig|58.044460|2}} million
| date = 2023–2024
| ref = <ref name="e28"/>
| speakers2 = {{ubl|[[Second language|L2]]: {{sigfig|36.368020|2}} million (2021–2024)<ref name="e28"/>|Total: {{sigfig|94.412480|2}} million (2021–2024)<ref name="e28"/>}}
| familycolor = Afro-Asiatic
| fam2 = [[Chadic languages|Chadic]]
| fam3 = [[West Chadic languages|West]]
| fam4 = [[Hausa–Gwandara languages|Hausa–Gwandara (A.1)]]
| script = {{ubl|[[Latin script|Latin]] ([[Boko alphabet]])|[[Arabic script|Arabic]] ([[Hausa Ajami]])|[[Hausa Braille]]}}
| nation = {{ubl|{{NIG}} ([[Official language|official status]])|{{NGA}} ([[National language|national status]])}}
| minority = {{flag|Benin}}
| iso1 = ha
| iso2 = hau
| iso3 = hau
| glotto = haus1257
| glottorefname = Hausa
| lingua = 19-HAA-b
| notice = IPA
| map = Hausa_language_map.png
| mapcaption = Areas of Niger and Nigeria where Hausa people are based. Hausa tribes are shown in yellow.
}}
[[Fayil:Flag of the Hausa people.svg|thumb]]
[[Fayil:Hausa Group.jpg|thumb|yanda hausawa ke yin hawan sallah]]
[[Fayil:Kayan kida na gargajiya.jpg|thumb|Kayan gargajiyan hausawa]]
[[Fayil:Hausa cap (ƙube) 02.jpg|thumb|Hulan Hausa]]
'''Harshe Afino''' andini Gaga rukuni Harshe chadic ko inko koga iyali Harshe Afroasia.
Memo modiji la aji bosa ga Sara
Harshe Afino modiji koga Harshe najeriya. Ishinji yare laga gedau ga Najeriya. La aji bosa ga Harshe Afino ga najeriya Alan Kashi 55%) in mi'yya ga woliye (2)(3) Harshe Afino aji yado ga goggo aningoma . Kala anin goma la aji mecce koga woli Afino zuwa modi wolinshe aji Nufi Ina kasuwanci shega an sauuwa daukaka Harshe.
Afino ga afiniwa ga Fadi duniya ba forango Afino aji nufi ga lemale la aji alaka ga afiniwa do kala wolinshe su ga Harshe su(4) Afiniwa mate ga Asali ga Najeriya ga woli habasha wato (Nijer) la janjini ga shaf Fadi duniya. Aji kala Unda anin amfani ga Harshe ga sun afiniwa woli Afino Andi tarihi la godom Yan kafun Nako turawa ga larabawa woli Afino afiniwa ga adisu ga moyinshe ga karaai sana'a la godom . Misali moyinshe moi Gobir moi Kano moi zazzau moi katsina moi daura moi Gombe ga messesu. Misalan Saniya fawa mara dayi saka bara kira ga messesu.
Andi yarda gako Afino wato Asali ko Bayajida tasuniya ji inko balabe ji aji Nako woli Afino ga goru daura inko goma.
Amma bosa eme in tarihi Bayadda Andi bosa godom ga konni.
==Boko==
==Lardi==
==Ɗiwwa==
p25xsgk4aewbj1b64tg0ef3aclr3u0x
Ishaku Elisha Abbo
0
604
33529
15617
2026-11-11T22:10:33Z
RAPTOR7762
18
/* */
33529
wikitext
text/x-wiki
{{Infobox officeholder
| birth_name = Ishaku Elisha Abbo
| birth_date = {{birth date and age|1980|05|02|df=y}}
| office = [[Senator]] of the Federal Republic of Nigeria
| predecessor = [[Binta Masi Garba]]
| successor = [[Amos Yohanna]]
| party = [[African Democratic Congress]] (ADC)
| profession = Politician
| constituency = Adamawa North
| father =
| mother =
| native_name =
| chair =
| deputy1 =
| term_start = 11 June 2019
| nickname = SIA
| term_end = 16 October 2023
| Successor =
| image = Senator Ishaku Abbo 2.jpg
}}
'''Ishyaku Elisha abbo''' (layannin ga gudi mubi, Nigeria). An siyasa ga [[Nijeriya]] ji. Isshin Dan Majalisan dantawa la ajii wakilta [[Adamawa|ADAMAWA]] koo aushii. Gaga ollii Adamawa ga majalisa dokokin Nigeria Karo un'an bunon 9. Ga hunsone isshin ji aga jami'ah all progressives Congress ( APC).
==Siyasa==
Futi 23 ga terren un'an buluo ga sunin 2019. Zaban abbo ga matsayi sanata Bo wakilta aushii [[Adamawa]]. Boi ishin wa kuri'o 79,337. Lokaci laa sanata anii Tina binta masi garba.
==Rigima==
GA terren mayu 2019, abbo tii' zarafi mondu Modi gaga kanti biya asse un Abuja. Labar awawo cewa an kantiyeji undu abbo ga sun "Dan dunk" lokaci laa isshin riga kantii ye mondee kunun Bo gojja karai gonfo Daneeh.
Photo kumba video la premium time wakoyi awawo gako cewa abbo maru an shago ye lokaci laa anin unani rifu an kokari yuwatii an shago ye. boi abbo da ko an shago ye ishin iyi alwashi cewa rijini ga damuwa sosai gako yakul lapiya Modi koga Dane mondene ga
== Ɗiwwa ==
0k7pdlk50p1kdnz1aoiqf6w2f0fk205
33530
33529
2026-11-11T22:10:57Z
RAPTOR7762
18
/* */
33530
wikitext
text/x-wiki
{{Infobox officeholder
| birth_name = Ishaku Elisha Abbo
| birth_date = {{birth date and age|1980|05|02|df=y}}
| office = [[Senator]] of the Federal Republic of Nigeria
| predecessor = [[Binta Masi Garba]]
| successor = [[Amos Yohanna]]
| party = [[African Democratic Congress]] (ADC)
| profession = Politician
| constituency = Adamawa North
| father =
| mother =
| native_name =
| chair =
| deputy1 =
| term_start = 11 June 2019
| nickname = SIA
| term_end = 16 October 2023
| Successor =
| image = Senator Ishaku Abbo 2.jpg
}}
'''Ishyaku Elisha abbo''' (layannin ga gudi mubi, Nigeria). An siyasa ga [[Nijeriya]] ji. Isshin Dan Majalisan dantawa la ajii wakilta [[Adamawa|ADAMAWA]] koo aushii. Gaga ollii Adamawa ga majalisa dokokin Nigeria Karo un'an bunon 9. Ga hunsone isshin ji aga jami'ah all progressives Congress ( APC).
==Siyasa==
Futi 23 ga terren un'an buluo ga sunin 2019. Zaban abbo ga matsayi sanata Bo wakilta aushii [[Adamawa]]. Boi ishin wa kuri'o 79,337. Lokaci laa sanata anii Tina binta masi garba.
==Rigima==
GA terren mayu 2019, abbo tii' zarafi mondu Modi gaga kanti biya asse un Abuja. Labar awawo cewa an kantiyeji undu abbo ga sun "Dan dunk" lokaci laa isshin riga kantii ye mondee kunun Bo gojja karai gonfo Daneeh.
Photo kumba video la premium time wakoyi awawo gako cewa abbo maru an shago ye lokaci laa anin unani rifu an kokari yuwatii an shago ye. boi abbo da ko an shago ye ishin iyi alwashi cewa rijini ga damuwa sosai gako yakul lapiya Modi koga Dane mondene ga
== Ɗiwwa ==
j0l9gg0fg0hnatsqo10sg7opjntzs12
Kenya
0
645
33534
8592
2026-11-11T22:24:43Z
RAPTOR7762
18
/* */
33534
wikitext
text/x-wiki
[[Panni:Lelo'aji Afirka]]
{{Convert to infobox|infobox = Infobox country}}
{{Databox|item=Q114}}
'''Kenya''', itaji Olli un budum ga Africa kofai dar, gake tekun [[Indiya|India]] duffu kofai dar too" tafbkin Victoria duffu kofai zunito, laa ita aji kudukii ga Olli badi meteji. Kofai zuni tafbki Victoria Andi ollii Uganda, kofai aushitoo Kala Tanzania, kofai gudi Kala Ethiopia. Kofai dar"gudi' Somaliya, kofai gudi-zunii Kala [[Sudan]], William Ruto. Isshin ji shugabto un hunsunee.
==Hotuna==
<gallery>
File:Flag_of_Kenya.svg|Tutar kasar
File:Coat_of_arms_of_Kenya_(Official).svg|Coat of Arms
File:Africa_1909_16a.png|Taswirar kasar a shekarar 1909
File:Bofa_Public_Beach_Kilifi.jpg|Bakin Tekun Bofa, na Jama'a
File:Buntwani_Bridge.jpg|Gadar Buntwani, Kenya
File:Bunkhouse_-_awasi,_kenya_(41888330632).jpg|Bunkhouse awasi, Kenya
File:ENKARE_NAIROBI.jpg|Enkare Nairobi
File:Guest_house_close_to_Masaii_Mara.jpg|Guest House close to Masaii Mara, Kenya
File:Homa_Bay_.jpg|Homa Bay
File:KE_Lamu_0204_024_(17064039019).jpg|Wani Kwale-kwale a Kogi, Kenya
Ak55-Busy_afternoon.jpg|Yan'mata na saka
Image:Kenyan_man.jpg|[[Maasai]]
File:Mount Kilimanjaro Dec 2009 edit1.jpg|Dutsin Kilimanjaro
</gallery>
==Addinai==
* Addinin brutustan 33%
* katulik 10%
* buda 2 %
* musulmi 3%
* suran hanyuye da suke be 45%
==Diwwa==
[[Panni:Lelo'aji]]
pjzha0lhs083p17uagvstdzbqt8jqhv
Yarenshe Turanci
0
853
32924
13153
2026-11-11T21:16:13Z
RAPTOR7762
18
/* */
32924
wikitext
text/x-wiki
{{Infobox language
| name = English
| pronunciation = {{IPAc-en|ˈ|ɪ|ŋ|ɡ|l|ᵻ|ʃ}} {{respell|ING-glish}}{{sfn|''Oxford Learner's Dictionary''|2015|loc=Entry: [http://www.oxfordlearnersdictionaries.com/us/pronunciation/english/english_1 English – Pronunciation]}}
| states = The [[English-speaking world]], including the {{enum|[[United Kingdom]]|[[Republic of Ireland|Ireland]]|[[United States]]|[[India]]|[[Nigeria]]|[[Canada]]|[[Australia]]|[[New Zealand]]|[[Commonwealth Caribbean]]|[[South Africa]]|[[List of countries and territories where English is an official language|others]]}}
| speakers = [[First language|L1]]: {{nowrap|380 million}}
| speakers_label = Speakers
| date = 2021
| ref = <ref>{{Cite web |url=https://www.ethnologue.com/insights/ethnologue200/ |title=What are the top 200 most spoken languages? |website=Ethnologue |date=2023 |access-date=3 October 2023 |archive-date=18 June 2023 |archive-url=https://web.archive.org/web/20230618002011/https://www.ethnologue.com/insights/ethnologue200/ |url-status=live}}</ref>
| speakers2 = {{plainlist|
* [[Second language|L2]]: {{nowrap|1.077 billion}} (2021)<ref name="Ethnologue26">{{e26|eng|English}}</ref>
* [[English-speaking world|Total]]: 1.457 billion}}
| familycolor = Indo-European
| fam2 = [[Germanic languages|Germanic]]
| fam3 = [[West Germanic]]
| fam4 = [[North Sea Germanic]]
| fam5 = [[Anglic languages|Anglic]]
| ancestor = [[Proto-English]]
| ancestor2 = [[Old English]]
| ancestor3 = [[Middle English]]
| ancestor4 = [[Early Modern English]]
| script = {{plainlist|
* [[Latin script|Latin]] ([[English alphabet]])
* [[Anglo-Saxon runes]] (historical)
* [[English Braille]], [[Unified English Braille]]
}}
| nation = {{ubli | [[List of countries and territories where English is an official language#Sovereign states|57 countries]] and [[List of countries and territories where English is an official language#Non-sovereign entities|30 dependent territories]] | Organisations including the {{enum
| [[UN]]
| [[EU]]
| [[Commonwealth of Nations|Commonwealth]]
| [[International Criminal Court|ICC]]
| [[IMF]]
| [[IOC]]
| [[ISO]]
| [[NATO]]
| [[WTO]]
| [[ASEAN]]
| [[Organisation of American States|OAS]]
| [[OECD]]
}} }}
| agency = None, unregulated
| iso1 = en
| iso2 = eng
| iso3 = eng
| lingua = 52-ABA
| notice = IPA
| sign = [[Manually coded English]] {{nwr|(multiple systems)}}
| glotto = stan1293
| glottorefname = English
| mapscale = 1.25
| map = English language distribution.svg
| mapcaption = {{legend|#346699|Regions where English is the native language of the majority}}
{{legend|#99ccff|Regions where English is an official or widely spoken language, but not a majority native language}}
| dialects = {{hlist |class=inline |[[British English]]|[[North American English|North American]]|[[Caribbean English|Caribbean]]|[[Australian English|Australian]]|[[New Zealand English|New Zealand]]|[[South African English|South African]]|[[Hiberno-English]]|[[Indian English|Indian]]}} ([[List of dialects of English|full list]])
}}
[[Fayil:HMSPinafore.png|thumb|upright|turawan Finafo]]
[[Fayil:Webster Orthography 1828 (4-14).jpg|thumb|rubutattace]]
[[Fayil:William Shakespeare - Sonnet XXX - Rapenburg 30, Leiden (cropped).JPG|thumb]]
[[Fayil:History of English.png|thumb|Tarihin turanci]]
<ref>https://englishproficiency.com/blog/english-language-statistics-a-comprehensive-list</ref><ref>https://pushtolearn.com/post/english-speaking-countries</ref>'''Turanci:''' Harshe ji kala aga harsuna la aji amfani ga mate ga woli turawa ga zoninshe [[duniya]] kala nahira [[Amurka]] ko gudi Ishin ji yarella balau yatu godon anin bosa ga siri duniya.<ref>Crystal, D. (2003). ''English as a Global Language'' (2nd ed.). Cambridge University Press.</ref><ref>https://www.ethnologue.com</ref><ref>https://www.statista.com/statistics/266808/the-most-spoken-languages-worldwide/</ref><ref>https://www.berlitz.com/blog/most-spoken-languages-world</ref>
Turanci Ishin andiniga ga yarenshe la aji kewiya duniya kala kawena la aji kume turanci ga faransa' aji undani ga (global language)<ref>Jenkins, J. (2020). ''World Englishes''. Oxford Research Encyclopedia of Linguistics. <nowiki>https://oxfordre.com/linguistics/view/10.1093/acrefore/9780199384655.001.0001/acrefore-9780199384655-e-25</nowiki></ref><ref>[https://www.thoughtco.com/english-as-a-global-language-1692635. https://www.thoughtco.com/english-as-a-global-language-1692635.]{{Dead link|date=July 2025 |bot=InternetArchiveBot |fix-attempted=yes }}</ref><ref>https://www.ucl.ac.uk/culture-online/case-studies/2022/mar/english-often-considered-de-facto-global-language</ref><ref>https://www.newyorker.com/magazine/2024/12/30/how-much-does-our-language-shape-our-thinking</ref><ref>https://englishlive.ef.com/en/blog/english-in-the-real-world/english-became-global-language/</ref>
Turanci Ishin ji harshe majalisa dondu Duniya (MDD) ga kala Maddi wolinshe ga woli [[Ingila]] ansu muki mallaka mana min [[Nijeriya|Najeriya]]' ga Ghana ga [[Indiya|India]] ga messesu wolinshe sainon Ingila.<ref>https://www.un.org/en/our-work/official-languages</ref><ref>https://www.ungeneva.org/en/about/director-general/multilingualism/english-language-day</ref>
[[Fayil:Anglospeak (subnational version).svg|thumb|center|upright=2|Turanci a duniya]]
[[Fayil:English wikipedia map.png|thumb|upright=2|center|Kasashen da ake amfani da Turanci]]
==Ɗiwwa==
868q8n972o83tnma3m525l83p31zz33
Module:Citation/CS1
828
924
32815
9002
2026-11-08T01:33:00Z
en>Trappist the monk
0
fix publisher initialization;
32815
Scribunto
text/plain
require ('strict');
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
each of these counts against the Lua upvalue limit
]]
local validation; -- functions in Module:Citation/CS1/Date_validation
local utilities; -- functions in Module:Citation/CS1/Utilities
local z = {}; -- table of tables in Module:Citation/CS1/Utilities
local identifiers; -- functions and tables in Module:Citation/CS1/Identifiers
local metadata; -- functions in Module:Citation/CS1/COinS
local cfg = {}; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
local whitelist = {}; -- table of tables listing valid template parameter names; defined in Module:Citation/CS1/Whitelist
--[[------------------< P A G E S C O P E V A R I A B L E S >---------------
declare variables here that have page-wide scope that are not brought in from
other modules; that are created here and used here
]]
local added_deprecated_cat; -- boolean flag so that the category is added only once
local added_vanc_errs; -- boolean flag so we only emit one Vancouver error / category
local added_generic_name_errs; -- boolean flag so we only emit one generic name error / category and stop testing names once an error is encountered
local added_numeric_name_errs; -- boolean flag so we only emit one numeric name error / category and stop testing names once an error is encountered
local added_numeric_name_maint; -- boolean flag so we only emit one numeric name maint category and stop testing names once a category has been emitted
local is_preview_mode; -- true when article is in preview mode; false when using 'Preview page with this template' (previewing the module)
local is_sandbox; -- true when using sandbox modules to render citation
local url_was_archive_today; -- boolean flag set to true when has_archive_today_url() has unset |url= because it held a deprecated archive.today url
--[[--------------------------< F I R S T _ S E T >------------------------------------------------------------
Locates and returns the first set value in a table of values where the order established in the table,
left-to-right (or top-to-bottom), is the order in which the values are evaluated. Returns nil if none are set.
This version replaces the original 'for _, val in pairs do' and a similar version that used ipairs. With the pairs
version the order of evaluation could not be guaranteed. With the ipairs version, a nil value would terminate
the for-loop before it reached the actual end of the list.
]]
local function first_set (list, count)
local i = 1;
while i <= count do -- loop through all items in list
if utilities.is_set( list[i] ) then
return list[i]; -- return the first set list member
end
i = i + 1; -- point to next
end
end
--[[--------------------------< A D D _ V A N C _ E R R O R >----------------------------------------------------
Adds a single Vancouver system error message to the template's output regardless of how many error actually exist.
To prevent duplication, added_vanc_errs is nil until an error message is emitted.
added_vanc_errs is a Boolean declared in page scope variables above
]]
local function add_vanc_error (source, position)
if added_vanc_errs then return end
added_vanc_errs = true; -- note that we've added this category
utilities.set_message ('err_vancouver', {source, position});
end
--[[--------------------------< I S _ S C H E M E >------------------------------------------------------------
does this thing that purports to be a URI scheme seem to be a valid scheme? The scheme is checked to see if it
is in agreement with http://tools.ietf.org/html/std66#section-3.1 which says:
Scheme names consist of a sequence of characters beginning with a
letter and followed by any combination of letters, digits, plus
("+"), period ("."), or hyphen ("-").
returns true if it does, else false
]]
local function is_scheme (scheme)
return scheme and scheme:match ('^%a[%a%d%+%.%-]*:'); -- true if scheme is set and matches the pattern
end
--[=[-------------------------< I S _ D O M A I N _ N A M E >--------------------------------------------------
Does this thing that purports to be a domain name seem to be a valid domain name?
Syntax defined here: http://tools.ietf.org/html/rfc1034#section-3.5
BNF defined here: https://tools.ietf.org/html/rfc4234
Single character names are generally reserved; see https://tools.ietf.org/html/draft-ietf-dnsind-iana-dns-01#page-15;
see also [[Single-letter second-level domain]]
list of TLDs: https://www.iana.org/domains/root/db
RFC 952 (modified by RFC 1123) requires the first and last character of a hostname to be a letter or a digit
(see http://tools.ietf.org/html/rfc952 §GRAMMATICAL HOST TABLE SPECIFICATION §§B. Lexical grammar <name>; see
http://tools.ietf.org/html/rfc1123#section-2). Between the first and last characters the name may use letters,
digits, and the hyphen.
Also allowed are IPv4 addresses. IPv6 not supported
domain is expected to be stripped of any path so that the last character in the last character of the TLD. tld
is two or more alpha characters. Any preceding '//' (from splitting a URL with a scheme) will be stripped
here. Perhaps not necessary but retained in case it is necessary for IPv4 dot decimal.
There are several tests:
the first character of the whole domain name including subdomains must be a letter or a digit
internationalized domain name (ASCII characters with .xn-- ASCII Compatible Encoding (ACE) prefix xn-- in the TLD) see https://tools.ietf.org/html/rfc3490
single-letter/digit second-level domains in the .org, .cash, and .today TLDs
q, x, and z SL domains in the .com TLD
i and q SL domains in the .net TLD
single-letter SL domains in the ccTLDs (where the ccTLD is two letters)
two-character SL domains in gTLDs (where the gTLD is two or more letters)
three-plus-character SL domains in gTLDs (where the gTLD is two or more letters)
IPv4 dot-decimal address format; TLD not allowed
returns true if domain appears to be a proper name and TLD or IPv4 address, else false
]=]
local function is_domain_name (domain)
if not domain then
return false; -- if not set, abandon
end
domain = domain:gsub ('^//', ''); -- strip '//' from domain name if present; done here so we only have to do it once
local sl_domain = domain:match ('([^%.]+)%.[^%.]+$') or domain; -- test the second level domain name; ignore subdomains some (rarely) include chars not letter-digit-hyphen
if not (sl_domain:match ('^%w') and sl_domain:match ('%w$') and -- first and last characters must be letter or digit
sl_domain:match ('^[%w%-]+$')) then -- all other characters must be letters, digits, or hyphen-minus
return false;
end
if domain:match ('^%a+:') then -- hack to detect things that look like s:Page:Title where Page: is namespace at Wikisource
return false;
end
local patterns = { -- patterns that look like URLs
'%f[%w][%w][%w%-]+[%w]%.%a%a+$', -- three or more character hostname.hostname or hostname.tld
'%f[%w][%w][%w%-]+[%w]%.xn%-%-[%w]+$', -- internationalized domain name with ACE prefix
'%f[%a][qxz]%.com$', -- assigned one character .com hostname (x.com times out 2015-12-10)
'%f[%a][iq]%.net$', -- assigned one character .net hostname (q.net registered but not active 2015-12-10)
'%f[%w][%w]%.%a%a$', -- one character hostname and ccTLD (2 chars)
'%f[%w][%w][%w]%.%a%a+$', -- two character hostname and TLD
'^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?', -- IPv4 address
'[%a%d]+%:?' -- IPv6 address
}
for _, pattern in ipairs (patterns) do -- loop through the patterns list
if domain:match (pattern) then
return true; -- if a match then we think that this thing that purports to be a URL is a URL
end
end
for _, d in ipairs (cfg.single_letter_2nd_lvl_domains_t) do -- look for single letter second level domain names for these top level domains
if domain:match ('%f[%w][%w]%.' .. d) then
return true
end
end
return false; -- no matches, we don't know what this thing is
end
--[[--------------------------< I S _ U R L >------------------------------------------------------------------
returns true if the scheme and domain parts of a URL appear to be a valid URL; else false.
This function is the last step in the validation process. This function is separate because there are cases that
are not covered by split_url(), for example is_parameter_ext_wikilink() which is looking for bracketted external
wikilinks.
]]
local function is_url (scheme, domain)
if utilities.is_set (scheme) then -- if scheme is set check it and domain
return is_scheme (scheme) and is_domain_name (domain);
else
return is_domain_name (domain); -- scheme not set when URL is protocol-relative
end
end
--[[--------------------------< S P L I T _ U R L >------------------------------------------------------------
Split a URL into a scheme, authority indicator, and domain.
First remove Fully Qualified Domain Name terminator (a dot following TLD) (if any) and any path(/), query(?) or fragment(#).
If protocol-relative URL, return nil scheme and domain else return nil for both scheme and domain.
When not protocol-relative, get scheme, authority indicator, and domain. If there is an authority indicator (one
or more '/' characters immediately following the scheme's colon), make sure that there are only 2.
Any URL that does not have news: scheme must have authority indicator (//). TODO: are there other common schemes
like news: that don't use authority indicator?
Strip off any port and path;
]]
local function split_url (url_str)
local scheme, authority, domain;
url_str = url_str:gsub ('([%a%d])%.?[/%?#].*$', '%1'); -- strip FQDN terminator and path(/), query(?), fragment (#) (the capture prevents false replacement of '//')
if url_str:match ('^//%S*') then -- if there is what appears to be a protocol-relative URL
domain = url_str:match ('^//(%S*)')
elseif url_str:match ('%S-:/*%S+') then -- if there is what appears to be a scheme, optional authority indicator, and domain name
scheme, authority, domain = url_str:match ('(%S-:)(/*)(%S+)'); -- extract the scheme, authority indicator, and domain portions
if utilities.is_set (authority) then
authority = authority:gsub ('//', '', 1); -- replace place 1 pair of '/' with nothing;
if utilities.is_set(authority) then -- if anything left (1 or 3+ '/' where authority should be) then
return scheme; -- return scheme only making domain nil which will cause an error message
end
else
if not scheme:match ('^news:') then -- except for news:..., MediaWiki won't link URLs that do not have authority indicator; TODO: a better way to do this test?
return scheme; -- return scheme only making domain nil which will cause an error message
end
end
domain = domain:gsub ('(%a):%d+', '%1'); -- strip port number if present
end
return scheme, domain;
end
--[[--------------------------< L I N K _ P A R A M _ O K >---------------------------------------------------
checks the content of |title-link=, |series-link=, |author-link=, etc. for properly formatted content: no wikilinks, no URLs
Link parameters are to hold the title of a Wikipedia article, so none of the WP:TITLESPECIALCHARACTERS are allowed:
# < > [ ] | { } _
except the underscore which is used as a space in wiki URLs and # which is used for section links
returns false when the value contains any of these characters.
When there are no illegal characters, this function returns TRUE if value DOES NOT appear to be a valid URL (the
|<param>-link= parameter is ok); else false when value appears to be a valid URL (the |<param>-link= parameter is NOT ok).
]]
local function link_param_ok (value)
local scheme, domain;
if value:find ('[<>%[%]|{}]') then -- if any prohibited characters
return false;
end
scheme, domain = split_url (value); -- get scheme or nil and domain or nil from URL;
return not is_url (scheme, domain); -- return true if value DOES NOT appear to be a valid URL
end
--[[--------------------------< L I N K _ T I T L E _ O K >---------------------------------------------------
Use link_param_ok() to validate |<param>-link= value and its matching |<title>= value.
|<title>= may be wiki-linked but not when |<param>-link= has a value. This function emits an error message when
that condition exists
check <link> for inter-language interwiki-link prefix. prefix must be a MediaWiki-recognized language
code and must begin with a colon.
]]
local function link_title_ok (link, lorig, title, torig)
local orig;
if utilities.is_set (link) then -- don't bother if <param>-link doesn't have a value
if not link_param_ok (link) then -- check |<param>-link= markup
orig = lorig; -- identify the failing link parameter
elseif title:find ('%[%[') then -- check |title= for wikilink markup
orig = torig; -- identify the failing |title= parameter
elseif link:match ('^%a+:') then -- if the link is what looks like an interwiki
local prefix = link:match ('^(%a+):'):lower(); -- get the interwiki prefix
if cfg.inter_wiki_map[prefix] then -- if prefix is in the map, must have preceding colon
orig = lorig; -- flag as error
end
end
end
if utilities.is_set (orig) then
link = ''; -- unset
utilities.set_message ('err_bad_paramlink', orig); -- URL or wikilink in |title= with |title-link=;
end
return link; -- link if ok, empty string else
end
--[[--------------------------< C H E C K _ U R L >------------------------------------------------------------
Determines whether a URL string appears to be valid.
First we test for space characters. If any are found, return false. Then split the URL into scheme and domain
portions, or for protocol-relative (//example.com) URLs, just the domain. Use is_url() to validate the two
portions of the URL. If both are valid, or for protocol-relative if domain is valid, return true, else false.
Because it is different from a standard URL, and because this module used external_link() to make external links
that work for standard and news: links, we validate newsgroup names here. The specification for a newsgroup name
is at https://tools.ietf.org/html/rfc5536#section-3.1.4
]]
local function check_url( url_str )
if nil == url_str:match ("^%S+$") then -- if there are any spaces in |url=value it can't be a proper URL
return false;
end
local scheme, domain;
scheme, domain = split_url (url_str); -- get scheme or nil and domain or nil from URL;
if 'news:' == scheme then -- special case for newsgroups
return domain:match('^[%a%d%+%-_]+%.[%a%d%+%-_%.]*[%a%d%+%-_]$');
end
return is_url (scheme, domain); -- return true if value appears to be a valid URL
end
--[=[-------------------------< I S _ P A R A M E T E R _ E X T _ W I K I L I N K >----------------------------
Return true if a parameter value has a string that begins and ends with square brackets [ and ] and the first
non-space characters following the opening bracket appear to be a URL. The test will also find external wikilinks
that use protocol-relative URLs. Also finds bare URLs.
The frontier pattern prevents a match on interwiki-links which are similar to scheme:path URLs. The tests that
find bracketed URLs are required because the parameters that call this test (currently |title=, |chapter=, |work=,
and |publisher=) may have wikilinks and there are articles or redirects like '//Hus' so, while uncommon, |title=[[//Hus]]
is possible as might be [[en://Hus]].
]=]
local function is_parameter_ext_wikilink (value)
local scheme, domain;
if value:match ('%f[%[]%[%a%S*:%S+.*%]') then -- if ext. wikilink with scheme and domain: [xxxx://yyyyy.zzz]
scheme, domain = split_url (value:match ('%f[%[]%[(%a%S*:%S+).*%]'));
elseif value:match ('%f[%[]%[//%S+.*%]') then -- if protocol-relative ext. wikilink: [//yyyyy.zzz]
scheme, domain = split_url (value:match ('%f[%[]%[(//%S+).*%]'));
elseif value:match ('%a%S*:%S+') then -- if bare URL with scheme; may have leading or trailing plain text
scheme, domain = split_url (value:match ('(%a%S*:%S+)'));
elseif value:match ('^//%S+') or value:match ('%s//%S+') then -- if protocol-relative bare URL: //yyyyy.zzz; authority indicator (//) must be be preceded nothing or by whitespace
scheme, domain = split_url (value:match ('(//%S+)')); -- what is left should be the domain
else
return false; -- didn't find anything that is obviously a URL
end
return is_url (scheme, domain); -- return true if value appears to be a valid URL
end
--[[--------------------------< I S _ A R C H I V E _ T O D A Y _ U R L >--------------------------------------
archive.today (and .ph, .is, .md, .li, .fo, .vn) are deprecated. See Wikipedia:Requests_for_comment/Archive.is_RFC_5
(Special:Permalink/1339352976)
<val> is a string that may or may not be a url
]]
local function is_archive_today_url (val)
if is_parameter_ext_wikilink (val) then -- is <val> a url?
local tld = val:match ('archive%.(%l+)/'); -- get the tld; real archive.today urls have a '/' after the tld
return tld and cfg.archive_today_tlds_t[tld]; -- return true if <tld> is one of the archive.today tlds; nil else
end
end
--[[--------------------------< H A S _ A R C H I V E _ T O D A Y _ U R L >------------------------------------
blank any parameter that holds one of the archive.today tlds (.today, .ph, .is, .md, .li, .fo, .vn) and also
blank parameters that are dependent on the offending parameter.
input <cite_args_t> is a table of all of this template's parameters This function modifies <cite_args_t>
when |url= or its alias |URL= hold an archive.today url, this function sets the flag <url_was_archive_today>
which is used later to suppress the missing url error message from {{citation}} when it has |website=<summat>
or from the templates {{cite web}}, {{cite podcast}}, {{cite mailing list}} which all require a url.
returns nothing
]]
local function has_archive_today_url (cite_args_t)
local unset_params_t = {}; -- to hold a sequence of parameters to unset from cite_args_t
for p, v in pairs (cite_args_t) do -- look at each parameter in the template
if is_archive_today_url (v:lower()) then -- if it has a parameter with an archive.today url
table.insert (unset_params_t, p); -- add the url-holding parameter name to our list of parameters to unset (may or may not be a legitimate url parameter)
if 'url' == p:lower() then -- if this parameter is |url= or |URL=
url_was_archive_today = true; -- set a flag so that cite web / podcast / mailinglist don't emit a missing url error message
end
if p:match ('archive%-?url') and ('usurped' == cite_args_t['url-status'] or 'unfit' == cite_args_t['url-status']) then -- if |archive-url=archive.today and |url-status=unfit/usurped
url_was_archive_today = true; -- set a flag so that cite web / podcast / mailinglist don't emit a missing url error message
table.insert (unset_params_t, 'url'); -- add the url parameter name to our list of parameters to unset (may or may not be a legitimate url parameter)
table.insert (unset_params_t, 'URL'); -- this one because both are possible
utilities.set_message ('err_url_suppressed'); -- emit supplemental error message
end
if cfg.dependencies_t[p] then -- if this url-holding parameter (<p>) has dependencies
for _, dependent in ipairs (cfg.dependencies_t[p]) do -- loop through the url-holding parameter's dependency sequence
table.insert (unset_params_t, dependent); -- add dependent parameter to the list to be unset
end
end
end
end
if 0 < #unset_params_t then -- when there are parameters to unset
if not is_preview_mode then -- when in preview mode do not suppress any parameters
for _, unset_param in ipairs (unset_params_t) do -- loop through the sequence
cite_args_t[unset_param] = nil; -- and unset the url-holding parameter and its dependent parameters to avoid parameter-requires-other-parameter errors
end
end
utilities.set_message ('maint_deprecated_archive'); -- add a maintenance message
end
end
--[[-------------------------< C H E C K _ F O R _ U R L >-----------------------------------------------------
loop through a list of parameters and their values. Look at the value and if it has an external link, emit an error message.
]]
local function check_for_url (parameter_list, error_list)
for k, v in pairs (parameter_list) do -- for each parameter in the list
if is_parameter_ext_wikilink (v) then -- look at the value; if there is a URL add an error message
table.insert (error_list, utilities.wrap_style ('parameter', k));
end
end
end
--[[--------------------------< S A F E _ F O R _ U R L >------------------------------------------------------
Escape sequences for content that will be used for URL descriptions
]]
local function safe_for_url( str )
if str:match( "%[%[.-%]%]" ) ~= nil then
utilities.set_message ('err_wikilink_in_url', {});
end
return str:gsub( '[%[%]\n]', {
['['] = '[',
[']'] = ']',
['\n'] = ' ' } );
end
--[[--------------------------< E X T E R N A L _ L I N K >----------------------------------------------------
Format an external link with error checking
]]
local function external_link (URL, label, source, access)
local domain;
local path;
local base_url;
if not utilities.is_set (label) then
label = URL;
if utilities.is_set (source) then
utilities.set_message ('err_bare_url_missing_title', {utilities.wrap_style ('parameter', source)});
else
error (cfg.messages["bare_url_no_origin"]); -- programmer error; valid parameter name does not have matching meta-parameter
end
end
if not check_url (URL) then
utilities.set_message ('err_bad_url', {utilities.wrap_style ('parameter', source)});
end
domain, path = URL:match ('^([/%.%-%+:%a%d]+)([/%?#].*)$'); -- split the URL into scheme plus domain and path
if path then -- if there is a path portion
path = path:gsub ('[%[%]]', {['['] = '%5b', [']'] = '%5d'}); -- replace '[' and ']' with their percent-encoded values
URL = table.concat ({domain, path}); -- and reassemble
end
base_url = table.concat ({ "[", URL, " ", safe_for_url (label), "]" }); -- assemble a wiki-markup URL
if utilities.is_set (access) then -- access level (subscription, registration, limited)
base_url = utilities.substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[access].class, cfg.presentation[access].title, base_url}); -- add the appropriate icon
end
return base_url;
end
--[[--------------------------< D E P R E C A T E D _ P A R A M E T E R >--------------------------------------
Categorize and emit an error message when the citation contains one or more deprecated parameters. The function includes the
offending parameter name to the error message. Only one error message is emitted regardless of the number of deprecated
parameters in the citation.
added_deprecated_cat is a Boolean declared in page scope variables above
]]
local function deprecated_parameter(name)
if not added_deprecated_cat then
added_deprecated_cat = true; -- note that we've added this category
utilities.set_message ('err_deprecated_params', {name}); -- add error message
end
end
--[=[-------------------------< K E R N _ Q U O T E S >--------------------------------------------------------
Apply kerning to open the space between the quote mark provided by the module and a leading or trailing quote
mark contained in a |title= or |chapter= parameter's value.
This function will positive kern either single or double quotes:
"'Unkerned title with leading and trailing single quote marks'"
" 'Kerned title with leading and trailing single quote marks' " (in real life the kerning isn't as wide as this example)
Double single quotes (italic or bold wiki-markup) are not kerned.
Replaces Unicode quote marks in plain text or in the label portion of a [[L|D]] style wikilink with typewriter
quote marks regardless of the need for kerning. Unicode quote marks are not replaced in simple [[D]] wikilinks.
Call this function for chapter titles, for website titles, etc.; not for book titles.
]=]
local function kern_quotes (str)
local wl_type, label, link;
wl_type, label, link = utilities.is_wikilink (str); -- wl_type is: 0, no wl (text in label variable); 1, [[D]]; 2, [[L|D]]
if 1 == wl_type then -- [[D]] simple wikilink with or without quote marks
if mw.ustring.match (str, '%[%[[\"“”\'‘’].+[\"“”\'‘’]%]%]') then -- leading and trailing quote marks
str = utilities.substitute (cfg.presentation['kern-left'], str);
str = utilities.substitute (cfg.presentation['kern-right'], str);
elseif mw.ustring.match (str, '%[%[[\"“”\'‘’].+%]%]') then -- leading quote marks
str = utilities.substitute (cfg.presentation['kern-left'], str);
elseif mw.ustring.match (str, '%[%[.+[\"“”\'‘’]%]%]') then -- trailing quote marks
str = utilities.substitute (cfg.presentation['kern-right'], str);
end
else -- plain text or [[L|D]]; text in label variable
label = mw.ustring.gsub (label, '[“”]', '\"'); -- replace “” (U+201C & U+201D) with " (typewriter double quote mark)
label = mw.ustring.gsub (label, '[‘’]', '\''); -- replace ‘’ (U+2018 & U+2019) with ' (typewriter single quote mark)
local cap = mw.ustring.match (label, "^([\"\'][^\'].+)"); -- match leading double or single quote but not doubled single quotes (italic markup)
if utilities.is_set (cap) then
label = utilities.substitute (cfg.presentation['kern-left'], cap);
end
cap = mw.ustring.match (label, "^(.+[^\'][\"\'])$") -- match trailing double or single quote but not doubled single quotes (italic markup)
if utilities.is_set (cap) then
label = utilities.substitute (cfg.presentation['kern-right'], cap);
end
if 2 == wl_type then
str = utilities.make_wikilink (link, label); -- reassemble the wikilink
else
str = label;
end
end
return str;
end
--[[--------------------------< F O R M A T _ S C R I P T _ V A L U E >----------------------------------------
|script-title= holds title parameters that are not written in Latin-based scripts: Chinese, Japanese, Arabic, Hebrew, etc. These scripts should
not be italicized and may be written right-to-left. The value supplied by |script-title= is concatenated onto Title after Title has been wrapped
in italic markup.
Regardless of language, all values provided by |script-title= are wrapped in <bdi>...</bdi> tags to isolate RTL languages from the English left to right.
|script-title= provides a unique feature. The value in |script-title= may be prefixed with a two-character ISO 639-1 language code and a colon:
|script-title=ja:*** *** (where * represents a Japanese character)
Spaces between the two-character code and the colon and the colon and the first script character are allowed:
|script-title=ja : *** ***
|script-title=ja: *** ***
|script-title=ja :*** ***
Spaces preceding the prefix are allowed: |script-title = ja:*** ***
The prefix is checked for validity. If it is a valid ISO 639-1 language code, the lang attribute (lang="ja") is added to the <bdi> tag so that browsers can
know the language the tag contains. This may help the browser render the script more correctly. If the prefix is invalid, the lang attribute
is not added. At this time there is no error message for this condition.
Supports |script-title=, |script-chapter=, |script-<periodical>=
]]
local function format_script_value (script_value, script_param)
local lang=''; -- initialize to empty string
local name;
if script_value:match('^%l%l%l?%s*:') then -- if first 3 or 4 non-space characters are script language prefix
lang = script_value:match('^(%l%l%l?)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script
if not utilities.is_set (lang) then
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['missing title part']}); -- prefix without 'title'; add error message
return ''; -- script_value was just the prefix so return empty string
end
-- if we get this far we have prefix and script
name = cfg.lang_tag_remap[lang] or mw.language.fetchLanguageName( lang, cfg.this_wiki_code ); -- get language name so that we can use it to categorize
if utilities.is_set (name) then -- is prefix a proper ISO 639-1 language code?
script_value = script_value:gsub ('^%l+%s*:%s*', ''); -- strip prefix from script
-- is prefix one of these language codes?
if utilities.in_array (lang, cfg.script_lang_codes) then
utilities.add_prop_cat ('script', {name, lang})
else
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['unknown language code']}); -- unknown script-language; add error message
end
lang = ' lang="' .. lang .. '" '; -- convert prefix into a lang attribute
else
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['invalid language code']}); -- invalid language code; add error message
lang = ''; -- invalid so set lang to empty string
end
else
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['missing prefix']}); -- no language code prefix; add error message
end
script_value = utilities.substitute (cfg.presentation['bdi'], {lang, script_value}); -- isolate in case script is RTL
return script_value;
end
--[[--------------------------< S C R I P T _ C O N C A T E N A T E >------------------------------------------
Initially for |title= and |script-title=, this function concatenates those two parameter values after the script
value has been wrapped in <bdi> tags.
]]
local function script_concatenate (title, script, script_param)
if utilities.is_set (script) then
script = format_script_value (script, script_param); -- <bdi> tags, lang attribute, categorization, etc.; returns empty string on error
if utilities.is_set (script) then
title = title .. ' ' .. script; -- concatenate title and script title
end
end
return title;
end
--[[--------------------------< W R A P _ M S G >--------------------------------------------------------------
Applies additional message text to various parameter values. Supplied string is wrapped using a message_list
configuration taking one argument. Supports lower case text for {{citation}} templates. Additional text taken
from citation_config.messages - the reason this function is similar to but separate from wrap_style().
]]
local function wrap_msg (key, str, lower)
if not utilities.is_set ( str ) then
return "";
end
if true == lower then
local msg;
msg = cfg.messages[key]:lower(); -- set the message to lower case before
return utilities.substitute ( msg, str ); -- including template text
else
return utilities.substitute ( cfg.messages[key], str );
end
end
--[[----------------< W I K I S O U R C E _ U R L _ M A K E >-------------------
Makes a Wikisource URL from Wikisource interwiki-link. Returns the URL and appropriate
label; nil else.
str is the value assigned to |chapter= (or aliases) or |title= or |title-link=
]]
local function wikisource_url_make (str)
local wl_type, D, L;
local ws_url, ws_label;
local wikisource_prefix = table.concat ({'https://', cfg.this_wiki_code, '.wikisource.org/wiki/'});
wl_type, D, L = utilities.is_wikilink (str); -- wl_type is 0 (not a wikilink), 1 (simple wikilink), 2 (complex wikilink)
if 0 == wl_type then -- not a wikilink; might be from |title-link=
str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if utilities.is_set (str) then
ws_url = table.concat ({ -- build a Wikisource URL
wikisource_prefix, -- prefix
str, -- article title
});
ws_label = str; -- label for the URL
end
elseif 1 == wl_type then -- simple wikilink: [[Wikisource:ws article]]
str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if utilities.is_set (str) then
ws_url = table.concat ({ -- build a Wikisource URL
wikisource_prefix, -- prefix
str, -- article title
});
ws_label = str; -- label for the URL
end
elseif 2 == wl_type then -- non-so-simple wikilink: [[Wikisource:ws article|displayed text]] ([[L|D]])
str = L:match ('^[Ww]ikisource:(.+)') or L:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if utilities.is_set (str) then
ws_label = D; -- get ws article name from display portion of interwiki link
ws_url = table.concat ({ -- build a Wikisource URL
wikisource_prefix, -- prefix
str, -- article title without namespace from link portion of wikilink
});
end
end
if ws_url then
ws_url = mw.uri.encode (ws_url, 'WIKI'); -- make a usable URL
ws_url = ws_url:gsub ('%%23', '#'); -- undo percent-encoding of fragment marker
end
return ws_url, ws_label, L or D; -- return proper URL or nil and a label or nil
end
--[[----------------< F O R M A T _ P E R I O D I C A L >-----------------------
Format the three periodical parameters: |script-<periodical>=, |<periodical>=,
and |trans-<periodical>= into a single Periodical meta-parameter.
]]
local function format_periodical (script_periodical, script_periodical_source, periodical, trans_periodical)
if not utilities.is_set (periodical) then
periodical = ''; -- to be safe for concatenation
else
periodical = utilities.wrap_style ('italic-title', periodical); -- style
end
periodical = script_concatenate (periodical, script_periodical, script_periodical_source); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
if utilities.is_set (trans_periodical) then
trans_periodical = utilities.wrap_style ('trans-italic-title', trans_periodical);
if utilities.is_set (periodical) then
periodical = periodical .. ' ' .. trans_periodical;
else -- here when trans-periodical without periodical or script-periodical
periodical = trans_periodical;
utilities.set_message ('err_trans_missing_title', {'periodical'});
end
end
return periodical;
end
--[[------------------< F O R M A T _ C H A P T E R _ T I T L E >---------------
Format the four chapter parameters: |script-chapter=, |chapter=, |trans-chapter=,
and |chapter-url= into a single chapter meta- parameter (chapter_url_source used
for error messages).
]]
local function format_chapter_title (script_chapter, script_chapter_source, chapter, trans_chapter, trans_chapter_source, chapter_url, chapter_url_source, no_quotes, access)
local ws_url, ws_label, L = wikisource_url_make (chapter); -- make a wikisource URL and label from a wikisource interwiki link
if ws_url then
ws_label = ws_label:gsub ('_', ' '); -- replace underscore separators with space characters
chapter = ws_label;
end
if not utilities.is_set (chapter) then
chapter = ''; -- to be safe for concatenation
else
if false == no_quotes then
chapter = kern_quotes (chapter); -- if necessary, separate chapter title's leading and trailing quote marks from module provided quote marks
chapter = utilities.wrap_style ('quoted-title', chapter);
end
end
chapter = script_concatenate (chapter, script_chapter, script_chapter_source); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
if utilities.is_set (chapter_url) then
chapter = external_link (chapter_url, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
elseif ws_url then
chapter = external_link (ws_url, chapter .. ' ', 'ws link in chapter'); -- adds bare_url_missing_title error if appropriate; space char to move icon away from chap text; TODO: better way to do this?
chapter = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, chapter});
end
if utilities.is_set (trans_chapter) then
trans_chapter = utilities.wrap_style ('trans-quoted-title', trans_chapter);
if utilities.is_set (chapter) then
chapter = chapter .. ' ' .. trans_chapter;
else -- here when trans_chapter without chapter or script-chapter
chapter = trans_chapter;
utilities.set_message ('err_trans_missing_title', {trans_chapter_source:match ('trans%-?(.+)')}); -- when no chapter, get matching name from trans-<param>
end
end
return chapter;
end
--[[----------------< H A S _ I N V I S I B L E _ C H A R S >-------------------
This function searches a parameter's value for non-printable or invisible characters.
The search stops at the first match.
This function will detect the visible replacement character when it is part of the Wikisource.
Detects but ignores nowiki and math stripmarkers. Also detects other named stripmarkers
(gallery, math, pre, ref) and identifies them with a slightly different error message.
See also coins_cleanup().
Output of this function is an error message that identifies the character or the
Unicode group, or the stripmarker that was detected along with its position (or,
for multi-byte characters, the position of its first byte) in the parameter value.
]]
local function has_invisible_chars (param, v)
local position; -- position of invisible char or starting position of stripmarker
local capture; -- used by stripmarker detection to hold name of the stripmarker
local stripmarker; -- boolean set true when a stripmarker is found
capture = string.match (v, '[%w%p ]*'); -- test for values that are simple ASCII text and bypass other tests if true
if capture == v then -- if same there are no Unicode characters
return;
end
for _, invisible_char in ipairs (cfg.invisible_chars) do
local char_name = invisible_char[1]; -- the character or group name
local pattern = invisible_char[2]; -- the pattern used to find it
position, _, capture = mw.ustring.find (v, pattern); -- see if the parameter value contains characters that match the pattern
if position and (cfg.invisible_defs.zwj == capture) then -- if we found a zero-width joiner character
if mw.ustring.find (v, cfg.indic_script) then -- it's ok if one of the Indic scripts
position = nil; -- unset position
elseif cfg.emoji_t[mw.ustring.codepoint (v, position+1)] then -- is zwj followed by a character listed in emoji{}?
position = nil; -- unset position
end
end
if position then
if utilities.in_array(capture, {'nowiki', 'math', 'templatestyles'}) then -- nowiki, math and templatestyles stripmarkers (not an error condition)
stripmarker = true; -- set a flag
elseif true == stripmarker and cfg.invisible_defs.del == capture then -- because stripmakers begin and end with the delete char, assume that we've found one end of a stripmarker
position = nil; -- unset; for now, ignore linter warning
else
local err_msg;
if capture and not (cfg.invisible_defs.del == capture or cfg.invisible_defs.zwj == capture) then
err_msg = utilities.substitute (cfg.messages.invisible_1, {capture, char_name}); -- <capture> here is stripmarker name
else
err_msg = utilities.substitute (cfg.messages.invisible_2, char_name);
end
utilities.set_message ('err_invisible_char', {err_msg, utilities.wrap_style ('parameter', param), position}); -- add error message
return; -- and done with this parameter
end
end
end
end
--[[-------------------< A R G U M E N T _ W R A P P E R >----------------------
Argument wrapper. This function provides support for argument mapping defined
in the configuration file so that multiple names can be transparently aliased to
single internal variable.
]]
local function argument_wrapper ( args )
local origin = {};
return setmetatable({
ORIGIN = function ( self, k )
local dummy = self[k]; -- force the variable to be loaded; for now, ignore linter warning
return origin[k];
end
},
{
__index = function ( tbl, k )
if origin[k] ~= nil then
return nil;
end
local v;
local list = cfg.aliases[k];
if type( list ) == 'table' then
v, origin[k] = utilities.select_one ( args, list, 'err_redundant_parameters' );
if origin[k] == nil then
origin[k] = ''; -- Empty string, not nil
end
elseif list ~= nil then
v, origin[k] = args[list], list;
else
-- maybe let through instead of raising an error?
-- v, origin[k] = args[k], k;
error( cfg.messages['unknown_argument_map'] .. ': ' .. k);
end
-- Empty strings, not nil;
if v == nil then
v = '';
origin[k] = '';
end
rawset( tbl, k, v );
return v;
end,
});
end
--[[--------------------------< N O W R A P _ D A T E >-------------------------
When date is YYYY-MM-DD format wrap in nowrap span: <span ...>YYYY-MM-DD</span>.
When date is DD MMMM YYYY or is MMMM DD, YYYY then wrap in nowrap span:
<span ...>DD MMMM</span> YYYY or <span ...>MMMM DD,</span> YYYY
DOES NOT yet support MMMM YYYY or any of the date ranges.
]]
local function nowrap_date (date)
local cap;
local cap2;
if date:match("^%d%d%d%d%-%d%d%-%d%d$") then
date = utilities.substitute (cfg.presentation['nowrap1'], date);
elseif date:match("^%a+%s*%d%d?,%s+%d%d%d%d$") or date:match ("^%d%d?%s*%a+%s+%d%d%d%d$") then
cap, cap2 = string.match (date, "^(.*)%s+(%d%d%d%d)$");
date = utilities.substitute (cfg.presentation['nowrap2'], {cap, cap2});
end
return date;
end
--[[--------------------------< S E T _ T I T L E T Y P E >---------------------
This function sets default title types (equivalent to the citation including
|type=<default value>) for those templates that have defaults. Also handles the
special case where it is desirable to omit the title type from the rendered citation
(|type=none).
]]
local function set_titletype (cite_class, title_type)
if utilities.is_set (title_type) then
if 'none' == cfg.keywords_xlate[title_type] then
title_type = ''; -- if |type=none then type parameter not displayed
end
return title_type; -- if |type= has been set to any other value use that value
end
return cfg.title_types [cite_class] or ''; -- set template's default title type; else empty string for concatenation
end
--[[--------------------------< S A F E _ J O I N >-----------------------------
Joins a sequence of strings together while checking for duplicate separation characters.
]]
local function safe_join( tbl, duplicate_char )
local f = {}; -- create a function table appropriate to type of 'duplicate character'
if 1 == #duplicate_char then -- for single byte ASCII characters use the string library functions
f.gsub = string.gsub
f.match = string.match
f.sub = string.sub
else -- for multi-byte characters use the ustring library functions
f.gsub = mw.ustring.gsub
f.match = mw.ustring.match
f.sub = mw.ustring.sub
end
local str = ''; -- the output string
for _, value in ipairs( tbl ) do
if value == nil then value = ''; end
if str == '' then -- if output string is empty
str = value; -- assign value to it (first time through the loop)
elseif value ~= '' then
local comp; -- what does 'comp' mean?
if value:sub(1, 1) == '<' then -- special case of values enclosed in spans and other markup.
comp = value:gsub( "%b<>", "" ); -- remove HTML markup (<span>string</span> -> string)
else
comp = value;
end
-- typically duplicate_char is sepc
if f.sub(comp, 1, 1) == duplicate_char then -- is first character same as duplicate_char? why test first character?
-- Because individual string segments often (always?) begin with terminal punct for the
-- preceding segment: 'First element' .. 'sepc next element' .. etc.?
local trim = false;
local end_chr = f.sub(str, -1, -1); -- get the last character of the output string
-- str = str .. "<HERE(enchr=" .. end_chr .. ")" -- debug stuff?
if end_chr == duplicate_char then -- if same as separator
str = f.sub(str, 1, -2); -- remove it
elseif end_chr == "'" then -- if it might be wiki-markup
if f.sub(str, -3, -1) == duplicate_char .. "''" then -- if last three chars of str are sepc''
str = f.sub(str, 1, -4) .. "''"; -- remove them and add back ''
elseif f.sub(str, -5, -1) == duplicate_char .. "]]''" then -- if last five chars of str are sepc]]''
trim = true; -- why? why do this and next differently from previous?
elseif f.sub(str, -4, -1) == duplicate_char .. "]''" then -- if last four chars of str are sepc]''
trim = true; -- same question
end
elseif end_chr == "]" then -- if it might be wiki-markup
if f.sub(str, -3, -1) == duplicate_char .. "]]" then -- if last three chars of str are sepc]] wikilink
trim = true;
elseif f.sub(str, -3, -1) == duplicate_char .. '"]' then -- if last three chars of str are sepc"] quoted external link
trim = true;
elseif f.sub(str, -2, -1) == duplicate_char .. "]" then -- if last two chars of str are sepc] external link
trim = true;
elseif f.sub(str, -4, -1) == duplicate_char .. "'']" then -- normal case when |url=something & |title=Title.
trim = true;
end
elseif end_chr == " " then -- if last char of output string is a space
if f.sub(str, -2, -1) == duplicate_char .. " " then -- if last two chars of str are <sepc><space>
str = f.sub(str, 1, -3); -- remove them both
end
end
if trim then
if value ~= comp then -- value does not equal comp when value contains HTML markup
local dup2 = duplicate_char;
if f.match(dup2, "%A" ) then dup2 = "%" .. dup2; end -- if duplicate_char not a letter then escape it
value = f.gsub(value, "(%b<>)" .. dup2, "%1", 1 ) -- remove duplicate_char if it follows HTML markup
else
value = f.sub(value, 2, -1 ); -- remove duplicate_char when it is first character
end
end
end
str = str .. value; -- add it to the output string
end
end
return str;
end
--[[--------------------------< I S _ S U F F I X >-----------------------------
returns true if suffix is properly formed Jr, Sr, or ordinal in the range 1–9.
Puncutation not allowed.
]]
local function is_suffix (suffix)
if utilities.in_array (suffix, {'Jr', 'Sr', 'Jnr', 'Snr', '1st', '2nd', '3rd'}) or suffix:match ('^%dth$') then
return true;
end
return false;
end
--[[--------------------< I S _ G O O D _ V A N C _ N A M E >-------------------
For Vancouver style, author/editor names are supposed to be rendered in Latin
(read ASCII) characters. When a name uses characters that contain diacritical
marks, those characters are to be converted to the corresponding Latin
character. When a name is written using a non-Latin alphabet or logogram, that
name is to be transliterated into Latin characters. The module doesn't do this
so editors may/must.
This test allows |first= and |last= names to contain any of the letters defined
in the four Unicode Latin character sets
[http://www.unicode.org/charts/PDF/U0000.pdf C0 Controls and Basic Latin] 0041–005A, 0061–007A
[http://www.unicode.org/charts/PDF/U0080.pdf C1 Controls and Latin-1 Supplement] 00C0–00D6, 00D8–00F6, 00F8–00FF
[http://www.unicode.org/charts/PDF/U0100.pdf Latin Extended-A] 0100–017F
[http://www.unicode.org/charts/PDF/U0180.pdf Latin Extended-B] 0180–01BF, 01C4–024F
|lastn= also allowed to contain hyphens, spaces, and apostrophes.
(http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/)
|firstn= also allowed to contain hyphens, spaces, apostrophes, and periods
This original test:
if nil == mw.ustring.find (last, "^[A-Za-zÀ-ÖØ-öø-ƿDŽ-ɏ%-%s%']*$")
or nil == mw.ustring.find (first, "^[A-Za-zÀ-ÖØ-öø-ƿDŽ-ɏ%-%s%'%.]+[2-6%a]*$") then
was written outside of the code editor and pasted here because the code editor
gets confused between character insertion point and cursor position. The test has
been rewritten to use decimal character escape sequence for the individual bytes
of the Unicode characters so that it is not necessary to use an external editor
to maintain this code.
\195\128-\195\150 – À-Ö (U+00C0–U+00D6 – C0 controls)
\195\152-\195\182 – Ø-ö (U+00D8-U+00F6 – C0 controls)
\195\184-\198\191 – ø-ƿ (U+00F8-U+01BF – C0 controls, Latin extended A & B)
\199\132-\201\143 – DŽ-ɏ (U+01C4-U+024F – Latin extended B)
]]
local function is_good_vanc_name (last, first, suffix, position)
if not suffix then
if first:find ('[,%s]') then -- when there is a space or comma, might be first name/initials + generational suffix
first = first:match ('(.-)[,%s]+'); -- get name/initials
suffix = first:match ('[,%s]+(.+)$'); -- get generational suffix
end
end
if utilities.is_set (suffix) then
if not is_suffix (suffix) then
add_vanc_error (cfg.err_msg_supl.suffix, position);
return false; -- not a name with an appropriate suffix
end
end
if nil == mw.ustring.find (last, "^[A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191%-%s%']*$") or
nil == mw.ustring.find (first, "^[A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191%-%s%'%.]*$") then
add_vanc_error (cfg.err_msg_supl['non-Latin char'], position);
return false; -- not a string of Latin characters; Vancouver requires Romanization
end;
return true;
end
--[[--------------------------< R E D U C E _ T O _ I N I T I A L S >------------------------------------------
Attempts to convert names to initials in support of |name-list-style=vanc.
Names in |firstn= may be separated by spaces or hyphens, or for initials, a period.
See http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35062/.
Vancouver style requires family rank designations (Jr, II, III, etc.) to be rendered
as Jr, 2nd, 3rd, etc. See http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35085/.
This code only accepts and understands generational suffix in the Vancouver format
because Roman numerals look like, and can be mistaken for, initials.
This function uses ustring functions because firstname initials may be any of the
Unicode Latin characters accepted by is_good_vanc_name ().
]]
local function reduce_to_initials (first, position)
if first:find (',', 1, true) then
return first; -- commas not allowed; abandon
end
local name, suffix = mw.ustring.match (first, "^(%u+) ([%dJS][%drndth]+)$");
if not name then -- if not initials and a suffix
name = mw.ustring.match (first, "^(%u+)$"); -- is it just initials?
end
if name then -- if first is initials with or without suffix
if 3 > mw.ustring.len (name) then -- if one or two initials
if suffix then -- if there is a suffix
if is_suffix (suffix) then -- is it legitimate?
return first; -- one or two initials and a valid suffix so nothing to do
else
add_vanc_error (cfg.err_msg_supl.suffix, position); -- one or two initials with invalid suffix so error message
return first; -- and return first unmolested
end
else
return first; -- one or two initials without suffix; nothing to do
end
end
end -- if here then name has 3 or more uppercase letters so treat them as a word
local initials_t = {}; -- table to hold initials
local i = 1; -- counter for number of initials
local names_t = mw.text.split (first, '[%s%-]+'); -- split into a sequence of names and possible suffix
while names_t[i] do -- loop through the sequence
if 1 < i and names_t[i]:match ('[%dJS][%drndth]+%.?$') then -- if not the first name, and looks like a suffix (may have trailing dot)
names_t[i] = names_t[i]:gsub ('%.', ''); -- remove terminal dot if present
if is_suffix (names_t[i]) then -- if a legitimate suffix
table.insert (initials_t, ' ' .. names_t[i]); -- add a separator space, insert at end of initials sequence
break; -- and done because suffix must fall at the end of a name
end -- no error message if not a suffix; possibly because of Romanization
end
if 3 > i then
table.insert (initials_t, mw.ustring.sub (names_t[i], 1, 1)); -- insert the initial at end of initials sequence
end
i = i + 1; -- bump the counter
end
return table.concat (initials_t); -- Vancouver format does not include spaces.
end
--[[--------------------------< I N T E R W I K I _ P R E F I X E N _ G E T >----------------------------------
extract interwiki prefixen from <value>. Returns two one or two values:
false – no prefixen
nil – prefix exists but not recognized
project prefix, language prefix – when value has either of:
:<project>:<language>:<article>
:<language>:<project>:<article>
project prefix, nil – when <value> has only a known single-letter prefix
nil, language prefix – when <value> has only a known language prefix
accepts single-letter project prefixen: 'd' (wikidata), 's' (wikisource), and 'w' (wikipedia) prefixes; at this
writing, the other single-letter prefixen (b (wikibook), c (commons), m (meta), n (wikinews), q (wikiquote), and
v (wikiversity)) are not supported.
]]
local function interwiki_prefixen_get (value, is_link)
if not value:find (':%l+:') then -- if no prefix
return false; -- abandon; boolean here to distinguish from nil fail returns later
end
local prefix_patterns_linked_t = { -- sequence of valid interwiki and inter project prefixen
'^%[%[:([dsw]):(%l%l+):', -- wikilinked; project and language prefixes
'^%[%[:(%l%l+):([dsw]):', -- wikilinked; language and project prefixes
'^%[%[:([dsw]):', -- wikilinked; project prefix
'^%[%[:(%l%l+):', -- wikilinked; language prefix
}
local prefix_patterns_unlinked_t = { -- sequence of valid interwiki and inter project prefixen
'^:([dsw]):(%l%l+):', -- project and language prefixes
'^:(%l%l+):([dsw]):', -- language and project prefixes
'^:([dsw]):', -- project prefix
'^:(%l%l+):', -- language prefix
}
local cap1, cap2;
for _, pattern in ipairs ((is_link and prefix_patterns_linked_t) or prefix_patterns_unlinked_t) do
cap1, cap2 = value:match (pattern);
if cap1 then
break; -- found a match so stop looking
end
end
if cap1 and cap2 then -- when both then :project:language: or :language:project: (both forms allowed)
if 1 == #cap1 then -- length == 1 then :project:language:
if cfg.inter_wiki_map[cap2] then -- is language prefix in the interwiki map?
return cap1, cap2; -- return interwiki project and interwiki language
end
else -- here when :language:project:
if cfg.inter_wiki_map[cap1] then -- is language prefix in the interwiki map?
return cap2, cap1; -- return interwiki project and interwiki language
end
end
return nil; -- unknown interwiki language
elseif not (cap1 or cap2) then -- both are nil?
return nil; -- we got something that looks like a project prefix but isn't; return fail
elseif 1 == #cap1 then -- here when one capture
return cap1, nil; -- length is 1 so return project, nil language
else -- here when one capture and its length it more than 1
if cfg.inter_wiki_map[cap1] then -- is language prefix in the interwiki map?
return nil, cap1; -- return nil project, language
end
end
end
--[[--------------------------< L I S T _ P E O P L E >--------------------------
Formats a list of people (authors, contributors, editors, interviewers, translators)
names in the list will be linked when
|<name>-link= has a value
|<name>-mask- does NOT have a value; masked names are presumed to have been
rendered previously so should have been linked there
when |<name>-mask=0, the associated name is not rendered
]]
local function list_people (control, people, etal)
local sep;
local namesep;
local format = control.format;
local maximum = control.maximum;
local name_list = {};
if 'vanc' == format then -- Vancouver-like name styling?
sep = cfg.presentation['sep_nl_vanc']; -- name-list separator between names is a comma
namesep = cfg.presentation['sep_name_vanc']; -- last/first separator is a space
else
sep = cfg.presentation['sep_nl']; -- name-list separator between names is a semicolon
namesep = cfg.presentation['sep_name']; -- last/first separator is <comma><space>
end
if sep:sub (-1, -1) ~= " " then sep = sep .. " " end
if utilities.is_set (maximum) and maximum < 1 then return "", 0; end -- returned 0 is for EditorCount; not used for other names
for i, person in ipairs (people) do
if utilities.is_set (person.last) then
local mask = person.mask;
local one;
local sep_one = sep;
if utilities.is_set (maximum) and i > maximum then
etal = true;
break;
end
if mask then
local n = tonumber (mask); -- convert to a number if it can be converted; nil else
if n then
one = 0 ~= n and string.rep("—", n) or nil; -- make a string of (n > 0) mdashes, nil else, to replace name
person.link = nil; -- don't create link to name if name is replaces with mdash string or has been set nil
else
one = mask; -- replace name with mask text (must include name-list separator)
sep_one = " "; -- modify name-list separator
end
else
one = person.last; -- get surname
local first = person.first -- get given name
if utilities.is_set (first) then
if ("vanc" == format) then -- if Vancouver format
one = one:gsub ('%.', ''); -- remove periods from surnames (http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/)
if not person.corporate and is_good_vanc_name (one, first, nil, i) then -- and name is all Latin characters; corporate authors not tested
first = reduce_to_initials (first, i); -- attempt to convert first name(s) to initials
end
end
one = one .. namesep .. first;
end
end
if utilities.is_set (person.link) then
one = utilities.make_wikilink (person.link, one); -- link author/editor
end
if one then -- if <one> has a value (name, mdash replacement, or mask text replacement)
local proj, tag = interwiki_prefixen_get (one, true); -- get the interwiki prefixen if present
if 'w' == proj and ('Wikipedia' == mw.site.namespaces.Project['name']) then
proj = nil; -- for stuff like :w:de:<article>, :w is unnecessary TODO: maint cat?
end
if proj then
local proj_name = ({['d'] = cfg.messages.wikidata, ['s'] = cfg.messages.wikisource, ['w'] = cfg.messages.wikipedia})[proj]; -- :w (wikipedia) for linking from a non-wikipedia project
if proj_name then
one = one .. utilities.wrap_style ('interproj', proj_name); -- add resized leading space, brackets, static text, language name
utilities.add_prop_cat ('interproj-linked-name', proj); -- categorize it; <proj> is sort key
tag = nil; -- unset; don't do both project and language
end
end
if tag == cfg.this_wiki_code then
tag = nil; -- stuff like :en:<article> at en.wiki is pointless TODO: maint cat?
end
if tag then
local lang = cfg.lang_tag_remap[tag] or cfg.mw_languages_by_tag_t[tag];
if lang then -- error messaging done in extract_names() where we know parameter names
one = one .. utilities.wrap_style ('interwiki', lang); -- add resized leading space, brackets, static text, language name
utilities.add_prop_cat ('interwiki-linked-name', tag); -- categorize it; <tag> is sort key
end
end
table.insert (name_list, one); -- add it to the list of names
table.insert (name_list, sep_one); -- add the proper name-list separator
end
end
end
local count = #name_list / 2; -- (number of names + number of separators) divided by 2
if 0 < count then
if 1 < count and not etal then
if 'amp' == format then
name_list[#name_list-2] = " & "; -- replace last separator with ampersand text
elseif 'and' == format then
if 2 == count then
name_list[#name_list-2] = cfg.presentation.sep_nl_and; -- replace last separator with 'and' text
else
name_list[#name_list-2] = cfg.presentation.sep_nl_end; -- replace last separator with '(sep) and' text
end
end
end
name_list[#name_list] = nil; -- erase the last separator
end
local result = table.concat (name_list); -- construct list
if etal and utilities.is_set (result) then -- etal may be set by |display-authors=etal but we might not have a last-first list
result = result .. sep .. cfg.messages['et al']; -- we've got a last-first list and etal so add et al.
end
return result, count; -- return name-list string and count of number of names (count used for editor names only)
end
--[[--------------------< M A K E _ C I T E R E F _ I D >-----------------------
Generates a CITEREF anchor ID if we have at least one name or a date. Otherwise
returns an empty string.
namelist is one of the contributor-, author-, or editor-name lists chosen in that
order. year is Year or anchor_year.
]]
local function make_citeref_id (namelist, year)
local names={}; -- a table for the one to four names and year
for i,v in ipairs (namelist) do -- loop through the list and take up to the first four last names
names[i] = v.last
if i == 4 then break end -- if four then done
end
table.insert (names, year); -- add the year at the end
local id = table.concat(names); -- concatenate names and year for CITEREF id
if utilities.is_set (id) then -- if concatenation is not an empty string
return "CITEREF" .. id; -- add the CITEREF portion
else
return ''; -- return an empty string; no reason to include CITEREF id in this citation
end
end
--[[--------------------------< C I T E _ C L A S S _A T T R I B U T E _M A K E >------------------------------
construct <cite> tag class attribute for this citation.
<cite_class> – config.CitationClass from calling template
<mode> – value from |mode= parameter
]]
local function cite_class_attribute_make (cite_class, mode)
local class_t = {};
table.insert (class_t, 'citation'); -- required for blue highlight
if 'citation' ~= cite_class then
table.insert (class_t, cite_class); -- identify this template for user css
table.insert (class_t, utilities.is_set (mode) and mode or 'cs1'); -- identify the citation style for user css or javascript
else
table.insert (class_t, utilities.is_set (mode) and mode or 'cs2'); -- identify the citation style for user css or javascript
end
for _, prop_key in ipairs (z.prop_keys_t) do
table.insert (class_t, prop_key); -- identify various properties for user css or javascript
end
return table.concat (class_t, ' '); -- make a big string and done
end
--[[---------------------< N A M E _ H A S _ E T A L >--------------------------
Evaluates the content of name parameters (author, editor, etc.) for variations on
the theme of et al. If found, the et al. is removed, a flag is set to true and
the function returns the modified name and the flag.
This function never sets the flag to false but returns its previous state because
it may have been set by previous passes through this function or by the associated
|display-<names>=etal parameter
]]
local function name_has_etal (name, etal, nocat, param)
if utilities.is_set (name) then -- name can be nil in which case just return
local patterns = cfg.et_al_patterns; -- get patterns from configuration
for _, pattern in ipairs (patterns) do -- loop through all of the patterns
if name:match (pattern) then -- if this 'et al' pattern is found in name
name = name:gsub (pattern, ''); -- remove the offending text
etal = true; -- set flag (may have been set previously here or by |display-<names>=etal)
if not nocat then -- no categorization for |vauthors=
utilities.set_message ('err_etal', {param}); -- and set an error if not added
end
end
end
end
return name, etal;
end
--[[---------------------< N A M E _ I S _ N U M E R I C >----------------------
Add an error message and category when <name> parameter value does not contain letters.
Add a maintenance category when <name> parameter value has numeric characters mixed with characters that are
not numeric characters; could be letters and/or punctuation characters.
This function will only emit one error and one maint message for the current template. Does not emit both error
and maint messages/categories for the same parameter value.
returns nothing
]]
local function name_is_numeric (name, name_alias, list_name)
local patterns = {
'^%D+%d', -- <name> must have digits preceded by other characters
'^%D*%d+%D+', -- <name> must have digits followed by other characters
}
if not added_numeric_name_errs and mw.ustring.match (name, '^[%A]+$') then -- if we have not already set an error message and <name> does not have any alpha characters
utilities.set_message ('err_numeric_names', name_alias); -- add an error message
added_numeric_name_errs = true; -- set the flag so we emit only one error message
return; -- when here no point in further testing; abandon
end
if not added_numeric_name_maint then -- if we have already set a maint message
for _, pattern in ipairs (patterns) do -- spin through list of patterns
if mw.ustring.match (name, pattern) then -- digits preceded or followed by anything but digits; %D+ includes punctuation
utilities.set_message ('maint_numeric_names', cfg.special_case_translation [list_name]); -- add a maint cat for this template
added_numeric_name_maint = true; -- set the flag so we emit only one maint message
return; -- when here no point in further testing; abandon
end
end
end
end
--[[-----------------< N A M E _ H A S _ M U L T _ N A M E S >------------------
Evaluates the content of last/surname (authors etc.) parameters for multiple names.
Multiple names are indicated if there is more than one comma or any "unescaped"
semicolons. Escaped semicolons are ones used as part of selected HTML entities.
If the condition is met, the function adds the multiple name maintenance category.
Same test for first except that commas should not appear in given names (MOS:JR says
that the generational suffix does not take a separator character). Titles, degrees,
postnominals, affiliations, all normally comma separated don't belong in a citation.
<name> – name parameter value
<list_name> – AuthorList, EditorList, etc
<limit> – number of allowed commas; 1 (default) for surnames; 0 for given names
returns nothing
]]
local function name_has_mult_names (name, list_name, limit)
local _, commas, semicolons, nbsps;
limit = limit and limit or 1;
if utilities.is_set (name) then
_, commas = name:gsub (',', ''); -- count the number of commas
_, semicolons = name:gsub (';', ''); -- count the number of semicolons
-- nbsps probably should be its own separate count rather than merged in
-- some way with semicolons because Lua patterns do not support the
-- grouping operator that regex does, which means there is no way to add
-- more entities to escape except by adding more counts with the new
-- entities
_, nbsps = name:gsub (' ',''); -- count nbsps
-- There is exactly 1 semicolon per entity, so subtract nbsps
-- from semicolons to 'escape' them. If additional entities are added,
-- they also can be subtracted.
if limit < commas or 0 < (semicolons - nbsps) then
utilities.set_message ('maint_mult_names', cfg.special_case_translation [list_name]); -- add a maint message
end
end
end
--[=[-------------------------< I S _ G E N E R I C >----------------------------------------------------------
Compares values assigned to various parameters according to the string provided as <item> in the function call.
<item> can have on of two values:
'generic_names' – for name-holding parameters: |last=, |first=, |editor-last=, etc
'generic_titles' – for |title=
There are two types of generic tests. The 'accept' tests look for a pattern that should not be rejected by the
'reject' test. For example,
|author=[[John Smith (author)|Smith, John]]
would be rejected by the 'author' reject test. But piped wikilinks with 'author' disambiguation should not be
rejected so the 'accept' test prevents that from happening. Accept tests are always performed before reject
tests.
Each of the 'accept' and 'reject' sequence tables hold tables for en.wiki (['en']) and local.wiki (['local'])
that each can hold a test sequence table The sequence table holds, at index [1], a test pattern, and, at index
[2], a boolean control value. The control value tells string.find() or mw.ustring.find() to do plain-text search (true)
or a pattern search (false). The intent of all this complexity is to make these searches as fast as possible so
that we don't run out of processing time on very large articles.
Returns
true when a reject test finds the pattern or string
false when an accept test finds the pattern or string
nil else
]=]
local function is_generic (item, value)
local str_lower = { -- use string.lower() for en.wiki (['en']) and use mw.ustring.lower() or local.wiki (['local'])
['en'] = string.lower,
['local'] = mw.ustring.lower,
}
local str_find = { -- use string.find() for en.wiki (['en']) and use mw.ustring.find() or local.wiki (['local'])
['en'] = string.find,
['local'] = mw.ustring.find,
}
local function test (val, test_t, wiki) -- local function to do the testing; <wiki> selects lower() and find() functions
val = test_t[2] and str_lower[wiki](value) or val; -- when <test_t[2]> set to 'true', plaintext search using lowercase value
return str_find[wiki] (val, test_t[1], 1, test_t[2]); -- return nil when not found or matched
end
local test_types_t = {'accept', 'reject'}; -- test accept patterns first, then reject patterns
local wikis_t = {'en', 'local'}; -- do tests for each of these keys; en.wiki first, local.wiki second
for _, test_type in ipairs (test_types_t) do -- for each test type
for _, generic_value in pairs (cfg.special_case_translation[item][test_type]) do -- spin through the list of generic value fragments to accept or reject
for _, wiki in ipairs (wikis_t) do
if generic_value[wiki] then
if test (value, generic_value[wiki], wiki) then -- go do the test
return ('reject' == test_type); -- param value rejected, return true; false else
end
end
end
end
end
end
--[[--------------------------< N A M E _ I S _ G E N E R I C >------------------------------------------------
calls is_generic() to determine if <name> is a 'generic name' listed in cfg.generic_names; <name_alias> is the
parameter name used in error messaging
]]
local function name_is_generic (name, name_alias)
if not added_generic_name_errs and is_generic ('generic_names', name) then
utilities.set_message ('err_generic_name', name_alias); -- set an error message
added_generic_name_errs = true;
end
end
--[[--------------------------< N A M E _ C H E C K S >--------------------------------------------------------
This function calls various name checking functions used to validate the content of the various name-holding parameters.
]]
local function name_checks (last, first, list_name, last_alias, first_alias)
local accept_name;
if utilities.is_set (last) then
last, accept_name = utilities.has_accept_as_written (last); -- remove accept-this-as-written markup when it wraps all of <last>
if not accept_name then -- <last> not wrapped in accept-as-written markup
name_has_mult_names (last, list_name); -- check for multiple names in the parameter
name_is_numeric (last, last_alias, list_name); -- check for names that have no letters or are a mix of digits and other characters
name_is_generic (last, last_alias); -- check for names found in the generic names list
end
end
if utilities.is_set (first) then
first, accept_name = utilities.has_accept_as_written (first); -- remove accept-this-as-written markup when it wraps all of <first>
if not accept_name then -- <first> not wrapped in accept-as-written markup
name_has_mult_names (first, list_name, 0); -- check for multiple names in the parameter; 0 is number of allowed commas in a given name
name_is_numeric (first, first_alias, list_name); -- check for names that have no letters or are a mix of digits and other characters
name_is_generic (first, first_alias); -- check for names found in the generic names list
end
local wl_type, D = utilities.is_wikilink (first);
if 0 ~= wl_type then
first = D;
utilities.set_message ('err_bad_paramlink', first_alias);
end
end
return last, first; -- done
end
--[[----------------------< E X T R A C T _ N A M E S >-------------------------
Gets name list from the input arguments
Searches through args in sequential order to find |lastn= and |firstn= parameters
(or their aliases), and their matching link and mask parameters. Stops searching
when both |lastn= and |firstn= are not found in args after two sequential attempts:
found |last1=, |last2=, and |last3= but doesn't find |last4= and |last5= then the
search is done.
This function emits an error message when there is a |firstn= without a matching
|lastn=. When there are 'holes' in the list of last names, |last1= and |last3=
are present but |last2= is missing, an error message is emitted. |lastn= is not
required to have a matching |firstn=.
When an author or editor parameter contains some form of 'et al.', the 'et al.'
is stripped from the parameter and a flag (etal) returned that will cause list_people()
to add the static 'et al.' text from Module:Citation/CS1/Configuration. This keeps
'et al.' out of the template's metadata. When this occurs, an error is emitted.
]]
local function extract_names(args, list_name)
local names = {}; -- table of names
local last; -- individual name components
local first;
local link;
local mask;
local i = 1; -- loop counter/indexer
local n = 1; -- output table indexer
local count = 0; -- used to count the number of times we haven't found a |last= (or alias for authors, |editor-last or alias for editors)
local etal = false; -- return value set to true when we find some form of et al. in an author parameter
local last_alias, first_alias, link_alias; -- selected parameter aliases used in error messaging
while true do
last, last_alias = utilities.select_one ( args, cfg.aliases[list_name .. '-Last'], 'err_redundant_parameters', i ); -- search through args for name components beginning at 1
first, first_alias = utilities.select_one ( args, cfg.aliases[list_name .. '-First'], 'err_redundant_parameters', i );
link, link_alias = utilities.select_one ( args, cfg.aliases[list_name .. '-Link'], 'err_redundant_parameters', i );
mask = utilities.select_one ( args, cfg.aliases[list_name .. '-Mask'], 'err_redundant_parameters', i );
if last then -- error check |lastn= alias for unknown interwiki link prefix; done here because this is where we have the parameter name
local project, language = interwiki_prefixen_get (last, true); -- true because we expect interwiki links in |lastn= to be wikilinked
if nil == project and nil == language then -- when both are nil
utilities.set_message ('err_bad_paramlink', last_alias); -- not known, emit an error message -- TODO: err_bad_interwiki?
last = utilities.remove_wiki_link (last); -- remove wikilink markup; show display value only
end
end
if link then -- error check |linkn= alias for unknown interwiki link prefix
local project, language = interwiki_prefixen_get (link, false); -- false because wiki links in |author-linkn= is an error
if nil == project and nil == language then -- when both are nil
utilities.set_message ('err_bad_paramlink', link_alias); -- not known, emit an error message -- TODO: err_bad_interwiki?
link = nil; -- unset so we don't link
link_alias = nil;
end
end
last, etal = name_has_etal (last, etal, false, last_alias); -- find and remove variations on et al.
first, etal = name_has_etal (first, etal, false, first_alias); -- find and remove variations on et al.
last, first = name_checks (last, first, list_name, last_alias, first_alias); -- multiple names, extraneous annotation, etc. checks
if first and not last then -- if there is a firstn without a matching lastn
local alias = first_alias:find ('given', 1, true) and 'given' or 'first'; -- get first or given form of the alias
utilities.set_message ('err_first_missing_last', {
first_alias, -- param name of alias missing its mate
first_alias:gsub (alias, {['first'] = 'last', ['given'] = 'surname'}), -- make param name appropriate to the alias form
}); -- add this error message
elseif not first and not last then -- if both firstn and lastn aren't found, are we done?
count = count + 1; -- number of times we haven't found last and first
if 2 <= count then -- two missing names and we give up
break; -- normal exit or there is a two-name hole in the list; can't tell which
end
else -- we have last with or without a first
link = link_title_ok (link, link_alias, last, last_alias); -- check for improper wiki-markup
if first then
link = link_title_ok (link, link_alias, first, first_alias); -- check for improper wiki-markup
end
names[n] = {last = last, first = first, link = link, mask = mask, corporate = false}; -- add this name to our names list (corporate for |vauthors= only)
n = n + 1; -- point to next location in the names table
if 1 == count then -- if the previous name was missing
utilities.set_message ('err_missing_name', {list_name:match ("(%w+)List"):lower(), i - 1}); -- add this error message
end
count = 0; -- reset the counter, we're looking for two consecutive missing names
end
i = i + 1; -- point to next args location
end
return names, etal; -- all done, return our list of names and the etal flag
end
--[[--------------------------< N A M E _ T A G _ G E T >------------------------------------------------------
attempt to decode |language=<lang_param> and return language name and matching tag; nil else.
This function looks for:
<lang_param> as a tag in cfg.lang_tag_remap{}
<lang_param> as a name in cfg.lang_name_remap{}
<lang_param> as a name in cfg.mw_languages_by_name_t
<lang_param> as a tag in cfg.mw_languages_by_tag_t
when those fail, presume that <lang_param> is an IETF-like tag that MediaWiki does not recognize. Strip all
script, region, variant, whatever subtags from <lang_param> to leave just a two or three character language tag
and look for the new <lang_param> in cfg.mw_languages_by_tag_t{}
on success, returns name (in properly capitalized form) and matching tag (in lowercase); on failure returns nil
]]
local function name_tag_get (lang_param)
local lang_param_lc = mw.ustring.lower (lang_param); -- use lowercase as an index into the various tables
local name;
local tag;
name = cfg.lang_tag_remap[lang_param_lc]; -- assume <lang_param_lc> is a tag; attempt to get remapped language name
if name then -- when <name>, <lang_param> is a tag for a remapped language name
if cfg.lang_name_remap[name:lower()][2] ~= lang_param_lc then
utilities.set_message ('maint_unknown_lang'); -- add maint category if not already added
return name, cfg.lang_name_remap[name:lower()][2]; -- so return name and tag from lang_name_remap[name]; special case to xlate sr-ec and sr-el to sr-cyrl and sr-latn
end
return name, lang_param_lc; -- so return <name> from remap and <lang_param_lc>
end
tag = lang_param_lc:match ('^(%a%a%a?)%-.*'); -- still assuming that <lang_param_lc> is a tag; strip script, region, variant subtags
name = cfg.lang_tag_remap[tag]; -- attempt to get remapped language name with language subtag only
if name then -- when <name>, <tag> is a tag for a remapped language name
return name, tag; -- so return <name> from remap and <tag>
end
if cfg.lang_name_remap[lang_param_lc] then -- not a remapped tag, assume <lang_param_lc> is a name; attempt to get remapped language tag
return cfg.lang_name_remap[lang_param_lc][1], cfg.lang_name_remap[lang_param_lc][2]; -- for this <lang_param_lc>, return a (possibly) new name and appropriate tag
end
name = cfg.mw_languages_by_tag_t[lang_param_lc]; -- assume that <lang_param_lc> is a tag; attempt to get its matching language name
if name then
return name, lang_param_lc; -- <lang_param_lc> is a tag so return it and <name>
end
tag = cfg.mw_languages_by_name_t[lang_param_lc]; -- assume that <lang_param_lc> is a language name; attempt to get its matching tag
if tag then
return cfg.mw_languages_by_tag_t[tag], tag; -- <lang_param_lc> is a name so return the name from the table and <tag>
end
tag = lang_param_lc:match ('^(%a%a%a?)%-.*'); -- is <lang_param_lc> an IETF-like tag that MediaWiki doesn't recognize? <tag> gets the language subtag; nil else
if tag then
name = cfg.mw_languages_by_tag_t[tag]; -- attempt to get a language name using the shortened <tag>
if name then
return name, tag; -- <lang_param_lc> is an unrecognized IETF-like tag so return <name> and language subtag
end
end
end
--[[-------------------< L A N G U A G E _ P A R A M E T E R >------------------
Gets language name from a provided two- or three-character ISO 639 code. If a code
is recognized by MediaWiki, use the returned name; if not, then use the value that
was provided with the language parameter.
When |language= contains a recognized language (either code or name), the page is
assigned to the category for that code: Category:Norwegian-language sources (no).
For valid three-character code languages, the page is assigned to the single category
for '639-2' codes: Category:CS1 ISO 639-2 language sources.
Languages that are the same as the local wiki are not categorized. MediaWiki does
not recognize three-character equivalents of two-character codes: code 'ar' is
recognized but code 'ara' is not.
This function supports multiple languages in the form |language=nb, French, th
where the language names or codes are separated from each other by commas with
optional space characters.
]]
local function language_parameter (lang)
local tag; -- some form of IETF-like language tag; language subtag with optional region, sript, vatiant, etc subtags
local lang_subtag; -- ve populates |language= with mostly unecessary region subtags that MediaWiki does not recognize; this is the base language subtag
local name; -- the language name
local language_list = {}; -- table of language names to be rendered
local names_t = mw.text.split (lang, '%s*,%s*'); -- names should be a comma separated list
for _, lang in ipairs (names_t) do -- reuse lang here because we don't yet know if lang is a language name or a language tag; for now, ignore linter warning
name, tag = name_tag_get (lang); -- attempt to get name/tag pair for <lang>; <name> has proper capitalization; <tag> is lowercase
if utilities.is_set (tag) then
lang_subtag = tag:gsub ('^(%a%a%a?)%-.*', '%1'); -- for categorization, strip any IETF-like tags from language tag
if cfg.this_wiki_code ~= lang_subtag then -- when the language is not the same as this wiki's language
if 2 == lang_subtag:len() then -- and is a two-character tag
utilities.add_prop_cat ('foreign-lang-source', {name, tag}, lang_subtag); -- categorize it; tag appended to allow for multiple language categorization
else -- or is a recognized language (but has a three-character tag)
utilities.add_prop_cat ('foreign-lang-source-2', {lang_subtag}, lang_subtag); -- categorize it differently TODO: support multiple three-character tag categories per cs1|2 template?
end
elseif cfg.local_lang_cat_enable then -- when the language and this wiki's language are the same and categorization is enabled
utilities.add_prop_cat ('local-lang-source', {name, lang_subtag}); -- categorize it
end
else
name = lang; -- return whatever <lang> has so that we show something
utilities.set_message ('maint_unknown_lang'); -- add maint category if not already added
end
table.insert (language_list, name);
end
name = utilities.make_sep_list (#language_list, language_list);
if (1 == #language_list) and (lang_subtag == cfg.this_wiki_code) then -- when only one language, find lang name in this wiki lang name; for |language=en-us, 'English' in 'American English'
return ''; -- if one language and that language is this wiki's return an empty string (no annotation)
end
return (" " .. wrap_msg ('language', name)); -- otherwise wrap with '(in ...)'
--[[ TODO: should only return blank or name rather than full list
so we can clean up the bunched parenthetical elements Language, Type, Format
]]
end
--[[-----------------------< S E T _ C S _ S T Y L E >--------------------------
Gets the default CS style configuration for the given mode.
Returns default separator and either postscript as passed in or the default.
In CS1, the default postscript and separator are '.'.
In CS2, the default postscript is the empty string and the default separator is ','.
]]
local function set_cs_style (postscript, mode)
if utilities.is_set(postscript) then
-- emit a maintenance message if user postscript is the default cs1 postscript
-- we catch the opposite case for cs2 in set_style
if mode == 'cs1' and postscript == cfg.presentation['ps_' .. mode] then
utilities.set_message ('maint_postscript');
end
else
postscript = cfg.presentation['ps_' .. mode];
end
return cfg.presentation['sep_' .. mode], postscript;
end
--[[--------------------------< S E T _ S T Y L E >-----------------------------
Sets the separator and postscript styles. Checks the |mode= first and the
#invoke CitationClass second. Removes the postscript if postscript == none.
]]
local function set_style (mode, postscript, cite_class)
local sep;
if 'cs2' == mode then
sep, postscript = set_cs_style (postscript, 'cs2');
elseif 'cs1' == mode then
sep, postscript = set_cs_style (postscript, 'cs1');
elseif 'citation' == cite_class then
sep, postscript = set_cs_style (postscript, 'cs2');
else
sep, postscript = set_cs_style (postscript, 'cs1');
end
if cfg.keywords_xlate[postscript:lower()] == 'none' then
-- emit a maintenance message if user postscript is the default cs2 postscript
-- we catch the opposite case for cs1 in set_cs_style
if 'cs2' == mode or ('cs1' ~= mode and 'citation' == cite_class) then -- {{citation |title=Title |mode=cs1 |postscript=none}} should not emit maint message
utilities.set_message ('maint_postscript');
end
postscript = '';
end
return sep, postscript
end
--[=[-------------------------< I S _ P D F >-----------------------------------
Determines if a URL has the file extension that is one of the PDF file extensions
used by [[MediaWiki:Common.css]] when applying the PDF icon to external links.
returns true if file extension is one of the recognized extensions, else false
]=]
local function is_pdf (url)
return url:match ('%.pdf$') or url:match ('%.PDF$') or
url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]') or
url:match ('%.PDF#') or url:match ('%.pdf#');
end
--[[--------------------------< S T Y L E _ F O R M A T >-----------------------
Applies CSS style to |format=, |chapter-format=, etc. Also emits an error message
if the format parameter does not have a matching URL parameter. If the format parameter
is not set and the URL contains a file extension that is recognized as a PDF document
by MediaWiki's commons.css, this code will set the format parameter to (PDF) with
the appropriate styling.
]]
local function style_format (format, url, fmt_param, url_param)
if utilities.is_set (format) then
format = utilities.wrap_style ('format', format); -- add leading space, parentheses, resize
if not utilities.is_set (url) then
utilities.set_message ('err_format_missing_url', {fmt_param, url_param}); -- add an error message
end
elseif is_pdf (url) then -- format is not set so if URL is a PDF file then
format = utilities.wrap_style ('format', 'PDF'); -- set format to PDF
else
format = ''; -- empty string for concatenation
end
return format;
end
--[[---------------------< G E T _ D I S P L A Y _ N A M E S >------------------
Returns a number that defines the number of names displayed for author and editor
name lists and a Boolean flag to indicate when et al. should be appended to the name list.
When the value assigned to |display-xxxxors= is a number greater than or equal to zero,
return the number and the previous state of the 'etal' flag (false by default
but may have been set to true if the name list contains some variant of the text 'et al.').
When the value assigned to |display-xxxxors= is the keyword 'etal', return a number
that is one greater than the number of authors in the list and set the 'etal' flag true.
This will cause the list_people() to display all of the names in the name list followed by 'et al.'
In all other cases, returns nil and the previous state of the 'etal' flag.
inputs:
max: A['DisplayAuthors'] or A['DisplayEditors'], etc; a number or some flavor of etal
count: #a or #e
list_name: 'authors' or 'editors'
etal: author_etal or editor_etal
This function sets an error message when |display-xxxxors= value greater than or equal to number of names but
not when <max> comes from {{cs1 config}} global settings. When using global settings, <param> is set to the
keyword 'cs1 config' which is used to supress the normal error. Error is suppressed because it is to be expected
that some citations in an article will have the same or fewer names that the limit specified in {{cs1 config}}.
]]
local function get_display_names (max, count, etal, param)
if utilities.is_set (max) then
if 'etal' == cfg.keywords_xlate[max:lower():gsub("[ '%.]", '')] then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
max = count + 1; -- number of authors + 1 so display all author name plus et al.
etal = true; -- overrides value set by extract_names()
elseif max:match ('^%d+$') then -- if is a string of numbers
max = tonumber (max); -- make it a number
if (max >= count) and ('cs1 config' ~= param) then -- error when local |display-xxxxors= value greater than or equal to number of names; not an error when using global setting
utilities.set_message ('err_disp_name', {param, max}); -- add error message
max = nil;
end
else -- not a valid keyword or number
utilities.set_message ('err_disp_name', {param, max}); -- add error message
max = nil; -- unset; as if |display-xxxxors= had not been set
end
end
return max, etal;
end
--[[----------< E X T R A _ T E X T _ I N _ P A G E _ C H E C K >---------------
Adds error if |page=, |pages=, |quote-page=, |quote-pages= has what appears to be
some form of p. or pp. abbreviation in the first characters of the parameter content.
check page for extraneous p, p., pp, pp., pg, pg. at start of parameter value:
good pattern: '^P[^%.P%l]' matches when page begins PX or P# but not Px
where x and X are letters and # is a digit
bad pattern: '^[Pp][PpGg]' matches when page begins pp, pP, Pp, PP, pg, pG, Pg, PG
]]
local function extra_text_in_page_check (val, name)
if not val:match (cfg.vol_iss_pg_patterns.good_ppattern) then
for _, pattern in ipairs (cfg.vol_iss_pg_patterns.bad_ppatterns) do -- spin through the selected sequence table of patterns
if val:match (pattern) then -- when a match, error so
utilities.set_message ('err_extra_text_pages', name); -- add error message
return; -- and done
end
end
end
end
--[[--------------------------< E X T R A _ T E X T _ I N _ V O L _ I S S _ C H E C K >------------------------
Adds error if |volume= or |issue= has what appears to be some form of redundant 'type' indicator. Applies to
both; this function looks for issue text in both |issue= and |volume= and looks for volume-like text in |voluem=
and |issue=.
For |volume=:
'V.', or 'Vol.' (with or without the dot) abbreviations or 'Volume' in the first characters of the parameter
content (all case insensitive). 'V' and 'v' (without the dot) are presumed to be roman numerals so
are allowed.
For |issue=:
'No.', 'I.', 'Iss.' (with or without the dot) abbreviations, or 'Issue' in the first characters of the
parameter content (all case insensitive); numero styling: 'n°' with degree sign U+00B0, and № precomposed
numero sign U+2116.
Single character values ('v', 'i', 'n') allowed when not followed by separator character ('.', ':', '=', or
whitespace character) – param values are trimmed of whitespace by MediaWiki before delivered to the module.
<val> is |volume= or |issue= parameter value
<name> is |volume= or |issue= parameter name for error message
<selector> is 'v' for |volume=, 'i' for |issue=
sets error message on failure; returns nothing
]]
local function extra_text_in_vol_iss_check (val, name, selector)
if not utilities.is_set (val) then
return;
end
local handler = 'v' == selector and 'err_extra_text_volume' or 'err_extra_text_issue';
local accept_val; -- for now, ignore linter warning
val, accept_val = utilities.has_accept_as_written (val);
--if accept_val then -- if uncomment this, |volume=((vol. 1)) suppresses error
-- return;
--end
--val = mw.text.unstripNoWiki (val); -- if uncomment this, |volume=<nowiki>vol. 1</nowiki> shows error
val = val:lower(); -- force parameter value to lower case
for _, pattern in ipairs (cfg.vol_iss_pg_patterns.vi_patterns_t) do -- spin through the sequence table of patterns
if val:match (pattern) then -- when a match, error so
utilities.set_message (handler, name); -- add error message
return; -- and done
end
end
end
--[=[-------------------------< G E T _ V _ N A M E _ T A B L E >----------------------------------------------
split apart a |vauthors= or |veditors= parameter. This function allows for corporate names, wrapped in doubled
parentheses to also have commas; in the old version of the code, the doubled parentheses were included in the
rendered citation and in the metadata. Individual author names may be wikilinked
|vauthors=Jones AB, [[E. B. White|White EB]], ((Black, Brown, and Co.))
]=]
local function get_v_name_table (vparam, output_table, output_link_table)
local _, accept = utilities.has_accept_as_written (vparam);
if accept then
utilities.add_prop_cat ('vanc-accept'); -- add properties category
end
local name_table = mw.text.split(vparam, "%s*,%s*"); -- names are separated by commas
local wl_type, label, link; -- wl_type not used here; just a placeholder
local i = 1;
while name_table[i] do
if name_table[i]:match ('^%(%(.*[^%)][^%)]$') then -- first segment of corporate with one or more commas; this segment has the opening doubled parentheses
local name = name_table[i];
i = i + 1; -- bump indexer to next segment
while name_table[i] do
name = name .. ', ' .. name_table[i]; -- concatenate with previous segments
if name_table[i]:match ('^.*%)%)$') then -- if this table member has the closing doubled parentheses
break; -- and done reassembling so
end
i = i + 1; -- bump indexer
end
table.insert (output_table, name); -- and add corporate name to the output table
table.insert (output_link_table, ''); -- no wikilink
else
wl_type, label, link = utilities.is_wikilink (name_table[i]); -- wl_type is: 0, no wl (text in label variable); 1, [[D]]; 2, [[L|D]]
table.insert (output_table, label); -- add this name
if 1 == wl_type then
table.insert (output_link_table, label); -- simple wikilink [[D]]
else
table.insert (output_link_table, link); -- no wikilink or [[L|D]]; add this link if there is one, else empty string
end
end
i = i + 1;
end
return output_table;
end
--[[--------------------------< P A R S E _ V A U T H O R S _ V E D I T O R S >--------------------------------
This function extracts author / editor names from |vauthors= or |veditors= and finds matching |xxxxor-maskn= and
|xxxxor-linkn= in args. It then returns a table of assembled names just as extract_names() does.
Author / editor names in |vauthors= or |veditors= must be in Vancouver system style. Corporate or institutional names
may sometimes be required and because such names will often fail the is_good_vanc_name() and other format compliance
tests, are wrapped in doubled parentheses ((corporate name)) to suppress the format tests.
Supports generational suffixes Jr, 2nd, 3rd, 4th–6th.
This function sets the Vancouver error when a required comma is missing and when there is a space between an author's initials.
]]
local function parse_vauthors_veditors (args, vparam, list_name)
local names = {}; -- table of names assembled from |vauthors=, |author-maskn=, |author-linkn=
local v_name_table = {};
local v_link_table = {}; -- when name is wikilinked, targets go in this table
local etal = false; -- return value set to true when we find some form of et al. vauthors parameter
local last, first, link, mask, suffix;
local corporate = false;
vparam, etal = name_has_etal (vparam, etal, true); -- find and remove variations on et al. do not categorize (do it here because et al. might have a period)
v_name_table = get_v_name_table (vparam, v_name_table, v_link_table); -- names are separated by commas
for i, v_name in ipairs(v_name_table) do
first = ''; -- set to empty string for concatenation and because it may have been set for previous author/editor
local accept_name;
v_name, accept_name = utilities.has_accept_as_written (v_name); -- remove accept-this-as-written markup when it wraps all of <v_name>
if accept_name then
last = v_name;
corporate = true; -- flag used in list_people()
elseif string.find(v_name, "%s") then
if v_name:find('[;%.]') then -- look for commonly occurring punctuation characters;
add_vanc_error (cfg.err_msg_supl.punctuation, i);
end
local lastfirst_t = mw.text.split(v_name, "%s+");
first = table.remove (lastfirst_t); -- removes and returns value of last element in table which should be initials or generational suffix
if not mw.ustring.match (first, '^%u+$') then -- mw.ustring here so that later we will catch non-Latin characters
suffix = first; -- not initials so assume that whatever we got is a generational suffix
first = table.remove (lastfirst_t); -- get what should be the initials from the table
end
last = table.concat (lastfirst_t, ' '); -- returns a string that is the concatenation of all other names that are not initials and generational suffix
if not utilities.is_set (last) then
first = ''; -- unset
last = v_name; -- last empty because something wrong with first
add_vanc_error (cfg.err_msg_supl.name, i);
end
if mw.ustring.match (last, '%a+%s+%u+%s+%a+') then
add_vanc_error (cfg.err_msg_supl['missing comma'], i); -- matches last II last; the case when a comma is missing
end
if mw.ustring.match (v_name, ' %u %u$') then -- this test is in the wrong place TODO: move or replace with a more appropriate test
add_vanc_error (cfg.err_msg_supl.initials, i); -- matches a space between two initials
end
else
last = v_name; -- last name or single corporate name? Doesn't support multiword corporate names? do we need this?
end
if utilities.is_set (first) then
if not mw.ustring.match (first, "^%u?%u$") then -- first shall contain one or two upper-case letters, nothing else
add_vanc_error (cfg.err_msg_supl.initials, i); -- too many initials; mixed case initials (which may be ok Romanization); hyphenated initials
end
is_good_vanc_name (last, first, suffix, i); -- check first and last before restoring the suffix which may have a non-Latin digit
if utilities.is_set (suffix) then
first = first .. ' ' .. suffix; -- if there was a suffix concatenate with the initials
suffix = ''; -- unset so we don't add this suffix to all subsequent names
end
else
if not corporate then
is_good_vanc_name (last, '', nil, i);
end
end
link = utilities.select_one ( args, cfg.aliases[list_name .. '-Link'], 'err_redundant_parameters', i ) or v_link_table[i];
mask = utilities.select_one ( args, cfg.aliases[list_name .. '-Mask'], 'err_redundant_parameters', i );
names[i] = {last = last, first = first, link = link, mask = mask, corporate = corporate}; -- add this assembled name to our names list
end
return names, etal; -- all done, return our list of names
end
--[[--------------------------< S E L E C T _ A U T H O R _ E D I T O R _ S O U R C E >------------------------
Select one of |authors=, |authorn= / |lastn / firstn=, or |vauthors= as the source of the author name list or
select one of |editorn= / editor-lastn= / |editor-firstn= or |veditors= as the source of the editor name list.
Only one of these appropriate three will be used. The hierarchy is: |authorn= (and aliases) highest and |authors= lowest;
|editorn= (and aliases) highest and |veditors= lowest (support for |editors= withdrawn)
When looking for |authorn= / |editorn= parameters, test |xxxxor1= and |xxxxor2= (and all of their aliases); stops after the second
test which mimicks the test used in extract_names() when looking for a hole in the author name list. There may be a better
way to do this, I just haven't discovered what that way is.
Emits an error message when more than one xxxxor name source is provided.
In this function, vxxxxors = vauthors or veditors; xxxxors = authors as appropriate.
]]
local function select_author_editor_source (vxxxxors, xxxxors, args, list_name)
local lastfirst = false;
if utilities.select_one ( args, cfg.aliases[list_name .. '-Last'], 'none', 1 ) or -- do this twice in case we have a |first1= without a |last1=; this ...
utilities.select_one ( args, cfg.aliases[list_name .. '-First'], 'none', 1 ) or -- ... also catches the case where |first= is used with |vauthors=
utilities.select_one ( args, cfg.aliases[list_name .. '-Last'], 'none', 2 ) or
utilities.select_one ( args, cfg.aliases[list_name .. '-First'], 'none', 2 ) then
lastfirst = true;
end
if (utilities.is_set (vxxxxors) and true == lastfirst) or -- these are the three error conditions
(utilities.is_set (vxxxxors) and utilities.is_set (xxxxors)) or
(true == lastfirst and utilities.is_set (xxxxors)) then
utilities.set_message ('err_redundant_parameters',
utilities.substitute (cfg.special_case_translation.name_list_params,
('AuthorList' == list_name) and cfg.special_case_translation.author or cfg.special_case_translation.editor)); -- add error message
end
if true == lastfirst then return 1 end; -- return a number indicating which author name source to use
if utilities.is_set (vxxxxors) then return 2 end;
if utilities.is_set (xxxxors) then return 3 end;
return 1; -- no authors so return 1; this allows missing author name test to run in case there is a first without last
end
--[[--------------------------< I S _ V A L I D _ P A R A M E T E R _ V A L U E >------------------------------
This function is used to validate a parameter's assigned value for those parameters that have only a limited number
of allowable values (yes, y, true, live, dead, etc.). When the parameter value has not been assigned a value (missing
or empty in the source template) the function returns the value specified by ret_val. If the parameter value is one
of the list of allowed values returns the translated value; else, emits an error message and returns the value
specified by ret_val.
TODO: explain <invert>
]]
local function is_valid_parameter_value (value, name, possible, ret_val, invert)
if not utilities.is_set (value) then
return ret_val; -- an empty parameter is ok
end
if (not invert and utilities.in_array (value, possible)) then -- normal; <value> is in <possible> table
return cfg.keywords_xlate[value]; -- return translation of parameter keyword
elseif invert and not utilities.in_array (value, possible) then -- invert; <value> is not in <possible> table
return value; -- return <value> as it is
else
utilities.set_message ('err_invalid_param_val', {name, value}); -- not an allowed value so add error message
return ret_val;
end
end
--[[--------------------------< T E R M I N A T E _ N A M E _ L I S T >----------------------------------------
This function terminates a name list (author, contributor, editor) with a separator character (sepc) and a space
when the last character is not a sepc character or when the last three characters are not sepc followed by two
closing square brackets (close of a wikilink). When either of these is true, the name_list is terminated with a
single space character.
]]
local function terminate_name_list (name_list, sepc)
if (string.sub (name_list, -3, -1) == sepc .. '. ') then -- if already properly terminated
return name_list; -- just return the name list
elseif (string.sub (name_list, -1, -1) == sepc) or (string.sub (name_list, -3, -1) == sepc .. ']]') then -- if last name in list ends with sepc char
return name_list .. " "; -- don't add another
else
return name_list .. sepc .. ' '; -- otherwise terminate the name list
end
end
--[[-------------------------< F O R M A T _ V O L U M E _ I S S U E >-----------------------------------------
returns the concatenation of the formatted volume and issue (or journal article number) parameters as a single
string; or formatted volume or formatted issue, or an empty string if neither are set.
]]
local function format_volume_issue (volume, issue, article, cite_class, origin, script_origin, sepc, lower)
if not utilities.is_set (volume) and not utilities.is_set (issue) and not utilities.is_set (article) then
return '';
end
-- same condition as in format_pages_sheets()
local is_journal = 'journal' == cite_class or (utilities.in_array (cite_class, {'citation', 'map', 'interview'}) and ('journal' == origin or 'script-journal' == script_origin));
local is_numeric_vol = volume and (volume:match ('^[MDCLXVI]+$') or volume:match ('^%d+$')); -- is only uppercase roman numerals or only digits?
local is_long_vol = volume and (4 < mw.ustring.len(volume)); -- is |volume= value longer than 4 characters?
if volume and (not is_numeric_vol and is_long_vol) then -- when not all digits or Roman numerals, is |volume= longer than 4 characters?
utilities.add_prop_cat ('long-vol'); -- yes, add properties cat
end
if is_journal then -- journal-style formatting
local vol = '';
if utilities.is_set (volume) then
if is_numeric_vol then -- |volume= value all digits or all uppercase Roman numerals?
vol = utilities.substitute (cfg.presentation['vol-bold'], {sepc, volume}); -- render in bold face
elseif is_long_vol then -- not all digits or Roman numerals; longer than 4 characters?
vol = utilities.substitute (cfg.messages['j-vol'], {sepc, utilities.hyphen_to_dash (volume)}); -- not bold
else -- four or fewer characters
vol = utilities.substitute (cfg.presentation['vol-bold'], {sepc, utilities.hyphen_to_dash (volume)}); -- bold
end
end
vol = vol .. (utilities.is_set (issue) and utilities.substitute (cfg.messages['j-issue'], issue) or '')
vol = vol .. (utilities.is_set (article) and utilities.substitute (cfg.messages['j-article-num'], article) or '')
return vol;
end
if 'podcast' == cite_class and utilities.is_set (issue) then
return wrap_msg ('issue', {sepc, issue}, lower);
end
if 'conference' == cite_class and utilities.is_set (article) then -- |article-number= supported only in journal and conference cites
if utilities.is_set (volume) and utilities.is_set (article) then -- both volume and article number
return wrap_msg ('vol-art', {sepc, utilities.hyphen_to_dash (volume), article}, lower);
elseif utilities.is_set (article) then -- article number alone; when volume alone, handled below
return wrap_msg ('art', {sepc, article}, lower);
end
end
-- all other types of citation
if utilities.is_set (volume) and utilities.is_set (issue) then
return wrap_msg ('vol-no', {sepc, utilities.hyphen_to_dash (volume), issue}, lower);
elseif utilities.is_set (volume) then
return wrap_msg ('vol', {sepc, utilities.hyphen_to_dash (volume)}, lower);
else
return wrap_msg ('issue', {sepc, issue}, lower);
end
end
--[[-------------------------< F O R M A T _ P A G E S _ S H E E T S >-----------------------------------------
adds static text to one of |page(s)= or |sheet(s)= values and returns it with all of the others set to empty strings.
The return order is:
page, pages, sheet, sheets
Singular has priority over plural when both are provided.
]]
local function format_pages_sheets (page, pages, sheet, sheets, cite_class, origin, script_origin, sepc, nopp, lower)
if 'map' == cite_class then -- only cite map supports sheet(s) as in-source locators
if utilities.is_set (sheet) then
if 'journal' == origin or 'script-journal' == script_origin then
return '', '', wrap_msg ('j-sheet', sheet, lower), '';
else
return '', '', wrap_msg ('sheet', {sepc, sheet}, lower), '';
end
elseif utilities.is_set (sheets) then
if 'journal' == origin or 'script-journal' == script_origin then
return '', '', '', wrap_msg ('j-sheets', sheets, lower);
else
return '', '', '', wrap_msg ('sheets', {sepc, sheets}, lower);
end
end
end
local is_journal = 'journal' == cite_class or (utilities.in_array (cite_class, {'citation', 'map', 'interview'}) and ('journal' == origin or 'script-journal' == script_origin));
if utilities.is_set (page) then
if is_journal then
return utilities.substitute (cfg.messages['j-page(s)'], page), '', '', '';
elseif not nopp then
return utilities.substitute (cfg.messages['p-prefix'], {sepc, page}), '', '', '';
else
return utilities.substitute (cfg.messages['nopp'], {sepc, page}), '', '', '';
end
elseif utilities.is_set (pages) then
if is_journal then
return utilities.substitute (cfg.messages['j-page(s)'], pages), '', '', '';
elseif tonumber(pages) ~= nil and not nopp then -- if pages is only digits, assume a single page number
return '', utilities.substitute (cfg.messages['p-prefix'], {sepc, pages}), '', '';
elseif not nopp then
return '', utilities.substitute (cfg.messages['pp-prefix'], {sepc, pages}), '', '';
else
return '', utilities.substitute (cfg.messages['nopp'], {sepc, pages}), '', '';
end
end
return '', '', '', ''; -- return empty strings
end
--[[--------------------------< I N S O U R C E _ L O C _ G E T >----------------------------------------------
returns one of the in-source locators: page, pages, or at.
If any of these are interwiki links to Wikisource, returns the label portion of the interwiki-link as plain text
for use in COinS. This COinS thing is done because here we convert an interwiki-link to an external link and
add an icon span around that; get_coins_pages() doesn't know about the span. TODO: should it?
TODO: add support for sheet and sheets?; streamline;
TODO: make it so that this function returns only one of the three as the single in-source (the return value assigned
to a new name)?
]]
local function insource_loc_get (page, page_orig, pages, pages_orig, at)
local ws_url, ws_label, coins_pages, L; -- for Wikisource interwiki-links; TODO: this corrupts page metadata (span remains in place after cleanup; fix there?)
if utilities.is_set (page) then
if utilities.is_set (pages) or utilities.is_set (at) then
pages = ''; -- unset the others
at = '';
end
extra_text_in_page_check (page, page_orig); -- emit error message when |page= value begins with what looks like p., pp., etc.
ws_url, ws_label, L = wikisource_url_make (page); -- make ws URL from |page= interwiki link; link portion L becomes tooltip label
if ws_url then
page = external_link (ws_url, ws_label .. ' ', 'ws link in page'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
page = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, page});
coins_pages = ws_label;
end
elseif utilities.is_set (pages) then
if utilities.is_set (at) then
at = ''; -- unset
end
extra_text_in_page_check (pages, pages_orig); -- emit error message when |page= value begins with what looks like p., pp., etc.
ws_url, ws_label, L = wikisource_url_make (pages); -- make ws URL from |pages= interwiki link; link portion L becomes tooltip label
if ws_url then
pages = external_link (ws_url, ws_label .. ' ', 'ws link in pages'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
pages = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, pages});
coins_pages = ws_label;
end
elseif utilities.is_set (at) then
ws_url, ws_label, L = wikisource_url_make (at); -- make ws URL from |at= interwiki link; link portion L becomes tooltip label
if ws_url then
at = external_link (ws_url, ws_label .. ' ', 'ws link in at'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
at = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, at});
coins_pages = ws_label;
end
end
return page, pages, at, coins_pages;
end
--[[--------------------------< I S _ U N I Q U E _ A R C H I V E _ U R L >------------------------------------
add error message when |archive-url= value is same as |url= or chapter-url= (or alias...) value
]]
local function is_unique_archive_url (archive, url, c_url, source, date)
if utilities.is_set (archive) then
if archive == url or archive == c_url then
utilities.set_message ('err_bad_url', {utilities.wrap_style ('parameter', source)}); -- add error message
return '', ''; -- unset |archive-url= and |archive-date= because same as |url= or |chapter-url=
end
end
return archive, date;
end
--[=[-------------------------< A R C H I V E _ U R L _ C H E C K >--------------------------------------------
Check archive.org URLs to make sure they at least look like they are pointing at valid archives and not to the
save snapshot URL or to calendar pages. When the archive URL is 'https://web.archive.org/save/' (or http://...)
archive.org saves a snapshot of the target page in the URL. That is something that Wikipedia should not allow
unwitting readers to do.
When the archive.org URL does not have a complete timestamp, archive.org chooses a snapshot according to its own
algorithm or provides a calendar 'search' result. [[WP:ELNO]] discourages links to search results.
This function looks at the value assigned to |archive-url= and returns empty strings for |archive-url= and
|archive-date= and an error message when:
|archive-url= holds an archive.org save command URL
|archive-url= is an archive.org URL that does not have a complete timestamp (YYYYMMDDhhmmss 14 digits) in the
correct place
otherwise returns |archive-url= and |archive-date=
There are two mostly compatible archive.org URLs:
//web.archive.org/<timestamp>... -- the old form
//web.archive.org/web/<timestamp>... -- the new form
The old form does not support or map to the new form when it contains a display flag. There are four identified flags
('id_', 'js_', 'cs_', 'im_') but since archive.org ignores others following the same form (two letters and an underscore)
we don't check for these specific flags but we do check the form.
This function supports a preview mode. When the article is rendered in preview mode, this function may return a modified
archive URL:
for save command errors, return undated wildcard (/*/)
for timestamp errors when the timestamp has a wildcard, return the URL unmodified
for timestamp errors when the timestamp does not have a wildcard, return with timestamp limited to six digits plus wildcard (/yyyymm*/)
A secondary function is to return an archive-url timestamp from those archive urls that have them. The timestamp
is used by validation.archive_date_check() to see if the value in |archive-date= matches the timestamp in the
archive url.
]=]
local function archive_url_check (url, date)
local err_msg; -- start with the error message empty
local path, timestamp, flag; -- portions of the archive.org URL
local function is_ts_date_valid (ts, origin_date) -- local function to validate archive url taimestamp date; time ignored
local y, m, d = ts:match ('(%d%d%d%d)(%d%d)(%d%d)'); -- split into parts
if y and validation.is_valid_date (y, m, d) and (tonumber (y) >= 1996) then
return true, tonumber (y) >= origin_date; -- <origin_date> is 1996 for archive.org
end
end
if (not url:match('//web%.archive%.org/')) and (not url:match('//liveweb%.archive%.org/')) then -- also deprecated liveweb Wayback machine URL
return url, date; -- not an archive.org archive, return ArchiveURL and ArchiveDate
end
if url:match('//web%.archive%.org/save/') then -- if a save command URL, we don't want to allow saving of the target page
err_msg = cfg.err_msg_supl.save;
url = url:gsub ('(//web%.archive%.org)/save/', '%1/*/', 1); -- for preview mode: modify ArchiveURL
elseif url:match('//liveweb%.archive%.org/') then
err_msg = cfg.err_msg_supl.liveweb;
else
path, timestamp, flag = url:match('//web%.archive%.org/([^%d]*)(%d+)([^/]*)/'); -- split out some of the URL parts for evaluation
if not path then -- malformed in some way; pattern did not match
err_msg = cfg.err_msg_supl.timestamp;
elseif 14 ~= timestamp:len() then -- path and flag optional, must have 14-digit timestamp here
err_msg = cfg.err_msg_supl.timestamp;
if '*' ~= flag then
local replacement = timestamp:match ('^%d%d%d%d%d%d') or timestamp:match ('^%d%d%d%d'); -- get the first 6 (YYYYMM) or first 4 digits (YYYY)
if replacement then -- nil if there aren't at least 4 digits (year)
replacement = replacement .. string.rep ('0', 14 - replacement:len()); -- year or yearmo (4 or 6 digits) zero-fill to make 14-digit timestamp
url=url:gsub ('(//web%.archive%.org/[^%d]*)%d[^/]*', '%1' .. replacement .. '*', 1) -- for preview, modify ts to 14 digits plus splat for calendar display
end
end
elseif not is_ts_date_valid (timestamp, 1996) then -- is ymd portion of timestamp a valid date?
err_msg = cfg.err_msg_supl.timestamp;
timestamp = nil; -- unset because invalid
elseif utilities.is_set (path) and 'web/' ~= path then -- older archive URLs do not have the extra 'web/' path element
err_msg = cfg.err_msg_supl.path;
elseif utilities.is_set (flag) and not utilities.is_set (path) then -- flag not allowed with the old form URL (without the 'web/' path element)
err_msg = cfg.err_msg_supl.flag;
elseif utilities.is_set (flag) and not flag:match ('%a%a_') then -- flag if present must be two alpha characters and underscore (requires 'web/' path element)
err_msg = cfg.err_msg_supl.flag;
else
return url, date, timestamp; -- return ArchiveURL, ArchiveDate, and timestamp from |archive-url=
end
end
-- if here, something not right so
utilities.set_message ('err_archive_url', {err_msg}); -- add error message and
if is_preview_mode then
return url, date, timestamp; -- preview mode so return ArchiveURL, ArchiveDate, and timestamp from |archive-url=
else
return '', ''; -- return empty strings for ArchiveURL and ArchiveDate
end
end
--[[--------------------------< P L A C E _ C H E C K >--------------------------------------------------------
check |place=, |publication-place=, |location= to see if these params include digits. This function added because
many editors misuse location to specify the in-source location (|page(s)= and |at= are supposed to do that)
returns the original parameter value without modification; added maint cat when parameter value contains digits
]]
local function place_check (param_val)
if not utilities.is_set (param_val) then -- parameter empty or omitted
return param_val; -- return that empty state
end
if mw.ustring.find (param_val, '%d') then -- not empty, are there digits in the parameter value
utilities.set_message ('maint_location'); -- yep, add maint cat
end
return param_val; -- and done
end
--[[--------------------------< I S _ A R C H I V E D _ C O P Y >----------------------------------------------
compares |title= to 'Archived copy' (placeholder added by bots that can't find proper title); if matches, return true; nil else
]]
local function is_archived_copy (title)
title = mw.ustring.lower(title); -- switch title to lower case
if title:find (cfg.special_case_translation.archived_copy.en) then -- if title is 'Archived copy'
return true;
elseif cfg.special_case_translation.archived_copy['local'] then
if mw.ustring.find (title, cfg.special_case_translation.archived_copy['local']) then -- mw.ustring() because might not be Latin script
return true;
end
end
end
--[[--------------------------< D I S P L A Y _ N A M E S _ S E L E C T >--------------------------------------
for any of the |display-authors=, |display-editors=, etc parameters, select either the local or global setting.
When both are present, look at <local_display_names> value. When the value is some sort of 'et al.'string,
special handling is required.
When {{cs1 config}} has |display-<namelist>= AND this template has |display-<namelist>=etal AND:
the number of names specified by <number_of_names> is:
greater than the number specified in the global |display-<namelist>= parameter (<global_display_names>)
use global |display-<namelist>= parameter value
set overridden maint category
less than or equal to the number specified in the global |display-<namelist>= parameter
use local |display-<namelist>= parameter value
The purpose of this function is to prevent categorizing a template that has fewer names than the global setting
to keep the etal annotation specified by <local_display_names>.
]]
local function display_names_select (global_display_names, local_display_names, param_name, number_of_names)
if global_display_names and utilities.is_set (local_display_names) then -- when both
if 'etal' == local_display_names:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
number_of_names = tonumber (number_of_names); -- convert these to numbers for comparison
local global_display_names_num = tonumber (global_display_names); -- <global_display_names> not set when parameter value is not digits
if number_of_names > global_display_names_num then -- template has more names than global config allows to be displayed?
utilities.set_message ('maint_overridden_setting'); -- set a maint message because global is overriding local |display-<namelist>=etal
return global_display_names, 'cs1 config'; -- return global with spoof parameter name (for get_display_names())
else
return local_display_names, param_name; -- return local because fewer names so let <local_display_names> control
end
end
-- here when <global_display_names> and <local_display_names> both numbers; <global_display_names> controls
utilities.set_message ('maint_overridden_setting'); -- set a maint message
return global_display_names, 'cs1 config'; -- return global with spoof parameter name (for get_display_names())
end
-- here when only one of <global_display_names> or <local_display_names> set
if global_display_names then
return global_display_names, 'cs1 config'; -- return global with spoof parameter name (for get_display_names())
else
return local_display_names, param_name; -- return local
end
end
--[[--------------------------< M O D E _ S E T >--------------------------------------------------------------
fetch global mode setting from {{cs1 config}} (if present) or from |mode= (if present); global setting overrides
local |mode= parameter value. When both are present, emit maintenance message
]]
local function mode_set (Mode, Mode_origin)
local mode;
if cfg.global_cs1_config_t['Mode'] then -- global setting in {{cs1 config}}; nil when empty or assigned value invalid
mode = is_valid_parameter_value (cfg.global_cs1_config_t['Mode'], 'cs1 config: mode', cfg.keywords_lists['mode'], ''); -- error messaging 'param' here is a hoax
else
mode = is_valid_parameter_value (Mode, Mode_origin, cfg.keywords_lists['mode'], '');
end
if cfg.global_cs1_config_t['Mode'] and utilities.is_set (Mode) then -- when template has |mode=<something> which global setting has overridden
utilities.set_message ('maint_overridden_setting'); -- set a maint message
end
return mode;
end
--[[--------------------------< Q U O T E _ M A K E >----------------------------------------------------------
create quotation from |quote=, |trans-quote=, and/or script-quote= with or without |quote-page= or |quote-pages=
when any of those three quote parameters are set, this function unsets <PostScript>. When none of those parameters
are set, |quote-page= and |quote-pages= are unset to nil so that they are not included in the template's metadata
]]
local function quote_make (quote, trans_quote, script_quote, quote_page, quote_pages, nopp, sepc, postscript)
if utilities.is_set (quote) or utilities.is_set (trans_quote) or utilities.is_set (script_quote) then
if utilities.is_set (quote) then
if quote:sub(1, 1) == '"' and quote:sub(-1, -1) == '"' then -- if first and last characters of quote are quote marks
quote = quote:sub(2, -2); -- strip them off
end
end
quote = kern_quotes (quote); -- kern if needed
quote = utilities.wrap_style ('quoted-text', quote ); -- wrap in <q>...</q> tags
if utilities.is_set (script_quote) then
quote = script_concatenate (quote, script_quote, 'script-quote'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after quote is wrapped
end
if utilities.is_set (trans_quote) then
if trans_quote:sub(1, 1) == '"' and trans_quote:sub(-1, -1) == '"' then -- if first and last characters of |trans-quote are quote marks
trans_quote = trans_quote:sub(2, -2); -- strip them off
end
quote = quote .. " " .. utilities.wrap_style ('trans-quoted-title', trans_quote );
end
if utilities.is_set (quote_page) or utilities.is_set (quote_pages) then -- add page prefix
local quote_prefix = '';
if utilities.is_set (quote_page) then
extra_text_in_page_check (quote_page, 'quote-page'); -- add to maint cat if |quote-page= value begins with what looks like p., pp., etc.
if not nopp then
quote_prefix = utilities.substitute (cfg.messages['p-prefix'], {sepc, quote_page});
else
quote_prefix = utilities.substitute (cfg.messages['nopp'], {sepc, quote_page});
end
elseif utilities.is_set (quote_pages) then
extra_text_in_page_check (quote_pages, 'quote-pages'); -- add to maint cat if |quote-pages= value begins with what looks like p., pp., etc.
if tonumber(quote_pages) ~= nil and not nopp then -- if only digits, assume single page
quote_prefix = utilities.substitute (cfg.messages['p-prefix'], {sepc, quote_pages});
elseif not nopp then
quote_prefix = utilities.substitute (cfg.messages['pp-prefix'], {sepc, quote_pages});
else
quote_prefix = utilities.substitute (cfg.messages['nopp'], {sepc, quote_pages});
end
end
quote = quote_prefix .. ": " .. quote;
else
quote = sepc .. " " .. quote;
end
postscript = ""; -- cs1|2 does not supply terminal punctuation when |quote= is set
elseif utilities.is_set (quote_page) or utilities.is_set (quote_pages) then
quote_page = nil; -- unset; these require |quote=; TODO: error message?
quote_pages = nil;
end
return quote, quote_page, quote_pages, postscript;
end
--[[--------------------------< C H E C K _ P U B L I S H E R _ N A M E >--------------------------------------
look for variations of '<text>: <text>' that might be '<location>: <publisher>' in |publisher= parameter value.
when found, emit a maintenance message; return nil else
<publisher> is the value assigned to |publisher= or |institution=
]]
local function check_publisher_name (publisher)
local patterns_t = {
'^[%w%s]+%s*:%s*[%w%s]+$', -- plain text <location>: <publisher>
'^%[+[%w%s:|]+%]+%s*:%s*[%w%s]+$', -- partially wikilinked [[<location>]]: <publisher>
'^[%w%s]+%s*:%s*%[+[%w%s:|]+%]+$', -- partially wikilinked <location>: [[<publisher>]]
'^%[+[%w%s:|]+%]+%s*:%s*%[+[%w%s:|]+%]+$', -- wikilinked [[<location>]]: [[<publisher>]]
}
for _, pattern in ipairs (patterns_t) do -- spin through the patterns_t sequence
if mw.ustring.match (publisher, pattern) then -- does this pattern match?
utilities.set_message ('maint_publisher_location'); -- set a maint message
return; -- and done
end
end
end
--[[--------------------------< I S _ P A G E _ A R T _ N U M >------------------------------------------------
compare the trailing (rightmost) characters of the |doi= value against the whole value assigned to |page(s)=.
return boolean true when:
|page(s)= has exactly 8 digits and a dot between the fourth and fifth digits matches the trailing 9 characters
of the |doi= value: |page=12345678 → |page=1234.5678 matches |doi=10.xxxx/yyyy1234.5678
|page(s)= is 5 or more characters and matches |doi= values's trailing characters
|page(s)= begins with a lowercase 'e' and |page(s)= without the 'e' matches |doi= values's trailing
characters: |page=e12345 → |page=12345 matches |doi=10.xxxx/yyyy12345
|page(s)= begins with a uppercase 'CD' followed by (typically) six digits matches |doi= values that ends with
'CDxxxxxx.pubx' (where 'x' is any single digit)
return nil when |page(s)= values:
are ranges separated by underscore, hyphen, emdash, endash, figure dash, or minus character
are comma- or semicolon-separated lists of pages
have external urls (has text 'http')
are digit-only values less than 10000
do not match |doi= values's trailing characters
]]
local function is_page_art_num (page, doi)
if not (utilities.is_set (page) and utilities.is_set (doi)) then -- both required
return; -- abandon; nothing to do
end
if page:match ('[,;_−–—‒%-]') then -- when |page(s)= might be a page range or a separated list of pages
return; -- abandon
end
page = page:lower(); -- because doi names are case insensitive
doi = doi:lower(); -- force these to lowercase for testing
if page:match ('http') then -- when |page(s)= appears to hold a url
return; -- abandon
end
if tonumber (page) then -- is |page(s)= digits only
if 10000 > tonumber (page) then -- when |page(s)= less than 10000
return; -- abandon
end
if doi:match (page .. '$') then -- digits only page number match the last digits in |doi=?
return true;
end
if 8 == page:len() then -- special case when |page(s)= is exactly 8 digits
local dot_page = page:gsub ('(%d%d%d%d)(%d%d%d%d)', '%1.%2'); -- make a |page=xxxx.yyyy version commonly used in |doi=
if doi:match (dot_page .. '$') then -- 8-digit dotted page number match the last characters in |doi=?
return true;
end
end
else -- here when |page(s)= is alpha-numeric
if 4 < page:len() then -- when |page(s)= is five or more characters
if doi:match (page .. '$') then -- alpha-numeric page match the last characters in |doi=?
return true;
end
local epage = page:match ('^e([%w]+)$'); -- if first character of |page= is 'e', remove it
if epage and doi:match (epage .. '$') then -- page number match the last characters in |doi=?
return true;
end
local cdpage = page:match ('^cd%d+$'); -- if first characters of |page= are 'CD' and last characters are digits (typically 6 digits)
if cdpage and doi:match (cdpage .. '%.pub%d$') then -- page number matches doi 'CDxxxxxx.pubx' where 'x' is a digit
return true;
end
end
end
end
--[[--------------------------< C I T A T I O N 0 >------------------------------------------------------------
This is the main function doing the majority of the citation formatting.
]]
local function citation0( config, args )
--[[
Load Input Parameters
The argument_wrapper facilitates the mapping of multiple aliases to single internal variable.
]]
local A = argument_wrapper ( args );
-- Pick out the relevant fields from the arguments. Different citation templates
-- define different field names for the same underlying things.
local author_etal;
local a = {}; -- authors list from |lastn= / |firstn= pairs or |vauthors=
local Authors;
local NameListStyle;
if cfg.global_cs1_config_t['NameListStyle'] then -- global setting in {{cs1 config}} overrides local |name-list-style= parameter value; nil when empty or assigned value invalid
NameListStyle = is_valid_parameter_value (cfg.global_cs1_config_t['NameListStyle'], 'cs1 config: name-list-style', cfg.keywords_lists['name-list-style'], ''); -- error messaging 'param' here is a hoax
else
NameListStyle = is_valid_parameter_value (A['NameListStyle'], A:ORIGIN('NameListStyle'), cfg.keywords_lists['name-list-style'], '');
end
if cfg.global_cs1_config_t['NameListStyle'] and utilities.is_set (A['NameListStyle']) then -- when template has |name-list-style=<something> which global setting has overridden
utilities.set_message ('maint_overridden_setting'); -- set a maint message
end
local Collaboration = A['Collaboration'];
do -- to limit scope of selected
local selected = select_author_editor_source (A['Vauthors'], A['Authors'], args, 'AuthorList');
if 1 == selected then
a, author_etal = extract_names (args, 'AuthorList'); -- fetch author list from |authorn= / |lastn= / |firstn=, |author-linkn=, and |author-maskn=
elseif 2 == selected then
NameListStyle = 'vanc'; -- override whatever |name-list-style= might be
a, author_etal = parse_vauthors_veditors (args, A['Vauthors'], 'AuthorList'); -- fetch author list from |vauthors=, |author-linkn=, and |author-maskn=
elseif 3 == selected then
Authors = A['Authors']; -- use content of |people= or |credits=; |authors= is deprecated; TODO: constrain |people= and |credits= to cite av media, episode, serial?
end
if utilities.is_set (Collaboration) then
author_etal = true; -- so that |display-authors=etal not required
end
end
local editor_etal;
local e = {}; -- editors list from |editor-lastn= / |editor-firstn= pairs or |veditors=
do -- to limit scope of selected
local selected = select_author_editor_source (A['Veditors'], nil, args, 'EditorList'); -- support for |editors= withdrawn
if 1 == selected then
e, editor_etal = extract_names (args, 'EditorList'); -- fetch editor list from |editorn= / |editor-lastn= / |editor-firstn=, |editor-linkn=, and |editor-maskn=
elseif 2 == selected then
NameListStyle = 'vanc'; -- override whatever |name-list-style= might be
e, editor_etal = parse_vauthors_veditors (args, args.veditors, 'EditorList'); -- fetch editor list from |veditors=, |editor-linkn=, and |editor-maskn=
end
end
local Chapter = A['Chapter']; -- done here so that we have access to |contribution= from |chapter= and |script-chapter= aliases
local Chapter_origin = A:ORIGIN ('Chapter');
local ScriptChapter = A['ScriptChapter'];
local ScriptChapter_origin = A:ORIGIN ('ScriptChapter');
local Contribution; -- because contribution is required for contributor(s)
if 'contribution' == Chapter_origin then -- is there a |contribution= parameter?
Contribution = Chapter; -- get the name of the contribution
elseif 'script-contribution' == ScriptChapter_origin then -- no, so is there a |script-contribution= parameter?
Contribution = ScriptChapter; -- get the name of the contribution
end
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
if utilities.in_array (config.CitationClass, {"book", "citation"}) and not (utilities.is_set (A['Periodical']) or utilities.is_set (A['ScriptPeriodical'])) then -- |contributor= and |contribution= only supported in book cites
c = extract_names (args, 'ContributorList'); -- fetch contributor list from |contributorn= / |contributor-lastn=, -firstn=, -linkn=, -maskn=
if 0 < #c then
if not utilities.is_set (Contribution) then -- |contributor= requires |contribution=
utilities.set_message ('err_contributor_missing_required_param', 'contribution'); -- add missing contribution error message
c = {}; -- blank the contributors' table; it is used as a flag later
end
if 0 == #a then -- |contributor= requires |author=
utilities.set_message ('err_contributor_missing_required_param', 'author'); -- add missing author error message
c = {}; -- blank the contributors' table; it is used as a flag later
end
end
else -- if not a book cite
if utilities.select_one (args, cfg.aliases['ContributorList-Last'], 'err_redundant_parameters', 1 ) then -- are there contributor name list parameters?
utilities.set_message ('err_contributor_ignored'); -- add contributor ignored error message
end
Contribution = nil; -- unset
end
local Title = A['Title'];
local TitleLink = A['TitleLink'];
local auto_select = ''; -- default is auto
local accept_link;
TitleLink, accept_link = utilities.has_accept_as_written (TitleLink, true); -- test for accept-this-as-written markup
if (not accept_link) and utilities.in_array (TitleLink, {'none', 'pmc', 'doi'}) then -- check for special keywords
auto_select = TitleLink; -- remember selection for later
TitleLink = ''; -- treat as if |title-link= would have been empty
end
TitleLink = link_title_ok (TitleLink, A:ORIGIN ('TitleLink'), Title, 'title'); -- check for wiki-markup in |title-link= or wiki-markup in |title= when |title-link= is set
local Section = ''; -- {{cite map}} only; preset to empty string for concatenation if not used
if 'map' == config.CitationClass and 'section' == Chapter_origin then
Section = A['Chapter']; -- get |section= from |chapter= alias list; |chapter= and the other aliases not supported in {{cite map}}
Chapter = ''; -- unset for now; will be reset later from |map= if present
end
local Periodical = A['Periodical'];
local Periodical_origin = A:ORIGIN('Periodical');
local ScriptPeriodical = A['ScriptPeriodical'];
local ScriptPeriodical_origin = A:ORIGIN('ScriptPeriodical');
local TransPeriodical = A['TransPeriodical'];
local TransPeriodical_origin = A:ORIGIN ('TransPeriodical');
local Encyclopedia = A['Encyclopedia']; -- used as a flag by this module and by ~/COinS
local ScriptEncyclopedia = A['ScriptEncyclopedia'];
local TransEncyclopedia = A['TransEncyclopedia'];
if (utilities.in_array (config.CitationClass, {'book', 'encyclopaedia'}) or ('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))))
and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical) or utilities.is_set (TransPeriodical)) then
local param;
if utilities.is_set (Periodical) then -- get a parameter name from one of these periodical related meta-parameters
Periodical = ''; -- unset because not valid {{cite book}} or {{cite encyclopedia}} parameters
param = Periodical_origin -- get parameter name for error messaging
elseif utilities.is_set (TransPeriodical) then
TransPeriodical = ''; -- unset because not valid {{cite book}} or {{cite encyclopedia}} parameters
param = TransPeriodical_origin; -- get parameter name for error messaging
elseif utilities.is_set (ScriptPeriodical) then
ScriptPeriodical = ''; -- unset because not valid {{cite book}} or {{cite encyclopedia}} parameters
param = ScriptPeriodical_origin; -- get parameter name for error messaging
end
if utilities.is_set (param) then -- if we found one
utilities.set_message ('err_periodical_ignored', {param}); -- emit an error message
end
end
if utilities.is_set (Periodical) then
local i;
Periodical, i = utilities.strip_apostrophe_markup (Periodical); -- strip apostrophe markup so that metadata isn't contaminated
if i then -- non-zero when markup was stripped so emit an error message
utilities.set_message ('err_apostrophe_markup', {Periodical_origin});
end
end
if 'mailinglist' == config.CitationClass then -- special case for {{cite mailing list}}
if utilities.is_set (A ['MailingList']) then
if utilities.is_set (Periodical) then -- both set emit an error TODO: make a function for this and similar?
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', Periodical_origin) .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'mailinglist')});
end
Periodical = A ['MailingList']; -- error or no, set Periodical to |mailinglist= value because this template is {{cite mailing list}}
Periodical_origin = A:ORIGIN('MailingList');
end
end
-- web and news not tested for now because of
-- Wikipedia:Administrators%27_noticeboard#Is_there_a_semi-automated_tool_that_could_fix_these_annoying_"Cite_Web"_errors?
if not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) then -- 'periodical' templates require periodical parameter
-- local p = {['journal'] = 'journal', ['magazine'] = 'magazine', ['news'] = 'newspaper', ['web'] = 'website'}; -- for error message
local p = {['journal'] = 'journal', ['magazine'] = 'magazine'}; -- for error message
if p[config.CitationClass] then
utilities.set_message ('err_missing_periodical', {config.CitationClass, p[config.CitationClass]});
end
end
local Volume;
if 'citation' == config.CitationClass then
if utilities.is_set (Periodical) then
if not utilities.in_array (Periodical_origin, cfg.citation_no_volume_t) then -- {{citation}} does not render |volume= when these parameters are used
Volume = A['Volume']; -- but does for all other 'periodicals'
end
elseif utilities.is_set (ScriptPeriodical) then
if 'script-website' ~= ScriptPeriodical_origin then -- {{citation}} does not render volume for |script-website=
Volume = A['Volume']; -- but does for all other 'periodicals'
end
else
Volume = A['Volume']; -- and does for non-'periodical' cites
end
elseif utilities.in_array (config.CitationClass, cfg.templates_using_volume) then -- render |volume= for cs1 according to the configuration settings
Volume = A['Volume'];
end
extra_text_in_vol_iss_check (Volume, A:ORIGIN ('Volume'), 'v');
local Issue;
if 'citation' == config.CitationClass then
if utilities.is_set (Periodical) and utilities.in_array (Periodical_origin, cfg.citation_issue_t) then -- {{citation}} may render |issue= when these parameters are used
Issue = A['Issue'];
elseif utilities.is_set (ScriptPeriodical) and utilities.in_array (ScriptPeriodical_origin, cfg.citation_issue_t) then
Issue = A['Issue'];
end
elseif utilities.in_array (config.CitationClass, cfg.templates_using_issue) then -- conference & map books do not support issue; {{citation}} listed here because included in settings table
if not (utilities.in_array (config.CitationClass, {'conference', 'map', 'citation'}) and not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical))) then
Issue = A['Issue'];
end
end
local ArticleNumber;
if utilities.in_array (config.CitationClass, {'journal', 'conference'})
or ('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and ('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin)) then
ArticleNumber = A['ArticleNumber'];
else
local param_orig = A:ORIGIN ('ArticleNumber');
if utilities.is_set (param_orig) then -- when |article-number= set
utilities.set_message ('err_parameter_ignored', {param_orig}); -- emit an ignored parameter error message
end
end
extra_text_in_vol_iss_check (Issue, A:ORIGIN ('Issue'), 'i');
Issue = utilities.hyphen_to_dash (Issue);
local Page;
local Pages;
local At;
local QuotePage;
local QuotePages;
if not utilities.in_array (config.CitationClass, cfg.templates_not_using_page) then
Page = A['Page'];
Pages = utilities.hyphen_to_dash (A['Pages']);
At = A['At'];
QuotePage = A['QuotePage'];
QuotePages = utilities.hyphen_to_dash (A['QuotePages']);
else
local param_orig = first_set ({A:ORIGIN ('Page'), A:ORIGIN ('Pages'), A:ORIGIN ('At'), A:ORIGIN ('QuotePage'), A:ORIGIN ('QuotePages')}, 5);
if param_orig then -- when any of the in-source locator params are set
utilities.set_message ('err_parameter_ignored', {param_orig}); -- emit an ignored parameter error message
end
end
local NoPP = is_valid_parameter_value (A['NoPP'], A:ORIGIN('NoPP'), cfg.keywords_lists['yes_true_y'], nil);
local Mode = mode_set (A['Mode'], A:ORIGIN('Mode'));
-- separator character and postscript
local sepc, PostScript = set_style (Mode:lower(), A['PostScript'], config.CitationClass);
local Quote;
Quote, QuotePage, QuotePages, PostScript = quote_make (A['Quote'], A['TransQuote'], A['ScriptQuote'], QuotePage, QuotePages, NoPP, sepc, PostScript);
local Edition = A['Edition'];
local PublicationPlace = place_check (A['PublicationPlace'], A:ORIGIN('PublicationPlace'));
local PublisherName = A['PublisherName'];
local PublisherName_origin = A:ORIGIN('PublisherName');
if utilities.is_set (PublisherName) and (cfg.keywords_xlate['none'] ~= PublisherName) then
local i;
PublisherName, i = utilities.strip_apostrophe_markup (PublisherName); -- strip apostrophe markup so that metadata isn't contaminated; publisher is never italicized
if i and (0 < i) then -- non-zero when markup was stripped so emit an error message
utilities.set_message ('err_apostrophe_markup', {PublisherName_origin});
end
end
if ('document' == config.CitationClass) and not utilities.is_set (PublisherName) then
utilities.set_message ('err_missing_publisher', {config.CitationClass, 'publisher'});
end
local Newsgroup = A['Newsgroup']; -- TODO: strip apostrophe markup?
local Newsgroup_origin = A:ORIGIN('Newsgroup');
if 'newsgroup' == config.CitationClass then
if utilities.is_set (PublisherName) and (cfg.keywords_xlate['none'] ~= PublisherName) then -- general use parameter |publisher= not allowed in cite newsgroup
utilities.set_message ('err_parameter_ignored', {PublisherName_origin});
end
PublisherName = nil; -- ensure that this parameter is unset for the time being; will be used again after COinS
end
if 'book' == config.CitationClass or 'encyclopaedia' == config.CitationClass or ('citation' == config.CitationClass and not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical))) then
local accept;
PublisherName, accept = utilities.has_accept_as_written (PublisherName); -- check for and remove accept-as-written markup from |publisher= wrapped
if not accept then -- when no accept-as-written markup
check_publisher_name (PublisherName); -- emit maint message when |publisher= might be prefixed with publisher's location
end
end
local URL = A['URL']; -- TODO: better way to do this for URL, ChapterURL, and MapURL?
local UrlAccess = is_valid_parameter_value (A['UrlAccess'], A:ORIGIN('UrlAccess'), cfg.keywords_lists['url-access'], nil);
if not utilities.is_set (URL) and utilities.is_set (UrlAccess) then
UrlAccess = nil;
utilities.set_message ('err_param_access_requires_param', 'url');
end
local ChapterURL = A['ChapterURL'];
local ChapterUrlAccess = is_valid_parameter_value (A['ChapterUrlAccess'], A:ORIGIN('ChapterUrlAccess'), cfg.keywords_lists['url-access'], nil);
if not utilities.is_set (ChapterURL) and utilities.is_set (ChapterUrlAccess) then
ChapterUrlAccess = nil;
utilities.set_message ('err_param_access_requires_param', {A:ORIGIN('ChapterUrlAccess'):gsub ('%-access', '')});
end
local MapUrlAccess = is_valid_parameter_value (A['MapUrlAccess'], A:ORIGIN('MapUrlAccess'), cfg.keywords_lists['url-access'], nil);
if not utilities.is_set (A['MapURL']) and utilities.is_set (MapUrlAccess) then
MapUrlAccess = nil;
utilities.set_message ('err_param_access_requires_param', {'map-url'});
end
local this_page = mw.title.getCurrentTitle(); -- also used for COinS and for language
local no_tracking_cats = is_valid_parameter_value (A['NoTracking'], A:ORIGIN('NoTracking'), cfg.keywords_lists['yes_true_y'], nil);
-- check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories
if not utilities.is_set (no_tracking_cats) then -- ignore if we are already not going to categorize this page
if cfg.uncategorized_namespaces[this_page.namespace] then -- is this page's namespace id one of the uncategorized namespace ids?
no_tracking_cats = "true"; -- set no_tracking_cats
end
for _, v in ipairs (cfg.uncategorized_subpages) do -- cycle through page name patterns
if this_page.text:match (v) then -- test page name against each pattern
no_tracking_cats = "true"; -- set no_tracking_cats
break; -- bail out if one is found
end
end
end
-- check for extra |page=, |pages= or |at= parameters. (also sheet and sheets while we're at it)
utilities.select_one (args, {'page', 'p', 'pp', 'pages', 'at', 'sheet', 'sheets'}, 'err_redundant_parameters'); -- this is a dummy call simply to get the error message and category
local coins_pages;
Page, Pages, At, coins_pages = insource_loc_get (Page, A:ORIGIN('Page'), Pages, A:ORIGIN('Pages'), At);
local URL_origin = A:ORIGIN('URL'); -- get name of parameter that holds URL
local ChapterURL_origin = A:ORIGIN('ChapterURL'); -- get name of parameter that holds ChapterURL
local Format = A['Format'];
local ChapterFormat = A['ChapterFormat'];
local TransChapter = A['TransChapter'];
local TransChapter_origin = A:ORIGIN ('TransChapter');
local TransTitle = A['TransTitle'];
local ScriptTitle = A['ScriptTitle'];
if utilities.in_array (config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn', -- if any of the 'periodical' cites except encyclopedia
'map', 'episode'}) or ('conference' == config.CitationClass and utilities.is_set (A['BookTitle'])) or -- {{cite map}} allows |section= but it is alias of |sections= ; {{cite episode}} uses |title= as chapter
('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and not (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
local chap_param;
if utilities.is_set (Chapter) then -- get a parameter name from one of these chapter related meta-parameters
chap_param = A:ORIGIN ('Chapter')
elseif utilities.is_set (TransChapter) then
chap_param = A:ORIGIN ('TransChapter')
elseif utilities.is_set (ChapterURL) then
chap_param = A:ORIGIN ('ChapterURL')
elseif utilities.is_set (ScriptChapter) then
chap_param = ScriptChapter_origin;
else utilities.is_set (ChapterFormat)
chap_param = A:ORIGIN ('ChapterFormat')
end
if utilities.is_set (chap_param) then -- if we found one
utilities.set_message ('err_chapter_ignored', {chap_param}); -- add error message
Chapter = ''; -- and set them to empty string to be safe with concatenation
TransChapter = ''; -- for now, ignore linter warnings
ChapterURL = '';
ScriptChapter = '';
ChapterFormat = '';
end
end
--[[
Parameter remapping for cite encyclopedia:
When the citation has these parameters:
|encyclopedia= and |title= then map |title= to |article= and |encyclopedia= to |title= for rendering
|encyclopedia= and |article= then map |encyclopedia= to |title= for rendering
|trans-title= maps to |trans-chapter= when |title= is re-mapped
|url= maps to |chapter-url= when |title= is remapped
All other combinations of |encyclopedia=, |title=, and |article= are not modified
]]
if utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia) then -- emit error message when Encyclopedia set but template is other than {{cite encyclopedia}} or {{citation}}
if 'encyclopaedia' ~= config.CitationClass and 'citation' ~= config.CitationClass then
if utilities.is_set (Encyclopedia) then
utilities.set_message ('err_parameter_ignored', {A:ORIGIN ('Encyclopedia')});
else
utilities.set_message ('err_parameter_ignored', {A:ORIGIN ('ScriptEncyclopedia')});
end
Encyclopedia = nil; -- unset these because not supported by this template
ScriptEncyclopedia = nil;
TransEncyclopedia = nil;
end
elseif utilities.is_set (TransEncyclopedia) then
utilities.set_message ('err_trans_missing_title', {'encyclopedia'});
end
if ('encyclopaedia' == config.CitationClass) or ('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
if utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia) then
Periodical = Encyclopedia; -- error or no, set Periodical to Encyclopedia for rendering; {{citation}} could (not legitimately) have both; use Encyclopedia
Periodical_origin = A:ORIGIN ('Encyclopedia');
ScriptPeriodical = ScriptEncyclopedia;
ScriptPeriodical_origin = A:ORIGIN ('ScriptEncyclopedia');
if utilities.is_set (Title) or utilities.is_set (ScriptTitle) then
if not (utilities.is_set (Chapter) or utilities.is_set (ScriptChapter)) then
Chapter = Title; -- |encyclopedia= and |title= are set so map |title= params to |article= params for rendering
ScriptChapter = ScriptTitle;
ScriptChapter_origin = A:ORIGIN('ScriptTitle')
TransChapter = TransTitle;
ChapterURL = URL;
ChapterURL_origin = URL_origin;
ChapterUrlAccess = UrlAccess;
ChapterFormat = Format;
if utilities.is_set (TitleLink) then
if utilities.is_set (ChapterURL) then
utilities.set_message ('err_wikilink_in_url');
else
Chapter = utilities.make_wikilink (TitleLink, Chapter);
end
end
Title = Periodical; -- now map |encyclopedia= params to |title= params for rendering
ScriptTitle = ScriptPeriodical or '';
TransTitle = TransEncyclopedia or '';
Periodical = ''; -- redundant so unset
ScriptPeriodical = '';
URL = '';
Format = '';
TitleLink = '';
end
elseif utilities.is_set (Chapter) or utilities.is_set (ScriptChapter) then -- |title= not set
Title = Periodical; -- |encyclopedia= set and |article= set so map |encyclopedia= to |title= for rendering
ScriptTitle = ScriptPeriodical or '';
TransTitle = TransEncyclopedia or '';
Periodical = ''; -- redundant so unset
ScriptPeriodical = '';
end
end
end
-- special case for cite techreport.
local ID = A['ID'];
if (config.CitationClass == "techreport") then -- special case for cite techreport
if utilities.is_set (A['Number']) then -- cite techreport uses 'number', which other citations alias to 'issue'
if not utilities.is_set (ID) then -- can we use ID for the "number"?
ID = A['Number']; -- yes, use it
else -- ID has a value so emit error message
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'id') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'number')});
end
end
end
-- Account for the oddity that is {{cite conference}}, before generation of COinS data.
local ChapterLink -- = A['ChapterLink']; -- deprecated as a parameter but still used internally by cite episode
local Conference = A['Conference'];
local BookTitle = A['BookTitle'];
local TransTitle_origin = A:ORIGIN ('TransTitle');
if 'conference' == config.CitationClass then
if utilities.is_set (BookTitle) then
Chapter = Title;
Chapter_origin = 'title';
ScriptChapter = ScriptTitle;
ScriptChapter_origin = A:ORIGIN('ScriptTitle');
-- ChapterLink = TitleLink; -- |chapter-link= is deprecated
ChapterURL = URL;
ChapterUrlAccess = UrlAccess;
ChapterURL_origin = URL_origin;
URL_origin = '';
ChapterFormat = Format;
TransChapter = TransTitle;
TransChapter_origin = TransTitle_origin;
Title = BookTitle;
ScriptTitle = '';
Format = '';
-- TitleLink = '';
TransTitle = '';
URL = '';
end
elseif 'speech' ~= config.CitationClass then
Conference = ''; -- not cite conference or cite speech so make sure this is empty string
end
local cs2_lower = function (text) -- if mode is cs2, use lower case
if (sepc ~= '.') then
return text:lower();
end
return text;
end
local use_lowercase = ( sepc == ',' ); -- controls capitalization of certain static text
-- cite map oddities
local Cartography = "";
local Scale = "";
local Sheet = A['Sheet'] or '';
local Sheets = A['Sheets'] or '';
if config.CitationClass == "map" then
Chapter = A['Map'];
Chapter_origin = A:ORIGIN('Map'); -- for now, ignore linter warning
ChapterURL = A['MapURL'];
ChapterURL_origin = A:ORIGIN('MapURL');
TransChapter = A['TransMap'];
ScriptChapter = A['ScriptMap']
ScriptChapter_origin = A:ORIGIN('ScriptMap')
ChapterUrlAccess = MapUrlAccess;
ChapterFormat = A['MapFormat'];
Cartography = A['Cartography'];
if utilities.is_set ( Cartography ) then
Cartography = sepc .. " " .. wrap_msg ('cartography', Cartography, use_lowercase);
end
Scale = A['Scale'];
if utilities.is_set ( Scale ) then
Scale = sepc .. " " .. Scale;
end
end
-- Account for the oddities that are {{cite episode}} and {{cite serial}}, before generation of COinS data.
local Series = A['Series'];
if 'episode' == config.CitationClass or 'serial' == config.CitationClass then
local SeriesLink = A['SeriesLink'];
SeriesLink = link_title_ok (SeriesLink, A:ORIGIN ('SeriesLink'), Series, 'series'); -- check for wiki-markup in |series-link= or wiki-markup in |series= when |series-link= is set
local Network = A['Network'];
local Station = A['Station'];
local s, n = {}, {};
-- do common parameters first
if utilities.is_set (Network) then table.insert(n, Network); end
if utilities.is_set (Station) then table.insert(n, Station); end
ID = table.concat(n, sepc .. ' ');
if 'episode' == config.CitationClass then -- handle the oddities that are strictly {{cite episode}}
local Season = A['Season'];
local SeriesNumber = A['SeriesNumber'];
if utilities.is_set (Season) and utilities.is_set (SeriesNumber) then -- these are mutually exclusive so if both are set TODO: make a function for this and similar?
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'season') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'seriesno')}); -- add error message
SeriesNumber = ''; -- unset; prefer |season= over |seriesno=
end
-- assemble a table of parts concatenated later into Series
if utilities.is_set (Season) then table.insert(s, wrap_msg ('season', Season, use_lowercase)); end
if utilities.is_set (SeriesNumber) then table.insert(s, wrap_msg ('seriesnum', SeriesNumber, use_lowercase)); end
if utilities.is_set (Issue) then table.insert(s, wrap_msg ('episode', Issue, use_lowercase)); end
Issue = ''; -- unset because this is not a unique parameter
Chapter = Title; -- promote title parameters to chapter
ScriptChapter = ScriptTitle;
ScriptChapter_origin = A:ORIGIN('ScriptTitle');
ChapterLink = TitleLink; -- alias |episode-link=
TransChapter = TransTitle;
ChapterURL = URL;
ChapterUrlAccess = UrlAccess;
ChapterURL_origin = URL_origin;
ChapterFormat = Format;
Title = Series; -- promote series to title
TitleLink = SeriesLink;
Series = table.concat(s, sepc .. ' '); -- this is concatenation of season, seriesno, episode number
if utilities.is_set (ChapterLink) then
if not utilities.is_set (ChapterURL) then -- link but not URL
Chapter = utilities.make_wikilink (ChapterLink, Chapter);
elseif utilities.is_set (Series) then -- if both are set, URL links episode;
Series = utilities.make_wikilink (ChapterLink, Series);
else
utilities.set_message ('err_wikilink_in_url');
end
end
URL = ''; -- unset
TransTitle = '';
ScriptTitle = '';
Format = '';
else -- now oddities that are cite serial
Issue = ''; -- unset because this parameter no longer supported by the citation/core version of cite serial
Chapter = A['Episode']; -- TODO: make |episode= available to cite episode someday?
if utilities.is_set (Series) and utilities.is_set (SeriesLink) then
Series = utilities.make_wikilink (SeriesLink, Series);
end
Series = utilities.wrap_style ('italic-title', Series); -- series is italicized
end
end
-- end of {{cite episode}} stuff
-- handle type parameter for those CS1 citations that have default values
local TitleType = A['TitleType'];
local Degree = A['Degree'];
if utilities.in_array (config.CitationClass, {'AV-media-notes', 'document', 'interview', 'mailinglist', 'map', 'podcast', 'pressrelease', 'report', 'speech', 'techreport', 'thesis'}) then
TitleType = set_titletype (config.CitationClass, TitleType);
if utilities.is_set (Degree) and "Thesis" == TitleType then -- special case for cite thesis
TitleType = Degree .. ' ' .. cfg.title_types ['thesis']:lower();
end
end
if utilities.is_set (TitleType) then -- if type parameter is specified
TitleType = utilities.substitute ( cfg.messages['type'], TitleType); -- display it in parentheses
-- TODO: Hack on TitleType to fix bunched parentheses problem
end
local Date = A['Date'];
local Date_origin; -- to hold the name of parameter promoted to Date; required for date error messaging
local Year = A['Year'];
if utilities.is_set (Year) then
validation.year_check (Year); -- returns nothing; emits maint message when |year= doesn't hold a 'year' value
end
if not utilities.is_set (Date) then
Date = Year; -- promote Year to Date
Year = nil; -- make nil so Year as empty string isn't used for CITEREF
Date_origin = A:ORIGIN('Year'); -- save the name of the promoted parameter
else
Date_origin = A:ORIGIN('Date'); -- not a promotion; name required for error messaging
end
--[[
Go test all of the date-holding parameters for valid MOS:DATE format and make sure that dates are real dates. This must be done before we do COinS because here is where
we get the date used in the metadata.
Date validation supporting code is in Module:Citation/CS1/Date_validation
]]
local DF = is_valid_parameter_value (A['DF'], A:ORIGIN('DF'), cfg.keywords_lists['df'], '');
if not utilities.is_set (DF) then
DF = cfg.global_df; -- local |df= if present overrides global df set by {{use xxx date}} template
end
local ArchiveURL;
local ArchiveDate;
local ArchiveFormat = A['ArchiveFormat'];
local archive_url_timestamp; -- timestamp from wayback machine url
ArchiveURL, ArchiveDate, archive_url_timestamp = archive_url_check (A['ArchiveURL'], A['ArchiveDate'])
ArchiveFormat = style_format (ArchiveFormat, ArchiveURL, 'archive-format', 'archive-url');
ArchiveURL, ArchiveDate = is_unique_archive_url (ArchiveURL, URL, ChapterURL, A:ORIGIN('ArchiveURL'), ArchiveDate); -- add error message when URL or ChapterURL == ArchiveURL
local AccessDate = A['AccessDate'];
local COinS_date = {}; -- holds date info extracted from |date= for the COinS metadata by Module:Date verification
local DoiBroken = A['DoiBroken'];
local Embargo = A['Embargo'];
local anchor_year; -- used in the CITEREF identifier
do -- create defined block to contain local variables date_parameters_list, mismatch
local date_parameters_list = { -- AirDate has been promoted to Date so not necessary to check it
['access-date'] = {val = AccessDate, name = A:ORIGIN ('AccessDate')},
['archive-date'] = {val = ArchiveDate, name = A:ORIGIN ('ArchiveDate')},
['date'] = {val = Date, name = Date_origin},
['doi-broken-date'] = {val = DoiBroken, name = A:ORIGIN ('DoiBroken')},
['pmc-embargo-date'] = {val = Embargo, name = A:ORIGIN ('Embargo')},
['year'] = {val = Year, name = A:ORIGIN ('Year')},
};
local error_list = {};
anchor_year, Embargo = validation.dates(date_parameters_list, COinS_date, error_list);
if utilities.is_set (Year) and utilities.is_set (Date) then -- both |date= and |year= not normally needed;
validation.year_date_check (Year, A:ORIGIN ('Year'), Date, A:ORIGIN ('Date'), error_list);
end
if 0 == #error_list then -- error free dates only; 0 when error_list is empty
local modified = false; -- flag
if utilities.is_set (DF) then -- if we need to reformat dates
modified = validation.reformat_dates (date_parameters_list, DF); -- reformat to DF format, use long month names if appropriate
end
if true == validation.date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate
modified = true;
utilities.set_message ('maint_date_format'); -- hyphens were converted so add maint category
end
-- for those wikis that can and want to have English date names translated to the local language; not supported at en.wiki
if cfg.date_name_auto_xlate_enable and validation.date_name_xlate (date_parameters_list, cfg.date_digit_auto_xlate_enable ) then
utilities.set_message ('maint_date_auto_xlated'); -- add maint cat
modified = true;
end
if modified then -- if the date_parameters_list values were modified
AccessDate = date_parameters_list['access-date'].val; -- overwrite date holding parameters with modified values
ArchiveDate = date_parameters_list['archive-date'].val;
Date = date_parameters_list['date'].val;
DoiBroken = date_parameters_list['doi-broken-date'].val;
end
if archive_url_timestamp and utilities.is_set (ArchiveDate) then
validation.archive_date_check (ArchiveDate, archive_url_timestamp, DF); -- does YYYYMMDD in archive_url_timestamp match date in ArchiveDate
end
else
utilities.set_message ('err_bad_date', {utilities.make_sep_list (#error_list, error_list)}); -- add this error message
end
end -- end of do
if utilities.in_array (config.CitationClass, {'book', 'encyclopaedia'}) or -- {{cite book}}, {{cite encyclopedia}}; TODO: {{cite conference}} and others?
('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) or -- {{citation}} as an encylopedia citation
('citation' == config.CitationClass and not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical))) then -- {{citation}} as a book citation
if utilities.is_set (PublicationPlace) then
if not utilities.is_set (PublisherName) then
local date = COinS_date.rftdate and tonumber (COinS_date.rftdate:match ('%d%d%d%d')); -- get year portion of COinS date (because in Arabic numerals); convert string to number
if date and (1850 <= date) then -- location has no publisher; if date is 1850 or later
utilities.set_message ('maint_location_no_publisher'); -- add maint cat
end
else -- PublisherName has a value
if cfg.keywords_xlate['none'] == PublisherName then -- if that value is 'none' (only for book and encyclopedia citations)
PublisherName = ''; -- unset
end
end
end
end
local ID_list_t; -- sequence table of rendered identifiers
local ID_list_coins_t; -- table of identifiers and their values from args; key is same as cfg.id_handlers's key
local Class = A['Class']; -- arxiv class identifier
local ID_support = {
{A['ASINTLD'], 'ASIN', 'err_asintld_missing_asin', A:ORIGIN ('ASINTLD')},
{DoiBroken, 'DOI', 'err_doibroken_missing_doi', A:ORIGIN ('DoiBroken')},
{Embargo, 'PMC', 'err_embargo_missing_pmc', A:ORIGIN ('Embargo')},
}
ID_list_t, ID_list_coins_t = identifiers.identifier_lists_get (args, {
DoiBroken = DoiBroken, -- for |doi=
ASINTLD = A['ASINTLD'], -- for |asin=
Embargo = Embargo, -- for |pmc=
Class = Class, -- for |arxiv=
CitationClass = config.CitationClass, -- for |arxiv=
Year=anchor_year, -- for |isbn=
}, ID_support);
for _, id in ipairs (ID_list_t) do -- search through the ID_list_t sequence looking for an ISBN identifier string
if id:find ('ISBN', 3, true) then -- plain find, start at index 3 ([[ISBN)
if 'citation' == config.CitationClass then -- catch ve/citoid malformed book cites in {{citation}} templates
if utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical) then -- when a |work= alias is set
utilities.set_message ('maint_work_isbn'); -- add maint cat
break; -- and abandon
end
elseif ({['journal'] = true, ['magazine'] = true, ['news'] = true, ['web'] = true})[config.CitationClass] then
utilities.set_message ('maint_periodical_has_isbn'); -- add maint cat
break; -- and abandon
end
end
end
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite medrxiv}}, {{cite ssrn}}, before generation of COinS data.
if utilities.in_array (config.CitationClass, whitelist.preprint_template_list_t) then -- |arxiv= or |eprint= required for cite arxiv; |biorxiv=, |citeseerx=, |medrxiv=, |ssrn= required for their templates
if not (args[cfg.id_handlers[config.CitationClass:upper()].parameters[1]] or -- can't use ID_list_coins_t k/v table here because invalid parameters omitted
args[cfg.id_handlers[config.CitationClass:upper()].parameters[2]]) then -- which causes unexpected parameter missing error message
utilities.set_message ('err_' .. config.CitationClass .. '_missing'); -- add error message
end
Periodical = ({['arxiv'] = 'arXiv', ['biorxiv'] = 'bioRxiv', ['citeseerx'] = 'CiteSeerX', ['medrxiv'] = 'medRxiv', ['ssrn'] = 'Social Science Research Network'})[config.CitationClass];
end
-- Link the title of the work if no |url= was provided, but we have a |pmc= or a |doi= with |doi-access=free
if config.CitationClass == "journal" and not utilities.is_set (URL) and not utilities.is_set (TitleLink) and not utilities.in_array (cfg.keywords_xlate[Title], {'off', 'none'}) then -- TODO: remove 'none' once existing citations have been switched to 'off', so 'none' can be used as token for "no title" instead
if 'none' ~= cfg.keywords_xlate[auto_select] then -- if auto-linking not disabled
if identifiers.auto_link_urls[auto_select] then -- manual selection
URL = identifiers.auto_link_urls[auto_select]; -- set URL to be the same as identifier's external link
URL_origin = cfg.id_handlers[auto_select:upper()].parameters[1]; -- set URL_origin to parameter name for use in error message if citation is missing a |title=
elseif identifiers.auto_link_urls['pmc'] then -- auto-select PMC
URL = identifiers.auto_link_urls['pmc']; -- set URL to be the same as the PMC external link if not embargoed
URL_origin = cfg.id_handlers['PMC'].parameters[1]; -- set URL_origin to parameter name for use in error message if citation is missing a |title=
elseif identifiers.auto_link_urls['doi'] then -- auto-select DOI
URL = identifiers.auto_link_urls['doi'];
URL_origin = cfg.id_handlers['DOI'].parameters[1];
end
end
if utilities.is_set (URL) then -- set when using an identifier-created URL
if utilities.is_set (AccessDate) then -- |access-date= requires |url=; identifier-created URL is not |url=
utilities.set_message ('err_accessdate_missing_url'); -- add an error message
AccessDate = ''; -- unset
end
if utilities.is_set (ArchiveURL) then -- |archive-url= requires |url=; identifier-created URL is not |url=
utilities.set_message ('err_archive_missing_url'); -- add an error message
ArchiveURL = ''; -- unset
end
end
end
-- At this point fields may be nil if they weren't specified in the template use. We can use that fact.
-- Test if citation has no title
if not utilities.is_set (Title) and not utilities.is_set (TransTitle) and not utilities.is_set (ScriptTitle) then -- has special case for cite episode
utilities.set_message ('err_citation_missing_title', {'episode' == config.CitationClass and 'series' or 'title'});
end
if utilities.in_array (cfg.keywords_xlate[Title], {'off', 'none'}) and
utilities.in_array (config.CitationClass, {'journal', 'citation'}) and
(utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and
('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin) then -- special case for journal cites
Title = ''; -- set title to empty string
utilities.set_message ('maint_untitled'); -- add maint cat
end
if 'journal' == config.CitationClass
or ('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and ('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin)) then
if is_page_art_num (((utilities.is_set (Page) and Page) or (utilities.is_set (Pages) and Pages)) or nil, ID_list_coins_t['DOI']) then -- does |page(s)= look like it holds an article number
utilities.set_message ('maint_page_art_num'); -- add maint cat
end
end
-- COinS metadata (see <http://ocoins.info/>) for automated parsing of citation information.
-- handle the oddity that is cite encyclopedia and {{citation |encyclopedia=something}}. Here we presume that
-- when Periodical, Title, and Chapter are all set, then Periodical is the book (encyclopedia) title, Title
-- is the article title, and Chapter is a section within the article. So, we remap
local coins_chapter = Chapter; -- default assuming that remapping not required
local coins_title = Title; -- et tu
if 'encyclopaedia' == config.CitationClass or ('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
if utilities.is_set (Chapter) and utilities.is_set (Title) and utilities.is_set (Periodical) then -- if all are used then -- should script-params be considered?
coins_chapter = Title; -- remap
coins_title = Periodical;
end
end
local coins_author = a; -- default for coins rft.au
if 0 < #c then -- but if contributor list
coins_author = c; -- use that instead
end
-- this is the function call to COinS()
local OCinSoutput = metadata.COinS({
['Periodical'] = utilities.strip_apostrophe_markup (Periodical), -- no markup in the metadata
['Encyclopedia'] = Encyclopedia, -- just a flag; content ignored by ~/COinS
['Chapter'] = metadata.make_coins_title (coins_chapter, ScriptChapter), -- Chapter and ScriptChapter stripped of bold / italic / accept-as-written markup
['Degree'] = Degree; -- cite thesis only
['Title'] = metadata.make_coins_title (coins_title, ScriptTitle), -- Title and ScriptTitle stripped of bold / italic / accept-as-written markup
['PublicationPlace'] = PublicationPlace,
['Date'] = COinS_date.rftdate, -- COinS_date.* has correctly formatted date values if Date is valid;
['Season'] = COinS_date.rftssn,
['Quarter'] = COinS_date.rftquarter,
['Chron'] = COinS_date.rftchron,
['Series'] = Series,
['Volume'] = Volume,
['Issue'] = Issue,
['ArticleNumber'] = ArticleNumber,
['Pages'] = coins_pages or metadata.get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At, QuotePage, QuotePages}, 7)), -- pages stripped of external links
['Edition'] = Edition,
['PublisherName'] = PublisherName or Newsgroup, -- any apostrophe markup already removed from PublisherName
['URL'] = first_set ({ChapterURL, URL}, 2),
['Authors'] = coins_author,
['ID_list'] = ID_list_coins_t,
['RawPage'] = this_page.prefixedText,
}, config.CitationClass);
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite medrxiv}}, and {{cite ssrn}} AFTER generation of COinS data.
if utilities.in_array (config.CitationClass, whitelist.preprint_template_list_t) then -- we have set rft.jtitle in COinS to arXiv, bioRxiv, CiteSeerX, medRxiv, or ssrn now unset so it isn't displayed
Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal
end
-- special case for cite newsgroup. Do this after COinS because we are modifying Publishername to include some static text
if 'newsgroup' == config.CitationClass and utilities.is_set (Newsgroup) then
PublisherName = utilities.substitute (cfg.messages['newsgroup'], external_link( 'news:' .. Newsgroup, Newsgroup, Newsgroup_origin, nil ));
end
local Editors;
local EditorCount; -- used only for choosing {ed.) or (eds.) annotation at end of editor name-list
local Contributors; -- assembled contributors name list
local contributor_etal = nil; -- must be intentionally initialized
local Translators; -- assembled translators name list
local translator_etal = nil; -- must be intentionally initialized
local t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn=
local Interviewers;
local interviewers_list = extract_names (args, 'InterviewerList'); -- process preferred interviewers parameters
local interviewer_etal = nil; -- must be intentionally initialized
-- Now perform various field substitutions.
-- We also add leading spaces and surrounding markup and punctuation to the
-- various parts of the citation, but only when they are non-nil.
do
local last_first_list;
local control = {
format = NameListStyle, -- empty string, '&', 'amp', 'and', or 'vanc'
maximum = nil, -- as if display-authors or display-editors not set
mode = Mode
};
do -- do editor name list first because the now unsupported coauthors used to modify control table
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayEditors'], A['DisplayEditors'], A:ORIGIN ('DisplayEditors'), #e);
control.maximum, editor_etal = get_display_names (display_names, #e, editor_etal, param);
Editors, EditorCount = list_people (control, e, editor_etal);
if 1 == EditorCount and (true == editor_etal or 1 < #e) then -- only one editor displayed but includes etal then
EditorCount = 2; -- spoof to display (eds.) annotation
end
end
do -- now do interviewers
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayInterviewers'], A['DisplayInterviewers'], A:ORIGIN ('DisplayInterviewers'), #interviewers_list);
control.maximum, interviewer_etal = get_display_names (display_names, #interviewers_list, interviewer_etal, param);
Interviewers = list_people (control, interviewers_list, interviewer_etal);
end
do -- now do translators
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayTranslators'], A['DisplayTranslators'], A:ORIGIN ('DisplayTranslators'), #t);
control.maximum, translator_etal = get_display_names (display_names, #t, translator_etal, param);
Translators = list_people (control, t, translator_etal);
end
do -- now do contributors
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayContributors'], A['DisplayContributors'], A:ORIGIN ('DisplayContributors'), #c);
control.maximum, contributor_etal = get_display_names (display_names, #c, contributor_etal, param);
Contributors = list_people (control, c, contributor_etal);
end
do -- now do authors
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayAuthors'], A['DisplayAuthors'], A:ORIGIN ('DisplayAuthors'), #a, author_etal);
control.maximum, author_etal = get_display_names (display_names, #a, author_etal, param);
last_first_list = list_people (control, a, author_etal);
if utilities.is_set (Authors) then
Authors, author_etal = name_has_etal (Authors, author_etal, false, 'authors'); -- find and remove variations on et al.
if author_etal then
Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter
end
else
Authors = last_first_list; -- either an author name list or an empty string
end
end -- end of do
if utilities.is_set (Authors) and utilities.is_set (Collaboration) then
Authors = utilities.substitute (cfg.messages['collaboration'], {Authors, Collaboration}); -- add collaboration after et al.
end
end
local ConferenceFormat = A['ConferenceFormat'];
local ConferenceURL = A['ConferenceURL'];
ConferenceFormat = style_format (ConferenceFormat, ConferenceURL, 'conference-format', 'conference-url');
Format = style_format (Format, URL, 'format', 'url');
if not utilities.is_set (URL) then
if utilities.in_array (config.CitationClass, {"web", "podcast", "mailinglist"}) or -- |url= required for {{cite web}}, {{cite podcast}}, and {{cite mailing list}}
('citation' == config.CitationClass and ('website' == Periodical_origin or 'script-website' == ScriptPeriodical_origin)) then -- and required for {{citation}} with |website= or |script-website=
if not url_was_archive_today then -- is <URL> empty/missing because it was a deprecated archive.today url
utilities.set_message ('err_cite_web_url'); -- no; emit an error message for an empty/ missing |url=
end
end
-- do we have |accessdate= without either |url= or |chapter-url=?
if utilities.is_set (AccessDate) and not utilities.is_set (ChapterURL) then -- ChapterURL may be set when URL is not set;
utilities.set_message ('err_accessdate_missing_url');
AccessDate = '';
end
end
local UrlStatus = is_valid_parameter_value (A['UrlStatus'], A:ORIGIN('UrlStatus'), cfg.keywords_lists['url-status'], '');
local OriginalURL
local OriginalURL_origin
local OriginalFormat
local OriginalAccess;
UrlStatus = UrlStatus:lower(); -- used later when assembling archived text
if utilities.is_set ( ArchiveURL ) then
if utilities.is_set (ChapterURL) then -- if chapter-url= is set apply archive url to it
OriginalURL = ChapterURL; -- save copy of source chapter's url for archive text
OriginalURL_origin = ChapterURL_origin; -- name of |chapter-url= parameter for error messages
OriginalFormat = ChapterFormat; -- and original |chapter-format=
if 'live' ~= UrlStatus then
ChapterURL = ArchiveURL -- swap-in the archive's URL
ChapterURL_origin = A:ORIGIN('ArchiveURL') -- name of |archive-url= parameter for error messages
ChapterFormat = ArchiveFormat or ''; -- swap in archive's format
ChapterUrlAccess = nil; -- restricted access levels do not make sense for archived URLs
end
elseif utilities.is_set (URL) then
OriginalURL = URL; -- save copy of original source URL
OriginalURL_origin = URL_origin; -- name of URL parameter for error messages
OriginalFormat = Format; -- and original |format=
OriginalAccess = UrlAccess;
if 'live' ~= UrlStatus then -- if URL set then |archive-url= applies to it
URL = ArchiveURL -- swap-in the archive's URL
URL_origin = A:ORIGIN('ArchiveURL') -- name of archive URL parameter for error messages
Format = ArchiveFormat or ''; -- swap in archive's format
UrlAccess = nil; -- restricted access levels do not make sense for archived URLs
end
end
elseif utilities.is_set (UrlStatus) then -- if |url-status= is set when |archive-url= is not set
utilities.set_message ('maint_url_status'); -- add maint cat
end
if utilities.in_array (config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn'}) or -- if any of the 'periodical' cites except encyclopedia
('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and not (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
else -- otherwise, format chapter / article title
local no_quotes = false; -- default assume that we will be quoting the chapter parameter value
if utilities.is_set (Contribution) and 0 < #c then -- if this is a contribution with contributor(s)
if utilities.in_array (Contribution:lower(), cfg.keywords_lists.contribution) then -- and a generic contribution title
no_quotes = true; -- then render it unquoted
end
end
ChapterFormat = style_format (ChapterFormat, ChapterURL, 'chapter-format', 'chapter-url');
Chapter = format_chapter_title (ScriptChapter, ScriptChapter_origin, Chapter, TransChapter, TransChapter_origin, ChapterURL, ChapterURL_origin, no_quotes, ChapterUrlAccess); -- Contribution is also in Chapter
if utilities.is_set (Chapter) then
Chapter = Chapter .. ChapterFormat ;
if 'map' == config.CitationClass and utilities.is_set (TitleType) then
Chapter = Chapter .. ' ' .. TitleType; -- map annotation here; not after title
end
Chapter = Chapter .. sepc .. ' ';
elseif utilities.is_set (ChapterFormat) then -- |chapter= not set but |chapter-format= is so ...
Chapter = ChapterFormat .. sepc .. ' '; -- ... ChapterFormat has error message, we want to see it
end
end
-- Format main title
local plain_title = false;
local accept_title;
Title, accept_title = utilities.has_accept_as_written (Title, true); -- remove accept-this-as-written markup when it wraps all of <Title>
if accept_title and ('' == Title) then -- only support forced empty for now "(())"
Title = cfg.messages['notitle']; -- replace by predefined "No title" message
-- TODO: utilities.set_message ( 'err_redundant_parameters', ...); -- issue proper error message instead of muting
ScriptTitle = ''; -- just mute for now
TransTitle = ''; -- just mute for now
plain_title = true; -- suppress text decoration for descriptive title
utilities.set_message ('maint_untitled'); -- add maint cat
end
if not accept_title then -- <Title> not wrapped in accept-as-written markup
if '...' == Title:sub (-3) then -- if ellipsis is the last three characters of |title=
Title = Title:gsub ('(%.%.%.)%.+$', '%1'); -- limit the number of dots to three
elseif not mw.ustring.find (Title, '%.%s*%a%.$') and -- end of title is not a 'dot-(optional space-)letter-dot' initialism ...
not mw.ustring.find (Title, '%s+%a%.$') then -- ...and not a 'space-letter-dot' initial (''Allium canadense'' L.)
Title = mw.ustring.gsub(Title, '%' .. sepc .. '$', ''); -- remove any trailing separator character; sepc and ms.ustring() here for languages that use multibyte separator characters
end
if utilities.is_set (ArchiveURL) and is_archived_copy (Title) then
utilities.set_message ('maint_archived_copy'); -- add maintenance category before we modify the content of Title
end
if is_generic ('generic_titles', Title) then
utilities.set_message ('err_generic_title'); -- set an error message
end
end
if (not plain_title) and (utilities.in_array (config.CitationClass, {'web', 'news', 'journal', 'magazine', 'document', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn'}) or
('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and not (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) or
('map' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)))) then -- special case for cite map when the map is in a periodical treat as an article
Title = kern_quotes (Title); -- if necessary, separate title's leading and trailing quote marks from module provided quote marks
Title = utilities.wrap_style ('quoted-title', Title);
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
TransTitle = utilities.wrap_style ('trans-quoted-title', TransTitle );
elseif plain_title or ('report' == config.CitationClass) then -- no styling for cite report and descriptive titles (otherwise same as above)
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
TransTitle = utilities.wrap_style ('trans-quoted-title', TransTitle ); -- for cite report, use this form for trans-title
else
Title = utilities.wrap_style ('italic-title', Title);
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
TransTitle = utilities.wrap_style ('trans-italic-title', TransTitle);
end
if utilities.is_set (TransTitle) then
if utilities.is_set (Title) then
TransTitle = " " .. TransTitle;
else
utilities.set_message ('err_trans_missing_title', {'title'});
end
end
if utilities.is_set (Title) then -- TODO: is this the right place to be making Wikisource URLs?
if utilities.is_set (TitleLink) and utilities.is_set (URL) then
utilities.set_message ('err_wikilink_in_url'); -- set an error message because we can't have both
TitleLink = ''; -- unset
end
if not utilities.is_set (TitleLink) and utilities.is_set (URL) then
Title = external_link (URL, Title, URL_origin, UrlAccess) .. TransTitle .. Format;
URL = ''; -- unset these because no longer needed
Format = ''; -- for now, ignore linter warning
elseif utilities.is_set (TitleLink) and not utilities.is_set (URL) then
local ws_url;
ws_url = wikisource_url_make (TitleLink); -- ignore ws_label return; not used here
if ws_url then
Title = external_link (ws_url, Title .. ' ', 'ws link in title-link'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
Title = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], TitleLink, Title});
Title = Title .. TransTitle;
else
Title = utilities.make_wikilink (TitleLink, Title) .. TransTitle;
end
else
local ws_url, ws_label, L; -- Title has italic or quote markup by the time we get here which causes is_wikilink() to return 0 (not a wikilink)
ws_url, ws_label, L = wikisource_url_make (Title:gsub('^[\'"]*(.-)[\'"]*$', '%1')); -- make ws URL from |title= interwiki link (strip italic or quote markup); link portion L becomes tooltip label
if ws_url then
Title = Title:gsub ('%b[]', ws_label); -- replace interwiki link with ws_label to retain markup
Title = external_link (ws_url, Title .. ' ', 'ws link in title'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
Title = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, Title});
Title = Title .. TransTitle;
else
Title = Title .. TransTitle;
end
end
else
Title = TransTitle;
end
local ConferenceURL_origin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL
if utilities.is_set (Conference) then
if utilities.is_set (ConferenceURL) then
Conference = external_link( ConferenceURL, Conference, ConferenceURL_origin, nil );
end
Conference = sepc .. " " .. Conference .. ConferenceFormat;
elseif utilities.is_set (ConferenceURL) then
Conference = sepc .. " " .. external_link( ConferenceURL, nil, ConferenceURL_origin, nil );
end
local Position = '';
if not utilities.is_set (Position) then
local Minutes = A['Minutes'];
local Time = A['Time'];
if utilities.is_set (Minutes) then
if utilities.is_set (Time) then --TODO: make a function for this and similar?
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'minutes') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'time')});
end
Position = utilities.substitute (cfg.messages.minutes, Minutes);
else
if utilities.is_set (Time) then
local TimeCaption = A['TimeCaption']
if not utilities.is_set (TimeCaption) then
TimeCaption = cs2_lower(cfg.messages['event']);
end
Position = " " .. TimeCaption .. " " .. Time;
end
end
else
Position = " " .. Position;
At = '';
end
Page, Pages, Sheet, Sheets = format_pages_sheets (Page, Pages, Sheet, Sheets, config.CitationClass, Periodical_origin, ScriptPeriodical_origin, sepc, NoPP, use_lowercase);
At = utilities.is_set (At) and (sepc .. " " .. At) or "";
Position = utilities.is_set (Position) and (sepc .. " " .. Position) or "";
if config.CitationClass == 'map' then
local Sections = A['Sections']; -- Section (singular) is an alias of Chapter so set earlier
local Inset = A['Inset'];
if utilities.is_set ( Inset ) then
Inset = sepc .. " " .. wrap_msg ('inset', Inset, use_lowercase);
end
if utilities.is_set ( Sections ) then
Section = sepc .. " " .. wrap_msg ('sections', Sections, use_lowercase);
if utilities.is_set ( Section ) then
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'sections') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'section')});
end
elseif utilities.is_set ( Section ) then
Section = sepc .. " " .. wrap_msg ('section', Section, use_lowercase);
end
At = At .. Inset .. Section;
end
local Others = A['Others'];
if utilities.is_set (Others) and 0 == #a and 0 == #e then -- add maint cat when |others= has value and used without |author=, |editor=
if config.CitationClass == "AV-media-notes"
or config.CitationClass == "audio-visual" then -- special maint for AV/M which has a lot of 'false' positives right now
utilities.set_message ('maint_others_avm')
else
utilities.set_message ('maint_others');
end
end
Others = utilities.is_set (Others) and (sepc .. " " .. Others) or "";
if utilities.is_set (Translators) then
Others = safe_join ({sepc .. ' ', wrap_msg ('translated', Translators, use_lowercase), Others}, sepc);
end
if utilities.is_set (Interviewers) then
Others = safe_join ({sepc .. ' ', wrap_msg ('interview', Interviewers, use_lowercase), Others}, sepc);
end
local TitleNote = A['TitleNote'];
TitleNote = utilities.is_set (TitleNote) and (sepc .. " " .. TitleNote) or "";
if utilities.is_set (Edition) then
if Edition:match ('%f[%a][Ee]d%n?%.?$') or Edition:match ('%f[%a][Ee]dition$') then -- Ed, ed, Ed., ed., Edn, edn, Edn., edn.
utilities.set_message ('err_extra_text_edition'); -- add error message
end
Edition = " " .. wrap_msg ('edition', Edition);
else
Edition = '';
end
Series = utilities.is_set (Series) and wrap_msg ('series', {sepc, Series}) or ""; -- not the same as SeriesNum
local Agency = A['Agency'] or ''; -- |agency= is supported by {{cite magazine}}, {{cite news}}, {{cite press release}}, {{cite web}}, and certain {{citation}} templates
if utilities.is_set (Agency) then -- this testing done here because {{citation}} supports 'news' citations
if utilities.in_array (config.CitationClass, {'magazine', 'news', 'pressrelease', 'web'})
or ('citation' == config.CitationClass and (utilities.in_array (Periodical_origin, {"magazine", "newspaper", "work"}) or utilities.in_array (ScriptPeriodical_origin, {"script-magazine", "script-newspaper", "script-work"}))) then
Agency = wrap_msg ('agency', {sepc, Agency}); -- format for rendering
else
Agency = ''; -- unset; not supported
utilities.set_message ('err_parameter_ignored', {'agency'}); -- add error message
end
end
Volume = format_volume_issue (Volume, Issue, ArticleNumber, config.CitationClass, Periodical_origin, ScriptPeriodical_origin, sepc, use_lowercase);
if utilities.is_set (AccessDate) then
local retrv_text = " " .. cfg.messages['retrieved'];
AccessDate = nowrap_date (AccessDate); -- wrap in nowrap span if date in appropriate format
retrv_text = cs2_lower(retrv_text); -- if mode is cs2, lower case
AccessDate = utilities.substitute (retrv_text, AccessDate); -- add retrieved text
AccessDate = utilities.substitute (cfg.presentation['accessdate'], {sepc, AccessDate}); -- allow editors to hide accessdates
end
if utilities.is_set (ID) then ID = sepc .. " " .. ID; end
local Docket = A['Docket'];
if "thesis" == config.CitationClass and utilities.is_set (Docket) then
ID = sepc .. " Docket " .. Docket .. ID;
end
if "report" == config.CitationClass and utilities.is_set (Docket) then -- for cite report when |docket= is set
ID = sepc .. ' ' .. Docket; -- overwrite ID even if |id= is set
end
if utilities.is_set (URL) then
URL = " " .. external_link( URL, nil, URL_origin, UrlAccess );
end
-- We check length of PostScript here because it will have been nuked by
-- the quote parameters. We'd otherwise emit a message even if there wasn't
-- a displayed postscript.
-- TODO: Should the max size (1) be configurable?
-- TODO: Should we check a specific pattern?
if utilities.is_set(PostScript) and mw.ustring.len(PostScript) > 1 then
utilities.set_message ('maint_postscript')
end
local Archived;
if utilities.is_set (ArchiveURL) then
if not utilities.is_set (ArchiveDate) then -- ArchiveURL set but ArchiveDate not set
utilities.set_message ('err_archive_missing_date'); -- emit an error message
ArchiveURL = ''; -- empty string for concatenation
ArchiveDate = ''; -- empty string for concatenation
end
else
if utilities.is_set (ArchiveDate) then -- ArchiveURL not set but ArchiveDate is set
utilities.set_message ('err_archive_date_missing_url'); -- emit an error message
ArchiveURL = ''; -- empty string for concatenation
ArchiveDate = ''; -- empty string for concatenation
end
end
if utilities.is_set (ArchiveURL) then
if "live" == UrlStatus then
if utilities.is_set (ArchiveDate) then
Archived = sepc .. ' ' .. utilities.substitute ( cfg.messages['archived-live'],
{ external_link( ArchiveURL, cs2_lower(cfg.messages['archived']), A:ORIGIN('ArchiveURL'), nil) .. ArchiveFormat, ArchiveDate } );
else
Archived = '';
end
if not utilities.is_set (OriginalURL) then
utilities.set_message ('err_archive_missing_url');
Archived = ''; -- empty string for concatenation
end
elseif utilities.is_set (OriginalURL) then -- UrlStatus is empty, 'dead', 'unfit', 'usurped', 'bot: unknown'
if utilities.in_array (UrlStatus, {'unfit', 'usurped', 'bot: unknown'}) then
Archived = sepc .. ' ' .. utilities.substitute ( cs2_lower(cfg.messages['archived-unfit']), ArchiveDate);
if 'bot: unknown' == UrlStatus then
utilities.set_message ('maint_bot_unknown'); -- and add a category if not already added
else
utilities.add_prop_cat ('unfit'); -- and add a category if not already added
end
else -- UrlStatus is empty, 'dead'
if utilities.is_set (ArchiveDate) then
Archived = sepc .. ' ' .. utilities.substitute ( cs2_lower(cfg.messages['archived-dead']),
{ external_link( OriginalURL, cfg.messages['original'], OriginalURL_origin, OriginalAccess ) .. OriginalFormat, ArchiveDate } );
else
Archived = ''; -- unset for concatenation
end
end
else -- OriginalUrl not set
utilities.set_message ('err_archive_missing_url');
Archived = ''; -- empty string for concatenation
end
elseif utilities.is_set (ArchiveFormat) then
Archived = ArchiveFormat; -- if set and ArchiveURL not set ArchiveFormat has error message
else
Archived = '';
end
local TranscriptURL = A['TranscriptURL']
local TranscriptFormat = A['TranscriptFormat'];
TranscriptFormat = style_format (TranscriptFormat, TranscriptURL, 'transcript-format', 'transcripturl');
local Transcript = A['Transcript'];
local TranscriptURL_origin = A:ORIGIN('TranscriptURL'); -- get name of parameter that holds TranscriptURL
if utilities.is_set (Transcript) then
if utilities.is_set (TranscriptURL) then
Transcript = external_link( TranscriptURL, Transcript, TranscriptURL_origin, nil );
end
Transcript = sepc .. ' ' .. Transcript .. TranscriptFormat;
elseif utilities.is_set (TranscriptURL) then
Transcript = external_link( TranscriptURL, nil, TranscriptURL_origin, nil );
end
local Publisher = ''; -- initialize to empty string for concatenation
if utilities.is_set (PublisherName) then
if utilities.is_set (PublicationPlace) then
Publisher = sepc .. " " .. PublicationPlace .. ": " .. PublisherName;
else
Publisher = sepc .. " " .. PublisherName;
end
elseif utilities.is_set (PublicationPlace) then
Publisher= sepc .. " " .. PublicationPlace;
end
-- Several of the above rely upon detecting this as nil, so do it last.
if (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical) or utilities.is_set (TransPeriodical)) then
if utilities.is_set (Title) or utilities.is_set (TitleNote) then
Periodical = sepc .. " " .. format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical, TransPeriodical_origin);
else
Periodical = format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical, TransPeriodical_origin);
end
end
local Language = A['Language'];
if utilities.is_set (Language) then
Language = language_parameter (Language); -- format, categories, name from ISO639-1, etc.
else
Language=''; -- language not specified so make sure this is an empty string;
--[[ TODO: need to extract the wrap_msg from language_parameter
so that we can solve parentheses bunching problem with Format/Language/TitleType
]]
end
--[[
Handle the oddity that is cite speech. This code overrides whatever may be the value assigned to TitleNote (through |department=) and forces it to be " (Speech)" so that
the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided).
]]
if "speech" == config.CitationClass then -- cite speech only
TitleNote = TitleType; -- move TitleType to TitleNote so that it renders ahead of |event=
TitleType = ''; -- and unset
if utilities.is_set (Periodical) then -- if Periodical, perhaps because of an included |website= or |journal= parameter
if utilities.is_set (Conference) then -- and if |event= is set
Conference = Conference .. sepc .. " "; -- then add appropriate punctuation to the end of the Conference variable before rendering
end
end
end
-- Piece all bits together at last. Here, all should be non-nil.
-- We build things this way because it is more efficient in LUA
-- not to keep reassigning to the same string variable over and over.
local tcommon;
local tcommon2; -- used for book cite when |contributor= is set
local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At;
if utilities.in_array (config.CitationClass, {"book", "citation"}) and not utilities.is_set (Periodical) then -- special cases for book cites
if utilities.is_set (Contributors) then -- when we are citing foreword, preface, introduction, etc.
tcommon = safe_join ({Title, TitleNote}, sepc); -- author and other stuff will come after this and before tcommon2
tcommon2 = safe_join ({TitleType, Series, Language, Volume, Others, Edition, Publisher}, sepc);
else
tcommon = safe_join ({Title, TitleNote, TitleType, Series, Language, Volume, Others, Edition, Publisher}, sepc);
end
elseif 'map' == config.CitationClass then -- special cases for cite map
if utilities.is_set (Chapter) then -- map in a book; TitleType is part of Chapter
tcommon = safe_join ({Title, Edition, Scale, Series, Language, Cartography, Others, Publisher, Volume}, sepc);
elseif utilities.is_set (Periodical) then -- map in a periodical
tcommon = safe_join ({Title, TitleType, Periodical, Scale, Series, Language, Cartography, Others, Publisher, Volume}, sepc);
else -- a sheet or stand-alone map
tcommon = safe_join ({Title, TitleType, Edition, Scale, Series, Language, Cartography, Others, Publisher}, sepc);
end
elseif 'episode' == config.CitationClass then -- special case for cite episode
tcommon = safe_join ({Title, TitleNote, TitleType, Series, Language, Edition, Publisher}, sepc);
else -- all other CS1 templates
tcommon = safe_join ({Title, TitleNote, Conference, Periodical, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc);
end
if #ID_list_t > 0 then
ID_list_t = safe_join( { sepc .. " ", table.concat( ID_list_t, sepc .. " " ), ID }, sepc );
else
ID_list_t = ID;
end
local Via = A['Via'];
Via = utilities.is_set (Via) and wrap_msg ('via', Via) or '';
local idcommon;
if 'audio-visual' == config.CitationClass or 'episode' == config.CitationClass then -- special case for cite AV media & cite episode position transcript
idcommon = safe_join( { ID_list_t, URL, Archived, Transcript, AccessDate, Via, Quote }, sepc );
else
idcommon = safe_join( { ID_list_t, URL, Archived, AccessDate, Via, Quote }, sepc );
end
local text;
local OrigDate = A['OrigDate'];
OrigDate = utilities.is_set (OrigDate) and wrap_msg ('origdate', OrigDate) or '';
if utilities.is_set (Date) then
if utilities.is_set (Authors) or utilities.is_set (Editors) then -- date follows authors or editors when authors not set
Date = " (" .. Date .. ")" .. OrigDate .. sepc .. " "; -- in parentheses
else -- neither of authors and editors set
if (string.sub(tcommon, -1, -1) == sepc) then -- if the last character of tcommon is sepc
Date = " " .. Date .. OrigDate; -- Date does not begin with sepc
else
Date = sepc .. " " .. Date .. OrigDate; -- Date begins with sepc
end
end
end
if utilities.is_set (Authors) then
if (not utilities.is_set (Date)) then -- when date is set it's in parentheses; no Authors termination
Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space
end
if utilities.is_set (Editors) then
local in_text = '';
local post_text;
if utilities.is_set (Chapter) and 0 == #c then
in_text = cfg.messages['in'] .. ' ';
in_text = cs2_lower(in_text); -- lowercase for cs2
end
if EditorCount <= 1 then
post_text = ' (' .. cfg.messages['editor'] .. ')'; -- be consistent with no-author, no-date case
else
post_text = ' (' .. cfg.messages['editors'] .. ')';
end
Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space
end
if utilities.is_set (Contributors) then -- book cite and we're citing the intro, preface, etc.
local by_text = sepc .. ' ' .. cfg.messages['by'] .. ' ';
by_text = cs2_lower(by_text); -- lowercase for cs2
Authors = by_text .. Authors; -- author follows title so tweak it here
if utilities.is_set (Editors) and utilities.is_set (Date) then -- when Editors make sure that Authors gets terminated
Authors = terminate_name_list (Authors, sepc); -- terminate with 0 or 1 sepc and a space
end
if (not utilities.is_set (Date)) then -- when date is set it's in parentheses; no Contributors termination
Contributors = terminate_name_list (Contributors, sepc); -- terminate with 0 or 1 sepc and a space
end
text = safe_join( {Contributors, Date, Chapter, tcommon, Authors, Editors, tcommon2, pgtext, idcommon }, sepc );
else
text = safe_join( {Authors, Date, Chapter, Editors, tcommon, pgtext, idcommon }, sepc );
end
elseif utilities.is_set (Editors) then
if utilities.is_set (Date) then
if EditorCount <= 1 then
Editors = Editors .. cfg.presentation['sep_name'] .. cfg.messages['editor'];
else
Editors = Editors .. cfg.presentation['sep_name'] .. cfg.messages['editors'];
end
else
if EditorCount <= 1 then
Editors = Editors .. " (" .. cfg.messages['editor'] .. ")" .. sepc .. " "
else
Editors = Editors .. " (" .. cfg.messages['editors'] .. ")" .. sepc .. " "
end
end
text = safe_join( {Editors, Date, Chapter, tcommon, pgtext, idcommon}, sepc );
else
if utilities.in_array (config.CitationClass, {"journal", "citation"}) and utilities.is_set (Periodical) then
text = safe_join( {Chapter, tcommon, pgtext, Date, idcommon}, sepc );
else
text = safe_join( {Chapter, tcommon, Date, pgtext, idcommon}, sepc );
end
end
if utilities.is_set (PostScript) and PostScript ~= sepc then
text = safe_join( {text, sepc}, sepc ); -- Deals with italics, spaces, etc.
if '.' == sepc then -- remove final seperator if present
text = text:gsub ('%' .. sepc .. '$', ''); -- dot must be escaped here
else
text = mw.ustring.gsub (text, sepc .. '$', ''); -- using ustring for non-dot sepc (likely a non-Latin character)
end
end
text = safe_join( {text, PostScript}, sepc );
-- Now enclose the whole thing in a <cite> element
local options_t = {};
options_t.class = cite_class_attribute_make (config.CitationClass, Mode);
local Ref = is_valid_parameter_value (A['Ref'], A:ORIGIN('Ref'), cfg.keywords_lists['ref'], nil, true); -- nil when |ref=harv; A['Ref'] else
if 'none' ~= cfg.keywords_xlate[(Ref and Ref:lower()) or ''] then
local namelist_t = {}; -- holds selected contributor, author, editor name list
local year = first_set ({Year, anchor_year}, 2); -- Year first for legacy citations and for YMD dates that require disambiguation
if #c > 0 then -- if there is a contributor list
namelist_t = c; -- select it
elseif #a > 0 then -- or an author list
namelist_t = a;
elseif #e > 0 then -- or an editor list
namelist_t = e;
end
local citeref_id;
if #namelist_t > 0 then -- if there are names in namelist_t
citeref_id = make_citeref_id (namelist_t, year); -- go make the CITEREF anchor
if mw.uri.anchorEncode (citeref_id) == ((Ref and mw.uri.anchorEncode (Ref)) or '') then -- Ref may already be encoded (by {{sfnref}}) so citeref_id must be encoded before comparison
utilities.set_message ('maint_ref_duplicates_default');
end
else
citeref_id = ''; -- unset
end
options_t.id = Ref or citeref_id;
end
if string.len (text:gsub('%b<>', '')) <= 2 then -- remove html and html-like tags; then get length of what remains;
z.error_cats_t = {}; -- blank the categories list
z.error_msgs_t = {}; -- blank the error messages list
OCinSoutput = nil; -- blank the metadata string
text = ''; -- blank the the citation
utilities.set_message ('err_empty_citation'); -- set empty citation message and category
end
local render_t = {}; -- here we collect the final bits for concatenation into the rendered citation
if is_preview_mode and (0 ~= #z.error_msgs_t or 0 ~= #z.maint_cats_t) then -- when in preview mode
if not utilities.is_set (options_t.id) then -- and when this template has not created an anchor ID
math.randomseed (tonumber (mw.getLanguage ('en'):formatDate ('U')) * 10000 + os.clock() * 10000);
options_t.id = 'CITEREF_temp_preview_id_' .. math.random (100000, 999999); -- create temporary anchor ID for preview mode
end
end
if utilities.is_set (options_t.id) then -- here we wrap the rendered citation in <cite ...>...</cite> tags
options_t.id = mw.uri.anchorEncode(options_t.id); -- do this here; also used when adding preview warning messages
table.insert (render_t, utilities.substitute (cfg.presentation['cite-id'], {options_t.id, mw.text.nowiki(options_t.class), text})); -- when |ref= is set or when there is a namelist
else
table.insert (render_t, utilities.substitute (cfg.presentation['cite'], {mw.text.nowiki(options_t.class), text})); -- when |ref=none or when namelist_t empty and |ref= is missing or is empty
end
if OCinSoutput then -- blanked when citation is 'empty' so don't bother to add boilerplate metadata span
table.insert (render_t, utilities.substitute (cfg.presentation['ocins'], OCinSoutput)); -- format and append metadata to the citation
end
local template_name = cfg.citation_class_map_t[config.CitationClass];
local template_link = '[[Template:' .. template_name .. '|' .. template_name .. ']]';
local msg_prefix = '<code class="cs1-code">{{' .. template_link .. '}}</code>: ';
if 0 ~= #z.error_msgs_t then
mw.addWarning (utilities.substitute (cfg.messages.warning_msg_e, {template_link, options_t.id}));
table.insert (render_t, ' '); -- insert a space between citation and its error messages
table.sort (z.error_msgs_t); -- sort the error messages list; sorting includes wrapping <span> and <code> tags; hidden-error sorts ahead of visible-error
local hidden = true; -- presume that the only error messages emited by this template are hidden
for _, v in ipairs (z.error_msgs_t) do -- spin through the list of error messages
if v:find ('cs1-visible-error', 1, true) then -- look for the visible error class name
hidden = false; -- found one; so don't hide the error message prefix
break; -- and done because no need to look further
end
end
z.error_msgs_t[1] = table.concat ({utilities.error_comment (msg_prefix, hidden), z.error_msgs_t[1]}); -- add error message prefix to first error message to prevent extraneous punctuation
table.insert (render_t, table.concat (z.error_msgs_t, '; ')); -- make a big string of error messages and add it to the rendering
end
if 0 ~= #z.maint_cats_t then
mw.addWarning (utilities.substitute (cfg.messages.warning_msg_m, {template_link, options_t.id}));
table.sort (z.maint_cats_t); -- sort the maintenance messages list
local maint_msgs_t = {}; -- here we collect all of the maint messages
if 0 == #z.error_msgs_t then -- if no error messages
table.insert (maint_msgs_t, msg_prefix); -- insert message prefix in maint message livery
end
for _, v in ipairs( z.maint_cats_t ) do -- append maintenance categories
table.insert (maint_msgs_t, -- assemble new maint message and add it to the maint_msgs_t table
table.concat ({v, ' (', utilities.substitute (cfg.messages[':cat wikilink'], v), ')'})
);
end
table.insert (render_t, utilities.substitute (cfg.presentation['hidden-maint'], table.concat (maint_msgs_t, ' '))); -- wrap the group of maint messages with proper presentation and save
end
if not no_tracking_cats then
local sort_key;
local cat_wikilink = 'cat wikilink';
if cfg.enable_sort_keys then -- when namespace sort keys enabled
local namespace_number = mw.title.getCurrentTitle().namespace; -- get namespace number for this wikitext
sort_key = (0 ~= namespace_number and (cfg.name_space_sort_keys[namespace_number] or cfg.name_space_sort_keys.other)) or nil; -- get sort key character; nil for mainspace
cat_wikilink = (not sort_key and 'cat wikilink') or 'cat wikilink sk'; -- make <cfg.messages> key
end
for _, v in ipairs (z.error_cats_t) do -- append error categories
table.insert (render_t, utilities.substitute (cfg.messages[cat_wikilink], {v, sort_key}));
end
if cfg.id_limits_data_load_fail then -- boolean true when load failed
utilities.set_message ('maint_id_limit_load_fail'); -- done here because this maint cat emits no message
end
for _, v in ipairs (z.maint_cats_t) do -- append maintenance categories
table.insert (render_t, utilities.substitute (cfg.messages[cat_wikilink], {v, sort_key}));
end
for _, v in ipairs (z.prop_cats_t) do -- append properties categories
table.insert (render_t, utilities.substitute (cfg.messages['cat wikilink'], v)); -- no sort keys
end
end
return table.concat (render_t); -- make a big string and done
end
--[[--------------------------< V A L I D A T E >--------------------------------------------------------------
Looks for a parameter's name in one of several whitelists.
Parameters in the whitelist can have three values:
true - active, supported parameters
false - deprecated, supported parameters
nil - unsupported parameters
]]
local function validate (name, cite_class, empty)
local enum_name; -- parameter name with enumerator (if any) replaced with '#'
local state;
local function state_test () -- local function to do testing of state values; operates on the upvalues <state> and <name>
if true == state then return true; end -- valid actively supported parameter
if false == state then
if empty then return nil; end -- empty deprecated parameters are treated as unknowns
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
if 'tracked' == state then
local base_name = name:gsub ('%d', ''); -- strip enumerators from parameter names that have them to get the base name
utilities.add_prop_cat ('tracked-param', {base_name}, base_name); -- add a properties category; <base_name> modifies <key>
return true;
end
return nil;
end
if 'string' ~= type (name) or name:find ('#') then -- # is a cs1|2 reserved character so parameters with # not permitted; positional params are 'number' type; not supported
return nil;
end
-- replace enumerator digit(s) with # (|last25= becomes |last#=) (mw.ustring because non-Western 'local' digits)
enum_name = mw.ustring.gsub (name, '%d+$', '#'); -- where enumerator is last charaters in parameter name (these to protect |s2cid=)
enum_name = mw.ustring.gsub (enum_name, '%d+([%-l])', '#%1'); -- where enumerator is in the middle of the parameter name; |author#link= is the oddity
if 'document' == cite_class then -- special case for {{cite document}}
state = whitelist.document_parameters_t[enum_name]; -- this list holds enumerated and nonenumerated parameters
if true == state_test () then return true; end
return false;
end
if utilities.in_array (cite_class, whitelist.preprint_template_list_t) then -- limited parameter sets allowed for these templates
state = whitelist.limited_parameters_t[enum_name]; -- this list holds enumerated and nonenumerated parameters
if true == state_test () then return true; end
state = whitelist.preprint_arguments_t[cite_class][name]; -- look in the parameter-list for the template identified by cite_class
if true == state_test () then return true; end
return false; -- not supported because not found or name is set to nil
end -- end limited parameter-set templates
if utilities.in_array (cite_class, whitelist.unique_param_template_list_t) then -- template-specific parameters for templates that accept parameters from the basic argument list
state = whitelist.unique_arguments_t[cite_class][name]; -- look in the template-specific parameter-lists for the template identified by cite_class
if true == state_test () then return true; end
end -- if here, fall into general validation
state = whitelist.common_parameters_t[enum_name]; -- all other templates; all normal parameters allowed; this list holds enumerated and nonenumerated parameters
if true == state_test () then return true; end
return false; -- not supported because not found or name is set to nil
end
--[=[-------------------------< I N T E R _ W I K I _ C H E C K >----------------------------------------------
check <value> for inter-language interwiki-link markup. <prefix> must be a MediaWiki-recognized language
code. when these values have the form (without leading colon):
[[<prefix>:link|label]] return label as plain-text
[[<prefix>:link]] return <prefix>:link as plain-text
return value as is else
]=]
local function inter_wiki_check (parameter, value)
local prefix = value:match ('%[%[(%a+):'); -- get an interwiki prefix if one exists
local _;
if prefix and cfg.inter_wiki_map[prefix:lower()] then -- if prefix is in the map, needs preceding colon so
utilities.set_message ('err_bad_paramlink', parameter); -- emit an error message
_, value, _ = utilities.is_wikilink (value); -- extract label portion from wikilink
end
return value;
end
--[[--------------------------< M I S S I N G _ P I P E _ C H E C K >------------------------------------------
Look at the contents of a parameter. If the content has a string of characters and digits followed by an equal
sign, compare the alphanumeric string to the list of cs1|2 parameters. If found, then the string is possibly a
parameter that is missing its pipe. There are two tests made:
{{cite ... |title=Title access-date=2016-03-17}} -- the first parameter has a value and whitespace separates that value from the missing pipe parameter name
{{cite ... |title=access-date=2016-03-17}} -- the first parameter has no value (whitespace after the first = is trimmed by MediaWiki)
cs1|2 shares some parameter names with XML/HTML attributes: class=, title=, etc. To prevent false positives XML/HTML
tags are removed before the search.
If a missing pipe is detected, this function adds the missing pipe maintenance category.
]]
local function missing_pipe_check (parameter, value)
local capture;
value = value:gsub ('%b<>', ''); -- remove XML/HTML tags because attributes: class=, title=, etc.
capture = value:match ('%s+(%a[%w%-]+)%s*=') or value:match ('^(%a[%w%-]+)%s*='); -- find and categorize parameters with possible missing pipes
if capture and validate (capture) then -- if the capture is a valid parameter name
utilities.set_message ('err_missing_pipe', parameter);
end
end
--[[--------------------------< H A S _ E X T R A N E O U S _ P U N C T >--------------------------------------
look for extraneous terminal punctuation in most parameter values; parameters listed in skip table are not checked
]]
local function has_extraneous_punc (param, value)
if 'number' == type (param) then
return;
end
param = param:gsub ('%d+', '#'); -- enumerated name-list mask params allow terminal punct; normalize
if cfg.punct_skip[param] then
return; -- parameter name found in the skip table so done
end
if value:match ('[,;:]$') then
utilities.set_message ('maint_extra_punct'); -- has extraneous punctuation; add maint cat
end
if value:match ('^=') then -- sometimes an extraneous '=' character appears ...
utilities.set_message ('maint_extra_punct'); -- has extraneous punctuation; add maint cat
end
end
--[[--------------------------< H A S _ T W L _ U R L >--------------------------------------------------------
look for The Wikipedia Library urls in url-holding parameters. TWL urls are accessible only for readers who are
active extended confirmed Wikipedia editors. This function sets an error message when such urls are discovered
and when appropriate, sets the |<param>-url-access=subscription. returns nothing.
looks for: '.wikipedialibrary.idm.oclc.org'
]]
local function has_twl_url (url_params_t, cite_args_t)
local url_error_t = {}; -- sequence of url-holding parameters that have a TWL url
for param, value in pairs (url_params_t) do
if value:find ('%.wikipedialibrary%.idm%.oclc%.org') then -- has the TWL base url?
table.insert (url_error_t, param); -- add parameter name to the error list
end
end
if 0 ~= #url_error_t then -- non-zero when there are errors
table.sort (url_error_t); -- sor for error messaging
for i, param in ipairs (url_error_t) do
if cfg.url_access_map_t[param] then -- if <param> has a matching -access parameter
cite_args_t[cfg.url_access_map_t[param]] = cfg.keywords_xlate.subscription; -- set |<param>-url-access=subscription
end
url_error_t[i] = utilities.wrap_style ('parameter', param); -- make the parameter pretty for error message
end
utilities.set_message ('err_param_has_twl_url', {utilities.make_sep_list (#url_error_t, url_error_t)}); -- add this error message
end
end
--[[--------------------------< M I S C _ U R L _ D E T E C T >------------------------------------------------
look for miscellaneous urls that might be converted to, or are duplicates of, identifiers.
]]
local misc_url_patterns_t = {
'idm%.oclc%.org', -- but not wikipedialibrary.idm.oclc.org; has_twl_url()
'https?://citeseerx?%.ist%.psu%.edu/', -- simplified so we catch all citeseer and citeseerx urls except ~/document/... (the 'new' form)
}
local ignore_patterns_t = {
'wikipedialibrary.idm.oclc.org', -- handled by has_twl_url()
'https?://citeseerx?%.ist%.psu%.edu/document', -- 'new'-form citeseerx urls that mostly work; ignore for now
}
local function misc_url_detect (url_params_t)
local ignore_flag = false;
for _, value in pairs (url_params_t) do
for _, ignore_pattern in ipairs (ignore_patterns_t) do
if value:find (ignore_pattern) then -- matches this ignore_pattern?
ignore_flag = true; -- found a pattern to ignore
break; --
end
end
if not ignore_flag then -- if ignore_flag is set then don't bother to test this url <value>
for _, misc_pattern in ipairs (misc_url_patterns_t) do
if value:find (misc_pattern) then -- matches this misc_pattern?
utilities.set_message ('maint_misc_url'); -- found one; set the message
return; -- and done; no need to test other <value>s
end
end
end
ignore_flag = false; -- reset
end
end
--[[--------------------------< H A S _ E X T R A N E O U S _ U R L >------------------------------------------
look for extraneous url parameter values; parameters listed in skip table are not checked
]]
local function has_extraneous_url (non_url_param_t)
local url_error_t = {};
check_for_url (non_url_param_t, url_error_t); -- extraneous url check
if 0 ~= #url_error_t then -- non-zero when there are errors
table.sort (url_error_t);
utilities.set_message ('err_param_has_ext_link', {utilities.make_sep_list (#url_error_t, url_error_t)}); -- add this error message
end
end
--[[--------------------------< _ C I T A T I O N >------------------------------------------------------------
Module entry point
frame – from template call (citation()); may be nil when called from another module
args_t – table of all cs1|2 parameters in the template (the parent frame)
config_t – table of template-supplied parameter (the #invoke frame)
]]
local function _citation (frame, args_t, config_t) -- save a copy in case we need to display an error message in preview mode
if not frame then
frame = mw.getCurrentFrame(); -- if called from another module, get a frame for frame-provided functions
end
-- i18n: set the name that your wiki uses to identify sandbox subpages from sandbox template invoke (or can be set here)
local sandbox = ((config_t.SandboxPath and '' ~= config_t.SandboxPath) and config_t.SandboxPath) or '/sandbox'; -- sandbox path from {{#invoke:Citation/CS1/sandbox|citation|SandboxPath=/...}}
is_sandbox = nil ~= string.find (frame:getTitle(), sandbox, 1, true); -- is this invoke the sandbox module?
sandbox = is_sandbox and sandbox or ''; -- use i18n sandbox to load sandbox modules when this module is the sandox; live modules else
cfg = mw.loadData ('Module:Citation/CS1/Configuration' .. sandbox); -- load sandbox versions of support modules when {{#invoke:Citation/CS1/sandbox|...}}; live modules else
whitelist = mw.loadData ('Module:Citation/CS1/Whitelist' .. sandbox);
utilities = require ('Module:Citation/CS1/Utilities' .. sandbox);
validation = require ('Module:Citation/CS1/Date_validation' .. sandbox);
identifiers = require ('Module:Citation/CS1/Identifiers' .. sandbox);
metadata = require ('Module:Citation/CS1/COinS' .. sandbox);
utilities.set_selected_modules (cfg); -- so that functions in Utilities can see the selected cfg tables
identifiers.set_selected_modules (cfg, utilities); -- so that functions in Identifiers can see the selected cfg tables and selected Utilities module
validation.set_selected_modules (cfg, utilities); -- so that functions in Date validataion can see selected cfg tables and the selected Utilities module
metadata.set_selected_modules (cfg, utilities); -- so that functions in COinS can see the selected cfg tables and selected Utilities module
z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities
local cite_args_t = {}; -- because args_t is the parent (template) frame args (which cannot be modified); params and their values will be placed here
is_preview_mode = not utilities.is_set (frame:preprocess ('{{REVISIONID}}'));
local suggestions = {}; -- table where we store suggestions if we need to loadData them
local error_text; -- used as a flag
local capture; -- the single supported capture when matching unknown parameters using patterns
local empty_unknowns = {}; -- sequence table to hold empty unknown params for error message listing
for k, v in pairs (args_t) do -- get parameters from the parent (template) frame
v = mw.ustring.gsub (v, '^%s*(.-)%s*$', '%1'); -- trim leading/trailing whitespace; when v is only whitespace, becomes empty string
if v ~= '' then
if cfg.enum_needs_xlation and 'string' == type (k) then -- for wikis that set date_names['local_digits'] to non-western digits
k = mw.ustring.gsub (k, '%d', cfg.date_names.local_digits); -- translate 'local' digits enumerators to Western 0-9
end
if not validate( k, config_t.CitationClass ) then
if type (k) ~= 'string' then -- exclude empty numbered parameters
if v:match("%S+") ~= nil then
error_text = utilities.set_message ('err_text_ignored', {v});
end
elseif validate (k:lower(), config_t.CitationClass) then
error_text = utilities.set_message ('err_parameter_ignored_suggest', {k, k:lower()}); -- suggest the lowercase version of the parameter
else
if nil == suggestions.suggestions then -- if this table is nil then we need to load it
suggestions = mw.loadData ('Module:Citation/CS1/Suggestions' .. sandbox); --load sandbox version of suggestion module when {{#invoke:Citation/CS1/sandbox|...}}; live module else
end
for pattern, param in pairs (suggestions.patterns) do -- loop through the patterns to see if we can suggest a proper parameter
capture = k:match (pattern); -- the whole match if no capture in pattern else the capture if a match
if capture then -- if the pattern matches
param = utilities.substitute (param, capture); -- add the capture to the suggested parameter (typically the enumerator)
if validate (param, config_t.CitationClass) then -- validate the suggestion to make sure that the suggestion is supported by this template (necessary for limited parameter lists)
error_text = utilities.set_message ('err_parameter_ignored_suggest', {k, param}); -- set the suggestion error message
else
error_text = utilities.set_message ('err_parameter_ignored', {k}); -- suggested param not supported by this template
v = ''; -- unset
end
end
end
if not utilities.is_set (error_text) then -- couldn't match with a pattern, is there an explicit suggestion?
if (suggestions.suggestions[ k:lower() ] ~= nil) and validate (suggestions.suggestions[ k:lower() ], config_t.CitationClass) then
utilities.set_message ('err_parameter_ignored_suggest', {k, suggestions.suggestions[ k:lower() ]});
else
utilities.set_message ('err_parameter_ignored', {k});
v = ''; -- unset value assigned to unrecognized parameters (this for the limited parameter lists)
end
end
end
end
cite_args_t[k] = v; -- save this parameter and its value
elseif not utilities.is_set (v) then -- for empty parameters
if not validate (k, config_t.CitationClass, true) then -- is this empty parameter a valid parameter
k = ('' == k) and cfg.err_msg_supl.empty_str or k; -- when k is empty string (or was space(s) trimmed to empty string), replace with descriptive text
table.insert (empty_unknowns, utilities.wrap_style ('parameter', k)); -- format for error message and add to the list
end
end
end
if 0 ~= #empty_unknowns then -- create empty unknown error message
utilities.set_message ('err_param_unknown_empty', {
1 == #empty_unknowns and '' or 's',
utilities.make_sep_list (#empty_unknowns, empty_unknowns)
});
end
local non_url_param_t = {}; -- table of parameters and values that are not url-holding parameters
local url_param_t = {}; -- table of url-holding paramters and their values
for k, v in pairs (cite_args_t) do
if 'string' == type (k) then -- don't evaluate positional parameters
has_invisible_chars (k, v); -- look for invisible characters
end
has_extraneous_punc (k, v); -- look for extraneous terminal punctuation in parameter values
missing_pipe_check (k, v); -- do we think that there is a parameter that is missing a pipe?
cite_args_t[k] = inter_wiki_check (k, v); -- when language interwiki-linked parameter missing leading colon replace with wiki-link label
if 'string' == type (k) then -- when parameter k is not positional
if not cfg.url_skip[k] then -- and not in url skip table
non_url_param_t[k] = v; -- make a parameter/value list for extraneous url check
else -- and is in url skip table (a url-holding parameter)
url_param_t[k] = v; -- make a parameter/value list to check for values that are The Wikipedia Library url
end
end
end
if cfg.suppress_archive_today_urls then
has_archive_today_url (cite_args_t); -- look for and suppress archive.today urls and dependent parameters for all templates
end
has_extraneous_url (non_url_param_t); -- look for url in parameter values where a url does not belong
has_twl_url (url_param_t, cite_args_t); -- look for url-holding parameters that hold a The Wikipedia Library url
misc_url_detect (url_param_t); -- look for url-holding parameters that hold certain miscellaneous urls
return table.concat ({
frame:extensionTag ('templatestyles', '', {src='Module:Citation/CS1' .. sandbox .. '/styles.css'}),
citation0 (config_t, cite_args_t)
});
end
--[[--------------------------< C I T A T I O N >--------------------------------------------------------------
Template entry point
]]
local function citation (frame)
local config_t = {}; -- table to store parameters from the module {{#invoke:}}
local args_t = frame:getParent().args; -- get template's preset parameters
for k, v in pairs (frame.args) do -- get parameters from the {{#invoke}} frame
config_t[k] = v;
-- args_t[k] = v; -- crude debug support that allows us to render a citation from module {{#invoke:}}; skips parameter validation; TODO: keep?
end
return _citation (frame, args_t, config_t)
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
citation = citation, -- template entry point
_citation = _citation, -- module entry point
}
3oosv6gdshi4e6cm8r0tq8pjoevqbo6
32816
32815
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Citation/CS1]]
32815
Scribunto
text/plain
require ('strict');
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
each of these counts against the Lua upvalue limit
]]
local validation; -- functions in Module:Citation/CS1/Date_validation
local utilities; -- functions in Module:Citation/CS1/Utilities
local z = {}; -- table of tables in Module:Citation/CS1/Utilities
local identifiers; -- functions and tables in Module:Citation/CS1/Identifiers
local metadata; -- functions in Module:Citation/CS1/COinS
local cfg = {}; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
local whitelist = {}; -- table of tables listing valid template parameter names; defined in Module:Citation/CS1/Whitelist
--[[------------------< P A G E S C O P E V A R I A B L E S >---------------
declare variables here that have page-wide scope that are not brought in from
other modules; that are created here and used here
]]
local added_deprecated_cat; -- boolean flag so that the category is added only once
local added_vanc_errs; -- boolean flag so we only emit one Vancouver error / category
local added_generic_name_errs; -- boolean flag so we only emit one generic name error / category and stop testing names once an error is encountered
local added_numeric_name_errs; -- boolean flag so we only emit one numeric name error / category and stop testing names once an error is encountered
local added_numeric_name_maint; -- boolean flag so we only emit one numeric name maint category and stop testing names once a category has been emitted
local is_preview_mode; -- true when article is in preview mode; false when using 'Preview page with this template' (previewing the module)
local is_sandbox; -- true when using sandbox modules to render citation
local url_was_archive_today; -- boolean flag set to true when has_archive_today_url() has unset |url= because it held a deprecated archive.today url
--[[--------------------------< F I R S T _ S E T >------------------------------------------------------------
Locates and returns the first set value in a table of values where the order established in the table,
left-to-right (or top-to-bottom), is the order in which the values are evaluated. Returns nil if none are set.
This version replaces the original 'for _, val in pairs do' and a similar version that used ipairs. With the pairs
version the order of evaluation could not be guaranteed. With the ipairs version, a nil value would terminate
the for-loop before it reached the actual end of the list.
]]
local function first_set (list, count)
local i = 1;
while i <= count do -- loop through all items in list
if utilities.is_set( list[i] ) then
return list[i]; -- return the first set list member
end
i = i + 1; -- point to next
end
end
--[[--------------------------< A D D _ V A N C _ E R R O R >----------------------------------------------------
Adds a single Vancouver system error message to the template's output regardless of how many error actually exist.
To prevent duplication, added_vanc_errs is nil until an error message is emitted.
added_vanc_errs is a Boolean declared in page scope variables above
]]
local function add_vanc_error (source, position)
if added_vanc_errs then return end
added_vanc_errs = true; -- note that we've added this category
utilities.set_message ('err_vancouver', {source, position});
end
--[[--------------------------< I S _ S C H E M E >------------------------------------------------------------
does this thing that purports to be a URI scheme seem to be a valid scheme? The scheme is checked to see if it
is in agreement with http://tools.ietf.org/html/std66#section-3.1 which says:
Scheme names consist of a sequence of characters beginning with a
letter and followed by any combination of letters, digits, plus
("+"), period ("."), or hyphen ("-").
returns true if it does, else false
]]
local function is_scheme (scheme)
return scheme and scheme:match ('^%a[%a%d%+%.%-]*:'); -- true if scheme is set and matches the pattern
end
--[=[-------------------------< I S _ D O M A I N _ N A M E >--------------------------------------------------
Does this thing that purports to be a domain name seem to be a valid domain name?
Syntax defined here: http://tools.ietf.org/html/rfc1034#section-3.5
BNF defined here: https://tools.ietf.org/html/rfc4234
Single character names are generally reserved; see https://tools.ietf.org/html/draft-ietf-dnsind-iana-dns-01#page-15;
see also [[Single-letter second-level domain]]
list of TLDs: https://www.iana.org/domains/root/db
RFC 952 (modified by RFC 1123) requires the first and last character of a hostname to be a letter or a digit
(see http://tools.ietf.org/html/rfc952 §GRAMMATICAL HOST TABLE SPECIFICATION §§B. Lexical grammar <name>; see
http://tools.ietf.org/html/rfc1123#section-2). Between the first and last characters the name may use letters,
digits, and the hyphen.
Also allowed are IPv4 addresses. IPv6 not supported
domain is expected to be stripped of any path so that the last character in the last character of the TLD. tld
is two or more alpha characters. Any preceding '//' (from splitting a URL with a scheme) will be stripped
here. Perhaps not necessary but retained in case it is necessary for IPv4 dot decimal.
There are several tests:
the first character of the whole domain name including subdomains must be a letter or a digit
internationalized domain name (ASCII characters with .xn-- ASCII Compatible Encoding (ACE) prefix xn-- in the TLD) see https://tools.ietf.org/html/rfc3490
single-letter/digit second-level domains in the .org, .cash, and .today TLDs
q, x, and z SL domains in the .com TLD
i and q SL domains in the .net TLD
single-letter SL domains in the ccTLDs (where the ccTLD is two letters)
two-character SL domains in gTLDs (where the gTLD is two or more letters)
three-plus-character SL domains in gTLDs (where the gTLD is two or more letters)
IPv4 dot-decimal address format; TLD not allowed
returns true if domain appears to be a proper name and TLD or IPv4 address, else false
]=]
local function is_domain_name (domain)
if not domain then
return false; -- if not set, abandon
end
domain = domain:gsub ('^//', ''); -- strip '//' from domain name if present; done here so we only have to do it once
local sl_domain = domain:match ('([^%.]+)%.[^%.]+$') or domain; -- test the second level domain name; ignore subdomains some (rarely) include chars not letter-digit-hyphen
if not (sl_domain:match ('^%w') and sl_domain:match ('%w$') and -- first and last characters must be letter or digit
sl_domain:match ('^[%w%-]+$')) then -- all other characters must be letters, digits, or hyphen-minus
return false;
end
if domain:match ('^%a+:') then -- hack to detect things that look like s:Page:Title where Page: is namespace at Wikisource
return false;
end
local patterns = { -- patterns that look like URLs
'%f[%w][%w][%w%-]+[%w]%.%a%a+$', -- three or more character hostname.hostname or hostname.tld
'%f[%w][%w][%w%-]+[%w]%.xn%-%-[%w]+$', -- internationalized domain name with ACE prefix
'%f[%a][qxz]%.com$', -- assigned one character .com hostname (x.com times out 2015-12-10)
'%f[%a][iq]%.net$', -- assigned one character .net hostname (q.net registered but not active 2015-12-10)
'%f[%w][%w]%.%a%a$', -- one character hostname and ccTLD (2 chars)
'%f[%w][%w][%w]%.%a%a+$', -- two character hostname and TLD
'^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?', -- IPv4 address
'[%a%d]+%:?' -- IPv6 address
}
for _, pattern in ipairs (patterns) do -- loop through the patterns list
if domain:match (pattern) then
return true; -- if a match then we think that this thing that purports to be a URL is a URL
end
end
for _, d in ipairs (cfg.single_letter_2nd_lvl_domains_t) do -- look for single letter second level domain names for these top level domains
if domain:match ('%f[%w][%w]%.' .. d) then
return true
end
end
return false; -- no matches, we don't know what this thing is
end
--[[--------------------------< I S _ U R L >------------------------------------------------------------------
returns true if the scheme and domain parts of a URL appear to be a valid URL; else false.
This function is the last step in the validation process. This function is separate because there are cases that
are not covered by split_url(), for example is_parameter_ext_wikilink() which is looking for bracketted external
wikilinks.
]]
local function is_url (scheme, domain)
if utilities.is_set (scheme) then -- if scheme is set check it and domain
return is_scheme (scheme) and is_domain_name (domain);
else
return is_domain_name (domain); -- scheme not set when URL is protocol-relative
end
end
--[[--------------------------< S P L I T _ U R L >------------------------------------------------------------
Split a URL into a scheme, authority indicator, and domain.
First remove Fully Qualified Domain Name terminator (a dot following TLD) (if any) and any path(/), query(?) or fragment(#).
If protocol-relative URL, return nil scheme and domain else return nil for both scheme and domain.
When not protocol-relative, get scheme, authority indicator, and domain. If there is an authority indicator (one
or more '/' characters immediately following the scheme's colon), make sure that there are only 2.
Any URL that does not have news: scheme must have authority indicator (//). TODO: are there other common schemes
like news: that don't use authority indicator?
Strip off any port and path;
]]
local function split_url (url_str)
local scheme, authority, domain;
url_str = url_str:gsub ('([%a%d])%.?[/%?#].*$', '%1'); -- strip FQDN terminator and path(/), query(?), fragment (#) (the capture prevents false replacement of '//')
if url_str:match ('^//%S*') then -- if there is what appears to be a protocol-relative URL
domain = url_str:match ('^//(%S*)')
elseif url_str:match ('%S-:/*%S+') then -- if there is what appears to be a scheme, optional authority indicator, and domain name
scheme, authority, domain = url_str:match ('(%S-:)(/*)(%S+)'); -- extract the scheme, authority indicator, and domain portions
if utilities.is_set (authority) then
authority = authority:gsub ('//', '', 1); -- replace place 1 pair of '/' with nothing;
if utilities.is_set(authority) then -- if anything left (1 or 3+ '/' where authority should be) then
return scheme; -- return scheme only making domain nil which will cause an error message
end
else
if not scheme:match ('^news:') then -- except for news:..., MediaWiki won't link URLs that do not have authority indicator; TODO: a better way to do this test?
return scheme; -- return scheme only making domain nil which will cause an error message
end
end
domain = domain:gsub ('(%a):%d+', '%1'); -- strip port number if present
end
return scheme, domain;
end
--[[--------------------------< L I N K _ P A R A M _ O K >---------------------------------------------------
checks the content of |title-link=, |series-link=, |author-link=, etc. for properly formatted content: no wikilinks, no URLs
Link parameters are to hold the title of a Wikipedia article, so none of the WP:TITLESPECIALCHARACTERS are allowed:
# < > [ ] | { } _
except the underscore which is used as a space in wiki URLs and # which is used for section links
returns false when the value contains any of these characters.
When there are no illegal characters, this function returns TRUE if value DOES NOT appear to be a valid URL (the
|<param>-link= parameter is ok); else false when value appears to be a valid URL (the |<param>-link= parameter is NOT ok).
]]
local function link_param_ok (value)
local scheme, domain;
if value:find ('[<>%[%]|{}]') then -- if any prohibited characters
return false;
end
scheme, domain = split_url (value); -- get scheme or nil and domain or nil from URL;
return not is_url (scheme, domain); -- return true if value DOES NOT appear to be a valid URL
end
--[[--------------------------< L I N K _ T I T L E _ O K >---------------------------------------------------
Use link_param_ok() to validate |<param>-link= value and its matching |<title>= value.
|<title>= may be wiki-linked but not when |<param>-link= has a value. This function emits an error message when
that condition exists
check <link> for inter-language interwiki-link prefix. prefix must be a MediaWiki-recognized language
code and must begin with a colon.
]]
local function link_title_ok (link, lorig, title, torig)
local orig;
if utilities.is_set (link) then -- don't bother if <param>-link doesn't have a value
if not link_param_ok (link) then -- check |<param>-link= markup
orig = lorig; -- identify the failing link parameter
elseif title:find ('%[%[') then -- check |title= for wikilink markup
orig = torig; -- identify the failing |title= parameter
elseif link:match ('^%a+:') then -- if the link is what looks like an interwiki
local prefix = link:match ('^(%a+):'):lower(); -- get the interwiki prefix
if cfg.inter_wiki_map[prefix] then -- if prefix is in the map, must have preceding colon
orig = lorig; -- flag as error
end
end
end
if utilities.is_set (orig) then
link = ''; -- unset
utilities.set_message ('err_bad_paramlink', orig); -- URL or wikilink in |title= with |title-link=;
end
return link; -- link if ok, empty string else
end
--[[--------------------------< C H E C K _ U R L >------------------------------------------------------------
Determines whether a URL string appears to be valid.
First we test for space characters. If any are found, return false. Then split the URL into scheme and domain
portions, or for protocol-relative (//example.com) URLs, just the domain. Use is_url() to validate the two
portions of the URL. If both are valid, or for protocol-relative if domain is valid, return true, else false.
Because it is different from a standard URL, and because this module used external_link() to make external links
that work for standard and news: links, we validate newsgroup names here. The specification for a newsgroup name
is at https://tools.ietf.org/html/rfc5536#section-3.1.4
]]
local function check_url( url_str )
if nil == url_str:match ("^%S+$") then -- if there are any spaces in |url=value it can't be a proper URL
return false;
end
local scheme, domain;
scheme, domain = split_url (url_str); -- get scheme or nil and domain or nil from URL;
if 'news:' == scheme then -- special case for newsgroups
return domain:match('^[%a%d%+%-_]+%.[%a%d%+%-_%.]*[%a%d%+%-_]$');
end
return is_url (scheme, domain); -- return true if value appears to be a valid URL
end
--[=[-------------------------< I S _ P A R A M E T E R _ E X T _ W I K I L I N K >----------------------------
Return true if a parameter value has a string that begins and ends with square brackets [ and ] and the first
non-space characters following the opening bracket appear to be a URL. The test will also find external wikilinks
that use protocol-relative URLs. Also finds bare URLs.
The frontier pattern prevents a match on interwiki-links which are similar to scheme:path URLs. The tests that
find bracketed URLs are required because the parameters that call this test (currently |title=, |chapter=, |work=,
and |publisher=) may have wikilinks and there are articles or redirects like '//Hus' so, while uncommon, |title=[[//Hus]]
is possible as might be [[en://Hus]].
]=]
local function is_parameter_ext_wikilink (value)
local scheme, domain;
if value:match ('%f[%[]%[%a%S*:%S+.*%]') then -- if ext. wikilink with scheme and domain: [xxxx://yyyyy.zzz]
scheme, domain = split_url (value:match ('%f[%[]%[(%a%S*:%S+).*%]'));
elseif value:match ('%f[%[]%[//%S+.*%]') then -- if protocol-relative ext. wikilink: [//yyyyy.zzz]
scheme, domain = split_url (value:match ('%f[%[]%[(//%S+).*%]'));
elseif value:match ('%a%S*:%S+') then -- if bare URL with scheme; may have leading or trailing plain text
scheme, domain = split_url (value:match ('(%a%S*:%S+)'));
elseif value:match ('^//%S+') or value:match ('%s//%S+') then -- if protocol-relative bare URL: //yyyyy.zzz; authority indicator (//) must be be preceded nothing or by whitespace
scheme, domain = split_url (value:match ('(//%S+)')); -- what is left should be the domain
else
return false; -- didn't find anything that is obviously a URL
end
return is_url (scheme, domain); -- return true if value appears to be a valid URL
end
--[[--------------------------< I S _ A R C H I V E _ T O D A Y _ U R L >--------------------------------------
archive.today (and .ph, .is, .md, .li, .fo, .vn) are deprecated. See Wikipedia:Requests_for_comment/Archive.is_RFC_5
(Special:Permalink/1339352976)
<val> is a string that may or may not be a url
]]
local function is_archive_today_url (val)
if is_parameter_ext_wikilink (val) then -- is <val> a url?
local tld = val:match ('archive%.(%l+)/'); -- get the tld; real archive.today urls have a '/' after the tld
return tld and cfg.archive_today_tlds_t[tld]; -- return true if <tld> is one of the archive.today tlds; nil else
end
end
--[[--------------------------< H A S _ A R C H I V E _ T O D A Y _ U R L >------------------------------------
blank any parameter that holds one of the archive.today tlds (.today, .ph, .is, .md, .li, .fo, .vn) and also
blank parameters that are dependent on the offending parameter.
input <cite_args_t> is a table of all of this template's parameters This function modifies <cite_args_t>
when |url= or its alias |URL= hold an archive.today url, this function sets the flag <url_was_archive_today>
which is used later to suppress the missing url error message from {{citation}} when it has |website=<summat>
or from the templates {{cite web}}, {{cite podcast}}, {{cite mailing list}} which all require a url.
returns nothing
]]
local function has_archive_today_url (cite_args_t)
local unset_params_t = {}; -- to hold a sequence of parameters to unset from cite_args_t
for p, v in pairs (cite_args_t) do -- look at each parameter in the template
if is_archive_today_url (v:lower()) then -- if it has a parameter with an archive.today url
table.insert (unset_params_t, p); -- add the url-holding parameter name to our list of parameters to unset (may or may not be a legitimate url parameter)
if 'url' == p:lower() then -- if this parameter is |url= or |URL=
url_was_archive_today = true; -- set a flag so that cite web / podcast / mailinglist don't emit a missing url error message
end
if p:match ('archive%-?url') and ('usurped' == cite_args_t['url-status'] or 'unfit' == cite_args_t['url-status']) then -- if |archive-url=archive.today and |url-status=unfit/usurped
url_was_archive_today = true; -- set a flag so that cite web / podcast / mailinglist don't emit a missing url error message
table.insert (unset_params_t, 'url'); -- add the url parameter name to our list of parameters to unset (may or may not be a legitimate url parameter)
table.insert (unset_params_t, 'URL'); -- this one because both are possible
utilities.set_message ('err_url_suppressed'); -- emit supplemental error message
end
if cfg.dependencies_t[p] then -- if this url-holding parameter (<p>) has dependencies
for _, dependent in ipairs (cfg.dependencies_t[p]) do -- loop through the url-holding parameter's dependency sequence
table.insert (unset_params_t, dependent); -- add dependent parameter to the list to be unset
end
end
end
end
if 0 < #unset_params_t then -- when there are parameters to unset
if not is_preview_mode then -- when in preview mode do not suppress any parameters
for _, unset_param in ipairs (unset_params_t) do -- loop through the sequence
cite_args_t[unset_param] = nil; -- and unset the url-holding parameter and its dependent parameters to avoid parameter-requires-other-parameter errors
end
end
utilities.set_message ('maint_deprecated_archive'); -- add a maintenance message
end
end
--[[-------------------------< C H E C K _ F O R _ U R L >-----------------------------------------------------
loop through a list of parameters and their values. Look at the value and if it has an external link, emit an error message.
]]
local function check_for_url (parameter_list, error_list)
for k, v in pairs (parameter_list) do -- for each parameter in the list
if is_parameter_ext_wikilink (v) then -- look at the value; if there is a URL add an error message
table.insert (error_list, utilities.wrap_style ('parameter', k));
end
end
end
--[[--------------------------< S A F E _ F O R _ U R L >------------------------------------------------------
Escape sequences for content that will be used for URL descriptions
]]
local function safe_for_url( str )
if str:match( "%[%[.-%]%]" ) ~= nil then
utilities.set_message ('err_wikilink_in_url', {});
end
return str:gsub( '[%[%]\n]', {
['['] = '[',
[']'] = ']',
['\n'] = ' ' } );
end
--[[--------------------------< E X T E R N A L _ L I N K >----------------------------------------------------
Format an external link with error checking
]]
local function external_link (URL, label, source, access)
local domain;
local path;
local base_url;
if not utilities.is_set (label) then
label = URL;
if utilities.is_set (source) then
utilities.set_message ('err_bare_url_missing_title', {utilities.wrap_style ('parameter', source)});
else
error (cfg.messages["bare_url_no_origin"]); -- programmer error; valid parameter name does not have matching meta-parameter
end
end
if not check_url (URL) then
utilities.set_message ('err_bad_url', {utilities.wrap_style ('parameter', source)});
end
domain, path = URL:match ('^([/%.%-%+:%a%d]+)([/%?#].*)$'); -- split the URL into scheme plus domain and path
if path then -- if there is a path portion
path = path:gsub ('[%[%]]', {['['] = '%5b', [']'] = '%5d'}); -- replace '[' and ']' with their percent-encoded values
URL = table.concat ({domain, path}); -- and reassemble
end
base_url = table.concat ({ "[", URL, " ", safe_for_url (label), "]" }); -- assemble a wiki-markup URL
if utilities.is_set (access) then -- access level (subscription, registration, limited)
base_url = utilities.substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[access].class, cfg.presentation[access].title, base_url}); -- add the appropriate icon
end
return base_url;
end
--[[--------------------------< D E P R E C A T E D _ P A R A M E T E R >--------------------------------------
Categorize and emit an error message when the citation contains one or more deprecated parameters. The function includes the
offending parameter name to the error message. Only one error message is emitted regardless of the number of deprecated
parameters in the citation.
added_deprecated_cat is a Boolean declared in page scope variables above
]]
local function deprecated_parameter(name)
if not added_deprecated_cat then
added_deprecated_cat = true; -- note that we've added this category
utilities.set_message ('err_deprecated_params', {name}); -- add error message
end
end
--[=[-------------------------< K E R N _ Q U O T E S >--------------------------------------------------------
Apply kerning to open the space between the quote mark provided by the module and a leading or trailing quote
mark contained in a |title= or |chapter= parameter's value.
This function will positive kern either single or double quotes:
"'Unkerned title with leading and trailing single quote marks'"
" 'Kerned title with leading and trailing single quote marks' " (in real life the kerning isn't as wide as this example)
Double single quotes (italic or bold wiki-markup) are not kerned.
Replaces Unicode quote marks in plain text or in the label portion of a [[L|D]] style wikilink with typewriter
quote marks regardless of the need for kerning. Unicode quote marks are not replaced in simple [[D]] wikilinks.
Call this function for chapter titles, for website titles, etc.; not for book titles.
]=]
local function kern_quotes (str)
local wl_type, label, link;
wl_type, label, link = utilities.is_wikilink (str); -- wl_type is: 0, no wl (text in label variable); 1, [[D]]; 2, [[L|D]]
if 1 == wl_type then -- [[D]] simple wikilink with or without quote marks
if mw.ustring.match (str, '%[%[[\"“”\'‘’].+[\"“”\'‘’]%]%]') then -- leading and trailing quote marks
str = utilities.substitute (cfg.presentation['kern-left'], str);
str = utilities.substitute (cfg.presentation['kern-right'], str);
elseif mw.ustring.match (str, '%[%[[\"“”\'‘’].+%]%]') then -- leading quote marks
str = utilities.substitute (cfg.presentation['kern-left'], str);
elseif mw.ustring.match (str, '%[%[.+[\"“”\'‘’]%]%]') then -- trailing quote marks
str = utilities.substitute (cfg.presentation['kern-right'], str);
end
else -- plain text or [[L|D]]; text in label variable
label = mw.ustring.gsub (label, '[“”]', '\"'); -- replace “” (U+201C & U+201D) with " (typewriter double quote mark)
label = mw.ustring.gsub (label, '[‘’]', '\''); -- replace ‘’ (U+2018 & U+2019) with ' (typewriter single quote mark)
local cap = mw.ustring.match (label, "^([\"\'][^\'].+)"); -- match leading double or single quote but not doubled single quotes (italic markup)
if utilities.is_set (cap) then
label = utilities.substitute (cfg.presentation['kern-left'], cap);
end
cap = mw.ustring.match (label, "^(.+[^\'][\"\'])$") -- match trailing double or single quote but not doubled single quotes (italic markup)
if utilities.is_set (cap) then
label = utilities.substitute (cfg.presentation['kern-right'], cap);
end
if 2 == wl_type then
str = utilities.make_wikilink (link, label); -- reassemble the wikilink
else
str = label;
end
end
return str;
end
--[[--------------------------< F O R M A T _ S C R I P T _ V A L U E >----------------------------------------
|script-title= holds title parameters that are not written in Latin-based scripts: Chinese, Japanese, Arabic, Hebrew, etc. These scripts should
not be italicized and may be written right-to-left. The value supplied by |script-title= is concatenated onto Title after Title has been wrapped
in italic markup.
Regardless of language, all values provided by |script-title= are wrapped in <bdi>...</bdi> tags to isolate RTL languages from the English left to right.
|script-title= provides a unique feature. The value in |script-title= may be prefixed with a two-character ISO 639-1 language code and a colon:
|script-title=ja:*** *** (where * represents a Japanese character)
Spaces between the two-character code and the colon and the colon and the first script character are allowed:
|script-title=ja : *** ***
|script-title=ja: *** ***
|script-title=ja :*** ***
Spaces preceding the prefix are allowed: |script-title = ja:*** ***
The prefix is checked for validity. If it is a valid ISO 639-1 language code, the lang attribute (lang="ja") is added to the <bdi> tag so that browsers can
know the language the tag contains. This may help the browser render the script more correctly. If the prefix is invalid, the lang attribute
is not added. At this time there is no error message for this condition.
Supports |script-title=, |script-chapter=, |script-<periodical>=
]]
local function format_script_value (script_value, script_param)
local lang=''; -- initialize to empty string
local name;
if script_value:match('^%l%l%l?%s*:') then -- if first 3 or 4 non-space characters are script language prefix
lang = script_value:match('^(%l%l%l?)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script
if not utilities.is_set (lang) then
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['missing title part']}); -- prefix without 'title'; add error message
return ''; -- script_value was just the prefix so return empty string
end
-- if we get this far we have prefix and script
name = cfg.lang_tag_remap[lang] or mw.language.fetchLanguageName( lang, cfg.this_wiki_code ); -- get language name so that we can use it to categorize
if utilities.is_set (name) then -- is prefix a proper ISO 639-1 language code?
script_value = script_value:gsub ('^%l+%s*:%s*', ''); -- strip prefix from script
-- is prefix one of these language codes?
if utilities.in_array (lang, cfg.script_lang_codes) then
utilities.add_prop_cat ('script', {name, lang})
else
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['unknown language code']}); -- unknown script-language; add error message
end
lang = ' lang="' .. lang .. '" '; -- convert prefix into a lang attribute
else
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['invalid language code']}); -- invalid language code; add error message
lang = ''; -- invalid so set lang to empty string
end
else
utilities.set_message ('err_script_parameter', {script_param, cfg.err_msg_supl['missing prefix']}); -- no language code prefix; add error message
end
script_value = utilities.substitute (cfg.presentation['bdi'], {lang, script_value}); -- isolate in case script is RTL
return script_value;
end
--[[--------------------------< S C R I P T _ C O N C A T E N A T E >------------------------------------------
Initially for |title= and |script-title=, this function concatenates those two parameter values after the script
value has been wrapped in <bdi> tags.
]]
local function script_concatenate (title, script, script_param)
if utilities.is_set (script) then
script = format_script_value (script, script_param); -- <bdi> tags, lang attribute, categorization, etc.; returns empty string on error
if utilities.is_set (script) then
title = title .. ' ' .. script; -- concatenate title and script title
end
end
return title;
end
--[[--------------------------< W R A P _ M S G >--------------------------------------------------------------
Applies additional message text to various parameter values. Supplied string is wrapped using a message_list
configuration taking one argument. Supports lower case text for {{citation}} templates. Additional text taken
from citation_config.messages - the reason this function is similar to but separate from wrap_style().
]]
local function wrap_msg (key, str, lower)
if not utilities.is_set ( str ) then
return "";
end
if true == lower then
local msg;
msg = cfg.messages[key]:lower(); -- set the message to lower case before
return utilities.substitute ( msg, str ); -- including template text
else
return utilities.substitute ( cfg.messages[key], str );
end
end
--[[----------------< W I K I S O U R C E _ U R L _ M A K E >-------------------
Makes a Wikisource URL from Wikisource interwiki-link. Returns the URL and appropriate
label; nil else.
str is the value assigned to |chapter= (or aliases) or |title= or |title-link=
]]
local function wikisource_url_make (str)
local wl_type, D, L;
local ws_url, ws_label;
local wikisource_prefix = table.concat ({'https://', cfg.this_wiki_code, '.wikisource.org/wiki/'});
wl_type, D, L = utilities.is_wikilink (str); -- wl_type is 0 (not a wikilink), 1 (simple wikilink), 2 (complex wikilink)
if 0 == wl_type then -- not a wikilink; might be from |title-link=
str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if utilities.is_set (str) then
ws_url = table.concat ({ -- build a Wikisource URL
wikisource_prefix, -- prefix
str, -- article title
});
ws_label = str; -- label for the URL
end
elseif 1 == wl_type then -- simple wikilink: [[Wikisource:ws article]]
str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if utilities.is_set (str) then
ws_url = table.concat ({ -- build a Wikisource URL
wikisource_prefix, -- prefix
str, -- article title
});
ws_label = str; -- label for the URL
end
elseif 2 == wl_type then -- non-so-simple wikilink: [[Wikisource:ws article|displayed text]] ([[L|D]])
str = L:match ('^[Ww]ikisource:(.+)') or L:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
if utilities.is_set (str) then
ws_label = D; -- get ws article name from display portion of interwiki link
ws_url = table.concat ({ -- build a Wikisource URL
wikisource_prefix, -- prefix
str, -- article title without namespace from link portion of wikilink
});
end
end
if ws_url then
ws_url = mw.uri.encode (ws_url, 'WIKI'); -- make a usable URL
ws_url = ws_url:gsub ('%%23', '#'); -- undo percent-encoding of fragment marker
end
return ws_url, ws_label, L or D; -- return proper URL or nil and a label or nil
end
--[[----------------< F O R M A T _ P E R I O D I C A L >-----------------------
Format the three periodical parameters: |script-<periodical>=, |<periodical>=,
and |trans-<periodical>= into a single Periodical meta-parameter.
]]
local function format_periodical (script_periodical, script_periodical_source, periodical, trans_periodical)
if not utilities.is_set (periodical) then
periodical = ''; -- to be safe for concatenation
else
periodical = utilities.wrap_style ('italic-title', periodical); -- style
end
periodical = script_concatenate (periodical, script_periodical, script_periodical_source); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
if utilities.is_set (trans_periodical) then
trans_periodical = utilities.wrap_style ('trans-italic-title', trans_periodical);
if utilities.is_set (periodical) then
periodical = periodical .. ' ' .. trans_periodical;
else -- here when trans-periodical without periodical or script-periodical
periodical = trans_periodical;
utilities.set_message ('err_trans_missing_title', {'periodical'});
end
end
return periodical;
end
--[[------------------< F O R M A T _ C H A P T E R _ T I T L E >---------------
Format the four chapter parameters: |script-chapter=, |chapter=, |trans-chapter=,
and |chapter-url= into a single chapter meta- parameter (chapter_url_source used
for error messages).
]]
local function format_chapter_title (script_chapter, script_chapter_source, chapter, trans_chapter, trans_chapter_source, chapter_url, chapter_url_source, no_quotes, access)
local ws_url, ws_label, L = wikisource_url_make (chapter); -- make a wikisource URL and label from a wikisource interwiki link
if ws_url then
ws_label = ws_label:gsub ('_', ' '); -- replace underscore separators with space characters
chapter = ws_label;
end
if not utilities.is_set (chapter) then
chapter = ''; -- to be safe for concatenation
else
if false == no_quotes then
chapter = kern_quotes (chapter); -- if necessary, separate chapter title's leading and trailing quote marks from module provided quote marks
chapter = utilities.wrap_style ('quoted-title', chapter);
end
end
chapter = script_concatenate (chapter, script_chapter, script_chapter_source); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
if utilities.is_set (chapter_url) then
chapter = external_link (chapter_url, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate
elseif ws_url then
chapter = external_link (ws_url, chapter .. ' ', 'ws link in chapter'); -- adds bare_url_missing_title error if appropriate; space char to move icon away from chap text; TODO: better way to do this?
chapter = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, chapter});
end
if utilities.is_set (trans_chapter) then
trans_chapter = utilities.wrap_style ('trans-quoted-title', trans_chapter);
if utilities.is_set (chapter) then
chapter = chapter .. ' ' .. trans_chapter;
else -- here when trans_chapter without chapter or script-chapter
chapter = trans_chapter;
utilities.set_message ('err_trans_missing_title', {trans_chapter_source:match ('trans%-?(.+)')}); -- when no chapter, get matching name from trans-<param>
end
end
return chapter;
end
--[[----------------< H A S _ I N V I S I B L E _ C H A R S >-------------------
This function searches a parameter's value for non-printable or invisible characters.
The search stops at the first match.
This function will detect the visible replacement character when it is part of the Wikisource.
Detects but ignores nowiki and math stripmarkers. Also detects other named stripmarkers
(gallery, math, pre, ref) and identifies them with a slightly different error message.
See also coins_cleanup().
Output of this function is an error message that identifies the character or the
Unicode group, or the stripmarker that was detected along with its position (or,
for multi-byte characters, the position of its first byte) in the parameter value.
]]
local function has_invisible_chars (param, v)
local position; -- position of invisible char or starting position of stripmarker
local capture; -- used by stripmarker detection to hold name of the stripmarker
local stripmarker; -- boolean set true when a stripmarker is found
capture = string.match (v, '[%w%p ]*'); -- test for values that are simple ASCII text and bypass other tests if true
if capture == v then -- if same there are no Unicode characters
return;
end
for _, invisible_char in ipairs (cfg.invisible_chars) do
local char_name = invisible_char[1]; -- the character or group name
local pattern = invisible_char[2]; -- the pattern used to find it
position, _, capture = mw.ustring.find (v, pattern); -- see if the parameter value contains characters that match the pattern
if position and (cfg.invisible_defs.zwj == capture) then -- if we found a zero-width joiner character
if mw.ustring.find (v, cfg.indic_script) then -- it's ok if one of the Indic scripts
position = nil; -- unset position
elseif cfg.emoji_t[mw.ustring.codepoint (v, position+1)] then -- is zwj followed by a character listed in emoji{}?
position = nil; -- unset position
end
end
if position then
if utilities.in_array(capture, {'nowiki', 'math', 'templatestyles'}) then -- nowiki, math and templatestyles stripmarkers (not an error condition)
stripmarker = true; -- set a flag
elseif true == stripmarker and cfg.invisible_defs.del == capture then -- because stripmakers begin and end with the delete char, assume that we've found one end of a stripmarker
position = nil; -- unset; for now, ignore linter warning
else
local err_msg;
if capture and not (cfg.invisible_defs.del == capture or cfg.invisible_defs.zwj == capture) then
err_msg = utilities.substitute (cfg.messages.invisible_1, {capture, char_name}); -- <capture> here is stripmarker name
else
err_msg = utilities.substitute (cfg.messages.invisible_2, char_name);
end
utilities.set_message ('err_invisible_char', {err_msg, utilities.wrap_style ('parameter', param), position}); -- add error message
return; -- and done with this parameter
end
end
end
end
--[[-------------------< A R G U M E N T _ W R A P P E R >----------------------
Argument wrapper. This function provides support for argument mapping defined
in the configuration file so that multiple names can be transparently aliased to
single internal variable.
]]
local function argument_wrapper ( args )
local origin = {};
return setmetatable({
ORIGIN = function ( self, k )
local dummy = self[k]; -- force the variable to be loaded; for now, ignore linter warning
return origin[k];
end
},
{
__index = function ( tbl, k )
if origin[k] ~= nil then
return nil;
end
local v;
local list = cfg.aliases[k];
if type( list ) == 'table' then
v, origin[k] = utilities.select_one ( args, list, 'err_redundant_parameters' );
if origin[k] == nil then
origin[k] = ''; -- Empty string, not nil
end
elseif list ~= nil then
v, origin[k] = args[list], list;
else
-- maybe let through instead of raising an error?
-- v, origin[k] = args[k], k;
error( cfg.messages['unknown_argument_map'] .. ': ' .. k);
end
-- Empty strings, not nil;
if v == nil then
v = '';
origin[k] = '';
end
rawset( tbl, k, v );
return v;
end,
});
end
--[[--------------------------< N O W R A P _ D A T E >-------------------------
When date is YYYY-MM-DD format wrap in nowrap span: <span ...>YYYY-MM-DD</span>.
When date is DD MMMM YYYY or is MMMM DD, YYYY then wrap in nowrap span:
<span ...>DD MMMM</span> YYYY or <span ...>MMMM DD,</span> YYYY
DOES NOT yet support MMMM YYYY or any of the date ranges.
]]
local function nowrap_date (date)
local cap;
local cap2;
if date:match("^%d%d%d%d%-%d%d%-%d%d$") then
date = utilities.substitute (cfg.presentation['nowrap1'], date);
elseif date:match("^%a+%s*%d%d?,%s+%d%d%d%d$") or date:match ("^%d%d?%s*%a+%s+%d%d%d%d$") then
cap, cap2 = string.match (date, "^(.*)%s+(%d%d%d%d)$");
date = utilities.substitute (cfg.presentation['nowrap2'], {cap, cap2});
end
return date;
end
--[[--------------------------< S E T _ T I T L E T Y P E >---------------------
This function sets default title types (equivalent to the citation including
|type=<default value>) for those templates that have defaults. Also handles the
special case where it is desirable to omit the title type from the rendered citation
(|type=none).
]]
local function set_titletype (cite_class, title_type)
if utilities.is_set (title_type) then
if 'none' == cfg.keywords_xlate[title_type] then
title_type = ''; -- if |type=none then type parameter not displayed
end
return title_type; -- if |type= has been set to any other value use that value
end
return cfg.title_types [cite_class] or ''; -- set template's default title type; else empty string for concatenation
end
--[[--------------------------< S A F E _ J O I N >-----------------------------
Joins a sequence of strings together while checking for duplicate separation characters.
]]
local function safe_join( tbl, duplicate_char )
local f = {}; -- create a function table appropriate to type of 'duplicate character'
if 1 == #duplicate_char then -- for single byte ASCII characters use the string library functions
f.gsub = string.gsub
f.match = string.match
f.sub = string.sub
else -- for multi-byte characters use the ustring library functions
f.gsub = mw.ustring.gsub
f.match = mw.ustring.match
f.sub = mw.ustring.sub
end
local str = ''; -- the output string
for _, value in ipairs( tbl ) do
if value == nil then value = ''; end
if str == '' then -- if output string is empty
str = value; -- assign value to it (first time through the loop)
elseif value ~= '' then
local comp; -- what does 'comp' mean?
if value:sub(1, 1) == '<' then -- special case of values enclosed in spans and other markup.
comp = value:gsub( "%b<>", "" ); -- remove HTML markup (<span>string</span> -> string)
else
comp = value;
end
-- typically duplicate_char is sepc
if f.sub(comp, 1, 1) == duplicate_char then -- is first character same as duplicate_char? why test first character?
-- Because individual string segments often (always?) begin with terminal punct for the
-- preceding segment: 'First element' .. 'sepc next element' .. etc.?
local trim = false;
local end_chr = f.sub(str, -1, -1); -- get the last character of the output string
-- str = str .. "<HERE(enchr=" .. end_chr .. ")" -- debug stuff?
if end_chr == duplicate_char then -- if same as separator
str = f.sub(str, 1, -2); -- remove it
elseif end_chr == "'" then -- if it might be wiki-markup
if f.sub(str, -3, -1) == duplicate_char .. "''" then -- if last three chars of str are sepc''
str = f.sub(str, 1, -4) .. "''"; -- remove them and add back ''
elseif f.sub(str, -5, -1) == duplicate_char .. "]]''" then -- if last five chars of str are sepc]]''
trim = true; -- why? why do this and next differently from previous?
elseif f.sub(str, -4, -1) == duplicate_char .. "]''" then -- if last four chars of str are sepc]''
trim = true; -- same question
end
elseif end_chr == "]" then -- if it might be wiki-markup
if f.sub(str, -3, -1) == duplicate_char .. "]]" then -- if last three chars of str are sepc]] wikilink
trim = true;
elseif f.sub(str, -3, -1) == duplicate_char .. '"]' then -- if last three chars of str are sepc"] quoted external link
trim = true;
elseif f.sub(str, -2, -1) == duplicate_char .. "]" then -- if last two chars of str are sepc] external link
trim = true;
elseif f.sub(str, -4, -1) == duplicate_char .. "'']" then -- normal case when |url=something & |title=Title.
trim = true;
end
elseif end_chr == " " then -- if last char of output string is a space
if f.sub(str, -2, -1) == duplicate_char .. " " then -- if last two chars of str are <sepc><space>
str = f.sub(str, 1, -3); -- remove them both
end
end
if trim then
if value ~= comp then -- value does not equal comp when value contains HTML markup
local dup2 = duplicate_char;
if f.match(dup2, "%A" ) then dup2 = "%" .. dup2; end -- if duplicate_char not a letter then escape it
value = f.gsub(value, "(%b<>)" .. dup2, "%1", 1 ) -- remove duplicate_char if it follows HTML markup
else
value = f.sub(value, 2, -1 ); -- remove duplicate_char when it is first character
end
end
end
str = str .. value; -- add it to the output string
end
end
return str;
end
--[[--------------------------< I S _ S U F F I X >-----------------------------
returns true if suffix is properly formed Jr, Sr, or ordinal in the range 1–9.
Puncutation not allowed.
]]
local function is_suffix (suffix)
if utilities.in_array (suffix, {'Jr', 'Sr', 'Jnr', 'Snr', '1st', '2nd', '3rd'}) or suffix:match ('^%dth$') then
return true;
end
return false;
end
--[[--------------------< I S _ G O O D _ V A N C _ N A M E >-------------------
For Vancouver style, author/editor names are supposed to be rendered in Latin
(read ASCII) characters. When a name uses characters that contain diacritical
marks, those characters are to be converted to the corresponding Latin
character. When a name is written using a non-Latin alphabet or logogram, that
name is to be transliterated into Latin characters. The module doesn't do this
so editors may/must.
This test allows |first= and |last= names to contain any of the letters defined
in the four Unicode Latin character sets
[http://www.unicode.org/charts/PDF/U0000.pdf C0 Controls and Basic Latin] 0041–005A, 0061–007A
[http://www.unicode.org/charts/PDF/U0080.pdf C1 Controls and Latin-1 Supplement] 00C0–00D6, 00D8–00F6, 00F8–00FF
[http://www.unicode.org/charts/PDF/U0100.pdf Latin Extended-A] 0100–017F
[http://www.unicode.org/charts/PDF/U0180.pdf Latin Extended-B] 0180–01BF, 01C4–024F
|lastn= also allowed to contain hyphens, spaces, and apostrophes.
(http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/)
|firstn= also allowed to contain hyphens, spaces, apostrophes, and periods
This original test:
if nil == mw.ustring.find (last, "^[A-Za-zÀ-ÖØ-öø-ƿDŽ-ɏ%-%s%']*$")
or nil == mw.ustring.find (first, "^[A-Za-zÀ-ÖØ-öø-ƿDŽ-ɏ%-%s%'%.]+[2-6%a]*$") then
was written outside of the code editor and pasted here because the code editor
gets confused between character insertion point and cursor position. The test has
been rewritten to use decimal character escape sequence for the individual bytes
of the Unicode characters so that it is not necessary to use an external editor
to maintain this code.
\195\128-\195\150 – À-Ö (U+00C0–U+00D6 – C0 controls)
\195\152-\195\182 – Ø-ö (U+00D8-U+00F6 – C0 controls)
\195\184-\198\191 – ø-ƿ (U+00F8-U+01BF – C0 controls, Latin extended A & B)
\199\132-\201\143 – DŽ-ɏ (U+01C4-U+024F – Latin extended B)
]]
local function is_good_vanc_name (last, first, suffix, position)
if not suffix then
if first:find ('[,%s]') then -- when there is a space or comma, might be first name/initials + generational suffix
first = first:match ('(.-)[,%s]+'); -- get name/initials
suffix = first:match ('[,%s]+(.+)$'); -- get generational suffix
end
end
if utilities.is_set (suffix) then
if not is_suffix (suffix) then
add_vanc_error (cfg.err_msg_supl.suffix, position);
return false; -- not a name with an appropriate suffix
end
end
if nil == mw.ustring.find (last, "^[A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191%-%s%']*$") or
nil == mw.ustring.find (first, "^[A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191%-%s%'%.]*$") then
add_vanc_error (cfg.err_msg_supl['non-Latin char'], position);
return false; -- not a string of Latin characters; Vancouver requires Romanization
end;
return true;
end
--[[--------------------------< R E D U C E _ T O _ I N I T I A L S >------------------------------------------
Attempts to convert names to initials in support of |name-list-style=vanc.
Names in |firstn= may be separated by spaces or hyphens, or for initials, a period.
See http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35062/.
Vancouver style requires family rank designations (Jr, II, III, etc.) to be rendered
as Jr, 2nd, 3rd, etc. See http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35085/.
This code only accepts and understands generational suffix in the Vancouver format
because Roman numerals look like, and can be mistaken for, initials.
This function uses ustring functions because firstname initials may be any of the
Unicode Latin characters accepted by is_good_vanc_name ().
]]
local function reduce_to_initials (first, position)
if first:find (',', 1, true) then
return first; -- commas not allowed; abandon
end
local name, suffix = mw.ustring.match (first, "^(%u+) ([%dJS][%drndth]+)$");
if not name then -- if not initials and a suffix
name = mw.ustring.match (first, "^(%u+)$"); -- is it just initials?
end
if name then -- if first is initials with or without suffix
if 3 > mw.ustring.len (name) then -- if one or two initials
if suffix then -- if there is a suffix
if is_suffix (suffix) then -- is it legitimate?
return first; -- one or two initials and a valid suffix so nothing to do
else
add_vanc_error (cfg.err_msg_supl.suffix, position); -- one or two initials with invalid suffix so error message
return first; -- and return first unmolested
end
else
return first; -- one or two initials without suffix; nothing to do
end
end
end -- if here then name has 3 or more uppercase letters so treat them as a word
local initials_t = {}; -- table to hold initials
local i = 1; -- counter for number of initials
local names_t = mw.text.split (first, '[%s%-]+'); -- split into a sequence of names and possible suffix
while names_t[i] do -- loop through the sequence
if 1 < i and names_t[i]:match ('[%dJS][%drndth]+%.?$') then -- if not the first name, and looks like a suffix (may have trailing dot)
names_t[i] = names_t[i]:gsub ('%.', ''); -- remove terminal dot if present
if is_suffix (names_t[i]) then -- if a legitimate suffix
table.insert (initials_t, ' ' .. names_t[i]); -- add a separator space, insert at end of initials sequence
break; -- and done because suffix must fall at the end of a name
end -- no error message if not a suffix; possibly because of Romanization
end
if 3 > i then
table.insert (initials_t, mw.ustring.sub (names_t[i], 1, 1)); -- insert the initial at end of initials sequence
end
i = i + 1; -- bump the counter
end
return table.concat (initials_t); -- Vancouver format does not include spaces.
end
--[[--------------------------< I N T E R W I K I _ P R E F I X E N _ G E T >----------------------------------
extract interwiki prefixen from <value>. Returns two one or two values:
false – no prefixen
nil – prefix exists but not recognized
project prefix, language prefix – when value has either of:
:<project>:<language>:<article>
:<language>:<project>:<article>
project prefix, nil – when <value> has only a known single-letter prefix
nil, language prefix – when <value> has only a known language prefix
accepts single-letter project prefixen: 'd' (wikidata), 's' (wikisource), and 'w' (wikipedia) prefixes; at this
writing, the other single-letter prefixen (b (wikibook), c (commons), m (meta), n (wikinews), q (wikiquote), and
v (wikiversity)) are not supported.
]]
local function interwiki_prefixen_get (value, is_link)
if not value:find (':%l+:') then -- if no prefix
return false; -- abandon; boolean here to distinguish from nil fail returns later
end
local prefix_patterns_linked_t = { -- sequence of valid interwiki and inter project prefixen
'^%[%[:([dsw]):(%l%l+):', -- wikilinked; project and language prefixes
'^%[%[:(%l%l+):([dsw]):', -- wikilinked; language and project prefixes
'^%[%[:([dsw]):', -- wikilinked; project prefix
'^%[%[:(%l%l+):', -- wikilinked; language prefix
}
local prefix_patterns_unlinked_t = { -- sequence of valid interwiki and inter project prefixen
'^:([dsw]):(%l%l+):', -- project and language prefixes
'^:(%l%l+):([dsw]):', -- language and project prefixes
'^:([dsw]):', -- project prefix
'^:(%l%l+):', -- language prefix
}
local cap1, cap2;
for _, pattern in ipairs ((is_link and prefix_patterns_linked_t) or prefix_patterns_unlinked_t) do
cap1, cap2 = value:match (pattern);
if cap1 then
break; -- found a match so stop looking
end
end
if cap1 and cap2 then -- when both then :project:language: or :language:project: (both forms allowed)
if 1 == #cap1 then -- length == 1 then :project:language:
if cfg.inter_wiki_map[cap2] then -- is language prefix in the interwiki map?
return cap1, cap2; -- return interwiki project and interwiki language
end
else -- here when :language:project:
if cfg.inter_wiki_map[cap1] then -- is language prefix in the interwiki map?
return cap2, cap1; -- return interwiki project and interwiki language
end
end
return nil; -- unknown interwiki language
elseif not (cap1 or cap2) then -- both are nil?
return nil; -- we got something that looks like a project prefix but isn't; return fail
elseif 1 == #cap1 then -- here when one capture
return cap1, nil; -- length is 1 so return project, nil language
else -- here when one capture and its length it more than 1
if cfg.inter_wiki_map[cap1] then -- is language prefix in the interwiki map?
return nil, cap1; -- return nil project, language
end
end
end
--[[--------------------------< L I S T _ P E O P L E >--------------------------
Formats a list of people (authors, contributors, editors, interviewers, translators)
names in the list will be linked when
|<name>-link= has a value
|<name>-mask- does NOT have a value; masked names are presumed to have been
rendered previously so should have been linked there
when |<name>-mask=0, the associated name is not rendered
]]
local function list_people (control, people, etal)
local sep;
local namesep;
local format = control.format;
local maximum = control.maximum;
local name_list = {};
if 'vanc' == format then -- Vancouver-like name styling?
sep = cfg.presentation['sep_nl_vanc']; -- name-list separator between names is a comma
namesep = cfg.presentation['sep_name_vanc']; -- last/first separator is a space
else
sep = cfg.presentation['sep_nl']; -- name-list separator between names is a semicolon
namesep = cfg.presentation['sep_name']; -- last/first separator is <comma><space>
end
if sep:sub (-1, -1) ~= " " then sep = sep .. " " end
if utilities.is_set (maximum) and maximum < 1 then return "", 0; end -- returned 0 is for EditorCount; not used for other names
for i, person in ipairs (people) do
if utilities.is_set (person.last) then
local mask = person.mask;
local one;
local sep_one = sep;
if utilities.is_set (maximum) and i > maximum then
etal = true;
break;
end
if mask then
local n = tonumber (mask); -- convert to a number if it can be converted; nil else
if n then
one = 0 ~= n and string.rep("—", n) or nil; -- make a string of (n > 0) mdashes, nil else, to replace name
person.link = nil; -- don't create link to name if name is replaces with mdash string or has been set nil
else
one = mask; -- replace name with mask text (must include name-list separator)
sep_one = " "; -- modify name-list separator
end
else
one = person.last; -- get surname
local first = person.first -- get given name
if utilities.is_set (first) then
if ("vanc" == format) then -- if Vancouver format
one = one:gsub ('%.', ''); -- remove periods from surnames (http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/)
if not person.corporate and is_good_vanc_name (one, first, nil, i) then -- and name is all Latin characters; corporate authors not tested
first = reduce_to_initials (first, i); -- attempt to convert first name(s) to initials
end
end
one = one .. namesep .. first;
end
end
if utilities.is_set (person.link) then
one = utilities.make_wikilink (person.link, one); -- link author/editor
end
if one then -- if <one> has a value (name, mdash replacement, or mask text replacement)
local proj, tag = interwiki_prefixen_get (one, true); -- get the interwiki prefixen if present
if 'w' == proj and ('Wikipedia' == mw.site.namespaces.Project['name']) then
proj = nil; -- for stuff like :w:de:<article>, :w is unnecessary TODO: maint cat?
end
if proj then
local proj_name = ({['d'] = cfg.messages.wikidata, ['s'] = cfg.messages.wikisource, ['w'] = cfg.messages.wikipedia})[proj]; -- :w (wikipedia) for linking from a non-wikipedia project
if proj_name then
one = one .. utilities.wrap_style ('interproj', proj_name); -- add resized leading space, brackets, static text, language name
utilities.add_prop_cat ('interproj-linked-name', proj); -- categorize it; <proj> is sort key
tag = nil; -- unset; don't do both project and language
end
end
if tag == cfg.this_wiki_code then
tag = nil; -- stuff like :en:<article> at en.wiki is pointless TODO: maint cat?
end
if tag then
local lang = cfg.lang_tag_remap[tag] or cfg.mw_languages_by_tag_t[tag];
if lang then -- error messaging done in extract_names() where we know parameter names
one = one .. utilities.wrap_style ('interwiki', lang); -- add resized leading space, brackets, static text, language name
utilities.add_prop_cat ('interwiki-linked-name', tag); -- categorize it; <tag> is sort key
end
end
table.insert (name_list, one); -- add it to the list of names
table.insert (name_list, sep_one); -- add the proper name-list separator
end
end
end
local count = #name_list / 2; -- (number of names + number of separators) divided by 2
if 0 < count then
if 1 < count and not etal then
if 'amp' == format then
name_list[#name_list-2] = " & "; -- replace last separator with ampersand text
elseif 'and' == format then
if 2 == count then
name_list[#name_list-2] = cfg.presentation.sep_nl_and; -- replace last separator with 'and' text
else
name_list[#name_list-2] = cfg.presentation.sep_nl_end; -- replace last separator with '(sep) and' text
end
end
end
name_list[#name_list] = nil; -- erase the last separator
end
local result = table.concat (name_list); -- construct list
if etal and utilities.is_set (result) then -- etal may be set by |display-authors=etal but we might not have a last-first list
result = result .. sep .. cfg.messages['et al']; -- we've got a last-first list and etal so add et al.
end
return result, count; -- return name-list string and count of number of names (count used for editor names only)
end
--[[--------------------< M A K E _ C I T E R E F _ I D >-----------------------
Generates a CITEREF anchor ID if we have at least one name or a date. Otherwise
returns an empty string.
namelist is one of the contributor-, author-, or editor-name lists chosen in that
order. year is Year or anchor_year.
]]
local function make_citeref_id (namelist, year)
local names={}; -- a table for the one to four names and year
for i,v in ipairs (namelist) do -- loop through the list and take up to the first four last names
names[i] = v.last
if i == 4 then break end -- if four then done
end
table.insert (names, year); -- add the year at the end
local id = table.concat(names); -- concatenate names and year for CITEREF id
if utilities.is_set (id) then -- if concatenation is not an empty string
return "CITEREF" .. id; -- add the CITEREF portion
else
return ''; -- return an empty string; no reason to include CITEREF id in this citation
end
end
--[[--------------------------< C I T E _ C L A S S _A T T R I B U T E _M A K E >------------------------------
construct <cite> tag class attribute for this citation.
<cite_class> – config.CitationClass from calling template
<mode> – value from |mode= parameter
]]
local function cite_class_attribute_make (cite_class, mode)
local class_t = {};
table.insert (class_t, 'citation'); -- required for blue highlight
if 'citation' ~= cite_class then
table.insert (class_t, cite_class); -- identify this template for user css
table.insert (class_t, utilities.is_set (mode) and mode or 'cs1'); -- identify the citation style for user css or javascript
else
table.insert (class_t, utilities.is_set (mode) and mode or 'cs2'); -- identify the citation style for user css or javascript
end
for _, prop_key in ipairs (z.prop_keys_t) do
table.insert (class_t, prop_key); -- identify various properties for user css or javascript
end
return table.concat (class_t, ' '); -- make a big string and done
end
--[[---------------------< N A M E _ H A S _ E T A L >--------------------------
Evaluates the content of name parameters (author, editor, etc.) for variations on
the theme of et al. If found, the et al. is removed, a flag is set to true and
the function returns the modified name and the flag.
This function never sets the flag to false but returns its previous state because
it may have been set by previous passes through this function or by the associated
|display-<names>=etal parameter
]]
local function name_has_etal (name, etal, nocat, param)
if utilities.is_set (name) then -- name can be nil in which case just return
local patterns = cfg.et_al_patterns; -- get patterns from configuration
for _, pattern in ipairs (patterns) do -- loop through all of the patterns
if name:match (pattern) then -- if this 'et al' pattern is found in name
name = name:gsub (pattern, ''); -- remove the offending text
etal = true; -- set flag (may have been set previously here or by |display-<names>=etal)
if not nocat then -- no categorization for |vauthors=
utilities.set_message ('err_etal', {param}); -- and set an error if not added
end
end
end
end
return name, etal;
end
--[[---------------------< N A M E _ I S _ N U M E R I C >----------------------
Add an error message and category when <name> parameter value does not contain letters.
Add a maintenance category when <name> parameter value has numeric characters mixed with characters that are
not numeric characters; could be letters and/or punctuation characters.
This function will only emit one error and one maint message for the current template. Does not emit both error
and maint messages/categories for the same parameter value.
returns nothing
]]
local function name_is_numeric (name, name_alias, list_name)
local patterns = {
'^%D+%d', -- <name> must have digits preceded by other characters
'^%D*%d+%D+', -- <name> must have digits followed by other characters
}
if not added_numeric_name_errs and mw.ustring.match (name, '^[%A]+$') then -- if we have not already set an error message and <name> does not have any alpha characters
utilities.set_message ('err_numeric_names', name_alias); -- add an error message
added_numeric_name_errs = true; -- set the flag so we emit only one error message
return; -- when here no point in further testing; abandon
end
if not added_numeric_name_maint then -- if we have already set a maint message
for _, pattern in ipairs (patterns) do -- spin through list of patterns
if mw.ustring.match (name, pattern) then -- digits preceded or followed by anything but digits; %D+ includes punctuation
utilities.set_message ('maint_numeric_names', cfg.special_case_translation [list_name]); -- add a maint cat for this template
added_numeric_name_maint = true; -- set the flag so we emit only one maint message
return; -- when here no point in further testing; abandon
end
end
end
end
--[[-----------------< N A M E _ H A S _ M U L T _ N A M E S >------------------
Evaluates the content of last/surname (authors etc.) parameters for multiple names.
Multiple names are indicated if there is more than one comma or any "unescaped"
semicolons. Escaped semicolons are ones used as part of selected HTML entities.
If the condition is met, the function adds the multiple name maintenance category.
Same test for first except that commas should not appear in given names (MOS:JR says
that the generational suffix does not take a separator character). Titles, degrees,
postnominals, affiliations, all normally comma separated don't belong in a citation.
<name> – name parameter value
<list_name> – AuthorList, EditorList, etc
<limit> – number of allowed commas; 1 (default) for surnames; 0 for given names
returns nothing
]]
local function name_has_mult_names (name, list_name, limit)
local _, commas, semicolons, nbsps;
limit = limit and limit or 1;
if utilities.is_set (name) then
_, commas = name:gsub (',', ''); -- count the number of commas
_, semicolons = name:gsub (';', ''); -- count the number of semicolons
-- nbsps probably should be its own separate count rather than merged in
-- some way with semicolons because Lua patterns do not support the
-- grouping operator that regex does, which means there is no way to add
-- more entities to escape except by adding more counts with the new
-- entities
_, nbsps = name:gsub (' ',''); -- count nbsps
-- There is exactly 1 semicolon per entity, so subtract nbsps
-- from semicolons to 'escape' them. If additional entities are added,
-- they also can be subtracted.
if limit < commas or 0 < (semicolons - nbsps) then
utilities.set_message ('maint_mult_names', cfg.special_case_translation [list_name]); -- add a maint message
end
end
end
--[=[-------------------------< I S _ G E N E R I C >----------------------------------------------------------
Compares values assigned to various parameters according to the string provided as <item> in the function call.
<item> can have on of two values:
'generic_names' – for name-holding parameters: |last=, |first=, |editor-last=, etc
'generic_titles' – for |title=
There are two types of generic tests. The 'accept' tests look for a pattern that should not be rejected by the
'reject' test. For example,
|author=[[John Smith (author)|Smith, John]]
would be rejected by the 'author' reject test. But piped wikilinks with 'author' disambiguation should not be
rejected so the 'accept' test prevents that from happening. Accept tests are always performed before reject
tests.
Each of the 'accept' and 'reject' sequence tables hold tables for en.wiki (['en']) and local.wiki (['local'])
that each can hold a test sequence table The sequence table holds, at index [1], a test pattern, and, at index
[2], a boolean control value. The control value tells string.find() or mw.ustring.find() to do plain-text search (true)
or a pattern search (false). The intent of all this complexity is to make these searches as fast as possible so
that we don't run out of processing time on very large articles.
Returns
true when a reject test finds the pattern or string
false when an accept test finds the pattern or string
nil else
]=]
local function is_generic (item, value)
local str_lower = { -- use string.lower() for en.wiki (['en']) and use mw.ustring.lower() or local.wiki (['local'])
['en'] = string.lower,
['local'] = mw.ustring.lower,
}
local str_find = { -- use string.find() for en.wiki (['en']) and use mw.ustring.find() or local.wiki (['local'])
['en'] = string.find,
['local'] = mw.ustring.find,
}
local function test (val, test_t, wiki) -- local function to do the testing; <wiki> selects lower() and find() functions
val = test_t[2] and str_lower[wiki](value) or val; -- when <test_t[2]> set to 'true', plaintext search using lowercase value
return str_find[wiki] (val, test_t[1], 1, test_t[2]); -- return nil when not found or matched
end
local test_types_t = {'accept', 'reject'}; -- test accept patterns first, then reject patterns
local wikis_t = {'en', 'local'}; -- do tests for each of these keys; en.wiki first, local.wiki second
for _, test_type in ipairs (test_types_t) do -- for each test type
for _, generic_value in pairs (cfg.special_case_translation[item][test_type]) do -- spin through the list of generic value fragments to accept or reject
for _, wiki in ipairs (wikis_t) do
if generic_value[wiki] then
if test (value, generic_value[wiki], wiki) then -- go do the test
return ('reject' == test_type); -- param value rejected, return true; false else
end
end
end
end
end
end
--[[--------------------------< N A M E _ I S _ G E N E R I C >------------------------------------------------
calls is_generic() to determine if <name> is a 'generic name' listed in cfg.generic_names; <name_alias> is the
parameter name used in error messaging
]]
local function name_is_generic (name, name_alias)
if not added_generic_name_errs and is_generic ('generic_names', name) then
utilities.set_message ('err_generic_name', name_alias); -- set an error message
added_generic_name_errs = true;
end
end
--[[--------------------------< N A M E _ C H E C K S >--------------------------------------------------------
This function calls various name checking functions used to validate the content of the various name-holding parameters.
]]
local function name_checks (last, first, list_name, last_alias, first_alias)
local accept_name;
if utilities.is_set (last) then
last, accept_name = utilities.has_accept_as_written (last); -- remove accept-this-as-written markup when it wraps all of <last>
if not accept_name then -- <last> not wrapped in accept-as-written markup
name_has_mult_names (last, list_name); -- check for multiple names in the parameter
name_is_numeric (last, last_alias, list_name); -- check for names that have no letters or are a mix of digits and other characters
name_is_generic (last, last_alias); -- check for names found in the generic names list
end
end
if utilities.is_set (first) then
first, accept_name = utilities.has_accept_as_written (first); -- remove accept-this-as-written markup when it wraps all of <first>
if not accept_name then -- <first> not wrapped in accept-as-written markup
name_has_mult_names (first, list_name, 0); -- check for multiple names in the parameter; 0 is number of allowed commas in a given name
name_is_numeric (first, first_alias, list_name); -- check for names that have no letters or are a mix of digits and other characters
name_is_generic (first, first_alias); -- check for names found in the generic names list
end
local wl_type, D = utilities.is_wikilink (first);
if 0 ~= wl_type then
first = D;
utilities.set_message ('err_bad_paramlink', first_alias);
end
end
return last, first; -- done
end
--[[----------------------< E X T R A C T _ N A M E S >-------------------------
Gets name list from the input arguments
Searches through args in sequential order to find |lastn= and |firstn= parameters
(or their aliases), and their matching link and mask parameters. Stops searching
when both |lastn= and |firstn= are not found in args after two sequential attempts:
found |last1=, |last2=, and |last3= but doesn't find |last4= and |last5= then the
search is done.
This function emits an error message when there is a |firstn= without a matching
|lastn=. When there are 'holes' in the list of last names, |last1= and |last3=
are present but |last2= is missing, an error message is emitted. |lastn= is not
required to have a matching |firstn=.
When an author or editor parameter contains some form of 'et al.', the 'et al.'
is stripped from the parameter and a flag (etal) returned that will cause list_people()
to add the static 'et al.' text from Module:Citation/CS1/Configuration. This keeps
'et al.' out of the template's metadata. When this occurs, an error is emitted.
]]
local function extract_names(args, list_name)
local names = {}; -- table of names
local last; -- individual name components
local first;
local link;
local mask;
local i = 1; -- loop counter/indexer
local n = 1; -- output table indexer
local count = 0; -- used to count the number of times we haven't found a |last= (or alias for authors, |editor-last or alias for editors)
local etal = false; -- return value set to true when we find some form of et al. in an author parameter
local last_alias, first_alias, link_alias; -- selected parameter aliases used in error messaging
while true do
last, last_alias = utilities.select_one ( args, cfg.aliases[list_name .. '-Last'], 'err_redundant_parameters', i ); -- search through args for name components beginning at 1
first, first_alias = utilities.select_one ( args, cfg.aliases[list_name .. '-First'], 'err_redundant_parameters', i );
link, link_alias = utilities.select_one ( args, cfg.aliases[list_name .. '-Link'], 'err_redundant_parameters', i );
mask = utilities.select_one ( args, cfg.aliases[list_name .. '-Mask'], 'err_redundant_parameters', i );
if last then -- error check |lastn= alias for unknown interwiki link prefix; done here because this is where we have the parameter name
local project, language = interwiki_prefixen_get (last, true); -- true because we expect interwiki links in |lastn= to be wikilinked
if nil == project and nil == language then -- when both are nil
utilities.set_message ('err_bad_paramlink', last_alias); -- not known, emit an error message -- TODO: err_bad_interwiki?
last = utilities.remove_wiki_link (last); -- remove wikilink markup; show display value only
end
end
if link then -- error check |linkn= alias for unknown interwiki link prefix
local project, language = interwiki_prefixen_get (link, false); -- false because wiki links in |author-linkn= is an error
if nil == project and nil == language then -- when both are nil
utilities.set_message ('err_bad_paramlink', link_alias); -- not known, emit an error message -- TODO: err_bad_interwiki?
link = nil; -- unset so we don't link
link_alias = nil;
end
end
last, etal = name_has_etal (last, etal, false, last_alias); -- find and remove variations on et al.
first, etal = name_has_etal (first, etal, false, first_alias); -- find and remove variations on et al.
last, first = name_checks (last, first, list_name, last_alias, first_alias); -- multiple names, extraneous annotation, etc. checks
if first and not last then -- if there is a firstn without a matching lastn
local alias = first_alias:find ('given', 1, true) and 'given' or 'first'; -- get first or given form of the alias
utilities.set_message ('err_first_missing_last', {
first_alias, -- param name of alias missing its mate
first_alias:gsub (alias, {['first'] = 'last', ['given'] = 'surname'}), -- make param name appropriate to the alias form
}); -- add this error message
elseif not first and not last then -- if both firstn and lastn aren't found, are we done?
count = count + 1; -- number of times we haven't found last and first
if 2 <= count then -- two missing names and we give up
break; -- normal exit or there is a two-name hole in the list; can't tell which
end
else -- we have last with or without a first
link = link_title_ok (link, link_alias, last, last_alias); -- check for improper wiki-markup
if first then
link = link_title_ok (link, link_alias, first, first_alias); -- check for improper wiki-markup
end
names[n] = {last = last, first = first, link = link, mask = mask, corporate = false}; -- add this name to our names list (corporate for |vauthors= only)
n = n + 1; -- point to next location in the names table
if 1 == count then -- if the previous name was missing
utilities.set_message ('err_missing_name', {list_name:match ("(%w+)List"):lower(), i - 1}); -- add this error message
end
count = 0; -- reset the counter, we're looking for two consecutive missing names
end
i = i + 1; -- point to next args location
end
return names, etal; -- all done, return our list of names and the etal flag
end
--[[--------------------------< N A M E _ T A G _ G E T >------------------------------------------------------
attempt to decode |language=<lang_param> and return language name and matching tag; nil else.
This function looks for:
<lang_param> as a tag in cfg.lang_tag_remap{}
<lang_param> as a name in cfg.lang_name_remap{}
<lang_param> as a name in cfg.mw_languages_by_name_t
<lang_param> as a tag in cfg.mw_languages_by_tag_t
when those fail, presume that <lang_param> is an IETF-like tag that MediaWiki does not recognize. Strip all
script, region, variant, whatever subtags from <lang_param> to leave just a two or three character language tag
and look for the new <lang_param> in cfg.mw_languages_by_tag_t{}
on success, returns name (in properly capitalized form) and matching tag (in lowercase); on failure returns nil
]]
local function name_tag_get (lang_param)
local lang_param_lc = mw.ustring.lower (lang_param); -- use lowercase as an index into the various tables
local name;
local tag;
name = cfg.lang_tag_remap[lang_param_lc]; -- assume <lang_param_lc> is a tag; attempt to get remapped language name
if name then -- when <name>, <lang_param> is a tag for a remapped language name
if cfg.lang_name_remap[name:lower()][2] ~= lang_param_lc then
utilities.set_message ('maint_unknown_lang'); -- add maint category if not already added
return name, cfg.lang_name_remap[name:lower()][2]; -- so return name and tag from lang_name_remap[name]; special case to xlate sr-ec and sr-el to sr-cyrl and sr-latn
end
return name, lang_param_lc; -- so return <name> from remap and <lang_param_lc>
end
tag = lang_param_lc:match ('^(%a%a%a?)%-.*'); -- still assuming that <lang_param_lc> is a tag; strip script, region, variant subtags
name = cfg.lang_tag_remap[tag]; -- attempt to get remapped language name with language subtag only
if name then -- when <name>, <tag> is a tag for a remapped language name
return name, tag; -- so return <name> from remap and <tag>
end
if cfg.lang_name_remap[lang_param_lc] then -- not a remapped tag, assume <lang_param_lc> is a name; attempt to get remapped language tag
return cfg.lang_name_remap[lang_param_lc][1], cfg.lang_name_remap[lang_param_lc][2]; -- for this <lang_param_lc>, return a (possibly) new name and appropriate tag
end
name = cfg.mw_languages_by_tag_t[lang_param_lc]; -- assume that <lang_param_lc> is a tag; attempt to get its matching language name
if name then
return name, lang_param_lc; -- <lang_param_lc> is a tag so return it and <name>
end
tag = cfg.mw_languages_by_name_t[lang_param_lc]; -- assume that <lang_param_lc> is a language name; attempt to get its matching tag
if tag then
return cfg.mw_languages_by_tag_t[tag], tag; -- <lang_param_lc> is a name so return the name from the table and <tag>
end
tag = lang_param_lc:match ('^(%a%a%a?)%-.*'); -- is <lang_param_lc> an IETF-like tag that MediaWiki doesn't recognize? <tag> gets the language subtag; nil else
if tag then
name = cfg.mw_languages_by_tag_t[tag]; -- attempt to get a language name using the shortened <tag>
if name then
return name, tag; -- <lang_param_lc> is an unrecognized IETF-like tag so return <name> and language subtag
end
end
end
--[[-------------------< L A N G U A G E _ P A R A M E T E R >------------------
Gets language name from a provided two- or three-character ISO 639 code. If a code
is recognized by MediaWiki, use the returned name; if not, then use the value that
was provided with the language parameter.
When |language= contains a recognized language (either code or name), the page is
assigned to the category for that code: Category:Norwegian-language sources (no).
For valid three-character code languages, the page is assigned to the single category
for '639-2' codes: Category:CS1 ISO 639-2 language sources.
Languages that are the same as the local wiki are not categorized. MediaWiki does
not recognize three-character equivalents of two-character codes: code 'ar' is
recognized but code 'ara' is not.
This function supports multiple languages in the form |language=nb, French, th
where the language names or codes are separated from each other by commas with
optional space characters.
]]
local function language_parameter (lang)
local tag; -- some form of IETF-like language tag; language subtag with optional region, sript, vatiant, etc subtags
local lang_subtag; -- ve populates |language= with mostly unecessary region subtags that MediaWiki does not recognize; this is the base language subtag
local name; -- the language name
local language_list = {}; -- table of language names to be rendered
local names_t = mw.text.split (lang, '%s*,%s*'); -- names should be a comma separated list
for _, lang in ipairs (names_t) do -- reuse lang here because we don't yet know if lang is a language name or a language tag; for now, ignore linter warning
name, tag = name_tag_get (lang); -- attempt to get name/tag pair for <lang>; <name> has proper capitalization; <tag> is lowercase
if utilities.is_set (tag) then
lang_subtag = tag:gsub ('^(%a%a%a?)%-.*', '%1'); -- for categorization, strip any IETF-like tags from language tag
if cfg.this_wiki_code ~= lang_subtag then -- when the language is not the same as this wiki's language
if 2 == lang_subtag:len() then -- and is a two-character tag
utilities.add_prop_cat ('foreign-lang-source', {name, tag}, lang_subtag); -- categorize it; tag appended to allow for multiple language categorization
else -- or is a recognized language (but has a three-character tag)
utilities.add_prop_cat ('foreign-lang-source-2', {lang_subtag}, lang_subtag); -- categorize it differently TODO: support multiple three-character tag categories per cs1|2 template?
end
elseif cfg.local_lang_cat_enable then -- when the language and this wiki's language are the same and categorization is enabled
utilities.add_prop_cat ('local-lang-source', {name, lang_subtag}); -- categorize it
end
else
name = lang; -- return whatever <lang> has so that we show something
utilities.set_message ('maint_unknown_lang'); -- add maint category if not already added
end
table.insert (language_list, name);
end
name = utilities.make_sep_list (#language_list, language_list);
if (1 == #language_list) and (lang_subtag == cfg.this_wiki_code) then -- when only one language, find lang name in this wiki lang name; for |language=en-us, 'English' in 'American English'
return ''; -- if one language and that language is this wiki's return an empty string (no annotation)
end
return (" " .. wrap_msg ('language', name)); -- otherwise wrap with '(in ...)'
--[[ TODO: should only return blank or name rather than full list
so we can clean up the bunched parenthetical elements Language, Type, Format
]]
end
--[[-----------------------< S E T _ C S _ S T Y L E >--------------------------
Gets the default CS style configuration for the given mode.
Returns default separator and either postscript as passed in or the default.
In CS1, the default postscript and separator are '.'.
In CS2, the default postscript is the empty string and the default separator is ','.
]]
local function set_cs_style (postscript, mode)
if utilities.is_set(postscript) then
-- emit a maintenance message if user postscript is the default cs1 postscript
-- we catch the opposite case for cs2 in set_style
if mode == 'cs1' and postscript == cfg.presentation['ps_' .. mode] then
utilities.set_message ('maint_postscript');
end
else
postscript = cfg.presentation['ps_' .. mode];
end
return cfg.presentation['sep_' .. mode], postscript;
end
--[[--------------------------< S E T _ S T Y L E >-----------------------------
Sets the separator and postscript styles. Checks the |mode= first and the
#invoke CitationClass second. Removes the postscript if postscript == none.
]]
local function set_style (mode, postscript, cite_class)
local sep;
if 'cs2' == mode then
sep, postscript = set_cs_style (postscript, 'cs2');
elseif 'cs1' == mode then
sep, postscript = set_cs_style (postscript, 'cs1');
elseif 'citation' == cite_class then
sep, postscript = set_cs_style (postscript, 'cs2');
else
sep, postscript = set_cs_style (postscript, 'cs1');
end
if cfg.keywords_xlate[postscript:lower()] == 'none' then
-- emit a maintenance message if user postscript is the default cs2 postscript
-- we catch the opposite case for cs1 in set_cs_style
if 'cs2' == mode or ('cs1' ~= mode and 'citation' == cite_class) then -- {{citation |title=Title |mode=cs1 |postscript=none}} should not emit maint message
utilities.set_message ('maint_postscript');
end
postscript = '';
end
return sep, postscript
end
--[=[-------------------------< I S _ P D F >-----------------------------------
Determines if a URL has the file extension that is one of the PDF file extensions
used by [[MediaWiki:Common.css]] when applying the PDF icon to external links.
returns true if file extension is one of the recognized extensions, else false
]=]
local function is_pdf (url)
return url:match ('%.pdf$') or url:match ('%.PDF$') or
url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]') or
url:match ('%.PDF#') or url:match ('%.pdf#');
end
--[[--------------------------< S T Y L E _ F O R M A T >-----------------------
Applies CSS style to |format=, |chapter-format=, etc. Also emits an error message
if the format parameter does not have a matching URL parameter. If the format parameter
is not set and the URL contains a file extension that is recognized as a PDF document
by MediaWiki's commons.css, this code will set the format parameter to (PDF) with
the appropriate styling.
]]
local function style_format (format, url, fmt_param, url_param)
if utilities.is_set (format) then
format = utilities.wrap_style ('format', format); -- add leading space, parentheses, resize
if not utilities.is_set (url) then
utilities.set_message ('err_format_missing_url', {fmt_param, url_param}); -- add an error message
end
elseif is_pdf (url) then -- format is not set so if URL is a PDF file then
format = utilities.wrap_style ('format', 'PDF'); -- set format to PDF
else
format = ''; -- empty string for concatenation
end
return format;
end
--[[---------------------< G E T _ D I S P L A Y _ N A M E S >------------------
Returns a number that defines the number of names displayed for author and editor
name lists and a Boolean flag to indicate when et al. should be appended to the name list.
When the value assigned to |display-xxxxors= is a number greater than or equal to zero,
return the number and the previous state of the 'etal' flag (false by default
but may have been set to true if the name list contains some variant of the text 'et al.').
When the value assigned to |display-xxxxors= is the keyword 'etal', return a number
that is one greater than the number of authors in the list and set the 'etal' flag true.
This will cause the list_people() to display all of the names in the name list followed by 'et al.'
In all other cases, returns nil and the previous state of the 'etal' flag.
inputs:
max: A['DisplayAuthors'] or A['DisplayEditors'], etc; a number or some flavor of etal
count: #a or #e
list_name: 'authors' or 'editors'
etal: author_etal or editor_etal
This function sets an error message when |display-xxxxors= value greater than or equal to number of names but
not when <max> comes from {{cs1 config}} global settings. When using global settings, <param> is set to the
keyword 'cs1 config' which is used to supress the normal error. Error is suppressed because it is to be expected
that some citations in an article will have the same or fewer names that the limit specified in {{cs1 config}}.
]]
local function get_display_names (max, count, etal, param)
if utilities.is_set (max) then
if 'etal' == cfg.keywords_xlate[max:lower():gsub("[ '%.]", '')] then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
max = count + 1; -- number of authors + 1 so display all author name plus et al.
etal = true; -- overrides value set by extract_names()
elseif max:match ('^%d+$') then -- if is a string of numbers
max = tonumber (max); -- make it a number
if (max >= count) and ('cs1 config' ~= param) then -- error when local |display-xxxxors= value greater than or equal to number of names; not an error when using global setting
utilities.set_message ('err_disp_name', {param, max}); -- add error message
max = nil;
end
else -- not a valid keyword or number
utilities.set_message ('err_disp_name', {param, max}); -- add error message
max = nil; -- unset; as if |display-xxxxors= had not been set
end
end
return max, etal;
end
--[[----------< E X T R A _ T E X T _ I N _ P A G E _ C H E C K >---------------
Adds error if |page=, |pages=, |quote-page=, |quote-pages= has what appears to be
some form of p. or pp. abbreviation in the first characters of the parameter content.
check page for extraneous p, p., pp, pp., pg, pg. at start of parameter value:
good pattern: '^P[^%.P%l]' matches when page begins PX or P# but not Px
where x and X are letters and # is a digit
bad pattern: '^[Pp][PpGg]' matches when page begins pp, pP, Pp, PP, pg, pG, Pg, PG
]]
local function extra_text_in_page_check (val, name)
if not val:match (cfg.vol_iss_pg_patterns.good_ppattern) then
for _, pattern in ipairs (cfg.vol_iss_pg_patterns.bad_ppatterns) do -- spin through the selected sequence table of patterns
if val:match (pattern) then -- when a match, error so
utilities.set_message ('err_extra_text_pages', name); -- add error message
return; -- and done
end
end
end
end
--[[--------------------------< E X T R A _ T E X T _ I N _ V O L _ I S S _ C H E C K >------------------------
Adds error if |volume= or |issue= has what appears to be some form of redundant 'type' indicator. Applies to
both; this function looks for issue text in both |issue= and |volume= and looks for volume-like text in |voluem=
and |issue=.
For |volume=:
'V.', or 'Vol.' (with or without the dot) abbreviations or 'Volume' in the first characters of the parameter
content (all case insensitive). 'V' and 'v' (without the dot) are presumed to be roman numerals so
are allowed.
For |issue=:
'No.', 'I.', 'Iss.' (with or without the dot) abbreviations, or 'Issue' in the first characters of the
parameter content (all case insensitive); numero styling: 'n°' with degree sign U+00B0, and № precomposed
numero sign U+2116.
Single character values ('v', 'i', 'n') allowed when not followed by separator character ('.', ':', '=', or
whitespace character) – param values are trimmed of whitespace by MediaWiki before delivered to the module.
<val> is |volume= or |issue= parameter value
<name> is |volume= or |issue= parameter name for error message
<selector> is 'v' for |volume=, 'i' for |issue=
sets error message on failure; returns nothing
]]
local function extra_text_in_vol_iss_check (val, name, selector)
if not utilities.is_set (val) then
return;
end
local handler = 'v' == selector and 'err_extra_text_volume' or 'err_extra_text_issue';
local accept_val; -- for now, ignore linter warning
val, accept_val = utilities.has_accept_as_written (val);
--if accept_val then -- if uncomment this, |volume=((vol. 1)) suppresses error
-- return;
--end
--val = mw.text.unstripNoWiki (val); -- if uncomment this, |volume=<nowiki>vol. 1</nowiki> shows error
val = val:lower(); -- force parameter value to lower case
for _, pattern in ipairs (cfg.vol_iss_pg_patterns.vi_patterns_t) do -- spin through the sequence table of patterns
if val:match (pattern) then -- when a match, error so
utilities.set_message (handler, name); -- add error message
return; -- and done
end
end
end
--[=[-------------------------< G E T _ V _ N A M E _ T A B L E >----------------------------------------------
split apart a |vauthors= or |veditors= parameter. This function allows for corporate names, wrapped in doubled
parentheses to also have commas; in the old version of the code, the doubled parentheses were included in the
rendered citation and in the metadata. Individual author names may be wikilinked
|vauthors=Jones AB, [[E. B. White|White EB]], ((Black, Brown, and Co.))
]=]
local function get_v_name_table (vparam, output_table, output_link_table)
local _, accept = utilities.has_accept_as_written (vparam);
if accept then
utilities.add_prop_cat ('vanc-accept'); -- add properties category
end
local name_table = mw.text.split(vparam, "%s*,%s*"); -- names are separated by commas
local wl_type, label, link; -- wl_type not used here; just a placeholder
local i = 1;
while name_table[i] do
if name_table[i]:match ('^%(%(.*[^%)][^%)]$') then -- first segment of corporate with one or more commas; this segment has the opening doubled parentheses
local name = name_table[i];
i = i + 1; -- bump indexer to next segment
while name_table[i] do
name = name .. ', ' .. name_table[i]; -- concatenate with previous segments
if name_table[i]:match ('^.*%)%)$') then -- if this table member has the closing doubled parentheses
break; -- and done reassembling so
end
i = i + 1; -- bump indexer
end
table.insert (output_table, name); -- and add corporate name to the output table
table.insert (output_link_table, ''); -- no wikilink
else
wl_type, label, link = utilities.is_wikilink (name_table[i]); -- wl_type is: 0, no wl (text in label variable); 1, [[D]]; 2, [[L|D]]
table.insert (output_table, label); -- add this name
if 1 == wl_type then
table.insert (output_link_table, label); -- simple wikilink [[D]]
else
table.insert (output_link_table, link); -- no wikilink or [[L|D]]; add this link if there is one, else empty string
end
end
i = i + 1;
end
return output_table;
end
--[[--------------------------< P A R S E _ V A U T H O R S _ V E D I T O R S >--------------------------------
This function extracts author / editor names from |vauthors= or |veditors= and finds matching |xxxxor-maskn= and
|xxxxor-linkn= in args. It then returns a table of assembled names just as extract_names() does.
Author / editor names in |vauthors= or |veditors= must be in Vancouver system style. Corporate or institutional names
may sometimes be required and because such names will often fail the is_good_vanc_name() and other format compliance
tests, are wrapped in doubled parentheses ((corporate name)) to suppress the format tests.
Supports generational suffixes Jr, 2nd, 3rd, 4th–6th.
This function sets the Vancouver error when a required comma is missing and when there is a space between an author's initials.
]]
local function parse_vauthors_veditors (args, vparam, list_name)
local names = {}; -- table of names assembled from |vauthors=, |author-maskn=, |author-linkn=
local v_name_table = {};
local v_link_table = {}; -- when name is wikilinked, targets go in this table
local etal = false; -- return value set to true when we find some form of et al. vauthors parameter
local last, first, link, mask, suffix;
local corporate = false;
vparam, etal = name_has_etal (vparam, etal, true); -- find and remove variations on et al. do not categorize (do it here because et al. might have a period)
v_name_table = get_v_name_table (vparam, v_name_table, v_link_table); -- names are separated by commas
for i, v_name in ipairs(v_name_table) do
first = ''; -- set to empty string for concatenation and because it may have been set for previous author/editor
local accept_name;
v_name, accept_name = utilities.has_accept_as_written (v_name); -- remove accept-this-as-written markup when it wraps all of <v_name>
if accept_name then
last = v_name;
corporate = true; -- flag used in list_people()
elseif string.find(v_name, "%s") then
if v_name:find('[;%.]') then -- look for commonly occurring punctuation characters;
add_vanc_error (cfg.err_msg_supl.punctuation, i);
end
local lastfirst_t = mw.text.split(v_name, "%s+");
first = table.remove (lastfirst_t); -- removes and returns value of last element in table which should be initials or generational suffix
if not mw.ustring.match (first, '^%u+$') then -- mw.ustring here so that later we will catch non-Latin characters
suffix = first; -- not initials so assume that whatever we got is a generational suffix
first = table.remove (lastfirst_t); -- get what should be the initials from the table
end
last = table.concat (lastfirst_t, ' '); -- returns a string that is the concatenation of all other names that are not initials and generational suffix
if not utilities.is_set (last) then
first = ''; -- unset
last = v_name; -- last empty because something wrong with first
add_vanc_error (cfg.err_msg_supl.name, i);
end
if mw.ustring.match (last, '%a+%s+%u+%s+%a+') then
add_vanc_error (cfg.err_msg_supl['missing comma'], i); -- matches last II last; the case when a comma is missing
end
if mw.ustring.match (v_name, ' %u %u$') then -- this test is in the wrong place TODO: move or replace with a more appropriate test
add_vanc_error (cfg.err_msg_supl.initials, i); -- matches a space between two initials
end
else
last = v_name; -- last name or single corporate name? Doesn't support multiword corporate names? do we need this?
end
if utilities.is_set (first) then
if not mw.ustring.match (first, "^%u?%u$") then -- first shall contain one or two upper-case letters, nothing else
add_vanc_error (cfg.err_msg_supl.initials, i); -- too many initials; mixed case initials (which may be ok Romanization); hyphenated initials
end
is_good_vanc_name (last, first, suffix, i); -- check first and last before restoring the suffix which may have a non-Latin digit
if utilities.is_set (suffix) then
first = first .. ' ' .. suffix; -- if there was a suffix concatenate with the initials
suffix = ''; -- unset so we don't add this suffix to all subsequent names
end
else
if not corporate then
is_good_vanc_name (last, '', nil, i);
end
end
link = utilities.select_one ( args, cfg.aliases[list_name .. '-Link'], 'err_redundant_parameters', i ) or v_link_table[i];
mask = utilities.select_one ( args, cfg.aliases[list_name .. '-Mask'], 'err_redundant_parameters', i );
names[i] = {last = last, first = first, link = link, mask = mask, corporate = corporate}; -- add this assembled name to our names list
end
return names, etal; -- all done, return our list of names
end
--[[--------------------------< S E L E C T _ A U T H O R _ E D I T O R _ S O U R C E >------------------------
Select one of |authors=, |authorn= / |lastn / firstn=, or |vauthors= as the source of the author name list or
select one of |editorn= / editor-lastn= / |editor-firstn= or |veditors= as the source of the editor name list.
Only one of these appropriate three will be used. The hierarchy is: |authorn= (and aliases) highest and |authors= lowest;
|editorn= (and aliases) highest and |veditors= lowest (support for |editors= withdrawn)
When looking for |authorn= / |editorn= parameters, test |xxxxor1= and |xxxxor2= (and all of their aliases); stops after the second
test which mimicks the test used in extract_names() when looking for a hole in the author name list. There may be a better
way to do this, I just haven't discovered what that way is.
Emits an error message when more than one xxxxor name source is provided.
In this function, vxxxxors = vauthors or veditors; xxxxors = authors as appropriate.
]]
local function select_author_editor_source (vxxxxors, xxxxors, args, list_name)
local lastfirst = false;
if utilities.select_one ( args, cfg.aliases[list_name .. '-Last'], 'none', 1 ) or -- do this twice in case we have a |first1= without a |last1=; this ...
utilities.select_one ( args, cfg.aliases[list_name .. '-First'], 'none', 1 ) or -- ... also catches the case where |first= is used with |vauthors=
utilities.select_one ( args, cfg.aliases[list_name .. '-Last'], 'none', 2 ) or
utilities.select_one ( args, cfg.aliases[list_name .. '-First'], 'none', 2 ) then
lastfirst = true;
end
if (utilities.is_set (vxxxxors) and true == lastfirst) or -- these are the three error conditions
(utilities.is_set (vxxxxors) and utilities.is_set (xxxxors)) or
(true == lastfirst and utilities.is_set (xxxxors)) then
utilities.set_message ('err_redundant_parameters',
utilities.substitute (cfg.special_case_translation.name_list_params,
('AuthorList' == list_name) and cfg.special_case_translation.author or cfg.special_case_translation.editor)); -- add error message
end
if true == lastfirst then return 1 end; -- return a number indicating which author name source to use
if utilities.is_set (vxxxxors) then return 2 end;
if utilities.is_set (xxxxors) then return 3 end;
return 1; -- no authors so return 1; this allows missing author name test to run in case there is a first without last
end
--[[--------------------------< I S _ V A L I D _ P A R A M E T E R _ V A L U E >------------------------------
This function is used to validate a parameter's assigned value for those parameters that have only a limited number
of allowable values (yes, y, true, live, dead, etc.). When the parameter value has not been assigned a value (missing
or empty in the source template) the function returns the value specified by ret_val. If the parameter value is one
of the list of allowed values returns the translated value; else, emits an error message and returns the value
specified by ret_val.
TODO: explain <invert>
]]
local function is_valid_parameter_value (value, name, possible, ret_val, invert)
if not utilities.is_set (value) then
return ret_val; -- an empty parameter is ok
end
if (not invert and utilities.in_array (value, possible)) then -- normal; <value> is in <possible> table
return cfg.keywords_xlate[value]; -- return translation of parameter keyword
elseif invert and not utilities.in_array (value, possible) then -- invert; <value> is not in <possible> table
return value; -- return <value> as it is
else
utilities.set_message ('err_invalid_param_val', {name, value}); -- not an allowed value so add error message
return ret_val;
end
end
--[[--------------------------< T E R M I N A T E _ N A M E _ L I S T >----------------------------------------
This function terminates a name list (author, contributor, editor) with a separator character (sepc) and a space
when the last character is not a sepc character or when the last three characters are not sepc followed by two
closing square brackets (close of a wikilink). When either of these is true, the name_list is terminated with a
single space character.
]]
local function terminate_name_list (name_list, sepc)
if (string.sub (name_list, -3, -1) == sepc .. '. ') then -- if already properly terminated
return name_list; -- just return the name list
elseif (string.sub (name_list, -1, -1) == sepc) or (string.sub (name_list, -3, -1) == sepc .. ']]') then -- if last name in list ends with sepc char
return name_list .. " "; -- don't add another
else
return name_list .. sepc .. ' '; -- otherwise terminate the name list
end
end
--[[-------------------------< F O R M A T _ V O L U M E _ I S S U E >-----------------------------------------
returns the concatenation of the formatted volume and issue (or journal article number) parameters as a single
string; or formatted volume or formatted issue, or an empty string if neither are set.
]]
local function format_volume_issue (volume, issue, article, cite_class, origin, script_origin, sepc, lower)
if not utilities.is_set (volume) and not utilities.is_set (issue) and not utilities.is_set (article) then
return '';
end
-- same condition as in format_pages_sheets()
local is_journal = 'journal' == cite_class or (utilities.in_array (cite_class, {'citation', 'map', 'interview'}) and ('journal' == origin or 'script-journal' == script_origin));
local is_numeric_vol = volume and (volume:match ('^[MDCLXVI]+$') or volume:match ('^%d+$')); -- is only uppercase roman numerals or only digits?
local is_long_vol = volume and (4 < mw.ustring.len(volume)); -- is |volume= value longer than 4 characters?
if volume and (not is_numeric_vol and is_long_vol) then -- when not all digits or Roman numerals, is |volume= longer than 4 characters?
utilities.add_prop_cat ('long-vol'); -- yes, add properties cat
end
if is_journal then -- journal-style formatting
local vol = '';
if utilities.is_set (volume) then
if is_numeric_vol then -- |volume= value all digits or all uppercase Roman numerals?
vol = utilities.substitute (cfg.presentation['vol-bold'], {sepc, volume}); -- render in bold face
elseif is_long_vol then -- not all digits or Roman numerals; longer than 4 characters?
vol = utilities.substitute (cfg.messages['j-vol'], {sepc, utilities.hyphen_to_dash (volume)}); -- not bold
else -- four or fewer characters
vol = utilities.substitute (cfg.presentation['vol-bold'], {sepc, utilities.hyphen_to_dash (volume)}); -- bold
end
end
vol = vol .. (utilities.is_set (issue) and utilities.substitute (cfg.messages['j-issue'], issue) or '')
vol = vol .. (utilities.is_set (article) and utilities.substitute (cfg.messages['j-article-num'], article) or '')
return vol;
end
if 'podcast' == cite_class and utilities.is_set (issue) then
return wrap_msg ('issue', {sepc, issue}, lower);
end
if 'conference' == cite_class and utilities.is_set (article) then -- |article-number= supported only in journal and conference cites
if utilities.is_set (volume) and utilities.is_set (article) then -- both volume and article number
return wrap_msg ('vol-art', {sepc, utilities.hyphen_to_dash (volume), article}, lower);
elseif utilities.is_set (article) then -- article number alone; when volume alone, handled below
return wrap_msg ('art', {sepc, article}, lower);
end
end
-- all other types of citation
if utilities.is_set (volume) and utilities.is_set (issue) then
return wrap_msg ('vol-no', {sepc, utilities.hyphen_to_dash (volume), issue}, lower);
elseif utilities.is_set (volume) then
return wrap_msg ('vol', {sepc, utilities.hyphen_to_dash (volume)}, lower);
else
return wrap_msg ('issue', {sepc, issue}, lower);
end
end
--[[-------------------------< F O R M A T _ P A G E S _ S H E E T S >-----------------------------------------
adds static text to one of |page(s)= or |sheet(s)= values and returns it with all of the others set to empty strings.
The return order is:
page, pages, sheet, sheets
Singular has priority over plural when both are provided.
]]
local function format_pages_sheets (page, pages, sheet, sheets, cite_class, origin, script_origin, sepc, nopp, lower)
if 'map' == cite_class then -- only cite map supports sheet(s) as in-source locators
if utilities.is_set (sheet) then
if 'journal' == origin or 'script-journal' == script_origin then
return '', '', wrap_msg ('j-sheet', sheet, lower), '';
else
return '', '', wrap_msg ('sheet', {sepc, sheet}, lower), '';
end
elseif utilities.is_set (sheets) then
if 'journal' == origin or 'script-journal' == script_origin then
return '', '', '', wrap_msg ('j-sheets', sheets, lower);
else
return '', '', '', wrap_msg ('sheets', {sepc, sheets}, lower);
end
end
end
local is_journal = 'journal' == cite_class or (utilities.in_array (cite_class, {'citation', 'map', 'interview'}) and ('journal' == origin or 'script-journal' == script_origin));
if utilities.is_set (page) then
if is_journal then
return utilities.substitute (cfg.messages['j-page(s)'], page), '', '', '';
elseif not nopp then
return utilities.substitute (cfg.messages['p-prefix'], {sepc, page}), '', '', '';
else
return utilities.substitute (cfg.messages['nopp'], {sepc, page}), '', '', '';
end
elseif utilities.is_set (pages) then
if is_journal then
return utilities.substitute (cfg.messages['j-page(s)'], pages), '', '', '';
elseif tonumber(pages) ~= nil and not nopp then -- if pages is only digits, assume a single page number
return '', utilities.substitute (cfg.messages['p-prefix'], {sepc, pages}), '', '';
elseif not nopp then
return '', utilities.substitute (cfg.messages['pp-prefix'], {sepc, pages}), '', '';
else
return '', utilities.substitute (cfg.messages['nopp'], {sepc, pages}), '', '';
end
end
return '', '', '', ''; -- return empty strings
end
--[[--------------------------< I N S O U R C E _ L O C _ G E T >----------------------------------------------
returns one of the in-source locators: page, pages, or at.
If any of these are interwiki links to Wikisource, returns the label portion of the interwiki-link as plain text
for use in COinS. This COinS thing is done because here we convert an interwiki-link to an external link and
add an icon span around that; get_coins_pages() doesn't know about the span. TODO: should it?
TODO: add support for sheet and sheets?; streamline;
TODO: make it so that this function returns only one of the three as the single in-source (the return value assigned
to a new name)?
]]
local function insource_loc_get (page, page_orig, pages, pages_orig, at)
local ws_url, ws_label, coins_pages, L; -- for Wikisource interwiki-links; TODO: this corrupts page metadata (span remains in place after cleanup; fix there?)
if utilities.is_set (page) then
if utilities.is_set (pages) or utilities.is_set (at) then
pages = ''; -- unset the others
at = '';
end
extra_text_in_page_check (page, page_orig); -- emit error message when |page= value begins with what looks like p., pp., etc.
ws_url, ws_label, L = wikisource_url_make (page); -- make ws URL from |page= interwiki link; link portion L becomes tooltip label
if ws_url then
page = external_link (ws_url, ws_label .. ' ', 'ws link in page'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
page = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, page});
coins_pages = ws_label;
end
elseif utilities.is_set (pages) then
if utilities.is_set (at) then
at = ''; -- unset
end
extra_text_in_page_check (pages, pages_orig); -- emit error message when |page= value begins with what looks like p., pp., etc.
ws_url, ws_label, L = wikisource_url_make (pages); -- make ws URL from |pages= interwiki link; link portion L becomes tooltip label
if ws_url then
pages = external_link (ws_url, ws_label .. ' ', 'ws link in pages'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
pages = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, pages});
coins_pages = ws_label;
end
elseif utilities.is_set (at) then
ws_url, ws_label, L = wikisource_url_make (at); -- make ws URL from |at= interwiki link; link portion L becomes tooltip label
if ws_url then
at = external_link (ws_url, ws_label .. ' ', 'ws link in at'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
at = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, at});
coins_pages = ws_label;
end
end
return page, pages, at, coins_pages;
end
--[[--------------------------< I S _ U N I Q U E _ A R C H I V E _ U R L >------------------------------------
add error message when |archive-url= value is same as |url= or chapter-url= (or alias...) value
]]
local function is_unique_archive_url (archive, url, c_url, source, date)
if utilities.is_set (archive) then
if archive == url or archive == c_url then
utilities.set_message ('err_bad_url', {utilities.wrap_style ('parameter', source)}); -- add error message
return '', ''; -- unset |archive-url= and |archive-date= because same as |url= or |chapter-url=
end
end
return archive, date;
end
--[=[-------------------------< A R C H I V E _ U R L _ C H E C K >--------------------------------------------
Check archive.org URLs to make sure they at least look like they are pointing at valid archives and not to the
save snapshot URL or to calendar pages. When the archive URL is 'https://web.archive.org/save/' (or http://...)
archive.org saves a snapshot of the target page in the URL. That is something that Wikipedia should not allow
unwitting readers to do.
When the archive.org URL does not have a complete timestamp, archive.org chooses a snapshot according to its own
algorithm or provides a calendar 'search' result. [[WP:ELNO]] discourages links to search results.
This function looks at the value assigned to |archive-url= and returns empty strings for |archive-url= and
|archive-date= and an error message when:
|archive-url= holds an archive.org save command URL
|archive-url= is an archive.org URL that does not have a complete timestamp (YYYYMMDDhhmmss 14 digits) in the
correct place
otherwise returns |archive-url= and |archive-date=
There are two mostly compatible archive.org URLs:
//web.archive.org/<timestamp>... -- the old form
//web.archive.org/web/<timestamp>... -- the new form
The old form does not support or map to the new form when it contains a display flag. There are four identified flags
('id_', 'js_', 'cs_', 'im_') but since archive.org ignores others following the same form (two letters and an underscore)
we don't check for these specific flags but we do check the form.
This function supports a preview mode. When the article is rendered in preview mode, this function may return a modified
archive URL:
for save command errors, return undated wildcard (/*/)
for timestamp errors when the timestamp has a wildcard, return the URL unmodified
for timestamp errors when the timestamp does not have a wildcard, return with timestamp limited to six digits plus wildcard (/yyyymm*/)
A secondary function is to return an archive-url timestamp from those archive urls that have them. The timestamp
is used by validation.archive_date_check() to see if the value in |archive-date= matches the timestamp in the
archive url.
]=]
local function archive_url_check (url, date)
local err_msg; -- start with the error message empty
local path, timestamp, flag; -- portions of the archive.org URL
local function is_ts_date_valid (ts, origin_date) -- local function to validate archive url taimestamp date; time ignored
local y, m, d = ts:match ('(%d%d%d%d)(%d%d)(%d%d)'); -- split into parts
if y and validation.is_valid_date (y, m, d) and (tonumber (y) >= 1996) then
return true, tonumber (y) >= origin_date; -- <origin_date> is 1996 for archive.org
end
end
if (not url:match('//web%.archive%.org/')) and (not url:match('//liveweb%.archive%.org/')) then -- also deprecated liveweb Wayback machine URL
return url, date; -- not an archive.org archive, return ArchiveURL and ArchiveDate
end
if url:match('//web%.archive%.org/save/') then -- if a save command URL, we don't want to allow saving of the target page
err_msg = cfg.err_msg_supl.save;
url = url:gsub ('(//web%.archive%.org)/save/', '%1/*/', 1); -- for preview mode: modify ArchiveURL
elseif url:match('//liveweb%.archive%.org/') then
err_msg = cfg.err_msg_supl.liveweb;
else
path, timestamp, flag = url:match('//web%.archive%.org/([^%d]*)(%d+)([^/]*)/'); -- split out some of the URL parts for evaluation
if not path then -- malformed in some way; pattern did not match
err_msg = cfg.err_msg_supl.timestamp;
elseif 14 ~= timestamp:len() then -- path and flag optional, must have 14-digit timestamp here
err_msg = cfg.err_msg_supl.timestamp;
if '*' ~= flag then
local replacement = timestamp:match ('^%d%d%d%d%d%d') or timestamp:match ('^%d%d%d%d'); -- get the first 6 (YYYYMM) or first 4 digits (YYYY)
if replacement then -- nil if there aren't at least 4 digits (year)
replacement = replacement .. string.rep ('0', 14 - replacement:len()); -- year or yearmo (4 or 6 digits) zero-fill to make 14-digit timestamp
url=url:gsub ('(//web%.archive%.org/[^%d]*)%d[^/]*', '%1' .. replacement .. '*', 1) -- for preview, modify ts to 14 digits plus splat for calendar display
end
end
elseif not is_ts_date_valid (timestamp, 1996) then -- is ymd portion of timestamp a valid date?
err_msg = cfg.err_msg_supl.timestamp;
timestamp = nil; -- unset because invalid
elseif utilities.is_set (path) and 'web/' ~= path then -- older archive URLs do not have the extra 'web/' path element
err_msg = cfg.err_msg_supl.path;
elseif utilities.is_set (flag) and not utilities.is_set (path) then -- flag not allowed with the old form URL (without the 'web/' path element)
err_msg = cfg.err_msg_supl.flag;
elseif utilities.is_set (flag) and not flag:match ('%a%a_') then -- flag if present must be two alpha characters and underscore (requires 'web/' path element)
err_msg = cfg.err_msg_supl.flag;
else
return url, date, timestamp; -- return ArchiveURL, ArchiveDate, and timestamp from |archive-url=
end
end
-- if here, something not right so
utilities.set_message ('err_archive_url', {err_msg}); -- add error message and
if is_preview_mode then
return url, date, timestamp; -- preview mode so return ArchiveURL, ArchiveDate, and timestamp from |archive-url=
else
return '', ''; -- return empty strings for ArchiveURL and ArchiveDate
end
end
--[[--------------------------< P L A C E _ C H E C K >--------------------------------------------------------
check |place=, |publication-place=, |location= to see if these params include digits. This function added because
many editors misuse location to specify the in-source location (|page(s)= and |at= are supposed to do that)
returns the original parameter value without modification; added maint cat when parameter value contains digits
]]
local function place_check (param_val)
if not utilities.is_set (param_val) then -- parameter empty or omitted
return param_val; -- return that empty state
end
if mw.ustring.find (param_val, '%d') then -- not empty, are there digits in the parameter value
utilities.set_message ('maint_location'); -- yep, add maint cat
end
return param_val; -- and done
end
--[[--------------------------< I S _ A R C H I V E D _ C O P Y >----------------------------------------------
compares |title= to 'Archived copy' (placeholder added by bots that can't find proper title); if matches, return true; nil else
]]
local function is_archived_copy (title)
title = mw.ustring.lower(title); -- switch title to lower case
if title:find (cfg.special_case_translation.archived_copy.en) then -- if title is 'Archived copy'
return true;
elseif cfg.special_case_translation.archived_copy['local'] then
if mw.ustring.find (title, cfg.special_case_translation.archived_copy['local']) then -- mw.ustring() because might not be Latin script
return true;
end
end
end
--[[--------------------------< D I S P L A Y _ N A M E S _ S E L E C T >--------------------------------------
for any of the |display-authors=, |display-editors=, etc parameters, select either the local or global setting.
When both are present, look at <local_display_names> value. When the value is some sort of 'et al.'string,
special handling is required.
When {{cs1 config}} has |display-<namelist>= AND this template has |display-<namelist>=etal AND:
the number of names specified by <number_of_names> is:
greater than the number specified in the global |display-<namelist>= parameter (<global_display_names>)
use global |display-<namelist>= parameter value
set overridden maint category
less than or equal to the number specified in the global |display-<namelist>= parameter
use local |display-<namelist>= parameter value
The purpose of this function is to prevent categorizing a template that has fewer names than the global setting
to keep the etal annotation specified by <local_display_names>.
]]
local function display_names_select (global_display_names, local_display_names, param_name, number_of_names)
if global_display_names and utilities.is_set (local_display_names) then -- when both
if 'etal' == local_display_names:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
number_of_names = tonumber (number_of_names); -- convert these to numbers for comparison
local global_display_names_num = tonumber (global_display_names); -- <global_display_names> not set when parameter value is not digits
if number_of_names > global_display_names_num then -- template has more names than global config allows to be displayed?
utilities.set_message ('maint_overridden_setting'); -- set a maint message because global is overriding local |display-<namelist>=etal
return global_display_names, 'cs1 config'; -- return global with spoof parameter name (for get_display_names())
else
return local_display_names, param_name; -- return local because fewer names so let <local_display_names> control
end
end
-- here when <global_display_names> and <local_display_names> both numbers; <global_display_names> controls
utilities.set_message ('maint_overridden_setting'); -- set a maint message
return global_display_names, 'cs1 config'; -- return global with spoof parameter name (for get_display_names())
end
-- here when only one of <global_display_names> or <local_display_names> set
if global_display_names then
return global_display_names, 'cs1 config'; -- return global with spoof parameter name (for get_display_names())
else
return local_display_names, param_name; -- return local
end
end
--[[--------------------------< M O D E _ S E T >--------------------------------------------------------------
fetch global mode setting from {{cs1 config}} (if present) or from |mode= (if present); global setting overrides
local |mode= parameter value. When both are present, emit maintenance message
]]
local function mode_set (Mode, Mode_origin)
local mode;
if cfg.global_cs1_config_t['Mode'] then -- global setting in {{cs1 config}}; nil when empty or assigned value invalid
mode = is_valid_parameter_value (cfg.global_cs1_config_t['Mode'], 'cs1 config: mode', cfg.keywords_lists['mode'], ''); -- error messaging 'param' here is a hoax
else
mode = is_valid_parameter_value (Mode, Mode_origin, cfg.keywords_lists['mode'], '');
end
if cfg.global_cs1_config_t['Mode'] and utilities.is_set (Mode) then -- when template has |mode=<something> which global setting has overridden
utilities.set_message ('maint_overridden_setting'); -- set a maint message
end
return mode;
end
--[[--------------------------< Q U O T E _ M A K E >----------------------------------------------------------
create quotation from |quote=, |trans-quote=, and/or script-quote= with or without |quote-page= or |quote-pages=
when any of those three quote parameters are set, this function unsets <PostScript>. When none of those parameters
are set, |quote-page= and |quote-pages= are unset to nil so that they are not included in the template's metadata
]]
local function quote_make (quote, trans_quote, script_quote, quote_page, quote_pages, nopp, sepc, postscript)
if utilities.is_set (quote) or utilities.is_set (trans_quote) or utilities.is_set (script_quote) then
if utilities.is_set (quote) then
if quote:sub(1, 1) == '"' and quote:sub(-1, -1) == '"' then -- if first and last characters of quote are quote marks
quote = quote:sub(2, -2); -- strip them off
end
end
quote = kern_quotes (quote); -- kern if needed
quote = utilities.wrap_style ('quoted-text', quote ); -- wrap in <q>...</q> tags
if utilities.is_set (script_quote) then
quote = script_concatenate (quote, script_quote, 'script-quote'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after quote is wrapped
end
if utilities.is_set (trans_quote) then
if trans_quote:sub(1, 1) == '"' and trans_quote:sub(-1, -1) == '"' then -- if first and last characters of |trans-quote are quote marks
trans_quote = trans_quote:sub(2, -2); -- strip them off
end
quote = quote .. " " .. utilities.wrap_style ('trans-quoted-title', trans_quote );
end
if utilities.is_set (quote_page) or utilities.is_set (quote_pages) then -- add page prefix
local quote_prefix = '';
if utilities.is_set (quote_page) then
extra_text_in_page_check (quote_page, 'quote-page'); -- add to maint cat if |quote-page= value begins with what looks like p., pp., etc.
if not nopp then
quote_prefix = utilities.substitute (cfg.messages['p-prefix'], {sepc, quote_page});
else
quote_prefix = utilities.substitute (cfg.messages['nopp'], {sepc, quote_page});
end
elseif utilities.is_set (quote_pages) then
extra_text_in_page_check (quote_pages, 'quote-pages'); -- add to maint cat if |quote-pages= value begins with what looks like p., pp., etc.
if tonumber(quote_pages) ~= nil and not nopp then -- if only digits, assume single page
quote_prefix = utilities.substitute (cfg.messages['p-prefix'], {sepc, quote_pages});
elseif not nopp then
quote_prefix = utilities.substitute (cfg.messages['pp-prefix'], {sepc, quote_pages});
else
quote_prefix = utilities.substitute (cfg.messages['nopp'], {sepc, quote_pages});
end
end
quote = quote_prefix .. ": " .. quote;
else
quote = sepc .. " " .. quote;
end
postscript = ""; -- cs1|2 does not supply terminal punctuation when |quote= is set
elseif utilities.is_set (quote_page) or utilities.is_set (quote_pages) then
quote_page = nil; -- unset; these require |quote=; TODO: error message?
quote_pages = nil;
end
return quote, quote_page, quote_pages, postscript;
end
--[[--------------------------< C H E C K _ P U B L I S H E R _ N A M E >--------------------------------------
look for variations of '<text>: <text>' that might be '<location>: <publisher>' in |publisher= parameter value.
when found, emit a maintenance message; return nil else
<publisher> is the value assigned to |publisher= or |institution=
]]
local function check_publisher_name (publisher)
local patterns_t = {
'^[%w%s]+%s*:%s*[%w%s]+$', -- plain text <location>: <publisher>
'^%[+[%w%s:|]+%]+%s*:%s*[%w%s]+$', -- partially wikilinked [[<location>]]: <publisher>
'^[%w%s]+%s*:%s*%[+[%w%s:|]+%]+$', -- partially wikilinked <location>: [[<publisher>]]
'^%[+[%w%s:|]+%]+%s*:%s*%[+[%w%s:|]+%]+$', -- wikilinked [[<location>]]: [[<publisher>]]
}
for _, pattern in ipairs (patterns_t) do -- spin through the patterns_t sequence
if mw.ustring.match (publisher, pattern) then -- does this pattern match?
utilities.set_message ('maint_publisher_location'); -- set a maint message
return; -- and done
end
end
end
--[[--------------------------< I S _ P A G E _ A R T _ N U M >------------------------------------------------
compare the trailing (rightmost) characters of the |doi= value against the whole value assigned to |page(s)=.
return boolean true when:
|page(s)= has exactly 8 digits and a dot between the fourth and fifth digits matches the trailing 9 characters
of the |doi= value: |page=12345678 → |page=1234.5678 matches |doi=10.xxxx/yyyy1234.5678
|page(s)= is 5 or more characters and matches |doi= values's trailing characters
|page(s)= begins with a lowercase 'e' and |page(s)= without the 'e' matches |doi= values's trailing
characters: |page=e12345 → |page=12345 matches |doi=10.xxxx/yyyy12345
|page(s)= begins with a uppercase 'CD' followed by (typically) six digits matches |doi= values that ends with
'CDxxxxxx.pubx' (where 'x' is any single digit)
return nil when |page(s)= values:
are ranges separated by underscore, hyphen, emdash, endash, figure dash, or minus character
are comma- or semicolon-separated lists of pages
have external urls (has text 'http')
are digit-only values less than 10000
do not match |doi= values's trailing characters
]]
local function is_page_art_num (page, doi)
if not (utilities.is_set (page) and utilities.is_set (doi)) then -- both required
return; -- abandon; nothing to do
end
if page:match ('[,;_−–—‒%-]') then -- when |page(s)= might be a page range or a separated list of pages
return; -- abandon
end
page = page:lower(); -- because doi names are case insensitive
doi = doi:lower(); -- force these to lowercase for testing
if page:match ('http') then -- when |page(s)= appears to hold a url
return; -- abandon
end
if tonumber (page) then -- is |page(s)= digits only
if 10000 > tonumber (page) then -- when |page(s)= less than 10000
return; -- abandon
end
if doi:match (page .. '$') then -- digits only page number match the last digits in |doi=?
return true;
end
if 8 == page:len() then -- special case when |page(s)= is exactly 8 digits
local dot_page = page:gsub ('(%d%d%d%d)(%d%d%d%d)', '%1.%2'); -- make a |page=xxxx.yyyy version commonly used in |doi=
if doi:match (dot_page .. '$') then -- 8-digit dotted page number match the last characters in |doi=?
return true;
end
end
else -- here when |page(s)= is alpha-numeric
if 4 < page:len() then -- when |page(s)= is five or more characters
if doi:match (page .. '$') then -- alpha-numeric page match the last characters in |doi=?
return true;
end
local epage = page:match ('^e([%w]+)$'); -- if first character of |page= is 'e', remove it
if epage and doi:match (epage .. '$') then -- page number match the last characters in |doi=?
return true;
end
local cdpage = page:match ('^cd%d+$'); -- if first characters of |page= are 'CD' and last characters are digits (typically 6 digits)
if cdpage and doi:match (cdpage .. '%.pub%d$') then -- page number matches doi 'CDxxxxxx.pubx' where 'x' is a digit
return true;
end
end
end
end
--[[--------------------------< C I T A T I O N 0 >------------------------------------------------------------
This is the main function doing the majority of the citation formatting.
]]
local function citation0( config, args )
--[[
Load Input Parameters
The argument_wrapper facilitates the mapping of multiple aliases to single internal variable.
]]
local A = argument_wrapper ( args );
-- Pick out the relevant fields from the arguments. Different citation templates
-- define different field names for the same underlying things.
local author_etal;
local a = {}; -- authors list from |lastn= / |firstn= pairs or |vauthors=
local Authors;
local NameListStyle;
if cfg.global_cs1_config_t['NameListStyle'] then -- global setting in {{cs1 config}} overrides local |name-list-style= parameter value; nil when empty or assigned value invalid
NameListStyle = is_valid_parameter_value (cfg.global_cs1_config_t['NameListStyle'], 'cs1 config: name-list-style', cfg.keywords_lists['name-list-style'], ''); -- error messaging 'param' here is a hoax
else
NameListStyle = is_valid_parameter_value (A['NameListStyle'], A:ORIGIN('NameListStyle'), cfg.keywords_lists['name-list-style'], '');
end
if cfg.global_cs1_config_t['NameListStyle'] and utilities.is_set (A['NameListStyle']) then -- when template has |name-list-style=<something> which global setting has overridden
utilities.set_message ('maint_overridden_setting'); -- set a maint message
end
local Collaboration = A['Collaboration'];
do -- to limit scope of selected
local selected = select_author_editor_source (A['Vauthors'], A['Authors'], args, 'AuthorList');
if 1 == selected then
a, author_etal = extract_names (args, 'AuthorList'); -- fetch author list from |authorn= / |lastn= / |firstn=, |author-linkn=, and |author-maskn=
elseif 2 == selected then
NameListStyle = 'vanc'; -- override whatever |name-list-style= might be
a, author_etal = parse_vauthors_veditors (args, A['Vauthors'], 'AuthorList'); -- fetch author list from |vauthors=, |author-linkn=, and |author-maskn=
elseif 3 == selected then
Authors = A['Authors']; -- use content of |people= or |credits=; |authors= is deprecated; TODO: constrain |people= and |credits= to cite av media, episode, serial?
end
if utilities.is_set (Collaboration) then
author_etal = true; -- so that |display-authors=etal not required
end
end
local editor_etal;
local e = {}; -- editors list from |editor-lastn= / |editor-firstn= pairs or |veditors=
do -- to limit scope of selected
local selected = select_author_editor_source (A['Veditors'], nil, args, 'EditorList'); -- support for |editors= withdrawn
if 1 == selected then
e, editor_etal = extract_names (args, 'EditorList'); -- fetch editor list from |editorn= / |editor-lastn= / |editor-firstn=, |editor-linkn=, and |editor-maskn=
elseif 2 == selected then
NameListStyle = 'vanc'; -- override whatever |name-list-style= might be
e, editor_etal = parse_vauthors_veditors (args, args.veditors, 'EditorList'); -- fetch editor list from |veditors=, |editor-linkn=, and |editor-maskn=
end
end
local Chapter = A['Chapter']; -- done here so that we have access to |contribution= from |chapter= and |script-chapter= aliases
local Chapter_origin = A:ORIGIN ('Chapter');
local ScriptChapter = A['ScriptChapter'];
local ScriptChapter_origin = A:ORIGIN ('ScriptChapter');
local Contribution; -- because contribution is required for contributor(s)
if 'contribution' == Chapter_origin then -- is there a |contribution= parameter?
Contribution = Chapter; -- get the name of the contribution
elseif 'script-contribution' == ScriptChapter_origin then -- no, so is there a |script-contribution= parameter?
Contribution = ScriptChapter; -- get the name of the contribution
end
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
if utilities.in_array (config.CitationClass, {"book", "citation"}) and not (utilities.is_set (A['Periodical']) or utilities.is_set (A['ScriptPeriodical'])) then -- |contributor= and |contribution= only supported in book cites
c = extract_names (args, 'ContributorList'); -- fetch contributor list from |contributorn= / |contributor-lastn=, -firstn=, -linkn=, -maskn=
if 0 < #c then
if not utilities.is_set (Contribution) then -- |contributor= requires |contribution=
utilities.set_message ('err_contributor_missing_required_param', 'contribution'); -- add missing contribution error message
c = {}; -- blank the contributors' table; it is used as a flag later
end
if 0 == #a then -- |contributor= requires |author=
utilities.set_message ('err_contributor_missing_required_param', 'author'); -- add missing author error message
c = {}; -- blank the contributors' table; it is used as a flag later
end
end
else -- if not a book cite
if utilities.select_one (args, cfg.aliases['ContributorList-Last'], 'err_redundant_parameters', 1 ) then -- are there contributor name list parameters?
utilities.set_message ('err_contributor_ignored'); -- add contributor ignored error message
end
Contribution = nil; -- unset
end
local Title = A['Title'];
local TitleLink = A['TitleLink'];
local auto_select = ''; -- default is auto
local accept_link;
TitleLink, accept_link = utilities.has_accept_as_written (TitleLink, true); -- test for accept-this-as-written markup
if (not accept_link) and utilities.in_array (TitleLink, {'none', 'pmc', 'doi'}) then -- check for special keywords
auto_select = TitleLink; -- remember selection for later
TitleLink = ''; -- treat as if |title-link= would have been empty
end
TitleLink = link_title_ok (TitleLink, A:ORIGIN ('TitleLink'), Title, 'title'); -- check for wiki-markup in |title-link= or wiki-markup in |title= when |title-link= is set
local Section = ''; -- {{cite map}} only; preset to empty string for concatenation if not used
if 'map' == config.CitationClass and 'section' == Chapter_origin then
Section = A['Chapter']; -- get |section= from |chapter= alias list; |chapter= and the other aliases not supported in {{cite map}}
Chapter = ''; -- unset for now; will be reset later from |map= if present
end
local Periodical = A['Periodical'];
local Periodical_origin = A:ORIGIN('Periodical');
local ScriptPeriodical = A['ScriptPeriodical'];
local ScriptPeriodical_origin = A:ORIGIN('ScriptPeriodical');
local TransPeriodical = A['TransPeriodical'];
local TransPeriodical_origin = A:ORIGIN ('TransPeriodical');
local Encyclopedia = A['Encyclopedia']; -- used as a flag by this module and by ~/COinS
local ScriptEncyclopedia = A['ScriptEncyclopedia'];
local TransEncyclopedia = A['TransEncyclopedia'];
if (utilities.in_array (config.CitationClass, {'book', 'encyclopaedia'}) or ('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))))
and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical) or utilities.is_set (TransPeriodical)) then
local param;
if utilities.is_set (Periodical) then -- get a parameter name from one of these periodical related meta-parameters
Periodical = ''; -- unset because not valid {{cite book}} or {{cite encyclopedia}} parameters
param = Periodical_origin -- get parameter name for error messaging
elseif utilities.is_set (TransPeriodical) then
TransPeriodical = ''; -- unset because not valid {{cite book}} or {{cite encyclopedia}} parameters
param = TransPeriodical_origin; -- get parameter name for error messaging
elseif utilities.is_set (ScriptPeriodical) then
ScriptPeriodical = ''; -- unset because not valid {{cite book}} or {{cite encyclopedia}} parameters
param = ScriptPeriodical_origin; -- get parameter name for error messaging
end
if utilities.is_set (param) then -- if we found one
utilities.set_message ('err_periodical_ignored', {param}); -- emit an error message
end
end
if utilities.is_set (Periodical) then
local i;
Periodical, i = utilities.strip_apostrophe_markup (Periodical); -- strip apostrophe markup so that metadata isn't contaminated
if i then -- non-zero when markup was stripped so emit an error message
utilities.set_message ('err_apostrophe_markup', {Periodical_origin});
end
end
if 'mailinglist' == config.CitationClass then -- special case for {{cite mailing list}}
if utilities.is_set (A ['MailingList']) then
if utilities.is_set (Periodical) then -- both set emit an error TODO: make a function for this and similar?
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', Periodical_origin) .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'mailinglist')});
end
Periodical = A ['MailingList']; -- error or no, set Periodical to |mailinglist= value because this template is {{cite mailing list}}
Periodical_origin = A:ORIGIN('MailingList');
end
end
-- web and news not tested for now because of
-- Wikipedia:Administrators%27_noticeboard#Is_there_a_semi-automated_tool_that_could_fix_these_annoying_"Cite_Web"_errors?
if not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) then -- 'periodical' templates require periodical parameter
-- local p = {['journal'] = 'journal', ['magazine'] = 'magazine', ['news'] = 'newspaper', ['web'] = 'website'}; -- for error message
local p = {['journal'] = 'journal', ['magazine'] = 'magazine'}; -- for error message
if p[config.CitationClass] then
utilities.set_message ('err_missing_periodical', {config.CitationClass, p[config.CitationClass]});
end
end
local Volume;
if 'citation' == config.CitationClass then
if utilities.is_set (Periodical) then
if not utilities.in_array (Periodical_origin, cfg.citation_no_volume_t) then -- {{citation}} does not render |volume= when these parameters are used
Volume = A['Volume']; -- but does for all other 'periodicals'
end
elseif utilities.is_set (ScriptPeriodical) then
if 'script-website' ~= ScriptPeriodical_origin then -- {{citation}} does not render volume for |script-website=
Volume = A['Volume']; -- but does for all other 'periodicals'
end
else
Volume = A['Volume']; -- and does for non-'periodical' cites
end
elseif utilities.in_array (config.CitationClass, cfg.templates_using_volume) then -- render |volume= for cs1 according to the configuration settings
Volume = A['Volume'];
end
extra_text_in_vol_iss_check (Volume, A:ORIGIN ('Volume'), 'v');
local Issue;
if 'citation' == config.CitationClass then
if utilities.is_set (Periodical) and utilities.in_array (Periodical_origin, cfg.citation_issue_t) then -- {{citation}} may render |issue= when these parameters are used
Issue = A['Issue'];
elseif utilities.is_set (ScriptPeriodical) and utilities.in_array (ScriptPeriodical_origin, cfg.citation_issue_t) then
Issue = A['Issue'];
end
elseif utilities.in_array (config.CitationClass, cfg.templates_using_issue) then -- conference & map books do not support issue; {{citation}} listed here because included in settings table
if not (utilities.in_array (config.CitationClass, {'conference', 'map', 'citation'}) and not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical))) then
Issue = A['Issue'];
end
end
local ArticleNumber;
if utilities.in_array (config.CitationClass, {'journal', 'conference'})
or ('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and ('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin)) then
ArticleNumber = A['ArticleNumber'];
else
local param_orig = A:ORIGIN ('ArticleNumber');
if utilities.is_set (param_orig) then -- when |article-number= set
utilities.set_message ('err_parameter_ignored', {param_orig}); -- emit an ignored parameter error message
end
end
extra_text_in_vol_iss_check (Issue, A:ORIGIN ('Issue'), 'i');
Issue = utilities.hyphen_to_dash (Issue);
local Page;
local Pages;
local At;
local QuotePage;
local QuotePages;
if not utilities.in_array (config.CitationClass, cfg.templates_not_using_page) then
Page = A['Page'];
Pages = utilities.hyphen_to_dash (A['Pages']);
At = A['At'];
QuotePage = A['QuotePage'];
QuotePages = utilities.hyphen_to_dash (A['QuotePages']);
else
local param_orig = first_set ({A:ORIGIN ('Page'), A:ORIGIN ('Pages'), A:ORIGIN ('At'), A:ORIGIN ('QuotePage'), A:ORIGIN ('QuotePages')}, 5);
if param_orig then -- when any of the in-source locator params are set
utilities.set_message ('err_parameter_ignored', {param_orig}); -- emit an ignored parameter error message
end
end
local NoPP = is_valid_parameter_value (A['NoPP'], A:ORIGIN('NoPP'), cfg.keywords_lists['yes_true_y'], nil);
local Mode = mode_set (A['Mode'], A:ORIGIN('Mode'));
-- separator character and postscript
local sepc, PostScript = set_style (Mode:lower(), A['PostScript'], config.CitationClass);
local Quote;
Quote, QuotePage, QuotePages, PostScript = quote_make (A['Quote'], A['TransQuote'], A['ScriptQuote'], QuotePage, QuotePages, NoPP, sepc, PostScript);
local Edition = A['Edition'];
local PublicationPlace = place_check (A['PublicationPlace'], A:ORIGIN('PublicationPlace'));
local PublisherName = A['PublisherName'];
local PublisherName_origin = A:ORIGIN('PublisherName');
if utilities.is_set (PublisherName) and (cfg.keywords_xlate['none'] ~= PublisherName) then
local i;
PublisherName, i = utilities.strip_apostrophe_markup (PublisherName); -- strip apostrophe markup so that metadata isn't contaminated; publisher is never italicized
if i and (0 < i) then -- non-zero when markup was stripped so emit an error message
utilities.set_message ('err_apostrophe_markup', {PublisherName_origin});
end
end
if ('document' == config.CitationClass) and not utilities.is_set (PublisherName) then
utilities.set_message ('err_missing_publisher', {config.CitationClass, 'publisher'});
end
local Newsgroup = A['Newsgroup']; -- TODO: strip apostrophe markup?
local Newsgroup_origin = A:ORIGIN('Newsgroup');
if 'newsgroup' == config.CitationClass then
if utilities.is_set (PublisherName) and (cfg.keywords_xlate['none'] ~= PublisherName) then -- general use parameter |publisher= not allowed in cite newsgroup
utilities.set_message ('err_parameter_ignored', {PublisherName_origin});
end
PublisherName = nil; -- ensure that this parameter is unset for the time being; will be used again after COinS
end
if 'book' == config.CitationClass or 'encyclopaedia' == config.CitationClass or ('citation' == config.CitationClass and not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical))) then
local accept;
PublisherName, accept = utilities.has_accept_as_written (PublisherName); -- check for and remove accept-as-written markup from |publisher= wrapped
if not accept then -- when no accept-as-written markup
check_publisher_name (PublisherName); -- emit maint message when |publisher= might be prefixed with publisher's location
end
end
local URL = A['URL']; -- TODO: better way to do this for URL, ChapterURL, and MapURL?
local UrlAccess = is_valid_parameter_value (A['UrlAccess'], A:ORIGIN('UrlAccess'), cfg.keywords_lists['url-access'], nil);
if not utilities.is_set (URL) and utilities.is_set (UrlAccess) then
UrlAccess = nil;
utilities.set_message ('err_param_access_requires_param', 'url');
end
local ChapterURL = A['ChapterURL'];
local ChapterUrlAccess = is_valid_parameter_value (A['ChapterUrlAccess'], A:ORIGIN('ChapterUrlAccess'), cfg.keywords_lists['url-access'], nil);
if not utilities.is_set (ChapterURL) and utilities.is_set (ChapterUrlAccess) then
ChapterUrlAccess = nil;
utilities.set_message ('err_param_access_requires_param', {A:ORIGIN('ChapterUrlAccess'):gsub ('%-access', '')});
end
local MapUrlAccess = is_valid_parameter_value (A['MapUrlAccess'], A:ORIGIN('MapUrlAccess'), cfg.keywords_lists['url-access'], nil);
if not utilities.is_set (A['MapURL']) and utilities.is_set (MapUrlAccess) then
MapUrlAccess = nil;
utilities.set_message ('err_param_access_requires_param', {'map-url'});
end
local this_page = mw.title.getCurrentTitle(); -- also used for COinS and for language
local no_tracking_cats = is_valid_parameter_value (A['NoTracking'], A:ORIGIN('NoTracking'), cfg.keywords_lists['yes_true_y'], nil);
-- check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories
if not utilities.is_set (no_tracking_cats) then -- ignore if we are already not going to categorize this page
if cfg.uncategorized_namespaces[this_page.namespace] then -- is this page's namespace id one of the uncategorized namespace ids?
no_tracking_cats = "true"; -- set no_tracking_cats
end
for _, v in ipairs (cfg.uncategorized_subpages) do -- cycle through page name patterns
if this_page.text:match (v) then -- test page name against each pattern
no_tracking_cats = "true"; -- set no_tracking_cats
break; -- bail out if one is found
end
end
end
-- check for extra |page=, |pages= or |at= parameters. (also sheet and sheets while we're at it)
utilities.select_one (args, {'page', 'p', 'pp', 'pages', 'at', 'sheet', 'sheets'}, 'err_redundant_parameters'); -- this is a dummy call simply to get the error message and category
local coins_pages;
Page, Pages, At, coins_pages = insource_loc_get (Page, A:ORIGIN('Page'), Pages, A:ORIGIN('Pages'), At);
local URL_origin = A:ORIGIN('URL'); -- get name of parameter that holds URL
local ChapterURL_origin = A:ORIGIN('ChapterURL'); -- get name of parameter that holds ChapterURL
local Format = A['Format'];
local ChapterFormat = A['ChapterFormat'];
local TransChapter = A['TransChapter'];
local TransChapter_origin = A:ORIGIN ('TransChapter');
local TransTitle = A['TransTitle'];
local ScriptTitle = A['ScriptTitle'];
if utilities.in_array (config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn', -- if any of the 'periodical' cites except encyclopedia
'map', 'episode'}) or ('conference' == config.CitationClass and utilities.is_set (A['BookTitle'])) or -- {{cite map}} allows |section= but it is alias of |sections= ; {{cite episode}} uses |title= as chapter
('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and not (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
local chap_param;
if utilities.is_set (Chapter) then -- get a parameter name from one of these chapter related meta-parameters
chap_param = A:ORIGIN ('Chapter')
elseif utilities.is_set (TransChapter) then
chap_param = A:ORIGIN ('TransChapter')
elseif utilities.is_set (ChapterURL) then
chap_param = A:ORIGIN ('ChapterURL')
elseif utilities.is_set (ScriptChapter) then
chap_param = ScriptChapter_origin;
else utilities.is_set (ChapterFormat)
chap_param = A:ORIGIN ('ChapterFormat')
end
if utilities.is_set (chap_param) then -- if we found one
utilities.set_message ('err_chapter_ignored', {chap_param}); -- add error message
Chapter = ''; -- and set them to empty string to be safe with concatenation
TransChapter = ''; -- for now, ignore linter warnings
ChapterURL = '';
ScriptChapter = '';
ChapterFormat = '';
end
end
--[[
Parameter remapping for cite encyclopedia:
When the citation has these parameters:
|encyclopedia= and |title= then map |title= to |article= and |encyclopedia= to |title= for rendering
|encyclopedia= and |article= then map |encyclopedia= to |title= for rendering
|trans-title= maps to |trans-chapter= when |title= is re-mapped
|url= maps to |chapter-url= when |title= is remapped
All other combinations of |encyclopedia=, |title=, and |article= are not modified
]]
if utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia) then -- emit error message when Encyclopedia set but template is other than {{cite encyclopedia}} or {{citation}}
if 'encyclopaedia' ~= config.CitationClass and 'citation' ~= config.CitationClass then
if utilities.is_set (Encyclopedia) then
utilities.set_message ('err_parameter_ignored', {A:ORIGIN ('Encyclopedia')});
else
utilities.set_message ('err_parameter_ignored', {A:ORIGIN ('ScriptEncyclopedia')});
end
Encyclopedia = nil; -- unset these because not supported by this template
ScriptEncyclopedia = nil;
TransEncyclopedia = nil;
end
elseif utilities.is_set (TransEncyclopedia) then
utilities.set_message ('err_trans_missing_title', {'encyclopedia'});
end
if ('encyclopaedia' == config.CitationClass) or ('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
if utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia) then
Periodical = Encyclopedia; -- error or no, set Periodical to Encyclopedia for rendering; {{citation}} could (not legitimately) have both; use Encyclopedia
Periodical_origin = A:ORIGIN ('Encyclopedia');
ScriptPeriodical = ScriptEncyclopedia;
ScriptPeriodical_origin = A:ORIGIN ('ScriptEncyclopedia');
if utilities.is_set (Title) or utilities.is_set (ScriptTitle) then
if not (utilities.is_set (Chapter) or utilities.is_set (ScriptChapter)) then
Chapter = Title; -- |encyclopedia= and |title= are set so map |title= params to |article= params for rendering
ScriptChapter = ScriptTitle;
ScriptChapter_origin = A:ORIGIN('ScriptTitle')
TransChapter = TransTitle;
ChapterURL = URL;
ChapterURL_origin = URL_origin;
ChapterUrlAccess = UrlAccess;
ChapterFormat = Format;
if utilities.is_set (TitleLink) then
if utilities.is_set (ChapterURL) then
utilities.set_message ('err_wikilink_in_url');
else
Chapter = utilities.make_wikilink (TitleLink, Chapter);
end
end
Title = Periodical; -- now map |encyclopedia= params to |title= params for rendering
ScriptTitle = ScriptPeriodical or '';
TransTitle = TransEncyclopedia or '';
Periodical = ''; -- redundant so unset
ScriptPeriodical = '';
URL = '';
Format = '';
TitleLink = '';
end
elseif utilities.is_set (Chapter) or utilities.is_set (ScriptChapter) then -- |title= not set
Title = Periodical; -- |encyclopedia= set and |article= set so map |encyclopedia= to |title= for rendering
ScriptTitle = ScriptPeriodical or '';
TransTitle = TransEncyclopedia or '';
Periodical = ''; -- redundant so unset
ScriptPeriodical = '';
end
end
end
-- special case for cite techreport.
local ID = A['ID'];
if (config.CitationClass == "techreport") then -- special case for cite techreport
if utilities.is_set (A['Number']) then -- cite techreport uses 'number', which other citations alias to 'issue'
if not utilities.is_set (ID) then -- can we use ID for the "number"?
ID = A['Number']; -- yes, use it
else -- ID has a value so emit error message
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'id') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'number')});
end
end
end
-- Account for the oddity that is {{cite conference}}, before generation of COinS data.
local ChapterLink -- = A['ChapterLink']; -- deprecated as a parameter but still used internally by cite episode
local Conference = A['Conference'];
local BookTitle = A['BookTitle'];
local TransTitle_origin = A:ORIGIN ('TransTitle');
if 'conference' == config.CitationClass then
if utilities.is_set (BookTitle) then
Chapter = Title;
Chapter_origin = 'title';
ScriptChapter = ScriptTitle;
ScriptChapter_origin = A:ORIGIN('ScriptTitle');
-- ChapterLink = TitleLink; -- |chapter-link= is deprecated
ChapterURL = URL;
ChapterUrlAccess = UrlAccess;
ChapterURL_origin = URL_origin;
URL_origin = '';
ChapterFormat = Format;
TransChapter = TransTitle;
TransChapter_origin = TransTitle_origin;
Title = BookTitle;
ScriptTitle = '';
Format = '';
-- TitleLink = '';
TransTitle = '';
URL = '';
end
elseif 'speech' ~= config.CitationClass then
Conference = ''; -- not cite conference or cite speech so make sure this is empty string
end
local cs2_lower = function (text) -- if mode is cs2, use lower case
if (sepc ~= '.') then
return text:lower();
end
return text;
end
local use_lowercase = ( sepc == ',' ); -- controls capitalization of certain static text
-- cite map oddities
local Cartography = "";
local Scale = "";
local Sheet = A['Sheet'] or '';
local Sheets = A['Sheets'] or '';
if config.CitationClass == "map" then
Chapter = A['Map'];
Chapter_origin = A:ORIGIN('Map'); -- for now, ignore linter warning
ChapterURL = A['MapURL'];
ChapterURL_origin = A:ORIGIN('MapURL');
TransChapter = A['TransMap'];
ScriptChapter = A['ScriptMap']
ScriptChapter_origin = A:ORIGIN('ScriptMap')
ChapterUrlAccess = MapUrlAccess;
ChapterFormat = A['MapFormat'];
Cartography = A['Cartography'];
if utilities.is_set ( Cartography ) then
Cartography = sepc .. " " .. wrap_msg ('cartography', Cartography, use_lowercase);
end
Scale = A['Scale'];
if utilities.is_set ( Scale ) then
Scale = sepc .. " " .. Scale;
end
end
-- Account for the oddities that are {{cite episode}} and {{cite serial}}, before generation of COinS data.
local Series = A['Series'];
if 'episode' == config.CitationClass or 'serial' == config.CitationClass then
local SeriesLink = A['SeriesLink'];
SeriesLink = link_title_ok (SeriesLink, A:ORIGIN ('SeriesLink'), Series, 'series'); -- check for wiki-markup in |series-link= or wiki-markup in |series= when |series-link= is set
local Network = A['Network'];
local Station = A['Station'];
local s, n = {}, {};
-- do common parameters first
if utilities.is_set (Network) then table.insert(n, Network); end
if utilities.is_set (Station) then table.insert(n, Station); end
ID = table.concat(n, sepc .. ' ');
if 'episode' == config.CitationClass then -- handle the oddities that are strictly {{cite episode}}
local Season = A['Season'];
local SeriesNumber = A['SeriesNumber'];
if utilities.is_set (Season) and utilities.is_set (SeriesNumber) then -- these are mutually exclusive so if both are set TODO: make a function for this and similar?
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'season') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'seriesno')}); -- add error message
SeriesNumber = ''; -- unset; prefer |season= over |seriesno=
end
-- assemble a table of parts concatenated later into Series
if utilities.is_set (Season) then table.insert(s, wrap_msg ('season', Season, use_lowercase)); end
if utilities.is_set (SeriesNumber) then table.insert(s, wrap_msg ('seriesnum', SeriesNumber, use_lowercase)); end
if utilities.is_set (Issue) then table.insert(s, wrap_msg ('episode', Issue, use_lowercase)); end
Issue = ''; -- unset because this is not a unique parameter
Chapter = Title; -- promote title parameters to chapter
ScriptChapter = ScriptTitle;
ScriptChapter_origin = A:ORIGIN('ScriptTitle');
ChapterLink = TitleLink; -- alias |episode-link=
TransChapter = TransTitle;
ChapterURL = URL;
ChapterUrlAccess = UrlAccess;
ChapterURL_origin = URL_origin;
ChapterFormat = Format;
Title = Series; -- promote series to title
TitleLink = SeriesLink;
Series = table.concat(s, sepc .. ' '); -- this is concatenation of season, seriesno, episode number
if utilities.is_set (ChapterLink) then
if not utilities.is_set (ChapterURL) then -- link but not URL
Chapter = utilities.make_wikilink (ChapterLink, Chapter);
elseif utilities.is_set (Series) then -- if both are set, URL links episode;
Series = utilities.make_wikilink (ChapterLink, Series);
else
utilities.set_message ('err_wikilink_in_url');
end
end
URL = ''; -- unset
TransTitle = '';
ScriptTitle = '';
Format = '';
else -- now oddities that are cite serial
Issue = ''; -- unset because this parameter no longer supported by the citation/core version of cite serial
Chapter = A['Episode']; -- TODO: make |episode= available to cite episode someday?
if utilities.is_set (Series) and utilities.is_set (SeriesLink) then
Series = utilities.make_wikilink (SeriesLink, Series);
end
Series = utilities.wrap_style ('italic-title', Series); -- series is italicized
end
end
-- end of {{cite episode}} stuff
-- handle type parameter for those CS1 citations that have default values
local TitleType = A['TitleType'];
local Degree = A['Degree'];
if utilities.in_array (config.CitationClass, {'AV-media-notes', 'document', 'interview', 'mailinglist', 'map', 'podcast', 'pressrelease', 'report', 'speech', 'techreport', 'thesis'}) then
TitleType = set_titletype (config.CitationClass, TitleType);
if utilities.is_set (Degree) and "Thesis" == TitleType then -- special case for cite thesis
TitleType = Degree .. ' ' .. cfg.title_types ['thesis']:lower();
end
end
if utilities.is_set (TitleType) then -- if type parameter is specified
TitleType = utilities.substitute ( cfg.messages['type'], TitleType); -- display it in parentheses
-- TODO: Hack on TitleType to fix bunched parentheses problem
end
local Date = A['Date'];
local Date_origin; -- to hold the name of parameter promoted to Date; required for date error messaging
local Year = A['Year'];
if utilities.is_set (Year) then
validation.year_check (Year); -- returns nothing; emits maint message when |year= doesn't hold a 'year' value
end
if not utilities.is_set (Date) then
Date = Year; -- promote Year to Date
Year = nil; -- make nil so Year as empty string isn't used for CITEREF
Date_origin = A:ORIGIN('Year'); -- save the name of the promoted parameter
else
Date_origin = A:ORIGIN('Date'); -- not a promotion; name required for error messaging
end
--[[
Go test all of the date-holding parameters for valid MOS:DATE format and make sure that dates are real dates. This must be done before we do COinS because here is where
we get the date used in the metadata.
Date validation supporting code is in Module:Citation/CS1/Date_validation
]]
local DF = is_valid_parameter_value (A['DF'], A:ORIGIN('DF'), cfg.keywords_lists['df'], '');
if not utilities.is_set (DF) then
DF = cfg.global_df; -- local |df= if present overrides global df set by {{use xxx date}} template
end
local ArchiveURL;
local ArchiveDate;
local ArchiveFormat = A['ArchiveFormat'];
local archive_url_timestamp; -- timestamp from wayback machine url
ArchiveURL, ArchiveDate, archive_url_timestamp = archive_url_check (A['ArchiveURL'], A['ArchiveDate'])
ArchiveFormat = style_format (ArchiveFormat, ArchiveURL, 'archive-format', 'archive-url');
ArchiveURL, ArchiveDate = is_unique_archive_url (ArchiveURL, URL, ChapterURL, A:ORIGIN('ArchiveURL'), ArchiveDate); -- add error message when URL or ChapterURL == ArchiveURL
local AccessDate = A['AccessDate'];
local COinS_date = {}; -- holds date info extracted from |date= for the COinS metadata by Module:Date verification
local DoiBroken = A['DoiBroken'];
local Embargo = A['Embargo'];
local anchor_year; -- used in the CITEREF identifier
do -- create defined block to contain local variables date_parameters_list, mismatch
local date_parameters_list = { -- AirDate has been promoted to Date so not necessary to check it
['access-date'] = {val = AccessDate, name = A:ORIGIN ('AccessDate')},
['archive-date'] = {val = ArchiveDate, name = A:ORIGIN ('ArchiveDate')},
['date'] = {val = Date, name = Date_origin},
['doi-broken-date'] = {val = DoiBroken, name = A:ORIGIN ('DoiBroken')},
['pmc-embargo-date'] = {val = Embargo, name = A:ORIGIN ('Embargo')},
['year'] = {val = Year, name = A:ORIGIN ('Year')},
};
local error_list = {};
anchor_year, Embargo = validation.dates(date_parameters_list, COinS_date, error_list);
if utilities.is_set (Year) and utilities.is_set (Date) then -- both |date= and |year= not normally needed;
validation.year_date_check (Year, A:ORIGIN ('Year'), Date, A:ORIGIN ('Date'), error_list);
end
if 0 == #error_list then -- error free dates only; 0 when error_list is empty
local modified = false; -- flag
if utilities.is_set (DF) then -- if we need to reformat dates
modified = validation.reformat_dates (date_parameters_list, DF); -- reformat to DF format, use long month names if appropriate
end
if true == validation.date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate
modified = true;
utilities.set_message ('maint_date_format'); -- hyphens were converted so add maint category
end
-- for those wikis that can and want to have English date names translated to the local language; not supported at en.wiki
if cfg.date_name_auto_xlate_enable and validation.date_name_xlate (date_parameters_list, cfg.date_digit_auto_xlate_enable ) then
utilities.set_message ('maint_date_auto_xlated'); -- add maint cat
modified = true;
end
if modified then -- if the date_parameters_list values were modified
AccessDate = date_parameters_list['access-date'].val; -- overwrite date holding parameters with modified values
ArchiveDate = date_parameters_list['archive-date'].val;
Date = date_parameters_list['date'].val;
DoiBroken = date_parameters_list['doi-broken-date'].val;
end
if archive_url_timestamp and utilities.is_set (ArchiveDate) then
validation.archive_date_check (ArchiveDate, archive_url_timestamp, DF); -- does YYYYMMDD in archive_url_timestamp match date in ArchiveDate
end
else
utilities.set_message ('err_bad_date', {utilities.make_sep_list (#error_list, error_list)}); -- add this error message
end
end -- end of do
if utilities.in_array (config.CitationClass, {'book', 'encyclopaedia'}) or -- {{cite book}}, {{cite encyclopedia}}; TODO: {{cite conference}} and others?
('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) or -- {{citation}} as an encylopedia citation
('citation' == config.CitationClass and not (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical))) then -- {{citation}} as a book citation
if utilities.is_set (PublicationPlace) then
if not utilities.is_set (PublisherName) then
local date = COinS_date.rftdate and tonumber (COinS_date.rftdate:match ('%d%d%d%d')); -- get year portion of COinS date (because in Arabic numerals); convert string to number
if date and (1850 <= date) then -- location has no publisher; if date is 1850 or later
utilities.set_message ('maint_location_no_publisher'); -- add maint cat
end
else -- PublisherName has a value
if cfg.keywords_xlate['none'] == PublisherName then -- if that value is 'none' (only for book and encyclopedia citations)
PublisherName = ''; -- unset
end
end
end
end
local ID_list_t; -- sequence table of rendered identifiers
local ID_list_coins_t; -- table of identifiers and their values from args; key is same as cfg.id_handlers's key
local Class = A['Class']; -- arxiv class identifier
local ID_support = {
{A['ASINTLD'], 'ASIN', 'err_asintld_missing_asin', A:ORIGIN ('ASINTLD')},
{DoiBroken, 'DOI', 'err_doibroken_missing_doi', A:ORIGIN ('DoiBroken')},
{Embargo, 'PMC', 'err_embargo_missing_pmc', A:ORIGIN ('Embargo')},
}
ID_list_t, ID_list_coins_t = identifiers.identifier_lists_get (args, {
DoiBroken = DoiBroken, -- for |doi=
ASINTLD = A['ASINTLD'], -- for |asin=
Embargo = Embargo, -- for |pmc=
Class = Class, -- for |arxiv=
CitationClass = config.CitationClass, -- for |arxiv=
Year=anchor_year, -- for |isbn=
}, ID_support);
for _, id in ipairs (ID_list_t) do -- search through the ID_list_t sequence looking for an ISBN identifier string
if id:find ('ISBN', 3, true) then -- plain find, start at index 3 ([[ISBN)
if 'citation' == config.CitationClass then -- catch ve/citoid malformed book cites in {{citation}} templates
if utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical) then -- when a |work= alias is set
utilities.set_message ('maint_work_isbn'); -- add maint cat
break; -- and abandon
end
elseif ({['journal'] = true, ['magazine'] = true, ['news'] = true, ['web'] = true})[config.CitationClass] then
utilities.set_message ('maint_periodical_has_isbn'); -- add maint cat
break; -- and abandon
end
end
end
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite medrxiv}}, {{cite ssrn}}, before generation of COinS data.
if utilities.in_array (config.CitationClass, whitelist.preprint_template_list_t) then -- |arxiv= or |eprint= required for cite arxiv; |biorxiv=, |citeseerx=, |medrxiv=, |ssrn= required for their templates
if not (args[cfg.id_handlers[config.CitationClass:upper()].parameters[1]] or -- can't use ID_list_coins_t k/v table here because invalid parameters omitted
args[cfg.id_handlers[config.CitationClass:upper()].parameters[2]]) then -- which causes unexpected parameter missing error message
utilities.set_message ('err_' .. config.CitationClass .. '_missing'); -- add error message
end
Periodical = ({['arxiv'] = 'arXiv', ['biorxiv'] = 'bioRxiv', ['citeseerx'] = 'CiteSeerX', ['medrxiv'] = 'medRxiv', ['ssrn'] = 'Social Science Research Network'})[config.CitationClass];
end
-- Link the title of the work if no |url= was provided, but we have a |pmc= or a |doi= with |doi-access=free
if config.CitationClass == "journal" and not utilities.is_set (URL) and not utilities.is_set (TitleLink) and not utilities.in_array (cfg.keywords_xlate[Title], {'off', 'none'}) then -- TODO: remove 'none' once existing citations have been switched to 'off', so 'none' can be used as token for "no title" instead
if 'none' ~= cfg.keywords_xlate[auto_select] then -- if auto-linking not disabled
if identifiers.auto_link_urls[auto_select] then -- manual selection
URL = identifiers.auto_link_urls[auto_select]; -- set URL to be the same as identifier's external link
URL_origin = cfg.id_handlers[auto_select:upper()].parameters[1]; -- set URL_origin to parameter name for use in error message if citation is missing a |title=
elseif identifiers.auto_link_urls['pmc'] then -- auto-select PMC
URL = identifiers.auto_link_urls['pmc']; -- set URL to be the same as the PMC external link if not embargoed
URL_origin = cfg.id_handlers['PMC'].parameters[1]; -- set URL_origin to parameter name for use in error message if citation is missing a |title=
elseif identifiers.auto_link_urls['doi'] then -- auto-select DOI
URL = identifiers.auto_link_urls['doi'];
URL_origin = cfg.id_handlers['DOI'].parameters[1];
end
end
if utilities.is_set (URL) then -- set when using an identifier-created URL
if utilities.is_set (AccessDate) then -- |access-date= requires |url=; identifier-created URL is not |url=
utilities.set_message ('err_accessdate_missing_url'); -- add an error message
AccessDate = ''; -- unset
end
if utilities.is_set (ArchiveURL) then -- |archive-url= requires |url=; identifier-created URL is not |url=
utilities.set_message ('err_archive_missing_url'); -- add an error message
ArchiveURL = ''; -- unset
end
end
end
-- At this point fields may be nil if they weren't specified in the template use. We can use that fact.
-- Test if citation has no title
if not utilities.is_set (Title) and not utilities.is_set (TransTitle) and not utilities.is_set (ScriptTitle) then -- has special case for cite episode
utilities.set_message ('err_citation_missing_title', {'episode' == config.CitationClass and 'series' or 'title'});
end
if utilities.in_array (cfg.keywords_xlate[Title], {'off', 'none'}) and
utilities.in_array (config.CitationClass, {'journal', 'citation'}) and
(utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and
('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin) then -- special case for journal cites
Title = ''; -- set title to empty string
utilities.set_message ('maint_untitled'); -- add maint cat
end
if 'journal' == config.CitationClass
or ('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and ('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin)) then
if is_page_art_num (((utilities.is_set (Page) and Page) or (utilities.is_set (Pages) and Pages)) or nil, ID_list_coins_t['DOI']) then -- does |page(s)= look like it holds an article number
utilities.set_message ('maint_page_art_num'); -- add maint cat
end
end
-- COinS metadata (see <http://ocoins.info/>) for automated parsing of citation information.
-- handle the oddity that is cite encyclopedia and {{citation |encyclopedia=something}}. Here we presume that
-- when Periodical, Title, and Chapter are all set, then Periodical is the book (encyclopedia) title, Title
-- is the article title, and Chapter is a section within the article. So, we remap
local coins_chapter = Chapter; -- default assuming that remapping not required
local coins_title = Title; -- et tu
if 'encyclopaedia' == config.CitationClass or ('citation' == config.CitationClass and (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
if utilities.is_set (Chapter) and utilities.is_set (Title) and utilities.is_set (Periodical) then -- if all are used then -- should script-params be considered?
coins_chapter = Title; -- remap
coins_title = Periodical;
end
end
local coins_author = a; -- default for coins rft.au
if 0 < #c then -- but if contributor list
coins_author = c; -- use that instead
end
-- this is the function call to COinS()
local OCinSoutput = metadata.COinS({
['Periodical'] = utilities.strip_apostrophe_markup (Periodical), -- no markup in the metadata
['Encyclopedia'] = Encyclopedia, -- just a flag; content ignored by ~/COinS
['Chapter'] = metadata.make_coins_title (coins_chapter, ScriptChapter), -- Chapter and ScriptChapter stripped of bold / italic / accept-as-written markup
['Degree'] = Degree; -- cite thesis only
['Title'] = metadata.make_coins_title (coins_title, ScriptTitle), -- Title and ScriptTitle stripped of bold / italic / accept-as-written markup
['PublicationPlace'] = PublicationPlace,
['Date'] = COinS_date.rftdate, -- COinS_date.* has correctly formatted date values if Date is valid;
['Season'] = COinS_date.rftssn,
['Quarter'] = COinS_date.rftquarter,
['Chron'] = COinS_date.rftchron,
['Series'] = Series,
['Volume'] = Volume,
['Issue'] = Issue,
['ArticleNumber'] = ArticleNumber,
['Pages'] = coins_pages or metadata.get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At, QuotePage, QuotePages}, 7)), -- pages stripped of external links
['Edition'] = Edition,
['PublisherName'] = PublisherName or Newsgroup, -- any apostrophe markup already removed from PublisherName
['URL'] = first_set ({ChapterURL, URL}, 2),
['Authors'] = coins_author,
['ID_list'] = ID_list_coins_t,
['RawPage'] = this_page.prefixedText,
}, config.CitationClass);
-- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite medrxiv}}, and {{cite ssrn}} AFTER generation of COinS data.
if utilities.in_array (config.CitationClass, whitelist.preprint_template_list_t) then -- we have set rft.jtitle in COinS to arXiv, bioRxiv, CiteSeerX, medRxiv, or ssrn now unset so it isn't displayed
Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal
end
-- special case for cite newsgroup. Do this after COinS because we are modifying Publishername to include some static text
if 'newsgroup' == config.CitationClass and utilities.is_set (Newsgroup) then
PublisherName = utilities.substitute (cfg.messages['newsgroup'], external_link( 'news:' .. Newsgroup, Newsgroup, Newsgroup_origin, nil ));
end
local Editors;
local EditorCount; -- used only for choosing {ed.) or (eds.) annotation at end of editor name-list
local Contributors; -- assembled contributors name list
local contributor_etal = nil; -- must be intentionally initialized
local Translators; -- assembled translators name list
local translator_etal = nil; -- must be intentionally initialized
local t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn=
local Interviewers;
local interviewers_list = extract_names (args, 'InterviewerList'); -- process preferred interviewers parameters
local interviewer_etal = nil; -- must be intentionally initialized
-- Now perform various field substitutions.
-- We also add leading spaces and surrounding markup and punctuation to the
-- various parts of the citation, but only when they are non-nil.
do
local last_first_list;
local control = {
format = NameListStyle, -- empty string, '&', 'amp', 'and', or 'vanc'
maximum = nil, -- as if display-authors or display-editors not set
mode = Mode
};
do -- do editor name list first because the now unsupported coauthors used to modify control table
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayEditors'], A['DisplayEditors'], A:ORIGIN ('DisplayEditors'), #e);
control.maximum, editor_etal = get_display_names (display_names, #e, editor_etal, param);
Editors, EditorCount = list_people (control, e, editor_etal);
if 1 == EditorCount and (true == editor_etal or 1 < #e) then -- only one editor displayed but includes etal then
EditorCount = 2; -- spoof to display (eds.) annotation
end
end
do -- now do interviewers
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayInterviewers'], A['DisplayInterviewers'], A:ORIGIN ('DisplayInterviewers'), #interviewers_list);
control.maximum, interviewer_etal = get_display_names (display_names, #interviewers_list, interviewer_etal, param);
Interviewers = list_people (control, interviewers_list, interviewer_etal);
end
do -- now do translators
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayTranslators'], A['DisplayTranslators'], A:ORIGIN ('DisplayTranslators'), #t);
control.maximum, translator_etal = get_display_names (display_names, #t, translator_etal, param);
Translators = list_people (control, t, translator_etal);
end
do -- now do contributors
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayContributors'], A['DisplayContributors'], A:ORIGIN ('DisplayContributors'), #c);
control.maximum, contributor_etal = get_display_names (display_names, #c, contributor_etal, param);
Contributors = list_people (control, c, contributor_etal);
end
do -- now do authors
local display_names, param = display_names_select (cfg.global_cs1_config_t['DisplayAuthors'], A['DisplayAuthors'], A:ORIGIN ('DisplayAuthors'), #a, author_etal);
control.maximum, author_etal = get_display_names (display_names, #a, author_etal, param);
last_first_list = list_people (control, a, author_etal);
if utilities.is_set (Authors) then
Authors, author_etal = name_has_etal (Authors, author_etal, false, 'authors'); -- find and remove variations on et al.
if author_etal then
Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter
end
else
Authors = last_first_list; -- either an author name list or an empty string
end
end -- end of do
if utilities.is_set (Authors) and utilities.is_set (Collaboration) then
Authors = utilities.substitute (cfg.messages['collaboration'], {Authors, Collaboration}); -- add collaboration after et al.
end
end
local ConferenceFormat = A['ConferenceFormat'];
local ConferenceURL = A['ConferenceURL'];
ConferenceFormat = style_format (ConferenceFormat, ConferenceURL, 'conference-format', 'conference-url');
Format = style_format (Format, URL, 'format', 'url');
if not utilities.is_set (URL) then
if utilities.in_array (config.CitationClass, {"web", "podcast", "mailinglist"}) or -- |url= required for {{cite web}}, {{cite podcast}}, and {{cite mailing list}}
('citation' == config.CitationClass and ('website' == Periodical_origin or 'script-website' == ScriptPeriodical_origin)) then -- and required for {{citation}} with |website= or |script-website=
if not url_was_archive_today then -- is <URL> empty/missing because it was a deprecated archive.today url
utilities.set_message ('err_cite_web_url'); -- no; emit an error message for an empty/ missing |url=
end
end
-- do we have |accessdate= without either |url= or |chapter-url=?
if utilities.is_set (AccessDate) and not utilities.is_set (ChapterURL) then -- ChapterURL may be set when URL is not set;
utilities.set_message ('err_accessdate_missing_url');
AccessDate = '';
end
end
local UrlStatus = is_valid_parameter_value (A['UrlStatus'], A:ORIGIN('UrlStatus'), cfg.keywords_lists['url-status'], '');
local OriginalURL
local OriginalURL_origin
local OriginalFormat
local OriginalAccess;
UrlStatus = UrlStatus:lower(); -- used later when assembling archived text
if utilities.is_set ( ArchiveURL ) then
if utilities.is_set (ChapterURL) then -- if chapter-url= is set apply archive url to it
OriginalURL = ChapterURL; -- save copy of source chapter's url for archive text
OriginalURL_origin = ChapterURL_origin; -- name of |chapter-url= parameter for error messages
OriginalFormat = ChapterFormat; -- and original |chapter-format=
if 'live' ~= UrlStatus then
ChapterURL = ArchiveURL -- swap-in the archive's URL
ChapterURL_origin = A:ORIGIN('ArchiveURL') -- name of |archive-url= parameter for error messages
ChapterFormat = ArchiveFormat or ''; -- swap in archive's format
ChapterUrlAccess = nil; -- restricted access levels do not make sense for archived URLs
end
elseif utilities.is_set (URL) then
OriginalURL = URL; -- save copy of original source URL
OriginalURL_origin = URL_origin; -- name of URL parameter for error messages
OriginalFormat = Format; -- and original |format=
OriginalAccess = UrlAccess;
if 'live' ~= UrlStatus then -- if URL set then |archive-url= applies to it
URL = ArchiveURL -- swap-in the archive's URL
URL_origin = A:ORIGIN('ArchiveURL') -- name of archive URL parameter for error messages
Format = ArchiveFormat or ''; -- swap in archive's format
UrlAccess = nil; -- restricted access levels do not make sense for archived URLs
end
end
elseif utilities.is_set (UrlStatus) then -- if |url-status= is set when |archive-url= is not set
utilities.set_message ('maint_url_status'); -- add maint cat
end
if utilities.in_array (config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn'}) or -- if any of the 'periodical' cites except encyclopedia
('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and not (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) then
else -- otherwise, format chapter / article title
local no_quotes = false; -- default assume that we will be quoting the chapter parameter value
if utilities.is_set (Contribution) and 0 < #c then -- if this is a contribution with contributor(s)
if utilities.in_array (Contribution:lower(), cfg.keywords_lists.contribution) then -- and a generic contribution title
no_quotes = true; -- then render it unquoted
end
end
ChapterFormat = style_format (ChapterFormat, ChapterURL, 'chapter-format', 'chapter-url');
Chapter = format_chapter_title (ScriptChapter, ScriptChapter_origin, Chapter, TransChapter, TransChapter_origin, ChapterURL, ChapterURL_origin, no_quotes, ChapterUrlAccess); -- Contribution is also in Chapter
if utilities.is_set (Chapter) then
Chapter = Chapter .. ChapterFormat ;
if 'map' == config.CitationClass and utilities.is_set (TitleType) then
Chapter = Chapter .. ' ' .. TitleType; -- map annotation here; not after title
end
Chapter = Chapter .. sepc .. ' ';
elseif utilities.is_set (ChapterFormat) then -- |chapter= not set but |chapter-format= is so ...
Chapter = ChapterFormat .. sepc .. ' '; -- ... ChapterFormat has error message, we want to see it
end
end
-- Format main title
local plain_title = false;
local accept_title;
Title, accept_title = utilities.has_accept_as_written (Title, true); -- remove accept-this-as-written markup when it wraps all of <Title>
if accept_title and ('' == Title) then -- only support forced empty for now "(())"
Title = cfg.messages['notitle']; -- replace by predefined "No title" message
-- TODO: utilities.set_message ( 'err_redundant_parameters', ...); -- issue proper error message instead of muting
ScriptTitle = ''; -- just mute for now
TransTitle = ''; -- just mute for now
plain_title = true; -- suppress text decoration for descriptive title
utilities.set_message ('maint_untitled'); -- add maint cat
end
if not accept_title then -- <Title> not wrapped in accept-as-written markup
if '...' == Title:sub (-3) then -- if ellipsis is the last three characters of |title=
Title = Title:gsub ('(%.%.%.)%.+$', '%1'); -- limit the number of dots to three
elseif not mw.ustring.find (Title, '%.%s*%a%.$') and -- end of title is not a 'dot-(optional space-)letter-dot' initialism ...
not mw.ustring.find (Title, '%s+%a%.$') then -- ...and not a 'space-letter-dot' initial (''Allium canadense'' L.)
Title = mw.ustring.gsub(Title, '%' .. sepc .. '$', ''); -- remove any trailing separator character; sepc and ms.ustring() here for languages that use multibyte separator characters
end
if utilities.is_set (ArchiveURL) and is_archived_copy (Title) then
utilities.set_message ('maint_archived_copy'); -- add maintenance category before we modify the content of Title
end
if is_generic ('generic_titles', Title) then
utilities.set_message ('err_generic_title'); -- set an error message
end
end
if (not plain_title) and (utilities.in_array (config.CitationClass, {'web', 'news', 'journal', 'magazine', 'document', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn'}) or
('citation' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)) and not (utilities.is_set (Encyclopedia) or utilities.is_set (ScriptEncyclopedia))) or
('map' == config.CitationClass and (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical)))) then -- special case for cite map when the map is in a periodical treat as an article
Title = kern_quotes (Title); -- if necessary, separate title's leading and trailing quote marks from module provided quote marks
Title = utilities.wrap_style ('quoted-title', Title);
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
TransTitle = utilities.wrap_style ('trans-quoted-title', TransTitle );
elseif plain_title or ('report' == config.CitationClass) then -- no styling for cite report and descriptive titles (otherwise same as above)
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
TransTitle = utilities.wrap_style ('trans-quoted-title', TransTitle ); -- for cite report, use this form for trans-title
else
Title = utilities.wrap_style ('italic-title', Title);
Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang attribute, categorization, etc.; must be done after title is wrapped
TransTitle = utilities.wrap_style ('trans-italic-title', TransTitle);
end
if utilities.is_set (TransTitle) then
if utilities.is_set (Title) then
TransTitle = " " .. TransTitle;
else
utilities.set_message ('err_trans_missing_title', {'title'});
end
end
if utilities.is_set (Title) then -- TODO: is this the right place to be making Wikisource URLs?
if utilities.is_set (TitleLink) and utilities.is_set (URL) then
utilities.set_message ('err_wikilink_in_url'); -- set an error message because we can't have both
TitleLink = ''; -- unset
end
if not utilities.is_set (TitleLink) and utilities.is_set (URL) then
Title = external_link (URL, Title, URL_origin, UrlAccess) .. TransTitle .. Format;
URL = ''; -- unset these because no longer needed
Format = ''; -- for now, ignore linter warning
elseif utilities.is_set (TitleLink) and not utilities.is_set (URL) then
local ws_url;
ws_url = wikisource_url_make (TitleLink); -- ignore ws_label return; not used here
if ws_url then
Title = external_link (ws_url, Title .. ' ', 'ws link in title-link'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
Title = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], TitleLink, Title});
Title = Title .. TransTitle;
else
Title = utilities.make_wikilink (TitleLink, Title) .. TransTitle;
end
else
local ws_url, ws_label, L; -- Title has italic or quote markup by the time we get here which causes is_wikilink() to return 0 (not a wikilink)
ws_url, ws_label, L = wikisource_url_make (Title:gsub('^[\'"]*(.-)[\'"]*$', '%1')); -- make ws URL from |title= interwiki link (strip italic or quote markup); link portion L becomes tooltip label
if ws_url then
Title = Title:gsub ('%b[]', ws_label); -- replace interwiki link with ws_label to retain markup
Title = external_link (ws_url, Title .. ' ', 'ws link in title'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
Title = utilities.substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, Title});
Title = Title .. TransTitle;
else
Title = Title .. TransTitle;
end
end
else
Title = TransTitle;
end
local ConferenceURL_origin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL
if utilities.is_set (Conference) then
if utilities.is_set (ConferenceURL) then
Conference = external_link( ConferenceURL, Conference, ConferenceURL_origin, nil );
end
Conference = sepc .. " " .. Conference .. ConferenceFormat;
elseif utilities.is_set (ConferenceURL) then
Conference = sepc .. " " .. external_link( ConferenceURL, nil, ConferenceURL_origin, nil );
end
local Position = '';
if not utilities.is_set (Position) then
local Minutes = A['Minutes'];
local Time = A['Time'];
if utilities.is_set (Minutes) then
if utilities.is_set (Time) then --TODO: make a function for this and similar?
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'minutes') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'time')});
end
Position = utilities.substitute (cfg.messages.minutes, Minutes);
else
if utilities.is_set (Time) then
local TimeCaption = A['TimeCaption']
if not utilities.is_set (TimeCaption) then
TimeCaption = cs2_lower(cfg.messages['event']);
end
Position = " " .. TimeCaption .. " " .. Time;
end
end
else
Position = " " .. Position;
At = '';
end
Page, Pages, Sheet, Sheets = format_pages_sheets (Page, Pages, Sheet, Sheets, config.CitationClass, Periodical_origin, ScriptPeriodical_origin, sepc, NoPP, use_lowercase);
At = utilities.is_set (At) and (sepc .. " " .. At) or "";
Position = utilities.is_set (Position) and (sepc .. " " .. Position) or "";
if config.CitationClass == 'map' then
local Sections = A['Sections']; -- Section (singular) is an alias of Chapter so set earlier
local Inset = A['Inset'];
if utilities.is_set ( Inset ) then
Inset = sepc .. " " .. wrap_msg ('inset', Inset, use_lowercase);
end
if utilities.is_set ( Sections ) then
Section = sepc .. " " .. wrap_msg ('sections', Sections, use_lowercase);
if utilities.is_set ( Section ) then
utilities.set_message ('err_redundant_parameters', {utilities.wrap_style ('parameter', 'sections') .. cfg.presentation['sep_list_pair'] .. utilities.wrap_style ('parameter', 'section')});
end
elseif utilities.is_set ( Section ) then
Section = sepc .. " " .. wrap_msg ('section', Section, use_lowercase);
end
At = At .. Inset .. Section;
end
local Others = A['Others'];
if utilities.is_set (Others) and 0 == #a and 0 == #e then -- add maint cat when |others= has value and used without |author=, |editor=
if config.CitationClass == "AV-media-notes"
or config.CitationClass == "audio-visual" then -- special maint for AV/M which has a lot of 'false' positives right now
utilities.set_message ('maint_others_avm')
else
utilities.set_message ('maint_others');
end
end
Others = utilities.is_set (Others) and (sepc .. " " .. Others) or "";
if utilities.is_set (Translators) then
Others = safe_join ({sepc .. ' ', wrap_msg ('translated', Translators, use_lowercase), Others}, sepc);
end
if utilities.is_set (Interviewers) then
Others = safe_join ({sepc .. ' ', wrap_msg ('interview', Interviewers, use_lowercase), Others}, sepc);
end
local TitleNote = A['TitleNote'];
TitleNote = utilities.is_set (TitleNote) and (sepc .. " " .. TitleNote) or "";
if utilities.is_set (Edition) then
if Edition:match ('%f[%a][Ee]d%n?%.?$') or Edition:match ('%f[%a][Ee]dition$') then -- Ed, ed, Ed., ed., Edn, edn, Edn., edn.
utilities.set_message ('err_extra_text_edition'); -- add error message
end
Edition = " " .. wrap_msg ('edition', Edition);
else
Edition = '';
end
Series = utilities.is_set (Series) and wrap_msg ('series', {sepc, Series}) or ""; -- not the same as SeriesNum
local Agency = A['Agency'] or ''; -- |agency= is supported by {{cite magazine}}, {{cite news}}, {{cite press release}}, {{cite web}}, and certain {{citation}} templates
if utilities.is_set (Agency) then -- this testing done here because {{citation}} supports 'news' citations
if utilities.in_array (config.CitationClass, {'magazine', 'news', 'pressrelease', 'web'})
or ('citation' == config.CitationClass and (utilities.in_array (Periodical_origin, {"magazine", "newspaper", "work"}) or utilities.in_array (ScriptPeriodical_origin, {"script-magazine", "script-newspaper", "script-work"}))) then
Agency = wrap_msg ('agency', {sepc, Agency}); -- format for rendering
else
Agency = ''; -- unset; not supported
utilities.set_message ('err_parameter_ignored', {'agency'}); -- add error message
end
end
Volume = format_volume_issue (Volume, Issue, ArticleNumber, config.CitationClass, Periodical_origin, ScriptPeriodical_origin, sepc, use_lowercase);
if utilities.is_set (AccessDate) then
local retrv_text = " " .. cfg.messages['retrieved'];
AccessDate = nowrap_date (AccessDate); -- wrap in nowrap span if date in appropriate format
retrv_text = cs2_lower(retrv_text); -- if mode is cs2, lower case
AccessDate = utilities.substitute (retrv_text, AccessDate); -- add retrieved text
AccessDate = utilities.substitute (cfg.presentation['accessdate'], {sepc, AccessDate}); -- allow editors to hide accessdates
end
if utilities.is_set (ID) then ID = sepc .. " " .. ID; end
local Docket = A['Docket'];
if "thesis" == config.CitationClass and utilities.is_set (Docket) then
ID = sepc .. " Docket " .. Docket .. ID;
end
if "report" == config.CitationClass and utilities.is_set (Docket) then -- for cite report when |docket= is set
ID = sepc .. ' ' .. Docket; -- overwrite ID even if |id= is set
end
if utilities.is_set (URL) then
URL = " " .. external_link( URL, nil, URL_origin, UrlAccess );
end
-- We check length of PostScript here because it will have been nuked by
-- the quote parameters. We'd otherwise emit a message even if there wasn't
-- a displayed postscript.
-- TODO: Should the max size (1) be configurable?
-- TODO: Should we check a specific pattern?
if utilities.is_set(PostScript) and mw.ustring.len(PostScript) > 1 then
utilities.set_message ('maint_postscript')
end
local Archived;
if utilities.is_set (ArchiveURL) then
if not utilities.is_set (ArchiveDate) then -- ArchiveURL set but ArchiveDate not set
utilities.set_message ('err_archive_missing_date'); -- emit an error message
ArchiveURL = ''; -- empty string for concatenation
ArchiveDate = ''; -- empty string for concatenation
end
else
if utilities.is_set (ArchiveDate) then -- ArchiveURL not set but ArchiveDate is set
utilities.set_message ('err_archive_date_missing_url'); -- emit an error message
ArchiveURL = ''; -- empty string for concatenation
ArchiveDate = ''; -- empty string for concatenation
end
end
if utilities.is_set (ArchiveURL) then
if "live" == UrlStatus then
if utilities.is_set (ArchiveDate) then
Archived = sepc .. ' ' .. utilities.substitute ( cfg.messages['archived-live'],
{ external_link( ArchiveURL, cs2_lower(cfg.messages['archived']), A:ORIGIN('ArchiveURL'), nil) .. ArchiveFormat, ArchiveDate } );
else
Archived = '';
end
if not utilities.is_set (OriginalURL) then
utilities.set_message ('err_archive_missing_url');
Archived = ''; -- empty string for concatenation
end
elseif utilities.is_set (OriginalURL) then -- UrlStatus is empty, 'dead', 'unfit', 'usurped', 'bot: unknown'
if utilities.in_array (UrlStatus, {'unfit', 'usurped', 'bot: unknown'}) then
Archived = sepc .. ' ' .. utilities.substitute ( cs2_lower(cfg.messages['archived-unfit']), ArchiveDate);
if 'bot: unknown' == UrlStatus then
utilities.set_message ('maint_bot_unknown'); -- and add a category if not already added
else
utilities.add_prop_cat ('unfit'); -- and add a category if not already added
end
else -- UrlStatus is empty, 'dead'
if utilities.is_set (ArchiveDate) then
Archived = sepc .. ' ' .. utilities.substitute ( cs2_lower(cfg.messages['archived-dead']),
{ external_link( OriginalURL, cfg.messages['original'], OriginalURL_origin, OriginalAccess ) .. OriginalFormat, ArchiveDate } );
else
Archived = ''; -- unset for concatenation
end
end
else -- OriginalUrl not set
utilities.set_message ('err_archive_missing_url');
Archived = ''; -- empty string for concatenation
end
elseif utilities.is_set (ArchiveFormat) then
Archived = ArchiveFormat; -- if set and ArchiveURL not set ArchiveFormat has error message
else
Archived = '';
end
local TranscriptURL = A['TranscriptURL']
local TranscriptFormat = A['TranscriptFormat'];
TranscriptFormat = style_format (TranscriptFormat, TranscriptURL, 'transcript-format', 'transcripturl');
local Transcript = A['Transcript'];
local TranscriptURL_origin = A:ORIGIN('TranscriptURL'); -- get name of parameter that holds TranscriptURL
if utilities.is_set (Transcript) then
if utilities.is_set (TranscriptURL) then
Transcript = external_link( TranscriptURL, Transcript, TranscriptURL_origin, nil );
end
Transcript = sepc .. ' ' .. Transcript .. TranscriptFormat;
elseif utilities.is_set (TranscriptURL) then
Transcript = external_link( TranscriptURL, nil, TranscriptURL_origin, nil );
end
local Publisher = ''; -- initialize to empty string for concatenation
if utilities.is_set (PublisherName) then
if utilities.is_set (PublicationPlace) then
Publisher = sepc .. " " .. PublicationPlace .. ": " .. PublisherName;
else
Publisher = sepc .. " " .. PublisherName;
end
elseif utilities.is_set (PublicationPlace) then
Publisher= sepc .. " " .. PublicationPlace;
end
-- Several of the above rely upon detecting this as nil, so do it last.
if (utilities.is_set (Periodical) or utilities.is_set (ScriptPeriodical) or utilities.is_set (TransPeriodical)) then
if utilities.is_set (Title) or utilities.is_set (TitleNote) then
Periodical = sepc .. " " .. format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical, TransPeriodical_origin);
else
Periodical = format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical, TransPeriodical_origin);
end
end
local Language = A['Language'];
if utilities.is_set (Language) then
Language = language_parameter (Language); -- format, categories, name from ISO639-1, etc.
else
Language=''; -- language not specified so make sure this is an empty string;
--[[ TODO: need to extract the wrap_msg from language_parameter
so that we can solve parentheses bunching problem with Format/Language/TitleType
]]
end
--[[
Handle the oddity that is cite speech. This code overrides whatever may be the value assigned to TitleNote (through |department=) and forces it to be " (Speech)" so that
the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided).
]]
if "speech" == config.CitationClass then -- cite speech only
TitleNote = TitleType; -- move TitleType to TitleNote so that it renders ahead of |event=
TitleType = ''; -- and unset
if utilities.is_set (Periodical) then -- if Periodical, perhaps because of an included |website= or |journal= parameter
if utilities.is_set (Conference) then -- and if |event= is set
Conference = Conference .. sepc .. " "; -- then add appropriate punctuation to the end of the Conference variable before rendering
end
end
end
-- Piece all bits together at last. Here, all should be non-nil.
-- We build things this way because it is more efficient in LUA
-- not to keep reassigning to the same string variable over and over.
local tcommon;
local tcommon2; -- used for book cite when |contributor= is set
local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At;
if utilities.in_array (config.CitationClass, {"book", "citation"}) and not utilities.is_set (Periodical) then -- special cases for book cites
if utilities.is_set (Contributors) then -- when we are citing foreword, preface, introduction, etc.
tcommon = safe_join ({Title, TitleNote}, sepc); -- author and other stuff will come after this and before tcommon2
tcommon2 = safe_join ({TitleType, Series, Language, Volume, Others, Edition, Publisher}, sepc);
else
tcommon = safe_join ({Title, TitleNote, TitleType, Series, Language, Volume, Others, Edition, Publisher}, sepc);
end
elseif 'map' == config.CitationClass then -- special cases for cite map
if utilities.is_set (Chapter) then -- map in a book; TitleType is part of Chapter
tcommon = safe_join ({Title, Edition, Scale, Series, Language, Cartography, Others, Publisher, Volume}, sepc);
elseif utilities.is_set (Periodical) then -- map in a periodical
tcommon = safe_join ({Title, TitleType, Periodical, Scale, Series, Language, Cartography, Others, Publisher, Volume}, sepc);
else -- a sheet or stand-alone map
tcommon = safe_join ({Title, TitleType, Edition, Scale, Series, Language, Cartography, Others, Publisher}, sepc);
end
elseif 'episode' == config.CitationClass then -- special case for cite episode
tcommon = safe_join ({Title, TitleNote, TitleType, Series, Language, Edition, Publisher}, sepc);
else -- all other CS1 templates
tcommon = safe_join ({Title, TitleNote, Conference, Periodical, TitleType, Series, Language, Volume, Others, Edition, Publisher, Agency}, sepc);
end
if #ID_list_t > 0 then
ID_list_t = safe_join( { sepc .. " ", table.concat( ID_list_t, sepc .. " " ), ID }, sepc );
else
ID_list_t = ID;
end
local Via = A['Via'];
Via = utilities.is_set (Via) and wrap_msg ('via', Via) or '';
local idcommon;
if 'audio-visual' == config.CitationClass or 'episode' == config.CitationClass then -- special case for cite AV media & cite episode position transcript
idcommon = safe_join( { ID_list_t, URL, Archived, Transcript, AccessDate, Via, Quote }, sepc );
else
idcommon = safe_join( { ID_list_t, URL, Archived, AccessDate, Via, Quote }, sepc );
end
local text;
local OrigDate = A['OrigDate'];
OrigDate = utilities.is_set (OrigDate) and wrap_msg ('origdate', OrigDate) or '';
if utilities.is_set (Date) then
if utilities.is_set (Authors) or utilities.is_set (Editors) then -- date follows authors or editors when authors not set
Date = " (" .. Date .. ")" .. OrigDate .. sepc .. " "; -- in parentheses
else -- neither of authors and editors set
if (string.sub(tcommon, -1, -1) == sepc) then -- if the last character of tcommon is sepc
Date = " " .. Date .. OrigDate; -- Date does not begin with sepc
else
Date = sepc .. " " .. Date .. OrigDate; -- Date begins with sepc
end
end
end
if utilities.is_set (Authors) then
if (not utilities.is_set (Date)) then -- when date is set it's in parentheses; no Authors termination
Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space
end
if utilities.is_set (Editors) then
local in_text = '';
local post_text;
if utilities.is_set (Chapter) and 0 == #c then
in_text = cfg.messages['in'] .. ' ';
in_text = cs2_lower(in_text); -- lowercase for cs2
end
if EditorCount <= 1 then
post_text = ' (' .. cfg.messages['editor'] .. ')'; -- be consistent with no-author, no-date case
else
post_text = ' (' .. cfg.messages['editors'] .. ')';
end
Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space
end
if utilities.is_set (Contributors) then -- book cite and we're citing the intro, preface, etc.
local by_text = sepc .. ' ' .. cfg.messages['by'] .. ' ';
by_text = cs2_lower(by_text); -- lowercase for cs2
Authors = by_text .. Authors; -- author follows title so tweak it here
if utilities.is_set (Editors) and utilities.is_set (Date) then -- when Editors make sure that Authors gets terminated
Authors = terminate_name_list (Authors, sepc); -- terminate with 0 or 1 sepc and a space
end
if (not utilities.is_set (Date)) then -- when date is set it's in parentheses; no Contributors termination
Contributors = terminate_name_list (Contributors, sepc); -- terminate with 0 or 1 sepc and a space
end
text = safe_join( {Contributors, Date, Chapter, tcommon, Authors, Editors, tcommon2, pgtext, idcommon }, sepc );
else
text = safe_join( {Authors, Date, Chapter, Editors, tcommon, pgtext, idcommon }, sepc );
end
elseif utilities.is_set (Editors) then
if utilities.is_set (Date) then
if EditorCount <= 1 then
Editors = Editors .. cfg.presentation['sep_name'] .. cfg.messages['editor'];
else
Editors = Editors .. cfg.presentation['sep_name'] .. cfg.messages['editors'];
end
else
if EditorCount <= 1 then
Editors = Editors .. " (" .. cfg.messages['editor'] .. ")" .. sepc .. " "
else
Editors = Editors .. " (" .. cfg.messages['editors'] .. ")" .. sepc .. " "
end
end
text = safe_join( {Editors, Date, Chapter, tcommon, pgtext, idcommon}, sepc );
else
if utilities.in_array (config.CitationClass, {"journal", "citation"}) and utilities.is_set (Periodical) then
text = safe_join( {Chapter, tcommon, pgtext, Date, idcommon}, sepc );
else
text = safe_join( {Chapter, tcommon, Date, pgtext, idcommon}, sepc );
end
end
if utilities.is_set (PostScript) and PostScript ~= sepc then
text = safe_join( {text, sepc}, sepc ); -- Deals with italics, spaces, etc.
if '.' == sepc then -- remove final seperator if present
text = text:gsub ('%' .. sepc .. '$', ''); -- dot must be escaped here
else
text = mw.ustring.gsub (text, sepc .. '$', ''); -- using ustring for non-dot sepc (likely a non-Latin character)
end
end
text = safe_join( {text, PostScript}, sepc );
-- Now enclose the whole thing in a <cite> element
local options_t = {};
options_t.class = cite_class_attribute_make (config.CitationClass, Mode);
local Ref = is_valid_parameter_value (A['Ref'], A:ORIGIN('Ref'), cfg.keywords_lists['ref'], nil, true); -- nil when |ref=harv; A['Ref'] else
if 'none' ~= cfg.keywords_xlate[(Ref and Ref:lower()) or ''] then
local namelist_t = {}; -- holds selected contributor, author, editor name list
local year = first_set ({Year, anchor_year}, 2); -- Year first for legacy citations and for YMD dates that require disambiguation
if #c > 0 then -- if there is a contributor list
namelist_t = c; -- select it
elseif #a > 0 then -- or an author list
namelist_t = a;
elseif #e > 0 then -- or an editor list
namelist_t = e;
end
local citeref_id;
if #namelist_t > 0 then -- if there are names in namelist_t
citeref_id = make_citeref_id (namelist_t, year); -- go make the CITEREF anchor
if mw.uri.anchorEncode (citeref_id) == ((Ref and mw.uri.anchorEncode (Ref)) or '') then -- Ref may already be encoded (by {{sfnref}}) so citeref_id must be encoded before comparison
utilities.set_message ('maint_ref_duplicates_default');
end
else
citeref_id = ''; -- unset
end
options_t.id = Ref or citeref_id;
end
if string.len (text:gsub('%b<>', '')) <= 2 then -- remove html and html-like tags; then get length of what remains;
z.error_cats_t = {}; -- blank the categories list
z.error_msgs_t = {}; -- blank the error messages list
OCinSoutput = nil; -- blank the metadata string
text = ''; -- blank the the citation
utilities.set_message ('err_empty_citation'); -- set empty citation message and category
end
local render_t = {}; -- here we collect the final bits for concatenation into the rendered citation
if is_preview_mode and (0 ~= #z.error_msgs_t or 0 ~= #z.maint_cats_t) then -- when in preview mode
if not utilities.is_set (options_t.id) then -- and when this template has not created an anchor ID
math.randomseed (tonumber (mw.getLanguage ('en'):formatDate ('U')) * 10000 + os.clock() * 10000);
options_t.id = 'CITEREF_temp_preview_id_' .. math.random (100000, 999999); -- create temporary anchor ID for preview mode
end
end
if utilities.is_set (options_t.id) then -- here we wrap the rendered citation in <cite ...>...</cite> tags
options_t.id = mw.uri.anchorEncode(options_t.id); -- do this here; also used when adding preview warning messages
table.insert (render_t, utilities.substitute (cfg.presentation['cite-id'], {options_t.id, mw.text.nowiki(options_t.class), text})); -- when |ref= is set or when there is a namelist
else
table.insert (render_t, utilities.substitute (cfg.presentation['cite'], {mw.text.nowiki(options_t.class), text})); -- when |ref=none or when namelist_t empty and |ref= is missing or is empty
end
if OCinSoutput then -- blanked when citation is 'empty' so don't bother to add boilerplate metadata span
table.insert (render_t, utilities.substitute (cfg.presentation['ocins'], OCinSoutput)); -- format and append metadata to the citation
end
local template_name = cfg.citation_class_map_t[config.CitationClass];
local template_link = '[[Template:' .. template_name .. '|' .. template_name .. ']]';
local msg_prefix = '<code class="cs1-code">{{' .. template_link .. '}}</code>: ';
if 0 ~= #z.error_msgs_t then
mw.addWarning (utilities.substitute (cfg.messages.warning_msg_e, {template_link, options_t.id}));
table.insert (render_t, ' '); -- insert a space between citation and its error messages
table.sort (z.error_msgs_t); -- sort the error messages list; sorting includes wrapping <span> and <code> tags; hidden-error sorts ahead of visible-error
local hidden = true; -- presume that the only error messages emited by this template are hidden
for _, v in ipairs (z.error_msgs_t) do -- spin through the list of error messages
if v:find ('cs1-visible-error', 1, true) then -- look for the visible error class name
hidden = false; -- found one; so don't hide the error message prefix
break; -- and done because no need to look further
end
end
z.error_msgs_t[1] = table.concat ({utilities.error_comment (msg_prefix, hidden), z.error_msgs_t[1]}); -- add error message prefix to first error message to prevent extraneous punctuation
table.insert (render_t, table.concat (z.error_msgs_t, '; ')); -- make a big string of error messages and add it to the rendering
end
if 0 ~= #z.maint_cats_t then
mw.addWarning (utilities.substitute (cfg.messages.warning_msg_m, {template_link, options_t.id}));
table.sort (z.maint_cats_t); -- sort the maintenance messages list
local maint_msgs_t = {}; -- here we collect all of the maint messages
if 0 == #z.error_msgs_t then -- if no error messages
table.insert (maint_msgs_t, msg_prefix); -- insert message prefix in maint message livery
end
for _, v in ipairs( z.maint_cats_t ) do -- append maintenance categories
table.insert (maint_msgs_t, -- assemble new maint message and add it to the maint_msgs_t table
table.concat ({v, ' (', utilities.substitute (cfg.messages[':cat wikilink'], v), ')'})
);
end
table.insert (render_t, utilities.substitute (cfg.presentation['hidden-maint'], table.concat (maint_msgs_t, ' '))); -- wrap the group of maint messages with proper presentation and save
end
if not no_tracking_cats then
local sort_key;
local cat_wikilink = 'cat wikilink';
if cfg.enable_sort_keys then -- when namespace sort keys enabled
local namespace_number = mw.title.getCurrentTitle().namespace; -- get namespace number for this wikitext
sort_key = (0 ~= namespace_number and (cfg.name_space_sort_keys[namespace_number] or cfg.name_space_sort_keys.other)) or nil; -- get sort key character; nil for mainspace
cat_wikilink = (not sort_key and 'cat wikilink') or 'cat wikilink sk'; -- make <cfg.messages> key
end
for _, v in ipairs (z.error_cats_t) do -- append error categories
table.insert (render_t, utilities.substitute (cfg.messages[cat_wikilink], {v, sort_key}));
end
if cfg.id_limits_data_load_fail then -- boolean true when load failed
utilities.set_message ('maint_id_limit_load_fail'); -- done here because this maint cat emits no message
end
for _, v in ipairs (z.maint_cats_t) do -- append maintenance categories
table.insert (render_t, utilities.substitute (cfg.messages[cat_wikilink], {v, sort_key}));
end
for _, v in ipairs (z.prop_cats_t) do -- append properties categories
table.insert (render_t, utilities.substitute (cfg.messages['cat wikilink'], v)); -- no sort keys
end
end
return table.concat (render_t); -- make a big string and done
end
--[[--------------------------< V A L I D A T E >--------------------------------------------------------------
Looks for a parameter's name in one of several whitelists.
Parameters in the whitelist can have three values:
true - active, supported parameters
false - deprecated, supported parameters
nil - unsupported parameters
]]
local function validate (name, cite_class, empty)
local enum_name; -- parameter name with enumerator (if any) replaced with '#'
local state;
local function state_test () -- local function to do testing of state values; operates on the upvalues <state> and <name>
if true == state then return true; end -- valid actively supported parameter
if false == state then
if empty then return nil; end -- empty deprecated parameters are treated as unknowns
deprecated_parameter (name); -- parameter is deprecated but still supported
return true;
end
if 'tracked' == state then
local base_name = name:gsub ('%d', ''); -- strip enumerators from parameter names that have them to get the base name
utilities.add_prop_cat ('tracked-param', {base_name}, base_name); -- add a properties category; <base_name> modifies <key>
return true;
end
return nil;
end
if 'string' ~= type (name) or name:find ('#') then -- # is a cs1|2 reserved character so parameters with # not permitted; positional params are 'number' type; not supported
return nil;
end
-- replace enumerator digit(s) with # (|last25= becomes |last#=) (mw.ustring because non-Western 'local' digits)
enum_name = mw.ustring.gsub (name, '%d+$', '#'); -- where enumerator is last charaters in parameter name (these to protect |s2cid=)
enum_name = mw.ustring.gsub (enum_name, '%d+([%-l])', '#%1'); -- where enumerator is in the middle of the parameter name; |author#link= is the oddity
if 'document' == cite_class then -- special case for {{cite document}}
state = whitelist.document_parameters_t[enum_name]; -- this list holds enumerated and nonenumerated parameters
if true == state_test () then return true; end
return false;
end
if utilities.in_array (cite_class, whitelist.preprint_template_list_t) then -- limited parameter sets allowed for these templates
state = whitelist.limited_parameters_t[enum_name]; -- this list holds enumerated and nonenumerated parameters
if true == state_test () then return true; end
state = whitelist.preprint_arguments_t[cite_class][name]; -- look in the parameter-list for the template identified by cite_class
if true == state_test () then return true; end
return false; -- not supported because not found or name is set to nil
end -- end limited parameter-set templates
if utilities.in_array (cite_class, whitelist.unique_param_template_list_t) then -- template-specific parameters for templates that accept parameters from the basic argument list
state = whitelist.unique_arguments_t[cite_class][name]; -- look in the template-specific parameter-lists for the template identified by cite_class
if true == state_test () then return true; end
end -- if here, fall into general validation
state = whitelist.common_parameters_t[enum_name]; -- all other templates; all normal parameters allowed; this list holds enumerated and nonenumerated parameters
if true == state_test () then return true; end
return false; -- not supported because not found or name is set to nil
end
--[=[-------------------------< I N T E R _ W I K I _ C H E C K >----------------------------------------------
check <value> for inter-language interwiki-link markup. <prefix> must be a MediaWiki-recognized language
code. when these values have the form (without leading colon):
[[<prefix>:link|label]] return label as plain-text
[[<prefix>:link]] return <prefix>:link as plain-text
return value as is else
]=]
local function inter_wiki_check (parameter, value)
local prefix = value:match ('%[%[(%a+):'); -- get an interwiki prefix if one exists
local _;
if prefix and cfg.inter_wiki_map[prefix:lower()] then -- if prefix is in the map, needs preceding colon so
utilities.set_message ('err_bad_paramlink', parameter); -- emit an error message
_, value, _ = utilities.is_wikilink (value); -- extract label portion from wikilink
end
return value;
end
--[[--------------------------< M I S S I N G _ P I P E _ C H E C K >------------------------------------------
Look at the contents of a parameter. If the content has a string of characters and digits followed by an equal
sign, compare the alphanumeric string to the list of cs1|2 parameters. If found, then the string is possibly a
parameter that is missing its pipe. There are two tests made:
{{cite ... |title=Title access-date=2016-03-17}} -- the first parameter has a value and whitespace separates that value from the missing pipe parameter name
{{cite ... |title=access-date=2016-03-17}} -- the first parameter has no value (whitespace after the first = is trimmed by MediaWiki)
cs1|2 shares some parameter names with XML/HTML attributes: class=, title=, etc. To prevent false positives XML/HTML
tags are removed before the search.
If a missing pipe is detected, this function adds the missing pipe maintenance category.
]]
local function missing_pipe_check (parameter, value)
local capture;
value = value:gsub ('%b<>', ''); -- remove XML/HTML tags because attributes: class=, title=, etc.
capture = value:match ('%s+(%a[%w%-]+)%s*=') or value:match ('^(%a[%w%-]+)%s*='); -- find and categorize parameters with possible missing pipes
if capture and validate (capture) then -- if the capture is a valid parameter name
utilities.set_message ('err_missing_pipe', parameter);
end
end
--[[--------------------------< H A S _ E X T R A N E O U S _ P U N C T >--------------------------------------
look for extraneous terminal punctuation in most parameter values; parameters listed in skip table are not checked
]]
local function has_extraneous_punc (param, value)
if 'number' == type (param) then
return;
end
param = param:gsub ('%d+', '#'); -- enumerated name-list mask params allow terminal punct; normalize
if cfg.punct_skip[param] then
return; -- parameter name found in the skip table so done
end
if value:match ('[,;:]$') then
utilities.set_message ('maint_extra_punct'); -- has extraneous punctuation; add maint cat
end
if value:match ('^=') then -- sometimes an extraneous '=' character appears ...
utilities.set_message ('maint_extra_punct'); -- has extraneous punctuation; add maint cat
end
end
--[[--------------------------< H A S _ T W L _ U R L >--------------------------------------------------------
look for The Wikipedia Library urls in url-holding parameters. TWL urls are accessible only for readers who are
active extended confirmed Wikipedia editors. This function sets an error message when such urls are discovered
and when appropriate, sets the |<param>-url-access=subscription. returns nothing.
looks for: '.wikipedialibrary.idm.oclc.org'
]]
local function has_twl_url (url_params_t, cite_args_t)
local url_error_t = {}; -- sequence of url-holding parameters that have a TWL url
for param, value in pairs (url_params_t) do
if value:find ('%.wikipedialibrary%.idm%.oclc%.org') then -- has the TWL base url?
table.insert (url_error_t, param); -- add parameter name to the error list
end
end
if 0 ~= #url_error_t then -- non-zero when there are errors
table.sort (url_error_t); -- sor for error messaging
for i, param in ipairs (url_error_t) do
if cfg.url_access_map_t[param] then -- if <param> has a matching -access parameter
cite_args_t[cfg.url_access_map_t[param]] = cfg.keywords_xlate.subscription; -- set |<param>-url-access=subscription
end
url_error_t[i] = utilities.wrap_style ('parameter', param); -- make the parameter pretty for error message
end
utilities.set_message ('err_param_has_twl_url', {utilities.make_sep_list (#url_error_t, url_error_t)}); -- add this error message
end
end
--[[--------------------------< M I S C _ U R L _ D E T E C T >------------------------------------------------
look for miscellaneous urls that might be converted to, or are duplicates of, identifiers.
]]
local misc_url_patterns_t = {
'idm%.oclc%.org', -- but not wikipedialibrary.idm.oclc.org; has_twl_url()
'https?://citeseerx?%.ist%.psu%.edu/', -- simplified so we catch all citeseer and citeseerx urls except ~/document/... (the 'new' form)
}
local ignore_patterns_t = {
'wikipedialibrary.idm.oclc.org', -- handled by has_twl_url()
'https?://citeseerx?%.ist%.psu%.edu/document', -- 'new'-form citeseerx urls that mostly work; ignore for now
}
local function misc_url_detect (url_params_t)
local ignore_flag = false;
for _, value in pairs (url_params_t) do
for _, ignore_pattern in ipairs (ignore_patterns_t) do
if value:find (ignore_pattern) then -- matches this ignore_pattern?
ignore_flag = true; -- found a pattern to ignore
break; --
end
end
if not ignore_flag then -- if ignore_flag is set then don't bother to test this url <value>
for _, misc_pattern in ipairs (misc_url_patterns_t) do
if value:find (misc_pattern) then -- matches this misc_pattern?
utilities.set_message ('maint_misc_url'); -- found one; set the message
return; -- and done; no need to test other <value>s
end
end
end
ignore_flag = false; -- reset
end
end
--[[--------------------------< H A S _ E X T R A N E O U S _ U R L >------------------------------------------
look for extraneous url parameter values; parameters listed in skip table are not checked
]]
local function has_extraneous_url (non_url_param_t)
local url_error_t = {};
check_for_url (non_url_param_t, url_error_t); -- extraneous url check
if 0 ~= #url_error_t then -- non-zero when there are errors
table.sort (url_error_t);
utilities.set_message ('err_param_has_ext_link', {utilities.make_sep_list (#url_error_t, url_error_t)}); -- add this error message
end
end
--[[--------------------------< _ C I T A T I O N >------------------------------------------------------------
Module entry point
frame – from template call (citation()); may be nil when called from another module
args_t – table of all cs1|2 parameters in the template (the parent frame)
config_t – table of template-supplied parameter (the #invoke frame)
]]
local function _citation (frame, args_t, config_t) -- save a copy in case we need to display an error message in preview mode
if not frame then
frame = mw.getCurrentFrame(); -- if called from another module, get a frame for frame-provided functions
end
-- i18n: set the name that your wiki uses to identify sandbox subpages from sandbox template invoke (or can be set here)
local sandbox = ((config_t.SandboxPath and '' ~= config_t.SandboxPath) and config_t.SandboxPath) or '/sandbox'; -- sandbox path from {{#invoke:Citation/CS1/sandbox|citation|SandboxPath=/...}}
is_sandbox = nil ~= string.find (frame:getTitle(), sandbox, 1, true); -- is this invoke the sandbox module?
sandbox = is_sandbox and sandbox or ''; -- use i18n sandbox to load sandbox modules when this module is the sandox; live modules else
cfg = mw.loadData ('Module:Citation/CS1/Configuration' .. sandbox); -- load sandbox versions of support modules when {{#invoke:Citation/CS1/sandbox|...}}; live modules else
whitelist = mw.loadData ('Module:Citation/CS1/Whitelist' .. sandbox);
utilities = require ('Module:Citation/CS1/Utilities' .. sandbox);
validation = require ('Module:Citation/CS1/Date_validation' .. sandbox);
identifiers = require ('Module:Citation/CS1/Identifiers' .. sandbox);
metadata = require ('Module:Citation/CS1/COinS' .. sandbox);
utilities.set_selected_modules (cfg); -- so that functions in Utilities can see the selected cfg tables
identifiers.set_selected_modules (cfg, utilities); -- so that functions in Identifiers can see the selected cfg tables and selected Utilities module
validation.set_selected_modules (cfg, utilities); -- so that functions in Date validataion can see selected cfg tables and the selected Utilities module
metadata.set_selected_modules (cfg, utilities); -- so that functions in COinS can see the selected cfg tables and selected Utilities module
z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities
local cite_args_t = {}; -- because args_t is the parent (template) frame args (which cannot be modified); params and their values will be placed here
is_preview_mode = not utilities.is_set (frame:preprocess ('{{REVISIONID}}'));
local suggestions = {}; -- table where we store suggestions if we need to loadData them
local error_text; -- used as a flag
local capture; -- the single supported capture when matching unknown parameters using patterns
local empty_unknowns = {}; -- sequence table to hold empty unknown params for error message listing
for k, v in pairs (args_t) do -- get parameters from the parent (template) frame
v = mw.ustring.gsub (v, '^%s*(.-)%s*$', '%1'); -- trim leading/trailing whitespace; when v is only whitespace, becomes empty string
if v ~= '' then
if cfg.enum_needs_xlation and 'string' == type (k) then -- for wikis that set date_names['local_digits'] to non-western digits
k = mw.ustring.gsub (k, '%d', cfg.date_names.local_digits); -- translate 'local' digits enumerators to Western 0-9
end
if not validate( k, config_t.CitationClass ) then
if type (k) ~= 'string' then -- exclude empty numbered parameters
if v:match("%S+") ~= nil then
error_text = utilities.set_message ('err_text_ignored', {v});
end
elseif validate (k:lower(), config_t.CitationClass) then
error_text = utilities.set_message ('err_parameter_ignored_suggest', {k, k:lower()}); -- suggest the lowercase version of the parameter
else
if nil == suggestions.suggestions then -- if this table is nil then we need to load it
suggestions = mw.loadData ('Module:Citation/CS1/Suggestions' .. sandbox); --load sandbox version of suggestion module when {{#invoke:Citation/CS1/sandbox|...}}; live module else
end
for pattern, param in pairs (suggestions.patterns) do -- loop through the patterns to see if we can suggest a proper parameter
capture = k:match (pattern); -- the whole match if no capture in pattern else the capture if a match
if capture then -- if the pattern matches
param = utilities.substitute (param, capture); -- add the capture to the suggested parameter (typically the enumerator)
if validate (param, config_t.CitationClass) then -- validate the suggestion to make sure that the suggestion is supported by this template (necessary for limited parameter lists)
error_text = utilities.set_message ('err_parameter_ignored_suggest', {k, param}); -- set the suggestion error message
else
error_text = utilities.set_message ('err_parameter_ignored', {k}); -- suggested param not supported by this template
v = ''; -- unset
end
end
end
if not utilities.is_set (error_text) then -- couldn't match with a pattern, is there an explicit suggestion?
if (suggestions.suggestions[ k:lower() ] ~= nil) and validate (suggestions.suggestions[ k:lower() ], config_t.CitationClass) then
utilities.set_message ('err_parameter_ignored_suggest', {k, suggestions.suggestions[ k:lower() ]});
else
utilities.set_message ('err_parameter_ignored', {k});
v = ''; -- unset value assigned to unrecognized parameters (this for the limited parameter lists)
end
end
end
end
cite_args_t[k] = v; -- save this parameter and its value
elseif not utilities.is_set (v) then -- for empty parameters
if not validate (k, config_t.CitationClass, true) then -- is this empty parameter a valid parameter
k = ('' == k) and cfg.err_msg_supl.empty_str or k; -- when k is empty string (or was space(s) trimmed to empty string), replace with descriptive text
table.insert (empty_unknowns, utilities.wrap_style ('parameter', k)); -- format for error message and add to the list
end
end
end
if 0 ~= #empty_unknowns then -- create empty unknown error message
utilities.set_message ('err_param_unknown_empty', {
1 == #empty_unknowns and '' or 's',
utilities.make_sep_list (#empty_unknowns, empty_unknowns)
});
end
local non_url_param_t = {}; -- table of parameters and values that are not url-holding parameters
local url_param_t = {}; -- table of url-holding paramters and their values
for k, v in pairs (cite_args_t) do
if 'string' == type (k) then -- don't evaluate positional parameters
has_invisible_chars (k, v); -- look for invisible characters
end
has_extraneous_punc (k, v); -- look for extraneous terminal punctuation in parameter values
missing_pipe_check (k, v); -- do we think that there is a parameter that is missing a pipe?
cite_args_t[k] = inter_wiki_check (k, v); -- when language interwiki-linked parameter missing leading colon replace with wiki-link label
if 'string' == type (k) then -- when parameter k is not positional
if not cfg.url_skip[k] then -- and not in url skip table
non_url_param_t[k] = v; -- make a parameter/value list for extraneous url check
else -- and is in url skip table (a url-holding parameter)
url_param_t[k] = v; -- make a parameter/value list to check for values that are The Wikipedia Library url
end
end
end
if cfg.suppress_archive_today_urls then
has_archive_today_url (cite_args_t); -- look for and suppress archive.today urls and dependent parameters for all templates
end
has_extraneous_url (non_url_param_t); -- look for url in parameter values where a url does not belong
has_twl_url (url_param_t, cite_args_t); -- look for url-holding parameters that hold a The Wikipedia Library url
misc_url_detect (url_param_t); -- look for url-holding parameters that hold certain miscellaneous urls
return table.concat ({
frame:extensionTag ('templatestyles', '', {src='Module:Citation/CS1' .. sandbox .. '/styles.css'}),
citation0 (config_t, cite_args_t)
});
end
--[[--------------------------< C I T A T I O N >--------------------------------------------------------------
Template entry point
]]
local function citation (frame)
local config_t = {}; -- table to store parameters from the module {{#invoke:}}
local args_t = frame:getParent().args; -- get template's preset parameters
for k, v in pairs (frame.args) do -- get parameters from the {{#invoke}} frame
config_t[k] = v;
-- args_t[k] = v; -- crude debug support that allows us to render a citation from module {{#invoke:}}; skips parameter validation; TODO: keep?
end
return _citation (frame, args_t, config_t)
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
citation = citation, -- template entry point
_citation = _citation, -- module entry point
}
3oosv6gdshi4e6cm8r0tq8pjoevqbo6
Module:Citation/CS1/Configuration
828
925
32817
9004
2026-11-07T20:03:20Z
en>Trappist the monk
0
synch from sandbox;
32817
Scribunto
text/plain
local lang_obj = mw.getContentLanguage(); -- make a language object for the local language; used here for languages and dates
--[[--------------------------< S E T T I N G S >--------------------------------------------------------------
boolean settings used to control various things. these setting located here to make them easy to find
]]
-- these settings local to this module only
local local_digits_from_mediawiki = false; -- for i18n; when true, module fills date_names['local_digits'] from MediaWiki; manual fill required else; always false at en.wiki
-- these settings exported to other modules
local use_identifier_redirects = true; -- when true use redirect name for identifier label links; always true at en.wiki
local local_lang_cat_enable = false; -- when true categorizes pages where |language=<local wiki's language>; always false at en.wiki
local date_name_auto_xlate_enable = false; -- when true translates English month-names to the local-wiki's language month names; always false at en.wiki
local date_digit_auto_xlate_enable = false; -- when true translates Western date digit to the local-wiki's language digits (date_names['local_digits']); always false at en.wiki
local enable_sort_keys = true; -- when true module adds namespace sort keys to error and maintenance category links
local suppress_archive_today_urls = true; -- when true module suppresses all parameters with an archive.today url and any deprendent parameters
--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
List of namespaces identifiers for namespaces that will not be included in citation error categories.
Same as setting notracking = true by default.
For wikis that have a current version of Module:cs1 documentation support, this #invoke will return an unordered
list of namespace names and their associated identifiers:
{{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}}
]]
local uncategorized_namespaces_t = {[2]=true}; -- init with user namespace id
for k, _ in pairs (mw.site.talkNamespaces) do -- add all talk namespace ids
uncategorized_namespaces_t[k] = true;
end
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases', '/[^/]*[Ll]og', '/[Aa]rchive'}; -- list of Lua patterns found in page names of pages we should not categorize
--[[
at en.wiki Greek characters are used as sort keys for certain items in a category so that those items are
placed at the end of a category page. See Wikipedia:Categorization#Sort_keys. That works well for en.wiki
because English is written using the Latn script. This may not work well for other languages. At en.wiki it
is desireable to place content from certain namespaces at the end of a category listing so the module adds sort
keys to error and maintenance category links when rendering a cs1|2 template on a page in that namespace.
i18n: if this does not work well for your language, set <enable_sort_keys> to false.
]]
local name_space_sort_keys = { -- sort keys to be used with these namespaces:
[4] = 'ω', -- wikipedia; omega
[10] = 'τ', -- template; tau
[118] = 'Δ', -- draft; delta
['other'] = 'ο', -- all other non-talk namespaces except main (article); omicron
}
--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
Translation table
The following contains fixed text that may be output as part of a citation.
This is separated from the main body to aid in future translations of this
module.
]]
local messages = {
['agency'] = '$1 $2', -- $1 is sepc, $2 is agency
['archived-dead'] = 'Archived from $1 on $2',
['archived-live'] = '$1 from the original on $2',
['archived-unfit'] = 'Archived from the original on $1',
['archived'] = 'Archived',
['by'] = 'By', -- contributions to authored works: introduction, foreword, afterword
['cartography'] = 'Cartography by $1',
['collaboration'] = '$1 ($2)', -- $1 is author with et al, $2 is collaboration
['editor'] = 'ed.',
['editors'] = 'eds.',
['edition'] = '($1 ed.)',
['episode'] = 'Episode $1',
['et al'] = 'et al.',
['in'] = 'In', -- edited works
['inactive'] = ' (inactive $1)', -- $1 is date which the doi was found to be broken in
['inset'] = '$1 inset',
['interview'] = 'Interviewed by $1',
invisible_1 = '$1 $2', -- $1 stripmarker name; $2 is text from <invisible_chars[1]>
invisible_2 = '$1 character', -- $1 character name from <invisible_chars[1]>
['mismatch'] = '<code class="cs1-code">|$1=</code> / <code class="cs1-code">|$2=</code> mismatch', -- $1 is year param name; $2 is date param name
['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]: $1',
['notitle'] = 'No title', -- for |title=(()) and (in the future) |title=none
['original'] = 'the original',
['origdate'] = ' [$1]',
['retrieved'] = 'Retrieved $1',
['season'] = 'Season $1',
['section'] = '§ $1',
['sections'] = '§§ $1',
['series'] = '$1 $2', -- $1 is sepc, $2 is series
['seriesnum'] = 'Series $1',
['translated'] = 'Translated by $1',
['type'] = ' ($1)', -- for titletype
wikidata = 'Wikidata', -- these used for interwikilinked author/editor/... names
wikipedia = 'Wikipedia',
wikisource = 'Wikisource',
['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{}
['vol-no'] = '$1 Vol. $2, no. $3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization)
['issue'] = '$1 No. $2', -- $1 is sepc
['art'] = '$1 Art. $2', -- $1 is sepc; for {{cite conference}} only
['vol-art'] = '$1 Vol. $2, art. $3', -- sepc, volume, article-number; for {{cite conference}} only
['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{}
['j-issue'] = ' ($1)',
['j-article-num'] = ' $1', -- TODO: any punctuation here? static text?
['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc
['p-prefix'] = "$1 p. $2", -- $1 is sepc
['pp-prefix'] = "$1 pp. $2", -- $1 is sepc
['j-page(s)'] = ': $1', -- same for page and pages
['sheet'] = '$1 Sheet $2', -- $1 is sepc
['sheets'] = '$1 Sheets $2', -- $1 is sepc
['j-sheet'] = ': Sheet $1',
['j-sheets'] = ': Sheets $1',
['language'] = '(in $1)',
['via'] = " – via $1",
['event'] = 'Event occurs at',
['minutes'] = ' $1 minutes in', -- $1 is the number of minutes
-- Determines the location of the help page
['help page link'] = 'Help:CS1 errors',
['help page label'] = 'help',
-- categories
['cat wikilink'] = '[[Category:$1]]', -- $1 is the category name
['cat wikilink sk'] = '[[Category:$1|$2]]', -- $1 is the category name; $2 is namespace sort key
[':cat wikilink'] = '[[:Category:$1|link]]', -- category name as maintenance message wikilink; $1 is the category name
-- Internal errors (should only occur if configuration is bad)
['undefined_error'] = 'Called with an undefined error condition',
['unknown_ID_key'] = 'Unrecognized ID key: ', -- an ID key in id_handlers not found in ~/Identifiers func_map{}
['unknown_ID_access'] = 'Unrecognized ID access keyword: ', -- an ID access keyword in id_handlers not found in keywords_lists['id-access']{}
['unknown_argument_map'] = 'Argument map not defined for this variable',
['bare_url_no_origin'] = 'Bare URL found but origin indicator is nil or empty',
['warning_msg_e'] = '<span style="color:#d33"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: this [[#$2|reference]] has errors</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link; $2 is anchor ID
['warning_msg_m'] = '<span style="color:#085"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: this [[#$2|reference]] has maintenance messages</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link; $2 is anchor ID
}
--[[--------------------------< C I T A T I O N _ C L A S S _ M A P >------------------------------------------
this table maps the value assigned to |CitationClass= in the cs1|2 templates to the canonical template name when
the value assigned to |CitationClass= is different from the canonical template name. |CitationClass= values are
used as class attributes in the <cite> tag that encloses the citation so these names may not contain spaces while
the canonical template name may. These names are used in warning_msg_e and warning_msg_m to create links to the
template's documentation when an article is displayed in preview mode.
]]
local citation_class_map_t = { -- TODO: in Module:Cite/config write a function to use this table
arxiv = 'cite arXiv', -- as the source for known_templates_t and citation_classes_t
['audio-visual'] = 'cite AV media',
['AV-media-notes'] = 'cite AV media notes',
biorxiv = 'cite bioRxiv',
book = 'cite book',
citation = 'citation',
citeseerx = 'cite CiteSeerX',
conference = 'cite conference',
document = 'cite document',
encyclopaedia = 'cite encyclopedia',
episode = 'cite episode',
interview = 'cite interview',
journal = 'cite journal',
magazine = 'cite magazine',
mailinglist = 'cite mailing list',
map = 'cite map',
medrxiv = 'cite medRxiv',
news = 'cite news',
newsgroup = 'cite newsgroup',
podcast = 'cite podcast',
pressrelease = 'cite press release',
report = 'cite report',
serial = 'cite serial',
sign = 'cite sign',
speech = 'cite speech',
ssrn = 'cite SSRN',
techreport = 'cite tech report',
thesis = 'cite thesis',
web = 'cite web',
}
--[=[-------------------------< E T _ A L _ P A T T E R N S >--------------------------------------------------
This table provides Lua patterns for the phrase "et al" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the 'etal' message.
]=]
local et_al_patterns = {
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.;,\"']*$", -- variations on the 'et al' theme
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][AaIi][Ee]?[%.;,\"']*$", -- variations on the 'et alia', 'et alii' and 'et aliae' themes (false positive 'et aliie' unlikely to match)
"[;,]? *%f[%a]and [Oo]thers", -- an alternative to et al.
"%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form
"%(%( *[Ee][Tt]%.? *[Aa][Ll]%.? *%)%)", -- a double-bracketed form (to counter partial removal of ((...)) syntax)
"[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form
}
--[[--------------------------< P R E S E N T A T I O N >------------------------
Fixed presentation markup. Originally part of citation_config.messages it has
been moved into its own, more semantically correct place.
]]
local presentation =
{
-- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display
['hidden-error'] = '<span class="cs1-hidden-error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error citation-comment">$1</span>',
['hidden-maint'] = '<span class="cs1-maint citation-comment">$1</span>',
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal CSS
['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like
['cite'] = '<cite class="$1">$2</cite>'; -- for use when citation does not have a namelist and |ref= not set so no id="..." attribute
['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when when |ref= is set or when citation has a namelist
['format'] = ' <span class="cs1-format">($1)</span>', -- for |format=, |chapter-format=, etc.
['interwiki'] = ' <span class="cs1-format">[in $1]</span>', -- for interwiki-language-linked author, editor, etc
['interproj'] = ' <span class="cs1-format">[at $1]</span>', -- for interwiki-project-linked author, editor, etc (:d: and :s: supported; :w: ignored)
-- various access levels, for |access=, |doi-access=, |arxiv=, ...
-- narrow no-break space   may work better than nowrap CSS. Or not? Browser support?
['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon
['free'] = {class='id-lock-free', title='Freely accessible'}, -- classes defined in Module:Citation/CS1/styles.css
['registration'] = {class='id-lock-registration', title='Free registration required'},
['limited'] = {class='id-lock-limited', title='Free access subject to limited trial, subscription normally required'},
['subscription'] = {class='id-lock-subscription', title='Paid subscription required'},
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>',
['class-wikisource'] = 'cs1-ws-icon',
['italic-title'] = "''$1''",
['kern-left'] = '<span class="cs1-kern-left"></span>$1', -- spacing to use when title contains leading single or double quote mark
['kern-right'] = '$1<span class="cs1-kern-right"></span>', -- spacing to use when title contains trailing single or double quote mark
['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span>
['nowrap2'] = '<span class="nowrap">$1</span> $2', -- for nowrapping portions of an item: <span ...>dd mmmm</span> yyyy (note white space)
['ocins'] = '<span title="$1" class="Z3988"></span>',
['parameter'] = '<code class="cs1-code">|$1=</code>',
['ps_cs1'] = '.'; -- CS1 style postscript (terminal) character
['ps_cs2'] = ''; -- CS2 style postscript (terminal) character (empty string)
['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content
['quoted-title'] = '"$1"',
['sep_cs1'] = '.', -- CS1 element separator
['sep_cs2'] = ',', -- CS2 separator
['sep_nl'] = ';', -- CS1|2 style name-list separator between names is a semicolon
['sep_nl_and'] = ' and ', -- used as last nl sep when |name-list-style=and and list has 2 items
['sep_nl_end'] = '; and ', -- used as last nl sep when |name-list-style=and and list has 3+ names
['sep_name'] = ', ', -- CS1|2 style last/first separator is <comma><space>
['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma
['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space
['sep_list'] = ', ', -- used for |language= when list has 3+ items except for last sep which uses sep_list_end
['sep_list_pair'] = ' and ', -- used for |language= when list has 2 items
['sep_list_end'] = ', and ', -- used as last list sep for |language= when list has 3+ items
['trans-italic-title'] = "[''$1'']",
['trans-quoted-title'] = "[$1]", -- for |trans-title= and |trans-quote=
['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{}
}
--[[--------------------------< A L I A S E S >---------------------------------
Aliases table for commonly passed parameters.
Parameter names on the right side in the assignments in this table must have been
defined in the Whitelist before they will be recognized as valid parameter names
]]
local aliases = {
['AccessDate'] = {'access-date', 'accessdate'}, -- Used by InternetArchiveBot
['Agency'] = 'agency',
['ArchiveDate'] = {'archive-date', 'archivedate'}, -- Used by InternetArchiveBot
['ArchiveFormat'] = 'archive-format',
['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot
['ArticleNumber'] = 'article-number',
['ASINTLD'] = 'asin-tld',
['At'] = 'at', -- Used by InternetArchiveBot
['Authors'] = {'people', 'credits'},
['BookTitle'] = {'book-title', 'booktitle'},
['Cartography'] = 'cartography',
['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'},
['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format',
'article-format', 'section-format'};
['ChapterURL'] = {'chapter-url', 'contribution-url', 'entry-url', 'article-url', 'section-url'}, -- Used by InternetArchiveBot
['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access',
'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot
['Class'] = 'class', -- cite arxiv and arxiv identifier
['Collaboration'] = 'collaboration',
['Conference'] = {'conference', 'event'},
['ConferenceFormat'] = 'conference-format',
['ConferenceURL'] = 'conference-url', -- Used by InternetArchiveBot
['Date'] = {'date', 'publication-date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only
['Degree'] = 'degree',
['DF'] = 'df',
['DisplayAuthors'] = {'display-authors', 'display-subjects'},
['DisplayContributors'] = 'display-contributors',
['DisplayEditors'] = 'display-editors',
['DisplayInterviewers'] = 'display-interviewers',
['DisplayTranslators'] = 'display-translators',
['Docket'] = 'docket',
['DoiBroken'] = 'doi-broken-date',
['Edition'] = 'edition',
['Embargo'] = 'pmc-embargo-date',
['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only
['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode?
['Format'] = 'format',
['ID'] = {'id', 'ID'},
['Inset'] = 'inset',
['Issue'] = {'issue', 'number'},
['Language'] = {'language', 'lang'},
['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only
['Map'] = 'map', -- cite map only
['MapFormat'] = 'map-format', -- cite map only
['MapURL'] = {'map-url', 'mapurl'}, -- cite map only -- Used by InternetArchiveBot
['MapUrlAccess'] = 'map-url-access', -- cite map only -- Used by InternetArchiveBot
['Minutes'] = 'minutes',
['Mode'] = 'mode',
['NameListStyle'] = 'name-list-style',
['Network'] = 'network',
['Newsgroup'] = 'newsgroup', -- cite newsgroup only
['NoPP'] = {'no-pp', 'nopp'},
['NoTracking'] = {'no-tracking', 'template-doc-demo'},
['Number'] = 'number', -- this case only for cite techreport
['OrigDate'] = {'orig-date', 'orig-year', 'origyear'},
['Others'] = 'others',
['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot
['Pages'] = {'pages', 'pp'}, -- Used by InternetArchiveBot
['Periodical'] = {'journal', 'magazine', 'newspaper', 'periodical', 'website', 'work'},
['PostScript'] = 'postscript',
['PublicationPlace'] = {'publication-place', 'location', 'place'}, -- TODO: when all templates that use |publication-place= and |place= or |location= make 'location' cannonical
['PublisherName'] = {'publisher', 'institution'},
['Quote'] = {'quote', 'quotation'},
['QuotePage'] = 'quote-page',
['QuotePages'] = 'quote-pages',
['Ref'] = 'ref',
['Scale'] = 'scale',
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry',
'script-article', 'script-section'},
['ScriptEncyclopedia'] = {'script-encyclopedia', 'script-encyclopaedia'}, -- cite encyclopedia only
['ScriptMap'] = 'script-map',
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper',
'script-periodical', 'script-website', 'script-work'},
['ScriptQuote'] = 'script-quote',
['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot
['Season'] = 'season',
['Sections'] = 'sections', -- cite map only
['Series'] = {'series', 'version'},
['SeriesLink'] = {'series-link', 'serieslink'},
['SeriesNumber'] = {'series-number', 'series-no'},
['Sheet'] = 'sheet', -- cite map only
['Sheets'] = 'sheets', -- cite map only
['Station'] = 'station',
['Time'] = 'time',
['TimeCaption'] = 'time-caption',
['Title'] = 'title', -- Used by InternetArchiveBot
['TitleLink'] = {'title-link', 'episode-link', 'episodelink'}, -- Used by InternetArchiveBot
['TitleNote'] = {'title-note', 'department'},
['TitleType'] = {'type', 'medium'},
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution',
'trans-entry', 'trans-section'},
['Transcript'] = 'transcript',
['TranscriptFormat'] = 'transcript-format',
['TranscriptURL'] = 'transcript-url', -- Used by InternetArchiveBot
['TransEncyclopedia'] = {'trans-encyclopedia', 'trans-encyclopaedia'}, -- cite encyclopedia only
['TransMap'] = 'trans-map', -- cite map only
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper',
'trans-periodical', 'trans-website', 'trans-work'},
['TransQuote'] = 'trans-quote',
['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot
['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot
['UrlAccess'] = 'url-access', -- Used by InternetArchiveBot
['UrlStatus'] = 'url-status', -- Used by InternetArchiveBot
['Vauthors'] = 'vauthors',
['Veditors'] = 'veditors',
['Via'] = 'via',
['Volume'] = 'volume',
['Year'] = 'year',
['AuthorList-First'] = {"first#", "author-first#", "author#-first", "author-given#", "author#-given",
"subject-first#", "subject#-first", "subject-given#", "subject#-given",
"given#"},
['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author-surname#", "author#-surname",
"subject-last#", "subject#-last", "subject-surname#", "subject#-surname",
"author#", 'host#', "subject#", "surname#"},
['AuthorList-Link'] = {"author-link#", "author#-link", "subject-link#",
"subject#-link", "authorlink#", "author#link"},
['AuthorList-Mask'] = {"author-mask#", "author#-mask", "subject-mask#", "subject#-mask"},
['ContributorList-First'] = {'contributor-first#', 'contributor#-first',
'contributor-given#', 'contributor#-given'},
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last',
'contributor-surname#', 'contributor#-surname', 'contributor#'},
['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'},
['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'},
['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"},
['EditorList-Last'] = {"editor-last#", "editor#-last", "editor-surname#",
"editor#-surname", "editor#"},
['EditorList-Link'] = {"editor-link#", "editor#-link"},
['EditorList-Mask'] = {"editor-mask#", "editor#-mask"},
['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first',
'interviewer-given#', 'interviewer#-given'},
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last',
'interviewer-surname#', 'interviewer#-surname', 'interviewer#'},
['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'},
['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'},
['TranslatorList-First'] = {'translator-first#', 'translator#-first',
'translator-given#', 'translator#-given'},
['TranslatorList-Last'] = {'translator-last#', 'translator#-last',
'translator-surname#', 'translator#-surname', 'translator#'},
['TranslatorList-Link'] = {'translator-link#', 'translator#-link'},
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
}
--[[--------------------------< D E P E N D E N C I E S _ T >--------------------------------------------------
a table of url-holding parameters upon which other parameters are dependent.
this table is used by has_archive_today_url() to suppress parameters that are dependant upon a url-holding parameter
that has as a value an archive.today (or alternate tld) url.
archive.today is deprecated at en.wiki; see Wikipedia:Requests_for_comment/Archive.is_RFC_5
]]
local url_dependency_map_t = { -- table of url-holding parameters and the meta-parameters that are dependent on them
['url'] = {'AccessDate', 'ArchiveURL', 'Format', 'UrlAccess'},
['archive-url'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['archiveurl'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['article-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['chapter-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['conference-url'] = {'ConferenceFormat'},
['contribution-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['entry-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['map-url'] = {'MapFormat', 'MapUrlAccess'},
['section-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['transcript-url'] = {'TranscriptFormat'},
};
local dependencies_t = {}; -- the table of url-holding parameters and their dependent parameters
for url_param, meta_parameters_t in pairs (url_dependency_map_t) do -- sequence of meta-parameters (indexes) into <aliases> table
local dependant_params_t = {}; -- collection of parameters that are dependent on this <url_param>
for _, meta_parameter in ipairs (meta_parameters_t) do -- for each <aliases> meta-parameter (index)
if 'string' == type (aliases[meta_parameter]) then -- for single parameter names (no aliases), <aliases[meta_parameter]> will be a string
table.insert (dependant_params_t, aliases[meta_parameter]); -- add to this <url_param>'s dependency sequence
else
for _, alias in ipairs (aliases[meta_parameter]) do -- for each alias in aliases[meta_parameter] (aliases['AccessDate'] for example)
table.insert (dependant_params_t, alias); -- add to this <url_param>'s dependency sequence
end
end
end
dependencies_t[url_param] = dependant_params_t; -- add the <url_param> and its dependent parameters
end
--[[--------------------------< P U N C T _ S K I P >---------------------------
builds a table of parameter names that the extraneous terminal punctuation check should not check.
]]
local punct_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters
'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators
'PostScript', 'Quote', 'ScriptQuote', 'TransQuote', 'Ref', -- miscellaneous
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'MapURL', 'TranscriptURL', 'URL', -- URL-holding parameters
}
local url_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'ID', 'MapURL', 'TranscriptURL', 'URL', -- parameters allowed to hold urls
'Page', 'Pages', 'At', 'QuotePage', 'QuotePages', -- insource locators allowed to hold urls
}
local function build_skip_table (skip_t, meta_params)
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key
local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name
if 'string' == type (params) then
skip_t[params] = 1; -- just a single parameter
else
for _, param in ipairs (params) do -- get the parameter name
skip_t[param] = 1; -- add the parameter name to the skip table
local count;
param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters
if 0 ~= count then -- if removed
skip_t[param] = 1; -- add param name without enumerator marker
end
end
end
end
return skip_t;
end
local punct_skip = {};
local url_skip = {};
--[[--------------------------< U R L _ A C C E S S _ M A P >--------------------------------------------------
this table used by the wikipedia library url test, has_twl_url(), which automatically sets a url-access parameter
to 'subscription' when it discovers a wikipedia library url in any of the url-holding paramters used as keys in
this table.
translators: if your wiki uses parameter names for these url-holding parameters and their matching -access parameters,
add your wiki's parameters to this list. Leave the English parameters in place.
TODO: is there a better way to do this?
]]
local url_access_map_t = {
['chapter-url'] = 'chapter-url-access',
['contribution-url'] = 'contribution-url-access',
['entry-url'] = 'entry-url-access',
['article-url'] = 'article-url-access',
['section-url'] = 'section-url-access',
['map-url'] = 'map-url-access',
['mapurl'] = 'map-url-access',
['url'] = 'url-access',
['URL'] = 'url-access'
}
--[[--------------------------< S I N G L E - L E T T E R S E C O N D - L E V E L D O M A I N S >----------
this is a list of tlds that are known to have single-letter second-level domain names. This list does not include
ccTLDs which are accepted in is_domain_name().
]]
local single_letter_2nd_lvl_domains_t = {'cash', 'company', 'foundation', 'media', 'org', 'today'};
--[[-----------< S P E C I A L C A S E T R A N S L A T I O N S >------------
This table is primarily here to support internationalization. Translations in
this table are used, for example, when an error message, category name, etc.,
is extracted from the English alias key. There may be other cases where
this translation table may be useful.
]]
local is_Latn = 'A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191';
local special_case_translation = {
author = 'author',
editor = 'editor',
name_list_params = '$1-name-list parameters', -- $1 is 'author' or 'editor'; used with err_redundant_parameters
['AuthorList'] = 'authors list', -- used to assemble maintenance category names
['ContributorList'] = 'contributors list', -- translation of these names plus translation of the base maintenance category names in maint_cats{} table below
['EditorList'] = 'editors list', -- must match the names of the actual categories
['InterviewerList'] = 'interviewers list', -- this group or translations used by name_has_ed_markup() and name_has_mult_names()
['TranslatorList'] = 'translators list',
-- Lua patterns to match pseudo-titles used by InternetArchiveBot and others as placeholder for unknown |title= value
['archived_copy'] = { -- used with CS1 maint: Archive[d] copy as title
['en'] = '^archived?%s+copy$', -- for English; translators: keep this because templates imported from en.wiki
['local'] = nil, -- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
},
-- Lua patterns to match generic titles; usually created by bots or reference filling tools
-- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
-- generic titles and patterns in this table should be lowercase only
-- leave ['local'] nil except when there is a matching generic title in your language
-- boolean 'true' for plain-text searches; 'false' for pattern searches
['generic_titles'] = {
['accept'] = {
},
['reject'] = {
{['en'] = {'^wayback%s+machine$', false}, ['local'] = nil},
{['en'] = {'are you a robot', true}, ['local'] = nil},
{['en'] = {'hugedomains', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?no +title[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'page not found', true}, ['local'] = nil},
{['en'] = {'subscribe to read', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?unknown[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'website is for sale', true}, ['local'] = nil},
{['en'] = {'^404', false}, ['local'] = nil},
{['en'] = {'error[ %-]404', false}, ['local'] = nil},
{['en'] = {'internet archive wayback machine', true}, ['local'] = nil},
{['en'] = {'log into facebook', true}, ['local'] = nil},
{['en'] = {'login • instagram', true}, ['local'] = nil},
{['en'] = {'redirecting...', true}, ['local'] = nil},
{['en'] = {'usurped title', true}, ['local'] = nil}, -- added by a GreenC bot
{['en'] = {'wayback machine', true}, ['local'] = nil},
{['en'] = {'webcite query result', true}, ['local'] = nil},
{['en'] = {'wikiwix\'s cache', true}, ['local'] = nil},
{['en'] = {'bot verification', true}, ['local'] = nil},
}
},
-- boolean 'true' for plain-text searches, search string must be lowercase only
-- boolean 'false' for pattern searches
-- leave ['local'] nil except when there is a matching generic name in your language
['generic_names'] = {
['accept'] = {
{['en'] = {'%[%[[^|]*%(author%) *|[^%]]*%]%]', false}, ['local'] = nil},
},
['reject'] = {
{['en'] = {'about us', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]dvisor%f[%A]', false}, ['local'] = nil},
{['en'] = {'allmusic', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]uthor%f[%A]', false}, ['local'] = nil},
{['en'] = {'^[Bb]ureau$', false}, ['local'] = nil},
{['en'] = {'business', true}, ['local'] = nil},
{['en'] = {'cnn', true}, ['local'] = nil},
{['en'] = {'collaborator', true}, ['local'] = nil},
{['en'] = {'^[Cc]ompany$', false}, ['local'] = nil},
{['en'] = {'contributor', true}, ['local'] = nil},
{['en'] = {'contact us', true}, ['local'] = nil},
{['en'] = {'correspondent', true}, ['local'] = nil},
{['en'] = {'^[Dd]esk$', false}, ['local'] = nil},
{['en'] = {'directory', true}, ['local'] = nil},
{['en'] = {'%f[%(%[][%(%[]%s*eds?%.?%s*[%)%]]?$', false}, ['local'] = nil},
{['en'] = {'[,%.%s]%f[e]eds?%.?$', false}, ['local'] = nil},
{['en'] = {'^eds?[%.,;]', false}, ['local'] = nil},
{['en'] = {'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]dited%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]ditors?%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]mail%f[%A]', false}, ['local'] = nil},
{['en'] = {'facebook', true}, ['local'] = nil},
{['en'] = {'google', true}, ['local'] = nil},
{['en'] = {'^[Gg]roup$', false}, ['local'] = nil},
{['en'] = {'home page', true}, ['local'] = nil},
{['en'] = {'^[Ii]nc%.?$', false}, ['local'] = nil},
{['en'] = {'instagram', true}, ['local'] = nil},
{['en'] = {'interviewer', true}, ['local'] = nil},
{['en'] = {'^[Ll]imited$', false}, ['local'] = nil},
{['en'] = {'linkedIn', true}, ['local'] = nil},
{['en'] = {'^[Nn]ews$', false}, ['local'] = nil},
{['en'] = {'[Nn]ews[ %-]?[Rr]oom', false}, ['local'] = nil},
{['en'] = {'pinterest', true}, ['local'] = nil},
{['en'] = {'policy', true}, ['local'] = nil},
{['en'] = {'privacy', true}, ['local'] = nil},
{['en'] = {'reuters', true}, ['local'] = nil},
{['en'] = {'translator', true}, ['local'] = nil},
{['en'] = {'tumblr', true}, ['local'] = nil},
{['en'] = {'twitter', true}, ['local'] = nil},
{['en'] = {'site name', true}, ['local'] = nil},
{['en'] = {'statement', true}, ['local'] = nil},
{['en'] = {'submitted', true}, ['local'] = nil},
{['en'] = {'super.?user', false}, ['local'] = nil},
{['en'] = {'%f['..is_Latn..'][Uu]ser%f[^'..is_Latn..']', false}, ['local'] = nil},
{['en'] = {'updated', true}, ['local'] = nil},
{['en'] = {'verfasser', true}, ['local'] = nil},
}
}
}
--[[--------------------------< D A T E _ N A M E S >----------------------------------------------------------
This table of tables lists local language date names and fallback English date names.
The code in Date_validation will look first in the local table for valid date names.
If date names are not found in the local table, the code will look in the English table.
Because citations can be copied to the local wiki from en.wiki, the English is
required when the date-name translation function date_name_xlate() is used.
In these tables, season numbering is defined by
Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard
defines various divisions using numbers 21-41. CS1|2 only supports generic seasons.
EDTF does support the distinction between north and south hemisphere seasons
but CS1|2 has no way to make that distinction.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
The standard does not address 'named' dates so, for the purposes of CS1|2,
Easter and Christmas are defined here as 98 and 99, which should be out of the
ISO 8601 (EDTF) range of uses for a while.
local_date_names_from_mediawiki is a boolean. When set to:
true – module will fetch local month names from MediaWiki for both date_names['local']['long'] and date_names['local']['short']; this will unconditionally overwrite manual translations
false – module will *not* fetch local month names from MediaWiki
Caveat lector: There is no guarantee that MediaWiki will provide short month names. At your wiki you can test
the results of the MediaWiki fetch in the debug console with this command (the result is alpha sorted):
=mw.dumpObject (p.date_names['local'])
While the module can fetch month names from MediaWiki, it cannot fetch the quarter, season, and named date names
from MediaWiki. Those must be translated manually.
]]
local local_date_names_from_mediawiki = true; -- when false, manual translation required for date_names['local']['long'] and date_names['local']['short']; overwrites manual translations
-- when true, module fetches long and short month names from MediaWiki
local date_names = {
['en'] = { -- English
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
-- when local_date_names_from_mediawiki = false
['local'] = { -- replace these English date names with the local language equivalents
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
['inv_local_long'] = {}, -- used in date reformatting & translation; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc.
['inv_local_short'] = {}, -- used in date reformatting & translation; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc.
['inv_local_quarter'] = {}, -- used in date translation; copy of date_names['local'].quarter where k/v are inverted: [1]='<local name>' etc.
['inv_local_season'] = {}, -- used in date translation; copy of date_names['local'].season where k/v are inverted: [1]='<local name>' etc.
['inv_local_named'] = {}, -- used in date translation; copy of date_names['local'].named where k/v are inverted: [1]='<local name>' etc.
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}, -- used to convert local language digits to Western 0-9
['xlate_digits'] = {},
}
if local_date_names_from_mediawiki then -- if fetching local month names from MediaWiki is enabled
local long_t = {};
local short_t = {};
for i=1, 12 do -- loop 12x and
local name = lang_obj:formatDate('F', '2022-' .. i .. '-1'); -- get long month name for each i
long_t[name] = i; -- save it
name = lang_obj:formatDate('M', '2022-' .. i .. '-1'); -- get short month name for each i
short_t[name] = i; -- save it
end
date_names['local']['long'] = long_t; -- write the long table – overwrites manual translation
date_names['local']['short'] = short_t; -- write the short table – overwrites manual translation
end
-- create inverted date-name tables for reformatting and/or translation
for _, invert_t in pairs {{'long', 'inv_local_long'}, {'short', 'inv_local_short'}, {'quarter', 'inv_local_quarter'}, {'season', 'inv_local_season'}, {'named', 'inv_local_named'}} do
for name, i in pairs (date_names['local'][invert_t[1]]) do -- this table is ['name'] = i
date_names[invert_t[2]][i] = name; -- invert to get [i] = 'name' for conversions from ymd
end
end
if local_digits_from_mediawiki then -- if fetching local digits from MediaWiki is enabled
local digits_t = {};
for i=0, 9 do -- loop 10x and
digits_t [lang_obj:formatNum (i)] = tostring (i); -- format the loop indexer as local lang table index and assign loop indexer (a string) as the value
end
date_names['local_digits'] = digits_t;
end
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}}
'{{ *[Uu]se +(dmy) +dates *[|}]', -- 1159k -- sorted by approximate transclusion count
'{{ *[Uu]se +(mdy) +dates *[|}]', -- 212k
'{{ *[Uu]se +(MDY) +dates *[|}]', -- 788
'{{ *[Uu]se +(DMY) +dates *[|}]', -- 343
'{{ *([Mm]dy) *[|}]', -- 176
'{{ *[Uu]se *(dmy) *[|}]', -- 156 + 18
'{{ *[Uu]se *(mdy) *[|}]', -- 149 + 11
'{{ *([Dd]my) *[|}]', -- 56
'{{ *[Uu]se +(MDY) *[|}]', -- 5
'{{ *([Dd]MY) *[|}]', -- 3
'{{ *[Uu]se(mdy)dates *[|}]', -- 1
'{{ *[Uu]se +(DMY) *[|}]', -- 0
'{{ *([Mm]DY) *[|}]', -- 0
}
local title_object = mw.title.getCurrentTitle();
local content; -- done this way so that unused templates appear in unused-template-reports; self-transcluded makes them look like they are used
if 10 ~= title_object.namespace then -- all namespaces except Template
content = title_object:getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
end
local function get_date_format ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
for _, pattern in ipairs (df_template_patterns) do -- loop through the patterns looking for {{Use dmy dates}} or {{Use mdy dates}} or any of their redirects
local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format
if match then
local use_dates_template = content:match ('%b{}', start); -- get the whole template
if use_dates_template:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length
return match:lower() .. '-' .. use_dates_template:match ('| *cs1%-dates *= *([lsy][sy]?)');
else
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df=
end
end
end
end
--[[-----------------< V O L U M E , I S S U E , P A G E S >------------------
These tables hold cite class values (from the template invocation) and identify those templates that support
|volume=, |issue=, and |page(s)= parameters. Cite conference and cite map require further qualification which
is handled in the main module.
]]
local templates_using_volume = {'citation', 'audio-visual', 'book', 'conference', 'encyclopaedia', 'interview', 'journal', 'magazine', 'map', 'news', 'report', 'techreport', 'thesis'}
local templates_using_issue = {'citation', 'conference', 'episode', 'interview', 'journal', 'magazine', 'map', 'news', 'podcast'}
local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'}
--[[
These tables control when it is appropriate for {{citation}} to render |volume= and/or |issue=. The parameter
names in the tables constrain {{citation}} so that its renderings match the renderings of the equivalent cs1
templates. For example, {{cite web}} does not support |volume= so the equivalent {{citation |website=...}} must
not support |volume=.
]]
local citation_no_volume_t = { -- {{citation}} does not render |volume= when these parameters are used
'website', 'mailinglist', 'script-website',
}
local citation_issue_t = { -- {{citation}} may render |issue= when these parameters are used
'journal', 'magazine', 'newspaper', 'periodical', 'work',
'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work',
}
--[[
Patterns for finding extra text in |volume=, |issue=, |page=, |pages=
]]
local vol_iss_pg_patterns = {
good_ppattern = '^P[^%.PpGg]', -- OK to begin with uppercase P: P7 (page 7 of section P), but not p123 (page 123); TODO: this allows 'Pages' which it should not
bad_ppatterns = { -- patterns for |page= and |pages=
'^[Pp][PpGg]?%.?[ %d]',
'^[Pp][Pp]?%. ', -- from {{p.}} and {{pp.}} templates
'^[Pp]ages?',
'^[Pp]gs.?',
},
vi_patterns_t = { -- combined to catch volume-like text in |issue= and issue-like text in |volume=
'^volumes?', -- volume-like text
'^vols?[%.:=]?',
'^issues?', --issue-like text
'^iss[%.:=]?',
'^numbers?',
'^nos?%A', -- don't match 'november' or 'nostradamus'
'^nr[%.:=]?',
'^n[%.:= ]', -- might be a valid issue without separator (space char is sep char here)
'^n°', -- 'n' with degree sign (U+00B0)
'^№', -- precomposed unicode numero character (U+2116)
},
}
--[[--------------------------< K E Y W O R D S >-------------------------------
These tables hold keywords for those parameters that have defined sets of acceptable keywords.
]]
--[[-------------------< K E Y W O R D S T A B L E >--------------------------
this is a list of keywords; each key in the list is associated with a table of
synonymous keywords possibly from different languages.
for I18N: add local-language keywords to value table; do not change the key.
For example, adding the German keyword 'ja':
['affirmative'] = {'yes', 'true', 'y', 'ja'},
Because CS1|2 templates from en.wiki articles are often copied to other local wikis,
it is recommended that the English keywords remain in these tables.
]]
local keywords = {
['amp'] = {'&', 'amp', 'ampersand'}, -- |name-list-style=
['and'] = {'and', 'serial'}, -- |name-list-style=
['affirmative'] = {'yes', 'true', 'y'}, -- |no-tracking=, |no-pp= -- Used by InternetArchiveBot
['afterword'] = {'afterword'}, -- |contribution=
['bot: unknown'] = {'bot: unknown'}, -- |url-status= -- Used by InternetArchiveBot
['cs1'] = {'cs1'}, -- |mode=
['cs2'] = {'cs2'}, -- |mode=
['dead'] = {'dead', 'deviated'}, -- |url-status= -- Used by InternetArchiveBot
['dmy'] = {'dmy'}, -- |df=
['dmy-all'] = {'dmy-all'}, -- |df=
etal = {'etal'}, -- |display-authors=, etc
['foreword'] = {'foreword'}, -- |contribution=
['free'] = {'free'}, -- |<id>-access= -- Used by InternetArchiveBot
['harv'] = {'harv'}, -- |ref=; this no longer supported; is_valid_parameter_value() called with <invert> = true
['introduction'] = {'introduction'}, -- |contribution=
['limited'] = {'limited'}, -- |url-access= -- Used by InternetArchiveBot
['live'] = {'live'}, -- |url-status= -- Used by InternetArchiveBot
['mdy'] = {'mdy'}, -- |df=
['mdy-all'] = {'mdy-all'}, -- |df=
['none'] = {'none'}, -- |postscript=, |ref=, |title=, |type= -- Used by InternetArchiveBot
['off'] = {'off'}, -- |title= (potentially also: |title-link=, |postscript=, |ref=, |type=)
['preface'] = {'preface'}, -- |contribution=
['registration'] = {'registration'}, -- |url-access= -- Used by InternetArchiveBot
['subscription'] = {'subscription'}, -- |url-access= -- Used by InternetArchiveBot
['unfit'] = {'unfit'}, -- |url-status= -- Used by InternetArchiveBot
['usurped'] = {'usurped'}, -- |url-status= -- Used by InternetArchiveBot
['vanc'] = {'vanc'}, -- |name-list-style=
['ymd'] = {'ymd'}, -- |df=
['ymd-all'] = {'ymd-all'}, -- |df=
-- ['yMd'] = {'yMd'}, -- |df=; not supported at en.wiki
-- ['yMd-all'] = {'yMd-all'}, -- |df=; not supported at en.wiki
}
--[[------------------------< X L A T E _ K E Y W O R D S >---------------------
this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{}
become the keys in keywords_xlate{} and the keys from keywords{} become the values in keywords_xlate{}:
['affirmative'] = {'yes', 'true', 'y'}, -- in keywords{}
becomes
['yes'] = 'affirmative', -- in keywords_xlate{}
['true'] = 'affirmative',
['y'] = 'affirmative',
the purpose of this function is to act as a translator between a non-English keyword and its English equivalent
that may be used in other modules of this suite
]]
local function xlate_keywords ()
local out_table = {}; -- output goes here
for k, keywords_t in pairs (keywords) do -- spin through the keywords table
for _, keyword in ipairs (keywords_t) do -- for each keyword
out_table[keyword] = k; -- create an entry in the output table where keyword is the key
end
end
return out_table;
end
local keywords_xlate = xlate_keywords (); -- the list of translated keywords
--[[----------------< M A K E _ K E Y W O R D S _ L I S T >---------------------
this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter.
keywords_lists{}, is a table of tables from keywords{}
]]
local function make_keywords_list (keywords_lists)
local out_table = {}; -- output goes here
for _, keyword_list in ipairs (keywords_lists) do -- spin through keywords_lists{} and get a table of keywords
for _, keyword in ipairs (keyword_list) do -- spin through keyword_list{} and add each keyword, ...
table.insert (out_table, keyword); -- ... as plain text, to the output list
end
end
return out_table;
end
--[[----------------< K E Y W O R D S _ L I S T S >-----------------------------
this is a list of lists of valid keywords for the various parameters in [key].
Generally the keys in this table are the canonical en.wiki parameter names though
some are contrived because of use in multiple differently named parameters:
['yes_true_y'], ['id-access'].
The function make_keywords_list() extracts the individual keywords from the
appropriate list in keywords{}.
The lists in this table are used to validate the keyword assignment for the
parameters named in this table's keys.
]]
local keywords_lists = {
['yes_true_y'] = make_keywords_list ({keywords.affirmative}),
['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}),
['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}),
-- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki
['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}),
['name-list-style'] = make_keywords_list ({keywords.amp, keywords['and'], keywords.vanc}),
['ref'] = make_keywords_list ({keywords.harv}), -- inverted check; |ref=harv no longer supported
['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}),
['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}),
['id-access'] = make_keywords_list ({keywords.free}),
}
--[[--------------------------< C S 1 _ C O N F I G _ G E T >--------------------------------------------------
fetch and validate values from {{cs1 config}} template to fill <global_cs1_config_t>
no error messages; when errors are detected, the parameter value from {{cs1 config}} is blanked.
Supports all parameters and aliases associated with the metaparameters: DisplayAuthors, DisplayContributors,
DisplayEditors, DisplayInterviewers, DisplayTranslators, NameListStyle, and Mode. The DisplayWhatever metaparameters
accept numeric values only (|display-authors=etal and the like is not supported).
]]
local global_cs1_config_t = {}; -- TODO: add value returned from get_date_format() to this table?
local function get_cs1_config ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
local start = content:find('{{ *[Cc][Ss]1 config *[|}]'); -- <start> is offset into <content> when {{cs1 config}} found; nil else
if start then
local cs1_config_template = content:match ('%b{}', start); -- get the whole template
if not cs1_config_template then
return nil;
end
local params_t = mw.text.split (cs1_config_template:gsub ('^{{%s*', ''):gsub ('%s*}}$', ''), '%s*|%s*'); -- remove '{{' and '}}'; make a sequence of parameter/value pairs (split on the pipe)
table.remove (params_t, 1); -- remove the template name because it isn't a parameter/value pair
local config_meta_params_t = {'DisplayAuthors', 'DisplayContributors', 'DisplayEditors', 'DisplayInterviewers', 'DisplayTranslators', 'NameListStyle', 'Mode'};
local meta_param_map_t = {}; -- list of accepted parameter names usable in {{cs1 config}} goes here
for _, meta_param in ipairs (config_meta_params_t) do -- for i18n using <config_meta_params_t>, map template parameter names to their metaparameter equivalents
if 'table' == type (aliases[meta_param]) then -- if <meta_param> is a sequence,
for _, param in ipairs (aliases[meta_param]) do -- extract its contents
meta_param_map_t[param] = meta_param; -- and add to <meta_param_map_t>
end
else
meta_param_map_t[aliases[meta_param]] = meta_param; -- not a sequence so just add the parameter to <meta_param_map_t>
end
end
local keywords_t = {}; -- map valid keywords to their associate metaparameter; reverse form of <keyword_lists[key] for these metaparameters
for _, metaparam_t in ipairs ({{'NameListStyle', 'name-list-style'}, {'Mode', 'mode'}}) do -- only these metaparameter / keywords_lists key pairs
for _, keyword in ipairs (keywords_lists[metaparam_t[2]]) do -- spin through the list of keywords
keywords_t[keyword] = metaparam_t[1]; -- add [keyword] = metaparameter to the map
end
end
for _, param in ipairs (params_t) do -- spin through the {{cs1 config}} parameters and fill <global_cs1_config_t>
local k, v = param:match ('([^=]-)%s*=%s*(.+)'); -- <k> is the parameter name; <v> is parameter's assigned value
if k then
if k:find ('^display') then -- if <k> is one of the |display-<namelist>= parameters
if v:match ('%d+') then -- the assigned value must be digits; doesn't accept 'etal'
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the display param and its value to globals table
end
else
if keywords_t[v] == meta_param_map_t[k] then -- keywords_t[v] returns nil or the metaparam name; these must be the same
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the parameter and its value to globals table
end
end
end
end
end
end
get_cs1_config (); -- fill <global_cs1_config_t>
--[[---------------------< S T R I P M A R K E R S >----------------------------
Common pattern definition location for stripmarkers so that we don't have to go
hunting for them if (when) MediaWiki changes their form.
]]
local stripmarkers = {
['any'] = '\127[^\127]*UNIQ%-%-(%a+)%-[%a%d]+%-QINU[^\127]*\127', -- capture returns name of stripmarker
['math'] = '\127[^\127]*UNIQ%-%-math%-[%a%d]+%-QINU[^\127]*\127' -- math stripmarkers used in coins_cleanup() and coins_replace_math_stripmarker()
}
--[[------------< I N V I S I B L E _ C H A R A C T E R S >---------------------
This table holds non-printing or invisible characters indexed either by name or
by Unicode group. Values are decimal representations of UTF-8 codes. The table
is organized as a table of tables because the Lua pairs keyword returns table
data in an arbitrary order. Here, we want to process the table from top to bottom
because the entries at the top of the table are also found in the ranges specified
by the entries at the bottom of the table.
Also here is a pattern that recognizes stripmarkers that begin and end with the
delete characters. The nowiki stripmarker is not an error but some others are
because the parameter values that include them become part of the template's
metadata before stripmarker replacement.
]]
local invisible_defs = {
del = '\127', -- used to distinguish between stripmarker and del char
zwj = '\226\128\141', -- used with capture because zwj may be allowed
}
local invisible_chars = {
{'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD
{'zero width joiner', '('.. invisible_defs.zwj .. ')'}, -- U+200D, E2 80 8D; capture because zwj may be allowed
{'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B
{'hair space', '\226\128\138'}, -- U+200A, E2 80 8A
{'soft hyphen', '\194\173'}, -- U+00AD, C2 AD
{'horizontal tab', '\009'}, -- U+0009 (HT), 09
{'line feed', '\010'}, -- U+000A (LF), 0A
{'no-break space', '\194\160'}, -- U+00A0 (NBSP), C2 A0
{'carriage return', '\013'}, -- U+000D (CR), 0D
{'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type
{'delete', '('.. invisible_defs.del .. ')'}, -- U+007F (DEL), 7F; must be done after stripmarker test; capture to distinguish isolated del chars not part of stripmarker
{'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D))
{'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F
-- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF
-- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF
-- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD
-- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD
}
--[[
Indic script makes use of zero width joiner as a character modifier so zwj
characters must be left in. This pattern covers all of the unicode characters
for these languages:
Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf
Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf
Bengali 0980–09FF – https://unicode.org/charts/PDF/U0980.pdf
Gurmukhi 0A00–0A7F – https://unicode.org/charts/PDF/U0A00.pdf
Gujarati 0A80–0AFF – https://unicode.org/charts/PDF/U0A80.pdf
Oriya 0B00–0B7F – https://unicode.org/charts/PDF/U0B00.pdf
Tamil 0B80–0BFF – https://unicode.org/charts/PDF/U0B80.pdf
Telugu 0C00–0C7F – https://unicode.org/charts/PDF/U0C00.pdf
Kannada 0C80–0CFF – https://unicode.org/charts/PDF/U0C80.pdf
Malayalam 0D00–0D7F – https://unicode.org/charts/PDF/U0D00.pdf
plus the not-necessarily Indic scripts for Sinhala and Burmese:
Sinhala 0D80-0DFF - https://unicode.org/charts/PDF/U0D80.pdf
Myanmar 1000-109F - https://unicode.org/charts/PDF/U1000.pdf
Myanmar extended A AA60-AA7F - https://unicode.org/charts/PDF/UAA60.pdf
Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf
the pattern is used by has_invisible_chars() and coins_cleanup()
]]
local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]';
-- list of emoji that use a zwj character (U+200D) to combine with another emoji
-- from: https://www.unicode.org/Public/18.0.0/emoji/emoji-zwj-sequences.txt; version: 18.0; 2026-01-09
-- table created by: [[:en:Module:Make emoji zwj table]]
local emoji_t = { -- indexes are decimal forms of the hex values in U+xxxx
[8596] = true, -- U+2194 ↔ left right arrow
[8597] = true, -- U+2195 ↕ up down arrow
[9760] = true, -- U+2620 ☠ skull and crossbones
[9792] = true, -- U+2640 ♀ female sign
[9794] = true, -- U+2642 ♂ male sign
[9877] = true, -- U+2695 ⚕ staff of aesculapius
[9878] = true, -- U+2696 ⚖ scales
[9895] = true, -- U+26A7 ⚧ male with stroke and male and female sign
[9992] = true, -- U+2708 ✈ airplane
[10052] = true, -- U+2744 ❄ snowflake
[10084] = true, -- U+2764 ❤ heavy black heart
[10145] = true, -- U+27A1 ➡ black rightwards arrow
[11035] = true, -- U+2B1B ⬛ black large square
[127752] = true, -- U+1F308 🌈 rainbow
[127787] = true, -- U+1F32B 🌫 fog
[127806] = true, -- U+1F33E 🌾 ear of rice
[127859] = true, -- U+1F373 🍳 cooking
[127868] = true, -- U+1F37C 🍼 baby bottle
[127876] = true, -- U+1F384 🎄 christmas tree
[127891] = true, -- U+1F393 🎓 graduation cap
[127908] = true, -- U+1F3A4 🎤 microphone
[127912] = true, -- U+1F3A8 🎨 artist palette
[127979] = true, -- U+1F3EB 🏫 school
[127981] = true, -- U+1F3ED 🏭 factory
[128048] = true, -- U+1F430 🐰 rabbit face
[128102] = true, -- U+1F466 👦 boy
[128103] = true, -- U+1F467 👧 girl
[128104] = true, -- U+1F468 👨 man
[128105] = true, -- U+1F469 👩 woman
[128139] = true, -- U+1F48B 💋 kiss mark
[128165] = true, -- U+1F4A5 💥 collision symbol
[128168] = true, -- U+1F4A8 💨 dash symbol
[128171] = true, -- U+1F4AB 💫 dizzy symbol
[128187] = true, -- U+1F4BB 💻 personal computer
[128188] = true, -- U+1F4BC 💼 brief case
[128293] = true, -- U+1F525 🔥 fire
[128295] = true, -- U+1F527 🔧 wrench
[128300] = true, -- U+1F52C 🔬 microscope
[128488] = true, -- U+1F5E8 🗨 left speech bubble
[128640] = true, -- U+1F680 🚀 rocket
[128658] = true, -- U+1F692 🚒 fire engine
[129001] = true, -- U+1F7E9 🟩 large green square
[129003] = true, -- U+1F7EB 🟫 large brown square
[129309] = true, -- U+1F91D 🤝 handshake
[129455] = true, -- U+1F9AF 🦯 probing cane
[129456] = true, -- U+1F9B0 🦰 emoji component red hair
[129457] = true, -- U+1F9B1 🦱 emoji component curly hair
[129458] = true, -- U+1F9B2 🦲 emoji component bald
[129459] = true, -- U+1F9B3 🦳 emoji component white hair
[129466] = true, -- U+1F9BA 🦺 safety vest
[129468] = true, -- U+1F9BC 🦼 motorized wheelchair
[129469] = true, -- U+1F9BD 🦽 manual wheelchair
[129489] = true, -- U+1F9D1 🧑 adult
[129490] = true, -- U+1F9D2 🧒 child
[129648] = true, -- U+1FA70 🩰 ballet shoes
[129657] = true, -- U+1FA79 🩹 adhesive bandage
[129775] = true, -- U+1FAEF fight cloud
[129778] = true, -- U+1FAF2 🫲 leftwards hand
}
--[[----------------------< L A N G U A G E S U P P O R T >-------------------
These tables and constants support various language-specific functionality.
]]
local this_wiki_code = lang_obj:getCode(); -- get this wiki's language code
if string.match (mw.site.server, 'wikidata') then
this_wiki_code = mw.getCurrentFrame():callParserFunction('int', {'lang'}); -- on Wikidata so use interface language setting instead
end
local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_code, 'all'); -- get a table of language tag/name pairs known to Wikimedia; used for interwiki tests
local mw_languages_by_name_t = {};
for k, v in pairs (mw_languages_by_tag_t) do -- build a 'reversed' table name/tag language pairs know to MediaWiki; used for |language=
v = mw.ustring.lower (v); -- lowercase for tag fetch; get name's proper case from mw_languages_by_tag_t[<tag>]
if mw_languages_by_name_t[v] then -- when name already in the table
if 2 == #k or 3 == #k then -- if tag does not have subtags
mw_languages_by_name_t[v] = k; -- prefer the shortest tag for this name
end
else -- here when name not in the table
mw_languages_by_name_t[v] = k; -- so add name and matching tag
end
end
local inter_wiki_map = {}; -- map of interwiki prefixes that are language-code prefixes
for k, v in pairs (mw.site.interwikiMap ('local')) do -- spin through the base interwiki map (limited to local)
if mw_languages_by_tag_t[v["prefix"]] then -- if the prefix matches a known language tag
inter_wiki_map[v["prefix"]] = true; -- add it to our local map
end
end
--[[--------------------< S C R I P T _ L A N G _ C O D E S >-------------------
This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character
language codes that apply only to |script-title= and |script-chapter=
]]
local script_lang_codes = {
'ab', 'am', 'ar', 'as', 'az', 'be', 'bg', 'bn', 'bo', 'bs', 'ce', 'chr',
'cu', 'dv', 'dz', 'el', 'fa', 'grc', 'gu', 'he', 'hi', 'hy', 'ja', 'ka',
'kaa', 'kk', 'km', 'kn', 'ko', 'ku', 'ky', 'lo', 'mk', 'ml', 'mn', 'mni',
'mr', 'my', 'ne', 'or', 'ota', 'pa', 'ps', 'ru', 'sd', 'si', 'sr', 'syc',
'ta', 'te', 'tg', 'th', 'ti', 'tkr', 'tt', 'ug', 'uk', 'ur', 'uz', 'yi',
'yue', 'zh', 'zgh'
};
--[[---------------< L A N G U A G E R E M A P P I N G >----------------------
These tables hold language information that is different (correct) from MediaWiki's definitions
For each ['<tag>'] = 'language name' in lang_tag_remap{} there must be a matching ['language name'] = {'language name', '<tag>'} in lang_name_remap{}
lang_tag_remap{}:
key is always lowercase ISO 639-1, -2, -3 language tag or a valid lowercase IETF language tag
value is properly spelled and capitalized language name associated with <tag>
only one language name per <tag>;
key/value pair must have matching entry in lang_name_remap{}
lang_name_remap{}:
key is always lowercase language name
value is a table the holds correctly spelled and capitalized language name [1] and associated tag [2] (tag must match a tag key in lang_tag_remap{})
may have multiple keys referring to a common preferred name and tag; For example:
['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh'
]]
local lang_tag_remap = { -- used for |language= and |script-title= / |script-chapter=
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bla'] = 'Blackfoot', -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan
['fkv'] = 'Kven', -- MediaWiki returns Kvensk
['gsw'] = 'Swiss German',
['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name
['ksh-x-colog'] = 'Colognian', -- override MediaWiki ksh; no IANA/ISO 639 code for Colognian; IETF private code created at Module:Lang/data
['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data
['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name
['sr-ec'] = 'Serbian (Cyrillic script)', -- MediaWiki returns српски (ћирилица)
['sr-el'] = 'Serbian (Latin script)', -- MediaWiki returns srpski (latinica)
['tet'] = 'Tetun', -- MediaWiki returns Tetum
}
local lang_name_remap = { -- used for |language=; names require proper capitalization; tags must be lowercase
['alemannic'] = {'Swiss German', 'gsw'}, -- ISO 639-2, -3 alternate for Swiss German; MediaWiki mediawiki returns Alemannic for gsw; en.wiki preferred name
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh
['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö)
['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name
['kven'] = {'Kven', 'fkv'}, -- Unicode CLDR have decided not to support English language name for these two...
['kvensk'] = {'Kven', 'fkv'}, -- ...they say to refer to IANA registry for English names
['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639
['serbian (cyrillic script)'] = {'Serbian (Cyrillic script)', 'sr-cyrl'}, -- special case to get correct tag when |language=sr-ec
['serbian (latin script)'] = {'Serbian (Latin script)', 'sr-latn'}, -- special case to get correct tag when |language=sr-el
['swiss german'] = {'Swiss German', 'gsw'},
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan-tw'}, -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese
['tetum'] = {'Tetun', 'tet'},
['tetun'] = {'Tetun', 'tet'},
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found
['valencian'] = {'Valencian', 'ca-valencia'}, -- variant of Catalan; categorizes as Valencian
}
--[[---------------< P R O P E R T I E S _ C A T E G O R I E S >----------------
Properties categories. These are used for investigating qualities of citations.
]]
local prop_cats = {
['foreign-lang-source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is foreign-language name, $2 is ISO639-1 code
['foreign-lang-source-2'] = 'CS1 foreign language sources (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code used as a sort key
['interproj-linked-name'] = 'CS1 interproject-linked names|$1', -- any author, editor, etc that has an interproject link; $1 is interproject tag used as a sort key
['interwiki-linked-name'] = 'CS1 interwiki-linked names|$1', -- any author, editor, etc that has an interwiki link; $1 is interwiki tag used as a sort key; yeilds to interproject
['local-lang-source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is local-language name, $2 is ISO639-1 code; not emitted when local_lang_cat_enable is false
['location-test'] = 'CS1 location test',
['long-vol'] = 'CS1: long volume value', -- probably temporary cat to identify scope of |volume= values longer than 4 characters
['script'] = 'CS1 uses $1-language script ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is language tag
['tracked-param'] = 'CS1 tracked parameter: $1', -- $1 is base (enumerators removed) parameter name
['unfit'] = 'CS1: unfit URL', -- |url-status=unfit or |url-status=usurped; used to be a maint cat
['vanc-accept'] = 'CS1:Vancouver names with accept markup', -- for |vauthors=/|veditors= with accept-as-written markup
['year-range-abbreviated'] = 'CS1: abbreviated year range', -- probably temporary cat to identify scope of |date=, |year= values using YYYY–YY form
}
--[[-------------------< T I T L E _ T Y P E S >--------------------------------
Here we map a template's CitationClass to TitleType (default values for |type= parameter)
]]
local title_types = {
['AV-media-notes'] = 'Media notes',
['document'] = 'Document',
['interview'] = 'Interview',
['mailinglist'] = 'Mailing list',
['map'] = 'Map',
['podcast'] = 'Podcast',
['pressrelease'] = 'Press release',
['report'] = 'Report',
['speech'] = 'Speech',
['techreport'] = 'Technical report',
['thesis'] = 'Thesis',
}
--[[--------------------------< B U I L D _ K N O W N _ F R E E _ D O I _ R E G I S T R A N T S _ T A B L E >--
build a table of doi registrants known to be free-to-read In a doi, the registrant ID is the series of digits
between the '10.' and the first '/': in doi 10.1100/sommat, 1100 is the registrant ID
see §3.2.2 DOI prefix of the Doi Handbook p. 43
https://www.doi.org/doi-handbook/DOI_Handbook_Final.pdf#page=43
]]
local function build_free_doi_registrants_table()
local registrants_t = {};
for _, v in ipairs ({
'1045', '1074', '1096', '1100', '1155', '1186', '1194', '1371', '1613', '1629', '1989', '1999', '2147', '2196', '3114', '3285', --for 10.1155/... ISRN prior to 2007 should not be flagged--
'3389', '3390', '3767', '3906', '3748', '3814', '3847', '3897', '4061', '4089', '4102', '4103', '4172', '4175', '4230', '4236', '4239',
'4240', '4249', '4251', '4252', '4253', '4254', '4291', '4292', '4312', '4329', '4330', '4331', '5070', '5074', '5086', '5194', '5210',
'5306', '5312', '5313', '5314', '5315', '5316', '5317', '5318', '5319', '5320', '5321', '5334', '5402', '5409', '5410', '5411',
'5412', '5492', '5493', '5494', '5495', '5496', '5497', '5498', '5499', '5500', '5501', '5527', '5528', '5662', '6064', '6219',
'7167', '7217', '7287', '7482', '7490', '7554', '7717', '7759', '7766', '9778',
'11131', '11569', '11647', '11648', '12688', '12703', '12715', '12942', '12998', '13105', '14256', '14293', '14303', '14502', '14720',
'15215', '15227', '15292', '15458', '15347', '15412', '15560', '16995', '17573', '17645', '18553', '18637', '18757', '19080', '19173',
'20419', '20944', '21037', '21105', '21468', '21767', '21425', '22261', '22323', '22459', '24105', '24196', '24404', '24413', '24966',
'26529', '26614', '26775', '26873', '30845', '32545', '34291', '34641', '35711', '35712', '35713', '35995', '36648', '37126', '37532',
'37871', '47128', '47622', '47959', '48438', '51741', '51746', '51935', '51936', '51937', '51938', '51939', '51940', '52165', '52437',
'52975', '53288', '53347', '54081', '54947', '55295', '55667', '55741', '55914', '56042', '57009', '58647', '58782', '59081', '59490',
'61375', '66183', '70587',
}) do
registrants_t[v] = true; -- build a k/v table of known free-to-read doi registrants
end
return registrants_t;
end
-- known free registrants identifiable by the doi suffix incipit
local extended_registrants_t = { -- doi suffix incipits are evaluated as lua patterns
['1001'] = {'jamanetworkopen', 'jamahealthforum'}, -- JAMA Network Open, JAMA Health Forum
['1002'] = {'1878-0261', '2056-4538', '2211-5463', '2475-8876', '2688-8319', 'aaai%.', 'aac2%.', 'ache%.', 'acm2%.', 'acn3%.', 'acr2%.', 'admi%.', 'adpr%.', 'adrr%.', 'adsr%.', 'advs%.', 'ael2%.', 'aelm%.', 'aesr%.', 'aff2%.', 'agf2%.', 'agg2%.', 'agm2%.', 'ags3%.', 'agt2%.', 'aidi%.', 'ail2%.', 'aisy%.', 'aiv2%.', 'alz%.', 'ame2%.', 'ams2%.', 'anbr%.', 'ansa%.', 'apj%.', 'app5%.', 'aps3%.', 'apxr%.', 'aro2%.', 'ars2%.', 'asl2%.', 'atn2%.', 'bco2%.', 'bes2%.', 'bmm2%.', 'bod2%.', 'brb3%.', 'brh2%.', 'brx2%.', 'bsa3%.', 'bte2%.', 'btm2%.', 'cai2%.', 'cam4%.', 'cbh2%.', 'ccr3%.', 'ccs3%.', 'cdt3%.', 'celc%.', 'cep4%.', 'ces2%.', 'cesm%.', 'ceur%.', 'cey2%.', 'cfch%.', 'cfp2%.', 'cin4%.', 'clc%.', 'clem%.', 'cli2%.', 'clt2%.', 'cmt2%.', 'cmtd%.', 'cnl2%.', 'cnr2%.', 'cns%.', 'cns3%.', 'cnx2%.', 'cre2%.', 'csc3%.', 'cso2%.', 'ctd2%.', 'cti2%.', 'ctm2%.', 'dad2%.', 'deo2%.', 'dep2%.', 'dni2%.', 'dro2%.', 'dug2%.', 'dvr2%.', 'eas2%.', 'ece2%.', 'ece3%.', 'ecog%.', 'ecs2%.', 'edm2%.', 'edn3%.', 'eem2%.', 'eer3%.', 'efd2%.', 'ejsc%.', 'elsa%.', 'elt2%.', 'eng2%.', 'eom2%.', 'epi4%.', 'epr2%.', 'ese3%.', 'exp%.', 'fbe2%.', 'fci2%.', 'fer3%.', 'fes3%.', 'fft2%.', 'fhu2%.', 'fle2%.', 'flm2%.', 'fob2%.', 'fpf2%.', 'fsh3%.', 'fsn3%.', 'gcb4%.', 'gch2%.', 'gdj3%.', 'geo2%.', 'ggn2%.', 'gin2%.', 'glr2%.', 'gps3%.', 'gtm2%.', 'hbm%.', 'hcs2%.', 'hem3%.', 'hkj2%.', 'hsr2%.', 'ibra%.', 'idm2%.', 'ifm2%.', 'iid3%.', 'iju5%.', 'ila2%.', 'imed%.', 'imm3%.', 'imo2%.', 'imt2%.', 'inc2%.', 'inc3%.', 'inf2%.', 'inm3%.', 'inmd%.', 'ird3%.', 'ise3%.', 'jaa2%.', 'jav%.', 'jbt%.', 'jcc5%.', 'jcla%.', 'jcsm%.', 'jcv2%.', 'jeo2%.', 'jev2%.', 'jex2%.', 'jfa2%.', 'jgf2%.', 'jgh3%.', 'jha2%.', 'jia2%.', 'jmd2%.', 'jmrs%.', 'joa3%.', 'jpr3%.', 'jsf2%.', 'jsp2%.', 'jvc2%.', 'kjm2%.', 'kot2%.', 'lci2%.', 'ldr%.', 'leap%.', 'leg3%.', 'lim2%.', 'lio2%.', 'loe2%.', 'lol2%.', 'lrh2%.', 'mame%.', 'mba2%.', 'mbo3%.', 'mco2%.', 'mdb2%.', 'mdr2%.', 'med4%.', 'mef2%.', 'met%.', 'metm%.', 'mgea%.', 'mgg3%.', 'mhs2%.', 'mlf2%.', 'mmr3%.', 'moda%.', 'mog2%.', 'mpr%.', 'mps2%.', 'msd2%.', 'nam2%.', 'nano%.', 'nap2%.', 'neo2%.', 'nep3%.', 'njb%.', 'nop2%.', 'npp2%.', 'npr2%.', 'ntls%.', 'open%.', 'orm2%.', 'osp4%.', 'oto2%.', 'pan3%.', 'pchj%.', 'pcn5%.', 'pdi3%.', 'ped4%.', 'pei3%.', 'pfm2%.', 'pgr2%.', 'phmt%.', 'pld3%.', 'pls2%.', 'pmf2%.', 'pne2%.', 'pnp%.', 'poh2%.', 'ppj2%.', 'ppp3%.', 'prm2%.', 'pro6%.', 'prp2%.', 'psp4%.', 'puh2%.', 'pul2%.', 'qub2%.', 'rai2%.', 'rar2%.', 'rco2%.', 'rcr2%.', 'rfc2%.', 'rmb2%.', 'rpm2%.', 'rse2%.', 'rvr2%.', 'sae2%.', 'sen2%.', 'sfp2%.', 'smb2%.', 'smm2%.', 'smmd%.', 'smo2%.', 'smsc%.', 'sst2%.', 'sst3%.', 'sstr%.', 'sus2%.', 'tch2%.', 'tcr4%.', 'tpg2%.', 'trc2%.', 'tre%.', 'uar2%.', 'ueg2%.', 'uro2%.', 'viw2%.', 'vms3%.', 'vro2%.', 'vzj2%.', 'we%.', 'wjo2%.', 'wlb3%.', 'wll2%.'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1007'] = {'s12543', 's40565'}, -- Fuzzy Information and Engineering, Journal of Modern Power Systems and Clean Energy
['1016'] = {'j%.aace', 'j%.aed', 'j%.aiopen', 'j%.animal', 'j%.apsb', -- AACE Endocrinology and Diabetes, AACE Endocrinology and Diabetes, AI Open, Animal, Acta Pharmaceutica Sinica B
'j%.addicn', 'j%.abrep', 'j%.eurpsy', 'j%.fob', 'j%.gpb', 'j%.heliyon', -- Addiction Neuroscience, Addictive Behaviors Reports, European Psychiatry, FEBS Open Bio, Genomics, Proteomics & Bioinformatics after 2015, Heliyon
'j%.mucimm%.', 'j%.nlp', 'j%.patter', 'j%.proche', 'j%.vgie', -- Mucosal Immunology, Natural Language Processing, Patterns, Procedia Chemistry, VideoGIE
's1004-4132', 's1007-0214', 's1672-0229', 's1933-0219'}, -- Journal of Systems Engineering and Electronics, Tsinghua Science and Technology, Genomics, Proteomics & Bioinformatics before 2015, Mucosal Immunology
['1017'] = {'apj%.', 'nlp', 'mdh', 'S09249338', 'S15574660'}, -- Natural Language Processing Journal, Medical History, European Psychiatry, Asia Pacific Journal
['1021'] = {'acscentsci%.', 'acs%.chas%.', 'acsomega%.', 'jacsau%.',
'acsbiomedchemau%.', 'acsengineeringau%.', 'acsenvironau%.',
'acsmaterialsau%.', 'acsmeasuresciau%.', 'acsnanoscienceau%.',
'acsorginorgau%.', 'acsphyschemau%.', 'acspolymersau%.',
'aps%.', 'cbe%.', 'cbmi%.', 'envhealth%.', 'ehp%.', 'photonsci%.',
'polymscitech%.', 'prechem%.'}, -- ACS journals
['1029'] = {'2025cn', '2025csj', '2025ea', '2025gc', '2025gh', '2025ms', '2025sw', '2025wr', '2026ef', '2026gl', '2026jh', 'aga2.70129'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1038'] = {'41541%.', '43246%.', 'asiamat%.', 'boneres%.', 'cddis%.', 'cddiscovery%.', 'celldisc%.', 'mi%.', 'ncomms', 'nutd%.', 'oncsis%.', 'srep', 's40494', 's41377', 's41392', 's41396', 's41398', 's41405', 's41407', 's41408', 's41439', 's41467', 's41514', 's41522', 's41523', 's41524', 's41525', 's41526', 's41528', 's41529', 's41531', 's41533', 's41534', 's41535', 's41536', 's41537', 's41538', 's41539', 's41540', 's41545', 's41598', 's41612', 's41698', 's41699', 's41746', 's42003', 's42004', 's42005', 's42949', 's43247', 's43705', 's43856', 's44168', 's44172', 's44182', 's44183', 's44184', 's44185', 's44259', 's44260', 's44264', 's44271', 's44276', 's44294', 's44296', 's44298', 's44303', 's44304', 's44306', 's44310', 's44323', 's44324', 's44325', 's44328', 's44333', 's44334', 's44335', 's44341', 's44355', 's44383', 's44384', 's44385', 's44386', 's44387', 's44400', 's44401', 's44406', 's44407', 's44431', 's44432', 's44433', 's44434', 's44435', 's44440', 's44453', 's44454', 's44455', 's44456', 's44458', 's44459', 's44482', 's44484', 's44485', 's44488', 's44513', 's44528', 'sdata%.'}, -- Nature journals (npj series, Communications series, and many others, see https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&diff=prev&oldid=1368822567 and https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&diff=next&oldid=1368822567)
['1046'] = {'j%.1365-8711', 'j%.1365-246x'}, -- MNRAS, GJI
['1049'] = {'aie2%.', 'blc2%.', 'bme2', 'bsb2%.', 'ccs2%.', 'cds2', 'cdt2', 'cim2%.', 'cit2%.', 'cje%.', 'cmu2%.', 'cps2%.', 'csy2%.', 'cth2%.', 'cvi2%.', 'dgt2%.', 'ein2%.', 'ell2%.', 'elp2%.', 'els2', 'ema3%.', 'enb2%.', 'enc2%.', 'esi2%.', 'gtd2%.', 'htl2%.', 'hve2%.', 'ipr2%.', 'ise2', 'itr2%.', 'mia2%.', 'mna2%.', 'nbt2', 'nde2%.', 'ntw2%.', 'ote2%.', 'pel2%.', 'qtc2%.', 'rpg2%.', 'rsn2%.', 'ses2%.', 'sfw2', 'sil2', 'smc2%.', 'smt2%.', 'stg2%.', 'syb2%.', 'tje2%.', 'wss2%.'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1051'] = {'0004-6361','parasite'}, -- Astronomy & Astrophysics, Parasite
['1057'] = {'s41599'}, -- Humanities and Social Sciences Communications
['1080'] = {'14399776'}, -- International Journal of Fluid Power
['1090'] = {'cams', 'ecgd', 's1088-4173', 'ert', 's1088-4165', 's2330-1511',-- Free AMS journals
'bproc', 's2330-0000', 'btran', 'noti'},
['1093'] = {'asjof', 'bjro', 'bjsopen', 'ehjopen', 'hropen ', 'jamiaopen', 'ofid', 'oxfclm', -- Aesthetic Surgery Journal Open Forum, BJR Open, BJS Open, European Heart Journal Open, Human Reproduction Open, JAMIA Open, Open Forum Infectious Diseases, Oxford Open Climate Change
'oodh', 'ooec', 'ooenergy', 'oxfimm', 'ooih', 'oxfmat', 'oons', --Oxford Open Digital Health, Oxford Open Economics, Oxford Open Energy, Oxford Open Immunology, Oxford Open Infrastructure and Health, Oxford Open Materials Science, Oxford Open Neuroscience
'qopen', 'schizbullopen', 'mnras', 'mnrasl', 'gji', 'pnasnexus',-- Q Open, Schizophrenia Bulletin Open, MNRAS, MNRAS Letters, GJI, PNAS Nexus
'rasti', 'ismeco', 'ismejo'}, -- RASTI, ISME Communications, ISME Journal
['1096'] = {'fba%.'}, -- FASEB BioAdvances
['1098'] = {'rsbm', 'rsob', 'rsos'}, -- Biographical Memoirs of Fellows of the Royal Society, Open Biology, Royal Society Open Science
['1099'] = {'acmi', 'mic', '00221287', 'mgen'}, -- Access Microbiology, Microbiology, Journal of General Microbiology, Microbial Genomics
['1107'] = {'S20569890', 'S20522525', 'S16005775', 'S24143146'}, -- Acta Crystallographica E, IUCrJ, Journal of Synchrotron Radiation, IUCrData
['1109'] = {'access%.', 'ieeedata%.', 'jeds%.', 'jispin%.', 'jmw%.', 'jphot%.', 'jsas%.', 'jstars%.', 'jsteap%.', 'jtehm%.', 'jxcdc%.', 'lls%.', 'lsmc%.', 'oajpe%.', 'ojap%.', 'ojcas%.', 'ojcoms%.', 'ojcs%.', 'ojcsys%.', 'ojemb%.', 'ojia%.', 'ojid%.', 'ojies%.', 'ojim%.', 'ojits%.', 'ojnano%.', 'ojpel%.', 'ojse%.', 'ojsp%.', 'ojsscs%.', 'ojuffc%.', 'ojvt%.', 'sr%.', 'tfr%.', 'tmlcn%.', 'tp%.', 'tqe%.', 'oa', 'oj'}, -- IEEE journals see [[User talk:DreamRimmer#Wikipedia:Bot requests/Archive 88#Web scrapping v4]]
['1111'] = {'1365-2435', '1442-1984', '1751-7915', '1753-0407', '1755-0998', '1758-2229', '1759-7714', '2041-210x', 'j%.1365-2966', 'j%.1745-3933', 'j%.1365-246X','acel%.', 'adb%.', 'anec%.', 'aogs%.', 'bor%.', 'bpa%.', 'cas%.', 'con4%.', 'cpr%.', 'crj%.', 'csp2%.', 'cts%.', 'ddi%.', 'ejed%.', 'ene%.', 'eva%.', 'gbb%.', 'gcbb%.', 'hex%.', 'irv%.', 'iwj%.', 'jch%.', 'jcmm%.', 'jdi%.', 'jfr3%.', 'jocd%.', 'jwas%.', 'mcn%.', 'mpp%.', 'myc%.', 'nrm%.', 'os%.', 'pbi%.', 'srt%.'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1112'] = {'tlm3%.'}, -- Transactions of the London Mathematical Society
['1113'] = {'ep'}, -- Experimental Physiology
['1128'] = {'asmcr', 'jmbe', 'mbio', 'mra', 'spectrum', 'msphere', 'msystems'}, --ASM Case Reports, Journal of Microbiology & Biology Education, mBio, Microbiology Resource Announcements, Microbiology Spectrum, mSphere, mSystems
['1130'] = {'GES'}, -- Geosphere
['1136'] = {'bmjopen'}, -- BMJ Open
['1140'] = {'epjconf', 'epjds'}, -- EPJ Web of Conferences, EPJ Data Science
['1161'] = {'jaha%.'},
['1162'] = {'qss'}, -- Quantitative Science Studies
['1176'] = {'appi%.prcp%.'},
['1177'] = {'21582440', '23328584'}, -- SAGE Open, AERA Open
['1192'] = {'bjo', 'j%.eurpsy'}, -- BJPsych Open, European Psychiatry
['1210'] = {'jendso','jcemcr'}, -- Journal of the Endocrine Society, JCEM Case Reports
['1215'] = {'21573689', '21573698'}, -- L&O Fluids
['1242'] = {'bio', 'dmm'}, -- Biology Open, Disease Models & Mechanisms
['1257'] = {'jep'}, -- Journal of Economic Perspectives
['1587'] = {'comex%.', 'transcom%.'}, -- IEICE Communications Express, IEICE Transactions on Communications
['1590'] = {'0102-3306', 's0074-0276'}, -- Acta Botanica Brasilica, Memórias do Instituto Oswaldo Cruz
['1631'] = {'eng%.'}, -- ENGINEERING Information Technology & Electronic Engineering
['2106'] = {'JBJS.OA'}, -- JBJS Open Access
['2903'] = {'j%.efsa%.'},
['3322'] = {'caac%.'},
['3982'] = {'qw', 'te'},
['4171'] = {'dm','mag'}, -- Documenta Mathematica, EMS Magazine
['4319'] = {'lo%.', 'lol%.', 'lom%.'}, -- L&O, L&O e-Lectures, L&O Methods
['5852'] = {'ejt'}, -- European Journal of Taxonomy
['7155'] = {'jgaa'}, -- Journal of Graph Algorithms and Applications
['7758'] = {'rsf'}, -- RSJ Journal
['11158'] = {'saasp'}, -- Systematic and Applied Acarology Special Publications
['11646'] = {'megataxa', 'mesozoic'}, -- Megataxa, Mesozoic
['13052'] = {'jcsm2245-1439%.', 'jmm1550-4646%.'}, -- Journal of Cyber Security and Mobility, Journal of Mobile Multimedia
['14231'] = {'ag'}, -- Algebraic Geometry
['14814'] = {'phy2%.'},
['15302'] = {'vr%.'},
['15446'] = {'abc'}, -- Acta Biológica Colombiana
['17239'] = {'jowr'}, -- Journal of Writing Research
['17775'] = {'cseejpes%.'}, -- CSEE Journal of Power and Energy Systems
['22073'] = {'pja'}, -- Persian Journal of Acarology
['23919'] = {'aise%.', 'chain%.', 'cjee%.', 'csms%.', 'etr%.', -- See [[User talk:DreamRimmer#Wikipedia:Bot requests/Archive 88#Web scrapping v4]]
'hyper%.', 'ics%.', 'ienergy%.', 'jsc%.',
'metaresource%.', 'saiee%.', 'tup-icn%.', 'ursirsb%.'},
['24295'] = {'cpsstpea%.'}, -- CPSS Transactions on Power Electronics and Applications
['24310'] = {'abm'}, -- Acta Botanica Malacitana
['24425'] = {'agp'}, -- Acta Geologica Polonica
['26599'] = {'bdma%.', 'cai%.', 'ijcs%.', 'jicv%.'}, -- Big Data Mining and Analytics, Cybernetics and Intelligence, International Journal of Crowd Science, Journal of Intelligent and Connected Vehicles
['30941'] = {'cestems%.'}, -- CES Transactions on Electrical Machines and Systems
['35249'] = {'rche'}, -- Revista Chilena de Entomología
['37520'] = {'fi'}, -- Fossil Imprint
['53562'] = {'ajcb'} -- Asian Journal of Conservation Biology
}
--[[===================<< E R R O R M E S S A G I N G >>======================
]]
--[[----------< E R R O R M E S S A G E S U P P L E M E N T S >-------------
I18N for those messages that are supplemented with additional specific text that
describes the reason for the error
TODO: merge this with special_case_translations{}?
]]
local err_msg_supl = {
['char'] = 'invalid character', -- |isbn=, |sbn=
['check'] = 'checksum', -- |isbn=, |sbn=
empty_str = '(empty string)', -- empty unknown parameter check when cite has |=
['flag'] = 'flag', -- |archive-url=
['form'] = 'invalid form', -- |isbn=, |sbn=
['group'] = 'invalid group id', -- |isbn=
['initials'] = 'initials', -- Vancouver
['invalid language code'] = 'invalid language code', -- |script-<param>=
['journal'] = 'journal', -- |bibcode=
['length'] = 'length', -- |isbn=, |bibcode=, |sbn=
['liveweb'] = 'liveweb', -- |archive-url=
['missing comma'] = 'missing comma', -- Vancouver
['missing prefix'] = 'missing prefix', -- |script-<param>=
['missing title part'] = 'missing title part', -- |script-<param>=
['name'] = 'name', -- Vancouver
['non-Latin char'] = 'non-Latin character', -- Vancouver
['path'] = 'path', -- |archive-url=
['prefix'] = 'invalid prefix', -- |isbn=
['punctuation'] = 'punctuation', -- Vancouver
['save'] = 'save command', -- |archive-url=
['suffix'] = 'suffix', -- Vancouver
['timestamp'] = 'timestamp', -- |archive-url=
['unknown language code'] = 'unknown language code', -- |script-<param>=
['value'] = 'value', -- |bibcode=
['year'] = 'year', -- |bibcode=
}
--[[--------------< E R R O R _ C O N D I T I O N S >---------------------------
Error condition table. This table has two sections: errors at the top, maintenance
at the bottom. Maint 'messaging' does not have a 'message' (message=nil)
The following contains a list of IDs for various error conditions defined in the
code. For each ID, we specify a text message to display, an error category to
include, and whether the error message should be wrapped as a hidden comment.
Anchor changes require identical changes to matching anchor in Help:CS1 errors
TODO: rename error_conditions{} to something more generic; create separate error
and maint tables inside that?
]]
local error_conditions = {
err_accessdate_missing_url = {
message = '<code class="cs1-code">|access-date=</code> requires <code class="cs1-code">|url=</code>',
anchor = 'accessdate_missing_url',
category = 'CS1 errors: access-date without URL',
hidden = false
},
err_apostrophe_markup = {
message = 'Italic or bold markup not allowed in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'apostrophe_markup',
category = 'CS1 errors: markup',
hidden = false
},
err_archive_date_missing_url = {
message = '<code class="cs1-code">|archive-date=</code> requires <code class="cs1-code">|archive-url=</code>',
anchor = 'archive_date_missing_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_date_url_ts_mismatch = {
message = '<code class="cs1-code">|archive-date=</code> / <code class="cs1-code">|archive-url=</code> timestamp mismatch; $1 suggested',
anchor = 'archive_date_url_ts_mismatch',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_missing_date = {
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|archive-date=</code>',
anchor = 'archive_missing_date',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_missing_url = {
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|url=</code>',
anchor = 'archive_missing_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_url = {
message = '<code class="cs1-code">|archive-url=</code> is malformed: $1', -- $1 is error message detail
anchor = 'archive_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_arxiv_missing = {
message = '<code class="cs1-code">|arxiv=</code> required',
anchor = 'arxiv_missing',
category = 'CS1 errors: arXiv', -- same as bad arxiv
hidden = false
},
err_asintld_missing_asin = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|asin=</code>', -- $1 is parameter name
anchor = 'asintld_missing_asin',
category = 'CS1 errors: ASIN TLD',
hidden = false
},
err_bad_arxiv = {
message = 'Check <code class="cs1-code">|arxiv=</code> value',
anchor = 'bad_arxiv',
category = 'CS1 errors: arXiv',
hidden = false
},
err_bad_asin = {
message = 'Check <code class="cs1-code">|asin=</code> value',
anchor = 'bad_asin',
category ='CS1 errors: ASIN',
hidden = false
},
err_bad_asin_tld = {
message = 'Check <code class="cs1-code">|asin-tld=</code> value',
anchor = 'bad_asin_tld',
category ='CS1 errors: ASIN TLD',
hidden = false
},
err_bad_bibcode = {
message = 'Check <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail
anchor = 'bad_bibcode',
category = 'CS1 errors: bibcode',
hidden = false
},
err_bad_biorxiv = {
message = 'Check <code class="cs1-code">|biorxiv=</code> value',
anchor = 'bad_biorxiv',
category = 'CS1 errors: bioRxiv',
hidden = false
},
err_bad_citeseerx = {
message = 'Check <code class="cs1-code">|citeseerx=</code> value',
anchor = 'bad_citeseerx',
category = 'CS1 errors: citeseerx',
hidden = false
},
err_bad_date = {
message = 'Check date values in: $1', -- $1 is a parameter name list
anchor = 'bad_date',
category = 'CS1 errors: dates',
hidden = false
},
err_bad_doi = {
message = 'Check <code class="cs1-code">|doi=</code> value',
anchor = 'bad_doi',
category = 'CS1 errors: DOI',
hidden = false
},
err_bad_hdl = {
message = 'Check <code class="cs1-code">|hdl=</code> value',
anchor = 'bad_hdl',
category = 'CS1 errors: HDL',
hidden = false
},
err_bad_isbn = {
message = 'Check <code class="cs1-code">|isbn=</code> value: $1', -- $1 is error message detail
anchor = 'bad_isbn',
category = 'CS1 errors: ISBN',
hidden = false
},
err_bad_ismn = {
message = 'Check <code class="cs1-code">|ismn=</code> value',
anchor = 'bad_ismn',
category = 'CS1 errors: ISMN',
hidden = false
},
err_bad_issn = {
message = 'Check <code class="cs1-code">|$1issn=</code> value', -- $1 is 'e' or '' for eissn or issn
anchor = 'bad_issn',
category = 'CS1 errors: ISSN',
hidden = false
},
err_bad_jfm = {
message = 'Check <code class="cs1-code">|jfm=</code> value',
anchor = 'bad_jfm',
category = 'CS1 errors: JFM',
hidden = false
},
err_bad_jstor = {
message = 'Check <code class="cs1-code">|jstor=</code> value',
anchor = 'bad_jstor',
category = 'CS1 errors: JSTOR',
hidden = false
},
err_bad_lccn = {
message = 'Check <code class="cs1-code">|lccn=</code> value',
anchor = 'bad_lccn',
category = 'CS1 errors: LCCN',
hidden = false
},
err_bad_medrxiv = {
message = 'Check <code class="cs1-code">|medrxiv=</code> value',
anchor = 'bad_medrxiv',
category = 'CS1 errors: medRxiv',
hidden = false
},
err_bad_mr = {
message = 'Check <code class="cs1-code">|mr=</code> value',
anchor = 'bad_mr',
category = 'CS1 errors: MR',
hidden = false
},
err_bad_oclc = {
message = 'Check <code class="cs1-code">|oclc=</code> value',
anchor = 'bad_oclc',
category = 'CS1 errors: OCLC',
hidden = false
},
err_bad_ol = {
message = 'Check <code class="cs1-code">|ol=</code> value',
anchor = 'bad_ol',
category = 'CS1 errors: OL',
hidden = false
},
err_bad_osti = {
message = 'Check <code class="cs1-code">|osti=</code> value',
anchor = 'bad_osti',
category = 'CS1 errors: OSTI',
hidden = false
},
err_bad_paramlink = { -- for |title-link=, |author/editor/translator-link=, |series-link=, |episode-link=
message = 'Check <code class="cs1-code">|$1=</code> value', -- $1 is parameter name
anchor = 'bad_paramlink',
category = 'CS1 errors: parameter link',
hidden = false
},
err_bad_pmc = {
message = 'Check <code class="cs1-code">|pmc=</code> value',
anchor = 'bad_pmc',
category = 'CS1 errors: PMC',
hidden = false
},
err_bad_pmid = {
message = 'Check <code class="cs1-code">|pmid=</code> value',
anchor = 'bad_pmid',
category = 'CS1 errors: PMID',
hidden = false
},
err_bad_rfc = {
message = 'Check <code class="cs1-code">|rfc=</code> value',
anchor = 'bad_rfc',
category = 'CS1 errors: RFC',
hidden = false
},
err_bad_s2cid = {
message = 'Check <code class="cs1-code">|s2cid=</code> value',
anchor = 'bad_s2cid',
category = 'CS1 errors: S2CID',
hidden = false
},
err_bad_sbn = {
message = 'Check <code class="cs1-code">|sbn=</code> value: $1', -- $1 is error message detail
anchor = 'bad_sbn',
category = 'CS1 errors: SBN',
hidden = false
},
err_bad_ssrn = {
message = 'Check <code class="cs1-code">|ssrn=</code> value',
anchor = 'bad_ssrn',
category = 'CS1 errors: SSRN',
hidden = false
},
err_bad_url = {
message = 'Check $1 value', -- $1 is parameter name
anchor = 'bad_url',
category = 'CS1 errors: URL',
hidden = false
},
err_bad_usenet_id = {
message = 'Check <code class="cs1-code">|message-id=</code> value',
anchor = 'bad_message_id',
category = 'CS1 errors: message-id',
hidden = false
},
err_bad_zbl = {
message = 'Check <code class="cs1-code">|zbl=</code> value',
anchor = 'bad_zbl',
category = 'CS1 errors: Zbl',
hidden = false
},
err_bare_url_missing_title = {
message = '$1 missing title', -- $1 is parameter name
anchor = 'bare_url_missing_title',
category = 'CS1 errors: bare URL',
hidden = false
},
err_biorxiv_missing = {
message = '<code class="cs1-code">|biorxiv=</code> required',
anchor = 'biorxiv_missing',
category = 'CS1 errors: bioRxiv', -- same as bad bioRxiv
hidden = false
},
err_chapter_ignored = {
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'chapter_ignored',
category = 'CS1 errors: chapter ignored',
hidden = false
},
err_citation_missing_title = {
message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'citation_missing_title',
category = 'CS1 errors: missing title',
hidden = false
},
err_citeseerx_missing = {
message = '<code class="cs1-code">|citeseerx=</code> required',
anchor = 'citeseerx_missing',
category = 'CS1 errors: citeseerx', -- same as bad citeseerx
hidden = false
},
err_cite_web_url = { -- this error applies to cite web and to cite podcast
message = 'Missing or empty <code class="cs1-code">|url=</code>',
anchor = 'cite_web_url',
category = 'CS1 errors: requires URL',
hidden = false
},
err_class_ignored = {
message = '<code class="cs1-code">|class=</code> ignored',
anchor = 'class_ignored',
category = 'CS1 errors: class',
hidden = false
},
err_contributor_ignored = {
message = '<code class="cs1-code">|contributor=</code> ignored',
anchor = 'contributor_ignored',
category = 'CS1 errors: contributor',
hidden = false
},
err_contributor_missing_required_param = {
message = '<code class="cs1-code">|contributor=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'contributor_missing_required_param',
category = 'CS1 errors: contributor',
hidden = false
},
err_deprecated_params = {
message = 'Cite uses deprecated parameter <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'deprecated_params',
category = 'CS1 errors: deprecated parameters',
hidden = false
},
err_disp_name = {
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name; $2 is the assigned value
anchor = 'disp_name',
category = 'CS1 errors: display-names',
hidden = false,
},
err_doibroken_missing_doi = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|doi=</code>', -- $1 is parameter name
anchor = 'doibroken_missing_doi',
category = 'CS1 errors: DOI',
hidden = false
},
err_embargo_missing_pmc = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|pmc=</code>', -- $1 is parameter name
anchor = 'embargo_missing_pmc',
category = 'CS1 errors: PMC embargo',
hidden = false
},
err_empty_citation = {
message = 'Empty citation',
anchor = 'empty_citation',
category = 'CS1 errors: empty citation',
hidden = false
},
err_etal = {
message = 'Explicit use of et al. in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'explicit_et_al',
category = 'CS1 errors: explicit use of et al.',
hidden = false
},
err_extra_text_edition = {
message = '<code class="cs1-code">|edition=</code> has extra text',
anchor = 'extra_text_edition',
category = 'CS1 errors: extra text: edition',
hidden = false,
},
err_extra_text_issue = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_issue',
category = 'CS1 errors: extra text: issue',
hidden = false,
},
err_extra_text_pages = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_pages',
category = 'CS1 errors: extra text: pages',
hidden = false,
},
err_extra_text_volume = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_volume',
category = 'CS1 errors: extra text: volume',
hidden = false,
},
err_first_missing_last = {
message = '<code class="cs1-code">|$1=</code> missing <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias
anchor = 'first_missing_last',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_format_missing_url = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter
anchor = 'format_missing_url',
category = 'CS1 errors: format without URL',
hidden = false
},
err_generic_name = {
message = '<code class="cs1-code">|$1=</code> has generic name', -- $1 is parameter name
anchor = 'generic_name',
category = 'CS1 errors: generic name',
hidden = false,
},
err_generic_title = {
message = 'Cite uses generic title',
anchor = 'generic_title',
category = 'CS1 errors: generic title',
hidden = false,
},
err_invalid_isbn_date = {
message = 'ISBN / Date incompatibility',
anchor = 'invalid_isbn_date',
category = 'CS1 errors: ISBN date',
hidden = true
},
err_invalid_param_val = {
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is parameter value
anchor = 'invalid_param_val',
category = 'CS1 errors: invalid parameter value',
hidden = false
},
err_invisible_char = {
message = '$1 in $2 at position $3', -- $1 is invisible char $2 is parameter name $3 is position number
anchor = 'invisible_char',
category = 'CS1 errors: invisible characters',
hidden = false
},
err_medrxiv_missing = {
message = '<code class="cs1-code">|medrxiv=</code> required',
anchor = 'medrxiv_missing',
category = 'CS1 errors: medRxiv', -- same as bad medRxiv
hidden = false
},
err_missing_name = {
message = 'Missing <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator
anchor = 'missing_name',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_missing_periodical = {
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1
anchor = 'missing_periodical',
category = 'CS1 errors: missing periodical',
hidden = false
},
err_missing_pipe = {
message = 'Missing pipe in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'missing_pipe',
category = 'CS1 errors: missing pipe',
hidden = false
},
err_missing_publisher = {
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical publisher parameter name for cite $1
anchor = 'missing_publisher',
category = 'CS1 errors: missing publisher',
hidden = false
},
err_numeric_names = {
message = '<code class="cs1-code">|$1=</code> has numeric name', -- $1 is parameter name',
anchor = 'numeric_names',
category = 'CS1 errors: numeric name',
hidden = false,
},
err_param_access_requires_param = {
message = '<code class="cs1-code">|$1-access=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'param_access_requires_param',
category = 'CS1 errors: param-access',
hidden = false
},
err_param_has_ext_link = {
message = 'External link in <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_ext_link',
category = 'CS1 errors: external links',
hidden = false
},
err_param_has_twl_url = {
message = 'Wikipedia Library link in <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_twl_url',
category = 'CS1 errors: URL',
hidden = false
},
err_param_unknown_empty = {
message = 'Cite has empty unknown parameter$1: $2', -- $1 is 's' or empty space; $2 is emty unknown param list
anchor = 'param_unknown_empty',
category = 'CS1 errors: empty unknown parameters',
hidden = false
},
err_parameter_ignored = {
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'parameter_ignored',
category = 'CS1 errors: unsupported parameter',
hidden = false
},
err_parameter_ignored_suggest = {
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored (<code class="cs1-code">|$2=</code> suggested)', -- $1 is unknown parameter $2 is suggested parameter name
anchor = 'parameter_ignored_suggest',
category = 'CS1 errors: unsupported parameter',
hidden = false
},
err_periodical_ignored = {
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'periodical_ignored',
category = 'CS1 errors: periodical ignored',
hidden = false
},
err_redundant_parameters = {
message = 'More than one of $1 specified', -- $1 is error message detail
anchor = 'redundant_parameters',
category = 'CS1 errors: redundant parameter',
hidden = false
},
err_script_parameter = {
message = 'Invalid <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail
anchor = 'script_parameter',
category = 'CS1 errors: script parameters',
hidden = false
},
err_ssrn_missing = {
message = '<code class="cs1-code">|ssrn=</code> required',
anchor = 'ssrn_missing',
category = 'CS1 errors: SSRN',
hidden = false
},
err_text_ignored = {
message = 'Text "$1" ignored', -- $1 is ignored text
anchor = 'text_ignored',
category = 'CS1 errors: unrecognized parameter',
hidden = false
},
err_trans_missing_title = {
message = '<code class="cs1-code">|trans-$1=</code> requires <code class="cs1-code">|$1=</code> or <code class="cs1-code">|script-$1=</code>', -- $1 is base parameter name
anchor = 'trans_missing_title',
category = 'CS1 errors: translated title',
hidden = false
},
err_url_suppressed = {
message = '<code class="cs1-code">|url=</code> suppressed',
anchor = 'url_suppressed',
category = 'CS1 errors: url suppressed',
hidden = false
},
err_vancouver = {
message = 'Vancouver style error: $1 in name $2', -- $1 is error detail, $2 is the nth name
anchor = 'vancouver',
category = 'CS1 errors: Vancouver style',
hidden = false
},
err_wikilink_in_url = {
message = 'URL–wikilink conflict', -- uses ndash
anchor = 'wikilink_in_url',
category = 'CS1 errors: URL–wikilink conflict', -- uses ndash
hidden = false
},
--[[--------------------------< M A I N T >-------------------------------------
maint messages do not have a message (message = nil); otherwise the structure
is the same as error messages
]]
maint_archive_origin = {
message = nil,
anchor = 'archive_origin',
category = 'CS1 maint: archive origin',
hidden = true,
},
maint_archived_copy = {
message = nil,
anchor = 'archived_copy',
category = 'CS1 maint: archived copy as title',
hidden = true,
},
maint_bibcode = {
message = nil,
anchor = 'bibcode',
category = 'CS1 maint: bibcode',
hidden = true,
},
maint_location_no_publisher = { -- cite book, conference, encyclopedia; citation as book cite or encyclopedia cite
message = nil,
anchor = 'location_no_publisher',
category = 'CS1 maint: location missing publisher',
hidden = true,
},
maint_bot_unknown = {
message = nil,
anchor = 'bot:_unknown',
category = 'CS1 maint: bot: original URL status unknown',
hidden = true,
},
maint_date_auto_xlated = { -- date auto-translation not supported by en.wiki
message = nil,
anchor = 'date_auto_xlated',
category = 'CS1 maint: date auto-translated',
hidden = true,
},
maint_date_format = {
message = nil,
anchor = 'date_format',
category = 'CS1 maint: date format',
hidden = true,
},
maint_date_year = {
message = nil,
anchor = 'date_year',
category = 'CS1 maint: date and year',
hidden = true,
},
maint_deprecated_archive = {
message = nil,
anchor = 'deprecated_archive',
category = 'CS1 maint: deprecated archival service',
hidden = true,
},
maint_doi_ignore = {
message = nil,
anchor = 'doi_ignore',
category = 'CS1 maint: ignored DOI errors',
hidden = true,
},
maint_doi_inactive = {
message = nil,
anchor = 'doi_inactive',
category = 'CS1 maint: DOI inactive',
hidden = true,
},
maint_doi_inactive_dated = {
message = nil,
anchor = 'doi_inactive_dated',
category = 'CS1 maint: DOI inactive as of $2$3$1', -- $1 is year, $2 is month-name or empty string, $3 is space or empty string
hidden = true,
},
maint_doi_unflagged_free = {
message = nil,
anchor = 'doi_unflagged_free',
category = 'CS1 maint: unflagged free DOI',
hidden = true,
},
maint_extra_punct = {
message = nil,
anchor = 'extra_punct',
category = 'CS1 maint: extra punctuation',
hidden = true,
},
maint_id_limit_load_fail = { -- applies to all cs1|2 templates on a page;
message = nil, -- maint message (category link) never emitted
anchor = 'id_limit_load_fail',
category = 'CS1 maint: ID limit load fail',
hidden = true,
},
maint_isbn_ignore = {
message = nil,
anchor = 'ignore_isbn_err',
category = 'CS1 maint: ignored ISBN errors',
hidden = true,
},
maint_issn_ignore = {
message = nil,
anchor = 'ignore_issn',
category = 'CS1 maint: ignored ISSN errors',
hidden = true,
},
maint_jfm_format = {
message = nil,
anchor = 'jfm_format',
category = 'CS1 maint: JFM format',
hidden = true,
},
maint_location = {
message = nil,
anchor = 'location',
category = 'CS1 maint: location',
hidden = true,
},
maint_misc_url = {
message = nil,
anchor = 'misc_url',
category = 'CS1 maint: miscellaneous url',
hidden = true,
},
maint_missing_class = {
message = nil,
anchor = 'missing_class',
category = 'CS1 maint: missing class',
hidden = true,
},
maint_mr_format = {
message = nil,
anchor = 'mr_format',
category = 'CS1 maint: MR format',
hidden = true,
},
maint_mult_names = {
message = nil,
anchor = 'mult_names',
category = 'CS1 maint: multiple names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_numeric_names = {
message = nil,
anchor = 'numeric_names',
category = 'CS1 maint: numeric names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_others = {
message = nil,
anchor = 'others',
category = 'CS1 maint: others',
hidden = true,
},
maint_others_avm = {
message = nil,
anchor = 'others_avm',
category = 'CS1 maint: others in cite AV media (notes)',
hidden = true,
},
maint_overridden_setting = {
message = nil,
anchor = 'overridden',
category = 'CS1 maint: overridden setting',
hidden = true,
},
maint_page_art_num = {
message = nil,
anchor = 'page_art_num',
category = 'CS1 maint: article number as page number',
hidden = true,
},
maint_periodical_has_isbn = {
message = nil,
anchor = 'periodical_has_isbn',
category = 'CS1 maint: periodical has ISBN',
hidden = true,
},
maint_pmc_embargo = {
message = nil,
anchor = 'embargo',
category = 'CS1 maint: PMC embargo expired',
hidden = true,
},
maint_pmc_format = {
message = nil,
anchor = 'pmc_format',
category = 'CS1 maint: PMC format',
hidden = true,
},
maint_postscript = {
message = nil,
anchor = 'postscript',
category = 'CS1 maint: postscript',
hidden = true,
},
maint_publisher_location = {
message = nil,
anchor = 'publisher_location',
category = 'CS1 maint: publisher location',
hidden = true,
},
maint_ref_duplicates_default = {
message = nil,
anchor = 'ref_default',
category = 'CS1 maint: ref duplicates default',
hidden = true,
},
maint_shortened_archive_url = {
message = nil,
anchor = 'shortened_archive_url',
category = 'CS1 maint: shortened archive url',
hidden = true,
},
maint_unknown_lang = {
message = nil,
anchor = 'unknown_lang',
category = 'CS1 maint: unrecognized language',
hidden = true,
},
maint_untitled = {
message = nil,
anchor = 'untitled',
category = 'CS1 maint: untitled periodical',
hidden = true,
},
maint_url_status = {
message = nil,
anchor = 'url_status',
category = 'CS1 maint: url-status',
hidden = true,
},
maint_work_isbn = {
message = nil,
anchor = 'work_isbn',
category = 'CS1 maint: work parameter with ISBN',
hidden = true,
},
maint_year= {
message = nil,
anchor = 'year',
category = 'CS1 maint: year',
hidden = true,
},
maint_zbl = {
message = nil,
anchor = 'zbl',
category = 'CS1 maint: Zbl',
hidden = true,
},
}
--[[--------------------------< I D _ L I M I T S _ D A T A _ T >----------------------------------------------
fetch id limits for certain identifiers from c:Data:CS1/Identifier limits.tab. This source is a json tabular
data file maintained at wikipedia commons. Convert the json format to a table of k/v pairs.
The values from <id_limits_data_t> are used to set handle.id_limit.
From 2025-02-21, MediaWiki is broken. Use this link to edit the tablular data file:
https://commons.wikimedia.org/w/index.php?title=Data:CS1/Identifier_limits.tab&action=edit
See Phab:T389105
]]
local id_limits_data_t;
local id_limits_data_load_fail = false; -- flag; assume that we will be successful when loading json id limit tabular data
local use_commons_data = true; -- set to false if your wiki does not have access to mediawiki commons; then,
if false == use_commons_data then -- update this table from https://commons.wikimedia.org/wiki/Data:CS1/Identifier_limits.tab; last update: 2026-08-02
id_limits_data_t = {['OCLC'] = 11160000000, ['OSTI'] = 23010000, ['PMC'] = 13500000, ['PMID'] = 42900000, ['RFC'] = 9300, ['SSRN'] = 7500000, ['S2CID'] = 290000000}; -- this table must be maintained locally
else -- here for wikis that do have access to mediawiki commons
local load_fail_limit = 99999999999; -- very high number to avoid error messages on load failure
id_limits_data_t = {['OCLC'] = load_fail_limit, ['OSTI'] = load_fail_limit, ['PMC'] = load_fail_limit, ['PMID'] = load_fail_limit, ['RFC'] = load_fail_limit, ['SSRN'] = load_fail_limit, ['S2CID'] = load_fail_limit};
if mw.ext.data == nil then
id_limits_data_load_fail = true; -- safeguard against Lua errors if mw.ext.data is not available for some reason
else
local tab_data_t = mw.ext.data.get ('CS1/Identifier limits.tab'); -- attempt to load the tabular data from commons into <tab_data_t>
if false == tab_data_t then -- undocumented 'feature': mw.ext.data.get() sometimes returns false
id_limits_data_load_fail = true; -- set the flag so that Module:Citation/CS1 can create an unannotated maint category
else
for _, limit_t in ipairs (tab_data_t.data) do -- overwrite default <load_fail_limit> values from the data table in the tabular data
id_limits_data_t[limit_t[1]] = limit_t[2]; -- <limit[1]> is identifier; <limit[2]> is upper limit for that identifier
end
end
end
end
--[[--------------------------< I D _ H A N D L E R S >--------------------------------------------------------
The following contains a list of values for various defined identifiers. For each
identifier we specify a variety of information necessary to properly render the
identifier in the citation.
parameters: a list of parameter aliases for this identifier; first in the list is the canonical form
link: Wikipedia article name
redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number'
q: Wikidata q number for the identifier
label: the label preceding the identifier; label is linked to a Wikipedia article (in this order):
redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true
Wikidata-supplied article name for the local wiki from id_handlers['<id>'].q
local article name from id_handlers['<id>'].link
prefix: the first part of a URL that will be concatenated with a second part which usually contains the identifier
suffix: optional third part to be added after the identifier
encode: true if URI should be percent-encoded; otherwise false
COinS: identifier link or keyword for use in COinS:
for identifiers registered at info-uri.info use: info:.... where '...' is the appropriate identifier label
for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn
for |asin= and |ol=, which require assembly, use the keyword: url
for others make a URL using the value in prefix/suffix and #label, use the keyword: pre (not checked; any text other than 'info', 'rft', or 'url' works here)
set to nil to leave the identifier out of the COinS
separator: character or text between label and the identifier in the rendered citation
id_limit: for those identifiers with established limits, this property holds the upper limit
access: use this parameter to set the access level for all instances of this identifier.
the value must be a valid access level for an identifier (see ['id-access'] in this file).
custom_access: to enable custom access level for an identifier, set this parameter
to the parameter that should control it (normally 'id-access')
]]
local id_handlers = {
['ARXIV'] = {
parameters = {'arxiv', 'eprint'},
link = 'arXiv',
redirect = 'arXiv (identifier)',
q = 'Q118398',
label = 'arXiv',
prefix = 'https://arxiv.org/abs/',
encode = false,
COinS = 'info:arxiv',
separator = ':',
access = 'free', -- free to read
},
['ASIN'] = {
parameters = { 'asin', 'ASIN' },
link = 'Amazon Standard Identification Number',
redirect = 'ASIN (identifier)',
q = 'Q1753278',
label = 'ASIN',
prefix = 'https://www.amazon.',
COinS = 'url',
separator = ' ',
encode = false;
},
['BIBCODE'] = {
parameters = {'bibcode'},
link = 'Bibcode',
redirect = 'Bibcode (identifier)',
q = 'Q25754',
label = 'Bibcode',
prefix = 'https://scixplorer.org/abs/',
encode = false,
COinS = 'info:bibcode',
separator = ':',
custom_access = 'bibcode-access',
},
['BIORXIV'] = {
parameters = {'biorxiv'},
link = 'bioRxiv',
redirect = 'bioRxiv (identifier)',
q = 'Q19835482',
label = 'bioRxiv',
prefix = 'https://doi.org/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['CITESEERX'] = {
parameters = {'citeseerx'},
link = 'CiteSeerX',
redirect = 'CiteSeerX (identifier)',
q = 'Q2715061',
label = 'CiteSeerX',
prefix = 'https://citeseerx.ist.psu.edu/viewdoc/summary?doi=',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['DOI'] = { -- Used by InternetArchiveBot
parameters = { 'doi', 'DOI'},
link = 'Digital object identifier',
redirect = 'doi (identifier)',
q = 'Q25670',
label = 'doi',
prefix = 'https://doi.org/',
COinS = 'info:doi',
separator = ':',
encode = true,
custom_access = 'doi-access',
},
['EISSN'] = {
parameters = {'eissn', 'EISSN'},
link = 'International Standard Serial Number#Electronic ISSN',
redirect = 'eISSN (identifier)',
q = 'Q46339674',
label = 'eISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.eissn',
encode = false,
separator = ' ',
},
['HDL'] = {
parameters = { 'hdl', 'HDL' },
link = 'Handle System',
redirect = 'hdl (identifier)',
q = 'Q3126718',
label = 'hdl',
prefix = 'https://hdl.handle.net/',
COinS = 'info:hdl',
separator = ':',
encode = true,
custom_access = 'hdl-access',
},
['ISBN'] = { -- Used by InternetArchiveBot
parameters = {'isbn', 'ISBN'},
link = 'International Standard Book Number',
redirect = 'ISBN (identifier)',
q = 'Q33057',
label = 'ISBN',
prefix = 'Special:BookSources/',
COinS = 'rft.isbn',
separator = ' ',
},
['ISMN'] = {
parameters = {'ismn', 'ISMN'},
link = 'International Standard Music Number',
redirect = 'ISMN (identifier)',
q = 'Q1666938',
label = 'ISMN',
prefix = '', -- not currently used;
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['ISSN'] = {
parameters = {'issn', 'ISSN'},
link = 'International Standard Serial Number',
redirect = 'ISSN (identifier)',
q = 'Q131276',
label = 'ISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.issn',
encode = false,
separator = ' ',
},
['JFM'] = {
parameters = {'jfm', 'JFM'},
link = 'Jahrbuch über die Fortschritte der Mathematik',
redirect = 'JFM (identifier)',
q = '',
label = 'JFM',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['JSTOR'] = {
parameters = {'jstor', 'JSTOR'},
link = 'JSTOR',
redirect = 'JSTOR (identifier)',
q = 'Q1420342',
label = 'JSTOR',
prefix = 'https://www.jstor.org/stable/',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
custom_access = 'jstor-access',
},
['LCCN'] = {
parameters = {'lccn', 'LCCN'},
link = 'Library of Congress Control Number',
redirect = 'LCCN (identifier)',
q = 'Q620946',
label = 'LCCN',
prefix = 'https://lccn.loc.gov/',
COinS = 'info:lccn',
encode = false,
separator = ' ',
},
['MEDRXIV'] = {
parameters = {'medrxiv'},
link = 'medRxiv',
redirect = 'medRxiv (identifier)',
q = 'Q58465838',
label = 'medRxiv',
prefix = 'https://www.medrxiv.org/content/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = false,
separator = ' ',
},
['MR'] = {
parameters = {'mr', 'MR'},
link = 'Mathematical Reviews',
redirect = 'MR (identifier)',
q = 'Q211172',
label = 'MR',
prefix = 'https://mathscinet.ams.org/mathscinet-getitem?mr=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['OCLC'] = {
parameters = {'oclc', 'OCLC'},
link = 'OCLC',
redirect = 'OCLC (identifier)',
q = 'Q190593',
label = 'OCLC',
prefix = 'https://search.worldcat.org/oclc/',
COinS = 'info:oclcnum',
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OCLC or 0,
},
['OL'] = {
parameters = { 'ol', 'OL' },
link = 'Open Library',
redirect = 'OL (identifier)',
q = 'Q1201876',
label = 'OL',
prefix = 'https://openlibrary.org/',
COinS = 'url',
separator = ' ',
encode = true,
custom_access = 'ol-access',
},
['OSTI'] = {
parameters = {'osti', 'OSTI'},
link = 'Office of Scientific and Technical Information',
redirect = 'OSTI (identifier)',
q = 'Q2015776',
label = 'OSTI',
prefix = 'https://www.osti.gov/biblio/',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OSTI or 0,
custom_access = 'osti-access',
},
['PMC'] = {
parameters = {'pmc', 'PMC'},
link = 'PubMed Central',
redirect = 'PMC (identifier)',
q = 'Q229883',
label = 'PMC',
prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC',
suffix = '',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.PMC or 0,
access = 'free', -- free to read
},
['PMID'] = {
parameters = {'pmid', 'PMID'},
link = 'PubMed Identifier',
redirect = 'PMID (identifier)',
q = 'Q2082879',
label = 'PMID',
prefix = 'https://pubmed.ncbi.nlm.nih.gov/',
COinS = 'info:pmid',
encode = false,
separator = ' ',
id_limit = id_limits_data_t.PMID or 0,
},
['RFC'] = {
parameters = {'rfc', 'RFC'},
link = 'Request for Comments',
redirect = 'RFC (identifier)',
q = 'Q212971',
label = 'RFC',
prefix = 'https://tools.ietf.org/html/rfc',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.RFC or 0,
access = 'free', -- free to read
},
['SBN'] = {
parameters = {'sbn', 'SBN'},
link = 'Standard Book Number', -- redirect to International_Standard_Book_Number#History
redirect = 'SBN (identifier)',
label = 'SBN',
prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['SSRN'] = {
parameters = {'ssrn', 'SSRN'},
link = 'Social Science Research Network',
redirect = 'SSRN (identifier)',
q = 'Q7550801',
label = 'SSRN',
prefix = 'https://papers.ssrn.com/sol3/papers.cfm?abstract_id=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.SSRN or 0,
custom_access = 'ssrn-access',
},
['S2CID'] = {
parameters = {'s2cid', 'S2CID'},
link = 'Semantic Scholar',
redirect = 'S2CID (identifier)',
q = 'Q22908627',
label = 'S2CID',
prefix = 'https://api.semanticscholar.org/CorpusID:',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.S2CID or 0,
custom_access = 's2cid-access',
},
['USENETID'] = {
parameters = {'message-id'},
link = 'Usenet',
redirect = 'Usenet (identifier)',
q = 'Q193162',
label = 'Usenet:',
prefix = 'news:',
encode = false,
COinS = 'pre', -- use prefix value
separator = ' ',
},
['ZBL'] = {
parameters = {'zbl', 'ZBL' },
link = 'Zentralblatt MATH',
redirect = 'Zbl (identifier)',
q = 'Q190269',
label = 'Zbl',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
}
--[[--------------------------< E X P O R T S >---------------------------------
]]
return {
use_identifier_redirects = use_identifier_redirects, -- booleans defined in the settings at the top of this module
local_lang_cat_enable = local_lang_cat_enable,
date_name_auto_xlate_enable = date_name_auto_xlate_enable,
date_digit_auto_xlate_enable = date_digit_auto_xlate_enable,
enable_sort_keys = enable_sort_keys,
suppress_archive_today_urls = suppress_archive_today_urls,
-- tables and variables created when this module is loaded
dependencies_t = dependencies_t, -- used to suppress parameters dependent on url-holding parameters holding archive.today urls
enum_needs_xlation = '1' ~= date_names.xlate_digits['1'], -- to avoid unnecessary enumerator translation
global_df = get_date_format (), -- this line can be replaced with "global_df = 'dmy-all'," to have all dates auto translated to dmy format.
global_cs1_config_t = global_cs1_config_t, -- global settings from {{cs1 config}}
id_limits_data_load_fail = id_limits_data_load_fail, -- true when commons tabular identifier-limit data fails to load
known_free_doi_registrants_t = build_free_doi_registrants_table(),
punct_skip = build_skip_table (punct_skip, punct_meta_params),
url_skip = build_skip_table (url_skip, url_meta_params),
archive_today_tlds_t = {['today'] = true, ['ph'] = true, ['is'] = true, ['md'] = true, ['li'] = true, ['fo'] = true, ['vn'] = true}; -- used by is_archive_today_url()
name_space_sort_keys = name_space_sort_keys,
aliases = aliases,
special_case_translation = special_case_translation,
date_names = date_names,
err_msg_supl = err_msg_supl,
error_conditions = error_conditions,
et_al_patterns = et_al_patterns,
extended_registrants_t = extended_registrants_t,
id_handlers = id_handlers,
keywords_lists = keywords_lists,
keywords_xlate = keywords_xlate,
stripmarkers = stripmarkers,
invisible_chars = invisible_chars,
invisible_defs = invisible_defs,
indic_script = indic_script,
emoji_t = emoji_t,
messages = messages,
presentation = presentation,
prop_cats = prop_cats,
script_lang_codes = script_lang_codes,
lang_tag_remap = lang_tag_remap,
lang_name_remap = lang_name_remap,
this_wiki_code = this_wiki_code,
title_types = title_types,
uncategorized_namespaces = uncategorized_namespaces_t,
uncategorized_subpages = uncategorized_subpages,
templates_using_volume = templates_using_volume,
templates_using_issue = templates_using_issue,
templates_not_using_page = templates_not_using_page,
vol_iss_pg_patterns = vol_iss_pg_patterns,
single_letter_2nd_lvl_domains_t = single_letter_2nd_lvl_domains_t,
url_access_map_t = url_access_map_t,
inter_wiki_map = inter_wiki_map,
mw_languages_by_tag_t = mw_languages_by_tag_t,
mw_languages_by_name_t = mw_languages_by_name_t,
citation_class_map_t = citation_class_map_t,
citation_issue_t = citation_issue_t,
citation_no_volume_t = citation_no_volume_t,
}
mtf0w1ow8dokpa8ltsmoqupkxr4vaq4
32818
32817
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Citation/CS1/Configuration]]
32817
Scribunto
text/plain
local lang_obj = mw.getContentLanguage(); -- make a language object for the local language; used here for languages and dates
--[[--------------------------< S E T T I N G S >--------------------------------------------------------------
boolean settings used to control various things. these setting located here to make them easy to find
]]
-- these settings local to this module only
local local_digits_from_mediawiki = false; -- for i18n; when true, module fills date_names['local_digits'] from MediaWiki; manual fill required else; always false at en.wiki
-- these settings exported to other modules
local use_identifier_redirects = true; -- when true use redirect name for identifier label links; always true at en.wiki
local local_lang_cat_enable = false; -- when true categorizes pages where |language=<local wiki's language>; always false at en.wiki
local date_name_auto_xlate_enable = false; -- when true translates English month-names to the local-wiki's language month names; always false at en.wiki
local date_digit_auto_xlate_enable = false; -- when true translates Western date digit to the local-wiki's language digits (date_names['local_digits']); always false at en.wiki
local enable_sort_keys = true; -- when true module adds namespace sort keys to error and maintenance category links
local suppress_archive_today_urls = true; -- when true module suppresses all parameters with an archive.today url and any deprendent parameters
--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
List of namespaces identifiers for namespaces that will not be included in citation error categories.
Same as setting notracking = true by default.
For wikis that have a current version of Module:cs1 documentation support, this #invoke will return an unordered
list of namespace names and their associated identifiers:
{{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}}
]]
local uncategorized_namespaces_t = {[2]=true}; -- init with user namespace id
for k, _ in pairs (mw.site.talkNamespaces) do -- add all talk namespace ids
uncategorized_namespaces_t[k] = true;
end
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases', '/[^/]*[Ll]og', '/[Aa]rchive'}; -- list of Lua patterns found in page names of pages we should not categorize
--[[
at en.wiki Greek characters are used as sort keys for certain items in a category so that those items are
placed at the end of a category page. See Wikipedia:Categorization#Sort_keys. That works well for en.wiki
because English is written using the Latn script. This may not work well for other languages. At en.wiki it
is desireable to place content from certain namespaces at the end of a category listing so the module adds sort
keys to error and maintenance category links when rendering a cs1|2 template on a page in that namespace.
i18n: if this does not work well for your language, set <enable_sort_keys> to false.
]]
local name_space_sort_keys = { -- sort keys to be used with these namespaces:
[4] = 'ω', -- wikipedia; omega
[10] = 'τ', -- template; tau
[118] = 'Δ', -- draft; delta
['other'] = 'ο', -- all other non-talk namespaces except main (article); omicron
}
--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
Translation table
The following contains fixed text that may be output as part of a citation.
This is separated from the main body to aid in future translations of this
module.
]]
local messages = {
['agency'] = '$1 $2', -- $1 is sepc, $2 is agency
['archived-dead'] = 'Archived from $1 on $2',
['archived-live'] = '$1 from the original on $2',
['archived-unfit'] = 'Archived from the original on $1',
['archived'] = 'Archived',
['by'] = 'By', -- contributions to authored works: introduction, foreword, afterword
['cartography'] = 'Cartography by $1',
['collaboration'] = '$1 ($2)', -- $1 is author with et al, $2 is collaboration
['editor'] = 'ed.',
['editors'] = 'eds.',
['edition'] = '($1 ed.)',
['episode'] = 'Episode $1',
['et al'] = 'et al.',
['in'] = 'In', -- edited works
['inactive'] = ' (inactive $1)', -- $1 is date which the doi was found to be broken in
['inset'] = '$1 inset',
['interview'] = 'Interviewed by $1',
invisible_1 = '$1 $2', -- $1 stripmarker name; $2 is text from <invisible_chars[1]>
invisible_2 = '$1 character', -- $1 character name from <invisible_chars[1]>
['mismatch'] = '<code class="cs1-code">|$1=</code> / <code class="cs1-code">|$2=</code> mismatch', -- $1 is year param name; $2 is date param name
['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]: $1',
['notitle'] = 'No title', -- for |title=(()) and (in the future) |title=none
['original'] = 'the original',
['origdate'] = ' [$1]',
['retrieved'] = 'Retrieved $1',
['season'] = 'Season $1',
['section'] = '§ $1',
['sections'] = '§§ $1',
['series'] = '$1 $2', -- $1 is sepc, $2 is series
['seriesnum'] = 'Series $1',
['translated'] = 'Translated by $1',
['type'] = ' ($1)', -- for titletype
wikidata = 'Wikidata', -- these used for interwikilinked author/editor/... names
wikipedia = 'Wikipedia',
wikisource = 'Wikisource',
['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{}
['vol-no'] = '$1 Vol. $2, no. $3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization)
['issue'] = '$1 No. $2', -- $1 is sepc
['art'] = '$1 Art. $2', -- $1 is sepc; for {{cite conference}} only
['vol-art'] = '$1 Vol. $2, art. $3', -- sepc, volume, article-number; for {{cite conference}} only
['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{}
['j-issue'] = ' ($1)',
['j-article-num'] = ' $1', -- TODO: any punctuation here? static text?
['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc
['p-prefix'] = "$1 p. $2", -- $1 is sepc
['pp-prefix'] = "$1 pp. $2", -- $1 is sepc
['j-page(s)'] = ': $1', -- same for page and pages
['sheet'] = '$1 Sheet $2', -- $1 is sepc
['sheets'] = '$1 Sheets $2', -- $1 is sepc
['j-sheet'] = ': Sheet $1',
['j-sheets'] = ': Sheets $1',
['language'] = '(in $1)',
['via'] = " – via $1",
['event'] = 'Event occurs at',
['minutes'] = ' $1 minutes in', -- $1 is the number of minutes
-- Determines the location of the help page
['help page link'] = 'Help:CS1 errors',
['help page label'] = 'help',
-- categories
['cat wikilink'] = '[[Category:$1]]', -- $1 is the category name
['cat wikilink sk'] = '[[Category:$1|$2]]', -- $1 is the category name; $2 is namespace sort key
[':cat wikilink'] = '[[:Category:$1|link]]', -- category name as maintenance message wikilink; $1 is the category name
-- Internal errors (should only occur if configuration is bad)
['undefined_error'] = 'Called with an undefined error condition',
['unknown_ID_key'] = 'Unrecognized ID key: ', -- an ID key in id_handlers not found in ~/Identifiers func_map{}
['unknown_ID_access'] = 'Unrecognized ID access keyword: ', -- an ID access keyword in id_handlers not found in keywords_lists['id-access']{}
['unknown_argument_map'] = 'Argument map not defined for this variable',
['bare_url_no_origin'] = 'Bare URL found but origin indicator is nil or empty',
['warning_msg_e'] = '<span style="color:#d33"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: this [[#$2|reference]] has errors</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link; $2 is anchor ID
['warning_msg_m'] = '<span style="color:#085"><code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code>: this [[#$2|reference]] has maintenance messages</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link; $2 is anchor ID
}
--[[--------------------------< C I T A T I O N _ C L A S S _ M A P >------------------------------------------
this table maps the value assigned to |CitationClass= in the cs1|2 templates to the canonical template name when
the value assigned to |CitationClass= is different from the canonical template name. |CitationClass= values are
used as class attributes in the <cite> tag that encloses the citation so these names may not contain spaces while
the canonical template name may. These names are used in warning_msg_e and warning_msg_m to create links to the
template's documentation when an article is displayed in preview mode.
]]
local citation_class_map_t = { -- TODO: in Module:Cite/config write a function to use this table
arxiv = 'cite arXiv', -- as the source for known_templates_t and citation_classes_t
['audio-visual'] = 'cite AV media',
['AV-media-notes'] = 'cite AV media notes',
biorxiv = 'cite bioRxiv',
book = 'cite book',
citation = 'citation',
citeseerx = 'cite CiteSeerX',
conference = 'cite conference',
document = 'cite document',
encyclopaedia = 'cite encyclopedia',
episode = 'cite episode',
interview = 'cite interview',
journal = 'cite journal',
magazine = 'cite magazine',
mailinglist = 'cite mailing list',
map = 'cite map',
medrxiv = 'cite medRxiv',
news = 'cite news',
newsgroup = 'cite newsgroup',
podcast = 'cite podcast',
pressrelease = 'cite press release',
report = 'cite report',
serial = 'cite serial',
sign = 'cite sign',
speech = 'cite speech',
ssrn = 'cite SSRN',
techreport = 'cite tech report',
thesis = 'cite thesis',
web = 'cite web',
}
--[=[-------------------------< E T _ A L _ P A T T E R N S >--------------------------------------------------
This table provides Lua patterns for the phrase "et al" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the 'etal' message.
]=]
local et_al_patterns = {
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.;,\"']*$", -- variations on the 'et al' theme
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][AaIi][Ee]?[%.;,\"']*$", -- variations on the 'et alia', 'et alii' and 'et aliae' themes (false positive 'et aliie' unlikely to match)
"[;,]? *%f[%a]and [Oo]thers", -- an alternative to et al.
"%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form
"%(%( *[Ee][Tt]%.? *[Aa][Ll]%.? *%)%)", -- a double-bracketed form (to counter partial removal of ((...)) syntax)
"[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form
}
--[[--------------------------< P R E S E N T A T I O N >------------------------
Fixed presentation markup. Originally part of citation_config.messages it has
been moved into its own, more semantically correct place.
]]
local presentation =
{
-- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display
['hidden-error'] = '<span class="cs1-hidden-error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error citation-comment">$1</span>',
['hidden-maint'] = '<span class="cs1-maint citation-comment">$1</span>',
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal CSS
['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like
['cite'] = '<cite class="$1">$2</cite>'; -- for use when citation does not have a namelist and |ref= not set so no id="..." attribute
['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when when |ref= is set or when citation has a namelist
['format'] = ' <span class="cs1-format">($1)</span>', -- for |format=, |chapter-format=, etc.
['interwiki'] = ' <span class="cs1-format">[in $1]</span>', -- for interwiki-language-linked author, editor, etc
['interproj'] = ' <span class="cs1-format">[at $1]</span>', -- for interwiki-project-linked author, editor, etc (:d: and :s: supported; :w: ignored)
-- various access levels, for |access=, |doi-access=, |arxiv=, ...
-- narrow no-break space   may work better than nowrap CSS. Or not? Browser support?
['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon
['free'] = {class='id-lock-free', title='Freely accessible'}, -- classes defined in Module:Citation/CS1/styles.css
['registration'] = {class='id-lock-registration', title='Free registration required'},
['limited'] = {class='id-lock-limited', title='Free access subject to limited trial, subscription normally required'},
['subscription'] = {class='id-lock-subscription', title='Paid subscription required'},
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>',
['class-wikisource'] = 'cs1-ws-icon',
['italic-title'] = "''$1''",
['kern-left'] = '<span class="cs1-kern-left"></span>$1', -- spacing to use when title contains leading single or double quote mark
['kern-right'] = '$1<span class="cs1-kern-right"></span>', -- spacing to use when title contains trailing single or double quote mark
['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span>
['nowrap2'] = '<span class="nowrap">$1</span> $2', -- for nowrapping portions of an item: <span ...>dd mmmm</span> yyyy (note white space)
['ocins'] = '<span title="$1" class="Z3988"></span>',
['parameter'] = '<code class="cs1-code">|$1=</code>',
['ps_cs1'] = '.'; -- CS1 style postscript (terminal) character
['ps_cs2'] = ''; -- CS2 style postscript (terminal) character (empty string)
['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content
['quoted-title'] = '"$1"',
['sep_cs1'] = '.', -- CS1 element separator
['sep_cs2'] = ',', -- CS2 separator
['sep_nl'] = ';', -- CS1|2 style name-list separator between names is a semicolon
['sep_nl_and'] = ' and ', -- used as last nl sep when |name-list-style=and and list has 2 items
['sep_nl_end'] = '; and ', -- used as last nl sep when |name-list-style=and and list has 3+ names
['sep_name'] = ', ', -- CS1|2 style last/first separator is <comma><space>
['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma
['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space
['sep_list'] = ', ', -- used for |language= when list has 3+ items except for last sep which uses sep_list_end
['sep_list_pair'] = ' and ', -- used for |language= when list has 2 items
['sep_list_end'] = ', and ', -- used as last list sep for |language= when list has 3+ items
['trans-italic-title'] = "[''$1'']",
['trans-quoted-title'] = "[$1]", -- for |trans-title= and |trans-quote=
['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{}
}
--[[--------------------------< A L I A S E S >---------------------------------
Aliases table for commonly passed parameters.
Parameter names on the right side in the assignments in this table must have been
defined in the Whitelist before they will be recognized as valid parameter names
]]
local aliases = {
['AccessDate'] = {'access-date', 'accessdate'}, -- Used by InternetArchiveBot
['Agency'] = 'agency',
['ArchiveDate'] = {'archive-date', 'archivedate'}, -- Used by InternetArchiveBot
['ArchiveFormat'] = 'archive-format',
['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot
['ArticleNumber'] = 'article-number',
['ASINTLD'] = 'asin-tld',
['At'] = 'at', -- Used by InternetArchiveBot
['Authors'] = {'people', 'credits'},
['BookTitle'] = {'book-title', 'booktitle'},
['Cartography'] = 'cartography',
['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'},
['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format',
'article-format', 'section-format'};
['ChapterURL'] = {'chapter-url', 'contribution-url', 'entry-url', 'article-url', 'section-url'}, -- Used by InternetArchiveBot
['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access',
'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot
['Class'] = 'class', -- cite arxiv and arxiv identifier
['Collaboration'] = 'collaboration',
['Conference'] = {'conference', 'event'},
['ConferenceFormat'] = 'conference-format',
['ConferenceURL'] = 'conference-url', -- Used by InternetArchiveBot
['Date'] = {'date', 'publication-date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only
['Degree'] = 'degree',
['DF'] = 'df',
['DisplayAuthors'] = {'display-authors', 'display-subjects'},
['DisplayContributors'] = 'display-contributors',
['DisplayEditors'] = 'display-editors',
['DisplayInterviewers'] = 'display-interviewers',
['DisplayTranslators'] = 'display-translators',
['Docket'] = 'docket',
['DoiBroken'] = 'doi-broken-date',
['Edition'] = 'edition',
['Embargo'] = 'pmc-embargo-date',
['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only
['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode?
['Format'] = 'format',
['ID'] = {'id', 'ID'},
['Inset'] = 'inset',
['Issue'] = {'issue', 'number'},
['Language'] = {'language', 'lang'},
['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only
['Map'] = 'map', -- cite map only
['MapFormat'] = 'map-format', -- cite map only
['MapURL'] = {'map-url', 'mapurl'}, -- cite map only -- Used by InternetArchiveBot
['MapUrlAccess'] = 'map-url-access', -- cite map only -- Used by InternetArchiveBot
['Minutes'] = 'minutes',
['Mode'] = 'mode',
['NameListStyle'] = 'name-list-style',
['Network'] = 'network',
['Newsgroup'] = 'newsgroup', -- cite newsgroup only
['NoPP'] = {'no-pp', 'nopp'},
['NoTracking'] = {'no-tracking', 'template-doc-demo'},
['Number'] = 'number', -- this case only for cite techreport
['OrigDate'] = {'orig-date', 'orig-year', 'origyear'},
['Others'] = 'others',
['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot
['Pages'] = {'pages', 'pp'}, -- Used by InternetArchiveBot
['Periodical'] = {'journal', 'magazine', 'newspaper', 'periodical', 'website', 'work'},
['PostScript'] = 'postscript',
['PublicationPlace'] = {'publication-place', 'location', 'place'}, -- TODO: when all templates that use |publication-place= and |place= or |location= make 'location' cannonical
['PublisherName'] = {'publisher', 'institution'},
['Quote'] = {'quote', 'quotation'},
['QuotePage'] = 'quote-page',
['QuotePages'] = 'quote-pages',
['Ref'] = 'ref',
['Scale'] = 'scale',
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry',
'script-article', 'script-section'},
['ScriptEncyclopedia'] = {'script-encyclopedia', 'script-encyclopaedia'}, -- cite encyclopedia only
['ScriptMap'] = 'script-map',
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper',
'script-periodical', 'script-website', 'script-work'},
['ScriptQuote'] = 'script-quote',
['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot
['Season'] = 'season',
['Sections'] = 'sections', -- cite map only
['Series'] = {'series', 'version'},
['SeriesLink'] = {'series-link', 'serieslink'},
['SeriesNumber'] = {'series-number', 'series-no'},
['Sheet'] = 'sheet', -- cite map only
['Sheets'] = 'sheets', -- cite map only
['Station'] = 'station',
['Time'] = 'time',
['TimeCaption'] = 'time-caption',
['Title'] = 'title', -- Used by InternetArchiveBot
['TitleLink'] = {'title-link', 'episode-link', 'episodelink'}, -- Used by InternetArchiveBot
['TitleNote'] = {'title-note', 'department'},
['TitleType'] = {'type', 'medium'},
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution',
'trans-entry', 'trans-section'},
['Transcript'] = 'transcript',
['TranscriptFormat'] = 'transcript-format',
['TranscriptURL'] = 'transcript-url', -- Used by InternetArchiveBot
['TransEncyclopedia'] = {'trans-encyclopedia', 'trans-encyclopaedia'}, -- cite encyclopedia only
['TransMap'] = 'trans-map', -- cite map only
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper',
'trans-periodical', 'trans-website', 'trans-work'},
['TransQuote'] = 'trans-quote',
['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot
['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot
['UrlAccess'] = 'url-access', -- Used by InternetArchiveBot
['UrlStatus'] = 'url-status', -- Used by InternetArchiveBot
['Vauthors'] = 'vauthors',
['Veditors'] = 'veditors',
['Via'] = 'via',
['Volume'] = 'volume',
['Year'] = 'year',
['AuthorList-First'] = {"first#", "author-first#", "author#-first", "author-given#", "author#-given",
"subject-first#", "subject#-first", "subject-given#", "subject#-given",
"given#"},
['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author-surname#", "author#-surname",
"subject-last#", "subject#-last", "subject-surname#", "subject#-surname",
"author#", 'host#', "subject#", "surname#"},
['AuthorList-Link'] = {"author-link#", "author#-link", "subject-link#",
"subject#-link", "authorlink#", "author#link"},
['AuthorList-Mask'] = {"author-mask#", "author#-mask", "subject-mask#", "subject#-mask"},
['ContributorList-First'] = {'contributor-first#', 'contributor#-first',
'contributor-given#', 'contributor#-given'},
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last',
'contributor-surname#', 'contributor#-surname', 'contributor#'},
['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'},
['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'},
['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"},
['EditorList-Last'] = {"editor-last#", "editor#-last", "editor-surname#",
"editor#-surname", "editor#"},
['EditorList-Link'] = {"editor-link#", "editor#-link"},
['EditorList-Mask'] = {"editor-mask#", "editor#-mask"},
['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first',
'interviewer-given#', 'interviewer#-given'},
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last',
'interviewer-surname#', 'interviewer#-surname', 'interviewer#'},
['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'},
['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'},
['TranslatorList-First'] = {'translator-first#', 'translator#-first',
'translator-given#', 'translator#-given'},
['TranslatorList-Last'] = {'translator-last#', 'translator#-last',
'translator-surname#', 'translator#-surname', 'translator#'},
['TranslatorList-Link'] = {'translator-link#', 'translator#-link'},
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
}
--[[--------------------------< D E P E N D E N C I E S _ T >--------------------------------------------------
a table of url-holding parameters upon which other parameters are dependent.
this table is used by has_archive_today_url() to suppress parameters that are dependant upon a url-holding parameter
that has as a value an archive.today (or alternate tld) url.
archive.today is deprecated at en.wiki; see Wikipedia:Requests_for_comment/Archive.is_RFC_5
]]
local url_dependency_map_t = { -- table of url-holding parameters and the meta-parameters that are dependent on them
['url'] = {'AccessDate', 'ArchiveURL', 'Format', 'UrlAccess'},
['archive-url'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['archiveurl'] = {'ArchiveDate', 'ArchiveFormat', 'UrlStatus'},
['article-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['chapter-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['conference-url'] = {'ConferenceFormat'},
['contribution-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['entry-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['map-url'] = {'MapFormat', 'MapUrlAccess'},
['section-url'] = {'ChapterFormat', 'ChapterUrlAccess'},
['transcript-url'] = {'TranscriptFormat'},
};
local dependencies_t = {}; -- the table of url-holding parameters and their dependent parameters
for url_param, meta_parameters_t in pairs (url_dependency_map_t) do -- sequence of meta-parameters (indexes) into <aliases> table
local dependant_params_t = {}; -- collection of parameters that are dependent on this <url_param>
for _, meta_parameter in ipairs (meta_parameters_t) do -- for each <aliases> meta-parameter (index)
if 'string' == type (aliases[meta_parameter]) then -- for single parameter names (no aliases), <aliases[meta_parameter]> will be a string
table.insert (dependant_params_t, aliases[meta_parameter]); -- add to this <url_param>'s dependency sequence
else
for _, alias in ipairs (aliases[meta_parameter]) do -- for each alias in aliases[meta_parameter] (aliases['AccessDate'] for example)
table.insert (dependant_params_t, alias); -- add to this <url_param>'s dependency sequence
end
end
end
dependencies_t[url_param] = dependant_params_t; -- add the <url_param> and its dependent parameters
end
--[[--------------------------< P U N C T _ S K I P >---------------------------
builds a table of parameter names that the extraneous terminal punctuation check should not check.
]]
local punct_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters
'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators
'PostScript', 'Quote', 'ScriptQuote', 'TransQuote', 'Ref', -- miscellaneous
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'MapURL', 'TranscriptURL', 'URL', -- URL-holding parameters
}
local url_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'ID', 'MapURL', 'TranscriptURL', 'URL', -- parameters allowed to hold urls
'Page', 'Pages', 'At', 'QuotePage', 'QuotePages', -- insource locators allowed to hold urls
}
local function build_skip_table (skip_t, meta_params)
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key
local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name
if 'string' == type (params) then
skip_t[params] = 1; -- just a single parameter
else
for _, param in ipairs (params) do -- get the parameter name
skip_t[param] = 1; -- add the parameter name to the skip table
local count;
param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters
if 0 ~= count then -- if removed
skip_t[param] = 1; -- add param name without enumerator marker
end
end
end
end
return skip_t;
end
local punct_skip = {};
local url_skip = {};
--[[--------------------------< U R L _ A C C E S S _ M A P >--------------------------------------------------
this table used by the wikipedia library url test, has_twl_url(), which automatically sets a url-access parameter
to 'subscription' when it discovers a wikipedia library url in any of the url-holding paramters used as keys in
this table.
translators: if your wiki uses parameter names for these url-holding parameters and their matching -access parameters,
add your wiki's parameters to this list. Leave the English parameters in place.
TODO: is there a better way to do this?
]]
local url_access_map_t = {
['chapter-url'] = 'chapter-url-access',
['contribution-url'] = 'contribution-url-access',
['entry-url'] = 'entry-url-access',
['article-url'] = 'article-url-access',
['section-url'] = 'section-url-access',
['map-url'] = 'map-url-access',
['mapurl'] = 'map-url-access',
['url'] = 'url-access',
['URL'] = 'url-access'
}
--[[--------------------------< S I N G L E - L E T T E R S E C O N D - L E V E L D O M A I N S >----------
this is a list of tlds that are known to have single-letter second-level domain names. This list does not include
ccTLDs which are accepted in is_domain_name().
]]
local single_letter_2nd_lvl_domains_t = {'cash', 'company', 'foundation', 'media', 'org', 'today'};
--[[-----------< S P E C I A L C A S E T R A N S L A T I O N S >------------
This table is primarily here to support internationalization. Translations in
this table are used, for example, when an error message, category name, etc.,
is extracted from the English alias key. There may be other cases where
this translation table may be useful.
]]
local is_Latn = 'A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191';
local special_case_translation = {
author = 'author',
editor = 'editor',
name_list_params = '$1-name-list parameters', -- $1 is 'author' or 'editor'; used with err_redundant_parameters
['AuthorList'] = 'authors list', -- used to assemble maintenance category names
['ContributorList'] = 'contributors list', -- translation of these names plus translation of the base maintenance category names in maint_cats{} table below
['EditorList'] = 'editors list', -- must match the names of the actual categories
['InterviewerList'] = 'interviewers list', -- this group or translations used by name_has_ed_markup() and name_has_mult_names()
['TranslatorList'] = 'translators list',
-- Lua patterns to match pseudo-titles used by InternetArchiveBot and others as placeholder for unknown |title= value
['archived_copy'] = { -- used with CS1 maint: Archive[d] copy as title
['en'] = '^archived?%s+copy$', -- for English; translators: keep this because templates imported from en.wiki
['local'] = nil, -- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
},
-- Lua patterns to match generic titles; usually created by bots or reference filling tools
-- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
-- generic titles and patterns in this table should be lowercase only
-- leave ['local'] nil except when there is a matching generic title in your language
-- boolean 'true' for plain-text searches; 'false' for pattern searches
['generic_titles'] = {
['accept'] = {
},
['reject'] = {
{['en'] = {'^wayback%s+machine$', false}, ['local'] = nil},
{['en'] = {'are you a robot', true}, ['local'] = nil},
{['en'] = {'hugedomains', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?no +title[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'page not found', true}, ['local'] = nil},
{['en'] = {'subscribe to read', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?unknown[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'website is for sale', true}, ['local'] = nil},
{['en'] = {'^404', false}, ['local'] = nil},
{['en'] = {'error[ %-]404', false}, ['local'] = nil},
{['en'] = {'internet archive wayback machine', true}, ['local'] = nil},
{['en'] = {'log into facebook', true}, ['local'] = nil},
{['en'] = {'login • instagram', true}, ['local'] = nil},
{['en'] = {'redirecting...', true}, ['local'] = nil},
{['en'] = {'usurped title', true}, ['local'] = nil}, -- added by a GreenC bot
{['en'] = {'wayback machine', true}, ['local'] = nil},
{['en'] = {'webcite query result', true}, ['local'] = nil},
{['en'] = {'wikiwix\'s cache', true}, ['local'] = nil},
{['en'] = {'bot verification', true}, ['local'] = nil},
}
},
-- boolean 'true' for plain-text searches, search string must be lowercase only
-- boolean 'false' for pattern searches
-- leave ['local'] nil except when there is a matching generic name in your language
['generic_names'] = {
['accept'] = {
{['en'] = {'%[%[[^|]*%(author%) *|[^%]]*%]%]', false}, ['local'] = nil},
},
['reject'] = {
{['en'] = {'about us', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]dvisor%f[%A]', false}, ['local'] = nil},
{['en'] = {'allmusic', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]uthor%f[%A]', false}, ['local'] = nil},
{['en'] = {'^[Bb]ureau$', false}, ['local'] = nil},
{['en'] = {'business', true}, ['local'] = nil},
{['en'] = {'cnn', true}, ['local'] = nil},
{['en'] = {'collaborator', true}, ['local'] = nil},
{['en'] = {'^[Cc]ompany$', false}, ['local'] = nil},
{['en'] = {'contributor', true}, ['local'] = nil},
{['en'] = {'contact us', true}, ['local'] = nil},
{['en'] = {'correspondent', true}, ['local'] = nil},
{['en'] = {'^[Dd]esk$', false}, ['local'] = nil},
{['en'] = {'directory', true}, ['local'] = nil},
{['en'] = {'%f[%(%[][%(%[]%s*eds?%.?%s*[%)%]]?$', false}, ['local'] = nil},
{['en'] = {'[,%.%s]%f[e]eds?%.?$', false}, ['local'] = nil},
{['en'] = {'^eds?[%.,;]', false}, ['local'] = nil},
{['en'] = {'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]dited%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]ditors?%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]mail%f[%A]', false}, ['local'] = nil},
{['en'] = {'facebook', true}, ['local'] = nil},
{['en'] = {'google', true}, ['local'] = nil},
{['en'] = {'^[Gg]roup$', false}, ['local'] = nil},
{['en'] = {'home page', true}, ['local'] = nil},
{['en'] = {'^[Ii]nc%.?$', false}, ['local'] = nil},
{['en'] = {'instagram', true}, ['local'] = nil},
{['en'] = {'interviewer', true}, ['local'] = nil},
{['en'] = {'^[Ll]imited$', false}, ['local'] = nil},
{['en'] = {'linkedIn', true}, ['local'] = nil},
{['en'] = {'^[Nn]ews$', false}, ['local'] = nil},
{['en'] = {'[Nn]ews[ %-]?[Rr]oom', false}, ['local'] = nil},
{['en'] = {'pinterest', true}, ['local'] = nil},
{['en'] = {'policy', true}, ['local'] = nil},
{['en'] = {'privacy', true}, ['local'] = nil},
{['en'] = {'reuters', true}, ['local'] = nil},
{['en'] = {'translator', true}, ['local'] = nil},
{['en'] = {'tumblr', true}, ['local'] = nil},
{['en'] = {'twitter', true}, ['local'] = nil},
{['en'] = {'site name', true}, ['local'] = nil},
{['en'] = {'statement', true}, ['local'] = nil},
{['en'] = {'submitted', true}, ['local'] = nil},
{['en'] = {'super.?user', false}, ['local'] = nil},
{['en'] = {'%f['..is_Latn..'][Uu]ser%f[^'..is_Latn..']', false}, ['local'] = nil},
{['en'] = {'updated', true}, ['local'] = nil},
{['en'] = {'verfasser', true}, ['local'] = nil},
}
}
}
--[[--------------------------< D A T E _ N A M E S >----------------------------------------------------------
This table of tables lists local language date names and fallback English date names.
The code in Date_validation will look first in the local table for valid date names.
If date names are not found in the local table, the code will look in the English table.
Because citations can be copied to the local wiki from en.wiki, the English is
required when the date-name translation function date_name_xlate() is used.
In these tables, season numbering is defined by
Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard
defines various divisions using numbers 21-41. CS1|2 only supports generic seasons.
EDTF does support the distinction between north and south hemisphere seasons
but CS1|2 has no way to make that distinction.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
The standard does not address 'named' dates so, for the purposes of CS1|2,
Easter and Christmas are defined here as 98 and 99, which should be out of the
ISO 8601 (EDTF) range of uses for a while.
local_date_names_from_mediawiki is a boolean. When set to:
true – module will fetch local month names from MediaWiki for both date_names['local']['long'] and date_names['local']['short']; this will unconditionally overwrite manual translations
false – module will *not* fetch local month names from MediaWiki
Caveat lector: There is no guarantee that MediaWiki will provide short month names. At your wiki you can test
the results of the MediaWiki fetch in the debug console with this command (the result is alpha sorted):
=mw.dumpObject (p.date_names['local'])
While the module can fetch month names from MediaWiki, it cannot fetch the quarter, season, and named date names
from MediaWiki. Those must be translated manually.
]]
local local_date_names_from_mediawiki = true; -- when false, manual translation required for date_names['local']['long'] and date_names['local']['short']; overwrites manual translations
-- when true, module fetches long and short month names from MediaWiki
local date_names = {
['en'] = { -- English
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
-- when local_date_names_from_mediawiki = false
['local'] = { -- replace these English date names with the local language equivalents
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
['inv_local_long'] = {}, -- used in date reformatting & translation; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc.
['inv_local_short'] = {}, -- used in date reformatting & translation; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc.
['inv_local_quarter'] = {}, -- used in date translation; copy of date_names['local'].quarter where k/v are inverted: [1]='<local name>' etc.
['inv_local_season'] = {}, -- used in date translation; copy of date_names['local'].season where k/v are inverted: [1]='<local name>' etc.
['inv_local_named'] = {}, -- used in date translation; copy of date_names['local'].named where k/v are inverted: [1]='<local name>' etc.
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}, -- used to convert local language digits to Western 0-9
['xlate_digits'] = {},
}
if local_date_names_from_mediawiki then -- if fetching local month names from MediaWiki is enabled
local long_t = {};
local short_t = {};
for i=1, 12 do -- loop 12x and
local name = lang_obj:formatDate('F', '2022-' .. i .. '-1'); -- get long month name for each i
long_t[name] = i; -- save it
name = lang_obj:formatDate('M', '2022-' .. i .. '-1'); -- get short month name for each i
short_t[name] = i; -- save it
end
date_names['local']['long'] = long_t; -- write the long table – overwrites manual translation
date_names['local']['short'] = short_t; -- write the short table – overwrites manual translation
end
-- create inverted date-name tables for reformatting and/or translation
for _, invert_t in pairs {{'long', 'inv_local_long'}, {'short', 'inv_local_short'}, {'quarter', 'inv_local_quarter'}, {'season', 'inv_local_season'}, {'named', 'inv_local_named'}} do
for name, i in pairs (date_names['local'][invert_t[1]]) do -- this table is ['name'] = i
date_names[invert_t[2]][i] = name; -- invert to get [i] = 'name' for conversions from ymd
end
end
if local_digits_from_mediawiki then -- if fetching local digits from MediaWiki is enabled
local digits_t = {};
for i=0, 9 do -- loop 10x and
digits_t [lang_obj:formatNum (i)] = tostring (i); -- format the loop indexer as local lang table index and assign loop indexer (a string) as the value
end
date_names['local_digits'] = digits_t;
end
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}}
'{{ *[Uu]se +(dmy) +dates *[|}]', -- 1159k -- sorted by approximate transclusion count
'{{ *[Uu]se +(mdy) +dates *[|}]', -- 212k
'{{ *[Uu]se +(MDY) +dates *[|}]', -- 788
'{{ *[Uu]se +(DMY) +dates *[|}]', -- 343
'{{ *([Mm]dy) *[|}]', -- 176
'{{ *[Uu]se *(dmy) *[|}]', -- 156 + 18
'{{ *[Uu]se *(mdy) *[|}]', -- 149 + 11
'{{ *([Dd]my) *[|}]', -- 56
'{{ *[Uu]se +(MDY) *[|}]', -- 5
'{{ *([Dd]MY) *[|}]', -- 3
'{{ *[Uu]se(mdy)dates *[|}]', -- 1
'{{ *[Uu]se +(DMY) *[|}]', -- 0
'{{ *([Mm]DY) *[|}]', -- 0
}
local title_object = mw.title.getCurrentTitle();
local content; -- done this way so that unused templates appear in unused-template-reports; self-transcluded makes them look like they are used
if 10 ~= title_object.namespace then -- all namespaces except Template
content = title_object:getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
end
local function get_date_format ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
for _, pattern in ipairs (df_template_patterns) do -- loop through the patterns looking for {{Use dmy dates}} or {{Use mdy dates}} or any of their redirects
local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format
if match then
local use_dates_template = content:match ('%b{}', start); -- get the whole template
if use_dates_template:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length
return match:lower() .. '-' .. use_dates_template:match ('| *cs1%-dates *= *([lsy][sy]?)');
else
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df=
end
end
end
end
--[[-----------------< V O L U M E , I S S U E , P A G E S >------------------
These tables hold cite class values (from the template invocation) and identify those templates that support
|volume=, |issue=, and |page(s)= parameters. Cite conference and cite map require further qualification which
is handled in the main module.
]]
local templates_using_volume = {'citation', 'audio-visual', 'book', 'conference', 'encyclopaedia', 'interview', 'journal', 'magazine', 'map', 'news', 'report', 'techreport', 'thesis'}
local templates_using_issue = {'citation', 'conference', 'episode', 'interview', 'journal', 'magazine', 'map', 'news', 'podcast'}
local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'}
--[[
These tables control when it is appropriate for {{citation}} to render |volume= and/or |issue=. The parameter
names in the tables constrain {{citation}} so that its renderings match the renderings of the equivalent cs1
templates. For example, {{cite web}} does not support |volume= so the equivalent {{citation |website=...}} must
not support |volume=.
]]
local citation_no_volume_t = { -- {{citation}} does not render |volume= when these parameters are used
'website', 'mailinglist', 'script-website',
}
local citation_issue_t = { -- {{citation}} may render |issue= when these parameters are used
'journal', 'magazine', 'newspaper', 'periodical', 'work',
'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work',
}
--[[
Patterns for finding extra text in |volume=, |issue=, |page=, |pages=
]]
local vol_iss_pg_patterns = {
good_ppattern = '^P[^%.PpGg]', -- OK to begin with uppercase P: P7 (page 7 of section P), but not p123 (page 123); TODO: this allows 'Pages' which it should not
bad_ppatterns = { -- patterns for |page= and |pages=
'^[Pp][PpGg]?%.?[ %d]',
'^[Pp][Pp]?%. ', -- from {{p.}} and {{pp.}} templates
'^[Pp]ages?',
'^[Pp]gs.?',
},
vi_patterns_t = { -- combined to catch volume-like text in |issue= and issue-like text in |volume=
'^volumes?', -- volume-like text
'^vols?[%.:=]?',
'^issues?', --issue-like text
'^iss[%.:=]?',
'^numbers?',
'^nos?%A', -- don't match 'november' or 'nostradamus'
'^nr[%.:=]?',
'^n[%.:= ]', -- might be a valid issue without separator (space char is sep char here)
'^n°', -- 'n' with degree sign (U+00B0)
'^№', -- precomposed unicode numero character (U+2116)
},
}
--[[--------------------------< K E Y W O R D S >-------------------------------
These tables hold keywords for those parameters that have defined sets of acceptable keywords.
]]
--[[-------------------< K E Y W O R D S T A B L E >--------------------------
this is a list of keywords; each key in the list is associated with a table of
synonymous keywords possibly from different languages.
for I18N: add local-language keywords to value table; do not change the key.
For example, adding the German keyword 'ja':
['affirmative'] = {'yes', 'true', 'y', 'ja'},
Because CS1|2 templates from en.wiki articles are often copied to other local wikis,
it is recommended that the English keywords remain in these tables.
]]
local keywords = {
['amp'] = {'&', 'amp', 'ampersand'}, -- |name-list-style=
['and'] = {'and', 'serial'}, -- |name-list-style=
['affirmative'] = {'yes', 'true', 'y'}, -- |no-tracking=, |no-pp= -- Used by InternetArchiveBot
['afterword'] = {'afterword'}, -- |contribution=
['bot: unknown'] = {'bot: unknown'}, -- |url-status= -- Used by InternetArchiveBot
['cs1'] = {'cs1'}, -- |mode=
['cs2'] = {'cs2'}, -- |mode=
['dead'] = {'dead', 'deviated'}, -- |url-status= -- Used by InternetArchiveBot
['dmy'] = {'dmy'}, -- |df=
['dmy-all'] = {'dmy-all'}, -- |df=
etal = {'etal'}, -- |display-authors=, etc
['foreword'] = {'foreword'}, -- |contribution=
['free'] = {'free'}, -- |<id>-access= -- Used by InternetArchiveBot
['harv'] = {'harv'}, -- |ref=; this no longer supported; is_valid_parameter_value() called with <invert> = true
['introduction'] = {'introduction'}, -- |contribution=
['limited'] = {'limited'}, -- |url-access= -- Used by InternetArchiveBot
['live'] = {'live'}, -- |url-status= -- Used by InternetArchiveBot
['mdy'] = {'mdy'}, -- |df=
['mdy-all'] = {'mdy-all'}, -- |df=
['none'] = {'none'}, -- |postscript=, |ref=, |title=, |type= -- Used by InternetArchiveBot
['off'] = {'off'}, -- |title= (potentially also: |title-link=, |postscript=, |ref=, |type=)
['preface'] = {'preface'}, -- |contribution=
['registration'] = {'registration'}, -- |url-access= -- Used by InternetArchiveBot
['subscription'] = {'subscription'}, -- |url-access= -- Used by InternetArchiveBot
['unfit'] = {'unfit'}, -- |url-status= -- Used by InternetArchiveBot
['usurped'] = {'usurped'}, -- |url-status= -- Used by InternetArchiveBot
['vanc'] = {'vanc'}, -- |name-list-style=
['ymd'] = {'ymd'}, -- |df=
['ymd-all'] = {'ymd-all'}, -- |df=
-- ['yMd'] = {'yMd'}, -- |df=; not supported at en.wiki
-- ['yMd-all'] = {'yMd-all'}, -- |df=; not supported at en.wiki
}
--[[------------------------< X L A T E _ K E Y W O R D S >---------------------
this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{}
become the keys in keywords_xlate{} and the keys from keywords{} become the values in keywords_xlate{}:
['affirmative'] = {'yes', 'true', 'y'}, -- in keywords{}
becomes
['yes'] = 'affirmative', -- in keywords_xlate{}
['true'] = 'affirmative',
['y'] = 'affirmative',
the purpose of this function is to act as a translator between a non-English keyword and its English equivalent
that may be used in other modules of this suite
]]
local function xlate_keywords ()
local out_table = {}; -- output goes here
for k, keywords_t in pairs (keywords) do -- spin through the keywords table
for _, keyword in ipairs (keywords_t) do -- for each keyword
out_table[keyword] = k; -- create an entry in the output table where keyword is the key
end
end
return out_table;
end
local keywords_xlate = xlate_keywords (); -- the list of translated keywords
--[[----------------< M A K E _ K E Y W O R D S _ L I S T >---------------------
this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter.
keywords_lists{}, is a table of tables from keywords{}
]]
local function make_keywords_list (keywords_lists)
local out_table = {}; -- output goes here
for _, keyword_list in ipairs (keywords_lists) do -- spin through keywords_lists{} and get a table of keywords
for _, keyword in ipairs (keyword_list) do -- spin through keyword_list{} and add each keyword, ...
table.insert (out_table, keyword); -- ... as plain text, to the output list
end
end
return out_table;
end
--[[----------------< K E Y W O R D S _ L I S T S >-----------------------------
this is a list of lists of valid keywords for the various parameters in [key].
Generally the keys in this table are the canonical en.wiki parameter names though
some are contrived because of use in multiple differently named parameters:
['yes_true_y'], ['id-access'].
The function make_keywords_list() extracts the individual keywords from the
appropriate list in keywords{}.
The lists in this table are used to validate the keyword assignment for the
parameters named in this table's keys.
]]
local keywords_lists = {
['yes_true_y'] = make_keywords_list ({keywords.affirmative}),
['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}),
['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}),
-- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki
['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}),
['name-list-style'] = make_keywords_list ({keywords.amp, keywords['and'], keywords.vanc}),
['ref'] = make_keywords_list ({keywords.harv}), -- inverted check; |ref=harv no longer supported
['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}),
['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}),
['id-access'] = make_keywords_list ({keywords.free}),
}
--[[--------------------------< C S 1 _ C O N F I G _ G E T >--------------------------------------------------
fetch and validate values from {{cs1 config}} template to fill <global_cs1_config_t>
no error messages; when errors are detected, the parameter value from {{cs1 config}} is blanked.
Supports all parameters and aliases associated with the metaparameters: DisplayAuthors, DisplayContributors,
DisplayEditors, DisplayInterviewers, DisplayTranslators, NameListStyle, and Mode. The DisplayWhatever metaparameters
accept numeric values only (|display-authors=etal and the like is not supported).
]]
local global_cs1_config_t = {}; -- TODO: add value returned from get_date_format() to this table?
local function get_cs1_config ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
local start = content:find('{{ *[Cc][Ss]1 config *[|}]'); -- <start> is offset into <content> when {{cs1 config}} found; nil else
if start then
local cs1_config_template = content:match ('%b{}', start); -- get the whole template
if not cs1_config_template then
return nil;
end
local params_t = mw.text.split (cs1_config_template:gsub ('^{{%s*', ''):gsub ('%s*}}$', ''), '%s*|%s*'); -- remove '{{' and '}}'; make a sequence of parameter/value pairs (split on the pipe)
table.remove (params_t, 1); -- remove the template name because it isn't a parameter/value pair
local config_meta_params_t = {'DisplayAuthors', 'DisplayContributors', 'DisplayEditors', 'DisplayInterviewers', 'DisplayTranslators', 'NameListStyle', 'Mode'};
local meta_param_map_t = {}; -- list of accepted parameter names usable in {{cs1 config}} goes here
for _, meta_param in ipairs (config_meta_params_t) do -- for i18n using <config_meta_params_t>, map template parameter names to their metaparameter equivalents
if 'table' == type (aliases[meta_param]) then -- if <meta_param> is a sequence,
for _, param in ipairs (aliases[meta_param]) do -- extract its contents
meta_param_map_t[param] = meta_param; -- and add to <meta_param_map_t>
end
else
meta_param_map_t[aliases[meta_param]] = meta_param; -- not a sequence so just add the parameter to <meta_param_map_t>
end
end
local keywords_t = {}; -- map valid keywords to their associate metaparameter; reverse form of <keyword_lists[key] for these metaparameters
for _, metaparam_t in ipairs ({{'NameListStyle', 'name-list-style'}, {'Mode', 'mode'}}) do -- only these metaparameter / keywords_lists key pairs
for _, keyword in ipairs (keywords_lists[metaparam_t[2]]) do -- spin through the list of keywords
keywords_t[keyword] = metaparam_t[1]; -- add [keyword] = metaparameter to the map
end
end
for _, param in ipairs (params_t) do -- spin through the {{cs1 config}} parameters and fill <global_cs1_config_t>
local k, v = param:match ('([^=]-)%s*=%s*(.+)'); -- <k> is the parameter name; <v> is parameter's assigned value
if k then
if k:find ('^display') then -- if <k> is one of the |display-<namelist>= parameters
if v:match ('%d+') then -- the assigned value must be digits; doesn't accept 'etal'
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the display param and its value to globals table
end
else
if keywords_t[v] == meta_param_map_t[k] then -- keywords_t[v] returns nil or the metaparam name; these must be the same
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the parameter and its value to globals table
end
end
end
end
end
end
get_cs1_config (); -- fill <global_cs1_config_t>
--[[---------------------< S T R I P M A R K E R S >----------------------------
Common pattern definition location for stripmarkers so that we don't have to go
hunting for them if (when) MediaWiki changes their form.
]]
local stripmarkers = {
['any'] = '\127[^\127]*UNIQ%-%-(%a+)%-[%a%d]+%-QINU[^\127]*\127', -- capture returns name of stripmarker
['math'] = '\127[^\127]*UNIQ%-%-math%-[%a%d]+%-QINU[^\127]*\127' -- math stripmarkers used in coins_cleanup() and coins_replace_math_stripmarker()
}
--[[------------< I N V I S I B L E _ C H A R A C T E R S >---------------------
This table holds non-printing or invisible characters indexed either by name or
by Unicode group. Values are decimal representations of UTF-8 codes. The table
is organized as a table of tables because the Lua pairs keyword returns table
data in an arbitrary order. Here, we want to process the table from top to bottom
because the entries at the top of the table are also found in the ranges specified
by the entries at the bottom of the table.
Also here is a pattern that recognizes stripmarkers that begin and end with the
delete characters. The nowiki stripmarker is not an error but some others are
because the parameter values that include them become part of the template's
metadata before stripmarker replacement.
]]
local invisible_defs = {
del = '\127', -- used to distinguish between stripmarker and del char
zwj = '\226\128\141', -- used with capture because zwj may be allowed
}
local invisible_chars = {
{'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD
{'zero width joiner', '('.. invisible_defs.zwj .. ')'}, -- U+200D, E2 80 8D; capture because zwj may be allowed
{'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B
{'hair space', '\226\128\138'}, -- U+200A, E2 80 8A
{'soft hyphen', '\194\173'}, -- U+00AD, C2 AD
{'horizontal tab', '\009'}, -- U+0009 (HT), 09
{'line feed', '\010'}, -- U+000A (LF), 0A
{'no-break space', '\194\160'}, -- U+00A0 (NBSP), C2 A0
{'carriage return', '\013'}, -- U+000D (CR), 0D
{'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type
{'delete', '('.. invisible_defs.del .. ')'}, -- U+007F (DEL), 7F; must be done after stripmarker test; capture to distinguish isolated del chars not part of stripmarker
{'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D))
{'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F
-- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF
-- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF
-- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD
-- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD
}
--[[
Indic script makes use of zero width joiner as a character modifier so zwj
characters must be left in. This pattern covers all of the unicode characters
for these languages:
Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf
Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf
Bengali 0980–09FF – https://unicode.org/charts/PDF/U0980.pdf
Gurmukhi 0A00–0A7F – https://unicode.org/charts/PDF/U0A00.pdf
Gujarati 0A80–0AFF – https://unicode.org/charts/PDF/U0A80.pdf
Oriya 0B00–0B7F – https://unicode.org/charts/PDF/U0B00.pdf
Tamil 0B80–0BFF – https://unicode.org/charts/PDF/U0B80.pdf
Telugu 0C00–0C7F – https://unicode.org/charts/PDF/U0C00.pdf
Kannada 0C80–0CFF – https://unicode.org/charts/PDF/U0C80.pdf
Malayalam 0D00–0D7F – https://unicode.org/charts/PDF/U0D00.pdf
plus the not-necessarily Indic scripts for Sinhala and Burmese:
Sinhala 0D80-0DFF - https://unicode.org/charts/PDF/U0D80.pdf
Myanmar 1000-109F - https://unicode.org/charts/PDF/U1000.pdf
Myanmar extended A AA60-AA7F - https://unicode.org/charts/PDF/UAA60.pdf
Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf
the pattern is used by has_invisible_chars() and coins_cleanup()
]]
local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]';
-- list of emoji that use a zwj character (U+200D) to combine with another emoji
-- from: https://www.unicode.org/Public/18.0.0/emoji/emoji-zwj-sequences.txt; version: 18.0; 2026-01-09
-- table created by: [[:en:Module:Make emoji zwj table]]
local emoji_t = { -- indexes are decimal forms of the hex values in U+xxxx
[8596] = true, -- U+2194 ↔ left right arrow
[8597] = true, -- U+2195 ↕ up down arrow
[9760] = true, -- U+2620 ☠ skull and crossbones
[9792] = true, -- U+2640 ♀ female sign
[9794] = true, -- U+2642 ♂ male sign
[9877] = true, -- U+2695 ⚕ staff of aesculapius
[9878] = true, -- U+2696 ⚖ scales
[9895] = true, -- U+26A7 ⚧ male with stroke and male and female sign
[9992] = true, -- U+2708 ✈ airplane
[10052] = true, -- U+2744 ❄ snowflake
[10084] = true, -- U+2764 ❤ heavy black heart
[10145] = true, -- U+27A1 ➡ black rightwards arrow
[11035] = true, -- U+2B1B ⬛ black large square
[127752] = true, -- U+1F308 🌈 rainbow
[127787] = true, -- U+1F32B 🌫 fog
[127806] = true, -- U+1F33E 🌾 ear of rice
[127859] = true, -- U+1F373 🍳 cooking
[127868] = true, -- U+1F37C 🍼 baby bottle
[127876] = true, -- U+1F384 🎄 christmas tree
[127891] = true, -- U+1F393 🎓 graduation cap
[127908] = true, -- U+1F3A4 🎤 microphone
[127912] = true, -- U+1F3A8 🎨 artist palette
[127979] = true, -- U+1F3EB 🏫 school
[127981] = true, -- U+1F3ED 🏭 factory
[128048] = true, -- U+1F430 🐰 rabbit face
[128102] = true, -- U+1F466 👦 boy
[128103] = true, -- U+1F467 👧 girl
[128104] = true, -- U+1F468 👨 man
[128105] = true, -- U+1F469 👩 woman
[128139] = true, -- U+1F48B 💋 kiss mark
[128165] = true, -- U+1F4A5 💥 collision symbol
[128168] = true, -- U+1F4A8 💨 dash symbol
[128171] = true, -- U+1F4AB 💫 dizzy symbol
[128187] = true, -- U+1F4BB 💻 personal computer
[128188] = true, -- U+1F4BC 💼 brief case
[128293] = true, -- U+1F525 🔥 fire
[128295] = true, -- U+1F527 🔧 wrench
[128300] = true, -- U+1F52C 🔬 microscope
[128488] = true, -- U+1F5E8 🗨 left speech bubble
[128640] = true, -- U+1F680 🚀 rocket
[128658] = true, -- U+1F692 🚒 fire engine
[129001] = true, -- U+1F7E9 🟩 large green square
[129003] = true, -- U+1F7EB 🟫 large brown square
[129309] = true, -- U+1F91D 🤝 handshake
[129455] = true, -- U+1F9AF 🦯 probing cane
[129456] = true, -- U+1F9B0 🦰 emoji component red hair
[129457] = true, -- U+1F9B1 🦱 emoji component curly hair
[129458] = true, -- U+1F9B2 🦲 emoji component bald
[129459] = true, -- U+1F9B3 🦳 emoji component white hair
[129466] = true, -- U+1F9BA 🦺 safety vest
[129468] = true, -- U+1F9BC 🦼 motorized wheelchair
[129469] = true, -- U+1F9BD 🦽 manual wheelchair
[129489] = true, -- U+1F9D1 🧑 adult
[129490] = true, -- U+1F9D2 🧒 child
[129648] = true, -- U+1FA70 🩰 ballet shoes
[129657] = true, -- U+1FA79 🩹 adhesive bandage
[129775] = true, -- U+1FAEF fight cloud
[129778] = true, -- U+1FAF2 🫲 leftwards hand
}
--[[----------------------< L A N G U A G E S U P P O R T >-------------------
These tables and constants support various language-specific functionality.
]]
local this_wiki_code = lang_obj:getCode(); -- get this wiki's language code
if string.match (mw.site.server, 'wikidata') then
this_wiki_code = mw.getCurrentFrame():callParserFunction('int', {'lang'}); -- on Wikidata so use interface language setting instead
end
local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_code, 'all'); -- get a table of language tag/name pairs known to Wikimedia; used for interwiki tests
local mw_languages_by_name_t = {};
for k, v in pairs (mw_languages_by_tag_t) do -- build a 'reversed' table name/tag language pairs know to MediaWiki; used for |language=
v = mw.ustring.lower (v); -- lowercase for tag fetch; get name's proper case from mw_languages_by_tag_t[<tag>]
if mw_languages_by_name_t[v] then -- when name already in the table
if 2 == #k or 3 == #k then -- if tag does not have subtags
mw_languages_by_name_t[v] = k; -- prefer the shortest tag for this name
end
else -- here when name not in the table
mw_languages_by_name_t[v] = k; -- so add name and matching tag
end
end
local inter_wiki_map = {}; -- map of interwiki prefixes that are language-code prefixes
for k, v in pairs (mw.site.interwikiMap ('local')) do -- spin through the base interwiki map (limited to local)
if mw_languages_by_tag_t[v["prefix"]] then -- if the prefix matches a known language tag
inter_wiki_map[v["prefix"]] = true; -- add it to our local map
end
end
--[[--------------------< S C R I P T _ L A N G _ C O D E S >-------------------
This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character
language codes that apply only to |script-title= and |script-chapter=
]]
local script_lang_codes = {
'ab', 'am', 'ar', 'as', 'az', 'be', 'bg', 'bn', 'bo', 'bs', 'ce', 'chr',
'cu', 'dv', 'dz', 'el', 'fa', 'grc', 'gu', 'he', 'hi', 'hy', 'ja', 'ka',
'kaa', 'kk', 'km', 'kn', 'ko', 'ku', 'ky', 'lo', 'mk', 'ml', 'mn', 'mni',
'mr', 'my', 'ne', 'or', 'ota', 'pa', 'ps', 'ru', 'sd', 'si', 'sr', 'syc',
'ta', 'te', 'tg', 'th', 'ti', 'tkr', 'tt', 'ug', 'uk', 'ur', 'uz', 'yi',
'yue', 'zh', 'zgh'
};
--[[---------------< L A N G U A G E R E M A P P I N G >----------------------
These tables hold language information that is different (correct) from MediaWiki's definitions
For each ['<tag>'] = 'language name' in lang_tag_remap{} there must be a matching ['language name'] = {'language name', '<tag>'} in lang_name_remap{}
lang_tag_remap{}:
key is always lowercase ISO 639-1, -2, -3 language tag or a valid lowercase IETF language tag
value is properly spelled and capitalized language name associated with <tag>
only one language name per <tag>;
key/value pair must have matching entry in lang_name_remap{}
lang_name_remap{}:
key is always lowercase language name
value is a table the holds correctly spelled and capitalized language name [1] and associated tag [2] (tag must match a tag key in lang_tag_remap{})
may have multiple keys referring to a common preferred name and tag; For example:
['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh'
]]
local lang_tag_remap = { -- used for |language= and |script-title= / |script-chapter=
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bla'] = 'Blackfoot', -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan
['fkv'] = 'Kven', -- MediaWiki returns Kvensk
['gsw'] = 'Swiss German',
['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name
['ksh-x-colog'] = 'Colognian', -- override MediaWiki ksh; no IANA/ISO 639 code for Colognian; IETF private code created at Module:Lang/data
['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data
['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name
['sr-ec'] = 'Serbian (Cyrillic script)', -- MediaWiki returns српски (ћирилица)
['sr-el'] = 'Serbian (Latin script)', -- MediaWiki returns srpski (latinica)
['tet'] = 'Tetun', -- MediaWiki returns Tetum
}
local lang_name_remap = { -- used for |language=; names require proper capitalization; tags must be lowercase
['alemannic'] = {'Swiss German', 'gsw'}, -- ISO 639-2, -3 alternate for Swiss German; MediaWiki mediawiki returns Alemannic for gsw; en.wiki preferred name
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh
['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö)
['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name
['kven'] = {'Kven', 'fkv'}, -- Unicode CLDR have decided not to support English language name for these two...
['kvensk'] = {'Kven', 'fkv'}, -- ...they say to refer to IANA registry for English names
['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639
['serbian (cyrillic script)'] = {'Serbian (Cyrillic script)', 'sr-cyrl'}, -- special case to get correct tag when |language=sr-ec
['serbian (latin script)'] = {'Serbian (Latin script)', 'sr-latn'}, -- special case to get correct tag when |language=sr-el
['swiss german'] = {'Swiss German', 'gsw'},
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan-tw'}, -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese
['tetum'] = {'Tetun', 'tet'},
['tetun'] = {'Tetun', 'tet'},
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found
['valencian'] = {'Valencian', 'ca-valencia'}, -- variant of Catalan; categorizes as Valencian
}
--[[---------------< P R O P E R T I E S _ C A T E G O R I E S >----------------
Properties categories. These are used for investigating qualities of citations.
]]
local prop_cats = {
['foreign-lang-source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is foreign-language name, $2 is ISO639-1 code
['foreign-lang-source-2'] = 'CS1 foreign language sources (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code used as a sort key
['interproj-linked-name'] = 'CS1 interproject-linked names|$1', -- any author, editor, etc that has an interproject link; $1 is interproject tag used as a sort key
['interwiki-linked-name'] = 'CS1 interwiki-linked names|$1', -- any author, editor, etc that has an interwiki link; $1 is interwiki tag used as a sort key; yeilds to interproject
['local-lang-source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is local-language name, $2 is ISO639-1 code; not emitted when local_lang_cat_enable is false
['location-test'] = 'CS1 location test',
['long-vol'] = 'CS1: long volume value', -- probably temporary cat to identify scope of |volume= values longer than 4 characters
['script'] = 'CS1 uses $1-language script ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is language tag
['tracked-param'] = 'CS1 tracked parameter: $1', -- $1 is base (enumerators removed) parameter name
['unfit'] = 'CS1: unfit URL', -- |url-status=unfit or |url-status=usurped; used to be a maint cat
['vanc-accept'] = 'CS1:Vancouver names with accept markup', -- for |vauthors=/|veditors= with accept-as-written markup
['year-range-abbreviated'] = 'CS1: abbreviated year range', -- probably temporary cat to identify scope of |date=, |year= values using YYYY–YY form
}
--[[-------------------< T I T L E _ T Y P E S >--------------------------------
Here we map a template's CitationClass to TitleType (default values for |type= parameter)
]]
local title_types = {
['AV-media-notes'] = 'Media notes',
['document'] = 'Document',
['interview'] = 'Interview',
['mailinglist'] = 'Mailing list',
['map'] = 'Map',
['podcast'] = 'Podcast',
['pressrelease'] = 'Press release',
['report'] = 'Report',
['speech'] = 'Speech',
['techreport'] = 'Technical report',
['thesis'] = 'Thesis',
}
--[[--------------------------< B U I L D _ K N O W N _ F R E E _ D O I _ R E G I S T R A N T S _ T A B L E >--
build a table of doi registrants known to be free-to-read In a doi, the registrant ID is the series of digits
between the '10.' and the first '/': in doi 10.1100/sommat, 1100 is the registrant ID
see §3.2.2 DOI prefix of the Doi Handbook p. 43
https://www.doi.org/doi-handbook/DOI_Handbook_Final.pdf#page=43
]]
local function build_free_doi_registrants_table()
local registrants_t = {};
for _, v in ipairs ({
'1045', '1074', '1096', '1100', '1155', '1186', '1194', '1371', '1613', '1629', '1989', '1999', '2147', '2196', '3114', '3285', --for 10.1155/... ISRN prior to 2007 should not be flagged--
'3389', '3390', '3767', '3906', '3748', '3814', '3847', '3897', '4061', '4089', '4102', '4103', '4172', '4175', '4230', '4236', '4239',
'4240', '4249', '4251', '4252', '4253', '4254', '4291', '4292', '4312', '4329', '4330', '4331', '5070', '5074', '5086', '5194', '5210',
'5306', '5312', '5313', '5314', '5315', '5316', '5317', '5318', '5319', '5320', '5321', '5334', '5402', '5409', '5410', '5411',
'5412', '5492', '5493', '5494', '5495', '5496', '5497', '5498', '5499', '5500', '5501', '5527', '5528', '5662', '6064', '6219',
'7167', '7217', '7287', '7482', '7490', '7554', '7717', '7759', '7766', '9778',
'11131', '11569', '11647', '11648', '12688', '12703', '12715', '12942', '12998', '13105', '14256', '14293', '14303', '14502', '14720',
'15215', '15227', '15292', '15458', '15347', '15412', '15560', '16995', '17573', '17645', '18553', '18637', '18757', '19080', '19173',
'20419', '20944', '21037', '21105', '21468', '21767', '21425', '22261', '22323', '22459', '24105', '24196', '24404', '24413', '24966',
'26529', '26614', '26775', '26873', '30845', '32545', '34291', '34641', '35711', '35712', '35713', '35995', '36648', '37126', '37532',
'37871', '47128', '47622', '47959', '48438', '51741', '51746', '51935', '51936', '51937', '51938', '51939', '51940', '52165', '52437',
'52975', '53288', '53347', '54081', '54947', '55295', '55667', '55741', '55914', '56042', '57009', '58647', '58782', '59081', '59490',
'61375', '66183', '70587',
}) do
registrants_t[v] = true; -- build a k/v table of known free-to-read doi registrants
end
return registrants_t;
end
-- known free registrants identifiable by the doi suffix incipit
local extended_registrants_t = { -- doi suffix incipits are evaluated as lua patterns
['1001'] = {'jamanetworkopen', 'jamahealthforum'}, -- JAMA Network Open, JAMA Health Forum
['1002'] = {'1878-0261', '2056-4538', '2211-5463', '2475-8876', '2688-8319', 'aaai%.', 'aac2%.', 'ache%.', 'acm2%.', 'acn3%.', 'acr2%.', 'admi%.', 'adpr%.', 'adrr%.', 'adsr%.', 'advs%.', 'ael2%.', 'aelm%.', 'aesr%.', 'aff2%.', 'agf2%.', 'agg2%.', 'agm2%.', 'ags3%.', 'agt2%.', 'aidi%.', 'ail2%.', 'aisy%.', 'aiv2%.', 'alz%.', 'ame2%.', 'ams2%.', 'anbr%.', 'ansa%.', 'apj%.', 'app5%.', 'aps3%.', 'apxr%.', 'aro2%.', 'ars2%.', 'asl2%.', 'atn2%.', 'bco2%.', 'bes2%.', 'bmm2%.', 'bod2%.', 'brb3%.', 'brh2%.', 'brx2%.', 'bsa3%.', 'bte2%.', 'btm2%.', 'cai2%.', 'cam4%.', 'cbh2%.', 'ccr3%.', 'ccs3%.', 'cdt3%.', 'celc%.', 'cep4%.', 'ces2%.', 'cesm%.', 'ceur%.', 'cey2%.', 'cfch%.', 'cfp2%.', 'cin4%.', 'clc%.', 'clem%.', 'cli2%.', 'clt2%.', 'cmt2%.', 'cmtd%.', 'cnl2%.', 'cnr2%.', 'cns%.', 'cns3%.', 'cnx2%.', 'cre2%.', 'csc3%.', 'cso2%.', 'ctd2%.', 'cti2%.', 'ctm2%.', 'dad2%.', 'deo2%.', 'dep2%.', 'dni2%.', 'dro2%.', 'dug2%.', 'dvr2%.', 'eas2%.', 'ece2%.', 'ece3%.', 'ecog%.', 'ecs2%.', 'edm2%.', 'edn3%.', 'eem2%.', 'eer3%.', 'efd2%.', 'ejsc%.', 'elsa%.', 'elt2%.', 'eng2%.', 'eom2%.', 'epi4%.', 'epr2%.', 'ese3%.', 'exp%.', 'fbe2%.', 'fci2%.', 'fer3%.', 'fes3%.', 'fft2%.', 'fhu2%.', 'fle2%.', 'flm2%.', 'fob2%.', 'fpf2%.', 'fsh3%.', 'fsn3%.', 'gcb4%.', 'gch2%.', 'gdj3%.', 'geo2%.', 'ggn2%.', 'gin2%.', 'glr2%.', 'gps3%.', 'gtm2%.', 'hbm%.', 'hcs2%.', 'hem3%.', 'hkj2%.', 'hsr2%.', 'ibra%.', 'idm2%.', 'ifm2%.', 'iid3%.', 'iju5%.', 'ila2%.', 'imed%.', 'imm3%.', 'imo2%.', 'imt2%.', 'inc2%.', 'inc3%.', 'inf2%.', 'inm3%.', 'inmd%.', 'ird3%.', 'ise3%.', 'jaa2%.', 'jav%.', 'jbt%.', 'jcc5%.', 'jcla%.', 'jcsm%.', 'jcv2%.', 'jeo2%.', 'jev2%.', 'jex2%.', 'jfa2%.', 'jgf2%.', 'jgh3%.', 'jha2%.', 'jia2%.', 'jmd2%.', 'jmrs%.', 'joa3%.', 'jpr3%.', 'jsf2%.', 'jsp2%.', 'jvc2%.', 'kjm2%.', 'kot2%.', 'lci2%.', 'ldr%.', 'leap%.', 'leg3%.', 'lim2%.', 'lio2%.', 'loe2%.', 'lol2%.', 'lrh2%.', 'mame%.', 'mba2%.', 'mbo3%.', 'mco2%.', 'mdb2%.', 'mdr2%.', 'med4%.', 'mef2%.', 'met%.', 'metm%.', 'mgea%.', 'mgg3%.', 'mhs2%.', 'mlf2%.', 'mmr3%.', 'moda%.', 'mog2%.', 'mpr%.', 'mps2%.', 'msd2%.', 'nam2%.', 'nano%.', 'nap2%.', 'neo2%.', 'nep3%.', 'njb%.', 'nop2%.', 'npp2%.', 'npr2%.', 'ntls%.', 'open%.', 'orm2%.', 'osp4%.', 'oto2%.', 'pan3%.', 'pchj%.', 'pcn5%.', 'pdi3%.', 'ped4%.', 'pei3%.', 'pfm2%.', 'pgr2%.', 'phmt%.', 'pld3%.', 'pls2%.', 'pmf2%.', 'pne2%.', 'pnp%.', 'poh2%.', 'ppj2%.', 'ppp3%.', 'prm2%.', 'pro6%.', 'prp2%.', 'psp4%.', 'puh2%.', 'pul2%.', 'qub2%.', 'rai2%.', 'rar2%.', 'rco2%.', 'rcr2%.', 'rfc2%.', 'rmb2%.', 'rpm2%.', 'rse2%.', 'rvr2%.', 'sae2%.', 'sen2%.', 'sfp2%.', 'smb2%.', 'smm2%.', 'smmd%.', 'smo2%.', 'smsc%.', 'sst2%.', 'sst3%.', 'sstr%.', 'sus2%.', 'tch2%.', 'tcr4%.', 'tpg2%.', 'trc2%.', 'tre%.', 'uar2%.', 'ueg2%.', 'uro2%.', 'viw2%.', 'vms3%.', 'vro2%.', 'vzj2%.', 'we%.', 'wjo2%.', 'wlb3%.', 'wll2%.'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1007'] = {'s12543', 's40565'}, -- Fuzzy Information and Engineering, Journal of Modern Power Systems and Clean Energy
['1016'] = {'j%.aace', 'j%.aed', 'j%.aiopen', 'j%.animal', 'j%.apsb', -- AACE Endocrinology and Diabetes, AACE Endocrinology and Diabetes, AI Open, Animal, Acta Pharmaceutica Sinica B
'j%.addicn', 'j%.abrep', 'j%.eurpsy', 'j%.fob', 'j%.gpb', 'j%.heliyon', -- Addiction Neuroscience, Addictive Behaviors Reports, European Psychiatry, FEBS Open Bio, Genomics, Proteomics & Bioinformatics after 2015, Heliyon
'j%.mucimm%.', 'j%.nlp', 'j%.patter', 'j%.proche', 'j%.vgie', -- Mucosal Immunology, Natural Language Processing, Patterns, Procedia Chemistry, VideoGIE
's1004-4132', 's1007-0214', 's1672-0229', 's1933-0219'}, -- Journal of Systems Engineering and Electronics, Tsinghua Science and Technology, Genomics, Proteomics & Bioinformatics before 2015, Mucosal Immunology
['1017'] = {'apj%.', 'nlp', 'mdh', 'S09249338', 'S15574660'}, -- Natural Language Processing Journal, Medical History, European Psychiatry, Asia Pacific Journal
['1021'] = {'acscentsci%.', 'acs%.chas%.', 'acsomega%.', 'jacsau%.',
'acsbiomedchemau%.', 'acsengineeringau%.', 'acsenvironau%.',
'acsmaterialsau%.', 'acsmeasuresciau%.', 'acsnanoscienceau%.',
'acsorginorgau%.', 'acsphyschemau%.', 'acspolymersau%.',
'aps%.', 'cbe%.', 'cbmi%.', 'envhealth%.', 'ehp%.', 'photonsci%.',
'polymscitech%.', 'prechem%.'}, -- ACS journals
['1029'] = {'2025cn', '2025csj', '2025ea', '2025gc', '2025gh', '2025ms', '2025sw', '2025wr', '2026ef', '2026gl', '2026jh', 'aga2.70129'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1038'] = {'41541%.', '43246%.', 'asiamat%.', 'boneres%.', 'cddis%.', 'cddiscovery%.', 'celldisc%.', 'mi%.', 'ncomms', 'nutd%.', 'oncsis%.', 'srep', 's40494', 's41377', 's41392', 's41396', 's41398', 's41405', 's41407', 's41408', 's41439', 's41467', 's41514', 's41522', 's41523', 's41524', 's41525', 's41526', 's41528', 's41529', 's41531', 's41533', 's41534', 's41535', 's41536', 's41537', 's41538', 's41539', 's41540', 's41545', 's41598', 's41612', 's41698', 's41699', 's41746', 's42003', 's42004', 's42005', 's42949', 's43247', 's43705', 's43856', 's44168', 's44172', 's44182', 's44183', 's44184', 's44185', 's44259', 's44260', 's44264', 's44271', 's44276', 's44294', 's44296', 's44298', 's44303', 's44304', 's44306', 's44310', 's44323', 's44324', 's44325', 's44328', 's44333', 's44334', 's44335', 's44341', 's44355', 's44383', 's44384', 's44385', 's44386', 's44387', 's44400', 's44401', 's44406', 's44407', 's44431', 's44432', 's44433', 's44434', 's44435', 's44440', 's44453', 's44454', 's44455', 's44456', 's44458', 's44459', 's44482', 's44484', 's44485', 's44488', 's44513', 's44528', 'sdata%.'}, -- Nature journals (npj series, Communications series, and many others, see https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&diff=prev&oldid=1368822567 and https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&diff=next&oldid=1368822567)
['1046'] = {'j%.1365-8711', 'j%.1365-246x'}, -- MNRAS, GJI
['1049'] = {'aie2%.', 'blc2%.', 'bme2', 'bsb2%.', 'ccs2%.', 'cds2', 'cdt2', 'cim2%.', 'cit2%.', 'cje%.', 'cmu2%.', 'cps2%.', 'csy2%.', 'cth2%.', 'cvi2%.', 'dgt2%.', 'ein2%.', 'ell2%.', 'elp2%.', 'els2', 'ema3%.', 'enb2%.', 'enc2%.', 'esi2%.', 'gtd2%.', 'htl2%.', 'hve2%.', 'ipr2%.', 'ise2', 'itr2%.', 'mia2%.', 'mna2%.', 'nbt2', 'nde2%.', 'ntw2%.', 'ote2%.', 'pel2%.', 'qtc2%.', 'rpg2%.', 'rsn2%.', 'ses2%.', 'sfw2', 'sil2', 'smc2%.', 'smt2%.', 'stg2%.', 'syb2%.', 'tje2%.', 'wss2%.'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1051'] = {'0004-6361','parasite'}, -- Astronomy & Astrophysics, Parasite
['1057'] = {'s41599'}, -- Humanities and Social Sciences Communications
['1080'] = {'14399776'}, -- International Journal of Fluid Power
['1090'] = {'cams', 'ecgd', 's1088-4173', 'ert', 's1088-4165', 's2330-1511',-- Free AMS journals
'bproc', 's2330-0000', 'btran', 'noti'},
['1093'] = {'asjof', 'bjro', 'bjsopen', 'ehjopen', 'hropen ', 'jamiaopen', 'ofid', 'oxfclm', -- Aesthetic Surgery Journal Open Forum, BJR Open, BJS Open, European Heart Journal Open, Human Reproduction Open, JAMIA Open, Open Forum Infectious Diseases, Oxford Open Climate Change
'oodh', 'ooec', 'ooenergy', 'oxfimm', 'ooih', 'oxfmat', 'oons', --Oxford Open Digital Health, Oxford Open Economics, Oxford Open Energy, Oxford Open Immunology, Oxford Open Infrastructure and Health, Oxford Open Materials Science, Oxford Open Neuroscience
'qopen', 'schizbullopen', 'mnras', 'mnrasl', 'gji', 'pnasnexus',-- Q Open, Schizophrenia Bulletin Open, MNRAS, MNRAS Letters, GJI, PNAS Nexus
'rasti', 'ismeco', 'ismejo'}, -- RASTI, ISME Communications, ISME Journal
['1096'] = {'fba%.'}, -- FASEB BioAdvances
['1098'] = {'rsbm', 'rsob', 'rsos'}, -- Biographical Memoirs of Fellows of the Royal Society, Open Biology, Royal Society Open Science
['1099'] = {'acmi', 'mic', '00221287', 'mgen'}, -- Access Microbiology, Microbiology, Journal of General Microbiology, Microbial Genomics
['1107'] = {'S20569890', 'S20522525', 'S16005775', 'S24143146'}, -- Acta Crystallographica E, IUCrJ, Journal of Synchrotron Radiation, IUCrData
['1109'] = {'access%.', 'ieeedata%.', 'jeds%.', 'jispin%.', 'jmw%.', 'jphot%.', 'jsas%.', 'jstars%.', 'jsteap%.', 'jtehm%.', 'jxcdc%.', 'lls%.', 'lsmc%.', 'oajpe%.', 'ojap%.', 'ojcas%.', 'ojcoms%.', 'ojcs%.', 'ojcsys%.', 'ojemb%.', 'ojia%.', 'ojid%.', 'ojies%.', 'ojim%.', 'ojits%.', 'ojnano%.', 'ojpel%.', 'ojse%.', 'ojsp%.', 'ojsscs%.', 'ojuffc%.', 'ojvt%.', 'sr%.', 'tfr%.', 'tmlcn%.', 'tp%.', 'tqe%.', 'oa', 'oj'}, -- IEEE journals see [[User talk:DreamRimmer#Wikipedia:Bot requests/Archive 88#Web scrapping v4]]
['1111'] = {'1365-2435', '1442-1984', '1751-7915', '1753-0407', '1755-0998', '1758-2229', '1759-7714', '2041-210x', 'j%.1365-2966', 'j%.1745-3933', 'j%.1365-246X','acel%.', 'adb%.', 'anec%.', 'aogs%.', 'bor%.', 'bpa%.', 'cas%.', 'con4%.', 'cpr%.', 'crj%.', 'csp2%.', 'cts%.', 'ddi%.', 'ejed%.', 'ene%.', 'eva%.', 'gbb%.', 'gcbb%.', 'hex%.', 'irv%.', 'iwj%.', 'jch%.', 'jcmm%.', 'jdi%.', 'jfr3%.', 'jocd%.', 'jwas%.', 'mcn%.', 'mpp%.', 'myc%.', 'nrm%.', 'os%.', 'pbi%.', 'srt%.'}, -- Elsevier journals https://en.wikipedia.org/w/index.php?title=User_talk:DreamRimmer&oldid=1364310578#Wikipedia:Bot_requests/Archive_88#Web_scrapping_v2
['1112'] = {'tlm3%.'}, -- Transactions of the London Mathematical Society
['1113'] = {'ep'}, -- Experimental Physiology
['1128'] = {'asmcr', 'jmbe', 'mbio', 'mra', 'spectrum', 'msphere', 'msystems'}, --ASM Case Reports, Journal of Microbiology & Biology Education, mBio, Microbiology Resource Announcements, Microbiology Spectrum, mSphere, mSystems
['1130'] = {'GES'}, -- Geosphere
['1136'] = {'bmjopen'}, -- BMJ Open
['1140'] = {'epjconf', 'epjds'}, -- EPJ Web of Conferences, EPJ Data Science
['1161'] = {'jaha%.'},
['1162'] = {'qss'}, -- Quantitative Science Studies
['1176'] = {'appi%.prcp%.'},
['1177'] = {'21582440', '23328584'}, -- SAGE Open, AERA Open
['1192'] = {'bjo', 'j%.eurpsy'}, -- BJPsych Open, European Psychiatry
['1210'] = {'jendso','jcemcr'}, -- Journal of the Endocrine Society, JCEM Case Reports
['1215'] = {'21573689', '21573698'}, -- L&O Fluids
['1242'] = {'bio', 'dmm'}, -- Biology Open, Disease Models & Mechanisms
['1257'] = {'jep'}, -- Journal of Economic Perspectives
['1587'] = {'comex%.', 'transcom%.'}, -- IEICE Communications Express, IEICE Transactions on Communications
['1590'] = {'0102-3306', 's0074-0276'}, -- Acta Botanica Brasilica, Memórias do Instituto Oswaldo Cruz
['1631'] = {'eng%.'}, -- ENGINEERING Information Technology & Electronic Engineering
['2106'] = {'JBJS.OA'}, -- JBJS Open Access
['2903'] = {'j%.efsa%.'},
['3322'] = {'caac%.'},
['3982'] = {'qw', 'te'},
['4171'] = {'dm','mag'}, -- Documenta Mathematica, EMS Magazine
['4319'] = {'lo%.', 'lol%.', 'lom%.'}, -- L&O, L&O e-Lectures, L&O Methods
['5852'] = {'ejt'}, -- European Journal of Taxonomy
['7155'] = {'jgaa'}, -- Journal of Graph Algorithms and Applications
['7758'] = {'rsf'}, -- RSJ Journal
['11158'] = {'saasp'}, -- Systematic and Applied Acarology Special Publications
['11646'] = {'megataxa', 'mesozoic'}, -- Megataxa, Mesozoic
['13052'] = {'jcsm2245-1439%.', 'jmm1550-4646%.'}, -- Journal of Cyber Security and Mobility, Journal of Mobile Multimedia
['14231'] = {'ag'}, -- Algebraic Geometry
['14814'] = {'phy2%.'},
['15302'] = {'vr%.'},
['15446'] = {'abc'}, -- Acta Biológica Colombiana
['17239'] = {'jowr'}, -- Journal of Writing Research
['17775'] = {'cseejpes%.'}, -- CSEE Journal of Power and Energy Systems
['22073'] = {'pja'}, -- Persian Journal of Acarology
['23919'] = {'aise%.', 'chain%.', 'cjee%.', 'csms%.', 'etr%.', -- See [[User talk:DreamRimmer#Wikipedia:Bot requests/Archive 88#Web scrapping v4]]
'hyper%.', 'ics%.', 'ienergy%.', 'jsc%.',
'metaresource%.', 'saiee%.', 'tup-icn%.', 'ursirsb%.'},
['24295'] = {'cpsstpea%.'}, -- CPSS Transactions on Power Electronics and Applications
['24310'] = {'abm'}, -- Acta Botanica Malacitana
['24425'] = {'agp'}, -- Acta Geologica Polonica
['26599'] = {'bdma%.', 'cai%.', 'ijcs%.', 'jicv%.'}, -- Big Data Mining and Analytics, Cybernetics and Intelligence, International Journal of Crowd Science, Journal of Intelligent and Connected Vehicles
['30941'] = {'cestems%.'}, -- CES Transactions on Electrical Machines and Systems
['35249'] = {'rche'}, -- Revista Chilena de Entomología
['37520'] = {'fi'}, -- Fossil Imprint
['53562'] = {'ajcb'} -- Asian Journal of Conservation Biology
}
--[[===================<< E R R O R M E S S A G I N G >>======================
]]
--[[----------< E R R O R M E S S A G E S U P P L E M E N T S >-------------
I18N for those messages that are supplemented with additional specific text that
describes the reason for the error
TODO: merge this with special_case_translations{}?
]]
local err_msg_supl = {
['char'] = 'invalid character', -- |isbn=, |sbn=
['check'] = 'checksum', -- |isbn=, |sbn=
empty_str = '(empty string)', -- empty unknown parameter check when cite has |=
['flag'] = 'flag', -- |archive-url=
['form'] = 'invalid form', -- |isbn=, |sbn=
['group'] = 'invalid group id', -- |isbn=
['initials'] = 'initials', -- Vancouver
['invalid language code'] = 'invalid language code', -- |script-<param>=
['journal'] = 'journal', -- |bibcode=
['length'] = 'length', -- |isbn=, |bibcode=, |sbn=
['liveweb'] = 'liveweb', -- |archive-url=
['missing comma'] = 'missing comma', -- Vancouver
['missing prefix'] = 'missing prefix', -- |script-<param>=
['missing title part'] = 'missing title part', -- |script-<param>=
['name'] = 'name', -- Vancouver
['non-Latin char'] = 'non-Latin character', -- Vancouver
['path'] = 'path', -- |archive-url=
['prefix'] = 'invalid prefix', -- |isbn=
['punctuation'] = 'punctuation', -- Vancouver
['save'] = 'save command', -- |archive-url=
['suffix'] = 'suffix', -- Vancouver
['timestamp'] = 'timestamp', -- |archive-url=
['unknown language code'] = 'unknown language code', -- |script-<param>=
['value'] = 'value', -- |bibcode=
['year'] = 'year', -- |bibcode=
}
--[[--------------< E R R O R _ C O N D I T I O N S >---------------------------
Error condition table. This table has two sections: errors at the top, maintenance
at the bottom. Maint 'messaging' does not have a 'message' (message=nil)
The following contains a list of IDs for various error conditions defined in the
code. For each ID, we specify a text message to display, an error category to
include, and whether the error message should be wrapped as a hidden comment.
Anchor changes require identical changes to matching anchor in Help:CS1 errors
TODO: rename error_conditions{} to something more generic; create separate error
and maint tables inside that?
]]
local error_conditions = {
err_accessdate_missing_url = {
message = '<code class="cs1-code">|access-date=</code> requires <code class="cs1-code">|url=</code>',
anchor = 'accessdate_missing_url',
category = 'CS1 errors: access-date without URL',
hidden = false
},
err_apostrophe_markup = {
message = 'Italic or bold markup not allowed in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'apostrophe_markup',
category = 'CS1 errors: markup',
hidden = false
},
err_archive_date_missing_url = {
message = '<code class="cs1-code">|archive-date=</code> requires <code class="cs1-code">|archive-url=</code>',
anchor = 'archive_date_missing_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_date_url_ts_mismatch = {
message = '<code class="cs1-code">|archive-date=</code> / <code class="cs1-code">|archive-url=</code> timestamp mismatch; $1 suggested',
anchor = 'archive_date_url_ts_mismatch',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_missing_date = {
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|archive-date=</code>',
anchor = 'archive_missing_date',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_missing_url = {
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|url=</code>',
anchor = 'archive_missing_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_url = {
message = '<code class="cs1-code">|archive-url=</code> is malformed: $1', -- $1 is error message detail
anchor = 'archive_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_arxiv_missing = {
message = '<code class="cs1-code">|arxiv=</code> required',
anchor = 'arxiv_missing',
category = 'CS1 errors: arXiv', -- same as bad arxiv
hidden = false
},
err_asintld_missing_asin = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|asin=</code>', -- $1 is parameter name
anchor = 'asintld_missing_asin',
category = 'CS1 errors: ASIN TLD',
hidden = false
},
err_bad_arxiv = {
message = 'Check <code class="cs1-code">|arxiv=</code> value',
anchor = 'bad_arxiv',
category = 'CS1 errors: arXiv',
hidden = false
},
err_bad_asin = {
message = 'Check <code class="cs1-code">|asin=</code> value',
anchor = 'bad_asin',
category ='CS1 errors: ASIN',
hidden = false
},
err_bad_asin_tld = {
message = 'Check <code class="cs1-code">|asin-tld=</code> value',
anchor = 'bad_asin_tld',
category ='CS1 errors: ASIN TLD',
hidden = false
},
err_bad_bibcode = {
message = 'Check <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail
anchor = 'bad_bibcode',
category = 'CS1 errors: bibcode',
hidden = false
},
err_bad_biorxiv = {
message = 'Check <code class="cs1-code">|biorxiv=</code> value',
anchor = 'bad_biorxiv',
category = 'CS1 errors: bioRxiv',
hidden = false
},
err_bad_citeseerx = {
message = 'Check <code class="cs1-code">|citeseerx=</code> value',
anchor = 'bad_citeseerx',
category = 'CS1 errors: citeseerx',
hidden = false
},
err_bad_date = {
message = 'Check date values in: $1', -- $1 is a parameter name list
anchor = 'bad_date',
category = 'CS1 errors: dates',
hidden = false
},
err_bad_doi = {
message = 'Check <code class="cs1-code">|doi=</code> value',
anchor = 'bad_doi',
category = 'CS1 errors: DOI',
hidden = false
},
err_bad_hdl = {
message = 'Check <code class="cs1-code">|hdl=</code> value',
anchor = 'bad_hdl',
category = 'CS1 errors: HDL',
hidden = false
},
err_bad_isbn = {
message = 'Check <code class="cs1-code">|isbn=</code> value: $1', -- $1 is error message detail
anchor = 'bad_isbn',
category = 'CS1 errors: ISBN',
hidden = false
},
err_bad_ismn = {
message = 'Check <code class="cs1-code">|ismn=</code> value',
anchor = 'bad_ismn',
category = 'CS1 errors: ISMN',
hidden = false
},
err_bad_issn = {
message = 'Check <code class="cs1-code">|$1issn=</code> value', -- $1 is 'e' or '' for eissn or issn
anchor = 'bad_issn',
category = 'CS1 errors: ISSN',
hidden = false
},
err_bad_jfm = {
message = 'Check <code class="cs1-code">|jfm=</code> value',
anchor = 'bad_jfm',
category = 'CS1 errors: JFM',
hidden = false
},
err_bad_jstor = {
message = 'Check <code class="cs1-code">|jstor=</code> value',
anchor = 'bad_jstor',
category = 'CS1 errors: JSTOR',
hidden = false
},
err_bad_lccn = {
message = 'Check <code class="cs1-code">|lccn=</code> value',
anchor = 'bad_lccn',
category = 'CS1 errors: LCCN',
hidden = false
},
err_bad_medrxiv = {
message = 'Check <code class="cs1-code">|medrxiv=</code> value',
anchor = 'bad_medrxiv',
category = 'CS1 errors: medRxiv',
hidden = false
},
err_bad_mr = {
message = 'Check <code class="cs1-code">|mr=</code> value',
anchor = 'bad_mr',
category = 'CS1 errors: MR',
hidden = false
},
err_bad_oclc = {
message = 'Check <code class="cs1-code">|oclc=</code> value',
anchor = 'bad_oclc',
category = 'CS1 errors: OCLC',
hidden = false
},
err_bad_ol = {
message = 'Check <code class="cs1-code">|ol=</code> value',
anchor = 'bad_ol',
category = 'CS1 errors: OL',
hidden = false
},
err_bad_osti = {
message = 'Check <code class="cs1-code">|osti=</code> value',
anchor = 'bad_osti',
category = 'CS1 errors: OSTI',
hidden = false
},
err_bad_paramlink = { -- for |title-link=, |author/editor/translator-link=, |series-link=, |episode-link=
message = 'Check <code class="cs1-code">|$1=</code> value', -- $1 is parameter name
anchor = 'bad_paramlink',
category = 'CS1 errors: parameter link',
hidden = false
},
err_bad_pmc = {
message = 'Check <code class="cs1-code">|pmc=</code> value',
anchor = 'bad_pmc',
category = 'CS1 errors: PMC',
hidden = false
},
err_bad_pmid = {
message = 'Check <code class="cs1-code">|pmid=</code> value',
anchor = 'bad_pmid',
category = 'CS1 errors: PMID',
hidden = false
},
err_bad_rfc = {
message = 'Check <code class="cs1-code">|rfc=</code> value',
anchor = 'bad_rfc',
category = 'CS1 errors: RFC',
hidden = false
},
err_bad_s2cid = {
message = 'Check <code class="cs1-code">|s2cid=</code> value',
anchor = 'bad_s2cid',
category = 'CS1 errors: S2CID',
hidden = false
},
err_bad_sbn = {
message = 'Check <code class="cs1-code">|sbn=</code> value: $1', -- $1 is error message detail
anchor = 'bad_sbn',
category = 'CS1 errors: SBN',
hidden = false
},
err_bad_ssrn = {
message = 'Check <code class="cs1-code">|ssrn=</code> value',
anchor = 'bad_ssrn',
category = 'CS1 errors: SSRN',
hidden = false
},
err_bad_url = {
message = 'Check $1 value', -- $1 is parameter name
anchor = 'bad_url',
category = 'CS1 errors: URL',
hidden = false
},
err_bad_usenet_id = {
message = 'Check <code class="cs1-code">|message-id=</code> value',
anchor = 'bad_message_id',
category = 'CS1 errors: message-id',
hidden = false
},
err_bad_zbl = {
message = 'Check <code class="cs1-code">|zbl=</code> value',
anchor = 'bad_zbl',
category = 'CS1 errors: Zbl',
hidden = false
},
err_bare_url_missing_title = {
message = '$1 missing title', -- $1 is parameter name
anchor = 'bare_url_missing_title',
category = 'CS1 errors: bare URL',
hidden = false
},
err_biorxiv_missing = {
message = '<code class="cs1-code">|biorxiv=</code> required',
anchor = 'biorxiv_missing',
category = 'CS1 errors: bioRxiv', -- same as bad bioRxiv
hidden = false
},
err_chapter_ignored = {
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'chapter_ignored',
category = 'CS1 errors: chapter ignored',
hidden = false
},
err_citation_missing_title = {
message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'citation_missing_title',
category = 'CS1 errors: missing title',
hidden = false
},
err_citeseerx_missing = {
message = '<code class="cs1-code">|citeseerx=</code> required',
anchor = 'citeseerx_missing',
category = 'CS1 errors: citeseerx', -- same as bad citeseerx
hidden = false
},
err_cite_web_url = { -- this error applies to cite web and to cite podcast
message = 'Missing or empty <code class="cs1-code">|url=</code>',
anchor = 'cite_web_url',
category = 'CS1 errors: requires URL',
hidden = false
},
err_class_ignored = {
message = '<code class="cs1-code">|class=</code> ignored',
anchor = 'class_ignored',
category = 'CS1 errors: class',
hidden = false
},
err_contributor_ignored = {
message = '<code class="cs1-code">|contributor=</code> ignored',
anchor = 'contributor_ignored',
category = 'CS1 errors: contributor',
hidden = false
},
err_contributor_missing_required_param = {
message = '<code class="cs1-code">|contributor=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'contributor_missing_required_param',
category = 'CS1 errors: contributor',
hidden = false
},
err_deprecated_params = {
message = 'Cite uses deprecated parameter <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'deprecated_params',
category = 'CS1 errors: deprecated parameters',
hidden = false
},
err_disp_name = {
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name; $2 is the assigned value
anchor = 'disp_name',
category = 'CS1 errors: display-names',
hidden = false,
},
err_doibroken_missing_doi = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|doi=</code>', -- $1 is parameter name
anchor = 'doibroken_missing_doi',
category = 'CS1 errors: DOI',
hidden = false
},
err_embargo_missing_pmc = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|pmc=</code>', -- $1 is parameter name
anchor = 'embargo_missing_pmc',
category = 'CS1 errors: PMC embargo',
hidden = false
},
err_empty_citation = {
message = 'Empty citation',
anchor = 'empty_citation',
category = 'CS1 errors: empty citation',
hidden = false
},
err_etal = {
message = 'Explicit use of et al. in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'explicit_et_al',
category = 'CS1 errors: explicit use of et al.',
hidden = false
},
err_extra_text_edition = {
message = '<code class="cs1-code">|edition=</code> has extra text',
anchor = 'extra_text_edition',
category = 'CS1 errors: extra text: edition',
hidden = false,
},
err_extra_text_issue = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_issue',
category = 'CS1 errors: extra text: issue',
hidden = false,
},
err_extra_text_pages = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_pages',
category = 'CS1 errors: extra text: pages',
hidden = false,
},
err_extra_text_volume = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_volume',
category = 'CS1 errors: extra text: volume',
hidden = false,
},
err_first_missing_last = {
message = '<code class="cs1-code">|$1=</code> missing <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias
anchor = 'first_missing_last',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_format_missing_url = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter
anchor = 'format_missing_url',
category = 'CS1 errors: format without URL',
hidden = false
},
err_generic_name = {
message = '<code class="cs1-code">|$1=</code> has generic name', -- $1 is parameter name
anchor = 'generic_name',
category = 'CS1 errors: generic name',
hidden = false,
},
err_generic_title = {
message = 'Cite uses generic title',
anchor = 'generic_title',
category = 'CS1 errors: generic title',
hidden = false,
},
err_invalid_isbn_date = {
message = 'ISBN / Date incompatibility',
anchor = 'invalid_isbn_date',
category = 'CS1 errors: ISBN date',
hidden = true
},
err_invalid_param_val = {
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is parameter value
anchor = 'invalid_param_val',
category = 'CS1 errors: invalid parameter value',
hidden = false
},
err_invisible_char = {
message = '$1 in $2 at position $3', -- $1 is invisible char $2 is parameter name $3 is position number
anchor = 'invisible_char',
category = 'CS1 errors: invisible characters',
hidden = false
},
err_medrxiv_missing = {
message = '<code class="cs1-code">|medrxiv=</code> required',
anchor = 'medrxiv_missing',
category = 'CS1 errors: medRxiv', -- same as bad medRxiv
hidden = false
},
err_missing_name = {
message = 'Missing <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator
anchor = 'missing_name',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_missing_periodical = {
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1
anchor = 'missing_periodical',
category = 'CS1 errors: missing periodical',
hidden = false
},
err_missing_pipe = {
message = 'Missing pipe in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'missing_pipe',
category = 'CS1 errors: missing pipe',
hidden = false
},
err_missing_publisher = {
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical publisher parameter name for cite $1
anchor = 'missing_publisher',
category = 'CS1 errors: missing publisher',
hidden = false
},
err_numeric_names = {
message = '<code class="cs1-code">|$1=</code> has numeric name', -- $1 is parameter name',
anchor = 'numeric_names',
category = 'CS1 errors: numeric name',
hidden = false,
},
err_param_access_requires_param = {
message = '<code class="cs1-code">|$1-access=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'param_access_requires_param',
category = 'CS1 errors: param-access',
hidden = false
},
err_param_has_ext_link = {
message = 'External link in <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_ext_link',
category = 'CS1 errors: external links',
hidden = false
},
err_param_has_twl_url = {
message = 'Wikipedia Library link in <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_twl_url',
category = 'CS1 errors: URL',
hidden = false
},
err_param_unknown_empty = {
message = 'Cite has empty unknown parameter$1: $2', -- $1 is 's' or empty space; $2 is emty unknown param list
anchor = 'param_unknown_empty',
category = 'CS1 errors: empty unknown parameters',
hidden = false
},
err_parameter_ignored = {
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'parameter_ignored',
category = 'CS1 errors: unsupported parameter',
hidden = false
},
err_parameter_ignored_suggest = {
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored (<code class="cs1-code">|$2=</code> suggested)', -- $1 is unknown parameter $2 is suggested parameter name
anchor = 'parameter_ignored_suggest',
category = 'CS1 errors: unsupported parameter',
hidden = false
},
err_periodical_ignored = {
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'periodical_ignored',
category = 'CS1 errors: periodical ignored',
hidden = false
},
err_redundant_parameters = {
message = 'More than one of $1 specified', -- $1 is error message detail
anchor = 'redundant_parameters',
category = 'CS1 errors: redundant parameter',
hidden = false
},
err_script_parameter = {
message = 'Invalid <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail
anchor = 'script_parameter',
category = 'CS1 errors: script parameters',
hidden = false
},
err_ssrn_missing = {
message = '<code class="cs1-code">|ssrn=</code> required',
anchor = 'ssrn_missing',
category = 'CS1 errors: SSRN',
hidden = false
},
err_text_ignored = {
message = 'Text "$1" ignored', -- $1 is ignored text
anchor = 'text_ignored',
category = 'CS1 errors: unrecognized parameter',
hidden = false
},
err_trans_missing_title = {
message = '<code class="cs1-code">|trans-$1=</code> requires <code class="cs1-code">|$1=</code> or <code class="cs1-code">|script-$1=</code>', -- $1 is base parameter name
anchor = 'trans_missing_title',
category = 'CS1 errors: translated title',
hidden = false
},
err_url_suppressed = {
message = '<code class="cs1-code">|url=</code> suppressed',
anchor = 'url_suppressed',
category = 'CS1 errors: url suppressed',
hidden = false
},
err_vancouver = {
message = 'Vancouver style error: $1 in name $2', -- $1 is error detail, $2 is the nth name
anchor = 'vancouver',
category = 'CS1 errors: Vancouver style',
hidden = false
},
err_wikilink_in_url = {
message = 'URL–wikilink conflict', -- uses ndash
anchor = 'wikilink_in_url',
category = 'CS1 errors: URL–wikilink conflict', -- uses ndash
hidden = false
},
--[[--------------------------< M A I N T >-------------------------------------
maint messages do not have a message (message = nil); otherwise the structure
is the same as error messages
]]
maint_archive_origin = {
message = nil,
anchor = 'archive_origin',
category = 'CS1 maint: archive origin',
hidden = true,
},
maint_archived_copy = {
message = nil,
anchor = 'archived_copy',
category = 'CS1 maint: archived copy as title',
hidden = true,
},
maint_bibcode = {
message = nil,
anchor = 'bibcode',
category = 'CS1 maint: bibcode',
hidden = true,
},
maint_location_no_publisher = { -- cite book, conference, encyclopedia; citation as book cite or encyclopedia cite
message = nil,
anchor = 'location_no_publisher',
category = 'CS1 maint: location missing publisher',
hidden = true,
},
maint_bot_unknown = {
message = nil,
anchor = 'bot:_unknown',
category = 'CS1 maint: bot: original URL status unknown',
hidden = true,
},
maint_date_auto_xlated = { -- date auto-translation not supported by en.wiki
message = nil,
anchor = 'date_auto_xlated',
category = 'CS1 maint: date auto-translated',
hidden = true,
},
maint_date_format = {
message = nil,
anchor = 'date_format',
category = 'CS1 maint: date format',
hidden = true,
},
maint_date_year = {
message = nil,
anchor = 'date_year',
category = 'CS1 maint: date and year',
hidden = true,
},
maint_deprecated_archive = {
message = nil,
anchor = 'deprecated_archive',
category = 'CS1 maint: deprecated archival service',
hidden = true,
},
maint_doi_ignore = {
message = nil,
anchor = 'doi_ignore',
category = 'CS1 maint: ignored DOI errors',
hidden = true,
},
maint_doi_inactive = {
message = nil,
anchor = 'doi_inactive',
category = 'CS1 maint: DOI inactive',
hidden = true,
},
maint_doi_inactive_dated = {
message = nil,
anchor = 'doi_inactive_dated',
category = 'CS1 maint: DOI inactive as of $2$3$1', -- $1 is year, $2 is month-name or empty string, $3 is space or empty string
hidden = true,
},
maint_doi_unflagged_free = {
message = nil,
anchor = 'doi_unflagged_free',
category = 'CS1 maint: unflagged free DOI',
hidden = true,
},
maint_extra_punct = {
message = nil,
anchor = 'extra_punct',
category = 'CS1 maint: extra punctuation',
hidden = true,
},
maint_id_limit_load_fail = { -- applies to all cs1|2 templates on a page;
message = nil, -- maint message (category link) never emitted
anchor = 'id_limit_load_fail',
category = 'CS1 maint: ID limit load fail',
hidden = true,
},
maint_isbn_ignore = {
message = nil,
anchor = 'ignore_isbn_err',
category = 'CS1 maint: ignored ISBN errors',
hidden = true,
},
maint_issn_ignore = {
message = nil,
anchor = 'ignore_issn',
category = 'CS1 maint: ignored ISSN errors',
hidden = true,
},
maint_jfm_format = {
message = nil,
anchor = 'jfm_format',
category = 'CS1 maint: JFM format',
hidden = true,
},
maint_location = {
message = nil,
anchor = 'location',
category = 'CS1 maint: location',
hidden = true,
},
maint_misc_url = {
message = nil,
anchor = 'misc_url',
category = 'CS1 maint: miscellaneous url',
hidden = true,
},
maint_missing_class = {
message = nil,
anchor = 'missing_class',
category = 'CS1 maint: missing class',
hidden = true,
},
maint_mr_format = {
message = nil,
anchor = 'mr_format',
category = 'CS1 maint: MR format',
hidden = true,
},
maint_mult_names = {
message = nil,
anchor = 'mult_names',
category = 'CS1 maint: multiple names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_numeric_names = {
message = nil,
anchor = 'numeric_names',
category = 'CS1 maint: numeric names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_others = {
message = nil,
anchor = 'others',
category = 'CS1 maint: others',
hidden = true,
},
maint_others_avm = {
message = nil,
anchor = 'others_avm',
category = 'CS1 maint: others in cite AV media (notes)',
hidden = true,
},
maint_overridden_setting = {
message = nil,
anchor = 'overridden',
category = 'CS1 maint: overridden setting',
hidden = true,
},
maint_page_art_num = {
message = nil,
anchor = 'page_art_num',
category = 'CS1 maint: article number as page number',
hidden = true,
},
maint_periodical_has_isbn = {
message = nil,
anchor = 'periodical_has_isbn',
category = 'CS1 maint: periodical has ISBN',
hidden = true,
},
maint_pmc_embargo = {
message = nil,
anchor = 'embargo',
category = 'CS1 maint: PMC embargo expired',
hidden = true,
},
maint_pmc_format = {
message = nil,
anchor = 'pmc_format',
category = 'CS1 maint: PMC format',
hidden = true,
},
maint_postscript = {
message = nil,
anchor = 'postscript',
category = 'CS1 maint: postscript',
hidden = true,
},
maint_publisher_location = {
message = nil,
anchor = 'publisher_location',
category = 'CS1 maint: publisher location',
hidden = true,
},
maint_ref_duplicates_default = {
message = nil,
anchor = 'ref_default',
category = 'CS1 maint: ref duplicates default',
hidden = true,
},
maint_shortened_archive_url = {
message = nil,
anchor = 'shortened_archive_url',
category = 'CS1 maint: shortened archive url',
hidden = true,
},
maint_unknown_lang = {
message = nil,
anchor = 'unknown_lang',
category = 'CS1 maint: unrecognized language',
hidden = true,
},
maint_untitled = {
message = nil,
anchor = 'untitled',
category = 'CS1 maint: untitled periodical',
hidden = true,
},
maint_url_status = {
message = nil,
anchor = 'url_status',
category = 'CS1 maint: url-status',
hidden = true,
},
maint_work_isbn = {
message = nil,
anchor = 'work_isbn',
category = 'CS1 maint: work parameter with ISBN',
hidden = true,
},
maint_year= {
message = nil,
anchor = 'year',
category = 'CS1 maint: year',
hidden = true,
},
maint_zbl = {
message = nil,
anchor = 'zbl',
category = 'CS1 maint: Zbl',
hidden = true,
},
}
--[[--------------------------< I D _ L I M I T S _ D A T A _ T >----------------------------------------------
fetch id limits for certain identifiers from c:Data:CS1/Identifier limits.tab. This source is a json tabular
data file maintained at wikipedia commons. Convert the json format to a table of k/v pairs.
The values from <id_limits_data_t> are used to set handle.id_limit.
From 2025-02-21, MediaWiki is broken. Use this link to edit the tablular data file:
https://commons.wikimedia.org/w/index.php?title=Data:CS1/Identifier_limits.tab&action=edit
See Phab:T389105
]]
local id_limits_data_t;
local id_limits_data_load_fail = false; -- flag; assume that we will be successful when loading json id limit tabular data
local use_commons_data = true; -- set to false if your wiki does not have access to mediawiki commons; then,
if false == use_commons_data then -- update this table from https://commons.wikimedia.org/wiki/Data:CS1/Identifier_limits.tab; last update: 2026-08-02
id_limits_data_t = {['OCLC'] = 11160000000, ['OSTI'] = 23010000, ['PMC'] = 13500000, ['PMID'] = 42900000, ['RFC'] = 9300, ['SSRN'] = 7500000, ['S2CID'] = 290000000}; -- this table must be maintained locally
else -- here for wikis that do have access to mediawiki commons
local load_fail_limit = 99999999999; -- very high number to avoid error messages on load failure
id_limits_data_t = {['OCLC'] = load_fail_limit, ['OSTI'] = load_fail_limit, ['PMC'] = load_fail_limit, ['PMID'] = load_fail_limit, ['RFC'] = load_fail_limit, ['SSRN'] = load_fail_limit, ['S2CID'] = load_fail_limit};
if mw.ext.data == nil then
id_limits_data_load_fail = true; -- safeguard against Lua errors if mw.ext.data is not available for some reason
else
local tab_data_t = mw.ext.data.get ('CS1/Identifier limits.tab'); -- attempt to load the tabular data from commons into <tab_data_t>
if false == tab_data_t then -- undocumented 'feature': mw.ext.data.get() sometimes returns false
id_limits_data_load_fail = true; -- set the flag so that Module:Citation/CS1 can create an unannotated maint category
else
for _, limit_t in ipairs (tab_data_t.data) do -- overwrite default <load_fail_limit> values from the data table in the tabular data
id_limits_data_t[limit_t[1]] = limit_t[2]; -- <limit[1]> is identifier; <limit[2]> is upper limit for that identifier
end
end
end
end
--[[--------------------------< I D _ H A N D L E R S >--------------------------------------------------------
The following contains a list of values for various defined identifiers. For each
identifier we specify a variety of information necessary to properly render the
identifier in the citation.
parameters: a list of parameter aliases for this identifier; first in the list is the canonical form
link: Wikipedia article name
redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number'
q: Wikidata q number for the identifier
label: the label preceding the identifier; label is linked to a Wikipedia article (in this order):
redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true
Wikidata-supplied article name for the local wiki from id_handlers['<id>'].q
local article name from id_handlers['<id>'].link
prefix: the first part of a URL that will be concatenated with a second part which usually contains the identifier
suffix: optional third part to be added after the identifier
encode: true if URI should be percent-encoded; otherwise false
COinS: identifier link or keyword for use in COinS:
for identifiers registered at info-uri.info use: info:.... where '...' is the appropriate identifier label
for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn
for |asin= and |ol=, which require assembly, use the keyword: url
for others make a URL using the value in prefix/suffix and #label, use the keyword: pre (not checked; any text other than 'info', 'rft', or 'url' works here)
set to nil to leave the identifier out of the COinS
separator: character or text between label and the identifier in the rendered citation
id_limit: for those identifiers with established limits, this property holds the upper limit
access: use this parameter to set the access level for all instances of this identifier.
the value must be a valid access level for an identifier (see ['id-access'] in this file).
custom_access: to enable custom access level for an identifier, set this parameter
to the parameter that should control it (normally 'id-access')
]]
local id_handlers = {
['ARXIV'] = {
parameters = {'arxiv', 'eprint'},
link = 'arXiv',
redirect = 'arXiv (identifier)',
q = 'Q118398',
label = 'arXiv',
prefix = 'https://arxiv.org/abs/',
encode = false,
COinS = 'info:arxiv',
separator = ':',
access = 'free', -- free to read
},
['ASIN'] = {
parameters = { 'asin', 'ASIN' },
link = 'Amazon Standard Identification Number',
redirect = 'ASIN (identifier)',
q = 'Q1753278',
label = 'ASIN',
prefix = 'https://www.amazon.',
COinS = 'url',
separator = ' ',
encode = false;
},
['BIBCODE'] = {
parameters = {'bibcode'},
link = 'Bibcode',
redirect = 'Bibcode (identifier)',
q = 'Q25754',
label = 'Bibcode',
prefix = 'https://scixplorer.org/abs/',
encode = false,
COinS = 'info:bibcode',
separator = ':',
custom_access = 'bibcode-access',
},
['BIORXIV'] = {
parameters = {'biorxiv'},
link = 'bioRxiv',
redirect = 'bioRxiv (identifier)',
q = 'Q19835482',
label = 'bioRxiv',
prefix = 'https://doi.org/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['CITESEERX'] = {
parameters = {'citeseerx'},
link = 'CiteSeerX',
redirect = 'CiteSeerX (identifier)',
q = 'Q2715061',
label = 'CiteSeerX',
prefix = 'https://citeseerx.ist.psu.edu/viewdoc/summary?doi=',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['DOI'] = { -- Used by InternetArchiveBot
parameters = { 'doi', 'DOI'},
link = 'Digital object identifier',
redirect = 'doi (identifier)',
q = 'Q25670',
label = 'doi',
prefix = 'https://doi.org/',
COinS = 'info:doi',
separator = ':',
encode = true,
custom_access = 'doi-access',
},
['EISSN'] = {
parameters = {'eissn', 'EISSN'},
link = 'International Standard Serial Number#Electronic ISSN',
redirect = 'eISSN (identifier)',
q = 'Q46339674',
label = 'eISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.eissn',
encode = false,
separator = ' ',
},
['HDL'] = {
parameters = { 'hdl', 'HDL' },
link = 'Handle System',
redirect = 'hdl (identifier)',
q = 'Q3126718',
label = 'hdl',
prefix = 'https://hdl.handle.net/',
COinS = 'info:hdl',
separator = ':',
encode = true,
custom_access = 'hdl-access',
},
['ISBN'] = { -- Used by InternetArchiveBot
parameters = {'isbn', 'ISBN'},
link = 'International Standard Book Number',
redirect = 'ISBN (identifier)',
q = 'Q33057',
label = 'ISBN',
prefix = 'Special:BookSources/',
COinS = 'rft.isbn',
separator = ' ',
},
['ISMN'] = {
parameters = {'ismn', 'ISMN'},
link = 'International Standard Music Number',
redirect = 'ISMN (identifier)',
q = 'Q1666938',
label = 'ISMN',
prefix = '', -- not currently used;
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['ISSN'] = {
parameters = {'issn', 'ISSN'},
link = 'International Standard Serial Number',
redirect = 'ISSN (identifier)',
q = 'Q131276',
label = 'ISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.issn',
encode = false,
separator = ' ',
},
['JFM'] = {
parameters = {'jfm', 'JFM'},
link = 'Jahrbuch über die Fortschritte der Mathematik',
redirect = 'JFM (identifier)',
q = '',
label = 'JFM',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['JSTOR'] = {
parameters = {'jstor', 'JSTOR'},
link = 'JSTOR',
redirect = 'JSTOR (identifier)',
q = 'Q1420342',
label = 'JSTOR',
prefix = 'https://www.jstor.org/stable/',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
custom_access = 'jstor-access',
},
['LCCN'] = {
parameters = {'lccn', 'LCCN'},
link = 'Library of Congress Control Number',
redirect = 'LCCN (identifier)',
q = 'Q620946',
label = 'LCCN',
prefix = 'https://lccn.loc.gov/',
COinS = 'info:lccn',
encode = false,
separator = ' ',
},
['MEDRXIV'] = {
parameters = {'medrxiv'},
link = 'medRxiv',
redirect = 'medRxiv (identifier)',
q = 'Q58465838',
label = 'medRxiv',
prefix = 'https://www.medrxiv.org/content/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = false,
separator = ' ',
},
['MR'] = {
parameters = {'mr', 'MR'},
link = 'Mathematical Reviews',
redirect = 'MR (identifier)',
q = 'Q211172',
label = 'MR',
prefix = 'https://mathscinet.ams.org/mathscinet-getitem?mr=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['OCLC'] = {
parameters = {'oclc', 'OCLC'},
link = 'OCLC',
redirect = 'OCLC (identifier)',
q = 'Q190593',
label = 'OCLC',
prefix = 'https://search.worldcat.org/oclc/',
COinS = 'info:oclcnum',
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OCLC or 0,
},
['OL'] = {
parameters = { 'ol', 'OL' },
link = 'Open Library',
redirect = 'OL (identifier)',
q = 'Q1201876',
label = 'OL',
prefix = 'https://openlibrary.org/',
COinS = 'url',
separator = ' ',
encode = true,
custom_access = 'ol-access',
},
['OSTI'] = {
parameters = {'osti', 'OSTI'},
link = 'Office of Scientific and Technical Information',
redirect = 'OSTI (identifier)',
q = 'Q2015776',
label = 'OSTI',
prefix = 'https://www.osti.gov/biblio/',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OSTI or 0,
custom_access = 'osti-access',
},
['PMC'] = {
parameters = {'pmc', 'PMC'},
link = 'PubMed Central',
redirect = 'PMC (identifier)',
q = 'Q229883',
label = 'PMC',
prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC',
suffix = '',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.PMC or 0,
access = 'free', -- free to read
},
['PMID'] = {
parameters = {'pmid', 'PMID'},
link = 'PubMed Identifier',
redirect = 'PMID (identifier)',
q = 'Q2082879',
label = 'PMID',
prefix = 'https://pubmed.ncbi.nlm.nih.gov/',
COinS = 'info:pmid',
encode = false,
separator = ' ',
id_limit = id_limits_data_t.PMID or 0,
},
['RFC'] = {
parameters = {'rfc', 'RFC'},
link = 'Request for Comments',
redirect = 'RFC (identifier)',
q = 'Q212971',
label = 'RFC',
prefix = 'https://tools.ietf.org/html/rfc',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.RFC or 0,
access = 'free', -- free to read
},
['SBN'] = {
parameters = {'sbn', 'SBN'},
link = 'Standard Book Number', -- redirect to International_Standard_Book_Number#History
redirect = 'SBN (identifier)',
label = 'SBN',
prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['SSRN'] = {
parameters = {'ssrn', 'SSRN'},
link = 'Social Science Research Network',
redirect = 'SSRN (identifier)',
q = 'Q7550801',
label = 'SSRN',
prefix = 'https://papers.ssrn.com/sol3/papers.cfm?abstract_id=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.SSRN or 0,
custom_access = 'ssrn-access',
},
['S2CID'] = {
parameters = {'s2cid', 'S2CID'},
link = 'Semantic Scholar',
redirect = 'S2CID (identifier)',
q = 'Q22908627',
label = 'S2CID',
prefix = 'https://api.semanticscholar.org/CorpusID:',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.S2CID or 0,
custom_access = 's2cid-access',
},
['USENETID'] = {
parameters = {'message-id'},
link = 'Usenet',
redirect = 'Usenet (identifier)',
q = 'Q193162',
label = 'Usenet:',
prefix = 'news:',
encode = false,
COinS = 'pre', -- use prefix value
separator = ' ',
},
['ZBL'] = {
parameters = {'zbl', 'ZBL' },
link = 'Zentralblatt MATH',
redirect = 'Zbl (identifier)',
q = 'Q190269',
label = 'Zbl',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
}
--[[--------------------------< E X P O R T S >---------------------------------
]]
return {
use_identifier_redirects = use_identifier_redirects, -- booleans defined in the settings at the top of this module
local_lang_cat_enable = local_lang_cat_enable,
date_name_auto_xlate_enable = date_name_auto_xlate_enable,
date_digit_auto_xlate_enable = date_digit_auto_xlate_enable,
enable_sort_keys = enable_sort_keys,
suppress_archive_today_urls = suppress_archive_today_urls,
-- tables and variables created when this module is loaded
dependencies_t = dependencies_t, -- used to suppress parameters dependent on url-holding parameters holding archive.today urls
enum_needs_xlation = '1' ~= date_names.xlate_digits['1'], -- to avoid unnecessary enumerator translation
global_df = get_date_format (), -- this line can be replaced with "global_df = 'dmy-all'," to have all dates auto translated to dmy format.
global_cs1_config_t = global_cs1_config_t, -- global settings from {{cs1 config}}
id_limits_data_load_fail = id_limits_data_load_fail, -- true when commons tabular identifier-limit data fails to load
known_free_doi_registrants_t = build_free_doi_registrants_table(),
punct_skip = build_skip_table (punct_skip, punct_meta_params),
url_skip = build_skip_table (url_skip, url_meta_params),
archive_today_tlds_t = {['today'] = true, ['ph'] = true, ['is'] = true, ['md'] = true, ['li'] = true, ['fo'] = true, ['vn'] = true}; -- used by is_archive_today_url()
name_space_sort_keys = name_space_sort_keys,
aliases = aliases,
special_case_translation = special_case_translation,
date_names = date_names,
err_msg_supl = err_msg_supl,
error_conditions = error_conditions,
et_al_patterns = et_al_patterns,
extended_registrants_t = extended_registrants_t,
id_handlers = id_handlers,
keywords_lists = keywords_lists,
keywords_xlate = keywords_xlate,
stripmarkers = stripmarkers,
invisible_chars = invisible_chars,
invisible_defs = invisible_defs,
indic_script = indic_script,
emoji_t = emoji_t,
messages = messages,
presentation = presentation,
prop_cats = prop_cats,
script_lang_codes = script_lang_codes,
lang_tag_remap = lang_tag_remap,
lang_name_remap = lang_name_remap,
this_wiki_code = this_wiki_code,
title_types = title_types,
uncategorized_namespaces = uncategorized_namespaces_t,
uncategorized_subpages = uncategorized_subpages,
templates_using_volume = templates_using_volume,
templates_using_issue = templates_using_issue,
templates_not_using_page = templates_not_using_page,
vol_iss_pg_patterns = vol_iss_pg_patterns,
single_letter_2nd_lvl_domains_t = single_letter_2nd_lvl_domains_t,
url_access_map_t = url_access_map_t,
inter_wiki_map = inter_wiki_map,
mw_languages_by_tag_t = mw_languages_by_tag_t,
mw_languages_by_name_t = mw_languages_by_name_t,
citation_class_map_t = citation_class_map_t,
citation_issue_t = citation_issue_t,
citation_no_volume_t = citation_no_volume_t,
}
mtf0w1ow8dokpa8ltsmoqupkxr4vaq4
Module:Citation/CS1/COinS
828
930
32819
9014
2026-11-07T20:03:18Z
en>Trappist the monk
0
synch from sandbox;
32819
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local has_accept_as_written, is_set, in_array, remove_wiki_link, strip_apostrophe_markup; -- functions in Module:Citation/CS1/Utilities
local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
--[[--------------------------< M A K E _ C O I N S _ T I T L E >----------------------------------------------
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn't corrupted with strings
of %27%27...
]]
local function make_coins_title (title, script)
title = has_accept_as_written (title);
if is_set (title) then
title = strip_apostrophe_markup (title); -- strip any apostrophe markup
else
title = ''; -- if not set, make sure title is an empty string
end
if is_set (script) then
script = script:gsub ('^%l%l%s*:%s*', ''); -- remove language prefix if present (script value may now be empty string)
script = strip_apostrophe_markup (script); -- strip any apostrophe markup
else
script = ''; -- if not set, make sure script is an empty string
end
if is_set (title) and is_set (script) then
script = ' ' .. script; -- add a space before we concatenate
end
return title .. script; -- return the concatenation
end
--[[--------------------------< E S C A P E _ L U A _ M A G I C _ C H A R S >----------------------------------
Returns a string where all of Lua's magic characters have been escaped. This is important because functions like
string.gsub() treat their pattern and replace strings as patterns, not literal strings.
]]
local function escape_lua_magic_chars (argument)
argument = argument:gsub("%%", "%%%%"); -- replace % with %%
argument = argument:gsub("([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1"); -- replace all other Lua magic pattern characters
return argument;
end
--[[--------------------------< G E T _ C O I N S _ P A G E S >------------------------------------------------
Extract page numbers from external wikilinks in any of the |page=, |pages=, or |at= parameters for use in COinS.
]]
local function get_coins_pages (pages)
local pattern;
if not is_set (pages) then return pages; end -- if no page numbers then we're done
while true do
pattern = pages:match("%[(%w*:?//[^ ]+%s+)[%w%d].*%]"); -- pattern is the opening bracket, the URL and following space(s): "[url "
if nil == pattern then break; end -- no more URLs
pattern = escape_lua_magic_chars (pattern); -- pattern is not a literal string; escape Lua's magic pattern characters
pages = pages:gsub(pattern, ""); -- remove as many instances of pattern as possible
end
pages = pages:gsub("[%[%]]", ""); -- remove the brackets
pages = pages:gsub("–", "-" ); -- replace endashes with hyphens
pages = pages:gsub("&%w+;", "-" ); -- and replace HTML entities (– etc.) with hyphens; do we need to replace numerical entities like   and the like?
pages = pages:gsub ('%b<>', ''); -- remove html-like tags; spans are added to <Pages> by utilities.hyphen_to_dash() which should not appear in COinS metadata
return pages;
end
--[=[-------------------------< C O I N S _ R E P L A C E _ M A T H _ S T R I P M A R K E R >------------------
There are three options for math markup rendering that depend on the editor's math preference settings. These
settings are at [[Special:Preferences#mw-prefsection-rendering]] and are
PNG images
TeX source
MathML with SVG or PNG fallback
All three are heavy with HTML and CSS which doesn't belong in the metadata.
Without this function, the metadata saved in the raw wikitext contained the rendering determined by the settings
of the last editor to save the page.
This function gets the rendered form of an equation according to the editor's preference before the page is saved. It
then searches the rendering for the text equivalent of the rendered equation and replaces the rendering with that so
that the page is saved without extraneous HTML/CSS markup and with a reasonably readable text form of the equation.
When a replacement is made, this function returns true and the value with replacement; otherwise false and the initial
value. To replace multipe equations it is necessary to call this function from within a loop.
]=]
local function coins_replace_math_stripmarker (value)
local stripmarker = cfg.stripmarkers['math'];
local rendering = value:match (stripmarker); -- is there a math stripmarker
if not rendering then -- when value doesn't have a math stripmarker, abandon this test
return false, value;
end
rendering = mw.text.unstripNoWiki (rendering); -- convert stripmarker into rendered value (or nil? ''? when math render error)
if rendering:match ('alt="[^"]+"') then -- if PNG math option
rendering = rendering:match ('alt="([^"]+)"'); -- extract just the math text
elseif rendering:match ('$%s+.+%s+%$') then -- if TeX math option; $ is legit character that is escapes as \$
rendering = rendering:match ('$%s+(.+)%s+%$') -- extract just the math text
elseif rendering:match ('<annotation[^>]+>.+</annotation>') then -- if MathML math option
rendering = rendering:match ('<annotation[^>]+>(.+)</annotation>') -- extract just the math text
else
return false, value; -- had math stripmarker but not one of the three defined forms
end
return true, value:gsub (stripmarker, rendering, 1);
end
--[[--------------------------< C O I N S _ C L E A N U P >----------------------------------------------------
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain HTML entities.
2015-12-10: there is a bug in mw.text.unstripNoWiki (). It replaces math stripmarkers with the appropriate content
when it shouldn't. See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29
TODO: move the replacement patterns and replacement values into a table in /Configuration similar to the invisible
characters table?
]]
local function coins_cleanup (value)
local replaced = true; -- default state to get the do loop running
while replaced do -- loop until all math stripmarkers replaced
replaced, value = coins_replace_math_stripmarker (value); -- replace math stripmarker with text representation of the equation
end
value = value:gsub (cfg.stripmarkers['math'], "MATH RENDER ERROR"); -- one or more couldn't be replaced; insert vague error message
value = mw.text.unstrip (value); -- replace nowiki stripmarkers with their content, and kill other stripmarkers
value = value:gsub ('<span class="nowrap" style="padding%-left:0%.1em;">'(s?)</span>', "'%1"); -- replace {{'}} or {{'s}} with simple apostrophe or apostrophe-s
value = value:gsub (' ', ' '); -- replace entity with plain space
value = value:gsub ('\226\128\138', ' '); -- replace hair space with plain space
if not mw.ustring.find (value, cfg.indic_script) then -- don't remove zero-width joiner characters from indic script
value = value:gsub ('‍', ''); -- remove ‍ entities
value = mw.ustring.gsub (value, '[\226\128\141\226\128\139\194\173]', ''); -- remove zero-width joiner, zero-width space, soft hyphen
end
value = value:gsub ('[\009\010\013 ]+', ' '); -- replace horizontal tab, line feed, carriage return with plain space
value = mw.text.decode(value, true) -- decode HTML entities
return value;
end
--[[--------------------------< C O I N S >--------------------------------------------------------------------
COinS metadata (see <http://ocoins.info/>) allows automated tools to parse the citation information.
]]
local function COinS(data, class)
if 'table' ~= type(data) or nil == next(data) then
return '';
end
for k, v in pairs (data) do -- spin through all of the metadata parameter values
if 'ID_list' ~= k and 'Authors' ~= k then -- except the ID_list and Author tables (author nowiki stripmarker done when Author table processed)
data[k] = coins_cleanup (v);
end
end
local ctx_ver = "Z39.88-2004";
-- treat table strictly as an array with only set values.
local OCinSoutput = setmetatable( {}, {
__newindex = function(self, key, value)
if is_set(value) then
rawset( self, #self+1, table.concat{ key, '=', mw.uri.encode( remove_wiki_link( value ) ) } );
end
end
});
if in_array (class, {'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn', 'journal', 'news', 'magazine'}) or
(in_array (class, {'conference', 'interview', 'map', 'press release', 'web'}) and is_set(data.Periodical)) or
('citation' == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:journal"; -- journal metadata identifier
if in_array (class, {'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn'}) then -- set genre according to the type of citation template we are rendering
OCinSoutput["rft.genre"] = "preprint"; -- cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, cite ssrn
elseif 'conference' == class then
OCinSoutput["rft.genre"] = "conference"; -- cite conference (when Periodical set)
elseif 'web' == class then
OCinSoutput["rft.genre"] = "unknown"; -- cite web (when Periodical set)
else
OCinSoutput["rft.genre"] = "article"; -- journal and other 'periodical' articles
end
OCinSoutput["rft.jtitle"] = data.Periodical; -- journal only
OCinSoutput["rft.atitle"] = data.Title; -- 'periodical' article titles
-- these used only for periodicals
OCinSoutput["rft.ssn"] = data.Season; -- keywords: winter, spring, summer, fall
OCinSoutput["rft.quarter"] = data.Quarter; -- single digits 1->first quarter, etc.
OCinSoutput["rft.chron"] = data.Chron; -- free-form date components
OCinSoutput["rft.volume"] = data.Volume; -- does not apply to books
OCinSoutput["rft.issue"] = data.Issue;
OCinSoutput['rft.artnum'] = data.ArticleNumber; -- {{cite journal}} only
OCinSoutput["rft.pages"] = data.Pages; -- also used in book metadata
elseif 'thesis' ~= class then -- all others except cite thesis are treated as 'book' metadata; genre distinguishes
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:book"; -- book metadata identifier
if 'report' == class or 'techreport' == class then -- cite report and cite techreport
OCinSoutput["rft.genre"] = "report";
elseif 'conference' == class then -- cite conference when Periodical not set
OCinSoutput["rft.genre"] = "conference";
OCinSoutput["rft.atitle"] = data.Chapter; -- conference paper as chapter in proceedings (book)
elseif in_array (class, {'book', 'citation', 'encyclopaedia', 'interview', 'map'}) then
if is_set (data.Chapter) then
OCinSoutput["rft.genre"] = "bookitem";
OCinSoutput["rft.atitle"] = data.Chapter; -- book chapter, encyclopedia article, interview in a book, or map title
else
if 'map' == class or 'interview' == class then
OCinSoutput["rft.genre"] = 'unknown'; -- standalone map or interview
else
OCinSoutput["rft.genre"] = 'book'; -- book and encyclopedia
end
end
else -- {'audio-visual', 'AV-media-notes', 'DVD-notes', 'episode', 'interview', 'mailinglist', 'map', 'newsgroup', 'podcast', 'press release', 'serial', 'sign', 'speech', 'web'}
OCinSoutput["rft.genre"] = "unknown";
end
OCinSoutput["rft.btitle"] = data.Title; -- book only
OCinSoutput["rft.place"] = data.PublicationPlace; -- book only
OCinSoutput["rft.series"] = data.Series; -- book only
OCinSoutput["rft.pages"] = data.Pages; -- book, journal
OCinSoutput["rft.edition"] = data.Edition; -- book only
OCinSoutput["rft.pub"] = data.PublisherName; -- book and dissertation
else -- cite thesis
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:dissertation"; -- dissertation metadata identifier
OCinSoutput["rft.title"] = data.Title; -- dissertation (also patent but that is not yet supported)
OCinSoutput["rft.degree"] = data.Degree; -- dissertation only
OCinSoutput['rft.inst'] = data.PublisherName; -- book and dissertation
end
-- NB. Not currently supported are "info:ofi/fmt:kev:mtx:patent", "info:ofi/fmt:kev:mtx:dc", "info:ofi/fmt:kev:mtx:sch_svc", "info:ofi/fmt:kev:mtx:ctx"
-- and now common parameters (as much as possible)
OCinSoutput["rft.date"] = data.Date; -- book, journal, dissertation
for k, v in pairs( data.ID_list ) do -- what to do about these? For now assume that they are common to all?
if k == 'ISBN' then v = v:gsub( "[^-0-9X]", "" ); end
local id = cfg.id_handlers[k].COinS;
if string.sub( id or "", 1, 4 ) == 'info' then -- for ids that are in the info:registry
OCinSoutput["rft_id"] = table.concat{ id, "/", v };
elseif string.sub (id or "", 1, 3 ) == 'rft' then -- for isbn, issn, eissn, etc. that have defined COinS keywords
OCinSoutput[ id ] = v;
elseif 'url' == id then -- for urls that are assembled in ~/Identifiers; |asin= and |ol=
OCinSoutput["rft_id"] = table.concat ({data.ID_list[k], "#id-name=", cfg.id_handlers[k].label});
elseif id then -- when cfg.id_handlers[k].COinS is not nil so urls created here
OCinSoutput["rft_id"] = table.concat{ cfg.id_handlers[k].prefix, v, cfg.id_handlers[k].suffix or '', "#id-name=", cfg.id_handlers[k].label }; -- others; provide a URL and indicate identifier name as #fragment (human-readable, but transparent to browsers)
end
end
local last, first;
for k, v in ipairs( data.Authors ) do
last, first = coins_cleanup (v.last), coins_cleanup (v.first or ''); -- replace any nowiki stripmarkers, non-printing or invisible characters
if k == 1 then -- for the first author name only
if is_set(last) and is_set(first) then -- set these COinS values if |first= and |last= specify the first author name
OCinSoutput["rft.aulast"] = last; -- book, journal, dissertation
OCinSoutput["rft.aufirst"] = first; -- book, journal, dissertation
elseif is_set(last) then
OCinSoutput["rft.au"] = last; -- book, journal, dissertation -- otherwise use this form for the first name
end
else -- for all other authors
if is_set(last) and is_set(first) then
OCinSoutput["rft.au"] = table.concat{ last, ", ", first }; -- book, journal, dissertation
elseif is_set(last) then
OCinSoutput["rft.au"] = last; -- book, journal, dissertation
end
-- TODO: At present we do not report "et al.". Add anything special if this condition applies?
end
end
OCinSoutput.rft_id = data.URL;
OCinSoutput.rfr_id = table.concat{ "info:sid/", string.match (mw.site.server, "[^/]*$" ), ":", data.RawPage };
-- TODO: Add optional extra info:
-- rfr_dat=#REVISION<version> (referrer private data)
-- ctx_id=<data.RawPage>#<ref> (identifier for the context object)
-- ctx_tim=<ts> (timestamp in format yyyy-mm-ddThh:mm:ssTZD or yyyy-mm-dd)
-- ctx_enc=info:ofi/enc:UTF-8 (character encoding)
OCinSoutput = setmetatable( OCinSoutput, nil );
-- sort with version string always first, and combine.
-- table.sort( OCinSoutput );
table.insert( OCinSoutput, 1, "ctx_ver=" .. ctx_ver ); -- such as "Z39.88-2004"
return table.concat(OCinSoutput, "&");
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
cfg = cfg_table_ptr;
has_accept_as_written = utilities_page_ptr.has_accept_as_written; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
remove_wiki_link = utilities_page_ptr.remove_wiki_link;
strip_apostrophe_markup = utilities_page_ptr.strip_apostrophe_markup;
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
make_coins_title = make_coins_title,
get_coins_pages = get_coins_pages,
COinS = COinS,
set_selected_modules = set_selected_modules,
}
c3cf0jrk7cgctay7otxhzxbnb7fbxol
32820
32819
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Citation/CS1/COinS]]
32819
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local has_accept_as_written, is_set, in_array, remove_wiki_link, strip_apostrophe_markup; -- functions in Module:Citation/CS1/Utilities
local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
--[[--------------------------< M A K E _ C O I N S _ T I T L E >----------------------------------------------
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn't corrupted with strings
of %27%27...
]]
local function make_coins_title (title, script)
title = has_accept_as_written (title);
if is_set (title) then
title = strip_apostrophe_markup (title); -- strip any apostrophe markup
else
title = ''; -- if not set, make sure title is an empty string
end
if is_set (script) then
script = script:gsub ('^%l%l%s*:%s*', ''); -- remove language prefix if present (script value may now be empty string)
script = strip_apostrophe_markup (script); -- strip any apostrophe markup
else
script = ''; -- if not set, make sure script is an empty string
end
if is_set (title) and is_set (script) then
script = ' ' .. script; -- add a space before we concatenate
end
return title .. script; -- return the concatenation
end
--[[--------------------------< E S C A P E _ L U A _ M A G I C _ C H A R S >----------------------------------
Returns a string where all of Lua's magic characters have been escaped. This is important because functions like
string.gsub() treat their pattern and replace strings as patterns, not literal strings.
]]
local function escape_lua_magic_chars (argument)
argument = argument:gsub("%%", "%%%%"); -- replace % with %%
argument = argument:gsub("([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1"); -- replace all other Lua magic pattern characters
return argument;
end
--[[--------------------------< G E T _ C O I N S _ P A G E S >------------------------------------------------
Extract page numbers from external wikilinks in any of the |page=, |pages=, or |at= parameters for use in COinS.
]]
local function get_coins_pages (pages)
local pattern;
if not is_set (pages) then return pages; end -- if no page numbers then we're done
while true do
pattern = pages:match("%[(%w*:?//[^ ]+%s+)[%w%d].*%]"); -- pattern is the opening bracket, the URL and following space(s): "[url "
if nil == pattern then break; end -- no more URLs
pattern = escape_lua_magic_chars (pattern); -- pattern is not a literal string; escape Lua's magic pattern characters
pages = pages:gsub(pattern, ""); -- remove as many instances of pattern as possible
end
pages = pages:gsub("[%[%]]", ""); -- remove the brackets
pages = pages:gsub("–", "-" ); -- replace endashes with hyphens
pages = pages:gsub("&%w+;", "-" ); -- and replace HTML entities (– etc.) with hyphens; do we need to replace numerical entities like   and the like?
pages = pages:gsub ('%b<>', ''); -- remove html-like tags; spans are added to <Pages> by utilities.hyphen_to_dash() which should not appear in COinS metadata
return pages;
end
--[=[-------------------------< C O I N S _ R E P L A C E _ M A T H _ S T R I P M A R K E R >------------------
There are three options for math markup rendering that depend on the editor's math preference settings. These
settings are at [[Special:Preferences#mw-prefsection-rendering]] and are
PNG images
TeX source
MathML with SVG or PNG fallback
All three are heavy with HTML and CSS which doesn't belong in the metadata.
Without this function, the metadata saved in the raw wikitext contained the rendering determined by the settings
of the last editor to save the page.
This function gets the rendered form of an equation according to the editor's preference before the page is saved. It
then searches the rendering for the text equivalent of the rendered equation and replaces the rendering with that so
that the page is saved without extraneous HTML/CSS markup and with a reasonably readable text form of the equation.
When a replacement is made, this function returns true and the value with replacement; otherwise false and the initial
value. To replace multipe equations it is necessary to call this function from within a loop.
]=]
local function coins_replace_math_stripmarker (value)
local stripmarker = cfg.stripmarkers['math'];
local rendering = value:match (stripmarker); -- is there a math stripmarker
if not rendering then -- when value doesn't have a math stripmarker, abandon this test
return false, value;
end
rendering = mw.text.unstripNoWiki (rendering); -- convert stripmarker into rendered value (or nil? ''? when math render error)
if rendering:match ('alt="[^"]+"') then -- if PNG math option
rendering = rendering:match ('alt="([^"]+)"'); -- extract just the math text
elseif rendering:match ('$%s+.+%s+%$') then -- if TeX math option; $ is legit character that is escapes as \$
rendering = rendering:match ('$%s+(.+)%s+%$') -- extract just the math text
elseif rendering:match ('<annotation[^>]+>.+</annotation>') then -- if MathML math option
rendering = rendering:match ('<annotation[^>]+>(.+)</annotation>') -- extract just the math text
else
return false, value; -- had math stripmarker but not one of the three defined forms
end
return true, value:gsub (stripmarker, rendering, 1);
end
--[[--------------------------< C O I N S _ C L E A N U P >----------------------------------------------------
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain HTML entities.
2015-12-10: there is a bug in mw.text.unstripNoWiki (). It replaces math stripmarkers with the appropriate content
when it shouldn't. See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29
TODO: move the replacement patterns and replacement values into a table in /Configuration similar to the invisible
characters table?
]]
local function coins_cleanup (value)
local replaced = true; -- default state to get the do loop running
while replaced do -- loop until all math stripmarkers replaced
replaced, value = coins_replace_math_stripmarker (value); -- replace math stripmarker with text representation of the equation
end
value = value:gsub (cfg.stripmarkers['math'], "MATH RENDER ERROR"); -- one or more couldn't be replaced; insert vague error message
value = mw.text.unstrip (value); -- replace nowiki stripmarkers with their content, and kill other stripmarkers
value = value:gsub ('<span class="nowrap" style="padding%-left:0%.1em;">'(s?)</span>', "'%1"); -- replace {{'}} or {{'s}} with simple apostrophe or apostrophe-s
value = value:gsub (' ', ' '); -- replace entity with plain space
value = value:gsub ('\226\128\138', ' '); -- replace hair space with plain space
if not mw.ustring.find (value, cfg.indic_script) then -- don't remove zero-width joiner characters from indic script
value = value:gsub ('‍', ''); -- remove ‍ entities
value = mw.ustring.gsub (value, '[\226\128\141\226\128\139\194\173]', ''); -- remove zero-width joiner, zero-width space, soft hyphen
end
value = value:gsub ('[\009\010\013 ]+', ' '); -- replace horizontal tab, line feed, carriage return with plain space
value = mw.text.decode(value, true) -- decode HTML entities
return value;
end
--[[--------------------------< C O I N S >--------------------------------------------------------------------
COinS metadata (see <http://ocoins.info/>) allows automated tools to parse the citation information.
]]
local function COinS(data, class)
if 'table' ~= type(data) or nil == next(data) then
return '';
end
for k, v in pairs (data) do -- spin through all of the metadata parameter values
if 'ID_list' ~= k and 'Authors' ~= k then -- except the ID_list and Author tables (author nowiki stripmarker done when Author table processed)
data[k] = coins_cleanup (v);
end
end
local ctx_ver = "Z39.88-2004";
-- treat table strictly as an array with only set values.
local OCinSoutput = setmetatable( {}, {
__newindex = function(self, key, value)
if is_set(value) then
rawset( self, #self+1, table.concat{ key, '=', mw.uri.encode( remove_wiki_link( value ) ) } );
end
end
});
if in_array (class, {'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn', 'journal', 'news', 'magazine'}) or
(in_array (class, {'conference', 'interview', 'map', 'press release', 'web'}) and is_set(data.Periodical)) or
('citation' == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:journal"; -- journal metadata identifier
if in_array (class, {'arxiv', 'biorxiv', 'citeseerx', 'medrxiv', 'ssrn'}) then -- set genre according to the type of citation template we are rendering
OCinSoutput["rft.genre"] = "preprint"; -- cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, cite ssrn
elseif 'conference' == class then
OCinSoutput["rft.genre"] = "conference"; -- cite conference (when Periodical set)
elseif 'web' == class then
OCinSoutput["rft.genre"] = "unknown"; -- cite web (when Periodical set)
else
OCinSoutput["rft.genre"] = "article"; -- journal and other 'periodical' articles
end
OCinSoutput["rft.jtitle"] = data.Periodical; -- journal only
OCinSoutput["rft.atitle"] = data.Title; -- 'periodical' article titles
-- these used only for periodicals
OCinSoutput["rft.ssn"] = data.Season; -- keywords: winter, spring, summer, fall
OCinSoutput["rft.quarter"] = data.Quarter; -- single digits 1->first quarter, etc.
OCinSoutput["rft.chron"] = data.Chron; -- free-form date components
OCinSoutput["rft.volume"] = data.Volume; -- does not apply to books
OCinSoutput["rft.issue"] = data.Issue;
OCinSoutput['rft.artnum'] = data.ArticleNumber; -- {{cite journal}} only
OCinSoutput["rft.pages"] = data.Pages; -- also used in book metadata
elseif 'thesis' ~= class then -- all others except cite thesis are treated as 'book' metadata; genre distinguishes
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:book"; -- book metadata identifier
if 'report' == class or 'techreport' == class then -- cite report and cite techreport
OCinSoutput["rft.genre"] = "report";
elseif 'conference' == class then -- cite conference when Periodical not set
OCinSoutput["rft.genre"] = "conference";
OCinSoutput["rft.atitle"] = data.Chapter; -- conference paper as chapter in proceedings (book)
elseif in_array (class, {'book', 'citation', 'encyclopaedia', 'interview', 'map'}) then
if is_set (data.Chapter) then
OCinSoutput["rft.genre"] = "bookitem";
OCinSoutput["rft.atitle"] = data.Chapter; -- book chapter, encyclopedia article, interview in a book, or map title
else
if 'map' == class or 'interview' == class then
OCinSoutput["rft.genre"] = 'unknown'; -- standalone map or interview
else
OCinSoutput["rft.genre"] = 'book'; -- book and encyclopedia
end
end
else -- {'audio-visual', 'AV-media-notes', 'DVD-notes', 'episode', 'interview', 'mailinglist', 'map', 'newsgroup', 'podcast', 'press release', 'serial', 'sign', 'speech', 'web'}
OCinSoutput["rft.genre"] = "unknown";
end
OCinSoutput["rft.btitle"] = data.Title; -- book only
OCinSoutput["rft.place"] = data.PublicationPlace; -- book only
OCinSoutput["rft.series"] = data.Series; -- book only
OCinSoutput["rft.pages"] = data.Pages; -- book, journal
OCinSoutput["rft.edition"] = data.Edition; -- book only
OCinSoutput["rft.pub"] = data.PublisherName; -- book and dissertation
else -- cite thesis
OCinSoutput.rft_val_fmt = "info:ofi/fmt:kev:mtx:dissertation"; -- dissertation metadata identifier
OCinSoutput["rft.title"] = data.Title; -- dissertation (also patent but that is not yet supported)
OCinSoutput["rft.degree"] = data.Degree; -- dissertation only
OCinSoutput['rft.inst'] = data.PublisherName; -- book and dissertation
end
-- NB. Not currently supported are "info:ofi/fmt:kev:mtx:patent", "info:ofi/fmt:kev:mtx:dc", "info:ofi/fmt:kev:mtx:sch_svc", "info:ofi/fmt:kev:mtx:ctx"
-- and now common parameters (as much as possible)
OCinSoutput["rft.date"] = data.Date; -- book, journal, dissertation
for k, v in pairs( data.ID_list ) do -- what to do about these? For now assume that they are common to all?
if k == 'ISBN' then v = v:gsub( "[^-0-9X]", "" ); end
local id = cfg.id_handlers[k].COinS;
if string.sub( id or "", 1, 4 ) == 'info' then -- for ids that are in the info:registry
OCinSoutput["rft_id"] = table.concat{ id, "/", v };
elseif string.sub (id or "", 1, 3 ) == 'rft' then -- for isbn, issn, eissn, etc. that have defined COinS keywords
OCinSoutput[ id ] = v;
elseif 'url' == id then -- for urls that are assembled in ~/Identifiers; |asin= and |ol=
OCinSoutput["rft_id"] = table.concat ({data.ID_list[k], "#id-name=", cfg.id_handlers[k].label});
elseif id then -- when cfg.id_handlers[k].COinS is not nil so urls created here
OCinSoutput["rft_id"] = table.concat{ cfg.id_handlers[k].prefix, v, cfg.id_handlers[k].suffix or '', "#id-name=", cfg.id_handlers[k].label }; -- others; provide a URL and indicate identifier name as #fragment (human-readable, but transparent to browsers)
end
end
local last, first;
for k, v in ipairs( data.Authors ) do
last, first = coins_cleanup (v.last), coins_cleanup (v.first or ''); -- replace any nowiki stripmarkers, non-printing or invisible characters
if k == 1 then -- for the first author name only
if is_set(last) and is_set(first) then -- set these COinS values if |first= and |last= specify the first author name
OCinSoutput["rft.aulast"] = last; -- book, journal, dissertation
OCinSoutput["rft.aufirst"] = first; -- book, journal, dissertation
elseif is_set(last) then
OCinSoutput["rft.au"] = last; -- book, journal, dissertation -- otherwise use this form for the first name
end
else -- for all other authors
if is_set(last) and is_set(first) then
OCinSoutput["rft.au"] = table.concat{ last, ", ", first }; -- book, journal, dissertation
elseif is_set(last) then
OCinSoutput["rft.au"] = last; -- book, journal, dissertation
end
-- TODO: At present we do not report "et al.". Add anything special if this condition applies?
end
end
OCinSoutput.rft_id = data.URL;
OCinSoutput.rfr_id = table.concat{ "info:sid/", string.match (mw.site.server, "[^/]*$" ), ":", data.RawPage };
-- TODO: Add optional extra info:
-- rfr_dat=#REVISION<version> (referrer private data)
-- ctx_id=<data.RawPage>#<ref> (identifier for the context object)
-- ctx_tim=<ts> (timestamp in format yyyy-mm-ddThh:mm:ssTZD or yyyy-mm-dd)
-- ctx_enc=info:ofi/enc:UTF-8 (character encoding)
OCinSoutput = setmetatable( OCinSoutput, nil );
-- sort with version string always first, and combine.
-- table.sort( OCinSoutput );
table.insert( OCinSoutput, 1, "ctx_ver=" .. ctx_ver ); -- such as "Z39.88-2004"
return table.concat(OCinSoutput, "&");
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
cfg = cfg_table_ptr;
has_accept_as_written = utilities_page_ptr.has_accept_as_written; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
remove_wiki_link = utilities_page_ptr.remove_wiki_link;
strip_apostrophe_markup = utilities_page_ptr.strip_apostrophe_markup;
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
make_coins_title = make_coins_title,
get_coins_pages = get_coins_pages,
COinS = COinS,
set_selected_modules = set_selected_modules,
}
c3cf0jrk7cgctay7otxhzxbnb7fbxol
Tempilet:Small
10
932
32943
2025-09-23T21:17:23Z
en>Pppery
0
Clean subst
32943
wikitext
text/x-wiki
<span style="font-size: 85%;">{{{1}}}</span><includeonly>{{SAFESUBST:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using small with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Small]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 }}{{SAFESUBST:#if:{{{1|}}}||[[Category:Pages using small with an empty input parameter]]}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
43wvbhslbipv3afe7bq06ykm7the2ah
32944
8263
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Small]]
8263
wikitext
text/x-wiki
<span style="font-size: 85%;">{{{1}}}</span><includeonly>{{SAFESUBST:#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using small with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Small]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 }}{{SAFESUBST:#if:{{{1|}}}||[[Category:Pages using small with an empty input parameter]]}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
43wvbhslbipv3afe7bq06ykm7the2ah
Module:Lang/data
828
1001
32814
32813
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lang/data]]
32813
Scribunto
text/plain
local lang_obj = mw.language.getContentLanguage();
local this_wiki_lang_tag = lang_obj.code; -- get this wiki's language tag
--[[--------------------------< L A N G _ N A M E _ T A B L E >------------------------------------------------
primary table of tables that decode:
lang -> language tags and names
script -> ISO 15924 script tags
region -> ISO 3166 region tags
variant -> IANA registered variant tags
suppressed -> map of scripts tags and their associated language tags
all of these data come from separate modules that are derived from the IANA language-subtag-registry file
key_to_lower() avoids the metatable trap and sets all keys in the subtables to lowercase. Many language codes
have multiple associated names; Module:lang is only concerned with the first name so key_to_lower() only fetches
the first name.
]]
local function key_to_lower (module, src_type)
local out = {};
local source_t = (('var_sup' == src_type) and require (module)) or mw.loadData (module); -- fetch data from this module; require() avoids metatable trap for variant data
if 'var_sup' == src_type then
for k, v in pairs (source_t) do
out[k:lower()] = v; -- for variant and suppressed everything is needed
end
elseif 'lang' == src_type and source_t.active then -- for ~/iana_languages (active)
for k, v in pairs (source_t.active) do
out[k:lower()] = v[1]; -- ignore multiple names; take first name only
end
elseif 'lang_dep' == src_type and source_t.deprecated then -- for ~/iana_languages (deprecated)
for k, v in pairs (source_t.deprecated) do
out[k:lower()] = v[1]; -- ignore multiple names; take first name only
end
else -- here for all other sources
for k, v in pairs (source_t) do
out[k:lower()] = v[1]; -- ignore multiple names; take first name only
end
end
return out;
end
local lang_name_table_t = {
lang = key_to_lower ('Module:Lang/data/iana languages', 'lang'),
lang_dep = key_to_lower ('Module:Lang/data/iana languages', 'lang_dep'),
script = key_to_lower ('Module:Lang/data/iana scripts'), -- script keys are capitalized; set to lower
region = key_to_lower ('Module:Lang/data/iana regions'), -- region keys are uppercase; set to lower
variant = key_to_lower ('Module:Lang/data/iana variants', 'var_sup'),
suppressed = key_to_lower ('Module:Lang/data/iana suppressed scripts', 'var_sup'), -- script keys are capitalized; set to lower
}
--[[--------------------------< I 1 8 N M E D I A W I K I O V E R R I D E >--------------------------------
For internationalization; not used at en.wiki
The language names taken from the IANA language-subtag-registry file are given in English. That may not be ideal.
Translating ~8,000 language names is also not ideal. MediaWiki maintains (much) shorter lists of language names
in most languages for which there is a Wikipedia edition. When desired, Module:Lang can use the MediaWiki
language list for the local language.
Caveat lector: the list of MediaWiki language names for your language may not be complete or may not exist at all.
When incomplete, MediaWiki's list will 'fall back' to another language (typically English). When that happens
add an appropriate entry to the override table below.
Caveat lector: the list of MediaWiki language names for your language may not be correct. At en.wiki, the
MediaWiki language names do not agree with the IANA language names for these ISO 639-1 tags. Often it is simply
spelling differences:
bh: IANA: Bihari languages MW: Bhojpuri – the ISO 639-3 tag for Bhojpuri is bho
bn: IANA: Bengali MW: Bangla – Bengali is the exonym, Bangla is the endonym
dv: IANA: Dhivehi MW: Divehi
el: IANA: Modern Greek MW: Greek
ht: IANA: Haitian MW: Haitian Creole
ky: IANA: Kirghiz MW: Kyrgyz
li: IANA: Limburgan MW: Limburgish
or: IANA: Oriya MW: Odia
os: IANA: Ossetian MW: Ossetic
"pa: IANA: Panjabi MW: Punjabi
"ps: IANA: Pushto MW: Pashto
"to: IANA: Tonga MW: Tongan
"ug: IANA: Uighur MW: Uyghur
use the override table to override language names that are incorrect for your project
To see the list of names that MediaWiki has for your language, enter this in the Debug console:
=mw.dumpObject (mw.language.fetchLanguageNames ('<tag>', 'all'))
(replacing <tag> with the language tag for your language)
Use of the MediaWiki language names lists is enabled when media_wiki_override_enable is set to boolean true.
]]
local media_wiki_override_enable = false; -- set to true to override IANA names with MediaWiki names; always false at en.wiki
-- caveat lector: the list of MediaWiki language names for your language may not be complete or may not exist at all
if true == media_wiki_override_enable then
local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_lang_tag, 'all'); -- get a table of language tag/name pairs known to MediaWiki
for tag, name in pairs (mw_languages_by_tag_t) do -- loop through each tag/name pair in the MediaWiki list
if lang_name_table_t.lang[tag] then -- if the tag is in the main list
lang_name_table_t.lang[tag] = name; -- overwrite existing name with the name from MediaWiki
end
end
end
--[[--------------------------< O V E R R I D E >--------------------------------------------------------------
Language codes and names in this table override the BCP47 names in lang_name_table.
indexes in this table shall always be lower case
]]
local override = {
------------------------------< I S O _ 6 3 9 - 1 >------------------------------------------------------------
["ab"] = "Abkhaz", -- to match en.wiki article name
["ca-valencia"] = "Valencian",
["cu"] = "Church Slavonic", -- 2nd IANA name;
["de-at"] = "Austrian German", -- these code-region and code-variant tags to match en.wiki article names
["de-ch"] = "Swiss Standard German",
["en-au"] = "Australian English",
["en-ca"] = "Canadian English",
["en-emodeng"] = "Early Modern English",
["en-gb"] = "British English",
["en-ie"] = "Irish English",
["en-in"] = "Indian English",
["en-nz"] = "New Zealand English",
["en-us"] = "American English",
["en-za"] = "South African English",
["fr-ca"] = "Canadian French",
["fr-gallo"] = "Gallo",
["fy"] = "West Frisian", -- Western Frisian
["mo"] = "Moldovan", -- Moldavian (deprecated code); to match en.wiki article title
["nl-be"] = "Flemish", -- match MediaWiki
["oc-gascon"] = "Gascon",
["oc-provenc"] = "Provençal",
["ps"] = "Pashto", -- Pushto
["pt-br"] = "Brazilian Portuguese", -- match MediaWiki
["ro-md"] = "Moldovan", -- 'not deprecated' form
["ro-cyrl-md"] = "Moldovan", -- 'not deprecated' form
["tw-asante"] = "Asante Twi",
["ug"] = "Uyghur", -- 2nd IANA name; to match en.wiki article name
-- these ISO 639-1 language-name overrides imported from Module:Language/data/wp_languages (since deleted)
--<begin do-not-edit except to comment out>--
["av"] = "Avar", -- Avaric
["bo"] = "Standard Tibetan", -- Tibetan
["el"] = "Greek", -- Modern Greek
-- ["en-SA"] = "South African English", -- English; no; SA is not South Africa it Saudi Arabia; ZA is South Africa
["ff"] = "Fula", -- Fulah
["ht"] = "Haitian Creole", -- Haitian
["hz"] = "Otjiherero", -- Herero
["ii"] = "Yi", -- Sichuan Yi
["ki"] = "Gikuyu", -- Kikuyu
["kl"] = "Greenlandic", -- Kalaallisut
["ky"] = "Kyrgyz", -- Kirghiz
["lg"] = "Luganda", -- Ganda
["li"] = "Limburgish", -- Limburgan
["mi"] = "Māori", -- Maori
["na"] = "Nauruan", -- Nauru
["nb"] = "Bokmål", -- Norwegian Bokmål
["nd"] = "Northern Ndebele", -- North Ndebele
["nn"] = "Nynorsk", -- Norwegian Nynorsk
["nr"] = "Southern Ndebele", -- South Ndebele
["ny"] = "Chichewa", -- Nyanja
["oj"] = "Ojibwe", -- Ojibwa
["or"] = "Odia", -- Oriya
["pa"] = "Punjabi", -- Panjabi
["rn"] = "Kirundi", -- Rundi
["sl"] = "Slovene", -- Slovenian
["ss"] = "Swazi", -- Swati
["st"] = "Sotho", -- Southern Sotho
["to"] = "Tongan", -- Tonga
--<end do-not-edit except to comment out>--
------------------------------< I S O _ 6 3 9 - 2, - 3, - 5 >----------------------------------------------
["alv"] = "Atlantic–Congo languages", -- to match en.wiki article title (endash)
["arc"] = "Imperial Aramaic (700-300 BCE)", -- Official Aramaic (700-300 BCE), Imperial Aramaic (700-300 BCE); to match en.wiki article title uses ISO639-2 'preferred' name
["art"] = "constructed", -- to match en.wiki article; lowercase for category name
["arx"] = "Aruá (Rondonia State)", -- Aruá (Rodonia State); to match en.wiki article
["ast-es"] = "Leonese", -- ast in IANA is Asturian; Leonese is a dialect
["bea"] = "Dane-zaa", -- Beaver; to match en.wiki article title
["bha"] = "Bhariati", -- Bharia; to match en.wiki article title
["bhd"] = "Bhadarwahi", -- Bhadrawahi; to match en.wiki article title
["bla"] = "Blackfoot", -- Siksika; to match en.wiki article title
["blc"] = "Nuxalk", -- Bella Coola; to match en.wiki article title
["bua"] = "Buryat", -- Buriat; this is a macro language; these four use wp preferred transliteration;
["bxm"] = "Mongolian Buryat", -- Mongolia Buriat; these three all redirect to Buryat
["bxr"] = "Russian Buryat", -- Russia Buriat;
["bxu"] = "Chinese Buryat", -- China Buriat;
["byr"] = "Yipma", -- Baruya, Yipma
["clm"] = "Klallam", -- Clallam; to match en.wiki article title
["crb"] = "Kalinago", -- Island Carib; to match en.wiki article
["egy"] = "Ancient Egyptian", -- Egyptian (Ancient); distinguish from contemporary arz: Egyptian Arabic
["ems"] = "Alutiiq", -- Pacific Gulf Yupik; to match en.wiki article title
["esx"] = "Eskimo–Aleut languages", -- to match en.wiki article title (endash)
["frr"] = "North Frisian", -- Northern Frisian
["frs"] = "East Frisian Low Saxon", -- Eastern Frisian
["gsw-fr"] = "Alsatian", -- match MediaWiki
["haa"] = "Hän", -- Han; to match en.wiki article title
["hei"] = "Heiltsuk–Oowekyala", -- Heiltsuk; to match en.wiki article title
["hmx"] = "Hmong–Mien languages", -- to match en.wiki article title (endash)
["ilo"] = "Ilocano", -- Iloko; to match en.wiki article title
["jam"] = "Jamaican Patois", -- Jamaican Creole English
["lij-mc"] = "Monégasque", -- Ligurian as spoken in Monaco; this one for proper tool tip; also in <article_name> table
["luo"] = "Dholuo", -- IANA (primary) /ISO 639-3: Luo (Kenya and Tanzania); IANA (secondary): Dholuo
["mhr"] = "Meadow Mari", -- Eastern Mari
["mid"] = "Modern Mandaic", -- Mandaic
['mis'] = "uncoded", -- Uncoded languages; capitalization; special scope, not collective scope;
["mkh"] = "Mon–Khmer languages", -- to match en.wiki article title (endash)
["mla"] = "Tamambo", -- Malo
['mte'] = "Mono-Alu", -- Mono (Solomon Islands)
['mul'] = "multiple", -- Multiple languages; capitalization; special scope, not collective scope;
["nan-tw"] = "Taiwanese Hokkien", -- make room for IANA / 639-3 nan Min Nan Chinese; match en.wiki article title
["new"] = "Newar", -- Newari, Nepal Bhasa; to match en,wiki article title
["ngf"] = "Trans–New Guinea languages", -- to match en.wiki article title (endash)
["nic"] = "Niger–Congo languages", -- Niger-Kordofanian languages; to match en,wiki article title
["nod"] = "Lanna", -- Northern Thai; to match en.wiki article title
["nrf"] = "Norman", -- not quite a collective - IANA name: Jèrriais + Guernésiais; categorizes to Norman-language text
["nrf-gg"] = "Guernésiais", -- match MediaWiki
["nrf-je"] = "Jèrriais", -- match MediaWiki
["nzi"] = "Nzema", -- Nzima; to match en.wiki article title
["oma"] = "Omaha–Ponca", -- to match en.wiki article title (endash)
["orv"] = "Old East Slavic", -- Old Russian
["pfl"] = "Palatine German", -- Pfaelzisch; to match en.wiki article
["pie"] = "Piro Pueblo", -- Piro; to match en.wiki article
["pms"] = "Piedmontese", -- Piemontese; to match en.wiki article title
["pnb"] = "Punjabi (Western)", -- Western Panjabi; dab added to override import from ~/wp languages and distinguish pnb from pa in reverse look up tag_from_name()
['qwm'] = "Cuman", -- Kuman (Russia); to match en.wiki article name
["rop"] = "Australian Kriol", -- Kriol; en.wiki article is a dab; point to correct en.wiki article
["rsk"] = "Pannonian Rusyn", -- Ruthenian; en.wiki preferred name
["sco-ulster"] = "Ulster Scots",
["sdo"] = "Bukar–Sadong", -- Bukar-Sadung Bidayuh; to match en.wiki article title
["smp"] = "Samaritan Hebrew", -- to match en.wiki article title
["stq"] = "Saterland Frisian", -- Saterfriesisch
["tet"] = "Tetun", -- to match en.wiki article title
["tfn"] = "Denaʼina", -- to match en.wiki article title
["und"] = "undetermined", -- capitalization to match existing category
["wrg"] = "Warrongo", -- Warungu
["xal-ru"] = "Kalmyk", -- to match en.wiki article title
["xgf"] = "Tongva", -- ISO 639-3 is Gabrielino-Fernandeño
["yuf"] = "Havasupai–Hualapai", -- Havasupai-Walapai-Yavapai; to match en.wiki article title
["zkh"] = "Khorezmian Turkic", -- Khorezmian; to match en.wiki article title, avoiding the dab
["zkt"] = "Khitan", -- Kitan; to match en.wiki article title
["zxx"] = "no linguistic content", -- capitalization
-- these ISO 639-2, -3 language-name overrides imported from Module:Language/data/wp_languages (since deleted)
--<begin do-not-edit except to comment out>--
["ace"] = "Acehnese", -- Achinese
["aec"] = "Sa'idi Arabic", -- Saidi Arabic
["akl"] = "Aklan", -- Aklanon
["alt"] = "Altay", -- Southern Altai
["apm"] = "Mescalero-Chiricahua", -- Mescalero-Chiricahua Apache
["bal"] = "Balochi", -- Baluchi
-- ["bcl"] = "Central Bicolano", -- Central Bikol
["bin"] = "Edo", -- Bini
["bpy"] = "Bishnupriya Manipuri", -- Bishnupriya
["chg"] = "Chagatay", -- Chagatai
["ckb"] = "Sorani Kurdish", -- Central Kurdish
["cnu"] = "Shenwa", -- Chenoua
["coc"] = "Cocopah", -- Cocopa
["diq"] = "Zazaki", -- Dimli
["fit"] = "Meänkieli", -- Tornedalen Finnish
["fkv"] = "Kven", -- Kven Finnish
["frk"] = "Old Frankish", -- Frankish
["gez"] = "Ge'ez", -- Geez
["gju"] = "Gujari", -- Gujari
["gsw"] = "Alemannic German", -- Swiss German
["gul"] = "Gullah", -- Sea Island Creole English
["hak"] = "Hakka", -- Hakka Chinese
["hbo"] = "Biblical Hebrew", -- Ancient Hebrew
["hnd"] = "Hindko", -- Southern Hindko
-- ["ikt"] = "Inuvialuk", -- Inuinnaqtun
["kaa"] = "Karakalpak", -- Kara-Kalpak
["khb"] = "Tai Lü", -- Lü
["kmr"] = "Kurmanji Kurdish", -- Northern Kurdish
["kpo"] = "Kposo", -- Ikposo
["krj"] = "Kinaray-a", -- Kinaray-A
-- ["ktz"] = "Juǀ'hoan", -- Juǀʼhoan
["lez"] = "Lezgian", -- Lezghian
["liv"] = "Livonian", -- Liv
["lng"] = "Lombardic", -- Langobardic
["mia"] = "Miami-Illinois", -- Miami
["miq"] = "Miskito", -- Mískito
["mix"] = "Mixtec", -- Mixtepec Mixtec
["mni"] = "Meitei", -- Manipuri
["mrj"] = "Hill Mari", -- Western Mari
["mww"] = "White Hmong", -- Hmong Daw
["nds-nl"] = "Dutch Low Saxon", -- Low German
-- ["new"] = "Nepal Bhasa", -- Newari
["nso"] = "Northern Sotho", -- Pedi
-- ["nwc"] = "Classical Nepal Bhasa", -- Classical Newari, Classical Nepal Bhasa, Old Newari
["ood"] = "O'odham", -- Tohono O'odham
["otk"] = "Old Turkic", -- Old Turkish
["pal"] = "Middle Persian", -- Pahlavi
["pam"] = "Kapampangan", -- Pampanga
["phr"] = "Potwari", -- Pahari-Potwari
["pka"] = "Jain Prakrit", -- Ardhamāgadhī Prākrit
-- ["pnb"] = "Punjabi", -- Western Panjabi
["psu"] = "Shauraseni", -- Sauraseni Prākrit
["rap"] = "Rapa Nui", -- Rapanui
["rar"] = "Cook Islands Māori", -- Rarotongan
["rmu"] = "Scandoromani", -- Tavringer Romani
["rom"] = "Romani", -- Romany
["rup"] = "Aromanian", -- Macedo-Romanian
["ryu"] = "Okinawan", -- Central Okinawan
["sdc"] = "Sassarese", -- Sassarese Sardinian
["sdn"] = "Gallurese", -- Gallurese Sardinian
["shp"] = "Shipibo", -- Shipibo-Conibo
["src"] = "Logudorese", -- Logudorese Sardinian
["sro"] = "Campidanese", -- Campidanese Sardinian
["tkl"] = "Tokelauan", -- Tokelau
["tvl"] = "Tuvaluan", -- Tuvalu
["tyv"] = "Tuvan", -- Tuvinian
["vls"] = "West Flemish", -- Vlaams
["wep"] = "Westphalian", -- Westphalien
["xal"] = "Oirat", -- Kalmyk
["xcl"] = "Old Armenian", -- Classical Armenian
["yua"] = "Yucatec Maya", -- Yucateco
--<end do-not-edit except to comment out>--
------------------------------< P R I V A T E _ U S E _ T A G S >----------------------------------------------
["akk-x-latbabyl"] = "Late Babylonian Akkadian",
["akk-x-midassyr"] = "Middle Assyrian Akkadian",
["akk-x-midbabyl"] = "Middle Babylonian Akkadian",
["akk-x-neoassyr"] = "Neo-Assyrian Akkadian",
["akk-x-neobabyl"] = "Neo-Babylonian Akkadian",
["akk-x-old"] = "Old Akkadian",
["akk-x-oldassyr"] = "Old Assyrian Akkadian",
["akk-x-oldbabyl"] = "Old Babylonian Akkadian",
["alg-x-proto"] = "Proto-Algonquian", -- alg in IANA is Algonquian languages
["ar-x-classic"] = "Classical Arabic",
["ar-x-nabat"] = "Nabataean Arabic",
["ar-x-safaitic"] = "Safaitic",
["art-x-uropi"] = "Uropi", -- art in IANA is Artificial languages
["ast-x-west"] = "Western Asturian",
["ca-x-old"] = "Old Catalan",
["cel-x-combrit"] = "Common Brittonic", -- cel in IANA is Celtic languages
["cel-x-proto"] = "Proto-Celtic",
["ccs-x-proto"] = "Proto-Kartvelian", -- ccs in IANA is Kartvelian languages
["egy-x-demotic"] = "Demotic Egyptian",
["egy-x-late"] = "Late Egyptian",
["egy-x-middle"] = "Middle Egyptian",
["egy-x-old"] = "Old Egyptian",
["et-x-seto"] = "Seto", -- to replace {{Lang-est-sea}}
["fa-x-classic"] = "Classical Persian",
["fiu-x-proto"] = "Proto-Finno-Ugric", -- fiu in IANA is Finno-Ugric languages
["fr-x-frainc"] = "Franc-Comtois", -- to replace {{Lang-fra-frc}}
["fr-x-quebec"] = "Quebec French",
["gem-x-proto"] = "Proto-Germanic", -- gem in IANA is Germanic languages
["gmq-x-proto"] = "Proto-Norse",
["gmw-x-ecg"] = "East Central German",
["gmw-x-proto"] = "Proto-West Germanic",
["grc-x-aeolic"] = "Aeolic Greek", -- these grc-x-... codes are preferred alternates to the non-standard catchall code grc-gre
["grc-x-arcadcyp"] = "Arcadocypriot Greek",
["grc-x-attic"] = "Attic Greek",
["grc-x-biblical"] = "Biblical Greek",
["grc-x-byzant"] = "Byzantine Greek",
["grc-x-classic"] = "Classical Greek",
["grc-x-doric"] = "Doric Greek",
["grc-x-hellen"] = "Hellenistic Greek",
["grc-x-ionic"] = "Ionic Greek",
["grc-x-koine"] = "Koine Greek",
["grc-x-medieval"] = "Medieval Greek",
["grc-x-pamph"] = "Pamphylian Greek",
["grc-x-patris"] = "Patristic Greek",
["grk-x-proto"] = "Proto-Greek", -- grk in IANA is Greek languages
["iir-x-proto"] = "Proto-Indo-Iranian", -- iir in IANA is Indo-Iranian Languages
["inc-x-mitanni"] = "Mitanni-Aryan", -- inc in IANA is Indic languages
["inc-x-proto"] = "Proto-Indo-Aryan",
["ine-x-anatolia"] = "Anatolian languages",
["ine-x-proto"] = "Proto-Indo-European",
["ira-x-proto"] = "Proto-Iranian", -- ira in IANA is Iranian languages
["itc-x-proto"] = "Proto-Italic", -- itc in IANA is Italic languages
["ksh-x-colog"] = "Colognian", -- en.wiki article is Colognian; ksh (Kölsch) redirects there
["la-x-church"] = "Ecclesiastical Latin",
["la-x-classic"] = "Classical Latin",
["la-x-late"] = "Late Latin",
["la-x-medieval"] = "Medieval Latin",
["la-x-new"] = "New Latin",
["la-x-old"] = "Old Latin",
["la-x-ren"] = "Renaissance Latin",
["la-x-vulgar"] = "Vulgar Latin",
["lmo-x-berg"] = "Bergamasque", -- lmo in IANA is Lombard; Bergamasque is a dialect
["lmo-x-cremish"] = "Cremish", -- lmo in IANA is Lombard; Cremish is a dialect
["lmo-x-milanese"] = "Milanese", -- lmo in IANA is Lombard; Milanese is a dialect
["mis-x-ripuar"] = "Ripuarian", -- replaces improper use of ksh in wp_languages
["prg-x-old"] = "Old Prussian",
["roa-x-proto"] = "Proto-Romance",
["sem-x-ammonite"] = "Ammonite",
["sem-x-aramaic"] = "Aramaic",
["sem-x-canaan"] = "Canaanite languages",
["sem-x-dadanit"] = "Dadanitic",
["sem-x-dumaitic"] = "Dumaitic",
["sem-x-egurage"] = "Eastern Gurage",
["sem-x-hasaitic"] = "Hasaitic",
["sem-x-hatran"] = "Hatran Aramaic",
["sem-x-hismaic"] = "Hismaic",
["sem-x-nabat"] = "Nabataean Aramaic",
["sem-x-oldsoara"] = "Old South Arabian",
["sem-x-palmyren"] = "Palmyrene Aramaic",
["sem-x-proto"] = "Proto-Semitic",
["sem-x-taymanit"] = "Taymanitic",
["smi-x-proto"] = "Proto-Samic", -- smi in IANA is Samic languages
["sla-x-proto"] = "Proto-Slavic", -- sla in IANA is Slavic languages
["sq-x-proto"] = "Proto-Albanian",
["trk-x-oldanat"] = "Old Anatolian Turkish", -- to replace {{Lang-1ca}}
["urj-x-proto"] = "Proto-Uralic", -- urj in IANA is Uralic languages
["yuf-x-hav"] = "Havasupai", -- IANA name for these three is Havasupai-Walapai-Yavapai
["yuf-x-wal"] = "Walapai",
["yuf-x-yav"] = "Yavapai",
["xsa-x-himyarit"] = "Himyaritic",
["xsc-x-pontic"] = "Pontic Scythian", -- xsc in IANA is Scythian
["xsc-x-saka"] = "Saka",
["xsc-x-sarmat"] = "Sarmatian",
["zle-x-ruthenia"] = "Ruthenian", -- zle in IANA is East Slavic languages collective; moved to allow rsk for Pannonian Rusyn
}
--[[--------------------------< A R T I C L E _ L I N K >------------------------------------------------------
for those rare occasions when article titles don't fit with the normal '<language name> language', this table
maps language code to article title. Use of this table should be avoided and the use of redirects preferred as
that is the long-standing method of handling article names that don't fit with the normal pattern
]]
local article_name = {
['aru'] = "Arawá language", -- Aruá (Amazonas State); to avoid Aruá dab page
['arx'] = "Aruá language (Rondônia)", -- Aruá (Rodonia State) overridden to Aruá (Rondonia State); to avoid Aruá dab page
['kue'] = "Kuman language (New Guinea)", -- Kuman (Papua New Guinea); to avoid Kuman dab page
["lij-mc"] = "Monégasque dialect", -- Ligurian as spoken in Monaco
['mbo'] = "Mbo language (Cameroon)", -- Mbo (Cameroon)
['mnh'] = "Mono language (Congo)", -- Mono (Democratic Republic of Congo); see Template_talk:Lang#Mono_languages
['mnr'] = "Mono language (California)", -- Mono (USA)
['mru'] = "Mono language (Cameroon)", -- Mono (Cameroon)
["snq"] = "Sangu language (Gabon)", -- Sangu (Gabon)
["toi"] = "Tonga language (Zambia and Zimbabwe)", -- Tonga (Zambia and Zimbabwe); to avoid Tonga language dab page
["vwa"] = "Awa language (China)", -- Awa (China); to avoid Awa dab page
["xlg"] = "Ligurian language (ancient)", -- see Template_talk:Lang#Ligurian_dab
["zmw"] = "Mbo language (Congo)", -- Mbo (Democratic Republic of Congo)
}
--[=[-------------------------< R T L _ S C R I P T S >--------------------------------------------------------
ISO 15924 scripts that are written right-to-left. Data in this table taken from [[ISO 15924#List of codes]]
last update to this list: 2017-12-24
]=]
local rtl_scripts = {
'adlm', 'arab', 'aran', 'armi', 'avst', 'cprt', 'egyd', 'egyh', 'hatr', 'hebr',
'hung', 'inds', 'khar', 'lydi', 'mand', 'mani', 'mend', 'merc', 'mero', 'narb',
'nbat', 'nkoo', 'orkh', 'palm', 'phli', 'phlp', 'phlv', 'phnx', 'prti', 'rohg',
'samr', 'sarb', 'sogd', 'sogo', 'syrc', 'syre', 'syrj', 'syrn', 'thaa', 'wole',
};
--[[--------------------------< T R A N S L I T _ T I T L E S >------------------------------------------------
This is a table of tables of transliteration standards and the language codes or language scripts that apply to
those standards. This table is used to create the tool-tip text associated with the transliterated text displayed
by some of the {{lang-??}} templates.
These tables are more-or-less copied directly from {{special|PermaLink/680078354}}. The standard 'NO_STD' is a construct to allow for
the cases when no |std= parameter value is provided.
]]
local translit_title_table = {
['abkai'] = { -- Manchu romanization
['default'] = 'Abkai system of romanization',
},
['ahl'] = {
['default'] = 'Academy of the Hebrew Language transliteration',
},
['ala'] = {
['default'] = 'American Library Association – Library of Congress transliteration',
},
['ala-lc'] = {
['default'] = 'American Library Association – Library of Congress transliteration',
},
['batr'] = {
['default'] = 'Bikdash Arabic Transliteration Rules',
},
['bgn/pcgn'] = {
['default'] = 'Board on Geographic Names / Permanent Committee on Geographical Names transliteration',
},
['din'] = {
['ar'] = 'DIN 31635 Arabic',
['fa'] = 'DIN 31635 Arabic',
['ku'] = 'DIN 31635 Arabic',
['ps'] = 'DIN 31635 Arabic',
['tg'] = 'DIN 31635 Arabic',
['ug'] = 'DIN 31635 Arabic',
['ur'] = 'DIN 31635 Arabic',
['arab'] = 'DIN 31635 Arabic',
['default'] = 'DIN transliteration',
},
['eae'] = {
['default'] = 'Encyclopaedia Aethiopica transliteration',
},
['hepburn'] = {
['default'] = 'Hepburn transliteration',
},
['hu'] = { -- Manchu romanization
['default'] = 'Hu system of romanization',
},
['hunterian'] = {
['default'] = 'Hunterian transliteration',
},
['iast'] = {
['default'] = 'International Alphabet of Sanskrit transliteration',
},
['iso'] = { -- when a transliteration standard is supplied
['ab'] = 'ISO 9 Cyrillic',
['ba'] = 'ISO 9 Cyrillic',
['be'] = 'ISO 9 Cyrillic',
['bg'] = 'ISO 9 Cyrillic',
['kk'] = 'ISO 9 Cyrillic',
['ky'] = 'ISO 9 Cyrillic',
['mn'] = 'ISO 9 Cyrillic',
['ru'] = 'ISO 9 Cyrillic',
['tg'] = 'ISO 9 Cyrillic',
['uk'] = 'ISO 9 Cyrillic',
['bua'] = 'ISO 9 Cyrillic',
['sah'] = 'ISO 9 Cyrillic',
['tut'] = 'ISO 9 Cyrillic',
['xal'] = 'ISO 9 Cyrillic',
['cyrl'] = 'ISO 9 Cyrillic',
['cyrs'] = 'ISO 9 Cyrillic',
['ar'] = 'ISO 233 Arabic',
['ku'] = 'ISO 233 Arabic',
['ps'] = 'ISO 233 Arabic',
['ug'] = 'ISO 233 Arabic',
['ur'] = 'ISO 233 Arabic',
['arab'] = 'ISO 233 Arabic',
['he'] = 'ISO 259 Hebrew',
['yi'] = 'ISO 259 Hebrew',
['hebr'] = 'ISO 259 Hebrew',
['el'] = 'ISO 843 Greek',
['grc'] = 'ISO 843 Greek',
['ja'] = 'ISO 3602 Japanese',
['hira'] = 'ISO 3602 Japanese',
['hrkt'] = 'ISO 3602 Japanese',
['jpan'] = 'ISO 3602 Japanese',
['kana'] = 'ISO 3602 Japanese',
['zh'] = 'ISO 7098 Chinese',
['chi'] = 'ISO 7098 Chinese',
['cmn'] = 'ISO 7098 Chinese',
['zho'] = 'ISO 7098 Chinese',
-- ['han'] = 'ISO 7098 Chinese', -- unicode alias of Hani? doesn't belong here? should be Hani?
['hans'] = 'ISO 7098 Chinese',
['hant'] = 'ISO 7098 Chinese',
['ka'] = 'ISO 9984 Georgian',
['kat'] = 'ISO 9984 Georgian',
['arm'] = 'ISO 9985 Armenian',
['hy'] = 'ISO 9985 Armenian',
['th'] = 'ISO 11940 Thai',
['tha'] = 'ISO 11940 Thai',
['ko'] = 'ISO 11941 Korean',
['kor'] = 'ISO 11941 Korean',
['awa'] = 'ISO 15919 Indic',
['bho'] = 'ISO 15919 Indic',
['bn'] = 'ISO 15919 Indic',
['bra'] = 'ISO 15919 Indic',
['doi'] = 'ISO 15919 Indic',
['dra'] = 'ISO 15919 Indic',
['gon'] = 'ISO 15919 Indic',
['gu'] = 'ISO 15919 Indic',
['hi'] = 'ISO 15919 Indic',
['hno'] = 'ISO 15919 Indic',
['inc'] = 'ISO 15919 Indic',
['kn'] = 'ISO 15919 Indic',
['kok'] = 'ISO 15919 Indic',
['ks'] = 'ISO 15919 Indic',
['mag'] = 'ISO 15919 Indic',
['mai'] = 'ISO 15919 Indic',
['ml'] = 'ISO 15919 Indic',
['mr'] = 'ISO 15919 Indic',
['ne'] = 'ISO 15919 Indic',
['new'] = 'ISO 15919 Indic',
['or'] = 'ISO 15919 Indic',
['pa'] = 'ISO 15919 Indic',
['pnb'] = 'ISO 15919 Indic',
['raj'] = 'ISO 15919 Indic',
['sa'] = 'ISO 15919 Indic',
['sat'] = 'ISO 15919 Indic',
['sd'] = 'ISO 15919 Indic',
['si'] = 'ISO 15919 Indic',
['skr'] = 'ISO 15919 Indic',
['ta'] = 'ISO 15919 Indic',
['tcy'] = 'ISO 15919 Indic',
['te'] = 'ISO 15919 Indic',
['beng'] = 'ISO 15919 Indic',
['brah'] = 'ISO 15919 Indic',
['deva'] = 'ISO 15919 Indic',
['gujr'] = 'ISO 15919 Indic',
['guru'] = 'ISO 15919 Indic',
['knda'] = 'ISO 15919 Indic',
['mlym'] = 'ISO 15919 Indic',
['orya'] = 'ISO 15919 Indic',
['sinh'] = 'ISO 15919 Indic',
['taml'] = 'ISO 15919 Indic',
['telu'] = 'ISO 15919 Indic',
['default'] = 'ISO transliteration',
},
['jyutping'] = {
['default'] = 'Jyutping transliteration',
},
['mdorff'] = { -- Manchu romanization
['default'] = 'Möllendorff system of romanization',
},
['mlcts'] = {
['default'] = 'Myanmar Language Commission Transcription System',
},
['mr'] = {
['default'] = 'McCune–Reischauer transliteration',
},
['nihon-shiki'] = {
['default'] = 'Nihon-shiki transliteration',
},
['no_std'] = { -- when no transliteration standard is supplied
['akk'] = 'Semitic transliteration',
['sem'] = 'Semitic transliteration',
['phnx'] = 'Semitic transliteration',
['xsux'] = 'Cuneiform transliteration',
},
['pinyin'] = {
['default'] = 'Pinyin transliteration',
},
['rr'] = {
['default'] = 'Revised Romanization of Korean transliteration',
},
['rtgs'] = {
['default'] = 'Royal Thai General System of Transcription',
},
['satts'] = {
['default'] = 'Standard Arabic Technical Transliteration System transliteration',
},
['scientific'] = {
['default'] = 'scientific transliteration',
},
['thdl'] = {
['default'] = 'THL Simplified Phonetic Transcription',
},
['ukrainian'] = {
['default'] = 'Ukrainian National system of romanization',
},
['ungegn'] = {
['default'] = 'United Nations Group of Experts on Geographical Names transliteration',
},
['wadegile'] = {
['default'] = 'Wade–Giles transliteration',
},
['wehr'] = {
['default'] = 'Hans Wehr transliteration',
},
['wylie'] = {
['default'] = 'Wylie transliteration',
},
['yaleko'] = {
['default'] = 'Yale romanization of Korean',
},
['zwpy'] = {
['default'] = 'Tibetan pinyin'
},
};
--[[--------------------------< E N G _ V A R >----------------------------------------------------------------
Used at en.wiki so that spelling of 'romanized' (US, default) can be changed to 'romanised' to match the envar
specified by a {{Use xxx English}}.
This is accomplished by setting |engvar=gb; can, should be omitted in articles that use American English; no
need for the clutter.
]]
local engvar_sel_t = { -- select either UK English or US English
['au'] = 'gb_t', -- these match IANA region codes (except in lower case)
['ca'] = 'us_t',
['gb'] = 'gb_t',
['ie'] = 'gb_t',
['in'] = 'gb_t',
['nz'] = 'gb_t',
['us'] = 'us_t', -- default engvar
['za'] = 'gb_t'
};
local engvar_t = {
['gb_t'] = {
['romanisz_lc'] = 'romanisation', -- lower case
['romanisz_uc'] = 'Romanisation', -- upper case
['romanisz_pt'] = 'romanised', -- past tense
},
['us_t'] = { -- default engvar
['romanisz_lc'] = 'romanization', -- lower case
['romanisz_uc'] = 'Romanization', -- upper case
['romanisz_pt'] = 'romanized', -- past tense
}
}
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return
{
this_wiki_lang_tag = this_wiki_lang_tag,
this_wiki_lang_dir = lang_obj:getDir(), -- wiki's language direction
article_name = article_name,
engvar_t = engvar_t,
engvar_sel_t = engvar_sel_t,
lang_name_table = lang_name_table_t,
override = override,
rtl_scripts = rtl_scripts,
special_tags_table = special_tags_table,
translit_title_table = translit_title_table,
};
m5f3mk0gpkdlc4y3enlbuchrljc6tg7
Module:Transclusion count/data/N
828
1023
33173
8967
2026-10-18T05:10:46Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33173
Scribunto
text/plain
return {
["N"] = 3100,
["N.b."] = 3000,
["N/A"] = 23000,
["N/a"] = 67000,
["NA"] = 2500,
["NA-Class"] = 15000,
["NASCAR_next_race"] = 2500,
["NASTRO_comment"] = 33000,
["NBA_Draft_template_list"] = 3600,
["NBA_Year"] = 6100,
["NBA_color"] = 3800,
["NBA_color_cell"] = 4600,
["NBA_color_cell2"] = 3600,
["NBA_player_statistics_legend"] = 6000,
["NBA_player_statistics_start"] = 5100,
["NBA_roster_footer"] = 2400,
["NBA_roster_header"] = 2300,
["NCAA_color_cell"] = 13000,
["NCAA_secondary_color_cell"] = 5200,
["NCES_District_ID"] = 3600,
["NED"] = 11000,
["NEXTYEAR"] = 10000,
["NFLAltPrimaryStyle"] = 2700,
["NFLPrimaryStyle"] = 28000,
["NFLSecondaryColor"] = 17000,
["NFL_Year"] = 30000,
["NFL_predraft"] = 11000,
["NFL_predraft/check"] = 11000,
["NFL_predraft/ftin"] = 11000,
["NFL_roster_navbox"] = 2500,
["NFLplayer"] = 2300,
["NFPA_704_diamond"] = 2000,
["NFPA_704_diamond/styles.css"] = 2000,
["NFPA_704_diamond/text"] = 2000,
["NFT"] = 7900,
["NFT_player"] = 33000,
["NGA"] = 3600,
["NGR"] = 2700,
["NHLE"] = 24000,
["NHLS_url"] = 2100,
["NLD"] = 13000,
["NLM_content"] = 2800,
["NOINDEX"] = 503000,
["NOMIS2011"] = 2200,
["NOR"] = 10000,
["NPG_name"] = 2300,
["NRDB_species"] = 7200,
["NRHPGoogleMapFootnote"] = 2500,
["NRHP_Focus"] = 74000,
["NRHP_color"] = 3700,
["NRHP_date_for_lists"] = 3100,
["NRHP_date_for_lists/dates"] = 3100,
["NRHP_header"] = 3400,
["NRHP_navigation_box"] = 18000,
["NRHP_row"] = 3400,
["NRHP_style"] = 72000,
["NRHP_url"] = 30000,
["NRHP_url/core"] = 32000,
["NRISref"] = 74000,
["NRT"] = 2300,
["NSWcity"] = 2000,
["NSWcity/core"] = 2000,
["NUMBEROFSECTIONS"] = 3200,
["NYCS_br"] = 2800,
["NYCS_time_2"] = 3200,
["NZL"] = 7500,
["NZ_census_2018"] = 2000,
["NZ_electorate_link"] = 2500,
["Na"] = 4500,
["Nac"] = 4000,
["Namespace_detect"] = 484000,
["Namespace_detect_showall"] = 13000,
["Nastaliq"] = 11000,
["Nat_fs_end"] = 2900,
["NationalArchivesNote"] = 8100,
["National_Film_Awards/style"] = 2200,
["National_Heritage_List_for_England"] = 28000,
["National_Register_of_Historic_Places"] = 22000,
["National_Register_of_Historic_Places_in_New_York"] = 4800,
["National_Register_of_Historic_Places_in_Pennsylvania"] = 3100,
["National_Register_of_Historic_Places_in_Virginia"] = 2900,
["National_basketball_squad"] = 3200,
["National_field_hockey_squad"] = 4100,
["National_football_squad_start/styles.css"] = 2600,
["National_men's_basketball_team"] = 4200,
["National_men's_cricket_team"] = 5100,
["National_men's_cricket_team_right"] = 2500,
["National_men's_ice_hockey_team"] = 8100,
["National_men's_volleyball_team"] = 2500,
["National_rugby_union_team"] = 6600,
["National_squad"] = 45000,
["National_squad_no_numbers"] = 17000,
["National_women's_volleyball_team"] = 2100,
["Native_name"] = 38000,
["Native_name_checker"] = 87000,
["Native_name_list"] = 5600,
["Nav_year_links"] = 2500,
["Naval"] = 5600,
["Naval/core"] = 5600,
["Navbar"] = 42000,
["Navbar-collapsible"] = 3700,
["Navbar-header"] = 17000,
["Navbar-header/styles.css"] = 17000,
["Navbox"] = 3080000,
["Navbox_GR_munic"] = 3700,
["Navbox_Musical_artist"] = 9800,
["Navbox_Ukraine_district"] = 2500,
["Navbox_bottom"] = 17000,
["Navbox_decade_list"] = 13000,
["Navbox_documentation"] = 58000,
["Navbox_ice_hockey"] = 3400,
["Navbox_musical_artist"] = 247000,
["Navbox_musical_artist/styles.css"] = 247000,
["Navbox_rugby_league_squad"] = 5100,
["Navbox_season_by_team"] = 3200,
["Navbox_top"] = 17000,
["Navbox_visibility"] = 58000,
["Navbox_with_collapsible_groups"] = 153000,
["Navbox_with_collapsible_sections"] = 3000,
["Navbox_with_columns"] = 26000,
["Navboxes"] = 69000,
["Navseasoncats"] = 125000,
["Navseasoncats_with_centuries_below_decade"] = 6600,
["Navseasoncats_with_decades_below_year"] = 16000,
["Navsource"] = 5400,
["Navy"] = 20000,
["Navy/core"] = 20000,
["Nay"] = 7000,
["Nbay"] = 6100,
["Nbh"] = 2200,
["Nbnd"] = 2800,
["Nbs"] = 19000,
["Nbsp"] = 551000,
["Nbsp_to_space"] = 25000,
["Ndash"] = 31000,
["Nee"] = 18000,
["NeilBrownPlayers"] = 3100,
["Net_register_tonnage"] = 2300,
["Netflix_title"] = 2400,
["New_user_bar"] = 57000,
["Newbot"] = 4500,
["Next_period"] = 26000,
["Nfly"] = 2700,
["Nigerian_English"] = 2500,
["Nihongo"] = 109000,
["Nihongo2"] = 13000,
["Nihongo_foot"] = 4200,
["No"] = 12000,
["No."] = 15000,
["No2"] = 13000,
["NoSpam"] = 4000,
["NoSpamEmail"] = 17000,
["No_bold"] = 3100,
["No_col_break"] = 2700,
["No_col_break/styles.css"] = 2700,
["No_documentation"] = 3900,
["No_footnotes"] = 55000,
["No_ping"] = 422000,
["No_ping2"] = 2400,
["No_plot"] = 12000,
["No_redirect"] = 739000,
["No_significant_coverage_(sports)"] = 5200,
["No_spam"] = 334000,
["No_wrap"] = 3500,
["Nobold"] = 484000,
["Nobold/styles.css"] = 484000,
["Nobr"] = 7800,
["Nobreak"] = 1070000,
["Nochange"] = 3000,
["Noindex"] = 4900,
["Noitalic"] = 5700,
["Noitalic/styles.css"] = 5700,
["Nom"] = 48000,
["Nominated"] = 55000,
["Non-English-language_text_category"] = 3800,
["Non-admin_closure"] = 4300,
["Non-admin_closure_(requested_moves)"] = 4600,
["Non-admin_comment"] = 3800,
["Non-album_single"] = 4400,
["Non-album_singles"] = 3200,
["Non-diffusing"] = 4900,
["Non-diffusing_parent_category"] = 4600,
["Non-diffusing_subcategory"] = 38000,
["Non-free_2D_art"] = 7800,
["Non-free_3D_art"] = 2800,
["Non-free_album_cover"] = 223000,
["Non-free_audio_sample"] = 9000,
["Non-free_biog-pic"] = 38000,
["Non-free_book_cover"] = 64000,
["Non-free_character"] = 3300,
["Non-free_comic"] = 11000,
["Non-free_fair_use"] = 15000,
["Non-free_fair_use_in"] = 12000,
["Non-free_file_with_no_commercial_use_license"] = 2500,
["Non-free_film_poster"] = 106000,
["Non-free_film_screenshot"] = 4600,
["Non-free_game_cover"] = 8600,
["Non-free_game_screenshot"] = 5500,
["Non-free_historic_image"] = 18000,
["Non-free_image_data"] = 8100,
["Non-free_image_rationale"] = 8900,
["Non-free_logo"] = 157000,
["Non-free_magazine_cover"] = 9900,
["Non-free_media"] = 826000,
["Non-free_media_data"] = 9400,
["Non-free_media_rationale"] = 11000,
["Non-free_music_video_screenshot"] = 2100,
["Non-free_newspaper_image"] = 2100,
["Non-free_poster"] = 23000,
["Non-free_promotional"] = 6100,
["Non-free_school_logo"] = 15000,
["Non-free_seal"] = 9700,
["Non-free_symbol"] = 5500,
["Non-free_television_screenshot"] = 12000,
["Non-free_title-card"] = 13000,
["Non-free_use_rationale"] = 773000,
["Non-free_use_rationale/styles.css"] = 782000,
["Non-free_use_rationale_2"] = 249000,
["Non-free_use_rationale_album_cover"] = 152000,
["Non-free_use_rationale_biog"] = 2700,
["Non-free_use_rationale_book_cover"] = 20000,
["Non-free_use_rationale_logo"] = 126000,
["Non-free_use_rationale_poster"] = 63000,
["Non-free_use_rationale_title-card"] = 4500,
["Non-free_use_rationale_video_cover"] = 6500,
["Non-free_use_rationale_video_game_cover"] = 11000,
["Non-free_video_cover"] = 17000,
["Non-free_video_game_cover"] = 24000,
["Non-free_video_game_cover/platform"] = 24000,
["Non-free_video_game_screenshot"] = 12000,
["Non-free_video_game_screenshot/platform"] = 11000,
["Non-free_with_NC"] = 2300,
["Non_breaking_en_dash"] = 2900,
["Non_breaking_hyphen"] = 3200,
["Nonumtoc"] = 3300,
["Nonumtoc/styles.css"] = 3300,
["Noping"] = 392000,
["Noprint"] = 2400,
["Noredirect"] = 8900,
["Normal"] = 9800,
["Normalwraplink"] = 8000,
["North_America_topic"] = 3800,
["Nospam"] = 5500,
["Not-PD-US-expired-min-year"] = 65000,
["Not_a_ballot"] = 8600,
["Not_a_typo"] = 14000,
["Not_around"] = 13000,
["Not_done"] = 30000,
["Notability"] = 58000,
["Notavote"] = 2400,
["Notdone"] = 6200,
["Note"] = 27000,
["NoteFoot"] = 5600,
["NoteTag"] = 6200,
["Note_label"] = 9500,
["Notelist"] = 342000,
["Notelist-lr"] = 5200,
["Notelist-talk"] = 2100,
["Notelist-ua"] = 9600,
["Notes"] = 4200,
["Noteslist"] = 4800,
["Notice"] = 122000,
["Nowiki_="] = 2300,
["Nowrap"] = 2010000,
["Np"] = 6000,
["Npby"] = 2900,
["Nq"] = 4700,
["Nrut"] = 6600,
["Ns"] = 3200,
["Ns0"] = 87000,
["Ns_has_subpages"] = 3890000,
["Nts"] = 22000,
["Ntsh"] = 3700,
["Number_table_sorting"] = 41000,
["Number_table_sorting_hidden"] = 3700,
["Numero"] = 4600,
["Nutshell"] = 5000,
["Nw="] = 2300,
["Née"] = 4300,
["Module:NUMBEROFSECTIONS"] = 3200,
["Module:Namespace_detect"] = 548000,
["Module:Namespace_detect/config"] = 5230000,
["Module:Namespace_detect/data"] = 5230000,
["Module:National_squad"] = 60000,
["Module:Native_name"] = 122000,
["Module:Navbar"] = 5210000,
["Module:Navbar/configuration"] = 5210000,
["Module:Navbar/styles.css"] = 5210000,
["Module:Navbox"] = 4880000,
["Module:Navbox/configuration"] = 4880000,
["Module:Navbox/styles.css"] = 4880000,
["Module:Navbox_ice_hockey"] = 3400,
["Module:Navbox_or_wikitable"] = 2000,
["Module:Navbox_top_and_bottom"] = 17000,
["Module:Navbox_with_collapsible_groups"] = 15000,
["Module:Navboxes"] = 71000,
["Module:Nihongo"] = 113000,
["Module:No_ping"] = 508000,
["Module:Noinclude"] = 86000,
["Module:Normalize_volume_and_edition"] = 3600,
["Module:Ns_has_subpages"] = 3890000,
["Module:Number_table_sorting"] = 44000,
}
a62dvhf44sqfscfbyvzurv17z0lq007
33174
33173
2026-11-11T21:43:56Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/N]]
33173
Scribunto
text/plain
return {
["N"] = 3100,
["N.b."] = 3000,
["N/A"] = 23000,
["N/a"] = 67000,
["NA"] = 2500,
["NA-Class"] = 15000,
["NASCAR_next_race"] = 2500,
["NASTRO_comment"] = 33000,
["NBA_Draft_template_list"] = 3600,
["NBA_Year"] = 6100,
["NBA_color"] = 3800,
["NBA_color_cell"] = 4600,
["NBA_color_cell2"] = 3600,
["NBA_player_statistics_legend"] = 6000,
["NBA_player_statistics_start"] = 5100,
["NBA_roster_footer"] = 2400,
["NBA_roster_header"] = 2300,
["NCAA_color_cell"] = 13000,
["NCAA_secondary_color_cell"] = 5200,
["NCES_District_ID"] = 3600,
["NED"] = 11000,
["NEXTYEAR"] = 10000,
["NFLAltPrimaryStyle"] = 2700,
["NFLPrimaryStyle"] = 28000,
["NFLSecondaryColor"] = 17000,
["NFL_Year"] = 30000,
["NFL_predraft"] = 11000,
["NFL_predraft/check"] = 11000,
["NFL_predraft/ftin"] = 11000,
["NFL_roster_navbox"] = 2500,
["NFLplayer"] = 2300,
["NFPA_704_diamond"] = 2000,
["NFPA_704_diamond/styles.css"] = 2000,
["NFPA_704_diamond/text"] = 2000,
["NFT"] = 7900,
["NFT_player"] = 33000,
["NGA"] = 3600,
["NGR"] = 2700,
["NHLE"] = 24000,
["NHLS_url"] = 2100,
["NLD"] = 13000,
["NLM_content"] = 2800,
["NOINDEX"] = 503000,
["NOMIS2011"] = 2200,
["NOR"] = 10000,
["NPG_name"] = 2300,
["NRDB_species"] = 7200,
["NRHPGoogleMapFootnote"] = 2500,
["NRHP_Focus"] = 74000,
["NRHP_color"] = 3700,
["NRHP_date_for_lists"] = 3100,
["NRHP_date_for_lists/dates"] = 3100,
["NRHP_header"] = 3400,
["NRHP_navigation_box"] = 18000,
["NRHP_row"] = 3400,
["NRHP_style"] = 72000,
["NRHP_url"] = 30000,
["NRHP_url/core"] = 32000,
["NRISref"] = 74000,
["NRT"] = 2300,
["NSWcity"] = 2000,
["NSWcity/core"] = 2000,
["NUMBEROFSECTIONS"] = 3200,
["NYCS_br"] = 2800,
["NYCS_time_2"] = 3200,
["NZL"] = 7500,
["NZ_census_2018"] = 2000,
["NZ_electorate_link"] = 2500,
["Na"] = 4500,
["Nac"] = 4000,
["Namespace_detect"] = 484000,
["Namespace_detect_showall"] = 13000,
["Nastaliq"] = 11000,
["Nat_fs_end"] = 2900,
["NationalArchivesNote"] = 8100,
["National_Film_Awards/style"] = 2200,
["National_Heritage_List_for_England"] = 28000,
["National_Register_of_Historic_Places"] = 22000,
["National_Register_of_Historic_Places_in_New_York"] = 4800,
["National_Register_of_Historic_Places_in_Pennsylvania"] = 3100,
["National_Register_of_Historic_Places_in_Virginia"] = 2900,
["National_basketball_squad"] = 3200,
["National_field_hockey_squad"] = 4100,
["National_football_squad_start/styles.css"] = 2600,
["National_men's_basketball_team"] = 4200,
["National_men's_cricket_team"] = 5100,
["National_men's_cricket_team_right"] = 2500,
["National_men's_ice_hockey_team"] = 8100,
["National_men's_volleyball_team"] = 2500,
["National_rugby_union_team"] = 6600,
["National_squad"] = 45000,
["National_squad_no_numbers"] = 17000,
["National_women's_volleyball_team"] = 2100,
["Native_name"] = 38000,
["Native_name_checker"] = 87000,
["Native_name_list"] = 5600,
["Nav_year_links"] = 2500,
["Naval"] = 5600,
["Naval/core"] = 5600,
["Navbar"] = 42000,
["Navbar-collapsible"] = 3700,
["Navbar-header"] = 17000,
["Navbar-header/styles.css"] = 17000,
["Navbox"] = 3080000,
["Navbox_GR_munic"] = 3700,
["Navbox_Musical_artist"] = 9800,
["Navbox_Ukraine_district"] = 2500,
["Navbox_bottom"] = 17000,
["Navbox_decade_list"] = 13000,
["Navbox_documentation"] = 58000,
["Navbox_ice_hockey"] = 3400,
["Navbox_musical_artist"] = 247000,
["Navbox_musical_artist/styles.css"] = 247000,
["Navbox_rugby_league_squad"] = 5100,
["Navbox_season_by_team"] = 3200,
["Navbox_top"] = 17000,
["Navbox_visibility"] = 58000,
["Navbox_with_collapsible_groups"] = 153000,
["Navbox_with_collapsible_sections"] = 3000,
["Navbox_with_columns"] = 26000,
["Navboxes"] = 69000,
["Navseasoncats"] = 125000,
["Navseasoncats_with_centuries_below_decade"] = 6600,
["Navseasoncats_with_decades_below_year"] = 16000,
["Navsource"] = 5400,
["Navy"] = 20000,
["Navy/core"] = 20000,
["Nay"] = 7000,
["Nbay"] = 6100,
["Nbh"] = 2200,
["Nbnd"] = 2800,
["Nbs"] = 19000,
["Nbsp"] = 551000,
["Nbsp_to_space"] = 25000,
["Ndash"] = 31000,
["Nee"] = 18000,
["NeilBrownPlayers"] = 3100,
["Net_register_tonnage"] = 2300,
["Netflix_title"] = 2400,
["New_user_bar"] = 57000,
["Newbot"] = 4500,
["Next_period"] = 26000,
["Nfly"] = 2700,
["Nigerian_English"] = 2500,
["Nihongo"] = 109000,
["Nihongo2"] = 13000,
["Nihongo_foot"] = 4200,
["No"] = 12000,
["No."] = 15000,
["No2"] = 13000,
["NoSpam"] = 4000,
["NoSpamEmail"] = 17000,
["No_bold"] = 3100,
["No_col_break"] = 2700,
["No_col_break/styles.css"] = 2700,
["No_documentation"] = 3900,
["No_footnotes"] = 55000,
["No_ping"] = 422000,
["No_ping2"] = 2400,
["No_plot"] = 12000,
["No_redirect"] = 739000,
["No_significant_coverage_(sports)"] = 5200,
["No_spam"] = 334000,
["No_wrap"] = 3500,
["Nobold"] = 484000,
["Nobold/styles.css"] = 484000,
["Nobr"] = 7800,
["Nobreak"] = 1070000,
["Nochange"] = 3000,
["Noindex"] = 4900,
["Noitalic"] = 5700,
["Noitalic/styles.css"] = 5700,
["Nom"] = 48000,
["Nominated"] = 55000,
["Non-English-language_text_category"] = 3800,
["Non-admin_closure"] = 4300,
["Non-admin_closure_(requested_moves)"] = 4600,
["Non-admin_comment"] = 3800,
["Non-album_single"] = 4400,
["Non-album_singles"] = 3200,
["Non-diffusing"] = 4900,
["Non-diffusing_parent_category"] = 4600,
["Non-diffusing_subcategory"] = 38000,
["Non-free_2D_art"] = 7800,
["Non-free_3D_art"] = 2800,
["Non-free_album_cover"] = 223000,
["Non-free_audio_sample"] = 9000,
["Non-free_biog-pic"] = 38000,
["Non-free_book_cover"] = 64000,
["Non-free_character"] = 3300,
["Non-free_comic"] = 11000,
["Non-free_fair_use"] = 15000,
["Non-free_fair_use_in"] = 12000,
["Non-free_file_with_no_commercial_use_license"] = 2500,
["Non-free_film_poster"] = 106000,
["Non-free_film_screenshot"] = 4600,
["Non-free_game_cover"] = 8600,
["Non-free_game_screenshot"] = 5500,
["Non-free_historic_image"] = 18000,
["Non-free_image_data"] = 8100,
["Non-free_image_rationale"] = 8900,
["Non-free_logo"] = 157000,
["Non-free_magazine_cover"] = 9900,
["Non-free_media"] = 826000,
["Non-free_media_data"] = 9400,
["Non-free_media_rationale"] = 11000,
["Non-free_music_video_screenshot"] = 2100,
["Non-free_newspaper_image"] = 2100,
["Non-free_poster"] = 23000,
["Non-free_promotional"] = 6100,
["Non-free_school_logo"] = 15000,
["Non-free_seal"] = 9700,
["Non-free_symbol"] = 5500,
["Non-free_television_screenshot"] = 12000,
["Non-free_title-card"] = 13000,
["Non-free_use_rationale"] = 773000,
["Non-free_use_rationale/styles.css"] = 782000,
["Non-free_use_rationale_2"] = 249000,
["Non-free_use_rationale_album_cover"] = 152000,
["Non-free_use_rationale_biog"] = 2700,
["Non-free_use_rationale_book_cover"] = 20000,
["Non-free_use_rationale_logo"] = 126000,
["Non-free_use_rationale_poster"] = 63000,
["Non-free_use_rationale_title-card"] = 4500,
["Non-free_use_rationale_video_cover"] = 6500,
["Non-free_use_rationale_video_game_cover"] = 11000,
["Non-free_video_cover"] = 17000,
["Non-free_video_game_cover"] = 24000,
["Non-free_video_game_cover/platform"] = 24000,
["Non-free_video_game_screenshot"] = 12000,
["Non-free_video_game_screenshot/platform"] = 11000,
["Non-free_with_NC"] = 2300,
["Non_breaking_en_dash"] = 2900,
["Non_breaking_hyphen"] = 3200,
["Nonumtoc"] = 3300,
["Nonumtoc/styles.css"] = 3300,
["Noping"] = 392000,
["Noprint"] = 2400,
["Noredirect"] = 8900,
["Normal"] = 9800,
["Normalwraplink"] = 8000,
["North_America_topic"] = 3800,
["Nospam"] = 5500,
["Not-PD-US-expired-min-year"] = 65000,
["Not_a_ballot"] = 8600,
["Not_a_typo"] = 14000,
["Not_around"] = 13000,
["Not_done"] = 30000,
["Notability"] = 58000,
["Notavote"] = 2400,
["Notdone"] = 6200,
["Note"] = 27000,
["NoteFoot"] = 5600,
["NoteTag"] = 6200,
["Note_label"] = 9500,
["Notelist"] = 342000,
["Notelist-lr"] = 5200,
["Notelist-talk"] = 2100,
["Notelist-ua"] = 9600,
["Notes"] = 4200,
["Noteslist"] = 4800,
["Notice"] = 122000,
["Nowiki_="] = 2300,
["Nowrap"] = 2010000,
["Np"] = 6000,
["Npby"] = 2900,
["Nq"] = 4700,
["Nrut"] = 6600,
["Ns"] = 3200,
["Ns0"] = 87000,
["Ns_has_subpages"] = 3890000,
["Nts"] = 22000,
["Ntsh"] = 3700,
["Number_table_sorting"] = 41000,
["Number_table_sorting_hidden"] = 3700,
["Numero"] = 4600,
["Nutshell"] = 5000,
["Nw="] = 2300,
["Née"] = 4300,
["Module:NUMBEROFSECTIONS"] = 3200,
["Module:Namespace_detect"] = 548000,
["Module:Namespace_detect/config"] = 5230000,
["Module:Namespace_detect/data"] = 5230000,
["Module:National_squad"] = 60000,
["Module:Native_name"] = 122000,
["Module:Navbar"] = 5210000,
["Module:Navbar/configuration"] = 5210000,
["Module:Navbar/styles.css"] = 5210000,
["Module:Navbox"] = 4880000,
["Module:Navbox/configuration"] = 4880000,
["Module:Navbox/styles.css"] = 4880000,
["Module:Navbox_ice_hockey"] = 3400,
["Module:Navbox_or_wikitable"] = 2000,
["Module:Navbox_top_and_bottom"] = 17000,
["Module:Navbox_with_collapsible_groups"] = 15000,
["Module:Navboxes"] = 71000,
["Module:Nihongo"] = 113000,
["Module:No_ping"] = 508000,
["Module:Noinclude"] = 86000,
["Module:Normalize_volume_and_edition"] = 3600,
["Module:Ns_has_subpages"] = 3890000,
["Module:Number_table_sorting"] = 44000,
}
a62dvhf44sqfscfbyvzurv17z0lq007
Module:Lang/data/iana languages
828
1029
32901
8981
2026-10-10T22:29:00Z
en>Trappist the monk
0
update to 2026-09-17 data;
32901
Scribunto
text/plain
-- File-Date: 2026-09-17
local active = {
["aa"] = {"Afar"},
["ab"] = {"Abkhazian"},
["ae"] = {"Avestan"},
["af"] = {"Afrikaans"},
["ak"] = {"Akan"},
["am"] = {"Amharic"},
["an"] = {"Aragonese"},
["ar"] = {"Arabic"},
["as"] = {"Assamese"},
["av"] = {"Avaric"},
["ay"] = {"Aymara"},
["az"] = {"Azerbaijani"},
["ba"] = {"Bashkir"},
["be"] = {"Belarusian"},
["bg"] = {"Bulgarian"},
["bi"] = {"Bislama"},
["bm"] = {"Bambara"},
["bn"] = {"Bengali", "Bangla"},
["bo"] = {"Tibetan"},
["br"] = {"Breton"},
["bs"] = {"Bosnian"},
["ca"] = {"Catalan", "Valencian"},
["ce"] = {"Chechen"},
["ch"] = {"Chamorro"},
["co"] = {"Corsican"},
["cr"] = {"Cree"},
["cs"] = {"Czech"},
["cu"] = {"Church Slavic", "Church Slavonic", "Old Bulgarian", "Old Church Slavonic", "Old Slavonic"},
["cv"] = {"Chuvash"},
["cy"] = {"Welsh"},
["da"] = {"Danish"},
["de"] = {"German"},
["dv"] = {"Dhivehi", "Divehi", "Maldivian"},
["dz"] = {"Dzongkha"},
["ee"] = {"Ewe"},
["el"] = {"Modern Greek (1453-)"},
["en"] = {"English"},
["eo"] = {"Esperanto"},
["es"] = {"Spanish", "Castilian"},
["et"] = {"Estonian"},
["eu"] = {"Basque"},
["fa"] = {"Persian"},
["ff"] = {"Fulah"},
["fi"] = {"Finnish"},
["fj"] = {"Fijian"},
["fo"] = {"Faroese"},
["fr"] = {"French"},
["fy"] = {"Western Frisian"},
["ga"] = {"Irish"},
["gd"] = {"Scottish Gaelic", "Gaelic"},
["gl"] = {"Galician"},
["gn"] = {"Guarani"},
["gu"] = {"Gujarati"},
["gv"] = {"Manx"},
["ha"] = {"Hausa"},
["he"] = {"Hebrew"},
["hi"] = {"Hindi"},
["ho"] = {"Hiri Motu"},
["hr"] = {"Croatian"},
["ht"] = {"Haitian", "Haitian Creole"},
["hu"] = {"Hungarian"},
["hy"] = {"Armenian"},
["hz"] = {"Herero"},
["ia"] = {"Interlingua (IALA)", "Interlingua (International Auxiliary Language Association)"},
["id"] = {"Indonesian"},
["ie"] = {"Interlingue", "Occidental"},
["ig"] = {"Igbo"},
["ii"] = {"Sichuan Yi", "Nuosu"},
["ik"] = {"Inupiaq"},
["io"] = {"Ido"},
["is"] = {"Icelandic"},
["it"] = {"Italian"},
["iu"] = {"Inuktitut"},
["ja"] = {"Japanese"},
["jv"] = {"Javanese"},
["ka"] = {"Georgian"},
["kg"] = {"Kongo"},
["ki"] = {"Kikuyu", "Gikuyu"},
["kj"] = {"Kuanyama", "Kwanyama"},
["kk"] = {"Kazakh"},
["kl"] = {"Kalaallisut", "Greenlandic"},
["km"] = {"Khmer", "Central Khmer"},
["kn"] = {"Kannada"},
["ko"] = {"Korean"},
["kr"] = {"Kanuri"},
["ks"] = {"Kashmiri"},
["ku"] = {"Kurdish"},
["kv"] = {"Komi"},
["kw"] = {"Cornish"},
["ky"] = {"Kirghiz", "Kyrgyz"},
["la"] = {"Latin"},
["lb"] = {"Luxembourgish", "Letzeburgesch"},
["lg"] = {"Ganda", "Luganda"},
["li"] = {"Limburgan", "Limburger", "Limburgish"},
["ln"] = {"Lingala"},
["lo"] = {"Lao"},
["lt"] = {"Lithuanian"},
["lu"] = {"Luba-Katanga"},
["lv"] = {"Latvian"},
["mg"] = {"Malagasy"},
["mh"] = {"Marshallese"},
["mi"] = {"Maori"},
["mk"] = {"Macedonian"},
["ml"] = {"Malayalam"},
["mn"] = {"Mongolian"},
["mr"] = {"Marathi"},
["ms"] = {"Malay (macrolanguage)"},
["mt"] = {"Maltese"},
["my"] = {"Burmese"},
["na"] = {"Nauru"},
["nb"] = {"Norwegian Bokmål"},
["nd"] = {"North Ndebele"},
["ne"] = {"Nepali (macrolanguage)"},
["ng"] = {"Ndonga"},
["nl"] = {"Dutch", "Flemish"},
["nn"] = {"Norwegian Nynorsk"},
["no"] = {"Norwegian"},
["nr"] = {"South Ndebele"},
["nv"] = {"Navajo", "Navaho"},
["ny"] = {"Chichewa", "Chewa", "Nyanja"},
["oc"] = {"Occitan (post 1500)"},
["oj"] = {"Ojibwa"},
["om"] = {"Oromo"},
["or"] = {"Oriya (macrolanguage)", "Odia (macrolanguage)"},
["os"] = {"Iron Ossetic", "Iron", "Iron Ossetian", "Ossetian", "Ossetic"},
["pa"] = {"Panjabi", "Punjabi"},
["pi"] = {"Pali"},
["pl"] = {"Polish"},
["ps"] = {"Pushto", "Pashto"},
["pt"] = {"Portuguese"},
["qu"] = {"Quechua"},
["rm"] = {"Romansh"},
["rn"] = {"Rundi"},
["ro"] = {"Romanian", "Moldavian", "Moldovan"},
["ru"] = {"Russian"},
["rw"] = {"Kinyarwanda"},
["sa"] = {"Sanskrit"},
["sc"] = {"Sardinian"},
["sd"] = {"Sindhi"},
["se"] = {"Northern Sami"},
["sg"] = {"Sango"},
["sh"] = {"Serbo-Croatian"},
["si"] = {"Sinhala", "Sinhalese"},
["sk"] = {"Slovak"},
["sl"] = {"Slovenian"},
["sm"] = {"Samoan"},
["sn"] = {"Shona"},
["so"] = {"Somali"},
["sq"] = {"Albanian"},
["sr"] = {"Serbian"},
["ss"] = {"Swati"},
["st"] = {"Southern Sotho"},
["su"] = {"Sundanese"},
["sv"] = {"Swedish"},
["sw"] = {"Swahili (macrolanguage)"},
["ta"] = {"Tamil"},
["te"] = {"Telugu"},
["tg"] = {"Tajik"},
["th"] = {"Thai"},
["ti"] = {"Tigrinya"},
["tk"] = {"Turkmen"},
["tl"] = {"Tagalog"},
["tn"] = {"Tswana"},
["to"] = {"Tonga (Tonga Islands)"},
["tr"] = {"Turkish"},
["ts"] = {"Tsonga"},
["tt"] = {"Tatar"},
["tw"] = {"Twi"},
["ty"] = {"Tahitian"},
["ug"] = {"Uighur", "Uyghur"},
["uk"] = {"Ukrainian"},
["ur"] = {"Urdu"},
["uz"] = {"Uzbek"},
["ve"] = {"Venda"},
["vi"] = {"Vietnamese"},
["vo"] = {"Volapük"},
["wa"] = {"Walloon"},
["wo"] = {"Wolof"},
["xh"] = {"Xhosa"},
["yi"] = {"Yiddish"},
["yo"] = {"Yoruba"},
["za"] = {"Zhuang", "Chuang"},
["zh"] = {"Chinese"},
["zu"] = {"Zulu"},
["aaa"] = {"Ghotuo"},
["aab"] = {"Alumu-Tesu"},
["aac"] = {"Ari"},
["aad"] = {"Amal"},
["aae"] = {"Arbëreshë Albanian"},
["aaf"] = {"Aranadan"},
["aag"] = {"Ambrak"},
["aah"] = {"Abu' Arapesh"},
["aai"] = {"Arifama-Miniafia"},
["aak"] = {"Ankave"},
["aal"] = {"Afade"},
["aan"] = {"Anambé"},
["aao"] = {"Algerian Saharan Arabic"},
["aap"] = {"Pará Arára"},
["aaq"] = {"Eastern Abnaki"},
["aas"] = {"Aasáx"},
["aat"] = {"Arvanitika Albanian"},
["aau"] = {"Abau"},
["aav"] = {"Austro-Asiatic languages"},
["aaw"] = {"Solong"},
["aax"] = {"Mandobo Atas"},
["aaz"] = {"Amarasi"},
["aba"] = {"Abé"},
["abb"] = {"Bankon"},
["abc"] = {"Ambala Ayta"},
["abd"] = {"Manide"},
["abe"] = {"Western Abnaki"},
["abf"] = {"Abai Sungai"},
["abg"] = {"Abaga"},
["abh"] = {"Tajiki Arabic"},
["abi"] = {"Abidji"},
["abj"] = {"Aka-Bea"},
["abl"] = {"Lampung Nyo"},
["abm"] = {"Abanyom"},
["abn"] = {"Abua"},
["abo"] = {"Abon"},
["abp"] = {"Abellen Ayta"},
["abq"] = {"Abaza"},
["abr"] = {"Abron"},
["abs"] = {"Ambonese Malay"},
["abt"] = {"Ambulas"},
["abu"] = {"Abure"},
["abv"] = {"Baharna Arabic"},
["abw"] = {"Pal"},
["abx"] = {"Inabaknon"},
["aby"] = {"Aneme Wake"},
["abz"] = {"Abui"},
["aca"] = {"Achagua"},
["acb"] = {"Áncá"},
["acd"] = {"Gikyode"},
["ace"] = {"Achinese"},
["acf"] = {"Saint Lucian Creole French"},
["ach"] = {"Acoli"},
["aci"] = {"Aka-Cari"},
["ack"] = {"Aka-Kora"},
["acl"] = {"Akar-Bale"},
["acm"] = {"Mesopotamian Arabic"},
["acn"] = {"Achang"},
["acp"] = {"Eastern Acipa"},
["acq"] = {"Ta'izzi-Adeni Arabic"},
["acr"] = {"Achi"},
["acs"] = {"Acroá"},
["act"] = {"Achterhoeks"},
["acu"] = {"Achuar-Shiwiar"},
["acv"] = {"Achumawi"},
["acw"] = {"Hijazi Arabic"},
["acx"] = {"Omani Arabic"},
["acy"] = {"Cypriot Arabic"},
["acz"] = {"Acheron"},
["ada"] = {"Adangme"},
["adb"] = {"Atauran"},
["add"] = {"Lidzonka", "Dzodinka"},
["ade"] = {"Adele"},
["adf"] = {"Dhofari Arabic"},
["adg"] = {"Andegerebinha"},
["adh"] = {"Adhola"},
["adi"] = {"Adi"},
["adj"] = {"Adioukrou"},
["adl"] = {"Galo"},
["adn"] = {"Adang"},
["ado"] = {"Abu"},
["adq"] = {"Adangbe"},
["adr"] = {"Adonara"},
["ads"] = {"Adamorobe Sign Language"},
["adt"] = {"Adnyamathanha"},
["adu"] = {"Aduge"},
["adw"] = {"Amundava"},
["adx"] = {"Amdo Tibetan"},
["ady"] = {"Adyghe", "Adygei"},
["adz"] = {"Adzera"},
["aea"] = {"Areba"},
["aeb"] = {"Tunisian Arabic"},
["aec"] = {"Saidi Arabic"},
["aed"] = {"Argentine Sign Language"},
["aee"] = {"Northeast Pashai", "Northeast Pashayi"},
["aek"] = {"Haeke"},
["ael"] = {"Ambele"},
["aem"] = {"Arem"},
["aen"] = {"Armenian Sign Language"},
["aeq"] = {"Aer"},
["aer"] = {"Eastern Arrernte"},
["aes"] = {"Alsea"},
["aeu"] = {"Akeu"},
["aew"] = {"Ambakich"},
["aey"] = {"Amele"},
["aez"] = {"Aeka"},
["afa"] = {"Afro-Asiatic languages"},
["afb"] = {"Gulf Arabic"},
["afd"] = {"Andai"},
["afe"] = {"Putukwam"},
["afg"] = {"Afghan Sign Language"},
["afh"] = {"Afrihili"},
["afi"] = {"Akrukay", "Chini"},
["afk"] = {"Nanubae"},
["afn"] = {"Defaka"},
["afo"] = {"Eloyi"},
["afp"] = {"Tapei"},
["afs"] = {"Afro-Seminole Creole"},
["aft"] = {"Afitti"},
["afu"] = {"Awutu"},
["afz"] = {"Obokuitai"},
["aga"] = {"Aguano"},
["agb"] = {"Legbo"},
["agc"] = {"Agatu"},
["agd"] = {"Agarabi"},
["age"] = {"Angal"},
["agf"] = {"Arguni"},
["agg"] = {"Angor"},
["agh"] = {"Ngelima"},
["agi"] = {"Agariya"},
["agj"] = {"Argobba"},
["agk"] = {"Isarog Agta"},
["agl"] = {"Fembe"},
["agm"] = {"Angaataha"},
["agn"] = {"Agutaynen"},
["ago"] = {"Tainae"},
["agq"] = {"Aghem"},
["agr"] = {"Aguaruna"},
["ags"] = {"Esimbi"},
["agt"] = {"Central Cagayan Agta"},
["agu"] = {"Aguacateco"},
["agv"] = {"Remontado Dumagat"},
["agw"] = {"Kahua"},
["agx"] = {"Aghul"},
["agy"] = {"Southern Alta"},
["agz"] = {"Mt. Iriga Agta"},
["aha"] = {"Ahanta"},
["ahb"] = {"Axamb"},
["ahg"] = {"Qimant"},
["ahh"] = {"Aghu"},
["ahi"] = {"Tiagbamrin Aizi"},
["ahk"] = {"Akha"},
["ahl"] = {"Igo"},
["ahm"] = {"Mobumrin Aizi"},
["ahn"] = {"Àhàn"},
["aho"] = {"Ahom"},
["ahp"] = {"Aproumu Aizi"},
["ahr"] = {"Ahirani"},
["ahs"] = {"Ashe"},
["aht"] = {"Ahtena"},
["aia"] = {"Arosi"},
["aib"] = {"Ainu (China)"},
["aic"] = {"Ainbai"},
["aid"] = {"Alngith"},
["aie"] = {"Amara"},
["aif"] = {"Agi"},
["aig"] = {"Antigua and Barbuda Creole English"},
["aih"] = {"Ai-Cham"},
["aii"] = {"Assyrian Neo-Aramaic"},
["aij"] = {"Lishanid Noshan"},
["aik"] = {"Ake"},
["ail"] = {"Aimele"},
["aim"] = {"Aimol"},
["ain"] = {"Ainu (Japan)"},
["aio"] = {"Aiton"},
["aip"] = {"Burumakok"},
["aiq"] = {"Aimaq"},
["air"] = {"Airoran"},
["ait"] = {"Arikem"},
["aiw"] = {"Aari"},
["aix"] = {"Aighon"},
["aiy"] = {"Ali"},
["aja"] = {"Aja (South Sudan)"},
["ajg"] = {"Aja (Benin)"},
["aji"] = {"Ajië"},
["ajn"] = {"Andajin"},
["ajs"] = {"Algerian Jewish Sign Language"},
["aju"] = {"Judeo-Moroccan Arabic"},
["ajw"] = {"Ajawa"},
["ajz"] = {"Amri Karbi"},
["akb"] = {"Batak Angkola"},
["akc"] = {"Mpur"},
["akd"] = {"Ukpet-Ehom"},
["ake"] = {"Akawaio"},
["akf"] = {"Akpa"},
["akg"] = {"Anakalangu"},
["akh"] = {"Angal Heneng"},
["aki"] = {"Aiome"},
["akj"] = {"Aka-Jeru"},
["akk"] = {"Akkadian"},
["akl"] = {"Aklanon"},
["akm"] = {"Aka-Bo"},
["ako"] = {"Akurio"},
["akp"] = {"Siwu"},
["akq"] = {"Ak"},
["akr"] = {"Araki"},
["aks"] = {"Akaselem"},
["akt"] = {"Akolet"},
["aku"] = {"Akum"},
["akv"] = {"Akhvakh"},
["akw"] = {"Akwa"},
["akx"] = {"Aka-Kede"},
["aky"] = {"Aka-Kol"},
["akz"] = {"Alabama"},
["ala"] = {"Alago"},
["alc"] = {"Qawasqar"},
["ald"] = {"Alladian"},
["ale"] = {"Aleut"},
["alf"] = {"Alege"},
["alg"] = {"Algonquian languages"},
["alh"] = {"Alawa"},
["ali"] = {"Amaimon"},
["alj"] = {"Alangan"},
["alk"] = {"Alak"},
["all"] = {"Allar"},
["alm"] = {"Amblong"},
["aln"] = {"Gheg Albanian"},
["alo"] = {"Larike-Wakasihu"},
["alp"] = {"Alune"},
["alq"] = {"Algonquin"},
["alr"] = {"Alutor"},
["als"] = {"Tosk Albanian"},
["alt"] = {"Southern Altai"},
["alu"] = {"'Are'are"},
["alv"] = {"Atlantic-Congo languages"},
["alw"] = {"Alaba-K’abeena", "Wanbasana"},
["alx"] = {"Amol"},
["aly"] = {"Alyawarr"},
["alz"] = {"Alur"},
["ama"] = {"Amanayé"},
["amb"] = {"Ambo"},
["amc"] = {"Amahuaca"},
["ame"] = {"Yanesha'"},
["amf"] = {"Hamer-Banna"},
["amg"] = {"Amurdak"},
["ami"] = {"Amis"},
["amj"] = {"Amdang"},
["amk"] = {"Ambai"},
["aml"] = {"War-Jaintia"},
["amm"] = {"Ama (Papua New Guinea)"},
["amn"] = {"Amanab"},
["amo"] = {"Amo"},
["amp"] = {"Alamblak"},
["amq"] = {"Amahai"},
["amr"] = {"Amarakaeri"},
["ams"] = {"Southern Amami-Oshima"},
["amt"] = {"Amto"},
["amu"] = {"Guerrero Amuzgo"},
["amv"] = {"Ambelau"},
["amw"] = {"Western Neo-Aramaic"},
["amx"] = {"Anmatyerre"},
["amy"] = {"Ami"},
["amz"] = {"Atampaya"},
["ana"] = {"Andaqui"},
["anb"] = {"Andoa"},
["anc"] = {"Ngas"},
["and"] = {"Ansus"},
["ane"] = {"Xârâcùù"},
["anf"] = {"Animere"},
["ang"] = {"Old English (ca. 450-1100)"},
["anh"] = {"Nend"},
["ani"] = {"Andi"},
["anj"] = {"Anor"},
["ank"] = {"Goemai"},
["anl"] = {"Anu-Hkongso Chin"},
["anm"] = {"Anal"},
["ann"] = {"Obolo"},
["ano"] = {"Andoque"},
["anp"] = {"Angika"},
["anq"] = {"Jarawa (India)"},
["anr"] = {"Andh"},
["ans"] = {"Anserma"},
["ant"] = {"Antakarinya", "Antikarinya"},
["anu"] = {"Anuak"},
["anv"] = {"Denya"},
["anw"] = {"Anaang"},
["anx"] = {"Andra-Hus"},
["any"] = {"Anyin"},
["anz"] = {"Anem"},
["aoa"] = {"Angolar"},
["aob"] = {"Abom"},
["aoc"] = {"Pemon"},
["aod"] = {"Andarum"},
["aoe"] = {"Angal Enen"},
["aof"] = {"Bragat"},
["aog"] = {"Angoram"},
["aoi"] = {"Anindilyakwa"},
["aoj"] = {"Mufian"},
["aok"] = {"Arhö"},
["aol"] = {"Alor"},
["aom"] = {"Ömie"},
["aon"] = {"Bumbita Arapesh"},
["aor"] = {"Aore"},
["aos"] = {"Taikat"},
["aot"] = {"Atong (India)", "A'tong"},
["aou"] = {"A'ou"},
["aox"] = {"Atorada"},
["aoz"] = {"Uab Meto"},
["apa"] = {"Apache languages"},
["apb"] = {"Sa'a"},
["apc"] = {"Levantine Arabic"},
["apd"] = {"Sudanese Arabic"},
["ape"] = {"Bukiyip"},
["apf"] = {"Pahanan Agta"},
["apg"] = {"Ampanang"},
["aph"] = {"Athpariya"},
["api"] = {"Apiaká"},
["apj"] = {"Jicarilla Apache"},
["apk"] = {"Kiowa Apache"},
["apl"] = {"Lipan Apache"},
["apm"] = {"Mescalero-Chiricahua Apache"},
["apn"] = {"Apinayé"},
["apo"] = {"Ambul"},
["app"] = {"Apma"},
["apq"] = {"A-Pucikwar"},
["apr"] = {"Arop-Lokep"},
["aps"] = {"Arop-Sissano"},
["apt"] = {"Apatani"},
["apu"] = {"Apurinã"},
["apv"] = {"Alapmunte"},
["apw"] = {"Western Apache"},
["apx"] = {"Aputai"},
["apy"] = {"Apalaí"},
["apz"] = {"Safeyoka"},
["aqa"] = {"Alacalufan languages"},
["aqc"] = {"Archi"},
["aqd"] = {"Ampari Dogon"},
["aqg"] = {"Arigidi"},
["aqk"] = {"Aninka"},
["aql"] = {"Algic languages"},
["aqm"] = {"Atohwaim"},
["aqn"] = {"Northern Alta"},
["aqp"] = {"Atakapa"},
["aqr"] = {"Arhâ"},
["aqt"] = {"Angaité"},
["aqz"] = {"Akuntsu"},
["arb"] = {"Standard Arabic"},
["arc"] = {"Official Aramaic (700-300 BCE)", "Imperial Aramaic (700-300 BCE)"},
["ard"] = {"Arabana"},
["are"] = {"Western Arrarnta"},
["arh"] = {"Arhuaco"},
["ari"] = {"Arikara"},
["arj"] = {"Arapaso"},
["ark"] = {"Arikapú"},
["arl"] = {"Arabela"},
["arn"] = {"Mapudungun", "Mapuche"},
["aro"] = {"Araona"},
["arp"] = {"Arapaho"},
["arq"] = {"Algerian Arabic"},
["arr"] = {"Karo (Brazil)"},
["ars"] = {"Najdi Arabic"},
["art"] = {"Artificial languages"},
["aru"] = {"Aruá (Amazonas State)", "Arawá"},
["arv"] = {"Arbore"},
["arw"] = {"Arawak"},
["arx"] = {"Aruá (Rodonia State)"},
["ary"] = {"Moroccan Arabic"},
["arz"] = {"Egyptian Arabic"},
["asa"] = {"Asu (Tanzania)"},
["asb"] = {"Assiniboine", "Nakoda Assiniboine"},
["asc"] = {"Casuarina Coast Asmat"},
["ase"] = {"American Sign Language"},
["asf"] = {"Auslan", "Australian Sign Language"},
["asg"] = {"Cishingini"},
["ash"] = {"Abishira"},
["asi"] = {"Buruwai"},
["asj"] = {"Sari"},
["ask"] = {"Ashkun"},
["asl"] = {"Asilulu"},
["asn"] = {"Xingú Asuriní"},
["aso"] = {"Dano"},
["asp"] = {"Algerian Sign Language"},
["asq"] = {"Austrian Sign Language"},
["asr"] = {"Asuri"},
["ass"] = {"Ipulo"},
["ast"] = {"Asturian", "Asturleonese", "Bable", "Leonese"},
["asu"] = {"Tocantins Asurini"},
["asv"] = {"Asoa"},
["asw"] = {"Australian Aborigines Sign Language"},
["asx"] = {"Muratayak"},
["asy"] = {"Yaosakor Asmat"},
["asz"] = {"As"},
["ata"] = {"Pele-Ata"},
["atb"] = {"Zaiwa"},
["atc"] = {"Atsahuaca"},
["atd"] = {"Ata Manobo"},
["ate"] = {"Atemble"},
["atg"] = {"Ivbie North-Okpela-Arhe"},
["ath"] = {"Athapascan languages"},
["ati"] = {"Attié"},
["atj"] = {"Atikamekw", "Nehirowimowin"},
["atk"] = {"Ati"},
["atl"] = {"Mt. Iraya Agta"},
["atm"] = {"Ata"},
["atn"] = {"Ashtiani"},
["ato"] = {"Atong (Cameroon)"},
["atp"] = {"Pudtol Atta"},
["atq"] = {"Aralle-Tabulahan"},
["atr"] = {"Waimiri-Atroari"},
["ats"] = {"Gros Ventre"},
["att"] = {"Pamplona Atta"},
["atu"] = {"Reel"},
["atv"] = {"Northern Altai"},
["atw"] = {"Atsugewi"},
["atx"] = {"Arutani"},
["aty"] = {"Aneityum"},
["atz"] = {"Arta"},
["aua"] = {"Asumboa"},
["aub"] = {"Alugu"},
["auc"] = {"Waorani"},
["aud"] = {"Anuta"},
["auf"] = {"Arauan languages"},
["aug"] = {"Aguna"},
["auh"] = {"Aushi"},
["aui"] = {"Anuki"},
["auj"] = {"Awjilah"},
["auk"] = {"Heyo"},
["aul"] = {"Aulua"},
["aum"] = {"Asu (Nigeria)"},
["aun"] = {"Molmo One"},
["auo"] = {"Auyokawa"},
["aup"] = {"Makayam"},
["auq"] = {"Anus", "Korur"},
["aur"] = {"Aruek"},
["aus"] = {"Australian languages"},
["aut"] = {"Austral"},
["auu"] = {"Auye"},
["auw"] = {"Awyi"},
["aux"] = {"Aurá"},
["auy"] = {"Awiyaana"},
["auz"] = {"Uzbeki Arabic"},
["avb"] = {"Avau"},
["avd"] = {"Alviri-Vidari"},
["avi"] = {"Avikam"},
["avk"] = {"Kotava"},
["avl"] = {"Eastern Egyptian Bedawi Arabic"},
["avm"] = {"Angkamuthi"},
["avn"] = {"Avatime"},
["avo"] = {"Agavotaguerra"},
["avs"] = {"Aushiri"},
["avt"] = {"Au"},
["avu"] = {"Avokaya"},
["avv"] = {"Avá-Canoeiro"},
["awa"] = {"Awadhi"},
["awb"] = {"Awa (Papua New Guinea)"},
["awc"] = {"Cicipu"},
["awd"] = {"Arawakan languages"},
["awe"] = {"Awetí"},
["awg"] = {"Anguthimri"},
["awh"] = {"Awbono"},
["awi"] = {"Aekyom"},
["awk"] = {"Awabakal"},
["awm"] = {"Arawum"},
["awn"] = {"Awngi"},
["awo"] = {"Awak"},
["awr"] = {"Awera"},
["aws"] = {"South Awyu"},
["awt"] = {"Araweté"},
["awu"] = {"Central Awyu"},
["awv"] = {"Jair Awyu"},
["aww"] = {"Awun"},
["awx"] = {"Awara"},
["awy"] = {"Edera Awyu"},
["axb"] = {"Abipon"},
["axe"] = {"Ayerrerenge"},
["axg"] = {"Mato Grosso Arára"},
["axk"] = {"Yaka (Central African Republic)"},
["axl"] = {"Lower Southern Aranda"},
["axm"] = {"Middle Armenian"},
["axx"] = {"Xârâgurè"},
["aya"] = {"Awar"},
["ayb"] = {"Ayizo Gbe"},
["ayc"] = {"Southern Aymara"},
["ayd"] = {"Ayabadhu"},
["aye"] = {"Ayere"},
["ayg"] = {"Ginyanga"},
["ayh"] = {"Hadrami Arabic"},
["ayi"] = {"Leyigha"},
["ayk"] = {"Akuku"},
["ayl"] = {"Libyan Arabic"},
["ayn"] = {"Sanaani Arabic"},
["ayo"] = {"Ayoreo"},
["ayp"] = {"North Mesopotamian Arabic"},
["ayq"] = {"Ayi (Papua New Guinea)"},
["ayr"] = {"Central Aymara"},
["ays"] = {"Sorsogon Ayta"},
["ayt"] = {"Magbukun Ayta"},
["ayu"] = {"Ayu"},
["ayz"] = {"Mai Brat"},
["aza"] = {"Azha"},
["azb"] = {"South Azerbaijani"},
["azc"] = {"Uto-Aztecan languages"},
["azd"] = {"Eastern Durango Nahuatl"},
["azg"] = {"San Pedro Amuzgos Amuzgo"},
["azj"] = {"North Azerbaijani"},
["azm"] = {"Ipalapa Amuzgo"},
["azn"] = {"Western Durango Nahuatl"},
["azo"] = {"Awing"},
["azt"] = {"Faire Atta"},
["azz"] = {"Highland Puebla Nahuatl"},
["baa"] = {"Babatana"},
["bab"] = {"Bainouk-Gunyuño"},
["bac"] = {"Badui"},
["bad"] = {"Banda languages"},
["bae"] = {"Baré"},
["baf"] = {"Nubaca"},
["bag"] = {"Tuki"},
["bah"] = {"Bahamas Creole English"},
["bai"] = {"Bamileke languages"},
["baj"] = {"Barakai"},
["bal"] = {"Baluchi"},
["ban"] = {"Balinese"},
["bao"] = {"Waimaha"},
["bap"] = {"Bantawa"},
["bar"] = {"Bavarian"},
["bas"] = {"Basa (Cameroon)"},
["bat"] = {"Baltic languages"},
["bau"] = {"Bada (Nigeria)"},
["bav"] = {"Vengo"},
["baw"] = {"Bambili-Bambui"},
["bax"] = {"Bamun"},
["bay"] = {"Batuley"},
["bba"] = {"Baatonum"},
["bbb"] = {"Barai"},
["bbc"] = {"Batak Toba"},
["bbd"] = {"Bau"},
["bbe"] = {"Bangba"},
["bbf"] = {"Baibai"},
["bbg"] = {"Barama"},
["bbh"] = {"Bugan"},
["bbi"] = {"Barombi"},
["bbj"] = {"Ghomálá'"},
["bbk"] = {"Babanki"},
["bbl"] = {"Bats"},
["bbm"] = {"Babango"},
["bbn"] = {"Uneapa"},
["bbo"] = {"Northern Bobo Madaré", "Konabéré"},
["bbp"] = {"West Central Banda"},
["bbq"] = {"Bamali"},
["bbr"] = {"Girawa"},
["bbs"] = {"Bakpinka"},
["bbt"] = {"Mburku"},
["bbu"] = {"Kulung (Nigeria)"},
["bbv"] = {"Karnai"},
["bbw"] = {"Baba"},
["bbx"] = {"Bubia"},
["bby"] = {"Befang"},
["bca"] = {"Central Bai"},
["bcb"] = {"Bainouk-Samik"},
["bcc"] = {"Southern Balochi"},
["bcd"] = {"North Babar"},
["bce"] = {"Bamenyam"},
["bcf"] = {"Bamu"},
["bcg"] = {"Baga Pokur"},
["bch"] = {"Bariai"},
["bci"] = {"Baoulé"},
["bcj"] = {"Bardi"},
["bck"] = {"Bunuba"},
["bcl"] = {"Central Bikol"},
["bcm"] = {"Bannoni"},
["bcn"] = {"Bali (Nigeria)"},
["bco"] = {"Kaluli"},
["bcp"] = {"Bali (Democratic Republic of Congo)"},
["bcq"] = {"Bench"},
["bcr"] = {"Babine"},
["bcs"] = {"Kohumono"},
["bct"] = {"Bendi"},
["bcu"] = {"Awad Bing"},
["bcv"] = {"Shoo-Minda-Nye"},
["bcw"] = {"Bana"},
["bcy"] = {"Bacama"},
["bcz"] = {"Bainouk-Gunyaamolo"},
["bda"] = {"Bayot"},
["bdb"] = {"Basap"},
["bdc"] = {"Emberá-Baudó"},
["bdd"] = {"Bunama"},
["bde"] = {"Bade"},
["bdf"] = {"Biage"},
["bdg"] = {"Bonggi"},
["bdh"] = {"Baka (South Sudan)"},
["bdi"] = {"Burun"},
["bdj"] = {"Bai (South Sudan)", "Bai"},
["bdk"] = {"Budukh"},
["bdl"] = {"Indonesian Bajau"},
["bdm"] = {"Buduma"},
["bdn"] = {"Baldemu"},
["bdo"] = {"Morom"},
["bdp"] = {"Bende"},
["bdq"] = {"Bahnar"},
["bdr"] = {"West Coast Bajau"},
["bds"] = {"Burunge"},
["bdt"] = {"Bokoto"},
["bdu"] = {"Oroko"},
["bdv"] = {"Bodo Parja"},
["bdw"] = {"Baham"},
["bdx"] = {"Budong-Budong"},
["bdy"] = {"Bandjalang"},
["bdz"] = {"Badeshi"},
["bea"] = {"Beaver"},
["beb"] = {"Bebele"},
["bec"] = {"Iceve-Maci"},
["bed"] = {"Bedoanas"},
["bee"] = {"Byangsi"},
["bef"] = {"Benabena"},
["beg"] = {"Belait"},
["beh"] = {"Biali"},
["bei"] = {"Bekati'"},
["bej"] = {"Beja", "Bedawiyet"},
["bek"] = {"Bebeli"},
["bem"] = {"Bemba (Zambia)"},
["beo"] = {"Beami"},
["bep"] = {"Besoa"},
["beq"] = {"Beembe"},
["ber"] = {"Berber languages"},
["bes"] = {"Besme"},
["bet"] = {"Guiberoua Béte"},
["beu"] = {"Blagar"},
["bev"] = {"Daloa Bété"},
["bew"] = {"Betawi"},
["bex"] = {"Jur Modo"},
["bey"] = {"Beli (Papua New Guinea)"},
["bez"] = {"Bena (Tanzania)"},
["bfa"] = {"Bari"},
["bfb"] = {"Pauri Bareli"},
["bfc"] = {"Panyi Bai", "Northern Bai"},
["bfd"] = {"Bafut"},
["bfe"] = {"Betaf", "Tena"},
["bff"] = {"Bofi"},
["bfg"] = {"Busang Kayan"},
["bfh"] = {"Blafe"},
["bfi"] = {"British Sign Language"},
["bfj"] = {"Bafanji"},
["bfk"] = {"Ban Khor Sign Language"},
["bfl"] = {"Banda-Ndélé"},
["bfm"] = {"Mmen"},
["bfn"] = {"Bunak"},
["bfo"] = {"Malba Birifor"},
["bfp"] = {"Beba"},
["bfq"] = {"Badaga"},
["bfr"] = {"Bazigar"},
["bfs"] = {"Southern Bai"},
["bft"] = {"Balti"},
["bfu"] = {"Gahri"},
["bfw"] = {"Bondo"},
["bfx"] = {"Bantayanon"},
["bfy"] = {"Bagheli"},
["bfz"] = {"Mahasu Pahari"},
["bga"] = {"Gwamhi-Wuri"},
["bgb"] = {"Bobongko"},
["bgc"] = {"Haryanvi"},
["bgd"] = {"Rathwi Bareli"},
["bge"] = {"Bauria"},
["bgf"] = {"Bangandu"},
["bgg"] = {"Bugun"},
["bgi"] = {"Giangan"},
["bgj"] = {"Bangolan"},
["bgk"] = {"Bit", "Buxinhua"},
["bgl"] = {"Bo (Laos)"},
["bgn"] = {"Western Balochi"},
["bgo"] = {"Baga Koga"},
["bgp"] = {"Eastern Balochi"},
["bgq"] = {"Bagri"},
["bgr"] = {"Bawm Chin"},
["bgs"] = {"Tagabawa"},
["bgt"] = {"Bughotu"},
["bgu"] = {"Mbongno"},
["bgv"] = {"Warkay-Bipim"},
["bgw"] = {"Bhatri"},
["bgx"] = {"Balkan Gagauz Turkish"},
["bgy"] = {"Benggoi"},
["bgz"] = {"Banggai"},
["bha"] = {"Bharia"},
["bhb"] = {"Bhili"},
["bhc"] = {"Biga"},
["bhd"] = {"Bhadrawahi"},
["bhe"] = {"Bhaya"},
["bhf"] = {"Odiai"},
["bhg"] = {"Binandere"},
["bhh"] = {"Bukharic"},
["bhi"] = {"Bhilali"},
["bhj"] = {"Bahing"},
["bhl"] = {"Bimin"},
["bhm"] = {"Bathari"},
["bhn"] = {"Bohtan Neo-Aramaic"},
["bho"] = {"Bhojpuri"},
["bhp"] = {"Bima"},
["bhq"] = {"Tukang Besi South"},
["bhr"] = {"Bara Malagasy"},
["bhs"] = {"Buwal"},
["bht"] = {"Bhattiyali"},
["bhu"] = {"Bhunjia"},
["bhv"] = {"Bahau"},
["bhw"] = {"Biak"},
["bhx"] = {"Bhalay"},
["bhy"] = {"Bhele"},
["bhz"] = {"Bada (Indonesia)"},
["bia"] = {"Badimaya"},
["bib"] = {"Bissa", "Bisa"},
["bid"] = {"Bidiyo"},
["bie"] = {"Bepour"},
["bif"] = {"Biafada"},
["big"] = {"Biangai"},
["bih"] = {"Bihari languages"},
["bik"] = {"Bikol"},
["bil"] = {"Bile"},
["bim"] = {"Bimoba"},
["bin"] = {"Bini", "Edo"},
["bio"] = {"Nai"},
["bip"] = {"Bila"},
["biq"] = {"Bipi"},
["bir"] = {"Bisorio"},
["bit"] = {"Berinomo"},
["biu"] = {"Biete"},
["biv"] = {"Southern Birifor"},
["biw"] = {"Kol (Cameroon)"},
["bix"] = {"Bijori"},
["biy"] = {"Birhor"},
["biz"] = {"Baloi"},
["bja"] = {"Budza"},
["bjb"] = {"Banggarla"},
["bjc"] = {"Bariji"},
["bje"] = {"Biao-Jiao Mien"},
["bjf"] = {"Barzani Jewish Neo-Aramaic"},
["bjg"] = {"Bidyogo"},
["bjh"] = {"Bahinemo"},
["bji"] = {"Burji"},
["bjj"] = {"Kanauji"},
["bjk"] = {"Barok"},
["bjl"] = {"Bulu (Papua New Guinea)"},
["bjm"] = {"Bajelani"},
["bjn"] = {"Banjar"},
["bjo"] = {"Mid-Southern Banda"},
["bjp"] = {"Fanamaket"},
["bjr"] = {"Binumarien"},
["bjs"] = {"Bajan"},
["bjt"] = {"Balanta-Ganja"},
["bju"] = {"Busuu"},
["bjv"] = {"Bedjond"},
["bjw"] = {"Bakwé"},
["bjx"] = {"Banao Itneg"},
["bjy"] = {"Bayali"},
["bjz"] = {"Baruga"},
["bka"] = {"Kyak"},
["bkc"] = {"Baka (Cameroon)"},
["bkd"] = {"Binukid", "Talaandig"},
["bkf"] = {"Beeke"},
["bkg"] = {"Buraka"},
["bkh"] = {"Bakoko"},
["bki"] = {"Baki"},
["bkj"] = {"Pande"},
["bkk"] = {"Brokskat"},
["bkl"] = {"Berik"},
["bkm"] = {"Kom (Cameroon)"},
["bkn"] = {"Bukitan"},
["bko"] = {"Kwa'"},
["bkp"] = {"Boko (Democratic Republic of Congo)"},
["bkq"] = {"Bakairí"},
["bkr"] = {"Bakumpai"},
["bks"] = {"Northern Sorsoganon"},
["bkt"] = {"Boloki"},
["bku"] = {"Buhid"},
["bkv"] = {"Bekwarra"},
["bkw"] = {"Bekwel"},
["bkx"] = {"Baikeno"},
["bky"] = {"Bokyi"},
["bkz"] = {"Bungku"},
["bla"] = {"Siksika"},
["blb"] = {"Bilua"},
["blc"] = {"Bella Coola"},
["bld"] = {"Bolango"},
["ble"] = {"Balanta-Kentohe"},
["blf"] = {"Buol"},
["blh"] = {"Kuwaa"},
["bli"] = {"Bolia"},
["blj"] = {"Bolongan"},
["blk"] = {"Pa'o Karen", "Pa'O"},
["bll"] = {"Biloxi"},
["blm"] = {"Beli (South Sudan)"},
["bln"] = {"Southern Catanduanes Bikol"},
["blo"] = {"Anii"},
["blp"] = {"Blablanga"},
["blq"] = {"Baluan-Pam"},
["blr"] = {"Blang"},
["bls"] = {"Balaesang"},
["blt"] = {"Tai Dam"},
["blv"] = {"Kibala", "Bolo"},
["blw"] = {"Balangao"},
["blx"] = {"Mag-Indi Ayta"},
["bly"] = {"Notre"},
["blz"] = {"Balantak"},
["bma"] = {"Lame"},
["bmb"] = {"Bembe"},
["bmc"] = {"Biem"},
["bmd"] = {"Baga Manduri"},
["bme"] = {"Limassa"},
["bmf"] = {"Bom-Kim"},
["bmg"] = {"Bamwe"},
["bmh"] = {"Kein"},
["bmi"] = {"Bagirmi"},
["bmj"] = {"Bote-Majhi"},
["bmk"] = {"Ghayavi"},
["bml"] = {"Bomboli"},
["bmm"] = {"Northern Betsimisaraka Malagasy"},
["bmn"] = {"Bina (Papua New Guinea)"},
["bmo"] = {"Bambalang"},
["bmp"] = {"Bulgebi"},
["bmq"] = {"Bomu"},
["bmr"] = {"Muinane"},
["bms"] = {"Bilma Kanuri"},
["bmt"] = {"Biao Mon"},
["bmu"] = {"Somba-Siawari"},
["bmv"] = {"Bum"},
["bmw"] = {"Bomwali"},
["bmx"] = {"Baimak"},
["bmz"] = {"Baramu"},
["bna"] = {"Bonerate"},
["bnb"] = {"Bookan"},
["bnc"] = {"Bontok"},
["bnd"] = {"Banda (Indonesia)"},
["bne"] = {"Bintauna"},
["bnf"] = {"Masiwang"},
["bng"] = {"Benga"},
["bni"] = {"Bangi"},
["bnj"] = {"Eastern Tawbuid"},
["bnk"] = {"Bierebo"},
["bnl"] = {"Boon"},
["bnm"] = {"Batanga"},
["bnn"] = {"Bunun"},
["bno"] = {"Bantoanon"},
["bnp"] = {"Bola"},
["bnq"] = {"Bantik"},
["bnr"] = {"Butmas-Tur"},
["bns"] = {"Bundeli"},
["bnt"] = {"Bantu languages"},
["bnu"] = {"Bentong"},
["bnv"] = {"Bonerif", "Beneraf", "Edwas"},
["bnw"] = {"Bisis"},
["bnx"] = {"Bangubangu"},
["bny"] = {"Bintulu"},
["bnz"] = {"Beezen"},
["boa"] = {"Bora"},
["bob"] = {"Aweer"},
["boe"] = {"Mundabli-Mufu"},
["bof"] = {"Bolon"},
["bog"] = {"Bamako Sign Language"},
["boh"] = {"Boma"},
["boi"] = {"Barbareño"},
["boj"] = {"Anjam"},
["bok"] = {"Bonjo"},
["bol"] = {"Bole"},
["bom"] = {"Berom"},
["bon"] = {"Bine"},
["boo"] = {"Tiemacèwè Bozo"},
["bop"] = {"Bonkiman"},
["boq"] = {"Bogaya"},
["bor"] = {"Borôro"},
["bot"] = {"Bongo"},
["bou"] = {"Bondei"},
["bov"] = {"Tuwuli"},
["bow"] = {"Rema"},
["box"] = {"Buamu"},
["boy"] = {"Bodo (Central African Republic)"},
["boz"] = {"Tiéyaxo Bozo"},
["bpa"] = {"Daakaka"},
["bpc"] = {"Mbuk"},
["bpd"] = {"Banda-Banda"},
["bpe"] = {"Bauni"},
["bpg"] = {"Bonggo"},
["bph"] = {"Botlikh"},
["bpi"] = {"Bagupi"},
["bpj"] = {"Binji"},
["bpk"] = {"Orowe", "'Ôrôê"},
["bpl"] = {"Broome Pearling Lugger Pidgin"},
["bpm"] = {"Biyom"},
["bpn"] = {"Dzao Min"},
["bpo"] = {"Anasi"},
["bpp"] = {"Kaure"},
["bpq"] = {"Banda Malay"},
["bpr"] = {"Koronadal Blaan"},
["bps"] = {"Sarangani Blaan"},
["bpt"] = {"Barrow Point"},
["bpu"] = {"Bongu"},
["bpv"] = {"Bian Marind"},
["bpw"] = {"Bo (Papua New Guinea)"},
["bpx"] = {"Palya Bareli"},
["bpy"] = {"Bishnupriya"},
["bpz"] = {"Bilba"},
["bqa"] = {"Tchumbuli"},
["bqb"] = {"Bagusa"},
["bqc"] = {"Boko (Benin)", "Boo"},
["bqd"] = {"Bung"},
["bqf"] = {"Baga Kaloum"},
["bqg"] = {"Bago-Kusuntu"},
["bqh"] = {"Baima"},
["bqi"] = {"Bakhtiari"},
["bqj"] = {"Bandial"},
["bqk"] = {"Banda-Mbrès"},
["bql"] = {"Karian", "Bilakura"},
["bqm"] = {"Wumboko"},
["bqn"] = {"Bulgarian Sign Language"},
["bqo"] = {"Balo"},
["bqp"] = {"Busa"},
["bqq"] = {"Biritai"},
["bqr"] = {"Burusu"},
["bqs"] = {"Bosngun"},
["bqt"] = {"Bamukumbit"},
["bqu"] = {"Boguru"},
["bqv"] = {"Koro Wachi", "Begbere-Ejar"},
["bqw"] = {"Buru (Nigeria)"},
["bqx"] = {"Baangi"},
["bqy"] = {"Bengkala Sign Language"},
["bqz"] = {"Bakaka"},
["bra"] = {"Braj"},
["brb"] = {"Brao", "Lave"},
["brc"] = {"Berbice Creole Dutch"},
["brd"] = {"Baraamu"},
["brf"] = {"Bira"},
["brg"] = {"Baure"},
["brh"] = {"Brahui"},
["bri"] = {"Mokpwe"},
["brj"] = {"Bieria"},
["brk"] = {"Birked"},
["brl"] = {"Birwa"},
["brm"] = {"Barambu"},
["brn"] = {"Boruca"},
["bro"] = {"Brokkat"},
["brp"] = {"Barapasi"},
["brq"] = {"Breri"},
["brr"] = {"Birao"},
["brs"] = {"Baras"},
["brt"] = {"Bitare"},
["bru"] = {"Eastern Bru"},
["brv"] = {"Western Bru"},
["brw"] = {"Bellari"},
["brx"] = {"Bodo (India)"},
["bry"] = {"Burui"},
["brz"] = {"Bilbil"},
["bsa"] = {"Abinomn"},
["bsb"] = {"Brunei Bisaya"},
["bsc"] = {"Bassari", "Oniyan"},
["bse"] = {"Wushi"},
["bsf"] = {"Bauchi"},
["bsg"] = {"Bashkardi"},
["bsh"] = {"Kati"},
["bsi"] = {"Bassossi"},
["bsj"] = {"Bangwinji"},
["bsk"] = {"Burushaski"},
["bsl"] = {"Basa-Gumna"},
["bsm"] = {"Busami"},
["bsn"] = {"Barasana-Eduria"},
["bso"] = {"Buso"},
["bsp"] = {"Baga Sitemu"},
["bsq"] = {"Bassa"},
["bsr"] = {"Bassa-Kontagora"},
["bss"] = {"Akoose"},
["bst"] = {"Basketo"},
["bsu"] = {"Bahonsuai"},
["bsv"] = {"Baga Sobané"},
["bsw"] = {"Baiso"},
["bsx"] = {"Yangkam"},
["bsy"] = {"Sabah Bisaya"},
["bta"] = {"Bata"},
["btc"] = {"Bati (Cameroon)"},
["btd"] = {"Batak Dairi"},
["bte"] = {"Gamo-Ningi"},
["btf"] = {"Birgit"},
["btg"] = {"Gagnoa Bété"},
["bth"] = {"Biatah Bidayuh"},
["bti"] = {"Burate"},
["btj"] = {"Bacanese Malay"},
["btk"] = {"Batak languages"},
["btm"] = {"Batak Mandailing"},
["btn"] = {"Ratagnon"},
["bto"] = {"Rinconada Bikol"},
["btp"] = {"Budibud"},
["btq"] = {"Batek"},
["btr"] = {"Baetora"},
["bts"] = {"Batak Simalungun"},
["btt"] = {"Bete-Bendi"},
["btu"] = {"Batu"},
["btv"] = {"Bateri"},
["btw"] = {"Butuanon"},
["btx"] = {"Batak Karo"},
["bty"] = {"Bobot"},
["btz"] = {"Batak Alas-Kluet"},
["bua"] = {"Buriat"},
["bub"] = {"Bua"},
["buc"] = {"Bushi"},
["bud"] = {"Ntcham"},
["bue"] = {"Beothuk"},
["buf"] = {"Bushoong"},
["bug"] = {"Buginese"},
["buh"] = {"Younuo Bunu"},
["bui"] = {"Bongili"},
["buj"] = {"Basa-Gurmana"},
["buk"] = {"Bugawac"},
["bum"] = {"Bulu (Cameroon)"},
["bun"] = {"Sherbro"},
["buo"] = {"Terei"},
["bup"] = {"Busoa"},
["buq"] = {"Brem"},
["bus"] = {"Bokobaru"},
["but"] = {"Bungain"},
["buu"] = {"Budu"},
["buv"] = {"Bun"},
["buw"] = {"Bubi"},
["bux"] = {"Boghom"},
["buy"] = {"Bullom So"},
["buz"] = {"Bukwen"},
["bva"] = {"Barein"},
["bvb"] = {"Bube"},
["bvc"] = {"Baelelea"},
["bvd"] = {"Baeggu"},
["bve"] = {"Berau Malay"},
["bvf"] = {"Boor"},
["bvg"] = {"Bonkeng"},
["bvh"] = {"Bure"},
["bvi"] = {"Belanda Viri"},
["bvj"] = {"Baan"},
["bvk"] = {"Bukat"},
["bvl"] = {"Bolivian Sign Language"},
["bvm"] = {"Bamunka"},
["bvn"] = {"Buna"},
["bvo"] = {"Bolgo"},
["bvp"] = {"Bumang"},
["bvq"] = {"Birri"},
["bvr"] = {"Burarra"},
["bvt"] = {"Bati (Indonesia)"},
["bvu"] = {"Bukit Malay"},
["bvv"] = {"Baniva"},
["bvw"] = {"Boga"},
["bvx"] = {"Dibole"},
["bvy"] = {"Baybayanon"},
["bvz"] = {"Bauzi"},
["bwa"] = {"Bwatoo"},
["bwb"] = {"Namosi-Naitasiri-Serua"},
["bwc"] = {"Bwile"},
["bwd"] = {"Bwaidoka"},
["bwe"] = {"Bwe Karen"},
["bwf"] = {"Boselewa"},
["bwg"] = {"Barwe"},
["bwh"] = {"Bishuo"},
["bwi"] = {"Baniwa"},
["bwj"] = {"Láá Láá Bwamu"},
["bwk"] = {"Bauwaki"},
["bwl"] = {"Bwela"},
["bwm"] = {"Biwat"},
["bwn"] = {"Wunai Bunu"},
["bwo"] = {"Boro (Ethiopia)", "Borna (Ethiopia)"},
["bwp"] = {"Mandobo Bawah"},
["bwq"] = {"Southern Bobo Madaré"},
["bwr"] = {"Bura-Pabir"},
["bws"] = {"Bomboma"},
["bwt"] = {"Bafaw-Balong"},
["bwu"] = {"Buli (Ghana)"},
["bww"] = {"Bwa"},
["bwx"] = {"Bu-Nao Bunu"},
["bwy"] = {"Cwi Bwamu"},
["bwz"] = {"Bwisi"},
["bxa"] = {"Tairaha"},
["bxb"] = {"Belanda Bor"},
["bxc"] = {"Molengue"},
["bxd"] = {"Pela"},
["bxe"] = {"Birale"},
["bxf"] = {"Bilur", "Minigir"},
["bxg"] = {"Bangala"},
["bxh"] = {"Buhutu"},
["bxi"] = {"Pirlatapa"},
["bxj"] = {"Bayungu"},
["bxk"] = {"Bukusu", "Lubukusu"},
["bxl"] = {"Jalkunan"},
["bxm"] = {"Mongolia Buriat"},
["bxn"] = {"Burduna"},
["bxo"] = {"Barikanchi"},
["bxp"] = {"Bebil"},
["bxq"] = {"Beele"},
["bxr"] = {"Russia Buriat"},
["bxs"] = {"Busam"},
["bxu"] = {"China Buriat"},
["bxv"] = {"Berakou"},
["bxw"] = {"Bankagooma"},
["bxz"] = {"Binahari"},
["bya"] = {"Batak"},
["byb"] = {"Bikya"},
["byc"] = {"Ubaghara"},
["byd"] = {"Benyadu'"},
["bye"] = {"Pouye"},
["byf"] = {"Bete"},
["byg"] = {"Baygo"},
["byh"] = {"Bhujel"},
["byi"] = {"Buyu"},
["byj"] = {"Bina (Nigeria)"},
["byk"] = {"Biao"},
["byl"] = {"Bayono"},
["bym"] = {"Bidjara"},
["byn"] = {"Bilin", "Blin"},
["byo"] = {"Biyo"},
["byp"] = {"Bumaji"},
["byq"] = {"Basay"},
["byr"] = {"Baruya", "Yipma"},
["bys"] = {"Burak"},
["byt"] = {"Berti"},
["byv"] = {"Medumba"},
["byw"] = {"Belhariya"},
["byx"] = {"Qaqet"},
["byz"] = {"Banaro"},
["bza"] = {"Bandi"},
["bzb"] = {"Andio"},
["bzc"] = {"Southern Betsimisaraka Malagasy"},
["bzd"] = {"Bribri"},
["bze"] = {"Jenaama Bozo"},
["bzf"] = {"Boikin"},
["bzg"] = {"Babuza"},
["bzh"] = {"Mapos Buang"},
["bzi"] = {"Bisu"},
["bzj"] = {"Belize Kriol English"},
["bzk"] = {"Nicaragua Creole English"},
["bzl"] = {"Boano (Sulawesi)"},
["bzm"] = {"Bolondo"},
["bzn"] = {"Boano (Maluku)"},
["bzo"] = {"Bozaba"},
["bzp"] = {"Kemberano"},
["bzq"] = {"Buli (Indonesia)"},
["bzr"] = {"Biri"},
["bzs"] = {"Brazilian Sign Language"},
["bzt"] = {"Brithenig"},
["bzu"] = {"Burmeso"},
["bzv"] = {"Naami"},
["bzw"] = {"Basa (Nigeria)"},
["bzx"] = {"Kɛlɛngaxo Bozo"},
["bzy"] = {"Obanliku"},
["bzz"] = {"Evant"},
["caa"] = {"Chortí"},
["cab"] = {"Garifuna"},
["cac"] = {"Chuj"},
["cad"] = {"Caddo"},
["cae"] = {"Lehar", "Laalaa"},
["caf"] = {"Southern Carrier"},
["cag"] = {"Nivaclé"},
["cah"] = {"Cahuarano"},
["cai"] = {"Central American Indian languages"},
["caj"] = {"Chané"},
["cak"] = {"Kaqchikel", "Cakchiquel"},
["cal"] = {"Carolinian"},
["cam"] = {"Cemuhî"},
["can"] = {"Chambri"},
["cao"] = {"Chácobo"},
["cap"] = {"Chipaya"},
["caq"] = {"Car Nicobarese"},
["car"] = {"Galibi Carib"},
["cas"] = {"Tsimané"},
["cau"] = {"Caucasian languages"},
["cav"] = {"Cavineña"},
["caw"] = {"Callawalla"},
["cax"] = {"Chiquitano"},
["cay"] = {"Cayuga"},
["caz"] = {"Canichana"},
["cba"] = {"Chibchan languages"},
["cbb"] = {"Cabiyarí"},
["cbc"] = {"Carapana"},
["cbd"] = {"Carijona"},
["cbg"] = {"Chimila"},
["cbi"] = {"Chachi"},
["cbj"] = {"Ede Cabe"},
["cbk"] = {"Chavacano"},
["cbl"] = {"Bualkhaw Chin"},
["cbn"] = {"Nyahkur"},
["cbo"] = {"Izora"},
["cbq"] = {"Tsucuba", "Cuba"},
["cbr"] = {"Cashibo-Cacataibo"},
["cbs"] = {"Cashinahua"},
["cbt"] = {"Chayahuita"},
["cbu"] = {"Candoshi-Shapra"},
["cbv"] = {"Cacua"},
["cbw"] = {"Kinabalian"},
["cby"] = {"Carabayo"},
["ccc"] = {"Chamicuro"},
["ccd"] = {"Cafundo Creole"},
["cce"] = {"Chopi"},
["ccg"] = {"Samba Daka"},
["cch"] = {"Atsam"},
["ccj"] = {"Kasanga"},
["ccl"] = {"Cutchi-Swahili"},
["ccm"] = {"Malaccan Creole Malay"},
["ccn"] = {"North Caucasian languages"},
["cco"] = {"Comaltepec Chinantec"},
["ccp"] = {"Chakma"},
["ccr"] = {"Cacaopera"},
["ccs"] = {"South Caucasian languages"},
["cda"] = {"Choni"},
["cdc"] = {"Chadic languages"},
["cdd"] = {"Caddoan languages"},
["cde"] = {"Chenchu"},
["cdf"] = {"Chiru"},
["cdh"] = {"Chambeali"},
["cdi"] = {"Chodri"},
["cdj"] = {"Churahi"},
["cdm"] = {"Chepang"},
["cdn"] = {"Chaudangsi"},
["cdo"] = {"Min Dong Chinese"},
["cdr"] = {"Cinda-Regi-Tiyal"},
["cds"] = {"Chadian Sign Language"},
["cdy"] = {"Chadong"},
["cdz"] = {"Koda"},
["cea"] = {"Lower Chehalis"},
["ceb"] = {"Cebuano"},
["ceg"] = {"Chamacoco"},
["cek"] = {"Eastern Khumi Chin"},
["cel"] = {"Celtic languages"},
["cen"] = {"Cen"},
["cet"] = {"Centúúm"},
["cey"] = {"Laoktu Chin"},
["cfa"] = {"Dijim-Bwilim"},
["cfd"] = {"Cara"},
["cfg"] = {"Como Karim"},
["cfm"] = {"Falam Chin"},
["cga"] = {"Changriwa"},
["cgc"] = {"Kagayanen"},
["cgg"] = {"Chiga"},
["cgk"] = {"Chocangacakha"},
["chb"] = {"Chibcha"},
["chc"] = {"Catawba"},
["chd"] = {"Highland Oaxaca Chontal"},
["chf"] = {"Tabasco Chontal"},
["chg"] = {"Chagatai"},
["chh"] = {"Chinook"},
["chj"] = {"Ojitlán Chinantec"},
["chk"] = {"Chuukese"},
["chl"] = {"Cahuilla"},
["chm"] = {"Mari (Russia)"},
["chn"] = {"Chinook jargon"},
["cho"] = {"Choctaw"},
["chp"] = {"Chipewyan", "Dene Suline"},
["chq"] = {"Quiotepec Chinantec"},
["chr"] = {"Cherokee"},
["cht"] = {"Cholón"},
["chw"] = {"Chuwabu"},
["chx"] = {"Chantyal"},
["chy"] = {"Cheyenne"},
["chz"] = {"Ozumacín Chinantec"},
["cia"] = {"Cia-Cia"},
["cib"] = {"Ci Gbe"},
["cic"] = {"Chickasaw"},
["cid"] = {"Chimariko"},
["cie"] = {"Cineni"},
["cih"] = {"Chinali"},
["cik"] = {"Chitkuli Kinnauri"},
["cim"] = {"Cimbrian"},
["cin"] = {"Cinta Larga"},
["cip"] = {"Chiapanec"},
["cir"] = {"Tiri", "Haméa", "Méa"},
["ciw"] = {"Chippewa"},
["ciy"] = {"Chaima"},
["cja"] = {"Western Cham"},
["cje"] = {"Chru"},
["cjh"] = {"Upper Chehalis"},
["cji"] = {"Chamalal"},
["cjk"] = {"Chokwe"},
["cjm"] = {"Eastern Cham"},
["cjn"] = {"Chenapian"},
["cjo"] = {"Ashéninka Pajonal"},
["cjp"] = {"Cabécar"},
["cjs"] = {"Shor"},
["cjv"] = {"Chuave"},
["cjy"] = {"Jinyu Chinese"},
["ckb"] = {"Central Kurdish"},
["ckh"] = {"Chak"},
["ckl"] = {"Cibak"},
["ckm"] = {"Chakavian"},
["ckn"] = {"Kaang Chin"},
["cko"] = {"Anufo"},
["ckq"] = {"Kajakse"},
["ckr"] = {"Kairak"},
["cks"] = {"Tayo"},
["ckt"] = {"Chukot"},
["cku"] = {"Koasati"},
["ckv"] = {"Kavalan"},
["ckx"] = {"Caka"},
["cky"] = {"Cakfem-Mushere"},
["ckz"] = {"Cakchiquel-Quiché Mixed Language"},
["cla"] = {"Ron"},
["clc"] = {"Chilcotin", "Tsilhqot’in"},
["cld"] = {"Chaldean Neo-Aramaic"},
["cle"] = {"Lealao Chinantec"},
["clh"] = {"Chilisso"},
["cli"] = {"Chakali"},
["clj"] = {"Laitu Chin"},
["clk"] = {"Idu-Mishmi"},
["cll"] = {"Chala"},
["clm"] = {"Klallam", "Clallam"},
["clo"] = {"Lowland Oaxaca Chontal"},
["cls"] = {"Classical Sanskrit"},
["clt"] = {"Lautu Chin"},
["clu"] = {"Caluyanun"},
["clw"] = {"Chulym"},
["cly"] = {"Eastern Highland Chatino"},
["cma"] = {"Maa"},
["cmc"] = {"Chamic languages"},
["cme"] = {"Cerma"},
["cmg"] = {"Classical Mongolian"},
["cmi"] = {"Emberá-Chamí"},
["cml"] = {"Campalagian"},
["cmm"] = {"Michigamea"},
["cmn"] = {"Mandarin Chinese"},
["cmo"] = {"Central Mnong"},
["cmr"] = {"Mro-Khimi Chin"},
["cms"] = {"Messapic"},
["cmt"] = {"Camtho"},
["cna"] = {"Changthang"},
["cnb"] = {"Chinbon Chin"},
["cnc"] = {"Côông"},
["cng"] = {"Northern Qiang"},
["cnh"] = {"Hakha Chin", "Haka Chin"},
["cni"] = {"Asháninka"},
["cnk"] = {"Khumi Chin"},
["cnl"] = {"Lalana Chinantec"},
["cno"] = {"Con"},
["cnp"] = {"Northern Ping Chinese", "Northern Pinghua"},
["cnq"] = {"Chung"},
["cnr"] = {"Montenegrin"},
["cns"] = {"Central Asmat"},
["cnt"] = {"Tepetotutla Chinantec"},
["cnu"] = {"Chenoua"},
["cnw"] = {"Ngawn Chin"},
["cnx"] = {"Middle Cornish"},
["coa"] = {"Cocos Islands Malay"},
["cob"] = {"Chicomuceltec"},
["coc"] = {"Cocopa"},
["cod"] = {"Cocama-Cocamilla"},
["coe"] = {"Koreguaje"},
["cof"] = {"Colorado"},
["cog"] = {"Chong"},
["coh"] = {"Chonyi-Dzihana-Kauma", "Chichonyi-Chidzihana-Chikauma"},
["coj"] = {"Cochimi"},
["cok"] = {"Santa Teresa Cora"},
["col"] = {"Columbia-Wenatchi"},
["com"] = {"Comanche"},
["con"] = {"Cofán"},
["coo"] = {"Comox"},
["cop"] = {"Coptic"},
["coq"] = {"Coquille"},
["cot"] = {"Caquinte"},
["cou"] = {"Wamey"},
["cov"] = {"Cao Miao"},
["cow"] = {"Cowlitz"},
["cox"] = {"Nanti"},
["coz"] = {"Chochotec"},
["cpa"] = {"Palantla Chinantec"},
["cpb"] = {"Ucayali-Yurúa Ashéninka"},
["cpc"] = {"Ajyíninka Apurucayali"},
["cpe"] = {"English-based creoles and pidgins"},
["cpf"] = {"French-based creoles and pidgins"},
["cpg"] = {"Cappadocian Greek"},
["cpi"] = {"Chinese Pidgin English"},
["cpn"] = {"Cherepon"},
["cpo"] = {"Kpeego"},
["cpp"] = {"Portuguese-based creoles and pidgins"},
["cps"] = {"Capiznon"},
["cpu"] = {"Pichis Ashéninka"},
["cpx"] = {"Pu-Xian Chinese"},
["cpy"] = {"South Ucayali Ashéninka"},
["cqd"] = {"Chuanqiandian Cluster Miao"},
["cra"] = {"Chara"},
["crb"] = {"Island Carib"},
["crc"] = {"Lonwolwol"},
["crd"] = {"Coeur d'Alene"},
["crf"] = {"Caramanta"},
["crg"] = {"Michif"},
["crh"] = {"Crimean Tatar", "Crimean Turkish"},
["cri"] = {"Sãotomense"},
["crj"] = {"Southern East Cree"},
["crk"] = {"Plains Cree"},
["crl"] = {"Northern East Cree"},
["crm"] = {"Moose Cree"},
["crn"] = {"El Nayar Cora"},
["cro"] = {"Crow"},
["crp"] = {"Creoles and pidgins"},
["crq"] = {"Iyo'wujwa Chorote"},
["crr"] = {"Carolina Algonquian"},
["crs"] = {"Seselwa Creole French"},
["crt"] = {"Iyojwa'ja Chorote"},
["crv"] = {"Chaura"},
["crw"] = {"Chrau"},
["crx"] = {"Carrier"},
["cry"] = {"Cori"},
["crz"] = {"Cruzeño"},
["csa"] = {"Chiltepec Chinantec"},
["csb"] = {"Kashubian"},
["csc"] = {"Catalan Sign Language", "Lengua de señas catalana", "Llengua de Signes Catalana"},
["csd"] = {"Chiangmai Sign Language"},
["cse"] = {"Czech Sign Language"},
["csf"] = {"Cuba Sign Language"},
["csg"] = {"Chilean Sign Language"},
["csh"] = {"Asho Chin"},
["csi"] = {"Coast Miwok"},
["csj"] = {"Songlai Chin"},
["csk"] = {"Jola-Kasa"},
["csl"] = {"Chinese Sign Language"},
["csm"] = {"Central Sierra Miwok"},
["csn"] = {"Colombian Sign Language"},
["cso"] = {"Sochiapam Chinantec", "Sochiapan Chinantec"},
["csp"] = {"Southern Ping Chinese", "Southern Pinghua"},
["csq"] = {"Croatia Sign Language"},
["csr"] = {"Costa Rican Sign Language"},
["css"] = {"Southern Ohlone"},
["cst"] = {"Northern Ohlone"},
["csu"] = {"Central Sudanic languages"},
["csv"] = {"Sumtu Chin"},
["csw"] = {"Swampy Cree"},
["csx"] = {"Cambodian Sign Language"},
["csy"] = {"Siyin Chin"},
["csz"] = {"Coos"},
["cta"] = {"Tataltepec Chatino"},
["ctc"] = {"Chetco"},
["ctd"] = {"Tedim Chin"},
["cte"] = {"Tepinapa Chinantec"},
["ctg"] = {"Chittagonian"},
["cth"] = {"Thaiphum Chin"},
["ctl"] = {"Tlacoatzintepec Chinantec"},
["ctm"] = {"Chitimacha"},
["ctn"] = {"Chhintange"},
["cto"] = {"Emberá-Catío"},
["ctp"] = {"Western Highland Chatino"},
["cts"] = {"Northern Catanduanes Bikol"},
["ctt"] = {"Wayanad Chetti"},
["ctu"] = {"Chol"},
["cty"] = {"Moundadan Chetty"},
["ctz"] = {"Zacatepec Chatino"},
["cua"] = {"Cua"},
["cub"] = {"Cubeo"},
["cuc"] = {"Usila Chinantec"},
["cuh"] = {"Chuka", "Gichuka"},
["cui"] = {"Cuiba"},
["cuj"] = {"Mashco Piro"},
["cuk"] = {"San Blas Kuna"},
["cul"] = {"Culina", "Kulina"},
["cuo"] = {"Cumanagoto"},
["cup"] = {"Cupeño"},
["cuq"] = {"Cun"},
["cur"] = {"Chhulung"},
["cus"] = {"Cushitic languages"},
["cut"] = {"Teutila Cuicatec"},
["cuu"] = {"Tai Ya"},
["cuv"] = {"Cuvok"},
["cuw"] = {"Chukwa"},
["cux"] = {"Tepeuxila Cuicatec"},
["cuy"] = {"Cuitlatec"},
["cvg"] = {"Chug"},
["cvn"] = {"Valle Nacional Chinantec"},
["cwa"] = {"Kabwa"},
["cwb"] = {"Maindo"},
["cwd"] = {"Woods Cree"},
["cwe"] = {"Kwere"},
["cwg"] = {"Chewong", "Cheq Wong"},
["cwt"] = {"Kuwaataay"},
["cxh"] = {"Cha'ari"},
["cya"] = {"Nopala Chatino"},
["cyb"] = {"Cayubaba"},
["cyo"] = {"Cuyonon"},
["czh"] = {"Huizhou Chinese"},
["czk"] = {"Knaanic"},
["czn"] = {"Zenzontepec Chatino"},
["czo"] = {"Min Zhong Chinese"},
["czt"] = {"Zotung Chin"},
["daa"] = {"Dangaléat"},
["dac"] = {"Dambi"},
["dad"] = {"Marik"},
["dae"] = {"Duupa"},
["dag"] = {"Dagbani"},
["dah"] = {"Gwahatike"},
["dai"] = {"Day"},
["daj"] = {"Dar Fur Daju"},
["dak"] = {"Dakota"},
["dal"] = {"Dahalo"},
["dam"] = {"Damakawa"},
["dao"] = {"Daai Chin"},
["daq"] = {"Dandami Maria"},
["dar"] = {"Dargwa"},
["das"] = {"Daho-Doo"},
["dau"] = {"Dar Sila Daju"},
["dav"] = {"Taita", "Dawida"},
["daw"] = {"Davawenyo"},
["dax"] = {"Dayi"},
["day"] = {"Land Dayak languages"},
["daz"] = {"Moi-Wadea", "Dao"},
["dba"] = {"Bangime"},
["dbb"] = {"Deno"},
["dbd"] = {"Dadiya"},
["dbe"] = {"Dabe"},
["dbf"] = {"Edopi"},
["dbg"] = {"Dogul Dom Dogon"},
["dbi"] = {"Doka"},
["dbj"] = {"Ida'an"},
["dbl"] = {"Dyirbal"},
["dbm"] = {"Duguri"},
["dbn"] = {"Duriankere"},
["dbo"] = {"Dulbu"},
["dbp"] = {"Duwai"},
["dbq"] = {"Daba"},
["dbr"] = {"Dabarre"},
["dbt"] = {"Ben Tey Dogon"},
["dbu"] = {"Bondum Dom Dogon"},
["dbv"] = {"Dungu"},
["dbw"] = {"Bankan Tey Dogon"},
["dby"] = {"Dibiyaso"},
["dcc"] = {"Deccan"},
["dcr"] = {"Negerhollands"},
["dda"] = {"Dadi Dadi"},
["ddd"] = {"Dongotono"},
["dde"] = {"Doondo"},
["ddg"] = {"Fataluku"},
["ddi"] = {"West Goodenough"},
["ddj"] = {"Jaru"},
["ddn"] = {"Dendi (Benin)"},
["ddo"] = {"Dido"},
["ddr"] = {"Dhudhuroa"},
["dds"] = {"Donno So Dogon"},
["ddw"] = {"Dawera-Daweloor"},
["dec"] = {"Dagik"},
["ded"] = {"Dedua"},
["dee"] = {"Dewoin"},
["def"] = {"Dezfuli"},
["deg"] = {"Degema"},
["deh"] = {"Dehwari"},
["dei"] = {"Demisa"},
["del"] = {"Delaware"},
["dem"] = {"Dem"},
["den"] = {"Slavey"},
["dep"] = {"Pidgin Delaware"},
["deq"] = {"Dendi (Central African Republic)"},
["der"] = {"Deori"},
["des"] = {"Desano"},
["dev"] = {"Domung"},
["dez"] = {"Dengese"},
["dga"] = {"Southern Dagaare"},
["dgb"] = {"Bunoge Dogon"},
["dgc"] = {"Casiguran Dumagat Agta"},
["dgd"] = {"Dagaari Dioula"},
["dge"] = {"Degenan"},
["dgg"] = {"Doga"},
["dgh"] = {"Dghwede"},
["dgi"] = {"Northern Dagara"},
["dgk"] = {"Dagba"},
["dgl"] = {"Andaandi", "Dongolawi"},
["dgn"] = {"Dagoman"},
["dgo"] = {"Dogri (individual language)"},
["dgr"] = {"Tlicho", "Dogrib", "Tłı̨chǫ"},
["dgs"] = {"Dogoso"},
["dgt"] = {"Ndra'ngith"},
["dgw"] = {"Daungwurrung"},
["dgx"] = {"Doghoro"},
["dgz"] = {"Daga"},
["dhd"] = {"Dhundari"},
["dhg"] = {"Dhangu-Djangu", "Dhangu", "Djangu"},
["dhi"] = {"Dhimal"},
["dhl"] = {"Dhalandji"},
["dhm"] = {"Zemba"},
["dhn"] = {"Dhanki"},
["dho"] = {"Dhodia"},
["dhr"] = {"Dhargari"},
["dhs"] = {"Dhaiso"},
["dhu"] = {"Dhurga"},
["dhv"] = {"Dehu", "Drehu"},
["dhw"] = {"Dhanwar (Nepal)"},
["dhx"] = {"Dhungaloo"},
["dia"] = {"Dia"},
["dib"] = {"South Central Dinka"},
["dic"] = {"Lakota Dida"},
["did"] = {"Didinga"},
["dif"] = {"Dieri", "Diyari"},
["dig"] = {"Digo", "Chidigo"},
["dih"] = {"Kumiai"},
["dii"] = {"Dimbong"},
["dij"] = {"Dai"},
["dik"] = {"Southwestern Dinka"},
["dil"] = {"Dilling"},
["dim"] = {"Dime"},
["din"] = {"Dinka"},
["dio"] = {"Dibo"},
["dip"] = {"Northeastern Dinka"},
["diq"] = {"Dimli (individual language)"},
["dir"] = {"Dirim"},
["dis"] = {"Dimasa"},
["diu"] = {"Diriku"},
["diw"] = {"Northwestern Dinka"},
["dix"] = {"Dixon Reef"},
["diy"] = {"Diuwe"},
["diz"] = {"Ding"},
["dja"] = {"Djadjawurrung"},
["djb"] = {"Djinba"},
["djc"] = {"Dar Daju Daju"},
["djd"] = {"Djamindjung", "Ngaliwurru"},
["dje"] = {"Zarma"},
["djf"] = {"Djangun"},
["dji"] = {"Djinang"},
["djj"] = {"Djeebbana"},
["djk"] = {"Eastern Maroon Creole", "Businenge Tongo", "Nenge"},
["djm"] = {"Jamsay Dogon"},
["djn"] = {"Jawoyn", "Djauan"},
["djo"] = {"Jangkang"},
["djr"] = {"Djambarrpuyngu"},
["dju"] = {"Kapriman"},
["djw"] = {"Djawi"},
["dka"] = {"Dakpakha"},
["dkg"] = {"Kadung"},
["dkk"] = {"Dakka"},
["dkr"] = {"Kuijau"},
["dks"] = {"Southeastern Dinka"},
["dkx"] = {"Mazagway"},
["dlg"] = {"Dolgan"},
["dlk"] = {"Dahalik"},
["dlm"] = {"Dalmatian"},
["dln"] = {"Darlong"},
["dma"] = {"Duma"},
["dmb"] = {"Mombo Dogon"},
["dmc"] = {"Gavak"},
["dmd"] = {"Madhi Madhi"},
["dme"] = {"Dugwor"},
["dmf"] = {"Medefaidrin"},
["dmg"] = {"Upper Kinabatangan"},
["dmk"] = {"Domaaki"},
["dml"] = {"Dameli"},
["dmm"] = {"Dama"},
["dmn"] = {"Mande languages"},
["dmo"] = {"Kemedzung"},
["dmr"] = {"East Damar"},
["dms"] = {"Dampelas"},
["dmu"] = {"Dubu", "Tebi"},
["dmv"] = {"Dumpas"},
["dmw"] = {"Mudburra"},
["dmx"] = {"Dema"},
["dmy"] = {"Demta", "Sowari"},
["dna"] = {"Upper Grand Valley Dani"},
["dnd"] = {"Daonda"},
["dne"] = {"Ndendeule"},
["dng"] = {"Dungan"},
["dni"] = {"Lower Grand Valley Dani"},
["dnj"] = {"Dan"},
["dnk"] = {"Dengka"},
["dnn"] = {"Dzùùngoo"},
["dno"] = {"Ndrulo", "Northern Lendu"},
["dnr"] = {"Danaru"},
["dnt"] = {"Mid Grand Valley Dani"},
["dnu"] = {"Danau"},
["dnv"] = {"Danu"},
["dnw"] = {"Western Dani"},
["dny"] = {"Dení"},
["doa"] = {"Dom"},
["dob"] = {"Dobu"},
["doc"] = {"Northern Dong"},
["doe"] = {"Doe"},
["dof"] = {"Domu"},
["doh"] = {"Dong"},
["doi"] = {"Dogri (macrolanguage)"},
["dok"] = {"Dondo"},
["dol"] = {"Doso"},
["don"] = {"Toura (Papua New Guinea)"},
["doo"] = {"Dongo"},
["dop"] = {"Lukpa"},
["doq"] = {"Dominican Sign Language"},
["dor"] = {"Dori'o"},
["dos"] = {"Dogosé"},
["dot"] = {"Dass"},
["dov"] = {"Dombe"},
["dow"] = {"Doyayo"},
["dox"] = {"Bussa"},
["doy"] = {"Dompo"},
["doz"] = {"Dorze"},
["dpp"] = {"Papar"},
["dra"] = {"Dravidian languages"},
["drb"] = {"Dair"},
["drc"] = {"Minderico"},
["drd"] = {"Darmiya"},
["dre"] = {"Dolpo"},
["drg"] = {"Rungus"},
["dri"] = {"C'Lela"},
["drl"] = {"Paakantyi"},
["drn"] = {"West Damar"},
["dro"] = {"Daro-Matu Melanau"},
["drq"] = {"Dura"},
["drs"] = {"Gedeo"},
["drt"] = {"Drents"},
["dru"] = {"Rukai"},
["dry"] = {"Darai"},
["dsb"] = {"Lower Sorbian"},
["dse"] = {"Dutch Sign Language"},
["dsh"] = {"Daasanach"},
["dsi"] = {"Disa"},
["dsk"] = {"Dokshi"},
["dsl"] = {"Danish Sign Language"},
["dsn"] = {"Dusner"},
["dso"] = {"Desiya"},
["dsq"] = {"Tadaksahak"},
["dsz"] = {"Mardin Sign Language"},
["dta"] = {"Daur"},
["dtb"] = {"Labuk-Kinabatangan Kadazan"},
["dtd"] = {"Ditidaht"},
["dth"] = {"Adithinngithigh"},
["dti"] = {"Ana Tinga Dogon"},
["dtk"] = {"Tene Kan Dogon"},
["dtm"] = {"Tomo Kan Dogon"},
["dtn"] = {"Daatsʼíin"},
["dto"] = {"Tommo So Dogon"},
["dtp"] = {"Kadazan Dusun", "Central Dusun"},
["dtr"] = {"Lotud"},
["dts"] = {"Toro So Dogon"},
["dtt"] = {"Toro Tegu Dogon"},
["dtu"] = {"Tebul Ure Dogon"},
["dty"] = {"Dotyali"},
["dua"] = {"Duala"},
["dub"] = {"Dubli"},
["duc"] = {"Duna"},
["due"] = {"Umiray Dumaget Agta"},
["duf"] = {"Dumbea", "Drubea"},
["dug"] = {"Duruma", "Chiduruma"},
["duh"] = {"Dungra Bhil"},
["dui"] = {"Dumun"},
["duk"] = {"Uyajitaya"},
["dul"] = {"Alabat Island Agta"},
["dum"] = {"Middle Dutch (ca. 1050-1350)"},
["dun"] = {"Dusun Deyah"},
["duo"] = {"Dupaninan Agta"},
["dup"] = {"Duano"},
["duq"] = {"Dusun Malang"},
["dur"] = {"Dii"},
["dus"] = {"Dumi"},
["duu"] = {"Drung"},
["duv"] = {"Duvle"},
["duw"] = {"Dusun Witu"},
["dux"] = {"Duungooma"},
["duy"] = {"Dicamay Agta"},
["duz"] = {"Duli-Gey"},
["dva"] = {"Duau"},
["dwa"] = {"Diri"},
["dwk"] = {"Dawik Kui"},
["dwr"] = {"Dawro"},
["dws"] = {"Dutton World Speedwords"},
["dwu"] = {"Dhuwal"},
["dww"] = {"Dawawa"},
["dwy"] = {"Dhuwaya"},
["dwz"] = {"Dewas Rai"},
["dya"] = {"Dyan"},
["dyb"] = {"Dyaberdyaber"},
["dyd"] = {"Dyugun"},
["dyg"] = {"Villa Viciosa Agta"},
["dyi"] = {"Djimini Senoufo"},
["dyl"] = {"Bhutanese Sign Language"},
["dym"] = {"Yanda Dom Dogon"},
["dyn"] = {"Dyangadi", "Dhanggatti"},
["dyo"] = {"Jola-Fonyi"},
["dyr"] = {"Dyarim"},
["dyu"] = {"Dyula"},
["dyy"] = {"Djabugay", "Dyaabugay"},
["dza"] = {"Tunzu"},
["dzd"] = {"Daza"},
["dze"] = {"Djiwarli"},
["dzg"] = {"Dazaga"},
["dzl"] = {"Dzalakha"},
["dzn"] = {"Dzando"},
["eaa"] = {"Karenggapa"},
["ebc"] = {"Beginci"},
["ebg"] = {"Ebughu"},
["ebk"] = {"Eastern Bontok"},
["ebo"] = {"Teke-Ebo"},
["ebr"] = {"Ebrié"},
["ebu"] = {"Embu", "Kiembu"},
["ecr"] = {"Eteocretan"},
["ecs"] = {"Ecuadorian Sign Language"},
["ecy"] = {"Eteocypriot"},
["eee"] = {"E"},
["efa"] = {"Efai"},
["efe"] = {"Efe"},
["efi"] = {"Efik"},
["ega"] = {"Ega"},
["egl"] = {"Emilian"},
["egm"] = {"Benamanga"},
["ego"] = {"Eggon"},
["egx"] = {"Egyptian languages"},
["egy"] = {"Egyptian (Ancient)"},
["ehs"] = {"Miyakubo Sign Language"},
["ehu"] = {"Ehueun"},
["eip"] = {"Eipomek"},
["eit"] = {"Eitiep"},
["eiv"] = {"Askopan"},
["eja"] = {"Ejamat"},
["eka"] = {"Ekajuk"},
["eke"] = {"Ekit"},
["ekg"] = {"Ekari"},
["eki"] = {"Eki"},
["ekk"] = {"Standard Estonian"},
["ekl"] = {"Kol (Bangladesh)", "Kol"},
["ekm"] = {"Elip"},
["eko"] = {"Koti"},
["ekp"] = {"Ekpeye"},
["ekr"] = {"Yace"},
["eky"] = {"Eastern Kayah"},
["ele"] = {"Elepi"},
["elh"] = {"El Hugeirat"},
["eli"] = {"Nding"},
["elk"] = {"Elkei"},
["elm"] = {"Eleme"},
["elo"] = {"El Molo"},
["elu"] = {"Elu"},
["elx"] = {"Elamite"},
["ema"] = {"Emai-Iuleha-Ora"},
["emb"] = {"Embaloh"},
["eme"] = {"Emerillon"},
["emg"] = {"Eastern Meohang"},
["emi"] = {"Mussau-Emira"},
["emk"] = {"Eastern Maninkakan"},
["emm"] = {"Mamulique"},
["emn"] = {"Eman"},
["emp"] = {"Northern Emberá"},
["emq"] = {"Eastern Minyag"},
["ems"] = {"Pacific Gulf Yupik"},
["emu"] = {"Eastern Muria"},
["emw"] = {"Emplawas"},
["emx"] = {"Erromintxela"},
["emy"] = {"Epigraphic Mayan"},
["emz"] = {"Mbessa"},
["ena"] = {"Apali"},
["enb"] = {"Markweeta"},
["enc"] = {"En"},
["end"] = {"Ende"},
["enf"] = {"Forest Enets"},
["enh"] = {"Tundra Enets"},
["enl"] = {"Enlhet"},
["enm"] = {"Middle English (1100-1500)"},
["enn"] = {"Engenni"},
["eno"] = {"Enggano"},
["enq"] = {"Enga"},
["enr"] = {"Emumu", "Emem"},
["enu"] = {"Enu"},
["env"] = {"Enwan (Edo State)"},
["enw"] = {"Enwan (Akwa Ibom State)"},
["enx"] = {"Enxet"},
["eot"] = {"Beti (Côte d'Ivoire)"},
["epi"] = {"Epie"},
["era"] = {"Eravallan"},
["erg"] = {"Sie"},
["erh"] = {"Eruwa"},
["eri"] = {"Ogea"},
["erk"] = {"South Efate"},
["ero"] = {"Horpa"},
["err"] = {"Erre"},
["ers"] = {"Ersu"},
["ert"] = {"Eritai"},
["erw"] = {"Erokwanas"},
["ese"] = {"Ese Ejja"},
["esg"] = {"Aheri Gondi"},
["esh"] = {"Eshtehardi"},
["esi"] = {"North Alaskan Inupiatun"},
["esk"] = {"Northwest Alaska Inupiatun"},
["esl"] = {"Egypt Sign Language"},
["esm"] = {"Esuma"},
["esn"] = {"Salvadoran Sign Language"},
["eso"] = {"Estonian Sign Language"},
["esq"] = {"Esselen"},
["ess"] = {"Central Siberian Yupik"},
["esu"] = {"Central Yupik"},
["esx"] = {"Eskimo-Aleut languages"},
["esy"] = {"Eskayan"},
["etb"] = {"Etebi"},
["etc"] = {"Etchemin"},
["eth"] = {"Ethiopian Sign Language"},
["etn"] = {"Eton (Vanuatu)"},
["eto"] = {"Eton (Cameroon)"},
["etr"] = {"Edolo"},
["ets"] = {"Yekhee"},
["ett"] = {"Etruscan"},
["etu"] = {"Ejagham"},
["etx"] = {"Eten"},
["etz"] = {"Semimi"},
["eud"] = {"Eudeve"},
["euq"] = {"Basque (family)"},
["eve"] = {"Even"},
["evh"] = {"Uvbie"},
["evn"] = {"Evenki"},
["ewo"] = {"Ewondo"},
["ext"] = {"Extremaduran"},
["eya"] = {"Eyak"},
["eyo"] = {"Keiyo"},
["eza"] = {"Ezaa"},
["eze"] = {"Uzekwe"},
["faa"] = {"Fasu"},
["fab"] = {"Fa d'Ambu"},
["fad"] = {"Wagi"},
["faf"] = {"Fagani"},
["fag"] = {"Finongan"},
["fah"] = {"Baissa Fali"},
["fai"] = {"Faiwol"},
["faj"] = {"Faita"},
["fak"] = {"Fang (Cameroon)"},
["fal"] = {"South Fali"},
["fam"] = {"Fam"},
["fan"] = {"Fang (Equatorial Guinea)"},
["fap"] = {"Paloor"},
["far"] = {"Fataleka"},
["fat"] = {"Fanti"},
["fau"] = {"Fayu"},
["fax"] = {"Fala"},
["fay"] = {"Southwestern Fars"},
["faz"] = {"Northwestern Fars"},
["fbl"] = {"West Albay Bikol"},
["fcs"] = {"Quebec Sign Language"},
["fer"] = {"Feroge"},
["ffi"] = {"Foia Foia"},
["ffm"] = {"Maasina Fulfulde"},
["fgr"] = {"Fongoro"},
["fia"] = {"Nobiin"},
["fie"] = {"Fyer"},
["fif"] = {"Faifi"},
["fil"] = {"Filipino", "Pilipino"},
["fip"] = {"Fipa"},
["fir"] = {"Firan"},
["fit"] = {"Tornedalen Finnish", "Meänkieli"},
["fiu"] = {"Finno-Ugrian languages"},
["fiw"] = {"Fiwaga"},
["fkk"] = {"Kirya-Konzəl"},
["fkv"] = {"Kven Finnish"},
["fla"] = {"Kalispel-Pend d'Oreille"},
["flh"] = {"Foau"},
["fli"] = {"Fali"},
["fll"] = {"North Fali"},
["fln"] = {"Flinders Island"},
["flr"] = {"Fuliiru"},
["fly"] = {"Flaaitaal", "Tsotsitaal"},
["fmp"] = {"Fe'fe'"},
["fmu"] = {"Far Western Muria"},
["fnb"] = {"Fanbak"},
["fng"] = {"Fanagalo"},
["fni"] = {"Fania"},
["fod"] = {"Foodo"},
["foi"] = {"Foi"},
["fom"] = {"Foma"},
["fon"] = {"Fon"},
["for"] = {"Fore"},
["fos"] = {"Siraya"},
["fox"] = {"Formosan languages"},
["fpe"] = {"Fernando Po Creole English"},
["fqs"] = {"Fas"},
["frc"] = {"Cajun French"},
["frd"] = {"Fordata"},
["frk"] = {"Frankish"},
["frm"] = {"Middle French (ca. 1400-1600)"},
["fro"] = {"Old French (842-ca. 1400)"},
["frp"] = {"Arpitan", "Francoprovençal"},
["frq"] = {"Forak"},
["frr"] = {"Northern Frisian"},
["frs"] = {"Eastern Frisian"},
["frt"] = {"Fortsenal"},
["fse"] = {"Finnish Sign Language"},
["fsl"] = {"French Sign Language"},
["fss"] = {"Finland-Swedish Sign Language", "finlandssvenskt teckenspråk", "suomenruotsalainen viittomakieli"},
["fub"] = {"Adamawa Fulfulde"},
["fuc"] = {"Pulaar"},
["fud"] = {"East Futuna"},
["fue"] = {"Borgu Fulfulde"},
["fuf"] = {"Pular"},
["fuh"] = {"Western Niger Fulfulde"},
["fui"] = {"Bagirmi Fulfulde"},
["fuj"] = {"Ko"},
["fum"] = {"Fum"},
["fun"] = {"Fulniô"},
["fuq"] = {"Central-Eastern Niger Fulfulde"},
["fur"] = {"Friulian"},
["fut"] = {"Futuna-Aniwa"},
["fuu"] = {"Furu"},
["fuv"] = {"Nigerian Fulfulde"},
["fuy"] = {"Fuyug"},
["fvr"] = {"Fur"},
["fwa"] = {"Fwâi"},
["fwe"] = {"Fwe"},
["gaa"] = {"Ga"},
["gab"] = {"Gabri"},
["gac"] = {"Mixed Great Andamanese"},
["gad"] = {"Gaddang"},
["gae"] = {"Guarequena"},
["gaf"] = {"Gende"},
["gag"] = {"Gagauz"},
["gah"] = {"Alekano"},
["gai"] = {"Borei"},
["gaj"] = {"Gadsup"},
["gak"] = {"Gamkonora"},
["gal"] = {"Galolen"},
["gam"] = {"Kandawo"},
["gan"] = {"Gan Chinese"},
["gao"] = {"Gants"},
["gap"] = {"Gal"},
["gaq"] = {"Gata'"},
["gar"] = {"Galeya"},
["gas"] = {"Adiwasi Garasia"},
["gat"] = {"Kenati"},
["gau"] = {"Mudhili Gadaba"},
["gaw"] = {"Nobonob"},
["gax"] = {"Borana-Arsi-Guji Oromo"},
["gay"] = {"Gayo"},
["gaz"] = {"West Central Oromo"},
["gba"] = {"Gbaya (Central African Republic)"},
["gbb"] = {"Kaytetye"},
["gbd"] = {"Karajarri"},
["gbe"] = {"Niksek"},
["gbf"] = {"Gaikundi"},
["gbg"] = {"Gbanziri"},
["gbh"] = {"Defi Gbe"},
["gbi"] = {"Galela"},
["gbj"] = {"Bodo Gadaba"},
["gbk"] = {"Gaddi"},
["gbl"] = {"Gamit"},
["gbm"] = {"Garhwali"},
["gbn"] = {"Mo'da"},
["gbo"] = {"Northern Grebo"},
["gbp"] = {"Gbaya-Bossangoa"},
["gbq"] = {"Gbaya-Bozoum"},
["gbr"] = {"Gbagyi"},
["gbs"] = {"Gbesi Gbe"},
["gbu"] = {"Gagadu"},
["gbv"] = {"Gbanu"},
["gbw"] = {"Gabi-Gabi"},
["gbx"] = {"Eastern Xwla Gbe"},
["gby"] = {"Gbari"},
["gbz"] = {"Zoroastrian Dari"},
["gcc"] = {"Mali"},
["gcd"] = {"Ganggalida"},
["gce"] = {"Galice"},
["gcf"] = {"Guadeloupean Creole French"},
["gcl"] = {"Grenadian Creole English"},
["gcn"] = {"Gaina"},
["gcr"] = {"Guianese Creole French"},
["gct"] = {"Colonia Tovar German"},
["gda"] = {"Gade Lohar"},
["gdb"] = {"Pottangi Ollar Gadaba"},
["gdc"] = {"Gugu Badhun"},
["gdd"] = {"Gedaged"},
["gde"] = {"Gude"},
["gdf"] = {"Guduf-Gava"},
["gdg"] = {"Ga'dang"},
["gdh"] = {"Gadjerawang", "Gajirrabeng"},
["gdi"] = {"Gundi"},
["gdj"] = {"Gurdjar"},
["gdk"] = {"Gadang"},
["gdl"] = {"Dirasha"},
["gdm"] = {"Laal"},
["gdn"] = {"Umanakaina"},
["gdo"] = {"Ghodoberi"},
["gdq"] = {"Mehri"},
["gdr"] = {"Wipi"},
["gds"] = {"Ghandruk Sign Language"},
["gdt"] = {"Kungardutyi"},
["gdu"] = {"Gudu"},
["gdx"] = {"Godwari"},
["gea"] = {"Geruma"},
["geb"] = {"Kire"},
["gec"] = {"Gboloo Grebo"},
["ged"] = {"Gade"},
["gef"] = {"Gerai"},
["geg"] = {"Gengle"},
["geh"] = {"Hutterite German", "Hutterisch"},
["gei"] = {"Gebe"},
["gej"] = {"Gen"},
["gek"] = {"Ywom"},
["gel"] = {"ut-Ma'in"},
["gem"] = {"Germanic languages"},
["geq"] = {"Geme"},
["ges"] = {"Geser-Gorom"},
["gev"] = {"Eviya"},
["gew"] = {"Gera"},
["gex"] = {"Garre"},
["gey"] = {"Enya"},
["gez"] = {"Geez"},
["gfk"] = {"Patpatar"},
["gft"] = {"Gafat"},
["gga"] = {"Gao"},
["ggb"] = {"Gbii"},
["ggd"] = {"Gugadj"},
["gge"] = {"Gurr-goni"},
["ggg"] = {"Gurgula"},
["ggk"] = {"Kungarakany"},
["ggl"] = {"Ganglau"},
["ggt"] = {"Gitua"},
["ggu"] = {"Gagu", "Gban"},
["ggw"] = {"Gogodala"},
["gha"] = {"Ghadamès"},
["ghc"] = {"Hiberno-Scottish Gaelic"},
["ghe"] = {"Southern Ghale"},
["ghh"] = {"Northern Ghale"},
["ghk"] = {"Geko Karen"},
["ghl"] = {"Ghulfan"},
["ghn"] = {"Ghanongga"},
["gho"] = {"Ghomara"},
["ghr"] = {"Ghera"},
["ghs"] = {"Guhu-Samane"},
["ght"] = {"Kuke", "Kutang Ghale"},
["gia"] = {"Kija"},
["gib"] = {"Gibanawa"},
["gic"] = {"Gail"},
["gid"] = {"Gidar"},
["gie"] = {"Gaɓogbo", "Guébie"},
["gig"] = {"Goaria"},
["gih"] = {"Githabul"},
["gii"] = {"Girirra"},
["gil"] = {"Gilbertese"},
["gim"] = {"Gimi (Eastern Highlands)"},
["gin"] = {"Hinukh"},
["gip"] = {"Gimi (West New Britain)"},
["giq"] = {"Green Gelao"},
["gir"] = {"Red Gelao"},
["gis"] = {"North Giziga"},
["git"] = {"Gitxsan"},
["giu"] = {"Mulao"},
["giw"] = {"White Gelao"},
["gix"] = {"Gilima"},
["giy"] = {"Giyug"},
["giz"] = {"South Giziga"},
["gjk"] = {"Kachi Koli"},
["gjm"] = {"Gunditjmara"},
["gjn"] = {"Gonja"},
["gjr"] = {"Gurindji Kriol"},
["gju"] = {"Gujari"},
["gka"] = {"Guya"},
["gkd"] = {"Magɨ (Madang Province)"},
["gke"] = {"Ndai"},
["gkn"] = {"Gokana"},
["gko"] = {"Kok-Nar"},
["gkp"] = {"Guinea Kpelle"},
["gku"] = {"ǂUngkue"},
["glb"] = {"Belning"},
["glc"] = {"Bon Gula"},
["gld"] = {"Nanai"},
["glh"] = {"Northwest Pashai", "Northwest Pashayi"},
["glj"] = {"Gula Iro"},
["glk"] = {"Gilaki"},
["gll"] = {"Garlali"},
["glo"] = {"Galambu"},
["glr"] = {"Glaro-Twabo"},
["glu"] = {"Gula (Chad)"},
["glw"] = {"Glavda"},
["gly"] = {"Gule"},
["gma"] = {"Gambera"},
["gmb"] = {"Gula'alaa"},
["gmd"] = {"Mághdì"},
["gme"] = {"East Germanic languages"},
["gmg"] = {"Magɨyi"},
["gmh"] = {"Middle High German (ca. 1050-1500)"},
["gml"] = {"Middle Low German"},
["gmm"] = {"Gbaya-Mbodomo"},
["gmn"] = {"Gimnime"},
["gmq"] = {"North Germanic languages"},
["gmr"] = {"Mirning", "Mirniny"},
["gmu"] = {"Gumalu"},
["gmv"] = {"Gamo"},
["gmw"] = {"West Germanic languages"},
["gmx"] = {"Magoma"},
["gmy"] = {"Mycenaean Greek"},
["gmz"] = {"Mgbolizhia"},
["gna"] = {"Kaansa"},
["gnb"] = {"Gangte"},
["gnc"] = {"Guanche"},
["gnd"] = {"Zulgo-Gemzek"},
["gne"] = {"Ganang"},
["gng"] = {"Ngangam"},
["gnh"] = {"Lere"},
["gni"] = {"Gooniyandi"},
["gnj"] = {"Ngen"},
["gnk"] = {"ǁGana"},
["gnl"] = {"Gangulu"},
["gnm"] = {"Ginuman"},
["gnn"] = {"Gumatj"},
["gno"] = {"Northern Gondi"},
["gnq"] = {"Gana"},
["gnr"] = {"Gureng Gureng"},
["gnt"] = {"Guntai"},
["gnu"] = {"Gnau"},
["gnw"] = {"Western Bolivian Guaraní"},
["gnz"] = {"Ganzi"},
["goa"] = {"Guro"},
["gob"] = {"Playero"},
["goc"] = {"Gorakor"},
["god"] = {"Godié"},
["goe"] = {"Gongduk"},
["gof"] = {"Gofa"},
["gog"] = {"Gogo"},
["goh"] = {"Old High German (ca. 750-1050)"},
["goi"] = {"Gobasi"},
["goj"] = {"Gowlan"},
["gok"] = {"Gowli"},
["gol"] = {"Gola"},
["gom"] = {"Goan Konkani"},
["gon"] = {"Gondi"},
["goo"] = {"Gone Dau"},
["gop"] = {"Yeretuar"},
["goq"] = {"Gorap"},
["gor"] = {"Gorontalo"},
["gos"] = {"Gronings"},
["got"] = {"Gothic"},
["gou"] = {"Gavar"},
["gov"] = {"Goo"},
["gow"] = {"Gorowa"},
["gox"] = {"Gobu"},
["goy"] = {"Goundo"},
["goz"] = {"Gozarkhani"},
["gpa"] = {"Gupa-Abawa"},
["gpe"] = {"Ghanaian Pidgin English"},
["gpn"] = {"Taiap"},
["gqa"] = {"Ga'anda"},
["gqi"] = {"Guiqiong"},
["gqn"] = {"Guana (Brazil)"},
["gqr"] = {"Gor"},
["gqu"] = {"Qau"},
["gra"] = {"Rajput Garasia"},
["grb"] = {"Grebo"},
["grc"] = {"Ancient Greek (to 1453)"},
["grd"] = {"Guruntum-Mbaaru"},
["grg"] = {"Madi"},
["grh"] = {"Gbiri-Niragu"},
["gri"] = {"Ghari"},
["grj"] = {"Southern Grebo"},
["grk"] = {"Greek languages"},
["grm"] = {"Kota Marudu Talantang"},
["gro"] = {"Groma"},
["grq"] = {"Gorovu"},
["grr"] = {"Taznatit"},
["grs"] = {"Gresi"},
["grt"] = {"Garo"},
["gru"] = {"Kistane"},
["grv"] = {"Central Grebo"},
["grw"] = {"Gweda"},
["grx"] = {"Guriaso"},
["gry"] = {"Barclayville Grebo"},
["grz"] = {"Guramalum"},
["gse"] = {"Ghanaian Sign Language"},
["gsg"] = {"German Sign Language"},
["gsl"] = {"Gusilay"},
["gsm"] = {"Guatemalan Sign Language"},
["gsn"] = {"Nema", "Gusan"},
["gso"] = {"Southwest Gbaya"},
["gsp"] = {"Wasembo"},
["gss"] = {"Greek Sign Language"},
["gsw"] = {"Swiss German", "Alemannic", "Alsatian"},
["gta"] = {"Guató"},
["gtu"] = {"Aghu-Tharnggala"},
["gua"] = {"Shiki"},
["gub"] = {"Guajajára"},
["guc"] = {"Wayuu"},
["gud"] = {"Yocoboué Dida"},
["gue"] = {"Gurindji"},
["guf"] = {"Gupapuyngu"},
["gug"] = {"Paraguayan Guaraní"},
["guh"] = {"Guahibo"},
["gui"] = {"Eastern Bolivian Guaraní"},
["guk"] = {"Gumuz"},
["gul"] = {"Sea Island Creole English"},
["gum"] = {"Guambiano"},
["gun"] = {"Mbyá Guaraní"},
["guo"] = {"Guayabero"},
["gup"] = {"Gunwinggu"},
["guq"] = {"Aché"},
["gur"] = {"Farefare"},
["gus"] = {"Guinean Sign Language"},
["gut"] = {"Maléku Jaíka"},
["guu"] = {"Yanomamö"},
["guw"] = {"Gun"},
["gux"] = {"Gourmanchéma"},
["guz"] = {"Gusii", "Ekegusii"},
["gva"] = {"Guana (Paraguay)"},
["gvc"] = {"Guanano"},
["gve"] = {"Duwet"},
["gvf"] = {"Golin"},
["gvj"] = {"Guajá"},
["gvl"] = {"Gulay"},
["gvm"] = {"Gurmana"},
["gvn"] = {"Kuku-Yalanji"},
["gvo"] = {"Gavião Do Jiparaná"},
["gvp"] = {"Pará Gavião"},
["gvr"] = {"Gurung"},
["gvs"] = {"Gumawana"},
["gvy"] = {"Guyani"},
["gwa"] = {"Mbato"},
["gwb"] = {"Gwa"},
["gwc"] = {"Gawri", "Kalami"},
["gwd"] = {"Gawwada"},
["gwe"] = {"Gweno"},
["gwf"] = {"Gowro"},
["gwg"] = {"Moo"},
["gwi"] = {"Gwichʼin"},
["gwj"] = {"ǀGwi"},
["gwm"] = {"Awngthim"},
["gwn"] = {"Gwandara"},
["gwr"] = {"Gwere"},
["gwt"] = {"Gawar-Bati"},
["gwu"] = {"Guwamu"},
["gww"] = {"Kwini"},
["gwx"] = {"Gua"},
["gxx"] = {"Wè Southern"},
["gya"] = {"Northwest Gbaya"},
["gyb"] = {"Garus"},
["gyd"] = {"Kayardild"},
["gye"] = {"Gyem"},
["gyf"] = {"Gungabula"},
["gyg"] = {"Gbayi"},
["gyi"] = {"Gyele"},
["gyl"] = {"Gayil"},
["gym"] = {"Ngäbere"},
["gyn"] = {"Guyanese Creole English"},
["gyo"] = {"Gyalsumdo"},
["gyr"] = {"Guarayu"},
["gyy"] = {"Gunya"},
["gyz"] = {"Geji", "Gyaazi"},
["gza"] = {"Ganza"},
["gzi"] = {"Gazi"},
["gzn"] = {"Gane"},
["haa"] = {"Hän"},
["hab"] = {"Hanoi Sign Language"},
["hac"] = {"Gurani"},
["had"] = {"Hatam"},
["hae"] = {"Eastern Oromo"},
["haf"] = {"Haiphong Sign Language"},
["hag"] = {"Hanga"},
["hah"] = {"Hahon"},
["hai"] = {"Haida"},
["haj"] = {"Hajong"},
["hak"] = {"Hakka Chinese"},
["hal"] = {"Halang"},
["ham"] = {"Hewa"},
["han"] = {"Hangaza"},
["hao"] = {"Hakö"},
["hap"] = {"Hupla"},
["haq"] = {"Ha"},
["har"] = {"Harari"},
["has"] = {"Haisla"},
["hav"] = {"Havu"},
["haw"] = {"Hawaiian"},
["hax"] = {"Southern Haida"},
["hay"] = {"Haya"},
["haz"] = {"Hazaragi"},
["hba"] = {"Hamba"},
["hbb"] = {"Huba"},
["hbn"] = {"Heiban"},
["hbo"] = {"Ancient Hebrew"},
["hbu"] = {"Habu"},
["hca"] = {"Andaman Creole Hindi"},
["hch"] = {"Huichol"},
["hdn"] = {"Northern Haida"},
["hds"] = {"Honduras Sign Language"},
["hdy"] = {"Hadiyya"},
["hea"] = {"Northern Qiandong Miao"},
["hed"] = {"Herdé"},
["heg"] = {"Helong"},
["heh"] = {"Hehe"},
["hei"] = {"Heiltsuk"},
["hem"] = {"Hemba"},
["hgm"] = {"Haiǁom"},
["hgw"] = {"Haigwai"},
["hhi"] = {"Hoia Hoia"},
["hhr"] = {"Kerak"},
["hhy"] = {"Hoyahoya"},
["hia"] = {"Lamang"},
["hib"] = {"Hibito"},
["hid"] = {"Hidatsa"},
["hif"] = {"Fiji Hindi"},
["hig"] = {"Kamwe"},
["hih"] = {"Pamosu"},
["hii"] = {"Hinduri"},
["hij"] = {"Hijuk"},
["hik"] = {"Seit-Kaitetu"},
["hil"] = {"Hiligaynon"},
["him"] = {"Himachali languages", "Western Pahari languages"},
["hio"] = {"Tsoa"},
["hir"] = {"Himarimã"},
["hit"] = {"Hittite"},
["hiw"] = {"Hiw"},
["hix"] = {"Hixkaryána"},
["hji"] = {"Haji"},
["hka"] = {"Kahe"},
["hke"] = {"Hunde"},
["hkh"] = {"Khah", "Poguli"},
["hkk"] = {"Hunjara-Kaina Ke"},
["hkn"] = {"Mel-Khaonh"},
["hks"] = {"Hong Kong Sign Language", "Heung Kong Sau Yue"},
["hla"] = {"Halia"},
["hlb"] = {"Halbi"},
["hld"] = {"Halang Doan"},
["hle"] = {"Hlersu"},
["hlt"] = {"Matu Chin"},
["hlu"] = {"Hieroglyphic Luwian"},
["hma"] = {"Southern Mashan Hmong", "Southern Mashan Miao"},
["hmb"] = {"Humburi Senni Songhay"},
["hmc"] = {"Central Huishui Hmong", "Central Huishui Miao"},
["hmd"] = {"Large Flowery Miao", "A-hmaos", "Da-Hua Miao"},
["hme"] = {"Eastern Huishui Hmong", "Eastern Huishui Miao"},
["hmf"] = {"Hmong Don"},
["hmg"] = {"Southwestern Guiyang Hmong"},
["hmh"] = {"Southwestern Huishui Hmong", "Southwestern Huishui Miao"},
["hmi"] = {"Northern Huishui Hmong", "Northern Huishui Miao"},
["hmj"] = {"Ge", "Gejia"},
["hmk"] = {"Maek"},
["hml"] = {"Luopohe Hmong", "Luopohe Miao"},
["hmm"] = {"Central Mashan Hmong", "Central Mashan Miao"},
["hmn"] = {"Hmong", "Mong"},
["hmp"] = {"Northern Mashan Hmong", "Northern Mashan Miao"},
["hmq"] = {"Eastern Qiandong Miao"},
["hmr"] = {"Hmar"},
["hms"] = {"Southern Qiandong Miao"},
["hmt"] = {"Hamtai"},
["hmu"] = {"Hamap"},
["hmv"] = {"Hmong Dô"},
["hmw"] = {"Western Mashan Hmong", "Western Mashan Miao"},
["hmx"] = {"Hmong-Mien languages"},
["hmy"] = {"Southern Guiyang Hmong", "Southern Guiyang Miao"},
["hmz"] = {"Hmong Shua", "Sinicized Miao"},
["hna"] = {"Mina (Cameroon)"},
["hnd"] = {"Southern Hindko"},
["hne"] = {"Chhattisgarhi"},
["hng"] = {"Hungu"},
["hnh"] = {"ǁAni"},
["hni"] = {"Hani"},
["hnj"] = {"Hmong Njua", "Mong Leng", "Mong Njua"},
["hnm"] = {"Hainanese"},
["hnn"] = {"Hanunoo"},
["hno"] = {"Northern Hindko"},
["hns"] = {"Caribbean Hindustani"},
["hnu"] = {"Hung"},
["hoa"] = {"Hoava"},
["hob"] = {"Mari (Madang Province)"},
["hoc"] = {"Ho"},
["hod"] = {"Holma"},
["hoe"] = {"Horom"},
["hoh"] = {"Hobyót"},
["hoi"] = {"Holikachuk"},
["hoj"] = {"Hadothi", "Haroti"},
["hok"] = {"Hokan languages"},
["hol"] = {"Holu"},
["hom"] = {"Homa"},
["hoo"] = {"Holoholo"},
["hop"] = {"Hopi"},
["hor"] = {"Horo"},
["hos"] = {"Ho Chi Minh City Sign Language"},
["hot"] = {"Hote", "Malê"},
["hov"] = {"Hovongan"},
["how"] = {"Honi"},
["hoy"] = {"Holiya"},
["hoz"] = {"Hozo"},
["hpo"] = {"Hpon"},
["hps"] = {"Hawai'i Sign Language (HSL)", "Hawai'i Pidgin Sign Language"},
["hra"] = {"Hrangkhol"},
["hrc"] = {"Niwer Mil"},
["hre"] = {"Hre"},
["hrk"] = {"Haruku"},
["hrm"] = {"Horned Miao"},
["hro"] = {"Haroi"},
["hrp"] = {"Nhirrpi"},
["hrt"] = {"Hértevin"},
["hru"] = {"Hruso"},
["hrw"] = {"Warwar Feni"},
["hrx"] = {"Hunsrik"},
["hrz"] = {"Harzani"},
["hsb"] = {"Upper Sorbian"},
["hsh"] = {"Hungarian Sign Language"},
["hsl"] = {"Hausa Sign Language"},
["hsn"] = {"Xiang Chinese"},
["hss"] = {"Harsusi"},
["hti"] = {"Hoti"},
["hto"] = {"Minica Huitoto"},
["hts"] = {"Hadza"},
["htu"] = {"Hitu"},
["htx"] = {"Middle Hittite"},
["hub"] = {"Huambisa"},
["huc"] = {"ǂHua", "ǂʼAmkhoe"},
["hud"] = {"Huaulu"},
["hue"] = {"San Francisco Del Mar Huave"},
["huf"] = {"Humene"},
["hug"] = {"Huachipaeri"},
["huh"] = {"Huilliche"},
["hui"] = {"Huli"},
["huj"] = {"Northern Guiyang Hmong", "Northern Guiyang Miao"},
["huk"] = {"Hulung"},
["hul"] = {"Hula"},
["hum"] = {"Hungana"},
["huo"] = {"Hu"},
["hup"] = {"Hupa"},
["huq"] = {"Tsat"},
["hur"] = {"Halkomelem"},
["hus"] = {"Huastec"},
["hut"] = {"Humla"},
["huu"] = {"Murui Huitoto"},
["huv"] = {"San Mateo Del Mar Huave"},
["huw"] = {"Hukumina"},
["hux"] = {"Nüpode Huitoto"},
["huy"] = {"Hulaulá"},
["huz"] = {"Hunzib"},
["hvc"] = {"Haitian Vodoun Culture Language"},
["hve"] = {"San Dionisio Del Mar Huave"},
["hvk"] = {"Haveke"},
["hvn"] = {"Sabu"},
["hvv"] = {"Santa María Del Mar Huave"},
["hwa"] = {"Wané"},
["hwc"] = {"Hawai'i Creole English", "Hawai'i Pidgin"},
["hwo"] = {"Hwana"},
["hya"] = {"Hya"},
["hyw"] = {"Western Armenian"},
["hyx"] = {"Armenian (family)"},
["iai"] = {"Iaai"},
["ian"] = {"Iatmul"},
["iar"] = {"Purari"},
["iba"] = {"Iban"},
["ibb"] = {"Ibibio"},
["ibd"] = {"Iwaidja"},
["ibe"] = {"Akpes"},
["ibg"] = {"Ibanag"},
["ibh"] = {"Bih"},
["ibl"] = {"Ibaloi"},
["ibm"] = {"Agoi"},
["ibn"] = {"Ibino"},
["ibr"] = {"Ibuoro"},
["ibu"] = {"Ibu"},
["iby"] = {"Ibani"},
["ica"] = {"Ede Ica"},
["ich"] = {"Etkywan"},
["icl"] = {"Icelandic Sign Language"},
["icr"] = {"Islander Creole English"},
["ida"] = {"Idakho-Isukha-Tiriki", "Luidakho-Luisukha-Lutirichi"},
["idb"] = {"Indo-Portuguese"},
["idc"] = {"Idon", "Ajiya"},
["idd"] = {"Ede Idaca"},
["ide"] = {"Idere"},
["idi"] = {"Idi"},
["idr"] = {"Indri"},
["ids"] = {"Idesa"},
["idt"] = {"Idaté"},
["idu"] = {"Idoma"},
["ifa"] = {"Amganad Ifugao"},
["ifb"] = {"Batad Ifugao", "Ayangan Ifugao"},
["ife"] = {"Ifè"},
["iff"] = {"Ifo"},
["ifk"] = {"Tuwali Ifugao"},
["ifm"] = {"Teke-Fuumu"},
["ifu"] = {"Mayoyao Ifugao"},
["ify"] = {"Keley-I Kallahan"},
["igb"] = {"Ebira"},
["ige"] = {"Igede"},
["igg"] = {"Igana"},
["igl"] = {"Igala"},
["igm"] = {"Kanggape"},
["ign"] = {"Ignaciano"},
["igo"] = {"Isebe"},
["igs"] = {"Interglossa"},
["igw"] = {"Igwe"},
["ihb"] = {"Iha Based Pidgin"},
["ihi"] = {"Ihievbe"},
["ihp"] = {"Iha"},
["ihw"] = {"Bidhawal"},
["iin"] = {"Thiin"},
["iir"] = {"Indo-Iranian languages"},
["ijc"] = {"Izon"},
["ije"] = {"Biseni"},
["ijj"] = {"Ede Ije"},
["ijn"] = {"Kalabari"},
["ijo"] = {"Ijo languages"},
["ijs"] = {"Southeast Ijo"},
["ike"] = {"Eastern Canadian Inuktitut"},
["ikh"] = {"Ikhin-Arokho"},
["iki"] = {"Iko"},
["ikk"] = {"Ika"},
["ikl"] = {"Ikulu"},
["iko"] = {"Olulumo-Ikom"},
["ikp"] = {"Ikpeshi"},
["ikr"] = {"Ikaranggal"},
["iks"] = {"Inuit Sign Language"},
["ikt"] = {"Inuinnaqtun", "Western Canadian Inuktitut"},
["ikv"] = {"Iku-Gora-Ankwa"},
["ikw"] = {"Ikwere"},
["ikx"] = {"Ik"},
["ikz"] = {"Ikizu"},
["ila"] = {"Ile Ape"},
["ilb"] = {"Ila"},
["ilg"] = {"Garig-Ilgar"},
["ili"] = {"Ili Turki"},
["ilk"] = {"Ilongot"},
["ilm"] = {"Iranun (Malaysia)"},
["ilo"] = {"Iloko"},
["ilp"] = {"Iranun (Philippines)"},
["ils"] = {"International Sign"},
["ilu"] = {"Ili'uun"},
["ilv"] = {"Ilue"},
["ima"] = {"Mala Malasar"},
["imi"] = {"Anamgura"},
["iml"] = {"Miluk"},
["imn"] = {"Imonda"},
["imo"] = {"Imbongu"},
["imr"] = {"Imroing"},
["ims"] = {"Marsian"},
["imt"] = {"Imotong"},
["imy"] = {"Milyan"},
["inb"] = {"Inga"},
["inc"] = {"Indic languages"},
["ine"] = {"Indo-European languages"},
["ing"] = {"Degexit'an"},
["inh"] = {"Ingush"},
["inj"] = {"Jungle Inga"},
["inl"] = {"Indonesian Sign Language"},
["inm"] = {"Minaean"},
["inn"] = {"Isinai"},
["ino"] = {"Inoke-Yate"},
["inp"] = {"Iñapari"},
["ins"] = {"Indian Sign Language"},
["int"] = {"Intha"},
["inz"] = {"Ineseño"},
["ior"] = {"Inor"},
["iou"] = {"Tuma-Irumu"},
["iow"] = {"Iowa-Oto"},
["ipi"] = {"Ipili"},
["ipo"] = {"Ipiko"},
["iqu"] = {"Iquito"},
["iqw"] = {"Ikwo"},
["ira"] = {"Iranian languages"},
["ire"] = {"Iresim"},
["irh"] = {"Irarutu"},
["iri"] = {"Rigwe", "Irigwe"},
["irk"] = {"Iraqw"},
["irn"] = {"Irántxe"},
["iro"] = {"Iroquoian languages"},
["irr"] = {"Ir"},
["iru"] = {"Irula"},
["irx"] = {"Kamberau"},
["iry"] = {"Iraya"},
["isa"] = {"Isabi"},
["isc"] = {"Isconahua"},
["isd"] = {"Isnag"},
["ise"] = {"Italian Sign Language"},
["isg"] = {"Irish Sign Language"},
["ish"] = {"Esan"},
["isi"] = {"Nkem-Nkum"},
["isk"] = {"Ishkashimi"},
["ism"] = {"Masimasi"},
["isn"] = {"Isanzu"},
["iso"] = {"Isoko"},
["isr"] = {"Israeli Sign Language"},
["ist"] = {"Istriot"},
["isu"] = {"Isu", "Isu (Menchum Division)"},
["isv"] = {"Interslavic"},
["itb"] = {"Binongan Itneg"},
["itc"] = {"Italic languages"},
["itd"] = {"Southern Tidung"},
["ite"] = {"Itene"},
["iti"] = {"Inlaod Itneg"},
["itk"] = {"Judeo-Italian"},
["itl"] = {"Itelmen"},
["itm"] = {"Itu Mbon Uzo"},
["ito"] = {"Itonama"},
["itr"] = {"Iteri"},
["its"] = {"Isekiri"},
["itt"] = {"Maeng Itneg"},
["itv"] = {"Itawit"},
["itw"] = {"Ito"},
["itx"] = {"Itik"},
["ity"] = {"Moyadan Itneg"},
["itz"] = {"Itzá"},
["ium"] = {"Iu Mien"},
["ivb"] = {"Ibatan"},
["ivv"] = {"Ivatan"},
["iwk"] = {"I-Wak"},
["iwm"] = {"Iwam"},
["iwo"] = {"Iwur"},
["iws"] = {"Sepik Iwam"},
["ixc"] = {"Ixcatec"},
["ixl"] = {"Ixil"},
["iya"] = {"Iyayu"},
["iyo"] = {"Mesaka"},
["iyx"] = {"Yaka (Congo)"},
["izh"] = {"Ingrian"},
["izm"] = {"Kizamani"},
["izr"] = {"Izere"},
["izz"] = {"Izii"},
["jaa"] = {"Jamamadí"},
["jab"] = {"Hyam"},
["jac"] = {"Popti'", "Jakalteko"},
["jad"] = {"Jahanka"},
["jae"] = {"Yabem"},
["jaf"] = {"Jara"},
["jah"] = {"Jah Hut"},
["jaj"] = {"Zazao"},
["jak"] = {"Jakun"},
["jal"] = {"Yalahatan"},
["jam"] = {"Jamaican Creole English"},
["jan"] = {"Jandai"},
["jao"] = {"Yanyuwa"},
["jaq"] = {"Yaqay"},
["jas"] = {"New Caledonian Javanese"},
["jat"] = {"Jakati"},
["jau"] = {"Yaur"},
["jax"] = {"Jambi Malay"},
["jay"] = {"Yan-nhangu", "Nhangu"},
["jaz"] = {"Jawe"},
["jbe"] = {"Judeo-Berber"},
["jbi"] = {"Badjiri"},
["jbj"] = {"Arandai"},
["jbk"] = {"Barikewa"},
["jbm"] = {"Bijim"},
["jbn"] = {"Nafusi"},
["jbo"] = {"Lojban"},
["jbr"] = {"Jofotek-Bromnya"},
["jbt"] = {"Jabutí"},
["jbu"] = {"Jukun Takum"},
["jbw"] = {"Yawijibaya"},
["jcs"] = {"Jamaican Country Sign Language"},
["jct"] = {"Krymchak"},
["jda"] = {"Jad"},
["jdg"] = {"Jadgali"},
["jdt"] = {"Judeo-Tat"},
["jeb"] = {"Jebero"},
["jee"] = {"Jerung"},
["jeh"] = {"Jeh"},
["jei"] = {"Yei"},
["jek"] = {"Jeri Kuo"},
["jel"] = {"Yelmek"},
["jen"] = {"Dza"},
["jer"] = {"Jere"},
["jet"] = {"Manem"},
["jeu"] = {"Jonkor Bourmataguil"},
["jgb"] = {"Ngbee"},
["jge"] = {"Judeo-Georgian"},
["jgk"] = {"Gwak"},
["jgo"] = {"Ngomba"},
["jhi"] = {"Jehai"},
["jhs"] = {"Jhankot Sign Language"},
["jia"] = {"Jina"},
["jib"] = {"Jibu"},
["jic"] = {"Tol"},
["jid"] = {"Bu (Kaduna State)"},
["jie"] = {"Jilbe"},
["jig"] = {"Jingulu", "Djingili"},
["jih"] = {"sTodsde", "Shangzhai"},
["jii"] = {"Jiiddu"},
["jil"] = {"Jilim"},
["jim"] = {"Jimi (Cameroon)"},
["jio"] = {"Jiamao"},
["jiq"] = {"Guanyinqiao", "Lavrung"},
["jit"] = {"Jita"},
["jiu"] = {"Youle Jinuo"},
["jiv"] = {"Shuar"},
["jiy"] = {"Buyuan Jinuo"},
["jje"] = {"Jejueo"},
["jjr"] = {"Bankal"},
["jka"] = {"Kaera"},
["jkm"] = {"Mobwa Karen"},
["jko"] = {"Kubo"},
["jkp"] = {"Paku Karen"},
["jkr"] = {"Koro (India)"},
["jks"] = {"Amami Koniya Sign Language"},
["jku"] = {"Labir"},
["jle"] = {"Ngile"},
["jls"] = {"Jamaican Sign Language"},
["jma"] = {"Dima"},
["jmb"] = {"Zumbun"},
["jmc"] = {"Machame"},
["jmd"] = {"Yamdena"},
["jmi"] = {"Jimi (Nigeria)"},
["jml"] = {"Jumli"},
["jmn"] = {"Makuri Naga"},
["jmr"] = {"Kamara"},
["jms"] = {"Mashi (Nigeria)"},
["jmw"] = {"Mouwase"},
["jmx"] = {"Western Juxtlahuaca Mixtec"},
["jna"] = {"Jangshung"},
["jnd"] = {"Jandavra"},
["jng"] = {"Yangman"},
["jni"] = {"Janji"},
["jnj"] = {"Yemsa"},
["jnl"] = {"Rawat"},
["jns"] = {"Jaunsari"},
["job"] = {"Joba"},
["jod"] = {"Wojenaka"},
["jog"] = {"Jogi"},
["jor"] = {"Jorá"},
["jos"] = {"Jordanian Sign Language"},
["jow"] = {"Jowulu"},
["jpa"] = {"Jewish Palestinian Aramaic"},
["jpr"] = {"Judeo-Persian"},
["jpx"] = {"Japanese (family)"},
["jqr"] = {"Jaqaru"},
["jra"] = {"Jarai"},
["jrb"] = {"Judeo-Arabic"},
["jrr"] = {"Jiru"},
["jrt"] = {"Jakattoe"},
["jru"] = {"Japrería"},
["jsl"] = {"Japanese Sign Language"},
["jua"] = {"Júma"},
["jub"] = {"Wannu"},
["juc"] = {"Jurchen"},
["jud"] = {"Worodougou"},
["juh"] = {"Hõne"},
["jui"] = {"Ngadjuri"},
["juk"] = {"Wapan"},
["jul"] = {"Jirel"},
["jum"] = {"Jumjum"},
["jun"] = {"Juang"},
["juo"] = {"Jiba"},
["jup"] = {"Hupdë"},
["jur"] = {"Jurúna"},
["jus"] = {"Jumla Sign Language"},
["jut"] = {"Jutish"},
["juu"] = {"Ju"},
["juw"] = {"Wãpha"},
["juy"] = {"Juray"},
["jvd"] = {"Javindo"},
["jvn"] = {"Caribbean Javanese"},
["jwi"] = {"Jwira-Pepesa"},
["jya"] = {"Jiarong"},
["jye"] = {"Judeo-Yemeni Arabic"},
["jyy"] = {"Jaya"},
["kaa"] = {"Kara-Kalpak", "Karakalpak"},
["kab"] = {"Kabyle"},
["kac"] = {"Kachin", "Jingpho"},
["kad"] = {"Adara"},
["kae"] = {"Ketangalan"},
["kaf"] = {"Katso"},
["kag"] = {"Kajaman"},
["kah"] = {"Kara (Central African Republic)"},
["kai"] = {"Karekare"},
["kaj"] = {"Jju"},
["kak"] = {"Kalanguya", "Kayapa Kallahan"},
["kam"] = {"Kamba (Kenya)"},
["kao"] = {"Xaasongaxango"},
["kap"] = {"Bezhta"},
["kaq"] = {"Capanahua"},
["kar"] = {"Karen languages"},
["kav"] = {"Katukína"},
["kaw"] = {"Kawi"},
["kax"] = {"Kao"},
["kay"] = {"Kamayurá"},
["kba"] = {"Kalarko"},
["kbb"] = {"Kaxuiâna"},
["kbc"] = {"Kadiwéu"},
["kbd"] = {"Kabardian"},
["kbe"] = {"Kanju"},
["kbg"] = {"Khamba"},
["kbh"] = {"Camsá"},
["kbi"] = {"Kaptiau"},
["kbj"] = {"Kari"},
["kbk"] = {"Grass Koiari"},
["kbl"] = {"Kanembu"},
["kbm"] = {"Iwal"},
["kbn"] = {"Kare (Central African Republic)"},
["kbo"] = {"Keliko"},
["kbp"] = {"Kabiyè"},
["kbq"] = {"Kamano"},
["kbr"] = {"Kafa"},
["kbs"] = {"Kande"},
["kbt"] = {"Abadi"},
["kbu"] = {"Kabutra"},
["kbv"] = {"Dera (Indonesia)"},
["kbw"] = {"Kaiep"},
["kbx"] = {"Ap Ma"},
["kby"] = {"Manga Kanuri"},
["kbz"] = {"Duhwa"},
["kca"] = {"Khanty"},
["kcb"] = {"Kawacha"},
["kcc"] = {"Lubila"},
["kcd"] = {"Ngkâlmpw Kanum"},
["kce"] = {"Kaivi"},
["kcf"] = {"Ukaan"},
["kcg"] = {"Tyap"},
["kch"] = {"Vono"},
["kci"] = {"Ngyian", "Kamantan"},
["kcj"] = {"Kobiana"},
["kck"] = {"Kalanga"},
["kcl"] = {"Kela (Papua New Guinea)", "Kala"},
["kcm"] = {"Gula (Central African Republic)"},
["kcn"] = {"Nubi"},
["kco"] = {"Kinalakna"},
["kcp"] = {"Kanga"},
["kcq"] = {"Kamo"},
["kcr"] = {"Katla"},
["kcs"] = {"Koenoem"},
["kct"] = {"Kaian"},
["kcu"] = {"Kami (Tanzania)"},
["kcv"] = {"Kete"},
["kcw"] = {"Kabwari"},
["kcx"] = {"Kachama-Ganjule"},
["kcy"] = {"Korandje"},
["kcz"] = {"Konongo"},
["kda"] = {"Worimi"},
["kdc"] = {"Kutu"},
["kdd"] = {"Yankunytjatjara"},
["kde"] = {"Makonde"},
["kdf"] = {"Mamusi"},
["kdg"] = {"Seba"},
["kdh"] = {"Tem"},
["kdi"] = {"Kumam"},
["kdj"] = {"Karamojong"},
["kdk"] = {"Numèè", "Kwényi"},
["kdl"] = {"Tsikimba"},
["kdm"] = {"Kagoma"},
["kdn"] = {"Kunda"},
["kdo"] = {"Kordofanian languages"},
["kdp"] = {"Kaningdon-Nindem"},
["kdq"] = {"Koch"},
["kdr"] = {"Karaim"},
["kdt"] = {"Kuy"},
["kdu"] = {"Kadaru"},
["kdw"] = {"Koneraw"},
["kdx"] = {"Kam"},
["kdy"] = {"Keder", "Keijar"},
["kdz"] = {"Kwaja"},
["kea"] = {"Kabuverdianu"},
["keb"] = {"Kélé"},
["kec"] = {"Keiga"},
["ked"] = {"Kerewe"},
["kee"] = {"Eastern Keres"},
["kef"] = {"Kpessi"},
["keg"] = {"Tese"},
["keh"] = {"Keak"},
["kei"] = {"Kei"},
["kej"] = {"Kadar"},
["kek"] = {"Kekchí"},
["kel"] = {"Kela (Democratic Republic of Congo)"},
["kem"] = {"Kemak"},
["ken"] = {"Kenyang"},
["keo"] = {"Kakwa"},
["kep"] = {"Kaikadi"},
["keq"] = {"Kamar"},
["ker"] = {"Kera"},
["kes"] = {"Kugbo"},
["ket"] = {"Ket"},
["keu"] = {"Akebu"},
["kev"] = {"Kanikkaran"},
["kew"] = {"West Kewa"},
["kex"] = {"Kukna"},
["key"] = {"Kupia"},
["kez"] = {"Kukele"},
["kfa"] = {"Kodava"},
["kfb"] = {"Northwestern Kolami"},
["kfc"] = {"Konda-Dora"},
["kfd"] = {"Korra Koraga"},
["kfe"] = {"Kota (India)"},
["kff"] = {"Koya"},
["kfg"] = {"Kudiya"},
["kfh"] = {"Kurichiya"},
["kfi"] = {"Kannada Kurumba"},
["kfj"] = {"Kemiehua"},
["kfk"] = {"Kinnauri"},
["kfl"] = {"Kung"},
["kfm"] = {"Khunsari"},
["kfn"] = {"Kuk"},
["kfo"] = {"Koro (Côte d'Ivoire)"},
["kfp"] = {"Korwa"},
["kfq"] = {"Korku"},
["kfr"] = {"Kachhi", "Kutchi"},
["kfs"] = {"Bilaspuri"},
["kft"] = {"Kanjari"},
["kfu"] = {"Katkari"},
["kfv"] = {"Kurmukar"},
["kfw"] = {"Kharam Naga"},
["kfx"] = {"Kullu Pahari"},
["kfy"] = {"Kumaoni"},
["kfz"] = {"Koromfé"},
["kga"] = {"Koyaga"},
["kgb"] = {"Kawe"},
["kge"] = {"Komering"},
["kgf"] = {"Kube"},
["kgg"] = {"Kusunda"},
["kgi"] = {"Selangor Sign Language"},
["kgj"] = {"Gamale Kham"},
["kgk"] = {"Kaiwá"},
["kgl"] = {"Kunggari"},
["kgn"] = {"Karingani"},
["kgo"] = {"Krongo"},
["kgp"] = {"Kaingang"},
["kgq"] = {"Kamoro"},
["kgr"] = {"Abun"},
["kgs"] = {"Kumbainggar"},
["kgt"] = {"Somyev"},
["kgu"] = {"Kobol"},
["kgv"] = {"Karas"},
["kgw"] = {"Karon Dori"},
["kgx"] = {"Kamaru"},
["kgy"] = {"Kyerung"},
["kha"] = {"Khasi"},
["khb"] = {"Lü"},
["khc"] = {"Tukang Besi North"},
["khd"] = {"Bädi Kanum"},
["khe"] = {"Korowai"},
["khf"] = {"Khuen"},
["khg"] = {"Khams Tibetan"},
["khh"] = {"Kehu"},
["khi"] = {"Khoisan languages"},
["khj"] = {"Kuturmi"},
["khk"] = {"Halh Mongolian"},
["khl"] = {"Lusi"},
["khn"] = {"Khandesi"},
["kho"] = {"Khotanese", "Sakan"},
["khp"] = {"Kapori", "Kapauri"},
["khq"] = {"Koyra Chiini Songhay"},
["khr"] = {"Kharia"},
["khs"] = {"Kasua"},
["kht"] = {"Khamti"},
["khu"] = {"Nkhumbi"},
["khv"] = {"Khvarshi"},
["khw"] = {"Khowar"},
["khx"] = {"Kanu"},
["khy"] = {"Kele (Democratic Republic of Congo)"},
["khz"] = {"Keapara"},
["kia"] = {"Kim"},
["kib"] = {"Koalib"},
["kic"] = {"Kickapoo"},
["kid"] = {"Koshin"},
["kie"] = {"Kibet"},
["kif"] = {"Eastern Parbate Kham"},
["kig"] = {"Kimaama", "Kimaghima"},
["kih"] = {"Kilmeri"},
["kii"] = {"Kitsai"},
["kij"] = {"Kilivila"},
["kil"] = {"Kariya"},
["kim"] = {"Karagas"},
["kio"] = {"Kiowa"},
["kip"] = {"Sheshi Kham"},
["kiq"] = {"Kosadle", "Kosare"},
["kis"] = {"Kis"},
["kit"] = {"Agob"},
["kiu"] = {"Kirmanjki (individual language)"},
["kiv"] = {"Kimbu"},
["kiw"] = {"Northeast Kiwai"},
["kix"] = {"Khiamniungan Naga"},
["kiy"] = {"Kirikiri"},
["kiz"] = {"Kisi"},
["kja"] = {"Mlap"},
["kjb"] = {"Q'anjob'al", "Kanjobal"},
["kjc"] = {"Coastal Konjo"},
["kjd"] = {"Southern Kiwai"},
["kje"] = {"Kisar"},
["kjg"] = {"Khmu"},
["kjh"] = {"Khakas"},
["kji"] = {"Zabana"},
["kjj"] = {"Khinalugh"},
["kjk"] = {"Highland Konjo"},
["kjl"] = {"Western Parbate Kham"},
["kjm"] = {"Kháng"},
["kjn"] = {"Kunjen"},
["kjo"] = {"Kinnauri Pahari"},
["kjp"] = {"Pwo Eastern Karen"},
["kjq"] = {"Western Keres"},
["kjr"] = {"Kurudu"},
["kjs"] = {"East Kewa"},
["kjt"] = {"Phrae Pwo Karen"},
["kju"] = {"Kashaya"},
["kjv"] = {"Kaikavian Literary Language"},
["kjx"] = {"Ramopa"},
["kjy"] = {"Erave"},
["kjz"] = {"Bumthangkha"},
["kka"] = {"Kakanda"},
["kkb"] = {"Kwerisa"},
["kkc"] = {"Odoodee"},
["kkd"] = {"Kinuku"},
["kke"] = {"Kakabe"},
["kkf"] = {"Kalaktang Monpa"},
["kkg"] = {"Mabaka Valley Kalinga"},
["kkh"] = {"Khün"},
["kki"] = {"Kagulu"},
["kkj"] = {"Kako"},
["kkk"] = {"Kokota"},
["kkl"] = {"Kosarek Yale"},
["kkm"] = {"Kiong"},
["kkn"] = {"Kon Keu"},
["kko"] = {"Karko"},
["kkp"] = {"Gugubera", "Koko-Bera"},
["kkq"] = {"Kaeku"},
["kkr"] = {"Kir-Balar"},
["kks"] = {"Giiwo"},
["kkt"] = {"Koi"},
["kku"] = {"Tumi"},
["kkv"] = {"Kangean"},
["kkw"] = {"Teke-Kukuya"},
["kkx"] = {"Kohin"},
["kky"] = {"Guugu Yimidhirr", "Guguyimidjir"},
["kkz"] = {"Kaska"},
["kla"] = {"Klamath-Modoc"},
["klb"] = {"Kiliwa"},
["klc"] = {"Kolbila"},
["kld"] = {"Gamilaraay"},
["kle"] = {"Kulung (Nepal)"},
["klf"] = {"Kendeje"},
["klg"] = {"Tagakaulo"},
["klh"] = {"Weliki"},
["kli"] = {"Kalumpang"},
["klj"] = {"Khalaj"},
["klk"] = {"Kono (Nigeria)"},
["kll"] = {"Kagan Kalagan"},
["klm"] = {"Migum"},
["kln"] = {"Kalenjin"},
["klo"] = {"Kapya"},
["klp"] = {"Kamasa"},
["klq"] = {"Rumu"},
["klr"] = {"Khaling"},
["kls"] = {"Kalasha"},
["klt"] = {"Nukna"},
["klu"] = {"Klao"},
["klv"] = {"Maskelynes"},
["klw"] = {"Tado", "Lindu"},
["klx"] = {"Koluwawa"},
["kly"] = {"Kalao"},
["klz"] = {"Kabola"},
["kma"] = {"Konni"},
["kmb"] = {"Kimbundu"},
["kmc"] = {"Southern Dong"},
["kmd"] = {"Majukayang Kalinga"},
["kme"] = {"Bakole"},
["kmf"] = {"Kare (Papua New Guinea)"},
["kmg"] = {"Kâte"},
["kmh"] = {"Kalam"},
["kmi"] = {"Kami (Nigeria)"},
["kmj"] = {"Kumarbhag Paharia"},
["kmk"] = {"Limos Kalinga"},
["kml"] = {"Tanudan Kalinga"},
["kmm"] = {"Kom (India)"},
["kmn"] = {"Awtuw"},
["kmo"] = {"Kwoma"},
["kmp"] = {"Gimme"},
["kmq"] = {"Kwama"},
["kmr"] = {"Northern Kurdish"},
["kms"] = {"Kamasau"},
["kmt"] = {"Kemtuik"},
["kmu"] = {"Kanite"},
["kmv"] = {"Karipúna Creole French"},
["kmw"] = {"Komo (Democratic Republic of Congo)"},
["kmx"] = {"Waboda"},
["kmy"] = {"Koma"},
["kmz"] = {"Khorasani Turkish"},
["kna"] = {"Dera (Nigeria)"},
["knb"] = {"Lubuagan Kalinga"},
["knc"] = {"Central Kanuri"},
["knd"] = {"Konda"},
["kne"] = {"Kankanaey"},
["knf"] = {"Mankanya"},
["kng"] = {"Koongo"},
["kni"] = {"Kanufi"},
["knj"] = {"Western Kanjobal"},
["knk"] = {"Kuranko"},
["knl"] = {"Keninjal"},
["knm"] = {"Kanamarí"},
["knn"] = {"Konkani (individual language)"},
["kno"] = {"Kono (Sierra Leone)"},
["knp"] = {"Kwanja"},
["knq"] = {"Kintaq"},
["knr"] = {"Kaningra"},
["kns"] = {"Kensiu"},
["knt"] = {"Panoan Katukína"},
["knu"] = {"Kono (Guinea)"},
["knv"] = {"Tabo"},
["knw"] = {"Kung-Ekoka"},
["knx"] = {"Kendayan", "Salako"},
["kny"] = {"Kanyok"},
["knz"] = {"Kalamsé"},
["koa"] = {"Konomala"},
["koc"] = {"Kpati"},
["kod"] = {"Kodi"},
["koe"] = {"Kacipo-Bale Suri"},
["kof"] = {"Kubi"},
["kog"] = {"Cogui", "Kogi"},
["koh"] = {"Koyo"},
["koi"] = {"Komi-Permyak"},
["kok"] = {"Konkani (macrolanguage)"},
["kol"] = {"Kol (Papua New Guinea)"},
["koo"] = {"Konzo"},
["kop"] = {"Waube"},
["koq"] = {"Kota (Gabon)"},
["kos"] = {"Kosraean"},
["kot"] = {"Lagwan"},
["kou"] = {"Koke"},
["kov"] = {"Kudu-Camo"},
["kow"] = {"Kugama"},
["koy"] = {"Koyukon"},
["koz"] = {"Korak"},
["kpa"] = {"Kutto"},
["kpb"] = {"Mullu Kurumba"},
["kpc"] = {"Curripaco"},
["kpd"] = {"Koba"},
["kpe"] = {"Kpelle"},
["kpf"] = {"Komba"},
["kpg"] = {"Kapingamarangi"},
["kph"] = {"Kplang"},
["kpi"] = {"Kofei"},
["kpj"] = {"Karajá"},
["kpk"] = {"Kpan"},
["kpl"] = {"Kpala"},
["kpm"] = {"Koho"},
["kpn"] = {"Kepkiriwát"},
["kpo"] = {"Ikposo"},
["kpq"] = {"Korupun-Sela"},
["kpr"] = {"Korafe-Yegha"},
["kps"] = {"Tehit"},
["kpt"] = {"Karata"},
["kpu"] = {"Kafoa"},
["kpv"] = {"Komi-Zyrian"},
["kpw"] = {"Kobon"},
["kpx"] = {"Mountain Koiali"},
["kpy"] = {"Koryak"},
["kpz"] = {"Kupsabiny"},
["kqa"] = {"Mum"},
["kqb"] = {"Kovai"},
["kqc"] = {"Doromu-Koki"},
["kqd"] = {"Koy Sanjaq Surat"},
["kqe"] = {"Kalagan"},
["kqf"] = {"Kakabai"},
["kqg"] = {"Khe"},
["kqh"] = {"Kisankasa"},
["kqi"] = {"Koitabu"},
["kqj"] = {"Koromira"},
["kqk"] = {"Kotafon Gbe"},
["kql"] = {"Kyenele"},
["kqm"] = {"Khisa"},
["kqn"] = {"Kaonde"},
["kqo"] = {"Eastern Krahn"},
["kqp"] = {"Kimré"},
["kqq"] = {"Krenak"},
["kqr"] = {"Kimaragang"},
["kqs"] = {"Northern Kissi"},
["kqt"] = {"Klias River Kadazan"},
["kqu"] = {"Seroa"},
["kqv"] = {"Okolod"},
["kqw"] = {"Kandas"},
["kqx"] = {"Mser"},
["kqy"] = {"Koorete"},
["kqz"] = {"Korana"},
["kra"] = {"Kumhali"},
["krb"] = {"Karkin"},
["krc"] = {"Karachay-Balkar"},
["krd"] = {"Kairui-Midiki"},
["kre"] = {"Panará"},
["krf"] = {"Koro (Vanuatu)"},
["krh"] = {"Kurama"},
["kri"] = {"Krio"},
["krj"] = {"Kinaray-A"},
["krk"] = {"Kerek"},
["krl"] = {"Karelian"},
["krn"] = {"Sapo"},
["kro"] = {"Kru languages"},
["krp"] = {"Durop"},
["krr"] = {"Krung"},
["krs"] = {"Gbaya (Sudan)"},
["krt"] = {"Tumari Kanuri"},
["kru"] = {"Kurukh"},
["krv"] = {"Kavet"},
["krw"] = {"Western Krahn"},
["krx"] = {"Karon"},
["kry"] = {"Kryts"},
["krz"] = {"Sota Kanum"},
["ksb"] = {"Shambala"},
["ksc"] = {"Southern Kalinga"},
["ksd"] = {"Kuanua"},
["kse"] = {"Kuni"},
["ksf"] = {"Bafia"},
["ksg"] = {"Kusaghe"},
["ksh"] = {"Kölsch"},
["ksi"] = {"Krisa", "I'saka"},
["ksj"] = {"Uare"},
["ksk"] = {"Kansa"},
["ksl"] = {"Kumalu"},
["ksm"] = {"Kumba"},
["ksn"] = {"Kasiguranin"},
["kso"] = {"Kofa"},
["ksp"] = {"Kaba"},
["ksq"] = {"Kwaami"},
["ksr"] = {"Borong"},
["kss"] = {"Southern Kisi"},
["kst"] = {"Winyé"},
["ksu"] = {"Khamyang"},
["ksv"] = {"Kusu"},
["ksw"] = {"S'gaw Karen"},
["ksx"] = {"Kedang"},
["ksy"] = {"Kharia Thar"},
["ksz"] = {"Kodaku"},
["kta"] = {"Katua"},
["ktb"] = {"Kambaata"},
["ktc"] = {"Kholok"},
["ktd"] = {"Kokata", "Kukatha"},
["kte"] = {"Nubri"},
["ktf"] = {"Kwami"},
["ktg"] = {"Kalkutung"},
["kth"] = {"Karanga"},
["kti"] = {"North Muyu"},
["ktj"] = {"Plapo Krumen"},
["ktk"] = {"Kaniet"},
["ktl"] = {"Koroshi"},
["ktm"] = {"Kurti"},
["ktn"] = {"Karitiâna"},
["kto"] = {"Kuot"},
["ktp"] = {"Kaduo"},
["ktq"] = {"Katabaga"},
["kts"] = {"South Muyu"},
["ktt"] = {"Ketum"},
["ktu"] = {"Kituba (Democratic Republic of Congo)"},
["ktv"] = {"Eastern Katu"},
["ktw"] = {"Kato"},
["ktx"] = {"Kaxararí"},
["kty"] = {"Kango (Bas-Uélé District)"},
["ktz"] = {"Juǀʼhoan", "Juǀʼhoansi"},
["kub"] = {"Kutep"},
["kuc"] = {"Kwinsu"},
["kud"] = {"'Auhelawa"},
["kue"] = {"Kuman (Papua New Guinea)"},
["kuf"] = {"Western Katu"},
["kug"] = {"Kupa"},
["kuh"] = {"Kushi"},
["kui"] = {"Kuikúro-Kalapálo", "Kalapalo"},
["kuj"] = {"Kuria"},
["kuk"] = {"Kepo'"},
["kul"] = {"Kulere"},
["kum"] = {"Kumyk"},
["kun"] = {"Kunama"},
["kuo"] = {"Kumukio"},
["kup"] = {"Kunimaipa"},
["kuq"] = {"Karipuna"},
["kus"] = {"Kusaal"},
["kut"] = {"Ktunaxa", "Ksanka", "Kutenai"},
["kuu"] = {"Upper Kuskokwim"},
["kuv"] = {"Kur"},
["kuw"] = {"Kpagua"},
["kux"] = {"Kukatja"},
["kuy"] = {"Kuuku-Ya'u"},
["kuz"] = {"Kunza"},
["kva"] = {"Bagvalal"},
["kvb"] = {"Kubu"},
["kvc"] = {"Kove"},
["kvd"] = {"Kui (Indonesia)"},
["kve"] = {"Kalabakan"},
["kvf"] = {"Kabalai"},
["kvg"] = {"Kuni-Boazi"},
["kvh"] = {"Komodo"},
["kvi"] = {"Kwang"},
["kvj"] = {"Psikye"},
["kvk"] = {"Korean Sign Language"},
["kvl"] = {"Kayaw"},
["kvm"] = {"Kendem"},
["kvn"] = {"Border Kuna"},
["kvo"] = {"Dobel"},
["kvp"] = {"Kompane"},
["kvq"] = {"Geba Karen"},
["kvr"] = {"Kerinci"},
["kvt"] = {"Lahta Karen", "Lahta"},
["kvu"] = {"Yinbaw Karen"},
["kvv"] = {"Kola"},
["kvw"] = {"Wersing"},
["kvx"] = {"Parkari Koli"},
["kvy"] = {"Yintale Karen", "Yintale"},
["kvz"] = {"Tsakwambo", "Tsaukambo"},
["kwa"] = {"Dâw"},
["kwb"] = {"Kwa"},
["kwc"] = {"Likwala"},
["kwd"] = {"Kwaio"},
["kwe"] = {"Kwerba"},
["kwf"] = {"Kwara'ae"},
["kwg"] = {"Sara Kaba Deme"},
["kwh"] = {"Kowiai"},
["kwi"] = {"Awa-Cuaiquer"},
["kwj"] = {"Kwanga"},
["kwk"] = {"Kwak'wala", "Kwakiutl"},
["kwl"] = {"Kofyar"},
["kwm"] = {"Kwambi"},
["kwn"] = {"Kwangali"},
["kwo"] = {"Kwomtari"},
["kwp"] = {"Kodia"},
["kwr"] = {"Kwer"},
["kws"] = {"Kwese"},
["kwt"] = {"Kwesten"},
["kwu"] = {"Kwakum"},
["kwv"] = {"Sara Kaba Náà"},
["kww"] = {"Kwinti"},
["kwx"] = {"Khirwar"},
["kwy"] = {"San Salvador Kongo"},
["kwz"] = {"Kwadi"},
["kxa"] = {"Kairiru"},
["kxb"] = {"Krobu"},
["kxc"] = {"Konso", "Khonso"},
["kxd"] = {"Brunei"},
["kxf"] = {"Manumanaw Karen", "Manumanaw"},
["kxh"] = {"Karo (Ethiopia)"},
["kxi"] = {"Keningau Murut"},
["kxj"] = {"Kulfa"},
["kxk"] = {"Zayein Karen"},
["kxm"] = {"Northern Khmer"},
["kxn"] = {"Kanowit-Tanjong Melanau"},
["kxo"] = {"Kanoé"},
["kxp"] = {"Wadiyara Koli"},
["kxq"] = {"Smärky Kanum"},
["kxr"] = {"Koro (Papua New Guinea)"},
["kxs"] = {"Kangjia"},
["kxt"] = {"Koiwat"},
["kxv"] = {"Kuvi"},
["kxw"] = {"Konai"},
["kxx"] = {"Likuba"},
["kxy"] = {"Kayong"},
["kxz"] = {"Kerewo"},
["kya"] = {"Kwaya"},
["kyb"] = {"Butbut Kalinga"},
["kyc"] = {"Kyaka"},
["kyd"] = {"Karey"},
["kye"] = {"Krache"},
["kyf"] = {"Kouya"},
["kyg"] = {"Keyagana"},
["kyh"] = {"Karok"},
["kyi"] = {"Kiput"},
["kyj"] = {"Karao"},
["kyk"] = {"Kamayo"},
["kyl"] = {"Kalapuya"},
["kym"] = {"Kpatili"},
["kyn"] = {"Northern Binukidnon"},
["kyo"] = {"Kelon"},
["kyp"] = {"Kang"},
["kyq"] = {"Kenga"},
["kyr"] = {"Kuruáya"},
["kys"] = {"Baram Kayan"},
["kyt"] = {"Kayagar"},
["kyu"] = {"Western Kayah"},
["kyv"] = {"Kayort"},
["kyw"] = {"Kudmali"},
["kyx"] = {"Rapoisi"},
["kyy"] = {"Kambaira"},
["kyz"] = {"Kayabí"},
["kza"] = {"Western Karaboro"},
["kzb"] = {"Kaibobo"},
["kzc"] = {"Bondoukou Kulango"},
["kzd"] = {"Kadai"},
["kze"] = {"Kosena"},
["kzf"] = {"Da'a Kaili"},
["kzg"] = {"Kikai"},
["kzi"] = {"Kelabit"},
["kzk"] = {"Kazukuru"},
["kzl"] = {"Kayeli"},
["kzm"] = {"Kais"},
["kzn"] = {"Kokola"},
["kzo"] = {"Kaningi"},
["kzp"] = {"Kaidipang"},
["kzq"] = {"Kaike"},
["kzr"] = {"Karang"},
["kzs"] = {"Sugut Dusun"},
["kzu"] = {"Kayupulau"},
["kzv"] = {"Komyandaret"},
["kzw"] = {"Karirí-Xocó"},
["kzx"] = {"Kamarian"},
["kzy"] = {"Kango (Tshopo District)"},
["kzz"] = {"Kalabra"},
["laa"] = {"Southern Subanen"},
["lab"] = {"Linear A"},
["lac"] = {"Lacandon"},
["lad"] = {"Ladino"},
["lae"] = {"Pattani"},
["laf"] = {"Lafofa"},
["lag"] = {"Rangi"},
["lah"] = {"Lahnda"},
["lai"] = {"Lambya"},
["laj"] = {"Lango (Uganda)"},
["lal"] = {"Lalia"},
["lam"] = {"Lamba"},
["lan"] = {"Laru"},
["lap"] = {"Laka (Chad)"},
["laq"] = {"Qabiao"},
["lar"] = {"Larteh"},
["las"] = {"Lama (Togo)"},
["lau"] = {"Laba"},
["law"] = {"Lauje"},
["lax"] = {"Tiwa"},
["lay"] = {"Lama Bai"},
["laz"] = {"Aribwatsa"},
["lbb"] = {"Label"},
["lbc"] = {"Lakkia"},
["lbe"] = {"Lak"},
["lbf"] = {"Tinani"},
["lbg"] = {"Laopang"},
["lbi"] = {"La'bi"},
["lbj"] = {"Ladakhi"},
["lbk"] = {"Central Bontok"},
["lbl"] = {"Libon Bikol"},
["lbm"] = {"Lodhi"},
["lbn"] = {"Rmeet"},
["lbo"] = {"Laven"},
["lbq"] = {"Wampar"},
["lbr"] = {"Lohorung"},
["lbs"] = {"Libyan Sign Language"},
["lbt"] = {"Lachi"},
["lbu"] = {"Labu"},
["lbv"] = {"Lavatbura-Lamusong"},
["lbw"] = {"Tolaki"},
["lbx"] = {"Lawangan"},
["lby"] = {"Lamalama", "Lamu-Lamu"},
["lbz"] = {"Lardil"},
["lcc"] = {"Legenyem"},
["lcd"] = {"Lola"},
["lce"] = {"Loncong", "Sekak"},
["lcf"] = {"Lubu"},
["lch"] = {"Luchazi"},
["lcl"] = {"Lisela"},
["lcm"] = {"Tungag"},
["lcp"] = {"Western Lawa"},
["lcq"] = {"Luhu"},
["lcs"] = {"Lisabata-Nuniali"},
["lda"] = {"Kla-Dan"},
["ldb"] = {"Dũya"},
["ldd"] = {"Luri"},
["ldg"] = {"Lenyima"},
["ldh"] = {"Lamja-Dengsa-Tola"},
["ldi"] = {"Laari"},
["ldj"] = {"Lemoro"},
["ldk"] = {"Leelau"},
["ldl"] = {"Kaan"},
["ldm"] = {"Landoma"},
["ldn"] = {"Láadan"},
["ldo"] = {"Loo"},
["ldp"] = {"Tso"},
["ldq"] = {"Lufu"},
["lea"] = {"Lega-Shabunda"},
["leb"] = {"Lala-Bisa"},
["lec"] = {"Leco"},
["led"] = {"Lendu"},
["lee"] = {"Lyélé"},
["lef"] = {"Lelemi"},
["leh"] = {"Lenje"},
["lei"] = {"Lemio"},
["lej"] = {"Lengola"},
["lek"] = {"Leipon"},
["lel"] = {"Lele (Democratic Republic of Congo)"},
["lem"] = {"Nomaande"},
["len"] = {"Lenca"},
["leo"] = {"Leti (Cameroon)"},
["lep"] = {"Lepcha"},
["leq"] = {"Lembena"},
["ler"] = {"Lenkau"},
["les"] = {"Lese"},
["let"] = {"Lesing-Gelimi", "Amio-Gelimi"},
["leu"] = {"Kara (Papua New Guinea)"},
["lev"] = {"Lamma"},
["lew"] = {"Ledo Kaili"},
["lex"] = {"Luang"},
["ley"] = {"Lemolang"},
["lez"] = {"Lezghian"},
["lfa"] = {"Lefa"},
["lfb"] = {"Buu (Cameroon)"},
["lfn"] = {"Lingua Franca Nova"},
["lga"] = {"Lungga"},
["lgb"] = {"Laghu"},
["lgg"] = {"Lugbara"},
["lgh"] = {"Laghuu"},
["lgi"] = {"Lengilu"},
["lgk"] = {"Lingarak", "Neverver"},
["lgl"] = {"Wala"},
["lgm"] = {"Lega-Mwenga"},
["lgn"] = {"T'apo", "Opuuo"},
["lgo"] = {"Lango (South Sudan)"},
["lgq"] = {"Logba"},
["lgr"] = {"Lengo"},
["lgs"] = {"Guinea-Bissau Sign Language", "Língua Gestual Guineense"},
["lgt"] = {"Pahi"},
["lgu"] = {"Longgu"},
["lgz"] = {"Ligenza"},
["lha"] = {"Laha (Viet Nam)"},
["lhh"] = {"Laha (Indonesia)"},
["lhi"] = {"Lahu Shi"},
["lhl"] = {"Lahul Lohar"},
["lhm"] = {"Lhomi"},
["lhn"] = {"Lahanan"},
["lhp"] = {"Lhokpu"},
["lhs"] = {"Mlahsö"},
["lht"] = {"Lo-Toga"},
["lhu"] = {"Lahu"},
["lia"] = {"West-Central Limba"},
["lib"] = {"Likum"},
["lic"] = {"Hlai"},
["lid"] = {"Nyindrou"},
["lie"] = {"Likila"},
["lif"] = {"Limbu"},
["lig"] = {"Ligbi"},
["lih"] = {"Lihir"},
["lij"] = {"Ligurian"},
["lik"] = {"Lika"},
["lil"] = {"Lillooet"},
["lio"] = {"Liki"},
["lip"] = {"Sekpele"},
["liq"] = {"Libido"},
["lir"] = {"Liberian English"},
["lis"] = {"Lisu"},
["liu"] = {"Logorik"},
["liv"] = {"Liv"},
["liw"] = {"Col"},
["lix"] = {"Liabuku"},
["liy"] = {"Banda-Bambari"},
["liz"] = {"Libinza"},
["lja"] = {"Golpa"},
["lje"] = {"Rampi"},
["lji"] = {"Laiyolo"},
["ljl"] = {"Li'o"},
["ljp"] = {"Lampung Api"},
["ljw"] = {"Yirandali"},
["ljx"] = {"Yuru"},
["lka"] = {"Lakalei"},
["lkb"] = {"Kabras", "Lukabaras"},
["lkc"] = {"Kucong"},
["lkd"] = {"Lakondê"},
["lke"] = {"Kenyi"},
["lkh"] = {"Lakha"},
["lki"] = {"Laki"},
["lkj"] = {"Remun"},
["lkl"] = {"Laeko-Libuat"},
["lkm"] = {"Kalaamaya"},
["lkn"] = {"Lakon", "Vure"},
["lko"] = {"Khayo", "Olukhayo"},
["lkr"] = {"Päri"},
["lks"] = {"Kisa", "Olushisa"},
["lkt"] = {"Lakota"},
["lku"] = {"Kungkari"},
["lky"] = {"Lokoya"},
["lla"] = {"Lala-Roba"},
["llb"] = {"Lolo"},
["llc"] = {"Lele (Guinea)"},
["lld"] = {"Ladin"},
["lle"] = {"Lele (Papua New Guinea)"},
["llf"] = {"Hermit"},
["llg"] = {"Lole"},
["llh"] = {"Lamu"},
["lli"] = {"Teke-Laali"},
["llj"] = {"Ladji Ladji"},
["llk"] = {"Lelak"},
["lll"] = {"Lilau"},
["llm"] = {"Lasalimu"},
["lln"] = {"Lele (Chad)"},
["llp"] = {"North Efate"},
["llq"] = {"Lolak"},
["lls"] = {"Lithuanian Sign Language"},
["llu"] = {"Lau"},
["llx"] = {"Lauan"},
["lma"] = {"East Limba"},
["lmb"] = {"Merei"},
["lmc"] = {"Limilngan"},
["lmd"] = {"Lumun"},
["lme"] = {"Pévé"},
["lmf"] = {"South Lembata"},
["lmg"] = {"Lamogai"},
["lmh"] = {"Lambichhong"},
["lmi"] = {"Lombi"},
["lmj"] = {"West Lembata"},
["lmk"] = {"Lamkang"},
["lml"] = {"Hano"},
["lmn"] = {"Lambadi"},
["lmo"] = {"Lombard"},
["lmp"] = {"Limbum"},
["lmq"] = {"Lamatuka"},
["lmr"] = {"Lamalera"},
["lmu"] = {"Lamenu"},
["lmv"] = {"Lomaiviti"},
["lmw"] = {"Lake Miwok"},
["lmx"] = {"Laimbue"},
["lmy"] = {"Lamboya"},
["lna"] = {"Langbashe"},
["lnb"] = {"Mbalanhu"},
["lnd"] = {"Lundayeh", "Lun Bawang"},
["lng"] = {"Langobardic"},
["lnh"] = {"Lanoh"},
["lni"] = {"Daantanai'"},
["lnj"] = {"Leningitij"},
["lnl"] = {"South Central Banda"},
["lnm"] = {"Langam"},
["lnn"] = {"Lorediakarkar"},
["lns"] = {"Lamnso'"},
["lnu"] = {"Longuda"},
["lnw"] = {"Lanima"},
["lnz"] = {"Lonzo"},
["loa"] = {"Loloda"},
["lob"] = {"Lobi"},
["loc"] = {"Inonhan"},
["loe"] = {"Saluan"},
["lof"] = {"Logol"},
["log"] = {"Logo"},
["loh"] = {"Laarim", "Narim"},
["loi"] = {"Loma (Côte d'Ivoire)"},
["loj"] = {"Lou"},
["lok"] = {"Loko"},
["lol"] = {"Mongo"},
["lom"] = {"Loma (Liberia)"},
["lon"] = {"Malawi Lomwe"},
["loo"] = {"Lombo"},
["lop"] = {"Lopa"},
["loq"] = {"Lobala"},
["lor"] = {"Téén"},
["los"] = {"Loniu"},
["lot"] = {"Otuho"},
["lou"] = {"Louisiana Creole"},
["lov"] = {"Lopi"},
["low"] = {"Tampias Lobu"},
["lox"] = {"Loun"},
["loy"] = {"Loke"},
["loz"] = {"Lozi"},
["lpa"] = {"Lelepa"},
["lpe"] = {"Lepki"},
["lpn"] = {"Long Phuri Naga"},
["lpo"] = {"Lipo"},
["lpx"] = {"Lopit"},
["lqr"] = {"Logir"},
["lra"] = {"Rara Bakati'"},
["lrc"] = {"Northern Luri"},
["lre"] = {"Laurentian"},
["lrg"] = {"Laragia"},
["lri"] = {"Marachi", "Olumarachi"},
["lrk"] = {"Loarki"},
["lrl"] = {"Lari"},
["lrm"] = {"Marama", "Olumarama"},
["lrn"] = {"Lorang"},
["lro"] = {"Laro"},
["lrr"] = {"Southern Yamphu"},
["lrt"] = {"Larantuka Malay"},
["lrv"] = {"Larevat"},
["lrz"] = {"Lemerig"},
["lsa"] = {"Lasgerdi"},
["lsb"] = {"Burundian Sign Language", "Langue des Signes Burundaise"},
["lsc"] = {"Albarradas Sign Language", "Lengua de señas Albarradas"},
["lsd"] = {"Lishana Deni"},
["lse"] = {"Lusengo"},
["lsh"] = {"Lish"},
["lsi"] = {"Lashi"},
["lsl"] = {"Latvian Sign Language"},
["lsm"] = {"Saamia", "Olusamia"},
["lsn"] = {"Tibetan Sign Language"},
["lso"] = {"Laos Sign Language"},
["lsp"] = {"Panamanian Sign Language", "Lengua de Señas Panameñas"},
["lsr"] = {"Aruop"},
["lss"] = {"Lasi"},
["lst"] = {"Trinidad and Tobago Sign Language"},
["lsv"] = {"Sivia Sign Language"},
["lsw"] = {"Seychelles Sign Language", "Lalang Siny Seselwa", "Langue des Signes Seychelloise"},
["lsy"] = {"Mauritian Sign Language"},
["ltc"] = {"Late Middle Chinese"},
["ltg"] = {"Latgalian"},
["lth"] = {"Thur"},
["lti"] = {"Leti (Indonesia)"},
["ltn"] = {"Latundê"},
["lto"] = {"Tsotso", "Olutsotso"},
["lts"] = {"Tachoni", "Lutachoni"},
["ltu"] = {"Latu"},
["lua"] = {"Luba-Lulua"},
["luc"] = {"Aringa"},
["lud"] = {"Ludian"},
["lue"] = {"Luvale"},
["luf"] = {"Laua"},
["luh"] = {"Leizhou Chinese"},
["lui"] = {"Luiseño"},
["luj"] = {"Luna"},
["luk"] = {"Lunanakha"},
["lul"] = {"Olu'bo"},
["lum"] = {"Luimbi"},
["lun"] = {"Lunda"},
["luo"] = {"Luo (Kenya and Tanzania)", "Dholuo"},
["lup"] = {"Lumbu"},
["luq"] = {"Lucumi"},
["lur"] = {"Laura"},
["lus"] = {"Lushai"},
["lut"] = {"Lushootseed"},
["luu"] = {"Lumba-Yakkha"},
["luv"] = {"Luwati"},
["luw"] = {"Luo (Cameroon)"},
["luy"] = {"Luyia", "Oluluyia"},
["luz"] = {"Southern Luri"},
["lva"] = {"Maku'a"},
["lvi"] = {"Lavi"},
["lvk"] = {"Lavukaleve"},
["lvl"] = {"Lwel"},
["lvs"] = {"Standard Latvian"},
["lvu"] = {"Levuka"},
["lwa"] = {"Lwalu"},
["lwe"] = {"Lewo Eleng"},
["lwg"] = {"Wanga", "Oluwanga"},
["lwh"] = {"White Lachi"},
["lwl"] = {"Eastern Lawa"},
["lwm"] = {"Laomian"},
["lwo"] = {"Luwo"},
["lws"] = {"Malawian Sign Language"},
["lwt"] = {"Lewotobi"},
["lwu"] = {"Lawu"},
["lww"] = {"Lewo"},
["lxm"] = {"Lakurumau"},
["lya"] = {"Layakha"},
["lyg"] = {"Lyngngam"},
["lyn"] = {"Luyana"},
["lzh"] = {"Literary Chinese"},
["lzl"] = {"Litzlitz"},
["lzn"] = {"Leinong Naga"},
["lzz"] = {"Laz"},
["maa"] = {"San Jerónimo Tecóatl Mazatec"},
["mab"] = {"Yutanduchi Mixtec"},
["mad"] = {"Madurese"},
["mae"] = {"Bo-Rukul"},
["maf"] = {"Mafa"},
["mag"] = {"Magahi"},
["mai"] = {"Maithili"},
["maj"] = {"Jalapa De Díaz Mazatec"},
["mak"] = {"Makasar"},
["mam"] = {"Mam"},
["man"] = {"Mandingo", "Manding"},
["map"] = {"Austronesian languages"},
["maq"] = {"Chiquihuitlán Mazatec"},
["mas"] = {"Masai"},
["mat"] = {"San Francisco Matlatzinca"},
["mau"] = {"Huautla Mazatec"},
["mav"] = {"Sateré-Mawé"},
["maw"] = {"Mampruli"},
["max"] = {"North Moluccan Malay"},
["maz"] = {"Central Mazahua"},
["mba"] = {"Higaonon"},
["mbb"] = {"Western Bukidnon Manobo"},
["mbc"] = {"Macushi"},
["mbd"] = {"Dibabawon Manobo"},
["mbe"] = {"Molale"},
["mbf"] = {"Baba Malay"},
["mbh"] = {"Mangseng"},
["mbi"] = {"Ilianen Manobo"},
["mbj"] = {"Nadëb"},
["mbk"] = {"Malol"},
["mbl"] = {"Maxakalí"},
["mbm"] = {"Ombamba"},
["mbn"] = {"Macaguán"},
["mbo"] = {"Mbo (Cameroon)"},
["mbp"] = {"Malayo"},
["mbq"] = {"Maisin"},
["mbr"] = {"Nukak Makú"},
["mbs"] = {"Sarangani Manobo"},
["mbt"] = {"Matigsalug Manobo"},
["mbu"] = {"Mbula-Bwazza"},
["mbv"] = {"Mbulungish"},
["mbw"] = {"Maring"},
["mbx"] = {"Mari (East Sepik Province)"},
["mby"] = {"Memoni"},
["mbz"] = {"Amoltepec Mixtec"},
["mca"] = {"Maca"},
["mcb"] = {"Machiguenga"},
["mcc"] = {"Bitur"},
["mcd"] = {"Sharanahua"},
["mce"] = {"Itundujia Mixtec"},
["mcf"] = {"Matsés"},
["mcg"] = {"Mapoyo"},
["mch"] = {"Maquiritari"},
["mci"] = {"Mese"},
["mcj"] = {"Mvanip"},
["mck"] = {"Mbunda"},
["mcl"] = {"Macaguaje"},
["mcm"] = {"Malaccan Creole Portuguese"},
["mcn"] = {"Masana"},
["mco"] = {"Coatlán Mixe"},
["mcp"] = {"Makaa"},
["mcq"] = {"Ese"},
["mcr"] = {"Menya"},
["mcs"] = {"Mambai"},
["mct"] = {"Mengisa"},
["mcu"] = {"Cameroon Mambila"},
["mcv"] = {"Minanibai"},
["mcw"] = {"Mawa (Chad)"},
["mcx"] = {"Mpiemo"},
["mcy"] = {"South Watut"},
["mcz"] = {"Mawan"},
["mda"] = {"Mada (Nigeria)"},
["mdb"] = {"Morigi"},
["mdc"] = {"Soq", "Male (Papua New Guinea)"},
["mdd"] = {"Mbum"},
["mde"] = {"Maba (Chad)"},
["mdf"] = {"Moksha"},
["mdg"] = {"Massalat"},
["mdh"] = {"Maguindanaon"},
["mdi"] = {"Mamvu"},
["mdj"] = {"Mangbetu"},
["mdk"] = {"Mangbutu"},
["mdl"] = {"Maltese Sign Language"},
["mdm"] = {"Mayogo"},
["mdn"] = {"Mbati"},
["mdp"] = {"Mbala"},
["mdq"] = {"Mbole"},
["mdr"] = {"Mandar"},
["mds"] = {"Maria (Papua New Guinea)"},
["mdt"] = {"Mbere"},
["mdu"] = {"Mboko"},
["mdv"] = {"Santa Lucía Monteverde Mixtec"},
["mdw"] = {"Mbosi"},
["mdx"] = {"Dizin"},
["mdy"] = {"Male", "Male (Ethiopia)"},
["mdz"] = {"Suruí Do Pará"},
["mea"] = {"Menka"},
["meb"] = {"Ikobi"},
["mec"] = {"Marra"},
["med"] = {"Melpa"},
["mee"] = {"Mengen"},
["mef"] = {"Megam"},
["meh"] = {"Southwestern Tlaxiaco Mixtec"},
["mei"] = {"Midob"},
["mej"] = {"Meyah"},
["mek"] = {"Mekeo"},
["mel"] = {"Central Melanau"},
["mem"] = {"Mangala"},
["men"] = {"Mende (Sierra Leone)"},
["meo"] = {"Kedah Malay"},
["mep"] = {"Miriwoong"},
["meq"] = {"Merey"},
["mer"] = {"Meru"},
["mes"] = {"Masmaje"},
["met"] = {"Mato"},
["meu"] = {"Motu"},
["mev"] = {"Mano"},
["mew"] = {"Maaka"},
["mey"] = {"Hassaniyya"},
["mez"] = {"Menominee"},
["mfa"] = {"Pattani Malay"},
["mfb"] = {"Bangka"},
["mfc"] = {"Mba"},
["mfd"] = {"Mendankwe-Nkwen"},
["mfe"] = {"Morisyen"},
["mff"] = {"Naki"},
["mfg"] = {"Mogofin"},
["mfh"] = {"Matal"},
["mfi"] = {"Wandala"},
["mfj"] = {"Mefele"},
["mfk"] = {"North Mofu"},
["mfl"] = {"Putai"},
["mfm"] = {"Marghi South"},
["mfn"] = {"Cross River Mbembe"},
["mfo"] = {"Mbe"},
["mfp"] = {"Makassar Malay"},
["mfq"] = {"Moba"},
["mfr"] = {"Marrithiyel"},
["mfs"] = {"Mexican Sign Language"},
["mft"] = {"Mokerang"},
["mfu"] = {"Mbwela"},
["mfv"] = {"Mandjak"},
["mfw"] = {"Mulaha"},
["mfx"] = {"Melo"},
["mfy"] = {"Mayo"},
["mfz"] = {"Mabaan"},
["mga"] = {"Middle Irish (900-1200)"},
["mgb"] = {"Mararit"},
["mgc"] = {"Morokodo"},
["mgd"] = {"Moru"},
["mge"] = {"Mango"},
["mgf"] = {"Maklew"},
["mgg"] = {"Mpumpong"},
["mgh"] = {"Makhuwa-Meetto"},
["mgi"] = {"Lijili"},
["mgj"] = {"Abureni"},
["mgk"] = {"Mawes"},
["mgl"] = {"Maleu-Kilenge"},
["mgm"] = {"Mambae"},
["mgn"] = {"Mbangi"},
["mgo"] = {"Meta'"},
["mgp"] = {"Magar", "Magar Dhut"},
["mgq"] = {"Malila"},
["mgr"] = {"Mambwe-Lungu"},
["mgs"] = {"Manda (Tanzania)"},
["mgt"] = {"Mongol"},
["mgu"] = {"Mailu"},
["mgv"] = {"Matengo"},
["mgw"] = {"Matumbi"},
["mgy"] = {"Mbunga"},
["mgz"] = {"Mbugwe"},
["mha"] = {"Manda (India)"},
["mhb"] = {"Mahongwe"},
["mhc"] = {"Mocho"},
["mhd"] = {"Mbugu"},
["mhe"] = {"Besisi", "Mah Meri"},
["mhf"] = {"Mamaa"},
["mhg"] = {"Margu"},
["mhi"] = {"Ma'di"},
["mhj"] = {"Mogholi"},
["mhk"] = {"Mungaka"},
["mhl"] = {"Mauwake"},
["mhm"] = {"Makhuwa-Moniga"},
["mhn"] = {"Mòcheno"},
["mho"] = {"Mashi (Zambia)"},
["mhp"] = {"Balinese Malay"},
["mhq"] = {"Mandan"},
["mhr"] = {"Eastern Mari"},
["mhs"] = {"Buru (Indonesia)"},
["mht"] = {"Mandahuaca"},
["mhu"] = {"Digaro-Mishmi", "Darang Deng"},
["mhw"] = {"Mbukushu"},
["mhx"] = {"Maru", "Lhaovo"},
["mhy"] = {"Ma'anyan"},
["mhz"] = {"Mor (Mor Islands)"},
["mia"] = {"Miami"},
["mib"] = {"Atatláhuca Mixtec"},
["mic"] = {"Mi'kmaq", "Micmac"},
["mid"] = {"Mandaic"},
["mie"] = {"Ocotepec Mixtec"},
["mif"] = {"Mofu-Gudur"},
["mig"] = {"San Miguel El Grande Mixtec"},
["mih"] = {"Chayuco Mixtec"},
["mii"] = {"Chigmecatitlán Mixtec"},
["mij"] = {"Abar", "Mungbam"},
["mik"] = {"Mikasuki"},
["mil"] = {"Peñoles Mixtec"},
["mim"] = {"Alacatlatzala Mixtec"},
["min"] = {"Minangkabau"},
["mio"] = {"Pinotepa Nacional Mixtec"},
["mip"] = {"Apasco-Apoala Mixtec"},
["miq"] = {"Mískito"},
["mir"] = {"Isthmus Mixe"},
["mis"] = {"Uncoded languages"},
["mit"] = {"Southern Puebla Mixtec"},
["miu"] = {"Cacaloxtepec Mixtec"},
["miw"] = {"Akoye"},
["mix"] = {"Mixtepec Mixtec"},
["miy"] = {"Ayutla Mixtec"},
["miz"] = {"Coatzospan Mixtec"},
["mjb"] = {"Makalero"},
["mjc"] = {"San Juan Colorado Mixtec"},
["mjd"] = {"Northwest Maidu"},
["mje"] = {"Muskum"},
["mjg"] = {"Tu"},
["mjh"] = {"Mwera (Nyasa)"},
["mji"] = {"Kim Mun"},
["mjj"] = {"Mawak"},
["mjk"] = {"Matukar"},
["mjl"] = {"Mandeali"},
["mjm"] = {"Medebur"},
["mjn"] = {"Ma (Papua New Guinea)"},
["mjo"] = {"Malankuravan"},
["mjp"] = {"Malapandaram"},
["mjq"] = {"Malaryan"},
["mjr"] = {"Malavedan"},
["mjs"] = {"Miship"},
["mjt"] = {"Sauria Paharia"},
["mju"] = {"Manna-Dora"},
["mjv"] = {"Mannan"},
["mjw"] = {"Karbi"},
["mjx"] = {"Mahali"},
["mjy"] = {"Mahican"},
["mjz"] = {"Majhi"},
["mka"] = {"Mbre"},
["mkb"] = {"Mal Paharia"},
["mkc"] = {"Siliput"},
["mke"] = {"Mawchi"},
["mkf"] = {"Miya"},
["mkg"] = {"Mak (China)"},
["mkh"] = {"Mon-Khmer languages"},
["mki"] = {"Dhatki"},
["mkj"] = {"Mokilese"},
["mkk"] = {"Byep"},
["mkl"] = {"Mokole"},
["mkm"] = {"Moklen"},
["mkn"] = {"Kupang Malay"},
["mko"] = {"Mingang Doso"},
["mkp"] = {"Moikodi"},
["mkq"] = {"Bay Miwok"},
["mkr"] = {"Malas"},
["mks"] = {"Silacayoapan Mixtec"},
["mkt"] = {"Vamale"},
["mku"] = {"Konyanka Maninka"},
["mkv"] = {"Mafea"},
["mkw"] = {"Kituba (Congo)"},
["mkx"] = {"Kinamiging Manobo"},
["mky"] = {"East Makian"},
["mkz"] = {"Makasae"},
["mla"] = {"Malo"},
["mlb"] = {"Mbule"},
["mlc"] = {"Cao Lan"},
["mle"] = {"Manambu"},
["mlf"] = {"Mal"},
["mlh"] = {"Mape"},
["mli"] = {"Malimpung"},
["mlj"] = {"Miltu"},
["mlk"] = {"Ilwana", "Kiwilwana"},
["mll"] = {"Malua Bay"},
["mlm"] = {"Mulam"},
["mln"] = {"Malango"},
["mlo"] = {"Mlomp"},
["mlp"] = {"Bargam"},
["mlq"] = {"Western Maninkakan"},
["mlr"] = {"Vame"},
["mls"] = {"Masalit"},
["mlu"] = {"To'abaita"},
["mlv"] = {"Motlav", "Mwotlap"},
["mlw"] = {"Moloko"},
["mlx"] = {"Malfaxal", "Naha'ai"},
["mlz"] = {"Malaynon"},
["mma"] = {"Mama"},
["mmb"] = {"Momina"},
["mmc"] = {"Michoacán Mazahua"},
["mmd"] = {"Maonan"},
["mme"] = {"Mae"},
["mmf"] = {"Mundat"},
["mmg"] = {"North Ambrym"},
["mmh"] = {"Mehináku"},
["mmi"] = {"Hember Avu", "Amben", "Musar"},
["mmj"] = {"Majhwar"},
["mmk"] = {"Mukha-Dora"},
["mml"] = {"Man Met"},
["mmm"] = {"Maii"},
["mmn"] = {"Mamanwa"},
["mmo"] = {"Mangga Buang"},
["mmp"] = {"Siawi"},
["mmq"] = {"Musak"},
["mmr"] = {"Western Xiangxi Miao"},
["mmt"] = {"Malalamai"},
["mmu"] = {"Mmaala"},
["mmv"] = {"Miriti"},
["mmw"] = {"Emae"},
["mmx"] = {"Madak"},
["mmy"] = {"Migaama"},
["mmz"] = {"Mabaale"},
["mna"] = {"Mbula"},
["mnb"] = {"Muna"},
["mnc"] = {"Manchu"},
["mnd"] = {"Mondé"},
["mne"] = {"Naba"},
["mnf"] = {"Mundani"},
["mng"] = {"Eastern Mnong"},
["mnh"] = {"Mono (Democratic Republic of Congo)"},
["mni"] = {"Manipuri"},
["mnj"] = {"Munji"},
["mnk"] = {"Mandinka"},
["mnl"] = {"Tiale"},
["mnm"] = {"Mapena"},
["mnn"] = {"Southern Mnong"},
["mno"] = {"Manobo languages"},
["mnp"] = {"Min Bei Chinese"},
["mnq"] = {"Minriq"},
["mnr"] = {"Mono (USA)"},
["mns"] = {"Mansi"},
["mnu"] = {"Mer"},
["mnv"] = {"Rennell-Bellona"},
["mnw"] = {"Mon"},
["mnx"] = {"Manikion"},
["mny"] = {"Manyawa"},
["mnz"] = {"Moni"},
["moa"] = {"Mwan"},
["moc"] = {"Mocoví"},
["mod"] = {"Mobilian"},
["moe"] = {"Innu", "Montagnais"},
["mog"] = {"Mongondow"},
["moh"] = {"Mohawk", "Kanien'kéha"},
["moi"] = {"Mboi"},
["moj"] = {"Monzombo"},
["mok"] = {"Morori"},
["mom"] = {"Mangue"},
["moo"] = {"Monom"},
["mop"] = {"Mopán Maya"},
["moq"] = {"Mor (Bomberai Peninsula)"},
["mor"] = {"Moro"},
["mos"] = {"Mossi"},
["mot"] = {"Barí"},
["mou"] = {"Mogum"},
["mov"] = {"Mohave"},
["mow"] = {"Moi (Congo)"},
["mox"] = {"Molima"},
["moy"] = {"Shekkacho"},
["moz"] = {"Mukulu", "Gergiko"},
["mpa"] = {"Mpoto"},
["mpb"] = {"Malak Malak", "Mullukmulluk"},
["mpc"] = {"Mangarrayi"},
["mpd"] = {"Machinere"},
["mpe"] = {"Majang"},
["mpg"] = {"Marba"},
["mph"] = {"Maung"},
["mpi"] = {"Mpade"},
["mpj"] = {"Martu Wangka", "Wangkajunga"},
["mpk"] = {"Mbara (Chad)"},
["mpl"] = {"Middle Watut"},
["mpm"] = {"Yosondúa Mixtec"},
["mpn"] = {"Mindiri"},
["mpo"] = {"Miu"},
["mpp"] = {"Migabac"},
["mpq"] = {"Matís"},
["mpr"] = {"Vangunu"},
["mps"] = {"Dadibi"},
["mpt"] = {"Mian"},
["mpu"] = {"Makuráp"},
["mpv"] = {"Mungkip"},
["mpw"] = {"Mapidian"},
["mpx"] = {"Misima-Panaeati"},
["mpy"] = {"Mapia"},
["mpz"] = {"Mpi"},
["mqa"] = {"Maba (Indonesia)"},
["mqb"] = {"Mbuko"},
["mqc"] = {"Mangole"},
["mqe"] = {"Matepi"},
["mqf"] = {"Momuna"},
["mqg"] = {"Kota Bangun Kutai Malay"},
["mqh"] = {"Tlazoyaltepec Mixtec"},
["mqi"] = {"Mariri"},
["mqj"] = {"Mamasa"},
["mqk"] = {"Rajah Kabunsuwan Manobo"},
["mql"] = {"Mbelime"},
["mqm"] = {"South Marquesan"},
["mqn"] = {"Moronene"},
["mqo"] = {"Modole"},
["mqp"] = {"Manipa"},
["mqq"] = {"Minokok"},
["mqr"] = {"Mander"},
["mqs"] = {"West Makian"},
["mqt"] = {"Mok"},
["mqu"] = {"Mandari"},
["mqv"] = {"Mosimo"},
["mqw"] = {"Murupi"},
["mqx"] = {"Mamuju"},
["mqy"] = {"Manggarai"},
["mqz"] = {"Pano"},
["mra"] = {"Mlabri"},
["mrb"] = {"Marino"},
["mrc"] = {"Maricopa"},
["mre"] = {"Martha's Vineyard Sign Language"},
["mrf"] = {"Elseng"},
["mrg"] = {"Mising"},
["mrh"] = {"Mara", "Shendu"},
["mrj"] = {"Western Mari"},
["mrk"] = {"Hmwaveke"},
["mrl"] = {"Mortlockese"},
["mrm"] = {"Merlav", "Mwerlap"},
["mrn"] = {"Cheke Holo"},
["mro"] = {"Mru"},
["mrp"] = {"Morouas"},
["mrq"] = {"North Marquesan"},
["mrr"] = {"Maria (India)"},
["mrs"] = {"Maragus"},
["mrt"] = {"Marghi Central"},
["mru"] = {"Mono (Cameroon)"},
["mrv"] = {"Mangareva"},
["mrw"] = {"Maranao"},
["mrx"] = {"Maremgi", "Dineor"},
["mry"] = {"Mandaya"},
["mrz"] = {"Marind"},
["msb"] = {"Masbatenyo"},
["msc"] = {"Sankaran Maninka"},
["msd"] = {"Yucatec Maya Sign Language"},
["mse"] = {"Musey"},
["msf"] = {"Mekwei"},
["msg"] = {"Moraid"},
["msh"] = {"Masikoro Malagasy"},
["msi"] = {"Sabah Malay"},
["msj"] = {"Ma (Democratic Republic of Congo)"},
["msk"] = {"Mansaka"},
["msl"] = {"Molof", "Poule"},
["msm"] = {"Agusan Manobo"},
["msn"] = {"Vurës"},
["mso"] = {"Mombum"},
["msp"] = {"Maritsauá"},
["msq"] = {"Caac"},
["msr"] = {"Mongolian Sign Language"},
["mss"] = {"West Masela"},
["msu"] = {"Musom"},
["msv"] = {"Maslam"},
["msw"] = {"Mansoanka"},
["msx"] = {"Moresada"},
["msy"] = {"Aruamu"},
["msz"] = {"Momare"},
["mta"] = {"Cotabato Manobo"},
["mtb"] = {"Anyin Morofo"},
["mtc"] = {"Munit"},
["mtd"] = {"Mualang"},
["mte"] = {"Mono (Solomon Islands)"},
["mtf"] = {"Murik (Papua New Guinea)"},
["mtg"] = {"Una"},
["mth"] = {"Munggui"},
["mti"] = {"Maiwa (Papua New Guinea)"},
["mtj"] = {"Moskona"},
["mtk"] = {"Mbe'"},
["mtl"] = {"Montol"},
["mtm"] = {"Mator"},
["mtn"] = {"Matagalpa"},
["mto"] = {"Totontepec Mixe"},
["mtp"] = {"Wichí Lhamtés Nocten"},
["mtq"] = {"Muong"},
["mtr"] = {"Mewari"},
["mts"] = {"Yora"},
["mtt"] = {"Mota"},
["mtu"] = {"Tututepec Mixtec"},
["mtv"] = {"Asaro'o"},
["mtw"] = {"Southern Binukidnon"},
["mtx"] = {"Tidaá Mixtec"},
["mty"] = {"Nabi"},
["mua"] = {"Mundang"},
["mub"] = {"Mubi"},
["muc"] = {"Ajumbu"},
["mud"] = {"Mednyj Aleut"},
["mue"] = {"Media Lengua"},
["mug"] = {"Musgu"},
["muh"] = {"Mündü"},
["mui"] = {"Musi"},
["muj"] = {"Mabire"},
["muk"] = {"Mugom"},
["mul"] = {"Multiple languages"},
["mum"] = {"Maiwala"},
["mun"] = {"Munda languages"},
["muo"] = {"Nyong"},
["mup"] = {"Malvi"},
["muq"] = {"Eastern Xiangxi Miao"},
["mur"] = {"Murle"},
["mus"] = {"Creek"},
["mut"] = {"Western Muria"},
["muu"] = {"Yaaku"},
["muv"] = {"Muthuvan"},
["mux"] = {"Bo-Ung"},
["muy"] = {"Muyang"},
["muz"] = {"Mursi"},
["mva"] = {"Manam"},
["mvb"] = {"Mattole"},
["mvd"] = {"Mamboru"},
["mve"] = {"Marwari (Pakistan)"},
["mvf"] = {"Peripheral Mongolian"},
["mvg"] = {"Yucuañe Mixtec"},
["mvh"] = {"Mulgi"},
["mvi"] = {"Miyako"},
["mvk"] = {"Mekmek"},
["mvl"] = {"Mbara (Australia)"},
["mvn"] = {"Minaveha"},
["mvo"] = {"Marovo"},
["mvp"] = {"Duri"},
["mvq"] = {"Moere"},
["mvr"] = {"Marau"},
["mvs"] = {"Massep"},
["mvt"] = {"Mpotovoro"},
["mvu"] = {"Marfa"},
["mvv"] = {"Tagal Murut"},
["mvw"] = {"Machinga"},
["mvx"] = {"Meoswar"},
["mvy"] = {"Indus Kohistani"},
["mvz"] = {"Mesqan"},
["mwa"] = {"Mwatebu"},
["mwb"] = {"Juwal"},
["mwc"] = {"Are"},
["mwe"] = {"Mwera (Chimwera)"},
["mwf"] = {"Murrinh-Patha"},
["mwg"] = {"Aiklep"},
["mwh"] = {"Mouk-Aria"},
["mwi"] = {"Labo", "Ninde"},
["mwk"] = {"Kita Maninkakan"},
["mwl"] = {"Mirandese"},
["mwm"] = {"Sar"},
["mwn"] = {"Nyamwanga"},
["mwo"] = {"Central Maewo"},
["mwp"] = {"Kala Lagaw Ya"},
["mwq"] = {"Mün Chin"},
["mwr"] = {"Marwari"},
["mws"] = {"Mwimbi-Muthambi"},
["mwt"] = {"Moken"},
["mwu"] = {"Mittu"},
["mwv"] = {"Mentawai"},
["mww"] = {"Hmong Daw"},
["mwz"] = {"Moingi"},
["mxa"] = {"Northwest Oaxaca Mixtec"},
["mxb"] = {"Tezoatlán Mixtec"},
["mxc"] = {"Manyika"},
["mxd"] = {"Modang"},
["mxe"] = {"Mele-Fila"},
["mxf"] = {"Malgbe"},
["mxg"] = {"Mbangala"},
["mxh"] = {"Mvuba"},
["mxi"] = {"Mozarabic"},
["mxj"] = {"Miju-Mishmi", "Geman Deng"},
["mxk"] = {"Monumbo"},
["mxl"] = {"Maxi Gbe"},
["mxm"] = {"Meramera"},
["mxn"] = {"Moi (Indonesia)"},
["mxo"] = {"Mbowe"},
["mxp"] = {"Tlahuitoltepec Mixe"},
["mxq"] = {"Juquila Mixe"},
["mxr"] = {"Murik (Malaysia)"},
["mxs"] = {"Huitepec Mixtec"},
["mxt"] = {"Jamiltepec Mixtec"},
["mxu"] = {"Mada (Cameroon)"},
["mxv"] = {"Metlatónoc Mixtec"},
["mxw"] = {"Namo"},
["mxx"] = {"Mahou", "Mawukakan"},
["mxy"] = {"Southeastern Nochixtlán Mixtec"},
["mxz"] = {"Central Masela"},
["myb"] = {"Mbay"},
["myc"] = {"Mayeka"},
["mye"] = {"Myene"},
["myf"] = {"Bambassi"},
["myg"] = {"Manta"},
["myh"] = {"Makah"},
["myj"] = {"Mangayat"},
["myk"] = {"Mamara Senoufo"},
["myl"] = {"Moma"},
["mym"] = {"Me'en"},
["myn"] = {"Mayan languages"},
["myo"] = {"Anfillo"},
["myp"] = {"Pirahã"},
["myr"] = {"Muniche"},
["mys"] = {"Mesmes"},
["myu"] = {"Mundurukú"},
["myv"] = {"Erzya"},
["myw"] = {"Muyuw"},
["myx"] = {"Masaaba"},
["myy"] = {"Macuna"},
["myz"] = {"Classical Mandaic"},
["mza"] = {"Santa María Zacatepec Mixtec"},
["mzb"] = {"Tumzabt"},
["mzc"] = {"Madagascar Sign Language"},
["mzd"] = {"Malimba"},
["mze"] = {"Morawa"},
["mzg"] = {"Monastic Sign Language"},
["mzh"] = {"Wichí Lhamtés Güisnay"},
["mzi"] = {"Ixcatlán Mazatec"},
["mzj"] = {"Manya"},
["mzk"] = {"Nigeria Mambila"},
["mzl"] = {"Mazatlán Mixe"},
["mzm"] = {"Mumuye"},
["mzn"] = {"Mazanderani"},
["mzo"] = {"Matipuhy"},
["mzp"] = {"Movima"},
["mzq"] = {"Mori Atas"},
["mzr"] = {"Marúbo"},
["mzs"] = {"Macanese"},
["mzt"] = {"Mintil"},
["mzu"] = {"Inapang"},
["mzv"] = {"Manza"},
["mzw"] = {"Deg"},
["mzx"] = {"Mawayana"},
["mzy"] = {"Mozambican Sign Language"},
["mzz"] = {"Maiadomu"},
["naa"] = {"Namla"},
["nab"] = {"Southern Nambikuára"},
["nac"] = {"Narak"},
["nae"] = {"Naka'ela"},
["naf"] = {"Nabak"},
["nag"] = {"Naga Pidgin"},
["nah"] = {"Nahuatl languages"},
["nai"] = {"North American Indian languages"},
["naj"] = {"Nalu"},
["nak"] = {"Nakanai"},
["nal"] = {"Nalik"},
["nam"] = {"Ngan'gityemerri"},
["nan"] = {"Min Nan Chinese"},
["nao"] = {"Naaba"},
["nap"] = {"Neapolitan"},
["naq"] = {"Khoekhoe", "Nama (Namibia)"},
["nar"] = {"Iguta"},
["nas"] = {"Naasioi"},
["nat"] = {"Ca̱hungwa̱rya̱", "Hungworo"},
["naw"] = {"Nawuri"},
["nax"] = {"Nakwi"},
["nay"] = {"Ngarrindjeri"},
["naz"] = {"Coatepec Nahuatl"},
["nba"] = {"Nyemba"},
["nbb"] = {"Ndoe"},
["nbc"] = {"Chang Naga"},
["nbd"] = {"Ngbinda"},
["nbe"] = {"Konyak Naga"},
["nbg"] = {"Nagarchal"},
["nbh"] = {"Ngamo"},
["nbi"] = {"Mao Naga"},
["nbj"] = {"Ngarinyman"},
["nbk"] = {"Nake"},
["nbm"] = {"Ngbaka Ma'bo"},
["nbn"] = {"Kuri"},
["nbo"] = {"Nkukoli"},
["nbp"] = {"Nnam"},
["nbq"] = {"Nggem"},
["nbr"] = {"Numana"},
["nbs"] = {"Namibian Sign Language"},
["nbt"] = {"Na"},
["nbu"] = {"Rongmei Naga"},
["nbv"] = {"Ngamambo"},
["nbw"] = {"Southern Ngbandi"},
["nby"] = {"Ningera"},
["nca"] = {"Iyo"},
["ncb"] = {"Central Nicobarese"},
["ncc"] = {"Ponam"},
["ncd"] = {"Nachering"},
["nce"] = {"Yale"},
["ncf"] = {"Notsi"},
["ncg"] = {"Nisga'a"},
["nch"] = {"Central Huasteca Nahuatl"},
["nci"] = {"Classical Nahuatl"},
["ncj"] = {"Northern Puebla Nahuatl"},
["nck"] = {"Na-kara"},
["ncl"] = {"Michoacán Nahuatl"},
["ncm"] = {"Nambo"},
["ncn"] = {"Nauna"},
["nco"] = {"Sibe"},
["ncq"] = {"Northern Katang"},
["ncr"] = {"Ncane"},
["ncs"] = {"Nicaraguan Sign Language"},
["nct"] = {"Chothe Naga"},
["ncu"] = {"Chumburung"},
["ncx"] = {"Central Puebla Nahuatl"},
["ncz"] = {"Natchez"},
["nda"] = {"Ndasa"},
["ndb"] = {"Kenswei Nsei"},
["ndc"] = {"Ndau"},
["ndd"] = {"Nde-Nsele-Nta"},
["ndf"] = {"Nadruvian"},
["ndg"] = {"Ndengereko"},
["ndh"] = {"Ndali"},
["ndi"] = {"Samba Leko"},
["ndj"] = {"Ndamba"},
["ndk"] = {"Ndaka"},
["ndl"] = {"Ndolo"},
["ndm"] = {"Ndam"},
["ndn"] = {"Ngundi"},
["ndp"] = {"Ndo"},
["ndq"] = {"Ndombe"},
["ndr"] = {"Ndoola"},
["nds"] = {"Low German", "Low Saxon"},
["ndt"] = {"Ndunga"},
["ndu"] = {"Dugun"},
["ndv"] = {"Ndut"},
["ndw"] = {"Ndobo"},
["ndx"] = {"Nduga"},
["ndy"] = {"Lutos"},
["ndz"] = {"Ndogo"},
["nea"] = {"Eastern Ngad'a"},
["neb"] = {"Toura (Côte d'Ivoire)"},
["nec"] = {"Nedebang"},
["ned"] = {"Nde-Gbite"},
["nee"] = {"Nêlêmwa-Nixumwak"},
["nef"] = {"Nefamese"},
["neg"] = {"Negidal"},
["neh"] = {"Nyenkha"},
["nei"] = {"Neo-Hittite"},
["nej"] = {"Neko"},
["nek"] = {"Neku"},
["nem"] = {"Nemi"},
["nen"] = {"Nengone"},
["neo"] = {"Ná-Meo"},
["neq"] = {"North Central Mixe"},
["ner"] = {"Yahadian"},
["nes"] = {"Bhoti Kinnauri"},
["net"] = {"Nete"},
["neu"] = {"Neo"},
["nev"] = {"Nyaheun"},
["new"] = {"Nepal Bhasa", "Newar", "Newari"},
["nex"] = {"Neme"},
["ney"] = {"Neyo"},
["nez"] = {"Nez Perce"},
["nfa"] = {"Dhao"},
["nfd"] = {"Ahwai"},
["nfl"] = {"Ayiwo", "Äiwoo"},
["nfr"] = {"Nafaanra"},
["nfu"] = {"Mfumte"},
["nga"] = {"Ngbaka"},
["ngb"] = {"Northern Ngbandi"},
["ngc"] = {"Ngombe (Democratic Republic of Congo)"},
["ngd"] = {"Ngando (Central African Republic)"},
["nge"] = {"Ngemba"},
["ngf"] = {"Trans-New Guinea languages"},
["ngg"] = {"Ngbaka Manza"},
["ngh"] = {"Nǁng"},
["ngi"] = {"Ngizim"},
["ngj"] = {"Ngie"},
["ngk"] = {"Dalabon"},
["ngl"] = {"Lomwe"},
["ngm"] = {"Ngatik Men's Creole"},
["ngn"] = {"Ngwo"},
["ngp"] = {"Ngulu"},
["ngq"] = {"Ngurimi", "Ngoreme"},
["ngr"] = {"Engdewu"},
["ngs"] = {"Gvoko"},
["ngt"] = {"Kriang", "Ngeq"},
["ngu"] = {"Guerrero Nahuatl"},
["ngv"] = {"Nagumi"},
["ngw"] = {"Ngwaba"},
["ngx"] = {"Nggwahyi"},
["ngy"] = {"Tibea"},
["ngz"] = {"Ngungwel"},
["nha"] = {"Nhanda"},
["nhb"] = {"Beng"},
["nhc"] = {"Tabasco Nahuatl"},
["nhd"] = {"Chiripá", "Ava Guaraní"},
["nhe"] = {"Eastern Huasteca Nahuatl"},
["nhf"] = {"Nhuwala"},
["nhg"] = {"Tetelcingo Nahuatl"},
["nhh"] = {"Nahari"},
["nhi"] = {"Zacatlán-Ahuacatlán-Tepetzintla Nahuatl"},
["nhk"] = {"Isthmus-Cosoleacaque Nahuatl"},
["nhm"] = {"Morelos Nahuatl"},
["nhn"] = {"Central Nahuatl"},
["nho"] = {"Takuu"},
["nhp"] = {"Isthmus-Pajapan Nahuatl"},
["nhq"] = {"Huaxcaleca Nahuatl"},
["nhr"] = {"Naro"},
["nht"] = {"Ometepec Nahuatl"},
["nhu"] = {"Noone"},
["nhv"] = {"Temascaltepec Nahuatl"},
["nhw"] = {"Western Huasteca Nahuatl"},
["nhx"] = {"Isthmus-Mecayapan Nahuatl"},
["nhy"] = {"Northern Oaxaca Nahuatl"},
["nhz"] = {"Santa María La Alta Nahuatl"},
["nia"] = {"Nias"},
["nib"] = {"Nakame"},
["nic"] = {"Niger-Kordofanian languages"},
["nid"] = {"Ngandi"},
["nie"] = {"Niellim"},
["nif"] = {"Nek"},
["nig"] = {"Ngalakgan"},
["nih"] = {"Nyiha (Tanzania)"},
["nii"] = {"Nii"},
["nij"] = {"Ngaju"},
["nik"] = {"Southern Nicobarese"},
["nil"] = {"Nila"},
["nim"] = {"Nilamba"},
["nin"] = {"Ninzo"},
["nio"] = {"Nganasan"},
["niq"] = {"Nandi"},
["nir"] = {"Nimboran"},
["nis"] = {"Nimi"},
["nit"] = {"Southeastern Kolami"},
["niu"] = {"Niuean"},
["niv"] = {"Gilyak"},
["niw"] = {"Nimo"},
["nix"] = {"Hema"},
["niy"] = {"Ngiti"},
["niz"] = {"Ningil"},
["nja"] = {"Nzanyi"},
["njb"] = {"Nocte Naga"},
["njd"] = {"Ndonde Hamba"},
["njh"] = {"Lotha Naga"},
["nji"] = {"Gudanji"},
["njj"] = {"Njen"},
["njl"] = {"Njalgulgule"},
["njm"] = {"Angami Naga"},
["njn"] = {"Liangmai Naga"},
["njo"] = {"Ao Naga"},
["njr"] = {"Njerep"},
["njs"] = {"Nisa"},
["njt"] = {"Ndyuka-Trio Pidgin"},
["nju"] = {"Ngadjunmaya"},
["njx"] = {"Kunyi"},
["njy"] = {"Njyem"},
["njz"] = {"Nyishi"},
["nka"] = {"Nkoya"},
["nkb"] = {"Khoibu Naga"},
["nkc"] = {"Nkongho"},
["nkd"] = {"Koireng"},
["nke"] = {"Duke"},
["nkf"] = {"Inpui Naga"},
["nkg"] = {"Nekgini"},
["nkh"] = {"Khezha Naga"},
["nki"] = {"Thangal Naga"},
["nkj"] = {"Nakai"},
["nkk"] = {"Nokuku"},
["nkm"] = {"Namat"},
["nkn"] = {"Nkangala"},
["nko"] = {"Nkonya"},
["nkp"] = {"Niuatoputapu"},
["nkq"] = {"Nkami"},
["nkr"] = {"Nukuoro"},
["nks"] = {"North Asmat"},
["nkt"] = {"Nyika (Tanzania)"},
["nku"] = {"Bouna Kulango"},
["nkv"] = {"Nyika (Malawi and Zambia)"},
["nkw"] = {"Nkutu"},
["nkx"] = {"Nkoroo"},
["nkz"] = {"Nkari"},
["nla"] = {"Ngombale"},
["nlc"] = {"Nalca"},
["nle"] = {"East Nyala"},
["nlg"] = {"Gela"},
["nli"] = {"Grangali"},
["nlj"] = {"Nyali"},
["nlk"] = {"Ninia Yali"},
["nll"] = {"Nihali"},
["nlm"] = {"Mankiyali"},
["nlo"] = {"Ngul"},
["nlq"] = {"Lao Naga"},
["nlu"] = {"Nchumbulu"},
["nlv"] = {"Orizaba Nahuatl"},
["nlw"] = {"Walangama"},
["nlx"] = {"Nahali"},
["nly"] = {"Nyamal"},
["nlz"] = {"Nalögo"},
["nma"] = {"Maram Naga"},
["nmb"] = {"Big Nambas", "V'ënen Taut"},
["nmc"] = {"Ngam"},
["nmd"] = {"Ndumu"},
["nme"] = {"Mzieme Naga"},
["nmf"] = {"Tangkhul Naga (India)"},
["nmg"] = {"Kwasio"},
["nmh"] = {"Monsang Naga"},
["nmi"] = {"Nyam"},
["nmj"] = {"Ngombe (Central African Republic)"},
["nmk"] = {"Namakura"},
["nml"] = {"Ndemli"},
["nmm"] = {"Manangba"},
["nmn"] = {"ǃXóõ"},
["nmo"] = {"Moyon Naga"},
["nmp"] = {"Nimanbur"},
["nmq"] = {"Nambya"},
["nmr"] = {"Nimbari"},
["nms"] = {"Letemboi"},
["nmt"] = {"Namonuito"},
["nmu"] = {"Northeast Maidu"},
["nmv"] = {"Ngamini"},
["nmw"] = {"Nimoa", "Rifao"},
["nmx"] = {"Nama (Papua New Guinea)"},
["nmy"] = {"Namuyi"},
["nmz"] = {"Nawdm"},
["nna"] = {"Nyangumarta"},
["nnb"] = {"Nande"},
["nnc"] = {"Nancere"},
["nnd"] = {"West Ambae"},
["nne"] = {"Ngandyera"},
["nnf"] = {"Ngaing"},
["nng"] = {"Maring Naga"},
["nnh"] = {"Ngiemboon"},
["nni"] = {"North Nuaulu"},
["nnj"] = {"Nyangatom"},
["nnk"] = {"Nankina"},
["nnl"] = {"Northern Rengma Naga"},
["nnm"] = {"Namia"},
["nnn"] = {"Ngete"},
["nnp"] = {"Wancho Naga"},
["nnq"] = {"Ngindo"},
["nnr"] = {"Narungga"},
["nnt"] = {"Nanticoke"},
["nnu"] = {"Dwang"},
["nnv"] = {"Nugunu (Australia)"},
["nnw"] = {"Southern Nuni"},
["nny"] = {"Nyangga"},
["nnz"] = {"Nda'nda'"},
["noa"] = {"Woun Meu"},
["noc"] = {"Nuk"},
["nod"] = {"Northern Thai"},
["noe"] = {"Nimadi"},
["nof"] = {"Nomane"},
["nog"] = {"Nogai"},
["noh"] = {"Nomu"},
["noi"] = {"Noiri"},
["noj"] = {"Nonuya"},
["nok"] = {"Nooksack", "Lhéchelesem"},
["nol"] = {"Nomlaki"},
["non"] = {"Old Norse"},
["nop"] = {"Numanggang"},
["noq"] = {"Ngongo"},
["nos"] = {"Eastern Nisu"},
["not"] = {"Nomatsiguenga"},
["nou"] = {"Ewage-Notu"},
["nov"] = {"Novial"},
["now"] = {"Nyambo"},
["noy"] = {"Noy"},
["noz"] = {"Nayi"},
["npa"] = {"Nar Phu"},
["npb"] = {"Nupbikha"},
["npg"] = {"Ponyo-Gongwang Naga"},
["nph"] = {"Phom Naga"},
["npi"] = {"Nepali (individual language)"},
["npl"] = {"Southeastern Puebla Nahuatl"},
["npn"] = {"Mondropolon"},
["npo"] = {"Pochuri Naga"},
["nps"] = {"Nipsan"},
["npu"] = {"Puimei Naga"},
["npx"] = {"Noipx"},
["npy"] = {"Napu"},
["nqg"] = {"Southern Nago"},
["nqk"] = {"Kura Ede Nago"},
["nql"] = {"Ngendelengo"},
["nqm"] = {"Ndom"},
["nqn"] = {"Nen"},
["nqo"] = {"N'Ko", "N’Ko"},
["nqq"] = {"Kyan-Karyaw Naga"},
["nqt"] = {"Nteng"},
["nqy"] = {"Akyaung Ari Naga"},
["nra"] = {"Ngom"},
["nrb"] = {"Nara"},
["nrc"] = {"Noric"},
["nre"] = {"Southern Rengma Naga"},
["nrf"] = {"Jèrriais", "Guernésiais", "Sercquiais"},
["nrg"] = {"Narango"},
["nri"] = {"Chokri Naga"},
["nrk"] = {"Ngarla"},
["nrl"] = {"Ngarluma"},
["nrm"] = {"Narom"},
["nrn"] = {"Norn"},
["nrp"] = {"North Picene"},
["nrr"] = {"Norra", "Nora"},
["nrt"] = {"Northern Kalapuya"},
["nru"] = {"Narua"},
["nrx"] = {"Ngurmbur"},
["nrz"] = {"Lala"},
["nsa"] = {"Sangtam Naga"},
["nsb"] = {"Lower Nossob"},
["nsc"] = {"Nshi"},
["nsd"] = {"Southern Nisu"},
["nse"] = {"Nsenga"},
["nsf"] = {"Northwestern Nisu"},
["nsg"] = {"Ngasa"},
["nsh"] = {"Ngoshie"},
["nsi"] = {"Nigerian Sign Language"},
["nsk"] = {"Naskapi"},
["nsl"] = {"Norwegian Sign Language"},
["nsm"] = {"Sumi Naga"},
["nsn"] = {"Nehan"},
["nso"] = {"Pedi", "Northern Sotho", "Sepedi"},
["nsp"] = {"Nepalese Sign Language"},
["nsq"] = {"Northern Sierra Miwok"},
["nsr"] = {"Maritime Sign Language"},
["nss"] = {"Nali"},
["nst"] = {"Tase Naga"},
["nsu"] = {"Sierra Negra Nahuatl"},
["nsv"] = {"Southwestern Nisu"},
["nsw"] = {"Navut"},
["nsx"] = {"Nsongo"},
["nsy"] = {"Nasal"},
["nsz"] = {"Nisenan"},
["ntd"] = {"Northern Tidung"},
["ntg"] = {"Ngantangarra"},
["nti"] = {"Natioro"},
["ntj"] = {"Ngaanyatjarra"},
["ntk"] = {"Ikoma-Nata-Isenye"},
["ntm"] = {"Nateni"},
["nto"] = {"Ntomba"},
["ntp"] = {"Northern Tepehuan"},
["ntr"] = {"Delo"},
["ntu"] = {"Natügu"},
["ntw"] = {"Nottoway"},
["ntx"] = {"Tangkhul Naga (Myanmar)"},
["nty"] = {"Mantsi"},
["ntz"] = {"Natanzi"},
["nua"] = {"Yuanga"},
["nub"] = {"Nubian languages"},
["nuc"] = {"Nukuini"},
["nud"] = {"Ngala"},
["nue"] = {"Ngundu"},
["nuf"] = {"Nusu"},
["nug"] = {"Nungali"},
["nuh"] = {"Ndunda"},
["nui"] = {"Ngumbi"},
["nuj"] = {"Nyole"},
["nuk"] = {"Nuu-chah-nulth", "Nuuchahnulth"},
["nul"] = {"Nusa Laut"},
["num"] = {"Niuafo'ou"},
["nun"] = {"Anong"},
["nuo"] = {"Nguôn"},
["nup"] = {"Nupe-Nupe-Tako"},
["nuq"] = {"Nukumanu"},
["nur"] = {"Nukuria"},
["nus"] = {"Nuer"},
["nut"] = {"Nung (Viet Nam)"},
["nuu"] = {"Ngbundu"},
["nuv"] = {"Northern Nuni"},
["nuw"] = {"Nguluwan"},
["nux"] = {"Mehek"},
["nuy"] = {"Nunggubuyu"},
["nuz"] = {"Tlamacazapa Nahuatl"},
["nvh"] = {"Nasarian"},
["nvm"] = {"Namiae"},
["nvo"] = {"Nyokon"},
["nwa"] = {"Nawathinehena"},
["nwb"] = {"Nyabwa"},
["nwc"] = {"Classical Newari", "Classical Nepal Bhasa", "Old Newari"},
["nwe"] = {"Ngwe"},
["nwg"] = {"Ngayawung"},
["nwi"] = {"Southwest Tanna"},
["nwm"] = {"Nyamusa-Molo"},
["nwo"] = {"Nauo"},
["nwr"] = {"Nawaru"},
["nww"] = {"Ndwewe"},
["nwx"] = {"Middle Newar"},
["nwy"] = {"Nottoway-Meherrin"},
["nxa"] = {"Nauete"},
["nxd"] = {"Ngando (Democratic Republic of Congo)"},
["nxe"] = {"Nage"},
["nxg"] = {"Ngad'a"},
["nxi"] = {"Nindi"},
["nxk"] = {"Koki Naga"},
["nxl"] = {"South Nuaulu"},
["nxm"] = {"Numidian"},
["nxn"] = {"Ngawun"},
["nxo"] = {"Ndambomo"},
["nxq"] = {"Naxi"},
["nxr"] = {"Ninggerum"},
["nxx"] = {"Nafri"},
["nyb"] = {"Nyangbo"},
["nyc"] = {"Nyanga-li"},
["nyd"] = {"Nyore", "Olunyole"},
["nye"] = {"Nyengo"},
["nyf"] = {"Giryama", "Kigiryama"},
["nyg"] = {"Nyindu"},
["nyh"] = {"Nyikina"},
["nyi"] = {"Ama (Sudan)"},
["nyj"] = {"Nyanga"},
["nyk"] = {"Nyaneka"},
["nyl"] = {"Nyeu"},
["nym"] = {"Nyamwezi"},
["nyn"] = {"Nyankole"},
["nyo"] = {"Nyoro"},
["nyp"] = {"Nyang'i"},
["nyq"] = {"Nayini"},
["nyr"] = {"Nyiha (Malawi)"},
["nys"] = {"Nyungar"},
["nyt"] = {"Nyawaygi"},
["nyu"] = {"Nyungwe"},
["nyv"] = {"Nyulnyul"},
["nyw"] = {"Nyaw"},
["nyx"] = {"Nganyaywana"},
["nyy"] = {"Nyakyusa-Ngonde"},
["nza"] = {"Tigon Mbembe"},
["nzb"] = {"Njebi"},
["nzd"] = {"Nzadi"},
["nzi"] = {"Nzima"},
["nzk"] = {"Nzakara"},
["nzm"] = {"Zeme Naga"},
["nzr"] = {"Dir-Nyamzak-Mbarimi"},
["nzs"] = {"New Zealand Sign Language"},
["nzu"] = {"Teke-Nzikou"},
["nzy"] = {"Nzakambay"},
["nzz"] = {"Nanga Dama Dogon"},
["oaa"] = {"Orok"},
["oac"] = {"Oroch"},
["oak"] = {"Noakhali", "Noakhailla"},
["oar"] = {"Old Aramaic (up to 700 BCE)", "Ancient Aramaic (up to 700 BCE)"},
["oav"] = {"Old Avar"},
["obi"] = {"Obispeño"},
["obk"] = {"Southern Bontok"},
["obl"] = {"Oblo"},
["obm"] = {"Moabite"},
["obo"] = {"Obo Manobo"},
["obr"] = {"Old Burmese"},
["obt"] = {"Old Breton"},
["obu"] = {"Obulom"},
["oca"] = {"Ocaina"},
["och"] = {"Old Chinese"},
["ocm"] = {"Old Cham"},
["oco"] = {"Old Cornish"},
["ocu"] = {"Atzingo Matlatzinca"},
["oda"] = {"Odut"},
["odk"] = {"Od"},
["odt"] = {"Old Dutch"},
["odu"] = {"Odual"},
["ofo"] = {"Ofo"},
["ofs"] = {"Old Frisian"},
["ofu"] = {"Efutop"},
["ogb"] = {"Ogbia"},
["ogc"] = {"Ogbah"},
["oge"] = {"Old Georgian"},
["ogg"] = {"Ogbogolo"},
["ogo"] = {"Khana"},
["ogu"] = {"Ogbronuagum"},
["oht"] = {"Old Hittite"},
["ohu"] = {"Old Hungarian"},
["oia"] = {"Oirata"},
["oie"] = {"Okolie"},
["oin"] = {"Inebu One"},
["ojb"] = {"Northwestern Ojibwa"},
["ojc"] = {"Central Ojibwa"},
["ojg"] = {"Eastern Ojibwa"},
["ojp"] = {"Old Japanese"},
["ojs"] = {"Severn Ojibwa"},
["ojv"] = {"Ontong Java"},
["ojw"] = {"Western Ojibwa"},
["oka"] = {"Okanagan"},
["okb"] = {"Okobo"},
["okc"] = {"Kobo"},
["okd"] = {"Okodia"},
["oke"] = {"Okpe (Southwestern Edo)"},
["okg"] = {"Koko Babangk"},
["okh"] = {"Koresh-e Rostam"},
["oki"] = {"Okiek"},
["okj"] = {"Oko-Juwoi"},
["okk"] = {"Kwamtim One"},
["okl"] = {"Old Kentish Sign Language"},
["okm"] = {"Middle Korean (10th-16th cent.)"},
["okn"] = {"Oki-No-Erabu"},
["oko"] = {"Old Korean (3rd-9th cent.)"},
["okr"] = {"Kirike"},
["oks"] = {"Oko-Eni-Osayen"},
["oku"] = {"Oku"},
["okv"] = {"Orokaiva"},
["okx"] = {"Okpe (Northwestern Edo)"},
["okz"] = {"Old Khmer"},
["ola"] = {"Walungge"},
["olb"] = {"Oli-Bodiman"},
["old"] = {"Mochi"},
["ole"] = {"Olekha"},
["olk"] = {"Olkol"},
["olm"] = {"Oloma"},
["olo"] = {"Livvi"},
["olr"] = {"Olrat"},
["olt"] = {"Old Lithuanian"},
["olu"] = {"Kuvale"},
["oma"] = {"Omaha-Ponca"},
["omb"] = {"East Ambae"},
["omc"] = {"Mochica"},
["omg"] = {"Omagua"},
["omi"] = {"Omi"},
["omk"] = {"Omok"},
["oml"] = {"Ombo"},
["omn"] = {"Minoan"},
["omo"] = {"Utarmbung"},
["omp"] = {"Old Manipuri"},
["omq"] = {"Oto-Manguean languages"},
["omr"] = {"Old Marathi"},
["omt"] = {"Omotik"},
["omu"] = {"Omurano"},
["omv"] = {"Omotic languages"},
["omw"] = {"South Tairora"},
["omx"] = {"Old Mon"},
["omy"] = {"Old Malay"},
["ona"] = {"Ona"},
["onb"] = {"Lingao"},
["one"] = {"Oneida"},
["ong"] = {"Olo"},
["oni"] = {"Onin"},
["onj"] = {"Onjob"},
["onk"] = {"Kabore One"},
["onn"] = {"Onobasulu"},
["ono"] = {"Onondaga"},
["onp"] = {"Sartang"},
["onr"] = {"Northern One"},
["ons"] = {"Ono"},
["ont"] = {"Ontenu"},
["onu"] = {"Unua"},
["onw"] = {"Old Nubian"},
["onx"] = {"Onin Based Pidgin"},
["ood"] = {"Tohono O'odham"},
["oog"] = {"Ong"},
["oon"] = {"Önge"},
["oor"] = {"Oorlams"},
["oos"] = {"Old Ossetic"},
["opa"] = {"Okpamheri"},
["opk"] = {"Kopkaka"},
["opm"] = {"Oksapmin"},
["opo"] = {"Opao"},
["opt"] = {"Opata"},
["opy"] = {"Ofayé"},
["ora"] = {"Oroha"},
["orc"] = {"Orma"},
["ore"] = {"Orejón"},
["org"] = {"Oring"},
["orh"] = {"Oroqen"},
["orn"] = {"Orang Kanaq"},
["oro"] = {"Orokolo"},
["orr"] = {"Oruma"},
["ors"] = {"Orang Seletar"},
["ort"] = {"Adivasi Oriya"},
["oru"] = {"Ormuri"},
["orv"] = {"Old Russian"},
["orw"] = {"Oro Win"},
["orx"] = {"Oro"},
["ory"] = {"Odia (individual language)", "Oriya (individual language)"},
["orz"] = {"Ormu"},
["osa"] = {"Osage"},
["osc"] = {"Oscan"},
["osd"] = {"Digor Ossetic", "Digor", "Digor Ossetian"},
["osi"] = {"Osing"},
["osn"] = {"Old Sundanese"},
["oso"] = {"Ososo"},
["osp"] = {"Old Spanish"},
["ost"] = {"Osatu"},
["osu"] = {"Southern One"},
["osx"] = {"Old Saxon"},
["ota"] = {"Ottoman Turkish (1500-1928)"},
["otb"] = {"Old Tibetan"},
["otd"] = {"Ot Danum"},
["ote"] = {"Mezquital Otomi"},
["oti"] = {"Oti"},
["otk"] = {"Old Turkish"},
["otl"] = {"Tilapa Otomi"},
["otm"] = {"Eastern Highland Otomi"},
["otn"] = {"Tenango Otomi"},
["oto"] = {"Otomian languages"},
["otq"] = {"Querétaro Otomi"},
["otr"] = {"Otoro"},
["ots"] = {"Estado de México Otomi"},
["ott"] = {"Temoaya Otomi"},
["otu"] = {"Otuke"},
["otw"] = {"Ottawa"},
["otx"] = {"Texcatepec Otomi"},
["oty"] = {"Old Tamil"},
["otz"] = {"Ixtenco Otomi"},
["oua"] = {"Tagargrent"},
["oub"] = {"Glio-Oubi"},
["oue"] = {"Oune"},
["oui"] = {"Old Uighur"},
["oum"] = {"Ouma"},
["ovd"] = {"Elfdalian", "Övdalian"},
["owi"] = {"Owiniga"},
["owl"] = {"Old Welsh"},
["oyb"] = {"Oy"},
["oyd"] = {"Oyda"},
["oym"] = {"Wayampi"},
["oyy"] = {"Oya'oya"},
["ozm"] = {"Koonzime"},
["paa"] = {"Papuan languages"},
["pab"] = {"Parecís"},
["pac"] = {"Pacoh"},
["pad"] = {"Paumarí"},
["pae"] = {"Pagibete"},
["paf"] = {"Paranawát"},
["pag"] = {"Pangasinan"},
["pah"] = {"Tenharim"},
["pai"] = {"Pe"},
["pak"] = {"Parakanã"},
["pal"] = {"Pahlavi"},
["pam"] = {"Pampanga", "Kapampangan"},
["pao"] = {"Northern Paiute"},
["pap"] = {"Papiamento"},
["paq"] = {"Parya"},
["par"] = {"Panamint", "Timbisha"},
["pas"] = {"Papasena"},
["pau"] = {"Palauan"},
["pav"] = {"Pakaásnovos"},
["paw"] = {"Pawnee"},
["pax"] = {"Pankararé"},
["pay"] = {"Pech"},
["paz"] = {"Pankararú"},
["pbb"] = {"Páez"},
["pbc"] = {"Patamona"},
["pbe"] = {"Mezontla Popoloca"},
["pbf"] = {"Coyotepec Popoloca"},
["pbg"] = {"Paraujano"},
["pbh"] = {"E'ñapa Woromaipu"},
["pbi"] = {"Parkwa"},
["pbl"] = {"Mak (Nigeria)"},
["pbm"] = {"Puebla Mazatec"},
["pbn"] = {"Kpasam"},
["pbo"] = {"Papel"},
["pbp"] = {"Badyara"},
["pbr"] = {"Pangwa"},
["pbs"] = {"Central Pame"},
["pbt"] = {"Southern Pashto"},
["pbu"] = {"Northern Pashto"},
["pbv"] = {"Pnar"},
["pby"] = {"Pyu (Papua New Guinea)"},
["pca"] = {"Santa Inés Ahuatempan Popoloca"},
["pcb"] = {"Pear"},
["pcc"] = {"Bouyei"},
["pcd"] = {"Picard"},
["pce"] = {"Ruching Palaung"},
["pcf"] = {"Paliyan"},
["pcg"] = {"Paniya"},
["pch"] = {"Pardhan"},
["pci"] = {"Duruwa"},
["pcj"] = {"Parenga"},
["pck"] = {"Paite Chin"},
["pcl"] = {"Pardhi"},
["pcm"] = {"Nigerian Pidgin"},
["pcn"] = {"Piti"},
["pcp"] = {"Pacahuara"},
["pcw"] = {"Pyapun"},
["pda"] = {"Anam"},
["pdc"] = {"Pennsylvania German"},
["pdi"] = {"Pa Di"},
["pdn"] = {"Podena", "Fedan"},
["pdo"] = {"Padoe"},
["pdt"] = {"Plautdietsch"},
["pdu"] = {"Kayan"},
["pea"] = {"Peranakan Indonesian"},
["peb"] = {"Eastern Pomo"},
["ped"] = {"Mala (Papua New Guinea)"},
["pee"] = {"Taje"},
["pef"] = {"Northeastern Pomo"},
["peg"] = {"Pengo"},
["peh"] = {"Bonan"},
["pei"] = {"Chichimeca-Jonaz"},
["pej"] = {"Northern Pomo"},
["pek"] = {"Penchal"},
["pel"] = {"Pekal"},
["pem"] = {"Phende"},
["peo"] = {"Old Persian (ca. 600-400 B.C.)"},
["pep"] = {"Kunja"},
["peq"] = {"Southern Pomo"},
["pes"] = {"Iranian Persian"},
["pev"] = {"Pémono"},
["pex"] = {"Petats"},
["pey"] = {"Petjo"},
["pez"] = {"Eastern Penan"},
["pfa"] = {"Pááfang"},
["pfe"] = {"Pere"},
["pfl"] = {"Pfaelzisch"},
["pga"] = {"Sudanese Creole Arabic"},
["pgd"] = {"Gāndhārī"},
["pgg"] = {"Pangwali"},
["pgi"] = {"Pagi"},
["pgk"] = {"Rerep"},
["pgl"] = {"Primitive Irish"},
["pgn"] = {"Paelignian"},
["pgs"] = {"Pangseng"},
["pgu"] = {"Pagu"},
["pgz"] = {"Papua New Guinean Sign Language"},
["pha"] = {"Pa-Hng"},
["phd"] = {"Phudagi"},
["phg"] = {"Phuong"},
["phh"] = {"Phukha"},
["phi"] = {"Philippine languages"},
["phj"] = {"Pahari"},
["phk"] = {"Phake"},
["phl"] = {"Phalura", "Palula"},
["phm"] = {"Phimbi"},
["phn"] = {"Phoenician"},
["pho"] = {"Phunoi"},
["phq"] = {"Phana'"},
["phr"] = {"Pahari-Potwari"},
["pht"] = {"Phu Thai"},
["phu"] = {"Phuan"},
["phv"] = {"Pahlavani"},
["phw"] = {"Phangduwali"},
["pia"] = {"Pima Bajo"},
["pib"] = {"Yine"},
["pic"] = {"Pinji"},
["pid"] = {"Piaroa"},
["pie"] = {"Piro"},
["pif"] = {"Pingelapese"},
["pig"] = {"Pisabo"},
["pih"] = {"Pitcairn-Norfolk"},
["pij"] = {"Pijao"},
["pil"] = {"Yom"},
["pim"] = {"Powhatan"},
["pin"] = {"Piame"},
["pio"] = {"Piapoco"},
["pip"] = {"Pero"},
["pir"] = {"Piratapuyo"},
["pis"] = {"Pijin"},
["pit"] = {"Pitta Pitta"},
["piu"] = {"Pintupi-Luritja"},
["piv"] = {"Pileni", "Vaeakau-Taumako"},
["piw"] = {"Pimbwe"},
["pix"] = {"Piu"},
["piy"] = {"Piya-Kwonci"},
["piz"] = {"Pije"},
["pjt"] = {"Pitjantjatjara"},
["pka"] = {"Ardhamāgadhī Prākrit"},
["pkb"] = {"Pokomo", "Kipfokomo"},
["pkc"] = {"Paekche"},
["pkg"] = {"Pak-Tong"},
["pkh"] = {"Pankhu"},
["pkn"] = {"Pakanha"},
["pko"] = {"Pökoot"},
["pkp"] = {"Pukapuka"},
["pkr"] = {"Attapady Kurumba"},
["pks"] = {"Pakistan Sign Language"},
["pkt"] = {"Maleng"},
["pku"] = {"Paku"},
["pla"] = {"Miani"},
["plb"] = {"Polonombauk"},
["plc"] = {"Central Palawano"},
["pld"] = {"Polari"},
["ple"] = {"Palu'e"},
["plf"] = {"Central Malayo-Polynesian languages"},
["plg"] = {"Pilagá"},
["plh"] = {"Paulohi"},
["plk"] = {"Kohistani Shina"},
["pll"] = {"Shwe Palaung"},
["pln"] = {"Palenquero"},
["plo"] = {"Oluta Popoluca"},
["plq"] = {"Palaic"},
["plr"] = {"Palaka Senoufo"},
["pls"] = {"San Marcos Tlacoyalco Popoloca", "San Marcos Tlalcoyalco Popoloca"},
["plt"] = {"Plateau Malagasy"},
["plu"] = {"Palikúr"},
["plv"] = {"Southwest Palawano"},
["plw"] = {"Brooke's Point Palawano"},
["ply"] = {"Bolyu"},
["plz"] = {"Paluan"},
["pma"] = {"Paama"},
["pmb"] = {"Pambia"},
["pmd"] = {"Pallanganmiddang"},
["pme"] = {"Pwaamei"},
["pmf"] = {"Pamona"},
["pmh"] = {"Māhārāṣṭri Prākrit"},
["pmi"] = {"Northern Pumi"},
["pmj"] = {"Southern Pumi"},
["pml"] = {"Lingua Franca"},
["pmm"] = {"Pomo"},
["pmn"] = {"Pam"},
["pmo"] = {"Pom"},
["pmq"] = {"Northern Pame"},
["pmr"] = {"Paynamar"},
["pms"] = {"Piemontese"},
["pmt"] = {"Tuamotuan"},
["pmw"] = {"Plains Miwok"},
["pmx"] = {"Poumei Naga"},
["pmy"] = {"Papuan Malay"},
["pmz"] = {"Southern Pame"},
["pna"] = {"Punan Bah-Biau"},
["pnb"] = {"Western Panjabi"},
["pnc"] = {"Pannei"},
["pnd"] = {"Mpinda"},
["pne"] = {"Western Penan"},
["png"] = {"Pangu", "Pongu"},
["pnh"] = {"Penrhyn"},
["pni"] = {"Aoheng"},
["pnj"] = {"Pinjarup"},
["pnk"] = {"Paunaka"},
["pnl"] = {"Paleni"},
["pnm"] = {"Punan Batu 1"},
["pnn"] = {"Pinai-Hagahai"},
["pno"] = {"Panobo"},
["pnp"] = {"Pancana"},
["pnq"] = {"Pana (Burkina Faso)"},
["pnr"] = {"Panim"},
["pns"] = {"Ponosakan"},
["pnt"] = {"Pontic"},
["pnu"] = {"Jiongnai Bunu"},
["pnv"] = {"Pinigura"},
["pnw"] = {"Banyjima", "Panytyima"},
["pnx"] = {"Phong-Kniang"},
["pny"] = {"Pinyin"},
["pnz"] = {"Pana (Central African Republic)"},
["poc"] = {"Poqomam"},
["poe"] = {"San Juan Atzingo Popoloca"},
["pof"] = {"Poke"},
["pog"] = {"Potiguára"},
["poh"] = {"Poqomchi'"},
["poi"] = {"Highland Popoluca"},
["pok"] = {"Pokangá"},
["pom"] = {"Southeastern Pomo"},
["pon"] = {"Pohnpeian"},
["poo"] = {"Central Pomo"},
["pop"] = {"Pwapwâ"},
["poq"] = {"Texistepec Popoluca"},
["pos"] = {"Sayula Popoluca"},
["pot"] = {"Potawatomi"},
["pov"] = {"Upper Guinea Crioulo"},
["pow"] = {"San Felipe Otlaltepec Popoloca"},
["pox"] = {"Polabian"},
["poy"] = {"Pogolo"},
["poz"] = {"Malayo-Polynesian languages"},
["ppe"] = {"Papi"},
["ppi"] = {"Paipai"},
["ppk"] = {"Uma"},
["ppl"] = {"Pipil", "Nicarao"},
["ppm"] = {"Papuma"},
["ppn"] = {"Papapana"},
["ppo"] = {"Folopa"},
["ppp"] = {"Pelende"},
["ppq"] = {"Pei"},
["pps"] = {"San Luís Temalacayuca Popoloca"},
["ppt"] = {"Pare"},
["ppu"] = {"Papora"},
["pqa"] = {"Pa'a"},
["pqe"] = {"Eastern Malayo-Polynesian languages"},
["pqm"] = {"Malecite-Passamaquoddy"},
["pqw"] = {"Western Malayo-Polynesian languages"},
["pra"] = {"Prakrit languages"},
["prc"] = {"Parachi"},
["prd"] = {"Parsi-Dari"},
["pre"] = {"Principense"},
["prf"] = {"Paranan"},
["prg"] = {"Prussian"},
["prh"] = {"Porohanon"},
["pri"] = {"Paicî"},
["prk"] = {"Parauk"},
["prl"] = {"Peruvian Sign Language"},
["prm"] = {"Kibiri"},
["prn"] = {"Prasuni"},
["pro"] = {"Old Provençal (to 1500)", "Old Occitan (to 1500)"},
["prq"] = {"Ashéninka Perené"},
["prr"] = {"Puri"},
["prs"] = {"Dari", "Afghan Persian"},
["prt"] = {"Phai"},
["pru"] = {"Puragi"},
["prw"] = {"Parawen"},
["prx"] = {"Purik"},
["prz"] = {"Providencia Sign Language"},
["psa"] = {"Asue Awyu"},
["psc"] = {"Iranian Sign Language", "Persian Sign Language"},
["psd"] = {"Plains Indian Sign Language"},
["pse"] = {"Central Malay"},
["psg"] = {"Penang Sign Language"},
["psh"] = {"Southwest Pashai", "Southwest Pashayi"},
["psi"] = {"Southeast Pashai", "Southeast Pashayi"},
["psl"] = {"Puerto Rican Sign Language"},
["psm"] = {"Pauserna"},
["psn"] = {"Panasuan"},
["pso"] = {"Polish Sign Language"},
["psp"] = {"Philippine Sign Language"},
["psq"] = {"Pasi"},
["psr"] = {"Portuguese Sign Language"},
["pss"] = {"Kaulong"},
["pst"] = {"Central Pashto"},
["psu"] = {"Sauraseni Prākrit"},
["psw"] = {"Port Sandwich"},
["psy"] = {"Piscataway"},
["pta"] = {"Pai Tavytera"},
["pth"] = {"Pataxó Hã-Ha-Hãe"},
["pti"] = {"Pindiini", "Wangkatha"},
["ptn"] = {"Patani"},
["pto"] = {"Zo'é"},
["ptp"] = {"Patep"},
["ptq"] = {"Pattapu"},
["ptr"] = {"Piamatsina"},
["ptt"] = {"Enrekang"},
["ptu"] = {"Bambam"},
["ptv"] = {"Port Vato"},
["ptw"] = {"Pentlatch"},
["pty"] = {"Pathiya"},
["pua"] = {"Western Highland Purepecha"},
["pub"] = {"Purum"},
["puc"] = {"Punan Merap"},
["pud"] = {"Punan Aput"},
["pue"] = {"Puelche"},
["puf"] = {"Punan Merah"},
["pug"] = {"Phuie"},
["pui"] = {"Puinave"},
["puj"] = {"Punan Tubu"},
["pum"] = {"Puma"},
["puo"] = {"Puoc"},
["pup"] = {"Pulabu"},
["puq"] = {"Puquina"},
["pur"] = {"Puruborá"},
["put"] = {"Putoh"},
["puu"] = {"Punu"},
["puw"] = {"Puluwatese"},
["pux"] = {"Puare"},
["puy"] = {"Purisimeño"},
["pwa"] = {"Pawaia"},
["pwb"] = {"Panawa"},
["pwg"] = {"Gapapaiwa"},
["pwi"] = {"Patwin"},
["pwm"] = {"Molbog"},
["pwn"] = {"Paiwan"},
["pwo"] = {"Pwo Western Karen"},
["pwr"] = {"Powari"},
["pww"] = {"Pwo Northern Karen"},
["pxm"] = {"Quetzaltepec Mixe"},
["pye"] = {"Pye Krumen"},
["pym"] = {"Fyam"},
["pyn"] = {"Poyanáwa"},
["pys"] = {"Paraguayan Sign Language", "Lengua de Señas del Paraguay"},
["pyu"] = {"Puyuma"},
["pyx"] = {"Pyu (Myanmar)"},
["pyy"] = {"Pyen"},
["pze"] = {"Pesse"},
["pzh"] = {"Pazeh"},
["pzn"] = {"Jejara Naga", "Para Naga"},
["qua"] = {"Quapaw"},
["qub"] = {"Huallaga Huánuco Quechua"},
["quc"] = {"K'iche'", "Quiché"},
["qud"] = {"Calderón Highland Quichua"},
["quf"] = {"Lambayeque Quechua"},
["qug"] = {"Chimborazo Highland Quichua"},
["quh"] = {"South Bolivian Quechua"},
["qui"] = {"Quileute"},
["quk"] = {"Chachapoyas Quechua"},
["qul"] = {"North Bolivian Quechua"},
["qum"] = {"Sipacapense"},
["qun"] = {"Quinault"},
["qup"] = {"Southern Pastaza Quechua"},
["quq"] = {"Quinqui"},
["qur"] = {"Yanahuanca Pasco Quechua"},
["qus"] = {"Santiago del Estero Quichua"},
["quv"] = {"Sacapulteco"},
["quw"] = {"Tena Lowland Quichua"},
["qux"] = {"Yauyos Quechua"},
["quy"] = {"Ayacucho Quechua"},
["quz"] = {"Cusco Quechua"},
["qva"] = {"Ambo-Pasco Quechua"},
["qvc"] = {"Cajamarca Quechua"},
["qve"] = {"Eastern Apurímac Quechua"},
["qvh"] = {"Huamalíes-Dos de Mayo Huánuco Quechua"},
["qvi"] = {"Imbabura Highland Quichua"},
["qvj"] = {"Loja Highland Quichua"},
["qvl"] = {"Cajatambo North Lima Quechua"},
["qvm"] = {"Margos-Yarowilca-Lauricocha Quechua"},
["qvn"] = {"North Junín Quechua"},
["qvo"] = {"Napo Lowland Quechua"},
["qvp"] = {"Pacaraos Quechua"},
["qvs"] = {"San Martín Quechua"},
["qvw"] = {"Huaylla Wanca Quechua"},
["qvy"] = {"Queyu"},
["qvz"] = {"Northern Pastaza Quichua"},
["qwa"] = {"Corongo Ancash Quechua"},
["qwc"] = {"Classical Quechua"},
["qwe"] = {"Quechuan (family)"},
["qwh"] = {"Huaylas Ancash Quechua"},
["qwm"] = {"Kuman (Russia)"},
["qws"] = {"Sihuas Ancash Quechua"},
["qwt"] = {"Kwalhioqua-Tlatskanai"},
["qxa"] = {"Chiquián Ancash Quechua"},
["qxc"] = {"Chincha Quechua"},
["qxh"] = {"Panao Huánuco Quechua"},
["qxl"] = {"Salasaca Highland Quichua"},
["qxn"] = {"Northern Conchucos Ancash Quechua"},
["qxo"] = {"Southern Conchucos Ancash Quechua"},
["qxp"] = {"Puno Quechua"},
["qxq"] = {"Qashqa'i"},
["qxr"] = {"Cañar Highland Quichua"},
["qxs"] = {"Southern Qiang"},
["qxt"] = {"Santa Ana de Tusi Pasco Quechua"},
["qxu"] = {"Arequipa-La Unión Quechua"},
["qxw"] = {"Jauja Wanca Quechua"},
["qya"] = {"Quenya"},
["qyp"] = {"Quiripi"},
["raa"] = {"Dungmali"},
["rab"] = {"Camling"},
["rac"] = {"Rasawa"},
["rad"] = {"Rade"},
["raf"] = {"Western Meohang"},
["rag"] = {"Logooli", "Lulogooli"},
["rah"] = {"Rabha"},
["rai"] = {"Ramoaaina"},
["raj"] = {"Rajasthani"},
["rak"] = {"Tulu-Bohuai"},
["ral"] = {"Ralte"},
["ram"] = {"Canela"},
["ran"] = {"Riantana"},
["rao"] = {"Rao"},
["rap"] = {"Rapanui"},
["raq"] = {"Saam"},
["rar"] = {"Rarotongan", "Cook Islands Maori"},
["ras"] = {"Tegali"},
["rat"] = {"Razajerdi"},
["rau"] = {"Raute"},
["rav"] = {"Sampang"},
["raw"] = {"Rawang"},
["rax"] = {"Rang"},
["ray"] = {"Rapa"},
["raz"] = {"Rahambuu"},
["rbb"] = {"Rumai Palaung"},
["rbk"] = {"Northern Bontok"},
["rbl"] = {"Miraya Bikol"},
["rbp"] = {"Barababaraba"},
["rcf"] = {"Réunion Creole French"},
["rdb"] = {"Rudbari"},
["rea"] = {"Rerau"},
["reb"] = {"Rembong"},
["ree"] = {"Rejang Kayan"},
["reg"] = {"Kara (Tanzania)"},
["rei"] = {"Reli"},
["rej"] = {"Rejang"},
["rel"] = {"Rendille"},
["rem"] = {"Remo"},
["ren"] = {"Rengao"},
["rer"] = {"Rer Bare"},
["res"] = {"Reshe"},
["ret"] = {"Retta"},
["rey"] = {"Reyesano"},
["rga"] = {"Roria"},
["rge"] = {"Romano-Greek"},
["rgk"] = {"Rangkas"},
["rgn"] = {"Romagnol"},
["rgr"] = {"Resígaro"},
["rgs"] = {"Southern Roglai"},
["rgu"] = {"Ringgou"},
["rhg"] = {"Rohingya"},
["rhp"] = {"Yahang"},
["ria"] = {"Riang (India)"},
["rib"] = {"Bribri Sign Language"},
["rif"] = {"Tarifit"},
["ril"] = {"Riang Lang", "Riang (Myanmar)"},
["rim"] = {"Nyaturu"},
["rin"] = {"Nungu"},
["rir"] = {"Ribun"},
["rit"] = {"Ritharrngu"},
["riu"] = {"Riung"},
["rjg"] = {"Rajong"},
["rji"] = {"Raji"},
["rjs"] = {"Rajbanshi"},
["rka"] = {"Kraol"},
["rkb"] = {"Rikbaktsa"},
["rkh"] = {"Rakahanga-Manihiki"},
["rki"] = {"Rakhine"},
["rkm"] = {"Marka"},
["rkt"] = {"Rangpuri", "Kamta"},
["rkw"] = {"Arakwal"},
["rma"] = {"Rama"},
["rmb"] = {"Rembarrnga"},
["rmc"] = {"Carpathian Romani"},
["rmd"] = {"Traveller Danish"},
["rme"] = {"Angloromani"},
["rmf"] = {"Kalo Finnish Romani"},
["rmg"] = {"Traveller Norwegian"},
["rmh"] = {"Murkim"},
["rmi"] = {"Lomavren"},
["rmk"] = {"Romkun"},
["rml"] = {"Baltic Romani"},
["rmm"] = {"Roma"},
["rmn"] = {"Balkan Romani"},
["rmo"] = {"Sinte Romani"},
["rmp"] = {"Rempi"},
["rmq"] = {"Caló"},
["rms"] = {"Romanian Sign Language"},
["rmt"] = {"Domari"},
["rmu"] = {"Tavringer Romani"},
["rmv"] = {"Romanova"},
["rmw"] = {"Welsh Romani"},
["rmx"] = {"Romam"},
["rmy"] = {"Vlax Romani"},
["rmz"] = {"Marma"},
["rnb"] = {"Brunca Sign Language"},
["rnd"] = {"Ruund"},
["rng"] = {"Ronga"},
["rnl"] = {"Ranglong"},
["rnn"] = {"Roon"},
["rnp"] = {"Rongpo"},
["rnr"] = {"Nari Nari"},
["rnw"] = {"Rungwa"},
["roa"] = {"Romance languages"},
["rob"] = {"Tae'"},
["roc"] = {"Cacgia Roglai"},
["rod"] = {"Rogo"},
["roe"] = {"Ronji"},
["rof"] = {"Rombo"},
["rog"] = {"Northern Roglai"},
["rol"] = {"Romblomanon"},
["rom"] = {"Romany"},
["roo"] = {"Rotokas"},
["rop"] = {"Kriol"},
["ror"] = {"Rongga"},
["rou"] = {"Runga"},
["row"] = {"Dela-Oenale"},
["rpn"] = {"Repanbitip"},
["rpt"] = {"Rapting"},
["rri"] = {"Ririo"},
["rrm"] = {"Moriori"},
["rro"] = {"Waima"},
["rrt"] = {"Arritinngithigh"},
["rsb"] = {"Romano-Serbian"},
["rsk"] = {"Ruthenian", "Rusnak"},
["rsl"] = {"Russian Sign Language"},
["rsm"] = {"Miriwoong Sign Language"},
["rsn"] = {"Rwandan Sign Language"},
["rsw"] = {"Rishiwa"},
["rtc"] = {"Rungtu Chin"},
["rth"] = {"Ratahan"},
["rtm"] = {"Rotuman"},
["rts"] = {"Yurats"},
["rtw"] = {"Rathawi"},
["rub"] = {"Gungu"},
["ruc"] = {"Ruuli"},
["rue"] = {"Rusyn"},
["ruf"] = {"Luguru"},
["rug"] = {"Roviana"},
["ruh"] = {"Ruga"},
["rui"] = {"Rufiji"},
["ruk"] = {"Che"},
["ruo"] = {"Istro Romanian"},
["rup"] = {"Macedo-Romanian", "Aromanian", "Arumanian"},
["ruq"] = {"Megleno Romanian"},
["rut"] = {"Rutul"},
["ruu"] = {"Lanas Lobu"},
["ruy"] = {"Mala (Nigeria)"},
["ruz"] = {"Ruma"},
["rwa"] = {"Rawo"},
["rwk"] = {"Rwa"},
["rwl"] = {"Ruwila"},
["rwm"] = {"Amba (Uganda)"},
["rwo"] = {"Rawa"},
["rwr"] = {"Marwari (India)"},
["rxd"] = {"Ngardi"},
["rxw"] = {"Karuwali", "Garuwali"},
["ryn"] = {"Northern Amami-Oshima"},
["rys"] = {"Yaeyama"},
["ryu"] = {"Central Okinawan"},
["rzh"] = {"Rāziḥī"},
["saa"] = {"Saba"},
["sab"] = {"Buglere"},
["sac"] = {"Meskwaki"},
["sad"] = {"Sandawe"},
["sae"] = {"Sabanê"},
["saf"] = {"Safaliba"},
["sah"] = {"Yakut"},
["sai"] = {"South American Indian languages"},
["saj"] = {"Sahu"},
["sak"] = {"Sake"},
["sal"] = {"Salishan languages"},
["sam"] = {"Samaritan Aramaic"},
["sao"] = {"Sause"},
["saq"] = {"Samburu"},
["sar"] = {"Saraveca"},
["sas"] = {"Sasak"},
["sat"] = {"Santali"},
["sau"] = {"Saleman"},
["sav"] = {"Saafi-Saafi"},
["saw"] = {"Sawi"},
["sax"] = {"Sa"},
["say"] = {"Saya"},
["saz"] = {"Saurashtra"},
["sba"] = {"Ngambay"},
["sbb"] = {"Simbo"},
["sbc"] = {"Kele (Papua New Guinea)"},
["sbd"] = {"Southern Samo"},
["sbe"] = {"Saliba"},
["sbf"] = {"Chabu", "Shabo"},
["sbg"] = {"Seget"},
["sbh"] = {"Sori-Harengan"},
["sbi"] = {"Seti"},
["sbj"] = {"Surbakhal"},
["sbk"] = {"Safwa"},
["sbl"] = {"Botolan Sambal"},
["sbm"] = {"Sagala"},
["sbn"] = {"Sindhi Bhil"},
["sbo"] = {"Sabüm"},
["sbp"] = {"Sangu (Tanzania)"},
["sbq"] = {"Sileibi"},
["sbr"] = {"Sembakung Murut"},
["sbs"] = {"Subiya"},
["sbt"] = {"Kimki"},
["sbu"] = {"Stod Bhoti"},
["sbv"] = {"Sabine"},
["sbw"] = {"Simba"},
["sbx"] = {"Seberuang"},
["sby"] = {"Soli"},
["sbz"] = {"Sara Kaba"},
["scb"] = {"Chut"},
["sce"] = {"Dongxiang"},
["scf"] = {"San Miguel Creole French"},
["scg"] = {"Sanggau"},
["sch"] = {"Sakachep"},
["sci"] = {"Sri Lankan Creole Malay"},
["sck"] = {"Sadri"},
["scl"] = {"Shina"},
["scn"] = {"Sicilian"},
["sco"] = {"Scots"},
["scp"] = {"Hyolmo", "Helambu Sherpa"},
["scq"] = {"Sa'och"},
["scs"] = {"North Slavey", "Dene Kedé"},
["sct"] = {"Southern Katang"},
["scu"] = {"Shumcho"},
["scv"] = {"Sheni"},
["scw"] = {"Sha"},
["scx"] = {"Sicel"},
["scz"] = {"Shaetlan"},
["sda"] = {"Toraja-Sa'dan"},
["sdb"] = {"Shabak"},
["sdc"] = {"Sassarese Sardinian"},
["sde"] = {"Surubu"},
["sdf"] = {"Sarli"},
["sdg"] = {"Savi"},
["sdh"] = {"Southern Kurdish"},
["sdj"] = {"Suundi"},
["sdk"] = {"Sos Kundi"},
["sdl"] = {"Saudi Arabian Sign Language"},
["sdn"] = {"Gallurese Sardinian"},
["sdo"] = {"Bukar-Sadung Bidayuh"},
["sdp"] = {"Sherdukpen"},
["sdq"] = {"Semandang"},
["sdr"] = {"Oraon Sadri"},
["sds"] = {"Sened"},
["sdt"] = {"Shuadit"},
["sdu"] = {"Sarudu"},
["sdv"] = {"Eastern Sudanic languages"},
["sdx"] = {"Sibu Melanau"},
["sdz"] = {"Sallands"},
["sea"] = {"Semai"},
["seb"] = {"Shempire Senoufo"},
["sec"] = {"Sechelt", "She shashishalhem"},
["sed"] = {"Sedang"},
["see"] = {"Seneca"},
["sef"] = {"Cebaara Senoufo"},
["seg"] = {"Segeju"},
["seh"] = {"Sena"},
["sei"] = {"Seri"},
["sej"] = {"Sene"},
["sek"] = {"Sekani"},
["sel"] = {"Selkup"},
["sem"] = {"Semitic languages"},
["sen"] = {"Nanerigé Sénoufo"},
["seo"] = {"Suarmin"},
["sep"] = {"Sìcìté Sénoufo"},
["seq"] = {"Senara Sénoufo"},
["ser"] = {"Serrano"},
["ses"] = {"Koyraboro Senni Songhai"},
["set"] = {"Sentani"},
["seu"] = {"Serui-Laut"},
["sev"] = {"Nyarafolo Senoufo"},
["sew"] = {"Sewa Bay"},
["sey"] = {"Secoya"},
["sez"] = {"Senthang Chin"},
["sfb"] = {"Langue des signes de Belgique Francophone", "French Belgian Sign Language"},
["sfe"] = {"Eastern Subanen"},
["sfm"] = {"Small Flowery Miao"},
["sfs"] = {"South African Sign Language"},
["sfw"] = {"Sehwi"},
["sga"] = {"Old Irish (to 900)"},
["sgb"] = {"Mag-antsi Ayta"},
["sgc"] = {"Kipsigis"},
["sgd"] = {"Surigaonon"},
["sge"] = {"Segai"},
["sgg"] = {"Swiss-German Sign Language"},
["sgh"] = {"Shughni"},
["sgi"] = {"Suga"},
["sgj"] = {"Surgujia"},
["sgk"] = {"Sangkong"},
["sgm"] = {"Singa"},
["sgn"] = {"Sign languages"},
["sgp"] = {"Singpho"},
["sgr"] = {"Sangisari"},
["sgs"] = {"Samogitian"},
["sgt"] = {"Brokpake"},
["sgu"] = {"Salas"},
["sgw"] = {"Sebat Bet Gurage"},
["sgx"] = {"Sierra Leone Sign Language"},
["sgy"] = {"Sanglechi"},
["sgz"] = {"Sursurunga"},
["sha"] = {"Shall-Zwall"},
["shb"] = {"Ninam"},
["shc"] = {"Sonde"},
["shd"] = {"Kundal Shahi"},
["she"] = {"Sheko"},
["shg"] = {"Shua"},
["shh"] = {"Shoshoni"},
["shi"] = {"Tachelhit"},
["shj"] = {"Shatt"},
["shk"] = {"Shilluk"},
["shm"] = {"Shahrudi"},
["shn"] = {"Shan"},
["sho"] = {"Shanga"},
["shp"] = {"Shipibo-Conibo"},
["shq"] = {"Sala"},
["shr"] = {"Shi"},
["shs"] = {"Shuswap", "Secwepemctsín"},
["sht"] = {"Shasta"},
["shu"] = {"Chadian Arabic"},
["shv"] = {"Shehri"},
["shw"] = {"Shwai"},
["shx"] = {"She"},
["shy"] = {"Tachawit"},
["shz"] = {"Syenara Senoufo"},
["sia"] = {"Akkala Sami"},
["sib"] = {"Sebop"},
["sid"] = {"Sidamo"},
["sie"] = {"Simaa"},
["sif"] = {"Siamou"},
["sig"] = {"Paasaal"},
["sih"] = {"Zire", "Sîshëë"},
["sii"] = {"Shom Peng"},
["sij"] = {"Numbami"},
["sik"] = {"Sikiana"},
["sil"] = {"Tumulung Sisaala"},
["sim"] = {"Mende (Papua New Guinea)"},
["sio"] = {"Siouan languages"},
["sip"] = {"Sikkimese"},
["siq"] = {"Sonia"},
["sir"] = {"Siri"},
["sis"] = {"Siuslaw"},
["sit"] = {"Sino-Tibetan languages"},
["siu"] = {"Sinagen"},
["siv"] = {"Sumariup"},
["siw"] = {"Siwai"},
["six"] = {"Sumau"},
["siy"] = {"Sivandi"},
["siz"] = {"Siwi"},
["sja"] = {"Epena"},
["sjb"] = {"Sajau Basap"},
["sjc"] = {"Shaojiang Chinese"},
["sjd"] = {"Kildin Sami"},
["sje"] = {"Pite Sami"},
["sjg"] = {"Assangori"},
["sjk"] = {"Kemi Sami"},
["sjl"] = {"Sajalong", "Miji"},
["sjm"] = {"Mapun"},
["sjn"] = {"Sindarin"},
["sjo"] = {"Xibe"},
["sjp"] = {"Surjapuri"},
["sjr"] = {"Siar-Lak"},
["sjs"] = {"Senhaja De Srair"},
["sjt"] = {"Ter Sami"},
["sju"] = {"Ume Sami"},
["sjw"] = {"Shawnee"},
["ska"] = {"Skagit"},
["skb"] = {"Saek"},
["skc"] = {"Ma Manda"},
["skd"] = {"Southern Sierra Miwok"},
["ske"] = {"Seke (Vanuatu)"},
["skf"] = {"Sakirabiá"},
["skg"] = {"Sakalava Malagasy"},
["skh"] = {"Sikule"},
["ski"] = {"Sika"},
["skj"] = {"Seke (Nepal)"},
["skm"] = {"Kutong"},
["skn"] = {"Kolibugan Subanon"},
["sko"] = {"Seko Tengah"},
["skp"] = {"Sekapan"},
["skq"] = {"Sininkere"},
["skr"] = {"Saraiki", "Seraiki"},
["sks"] = {"Maia"},
["skt"] = {"Sakata"},
["sku"] = {"Sakao"},
["skv"] = {"Skou"},
["skw"] = {"Skepi Creole Dutch"},
["skx"] = {"Seko Padang"},
["sky"] = {"Sikaiana"},
["skz"] = {"Sekar"},
["sla"] = {"Slavic languages"},
["slc"] = {"Sáliba"},
["sld"] = {"Sissala"},
["sle"] = {"Sholaga"},
["slf"] = {"Swiss-Italian Sign Language"},
["slg"] = {"Selungai Murut"},
["slh"] = {"Southern Puget Sound Salish"},
["sli"] = {"Lower Silesian"},
["slj"] = {"Salumá"},
["sll"] = {"Salt-Yui"},
["slm"] = {"Pangutaran Sama"},
["sln"] = {"Salinan"},
["slp"] = {"Lamaholot"},
["slr"] = {"Salar"},
["sls"] = {"Singapore Sign Language"},
["slt"] = {"Sila"},
["slu"] = {"Selaru"},
["slw"] = {"Sialum"},
["slx"] = {"Salampasu"},
["sly"] = {"Selayar"},
["slz"] = {"Ma'ya"},
["sma"] = {"Southern Sami"},
["smb"] = {"Simbari"},
["smc"] = {"Som"},
["smf"] = {"Auwe"},
["smg"] = {"Simbali"},
["smh"] = {"Samei"},
["smi"] = {"Sami languages"},
["smj"] = {"Lule Sami"},
["smk"] = {"Bolinao"},
["sml"] = {"Central Sama"},
["smm"] = {"Musasa"},
["smn"] = {"Inari Sami"},
["smp"] = {"Samaritan"},
["smq"] = {"Samo"},
["smr"] = {"Simeulue"},
["sms"] = {"Skolt Sami"},
["smt"] = {"Simte"},
["smu"] = {"Somray"},
["smv"] = {"Samvedi"},
["smw"] = {"Sumbawa"},
["smx"] = {"Samba"},
["smy"] = {"Semnani"},
["smz"] = {"Simeku"},
["snc"] = {"Sinaugoro"},
["sne"] = {"Bau Bidayuh"},
["snf"] = {"Noon"},
["sng"] = {"Sanga (Democratic Republic of Congo)"},
["sni"] = {"Sensi"},
["snj"] = {"Riverain Sango"},
["snk"] = {"Soninke"},
["snl"] = {"Sangil"},
["snm"] = {"Southern Ma'di"},
["snn"] = {"Siona"},
["sno"] = {"Snohomish"},
["snp"] = {"Siane"},
["snq"] = {"Sangu (Gabon)"},
["snr"] = {"Sihan"},
["sns"] = {"South West Bay", "Nahavaq"},
["snu"] = {"Senggi", "Viid"},
["snv"] = {"Sa'ban"},
["snw"] = {"Selee"},
["snx"] = {"Sam"},
["sny"] = {"Saniyo-Hiyewe"},
["snz"] = {"Kou"},
["soa"] = {"Thai Song"},
["sob"] = {"Sobei"},
["soc"] = {"So (Democratic Republic of Congo)"},
["sod"] = {"Songoora"},
["soe"] = {"Songomeno"},
["sog"] = {"Sogdian"},
["soh"] = {"Aka"},
["soi"] = {"Sonha"},
["soj"] = {"Soi"},
["sok"] = {"Sokoro"},
["sol"] = {"Solos"},
["son"] = {"Songhai languages"},
["soo"] = {"Songo"},
["sop"] = {"Songe"},
["soq"] = {"Kanasi"},
["sor"] = {"Somrai"},
["sos"] = {"Seeku"},
["sou"] = {"Southern Thai"},
["sov"] = {"Sonsorol"},
["sow"] = {"Sowanda"},
["sox"] = {"Swo"},
["soy"] = {"Miyobe"},
["soz"] = {"Temi"},
["spb"] = {"Sepa (Indonesia)"},
["spc"] = {"Sapé"},
["spd"] = {"Saep"},
["spe"] = {"Sepa (Papua New Guinea)"},
["spg"] = {"Sian"},
["spi"] = {"Saponi"},
["spk"] = {"Sengo"},
["spl"] = {"Selepet"},
["spm"] = {"Akukem"},
["spn"] = {"Sanapaná"},
["spo"] = {"Spokane"},
["spp"] = {"Supyire Senoufo"},
["spq"] = {"Loreto-Ucayali Spanish"},
["spr"] = {"Saparua"},
["sps"] = {"Saposa"},
["spt"] = {"Spiti Bhoti"},
["spu"] = {"Sapuan"},
["spv"] = {"Sambalpuri", "Kosli"},
["spx"] = {"South Picene"},
["spy"] = {"Sabaot"},
["sqa"] = {"Shama-Sambuga"},
["sqh"] = {"Shau"},
["sqj"] = {"Albanian languages"},
["sqk"] = {"Albanian Sign Language"},
["sqm"] = {"Suma"},
["sqn"] = {"Susquehannock"},
["sqo"] = {"Sorkhei"},
["sqq"] = {"Sou"},
["sqr"] = {"Siculo Arabic"},
["sqs"] = {"Sri Lankan Sign Language"},
["sqt"] = {"Soqotri"},
["squ"] = {"Squamish", "Sḵwx̱wú7mesh sníchim"},
["sqx"] = {"Kufr Qassem Sign Language (KQSL)"},
["sra"] = {"Saruga"},
["srb"] = {"Sora"},
["src"] = {"Logudorese Sardinian"},
["sre"] = {"Sara"},
["srf"] = {"Nafi"},
["srg"] = {"Sulod"},
["srh"] = {"Sarikoli"},
["sri"] = {"Siriano"},
["srk"] = {"Serudung Murut"},
["srl"] = {"Isirawa"},
["srm"] = {"Saramaccan"},
["srn"] = {"Sranan Tongo"},
["sro"] = {"Campidanese Sardinian"},
["srq"] = {"Sirionó"},
["srr"] = {"Serer"},
["srs"] = {"Tsuut'ina", "Sarsi"},
["srt"] = {"Sauri"},
["sru"] = {"Suruí"},
["srv"] = {"Southern Sorsoganon"},
["srw"] = {"Serua"},
["srx"] = {"Sirmauri"},
["sry"] = {"Sera"},
["srz"] = {"Shahmirzadi"},
["ssa"] = {"Nilo-Saharan languages"},
["ssb"] = {"Southern Sama"},
["ssc"] = {"Suba-Simbiti"},
["ssd"] = {"Siroi"},
["sse"] = {"Balangingi", "Bangingih Sama"},
["ssf"] = {"Thao"},
["ssg"] = {"Seimat"},
["ssh"] = {"Shihhi Arabic"},
["ssi"] = {"Sansi"},
["ssj"] = {"Sausi"},
["ssk"] = {"Sunam"},
["ssl"] = {"Western Sisaala"},
["ssm"] = {"Semnam"},
["ssn"] = {"Waata"},
["sso"] = {"Sissano"},
["ssp"] = {"Spanish Sign Language"},
["ssq"] = {"So'a"},
["ssr"] = {"Swiss-French Sign Language"},
["sss"] = {"Sô"},
["sst"] = {"Sinasina"},
["ssu"] = {"Susuami"},
["ssv"] = {"Shark Bay"},
["ssx"] = {"Samberigi"},
["ssy"] = {"Saho"},
["ssz"] = {"Sengseng"},
["sta"] = {"Settla"},
["stb"] = {"Northern Subanen"},
["std"] = {"Sentinel"},
["ste"] = {"Liana-Seti"},
["stf"] = {"Seta"},
["stg"] = {"Trieng"},
["sth"] = {"Shelta"},
["sti"] = {"Bulo Stieng"},
["stj"] = {"Matya Samo"},
["stk"] = {"Arammba"},
["stl"] = {"Stellingwerfs"},
["stm"] = {"Setaman"},
["stn"] = {"Owa"},
["sto"] = {"Stoney"},
["stp"] = {"Southeastern Tepehuan"},
["stq"] = {"Saterfriesisch"},
["str"] = {"Straits Salish"},
["sts"] = {"Shumashti"},
["stt"] = {"Budeh Stieng"},
["stu"] = {"Samtao"},
["stv"] = {"Silt'e"},
["stw"] = {"Satawalese"},
["sty"] = {"Siberian Tatar"},
["sua"] = {"Sulka"},
["sub"] = {"Suku"},
["suc"] = {"Western Subanon"},
["sue"] = {"Suena"},
["sug"] = {"Suganga"},
["sui"] = {"Suki"},
["suj"] = {"Shubi"},
["suk"] = {"Sukuma"},
["suo"] = {"Bouni"},
["suq"] = {"Tirmaga-Chai Suri", "Suri"},
["sur"] = {"Mwaghavul"},
["sus"] = {"Susu"},
["sut"] = {"Subtiaba"},
["suv"] = {"Puroik"},
["suw"] = {"Sumbwa"},
["sux"] = {"Sumerian"},
["suy"] = {"Suyá"},
["suz"] = {"Sunwar"},
["sva"] = {"Svan"},
["svb"] = {"Ulau-Suain"},
["svc"] = {"Vincentian Creole English"},
["sve"] = {"Serili"},
["svk"] = {"Slovakian Sign Language"},
["svm"] = {"Slavomolisano"},
["svs"] = {"Savosavo"},
["svx"] = {"Skalvian"},
["swb"] = {"Maore Comorian"},
["swc"] = {"Congo Swahili"},
["swf"] = {"Sere"},
["swg"] = {"Swabian"},
["swh"] = {"Swahili (individual language)", "Kiswahili"},
["swi"] = {"Sui"},
["swj"] = {"Sira"},
["swk"] = {"Malawi Sena"},
["swl"] = {"Swedish Sign Language"},
["swm"] = {"Samosa"},
["swn"] = {"Sawknah"},
["swo"] = {"Shanenawa"},
["swp"] = {"Suau"},
["swq"] = {"Sharwa"},
["swr"] = {"Saweru"},
["sws"] = {"Seluwasan"},
["swt"] = {"Sawila"},
["swu"] = {"Suwawa"},
["swv"] = {"Shekhawati"},
["sww"] = {"Sowa"},
["swx"] = {"Suruahá"},
["swy"] = {"Sarua"},
["sxb"] = {"Suba"},
["sxc"] = {"Sicanian"},
["sxe"] = {"Sighu"},
["sxg"] = {"Shuhi", "Shixing"},
["sxk"] = {"Southern Kalapuya"},
["sxl"] = {"Selian"},
["sxm"] = {"Samre"},
["sxn"] = {"Sangir"},
["sxo"] = {"Sorothaptic"},
["sxr"] = {"Saaroa"},
["sxs"] = {"Sasaru"},
["sxu"] = {"Upper Saxon"},
["sxw"] = {"Saxwe Gbe"},
["sya"] = {"Siang"},
["syb"] = {"Central Subanen"},
["syc"] = {"Classical Syriac"},
["syd"] = {"Samoyedic languages"},
["syi"] = {"Seki"},
["syk"] = {"Sukur"},
["syl"] = {"Sylheti"},
["sym"] = {"Maya Samo"},
["syn"] = {"Senaya"},
["syo"] = {"Suoy"},
["syr"] = {"Syriac"},
["sys"] = {"Sinyar"},
["syw"] = {"Kagate"},
["syx"] = {"Samay"},
["syy"] = {"Al-Sayyid Bedouin Sign Language"},
["sza"] = {"Semelai"},
["szb"] = {"Ngalum"},
["szc"] = {"Semaq Beri"},
["sze"] = {"Seze"},
["szg"] = {"Sengele"},
["szl"] = {"Silesian"},
["szn"] = {"Sula"},
["szp"] = {"Suabo"},
["szs"] = {"Solomon Islands Sign Language"},
["szv"] = {"Isubu", "Isu (Fako Division)"},
["szw"] = {"Sawai"},
["szy"] = {"Sakizaya"},
["taa"] = {"Lower Tanana"},
["tab"] = {"Tabassaran"},
["tac"] = {"Lowland Tarahumara"},
["tad"] = {"Tause"},
["tae"] = {"Tariana"},
["taf"] = {"Tapirapé"},
["tag"] = {"Tagoi"},
["tai"] = {"Tai languages"},
["taj"] = {"Eastern Tamang"},
["tak"] = {"Tala"},
["tal"] = {"Tal"},
["tan"] = {"Tangale"},
["tao"] = {"Yami"},
["tap"] = {"Taabwa"},
["taq"] = {"Tamasheq"},
["tar"] = {"Central Tarahumara"},
["tas"] = {"Tay Boi"},
["tau"] = {"Upper Tanana"},
["tav"] = {"Tatuyo"},
["taw"] = {"Tai"},
["tax"] = {"Tamki"},
["tay"] = {"Atayal"},
["taz"] = {"Tocho"},
["tba"] = {"Aikanã"},
["tbc"] = {"Takia"},
["tbd"] = {"Kaki Ae"},
["tbe"] = {"Tanimbili"},
["tbf"] = {"Mandara"},
["tbg"] = {"North Tairora"},
["tbh"] = {"Dharawal", "Thurawal"},
["tbi"] = {"Gaam"},
["tbj"] = {"Tiang"},
["tbk"] = {"Calamian Tagbanwa"},
["tbl"] = {"Tboli"},
["tbm"] = {"Tagbu"},
["tbn"] = {"Barro Negro Tunebo"},
["tbo"] = {"Tawala"},
["tbp"] = {"Taworta", "Diebroud"},
["tbq"] = {"Tibeto-Burman languages"},
["tbr"] = {"Tumtum"},
["tbs"] = {"Tanguat"},
["tbt"] = {"Tembo (Kitembo)"},
["tbu"] = {"Tubar"},
["tbv"] = {"Tobo"},
["tbw"] = {"Tagbanwa"},
["tbx"] = {"Kapin"},
["tby"] = {"Tabaru"},
["tbz"] = {"Ditammari"},
["tca"] = {"Ticuna"},
["tcb"] = {"Tanacross"},
["tcc"] = {"Datooga"},
["tcd"] = {"Tafi"},
["tce"] = {"Southern Tutchone", "Dän K'è"},
["tcf"] = {"Malinaltepec Me'phaa", "Malinaltepec Tlapanec"},
["tcg"] = {"Tamagario"},
["tch"] = {"Turks And Caicos Creole English"},
["tci"] = {"Wára"},
["tck"] = {"Tchitchege"},
["tcl"] = {"Taman (Myanmar)"},
["tcm"] = {"Tanahmerah"},
["tcn"] = {"Tichurong"},
["tco"] = {"Taungyo"},
["tcp"] = {"Tawr Chin"},
["tcq"] = {"Kaiy"},
["tcs"] = {"Torres Strait Creole", "Yumplatok"},
["tct"] = {"T'en"},
["tcu"] = {"Southeastern Tarahumara"},
["tcw"] = {"Tecpatlán Totonac"},
["tcx"] = {"Toda"},
["tcy"] = {"Tulu"},
["tcz"] = {"Thado Chin"},
["tda"] = {"Tagdal"},
["tdb"] = {"Panchpargania"},
["tdc"] = {"Emberá-Tadó"},
["tdd"] = {"Tai Nüa"},
["tde"] = {"Tiranige Diga Dogon"},
["tdf"] = {"Talieng"},
["tdg"] = {"Western Tamang"},
["tdh"] = {"Thulung"},
["tdi"] = {"Tomadino"},
["tdj"] = {"Tajio"},
["tdk"] = {"Tambas"},
["tdl"] = {"Sur"},
["tdm"] = {"Taruma"},
["tdn"] = {"Tondano"},
["tdo"] = {"Teme"},
["tdq"] = {"Tita"},
["tdr"] = {"Todrah"},
["tds"] = {"Doutai"},
["tdt"] = {"Tetun Dili"},
["tdv"] = {"Toro"},
["tdx"] = {"Tandroy-Mahafaly Malagasy"},
["tdy"] = {"Tadyawan"},
["tea"] = {"Temiar"},
["teb"] = {"Tetete"},
["tec"] = {"Terik"},
["ted"] = {"Tepo Krumen"},
["tee"] = {"Huehuetla Tepehua"},
["tef"] = {"Teressa"},
["teg"] = {"Teke-Tege"},
["teh"] = {"Tehuelche"},
["tei"] = {"Torricelli"},
["tek"] = {"Ibali Teke"},
["tem"] = {"Timne"},
["ten"] = {"Tama (Colombia)"},
["teo"] = {"Teso"},
["tep"] = {"Tepecano"},
["teq"] = {"Temein"},
["ter"] = {"Tereno"},
["tes"] = {"Tengger"},
["tet"] = {"Tetum"},
["teu"] = {"Soo"},
["tev"] = {"Teor"},
["tew"] = {"Tewa (USA)"},
["tex"] = {"Tennet"},
["tey"] = {"Tulishi"},
["tez"] = {"Tetserret"},
["tfi"] = {"Tofin Gbe"},
["tfn"] = {"Tanaina"},
["tfo"] = {"Tefaro"},
["tfr"] = {"Teribe"},
["tft"] = {"Ternate"},
["tga"] = {"Sagalla"},
["tgb"] = {"Tobilung"},
["tgc"] = {"Tigak"},
["tgd"] = {"Ciwogai"},
["tge"] = {"Eastern Gorkha Tamang"},
["tgf"] = {"Chalikha"},
["tgh"] = {"Tobagonian Creole English"},
["tgi"] = {"Lawunuia"},
["tgj"] = {"Tagin"},
["tgn"] = {"Tandaganon"},
["tgo"] = {"Sudest"},
["tgp"] = {"Tangoa"},
["tgq"] = {"Tring"},
["tgr"] = {"Tareng"},
["tgs"] = {"Nume"},
["tgt"] = {"Central Tagbanwa"},
["tgu"] = {"Tanggu"},
["tgv"] = {"Tingui-Boto"},
["tgw"] = {"Tagwana Senoufo"},
["tgx"] = {"Tagish"},
["tgy"] = {"Togoyo"},
["tgz"] = {"Tagalaka"},
["thd"] = {"Kuuk Thaayorre", "Thayore"},
["the"] = {"Chitwania Tharu"},
["thf"] = {"Thangmi"},
["thh"] = {"Northern Tarahumara"},
["thi"] = {"Tai Long"},
["thk"] = {"Tharaka", "Kitharaka"},
["thl"] = {"Dangaura Tharu"},
["thm"] = {"Aheu"},
["thn"] = {"Thachanadan"},
["thp"] = {"Thompson", "Nłeʔkepmxcín", "Thompson River Salish"},
["thq"] = {"Kochila Tharu"},
["thr"] = {"Rana Tharu"},
["ths"] = {"Thakali"},
["tht"] = {"Tahltan", "Tāłtān"},
["thu"] = {"Thuri"},
["thv"] = {"Tahaggart Tamahaq"},
["thy"] = {"Tha"},
["thz"] = {"Tayart Tamajeq"},
["tia"] = {"Tidikelt Tamazight"},
["tic"] = {"Tira"},
["tif"] = {"Tifal"},
["tig"] = {"Tigre"},
["tih"] = {"Timugon Murut"},
["tii"] = {"Tiene"},
["tij"] = {"Tilung"},
["tik"] = {"Tikar"},
["til"] = {"Tillamook"},
["tim"] = {"Timbe"},
["tin"] = {"Tindi"},
["tio"] = {"Teop"},
["tip"] = {"Trimuris"},
["tiq"] = {"Tiéfo"},
["tis"] = {"Masadiit Itneg"},
["tit"] = {"Tinigua"},
["tiu"] = {"Adasen"},
["tiv"] = {"Tiv"},
["tiw"] = {"Tiwi"},
["tix"] = {"Southern Tiwa"},
["tiy"] = {"Tiruray"},
["tiz"] = {"Tai Hongjin"},
["tja"] = {"Tajuasohn"},
["tjg"] = {"Tunjung"},
["tji"] = {"Northern Tujia"},
["tjj"] = {"Tjungundji"},
["tjl"] = {"Tai Laing"},
["tjm"] = {"Timucua"},
["tjn"] = {"Tonjon"},
["tjo"] = {"Temacine Tamazight"},
["tjp"] = {"Tjupany"},
["tjs"] = {"Southern Tujia"},
["tju"] = {"Tjurruru"},
["tjw"] = {"Djabwurrung"},
["tka"] = {"Truká"},
["tkb"] = {"Buksa"},
["tkd"] = {"Tukudede"},
["tke"] = {"Takwane"},
["tkf"] = {"Tukumanféd"},
["tkg"] = {"Tesaka Malagasy"},
["tkl"] = {"Tokelau"},
["tkm"] = {"Takelma"},
["tkn"] = {"Toku-No-Shima"},
["tkp"] = {"Tikopia"},
["tkq"] = {"Tee"},
["tkr"] = {"Tsakhur"},
["tks"] = {"Takestani"},
["tkt"] = {"Kathoriya Tharu"},
["tku"] = {"Upper Necaxa Totonac"},
["tkv"] = {"Mur Pano"},
["tkw"] = {"Teanu"},
["tkx"] = {"Tangko"},
["tkz"] = {"Takua"},
["tla"] = {"Southwestern Tepehuan"},
["tlb"] = {"Tobelo"},
["tlc"] = {"Yecuatla Totonac"},
["tld"] = {"Talaud"},
["tlf"] = {"Telefol"},
["tlg"] = {"Tofanma"},
["tlh"] = {"Klingon", "tlhIngan Hol"},
["tli"] = {"Tlingit"},
["tlj"] = {"Talinga-Bwisi"},
["tlk"] = {"Taloki"},
["tll"] = {"Tetela"},
["tlm"] = {"Tolomako"},
["tln"] = {"Talondo'"},
["tlo"] = {"Talodi"},
["tlp"] = {"Filomena Mata-Coahuitlán Totonac"},
["tlq"] = {"Tai Loi"},
["tlr"] = {"Talise"},
["tls"] = {"Tambotalo"},
["tlt"] = {"Sou Nama", "Teluti"},
["tlu"] = {"Tulehu"},
["tlv"] = {"Taliabu"},
["tlx"] = {"Khehek"},
["tly"] = {"Talysh"},
["tma"] = {"Tama (Chad)"},
["tmb"] = {"Katbol", "Avava"},
["tmc"] = {"Tumak"},
["tmd"] = {"Haruai"},
["tme"] = {"Tremembé"},
["tmf"] = {"Toba-Maskoy"},
["tmg"] = {"Ternateño"},
["tmh"] = {"Tamashek"},
["tmi"] = {"Tutuba"},
["tmj"] = {"Samarokena"},
["tml"] = {"Tamnim Citak"},
["tmm"] = {"Tai Thanh"},
["tmn"] = {"Taman (Indonesia)"},
["tmo"] = {"Temoq"},
["tmq"] = {"Tumleo"},
["tmr"] = {"Jewish Babylonian Aramaic (ca. 200-1200 CE)"},
["tms"] = {"Tima"},
["tmt"] = {"Tasmate"},
["tmu"] = {"Iau"},
["tmv"] = {"Tembo (Motembo)"},
["tmw"] = {"Temuan"},
["tmy"] = {"Tami"},
["tmz"] = {"Tamanaku"},
["tna"] = {"Tacana"},
["tnb"] = {"Western Tunebo"},
["tnc"] = {"Tanimuca-Retuarã"},
["tnd"] = {"Angosturas Tunebo"},
["tng"] = {"Tobanga"},
["tnh"] = {"Maiani"},
["tni"] = {"Tandia"},
["tnk"] = {"Kwamera"},
["tnl"] = {"Lenakel"},
["tnm"] = {"Tabla"},
["tnn"] = {"North Tanna"},
["tno"] = {"Toromono"},
["tnp"] = {"Whitesands"},
["tnq"] = {"Taino"},
["tnr"] = {"Ménik"},
["tns"] = {"Tenis"},
["tnt"] = {"Tontemboan"},
["tnu"] = {"Tay Khang"},
["tnv"] = {"Tangchangya"},
["tnw"] = {"Tonsawang"},
["tnx"] = {"Tanema"},
["tny"] = {"Tongwe"},
["tnz"] = {"Ten'edn"},
["tob"] = {"Toba"},
["toc"] = {"Coyutla Totonac"},
["tod"] = {"Toma"},
["tof"] = {"Gizrra"},
["tog"] = {"Tonga (Nyasa)"},
["toh"] = {"Gitonga"},
["toi"] = {"Tonga (Zambia)"},
["toj"] = {"Tojolabal"},
["tok"] = {"Toki Pona"},
["tol"] = {"Tolowa"},
["tom"] = {"Tombulu"},
["too"] = {"Xicotepec De Juárez Totonac"},
["top"] = {"Papantla Totonac"},
["toq"] = {"Toposa"},
["tor"] = {"Togbo-Vara Banda"},
["tos"] = {"Highland Totonac"},
["tou"] = {"Tho"},
["tov"] = {"Upper Taromi"},
["tow"] = {"Jemez"},
["tox"] = {"Tobian"},
["toy"] = {"Topoiyo"},
["toz"] = {"To"},
["tpa"] = {"Taupota"},
["tpc"] = {"Azoyú Me'phaa", "Azoyú Tlapanec"},
["tpe"] = {"Tippera"},
["tpf"] = {"Tarpia"},
["tpg"] = {"Kula"},
["tpi"] = {"Tok Pisin"},
["tpj"] = {"Tapieté"},
["tpk"] = {"Tupinikin"},
["tpl"] = {"Tlacoapa Me'phaa", "Tlacoapa Tlapanec"},
["tpm"] = {"Tampulma"},
["tpn"] = {"Tupinambá"},
["tpo"] = {"Tai Pao"},
["tpp"] = {"Pisaflores Tepehua"},
["tpq"] = {"Tukpa"},
["tpr"] = {"Tuparí"},
["tpt"] = {"Tlachichilco Tepehua"},
["tpu"] = {"Tampuan"},
["tpv"] = {"Tanapag"},
["tpx"] = {"Acatepec Me'phaa", "Acatepec Tlapanec"},
["tpy"] = {"Trumai"},
["tpz"] = {"Tinputz"},
["tqb"] = {"Tembé"},
["tql"] = {"Lehali"},
["tqm"] = {"Turumsa"},
["tqn"] = {"Tenino"},
["tqo"] = {"Toaripi"},
["tqp"] = {"Tomoip"},
["tqq"] = {"Tunni"},
["tqr"] = {"Torona"},
["tqt"] = {"Western Totonac"},
["tqu"] = {"Touo"},
["tqw"] = {"Tonkawa"},
["tra"] = {"Tirahi"},
["trb"] = {"Terebu"},
["trc"] = {"Copala Triqui"},
["trd"] = {"Turi"},
["tre"] = {"East Tarangan"},
["trf"] = {"Trinidadian Creole English"},
["trg"] = {"Lishán Didán"},
["trh"] = {"Turaka"},
["tri"] = {"Trió"},
["trj"] = {"Toram"},
["trk"] = {"Turkic languages"},
["trl"] = {"Traveller Scottish"},
["trm"] = {"Tregami"},
["trn"] = {"Trinitario"},
["tro"] = {"Tarao Naga"},
["trp"] = {"Kok Borok"},
["trq"] = {"San Martín Itunyoso Triqui"},
["trr"] = {"Taushiro"},
["trs"] = {"Chicahuaxtla Triqui"},
["trt"] = {"Tunggare"},
["tru"] = {"Turoyo", "Surayt"},
["trv"] = {"Sediq", "Seediq", "Taroko"},
["trw"] = {"Torwali"},
["trx"] = {"Tringgus-Sembaan Bidayuh"},
["try"] = {"Turung"},
["trz"] = {"Torá"},
["tsa"] = {"Tsaangi"},
["tsb"] = {"Tsamai"},
["tsc"] = {"Tswa"},
["tsd"] = {"Tsakonian"},
["tse"] = {"Tunisian Sign Language"},
["tsg"] = {"Tausug"},
["tsh"] = {"Tsuvan"},
["tsi"] = {"Tsimshian"},
["tsj"] = {"Tshangla"},
["tsk"] = {"Tseku"},
["tsl"] = {"Ts'ün-Lao"},
["tsm"] = {"Turkish Sign Language", "Türk İşaret Dili"},
["tsp"] = {"Northern Toussian"},
["tsq"] = {"Thai Sign Language"},
["tsr"] = {"Akei"},
["tss"] = {"Taiwan Sign Language"},
["tst"] = {"Tondi Songway Kiini"},
["tsu"] = {"Tsou"},
["tsv"] = {"Tsogo"},
["tsw"] = {"Tsishingini"},
["tsx"] = {"Mubami"},
["tsy"] = {"Tebul Sign Language"},
["tsz"] = {"Purepecha"},
["tta"] = {"Tutelo"},
["ttb"] = {"Gaa"},
["ttc"] = {"Tektiteko"},
["ttd"] = {"Tauade"},
["tte"] = {"Bwanabwana"},
["ttf"] = {"Tuotomb"},
["ttg"] = {"Tutong"},
["tth"] = {"Upper Ta'oih"},
["tti"] = {"Tobati"},
["ttj"] = {"Tooro"},
["ttk"] = {"Totoro"},
["ttl"] = {"Totela"},
["ttm"] = {"Northern Tutchone"},
["ttn"] = {"Towei"},
["tto"] = {"Lower Ta'oih"},
["ttp"] = {"Tombelala"},
["ttq"] = {"Tawallammat Tamajaq"},
["ttr"] = {"Tera"},
["tts"] = {"Northeastern Thai"},
["ttt"] = {"Muslim Tat"},
["ttu"] = {"Torau"},
["ttv"] = {"Titan"},
["ttw"] = {"Long Wat"},
["tty"] = {"Sikaritai"},
["ttz"] = {"Tsum"},
["tua"] = {"Wiarumus"},
["tub"] = {"Tübatulabal"},
["tuc"] = {"Mutu"},
["tud"] = {"Tuxá"},
["tue"] = {"Tuyuca"},
["tuf"] = {"Central Tunebo"},
["tug"] = {"Tunia"},
["tuh"] = {"Taulil"},
["tui"] = {"Tupuri"},
["tuj"] = {"Tugutil"},
["tul"] = {"Tula"},
["tum"] = {"Tumbuka"},
["tun"] = {"Tunica"},
["tuo"] = {"Tucano"},
["tup"] = {"Tupi languages"},
["tuq"] = {"Tedaga"},
["tus"] = {"Tuscarora"},
["tut"] = {"Altaic languages"},
["tuu"] = {"Tututni"},
["tuv"] = {"Turkana"},
["tuw"] = {"Tungus languages"},
["tux"] = {"Tuxináwa"},
["tuy"] = {"Tugen"},
["tuz"] = {"Turka"},
["tva"] = {"Vaghua"},
["tvd"] = {"Tsuvadi"},
["tve"] = {"Te'un"},
["tvg"] = {"Tugunese", "Batavian Portuguese Creole", "Mardijker Creole"},
["tvi"] = {"Tulai"},
["tvk"] = {"Southeast Ambrym"},
["tvl"] = {"Tuvalu"},
["tvm"] = {"Tela-Masbuar"},
["tvn"] = {"Tavoyan"},
["tvo"] = {"Tidore"},
["tvs"] = {"Taveta"},
["tvt"] = {"Tutsa Naga"},
["tvu"] = {"Tunen"},
["tvw"] = {"Sedoa"},
["tvx"] = {"Taivoan"},
["tvy"] = {"Timor Pidgin"},
["twa"] = {"Twana"},
["twb"] = {"Western Tawbuid"},
["twc"] = {"Teshenawa"},
["twd"] = {"Twents"},
["twe"] = {"Tewa (Indonesia)"},
["twf"] = {"Northern Tiwa"},
["twg"] = {"Tereweng"},
["twh"] = {"Tai Dón"},
["twl"] = {"Tawara"},
["twm"] = {"Tawang Monpa"},
["twn"] = {"Twendi"},
["two"] = {"Tswapong"},
["twp"] = {"Ere"},
["twq"] = {"Tasawaq"},
["twr"] = {"Southwestern Tarahumara"},
["twt"] = {"Turiwára"},
["twu"] = {"Termanu"},
["tww"] = {"Tuwari"},
["twx"] = {"Tewe"},
["twy"] = {"Tawoyan"},
["txa"] = {"Tombonuo"},
["txb"] = {"Tokharian B"},
["txc"] = {"Tsetsaut"},
["txe"] = {"Totoli"},
["txg"] = {"Tangut"},
["txh"] = {"Thracian"},
["txi"] = {"Ikpeng"},
["txj"] = {"Tarjumo"},
["txm"] = {"Tomini"},
["txn"] = {"West Tarangan"},
["txo"] = {"Toto"},
["txq"] = {"Tii"},
["txr"] = {"Tartessian"},
["txs"] = {"Tonsea"},
["txt"] = {"Citak"},
["txu"] = {"Kayapó"},
["txx"] = {"Tatana"},
["txy"] = {"Tanosy Malagasy"},
["tya"] = {"Tauya"},
["tye"] = {"Kyanga"},
["tyh"] = {"O'du"},
["tyi"] = {"Teke-Tsaayi"},
["tyj"] = {"Tai Do", "Tai Yo"},
["tyl"] = {"Thu Lao"},
["tyn"] = {"Kombai"},
["typ"] = {"Thaypan"},
["tyr"] = {"Tai Daeng"},
["tys"] = {"Tày Sa Pa"},
["tyt"] = {"Tày Tac"},
["tyu"] = {"Kua"},
["tyv"] = {"Tuvinian"},
["tyx"] = {"Teke-Tyee"},
["tyy"] = {"Tiyaa"},
["tyz"] = {"Tày"},
["tza"] = {"Tanzanian Sign Language"},
["tzh"] = {"Tzeltal"},
["tzj"] = {"Tz'utujil"},
["tzl"] = {"Talossan"},
["tzm"] = {"Central Atlas Tamazight"},
["tzn"] = {"Tugun"},
["tzo"] = {"Tzotzil"},
["tzx"] = {"Tabriak"},
["uam"] = {"Uamué"},
["uan"] = {"Kuan"},
["uar"] = {"Tairuma"},
["uba"] = {"Ubang"},
["ubi"] = {"Ubi"},
["ubl"] = {"Buhi'non Bikol"},
["ubr"] = {"Ubir"},
["ubu"] = {"Umbu-Ungu"},
["uby"] = {"Ubykh"},
["uda"] = {"Uda"},
["ude"] = {"Udihe"},
["udg"] = {"Muduga"},
["udi"] = {"Udi"},
["udj"] = {"Ujir"},
["udl"] = {"Wuzlam"},
["udm"] = {"Udmurt"},
["udu"] = {"Uduk"},
["ues"] = {"Kioko"},
["ufi"] = {"Ufim"},
["uga"] = {"Ugaritic"},
["ugb"] = {"Kuku-Ugbanh"},
["uge"] = {"Ughele"},
["ugh"] = {"Kubachi"},
["ugn"] = {"Ugandan Sign Language"},
["ugo"] = {"Ugong"},
["ugy"] = {"Uruguayan Sign Language"},
["uha"] = {"Uhami"},
["uhn"] = {"Damal"},
["uis"] = {"Uisai"},
["uiv"] = {"Iyive"},
["uji"] = {"Tanjijili"},
["uka"] = {"Kaburi"},
["ukg"] = {"Ukuriguma"},
["ukh"] = {"Ukhwejo"},
["uki"] = {"Kui (India)"},
["ukk"] = {"Muak Sa-aak"},
["ukl"] = {"Ukrainian Sign Language"},
["ukp"] = {"Ukpe-Bayobiri"},
["ukq"] = {"Ukwa"},
["uks"] = {"Urubú-Kaapor Sign Language", "Kaapor Sign Language"},
["uku"] = {"Ukue"},
["ukv"] = {"Kuku"},
["ukw"] = {"Ukwuani-Aboh-Ndoni"},
["uky"] = {"Kuuk-Yak"},
["ula"] = {"Fungwa"},
["ulb"] = {"Ulukwumi"},
["ulc"] = {"Ulch"},
["ule"] = {"Lule"},
["ulf"] = {"Usku", "Afra"},
["uli"] = {"Ulithian"},
["ulk"] = {"Meriam Mir"},
["ull"] = {"Ullatan"},
["ulm"] = {"Ulumanda'"},
["uln"] = {"Unserdeutsch"},
["ulu"] = {"Uma' Lung"},
["ulw"] = {"Ulwa"},
["uly"] = {"Buli"},
["uma"] = {"Umatilla"},
["umb"] = {"Umbundu"},
["umc"] = {"Marrucinian"},
["umd"] = {"Umbindhamu"},
["umg"] = {"Morrobalama", "Umbuygamu"},
["umi"] = {"Ukit"},
["umm"] = {"Umon"},
["umn"] = {"Makyan Naga"},
["umo"] = {"Umotína"},
["ump"] = {"Umpila"},
["umr"] = {"Umbugarla"},
["ums"] = {"Pendau"},
["umu"] = {"Munsee"},
["una"] = {"North Watut"},
["und"] = {"Undetermined"},
["une"] = {"Uneme"},
["ung"] = {"Ngarinyin"},
["uni"] = {"Uni"},
["unk"] = {"Enawené-Nawé"},
["unm"] = {"Unami"},
["unn"] = {"Kurnai"},
["unr"] = {"Mundari"},
["unu"] = {"Unubahe"},
["unx"] = {"Munda"},
["unz"] = {"Unde Kaili"},
["uon"] = {"Kulon"},
["upi"] = {"Umeda"},
["upv"] = {"Uripiv-Wala-Rano-Atchin"},
["ura"] = {"Urarina"},
["urb"] = {"Urubú-Kaapor", "Kaapor"},
["urc"] = {"Urningangg"},
["ure"] = {"Uru"},
["urf"] = {"Uradhi"},
["urg"] = {"Urigina"},
["urh"] = {"Urhobo"},
["uri"] = {"Urim"},
["urj"] = {"Uralic languages"},
["urk"] = {"Urak Lawoi'"},
["url"] = {"Urali"},
["urm"] = {"Urapmin"},
["urn"] = {"Uruangnirin"},
["uro"] = {"Ura (Papua New Guinea)"},
["urp"] = {"Uru-Pa-In"},
["urr"] = {"Lehalurup", "Löyöp"},
["urt"] = {"Urat"},
["uru"] = {"Urumi"},
["urv"] = {"Uruava"},
["urw"] = {"Sop"},
["urx"] = {"Urimo"},
["ury"] = {"Orya"},
["urz"] = {"Uru-Eu-Wau-Wau"},
["usa"] = {"Usarufa"},
["ush"] = {"Ushojo"},
["usi"] = {"Usui"},
["usk"] = {"Usaghade"},
["usp"] = {"Uspanteco"},
["uss"] = {"us-Saare"},
["usu"] = {"Uya"},
["uta"] = {"Otank"},
["ute"] = {"Ute-Southern Paiute"},
["uth"] = {"ut-Hun"},
["utp"] = {"Amba (Solomon Islands)"},
["utr"] = {"Etulo"},
["utu"] = {"Utu"},
["uum"] = {"Urum"},
["uur"] = {"Ura (Vanuatu)"},
["uuu"] = {"U"},
["uve"] = {"West Uvean", "Fagauvea"},
["uvh"] = {"Uri"},
["uvl"] = {"Lote"},
["uwa"] = {"Kuku-Uwanh"},
["uya"] = {"Doko-Uyanga"},
["uzn"] = {"Northern Uzbek"},
["uzs"] = {"Southern Uzbek"},
["vaa"] = {"Vaagri Booli"},
["vae"] = {"Vale"},
["vaf"] = {"Vafsi"},
["vag"] = {"Vagla"},
["vah"] = {"Varhadi-Nagpuri"},
["vai"] = {"Vai"},
["vaj"] = {"Sekele", "Northwestern ǃKung", "Vasekele"},
["val"] = {"Vehes"},
["vam"] = {"Vanimo"},
["van"] = {"Valman"},
["vao"] = {"Vao"},
["vap"] = {"Vaiphei"},
["var"] = {"Huarijio"},
["vas"] = {"Vasavi"},
["vau"] = {"Vanuma"},
["vav"] = {"Varli"},
["vay"] = {"Wayu"},
["vbb"] = {"Southeast Babar"},
["vbk"] = {"Southwestern Bontok"},
["vec"] = {"Venetian"},
["ved"] = {"Veddah"},
["vel"] = {"Veluws"},
["vem"] = {"Vemgo-Mabas"},
["veo"] = {"Ventureño"},
["vep"] = {"Veps"},
["ver"] = {"Mom Jango"},
["vgr"] = {"Vaghri"},
["vgt"] = {"Vlaamse Gebarentaal", "Flemish Sign Language"},
["vic"] = {"Virgin Islands Creole English"},
["vid"] = {"Vidunda"},
["vif"] = {"Vili"},
["vig"] = {"Viemo"},
["vil"] = {"Vilela"},
["vin"] = {"Vinza"},
["vis"] = {"Vishavan"},
["vit"] = {"Viti"},
["viv"] = {"Iduna"},
["vjk"] = {"Bajjika"},
["vka"] = {"Kariyarra"},
["vkj"] = {"Kujarge"},
["vkk"] = {"Kaur"},
["vkl"] = {"Kulisusu"},
["vkm"] = {"Kamakan"},
["vkn"] = {"Koro Nulu"},
["vko"] = {"Kodeoha"},
["vkp"] = {"Korlai Creole Portuguese"},
["vkt"] = {"Tenggarong Kutai Malay"},
["vku"] = {"Kurrama"},
["vkz"] = {"Koro Zuba"},
["vlp"] = {"Valpei"},
["vls"] = {"Vlaams"},
["vma"] = {"Martuyhunira"},
["vmb"] = {"Barbaram"},
["vmc"] = {"Juxtlahuaca Mixtec"},
["vmd"] = {"Mudu Koraga"},
["vme"] = {"East Masela"},
["vmf"] = {"Mainfränkisch"},
["vmg"] = {"Lungalunga"},
["vmh"] = {"Maraghei"},
["vmi"] = {"Miwa"},
["vmj"] = {"Ixtayutla Mixtec"},
["vmk"] = {"Makhuwa-Shirima"},
["vml"] = {"Malgana"},
["vmm"] = {"Mitlatongo Mixtec"},
["vmp"] = {"Soyaltepec Mazatec"},
["vmq"] = {"Soyaltepec Mixtec"},
["vmr"] = {"Marenje"},
["vms"] = {"Moksela"},
["vmu"] = {"Muluridyi"},
["vmv"] = {"Valley Maidu"},
["vmw"] = {"Makhuwa"},
["vmx"] = {"Tamazola Mixtec"},
["vmy"] = {"Ayautla Mazatec"},
["vmz"] = {"Mazatlán Mazatec"},
["vnk"] = {"Vano", "Lovono"},
["vnm"] = {"Vinmavis", "Neve'ei"},
["vnp"] = {"Vunapu"},
["vor"] = {"Voro"},
["vot"] = {"Votic"},
["vra"] = {"Vera'a"},
["vro"] = {"Võro"},
["vrs"] = {"Varisi"},
["vrt"] = {"Burmbar", "Banam Bay"},
["vsi"] = {"Moldova Sign Language"},
["vsl"] = {"Venezuelan Sign Language"},
["vsn"] = {"Vedic Sanskrit"},
["vsv"] = {"Valencian Sign Language", "Llengua de signes valenciana"},
["vto"] = {"Vitou"},
["vum"] = {"Vumbu"},
["vun"] = {"Vunjo"},
["vut"] = {"Vute"},
["vwa"] = {"Awa (China)"},
["waa"] = {"Walla Walla"},
["wab"] = {"Yote", "Wab"},
["wac"] = {"Wasco-Wishram"},
["wad"] = {"Wamesa", "Wondama"},
["wae"] = {"Walser"},
["waf"] = {"Wakoná"},
["wag"] = {"Wa'ema"},
["wah"] = {"Watubela"},
["wai"] = {"Wares"},
["waj"] = {"Waffa"},
["wak"] = {"Wakashan languages"},
["wal"] = {"Wolaytta", "Wolaitta"},
["wam"] = {"Wampanoag"},
["wan"] = {"Wan"},
["wao"] = {"Wappo"},
["wap"] = {"Wapishana"},
["waq"] = {"Wagiman"},
["war"] = {"Waray (Philippines)"},
["was"] = {"Washo"},
["wat"] = {"Kaninuwa"},
["wau"] = {"Waurá"},
["wav"] = {"Waka"},
["waw"] = {"Waiwai"},
["wax"] = {"Watam", "Marangis"},
["way"] = {"Wayana"},
["waz"] = {"Wampur"},
["wba"] = {"Warao"},
["wbb"] = {"Wabo"},
["wbe"] = {"Waritai"},
["wbf"] = {"Wara"},
["wbh"] = {"Wanda"},
["wbi"] = {"Vwanji"},
["wbj"] = {"Alagwa"},
["wbk"] = {"Waigali"},
["wbl"] = {"Wakhi"},
["wbm"] = {"Wa"},
["wbp"] = {"Warlpiri"},
["wbq"] = {"Waddar"},
["wbr"] = {"Wagdi"},
["wbs"] = {"West Bengal Sign Language"},
["wbt"] = {"Warnman"},
["wbv"] = {"Wajarri"},
["wbw"] = {"Woi"},
["wca"] = {"Yanomámi"},
["wci"] = {"Waci Gbe"},
["wdd"] = {"Wandji"},
["wdg"] = {"Wadaginam"},
["wdj"] = {"Wadjiginy"},
["wdk"] = {"Wadikali"},
["wdt"] = {"Wendat"},
["wdu"] = {"Wadjigu"},
["wdy"] = {"Wadjabangayi"},
["wea"] = {"Wewaw"},
["wec"] = {"Wè Western"},
["wed"] = {"Wedau"},
["weg"] = {"Wergaia"},
["weh"] = {"Weh"},
["wei"] = {"Kiunum"},
["wem"] = {"Weme Gbe"},
["wen"] = {"Sorbian languages"},
["weo"] = {"Wemale"},
["wep"] = {"Westphalien"},
["wer"] = {"Weri"},
["wes"] = {"Cameroon Pidgin"},
["wet"] = {"Perai"},
["weu"] = {"Rawngtu Chin"},
["wew"] = {"Wejewa"},
["wfg"] = {"Yafi", "Zorop"},
["wga"] = {"Wagaya"},
["wgb"] = {"Wagawaga"},
["wgg"] = {"Wangkangurru", "Wangganguru"},
["wgi"] = {"Wahgi"},
["wgo"] = {"Waigeo"},
["wgu"] = {"Wirangu"},
["wgy"] = {"Warrgamay"},
["wha"] = {"Sou Upaa", "Manusela"},
["whg"] = {"North Wahgi"},
["whk"] = {"Wahau Kenyah"},
["whu"] = {"Wahau Kayan"},
["wib"] = {"Southern Toussian"},
["wic"] = {"Wichita"},
["wie"] = {"Wik-Epa"},
["wif"] = {"Wik-Keyangan"},
["wig"] = {"Wik Ngathan"},
["wih"] = {"Wik-Me'anha"},
["wii"] = {"Minidien"},
["wij"] = {"Wik-Iiyanh"},
["wik"] = {"Wikalkan"},
["wil"] = {"Wilawila"},
["wim"] = {"Wik-Mungkan"},
["win"] = {"Ho-Chunk"},
["wir"] = {"Wiraféd"},
["wiu"] = {"Wiru"},
["wiv"] = {"Vitu"},
["wiy"] = {"Wiyot"},
["wja"] = {"Waja"},
["wji"] = {"Warji"},
["wka"] = {"Kw'adza"},
["wkb"] = {"Kumbaran"},
["wkd"] = {"Wakde", "Mo"},
["wkl"] = {"Kalanadi"},
["wkr"] = {"Keerray-Woorroong"},
["wku"] = {"Kunduvadi"},
["wkw"] = {"Wakawaka"},
["wky"] = {"Wangkayutyuru"},
["wla"] = {"Walio"},
["wlc"] = {"Mwali Comorian"},
["wle"] = {"Wolane"},
["wlg"] = {"Kunbarlang"},
["wlh"] = {"Welaun"},
["wli"] = {"Waioli"},
["wlk"] = {"Wailaki"},
["wll"] = {"Wali (Sudan)"},
["wlm"] = {"Middle Welsh"},
["wlo"] = {"Wolio"},
["wlr"] = {"Wailapa"},
["wls"] = {"Wallisian"},
["wlu"] = {"Wuliwuli"},
["wlv"] = {"Wichí Lhamtés Vejoz"},
["wlw"] = {"Walak"},
["wlx"] = {"Wali (Ghana)"},
["wly"] = {"Waling"},
["wma"] = {"Mawa (Nigeria)"},
["wmb"] = {"Wambaya"},
["wmc"] = {"Wamas"},
["wmd"] = {"Mamaindé"},
["wme"] = {"Wambule"},
["wmg"] = {"Western Minyag"},
["wmh"] = {"Waima'a"},
["wmi"] = {"Wamin"},
["wmm"] = {"Maiwa (Indonesia)"},
["wmn"] = {"Waamwang"},
["wmo"] = {"Wom (Papua New Guinea)"},
["wms"] = {"Wambon"},
["wmt"] = {"Walmajarri"},
["wmw"] = {"Mwani"},
["wmx"] = {"Womo"},
["wnb"] = {"Mokati"},
["wnc"] = {"Wantoat"},
["wnd"] = {"Wandarang"},
["wne"] = {"Waneci"},
["wng"] = {"Wanggom"},
["wni"] = {"Ndzwani Comorian"},
["wnk"] = {"Wanukaka"},
["wnm"] = {"Wanggamala"},
["wnn"] = {"Wunumara"},
["wno"] = {"Wano"},
["wnp"] = {"Wanap"},
["wnu"] = {"Usan"},
["wnw"] = {"Wintu"},
["wny"] = {"Wanyi", "Waanyi"},
["woa"] = {"Kuwema", "Tyaraity"},
["wob"] = {"Wè Northern"},
["woc"] = {"Wogeo"},
["wod"] = {"Wolani"},
["woe"] = {"Woleaian"},
["wof"] = {"Gambian Wolof"},
["wog"] = {"Wogamusin"},
["woi"] = {"Kamang"},
["wok"] = {"Longto"},
["wom"] = {"Wom (Nigeria)"},
["won"] = {"Wongo"},
["woo"] = {"Manombai"},
["wor"] = {"Woria"},
["wos"] = {"Hanga Hundi"},
["wow"] = {"Wawonii"},
["woy"] = {"Weyto"},
["wpc"] = {"Maco"},
["wrb"] = {"Waluwarra", "Warluwara"},
["wrg"] = {"Warungu", "Gudjal"},
["wrh"] = {"Wiradjuri"},
["wri"] = {"Wariyangga"},
["wrk"] = {"Garrwa"},
["wrl"] = {"Warlmanpa"},
["wrm"] = {"Warumungu"},
["wrn"] = {"Warnang"},
["wro"] = {"Worrorra"},
["wrp"] = {"Waropen"},
["wrr"] = {"Wardaman"},
["wrs"] = {"Waris"},
["wru"] = {"Waru"},
["wrv"] = {"Waruna"},
["wrw"] = {"Gugu Warra"},
["wrx"] = {"Wae Rana"},
["wry"] = {"Merwari"},
["wrz"] = {"Waray (Australia)"},
["wsa"] = {"Warembori"},
["wsg"] = {"Adilabad Gondi"},
["wsi"] = {"Wusi"},
["wsk"] = {"Waskia"},
["wsr"] = {"Owenia"},
["wss"] = {"Wasa"},
["wsu"] = {"Wasu"},
["wsv"] = {"Wotapuri-Katarqalai"},
["wtb"] = {"Matambwe"},
["wtf"] = {"Watiwa"},
["wth"] = {"Wathawurrung"},
["wti"] = {"Berta"},
["wtk"] = {"Watakataui"},
["wtm"] = {"Mewati"},
["wtw"] = {"Wotu"},
["wua"] = {"Wikngenchera"},
["wub"] = {"Wunambal"},
["wud"] = {"Wudu"},
["wuh"] = {"Wutunhua"},
["wul"] = {"Silimo"},
["wum"] = {"Wumbvu"},
["wun"] = {"Bungu"},
["wur"] = {"Wurrugu"},
["wut"] = {"Wutung"},
["wuu"] = {"Wu Chinese"},
["wuv"] = {"Wuvulu-Aua"},
["wux"] = {"Wulna"},
["wuy"] = {"Wauyai"},
["wwa"] = {"Waama"},
["wwb"] = {"Wakabunga"},
["wwo"] = {"Wetamut", "Dorig"},
["wwr"] = {"Warrwa"},
["www"] = {"Wawa"},
["wxa"] = {"Waxianghua"},
["wxw"] = {"Wardandi"},
["wyb"] = {"Wangaaybuwan-Ngiyambaa"},
["wyi"] = {"Woiwurrung"},
["wym"] = {"Wymysorys"},
["wyn"] = {"Wyandot"},
["wyr"] = {"Wayoró"},
["wyy"] = {"Western Fijian"},
["xaa"] = {"Andalusian Arabic"},
["xab"] = {"Sambe"},
["xac"] = {"Kachari"},
["xad"] = {"Adai"},
["xae"] = {"Aequian"},
["xag"] = {"Aghwan"},
["xai"] = {"Kaimbé"},
["xaj"] = {"Ararandewára"},
["xak"] = {"Máku"},
["xal"] = {"Kalmyk", "Oirat"},
["xam"] = {"ǀXam"},
["xan"] = {"Xamtanga"},
["xao"] = {"Khao"},
["xap"] = {"Apalachee"},
["xaq"] = {"Aquitanian"},
["xar"] = {"Karami"},
["xas"] = {"Kamas"},
["xat"] = {"Katawixi"},
["xau"] = {"Kauwera"},
["xav"] = {"Xavánte"},
["xaw"] = {"Kawaiisu"},
["xay"] = {"Kayan Mahakam"},
["xbb"] = {"Lower Burdekin"},
["xbc"] = {"Bactrian"},
["xbd"] = {"Bindal"},
["xbe"] = {"Bigambal"},
["xbg"] = {"Bunganditj"},
["xbi"] = {"Kombio"},
["xbj"] = {"Birrpayi"},
["xbm"] = {"Middle Breton"},
["xbn"] = {"Kenaboi"},
["xbo"] = {"Bolgarian"},
["xbp"] = {"Bibbulman"},
["xbr"] = {"Kambera"},
["xbw"] = {"Kambiwá"},
["xby"] = {"Batjala", "Batyala"},
["xcb"] = {"Cumbric"},
["xcc"] = {"Camunic"},
["xce"] = {"Celtiberian"},
["xcg"] = {"Cisalpine Gaulish"},
["xch"] = {"Chemakum", "Chimakum"},
["xcl"] = {"Classical Armenian"},
["xcm"] = {"Comecrudo"},
["xcn"] = {"Cotoname"},
["xco"] = {"Chorasmian"},
["xcr"] = {"Carian"},
["xct"] = {"Classical Tibetan"},
["xcu"] = {"Curonian"},
["xcv"] = {"Chuvantsy"},
["xcw"] = {"Coahuilteco"},
["xcy"] = {"Cayuse"},
["xda"] = {"Darkinyung"},
["xdc"] = {"Dacian"},
["xdk"] = {"Dharuk"},
["xdm"] = {"Edomite"},
["xdo"] = {"Kwandu"},
["xdq"] = {"Kaitag"},
["xdy"] = {"Malayic Dayak"},
["xeb"] = {"Eblan"},
["xed"] = {"Hdi"},
["xeg"] = {"ǁXegwi"},
["xel"] = {"Kelo"},
["xem"] = {"Kembayan"},
["xep"] = {"Epi-Olmec"},
["xer"] = {"Xerénte"},
["xes"] = {"Kesawai"},
["xet"] = {"Xetá"},
["xeu"] = {"Keoru-Ahia"},
["xfa"] = {"Faliscan"},
["xga"] = {"Galatian"},
["xgb"] = {"Gbin"},
["xgd"] = {"Gudang"},
["xgf"] = {"Gabrielino-Fernandeño"},
["xgg"] = {"Goreng"},
["xgi"] = {"Garingbal"},
["xgl"] = {"Galindan"},
["xgm"] = {"Dharumbal", "Guwinmal"},
["xgn"] = {"Mongolian languages"},
["xgr"] = {"Garza"},
["xgu"] = {"Unggumi"},
["xgw"] = {"Guwa"},
["xha"] = {"Harami"},
["xhc"] = {"Hunnic"},
["xhd"] = {"Hadrami"},
["xhe"] = {"Khetrani"},
["xhm"] = {"Middle Khmer (1400 to 1850 CE)"},
["xhr"] = {"Hernican"},
["xht"] = {"Hattic"},
["xhu"] = {"Hurrian"},
["xhv"] = {"Khua"},
["xib"] = {"Iberian"},
["xii"] = {"Xiri"},
["xil"] = {"Illyrian"},
["xin"] = {"Xinca"},
["xir"] = {"Xiriâna"},
["xis"] = {"Kisan"},
["xiv"] = {"Indus Valley Language"},
["xiy"] = {"Xipaya"},
["xjb"] = {"Minjungbal"},
["xjt"] = {"Jaitmatang"},
["xka"] = {"Kalkoti"},
["xkb"] = {"Northern Nago"},
["xkc"] = {"Kho'ini"},
["xkd"] = {"Mendalam Kayan"},
["xke"] = {"Kereho"},
["xkf"] = {"Khengkha"},
["xkg"] = {"Kagoro"},
["xki"] = {"Kenyan Sign Language"},
["xkj"] = {"Kajali"},
["xkk"] = {"Kachok", "Kaco'"},
["xkl"] = {"Mainstream Kenyah"},
["xkn"] = {"Kayan River Kayan"},
["xko"] = {"Kiorr"},
["xkp"] = {"Kabatei"},
["xkq"] = {"Koroni"},
["xkr"] = {"Xakriabá"},
["xks"] = {"Kumbewaha"},
["xkt"] = {"Kantosi"},
["xku"] = {"Kaamba"},
["xkv"] = {"Kgalagadi"},
["xkw"] = {"Kembra"},
["xkx"] = {"Karore"},
["xky"] = {"Uma' Lasan"},
["xkz"] = {"Kurtokha"},
["xla"] = {"Kamula"},
["xlb"] = {"Loup B"},
["xlc"] = {"Lycian"},
["xld"] = {"Lydian"},
["xle"] = {"Lemnian"},
["xlg"] = {"Ligurian (Ancient)"},
["xli"] = {"Liburnian"},
["xln"] = {"Alanic"},
["xlo"] = {"Loup A"},
["xlp"] = {"Lepontic"},
["xls"] = {"Lusitanian"},
["xlu"] = {"Cuneiform Luwian"},
["xly"] = {"Elymian"},
["xma"] = {"Mushungulu"},
["xmb"] = {"Mbonga"},
["xmc"] = {"Makhuwa-Marrevone"},
["xmd"] = {"Mbudum"},
["xme"] = {"Median"},
["xmf"] = {"Mingrelian"},
["xmg"] = {"Mengaka"},
["xmh"] = {"Kugu-Muminh"},
["xmj"] = {"Majera"},
["xmk"] = {"Ancient Macedonian"},
["xml"] = {"Malaysian Sign Language"},
["xmm"] = {"Manado Malay"},
["xmn"] = {"Manichaean Middle Persian"},
["xmo"] = {"Morerebi"},
["xmp"] = {"Kuku-Mu'inh"},
["xmq"] = {"Kuku-Mangk"},
["xmr"] = {"Meroitic"},
["xms"] = {"Moroccan Sign Language"},
["xmt"] = {"Matbat"},
["xmu"] = {"Kamu"},
["xmv"] = {"Antankarana Malagasy", "Tankarana Malagasy"},
["xmw"] = {"Tsimihety Malagasy"},
["xmx"] = {"Salawati", "Maden"},
["xmy"] = {"Mayaguduna"},
["xmz"] = {"Mori Bawah"},
["xna"] = {"Ancient North Arabian"},
["xnb"] = {"Kanakanabu"},
["xnd"] = {"Na-Dene languages"},
["xng"] = {"Middle Mongolian"},
["xnh"] = {"Kuanhua"},
["xni"] = {"Ngarigu"},
["xnj"] = {"Ngoni (Tanzania)"},
["xnk"] = {"Nganakarti"},
["xnm"] = {"Ngumbarl"},
["xnn"] = {"Northern Kankanay"},
["xno"] = {"Anglo-Norman"},
["xnq"] = {"Ngoni (Mozambique)"},
["xnr"] = {"Kangri"},
["xns"] = {"Kanashi"},
["xnt"] = {"Narragansett"},
["xnu"] = {"Nukunul"},
["xny"] = {"Nyiyaparli"},
["xnz"] = {"Kenzi", "Mattoki"},
["xoc"] = {"O'chi'chi'"},
["xod"] = {"Kokoda"},
["xog"] = {"Soga"},
["xoi"] = {"Kominimung"},
["xok"] = {"Xokleng"},
["xom"] = {"Komo (Sudan)"},
["xon"] = {"Konkomba"},
["xoo"] = {"Xukurú"},
["xop"] = {"Kopar"},
["xor"] = {"Korubo"},
["xow"] = {"Kowaki"},
["xpa"] = {"Pirriya"},
["xpb"] = {"Northeastern Tasmanian", "Pyemmairrener"},
["xpc"] = {"Pecheneg"},
["xpd"] = {"Oyster Bay Tasmanian"},
["xpe"] = {"Liberia Kpelle"},
["xpf"] = {"Southeast Tasmanian", "Nuenonne"},
["xpg"] = {"Phrygian"},
["xph"] = {"North Midlands Tasmanian", "Tyerrenoterpanner"},
["xpi"] = {"Pictish"},
["xpj"] = {"Mpalitjanh"},
["xpk"] = {"Kulina Pano"},
["xpl"] = {"Port Sorell Tasmanian"},
["xpm"] = {"Pumpokol"},
["xpn"] = {"Kapinawá"},
["xpo"] = {"Pochutec"},
["xpp"] = {"Puyo-Paekche"},
["xpq"] = {"Mohegan-Pequot"},
["xpr"] = {"Parthian"},
["xps"] = {"Pisidian"},
["xpt"] = {"Punthamara"},
["xpu"] = {"Punic"},
["xpv"] = {"Northern Tasmanian", "Tommeginne"},
["xpw"] = {"Northwestern Tasmanian", "Peerapper"},
["xpx"] = {"Southwestern Tasmanian", "Toogee"},
["xpy"] = {"Puyo"},
["xpz"] = {"Bruny Island Tasmanian"},
["xqa"] = {"Karakhanid"},
["xqt"] = {"Qatabanian"},
["xra"] = {"Krahô"},
["xrb"] = {"Eastern Karaboro"},
["xrd"] = {"Gundungurra"},
["xre"] = {"Kreye"},
["xrg"] = {"Minang"},
["xri"] = {"Krikati-Timbira"},
["xrm"] = {"Armazic"},
["xrn"] = {"Arin"},
["xrr"] = {"Raetic"},
["xrt"] = {"Aranama-Tamique"},
["xru"] = {"Marriammu"},
["xrw"] = {"Karawa"},
["xsa"] = {"Sabaean"},
["xsb"] = {"Sambal"},
["xsc"] = {"Scythian"},
["xsd"] = {"Sidetic"},
["xse"] = {"Sempan"},
["xsh"] = {"Shamang"},
["xsi"] = {"Sio"},
["xsj"] = {"Subi"},
["xsl"] = {"South Slavey", "Dene Zhatié"},
["xsm"] = {"Kasem"},
["xsn"] = {"Sanga (Nigeria)"},
["xso"] = {"Solano"},
["xsp"] = {"Silopi"},
["xsq"] = {"Makhuwa-Saka"},
["xsr"] = {"Sherpa"},
["xsu"] = {"Sanumá"},
["xsv"] = {"Sudovian"},
["xsy"] = {"Saisiyat"},
["xta"] = {"Alcozauca Mixtec"},
["xtb"] = {"Chazumba Mixtec"},
["xtc"] = {"Katcha-Kadugli-Miri"},
["xtd"] = {"Diuxi-Tilantongo Mixtec"},
["xte"] = {"Ketengban"},
["xtg"] = {"Transalpine Gaulish"},
["xth"] = {"Yitha Yitha"},
["xti"] = {"Sinicahua Mixtec"},
["xtj"] = {"San Juan Teita Mixtec"},
["xtl"] = {"Tijaltepec Mixtec"},
["xtm"] = {"Magdalena Peñasco Mixtec"},
["xtn"] = {"Northern Tlaxiaco Mixtec"},
["xto"] = {"Tokharian A"},
["xtp"] = {"San Miguel Piedras Mixtec"},
["xtq"] = {"Tumshuqese"},
["xtr"] = {"Early Tripuri"},
["xts"] = {"Sindihui Mixtec"},
["xtt"] = {"Tacahua Mixtec"},
["xtu"] = {"Cuyamecalco Mixtec"},
["xtv"] = {"Thawa"},
["xtw"] = {"Tawandê"},
["xty"] = {"Yoloxochitl Mixtec"},
["xua"] = {"Alu Kurumba"},
["xub"] = {"Betta Kurumba"},
["xud"] = {"Umiida"},
["xug"] = {"Kunigami"},
["xuj"] = {"Jennu Kurumba"},
["xul"] = {"Ngunawal", "Nunukul"},
["xum"] = {"Umbrian"},
["xun"] = {"Unggaranggu"},
["xuo"] = {"Kuo"},
["xup"] = {"Upper Umpqua"},
["xur"] = {"Urartian"},
["xut"] = {"Kuthant"},
["xuu"] = {"Kxoe", "Khwedam"},
["xve"] = {"Venetic"},
["xvi"] = {"Kamviri"},
["xvn"] = {"Vandalic"},
["xvo"] = {"Volscian"},
["xvs"] = {"Vestinian"},
["xwa"] = {"Kwaza"},
["xwc"] = {"Woccon"},
["xwd"] = {"Wadi Wadi"},
["xwe"] = {"Xwela Gbe"},
["xwg"] = {"Kwegu"},
["xwj"] = {"Wajuk"},
["xwk"] = {"Wangkumara"},
["xwl"] = {"Western Xwla Gbe"},
["xwo"] = {"Written Oirat"},
["xwr"] = {"Kwerba Mamberamo"},
["xwt"] = {"Wotjobaluk"},
["xww"] = {"Wemba Wemba"},
["xxb"] = {"Boro (Ghana)"},
["xxk"] = {"Ke'o"},
["xxm"] = {"Minkin"},
["xxr"] = {"Koropó"},
["xxt"] = {"Tambora"},
["xya"] = {"Yaygir"},
["xyb"] = {"Yandjibara"},
["xyj"] = {"Mayi-Yapi"},
["xyk"] = {"Mayi-Kulan"},
["xyl"] = {"Yalakalore"},
["xyt"] = {"Mayi-Thakurti"},
["xyy"] = {"Yorta Yorta"},
["xzh"] = {"Zhang-Zhung"},
["xzm"] = {"Zemgalian"},
["xzp"] = {"Ancient Zapotec"},
["yaa"] = {"Yaminahua"},
["yab"] = {"Yuhup"},
["yac"] = {"Pass Valley Yali"},
["yad"] = {"Yagua"},
["yae"] = {"Pumé"},
["yaf"] = {"Yaka (Democratic Republic of Congo)"},
["yag"] = {"Yámana"},
["yah"] = {"Yazgulyam"},
["yai"] = {"Yagnobi"},
["yaj"] = {"Banda-Yangere"},
["yak"] = {"Yakama"},
["yal"] = {"Yalunka"},
["yam"] = {"Yamba"},
["yan"] = {"Mayangna"},
["yao"] = {"Yao"},
["yap"] = {"Yapese"},
["yaq"] = {"Yaqui"},
["yar"] = {"Yabarana"},
["yas"] = {"Nugunu (Cameroon)"},
["yat"] = {"Yambeta"},
["yau"] = {"Yuwana"},
["yav"] = {"Yangben"},
["yaw"] = {"Yawalapití"},
["yax"] = {"Yauma"},
["yay"] = {"Agwagwune"},
["yaz"] = {"Lokaa"},
["yba"] = {"Yala"},
["ybb"] = {"Yemba"},
["ybe"] = {"West Yugur"},
["ybh"] = {"Yakha"},
["ybi"] = {"Yamphu"},
["ybj"] = {"Hasha"},
["ybk"] = {"Bokha"},
["ybl"] = {"Yukuben"},
["ybm"] = {"Yaben"},
["ybn"] = {"Yabaâna"},
["ybo"] = {"Yabong"},
["ybx"] = {"Yawiyo"},
["yby"] = {"Yaweyuha"},
["ych"] = {"Chesu"},
["ycl"] = {"Lolopo"},
["ycn"] = {"Yucuna"},
["ycp"] = {"Chepya"},
["ycr"] = {"Yilan Creole"},
["yda"] = {"Yanda"},
["ydd"] = {"Eastern Yiddish"},
["yde"] = {"Yangum Dey"},
["ydg"] = {"Yidgha"},
["ydk"] = {"Yoidik"},
["yea"] = {"Ravula"},
["yec"] = {"Yeniche"},
["yee"] = {"Yimas"},
["yei"] = {"Yeni"},
["yej"] = {"Yevanic"},
["yel"] = {"Yela"},
["yer"] = {"Tarok"},
["yes"] = {"Nyankpa"},
["yet"] = {"Yetfa"},
["yeu"] = {"Yerukula"},
["yev"] = {"Yapunda"},
["yey"] = {"Yeyi"},
["yga"] = {"Malyangapa"},
["ygi"] = {"Yiningayi"},
["ygl"] = {"Yangum Gel"},
["ygm"] = {"Yagomi"},
["ygp"] = {"Gepo"},
["ygr"] = {"Yagaria"},
["ygs"] = {"Yolŋu Sign Language"},
["ygu"] = {"Yugul"},
["ygw"] = {"Yagwoia"},
["yha"] = {"Baha Buyang"},
["yhd"] = {"Judeo-Iraqi Arabic"},
["yhl"] = {"Hlepho Phowa"},
["yhs"] = {"Yan-nhaŋu Sign Language"},
["yia"] = {"Yinggarda"},
["yif"] = {"Ache"},
["yig"] = {"Wusa Nasu"},
["yih"] = {"Western Yiddish"},
["yii"] = {"Yidiny"},
["yij"] = {"Yindjibarndi"},
["yik"] = {"Dongshanba Lalo"},
["yil"] = {"Yindjilandji"},
["yim"] = {"Yimchungru Naga"},
["yin"] = {"Riang Lai", "Yinchia"},
["yip"] = {"Pholo"},
["yiq"] = {"Miqie"},
["yir"] = {"North Awyu"},
["yis"] = {"Yis"},
["yit"] = {"Eastern Lalu"},
["yiu"] = {"Awu"},
["yiv"] = {"Northern Nisu"},
["yix"] = {"Axi Yi"},
["yiz"] = {"Azhe"},
["yka"] = {"Yakan"},
["ykg"] = {"Northern Yukaghir"},
["ykh"] = {"Khamnigan Mongol"},
["yki"] = {"Yoke"},
["ykk"] = {"Yakaikeke"},
["ykl"] = {"Khlula"},
["ykm"] = {"Kap"},
["ykn"] = {"Kua-nsi"},
["yko"] = {"Iyasa", "Yasa"},
["ykr"] = {"Yekora"},
["ykt"] = {"Kathu"},
["yku"] = {"Kuamasi"},
["yky"] = {"Yakoma"},
["yla"] = {"Yaul"},
["ylb"] = {"Yaleba"},
["yle"] = {"Yele"},
["ylg"] = {"Yelogu"},
["yli"] = {"Angguruk Yali"},
["yll"] = {"Yil"},
["ylm"] = {"Limi"},
["yln"] = {"Langnian Buyang"},
["ylo"] = {"Naluo Yi"},
["ylr"] = {"Yalarnnga"},
["ylu"] = {"Aribwaung"},
["yly"] = {"Nyâlayu", "Nyelâyu"},
["ymb"] = {"Yambes"},
["ymc"] = {"Southern Muji"},
["ymd"] = {"Muda"},
["yme"] = {"Yameo"},
["ymg"] = {"Yamongeri"},
["ymh"] = {"Mili"},
["ymi"] = {"Moji"},
["ymk"] = {"Makwe"},
["yml"] = {"Iamalele"},
["ymm"] = {"Maay"},
["ymn"] = {"Yamna", "Sunum"},
["ymo"] = {"Yangum Mon"},
["ymp"] = {"Yamap"},
["ymq"] = {"Qila Muji"},
["ymr"] = {"Malasar"},
["yms"] = {"Mysian"},
["ymx"] = {"Northern Muji"},
["ymz"] = {"Muzi"},
["yna"] = {"Aluo"},
["ynb"] = {"Yamben"},
["ynd"] = {"Yandruwandha"},
["yne"] = {"Lang'e"},
["yng"] = {"Yango"},
["ynk"] = {"Naukan Yupik"},
["ynl"] = {"Yangulam"},
["ynn"] = {"Yana"},
["yno"] = {"Yong"},
["ynq"] = {"Yendang"},
["yns"] = {"Yansi"},
["ynu"] = {"Yahuna"},
["yob"] = {"Yoba"},
["yog"] = {"Yogad"},
["yoi"] = {"Yonaguni"},
["yok"] = {"Yokuts"},
["yom"] = {"Yombe"},
["yon"] = {"Yongkom"},
["yot"] = {"Yotti"},
["yox"] = {"Yoron"},
["yoy"] = {"Yoy"},
["ypa"] = {"Phala"},
["ypb"] = {"Labo Phowa"},
["ypg"] = {"Phola"},
["yph"] = {"Phupha"},
["ypk"] = {"Yupik languages"},
["ypm"] = {"Phuma"},
["ypn"] = {"Ani Phowa"},
["ypo"] = {"Alo Phola"},
["ypp"] = {"Phupa"},
["ypz"] = {"Phuza"},
["yra"] = {"Yerakai"},
["yrb"] = {"Yareba"},
["yre"] = {"Yaouré"},
["yrk"] = {"Nenets"},
["yrl"] = {"Nhengatu"},
["yrm"] = {"Yirrk-Mel"},
["yrn"] = {"Yerong"},
["yro"] = {"Yaroamë"},
["yrs"] = {"Yarsun"},
["yrw"] = {"Yarawata"},
["yry"] = {"Yarluyandi"},
["ysc"] = {"Yassic"},
["ysd"] = {"Samatao"},
["ysg"] = {"Sonaga"},
["ysl"] = {"Yugoslavian Sign Language"},
["ysm"] = {"Myanmar Sign Language"},
["ysn"] = {"Sani"},
["yso"] = {"Nisi (China)"},
["ysp"] = {"Southern Lolopo"},
["ysr"] = {"Sirenik Yupik"},
["yss"] = {"Yessan-Mayo"},
["ysy"] = {"Sanie"},
["yta"] = {"Talu"},
["ytl"] = {"Tanglang"},
["ytp"] = {"Thopho"},
["ytw"] = {"Yout Wam"},
["yty"] = {"Yatay"},
["yua"] = {"Yucateco", "Yucatec Maya"},
["yub"] = {"Yugambal"},
["yuc"] = {"Yuchi"},
["yud"] = {"Judeo-Tripolitanian Arabic"},
["yue"] = {"Yue Chinese", "Cantonese"},
["yuf"] = {"Havasupai-Walapai-Yavapai"},
["yug"] = {"Yug"},
["yui"] = {"Yurutí"},
["yuj"] = {"Karkar-Yuri"},
["yuk"] = {"Yuki"},
["yul"] = {"Yulu"},
["yum"] = {"Quechan"},
["yun"] = {"Bena (Nigeria)"},
["yup"] = {"Yukpa"},
["yuq"] = {"Yuqui"},
["yur"] = {"Yurok"},
["yut"] = {"Yopno"},
["yuw"] = {"Yau (Morobe Province)"},
["yux"] = {"Southern Yukaghir"},
["yuy"] = {"East Yugur"},
["yuz"] = {"Yuracare"},
["yva"] = {"Yawa"},
["yvt"] = {"Yavitero"},
["ywa"] = {"Kalou"},
["ywg"] = {"Yinhawangka"},
["ywl"] = {"Western Lalu"},
["ywn"] = {"Yawanawa"},
["ywq"] = {"Wuding-Luquan Yi"},
["ywr"] = {"Yawuru"},
["ywt"] = {"Xishanba Lalo", "Central Lalo"},
["ywu"] = {"Wumeng Nasu"},
["yww"] = {"Yawarawarga"},
["yxa"] = {"Mayawali"},
["yxg"] = {"Yagara"},
["yxl"] = {"Yardliyawarra"},
["yxm"] = {"Yinwum"},
["yxu"] = {"Yuyu"},
["yxy"] = {"Yabula Yabula"},
["yyr"] = {"Yir Yoront"},
["yyu"] = {"Yau (Sandaun Province)"},
["yyz"] = {"Ayizi"},
["yzg"] = {"E'ma Buyang"},
["yzk"] = {"Zokhuo"},
["zaa"] = {"Sierra de Juárez Zapotec"},
["zab"] = {"Western Tlacolula Valley Zapotec", "San Juan Guelavía Zapotec"},
["zac"] = {"Ocotlán Zapotec"},
["zad"] = {"Cajonos Zapotec"},
["zae"] = {"Yareni Zapotec"},
["zaf"] = {"Ayoquesco Zapotec"},
["zag"] = {"Zaghawa"},
["zah"] = {"Zangwal"},
["zai"] = {"Isthmus Zapotec"},
["zaj"] = {"Zaramo"},
["zak"] = {"Zanaki"},
["zal"] = {"Zauzou"},
["zam"] = {"Miahuatlán Zapotec"},
["zao"] = {"Ozolotepec Zapotec"},
["zap"] = {"Zapotec"},
["zaq"] = {"Aloápam Zapotec"},
["zar"] = {"Rincón Zapotec"},
["zas"] = {"Santo Domingo Albarradas Zapotec"},
["zat"] = {"Tabaa Zapotec"},
["zau"] = {"Zangskari"},
["zav"] = {"Yatzachi Zapotec"},
["zaw"] = {"Mitla Zapotec"},
["zax"] = {"Xadani Zapotec"},
["zay"] = {"Zayse-Zergulla", "Zaysete"},
["zaz"] = {"Zari"},
["zba"] = {"Balaibalan"},
["zbc"] = {"Central Berawan"},
["zbe"] = {"East Berawan"},
["zbl"] = {"Blissymbols", "Bliss", "Blissymbolics"},
["zbt"] = {"Batui"},
["zbu"] = {"Bu (Bauchi State)"},
["zbw"] = {"West Berawan"},
["zca"] = {"Coatecas Altas Zapotec"},
["zcd"] = {"Las Delicias Zapotec"},
["zch"] = {"Central Hongshuihe Zhuang"},
["zdj"] = {"Ngazidja Comorian"},
["zea"] = {"Zeeuws"},
["zeg"] = {"Zenag"},
["zeh"] = {"Eastern Hongshuihe Zhuang"},
["zem"] = {"Zeem"},
["zen"] = {"Zenaga"},
["zga"] = {"Kinga"},
["zgb"] = {"Guibei Zhuang"},
["zgh"] = {"Standard Moroccan Tamazight"},
["zgm"] = {"Minz Zhuang"},
["zgn"] = {"Guibian Zhuang"},
["zgr"] = {"Magori"},
["zhb"] = {"Zhaba"},
["zhd"] = {"Dai Zhuang"},
["zhi"] = {"Zhire"},
["zhk"] = {"Kurdish Sign Language"},
["zhn"] = {"Nong Zhuang"},
["zhw"] = {"Zhoa"},
["zhx"] = {"Chinese (family)"},
["zia"] = {"Zia"},
["zib"] = {"Zimbabwe Sign Language"},
["zik"] = {"Zimakani"},
["zil"] = {"Zialo"},
["zim"] = {"Mesme"},
["zin"] = {"Zinza"},
["ziw"] = {"Zigula"},
["ziz"] = {"Zizilivakan"},
["zka"] = {"Kaimbulawa"},
["zkd"] = {"Kadu"},
["zkg"] = {"Koguryo"},
["zkh"] = {"Khorezmian"},
["zkk"] = {"Karankawa"},
["zkn"] = {"Kanan"},
["zko"] = {"Kott"},
["zkp"] = {"São Paulo Kaingáng"},
["zkr"] = {"Zakhring"},
["zkt"] = {"Kitan"},
["zku"] = {"Kaurna"},
["zkv"] = {"Krevinian"},
["zkz"] = {"Khazar"},
["zla"] = {"Zula"},
["zle"] = {"East Slavic languages"},
["zlj"] = {"Liujiang Zhuang"},
["zlm"] = {"Malay (individual language)"},
["zln"] = {"Lianshan Zhuang"},
["zlq"] = {"Liuqian Zhuang"},
["zls"] = {"South Slavic languages"},
["zlu"] = {"Zul"},
["zlw"] = {"West Slavic languages"},
["zma"] = {"Manda (Australia)"},
["zmb"] = {"Zimba"},
["zmc"] = {"Margany"},
["zmd"] = {"Maridan"},
["zme"] = {"Mangerr"},
["zmf"] = {"Mfinu"},
["zmg"] = {"Marti Ke"},
["zmh"] = {"Makolkol"},
["zmi"] = {"Negeri Sembilan Malay"},
["zmj"] = {"Maridjabin"},
["zmk"] = {"Mandandanyi"},
["zml"] = {"Matngala"},
["zmm"] = {"Marimanindji", "Marramaninyshi"},
["zmn"] = {"Mbangwe"},
["zmo"] = {"Molo"},
["zmp"] = {"Mbuun"},
["zmq"] = {"Mituku"},
["zmr"] = {"Maranunggu"},
["zms"] = {"Mbesa"},
["zmt"] = {"Maringarr"},
["zmu"] = {"Muruwari"},
["zmv"] = {"Mbariman-Gudhinma"},
["zmw"] = {"Mbo (Democratic Republic of Congo)"},
["zmx"] = {"Bomitaba"},
["zmy"] = {"Mariyedi"},
["zmz"] = {"Mbandja"},
["zna"] = {"Zan Gula"},
["znd"] = {"Zande languages"},
["zne"] = {"Zande (individual language)"},
["zng"] = {"Mang"},
["znk"] = {"Manangkari"},
["zns"] = {"Mangas"},
["zoc"] = {"Copainalá Zoque"},
["zoh"] = {"Chimalapa Zoque"},
["zom"] = {"Zou"},
["zoo"] = {"Asunción Mixtepec Zapotec"},
["zoq"] = {"Tabasco Zoque"},
["zor"] = {"Rayón Zoque"},
["zos"] = {"Francisco León Zoque"},
["zpa"] = {"Lachiguiri Zapotec"},
["zpb"] = {"Yautepec Zapotec"},
["zpc"] = {"Choapan Zapotec"},
["zpd"] = {"Southeastern Ixtlán Zapotec"},
["zpe"] = {"Petapa Zapotec"},
["zpf"] = {"San Pedro Quiatoni Zapotec"},
["zpg"] = {"Guevea De Humboldt Zapotec"},
["zph"] = {"Totomachapan Zapotec"},
["zpi"] = {"Santa María Quiegolani Zapotec"},
["zpj"] = {"Quiavicuzas Zapotec"},
["zpk"] = {"Tlacolulita Zapotec"},
["zpl"] = {"Lachixío Zapotec"},
["zpm"] = {"Mixtepec Zapotec"},
["zpn"] = {"Santa Inés Yatzechi Zapotec"},
["zpo"] = {"Amatlán Zapotec"},
["zpp"] = {"El Alto Zapotec"},
["zpq"] = {"Zoogocho Zapotec"},
["zpr"] = {"Santiago Xanica Zapotec"},
["zps"] = {"Coatlán Zapotec"},
["zpt"] = {"San Vicente Coatlán Zapotec"},
["zpu"] = {"Yalálag Zapotec"},
["zpv"] = {"Chichicapan Zapotec"},
["zpw"] = {"Zaniza Zapotec"},
["zpx"] = {"San Baltazar Loxicha Zapotec"},
["zpy"] = {"Mazaltepec Zapotec"},
["zpz"] = {"Texmelucan Zapotec"},
["zqe"] = {"Qiubei Zhuang"},
["zra"] = {"Kara (Korea)"},
["zrg"] = {"Mirgan"},
["zrn"] = {"Zerenkel"},
["zro"] = {"Záparo"},
["zrp"] = {"Zarphatic"},
["zrs"] = {"Mairasi"},
["zsa"] = {"Sarasira"},
["zsk"] = {"Kaskean"},
["zsl"] = {"Zambian Sign Language"},
["zsm"] = {"Standard Malay"},
["zsr"] = {"Southern Rincon Zapotec"},
["zsu"] = {"Sukurum"},
["zte"] = {"Elotepec Zapotec"},
["ztg"] = {"Xanaguía Zapotec"},
["ztl"] = {"Lapaguía-Guivini Zapotec"},
["ztm"] = {"San Agustín Mixtepec Zapotec"},
["ztn"] = {"Santa Catarina Albarradas Zapotec"},
["ztp"] = {"Loxicha Zapotec"},
["ztq"] = {"Quioquitani-Quierí Zapotec"},
["zts"] = {"Tilquiapan Zapotec"},
["ztt"] = {"Tejalapan Zapotec"},
["ztu"] = {"Güilá Zapotec"},
["ztx"] = {"Zaachila Zapotec"},
["zty"] = {"Yatee Zapotec"},
["zuh"] = {"Tokano"},
["zum"] = {"Kumzari"},
["zun"] = {"Zuni"},
["zuy"] = {"Zumaya"},
["zwa"] = {"Zay"},
["zxx"] = {"No linguistic content", "Not applicable"},
["zyb"] = {"Yongbei Zhuang"},
["zyg"] = {"Yang Zhuang"},
["zyj"] = {"Youjiang Zhuang"},
["zyn"] = {"Yongnan Zhuang"},
["zyp"] = {"Zyphe Chin"},
["zza"] = {"Zaza", "Dimili", "Dimli (macrolanguage)", "Kirdki", "Kirmanjki (macrolanguage)", "Zazaki"},
["zzj"] = {"Zuojiang Zhuang"}
}
local deprecated = {
["bh"] = {"Bihari languages"},
["in"] = {"Indonesian"},
["iw"] = {"Hebrew"},
["ji"] = {"Yiddish"},
["jw"] = {"Javanese"},
["mo"] = {"Moldavian", "Moldovan"},
["aam"] = {"Aramanik"},
["adp"] = {"Adap"},
["agp"] = {"Paranan"},
["ais"] = {"Nataoran Amis"},
["ajp"] = {"South Levantine Arabic"},
["ajt"] = {"Judeo-Tunisian Arabic"},
["aoh"] = {"Arma"},
["asd"] = {"Asas"},
["aue"] = {"ǂKxʼauǁʼein"},
["ayx"] = {"Ayi (China)"},
["ayy"] = {"Tayabas Ayta"},
["baz"] = {"Tunen"},
["bbz"] = {"Babalia Creole Arabic"},
["bgm"] = {"Baga Mboteni"},
["bhk"] = {"Albay Bicolano"},
["bic"] = {"Bikaru"},
["bij"] = {"Vaghat-Ya-Bijim-Legeri"},
["bjd"] = {"Bandjigali"},
["bjq"] = {"Southern Betsimisaraka Malagasy"},
["bkb"] = {"Finallig"},
["blg"] = {"Balau"},
["bmy"] = {"Bemba (Democratic Republic of Congo)"},
["bpb"] = {"Barbacoas"},
["btb"] = {"Beti (Cameroon)"},
["btl"] = {"Bhatola"},
["bxx"] = {"Borna (Democratic Republic of Congo)"},
["byy"] = {"Buya"},
["cbe"] = {"Chipiajes"},
["cbh"] = {"Cagua"},
["cca"] = {"Cauca"},
["ccq"] = {"Chaungtha"},
["cdg"] = {"Chamari"},
["cjr"] = {"Chorotega"},
["cka"] = {"Khumi Awa Chin"},
["cmk"] = {"Chimakum"},
["coy"] = {"Coyaima"},
["cqu"] = {"Chilean Quechua"},
["cug"] = {"Chungmboko", "Cung"},
["cum"] = {"Cumeral"},
["daf"] = {"Dan"},
["dap"] = {"Nisi (India)"},
["dek"] = {"Dek"},
["dgu"] = {"Degaru"},
["dha"] = {"Dhanwar (India)"},
["dit"] = {"Dirari"},
["djl"] = {"Djiwarli"},
["dkl"] = {"Kolum So Dogon"},
["drh"] = {"Darkhat"},
["drr"] = {"Dororo"},
["drw"] = {"Darwazi"},
["dud"] = {"Hun-Saare"},
["duj"] = {"Dhuwal"},
["dwl"] = {"Walo Kumbe Dogon"},
["ekc"] = {"Eastern Karnic"},
["elp"] = {"Elpaputih"},
["emo"] = {"Emok"},
["gav"] = {"Gabutamon"},
["gbc"] = {"Garawa"},
["gfx"] = {"Mangetti Dune ǃXung"},
["ggn"] = {"Eastern Gurung"},
["ggo"] = {"Southern Gondi"},
["ggr"] = {"Aghu Tharnggalu"},
["gio"] = {"Gelao"},
["gji"] = {"Geji"},
["gli"] = {"Guliguli"},
["gti"] = {"Gbati-ri"},
["guv"] = {"Gey"},
["hrr"] = {"Horuru"},
["iap"] = {"Iapama"},
["ibi"] = {"Ibilo"},
["ill"] = {"Iranun"},
["ilw"] = {"Talur"},
["ime"] = {"Imeraguen"},
["izi"] = {"Izi-Ezaa-Ikwo-Mgbo"},
["jar"] = {"Jarawa (Nigeria)"},
["jeg"] = {"Jeng"},
["kbf"] = {"Kakauhua"},
["kdv"] = {"Kado"},
["kgc"] = {"Kasseng"},
["kgd"] = {"Kataang"},
["kgh"] = {"Upper Tanudan Kalinga"},
["kgm"] = {"Karipúna"},
["kjf"] = {"Khalaj [Indo-Iranian]"},
["koj"] = {"Sara Dunjo"},
["kox"] = {"Coxima"},
["kpp"] = {"Paku Karen"},
["krm"] = {"Krim"},
["ksa"] = {"Shuwa-Zamani"},
["ktr"] = {"Kota Marudu Tinagas"},
["kvs"] = {"Kunggara"},
["kwq"] = {"Kwak"},
["kxe"] = {"Kakihum"},
["kxl"] = {"Nepali Kurux"},
["kxu"] = {"Kui (India)"},
["kzh"] = {"Kenuzi-Dongola"},
["kzj"] = {"Coastal Kadazan"},
["kzt"] = {"Tambunan Dusun"},
["lak"] = {"Laka (Nigeria)"},
["lba"] = {"Lui"},
["leg"] = {"Lengua"},
["lii"] = {"Lingkhim"},
["llo"] = {"Khlor"},
["lmm"] = {"Lamam"},
["lmz"] = {"Lumbee"},
["lno"] = {"Lango (South Sudan)"},
["lsg"] = {"Lyons Sign Language"},
["meg"] = {"Mea"},
["mgx"] = {"Omati"},
["mhh"] = {"Maskoy Pidgin"},
["mja"] = {"Mahei"},
["mld"] = {"Malakhel"},
["mnt"] = {"Maykulan"},
["mof"] = {"Mohegan-Montauk-Narragansett"},
["mrd"] = {"Western Magar"},
["mst"] = {"Cataelano Mandaya"},
["mvm"] = {"Muya"},
["mwd"] = {"Mudbura"},
["mwj"] = {"Maligo"},
["mwx"] = {"Mediak"},
["mwy"] = {"Mosiro"},
["myd"] = {"Maramba"},
["myi"] = {"Mina (India)"},
["myq"] = {"Forest Maninka"},
["myt"] = {"Sangab Mandaya"},
["nad"] = {"Nijadali"},
["nbf"] = {"Naxi"},
["nbx"] = {"Ngura"},
["ncp"] = {"Ndaktup"},
["ngo"] = {"Ngoni"},
["nln"] = {"Durango Nahuatl"},
["nlr"] = {"Ngarla"},
["nns"] = {"Ningye"},
["nnx"] = {"Ngong"},
["nom"] = {"Nocamán"},
["noo"] = {"Nootka"},
["nte"] = {"Nathembo"},
["nts"] = {"Natagaimas"},
["nxu"] = {"Narau"},
["ome"] = {"Omejes"},
["oun"] = {"ǃOǃung"},
["pat"] = {"Papitalai"},
["pbz"] = {"Palu"},
["pcr"] = {"Panang"},
["pgy"] = {"Pongyong"},
["pii"] = {"Pini"},
["plj"] = {"Polci"},
["plp"] = {"Palpa"},
["pmc"] = {"Palumata"},
["pmk"] = {"Pamlico"},
["pmu"] = {"Mirpur Panjabi"},
["pod"] = {"Ponares"},
["ppa"] = {"Pao"},
["ppr"] = {"Piru"},
["prb"] = {"Lua'"},
["prp"] = {"Parsi"},
["pry"] = {"Pray 3"},
["puk"] = {"Pu Ko"},
["puz"] = {"Purum Naga"},
["rie"] = {"Rien"},
["rmr"] = {"Caló"},
["rna"] = {"Runa"},
["rsi"] = {"Rennellese Sign Language"},
["sap"] = {"Sanapaná"},
["sca"] = {"Sansu"},
["sdm"] = {"Semandang"},
["sgl"] = {"Sanglechi-Ishkashimi"},
["sgo"] = {"Songa"},
["shl"] = {"Shendu"},
["skk"] = {"Sok"},
["slq"] = {"Salchuq"},
["smd"] = {"Sama"},
["snb"] = {"Sebuyau"},
["snh"] = {"Shinabo"},
["sul"] = {"Surigaonon"},
["sum"] = {"Sumo-Mayangna"},
["svr"] = {"Savara"},
["szd"] = {"Seru"},
["tbb"] = {"Tapeba"},
["tdu"] = {"Tempasuk Dusun"},
["tgg"] = {"Tangga"},
["thc"] = {"Tai Hang Tong"},
["thw"] = {"Thudam"},
["thx"] = {"The"},
["tid"] = {"Tidong"},
["tie"] = {"Tingal"},
["tkk"] = {"Takpa"},
["tlw"] = {"South Wemale"},
["tmk"] = {"Northwestern Tamang"},
["tmp"] = {"Tai Mène"},
["tne"] = {"Tinoc Kallahan"},
["tnf"] = {"Tangshewi"},
["toe"] = {"Tomedes"},
["tpw"] = {"Tupí"},
["tsf"] = {"Southwestern Tamang"},
["unp"] = {"Worora"},
["uok"] = {"Uokha"},
["uun"] = {"Kulon-Pazeh"},
["vki"] = {"Ija-Zuba"},
["wgw"] = {"Wagawaga"},
["wit"] = {"Wintu"},
["wiw"] = {"Wirangu"},
["wra"] = {"Warapu"},
["wrd"] = {"Warduji"},
["wya"] = {"Wyandot"},
["xba"] = {"Kamba (Brazil)"},
["xbx"] = {"Kabixí"},
["xia"] = {"Xiandao"},
["xip"] = {"Xipináwa"},
["xkh"] = {"Karahawyana"},
["xrq"] = {"Karranga"},
["xss"] = {"Assan"},
["xtz"] = {"Tasmanian"},
["ybd"] = {"Yangbye"},
["yds"] = {"Yiddish Sign Language"},
["yen"] = {"Yendang"},
["yiy"] = {"Yir Yoront"},
["yma"] = {"Yamphe"},
["ymt"] = {"Mator-Taygi-Karagas"},
["ynh"] = {"Yangho"},
["yol"] = {"Yola"},
["yos"] = {"Yos"},
["yri"] = {"Yarí"},
["yuu"] = {"Yugh"},
["zir"] = {"Ziriya"},
["zkb"] = {"Koibal"},
["zua"] = {"Zeem"}
}
return {
active = active,
deprecated = deprecated,
}
dwxccqkm27xvpvxbjnwmpa3l7h226s0
32902
32901
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lang/data/iana_languages]]
32901
Scribunto
text/plain
-- File-Date: 2026-09-17
local active = {
["aa"] = {"Afar"},
["ab"] = {"Abkhazian"},
["ae"] = {"Avestan"},
["af"] = {"Afrikaans"},
["ak"] = {"Akan"},
["am"] = {"Amharic"},
["an"] = {"Aragonese"},
["ar"] = {"Arabic"},
["as"] = {"Assamese"},
["av"] = {"Avaric"},
["ay"] = {"Aymara"},
["az"] = {"Azerbaijani"},
["ba"] = {"Bashkir"},
["be"] = {"Belarusian"},
["bg"] = {"Bulgarian"},
["bi"] = {"Bislama"},
["bm"] = {"Bambara"},
["bn"] = {"Bengali", "Bangla"},
["bo"] = {"Tibetan"},
["br"] = {"Breton"},
["bs"] = {"Bosnian"},
["ca"] = {"Catalan", "Valencian"},
["ce"] = {"Chechen"},
["ch"] = {"Chamorro"},
["co"] = {"Corsican"},
["cr"] = {"Cree"},
["cs"] = {"Czech"},
["cu"] = {"Church Slavic", "Church Slavonic", "Old Bulgarian", "Old Church Slavonic", "Old Slavonic"},
["cv"] = {"Chuvash"},
["cy"] = {"Welsh"},
["da"] = {"Danish"},
["de"] = {"German"},
["dv"] = {"Dhivehi", "Divehi", "Maldivian"},
["dz"] = {"Dzongkha"},
["ee"] = {"Ewe"},
["el"] = {"Modern Greek (1453-)"},
["en"] = {"English"},
["eo"] = {"Esperanto"},
["es"] = {"Spanish", "Castilian"},
["et"] = {"Estonian"},
["eu"] = {"Basque"},
["fa"] = {"Persian"},
["ff"] = {"Fulah"},
["fi"] = {"Finnish"},
["fj"] = {"Fijian"},
["fo"] = {"Faroese"},
["fr"] = {"French"},
["fy"] = {"Western Frisian"},
["ga"] = {"Irish"},
["gd"] = {"Scottish Gaelic", "Gaelic"},
["gl"] = {"Galician"},
["gn"] = {"Guarani"},
["gu"] = {"Gujarati"},
["gv"] = {"Manx"},
["ha"] = {"Hausa"},
["he"] = {"Hebrew"},
["hi"] = {"Hindi"},
["ho"] = {"Hiri Motu"},
["hr"] = {"Croatian"},
["ht"] = {"Haitian", "Haitian Creole"},
["hu"] = {"Hungarian"},
["hy"] = {"Armenian"},
["hz"] = {"Herero"},
["ia"] = {"Interlingua (IALA)", "Interlingua (International Auxiliary Language Association)"},
["id"] = {"Indonesian"},
["ie"] = {"Interlingue", "Occidental"},
["ig"] = {"Igbo"},
["ii"] = {"Sichuan Yi", "Nuosu"},
["ik"] = {"Inupiaq"},
["io"] = {"Ido"},
["is"] = {"Icelandic"},
["it"] = {"Italian"},
["iu"] = {"Inuktitut"},
["ja"] = {"Japanese"},
["jv"] = {"Javanese"},
["ka"] = {"Georgian"},
["kg"] = {"Kongo"},
["ki"] = {"Kikuyu", "Gikuyu"},
["kj"] = {"Kuanyama", "Kwanyama"},
["kk"] = {"Kazakh"},
["kl"] = {"Kalaallisut", "Greenlandic"},
["km"] = {"Khmer", "Central Khmer"},
["kn"] = {"Kannada"},
["ko"] = {"Korean"},
["kr"] = {"Kanuri"},
["ks"] = {"Kashmiri"},
["ku"] = {"Kurdish"},
["kv"] = {"Komi"},
["kw"] = {"Cornish"},
["ky"] = {"Kirghiz", "Kyrgyz"},
["la"] = {"Latin"},
["lb"] = {"Luxembourgish", "Letzeburgesch"},
["lg"] = {"Ganda", "Luganda"},
["li"] = {"Limburgan", "Limburger", "Limburgish"},
["ln"] = {"Lingala"},
["lo"] = {"Lao"},
["lt"] = {"Lithuanian"},
["lu"] = {"Luba-Katanga"},
["lv"] = {"Latvian"},
["mg"] = {"Malagasy"},
["mh"] = {"Marshallese"},
["mi"] = {"Maori"},
["mk"] = {"Macedonian"},
["ml"] = {"Malayalam"},
["mn"] = {"Mongolian"},
["mr"] = {"Marathi"},
["ms"] = {"Malay (macrolanguage)"},
["mt"] = {"Maltese"},
["my"] = {"Burmese"},
["na"] = {"Nauru"},
["nb"] = {"Norwegian Bokmål"},
["nd"] = {"North Ndebele"},
["ne"] = {"Nepali (macrolanguage)"},
["ng"] = {"Ndonga"},
["nl"] = {"Dutch", "Flemish"},
["nn"] = {"Norwegian Nynorsk"},
["no"] = {"Norwegian"},
["nr"] = {"South Ndebele"},
["nv"] = {"Navajo", "Navaho"},
["ny"] = {"Chichewa", "Chewa", "Nyanja"},
["oc"] = {"Occitan (post 1500)"},
["oj"] = {"Ojibwa"},
["om"] = {"Oromo"},
["or"] = {"Oriya (macrolanguage)", "Odia (macrolanguage)"},
["os"] = {"Iron Ossetic", "Iron", "Iron Ossetian", "Ossetian", "Ossetic"},
["pa"] = {"Panjabi", "Punjabi"},
["pi"] = {"Pali"},
["pl"] = {"Polish"},
["ps"] = {"Pushto", "Pashto"},
["pt"] = {"Portuguese"},
["qu"] = {"Quechua"},
["rm"] = {"Romansh"},
["rn"] = {"Rundi"},
["ro"] = {"Romanian", "Moldavian", "Moldovan"},
["ru"] = {"Russian"},
["rw"] = {"Kinyarwanda"},
["sa"] = {"Sanskrit"},
["sc"] = {"Sardinian"},
["sd"] = {"Sindhi"},
["se"] = {"Northern Sami"},
["sg"] = {"Sango"},
["sh"] = {"Serbo-Croatian"},
["si"] = {"Sinhala", "Sinhalese"},
["sk"] = {"Slovak"},
["sl"] = {"Slovenian"},
["sm"] = {"Samoan"},
["sn"] = {"Shona"},
["so"] = {"Somali"},
["sq"] = {"Albanian"},
["sr"] = {"Serbian"},
["ss"] = {"Swati"},
["st"] = {"Southern Sotho"},
["su"] = {"Sundanese"},
["sv"] = {"Swedish"},
["sw"] = {"Swahili (macrolanguage)"},
["ta"] = {"Tamil"},
["te"] = {"Telugu"},
["tg"] = {"Tajik"},
["th"] = {"Thai"},
["ti"] = {"Tigrinya"},
["tk"] = {"Turkmen"},
["tl"] = {"Tagalog"},
["tn"] = {"Tswana"},
["to"] = {"Tonga (Tonga Islands)"},
["tr"] = {"Turkish"},
["ts"] = {"Tsonga"},
["tt"] = {"Tatar"},
["tw"] = {"Twi"},
["ty"] = {"Tahitian"},
["ug"] = {"Uighur", "Uyghur"},
["uk"] = {"Ukrainian"},
["ur"] = {"Urdu"},
["uz"] = {"Uzbek"},
["ve"] = {"Venda"},
["vi"] = {"Vietnamese"},
["vo"] = {"Volapük"},
["wa"] = {"Walloon"},
["wo"] = {"Wolof"},
["xh"] = {"Xhosa"},
["yi"] = {"Yiddish"},
["yo"] = {"Yoruba"},
["za"] = {"Zhuang", "Chuang"},
["zh"] = {"Chinese"},
["zu"] = {"Zulu"},
["aaa"] = {"Ghotuo"},
["aab"] = {"Alumu-Tesu"},
["aac"] = {"Ari"},
["aad"] = {"Amal"},
["aae"] = {"Arbëreshë Albanian"},
["aaf"] = {"Aranadan"},
["aag"] = {"Ambrak"},
["aah"] = {"Abu' Arapesh"},
["aai"] = {"Arifama-Miniafia"},
["aak"] = {"Ankave"},
["aal"] = {"Afade"},
["aan"] = {"Anambé"},
["aao"] = {"Algerian Saharan Arabic"},
["aap"] = {"Pará Arára"},
["aaq"] = {"Eastern Abnaki"},
["aas"] = {"Aasáx"},
["aat"] = {"Arvanitika Albanian"},
["aau"] = {"Abau"},
["aav"] = {"Austro-Asiatic languages"},
["aaw"] = {"Solong"},
["aax"] = {"Mandobo Atas"},
["aaz"] = {"Amarasi"},
["aba"] = {"Abé"},
["abb"] = {"Bankon"},
["abc"] = {"Ambala Ayta"},
["abd"] = {"Manide"},
["abe"] = {"Western Abnaki"},
["abf"] = {"Abai Sungai"},
["abg"] = {"Abaga"},
["abh"] = {"Tajiki Arabic"},
["abi"] = {"Abidji"},
["abj"] = {"Aka-Bea"},
["abl"] = {"Lampung Nyo"},
["abm"] = {"Abanyom"},
["abn"] = {"Abua"},
["abo"] = {"Abon"},
["abp"] = {"Abellen Ayta"},
["abq"] = {"Abaza"},
["abr"] = {"Abron"},
["abs"] = {"Ambonese Malay"},
["abt"] = {"Ambulas"},
["abu"] = {"Abure"},
["abv"] = {"Baharna Arabic"},
["abw"] = {"Pal"},
["abx"] = {"Inabaknon"},
["aby"] = {"Aneme Wake"},
["abz"] = {"Abui"},
["aca"] = {"Achagua"},
["acb"] = {"Áncá"},
["acd"] = {"Gikyode"},
["ace"] = {"Achinese"},
["acf"] = {"Saint Lucian Creole French"},
["ach"] = {"Acoli"},
["aci"] = {"Aka-Cari"},
["ack"] = {"Aka-Kora"},
["acl"] = {"Akar-Bale"},
["acm"] = {"Mesopotamian Arabic"},
["acn"] = {"Achang"},
["acp"] = {"Eastern Acipa"},
["acq"] = {"Ta'izzi-Adeni Arabic"},
["acr"] = {"Achi"},
["acs"] = {"Acroá"},
["act"] = {"Achterhoeks"},
["acu"] = {"Achuar-Shiwiar"},
["acv"] = {"Achumawi"},
["acw"] = {"Hijazi Arabic"},
["acx"] = {"Omani Arabic"},
["acy"] = {"Cypriot Arabic"},
["acz"] = {"Acheron"},
["ada"] = {"Adangme"},
["adb"] = {"Atauran"},
["add"] = {"Lidzonka", "Dzodinka"},
["ade"] = {"Adele"},
["adf"] = {"Dhofari Arabic"},
["adg"] = {"Andegerebinha"},
["adh"] = {"Adhola"},
["adi"] = {"Adi"},
["adj"] = {"Adioukrou"},
["adl"] = {"Galo"},
["adn"] = {"Adang"},
["ado"] = {"Abu"},
["adq"] = {"Adangbe"},
["adr"] = {"Adonara"},
["ads"] = {"Adamorobe Sign Language"},
["adt"] = {"Adnyamathanha"},
["adu"] = {"Aduge"},
["adw"] = {"Amundava"},
["adx"] = {"Amdo Tibetan"},
["ady"] = {"Adyghe", "Adygei"},
["adz"] = {"Adzera"},
["aea"] = {"Areba"},
["aeb"] = {"Tunisian Arabic"},
["aec"] = {"Saidi Arabic"},
["aed"] = {"Argentine Sign Language"},
["aee"] = {"Northeast Pashai", "Northeast Pashayi"},
["aek"] = {"Haeke"},
["ael"] = {"Ambele"},
["aem"] = {"Arem"},
["aen"] = {"Armenian Sign Language"},
["aeq"] = {"Aer"},
["aer"] = {"Eastern Arrernte"},
["aes"] = {"Alsea"},
["aeu"] = {"Akeu"},
["aew"] = {"Ambakich"},
["aey"] = {"Amele"},
["aez"] = {"Aeka"},
["afa"] = {"Afro-Asiatic languages"},
["afb"] = {"Gulf Arabic"},
["afd"] = {"Andai"},
["afe"] = {"Putukwam"},
["afg"] = {"Afghan Sign Language"},
["afh"] = {"Afrihili"},
["afi"] = {"Akrukay", "Chini"},
["afk"] = {"Nanubae"},
["afn"] = {"Defaka"},
["afo"] = {"Eloyi"},
["afp"] = {"Tapei"},
["afs"] = {"Afro-Seminole Creole"},
["aft"] = {"Afitti"},
["afu"] = {"Awutu"},
["afz"] = {"Obokuitai"},
["aga"] = {"Aguano"},
["agb"] = {"Legbo"},
["agc"] = {"Agatu"},
["agd"] = {"Agarabi"},
["age"] = {"Angal"},
["agf"] = {"Arguni"},
["agg"] = {"Angor"},
["agh"] = {"Ngelima"},
["agi"] = {"Agariya"},
["agj"] = {"Argobba"},
["agk"] = {"Isarog Agta"},
["agl"] = {"Fembe"},
["agm"] = {"Angaataha"},
["agn"] = {"Agutaynen"},
["ago"] = {"Tainae"},
["agq"] = {"Aghem"},
["agr"] = {"Aguaruna"},
["ags"] = {"Esimbi"},
["agt"] = {"Central Cagayan Agta"},
["agu"] = {"Aguacateco"},
["agv"] = {"Remontado Dumagat"},
["agw"] = {"Kahua"},
["agx"] = {"Aghul"},
["agy"] = {"Southern Alta"},
["agz"] = {"Mt. Iriga Agta"},
["aha"] = {"Ahanta"},
["ahb"] = {"Axamb"},
["ahg"] = {"Qimant"},
["ahh"] = {"Aghu"},
["ahi"] = {"Tiagbamrin Aizi"},
["ahk"] = {"Akha"},
["ahl"] = {"Igo"},
["ahm"] = {"Mobumrin Aizi"},
["ahn"] = {"Àhàn"},
["aho"] = {"Ahom"},
["ahp"] = {"Aproumu Aizi"},
["ahr"] = {"Ahirani"},
["ahs"] = {"Ashe"},
["aht"] = {"Ahtena"},
["aia"] = {"Arosi"},
["aib"] = {"Ainu (China)"},
["aic"] = {"Ainbai"},
["aid"] = {"Alngith"},
["aie"] = {"Amara"},
["aif"] = {"Agi"},
["aig"] = {"Antigua and Barbuda Creole English"},
["aih"] = {"Ai-Cham"},
["aii"] = {"Assyrian Neo-Aramaic"},
["aij"] = {"Lishanid Noshan"},
["aik"] = {"Ake"},
["ail"] = {"Aimele"},
["aim"] = {"Aimol"},
["ain"] = {"Ainu (Japan)"},
["aio"] = {"Aiton"},
["aip"] = {"Burumakok"},
["aiq"] = {"Aimaq"},
["air"] = {"Airoran"},
["ait"] = {"Arikem"},
["aiw"] = {"Aari"},
["aix"] = {"Aighon"},
["aiy"] = {"Ali"},
["aja"] = {"Aja (South Sudan)"},
["ajg"] = {"Aja (Benin)"},
["aji"] = {"Ajië"},
["ajn"] = {"Andajin"},
["ajs"] = {"Algerian Jewish Sign Language"},
["aju"] = {"Judeo-Moroccan Arabic"},
["ajw"] = {"Ajawa"},
["ajz"] = {"Amri Karbi"},
["akb"] = {"Batak Angkola"},
["akc"] = {"Mpur"},
["akd"] = {"Ukpet-Ehom"},
["ake"] = {"Akawaio"},
["akf"] = {"Akpa"},
["akg"] = {"Anakalangu"},
["akh"] = {"Angal Heneng"},
["aki"] = {"Aiome"},
["akj"] = {"Aka-Jeru"},
["akk"] = {"Akkadian"},
["akl"] = {"Aklanon"},
["akm"] = {"Aka-Bo"},
["ako"] = {"Akurio"},
["akp"] = {"Siwu"},
["akq"] = {"Ak"},
["akr"] = {"Araki"},
["aks"] = {"Akaselem"},
["akt"] = {"Akolet"},
["aku"] = {"Akum"},
["akv"] = {"Akhvakh"},
["akw"] = {"Akwa"},
["akx"] = {"Aka-Kede"},
["aky"] = {"Aka-Kol"},
["akz"] = {"Alabama"},
["ala"] = {"Alago"},
["alc"] = {"Qawasqar"},
["ald"] = {"Alladian"},
["ale"] = {"Aleut"},
["alf"] = {"Alege"},
["alg"] = {"Algonquian languages"},
["alh"] = {"Alawa"},
["ali"] = {"Amaimon"},
["alj"] = {"Alangan"},
["alk"] = {"Alak"},
["all"] = {"Allar"},
["alm"] = {"Amblong"},
["aln"] = {"Gheg Albanian"},
["alo"] = {"Larike-Wakasihu"},
["alp"] = {"Alune"},
["alq"] = {"Algonquin"},
["alr"] = {"Alutor"},
["als"] = {"Tosk Albanian"},
["alt"] = {"Southern Altai"},
["alu"] = {"'Are'are"},
["alv"] = {"Atlantic-Congo languages"},
["alw"] = {"Alaba-K’abeena", "Wanbasana"},
["alx"] = {"Amol"},
["aly"] = {"Alyawarr"},
["alz"] = {"Alur"},
["ama"] = {"Amanayé"},
["amb"] = {"Ambo"},
["amc"] = {"Amahuaca"},
["ame"] = {"Yanesha'"},
["amf"] = {"Hamer-Banna"},
["amg"] = {"Amurdak"},
["ami"] = {"Amis"},
["amj"] = {"Amdang"},
["amk"] = {"Ambai"},
["aml"] = {"War-Jaintia"},
["amm"] = {"Ama (Papua New Guinea)"},
["amn"] = {"Amanab"},
["amo"] = {"Amo"},
["amp"] = {"Alamblak"},
["amq"] = {"Amahai"},
["amr"] = {"Amarakaeri"},
["ams"] = {"Southern Amami-Oshima"},
["amt"] = {"Amto"},
["amu"] = {"Guerrero Amuzgo"},
["amv"] = {"Ambelau"},
["amw"] = {"Western Neo-Aramaic"},
["amx"] = {"Anmatyerre"},
["amy"] = {"Ami"},
["amz"] = {"Atampaya"},
["ana"] = {"Andaqui"},
["anb"] = {"Andoa"},
["anc"] = {"Ngas"},
["and"] = {"Ansus"},
["ane"] = {"Xârâcùù"},
["anf"] = {"Animere"},
["ang"] = {"Old English (ca. 450-1100)"},
["anh"] = {"Nend"},
["ani"] = {"Andi"},
["anj"] = {"Anor"},
["ank"] = {"Goemai"},
["anl"] = {"Anu-Hkongso Chin"},
["anm"] = {"Anal"},
["ann"] = {"Obolo"},
["ano"] = {"Andoque"},
["anp"] = {"Angika"},
["anq"] = {"Jarawa (India)"},
["anr"] = {"Andh"},
["ans"] = {"Anserma"},
["ant"] = {"Antakarinya", "Antikarinya"},
["anu"] = {"Anuak"},
["anv"] = {"Denya"},
["anw"] = {"Anaang"},
["anx"] = {"Andra-Hus"},
["any"] = {"Anyin"},
["anz"] = {"Anem"},
["aoa"] = {"Angolar"},
["aob"] = {"Abom"},
["aoc"] = {"Pemon"},
["aod"] = {"Andarum"},
["aoe"] = {"Angal Enen"},
["aof"] = {"Bragat"},
["aog"] = {"Angoram"},
["aoi"] = {"Anindilyakwa"},
["aoj"] = {"Mufian"},
["aok"] = {"Arhö"},
["aol"] = {"Alor"},
["aom"] = {"Ömie"},
["aon"] = {"Bumbita Arapesh"},
["aor"] = {"Aore"},
["aos"] = {"Taikat"},
["aot"] = {"Atong (India)", "A'tong"},
["aou"] = {"A'ou"},
["aox"] = {"Atorada"},
["aoz"] = {"Uab Meto"},
["apa"] = {"Apache languages"},
["apb"] = {"Sa'a"},
["apc"] = {"Levantine Arabic"},
["apd"] = {"Sudanese Arabic"},
["ape"] = {"Bukiyip"},
["apf"] = {"Pahanan Agta"},
["apg"] = {"Ampanang"},
["aph"] = {"Athpariya"},
["api"] = {"Apiaká"},
["apj"] = {"Jicarilla Apache"},
["apk"] = {"Kiowa Apache"},
["apl"] = {"Lipan Apache"},
["apm"] = {"Mescalero-Chiricahua Apache"},
["apn"] = {"Apinayé"},
["apo"] = {"Ambul"},
["app"] = {"Apma"},
["apq"] = {"A-Pucikwar"},
["apr"] = {"Arop-Lokep"},
["aps"] = {"Arop-Sissano"},
["apt"] = {"Apatani"},
["apu"] = {"Apurinã"},
["apv"] = {"Alapmunte"},
["apw"] = {"Western Apache"},
["apx"] = {"Aputai"},
["apy"] = {"Apalaí"},
["apz"] = {"Safeyoka"},
["aqa"] = {"Alacalufan languages"},
["aqc"] = {"Archi"},
["aqd"] = {"Ampari Dogon"},
["aqg"] = {"Arigidi"},
["aqk"] = {"Aninka"},
["aql"] = {"Algic languages"},
["aqm"] = {"Atohwaim"},
["aqn"] = {"Northern Alta"},
["aqp"] = {"Atakapa"},
["aqr"] = {"Arhâ"},
["aqt"] = {"Angaité"},
["aqz"] = {"Akuntsu"},
["arb"] = {"Standard Arabic"},
["arc"] = {"Official Aramaic (700-300 BCE)", "Imperial Aramaic (700-300 BCE)"},
["ard"] = {"Arabana"},
["are"] = {"Western Arrarnta"},
["arh"] = {"Arhuaco"},
["ari"] = {"Arikara"},
["arj"] = {"Arapaso"},
["ark"] = {"Arikapú"},
["arl"] = {"Arabela"},
["arn"] = {"Mapudungun", "Mapuche"},
["aro"] = {"Araona"},
["arp"] = {"Arapaho"},
["arq"] = {"Algerian Arabic"},
["arr"] = {"Karo (Brazil)"},
["ars"] = {"Najdi Arabic"},
["art"] = {"Artificial languages"},
["aru"] = {"Aruá (Amazonas State)", "Arawá"},
["arv"] = {"Arbore"},
["arw"] = {"Arawak"},
["arx"] = {"Aruá (Rodonia State)"},
["ary"] = {"Moroccan Arabic"},
["arz"] = {"Egyptian Arabic"},
["asa"] = {"Asu (Tanzania)"},
["asb"] = {"Assiniboine", "Nakoda Assiniboine"},
["asc"] = {"Casuarina Coast Asmat"},
["ase"] = {"American Sign Language"},
["asf"] = {"Auslan", "Australian Sign Language"},
["asg"] = {"Cishingini"},
["ash"] = {"Abishira"},
["asi"] = {"Buruwai"},
["asj"] = {"Sari"},
["ask"] = {"Ashkun"},
["asl"] = {"Asilulu"},
["asn"] = {"Xingú Asuriní"},
["aso"] = {"Dano"},
["asp"] = {"Algerian Sign Language"},
["asq"] = {"Austrian Sign Language"},
["asr"] = {"Asuri"},
["ass"] = {"Ipulo"},
["ast"] = {"Asturian", "Asturleonese", "Bable", "Leonese"},
["asu"] = {"Tocantins Asurini"},
["asv"] = {"Asoa"},
["asw"] = {"Australian Aborigines Sign Language"},
["asx"] = {"Muratayak"},
["asy"] = {"Yaosakor Asmat"},
["asz"] = {"As"},
["ata"] = {"Pele-Ata"},
["atb"] = {"Zaiwa"},
["atc"] = {"Atsahuaca"},
["atd"] = {"Ata Manobo"},
["ate"] = {"Atemble"},
["atg"] = {"Ivbie North-Okpela-Arhe"},
["ath"] = {"Athapascan languages"},
["ati"] = {"Attié"},
["atj"] = {"Atikamekw", "Nehirowimowin"},
["atk"] = {"Ati"},
["atl"] = {"Mt. Iraya Agta"},
["atm"] = {"Ata"},
["atn"] = {"Ashtiani"},
["ato"] = {"Atong (Cameroon)"},
["atp"] = {"Pudtol Atta"},
["atq"] = {"Aralle-Tabulahan"},
["atr"] = {"Waimiri-Atroari"},
["ats"] = {"Gros Ventre"},
["att"] = {"Pamplona Atta"},
["atu"] = {"Reel"},
["atv"] = {"Northern Altai"},
["atw"] = {"Atsugewi"},
["atx"] = {"Arutani"},
["aty"] = {"Aneityum"},
["atz"] = {"Arta"},
["aua"] = {"Asumboa"},
["aub"] = {"Alugu"},
["auc"] = {"Waorani"},
["aud"] = {"Anuta"},
["auf"] = {"Arauan languages"},
["aug"] = {"Aguna"},
["auh"] = {"Aushi"},
["aui"] = {"Anuki"},
["auj"] = {"Awjilah"},
["auk"] = {"Heyo"},
["aul"] = {"Aulua"},
["aum"] = {"Asu (Nigeria)"},
["aun"] = {"Molmo One"},
["auo"] = {"Auyokawa"},
["aup"] = {"Makayam"},
["auq"] = {"Anus", "Korur"},
["aur"] = {"Aruek"},
["aus"] = {"Australian languages"},
["aut"] = {"Austral"},
["auu"] = {"Auye"},
["auw"] = {"Awyi"},
["aux"] = {"Aurá"},
["auy"] = {"Awiyaana"},
["auz"] = {"Uzbeki Arabic"},
["avb"] = {"Avau"},
["avd"] = {"Alviri-Vidari"},
["avi"] = {"Avikam"},
["avk"] = {"Kotava"},
["avl"] = {"Eastern Egyptian Bedawi Arabic"},
["avm"] = {"Angkamuthi"},
["avn"] = {"Avatime"},
["avo"] = {"Agavotaguerra"},
["avs"] = {"Aushiri"},
["avt"] = {"Au"},
["avu"] = {"Avokaya"},
["avv"] = {"Avá-Canoeiro"},
["awa"] = {"Awadhi"},
["awb"] = {"Awa (Papua New Guinea)"},
["awc"] = {"Cicipu"},
["awd"] = {"Arawakan languages"},
["awe"] = {"Awetí"},
["awg"] = {"Anguthimri"},
["awh"] = {"Awbono"},
["awi"] = {"Aekyom"},
["awk"] = {"Awabakal"},
["awm"] = {"Arawum"},
["awn"] = {"Awngi"},
["awo"] = {"Awak"},
["awr"] = {"Awera"},
["aws"] = {"South Awyu"},
["awt"] = {"Araweté"},
["awu"] = {"Central Awyu"},
["awv"] = {"Jair Awyu"},
["aww"] = {"Awun"},
["awx"] = {"Awara"},
["awy"] = {"Edera Awyu"},
["axb"] = {"Abipon"},
["axe"] = {"Ayerrerenge"},
["axg"] = {"Mato Grosso Arára"},
["axk"] = {"Yaka (Central African Republic)"},
["axl"] = {"Lower Southern Aranda"},
["axm"] = {"Middle Armenian"},
["axx"] = {"Xârâgurè"},
["aya"] = {"Awar"},
["ayb"] = {"Ayizo Gbe"},
["ayc"] = {"Southern Aymara"},
["ayd"] = {"Ayabadhu"},
["aye"] = {"Ayere"},
["ayg"] = {"Ginyanga"},
["ayh"] = {"Hadrami Arabic"},
["ayi"] = {"Leyigha"},
["ayk"] = {"Akuku"},
["ayl"] = {"Libyan Arabic"},
["ayn"] = {"Sanaani Arabic"},
["ayo"] = {"Ayoreo"},
["ayp"] = {"North Mesopotamian Arabic"},
["ayq"] = {"Ayi (Papua New Guinea)"},
["ayr"] = {"Central Aymara"},
["ays"] = {"Sorsogon Ayta"},
["ayt"] = {"Magbukun Ayta"},
["ayu"] = {"Ayu"},
["ayz"] = {"Mai Brat"},
["aza"] = {"Azha"},
["azb"] = {"South Azerbaijani"},
["azc"] = {"Uto-Aztecan languages"},
["azd"] = {"Eastern Durango Nahuatl"},
["azg"] = {"San Pedro Amuzgos Amuzgo"},
["azj"] = {"North Azerbaijani"},
["azm"] = {"Ipalapa Amuzgo"},
["azn"] = {"Western Durango Nahuatl"},
["azo"] = {"Awing"},
["azt"] = {"Faire Atta"},
["azz"] = {"Highland Puebla Nahuatl"},
["baa"] = {"Babatana"},
["bab"] = {"Bainouk-Gunyuño"},
["bac"] = {"Badui"},
["bad"] = {"Banda languages"},
["bae"] = {"Baré"},
["baf"] = {"Nubaca"},
["bag"] = {"Tuki"},
["bah"] = {"Bahamas Creole English"},
["bai"] = {"Bamileke languages"},
["baj"] = {"Barakai"},
["bal"] = {"Baluchi"},
["ban"] = {"Balinese"},
["bao"] = {"Waimaha"},
["bap"] = {"Bantawa"},
["bar"] = {"Bavarian"},
["bas"] = {"Basa (Cameroon)"},
["bat"] = {"Baltic languages"},
["bau"] = {"Bada (Nigeria)"},
["bav"] = {"Vengo"},
["baw"] = {"Bambili-Bambui"},
["bax"] = {"Bamun"},
["bay"] = {"Batuley"},
["bba"] = {"Baatonum"},
["bbb"] = {"Barai"},
["bbc"] = {"Batak Toba"},
["bbd"] = {"Bau"},
["bbe"] = {"Bangba"},
["bbf"] = {"Baibai"},
["bbg"] = {"Barama"},
["bbh"] = {"Bugan"},
["bbi"] = {"Barombi"},
["bbj"] = {"Ghomálá'"},
["bbk"] = {"Babanki"},
["bbl"] = {"Bats"},
["bbm"] = {"Babango"},
["bbn"] = {"Uneapa"},
["bbo"] = {"Northern Bobo Madaré", "Konabéré"},
["bbp"] = {"West Central Banda"},
["bbq"] = {"Bamali"},
["bbr"] = {"Girawa"},
["bbs"] = {"Bakpinka"},
["bbt"] = {"Mburku"},
["bbu"] = {"Kulung (Nigeria)"},
["bbv"] = {"Karnai"},
["bbw"] = {"Baba"},
["bbx"] = {"Bubia"},
["bby"] = {"Befang"},
["bca"] = {"Central Bai"},
["bcb"] = {"Bainouk-Samik"},
["bcc"] = {"Southern Balochi"},
["bcd"] = {"North Babar"},
["bce"] = {"Bamenyam"},
["bcf"] = {"Bamu"},
["bcg"] = {"Baga Pokur"},
["bch"] = {"Bariai"},
["bci"] = {"Baoulé"},
["bcj"] = {"Bardi"},
["bck"] = {"Bunuba"},
["bcl"] = {"Central Bikol"},
["bcm"] = {"Bannoni"},
["bcn"] = {"Bali (Nigeria)"},
["bco"] = {"Kaluli"},
["bcp"] = {"Bali (Democratic Republic of Congo)"},
["bcq"] = {"Bench"},
["bcr"] = {"Babine"},
["bcs"] = {"Kohumono"},
["bct"] = {"Bendi"},
["bcu"] = {"Awad Bing"},
["bcv"] = {"Shoo-Minda-Nye"},
["bcw"] = {"Bana"},
["bcy"] = {"Bacama"},
["bcz"] = {"Bainouk-Gunyaamolo"},
["bda"] = {"Bayot"},
["bdb"] = {"Basap"},
["bdc"] = {"Emberá-Baudó"},
["bdd"] = {"Bunama"},
["bde"] = {"Bade"},
["bdf"] = {"Biage"},
["bdg"] = {"Bonggi"},
["bdh"] = {"Baka (South Sudan)"},
["bdi"] = {"Burun"},
["bdj"] = {"Bai (South Sudan)", "Bai"},
["bdk"] = {"Budukh"},
["bdl"] = {"Indonesian Bajau"},
["bdm"] = {"Buduma"},
["bdn"] = {"Baldemu"},
["bdo"] = {"Morom"},
["bdp"] = {"Bende"},
["bdq"] = {"Bahnar"},
["bdr"] = {"West Coast Bajau"},
["bds"] = {"Burunge"},
["bdt"] = {"Bokoto"},
["bdu"] = {"Oroko"},
["bdv"] = {"Bodo Parja"},
["bdw"] = {"Baham"},
["bdx"] = {"Budong-Budong"},
["bdy"] = {"Bandjalang"},
["bdz"] = {"Badeshi"},
["bea"] = {"Beaver"},
["beb"] = {"Bebele"},
["bec"] = {"Iceve-Maci"},
["bed"] = {"Bedoanas"},
["bee"] = {"Byangsi"},
["bef"] = {"Benabena"},
["beg"] = {"Belait"},
["beh"] = {"Biali"},
["bei"] = {"Bekati'"},
["bej"] = {"Beja", "Bedawiyet"},
["bek"] = {"Bebeli"},
["bem"] = {"Bemba (Zambia)"},
["beo"] = {"Beami"},
["bep"] = {"Besoa"},
["beq"] = {"Beembe"},
["ber"] = {"Berber languages"},
["bes"] = {"Besme"},
["bet"] = {"Guiberoua Béte"},
["beu"] = {"Blagar"},
["bev"] = {"Daloa Bété"},
["bew"] = {"Betawi"},
["bex"] = {"Jur Modo"},
["bey"] = {"Beli (Papua New Guinea)"},
["bez"] = {"Bena (Tanzania)"},
["bfa"] = {"Bari"},
["bfb"] = {"Pauri Bareli"},
["bfc"] = {"Panyi Bai", "Northern Bai"},
["bfd"] = {"Bafut"},
["bfe"] = {"Betaf", "Tena"},
["bff"] = {"Bofi"},
["bfg"] = {"Busang Kayan"},
["bfh"] = {"Blafe"},
["bfi"] = {"British Sign Language"},
["bfj"] = {"Bafanji"},
["bfk"] = {"Ban Khor Sign Language"},
["bfl"] = {"Banda-Ndélé"},
["bfm"] = {"Mmen"},
["bfn"] = {"Bunak"},
["bfo"] = {"Malba Birifor"},
["bfp"] = {"Beba"},
["bfq"] = {"Badaga"},
["bfr"] = {"Bazigar"},
["bfs"] = {"Southern Bai"},
["bft"] = {"Balti"},
["bfu"] = {"Gahri"},
["bfw"] = {"Bondo"},
["bfx"] = {"Bantayanon"},
["bfy"] = {"Bagheli"},
["bfz"] = {"Mahasu Pahari"},
["bga"] = {"Gwamhi-Wuri"},
["bgb"] = {"Bobongko"},
["bgc"] = {"Haryanvi"},
["bgd"] = {"Rathwi Bareli"},
["bge"] = {"Bauria"},
["bgf"] = {"Bangandu"},
["bgg"] = {"Bugun"},
["bgi"] = {"Giangan"},
["bgj"] = {"Bangolan"},
["bgk"] = {"Bit", "Buxinhua"},
["bgl"] = {"Bo (Laos)"},
["bgn"] = {"Western Balochi"},
["bgo"] = {"Baga Koga"},
["bgp"] = {"Eastern Balochi"},
["bgq"] = {"Bagri"},
["bgr"] = {"Bawm Chin"},
["bgs"] = {"Tagabawa"},
["bgt"] = {"Bughotu"},
["bgu"] = {"Mbongno"},
["bgv"] = {"Warkay-Bipim"},
["bgw"] = {"Bhatri"},
["bgx"] = {"Balkan Gagauz Turkish"},
["bgy"] = {"Benggoi"},
["bgz"] = {"Banggai"},
["bha"] = {"Bharia"},
["bhb"] = {"Bhili"},
["bhc"] = {"Biga"},
["bhd"] = {"Bhadrawahi"},
["bhe"] = {"Bhaya"},
["bhf"] = {"Odiai"},
["bhg"] = {"Binandere"},
["bhh"] = {"Bukharic"},
["bhi"] = {"Bhilali"},
["bhj"] = {"Bahing"},
["bhl"] = {"Bimin"},
["bhm"] = {"Bathari"},
["bhn"] = {"Bohtan Neo-Aramaic"},
["bho"] = {"Bhojpuri"},
["bhp"] = {"Bima"},
["bhq"] = {"Tukang Besi South"},
["bhr"] = {"Bara Malagasy"},
["bhs"] = {"Buwal"},
["bht"] = {"Bhattiyali"},
["bhu"] = {"Bhunjia"},
["bhv"] = {"Bahau"},
["bhw"] = {"Biak"},
["bhx"] = {"Bhalay"},
["bhy"] = {"Bhele"},
["bhz"] = {"Bada (Indonesia)"},
["bia"] = {"Badimaya"},
["bib"] = {"Bissa", "Bisa"},
["bid"] = {"Bidiyo"},
["bie"] = {"Bepour"},
["bif"] = {"Biafada"},
["big"] = {"Biangai"},
["bih"] = {"Bihari languages"},
["bik"] = {"Bikol"},
["bil"] = {"Bile"},
["bim"] = {"Bimoba"},
["bin"] = {"Bini", "Edo"},
["bio"] = {"Nai"},
["bip"] = {"Bila"},
["biq"] = {"Bipi"},
["bir"] = {"Bisorio"},
["bit"] = {"Berinomo"},
["biu"] = {"Biete"},
["biv"] = {"Southern Birifor"},
["biw"] = {"Kol (Cameroon)"},
["bix"] = {"Bijori"},
["biy"] = {"Birhor"},
["biz"] = {"Baloi"},
["bja"] = {"Budza"},
["bjb"] = {"Banggarla"},
["bjc"] = {"Bariji"},
["bje"] = {"Biao-Jiao Mien"},
["bjf"] = {"Barzani Jewish Neo-Aramaic"},
["bjg"] = {"Bidyogo"},
["bjh"] = {"Bahinemo"},
["bji"] = {"Burji"},
["bjj"] = {"Kanauji"},
["bjk"] = {"Barok"},
["bjl"] = {"Bulu (Papua New Guinea)"},
["bjm"] = {"Bajelani"},
["bjn"] = {"Banjar"},
["bjo"] = {"Mid-Southern Banda"},
["bjp"] = {"Fanamaket"},
["bjr"] = {"Binumarien"},
["bjs"] = {"Bajan"},
["bjt"] = {"Balanta-Ganja"},
["bju"] = {"Busuu"},
["bjv"] = {"Bedjond"},
["bjw"] = {"Bakwé"},
["bjx"] = {"Banao Itneg"},
["bjy"] = {"Bayali"},
["bjz"] = {"Baruga"},
["bka"] = {"Kyak"},
["bkc"] = {"Baka (Cameroon)"},
["bkd"] = {"Binukid", "Talaandig"},
["bkf"] = {"Beeke"},
["bkg"] = {"Buraka"},
["bkh"] = {"Bakoko"},
["bki"] = {"Baki"},
["bkj"] = {"Pande"},
["bkk"] = {"Brokskat"},
["bkl"] = {"Berik"},
["bkm"] = {"Kom (Cameroon)"},
["bkn"] = {"Bukitan"},
["bko"] = {"Kwa'"},
["bkp"] = {"Boko (Democratic Republic of Congo)"},
["bkq"] = {"Bakairí"},
["bkr"] = {"Bakumpai"},
["bks"] = {"Northern Sorsoganon"},
["bkt"] = {"Boloki"},
["bku"] = {"Buhid"},
["bkv"] = {"Bekwarra"},
["bkw"] = {"Bekwel"},
["bkx"] = {"Baikeno"},
["bky"] = {"Bokyi"},
["bkz"] = {"Bungku"},
["bla"] = {"Siksika"},
["blb"] = {"Bilua"},
["blc"] = {"Bella Coola"},
["bld"] = {"Bolango"},
["ble"] = {"Balanta-Kentohe"},
["blf"] = {"Buol"},
["blh"] = {"Kuwaa"},
["bli"] = {"Bolia"},
["blj"] = {"Bolongan"},
["blk"] = {"Pa'o Karen", "Pa'O"},
["bll"] = {"Biloxi"},
["blm"] = {"Beli (South Sudan)"},
["bln"] = {"Southern Catanduanes Bikol"},
["blo"] = {"Anii"},
["blp"] = {"Blablanga"},
["blq"] = {"Baluan-Pam"},
["blr"] = {"Blang"},
["bls"] = {"Balaesang"},
["blt"] = {"Tai Dam"},
["blv"] = {"Kibala", "Bolo"},
["blw"] = {"Balangao"},
["blx"] = {"Mag-Indi Ayta"},
["bly"] = {"Notre"},
["blz"] = {"Balantak"},
["bma"] = {"Lame"},
["bmb"] = {"Bembe"},
["bmc"] = {"Biem"},
["bmd"] = {"Baga Manduri"},
["bme"] = {"Limassa"},
["bmf"] = {"Bom-Kim"},
["bmg"] = {"Bamwe"},
["bmh"] = {"Kein"},
["bmi"] = {"Bagirmi"},
["bmj"] = {"Bote-Majhi"},
["bmk"] = {"Ghayavi"},
["bml"] = {"Bomboli"},
["bmm"] = {"Northern Betsimisaraka Malagasy"},
["bmn"] = {"Bina (Papua New Guinea)"},
["bmo"] = {"Bambalang"},
["bmp"] = {"Bulgebi"},
["bmq"] = {"Bomu"},
["bmr"] = {"Muinane"},
["bms"] = {"Bilma Kanuri"},
["bmt"] = {"Biao Mon"},
["bmu"] = {"Somba-Siawari"},
["bmv"] = {"Bum"},
["bmw"] = {"Bomwali"},
["bmx"] = {"Baimak"},
["bmz"] = {"Baramu"},
["bna"] = {"Bonerate"},
["bnb"] = {"Bookan"},
["bnc"] = {"Bontok"},
["bnd"] = {"Banda (Indonesia)"},
["bne"] = {"Bintauna"},
["bnf"] = {"Masiwang"},
["bng"] = {"Benga"},
["bni"] = {"Bangi"},
["bnj"] = {"Eastern Tawbuid"},
["bnk"] = {"Bierebo"},
["bnl"] = {"Boon"},
["bnm"] = {"Batanga"},
["bnn"] = {"Bunun"},
["bno"] = {"Bantoanon"},
["bnp"] = {"Bola"},
["bnq"] = {"Bantik"},
["bnr"] = {"Butmas-Tur"},
["bns"] = {"Bundeli"},
["bnt"] = {"Bantu languages"},
["bnu"] = {"Bentong"},
["bnv"] = {"Bonerif", "Beneraf", "Edwas"},
["bnw"] = {"Bisis"},
["bnx"] = {"Bangubangu"},
["bny"] = {"Bintulu"},
["bnz"] = {"Beezen"},
["boa"] = {"Bora"},
["bob"] = {"Aweer"},
["boe"] = {"Mundabli-Mufu"},
["bof"] = {"Bolon"},
["bog"] = {"Bamako Sign Language"},
["boh"] = {"Boma"},
["boi"] = {"Barbareño"},
["boj"] = {"Anjam"},
["bok"] = {"Bonjo"},
["bol"] = {"Bole"},
["bom"] = {"Berom"},
["bon"] = {"Bine"},
["boo"] = {"Tiemacèwè Bozo"},
["bop"] = {"Bonkiman"},
["boq"] = {"Bogaya"},
["bor"] = {"Borôro"},
["bot"] = {"Bongo"},
["bou"] = {"Bondei"},
["bov"] = {"Tuwuli"},
["bow"] = {"Rema"},
["box"] = {"Buamu"},
["boy"] = {"Bodo (Central African Republic)"},
["boz"] = {"Tiéyaxo Bozo"},
["bpa"] = {"Daakaka"},
["bpc"] = {"Mbuk"},
["bpd"] = {"Banda-Banda"},
["bpe"] = {"Bauni"},
["bpg"] = {"Bonggo"},
["bph"] = {"Botlikh"},
["bpi"] = {"Bagupi"},
["bpj"] = {"Binji"},
["bpk"] = {"Orowe", "'Ôrôê"},
["bpl"] = {"Broome Pearling Lugger Pidgin"},
["bpm"] = {"Biyom"},
["bpn"] = {"Dzao Min"},
["bpo"] = {"Anasi"},
["bpp"] = {"Kaure"},
["bpq"] = {"Banda Malay"},
["bpr"] = {"Koronadal Blaan"},
["bps"] = {"Sarangani Blaan"},
["bpt"] = {"Barrow Point"},
["bpu"] = {"Bongu"},
["bpv"] = {"Bian Marind"},
["bpw"] = {"Bo (Papua New Guinea)"},
["bpx"] = {"Palya Bareli"},
["bpy"] = {"Bishnupriya"},
["bpz"] = {"Bilba"},
["bqa"] = {"Tchumbuli"},
["bqb"] = {"Bagusa"},
["bqc"] = {"Boko (Benin)", "Boo"},
["bqd"] = {"Bung"},
["bqf"] = {"Baga Kaloum"},
["bqg"] = {"Bago-Kusuntu"},
["bqh"] = {"Baima"},
["bqi"] = {"Bakhtiari"},
["bqj"] = {"Bandial"},
["bqk"] = {"Banda-Mbrès"},
["bql"] = {"Karian", "Bilakura"},
["bqm"] = {"Wumboko"},
["bqn"] = {"Bulgarian Sign Language"},
["bqo"] = {"Balo"},
["bqp"] = {"Busa"},
["bqq"] = {"Biritai"},
["bqr"] = {"Burusu"},
["bqs"] = {"Bosngun"},
["bqt"] = {"Bamukumbit"},
["bqu"] = {"Boguru"},
["bqv"] = {"Koro Wachi", "Begbere-Ejar"},
["bqw"] = {"Buru (Nigeria)"},
["bqx"] = {"Baangi"},
["bqy"] = {"Bengkala Sign Language"},
["bqz"] = {"Bakaka"},
["bra"] = {"Braj"},
["brb"] = {"Brao", "Lave"},
["brc"] = {"Berbice Creole Dutch"},
["brd"] = {"Baraamu"},
["brf"] = {"Bira"},
["brg"] = {"Baure"},
["brh"] = {"Brahui"},
["bri"] = {"Mokpwe"},
["brj"] = {"Bieria"},
["brk"] = {"Birked"},
["brl"] = {"Birwa"},
["brm"] = {"Barambu"},
["brn"] = {"Boruca"},
["bro"] = {"Brokkat"},
["brp"] = {"Barapasi"},
["brq"] = {"Breri"},
["brr"] = {"Birao"},
["brs"] = {"Baras"},
["brt"] = {"Bitare"},
["bru"] = {"Eastern Bru"},
["brv"] = {"Western Bru"},
["brw"] = {"Bellari"},
["brx"] = {"Bodo (India)"},
["bry"] = {"Burui"},
["brz"] = {"Bilbil"},
["bsa"] = {"Abinomn"},
["bsb"] = {"Brunei Bisaya"},
["bsc"] = {"Bassari", "Oniyan"},
["bse"] = {"Wushi"},
["bsf"] = {"Bauchi"},
["bsg"] = {"Bashkardi"},
["bsh"] = {"Kati"},
["bsi"] = {"Bassossi"},
["bsj"] = {"Bangwinji"},
["bsk"] = {"Burushaski"},
["bsl"] = {"Basa-Gumna"},
["bsm"] = {"Busami"},
["bsn"] = {"Barasana-Eduria"},
["bso"] = {"Buso"},
["bsp"] = {"Baga Sitemu"},
["bsq"] = {"Bassa"},
["bsr"] = {"Bassa-Kontagora"},
["bss"] = {"Akoose"},
["bst"] = {"Basketo"},
["bsu"] = {"Bahonsuai"},
["bsv"] = {"Baga Sobané"},
["bsw"] = {"Baiso"},
["bsx"] = {"Yangkam"},
["bsy"] = {"Sabah Bisaya"},
["bta"] = {"Bata"},
["btc"] = {"Bati (Cameroon)"},
["btd"] = {"Batak Dairi"},
["bte"] = {"Gamo-Ningi"},
["btf"] = {"Birgit"},
["btg"] = {"Gagnoa Bété"},
["bth"] = {"Biatah Bidayuh"},
["bti"] = {"Burate"},
["btj"] = {"Bacanese Malay"},
["btk"] = {"Batak languages"},
["btm"] = {"Batak Mandailing"},
["btn"] = {"Ratagnon"},
["bto"] = {"Rinconada Bikol"},
["btp"] = {"Budibud"},
["btq"] = {"Batek"},
["btr"] = {"Baetora"},
["bts"] = {"Batak Simalungun"},
["btt"] = {"Bete-Bendi"},
["btu"] = {"Batu"},
["btv"] = {"Bateri"},
["btw"] = {"Butuanon"},
["btx"] = {"Batak Karo"},
["bty"] = {"Bobot"},
["btz"] = {"Batak Alas-Kluet"},
["bua"] = {"Buriat"},
["bub"] = {"Bua"},
["buc"] = {"Bushi"},
["bud"] = {"Ntcham"},
["bue"] = {"Beothuk"},
["buf"] = {"Bushoong"},
["bug"] = {"Buginese"},
["buh"] = {"Younuo Bunu"},
["bui"] = {"Bongili"},
["buj"] = {"Basa-Gurmana"},
["buk"] = {"Bugawac"},
["bum"] = {"Bulu (Cameroon)"},
["bun"] = {"Sherbro"},
["buo"] = {"Terei"},
["bup"] = {"Busoa"},
["buq"] = {"Brem"},
["bus"] = {"Bokobaru"},
["but"] = {"Bungain"},
["buu"] = {"Budu"},
["buv"] = {"Bun"},
["buw"] = {"Bubi"},
["bux"] = {"Boghom"},
["buy"] = {"Bullom So"},
["buz"] = {"Bukwen"},
["bva"] = {"Barein"},
["bvb"] = {"Bube"},
["bvc"] = {"Baelelea"},
["bvd"] = {"Baeggu"},
["bve"] = {"Berau Malay"},
["bvf"] = {"Boor"},
["bvg"] = {"Bonkeng"},
["bvh"] = {"Bure"},
["bvi"] = {"Belanda Viri"},
["bvj"] = {"Baan"},
["bvk"] = {"Bukat"},
["bvl"] = {"Bolivian Sign Language"},
["bvm"] = {"Bamunka"},
["bvn"] = {"Buna"},
["bvo"] = {"Bolgo"},
["bvp"] = {"Bumang"},
["bvq"] = {"Birri"},
["bvr"] = {"Burarra"},
["bvt"] = {"Bati (Indonesia)"},
["bvu"] = {"Bukit Malay"},
["bvv"] = {"Baniva"},
["bvw"] = {"Boga"},
["bvx"] = {"Dibole"},
["bvy"] = {"Baybayanon"},
["bvz"] = {"Bauzi"},
["bwa"] = {"Bwatoo"},
["bwb"] = {"Namosi-Naitasiri-Serua"},
["bwc"] = {"Bwile"},
["bwd"] = {"Bwaidoka"},
["bwe"] = {"Bwe Karen"},
["bwf"] = {"Boselewa"},
["bwg"] = {"Barwe"},
["bwh"] = {"Bishuo"},
["bwi"] = {"Baniwa"},
["bwj"] = {"Láá Láá Bwamu"},
["bwk"] = {"Bauwaki"},
["bwl"] = {"Bwela"},
["bwm"] = {"Biwat"},
["bwn"] = {"Wunai Bunu"},
["bwo"] = {"Boro (Ethiopia)", "Borna (Ethiopia)"},
["bwp"] = {"Mandobo Bawah"},
["bwq"] = {"Southern Bobo Madaré"},
["bwr"] = {"Bura-Pabir"},
["bws"] = {"Bomboma"},
["bwt"] = {"Bafaw-Balong"},
["bwu"] = {"Buli (Ghana)"},
["bww"] = {"Bwa"},
["bwx"] = {"Bu-Nao Bunu"},
["bwy"] = {"Cwi Bwamu"},
["bwz"] = {"Bwisi"},
["bxa"] = {"Tairaha"},
["bxb"] = {"Belanda Bor"},
["bxc"] = {"Molengue"},
["bxd"] = {"Pela"},
["bxe"] = {"Birale"},
["bxf"] = {"Bilur", "Minigir"},
["bxg"] = {"Bangala"},
["bxh"] = {"Buhutu"},
["bxi"] = {"Pirlatapa"},
["bxj"] = {"Bayungu"},
["bxk"] = {"Bukusu", "Lubukusu"},
["bxl"] = {"Jalkunan"},
["bxm"] = {"Mongolia Buriat"},
["bxn"] = {"Burduna"},
["bxo"] = {"Barikanchi"},
["bxp"] = {"Bebil"},
["bxq"] = {"Beele"},
["bxr"] = {"Russia Buriat"},
["bxs"] = {"Busam"},
["bxu"] = {"China Buriat"},
["bxv"] = {"Berakou"},
["bxw"] = {"Bankagooma"},
["bxz"] = {"Binahari"},
["bya"] = {"Batak"},
["byb"] = {"Bikya"},
["byc"] = {"Ubaghara"},
["byd"] = {"Benyadu'"},
["bye"] = {"Pouye"},
["byf"] = {"Bete"},
["byg"] = {"Baygo"},
["byh"] = {"Bhujel"},
["byi"] = {"Buyu"},
["byj"] = {"Bina (Nigeria)"},
["byk"] = {"Biao"},
["byl"] = {"Bayono"},
["bym"] = {"Bidjara"},
["byn"] = {"Bilin", "Blin"},
["byo"] = {"Biyo"},
["byp"] = {"Bumaji"},
["byq"] = {"Basay"},
["byr"] = {"Baruya", "Yipma"},
["bys"] = {"Burak"},
["byt"] = {"Berti"},
["byv"] = {"Medumba"},
["byw"] = {"Belhariya"},
["byx"] = {"Qaqet"},
["byz"] = {"Banaro"},
["bza"] = {"Bandi"},
["bzb"] = {"Andio"},
["bzc"] = {"Southern Betsimisaraka Malagasy"},
["bzd"] = {"Bribri"},
["bze"] = {"Jenaama Bozo"},
["bzf"] = {"Boikin"},
["bzg"] = {"Babuza"},
["bzh"] = {"Mapos Buang"},
["bzi"] = {"Bisu"},
["bzj"] = {"Belize Kriol English"},
["bzk"] = {"Nicaragua Creole English"},
["bzl"] = {"Boano (Sulawesi)"},
["bzm"] = {"Bolondo"},
["bzn"] = {"Boano (Maluku)"},
["bzo"] = {"Bozaba"},
["bzp"] = {"Kemberano"},
["bzq"] = {"Buli (Indonesia)"},
["bzr"] = {"Biri"},
["bzs"] = {"Brazilian Sign Language"},
["bzt"] = {"Brithenig"},
["bzu"] = {"Burmeso"},
["bzv"] = {"Naami"},
["bzw"] = {"Basa (Nigeria)"},
["bzx"] = {"Kɛlɛngaxo Bozo"},
["bzy"] = {"Obanliku"},
["bzz"] = {"Evant"},
["caa"] = {"Chortí"},
["cab"] = {"Garifuna"},
["cac"] = {"Chuj"},
["cad"] = {"Caddo"},
["cae"] = {"Lehar", "Laalaa"},
["caf"] = {"Southern Carrier"},
["cag"] = {"Nivaclé"},
["cah"] = {"Cahuarano"},
["cai"] = {"Central American Indian languages"},
["caj"] = {"Chané"},
["cak"] = {"Kaqchikel", "Cakchiquel"},
["cal"] = {"Carolinian"},
["cam"] = {"Cemuhî"},
["can"] = {"Chambri"},
["cao"] = {"Chácobo"},
["cap"] = {"Chipaya"},
["caq"] = {"Car Nicobarese"},
["car"] = {"Galibi Carib"},
["cas"] = {"Tsimané"},
["cau"] = {"Caucasian languages"},
["cav"] = {"Cavineña"},
["caw"] = {"Callawalla"},
["cax"] = {"Chiquitano"},
["cay"] = {"Cayuga"},
["caz"] = {"Canichana"},
["cba"] = {"Chibchan languages"},
["cbb"] = {"Cabiyarí"},
["cbc"] = {"Carapana"},
["cbd"] = {"Carijona"},
["cbg"] = {"Chimila"},
["cbi"] = {"Chachi"},
["cbj"] = {"Ede Cabe"},
["cbk"] = {"Chavacano"},
["cbl"] = {"Bualkhaw Chin"},
["cbn"] = {"Nyahkur"},
["cbo"] = {"Izora"},
["cbq"] = {"Tsucuba", "Cuba"},
["cbr"] = {"Cashibo-Cacataibo"},
["cbs"] = {"Cashinahua"},
["cbt"] = {"Chayahuita"},
["cbu"] = {"Candoshi-Shapra"},
["cbv"] = {"Cacua"},
["cbw"] = {"Kinabalian"},
["cby"] = {"Carabayo"},
["ccc"] = {"Chamicuro"},
["ccd"] = {"Cafundo Creole"},
["cce"] = {"Chopi"},
["ccg"] = {"Samba Daka"},
["cch"] = {"Atsam"},
["ccj"] = {"Kasanga"},
["ccl"] = {"Cutchi-Swahili"},
["ccm"] = {"Malaccan Creole Malay"},
["ccn"] = {"North Caucasian languages"},
["cco"] = {"Comaltepec Chinantec"},
["ccp"] = {"Chakma"},
["ccr"] = {"Cacaopera"},
["ccs"] = {"South Caucasian languages"},
["cda"] = {"Choni"},
["cdc"] = {"Chadic languages"},
["cdd"] = {"Caddoan languages"},
["cde"] = {"Chenchu"},
["cdf"] = {"Chiru"},
["cdh"] = {"Chambeali"},
["cdi"] = {"Chodri"},
["cdj"] = {"Churahi"},
["cdm"] = {"Chepang"},
["cdn"] = {"Chaudangsi"},
["cdo"] = {"Min Dong Chinese"},
["cdr"] = {"Cinda-Regi-Tiyal"},
["cds"] = {"Chadian Sign Language"},
["cdy"] = {"Chadong"},
["cdz"] = {"Koda"},
["cea"] = {"Lower Chehalis"},
["ceb"] = {"Cebuano"},
["ceg"] = {"Chamacoco"},
["cek"] = {"Eastern Khumi Chin"},
["cel"] = {"Celtic languages"},
["cen"] = {"Cen"},
["cet"] = {"Centúúm"},
["cey"] = {"Laoktu Chin"},
["cfa"] = {"Dijim-Bwilim"},
["cfd"] = {"Cara"},
["cfg"] = {"Como Karim"},
["cfm"] = {"Falam Chin"},
["cga"] = {"Changriwa"},
["cgc"] = {"Kagayanen"},
["cgg"] = {"Chiga"},
["cgk"] = {"Chocangacakha"},
["chb"] = {"Chibcha"},
["chc"] = {"Catawba"},
["chd"] = {"Highland Oaxaca Chontal"},
["chf"] = {"Tabasco Chontal"},
["chg"] = {"Chagatai"},
["chh"] = {"Chinook"},
["chj"] = {"Ojitlán Chinantec"},
["chk"] = {"Chuukese"},
["chl"] = {"Cahuilla"},
["chm"] = {"Mari (Russia)"},
["chn"] = {"Chinook jargon"},
["cho"] = {"Choctaw"},
["chp"] = {"Chipewyan", "Dene Suline"},
["chq"] = {"Quiotepec Chinantec"},
["chr"] = {"Cherokee"},
["cht"] = {"Cholón"},
["chw"] = {"Chuwabu"},
["chx"] = {"Chantyal"},
["chy"] = {"Cheyenne"},
["chz"] = {"Ozumacín Chinantec"},
["cia"] = {"Cia-Cia"},
["cib"] = {"Ci Gbe"},
["cic"] = {"Chickasaw"},
["cid"] = {"Chimariko"},
["cie"] = {"Cineni"},
["cih"] = {"Chinali"},
["cik"] = {"Chitkuli Kinnauri"},
["cim"] = {"Cimbrian"},
["cin"] = {"Cinta Larga"},
["cip"] = {"Chiapanec"},
["cir"] = {"Tiri", "Haméa", "Méa"},
["ciw"] = {"Chippewa"},
["ciy"] = {"Chaima"},
["cja"] = {"Western Cham"},
["cje"] = {"Chru"},
["cjh"] = {"Upper Chehalis"},
["cji"] = {"Chamalal"},
["cjk"] = {"Chokwe"},
["cjm"] = {"Eastern Cham"},
["cjn"] = {"Chenapian"},
["cjo"] = {"Ashéninka Pajonal"},
["cjp"] = {"Cabécar"},
["cjs"] = {"Shor"},
["cjv"] = {"Chuave"},
["cjy"] = {"Jinyu Chinese"},
["ckb"] = {"Central Kurdish"},
["ckh"] = {"Chak"},
["ckl"] = {"Cibak"},
["ckm"] = {"Chakavian"},
["ckn"] = {"Kaang Chin"},
["cko"] = {"Anufo"},
["ckq"] = {"Kajakse"},
["ckr"] = {"Kairak"},
["cks"] = {"Tayo"},
["ckt"] = {"Chukot"},
["cku"] = {"Koasati"},
["ckv"] = {"Kavalan"},
["ckx"] = {"Caka"},
["cky"] = {"Cakfem-Mushere"},
["ckz"] = {"Cakchiquel-Quiché Mixed Language"},
["cla"] = {"Ron"},
["clc"] = {"Chilcotin", "Tsilhqot’in"},
["cld"] = {"Chaldean Neo-Aramaic"},
["cle"] = {"Lealao Chinantec"},
["clh"] = {"Chilisso"},
["cli"] = {"Chakali"},
["clj"] = {"Laitu Chin"},
["clk"] = {"Idu-Mishmi"},
["cll"] = {"Chala"},
["clm"] = {"Klallam", "Clallam"},
["clo"] = {"Lowland Oaxaca Chontal"},
["cls"] = {"Classical Sanskrit"},
["clt"] = {"Lautu Chin"},
["clu"] = {"Caluyanun"},
["clw"] = {"Chulym"},
["cly"] = {"Eastern Highland Chatino"},
["cma"] = {"Maa"},
["cmc"] = {"Chamic languages"},
["cme"] = {"Cerma"},
["cmg"] = {"Classical Mongolian"},
["cmi"] = {"Emberá-Chamí"},
["cml"] = {"Campalagian"},
["cmm"] = {"Michigamea"},
["cmn"] = {"Mandarin Chinese"},
["cmo"] = {"Central Mnong"},
["cmr"] = {"Mro-Khimi Chin"},
["cms"] = {"Messapic"},
["cmt"] = {"Camtho"},
["cna"] = {"Changthang"},
["cnb"] = {"Chinbon Chin"},
["cnc"] = {"Côông"},
["cng"] = {"Northern Qiang"},
["cnh"] = {"Hakha Chin", "Haka Chin"},
["cni"] = {"Asháninka"},
["cnk"] = {"Khumi Chin"},
["cnl"] = {"Lalana Chinantec"},
["cno"] = {"Con"},
["cnp"] = {"Northern Ping Chinese", "Northern Pinghua"},
["cnq"] = {"Chung"},
["cnr"] = {"Montenegrin"},
["cns"] = {"Central Asmat"},
["cnt"] = {"Tepetotutla Chinantec"},
["cnu"] = {"Chenoua"},
["cnw"] = {"Ngawn Chin"},
["cnx"] = {"Middle Cornish"},
["coa"] = {"Cocos Islands Malay"},
["cob"] = {"Chicomuceltec"},
["coc"] = {"Cocopa"},
["cod"] = {"Cocama-Cocamilla"},
["coe"] = {"Koreguaje"},
["cof"] = {"Colorado"},
["cog"] = {"Chong"},
["coh"] = {"Chonyi-Dzihana-Kauma", "Chichonyi-Chidzihana-Chikauma"},
["coj"] = {"Cochimi"},
["cok"] = {"Santa Teresa Cora"},
["col"] = {"Columbia-Wenatchi"},
["com"] = {"Comanche"},
["con"] = {"Cofán"},
["coo"] = {"Comox"},
["cop"] = {"Coptic"},
["coq"] = {"Coquille"},
["cot"] = {"Caquinte"},
["cou"] = {"Wamey"},
["cov"] = {"Cao Miao"},
["cow"] = {"Cowlitz"},
["cox"] = {"Nanti"},
["coz"] = {"Chochotec"},
["cpa"] = {"Palantla Chinantec"},
["cpb"] = {"Ucayali-Yurúa Ashéninka"},
["cpc"] = {"Ajyíninka Apurucayali"},
["cpe"] = {"English-based creoles and pidgins"},
["cpf"] = {"French-based creoles and pidgins"},
["cpg"] = {"Cappadocian Greek"},
["cpi"] = {"Chinese Pidgin English"},
["cpn"] = {"Cherepon"},
["cpo"] = {"Kpeego"},
["cpp"] = {"Portuguese-based creoles and pidgins"},
["cps"] = {"Capiznon"},
["cpu"] = {"Pichis Ashéninka"},
["cpx"] = {"Pu-Xian Chinese"},
["cpy"] = {"South Ucayali Ashéninka"},
["cqd"] = {"Chuanqiandian Cluster Miao"},
["cra"] = {"Chara"},
["crb"] = {"Island Carib"},
["crc"] = {"Lonwolwol"},
["crd"] = {"Coeur d'Alene"},
["crf"] = {"Caramanta"},
["crg"] = {"Michif"},
["crh"] = {"Crimean Tatar", "Crimean Turkish"},
["cri"] = {"Sãotomense"},
["crj"] = {"Southern East Cree"},
["crk"] = {"Plains Cree"},
["crl"] = {"Northern East Cree"},
["crm"] = {"Moose Cree"},
["crn"] = {"El Nayar Cora"},
["cro"] = {"Crow"},
["crp"] = {"Creoles and pidgins"},
["crq"] = {"Iyo'wujwa Chorote"},
["crr"] = {"Carolina Algonquian"},
["crs"] = {"Seselwa Creole French"},
["crt"] = {"Iyojwa'ja Chorote"},
["crv"] = {"Chaura"},
["crw"] = {"Chrau"},
["crx"] = {"Carrier"},
["cry"] = {"Cori"},
["crz"] = {"Cruzeño"},
["csa"] = {"Chiltepec Chinantec"},
["csb"] = {"Kashubian"},
["csc"] = {"Catalan Sign Language", "Lengua de señas catalana", "Llengua de Signes Catalana"},
["csd"] = {"Chiangmai Sign Language"},
["cse"] = {"Czech Sign Language"},
["csf"] = {"Cuba Sign Language"},
["csg"] = {"Chilean Sign Language"},
["csh"] = {"Asho Chin"},
["csi"] = {"Coast Miwok"},
["csj"] = {"Songlai Chin"},
["csk"] = {"Jola-Kasa"},
["csl"] = {"Chinese Sign Language"},
["csm"] = {"Central Sierra Miwok"},
["csn"] = {"Colombian Sign Language"},
["cso"] = {"Sochiapam Chinantec", "Sochiapan Chinantec"},
["csp"] = {"Southern Ping Chinese", "Southern Pinghua"},
["csq"] = {"Croatia Sign Language"},
["csr"] = {"Costa Rican Sign Language"},
["css"] = {"Southern Ohlone"},
["cst"] = {"Northern Ohlone"},
["csu"] = {"Central Sudanic languages"},
["csv"] = {"Sumtu Chin"},
["csw"] = {"Swampy Cree"},
["csx"] = {"Cambodian Sign Language"},
["csy"] = {"Siyin Chin"},
["csz"] = {"Coos"},
["cta"] = {"Tataltepec Chatino"},
["ctc"] = {"Chetco"},
["ctd"] = {"Tedim Chin"},
["cte"] = {"Tepinapa Chinantec"},
["ctg"] = {"Chittagonian"},
["cth"] = {"Thaiphum Chin"},
["ctl"] = {"Tlacoatzintepec Chinantec"},
["ctm"] = {"Chitimacha"},
["ctn"] = {"Chhintange"},
["cto"] = {"Emberá-Catío"},
["ctp"] = {"Western Highland Chatino"},
["cts"] = {"Northern Catanduanes Bikol"},
["ctt"] = {"Wayanad Chetti"},
["ctu"] = {"Chol"},
["cty"] = {"Moundadan Chetty"},
["ctz"] = {"Zacatepec Chatino"},
["cua"] = {"Cua"},
["cub"] = {"Cubeo"},
["cuc"] = {"Usila Chinantec"},
["cuh"] = {"Chuka", "Gichuka"},
["cui"] = {"Cuiba"},
["cuj"] = {"Mashco Piro"},
["cuk"] = {"San Blas Kuna"},
["cul"] = {"Culina", "Kulina"},
["cuo"] = {"Cumanagoto"},
["cup"] = {"Cupeño"},
["cuq"] = {"Cun"},
["cur"] = {"Chhulung"},
["cus"] = {"Cushitic languages"},
["cut"] = {"Teutila Cuicatec"},
["cuu"] = {"Tai Ya"},
["cuv"] = {"Cuvok"},
["cuw"] = {"Chukwa"},
["cux"] = {"Tepeuxila Cuicatec"},
["cuy"] = {"Cuitlatec"},
["cvg"] = {"Chug"},
["cvn"] = {"Valle Nacional Chinantec"},
["cwa"] = {"Kabwa"},
["cwb"] = {"Maindo"},
["cwd"] = {"Woods Cree"},
["cwe"] = {"Kwere"},
["cwg"] = {"Chewong", "Cheq Wong"},
["cwt"] = {"Kuwaataay"},
["cxh"] = {"Cha'ari"},
["cya"] = {"Nopala Chatino"},
["cyb"] = {"Cayubaba"},
["cyo"] = {"Cuyonon"},
["czh"] = {"Huizhou Chinese"},
["czk"] = {"Knaanic"},
["czn"] = {"Zenzontepec Chatino"},
["czo"] = {"Min Zhong Chinese"},
["czt"] = {"Zotung Chin"},
["daa"] = {"Dangaléat"},
["dac"] = {"Dambi"},
["dad"] = {"Marik"},
["dae"] = {"Duupa"},
["dag"] = {"Dagbani"},
["dah"] = {"Gwahatike"},
["dai"] = {"Day"},
["daj"] = {"Dar Fur Daju"},
["dak"] = {"Dakota"},
["dal"] = {"Dahalo"},
["dam"] = {"Damakawa"},
["dao"] = {"Daai Chin"},
["daq"] = {"Dandami Maria"},
["dar"] = {"Dargwa"},
["das"] = {"Daho-Doo"},
["dau"] = {"Dar Sila Daju"},
["dav"] = {"Taita", "Dawida"},
["daw"] = {"Davawenyo"},
["dax"] = {"Dayi"},
["day"] = {"Land Dayak languages"},
["daz"] = {"Moi-Wadea", "Dao"},
["dba"] = {"Bangime"},
["dbb"] = {"Deno"},
["dbd"] = {"Dadiya"},
["dbe"] = {"Dabe"},
["dbf"] = {"Edopi"},
["dbg"] = {"Dogul Dom Dogon"},
["dbi"] = {"Doka"},
["dbj"] = {"Ida'an"},
["dbl"] = {"Dyirbal"},
["dbm"] = {"Duguri"},
["dbn"] = {"Duriankere"},
["dbo"] = {"Dulbu"},
["dbp"] = {"Duwai"},
["dbq"] = {"Daba"},
["dbr"] = {"Dabarre"},
["dbt"] = {"Ben Tey Dogon"},
["dbu"] = {"Bondum Dom Dogon"},
["dbv"] = {"Dungu"},
["dbw"] = {"Bankan Tey Dogon"},
["dby"] = {"Dibiyaso"},
["dcc"] = {"Deccan"},
["dcr"] = {"Negerhollands"},
["dda"] = {"Dadi Dadi"},
["ddd"] = {"Dongotono"},
["dde"] = {"Doondo"},
["ddg"] = {"Fataluku"},
["ddi"] = {"West Goodenough"},
["ddj"] = {"Jaru"},
["ddn"] = {"Dendi (Benin)"},
["ddo"] = {"Dido"},
["ddr"] = {"Dhudhuroa"},
["dds"] = {"Donno So Dogon"},
["ddw"] = {"Dawera-Daweloor"},
["dec"] = {"Dagik"},
["ded"] = {"Dedua"},
["dee"] = {"Dewoin"},
["def"] = {"Dezfuli"},
["deg"] = {"Degema"},
["deh"] = {"Dehwari"},
["dei"] = {"Demisa"},
["del"] = {"Delaware"},
["dem"] = {"Dem"},
["den"] = {"Slavey"},
["dep"] = {"Pidgin Delaware"},
["deq"] = {"Dendi (Central African Republic)"},
["der"] = {"Deori"},
["des"] = {"Desano"},
["dev"] = {"Domung"},
["dez"] = {"Dengese"},
["dga"] = {"Southern Dagaare"},
["dgb"] = {"Bunoge Dogon"},
["dgc"] = {"Casiguran Dumagat Agta"},
["dgd"] = {"Dagaari Dioula"},
["dge"] = {"Degenan"},
["dgg"] = {"Doga"},
["dgh"] = {"Dghwede"},
["dgi"] = {"Northern Dagara"},
["dgk"] = {"Dagba"},
["dgl"] = {"Andaandi", "Dongolawi"},
["dgn"] = {"Dagoman"},
["dgo"] = {"Dogri (individual language)"},
["dgr"] = {"Tlicho", "Dogrib", "Tłı̨chǫ"},
["dgs"] = {"Dogoso"},
["dgt"] = {"Ndra'ngith"},
["dgw"] = {"Daungwurrung"},
["dgx"] = {"Doghoro"},
["dgz"] = {"Daga"},
["dhd"] = {"Dhundari"},
["dhg"] = {"Dhangu-Djangu", "Dhangu", "Djangu"},
["dhi"] = {"Dhimal"},
["dhl"] = {"Dhalandji"},
["dhm"] = {"Zemba"},
["dhn"] = {"Dhanki"},
["dho"] = {"Dhodia"},
["dhr"] = {"Dhargari"},
["dhs"] = {"Dhaiso"},
["dhu"] = {"Dhurga"},
["dhv"] = {"Dehu", "Drehu"},
["dhw"] = {"Dhanwar (Nepal)"},
["dhx"] = {"Dhungaloo"},
["dia"] = {"Dia"},
["dib"] = {"South Central Dinka"},
["dic"] = {"Lakota Dida"},
["did"] = {"Didinga"},
["dif"] = {"Dieri", "Diyari"},
["dig"] = {"Digo", "Chidigo"},
["dih"] = {"Kumiai"},
["dii"] = {"Dimbong"},
["dij"] = {"Dai"},
["dik"] = {"Southwestern Dinka"},
["dil"] = {"Dilling"},
["dim"] = {"Dime"},
["din"] = {"Dinka"},
["dio"] = {"Dibo"},
["dip"] = {"Northeastern Dinka"},
["diq"] = {"Dimli (individual language)"},
["dir"] = {"Dirim"},
["dis"] = {"Dimasa"},
["diu"] = {"Diriku"},
["diw"] = {"Northwestern Dinka"},
["dix"] = {"Dixon Reef"},
["diy"] = {"Diuwe"},
["diz"] = {"Ding"},
["dja"] = {"Djadjawurrung"},
["djb"] = {"Djinba"},
["djc"] = {"Dar Daju Daju"},
["djd"] = {"Djamindjung", "Ngaliwurru"},
["dje"] = {"Zarma"},
["djf"] = {"Djangun"},
["dji"] = {"Djinang"},
["djj"] = {"Djeebbana"},
["djk"] = {"Eastern Maroon Creole", "Businenge Tongo", "Nenge"},
["djm"] = {"Jamsay Dogon"},
["djn"] = {"Jawoyn", "Djauan"},
["djo"] = {"Jangkang"},
["djr"] = {"Djambarrpuyngu"},
["dju"] = {"Kapriman"},
["djw"] = {"Djawi"},
["dka"] = {"Dakpakha"},
["dkg"] = {"Kadung"},
["dkk"] = {"Dakka"},
["dkr"] = {"Kuijau"},
["dks"] = {"Southeastern Dinka"},
["dkx"] = {"Mazagway"},
["dlg"] = {"Dolgan"},
["dlk"] = {"Dahalik"},
["dlm"] = {"Dalmatian"},
["dln"] = {"Darlong"},
["dma"] = {"Duma"},
["dmb"] = {"Mombo Dogon"},
["dmc"] = {"Gavak"},
["dmd"] = {"Madhi Madhi"},
["dme"] = {"Dugwor"},
["dmf"] = {"Medefaidrin"},
["dmg"] = {"Upper Kinabatangan"},
["dmk"] = {"Domaaki"},
["dml"] = {"Dameli"},
["dmm"] = {"Dama"},
["dmn"] = {"Mande languages"},
["dmo"] = {"Kemedzung"},
["dmr"] = {"East Damar"},
["dms"] = {"Dampelas"},
["dmu"] = {"Dubu", "Tebi"},
["dmv"] = {"Dumpas"},
["dmw"] = {"Mudburra"},
["dmx"] = {"Dema"},
["dmy"] = {"Demta", "Sowari"},
["dna"] = {"Upper Grand Valley Dani"},
["dnd"] = {"Daonda"},
["dne"] = {"Ndendeule"},
["dng"] = {"Dungan"},
["dni"] = {"Lower Grand Valley Dani"},
["dnj"] = {"Dan"},
["dnk"] = {"Dengka"},
["dnn"] = {"Dzùùngoo"},
["dno"] = {"Ndrulo", "Northern Lendu"},
["dnr"] = {"Danaru"},
["dnt"] = {"Mid Grand Valley Dani"},
["dnu"] = {"Danau"},
["dnv"] = {"Danu"},
["dnw"] = {"Western Dani"},
["dny"] = {"Dení"},
["doa"] = {"Dom"},
["dob"] = {"Dobu"},
["doc"] = {"Northern Dong"},
["doe"] = {"Doe"},
["dof"] = {"Domu"},
["doh"] = {"Dong"},
["doi"] = {"Dogri (macrolanguage)"},
["dok"] = {"Dondo"},
["dol"] = {"Doso"},
["don"] = {"Toura (Papua New Guinea)"},
["doo"] = {"Dongo"},
["dop"] = {"Lukpa"},
["doq"] = {"Dominican Sign Language"},
["dor"] = {"Dori'o"},
["dos"] = {"Dogosé"},
["dot"] = {"Dass"},
["dov"] = {"Dombe"},
["dow"] = {"Doyayo"},
["dox"] = {"Bussa"},
["doy"] = {"Dompo"},
["doz"] = {"Dorze"},
["dpp"] = {"Papar"},
["dra"] = {"Dravidian languages"},
["drb"] = {"Dair"},
["drc"] = {"Minderico"},
["drd"] = {"Darmiya"},
["dre"] = {"Dolpo"},
["drg"] = {"Rungus"},
["dri"] = {"C'Lela"},
["drl"] = {"Paakantyi"},
["drn"] = {"West Damar"},
["dro"] = {"Daro-Matu Melanau"},
["drq"] = {"Dura"},
["drs"] = {"Gedeo"},
["drt"] = {"Drents"},
["dru"] = {"Rukai"},
["dry"] = {"Darai"},
["dsb"] = {"Lower Sorbian"},
["dse"] = {"Dutch Sign Language"},
["dsh"] = {"Daasanach"},
["dsi"] = {"Disa"},
["dsk"] = {"Dokshi"},
["dsl"] = {"Danish Sign Language"},
["dsn"] = {"Dusner"},
["dso"] = {"Desiya"},
["dsq"] = {"Tadaksahak"},
["dsz"] = {"Mardin Sign Language"},
["dta"] = {"Daur"},
["dtb"] = {"Labuk-Kinabatangan Kadazan"},
["dtd"] = {"Ditidaht"},
["dth"] = {"Adithinngithigh"},
["dti"] = {"Ana Tinga Dogon"},
["dtk"] = {"Tene Kan Dogon"},
["dtm"] = {"Tomo Kan Dogon"},
["dtn"] = {"Daatsʼíin"},
["dto"] = {"Tommo So Dogon"},
["dtp"] = {"Kadazan Dusun", "Central Dusun"},
["dtr"] = {"Lotud"},
["dts"] = {"Toro So Dogon"},
["dtt"] = {"Toro Tegu Dogon"},
["dtu"] = {"Tebul Ure Dogon"},
["dty"] = {"Dotyali"},
["dua"] = {"Duala"},
["dub"] = {"Dubli"},
["duc"] = {"Duna"},
["due"] = {"Umiray Dumaget Agta"},
["duf"] = {"Dumbea", "Drubea"},
["dug"] = {"Duruma", "Chiduruma"},
["duh"] = {"Dungra Bhil"},
["dui"] = {"Dumun"},
["duk"] = {"Uyajitaya"},
["dul"] = {"Alabat Island Agta"},
["dum"] = {"Middle Dutch (ca. 1050-1350)"},
["dun"] = {"Dusun Deyah"},
["duo"] = {"Dupaninan Agta"},
["dup"] = {"Duano"},
["duq"] = {"Dusun Malang"},
["dur"] = {"Dii"},
["dus"] = {"Dumi"},
["duu"] = {"Drung"},
["duv"] = {"Duvle"},
["duw"] = {"Dusun Witu"},
["dux"] = {"Duungooma"},
["duy"] = {"Dicamay Agta"},
["duz"] = {"Duli-Gey"},
["dva"] = {"Duau"},
["dwa"] = {"Diri"},
["dwk"] = {"Dawik Kui"},
["dwr"] = {"Dawro"},
["dws"] = {"Dutton World Speedwords"},
["dwu"] = {"Dhuwal"},
["dww"] = {"Dawawa"},
["dwy"] = {"Dhuwaya"},
["dwz"] = {"Dewas Rai"},
["dya"] = {"Dyan"},
["dyb"] = {"Dyaberdyaber"},
["dyd"] = {"Dyugun"},
["dyg"] = {"Villa Viciosa Agta"},
["dyi"] = {"Djimini Senoufo"},
["dyl"] = {"Bhutanese Sign Language"},
["dym"] = {"Yanda Dom Dogon"},
["dyn"] = {"Dyangadi", "Dhanggatti"},
["dyo"] = {"Jola-Fonyi"},
["dyr"] = {"Dyarim"},
["dyu"] = {"Dyula"},
["dyy"] = {"Djabugay", "Dyaabugay"},
["dza"] = {"Tunzu"},
["dzd"] = {"Daza"},
["dze"] = {"Djiwarli"},
["dzg"] = {"Dazaga"},
["dzl"] = {"Dzalakha"},
["dzn"] = {"Dzando"},
["eaa"] = {"Karenggapa"},
["ebc"] = {"Beginci"},
["ebg"] = {"Ebughu"},
["ebk"] = {"Eastern Bontok"},
["ebo"] = {"Teke-Ebo"},
["ebr"] = {"Ebrié"},
["ebu"] = {"Embu", "Kiembu"},
["ecr"] = {"Eteocretan"},
["ecs"] = {"Ecuadorian Sign Language"},
["ecy"] = {"Eteocypriot"},
["eee"] = {"E"},
["efa"] = {"Efai"},
["efe"] = {"Efe"},
["efi"] = {"Efik"},
["ega"] = {"Ega"},
["egl"] = {"Emilian"},
["egm"] = {"Benamanga"},
["ego"] = {"Eggon"},
["egx"] = {"Egyptian languages"},
["egy"] = {"Egyptian (Ancient)"},
["ehs"] = {"Miyakubo Sign Language"},
["ehu"] = {"Ehueun"},
["eip"] = {"Eipomek"},
["eit"] = {"Eitiep"},
["eiv"] = {"Askopan"},
["eja"] = {"Ejamat"},
["eka"] = {"Ekajuk"},
["eke"] = {"Ekit"},
["ekg"] = {"Ekari"},
["eki"] = {"Eki"},
["ekk"] = {"Standard Estonian"},
["ekl"] = {"Kol (Bangladesh)", "Kol"},
["ekm"] = {"Elip"},
["eko"] = {"Koti"},
["ekp"] = {"Ekpeye"},
["ekr"] = {"Yace"},
["eky"] = {"Eastern Kayah"},
["ele"] = {"Elepi"},
["elh"] = {"El Hugeirat"},
["eli"] = {"Nding"},
["elk"] = {"Elkei"},
["elm"] = {"Eleme"},
["elo"] = {"El Molo"},
["elu"] = {"Elu"},
["elx"] = {"Elamite"},
["ema"] = {"Emai-Iuleha-Ora"},
["emb"] = {"Embaloh"},
["eme"] = {"Emerillon"},
["emg"] = {"Eastern Meohang"},
["emi"] = {"Mussau-Emira"},
["emk"] = {"Eastern Maninkakan"},
["emm"] = {"Mamulique"},
["emn"] = {"Eman"},
["emp"] = {"Northern Emberá"},
["emq"] = {"Eastern Minyag"},
["ems"] = {"Pacific Gulf Yupik"},
["emu"] = {"Eastern Muria"},
["emw"] = {"Emplawas"},
["emx"] = {"Erromintxela"},
["emy"] = {"Epigraphic Mayan"},
["emz"] = {"Mbessa"},
["ena"] = {"Apali"},
["enb"] = {"Markweeta"},
["enc"] = {"En"},
["end"] = {"Ende"},
["enf"] = {"Forest Enets"},
["enh"] = {"Tundra Enets"},
["enl"] = {"Enlhet"},
["enm"] = {"Middle English (1100-1500)"},
["enn"] = {"Engenni"},
["eno"] = {"Enggano"},
["enq"] = {"Enga"},
["enr"] = {"Emumu", "Emem"},
["enu"] = {"Enu"},
["env"] = {"Enwan (Edo State)"},
["enw"] = {"Enwan (Akwa Ibom State)"},
["enx"] = {"Enxet"},
["eot"] = {"Beti (Côte d'Ivoire)"},
["epi"] = {"Epie"},
["era"] = {"Eravallan"},
["erg"] = {"Sie"},
["erh"] = {"Eruwa"},
["eri"] = {"Ogea"},
["erk"] = {"South Efate"},
["ero"] = {"Horpa"},
["err"] = {"Erre"},
["ers"] = {"Ersu"},
["ert"] = {"Eritai"},
["erw"] = {"Erokwanas"},
["ese"] = {"Ese Ejja"},
["esg"] = {"Aheri Gondi"},
["esh"] = {"Eshtehardi"},
["esi"] = {"North Alaskan Inupiatun"},
["esk"] = {"Northwest Alaska Inupiatun"},
["esl"] = {"Egypt Sign Language"},
["esm"] = {"Esuma"},
["esn"] = {"Salvadoran Sign Language"},
["eso"] = {"Estonian Sign Language"},
["esq"] = {"Esselen"},
["ess"] = {"Central Siberian Yupik"},
["esu"] = {"Central Yupik"},
["esx"] = {"Eskimo-Aleut languages"},
["esy"] = {"Eskayan"},
["etb"] = {"Etebi"},
["etc"] = {"Etchemin"},
["eth"] = {"Ethiopian Sign Language"},
["etn"] = {"Eton (Vanuatu)"},
["eto"] = {"Eton (Cameroon)"},
["etr"] = {"Edolo"},
["ets"] = {"Yekhee"},
["ett"] = {"Etruscan"},
["etu"] = {"Ejagham"},
["etx"] = {"Eten"},
["etz"] = {"Semimi"},
["eud"] = {"Eudeve"},
["euq"] = {"Basque (family)"},
["eve"] = {"Even"},
["evh"] = {"Uvbie"},
["evn"] = {"Evenki"},
["ewo"] = {"Ewondo"},
["ext"] = {"Extremaduran"},
["eya"] = {"Eyak"},
["eyo"] = {"Keiyo"},
["eza"] = {"Ezaa"},
["eze"] = {"Uzekwe"},
["faa"] = {"Fasu"},
["fab"] = {"Fa d'Ambu"},
["fad"] = {"Wagi"},
["faf"] = {"Fagani"},
["fag"] = {"Finongan"},
["fah"] = {"Baissa Fali"},
["fai"] = {"Faiwol"},
["faj"] = {"Faita"},
["fak"] = {"Fang (Cameroon)"},
["fal"] = {"South Fali"},
["fam"] = {"Fam"},
["fan"] = {"Fang (Equatorial Guinea)"},
["fap"] = {"Paloor"},
["far"] = {"Fataleka"},
["fat"] = {"Fanti"},
["fau"] = {"Fayu"},
["fax"] = {"Fala"},
["fay"] = {"Southwestern Fars"},
["faz"] = {"Northwestern Fars"},
["fbl"] = {"West Albay Bikol"},
["fcs"] = {"Quebec Sign Language"},
["fer"] = {"Feroge"},
["ffi"] = {"Foia Foia"},
["ffm"] = {"Maasina Fulfulde"},
["fgr"] = {"Fongoro"},
["fia"] = {"Nobiin"},
["fie"] = {"Fyer"},
["fif"] = {"Faifi"},
["fil"] = {"Filipino", "Pilipino"},
["fip"] = {"Fipa"},
["fir"] = {"Firan"},
["fit"] = {"Tornedalen Finnish", "Meänkieli"},
["fiu"] = {"Finno-Ugrian languages"},
["fiw"] = {"Fiwaga"},
["fkk"] = {"Kirya-Konzəl"},
["fkv"] = {"Kven Finnish"},
["fla"] = {"Kalispel-Pend d'Oreille"},
["flh"] = {"Foau"},
["fli"] = {"Fali"},
["fll"] = {"North Fali"},
["fln"] = {"Flinders Island"},
["flr"] = {"Fuliiru"},
["fly"] = {"Flaaitaal", "Tsotsitaal"},
["fmp"] = {"Fe'fe'"},
["fmu"] = {"Far Western Muria"},
["fnb"] = {"Fanbak"},
["fng"] = {"Fanagalo"},
["fni"] = {"Fania"},
["fod"] = {"Foodo"},
["foi"] = {"Foi"},
["fom"] = {"Foma"},
["fon"] = {"Fon"},
["for"] = {"Fore"},
["fos"] = {"Siraya"},
["fox"] = {"Formosan languages"},
["fpe"] = {"Fernando Po Creole English"},
["fqs"] = {"Fas"},
["frc"] = {"Cajun French"},
["frd"] = {"Fordata"},
["frk"] = {"Frankish"},
["frm"] = {"Middle French (ca. 1400-1600)"},
["fro"] = {"Old French (842-ca. 1400)"},
["frp"] = {"Arpitan", "Francoprovençal"},
["frq"] = {"Forak"},
["frr"] = {"Northern Frisian"},
["frs"] = {"Eastern Frisian"},
["frt"] = {"Fortsenal"},
["fse"] = {"Finnish Sign Language"},
["fsl"] = {"French Sign Language"},
["fss"] = {"Finland-Swedish Sign Language", "finlandssvenskt teckenspråk", "suomenruotsalainen viittomakieli"},
["fub"] = {"Adamawa Fulfulde"},
["fuc"] = {"Pulaar"},
["fud"] = {"East Futuna"},
["fue"] = {"Borgu Fulfulde"},
["fuf"] = {"Pular"},
["fuh"] = {"Western Niger Fulfulde"},
["fui"] = {"Bagirmi Fulfulde"},
["fuj"] = {"Ko"},
["fum"] = {"Fum"},
["fun"] = {"Fulniô"},
["fuq"] = {"Central-Eastern Niger Fulfulde"},
["fur"] = {"Friulian"},
["fut"] = {"Futuna-Aniwa"},
["fuu"] = {"Furu"},
["fuv"] = {"Nigerian Fulfulde"},
["fuy"] = {"Fuyug"},
["fvr"] = {"Fur"},
["fwa"] = {"Fwâi"},
["fwe"] = {"Fwe"},
["gaa"] = {"Ga"},
["gab"] = {"Gabri"},
["gac"] = {"Mixed Great Andamanese"},
["gad"] = {"Gaddang"},
["gae"] = {"Guarequena"},
["gaf"] = {"Gende"},
["gag"] = {"Gagauz"},
["gah"] = {"Alekano"},
["gai"] = {"Borei"},
["gaj"] = {"Gadsup"},
["gak"] = {"Gamkonora"},
["gal"] = {"Galolen"},
["gam"] = {"Kandawo"},
["gan"] = {"Gan Chinese"},
["gao"] = {"Gants"},
["gap"] = {"Gal"},
["gaq"] = {"Gata'"},
["gar"] = {"Galeya"},
["gas"] = {"Adiwasi Garasia"},
["gat"] = {"Kenati"},
["gau"] = {"Mudhili Gadaba"},
["gaw"] = {"Nobonob"},
["gax"] = {"Borana-Arsi-Guji Oromo"},
["gay"] = {"Gayo"},
["gaz"] = {"West Central Oromo"},
["gba"] = {"Gbaya (Central African Republic)"},
["gbb"] = {"Kaytetye"},
["gbd"] = {"Karajarri"},
["gbe"] = {"Niksek"},
["gbf"] = {"Gaikundi"},
["gbg"] = {"Gbanziri"},
["gbh"] = {"Defi Gbe"},
["gbi"] = {"Galela"},
["gbj"] = {"Bodo Gadaba"},
["gbk"] = {"Gaddi"},
["gbl"] = {"Gamit"},
["gbm"] = {"Garhwali"},
["gbn"] = {"Mo'da"},
["gbo"] = {"Northern Grebo"},
["gbp"] = {"Gbaya-Bossangoa"},
["gbq"] = {"Gbaya-Bozoum"},
["gbr"] = {"Gbagyi"},
["gbs"] = {"Gbesi Gbe"},
["gbu"] = {"Gagadu"},
["gbv"] = {"Gbanu"},
["gbw"] = {"Gabi-Gabi"},
["gbx"] = {"Eastern Xwla Gbe"},
["gby"] = {"Gbari"},
["gbz"] = {"Zoroastrian Dari"},
["gcc"] = {"Mali"},
["gcd"] = {"Ganggalida"},
["gce"] = {"Galice"},
["gcf"] = {"Guadeloupean Creole French"},
["gcl"] = {"Grenadian Creole English"},
["gcn"] = {"Gaina"},
["gcr"] = {"Guianese Creole French"},
["gct"] = {"Colonia Tovar German"},
["gda"] = {"Gade Lohar"},
["gdb"] = {"Pottangi Ollar Gadaba"},
["gdc"] = {"Gugu Badhun"},
["gdd"] = {"Gedaged"},
["gde"] = {"Gude"},
["gdf"] = {"Guduf-Gava"},
["gdg"] = {"Ga'dang"},
["gdh"] = {"Gadjerawang", "Gajirrabeng"},
["gdi"] = {"Gundi"},
["gdj"] = {"Gurdjar"},
["gdk"] = {"Gadang"},
["gdl"] = {"Dirasha"},
["gdm"] = {"Laal"},
["gdn"] = {"Umanakaina"},
["gdo"] = {"Ghodoberi"},
["gdq"] = {"Mehri"},
["gdr"] = {"Wipi"},
["gds"] = {"Ghandruk Sign Language"},
["gdt"] = {"Kungardutyi"},
["gdu"] = {"Gudu"},
["gdx"] = {"Godwari"},
["gea"] = {"Geruma"},
["geb"] = {"Kire"},
["gec"] = {"Gboloo Grebo"},
["ged"] = {"Gade"},
["gef"] = {"Gerai"},
["geg"] = {"Gengle"},
["geh"] = {"Hutterite German", "Hutterisch"},
["gei"] = {"Gebe"},
["gej"] = {"Gen"},
["gek"] = {"Ywom"},
["gel"] = {"ut-Ma'in"},
["gem"] = {"Germanic languages"},
["geq"] = {"Geme"},
["ges"] = {"Geser-Gorom"},
["gev"] = {"Eviya"},
["gew"] = {"Gera"},
["gex"] = {"Garre"},
["gey"] = {"Enya"},
["gez"] = {"Geez"},
["gfk"] = {"Patpatar"},
["gft"] = {"Gafat"},
["gga"] = {"Gao"},
["ggb"] = {"Gbii"},
["ggd"] = {"Gugadj"},
["gge"] = {"Gurr-goni"},
["ggg"] = {"Gurgula"},
["ggk"] = {"Kungarakany"},
["ggl"] = {"Ganglau"},
["ggt"] = {"Gitua"},
["ggu"] = {"Gagu", "Gban"},
["ggw"] = {"Gogodala"},
["gha"] = {"Ghadamès"},
["ghc"] = {"Hiberno-Scottish Gaelic"},
["ghe"] = {"Southern Ghale"},
["ghh"] = {"Northern Ghale"},
["ghk"] = {"Geko Karen"},
["ghl"] = {"Ghulfan"},
["ghn"] = {"Ghanongga"},
["gho"] = {"Ghomara"},
["ghr"] = {"Ghera"},
["ghs"] = {"Guhu-Samane"},
["ght"] = {"Kuke", "Kutang Ghale"},
["gia"] = {"Kija"},
["gib"] = {"Gibanawa"},
["gic"] = {"Gail"},
["gid"] = {"Gidar"},
["gie"] = {"Gaɓogbo", "Guébie"},
["gig"] = {"Goaria"},
["gih"] = {"Githabul"},
["gii"] = {"Girirra"},
["gil"] = {"Gilbertese"},
["gim"] = {"Gimi (Eastern Highlands)"},
["gin"] = {"Hinukh"},
["gip"] = {"Gimi (West New Britain)"},
["giq"] = {"Green Gelao"},
["gir"] = {"Red Gelao"},
["gis"] = {"North Giziga"},
["git"] = {"Gitxsan"},
["giu"] = {"Mulao"},
["giw"] = {"White Gelao"},
["gix"] = {"Gilima"},
["giy"] = {"Giyug"},
["giz"] = {"South Giziga"},
["gjk"] = {"Kachi Koli"},
["gjm"] = {"Gunditjmara"},
["gjn"] = {"Gonja"},
["gjr"] = {"Gurindji Kriol"},
["gju"] = {"Gujari"},
["gka"] = {"Guya"},
["gkd"] = {"Magɨ (Madang Province)"},
["gke"] = {"Ndai"},
["gkn"] = {"Gokana"},
["gko"] = {"Kok-Nar"},
["gkp"] = {"Guinea Kpelle"},
["gku"] = {"ǂUngkue"},
["glb"] = {"Belning"},
["glc"] = {"Bon Gula"},
["gld"] = {"Nanai"},
["glh"] = {"Northwest Pashai", "Northwest Pashayi"},
["glj"] = {"Gula Iro"},
["glk"] = {"Gilaki"},
["gll"] = {"Garlali"},
["glo"] = {"Galambu"},
["glr"] = {"Glaro-Twabo"},
["glu"] = {"Gula (Chad)"},
["glw"] = {"Glavda"},
["gly"] = {"Gule"},
["gma"] = {"Gambera"},
["gmb"] = {"Gula'alaa"},
["gmd"] = {"Mághdì"},
["gme"] = {"East Germanic languages"},
["gmg"] = {"Magɨyi"},
["gmh"] = {"Middle High German (ca. 1050-1500)"},
["gml"] = {"Middle Low German"},
["gmm"] = {"Gbaya-Mbodomo"},
["gmn"] = {"Gimnime"},
["gmq"] = {"North Germanic languages"},
["gmr"] = {"Mirning", "Mirniny"},
["gmu"] = {"Gumalu"},
["gmv"] = {"Gamo"},
["gmw"] = {"West Germanic languages"},
["gmx"] = {"Magoma"},
["gmy"] = {"Mycenaean Greek"},
["gmz"] = {"Mgbolizhia"},
["gna"] = {"Kaansa"},
["gnb"] = {"Gangte"},
["gnc"] = {"Guanche"},
["gnd"] = {"Zulgo-Gemzek"},
["gne"] = {"Ganang"},
["gng"] = {"Ngangam"},
["gnh"] = {"Lere"},
["gni"] = {"Gooniyandi"},
["gnj"] = {"Ngen"},
["gnk"] = {"ǁGana"},
["gnl"] = {"Gangulu"},
["gnm"] = {"Ginuman"},
["gnn"] = {"Gumatj"},
["gno"] = {"Northern Gondi"},
["gnq"] = {"Gana"},
["gnr"] = {"Gureng Gureng"},
["gnt"] = {"Guntai"},
["gnu"] = {"Gnau"},
["gnw"] = {"Western Bolivian Guaraní"},
["gnz"] = {"Ganzi"},
["goa"] = {"Guro"},
["gob"] = {"Playero"},
["goc"] = {"Gorakor"},
["god"] = {"Godié"},
["goe"] = {"Gongduk"},
["gof"] = {"Gofa"},
["gog"] = {"Gogo"},
["goh"] = {"Old High German (ca. 750-1050)"},
["goi"] = {"Gobasi"},
["goj"] = {"Gowlan"},
["gok"] = {"Gowli"},
["gol"] = {"Gola"},
["gom"] = {"Goan Konkani"},
["gon"] = {"Gondi"},
["goo"] = {"Gone Dau"},
["gop"] = {"Yeretuar"},
["goq"] = {"Gorap"},
["gor"] = {"Gorontalo"},
["gos"] = {"Gronings"},
["got"] = {"Gothic"},
["gou"] = {"Gavar"},
["gov"] = {"Goo"},
["gow"] = {"Gorowa"},
["gox"] = {"Gobu"},
["goy"] = {"Goundo"},
["goz"] = {"Gozarkhani"},
["gpa"] = {"Gupa-Abawa"},
["gpe"] = {"Ghanaian Pidgin English"},
["gpn"] = {"Taiap"},
["gqa"] = {"Ga'anda"},
["gqi"] = {"Guiqiong"},
["gqn"] = {"Guana (Brazil)"},
["gqr"] = {"Gor"},
["gqu"] = {"Qau"},
["gra"] = {"Rajput Garasia"},
["grb"] = {"Grebo"},
["grc"] = {"Ancient Greek (to 1453)"},
["grd"] = {"Guruntum-Mbaaru"},
["grg"] = {"Madi"},
["grh"] = {"Gbiri-Niragu"},
["gri"] = {"Ghari"},
["grj"] = {"Southern Grebo"},
["grk"] = {"Greek languages"},
["grm"] = {"Kota Marudu Talantang"},
["gro"] = {"Groma"},
["grq"] = {"Gorovu"},
["grr"] = {"Taznatit"},
["grs"] = {"Gresi"},
["grt"] = {"Garo"},
["gru"] = {"Kistane"},
["grv"] = {"Central Grebo"},
["grw"] = {"Gweda"},
["grx"] = {"Guriaso"},
["gry"] = {"Barclayville Grebo"},
["grz"] = {"Guramalum"},
["gse"] = {"Ghanaian Sign Language"},
["gsg"] = {"German Sign Language"},
["gsl"] = {"Gusilay"},
["gsm"] = {"Guatemalan Sign Language"},
["gsn"] = {"Nema", "Gusan"},
["gso"] = {"Southwest Gbaya"},
["gsp"] = {"Wasembo"},
["gss"] = {"Greek Sign Language"},
["gsw"] = {"Swiss German", "Alemannic", "Alsatian"},
["gta"] = {"Guató"},
["gtu"] = {"Aghu-Tharnggala"},
["gua"] = {"Shiki"},
["gub"] = {"Guajajára"},
["guc"] = {"Wayuu"},
["gud"] = {"Yocoboué Dida"},
["gue"] = {"Gurindji"},
["guf"] = {"Gupapuyngu"},
["gug"] = {"Paraguayan Guaraní"},
["guh"] = {"Guahibo"},
["gui"] = {"Eastern Bolivian Guaraní"},
["guk"] = {"Gumuz"},
["gul"] = {"Sea Island Creole English"},
["gum"] = {"Guambiano"},
["gun"] = {"Mbyá Guaraní"},
["guo"] = {"Guayabero"},
["gup"] = {"Gunwinggu"},
["guq"] = {"Aché"},
["gur"] = {"Farefare"},
["gus"] = {"Guinean Sign Language"},
["gut"] = {"Maléku Jaíka"},
["guu"] = {"Yanomamö"},
["guw"] = {"Gun"},
["gux"] = {"Gourmanchéma"},
["guz"] = {"Gusii", "Ekegusii"},
["gva"] = {"Guana (Paraguay)"},
["gvc"] = {"Guanano"},
["gve"] = {"Duwet"},
["gvf"] = {"Golin"},
["gvj"] = {"Guajá"},
["gvl"] = {"Gulay"},
["gvm"] = {"Gurmana"},
["gvn"] = {"Kuku-Yalanji"},
["gvo"] = {"Gavião Do Jiparaná"},
["gvp"] = {"Pará Gavião"},
["gvr"] = {"Gurung"},
["gvs"] = {"Gumawana"},
["gvy"] = {"Guyani"},
["gwa"] = {"Mbato"},
["gwb"] = {"Gwa"},
["gwc"] = {"Gawri", "Kalami"},
["gwd"] = {"Gawwada"},
["gwe"] = {"Gweno"},
["gwf"] = {"Gowro"},
["gwg"] = {"Moo"},
["gwi"] = {"Gwichʼin"},
["gwj"] = {"ǀGwi"},
["gwm"] = {"Awngthim"},
["gwn"] = {"Gwandara"},
["gwr"] = {"Gwere"},
["gwt"] = {"Gawar-Bati"},
["gwu"] = {"Guwamu"},
["gww"] = {"Kwini"},
["gwx"] = {"Gua"},
["gxx"] = {"Wè Southern"},
["gya"] = {"Northwest Gbaya"},
["gyb"] = {"Garus"},
["gyd"] = {"Kayardild"},
["gye"] = {"Gyem"},
["gyf"] = {"Gungabula"},
["gyg"] = {"Gbayi"},
["gyi"] = {"Gyele"},
["gyl"] = {"Gayil"},
["gym"] = {"Ngäbere"},
["gyn"] = {"Guyanese Creole English"},
["gyo"] = {"Gyalsumdo"},
["gyr"] = {"Guarayu"},
["gyy"] = {"Gunya"},
["gyz"] = {"Geji", "Gyaazi"},
["gza"] = {"Ganza"},
["gzi"] = {"Gazi"},
["gzn"] = {"Gane"},
["haa"] = {"Hän"},
["hab"] = {"Hanoi Sign Language"},
["hac"] = {"Gurani"},
["had"] = {"Hatam"},
["hae"] = {"Eastern Oromo"},
["haf"] = {"Haiphong Sign Language"},
["hag"] = {"Hanga"},
["hah"] = {"Hahon"},
["hai"] = {"Haida"},
["haj"] = {"Hajong"},
["hak"] = {"Hakka Chinese"},
["hal"] = {"Halang"},
["ham"] = {"Hewa"},
["han"] = {"Hangaza"},
["hao"] = {"Hakö"},
["hap"] = {"Hupla"},
["haq"] = {"Ha"},
["har"] = {"Harari"},
["has"] = {"Haisla"},
["hav"] = {"Havu"},
["haw"] = {"Hawaiian"},
["hax"] = {"Southern Haida"},
["hay"] = {"Haya"},
["haz"] = {"Hazaragi"},
["hba"] = {"Hamba"},
["hbb"] = {"Huba"},
["hbn"] = {"Heiban"},
["hbo"] = {"Ancient Hebrew"},
["hbu"] = {"Habu"},
["hca"] = {"Andaman Creole Hindi"},
["hch"] = {"Huichol"},
["hdn"] = {"Northern Haida"},
["hds"] = {"Honduras Sign Language"},
["hdy"] = {"Hadiyya"},
["hea"] = {"Northern Qiandong Miao"},
["hed"] = {"Herdé"},
["heg"] = {"Helong"},
["heh"] = {"Hehe"},
["hei"] = {"Heiltsuk"},
["hem"] = {"Hemba"},
["hgm"] = {"Haiǁom"},
["hgw"] = {"Haigwai"},
["hhi"] = {"Hoia Hoia"},
["hhr"] = {"Kerak"},
["hhy"] = {"Hoyahoya"},
["hia"] = {"Lamang"},
["hib"] = {"Hibito"},
["hid"] = {"Hidatsa"},
["hif"] = {"Fiji Hindi"},
["hig"] = {"Kamwe"},
["hih"] = {"Pamosu"},
["hii"] = {"Hinduri"},
["hij"] = {"Hijuk"},
["hik"] = {"Seit-Kaitetu"},
["hil"] = {"Hiligaynon"},
["him"] = {"Himachali languages", "Western Pahari languages"},
["hio"] = {"Tsoa"},
["hir"] = {"Himarimã"},
["hit"] = {"Hittite"},
["hiw"] = {"Hiw"},
["hix"] = {"Hixkaryána"},
["hji"] = {"Haji"},
["hka"] = {"Kahe"},
["hke"] = {"Hunde"},
["hkh"] = {"Khah", "Poguli"},
["hkk"] = {"Hunjara-Kaina Ke"},
["hkn"] = {"Mel-Khaonh"},
["hks"] = {"Hong Kong Sign Language", "Heung Kong Sau Yue"},
["hla"] = {"Halia"},
["hlb"] = {"Halbi"},
["hld"] = {"Halang Doan"},
["hle"] = {"Hlersu"},
["hlt"] = {"Matu Chin"},
["hlu"] = {"Hieroglyphic Luwian"},
["hma"] = {"Southern Mashan Hmong", "Southern Mashan Miao"},
["hmb"] = {"Humburi Senni Songhay"},
["hmc"] = {"Central Huishui Hmong", "Central Huishui Miao"},
["hmd"] = {"Large Flowery Miao", "A-hmaos", "Da-Hua Miao"},
["hme"] = {"Eastern Huishui Hmong", "Eastern Huishui Miao"},
["hmf"] = {"Hmong Don"},
["hmg"] = {"Southwestern Guiyang Hmong"},
["hmh"] = {"Southwestern Huishui Hmong", "Southwestern Huishui Miao"},
["hmi"] = {"Northern Huishui Hmong", "Northern Huishui Miao"},
["hmj"] = {"Ge", "Gejia"},
["hmk"] = {"Maek"},
["hml"] = {"Luopohe Hmong", "Luopohe Miao"},
["hmm"] = {"Central Mashan Hmong", "Central Mashan Miao"},
["hmn"] = {"Hmong", "Mong"},
["hmp"] = {"Northern Mashan Hmong", "Northern Mashan Miao"},
["hmq"] = {"Eastern Qiandong Miao"},
["hmr"] = {"Hmar"},
["hms"] = {"Southern Qiandong Miao"},
["hmt"] = {"Hamtai"},
["hmu"] = {"Hamap"},
["hmv"] = {"Hmong Dô"},
["hmw"] = {"Western Mashan Hmong", "Western Mashan Miao"},
["hmx"] = {"Hmong-Mien languages"},
["hmy"] = {"Southern Guiyang Hmong", "Southern Guiyang Miao"},
["hmz"] = {"Hmong Shua", "Sinicized Miao"},
["hna"] = {"Mina (Cameroon)"},
["hnd"] = {"Southern Hindko"},
["hne"] = {"Chhattisgarhi"},
["hng"] = {"Hungu"},
["hnh"] = {"ǁAni"},
["hni"] = {"Hani"},
["hnj"] = {"Hmong Njua", "Mong Leng", "Mong Njua"},
["hnm"] = {"Hainanese"},
["hnn"] = {"Hanunoo"},
["hno"] = {"Northern Hindko"},
["hns"] = {"Caribbean Hindustani"},
["hnu"] = {"Hung"},
["hoa"] = {"Hoava"},
["hob"] = {"Mari (Madang Province)"},
["hoc"] = {"Ho"},
["hod"] = {"Holma"},
["hoe"] = {"Horom"},
["hoh"] = {"Hobyót"},
["hoi"] = {"Holikachuk"},
["hoj"] = {"Hadothi", "Haroti"},
["hok"] = {"Hokan languages"},
["hol"] = {"Holu"},
["hom"] = {"Homa"},
["hoo"] = {"Holoholo"},
["hop"] = {"Hopi"},
["hor"] = {"Horo"},
["hos"] = {"Ho Chi Minh City Sign Language"},
["hot"] = {"Hote", "Malê"},
["hov"] = {"Hovongan"},
["how"] = {"Honi"},
["hoy"] = {"Holiya"},
["hoz"] = {"Hozo"},
["hpo"] = {"Hpon"},
["hps"] = {"Hawai'i Sign Language (HSL)", "Hawai'i Pidgin Sign Language"},
["hra"] = {"Hrangkhol"},
["hrc"] = {"Niwer Mil"},
["hre"] = {"Hre"},
["hrk"] = {"Haruku"},
["hrm"] = {"Horned Miao"},
["hro"] = {"Haroi"},
["hrp"] = {"Nhirrpi"},
["hrt"] = {"Hértevin"},
["hru"] = {"Hruso"},
["hrw"] = {"Warwar Feni"},
["hrx"] = {"Hunsrik"},
["hrz"] = {"Harzani"},
["hsb"] = {"Upper Sorbian"},
["hsh"] = {"Hungarian Sign Language"},
["hsl"] = {"Hausa Sign Language"},
["hsn"] = {"Xiang Chinese"},
["hss"] = {"Harsusi"},
["hti"] = {"Hoti"},
["hto"] = {"Minica Huitoto"},
["hts"] = {"Hadza"},
["htu"] = {"Hitu"},
["htx"] = {"Middle Hittite"},
["hub"] = {"Huambisa"},
["huc"] = {"ǂHua", "ǂʼAmkhoe"},
["hud"] = {"Huaulu"},
["hue"] = {"San Francisco Del Mar Huave"},
["huf"] = {"Humene"},
["hug"] = {"Huachipaeri"},
["huh"] = {"Huilliche"},
["hui"] = {"Huli"},
["huj"] = {"Northern Guiyang Hmong", "Northern Guiyang Miao"},
["huk"] = {"Hulung"},
["hul"] = {"Hula"},
["hum"] = {"Hungana"},
["huo"] = {"Hu"},
["hup"] = {"Hupa"},
["huq"] = {"Tsat"},
["hur"] = {"Halkomelem"},
["hus"] = {"Huastec"},
["hut"] = {"Humla"},
["huu"] = {"Murui Huitoto"},
["huv"] = {"San Mateo Del Mar Huave"},
["huw"] = {"Hukumina"},
["hux"] = {"Nüpode Huitoto"},
["huy"] = {"Hulaulá"},
["huz"] = {"Hunzib"},
["hvc"] = {"Haitian Vodoun Culture Language"},
["hve"] = {"San Dionisio Del Mar Huave"},
["hvk"] = {"Haveke"},
["hvn"] = {"Sabu"},
["hvv"] = {"Santa María Del Mar Huave"},
["hwa"] = {"Wané"},
["hwc"] = {"Hawai'i Creole English", "Hawai'i Pidgin"},
["hwo"] = {"Hwana"},
["hya"] = {"Hya"},
["hyw"] = {"Western Armenian"},
["hyx"] = {"Armenian (family)"},
["iai"] = {"Iaai"},
["ian"] = {"Iatmul"},
["iar"] = {"Purari"},
["iba"] = {"Iban"},
["ibb"] = {"Ibibio"},
["ibd"] = {"Iwaidja"},
["ibe"] = {"Akpes"},
["ibg"] = {"Ibanag"},
["ibh"] = {"Bih"},
["ibl"] = {"Ibaloi"},
["ibm"] = {"Agoi"},
["ibn"] = {"Ibino"},
["ibr"] = {"Ibuoro"},
["ibu"] = {"Ibu"},
["iby"] = {"Ibani"},
["ica"] = {"Ede Ica"},
["ich"] = {"Etkywan"},
["icl"] = {"Icelandic Sign Language"},
["icr"] = {"Islander Creole English"},
["ida"] = {"Idakho-Isukha-Tiriki", "Luidakho-Luisukha-Lutirichi"},
["idb"] = {"Indo-Portuguese"},
["idc"] = {"Idon", "Ajiya"},
["idd"] = {"Ede Idaca"},
["ide"] = {"Idere"},
["idi"] = {"Idi"},
["idr"] = {"Indri"},
["ids"] = {"Idesa"},
["idt"] = {"Idaté"},
["idu"] = {"Idoma"},
["ifa"] = {"Amganad Ifugao"},
["ifb"] = {"Batad Ifugao", "Ayangan Ifugao"},
["ife"] = {"Ifè"},
["iff"] = {"Ifo"},
["ifk"] = {"Tuwali Ifugao"},
["ifm"] = {"Teke-Fuumu"},
["ifu"] = {"Mayoyao Ifugao"},
["ify"] = {"Keley-I Kallahan"},
["igb"] = {"Ebira"},
["ige"] = {"Igede"},
["igg"] = {"Igana"},
["igl"] = {"Igala"},
["igm"] = {"Kanggape"},
["ign"] = {"Ignaciano"},
["igo"] = {"Isebe"},
["igs"] = {"Interglossa"},
["igw"] = {"Igwe"},
["ihb"] = {"Iha Based Pidgin"},
["ihi"] = {"Ihievbe"},
["ihp"] = {"Iha"},
["ihw"] = {"Bidhawal"},
["iin"] = {"Thiin"},
["iir"] = {"Indo-Iranian languages"},
["ijc"] = {"Izon"},
["ije"] = {"Biseni"},
["ijj"] = {"Ede Ije"},
["ijn"] = {"Kalabari"},
["ijo"] = {"Ijo languages"},
["ijs"] = {"Southeast Ijo"},
["ike"] = {"Eastern Canadian Inuktitut"},
["ikh"] = {"Ikhin-Arokho"},
["iki"] = {"Iko"},
["ikk"] = {"Ika"},
["ikl"] = {"Ikulu"},
["iko"] = {"Olulumo-Ikom"},
["ikp"] = {"Ikpeshi"},
["ikr"] = {"Ikaranggal"},
["iks"] = {"Inuit Sign Language"},
["ikt"] = {"Inuinnaqtun", "Western Canadian Inuktitut"},
["ikv"] = {"Iku-Gora-Ankwa"},
["ikw"] = {"Ikwere"},
["ikx"] = {"Ik"},
["ikz"] = {"Ikizu"},
["ila"] = {"Ile Ape"},
["ilb"] = {"Ila"},
["ilg"] = {"Garig-Ilgar"},
["ili"] = {"Ili Turki"},
["ilk"] = {"Ilongot"},
["ilm"] = {"Iranun (Malaysia)"},
["ilo"] = {"Iloko"},
["ilp"] = {"Iranun (Philippines)"},
["ils"] = {"International Sign"},
["ilu"] = {"Ili'uun"},
["ilv"] = {"Ilue"},
["ima"] = {"Mala Malasar"},
["imi"] = {"Anamgura"},
["iml"] = {"Miluk"},
["imn"] = {"Imonda"},
["imo"] = {"Imbongu"},
["imr"] = {"Imroing"},
["ims"] = {"Marsian"},
["imt"] = {"Imotong"},
["imy"] = {"Milyan"},
["inb"] = {"Inga"},
["inc"] = {"Indic languages"},
["ine"] = {"Indo-European languages"},
["ing"] = {"Degexit'an"},
["inh"] = {"Ingush"},
["inj"] = {"Jungle Inga"},
["inl"] = {"Indonesian Sign Language"},
["inm"] = {"Minaean"},
["inn"] = {"Isinai"},
["ino"] = {"Inoke-Yate"},
["inp"] = {"Iñapari"},
["ins"] = {"Indian Sign Language"},
["int"] = {"Intha"},
["inz"] = {"Ineseño"},
["ior"] = {"Inor"},
["iou"] = {"Tuma-Irumu"},
["iow"] = {"Iowa-Oto"},
["ipi"] = {"Ipili"},
["ipo"] = {"Ipiko"},
["iqu"] = {"Iquito"},
["iqw"] = {"Ikwo"},
["ira"] = {"Iranian languages"},
["ire"] = {"Iresim"},
["irh"] = {"Irarutu"},
["iri"] = {"Rigwe", "Irigwe"},
["irk"] = {"Iraqw"},
["irn"] = {"Irántxe"},
["iro"] = {"Iroquoian languages"},
["irr"] = {"Ir"},
["iru"] = {"Irula"},
["irx"] = {"Kamberau"},
["iry"] = {"Iraya"},
["isa"] = {"Isabi"},
["isc"] = {"Isconahua"},
["isd"] = {"Isnag"},
["ise"] = {"Italian Sign Language"},
["isg"] = {"Irish Sign Language"},
["ish"] = {"Esan"},
["isi"] = {"Nkem-Nkum"},
["isk"] = {"Ishkashimi"},
["ism"] = {"Masimasi"},
["isn"] = {"Isanzu"},
["iso"] = {"Isoko"},
["isr"] = {"Israeli Sign Language"},
["ist"] = {"Istriot"},
["isu"] = {"Isu", "Isu (Menchum Division)"},
["isv"] = {"Interslavic"},
["itb"] = {"Binongan Itneg"},
["itc"] = {"Italic languages"},
["itd"] = {"Southern Tidung"},
["ite"] = {"Itene"},
["iti"] = {"Inlaod Itneg"},
["itk"] = {"Judeo-Italian"},
["itl"] = {"Itelmen"},
["itm"] = {"Itu Mbon Uzo"},
["ito"] = {"Itonama"},
["itr"] = {"Iteri"},
["its"] = {"Isekiri"},
["itt"] = {"Maeng Itneg"},
["itv"] = {"Itawit"},
["itw"] = {"Ito"},
["itx"] = {"Itik"},
["ity"] = {"Moyadan Itneg"},
["itz"] = {"Itzá"},
["ium"] = {"Iu Mien"},
["ivb"] = {"Ibatan"},
["ivv"] = {"Ivatan"},
["iwk"] = {"I-Wak"},
["iwm"] = {"Iwam"},
["iwo"] = {"Iwur"},
["iws"] = {"Sepik Iwam"},
["ixc"] = {"Ixcatec"},
["ixl"] = {"Ixil"},
["iya"] = {"Iyayu"},
["iyo"] = {"Mesaka"},
["iyx"] = {"Yaka (Congo)"},
["izh"] = {"Ingrian"},
["izm"] = {"Kizamani"},
["izr"] = {"Izere"},
["izz"] = {"Izii"},
["jaa"] = {"Jamamadí"},
["jab"] = {"Hyam"},
["jac"] = {"Popti'", "Jakalteko"},
["jad"] = {"Jahanka"},
["jae"] = {"Yabem"},
["jaf"] = {"Jara"},
["jah"] = {"Jah Hut"},
["jaj"] = {"Zazao"},
["jak"] = {"Jakun"},
["jal"] = {"Yalahatan"},
["jam"] = {"Jamaican Creole English"},
["jan"] = {"Jandai"},
["jao"] = {"Yanyuwa"},
["jaq"] = {"Yaqay"},
["jas"] = {"New Caledonian Javanese"},
["jat"] = {"Jakati"},
["jau"] = {"Yaur"},
["jax"] = {"Jambi Malay"},
["jay"] = {"Yan-nhangu", "Nhangu"},
["jaz"] = {"Jawe"},
["jbe"] = {"Judeo-Berber"},
["jbi"] = {"Badjiri"},
["jbj"] = {"Arandai"},
["jbk"] = {"Barikewa"},
["jbm"] = {"Bijim"},
["jbn"] = {"Nafusi"},
["jbo"] = {"Lojban"},
["jbr"] = {"Jofotek-Bromnya"},
["jbt"] = {"Jabutí"},
["jbu"] = {"Jukun Takum"},
["jbw"] = {"Yawijibaya"},
["jcs"] = {"Jamaican Country Sign Language"},
["jct"] = {"Krymchak"},
["jda"] = {"Jad"},
["jdg"] = {"Jadgali"},
["jdt"] = {"Judeo-Tat"},
["jeb"] = {"Jebero"},
["jee"] = {"Jerung"},
["jeh"] = {"Jeh"},
["jei"] = {"Yei"},
["jek"] = {"Jeri Kuo"},
["jel"] = {"Yelmek"},
["jen"] = {"Dza"},
["jer"] = {"Jere"},
["jet"] = {"Manem"},
["jeu"] = {"Jonkor Bourmataguil"},
["jgb"] = {"Ngbee"},
["jge"] = {"Judeo-Georgian"},
["jgk"] = {"Gwak"},
["jgo"] = {"Ngomba"},
["jhi"] = {"Jehai"},
["jhs"] = {"Jhankot Sign Language"},
["jia"] = {"Jina"},
["jib"] = {"Jibu"},
["jic"] = {"Tol"},
["jid"] = {"Bu (Kaduna State)"},
["jie"] = {"Jilbe"},
["jig"] = {"Jingulu", "Djingili"},
["jih"] = {"sTodsde", "Shangzhai"},
["jii"] = {"Jiiddu"},
["jil"] = {"Jilim"},
["jim"] = {"Jimi (Cameroon)"},
["jio"] = {"Jiamao"},
["jiq"] = {"Guanyinqiao", "Lavrung"},
["jit"] = {"Jita"},
["jiu"] = {"Youle Jinuo"},
["jiv"] = {"Shuar"},
["jiy"] = {"Buyuan Jinuo"},
["jje"] = {"Jejueo"},
["jjr"] = {"Bankal"},
["jka"] = {"Kaera"},
["jkm"] = {"Mobwa Karen"},
["jko"] = {"Kubo"},
["jkp"] = {"Paku Karen"},
["jkr"] = {"Koro (India)"},
["jks"] = {"Amami Koniya Sign Language"},
["jku"] = {"Labir"},
["jle"] = {"Ngile"},
["jls"] = {"Jamaican Sign Language"},
["jma"] = {"Dima"},
["jmb"] = {"Zumbun"},
["jmc"] = {"Machame"},
["jmd"] = {"Yamdena"},
["jmi"] = {"Jimi (Nigeria)"},
["jml"] = {"Jumli"},
["jmn"] = {"Makuri Naga"},
["jmr"] = {"Kamara"},
["jms"] = {"Mashi (Nigeria)"},
["jmw"] = {"Mouwase"},
["jmx"] = {"Western Juxtlahuaca Mixtec"},
["jna"] = {"Jangshung"},
["jnd"] = {"Jandavra"},
["jng"] = {"Yangman"},
["jni"] = {"Janji"},
["jnj"] = {"Yemsa"},
["jnl"] = {"Rawat"},
["jns"] = {"Jaunsari"},
["job"] = {"Joba"},
["jod"] = {"Wojenaka"},
["jog"] = {"Jogi"},
["jor"] = {"Jorá"},
["jos"] = {"Jordanian Sign Language"},
["jow"] = {"Jowulu"},
["jpa"] = {"Jewish Palestinian Aramaic"},
["jpr"] = {"Judeo-Persian"},
["jpx"] = {"Japanese (family)"},
["jqr"] = {"Jaqaru"},
["jra"] = {"Jarai"},
["jrb"] = {"Judeo-Arabic"},
["jrr"] = {"Jiru"},
["jrt"] = {"Jakattoe"},
["jru"] = {"Japrería"},
["jsl"] = {"Japanese Sign Language"},
["jua"] = {"Júma"},
["jub"] = {"Wannu"},
["juc"] = {"Jurchen"},
["jud"] = {"Worodougou"},
["juh"] = {"Hõne"},
["jui"] = {"Ngadjuri"},
["juk"] = {"Wapan"},
["jul"] = {"Jirel"},
["jum"] = {"Jumjum"},
["jun"] = {"Juang"},
["juo"] = {"Jiba"},
["jup"] = {"Hupdë"},
["jur"] = {"Jurúna"},
["jus"] = {"Jumla Sign Language"},
["jut"] = {"Jutish"},
["juu"] = {"Ju"},
["juw"] = {"Wãpha"},
["juy"] = {"Juray"},
["jvd"] = {"Javindo"},
["jvn"] = {"Caribbean Javanese"},
["jwi"] = {"Jwira-Pepesa"},
["jya"] = {"Jiarong"},
["jye"] = {"Judeo-Yemeni Arabic"},
["jyy"] = {"Jaya"},
["kaa"] = {"Kara-Kalpak", "Karakalpak"},
["kab"] = {"Kabyle"},
["kac"] = {"Kachin", "Jingpho"},
["kad"] = {"Adara"},
["kae"] = {"Ketangalan"},
["kaf"] = {"Katso"},
["kag"] = {"Kajaman"},
["kah"] = {"Kara (Central African Republic)"},
["kai"] = {"Karekare"},
["kaj"] = {"Jju"},
["kak"] = {"Kalanguya", "Kayapa Kallahan"},
["kam"] = {"Kamba (Kenya)"},
["kao"] = {"Xaasongaxango"},
["kap"] = {"Bezhta"},
["kaq"] = {"Capanahua"},
["kar"] = {"Karen languages"},
["kav"] = {"Katukína"},
["kaw"] = {"Kawi"},
["kax"] = {"Kao"},
["kay"] = {"Kamayurá"},
["kba"] = {"Kalarko"},
["kbb"] = {"Kaxuiâna"},
["kbc"] = {"Kadiwéu"},
["kbd"] = {"Kabardian"},
["kbe"] = {"Kanju"},
["kbg"] = {"Khamba"},
["kbh"] = {"Camsá"},
["kbi"] = {"Kaptiau"},
["kbj"] = {"Kari"},
["kbk"] = {"Grass Koiari"},
["kbl"] = {"Kanembu"},
["kbm"] = {"Iwal"},
["kbn"] = {"Kare (Central African Republic)"},
["kbo"] = {"Keliko"},
["kbp"] = {"Kabiyè"},
["kbq"] = {"Kamano"},
["kbr"] = {"Kafa"},
["kbs"] = {"Kande"},
["kbt"] = {"Abadi"},
["kbu"] = {"Kabutra"},
["kbv"] = {"Dera (Indonesia)"},
["kbw"] = {"Kaiep"},
["kbx"] = {"Ap Ma"},
["kby"] = {"Manga Kanuri"},
["kbz"] = {"Duhwa"},
["kca"] = {"Khanty"},
["kcb"] = {"Kawacha"},
["kcc"] = {"Lubila"},
["kcd"] = {"Ngkâlmpw Kanum"},
["kce"] = {"Kaivi"},
["kcf"] = {"Ukaan"},
["kcg"] = {"Tyap"},
["kch"] = {"Vono"},
["kci"] = {"Ngyian", "Kamantan"},
["kcj"] = {"Kobiana"},
["kck"] = {"Kalanga"},
["kcl"] = {"Kela (Papua New Guinea)", "Kala"},
["kcm"] = {"Gula (Central African Republic)"},
["kcn"] = {"Nubi"},
["kco"] = {"Kinalakna"},
["kcp"] = {"Kanga"},
["kcq"] = {"Kamo"},
["kcr"] = {"Katla"},
["kcs"] = {"Koenoem"},
["kct"] = {"Kaian"},
["kcu"] = {"Kami (Tanzania)"},
["kcv"] = {"Kete"},
["kcw"] = {"Kabwari"},
["kcx"] = {"Kachama-Ganjule"},
["kcy"] = {"Korandje"},
["kcz"] = {"Konongo"},
["kda"] = {"Worimi"},
["kdc"] = {"Kutu"},
["kdd"] = {"Yankunytjatjara"},
["kde"] = {"Makonde"},
["kdf"] = {"Mamusi"},
["kdg"] = {"Seba"},
["kdh"] = {"Tem"},
["kdi"] = {"Kumam"},
["kdj"] = {"Karamojong"},
["kdk"] = {"Numèè", "Kwényi"},
["kdl"] = {"Tsikimba"},
["kdm"] = {"Kagoma"},
["kdn"] = {"Kunda"},
["kdo"] = {"Kordofanian languages"},
["kdp"] = {"Kaningdon-Nindem"},
["kdq"] = {"Koch"},
["kdr"] = {"Karaim"},
["kdt"] = {"Kuy"},
["kdu"] = {"Kadaru"},
["kdw"] = {"Koneraw"},
["kdx"] = {"Kam"},
["kdy"] = {"Keder", "Keijar"},
["kdz"] = {"Kwaja"},
["kea"] = {"Kabuverdianu"},
["keb"] = {"Kélé"},
["kec"] = {"Keiga"},
["ked"] = {"Kerewe"},
["kee"] = {"Eastern Keres"},
["kef"] = {"Kpessi"},
["keg"] = {"Tese"},
["keh"] = {"Keak"},
["kei"] = {"Kei"},
["kej"] = {"Kadar"},
["kek"] = {"Kekchí"},
["kel"] = {"Kela (Democratic Republic of Congo)"},
["kem"] = {"Kemak"},
["ken"] = {"Kenyang"},
["keo"] = {"Kakwa"},
["kep"] = {"Kaikadi"},
["keq"] = {"Kamar"},
["ker"] = {"Kera"},
["kes"] = {"Kugbo"},
["ket"] = {"Ket"},
["keu"] = {"Akebu"},
["kev"] = {"Kanikkaran"},
["kew"] = {"West Kewa"},
["kex"] = {"Kukna"},
["key"] = {"Kupia"},
["kez"] = {"Kukele"},
["kfa"] = {"Kodava"},
["kfb"] = {"Northwestern Kolami"},
["kfc"] = {"Konda-Dora"},
["kfd"] = {"Korra Koraga"},
["kfe"] = {"Kota (India)"},
["kff"] = {"Koya"},
["kfg"] = {"Kudiya"},
["kfh"] = {"Kurichiya"},
["kfi"] = {"Kannada Kurumba"},
["kfj"] = {"Kemiehua"},
["kfk"] = {"Kinnauri"},
["kfl"] = {"Kung"},
["kfm"] = {"Khunsari"},
["kfn"] = {"Kuk"},
["kfo"] = {"Koro (Côte d'Ivoire)"},
["kfp"] = {"Korwa"},
["kfq"] = {"Korku"},
["kfr"] = {"Kachhi", "Kutchi"},
["kfs"] = {"Bilaspuri"},
["kft"] = {"Kanjari"},
["kfu"] = {"Katkari"},
["kfv"] = {"Kurmukar"},
["kfw"] = {"Kharam Naga"},
["kfx"] = {"Kullu Pahari"},
["kfy"] = {"Kumaoni"},
["kfz"] = {"Koromfé"},
["kga"] = {"Koyaga"},
["kgb"] = {"Kawe"},
["kge"] = {"Komering"},
["kgf"] = {"Kube"},
["kgg"] = {"Kusunda"},
["kgi"] = {"Selangor Sign Language"},
["kgj"] = {"Gamale Kham"},
["kgk"] = {"Kaiwá"},
["kgl"] = {"Kunggari"},
["kgn"] = {"Karingani"},
["kgo"] = {"Krongo"},
["kgp"] = {"Kaingang"},
["kgq"] = {"Kamoro"},
["kgr"] = {"Abun"},
["kgs"] = {"Kumbainggar"},
["kgt"] = {"Somyev"},
["kgu"] = {"Kobol"},
["kgv"] = {"Karas"},
["kgw"] = {"Karon Dori"},
["kgx"] = {"Kamaru"},
["kgy"] = {"Kyerung"},
["kha"] = {"Khasi"},
["khb"] = {"Lü"},
["khc"] = {"Tukang Besi North"},
["khd"] = {"Bädi Kanum"},
["khe"] = {"Korowai"},
["khf"] = {"Khuen"},
["khg"] = {"Khams Tibetan"},
["khh"] = {"Kehu"},
["khi"] = {"Khoisan languages"},
["khj"] = {"Kuturmi"},
["khk"] = {"Halh Mongolian"},
["khl"] = {"Lusi"},
["khn"] = {"Khandesi"},
["kho"] = {"Khotanese", "Sakan"},
["khp"] = {"Kapori", "Kapauri"},
["khq"] = {"Koyra Chiini Songhay"},
["khr"] = {"Kharia"},
["khs"] = {"Kasua"},
["kht"] = {"Khamti"},
["khu"] = {"Nkhumbi"},
["khv"] = {"Khvarshi"},
["khw"] = {"Khowar"},
["khx"] = {"Kanu"},
["khy"] = {"Kele (Democratic Republic of Congo)"},
["khz"] = {"Keapara"},
["kia"] = {"Kim"},
["kib"] = {"Koalib"},
["kic"] = {"Kickapoo"},
["kid"] = {"Koshin"},
["kie"] = {"Kibet"},
["kif"] = {"Eastern Parbate Kham"},
["kig"] = {"Kimaama", "Kimaghima"},
["kih"] = {"Kilmeri"},
["kii"] = {"Kitsai"},
["kij"] = {"Kilivila"},
["kil"] = {"Kariya"},
["kim"] = {"Karagas"},
["kio"] = {"Kiowa"},
["kip"] = {"Sheshi Kham"},
["kiq"] = {"Kosadle", "Kosare"},
["kis"] = {"Kis"},
["kit"] = {"Agob"},
["kiu"] = {"Kirmanjki (individual language)"},
["kiv"] = {"Kimbu"},
["kiw"] = {"Northeast Kiwai"},
["kix"] = {"Khiamniungan Naga"},
["kiy"] = {"Kirikiri"},
["kiz"] = {"Kisi"},
["kja"] = {"Mlap"},
["kjb"] = {"Q'anjob'al", "Kanjobal"},
["kjc"] = {"Coastal Konjo"},
["kjd"] = {"Southern Kiwai"},
["kje"] = {"Kisar"},
["kjg"] = {"Khmu"},
["kjh"] = {"Khakas"},
["kji"] = {"Zabana"},
["kjj"] = {"Khinalugh"},
["kjk"] = {"Highland Konjo"},
["kjl"] = {"Western Parbate Kham"},
["kjm"] = {"Kháng"},
["kjn"] = {"Kunjen"},
["kjo"] = {"Kinnauri Pahari"},
["kjp"] = {"Pwo Eastern Karen"},
["kjq"] = {"Western Keres"},
["kjr"] = {"Kurudu"},
["kjs"] = {"East Kewa"},
["kjt"] = {"Phrae Pwo Karen"},
["kju"] = {"Kashaya"},
["kjv"] = {"Kaikavian Literary Language"},
["kjx"] = {"Ramopa"},
["kjy"] = {"Erave"},
["kjz"] = {"Bumthangkha"},
["kka"] = {"Kakanda"},
["kkb"] = {"Kwerisa"},
["kkc"] = {"Odoodee"},
["kkd"] = {"Kinuku"},
["kke"] = {"Kakabe"},
["kkf"] = {"Kalaktang Monpa"},
["kkg"] = {"Mabaka Valley Kalinga"},
["kkh"] = {"Khün"},
["kki"] = {"Kagulu"},
["kkj"] = {"Kako"},
["kkk"] = {"Kokota"},
["kkl"] = {"Kosarek Yale"},
["kkm"] = {"Kiong"},
["kkn"] = {"Kon Keu"},
["kko"] = {"Karko"},
["kkp"] = {"Gugubera", "Koko-Bera"},
["kkq"] = {"Kaeku"},
["kkr"] = {"Kir-Balar"},
["kks"] = {"Giiwo"},
["kkt"] = {"Koi"},
["kku"] = {"Tumi"},
["kkv"] = {"Kangean"},
["kkw"] = {"Teke-Kukuya"},
["kkx"] = {"Kohin"},
["kky"] = {"Guugu Yimidhirr", "Guguyimidjir"},
["kkz"] = {"Kaska"},
["kla"] = {"Klamath-Modoc"},
["klb"] = {"Kiliwa"},
["klc"] = {"Kolbila"},
["kld"] = {"Gamilaraay"},
["kle"] = {"Kulung (Nepal)"},
["klf"] = {"Kendeje"},
["klg"] = {"Tagakaulo"},
["klh"] = {"Weliki"},
["kli"] = {"Kalumpang"},
["klj"] = {"Khalaj"},
["klk"] = {"Kono (Nigeria)"},
["kll"] = {"Kagan Kalagan"},
["klm"] = {"Migum"},
["kln"] = {"Kalenjin"},
["klo"] = {"Kapya"},
["klp"] = {"Kamasa"},
["klq"] = {"Rumu"},
["klr"] = {"Khaling"},
["kls"] = {"Kalasha"},
["klt"] = {"Nukna"},
["klu"] = {"Klao"},
["klv"] = {"Maskelynes"},
["klw"] = {"Tado", "Lindu"},
["klx"] = {"Koluwawa"},
["kly"] = {"Kalao"},
["klz"] = {"Kabola"},
["kma"] = {"Konni"},
["kmb"] = {"Kimbundu"},
["kmc"] = {"Southern Dong"},
["kmd"] = {"Majukayang Kalinga"},
["kme"] = {"Bakole"},
["kmf"] = {"Kare (Papua New Guinea)"},
["kmg"] = {"Kâte"},
["kmh"] = {"Kalam"},
["kmi"] = {"Kami (Nigeria)"},
["kmj"] = {"Kumarbhag Paharia"},
["kmk"] = {"Limos Kalinga"},
["kml"] = {"Tanudan Kalinga"},
["kmm"] = {"Kom (India)"},
["kmn"] = {"Awtuw"},
["kmo"] = {"Kwoma"},
["kmp"] = {"Gimme"},
["kmq"] = {"Kwama"},
["kmr"] = {"Northern Kurdish"},
["kms"] = {"Kamasau"},
["kmt"] = {"Kemtuik"},
["kmu"] = {"Kanite"},
["kmv"] = {"Karipúna Creole French"},
["kmw"] = {"Komo (Democratic Republic of Congo)"},
["kmx"] = {"Waboda"},
["kmy"] = {"Koma"},
["kmz"] = {"Khorasani Turkish"},
["kna"] = {"Dera (Nigeria)"},
["knb"] = {"Lubuagan Kalinga"},
["knc"] = {"Central Kanuri"},
["knd"] = {"Konda"},
["kne"] = {"Kankanaey"},
["knf"] = {"Mankanya"},
["kng"] = {"Koongo"},
["kni"] = {"Kanufi"},
["knj"] = {"Western Kanjobal"},
["knk"] = {"Kuranko"},
["knl"] = {"Keninjal"},
["knm"] = {"Kanamarí"},
["knn"] = {"Konkani (individual language)"},
["kno"] = {"Kono (Sierra Leone)"},
["knp"] = {"Kwanja"},
["knq"] = {"Kintaq"},
["knr"] = {"Kaningra"},
["kns"] = {"Kensiu"},
["knt"] = {"Panoan Katukína"},
["knu"] = {"Kono (Guinea)"},
["knv"] = {"Tabo"},
["knw"] = {"Kung-Ekoka"},
["knx"] = {"Kendayan", "Salako"},
["kny"] = {"Kanyok"},
["knz"] = {"Kalamsé"},
["koa"] = {"Konomala"},
["koc"] = {"Kpati"},
["kod"] = {"Kodi"},
["koe"] = {"Kacipo-Bale Suri"},
["kof"] = {"Kubi"},
["kog"] = {"Cogui", "Kogi"},
["koh"] = {"Koyo"},
["koi"] = {"Komi-Permyak"},
["kok"] = {"Konkani (macrolanguage)"},
["kol"] = {"Kol (Papua New Guinea)"},
["koo"] = {"Konzo"},
["kop"] = {"Waube"},
["koq"] = {"Kota (Gabon)"},
["kos"] = {"Kosraean"},
["kot"] = {"Lagwan"},
["kou"] = {"Koke"},
["kov"] = {"Kudu-Camo"},
["kow"] = {"Kugama"},
["koy"] = {"Koyukon"},
["koz"] = {"Korak"},
["kpa"] = {"Kutto"},
["kpb"] = {"Mullu Kurumba"},
["kpc"] = {"Curripaco"},
["kpd"] = {"Koba"},
["kpe"] = {"Kpelle"},
["kpf"] = {"Komba"},
["kpg"] = {"Kapingamarangi"},
["kph"] = {"Kplang"},
["kpi"] = {"Kofei"},
["kpj"] = {"Karajá"},
["kpk"] = {"Kpan"},
["kpl"] = {"Kpala"},
["kpm"] = {"Koho"},
["kpn"] = {"Kepkiriwát"},
["kpo"] = {"Ikposo"},
["kpq"] = {"Korupun-Sela"},
["kpr"] = {"Korafe-Yegha"},
["kps"] = {"Tehit"},
["kpt"] = {"Karata"},
["kpu"] = {"Kafoa"},
["kpv"] = {"Komi-Zyrian"},
["kpw"] = {"Kobon"},
["kpx"] = {"Mountain Koiali"},
["kpy"] = {"Koryak"},
["kpz"] = {"Kupsabiny"},
["kqa"] = {"Mum"},
["kqb"] = {"Kovai"},
["kqc"] = {"Doromu-Koki"},
["kqd"] = {"Koy Sanjaq Surat"},
["kqe"] = {"Kalagan"},
["kqf"] = {"Kakabai"},
["kqg"] = {"Khe"},
["kqh"] = {"Kisankasa"},
["kqi"] = {"Koitabu"},
["kqj"] = {"Koromira"},
["kqk"] = {"Kotafon Gbe"},
["kql"] = {"Kyenele"},
["kqm"] = {"Khisa"},
["kqn"] = {"Kaonde"},
["kqo"] = {"Eastern Krahn"},
["kqp"] = {"Kimré"},
["kqq"] = {"Krenak"},
["kqr"] = {"Kimaragang"},
["kqs"] = {"Northern Kissi"},
["kqt"] = {"Klias River Kadazan"},
["kqu"] = {"Seroa"},
["kqv"] = {"Okolod"},
["kqw"] = {"Kandas"},
["kqx"] = {"Mser"},
["kqy"] = {"Koorete"},
["kqz"] = {"Korana"},
["kra"] = {"Kumhali"},
["krb"] = {"Karkin"},
["krc"] = {"Karachay-Balkar"},
["krd"] = {"Kairui-Midiki"},
["kre"] = {"Panará"},
["krf"] = {"Koro (Vanuatu)"},
["krh"] = {"Kurama"},
["kri"] = {"Krio"},
["krj"] = {"Kinaray-A"},
["krk"] = {"Kerek"},
["krl"] = {"Karelian"},
["krn"] = {"Sapo"},
["kro"] = {"Kru languages"},
["krp"] = {"Durop"},
["krr"] = {"Krung"},
["krs"] = {"Gbaya (Sudan)"},
["krt"] = {"Tumari Kanuri"},
["kru"] = {"Kurukh"},
["krv"] = {"Kavet"},
["krw"] = {"Western Krahn"},
["krx"] = {"Karon"},
["kry"] = {"Kryts"},
["krz"] = {"Sota Kanum"},
["ksb"] = {"Shambala"},
["ksc"] = {"Southern Kalinga"},
["ksd"] = {"Kuanua"},
["kse"] = {"Kuni"},
["ksf"] = {"Bafia"},
["ksg"] = {"Kusaghe"},
["ksh"] = {"Kölsch"},
["ksi"] = {"Krisa", "I'saka"},
["ksj"] = {"Uare"},
["ksk"] = {"Kansa"},
["ksl"] = {"Kumalu"},
["ksm"] = {"Kumba"},
["ksn"] = {"Kasiguranin"},
["kso"] = {"Kofa"},
["ksp"] = {"Kaba"},
["ksq"] = {"Kwaami"},
["ksr"] = {"Borong"},
["kss"] = {"Southern Kisi"},
["kst"] = {"Winyé"},
["ksu"] = {"Khamyang"},
["ksv"] = {"Kusu"},
["ksw"] = {"S'gaw Karen"},
["ksx"] = {"Kedang"},
["ksy"] = {"Kharia Thar"},
["ksz"] = {"Kodaku"},
["kta"] = {"Katua"},
["ktb"] = {"Kambaata"},
["ktc"] = {"Kholok"},
["ktd"] = {"Kokata", "Kukatha"},
["kte"] = {"Nubri"},
["ktf"] = {"Kwami"},
["ktg"] = {"Kalkutung"},
["kth"] = {"Karanga"},
["kti"] = {"North Muyu"},
["ktj"] = {"Plapo Krumen"},
["ktk"] = {"Kaniet"},
["ktl"] = {"Koroshi"},
["ktm"] = {"Kurti"},
["ktn"] = {"Karitiâna"},
["kto"] = {"Kuot"},
["ktp"] = {"Kaduo"},
["ktq"] = {"Katabaga"},
["kts"] = {"South Muyu"},
["ktt"] = {"Ketum"},
["ktu"] = {"Kituba (Democratic Republic of Congo)"},
["ktv"] = {"Eastern Katu"},
["ktw"] = {"Kato"},
["ktx"] = {"Kaxararí"},
["kty"] = {"Kango (Bas-Uélé District)"},
["ktz"] = {"Juǀʼhoan", "Juǀʼhoansi"},
["kub"] = {"Kutep"},
["kuc"] = {"Kwinsu"},
["kud"] = {"'Auhelawa"},
["kue"] = {"Kuman (Papua New Guinea)"},
["kuf"] = {"Western Katu"},
["kug"] = {"Kupa"},
["kuh"] = {"Kushi"},
["kui"] = {"Kuikúro-Kalapálo", "Kalapalo"},
["kuj"] = {"Kuria"},
["kuk"] = {"Kepo'"},
["kul"] = {"Kulere"},
["kum"] = {"Kumyk"},
["kun"] = {"Kunama"},
["kuo"] = {"Kumukio"},
["kup"] = {"Kunimaipa"},
["kuq"] = {"Karipuna"},
["kus"] = {"Kusaal"},
["kut"] = {"Ktunaxa", "Ksanka", "Kutenai"},
["kuu"] = {"Upper Kuskokwim"},
["kuv"] = {"Kur"},
["kuw"] = {"Kpagua"},
["kux"] = {"Kukatja"},
["kuy"] = {"Kuuku-Ya'u"},
["kuz"] = {"Kunza"},
["kva"] = {"Bagvalal"},
["kvb"] = {"Kubu"},
["kvc"] = {"Kove"},
["kvd"] = {"Kui (Indonesia)"},
["kve"] = {"Kalabakan"},
["kvf"] = {"Kabalai"},
["kvg"] = {"Kuni-Boazi"},
["kvh"] = {"Komodo"},
["kvi"] = {"Kwang"},
["kvj"] = {"Psikye"},
["kvk"] = {"Korean Sign Language"},
["kvl"] = {"Kayaw"},
["kvm"] = {"Kendem"},
["kvn"] = {"Border Kuna"},
["kvo"] = {"Dobel"},
["kvp"] = {"Kompane"},
["kvq"] = {"Geba Karen"},
["kvr"] = {"Kerinci"},
["kvt"] = {"Lahta Karen", "Lahta"},
["kvu"] = {"Yinbaw Karen"},
["kvv"] = {"Kola"},
["kvw"] = {"Wersing"},
["kvx"] = {"Parkari Koli"},
["kvy"] = {"Yintale Karen", "Yintale"},
["kvz"] = {"Tsakwambo", "Tsaukambo"},
["kwa"] = {"Dâw"},
["kwb"] = {"Kwa"},
["kwc"] = {"Likwala"},
["kwd"] = {"Kwaio"},
["kwe"] = {"Kwerba"},
["kwf"] = {"Kwara'ae"},
["kwg"] = {"Sara Kaba Deme"},
["kwh"] = {"Kowiai"},
["kwi"] = {"Awa-Cuaiquer"},
["kwj"] = {"Kwanga"},
["kwk"] = {"Kwak'wala", "Kwakiutl"},
["kwl"] = {"Kofyar"},
["kwm"] = {"Kwambi"},
["kwn"] = {"Kwangali"},
["kwo"] = {"Kwomtari"},
["kwp"] = {"Kodia"},
["kwr"] = {"Kwer"},
["kws"] = {"Kwese"},
["kwt"] = {"Kwesten"},
["kwu"] = {"Kwakum"},
["kwv"] = {"Sara Kaba Náà"},
["kww"] = {"Kwinti"},
["kwx"] = {"Khirwar"},
["kwy"] = {"San Salvador Kongo"},
["kwz"] = {"Kwadi"},
["kxa"] = {"Kairiru"},
["kxb"] = {"Krobu"},
["kxc"] = {"Konso", "Khonso"},
["kxd"] = {"Brunei"},
["kxf"] = {"Manumanaw Karen", "Manumanaw"},
["kxh"] = {"Karo (Ethiopia)"},
["kxi"] = {"Keningau Murut"},
["kxj"] = {"Kulfa"},
["kxk"] = {"Zayein Karen"},
["kxm"] = {"Northern Khmer"},
["kxn"] = {"Kanowit-Tanjong Melanau"},
["kxo"] = {"Kanoé"},
["kxp"] = {"Wadiyara Koli"},
["kxq"] = {"Smärky Kanum"},
["kxr"] = {"Koro (Papua New Guinea)"},
["kxs"] = {"Kangjia"},
["kxt"] = {"Koiwat"},
["kxv"] = {"Kuvi"},
["kxw"] = {"Konai"},
["kxx"] = {"Likuba"},
["kxy"] = {"Kayong"},
["kxz"] = {"Kerewo"},
["kya"] = {"Kwaya"},
["kyb"] = {"Butbut Kalinga"},
["kyc"] = {"Kyaka"},
["kyd"] = {"Karey"},
["kye"] = {"Krache"},
["kyf"] = {"Kouya"},
["kyg"] = {"Keyagana"},
["kyh"] = {"Karok"},
["kyi"] = {"Kiput"},
["kyj"] = {"Karao"},
["kyk"] = {"Kamayo"},
["kyl"] = {"Kalapuya"},
["kym"] = {"Kpatili"},
["kyn"] = {"Northern Binukidnon"},
["kyo"] = {"Kelon"},
["kyp"] = {"Kang"},
["kyq"] = {"Kenga"},
["kyr"] = {"Kuruáya"},
["kys"] = {"Baram Kayan"},
["kyt"] = {"Kayagar"},
["kyu"] = {"Western Kayah"},
["kyv"] = {"Kayort"},
["kyw"] = {"Kudmali"},
["kyx"] = {"Rapoisi"},
["kyy"] = {"Kambaira"},
["kyz"] = {"Kayabí"},
["kza"] = {"Western Karaboro"},
["kzb"] = {"Kaibobo"},
["kzc"] = {"Bondoukou Kulango"},
["kzd"] = {"Kadai"},
["kze"] = {"Kosena"},
["kzf"] = {"Da'a Kaili"},
["kzg"] = {"Kikai"},
["kzi"] = {"Kelabit"},
["kzk"] = {"Kazukuru"},
["kzl"] = {"Kayeli"},
["kzm"] = {"Kais"},
["kzn"] = {"Kokola"},
["kzo"] = {"Kaningi"},
["kzp"] = {"Kaidipang"},
["kzq"] = {"Kaike"},
["kzr"] = {"Karang"},
["kzs"] = {"Sugut Dusun"},
["kzu"] = {"Kayupulau"},
["kzv"] = {"Komyandaret"},
["kzw"] = {"Karirí-Xocó"},
["kzx"] = {"Kamarian"},
["kzy"] = {"Kango (Tshopo District)"},
["kzz"] = {"Kalabra"},
["laa"] = {"Southern Subanen"},
["lab"] = {"Linear A"},
["lac"] = {"Lacandon"},
["lad"] = {"Ladino"},
["lae"] = {"Pattani"},
["laf"] = {"Lafofa"},
["lag"] = {"Rangi"},
["lah"] = {"Lahnda"},
["lai"] = {"Lambya"},
["laj"] = {"Lango (Uganda)"},
["lal"] = {"Lalia"},
["lam"] = {"Lamba"},
["lan"] = {"Laru"},
["lap"] = {"Laka (Chad)"},
["laq"] = {"Qabiao"},
["lar"] = {"Larteh"},
["las"] = {"Lama (Togo)"},
["lau"] = {"Laba"},
["law"] = {"Lauje"},
["lax"] = {"Tiwa"},
["lay"] = {"Lama Bai"},
["laz"] = {"Aribwatsa"},
["lbb"] = {"Label"},
["lbc"] = {"Lakkia"},
["lbe"] = {"Lak"},
["lbf"] = {"Tinani"},
["lbg"] = {"Laopang"},
["lbi"] = {"La'bi"},
["lbj"] = {"Ladakhi"},
["lbk"] = {"Central Bontok"},
["lbl"] = {"Libon Bikol"},
["lbm"] = {"Lodhi"},
["lbn"] = {"Rmeet"},
["lbo"] = {"Laven"},
["lbq"] = {"Wampar"},
["lbr"] = {"Lohorung"},
["lbs"] = {"Libyan Sign Language"},
["lbt"] = {"Lachi"},
["lbu"] = {"Labu"},
["lbv"] = {"Lavatbura-Lamusong"},
["lbw"] = {"Tolaki"},
["lbx"] = {"Lawangan"},
["lby"] = {"Lamalama", "Lamu-Lamu"},
["lbz"] = {"Lardil"},
["lcc"] = {"Legenyem"},
["lcd"] = {"Lola"},
["lce"] = {"Loncong", "Sekak"},
["lcf"] = {"Lubu"},
["lch"] = {"Luchazi"},
["lcl"] = {"Lisela"},
["lcm"] = {"Tungag"},
["lcp"] = {"Western Lawa"},
["lcq"] = {"Luhu"},
["lcs"] = {"Lisabata-Nuniali"},
["lda"] = {"Kla-Dan"},
["ldb"] = {"Dũya"},
["ldd"] = {"Luri"},
["ldg"] = {"Lenyima"},
["ldh"] = {"Lamja-Dengsa-Tola"},
["ldi"] = {"Laari"},
["ldj"] = {"Lemoro"},
["ldk"] = {"Leelau"},
["ldl"] = {"Kaan"},
["ldm"] = {"Landoma"},
["ldn"] = {"Láadan"},
["ldo"] = {"Loo"},
["ldp"] = {"Tso"},
["ldq"] = {"Lufu"},
["lea"] = {"Lega-Shabunda"},
["leb"] = {"Lala-Bisa"},
["lec"] = {"Leco"},
["led"] = {"Lendu"},
["lee"] = {"Lyélé"},
["lef"] = {"Lelemi"},
["leh"] = {"Lenje"},
["lei"] = {"Lemio"},
["lej"] = {"Lengola"},
["lek"] = {"Leipon"},
["lel"] = {"Lele (Democratic Republic of Congo)"},
["lem"] = {"Nomaande"},
["len"] = {"Lenca"},
["leo"] = {"Leti (Cameroon)"},
["lep"] = {"Lepcha"},
["leq"] = {"Lembena"},
["ler"] = {"Lenkau"},
["les"] = {"Lese"},
["let"] = {"Lesing-Gelimi", "Amio-Gelimi"},
["leu"] = {"Kara (Papua New Guinea)"},
["lev"] = {"Lamma"},
["lew"] = {"Ledo Kaili"},
["lex"] = {"Luang"},
["ley"] = {"Lemolang"},
["lez"] = {"Lezghian"},
["lfa"] = {"Lefa"},
["lfb"] = {"Buu (Cameroon)"},
["lfn"] = {"Lingua Franca Nova"},
["lga"] = {"Lungga"},
["lgb"] = {"Laghu"},
["lgg"] = {"Lugbara"},
["lgh"] = {"Laghuu"},
["lgi"] = {"Lengilu"},
["lgk"] = {"Lingarak", "Neverver"},
["lgl"] = {"Wala"},
["lgm"] = {"Lega-Mwenga"},
["lgn"] = {"T'apo", "Opuuo"},
["lgo"] = {"Lango (South Sudan)"},
["lgq"] = {"Logba"},
["lgr"] = {"Lengo"},
["lgs"] = {"Guinea-Bissau Sign Language", "Língua Gestual Guineense"},
["lgt"] = {"Pahi"},
["lgu"] = {"Longgu"},
["lgz"] = {"Ligenza"},
["lha"] = {"Laha (Viet Nam)"},
["lhh"] = {"Laha (Indonesia)"},
["lhi"] = {"Lahu Shi"},
["lhl"] = {"Lahul Lohar"},
["lhm"] = {"Lhomi"},
["lhn"] = {"Lahanan"},
["lhp"] = {"Lhokpu"},
["lhs"] = {"Mlahsö"},
["lht"] = {"Lo-Toga"},
["lhu"] = {"Lahu"},
["lia"] = {"West-Central Limba"},
["lib"] = {"Likum"},
["lic"] = {"Hlai"},
["lid"] = {"Nyindrou"},
["lie"] = {"Likila"},
["lif"] = {"Limbu"},
["lig"] = {"Ligbi"},
["lih"] = {"Lihir"},
["lij"] = {"Ligurian"},
["lik"] = {"Lika"},
["lil"] = {"Lillooet"},
["lio"] = {"Liki"},
["lip"] = {"Sekpele"},
["liq"] = {"Libido"},
["lir"] = {"Liberian English"},
["lis"] = {"Lisu"},
["liu"] = {"Logorik"},
["liv"] = {"Liv"},
["liw"] = {"Col"},
["lix"] = {"Liabuku"},
["liy"] = {"Banda-Bambari"},
["liz"] = {"Libinza"},
["lja"] = {"Golpa"},
["lje"] = {"Rampi"},
["lji"] = {"Laiyolo"},
["ljl"] = {"Li'o"},
["ljp"] = {"Lampung Api"},
["ljw"] = {"Yirandali"},
["ljx"] = {"Yuru"},
["lka"] = {"Lakalei"},
["lkb"] = {"Kabras", "Lukabaras"},
["lkc"] = {"Kucong"},
["lkd"] = {"Lakondê"},
["lke"] = {"Kenyi"},
["lkh"] = {"Lakha"},
["lki"] = {"Laki"},
["lkj"] = {"Remun"},
["lkl"] = {"Laeko-Libuat"},
["lkm"] = {"Kalaamaya"},
["lkn"] = {"Lakon", "Vure"},
["lko"] = {"Khayo", "Olukhayo"},
["lkr"] = {"Päri"},
["lks"] = {"Kisa", "Olushisa"},
["lkt"] = {"Lakota"},
["lku"] = {"Kungkari"},
["lky"] = {"Lokoya"},
["lla"] = {"Lala-Roba"},
["llb"] = {"Lolo"},
["llc"] = {"Lele (Guinea)"},
["lld"] = {"Ladin"},
["lle"] = {"Lele (Papua New Guinea)"},
["llf"] = {"Hermit"},
["llg"] = {"Lole"},
["llh"] = {"Lamu"},
["lli"] = {"Teke-Laali"},
["llj"] = {"Ladji Ladji"},
["llk"] = {"Lelak"},
["lll"] = {"Lilau"},
["llm"] = {"Lasalimu"},
["lln"] = {"Lele (Chad)"},
["llp"] = {"North Efate"},
["llq"] = {"Lolak"},
["lls"] = {"Lithuanian Sign Language"},
["llu"] = {"Lau"},
["llx"] = {"Lauan"},
["lma"] = {"East Limba"},
["lmb"] = {"Merei"},
["lmc"] = {"Limilngan"},
["lmd"] = {"Lumun"},
["lme"] = {"Pévé"},
["lmf"] = {"South Lembata"},
["lmg"] = {"Lamogai"},
["lmh"] = {"Lambichhong"},
["lmi"] = {"Lombi"},
["lmj"] = {"West Lembata"},
["lmk"] = {"Lamkang"},
["lml"] = {"Hano"},
["lmn"] = {"Lambadi"},
["lmo"] = {"Lombard"},
["lmp"] = {"Limbum"},
["lmq"] = {"Lamatuka"},
["lmr"] = {"Lamalera"},
["lmu"] = {"Lamenu"},
["lmv"] = {"Lomaiviti"},
["lmw"] = {"Lake Miwok"},
["lmx"] = {"Laimbue"},
["lmy"] = {"Lamboya"},
["lna"] = {"Langbashe"},
["lnb"] = {"Mbalanhu"},
["lnd"] = {"Lundayeh", "Lun Bawang"},
["lng"] = {"Langobardic"},
["lnh"] = {"Lanoh"},
["lni"] = {"Daantanai'"},
["lnj"] = {"Leningitij"},
["lnl"] = {"South Central Banda"},
["lnm"] = {"Langam"},
["lnn"] = {"Lorediakarkar"},
["lns"] = {"Lamnso'"},
["lnu"] = {"Longuda"},
["lnw"] = {"Lanima"},
["lnz"] = {"Lonzo"},
["loa"] = {"Loloda"},
["lob"] = {"Lobi"},
["loc"] = {"Inonhan"},
["loe"] = {"Saluan"},
["lof"] = {"Logol"},
["log"] = {"Logo"},
["loh"] = {"Laarim", "Narim"},
["loi"] = {"Loma (Côte d'Ivoire)"},
["loj"] = {"Lou"},
["lok"] = {"Loko"},
["lol"] = {"Mongo"},
["lom"] = {"Loma (Liberia)"},
["lon"] = {"Malawi Lomwe"},
["loo"] = {"Lombo"},
["lop"] = {"Lopa"},
["loq"] = {"Lobala"},
["lor"] = {"Téén"},
["los"] = {"Loniu"},
["lot"] = {"Otuho"},
["lou"] = {"Louisiana Creole"},
["lov"] = {"Lopi"},
["low"] = {"Tampias Lobu"},
["lox"] = {"Loun"},
["loy"] = {"Loke"},
["loz"] = {"Lozi"},
["lpa"] = {"Lelepa"},
["lpe"] = {"Lepki"},
["lpn"] = {"Long Phuri Naga"},
["lpo"] = {"Lipo"},
["lpx"] = {"Lopit"},
["lqr"] = {"Logir"},
["lra"] = {"Rara Bakati'"},
["lrc"] = {"Northern Luri"},
["lre"] = {"Laurentian"},
["lrg"] = {"Laragia"},
["lri"] = {"Marachi", "Olumarachi"},
["lrk"] = {"Loarki"},
["lrl"] = {"Lari"},
["lrm"] = {"Marama", "Olumarama"},
["lrn"] = {"Lorang"},
["lro"] = {"Laro"},
["lrr"] = {"Southern Yamphu"},
["lrt"] = {"Larantuka Malay"},
["lrv"] = {"Larevat"},
["lrz"] = {"Lemerig"},
["lsa"] = {"Lasgerdi"},
["lsb"] = {"Burundian Sign Language", "Langue des Signes Burundaise"},
["lsc"] = {"Albarradas Sign Language", "Lengua de señas Albarradas"},
["lsd"] = {"Lishana Deni"},
["lse"] = {"Lusengo"},
["lsh"] = {"Lish"},
["lsi"] = {"Lashi"},
["lsl"] = {"Latvian Sign Language"},
["lsm"] = {"Saamia", "Olusamia"},
["lsn"] = {"Tibetan Sign Language"},
["lso"] = {"Laos Sign Language"},
["lsp"] = {"Panamanian Sign Language", "Lengua de Señas Panameñas"},
["lsr"] = {"Aruop"},
["lss"] = {"Lasi"},
["lst"] = {"Trinidad and Tobago Sign Language"},
["lsv"] = {"Sivia Sign Language"},
["lsw"] = {"Seychelles Sign Language", "Lalang Siny Seselwa", "Langue des Signes Seychelloise"},
["lsy"] = {"Mauritian Sign Language"},
["ltc"] = {"Late Middle Chinese"},
["ltg"] = {"Latgalian"},
["lth"] = {"Thur"},
["lti"] = {"Leti (Indonesia)"},
["ltn"] = {"Latundê"},
["lto"] = {"Tsotso", "Olutsotso"},
["lts"] = {"Tachoni", "Lutachoni"},
["ltu"] = {"Latu"},
["lua"] = {"Luba-Lulua"},
["luc"] = {"Aringa"},
["lud"] = {"Ludian"},
["lue"] = {"Luvale"},
["luf"] = {"Laua"},
["luh"] = {"Leizhou Chinese"},
["lui"] = {"Luiseño"},
["luj"] = {"Luna"},
["luk"] = {"Lunanakha"},
["lul"] = {"Olu'bo"},
["lum"] = {"Luimbi"},
["lun"] = {"Lunda"},
["luo"] = {"Luo (Kenya and Tanzania)", "Dholuo"},
["lup"] = {"Lumbu"},
["luq"] = {"Lucumi"},
["lur"] = {"Laura"},
["lus"] = {"Lushai"},
["lut"] = {"Lushootseed"},
["luu"] = {"Lumba-Yakkha"},
["luv"] = {"Luwati"},
["luw"] = {"Luo (Cameroon)"},
["luy"] = {"Luyia", "Oluluyia"},
["luz"] = {"Southern Luri"},
["lva"] = {"Maku'a"},
["lvi"] = {"Lavi"},
["lvk"] = {"Lavukaleve"},
["lvl"] = {"Lwel"},
["lvs"] = {"Standard Latvian"},
["lvu"] = {"Levuka"},
["lwa"] = {"Lwalu"},
["lwe"] = {"Lewo Eleng"},
["lwg"] = {"Wanga", "Oluwanga"},
["lwh"] = {"White Lachi"},
["lwl"] = {"Eastern Lawa"},
["lwm"] = {"Laomian"},
["lwo"] = {"Luwo"},
["lws"] = {"Malawian Sign Language"},
["lwt"] = {"Lewotobi"},
["lwu"] = {"Lawu"},
["lww"] = {"Lewo"},
["lxm"] = {"Lakurumau"},
["lya"] = {"Layakha"},
["lyg"] = {"Lyngngam"},
["lyn"] = {"Luyana"},
["lzh"] = {"Literary Chinese"},
["lzl"] = {"Litzlitz"},
["lzn"] = {"Leinong Naga"},
["lzz"] = {"Laz"},
["maa"] = {"San Jerónimo Tecóatl Mazatec"},
["mab"] = {"Yutanduchi Mixtec"},
["mad"] = {"Madurese"},
["mae"] = {"Bo-Rukul"},
["maf"] = {"Mafa"},
["mag"] = {"Magahi"},
["mai"] = {"Maithili"},
["maj"] = {"Jalapa De Díaz Mazatec"},
["mak"] = {"Makasar"},
["mam"] = {"Mam"},
["man"] = {"Mandingo", "Manding"},
["map"] = {"Austronesian languages"},
["maq"] = {"Chiquihuitlán Mazatec"},
["mas"] = {"Masai"},
["mat"] = {"San Francisco Matlatzinca"},
["mau"] = {"Huautla Mazatec"},
["mav"] = {"Sateré-Mawé"},
["maw"] = {"Mampruli"},
["max"] = {"North Moluccan Malay"},
["maz"] = {"Central Mazahua"},
["mba"] = {"Higaonon"},
["mbb"] = {"Western Bukidnon Manobo"},
["mbc"] = {"Macushi"},
["mbd"] = {"Dibabawon Manobo"},
["mbe"] = {"Molale"},
["mbf"] = {"Baba Malay"},
["mbh"] = {"Mangseng"},
["mbi"] = {"Ilianen Manobo"},
["mbj"] = {"Nadëb"},
["mbk"] = {"Malol"},
["mbl"] = {"Maxakalí"},
["mbm"] = {"Ombamba"},
["mbn"] = {"Macaguán"},
["mbo"] = {"Mbo (Cameroon)"},
["mbp"] = {"Malayo"},
["mbq"] = {"Maisin"},
["mbr"] = {"Nukak Makú"},
["mbs"] = {"Sarangani Manobo"},
["mbt"] = {"Matigsalug Manobo"},
["mbu"] = {"Mbula-Bwazza"},
["mbv"] = {"Mbulungish"},
["mbw"] = {"Maring"},
["mbx"] = {"Mari (East Sepik Province)"},
["mby"] = {"Memoni"},
["mbz"] = {"Amoltepec Mixtec"},
["mca"] = {"Maca"},
["mcb"] = {"Machiguenga"},
["mcc"] = {"Bitur"},
["mcd"] = {"Sharanahua"},
["mce"] = {"Itundujia Mixtec"},
["mcf"] = {"Matsés"},
["mcg"] = {"Mapoyo"},
["mch"] = {"Maquiritari"},
["mci"] = {"Mese"},
["mcj"] = {"Mvanip"},
["mck"] = {"Mbunda"},
["mcl"] = {"Macaguaje"},
["mcm"] = {"Malaccan Creole Portuguese"},
["mcn"] = {"Masana"},
["mco"] = {"Coatlán Mixe"},
["mcp"] = {"Makaa"},
["mcq"] = {"Ese"},
["mcr"] = {"Menya"},
["mcs"] = {"Mambai"},
["mct"] = {"Mengisa"},
["mcu"] = {"Cameroon Mambila"},
["mcv"] = {"Minanibai"},
["mcw"] = {"Mawa (Chad)"},
["mcx"] = {"Mpiemo"},
["mcy"] = {"South Watut"},
["mcz"] = {"Mawan"},
["mda"] = {"Mada (Nigeria)"},
["mdb"] = {"Morigi"},
["mdc"] = {"Soq", "Male (Papua New Guinea)"},
["mdd"] = {"Mbum"},
["mde"] = {"Maba (Chad)"},
["mdf"] = {"Moksha"},
["mdg"] = {"Massalat"},
["mdh"] = {"Maguindanaon"},
["mdi"] = {"Mamvu"},
["mdj"] = {"Mangbetu"},
["mdk"] = {"Mangbutu"},
["mdl"] = {"Maltese Sign Language"},
["mdm"] = {"Mayogo"},
["mdn"] = {"Mbati"},
["mdp"] = {"Mbala"},
["mdq"] = {"Mbole"},
["mdr"] = {"Mandar"},
["mds"] = {"Maria (Papua New Guinea)"},
["mdt"] = {"Mbere"},
["mdu"] = {"Mboko"},
["mdv"] = {"Santa Lucía Monteverde Mixtec"},
["mdw"] = {"Mbosi"},
["mdx"] = {"Dizin"},
["mdy"] = {"Male", "Male (Ethiopia)"},
["mdz"] = {"Suruí Do Pará"},
["mea"] = {"Menka"},
["meb"] = {"Ikobi"},
["mec"] = {"Marra"},
["med"] = {"Melpa"},
["mee"] = {"Mengen"},
["mef"] = {"Megam"},
["meh"] = {"Southwestern Tlaxiaco Mixtec"},
["mei"] = {"Midob"},
["mej"] = {"Meyah"},
["mek"] = {"Mekeo"},
["mel"] = {"Central Melanau"},
["mem"] = {"Mangala"},
["men"] = {"Mende (Sierra Leone)"},
["meo"] = {"Kedah Malay"},
["mep"] = {"Miriwoong"},
["meq"] = {"Merey"},
["mer"] = {"Meru"},
["mes"] = {"Masmaje"},
["met"] = {"Mato"},
["meu"] = {"Motu"},
["mev"] = {"Mano"},
["mew"] = {"Maaka"},
["mey"] = {"Hassaniyya"},
["mez"] = {"Menominee"},
["mfa"] = {"Pattani Malay"},
["mfb"] = {"Bangka"},
["mfc"] = {"Mba"},
["mfd"] = {"Mendankwe-Nkwen"},
["mfe"] = {"Morisyen"},
["mff"] = {"Naki"},
["mfg"] = {"Mogofin"},
["mfh"] = {"Matal"},
["mfi"] = {"Wandala"},
["mfj"] = {"Mefele"},
["mfk"] = {"North Mofu"},
["mfl"] = {"Putai"},
["mfm"] = {"Marghi South"},
["mfn"] = {"Cross River Mbembe"},
["mfo"] = {"Mbe"},
["mfp"] = {"Makassar Malay"},
["mfq"] = {"Moba"},
["mfr"] = {"Marrithiyel"},
["mfs"] = {"Mexican Sign Language"},
["mft"] = {"Mokerang"},
["mfu"] = {"Mbwela"},
["mfv"] = {"Mandjak"},
["mfw"] = {"Mulaha"},
["mfx"] = {"Melo"},
["mfy"] = {"Mayo"},
["mfz"] = {"Mabaan"},
["mga"] = {"Middle Irish (900-1200)"},
["mgb"] = {"Mararit"},
["mgc"] = {"Morokodo"},
["mgd"] = {"Moru"},
["mge"] = {"Mango"},
["mgf"] = {"Maklew"},
["mgg"] = {"Mpumpong"},
["mgh"] = {"Makhuwa-Meetto"},
["mgi"] = {"Lijili"},
["mgj"] = {"Abureni"},
["mgk"] = {"Mawes"},
["mgl"] = {"Maleu-Kilenge"},
["mgm"] = {"Mambae"},
["mgn"] = {"Mbangi"},
["mgo"] = {"Meta'"},
["mgp"] = {"Magar", "Magar Dhut"},
["mgq"] = {"Malila"},
["mgr"] = {"Mambwe-Lungu"},
["mgs"] = {"Manda (Tanzania)"},
["mgt"] = {"Mongol"},
["mgu"] = {"Mailu"},
["mgv"] = {"Matengo"},
["mgw"] = {"Matumbi"},
["mgy"] = {"Mbunga"},
["mgz"] = {"Mbugwe"},
["mha"] = {"Manda (India)"},
["mhb"] = {"Mahongwe"},
["mhc"] = {"Mocho"},
["mhd"] = {"Mbugu"},
["mhe"] = {"Besisi", "Mah Meri"},
["mhf"] = {"Mamaa"},
["mhg"] = {"Margu"},
["mhi"] = {"Ma'di"},
["mhj"] = {"Mogholi"},
["mhk"] = {"Mungaka"},
["mhl"] = {"Mauwake"},
["mhm"] = {"Makhuwa-Moniga"},
["mhn"] = {"Mòcheno"},
["mho"] = {"Mashi (Zambia)"},
["mhp"] = {"Balinese Malay"},
["mhq"] = {"Mandan"},
["mhr"] = {"Eastern Mari"},
["mhs"] = {"Buru (Indonesia)"},
["mht"] = {"Mandahuaca"},
["mhu"] = {"Digaro-Mishmi", "Darang Deng"},
["mhw"] = {"Mbukushu"},
["mhx"] = {"Maru", "Lhaovo"},
["mhy"] = {"Ma'anyan"},
["mhz"] = {"Mor (Mor Islands)"},
["mia"] = {"Miami"},
["mib"] = {"Atatláhuca Mixtec"},
["mic"] = {"Mi'kmaq", "Micmac"},
["mid"] = {"Mandaic"},
["mie"] = {"Ocotepec Mixtec"},
["mif"] = {"Mofu-Gudur"},
["mig"] = {"San Miguel El Grande Mixtec"},
["mih"] = {"Chayuco Mixtec"},
["mii"] = {"Chigmecatitlán Mixtec"},
["mij"] = {"Abar", "Mungbam"},
["mik"] = {"Mikasuki"},
["mil"] = {"Peñoles Mixtec"},
["mim"] = {"Alacatlatzala Mixtec"},
["min"] = {"Minangkabau"},
["mio"] = {"Pinotepa Nacional Mixtec"},
["mip"] = {"Apasco-Apoala Mixtec"},
["miq"] = {"Mískito"},
["mir"] = {"Isthmus Mixe"},
["mis"] = {"Uncoded languages"},
["mit"] = {"Southern Puebla Mixtec"},
["miu"] = {"Cacaloxtepec Mixtec"},
["miw"] = {"Akoye"},
["mix"] = {"Mixtepec Mixtec"},
["miy"] = {"Ayutla Mixtec"},
["miz"] = {"Coatzospan Mixtec"},
["mjb"] = {"Makalero"},
["mjc"] = {"San Juan Colorado Mixtec"},
["mjd"] = {"Northwest Maidu"},
["mje"] = {"Muskum"},
["mjg"] = {"Tu"},
["mjh"] = {"Mwera (Nyasa)"},
["mji"] = {"Kim Mun"},
["mjj"] = {"Mawak"},
["mjk"] = {"Matukar"},
["mjl"] = {"Mandeali"},
["mjm"] = {"Medebur"},
["mjn"] = {"Ma (Papua New Guinea)"},
["mjo"] = {"Malankuravan"},
["mjp"] = {"Malapandaram"},
["mjq"] = {"Malaryan"},
["mjr"] = {"Malavedan"},
["mjs"] = {"Miship"},
["mjt"] = {"Sauria Paharia"},
["mju"] = {"Manna-Dora"},
["mjv"] = {"Mannan"},
["mjw"] = {"Karbi"},
["mjx"] = {"Mahali"},
["mjy"] = {"Mahican"},
["mjz"] = {"Majhi"},
["mka"] = {"Mbre"},
["mkb"] = {"Mal Paharia"},
["mkc"] = {"Siliput"},
["mke"] = {"Mawchi"},
["mkf"] = {"Miya"},
["mkg"] = {"Mak (China)"},
["mkh"] = {"Mon-Khmer languages"},
["mki"] = {"Dhatki"},
["mkj"] = {"Mokilese"},
["mkk"] = {"Byep"},
["mkl"] = {"Mokole"},
["mkm"] = {"Moklen"},
["mkn"] = {"Kupang Malay"},
["mko"] = {"Mingang Doso"},
["mkp"] = {"Moikodi"},
["mkq"] = {"Bay Miwok"},
["mkr"] = {"Malas"},
["mks"] = {"Silacayoapan Mixtec"},
["mkt"] = {"Vamale"},
["mku"] = {"Konyanka Maninka"},
["mkv"] = {"Mafea"},
["mkw"] = {"Kituba (Congo)"},
["mkx"] = {"Kinamiging Manobo"},
["mky"] = {"East Makian"},
["mkz"] = {"Makasae"},
["mla"] = {"Malo"},
["mlb"] = {"Mbule"},
["mlc"] = {"Cao Lan"},
["mle"] = {"Manambu"},
["mlf"] = {"Mal"},
["mlh"] = {"Mape"},
["mli"] = {"Malimpung"},
["mlj"] = {"Miltu"},
["mlk"] = {"Ilwana", "Kiwilwana"},
["mll"] = {"Malua Bay"},
["mlm"] = {"Mulam"},
["mln"] = {"Malango"},
["mlo"] = {"Mlomp"},
["mlp"] = {"Bargam"},
["mlq"] = {"Western Maninkakan"},
["mlr"] = {"Vame"},
["mls"] = {"Masalit"},
["mlu"] = {"To'abaita"},
["mlv"] = {"Motlav", "Mwotlap"},
["mlw"] = {"Moloko"},
["mlx"] = {"Malfaxal", "Naha'ai"},
["mlz"] = {"Malaynon"},
["mma"] = {"Mama"},
["mmb"] = {"Momina"},
["mmc"] = {"Michoacán Mazahua"},
["mmd"] = {"Maonan"},
["mme"] = {"Mae"},
["mmf"] = {"Mundat"},
["mmg"] = {"North Ambrym"},
["mmh"] = {"Mehináku"},
["mmi"] = {"Hember Avu", "Amben", "Musar"},
["mmj"] = {"Majhwar"},
["mmk"] = {"Mukha-Dora"},
["mml"] = {"Man Met"},
["mmm"] = {"Maii"},
["mmn"] = {"Mamanwa"},
["mmo"] = {"Mangga Buang"},
["mmp"] = {"Siawi"},
["mmq"] = {"Musak"},
["mmr"] = {"Western Xiangxi Miao"},
["mmt"] = {"Malalamai"},
["mmu"] = {"Mmaala"},
["mmv"] = {"Miriti"},
["mmw"] = {"Emae"},
["mmx"] = {"Madak"},
["mmy"] = {"Migaama"},
["mmz"] = {"Mabaale"},
["mna"] = {"Mbula"},
["mnb"] = {"Muna"},
["mnc"] = {"Manchu"},
["mnd"] = {"Mondé"},
["mne"] = {"Naba"},
["mnf"] = {"Mundani"},
["mng"] = {"Eastern Mnong"},
["mnh"] = {"Mono (Democratic Republic of Congo)"},
["mni"] = {"Manipuri"},
["mnj"] = {"Munji"},
["mnk"] = {"Mandinka"},
["mnl"] = {"Tiale"},
["mnm"] = {"Mapena"},
["mnn"] = {"Southern Mnong"},
["mno"] = {"Manobo languages"},
["mnp"] = {"Min Bei Chinese"},
["mnq"] = {"Minriq"},
["mnr"] = {"Mono (USA)"},
["mns"] = {"Mansi"},
["mnu"] = {"Mer"},
["mnv"] = {"Rennell-Bellona"},
["mnw"] = {"Mon"},
["mnx"] = {"Manikion"},
["mny"] = {"Manyawa"},
["mnz"] = {"Moni"},
["moa"] = {"Mwan"},
["moc"] = {"Mocoví"},
["mod"] = {"Mobilian"},
["moe"] = {"Innu", "Montagnais"},
["mog"] = {"Mongondow"},
["moh"] = {"Mohawk", "Kanien'kéha"},
["moi"] = {"Mboi"},
["moj"] = {"Monzombo"},
["mok"] = {"Morori"},
["mom"] = {"Mangue"},
["moo"] = {"Monom"},
["mop"] = {"Mopán Maya"},
["moq"] = {"Mor (Bomberai Peninsula)"},
["mor"] = {"Moro"},
["mos"] = {"Mossi"},
["mot"] = {"Barí"},
["mou"] = {"Mogum"},
["mov"] = {"Mohave"},
["mow"] = {"Moi (Congo)"},
["mox"] = {"Molima"},
["moy"] = {"Shekkacho"},
["moz"] = {"Mukulu", "Gergiko"},
["mpa"] = {"Mpoto"},
["mpb"] = {"Malak Malak", "Mullukmulluk"},
["mpc"] = {"Mangarrayi"},
["mpd"] = {"Machinere"},
["mpe"] = {"Majang"},
["mpg"] = {"Marba"},
["mph"] = {"Maung"},
["mpi"] = {"Mpade"},
["mpj"] = {"Martu Wangka", "Wangkajunga"},
["mpk"] = {"Mbara (Chad)"},
["mpl"] = {"Middle Watut"},
["mpm"] = {"Yosondúa Mixtec"},
["mpn"] = {"Mindiri"},
["mpo"] = {"Miu"},
["mpp"] = {"Migabac"},
["mpq"] = {"Matís"},
["mpr"] = {"Vangunu"},
["mps"] = {"Dadibi"},
["mpt"] = {"Mian"},
["mpu"] = {"Makuráp"},
["mpv"] = {"Mungkip"},
["mpw"] = {"Mapidian"},
["mpx"] = {"Misima-Panaeati"},
["mpy"] = {"Mapia"},
["mpz"] = {"Mpi"},
["mqa"] = {"Maba (Indonesia)"},
["mqb"] = {"Mbuko"},
["mqc"] = {"Mangole"},
["mqe"] = {"Matepi"},
["mqf"] = {"Momuna"},
["mqg"] = {"Kota Bangun Kutai Malay"},
["mqh"] = {"Tlazoyaltepec Mixtec"},
["mqi"] = {"Mariri"},
["mqj"] = {"Mamasa"},
["mqk"] = {"Rajah Kabunsuwan Manobo"},
["mql"] = {"Mbelime"},
["mqm"] = {"South Marquesan"},
["mqn"] = {"Moronene"},
["mqo"] = {"Modole"},
["mqp"] = {"Manipa"},
["mqq"] = {"Minokok"},
["mqr"] = {"Mander"},
["mqs"] = {"West Makian"},
["mqt"] = {"Mok"},
["mqu"] = {"Mandari"},
["mqv"] = {"Mosimo"},
["mqw"] = {"Murupi"},
["mqx"] = {"Mamuju"},
["mqy"] = {"Manggarai"},
["mqz"] = {"Pano"},
["mra"] = {"Mlabri"},
["mrb"] = {"Marino"},
["mrc"] = {"Maricopa"},
["mre"] = {"Martha's Vineyard Sign Language"},
["mrf"] = {"Elseng"},
["mrg"] = {"Mising"},
["mrh"] = {"Mara", "Shendu"},
["mrj"] = {"Western Mari"},
["mrk"] = {"Hmwaveke"},
["mrl"] = {"Mortlockese"},
["mrm"] = {"Merlav", "Mwerlap"},
["mrn"] = {"Cheke Holo"},
["mro"] = {"Mru"},
["mrp"] = {"Morouas"},
["mrq"] = {"North Marquesan"},
["mrr"] = {"Maria (India)"},
["mrs"] = {"Maragus"},
["mrt"] = {"Marghi Central"},
["mru"] = {"Mono (Cameroon)"},
["mrv"] = {"Mangareva"},
["mrw"] = {"Maranao"},
["mrx"] = {"Maremgi", "Dineor"},
["mry"] = {"Mandaya"},
["mrz"] = {"Marind"},
["msb"] = {"Masbatenyo"},
["msc"] = {"Sankaran Maninka"},
["msd"] = {"Yucatec Maya Sign Language"},
["mse"] = {"Musey"},
["msf"] = {"Mekwei"},
["msg"] = {"Moraid"},
["msh"] = {"Masikoro Malagasy"},
["msi"] = {"Sabah Malay"},
["msj"] = {"Ma (Democratic Republic of Congo)"},
["msk"] = {"Mansaka"},
["msl"] = {"Molof", "Poule"},
["msm"] = {"Agusan Manobo"},
["msn"] = {"Vurës"},
["mso"] = {"Mombum"},
["msp"] = {"Maritsauá"},
["msq"] = {"Caac"},
["msr"] = {"Mongolian Sign Language"},
["mss"] = {"West Masela"},
["msu"] = {"Musom"},
["msv"] = {"Maslam"},
["msw"] = {"Mansoanka"},
["msx"] = {"Moresada"},
["msy"] = {"Aruamu"},
["msz"] = {"Momare"},
["mta"] = {"Cotabato Manobo"},
["mtb"] = {"Anyin Morofo"},
["mtc"] = {"Munit"},
["mtd"] = {"Mualang"},
["mte"] = {"Mono (Solomon Islands)"},
["mtf"] = {"Murik (Papua New Guinea)"},
["mtg"] = {"Una"},
["mth"] = {"Munggui"},
["mti"] = {"Maiwa (Papua New Guinea)"},
["mtj"] = {"Moskona"},
["mtk"] = {"Mbe'"},
["mtl"] = {"Montol"},
["mtm"] = {"Mator"},
["mtn"] = {"Matagalpa"},
["mto"] = {"Totontepec Mixe"},
["mtp"] = {"Wichí Lhamtés Nocten"},
["mtq"] = {"Muong"},
["mtr"] = {"Mewari"},
["mts"] = {"Yora"},
["mtt"] = {"Mota"},
["mtu"] = {"Tututepec Mixtec"},
["mtv"] = {"Asaro'o"},
["mtw"] = {"Southern Binukidnon"},
["mtx"] = {"Tidaá Mixtec"},
["mty"] = {"Nabi"},
["mua"] = {"Mundang"},
["mub"] = {"Mubi"},
["muc"] = {"Ajumbu"},
["mud"] = {"Mednyj Aleut"},
["mue"] = {"Media Lengua"},
["mug"] = {"Musgu"},
["muh"] = {"Mündü"},
["mui"] = {"Musi"},
["muj"] = {"Mabire"},
["muk"] = {"Mugom"},
["mul"] = {"Multiple languages"},
["mum"] = {"Maiwala"},
["mun"] = {"Munda languages"},
["muo"] = {"Nyong"},
["mup"] = {"Malvi"},
["muq"] = {"Eastern Xiangxi Miao"},
["mur"] = {"Murle"},
["mus"] = {"Creek"},
["mut"] = {"Western Muria"},
["muu"] = {"Yaaku"},
["muv"] = {"Muthuvan"},
["mux"] = {"Bo-Ung"},
["muy"] = {"Muyang"},
["muz"] = {"Mursi"},
["mva"] = {"Manam"},
["mvb"] = {"Mattole"},
["mvd"] = {"Mamboru"},
["mve"] = {"Marwari (Pakistan)"},
["mvf"] = {"Peripheral Mongolian"},
["mvg"] = {"Yucuañe Mixtec"},
["mvh"] = {"Mulgi"},
["mvi"] = {"Miyako"},
["mvk"] = {"Mekmek"},
["mvl"] = {"Mbara (Australia)"},
["mvn"] = {"Minaveha"},
["mvo"] = {"Marovo"},
["mvp"] = {"Duri"},
["mvq"] = {"Moere"},
["mvr"] = {"Marau"},
["mvs"] = {"Massep"},
["mvt"] = {"Mpotovoro"},
["mvu"] = {"Marfa"},
["mvv"] = {"Tagal Murut"},
["mvw"] = {"Machinga"},
["mvx"] = {"Meoswar"},
["mvy"] = {"Indus Kohistani"},
["mvz"] = {"Mesqan"},
["mwa"] = {"Mwatebu"},
["mwb"] = {"Juwal"},
["mwc"] = {"Are"},
["mwe"] = {"Mwera (Chimwera)"},
["mwf"] = {"Murrinh-Patha"},
["mwg"] = {"Aiklep"},
["mwh"] = {"Mouk-Aria"},
["mwi"] = {"Labo", "Ninde"},
["mwk"] = {"Kita Maninkakan"},
["mwl"] = {"Mirandese"},
["mwm"] = {"Sar"},
["mwn"] = {"Nyamwanga"},
["mwo"] = {"Central Maewo"},
["mwp"] = {"Kala Lagaw Ya"},
["mwq"] = {"Mün Chin"},
["mwr"] = {"Marwari"},
["mws"] = {"Mwimbi-Muthambi"},
["mwt"] = {"Moken"},
["mwu"] = {"Mittu"},
["mwv"] = {"Mentawai"},
["mww"] = {"Hmong Daw"},
["mwz"] = {"Moingi"},
["mxa"] = {"Northwest Oaxaca Mixtec"},
["mxb"] = {"Tezoatlán Mixtec"},
["mxc"] = {"Manyika"},
["mxd"] = {"Modang"},
["mxe"] = {"Mele-Fila"},
["mxf"] = {"Malgbe"},
["mxg"] = {"Mbangala"},
["mxh"] = {"Mvuba"},
["mxi"] = {"Mozarabic"},
["mxj"] = {"Miju-Mishmi", "Geman Deng"},
["mxk"] = {"Monumbo"},
["mxl"] = {"Maxi Gbe"},
["mxm"] = {"Meramera"},
["mxn"] = {"Moi (Indonesia)"},
["mxo"] = {"Mbowe"},
["mxp"] = {"Tlahuitoltepec Mixe"},
["mxq"] = {"Juquila Mixe"},
["mxr"] = {"Murik (Malaysia)"},
["mxs"] = {"Huitepec Mixtec"},
["mxt"] = {"Jamiltepec Mixtec"},
["mxu"] = {"Mada (Cameroon)"},
["mxv"] = {"Metlatónoc Mixtec"},
["mxw"] = {"Namo"},
["mxx"] = {"Mahou", "Mawukakan"},
["mxy"] = {"Southeastern Nochixtlán Mixtec"},
["mxz"] = {"Central Masela"},
["myb"] = {"Mbay"},
["myc"] = {"Mayeka"},
["mye"] = {"Myene"},
["myf"] = {"Bambassi"},
["myg"] = {"Manta"},
["myh"] = {"Makah"},
["myj"] = {"Mangayat"},
["myk"] = {"Mamara Senoufo"},
["myl"] = {"Moma"},
["mym"] = {"Me'en"},
["myn"] = {"Mayan languages"},
["myo"] = {"Anfillo"},
["myp"] = {"Pirahã"},
["myr"] = {"Muniche"},
["mys"] = {"Mesmes"},
["myu"] = {"Mundurukú"},
["myv"] = {"Erzya"},
["myw"] = {"Muyuw"},
["myx"] = {"Masaaba"},
["myy"] = {"Macuna"},
["myz"] = {"Classical Mandaic"},
["mza"] = {"Santa María Zacatepec Mixtec"},
["mzb"] = {"Tumzabt"},
["mzc"] = {"Madagascar Sign Language"},
["mzd"] = {"Malimba"},
["mze"] = {"Morawa"},
["mzg"] = {"Monastic Sign Language"},
["mzh"] = {"Wichí Lhamtés Güisnay"},
["mzi"] = {"Ixcatlán Mazatec"},
["mzj"] = {"Manya"},
["mzk"] = {"Nigeria Mambila"},
["mzl"] = {"Mazatlán Mixe"},
["mzm"] = {"Mumuye"},
["mzn"] = {"Mazanderani"},
["mzo"] = {"Matipuhy"},
["mzp"] = {"Movima"},
["mzq"] = {"Mori Atas"},
["mzr"] = {"Marúbo"},
["mzs"] = {"Macanese"},
["mzt"] = {"Mintil"},
["mzu"] = {"Inapang"},
["mzv"] = {"Manza"},
["mzw"] = {"Deg"},
["mzx"] = {"Mawayana"},
["mzy"] = {"Mozambican Sign Language"},
["mzz"] = {"Maiadomu"},
["naa"] = {"Namla"},
["nab"] = {"Southern Nambikuára"},
["nac"] = {"Narak"},
["nae"] = {"Naka'ela"},
["naf"] = {"Nabak"},
["nag"] = {"Naga Pidgin"},
["nah"] = {"Nahuatl languages"},
["nai"] = {"North American Indian languages"},
["naj"] = {"Nalu"},
["nak"] = {"Nakanai"},
["nal"] = {"Nalik"},
["nam"] = {"Ngan'gityemerri"},
["nan"] = {"Min Nan Chinese"},
["nao"] = {"Naaba"},
["nap"] = {"Neapolitan"},
["naq"] = {"Khoekhoe", "Nama (Namibia)"},
["nar"] = {"Iguta"},
["nas"] = {"Naasioi"},
["nat"] = {"Ca̱hungwa̱rya̱", "Hungworo"},
["naw"] = {"Nawuri"},
["nax"] = {"Nakwi"},
["nay"] = {"Ngarrindjeri"},
["naz"] = {"Coatepec Nahuatl"},
["nba"] = {"Nyemba"},
["nbb"] = {"Ndoe"},
["nbc"] = {"Chang Naga"},
["nbd"] = {"Ngbinda"},
["nbe"] = {"Konyak Naga"},
["nbg"] = {"Nagarchal"},
["nbh"] = {"Ngamo"},
["nbi"] = {"Mao Naga"},
["nbj"] = {"Ngarinyman"},
["nbk"] = {"Nake"},
["nbm"] = {"Ngbaka Ma'bo"},
["nbn"] = {"Kuri"},
["nbo"] = {"Nkukoli"},
["nbp"] = {"Nnam"},
["nbq"] = {"Nggem"},
["nbr"] = {"Numana"},
["nbs"] = {"Namibian Sign Language"},
["nbt"] = {"Na"},
["nbu"] = {"Rongmei Naga"},
["nbv"] = {"Ngamambo"},
["nbw"] = {"Southern Ngbandi"},
["nby"] = {"Ningera"},
["nca"] = {"Iyo"},
["ncb"] = {"Central Nicobarese"},
["ncc"] = {"Ponam"},
["ncd"] = {"Nachering"},
["nce"] = {"Yale"},
["ncf"] = {"Notsi"},
["ncg"] = {"Nisga'a"},
["nch"] = {"Central Huasteca Nahuatl"},
["nci"] = {"Classical Nahuatl"},
["ncj"] = {"Northern Puebla Nahuatl"},
["nck"] = {"Na-kara"},
["ncl"] = {"Michoacán Nahuatl"},
["ncm"] = {"Nambo"},
["ncn"] = {"Nauna"},
["nco"] = {"Sibe"},
["ncq"] = {"Northern Katang"},
["ncr"] = {"Ncane"},
["ncs"] = {"Nicaraguan Sign Language"},
["nct"] = {"Chothe Naga"},
["ncu"] = {"Chumburung"},
["ncx"] = {"Central Puebla Nahuatl"},
["ncz"] = {"Natchez"},
["nda"] = {"Ndasa"},
["ndb"] = {"Kenswei Nsei"},
["ndc"] = {"Ndau"},
["ndd"] = {"Nde-Nsele-Nta"},
["ndf"] = {"Nadruvian"},
["ndg"] = {"Ndengereko"},
["ndh"] = {"Ndali"},
["ndi"] = {"Samba Leko"},
["ndj"] = {"Ndamba"},
["ndk"] = {"Ndaka"},
["ndl"] = {"Ndolo"},
["ndm"] = {"Ndam"},
["ndn"] = {"Ngundi"},
["ndp"] = {"Ndo"},
["ndq"] = {"Ndombe"},
["ndr"] = {"Ndoola"},
["nds"] = {"Low German", "Low Saxon"},
["ndt"] = {"Ndunga"},
["ndu"] = {"Dugun"},
["ndv"] = {"Ndut"},
["ndw"] = {"Ndobo"},
["ndx"] = {"Nduga"},
["ndy"] = {"Lutos"},
["ndz"] = {"Ndogo"},
["nea"] = {"Eastern Ngad'a"},
["neb"] = {"Toura (Côte d'Ivoire)"},
["nec"] = {"Nedebang"},
["ned"] = {"Nde-Gbite"},
["nee"] = {"Nêlêmwa-Nixumwak"},
["nef"] = {"Nefamese"},
["neg"] = {"Negidal"},
["neh"] = {"Nyenkha"},
["nei"] = {"Neo-Hittite"},
["nej"] = {"Neko"},
["nek"] = {"Neku"},
["nem"] = {"Nemi"},
["nen"] = {"Nengone"},
["neo"] = {"Ná-Meo"},
["neq"] = {"North Central Mixe"},
["ner"] = {"Yahadian"},
["nes"] = {"Bhoti Kinnauri"},
["net"] = {"Nete"},
["neu"] = {"Neo"},
["nev"] = {"Nyaheun"},
["new"] = {"Nepal Bhasa", "Newar", "Newari"},
["nex"] = {"Neme"},
["ney"] = {"Neyo"},
["nez"] = {"Nez Perce"},
["nfa"] = {"Dhao"},
["nfd"] = {"Ahwai"},
["nfl"] = {"Ayiwo", "Äiwoo"},
["nfr"] = {"Nafaanra"},
["nfu"] = {"Mfumte"},
["nga"] = {"Ngbaka"},
["ngb"] = {"Northern Ngbandi"},
["ngc"] = {"Ngombe (Democratic Republic of Congo)"},
["ngd"] = {"Ngando (Central African Republic)"},
["nge"] = {"Ngemba"},
["ngf"] = {"Trans-New Guinea languages"},
["ngg"] = {"Ngbaka Manza"},
["ngh"] = {"Nǁng"},
["ngi"] = {"Ngizim"},
["ngj"] = {"Ngie"},
["ngk"] = {"Dalabon"},
["ngl"] = {"Lomwe"},
["ngm"] = {"Ngatik Men's Creole"},
["ngn"] = {"Ngwo"},
["ngp"] = {"Ngulu"},
["ngq"] = {"Ngurimi", "Ngoreme"},
["ngr"] = {"Engdewu"},
["ngs"] = {"Gvoko"},
["ngt"] = {"Kriang", "Ngeq"},
["ngu"] = {"Guerrero Nahuatl"},
["ngv"] = {"Nagumi"},
["ngw"] = {"Ngwaba"},
["ngx"] = {"Nggwahyi"},
["ngy"] = {"Tibea"},
["ngz"] = {"Ngungwel"},
["nha"] = {"Nhanda"},
["nhb"] = {"Beng"},
["nhc"] = {"Tabasco Nahuatl"},
["nhd"] = {"Chiripá", "Ava Guaraní"},
["nhe"] = {"Eastern Huasteca Nahuatl"},
["nhf"] = {"Nhuwala"},
["nhg"] = {"Tetelcingo Nahuatl"},
["nhh"] = {"Nahari"},
["nhi"] = {"Zacatlán-Ahuacatlán-Tepetzintla Nahuatl"},
["nhk"] = {"Isthmus-Cosoleacaque Nahuatl"},
["nhm"] = {"Morelos Nahuatl"},
["nhn"] = {"Central Nahuatl"},
["nho"] = {"Takuu"},
["nhp"] = {"Isthmus-Pajapan Nahuatl"},
["nhq"] = {"Huaxcaleca Nahuatl"},
["nhr"] = {"Naro"},
["nht"] = {"Ometepec Nahuatl"},
["nhu"] = {"Noone"},
["nhv"] = {"Temascaltepec Nahuatl"},
["nhw"] = {"Western Huasteca Nahuatl"},
["nhx"] = {"Isthmus-Mecayapan Nahuatl"},
["nhy"] = {"Northern Oaxaca Nahuatl"},
["nhz"] = {"Santa María La Alta Nahuatl"},
["nia"] = {"Nias"},
["nib"] = {"Nakame"},
["nic"] = {"Niger-Kordofanian languages"},
["nid"] = {"Ngandi"},
["nie"] = {"Niellim"},
["nif"] = {"Nek"},
["nig"] = {"Ngalakgan"},
["nih"] = {"Nyiha (Tanzania)"},
["nii"] = {"Nii"},
["nij"] = {"Ngaju"},
["nik"] = {"Southern Nicobarese"},
["nil"] = {"Nila"},
["nim"] = {"Nilamba"},
["nin"] = {"Ninzo"},
["nio"] = {"Nganasan"},
["niq"] = {"Nandi"},
["nir"] = {"Nimboran"},
["nis"] = {"Nimi"},
["nit"] = {"Southeastern Kolami"},
["niu"] = {"Niuean"},
["niv"] = {"Gilyak"},
["niw"] = {"Nimo"},
["nix"] = {"Hema"},
["niy"] = {"Ngiti"},
["niz"] = {"Ningil"},
["nja"] = {"Nzanyi"},
["njb"] = {"Nocte Naga"},
["njd"] = {"Ndonde Hamba"},
["njh"] = {"Lotha Naga"},
["nji"] = {"Gudanji"},
["njj"] = {"Njen"},
["njl"] = {"Njalgulgule"},
["njm"] = {"Angami Naga"},
["njn"] = {"Liangmai Naga"},
["njo"] = {"Ao Naga"},
["njr"] = {"Njerep"},
["njs"] = {"Nisa"},
["njt"] = {"Ndyuka-Trio Pidgin"},
["nju"] = {"Ngadjunmaya"},
["njx"] = {"Kunyi"},
["njy"] = {"Njyem"},
["njz"] = {"Nyishi"},
["nka"] = {"Nkoya"},
["nkb"] = {"Khoibu Naga"},
["nkc"] = {"Nkongho"},
["nkd"] = {"Koireng"},
["nke"] = {"Duke"},
["nkf"] = {"Inpui Naga"},
["nkg"] = {"Nekgini"},
["nkh"] = {"Khezha Naga"},
["nki"] = {"Thangal Naga"},
["nkj"] = {"Nakai"},
["nkk"] = {"Nokuku"},
["nkm"] = {"Namat"},
["nkn"] = {"Nkangala"},
["nko"] = {"Nkonya"},
["nkp"] = {"Niuatoputapu"},
["nkq"] = {"Nkami"},
["nkr"] = {"Nukuoro"},
["nks"] = {"North Asmat"},
["nkt"] = {"Nyika (Tanzania)"},
["nku"] = {"Bouna Kulango"},
["nkv"] = {"Nyika (Malawi and Zambia)"},
["nkw"] = {"Nkutu"},
["nkx"] = {"Nkoroo"},
["nkz"] = {"Nkari"},
["nla"] = {"Ngombale"},
["nlc"] = {"Nalca"},
["nle"] = {"East Nyala"},
["nlg"] = {"Gela"},
["nli"] = {"Grangali"},
["nlj"] = {"Nyali"},
["nlk"] = {"Ninia Yali"},
["nll"] = {"Nihali"},
["nlm"] = {"Mankiyali"},
["nlo"] = {"Ngul"},
["nlq"] = {"Lao Naga"},
["nlu"] = {"Nchumbulu"},
["nlv"] = {"Orizaba Nahuatl"},
["nlw"] = {"Walangama"},
["nlx"] = {"Nahali"},
["nly"] = {"Nyamal"},
["nlz"] = {"Nalögo"},
["nma"] = {"Maram Naga"},
["nmb"] = {"Big Nambas", "V'ënen Taut"},
["nmc"] = {"Ngam"},
["nmd"] = {"Ndumu"},
["nme"] = {"Mzieme Naga"},
["nmf"] = {"Tangkhul Naga (India)"},
["nmg"] = {"Kwasio"},
["nmh"] = {"Monsang Naga"},
["nmi"] = {"Nyam"},
["nmj"] = {"Ngombe (Central African Republic)"},
["nmk"] = {"Namakura"},
["nml"] = {"Ndemli"},
["nmm"] = {"Manangba"},
["nmn"] = {"ǃXóõ"},
["nmo"] = {"Moyon Naga"},
["nmp"] = {"Nimanbur"},
["nmq"] = {"Nambya"},
["nmr"] = {"Nimbari"},
["nms"] = {"Letemboi"},
["nmt"] = {"Namonuito"},
["nmu"] = {"Northeast Maidu"},
["nmv"] = {"Ngamini"},
["nmw"] = {"Nimoa", "Rifao"},
["nmx"] = {"Nama (Papua New Guinea)"},
["nmy"] = {"Namuyi"},
["nmz"] = {"Nawdm"},
["nna"] = {"Nyangumarta"},
["nnb"] = {"Nande"},
["nnc"] = {"Nancere"},
["nnd"] = {"West Ambae"},
["nne"] = {"Ngandyera"},
["nnf"] = {"Ngaing"},
["nng"] = {"Maring Naga"},
["nnh"] = {"Ngiemboon"},
["nni"] = {"North Nuaulu"},
["nnj"] = {"Nyangatom"},
["nnk"] = {"Nankina"},
["nnl"] = {"Northern Rengma Naga"},
["nnm"] = {"Namia"},
["nnn"] = {"Ngete"},
["nnp"] = {"Wancho Naga"},
["nnq"] = {"Ngindo"},
["nnr"] = {"Narungga"},
["nnt"] = {"Nanticoke"},
["nnu"] = {"Dwang"},
["nnv"] = {"Nugunu (Australia)"},
["nnw"] = {"Southern Nuni"},
["nny"] = {"Nyangga"},
["nnz"] = {"Nda'nda'"},
["noa"] = {"Woun Meu"},
["noc"] = {"Nuk"},
["nod"] = {"Northern Thai"},
["noe"] = {"Nimadi"},
["nof"] = {"Nomane"},
["nog"] = {"Nogai"},
["noh"] = {"Nomu"},
["noi"] = {"Noiri"},
["noj"] = {"Nonuya"},
["nok"] = {"Nooksack", "Lhéchelesem"},
["nol"] = {"Nomlaki"},
["non"] = {"Old Norse"},
["nop"] = {"Numanggang"},
["noq"] = {"Ngongo"},
["nos"] = {"Eastern Nisu"},
["not"] = {"Nomatsiguenga"},
["nou"] = {"Ewage-Notu"},
["nov"] = {"Novial"},
["now"] = {"Nyambo"},
["noy"] = {"Noy"},
["noz"] = {"Nayi"},
["npa"] = {"Nar Phu"},
["npb"] = {"Nupbikha"},
["npg"] = {"Ponyo-Gongwang Naga"},
["nph"] = {"Phom Naga"},
["npi"] = {"Nepali (individual language)"},
["npl"] = {"Southeastern Puebla Nahuatl"},
["npn"] = {"Mondropolon"},
["npo"] = {"Pochuri Naga"},
["nps"] = {"Nipsan"},
["npu"] = {"Puimei Naga"},
["npx"] = {"Noipx"},
["npy"] = {"Napu"},
["nqg"] = {"Southern Nago"},
["nqk"] = {"Kura Ede Nago"},
["nql"] = {"Ngendelengo"},
["nqm"] = {"Ndom"},
["nqn"] = {"Nen"},
["nqo"] = {"N'Ko", "N’Ko"},
["nqq"] = {"Kyan-Karyaw Naga"},
["nqt"] = {"Nteng"},
["nqy"] = {"Akyaung Ari Naga"},
["nra"] = {"Ngom"},
["nrb"] = {"Nara"},
["nrc"] = {"Noric"},
["nre"] = {"Southern Rengma Naga"},
["nrf"] = {"Jèrriais", "Guernésiais", "Sercquiais"},
["nrg"] = {"Narango"},
["nri"] = {"Chokri Naga"},
["nrk"] = {"Ngarla"},
["nrl"] = {"Ngarluma"},
["nrm"] = {"Narom"},
["nrn"] = {"Norn"},
["nrp"] = {"North Picene"},
["nrr"] = {"Norra", "Nora"},
["nrt"] = {"Northern Kalapuya"},
["nru"] = {"Narua"},
["nrx"] = {"Ngurmbur"},
["nrz"] = {"Lala"},
["nsa"] = {"Sangtam Naga"},
["nsb"] = {"Lower Nossob"},
["nsc"] = {"Nshi"},
["nsd"] = {"Southern Nisu"},
["nse"] = {"Nsenga"},
["nsf"] = {"Northwestern Nisu"},
["nsg"] = {"Ngasa"},
["nsh"] = {"Ngoshie"},
["nsi"] = {"Nigerian Sign Language"},
["nsk"] = {"Naskapi"},
["nsl"] = {"Norwegian Sign Language"},
["nsm"] = {"Sumi Naga"},
["nsn"] = {"Nehan"},
["nso"] = {"Pedi", "Northern Sotho", "Sepedi"},
["nsp"] = {"Nepalese Sign Language"},
["nsq"] = {"Northern Sierra Miwok"},
["nsr"] = {"Maritime Sign Language"},
["nss"] = {"Nali"},
["nst"] = {"Tase Naga"},
["nsu"] = {"Sierra Negra Nahuatl"},
["nsv"] = {"Southwestern Nisu"},
["nsw"] = {"Navut"},
["nsx"] = {"Nsongo"},
["nsy"] = {"Nasal"},
["nsz"] = {"Nisenan"},
["ntd"] = {"Northern Tidung"},
["ntg"] = {"Ngantangarra"},
["nti"] = {"Natioro"},
["ntj"] = {"Ngaanyatjarra"},
["ntk"] = {"Ikoma-Nata-Isenye"},
["ntm"] = {"Nateni"},
["nto"] = {"Ntomba"},
["ntp"] = {"Northern Tepehuan"},
["ntr"] = {"Delo"},
["ntu"] = {"Natügu"},
["ntw"] = {"Nottoway"},
["ntx"] = {"Tangkhul Naga (Myanmar)"},
["nty"] = {"Mantsi"},
["ntz"] = {"Natanzi"},
["nua"] = {"Yuanga"},
["nub"] = {"Nubian languages"},
["nuc"] = {"Nukuini"},
["nud"] = {"Ngala"},
["nue"] = {"Ngundu"},
["nuf"] = {"Nusu"},
["nug"] = {"Nungali"},
["nuh"] = {"Ndunda"},
["nui"] = {"Ngumbi"},
["nuj"] = {"Nyole"},
["nuk"] = {"Nuu-chah-nulth", "Nuuchahnulth"},
["nul"] = {"Nusa Laut"},
["num"] = {"Niuafo'ou"},
["nun"] = {"Anong"},
["nuo"] = {"Nguôn"},
["nup"] = {"Nupe-Nupe-Tako"},
["nuq"] = {"Nukumanu"},
["nur"] = {"Nukuria"},
["nus"] = {"Nuer"},
["nut"] = {"Nung (Viet Nam)"},
["nuu"] = {"Ngbundu"},
["nuv"] = {"Northern Nuni"},
["nuw"] = {"Nguluwan"},
["nux"] = {"Mehek"},
["nuy"] = {"Nunggubuyu"},
["nuz"] = {"Tlamacazapa Nahuatl"},
["nvh"] = {"Nasarian"},
["nvm"] = {"Namiae"},
["nvo"] = {"Nyokon"},
["nwa"] = {"Nawathinehena"},
["nwb"] = {"Nyabwa"},
["nwc"] = {"Classical Newari", "Classical Nepal Bhasa", "Old Newari"},
["nwe"] = {"Ngwe"},
["nwg"] = {"Ngayawung"},
["nwi"] = {"Southwest Tanna"},
["nwm"] = {"Nyamusa-Molo"},
["nwo"] = {"Nauo"},
["nwr"] = {"Nawaru"},
["nww"] = {"Ndwewe"},
["nwx"] = {"Middle Newar"},
["nwy"] = {"Nottoway-Meherrin"},
["nxa"] = {"Nauete"},
["nxd"] = {"Ngando (Democratic Republic of Congo)"},
["nxe"] = {"Nage"},
["nxg"] = {"Ngad'a"},
["nxi"] = {"Nindi"},
["nxk"] = {"Koki Naga"},
["nxl"] = {"South Nuaulu"},
["nxm"] = {"Numidian"},
["nxn"] = {"Ngawun"},
["nxo"] = {"Ndambomo"},
["nxq"] = {"Naxi"},
["nxr"] = {"Ninggerum"},
["nxx"] = {"Nafri"},
["nyb"] = {"Nyangbo"},
["nyc"] = {"Nyanga-li"},
["nyd"] = {"Nyore", "Olunyole"},
["nye"] = {"Nyengo"},
["nyf"] = {"Giryama", "Kigiryama"},
["nyg"] = {"Nyindu"},
["nyh"] = {"Nyikina"},
["nyi"] = {"Ama (Sudan)"},
["nyj"] = {"Nyanga"},
["nyk"] = {"Nyaneka"},
["nyl"] = {"Nyeu"},
["nym"] = {"Nyamwezi"},
["nyn"] = {"Nyankole"},
["nyo"] = {"Nyoro"},
["nyp"] = {"Nyang'i"},
["nyq"] = {"Nayini"},
["nyr"] = {"Nyiha (Malawi)"},
["nys"] = {"Nyungar"},
["nyt"] = {"Nyawaygi"},
["nyu"] = {"Nyungwe"},
["nyv"] = {"Nyulnyul"},
["nyw"] = {"Nyaw"},
["nyx"] = {"Nganyaywana"},
["nyy"] = {"Nyakyusa-Ngonde"},
["nza"] = {"Tigon Mbembe"},
["nzb"] = {"Njebi"},
["nzd"] = {"Nzadi"},
["nzi"] = {"Nzima"},
["nzk"] = {"Nzakara"},
["nzm"] = {"Zeme Naga"},
["nzr"] = {"Dir-Nyamzak-Mbarimi"},
["nzs"] = {"New Zealand Sign Language"},
["nzu"] = {"Teke-Nzikou"},
["nzy"] = {"Nzakambay"},
["nzz"] = {"Nanga Dama Dogon"},
["oaa"] = {"Orok"},
["oac"] = {"Oroch"},
["oak"] = {"Noakhali", "Noakhailla"},
["oar"] = {"Old Aramaic (up to 700 BCE)", "Ancient Aramaic (up to 700 BCE)"},
["oav"] = {"Old Avar"},
["obi"] = {"Obispeño"},
["obk"] = {"Southern Bontok"},
["obl"] = {"Oblo"},
["obm"] = {"Moabite"},
["obo"] = {"Obo Manobo"},
["obr"] = {"Old Burmese"},
["obt"] = {"Old Breton"},
["obu"] = {"Obulom"},
["oca"] = {"Ocaina"},
["och"] = {"Old Chinese"},
["ocm"] = {"Old Cham"},
["oco"] = {"Old Cornish"},
["ocu"] = {"Atzingo Matlatzinca"},
["oda"] = {"Odut"},
["odk"] = {"Od"},
["odt"] = {"Old Dutch"},
["odu"] = {"Odual"},
["ofo"] = {"Ofo"},
["ofs"] = {"Old Frisian"},
["ofu"] = {"Efutop"},
["ogb"] = {"Ogbia"},
["ogc"] = {"Ogbah"},
["oge"] = {"Old Georgian"},
["ogg"] = {"Ogbogolo"},
["ogo"] = {"Khana"},
["ogu"] = {"Ogbronuagum"},
["oht"] = {"Old Hittite"},
["ohu"] = {"Old Hungarian"},
["oia"] = {"Oirata"},
["oie"] = {"Okolie"},
["oin"] = {"Inebu One"},
["ojb"] = {"Northwestern Ojibwa"},
["ojc"] = {"Central Ojibwa"},
["ojg"] = {"Eastern Ojibwa"},
["ojp"] = {"Old Japanese"},
["ojs"] = {"Severn Ojibwa"},
["ojv"] = {"Ontong Java"},
["ojw"] = {"Western Ojibwa"},
["oka"] = {"Okanagan"},
["okb"] = {"Okobo"},
["okc"] = {"Kobo"},
["okd"] = {"Okodia"},
["oke"] = {"Okpe (Southwestern Edo)"},
["okg"] = {"Koko Babangk"},
["okh"] = {"Koresh-e Rostam"},
["oki"] = {"Okiek"},
["okj"] = {"Oko-Juwoi"},
["okk"] = {"Kwamtim One"},
["okl"] = {"Old Kentish Sign Language"},
["okm"] = {"Middle Korean (10th-16th cent.)"},
["okn"] = {"Oki-No-Erabu"},
["oko"] = {"Old Korean (3rd-9th cent.)"},
["okr"] = {"Kirike"},
["oks"] = {"Oko-Eni-Osayen"},
["oku"] = {"Oku"},
["okv"] = {"Orokaiva"},
["okx"] = {"Okpe (Northwestern Edo)"},
["okz"] = {"Old Khmer"},
["ola"] = {"Walungge"},
["olb"] = {"Oli-Bodiman"},
["old"] = {"Mochi"},
["ole"] = {"Olekha"},
["olk"] = {"Olkol"},
["olm"] = {"Oloma"},
["olo"] = {"Livvi"},
["olr"] = {"Olrat"},
["olt"] = {"Old Lithuanian"},
["olu"] = {"Kuvale"},
["oma"] = {"Omaha-Ponca"},
["omb"] = {"East Ambae"},
["omc"] = {"Mochica"},
["omg"] = {"Omagua"},
["omi"] = {"Omi"},
["omk"] = {"Omok"},
["oml"] = {"Ombo"},
["omn"] = {"Minoan"},
["omo"] = {"Utarmbung"},
["omp"] = {"Old Manipuri"},
["omq"] = {"Oto-Manguean languages"},
["omr"] = {"Old Marathi"},
["omt"] = {"Omotik"},
["omu"] = {"Omurano"},
["omv"] = {"Omotic languages"},
["omw"] = {"South Tairora"},
["omx"] = {"Old Mon"},
["omy"] = {"Old Malay"},
["ona"] = {"Ona"},
["onb"] = {"Lingao"},
["one"] = {"Oneida"},
["ong"] = {"Olo"},
["oni"] = {"Onin"},
["onj"] = {"Onjob"},
["onk"] = {"Kabore One"},
["onn"] = {"Onobasulu"},
["ono"] = {"Onondaga"},
["onp"] = {"Sartang"},
["onr"] = {"Northern One"},
["ons"] = {"Ono"},
["ont"] = {"Ontenu"},
["onu"] = {"Unua"},
["onw"] = {"Old Nubian"},
["onx"] = {"Onin Based Pidgin"},
["ood"] = {"Tohono O'odham"},
["oog"] = {"Ong"},
["oon"] = {"Önge"},
["oor"] = {"Oorlams"},
["oos"] = {"Old Ossetic"},
["opa"] = {"Okpamheri"},
["opk"] = {"Kopkaka"},
["opm"] = {"Oksapmin"},
["opo"] = {"Opao"},
["opt"] = {"Opata"},
["opy"] = {"Ofayé"},
["ora"] = {"Oroha"},
["orc"] = {"Orma"},
["ore"] = {"Orejón"},
["org"] = {"Oring"},
["orh"] = {"Oroqen"},
["orn"] = {"Orang Kanaq"},
["oro"] = {"Orokolo"},
["orr"] = {"Oruma"},
["ors"] = {"Orang Seletar"},
["ort"] = {"Adivasi Oriya"},
["oru"] = {"Ormuri"},
["orv"] = {"Old Russian"},
["orw"] = {"Oro Win"},
["orx"] = {"Oro"},
["ory"] = {"Odia (individual language)", "Oriya (individual language)"},
["orz"] = {"Ormu"},
["osa"] = {"Osage"},
["osc"] = {"Oscan"},
["osd"] = {"Digor Ossetic", "Digor", "Digor Ossetian"},
["osi"] = {"Osing"},
["osn"] = {"Old Sundanese"},
["oso"] = {"Ososo"},
["osp"] = {"Old Spanish"},
["ost"] = {"Osatu"},
["osu"] = {"Southern One"},
["osx"] = {"Old Saxon"},
["ota"] = {"Ottoman Turkish (1500-1928)"},
["otb"] = {"Old Tibetan"},
["otd"] = {"Ot Danum"},
["ote"] = {"Mezquital Otomi"},
["oti"] = {"Oti"},
["otk"] = {"Old Turkish"},
["otl"] = {"Tilapa Otomi"},
["otm"] = {"Eastern Highland Otomi"},
["otn"] = {"Tenango Otomi"},
["oto"] = {"Otomian languages"},
["otq"] = {"Querétaro Otomi"},
["otr"] = {"Otoro"},
["ots"] = {"Estado de México Otomi"},
["ott"] = {"Temoaya Otomi"},
["otu"] = {"Otuke"},
["otw"] = {"Ottawa"},
["otx"] = {"Texcatepec Otomi"},
["oty"] = {"Old Tamil"},
["otz"] = {"Ixtenco Otomi"},
["oua"] = {"Tagargrent"},
["oub"] = {"Glio-Oubi"},
["oue"] = {"Oune"},
["oui"] = {"Old Uighur"},
["oum"] = {"Ouma"},
["ovd"] = {"Elfdalian", "Övdalian"},
["owi"] = {"Owiniga"},
["owl"] = {"Old Welsh"},
["oyb"] = {"Oy"},
["oyd"] = {"Oyda"},
["oym"] = {"Wayampi"},
["oyy"] = {"Oya'oya"},
["ozm"] = {"Koonzime"},
["paa"] = {"Papuan languages"},
["pab"] = {"Parecís"},
["pac"] = {"Pacoh"},
["pad"] = {"Paumarí"},
["pae"] = {"Pagibete"},
["paf"] = {"Paranawát"},
["pag"] = {"Pangasinan"},
["pah"] = {"Tenharim"},
["pai"] = {"Pe"},
["pak"] = {"Parakanã"},
["pal"] = {"Pahlavi"},
["pam"] = {"Pampanga", "Kapampangan"},
["pao"] = {"Northern Paiute"},
["pap"] = {"Papiamento"},
["paq"] = {"Parya"},
["par"] = {"Panamint", "Timbisha"},
["pas"] = {"Papasena"},
["pau"] = {"Palauan"},
["pav"] = {"Pakaásnovos"},
["paw"] = {"Pawnee"},
["pax"] = {"Pankararé"},
["pay"] = {"Pech"},
["paz"] = {"Pankararú"},
["pbb"] = {"Páez"},
["pbc"] = {"Patamona"},
["pbe"] = {"Mezontla Popoloca"},
["pbf"] = {"Coyotepec Popoloca"},
["pbg"] = {"Paraujano"},
["pbh"] = {"E'ñapa Woromaipu"},
["pbi"] = {"Parkwa"},
["pbl"] = {"Mak (Nigeria)"},
["pbm"] = {"Puebla Mazatec"},
["pbn"] = {"Kpasam"},
["pbo"] = {"Papel"},
["pbp"] = {"Badyara"},
["pbr"] = {"Pangwa"},
["pbs"] = {"Central Pame"},
["pbt"] = {"Southern Pashto"},
["pbu"] = {"Northern Pashto"},
["pbv"] = {"Pnar"},
["pby"] = {"Pyu (Papua New Guinea)"},
["pca"] = {"Santa Inés Ahuatempan Popoloca"},
["pcb"] = {"Pear"},
["pcc"] = {"Bouyei"},
["pcd"] = {"Picard"},
["pce"] = {"Ruching Palaung"},
["pcf"] = {"Paliyan"},
["pcg"] = {"Paniya"},
["pch"] = {"Pardhan"},
["pci"] = {"Duruwa"},
["pcj"] = {"Parenga"},
["pck"] = {"Paite Chin"},
["pcl"] = {"Pardhi"},
["pcm"] = {"Nigerian Pidgin"},
["pcn"] = {"Piti"},
["pcp"] = {"Pacahuara"},
["pcw"] = {"Pyapun"},
["pda"] = {"Anam"},
["pdc"] = {"Pennsylvania German"},
["pdi"] = {"Pa Di"},
["pdn"] = {"Podena", "Fedan"},
["pdo"] = {"Padoe"},
["pdt"] = {"Plautdietsch"},
["pdu"] = {"Kayan"},
["pea"] = {"Peranakan Indonesian"},
["peb"] = {"Eastern Pomo"},
["ped"] = {"Mala (Papua New Guinea)"},
["pee"] = {"Taje"},
["pef"] = {"Northeastern Pomo"},
["peg"] = {"Pengo"},
["peh"] = {"Bonan"},
["pei"] = {"Chichimeca-Jonaz"},
["pej"] = {"Northern Pomo"},
["pek"] = {"Penchal"},
["pel"] = {"Pekal"},
["pem"] = {"Phende"},
["peo"] = {"Old Persian (ca. 600-400 B.C.)"},
["pep"] = {"Kunja"},
["peq"] = {"Southern Pomo"},
["pes"] = {"Iranian Persian"},
["pev"] = {"Pémono"},
["pex"] = {"Petats"},
["pey"] = {"Petjo"},
["pez"] = {"Eastern Penan"},
["pfa"] = {"Pááfang"},
["pfe"] = {"Pere"},
["pfl"] = {"Pfaelzisch"},
["pga"] = {"Sudanese Creole Arabic"},
["pgd"] = {"Gāndhārī"},
["pgg"] = {"Pangwali"},
["pgi"] = {"Pagi"},
["pgk"] = {"Rerep"},
["pgl"] = {"Primitive Irish"},
["pgn"] = {"Paelignian"},
["pgs"] = {"Pangseng"},
["pgu"] = {"Pagu"},
["pgz"] = {"Papua New Guinean Sign Language"},
["pha"] = {"Pa-Hng"},
["phd"] = {"Phudagi"},
["phg"] = {"Phuong"},
["phh"] = {"Phukha"},
["phi"] = {"Philippine languages"},
["phj"] = {"Pahari"},
["phk"] = {"Phake"},
["phl"] = {"Phalura", "Palula"},
["phm"] = {"Phimbi"},
["phn"] = {"Phoenician"},
["pho"] = {"Phunoi"},
["phq"] = {"Phana'"},
["phr"] = {"Pahari-Potwari"},
["pht"] = {"Phu Thai"},
["phu"] = {"Phuan"},
["phv"] = {"Pahlavani"},
["phw"] = {"Phangduwali"},
["pia"] = {"Pima Bajo"},
["pib"] = {"Yine"},
["pic"] = {"Pinji"},
["pid"] = {"Piaroa"},
["pie"] = {"Piro"},
["pif"] = {"Pingelapese"},
["pig"] = {"Pisabo"},
["pih"] = {"Pitcairn-Norfolk"},
["pij"] = {"Pijao"},
["pil"] = {"Yom"},
["pim"] = {"Powhatan"},
["pin"] = {"Piame"},
["pio"] = {"Piapoco"},
["pip"] = {"Pero"},
["pir"] = {"Piratapuyo"},
["pis"] = {"Pijin"},
["pit"] = {"Pitta Pitta"},
["piu"] = {"Pintupi-Luritja"},
["piv"] = {"Pileni", "Vaeakau-Taumako"},
["piw"] = {"Pimbwe"},
["pix"] = {"Piu"},
["piy"] = {"Piya-Kwonci"},
["piz"] = {"Pije"},
["pjt"] = {"Pitjantjatjara"},
["pka"] = {"Ardhamāgadhī Prākrit"},
["pkb"] = {"Pokomo", "Kipfokomo"},
["pkc"] = {"Paekche"},
["pkg"] = {"Pak-Tong"},
["pkh"] = {"Pankhu"},
["pkn"] = {"Pakanha"},
["pko"] = {"Pökoot"},
["pkp"] = {"Pukapuka"},
["pkr"] = {"Attapady Kurumba"},
["pks"] = {"Pakistan Sign Language"},
["pkt"] = {"Maleng"},
["pku"] = {"Paku"},
["pla"] = {"Miani"},
["plb"] = {"Polonombauk"},
["plc"] = {"Central Palawano"},
["pld"] = {"Polari"},
["ple"] = {"Palu'e"},
["plf"] = {"Central Malayo-Polynesian languages"},
["plg"] = {"Pilagá"},
["plh"] = {"Paulohi"},
["plk"] = {"Kohistani Shina"},
["pll"] = {"Shwe Palaung"},
["pln"] = {"Palenquero"},
["plo"] = {"Oluta Popoluca"},
["plq"] = {"Palaic"},
["plr"] = {"Palaka Senoufo"},
["pls"] = {"San Marcos Tlacoyalco Popoloca", "San Marcos Tlalcoyalco Popoloca"},
["plt"] = {"Plateau Malagasy"},
["plu"] = {"Palikúr"},
["plv"] = {"Southwest Palawano"},
["plw"] = {"Brooke's Point Palawano"},
["ply"] = {"Bolyu"},
["plz"] = {"Paluan"},
["pma"] = {"Paama"},
["pmb"] = {"Pambia"},
["pmd"] = {"Pallanganmiddang"},
["pme"] = {"Pwaamei"},
["pmf"] = {"Pamona"},
["pmh"] = {"Māhārāṣṭri Prākrit"},
["pmi"] = {"Northern Pumi"},
["pmj"] = {"Southern Pumi"},
["pml"] = {"Lingua Franca"},
["pmm"] = {"Pomo"},
["pmn"] = {"Pam"},
["pmo"] = {"Pom"},
["pmq"] = {"Northern Pame"},
["pmr"] = {"Paynamar"},
["pms"] = {"Piemontese"},
["pmt"] = {"Tuamotuan"},
["pmw"] = {"Plains Miwok"},
["pmx"] = {"Poumei Naga"},
["pmy"] = {"Papuan Malay"},
["pmz"] = {"Southern Pame"},
["pna"] = {"Punan Bah-Biau"},
["pnb"] = {"Western Panjabi"},
["pnc"] = {"Pannei"},
["pnd"] = {"Mpinda"},
["pne"] = {"Western Penan"},
["png"] = {"Pangu", "Pongu"},
["pnh"] = {"Penrhyn"},
["pni"] = {"Aoheng"},
["pnj"] = {"Pinjarup"},
["pnk"] = {"Paunaka"},
["pnl"] = {"Paleni"},
["pnm"] = {"Punan Batu 1"},
["pnn"] = {"Pinai-Hagahai"},
["pno"] = {"Panobo"},
["pnp"] = {"Pancana"},
["pnq"] = {"Pana (Burkina Faso)"},
["pnr"] = {"Panim"},
["pns"] = {"Ponosakan"},
["pnt"] = {"Pontic"},
["pnu"] = {"Jiongnai Bunu"},
["pnv"] = {"Pinigura"},
["pnw"] = {"Banyjima", "Panytyima"},
["pnx"] = {"Phong-Kniang"},
["pny"] = {"Pinyin"},
["pnz"] = {"Pana (Central African Republic)"},
["poc"] = {"Poqomam"},
["poe"] = {"San Juan Atzingo Popoloca"},
["pof"] = {"Poke"},
["pog"] = {"Potiguára"},
["poh"] = {"Poqomchi'"},
["poi"] = {"Highland Popoluca"},
["pok"] = {"Pokangá"},
["pom"] = {"Southeastern Pomo"},
["pon"] = {"Pohnpeian"},
["poo"] = {"Central Pomo"},
["pop"] = {"Pwapwâ"},
["poq"] = {"Texistepec Popoluca"},
["pos"] = {"Sayula Popoluca"},
["pot"] = {"Potawatomi"},
["pov"] = {"Upper Guinea Crioulo"},
["pow"] = {"San Felipe Otlaltepec Popoloca"},
["pox"] = {"Polabian"},
["poy"] = {"Pogolo"},
["poz"] = {"Malayo-Polynesian languages"},
["ppe"] = {"Papi"},
["ppi"] = {"Paipai"},
["ppk"] = {"Uma"},
["ppl"] = {"Pipil", "Nicarao"},
["ppm"] = {"Papuma"},
["ppn"] = {"Papapana"},
["ppo"] = {"Folopa"},
["ppp"] = {"Pelende"},
["ppq"] = {"Pei"},
["pps"] = {"San Luís Temalacayuca Popoloca"},
["ppt"] = {"Pare"},
["ppu"] = {"Papora"},
["pqa"] = {"Pa'a"},
["pqe"] = {"Eastern Malayo-Polynesian languages"},
["pqm"] = {"Malecite-Passamaquoddy"},
["pqw"] = {"Western Malayo-Polynesian languages"},
["pra"] = {"Prakrit languages"},
["prc"] = {"Parachi"},
["prd"] = {"Parsi-Dari"},
["pre"] = {"Principense"},
["prf"] = {"Paranan"},
["prg"] = {"Prussian"},
["prh"] = {"Porohanon"},
["pri"] = {"Paicî"},
["prk"] = {"Parauk"},
["prl"] = {"Peruvian Sign Language"},
["prm"] = {"Kibiri"},
["prn"] = {"Prasuni"},
["pro"] = {"Old Provençal (to 1500)", "Old Occitan (to 1500)"},
["prq"] = {"Ashéninka Perené"},
["prr"] = {"Puri"},
["prs"] = {"Dari", "Afghan Persian"},
["prt"] = {"Phai"},
["pru"] = {"Puragi"},
["prw"] = {"Parawen"},
["prx"] = {"Purik"},
["prz"] = {"Providencia Sign Language"},
["psa"] = {"Asue Awyu"},
["psc"] = {"Iranian Sign Language", "Persian Sign Language"},
["psd"] = {"Plains Indian Sign Language"},
["pse"] = {"Central Malay"},
["psg"] = {"Penang Sign Language"},
["psh"] = {"Southwest Pashai", "Southwest Pashayi"},
["psi"] = {"Southeast Pashai", "Southeast Pashayi"},
["psl"] = {"Puerto Rican Sign Language"},
["psm"] = {"Pauserna"},
["psn"] = {"Panasuan"},
["pso"] = {"Polish Sign Language"},
["psp"] = {"Philippine Sign Language"},
["psq"] = {"Pasi"},
["psr"] = {"Portuguese Sign Language"},
["pss"] = {"Kaulong"},
["pst"] = {"Central Pashto"},
["psu"] = {"Sauraseni Prākrit"},
["psw"] = {"Port Sandwich"},
["psy"] = {"Piscataway"},
["pta"] = {"Pai Tavytera"},
["pth"] = {"Pataxó Hã-Ha-Hãe"},
["pti"] = {"Pindiini", "Wangkatha"},
["ptn"] = {"Patani"},
["pto"] = {"Zo'é"},
["ptp"] = {"Patep"},
["ptq"] = {"Pattapu"},
["ptr"] = {"Piamatsina"},
["ptt"] = {"Enrekang"},
["ptu"] = {"Bambam"},
["ptv"] = {"Port Vato"},
["ptw"] = {"Pentlatch"},
["pty"] = {"Pathiya"},
["pua"] = {"Western Highland Purepecha"},
["pub"] = {"Purum"},
["puc"] = {"Punan Merap"},
["pud"] = {"Punan Aput"},
["pue"] = {"Puelche"},
["puf"] = {"Punan Merah"},
["pug"] = {"Phuie"},
["pui"] = {"Puinave"},
["puj"] = {"Punan Tubu"},
["pum"] = {"Puma"},
["puo"] = {"Puoc"},
["pup"] = {"Pulabu"},
["puq"] = {"Puquina"},
["pur"] = {"Puruborá"},
["put"] = {"Putoh"},
["puu"] = {"Punu"},
["puw"] = {"Puluwatese"},
["pux"] = {"Puare"},
["puy"] = {"Purisimeño"},
["pwa"] = {"Pawaia"},
["pwb"] = {"Panawa"},
["pwg"] = {"Gapapaiwa"},
["pwi"] = {"Patwin"},
["pwm"] = {"Molbog"},
["pwn"] = {"Paiwan"},
["pwo"] = {"Pwo Western Karen"},
["pwr"] = {"Powari"},
["pww"] = {"Pwo Northern Karen"},
["pxm"] = {"Quetzaltepec Mixe"},
["pye"] = {"Pye Krumen"},
["pym"] = {"Fyam"},
["pyn"] = {"Poyanáwa"},
["pys"] = {"Paraguayan Sign Language", "Lengua de Señas del Paraguay"},
["pyu"] = {"Puyuma"},
["pyx"] = {"Pyu (Myanmar)"},
["pyy"] = {"Pyen"},
["pze"] = {"Pesse"},
["pzh"] = {"Pazeh"},
["pzn"] = {"Jejara Naga", "Para Naga"},
["qua"] = {"Quapaw"},
["qub"] = {"Huallaga Huánuco Quechua"},
["quc"] = {"K'iche'", "Quiché"},
["qud"] = {"Calderón Highland Quichua"},
["quf"] = {"Lambayeque Quechua"},
["qug"] = {"Chimborazo Highland Quichua"},
["quh"] = {"South Bolivian Quechua"},
["qui"] = {"Quileute"},
["quk"] = {"Chachapoyas Quechua"},
["qul"] = {"North Bolivian Quechua"},
["qum"] = {"Sipacapense"},
["qun"] = {"Quinault"},
["qup"] = {"Southern Pastaza Quechua"},
["quq"] = {"Quinqui"},
["qur"] = {"Yanahuanca Pasco Quechua"},
["qus"] = {"Santiago del Estero Quichua"},
["quv"] = {"Sacapulteco"},
["quw"] = {"Tena Lowland Quichua"},
["qux"] = {"Yauyos Quechua"},
["quy"] = {"Ayacucho Quechua"},
["quz"] = {"Cusco Quechua"},
["qva"] = {"Ambo-Pasco Quechua"},
["qvc"] = {"Cajamarca Quechua"},
["qve"] = {"Eastern Apurímac Quechua"},
["qvh"] = {"Huamalíes-Dos de Mayo Huánuco Quechua"},
["qvi"] = {"Imbabura Highland Quichua"},
["qvj"] = {"Loja Highland Quichua"},
["qvl"] = {"Cajatambo North Lima Quechua"},
["qvm"] = {"Margos-Yarowilca-Lauricocha Quechua"},
["qvn"] = {"North Junín Quechua"},
["qvo"] = {"Napo Lowland Quechua"},
["qvp"] = {"Pacaraos Quechua"},
["qvs"] = {"San Martín Quechua"},
["qvw"] = {"Huaylla Wanca Quechua"},
["qvy"] = {"Queyu"},
["qvz"] = {"Northern Pastaza Quichua"},
["qwa"] = {"Corongo Ancash Quechua"},
["qwc"] = {"Classical Quechua"},
["qwe"] = {"Quechuan (family)"},
["qwh"] = {"Huaylas Ancash Quechua"},
["qwm"] = {"Kuman (Russia)"},
["qws"] = {"Sihuas Ancash Quechua"},
["qwt"] = {"Kwalhioqua-Tlatskanai"},
["qxa"] = {"Chiquián Ancash Quechua"},
["qxc"] = {"Chincha Quechua"},
["qxh"] = {"Panao Huánuco Quechua"},
["qxl"] = {"Salasaca Highland Quichua"},
["qxn"] = {"Northern Conchucos Ancash Quechua"},
["qxo"] = {"Southern Conchucos Ancash Quechua"},
["qxp"] = {"Puno Quechua"},
["qxq"] = {"Qashqa'i"},
["qxr"] = {"Cañar Highland Quichua"},
["qxs"] = {"Southern Qiang"},
["qxt"] = {"Santa Ana de Tusi Pasco Quechua"},
["qxu"] = {"Arequipa-La Unión Quechua"},
["qxw"] = {"Jauja Wanca Quechua"},
["qya"] = {"Quenya"},
["qyp"] = {"Quiripi"},
["raa"] = {"Dungmali"},
["rab"] = {"Camling"},
["rac"] = {"Rasawa"},
["rad"] = {"Rade"},
["raf"] = {"Western Meohang"},
["rag"] = {"Logooli", "Lulogooli"},
["rah"] = {"Rabha"},
["rai"] = {"Ramoaaina"},
["raj"] = {"Rajasthani"},
["rak"] = {"Tulu-Bohuai"},
["ral"] = {"Ralte"},
["ram"] = {"Canela"},
["ran"] = {"Riantana"},
["rao"] = {"Rao"},
["rap"] = {"Rapanui"},
["raq"] = {"Saam"},
["rar"] = {"Rarotongan", "Cook Islands Maori"},
["ras"] = {"Tegali"},
["rat"] = {"Razajerdi"},
["rau"] = {"Raute"},
["rav"] = {"Sampang"},
["raw"] = {"Rawang"},
["rax"] = {"Rang"},
["ray"] = {"Rapa"},
["raz"] = {"Rahambuu"},
["rbb"] = {"Rumai Palaung"},
["rbk"] = {"Northern Bontok"},
["rbl"] = {"Miraya Bikol"},
["rbp"] = {"Barababaraba"},
["rcf"] = {"Réunion Creole French"},
["rdb"] = {"Rudbari"},
["rea"] = {"Rerau"},
["reb"] = {"Rembong"},
["ree"] = {"Rejang Kayan"},
["reg"] = {"Kara (Tanzania)"},
["rei"] = {"Reli"},
["rej"] = {"Rejang"},
["rel"] = {"Rendille"},
["rem"] = {"Remo"},
["ren"] = {"Rengao"},
["rer"] = {"Rer Bare"},
["res"] = {"Reshe"},
["ret"] = {"Retta"},
["rey"] = {"Reyesano"},
["rga"] = {"Roria"},
["rge"] = {"Romano-Greek"},
["rgk"] = {"Rangkas"},
["rgn"] = {"Romagnol"},
["rgr"] = {"Resígaro"},
["rgs"] = {"Southern Roglai"},
["rgu"] = {"Ringgou"},
["rhg"] = {"Rohingya"},
["rhp"] = {"Yahang"},
["ria"] = {"Riang (India)"},
["rib"] = {"Bribri Sign Language"},
["rif"] = {"Tarifit"},
["ril"] = {"Riang Lang", "Riang (Myanmar)"},
["rim"] = {"Nyaturu"},
["rin"] = {"Nungu"},
["rir"] = {"Ribun"},
["rit"] = {"Ritharrngu"},
["riu"] = {"Riung"},
["rjg"] = {"Rajong"},
["rji"] = {"Raji"},
["rjs"] = {"Rajbanshi"},
["rka"] = {"Kraol"},
["rkb"] = {"Rikbaktsa"},
["rkh"] = {"Rakahanga-Manihiki"},
["rki"] = {"Rakhine"},
["rkm"] = {"Marka"},
["rkt"] = {"Rangpuri", "Kamta"},
["rkw"] = {"Arakwal"},
["rma"] = {"Rama"},
["rmb"] = {"Rembarrnga"},
["rmc"] = {"Carpathian Romani"},
["rmd"] = {"Traveller Danish"},
["rme"] = {"Angloromani"},
["rmf"] = {"Kalo Finnish Romani"},
["rmg"] = {"Traveller Norwegian"},
["rmh"] = {"Murkim"},
["rmi"] = {"Lomavren"},
["rmk"] = {"Romkun"},
["rml"] = {"Baltic Romani"},
["rmm"] = {"Roma"},
["rmn"] = {"Balkan Romani"},
["rmo"] = {"Sinte Romani"},
["rmp"] = {"Rempi"},
["rmq"] = {"Caló"},
["rms"] = {"Romanian Sign Language"},
["rmt"] = {"Domari"},
["rmu"] = {"Tavringer Romani"},
["rmv"] = {"Romanova"},
["rmw"] = {"Welsh Romani"},
["rmx"] = {"Romam"},
["rmy"] = {"Vlax Romani"},
["rmz"] = {"Marma"},
["rnb"] = {"Brunca Sign Language"},
["rnd"] = {"Ruund"},
["rng"] = {"Ronga"},
["rnl"] = {"Ranglong"},
["rnn"] = {"Roon"},
["rnp"] = {"Rongpo"},
["rnr"] = {"Nari Nari"},
["rnw"] = {"Rungwa"},
["roa"] = {"Romance languages"},
["rob"] = {"Tae'"},
["roc"] = {"Cacgia Roglai"},
["rod"] = {"Rogo"},
["roe"] = {"Ronji"},
["rof"] = {"Rombo"},
["rog"] = {"Northern Roglai"},
["rol"] = {"Romblomanon"},
["rom"] = {"Romany"},
["roo"] = {"Rotokas"},
["rop"] = {"Kriol"},
["ror"] = {"Rongga"},
["rou"] = {"Runga"},
["row"] = {"Dela-Oenale"},
["rpn"] = {"Repanbitip"},
["rpt"] = {"Rapting"},
["rri"] = {"Ririo"},
["rrm"] = {"Moriori"},
["rro"] = {"Waima"},
["rrt"] = {"Arritinngithigh"},
["rsb"] = {"Romano-Serbian"},
["rsk"] = {"Ruthenian", "Rusnak"},
["rsl"] = {"Russian Sign Language"},
["rsm"] = {"Miriwoong Sign Language"},
["rsn"] = {"Rwandan Sign Language"},
["rsw"] = {"Rishiwa"},
["rtc"] = {"Rungtu Chin"},
["rth"] = {"Ratahan"},
["rtm"] = {"Rotuman"},
["rts"] = {"Yurats"},
["rtw"] = {"Rathawi"},
["rub"] = {"Gungu"},
["ruc"] = {"Ruuli"},
["rue"] = {"Rusyn"},
["ruf"] = {"Luguru"},
["rug"] = {"Roviana"},
["ruh"] = {"Ruga"},
["rui"] = {"Rufiji"},
["ruk"] = {"Che"},
["ruo"] = {"Istro Romanian"},
["rup"] = {"Macedo-Romanian", "Aromanian", "Arumanian"},
["ruq"] = {"Megleno Romanian"},
["rut"] = {"Rutul"},
["ruu"] = {"Lanas Lobu"},
["ruy"] = {"Mala (Nigeria)"},
["ruz"] = {"Ruma"},
["rwa"] = {"Rawo"},
["rwk"] = {"Rwa"},
["rwl"] = {"Ruwila"},
["rwm"] = {"Amba (Uganda)"},
["rwo"] = {"Rawa"},
["rwr"] = {"Marwari (India)"},
["rxd"] = {"Ngardi"},
["rxw"] = {"Karuwali", "Garuwali"},
["ryn"] = {"Northern Amami-Oshima"},
["rys"] = {"Yaeyama"},
["ryu"] = {"Central Okinawan"},
["rzh"] = {"Rāziḥī"},
["saa"] = {"Saba"},
["sab"] = {"Buglere"},
["sac"] = {"Meskwaki"},
["sad"] = {"Sandawe"},
["sae"] = {"Sabanê"},
["saf"] = {"Safaliba"},
["sah"] = {"Yakut"},
["sai"] = {"South American Indian languages"},
["saj"] = {"Sahu"},
["sak"] = {"Sake"},
["sal"] = {"Salishan languages"},
["sam"] = {"Samaritan Aramaic"},
["sao"] = {"Sause"},
["saq"] = {"Samburu"},
["sar"] = {"Saraveca"},
["sas"] = {"Sasak"},
["sat"] = {"Santali"},
["sau"] = {"Saleman"},
["sav"] = {"Saafi-Saafi"},
["saw"] = {"Sawi"},
["sax"] = {"Sa"},
["say"] = {"Saya"},
["saz"] = {"Saurashtra"},
["sba"] = {"Ngambay"},
["sbb"] = {"Simbo"},
["sbc"] = {"Kele (Papua New Guinea)"},
["sbd"] = {"Southern Samo"},
["sbe"] = {"Saliba"},
["sbf"] = {"Chabu", "Shabo"},
["sbg"] = {"Seget"},
["sbh"] = {"Sori-Harengan"},
["sbi"] = {"Seti"},
["sbj"] = {"Surbakhal"},
["sbk"] = {"Safwa"},
["sbl"] = {"Botolan Sambal"},
["sbm"] = {"Sagala"},
["sbn"] = {"Sindhi Bhil"},
["sbo"] = {"Sabüm"},
["sbp"] = {"Sangu (Tanzania)"},
["sbq"] = {"Sileibi"},
["sbr"] = {"Sembakung Murut"},
["sbs"] = {"Subiya"},
["sbt"] = {"Kimki"},
["sbu"] = {"Stod Bhoti"},
["sbv"] = {"Sabine"},
["sbw"] = {"Simba"},
["sbx"] = {"Seberuang"},
["sby"] = {"Soli"},
["sbz"] = {"Sara Kaba"},
["scb"] = {"Chut"},
["sce"] = {"Dongxiang"},
["scf"] = {"San Miguel Creole French"},
["scg"] = {"Sanggau"},
["sch"] = {"Sakachep"},
["sci"] = {"Sri Lankan Creole Malay"},
["sck"] = {"Sadri"},
["scl"] = {"Shina"},
["scn"] = {"Sicilian"},
["sco"] = {"Scots"},
["scp"] = {"Hyolmo", "Helambu Sherpa"},
["scq"] = {"Sa'och"},
["scs"] = {"North Slavey", "Dene Kedé"},
["sct"] = {"Southern Katang"},
["scu"] = {"Shumcho"},
["scv"] = {"Sheni"},
["scw"] = {"Sha"},
["scx"] = {"Sicel"},
["scz"] = {"Shaetlan"},
["sda"] = {"Toraja-Sa'dan"},
["sdb"] = {"Shabak"},
["sdc"] = {"Sassarese Sardinian"},
["sde"] = {"Surubu"},
["sdf"] = {"Sarli"},
["sdg"] = {"Savi"},
["sdh"] = {"Southern Kurdish"},
["sdj"] = {"Suundi"},
["sdk"] = {"Sos Kundi"},
["sdl"] = {"Saudi Arabian Sign Language"},
["sdn"] = {"Gallurese Sardinian"},
["sdo"] = {"Bukar-Sadung Bidayuh"},
["sdp"] = {"Sherdukpen"},
["sdq"] = {"Semandang"},
["sdr"] = {"Oraon Sadri"},
["sds"] = {"Sened"},
["sdt"] = {"Shuadit"},
["sdu"] = {"Sarudu"},
["sdv"] = {"Eastern Sudanic languages"},
["sdx"] = {"Sibu Melanau"},
["sdz"] = {"Sallands"},
["sea"] = {"Semai"},
["seb"] = {"Shempire Senoufo"},
["sec"] = {"Sechelt", "She shashishalhem"},
["sed"] = {"Sedang"},
["see"] = {"Seneca"},
["sef"] = {"Cebaara Senoufo"},
["seg"] = {"Segeju"},
["seh"] = {"Sena"},
["sei"] = {"Seri"},
["sej"] = {"Sene"},
["sek"] = {"Sekani"},
["sel"] = {"Selkup"},
["sem"] = {"Semitic languages"},
["sen"] = {"Nanerigé Sénoufo"},
["seo"] = {"Suarmin"},
["sep"] = {"Sìcìté Sénoufo"},
["seq"] = {"Senara Sénoufo"},
["ser"] = {"Serrano"},
["ses"] = {"Koyraboro Senni Songhai"},
["set"] = {"Sentani"},
["seu"] = {"Serui-Laut"},
["sev"] = {"Nyarafolo Senoufo"},
["sew"] = {"Sewa Bay"},
["sey"] = {"Secoya"},
["sez"] = {"Senthang Chin"},
["sfb"] = {"Langue des signes de Belgique Francophone", "French Belgian Sign Language"},
["sfe"] = {"Eastern Subanen"},
["sfm"] = {"Small Flowery Miao"},
["sfs"] = {"South African Sign Language"},
["sfw"] = {"Sehwi"},
["sga"] = {"Old Irish (to 900)"},
["sgb"] = {"Mag-antsi Ayta"},
["sgc"] = {"Kipsigis"},
["sgd"] = {"Surigaonon"},
["sge"] = {"Segai"},
["sgg"] = {"Swiss-German Sign Language"},
["sgh"] = {"Shughni"},
["sgi"] = {"Suga"},
["sgj"] = {"Surgujia"},
["sgk"] = {"Sangkong"},
["sgm"] = {"Singa"},
["sgn"] = {"Sign languages"},
["sgp"] = {"Singpho"},
["sgr"] = {"Sangisari"},
["sgs"] = {"Samogitian"},
["sgt"] = {"Brokpake"},
["sgu"] = {"Salas"},
["sgw"] = {"Sebat Bet Gurage"},
["sgx"] = {"Sierra Leone Sign Language"},
["sgy"] = {"Sanglechi"},
["sgz"] = {"Sursurunga"},
["sha"] = {"Shall-Zwall"},
["shb"] = {"Ninam"},
["shc"] = {"Sonde"},
["shd"] = {"Kundal Shahi"},
["she"] = {"Sheko"},
["shg"] = {"Shua"},
["shh"] = {"Shoshoni"},
["shi"] = {"Tachelhit"},
["shj"] = {"Shatt"},
["shk"] = {"Shilluk"},
["shm"] = {"Shahrudi"},
["shn"] = {"Shan"},
["sho"] = {"Shanga"},
["shp"] = {"Shipibo-Conibo"},
["shq"] = {"Sala"},
["shr"] = {"Shi"},
["shs"] = {"Shuswap", "Secwepemctsín"},
["sht"] = {"Shasta"},
["shu"] = {"Chadian Arabic"},
["shv"] = {"Shehri"},
["shw"] = {"Shwai"},
["shx"] = {"She"},
["shy"] = {"Tachawit"},
["shz"] = {"Syenara Senoufo"},
["sia"] = {"Akkala Sami"},
["sib"] = {"Sebop"},
["sid"] = {"Sidamo"},
["sie"] = {"Simaa"},
["sif"] = {"Siamou"},
["sig"] = {"Paasaal"},
["sih"] = {"Zire", "Sîshëë"},
["sii"] = {"Shom Peng"},
["sij"] = {"Numbami"},
["sik"] = {"Sikiana"},
["sil"] = {"Tumulung Sisaala"},
["sim"] = {"Mende (Papua New Guinea)"},
["sio"] = {"Siouan languages"},
["sip"] = {"Sikkimese"},
["siq"] = {"Sonia"},
["sir"] = {"Siri"},
["sis"] = {"Siuslaw"},
["sit"] = {"Sino-Tibetan languages"},
["siu"] = {"Sinagen"},
["siv"] = {"Sumariup"},
["siw"] = {"Siwai"},
["six"] = {"Sumau"},
["siy"] = {"Sivandi"},
["siz"] = {"Siwi"},
["sja"] = {"Epena"},
["sjb"] = {"Sajau Basap"},
["sjc"] = {"Shaojiang Chinese"},
["sjd"] = {"Kildin Sami"},
["sje"] = {"Pite Sami"},
["sjg"] = {"Assangori"},
["sjk"] = {"Kemi Sami"},
["sjl"] = {"Sajalong", "Miji"},
["sjm"] = {"Mapun"},
["sjn"] = {"Sindarin"},
["sjo"] = {"Xibe"},
["sjp"] = {"Surjapuri"},
["sjr"] = {"Siar-Lak"},
["sjs"] = {"Senhaja De Srair"},
["sjt"] = {"Ter Sami"},
["sju"] = {"Ume Sami"},
["sjw"] = {"Shawnee"},
["ska"] = {"Skagit"},
["skb"] = {"Saek"},
["skc"] = {"Ma Manda"},
["skd"] = {"Southern Sierra Miwok"},
["ske"] = {"Seke (Vanuatu)"},
["skf"] = {"Sakirabiá"},
["skg"] = {"Sakalava Malagasy"},
["skh"] = {"Sikule"},
["ski"] = {"Sika"},
["skj"] = {"Seke (Nepal)"},
["skm"] = {"Kutong"},
["skn"] = {"Kolibugan Subanon"},
["sko"] = {"Seko Tengah"},
["skp"] = {"Sekapan"},
["skq"] = {"Sininkere"},
["skr"] = {"Saraiki", "Seraiki"},
["sks"] = {"Maia"},
["skt"] = {"Sakata"},
["sku"] = {"Sakao"},
["skv"] = {"Skou"},
["skw"] = {"Skepi Creole Dutch"},
["skx"] = {"Seko Padang"},
["sky"] = {"Sikaiana"},
["skz"] = {"Sekar"},
["sla"] = {"Slavic languages"},
["slc"] = {"Sáliba"},
["sld"] = {"Sissala"},
["sle"] = {"Sholaga"},
["slf"] = {"Swiss-Italian Sign Language"},
["slg"] = {"Selungai Murut"},
["slh"] = {"Southern Puget Sound Salish"},
["sli"] = {"Lower Silesian"},
["slj"] = {"Salumá"},
["sll"] = {"Salt-Yui"},
["slm"] = {"Pangutaran Sama"},
["sln"] = {"Salinan"},
["slp"] = {"Lamaholot"},
["slr"] = {"Salar"},
["sls"] = {"Singapore Sign Language"},
["slt"] = {"Sila"},
["slu"] = {"Selaru"},
["slw"] = {"Sialum"},
["slx"] = {"Salampasu"},
["sly"] = {"Selayar"},
["slz"] = {"Ma'ya"},
["sma"] = {"Southern Sami"},
["smb"] = {"Simbari"},
["smc"] = {"Som"},
["smf"] = {"Auwe"},
["smg"] = {"Simbali"},
["smh"] = {"Samei"},
["smi"] = {"Sami languages"},
["smj"] = {"Lule Sami"},
["smk"] = {"Bolinao"},
["sml"] = {"Central Sama"},
["smm"] = {"Musasa"},
["smn"] = {"Inari Sami"},
["smp"] = {"Samaritan"},
["smq"] = {"Samo"},
["smr"] = {"Simeulue"},
["sms"] = {"Skolt Sami"},
["smt"] = {"Simte"},
["smu"] = {"Somray"},
["smv"] = {"Samvedi"},
["smw"] = {"Sumbawa"},
["smx"] = {"Samba"},
["smy"] = {"Semnani"},
["smz"] = {"Simeku"},
["snc"] = {"Sinaugoro"},
["sne"] = {"Bau Bidayuh"},
["snf"] = {"Noon"},
["sng"] = {"Sanga (Democratic Republic of Congo)"},
["sni"] = {"Sensi"},
["snj"] = {"Riverain Sango"},
["snk"] = {"Soninke"},
["snl"] = {"Sangil"},
["snm"] = {"Southern Ma'di"},
["snn"] = {"Siona"},
["sno"] = {"Snohomish"},
["snp"] = {"Siane"},
["snq"] = {"Sangu (Gabon)"},
["snr"] = {"Sihan"},
["sns"] = {"South West Bay", "Nahavaq"},
["snu"] = {"Senggi", "Viid"},
["snv"] = {"Sa'ban"},
["snw"] = {"Selee"},
["snx"] = {"Sam"},
["sny"] = {"Saniyo-Hiyewe"},
["snz"] = {"Kou"},
["soa"] = {"Thai Song"},
["sob"] = {"Sobei"},
["soc"] = {"So (Democratic Republic of Congo)"},
["sod"] = {"Songoora"},
["soe"] = {"Songomeno"},
["sog"] = {"Sogdian"},
["soh"] = {"Aka"},
["soi"] = {"Sonha"},
["soj"] = {"Soi"},
["sok"] = {"Sokoro"},
["sol"] = {"Solos"},
["son"] = {"Songhai languages"},
["soo"] = {"Songo"},
["sop"] = {"Songe"},
["soq"] = {"Kanasi"},
["sor"] = {"Somrai"},
["sos"] = {"Seeku"},
["sou"] = {"Southern Thai"},
["sov"] = {"Sonsorol"},
["sow"] = {"Sowanda"},
["sox"] = {"Swo"},
["soy"] = {"Miyobe"},
["soz"] = {"Temi"},
["spb"] = {"Sepa (Indonesia)"},
["spc"] = {"Sapé"},
["spd"] = {"Saep"},
["spe"] = {"Sepa (Papua New Guinea)"},
["spg"] = {"Sian"},
["spi"] = {"Saponi"},
["spk"] = {"Sengo"},
["spl"] = {"Selepet"},
["spm"] = {"Akukem"},
["spn"] = {"Sanapaná"},
["spo"] = {"Spokane"},
["spp"] = {"Supyire Senoufo"},
["spq"] = {"Loreto-Ucayali Spanish"},
["spr"] = {"Saparua"},
["sps"] = {"Saposa"},
["spt"] = {"Spiti Bhoti"},
["spu"] = {"Sapuan"},
["spv"] = {"Sambalpuri", "Kosli"},
["spx"] = {"South Picene"},
["spy"] = {"Sabaot"},
["sqa"] = {"Shama-Sambuga"},
["sqh"] = {"Shau"},
["sqj"] = {"Albanian languages"},
["sqk"] = {"Albanian Sign Language"},
["sqm"] = {"Suma"},
["sqn"] = {"Susquehannock"},
["sqo"] = {"Sorkhei"},
["sqq"] = {"Sou"},
["sqr"] = {"Siculo Arabic"},
["sqs"] = {"Sri Lankan Sign Language"},
["sqt"] = {"Soqotri"},
["squ"] = {"Squamish", "Sḵwx̱wú7mesh sníchim"},
["sqx"] = {"Kufr Qassem Sign Language (KQSL)"},
["sra"] = {"Saruga"},
["srb"] = {"Sora"},
["src"] = {"Logudorese Sardinian"},
["sre"] = {"Sara"},
["srf"] = {"Nafi"},
["srg"] = {"Sulod"},
["srh"] = {"Sarikoli"},
["sri"] = {"Siriano"},
["srk"] = {"Serudung Murut"},
["srl"] = {"Isirawa"},
["srm"] = {"Saramaccan"},
["srn"] = {"Sranan Tongo"},
["sro"] = {"Campidanese Sardinian"},
["srq"] = {"Sirionó"},
["srr"] = {"Serer"},
["srs"] = {"Tsuut'ina", "Sarsi"},
["srt"] = {"Sauri"},
["sru"] = {"Suruí"},
["srv"] = {"Southern Sorsoganon"},
["srw"] = {"Serua"},
["srx"] = {"Sirmauri"},
["sry"] = {"Sera"},
["srz"] = {"Shahmirzadi"},
["ssa"] = {"Nilo-Saharan languages"},
["ssb"] = {"Southern Sama"},
["ssc"] = {"Suba-Simbiti"},
["ssd"] = {"Siroi"},
["sse"] = {"Balangingi", "Bangingih Sama"},
["ssf"] = {"Thao"},
["ssg"] = {"Seimat"},
["ssh"] = {"Shihhi Arabic"},
["ssi"] = {"Sansi"},
["ssj"] = {"Sausi"},
["ssk"] = {"Sunam"},
["ssl"] = {"Western Sisaala"},
["ssm"] = {"Semnam"},
["ssn"] = {"Waata"},
["sso"] = {"Sissano"},
["ssp"] = {"Spanish Sign Language"},
["ssq"] = {"So'a"},
["ssr"] = {"Swiss-French Sign Language"},
["sss"] = {"Sô"},
["sst"] = {"Sinasina"},
["ssu"] = {"Susuami"},
["ssv"] = {"Shark Bay"},
["ssx"] = {"Samberigi"},
["ssy"] = {"Saho"},
["ssz"] = {"Sengseng"},
["sta"] = {"Settla"},
["stb"] = {"Northern Subanen"},
["std"] = {"Sentinel"},
["ste"] = {"Liana-Seti"},
["stf"] = {"Seta"},
["stg"] = {"Trieng"},
["sth"] = {"Shelta"},
["sti"] = {"Bulo Stieng"},
["stj"] = {"Matya Samo"},
["stk"] = {"Arammba"},
["stl"] = {"Stellingwerfs"},
["stm"] = {"Setaman"},
["stn"] = {"Owa"},
["sto"] = {"Stoney"},
["stp"] = {"Southeastern Tepehuan"},
["stq"] = {"Saterfriesisch"},
["str"] = {"Straits Salish"},
["sts"] = {"Shumashti"},
["stt"] = {"Budeh Stieng"},
["stu"] = {"Samtao"},
["stv"] = {"Silt'e"},
["stw"] = {"Satawalese"},
["sty"] = {"Siberian Tatar"},
["sua"] = {"Sulka"},
["sub"] = {"Suku"},
["suc"] = {"Western Subanon"},
["sue"] = {"Suena"},
["sug"] = {"Suganga"},
["sui"] = {"Suki"},
["suj"] = {"Shubi"},
["suk"] = {"Sukuma"},
["suo"] = {"Bouni"},
["suq"] = {"Tirmaga-Chai Suri", "Suri"},
["sur"] = {"Mwaghavul"},
["sus"] = {"Susu"},
["sut"] = {"Subtiaba"},
["suv"] = {"Puroik"},
["suw"] = {"Sumbwa"},
["sux"] = {"Sumerian"},
["suy"] = {"Suyá"},
["suz"] = {"Sunwar"},
["sva"] = {"Svan"},
["svb"] = {"Ulau-Suain"},
["svc"] = {"Vincentian Creole English"},
["sve"] = {"Serili"},
["svk"] = {"Slovakian Sign Language"},
["svm"] = {"Slavomolisano"},
["svs"] = {"Savosavo"},
["svx"] = {"Skalvian"},
["swb"] = {"Maore Comorian"},
["swc"] = {"Congo Swahili"},
["swf"] = {"Sere"},
["swg"] = {"Swabian"},
["swh"] = {"Swahili (individual language)", "Kiswahili"},
["swi"] = {"Sui"},
["swj"] = {"Sira"},
["swk"] = {"Malawi Sena"},
["swl"] = {"Swedish Sign Language"},
["swm"] = {"Samosa"},
["swn"] = {"Sawknah"},
["swo"] = {"Shanenawa"},
["swp"] = {"Suau"},
["swq"] = {"Sharwa"},
["swr"] = {"Saweru"},
["sws"] = {"Seluwasan"},
["swt"] = {"Sawila"},
["swu"] = {"Suwawa"},
["swv"] = {"Shekhawati"},
["sww"] = {"Sowa"},
["swx"] = {"Suruahá"},
["swy"] = {"Sarua"},
["sxb"] = {"Suba"},
["sxc"] = {"Sicanian"},
["sxe"] = {"Sighu"},
["sxg"] = {"Shuhi", "Shixing"},
["sxk"] = {"Southern Kalapuya"},
["sxl"] = {"Selian"},
["sxm"] = {"Samre"},
["sxn"] = {"Sangir"},
["sxo"] = {"Sorothaptic"},
["sxr"] = {"Saaroa"},
["sxs"] = {"Sasaru"},
["sxu"] = {"Upper Saxon"},
["sxw"] = {"Saxwe Gbe"},
["sya"] = {"Siang"},
["syb"] = {"Central Subanen"},
["syc"] = {"Classical Syriac"},
["syd"] = {"Samoyedic languages"},
["syi"] = {"Seki"},
["syk"] = {"Sukur"},
["syl"] = {"Sylheti"},
["sym"] = {"Maya Samo"},
["syn"] = {"Senaya"},
["syo"] = {"Suoy"},
["syr"] = {"Syriac"},
["sys"] = {"Sinyar"},
["syw"] = {"Kagate"},
["syx"] = {"Samay"},
["syy"] = {"Al-Sayyid Bedouin Sign Language"},
["sza"] = {"Semelai"},
["szb"] = {"Ngalum"},
["szc"] = {"Semaq Beri"},
["sze"] = {"Seze"},
["szg"] = {"Sengele"},
["szl"] = {"Silesian"},
["szn"] = {"Sula"},
["szp"] = {"Suabo"},
["szs"] = {"Solomon Islands Sign Language"},
["szv"] = {"Isubu", "Isu (Fako Division)"},
["szw"] = {"Sawai"},
["szy"] = {"Sakizaya"},
["taa"] = {"Lower Tanana"},
["tab"] = {"Tabassaran"},
["tac"] = {"Lowland Tarahumara"},
["tad"] = {"Tause"},
["tae"] = {"Tariana"},
["taf"] = {"Tapirapé"},
["tag"] = {"Tagoi"},
["tai"] = {"Tai languages"},
["taj"] = {"Eastern Tamang"},
["tak"] = {"Tala"},
["tal"] = {"Tal"},
["tan"] = {"Tangale"},
["tao"] = {"Yami"},
["tap"] = {"Taabwa"},
["taq"] = {"Tamasheq"},
["tar"] = {"Central Tarahumara"},
["tas"] = {"Tay Boi"},
["tau"] = {"Upper Tanana"},
["tav"] = {"Tatuyo"},
["taw"] = {"Tai"},
["tax"] = {"Tamki"},
["tay"] = {"Atayal"},
["taz"] = {"Tocho"},
["tba"] = {"Aikanã"},
["tbc"] = {"Takia"},
["tbd"] = {"Kaki Ae"},
["tbe"] = {"Tanimbili"},
["tbf"] = {"Mandara"},
["tbg"] = {"North Tairora"},
["tbh"] = {"Dharawal", "Thurawal"},
["tbi"] = {"Gaam"},
["tbj"] = {"Tiang"},
["tbk"] = {"Calamian Tagbanwa"},
["tbl"] = {"Tboli"},
["tbm"] = {"Tagbu"},
["tbn"] = {"Barro Negro Tunebo"},
["tbo"] = {"Tawala"},
["tbp"] = {"Taworta", "Diebroud"},
["tbq"] = {"Tibeto-Burman languages"},
["tbr"] = {"Tumtum"},
["tbs"] = {"Tanguat"},
["tbt"] = {"Tembo (Kitembo)"},
["tbu"] = {"Tubar"},
["tbv"] = {"Tobo"},
["tbw"] = {"Tagbanwa"},
["tbx"] = {"Kapin"},
["tby"] = {"Tabaru"},
["tbz"] = {"Ditammari"},
["tca"] = {"Ticuna"},
["tcb"] = {"Tanacross"},
["tcc"] = {"Datooga"},
["tcd"] = {"Tafi"},
["tce"] = {"Southern Tutchone", "Dän K'è"},
["tcf"] = {"Malinaltepec Me'phaa", "Malinaltepec Tlapanec"},
["tcg"] = {"Tamagario"},
["tch"] = {"Turks And Caicos Creole English"},
["tci"] = {"Wára"},
["tck"] = {"Tchitchege"},
["tcl"] = {"Taman (Myanmar)"},
["tcm"] = {"Tanahmerah"},
["tcn"] = {"Tichurong"},
["tco"] = {"Taungyo"},
["tcp"] = {"Tawr Chin"},
["tcq"] = {"Kaiy"},
["tcs"] = {"Torres Strait Creole", "Yumplatok"},
["tct"] = {"T'en"},
["tcu"] = {"Southeastern Tarahumara"},
["tcw"] = {"Tecpatlán Totonac"},
["tcx"] = {"Toda"},
["tcy"] = {"Tulu"},
["tcz"] = {"Thado Chin"},
["tda"] = {"Tagdal"},
["tdb"] = {"Panchpargania"},
["tdc"] = {"Emberá-Tadó"},
["tdd"] = {"Tai Nüa"},
["tde"] = {"Tiranige Diga Dogon"},
["tdf"] = {"Talieng"},
["tdg"] = {"Western Tamang"},
["tdh"] = {"Thulung"},
["tdi"] = {"Tomadino"},
["tdj"] = {"Tajio"},
["tdk"] = {"Tambas"},
["tdl"] = {"Sur"},
["tdm"] = {"Taruma"},
["tdn"] = {"Tondano"},
["tdo"] = {"Teme"},
["tdq"] = {"Tita"},
["tdr"] = {"Todrah"},
["tds"] = {"Doutai"},
["tdt"] = {"Tetun Dili"},
["tdv"] = {"Toro"},
["tdx"] = {"Tandroy-Mahafaly Malagasy"},
["tdy"] = {"Tadyawan"},
["tea"] = {"Temiar"},
["teb"] = {"Tetete"},
["tec"] = {"Terik"},
["ted"] = {"Tepo Krumen"},
["tee"] = {"Huehuetla Tepehua"},
["tef"] = {"Teressa"},
["teg"] = {"Teke-Tege"},
["teh"] = {"Tehuelche"},
["tei"] = {"Torricelli"},
["tek"] = {"Ibali Teke"},
["tem"] = {"Timne"},
["ten"] = {"Tama (Colombia)"},
["teo"] = {"Teso"},
["tep"] = {"Tepecano"},
["teq"] = {"Temein"},
["ter"] = {"Tereno"},
["tes"] = {"Tengger"},
["tet"] = {"Tetum"},
["teu"] = {"Soo"},
["tev"] = {"Teor"},
["tew"] = {"Tewa (USA)"},
["tex"] = {"Tennet"},
["tey"] = {"Tulishi"},
["tez"] = {"Tetserret"},
["tfi"] = {"Tofin Gbe"},
["tfn"] = {"Tanaina"},
["tfo"] = {"Tefaro"},
["tfr"] = {"Teribe"},
["tft"] = {"Ternate"},
["tga"] = {"Sagalla"},
["tgb"] = {"Tobilung"},
["tgc"] = {"Tigak"},
["tgd"] = {"Ciwogai"},
["tge"] = {"Eastern Gorkha Tamang"},
["tgf"] = {"Chalikha"},
["tgh"] = {"Tobagonian Creole English"},
["tgi"] = {"Lawunuia"},
["tgj"] = {"Tagin"},
["tgn"] = {"Tandaganon"},
["tgo"] = {"Sudest"},
["tgp"] = {"Tangoa"},
["tgq"] = {"Tring"},
["tgr"] = {"Tareng"},
["tgs"] = {"Nume"},
["tgt"] = {"Central Tagbanwa"},
["tgu"] = {"Tanggu"},
["tgv"] = {"Tingui-Boto"},
["tgw"] = {"Tagwana Senoufo"},
["tgx"] = {"Tagish"},
["tgy"] = {"Togoyo"},
["tgz"] = {"Tagalaka"},
["thd"] = {"Kuuk Thaayorre", "Thayore"},
["the"] = {"Chitwania Tharu"},
["thf"] = {"Thangmi"},
["thh"] = {"Northern Tarahumara"},
["thi"] = {"Tai Long"},
["thk"] = {"Tharaka", "Kitharaka"},
["thl"] = {"Dangaura Tharu"},
["thm"] = {"Aheu"},
["thn"] = {"Thachanadan"},
["thp"] = {"Thompson", "Nłeʔkepmxcín", "Thompson River Salish"},
["thq"] = {"Kochila Tharu"},
["thr"] = {"Rana Tharu"},
["ths"] = {"Thakali"},
["tht"] = {"Tahltan", "Tāłtān"},
["thu"] = {"Thuri"},
["thv"] = {"Tahaggart Tamahaq"},
["thy"] = {"Tha"},
["thz"] = {"Tayart Tamajeq"},
["tia"] = {"Tidikelt Tamazight"},
["tic"] = {"Tira"},
["tif"] = {"Tifal"},
["tig"] = {"Tigre"},
["tih"] = {"Timugon Murut"},
["tii"] = {"Tiene"},
["tij"] = {"Tilung"},
["tik"] = {"Tikar"},
["til"] = {"Tillamook"},
["tim"] = {"Timbe"},
["tin"] = {"Tindi"},
["tio"] = {"Teop"},
["tip"] = {"Trimuris"},
["tiq"] = {"Tiéfo"},
["tis"] = {"Masadiit Itneg"},
["tit"] = {"Tinigua"},
["tiu"] = {"Adasen"},
["tiv"] = {"Tiv"},
["tiw"] = {"Tiwi"},
["tix"] = {"Southern Tiwa"},
["tiy"] = {"Tiruray"},
["tiz"] = {"Tai Hongjin"},
["tja"] = {"Tajuasohn"},
["tjg"] = {"Tunjung"},
["tji"] = {"Northern Tujia"},
["tjj"] = {"Tjungundji"},
["tjl"] = {"Tai Laing"},
["tjm"] = {"Timucua"},
["tjn"] = {"Tonjon"},
["tjo"] = {"Temacine Tamazight"},
["tjp"] = {"Tjupany"},
["tjs"] = {"Southern Tujia"},
["tju"] = {"Tjurruru"},
["tjw"] = {"Djabwurrung"},
["tka"] = {"Truká"},
["tkb"] = {"Buksa"},
["tkd"] = {"Tukudede"},
["tke"] = {"Takwane"},
["tkf"] = {"Tukumanféd"},
["tkg"] = {"Tesaka Malagasy"},
["tkl"] = {"Tokelau"},
["tkm"] = {"Takelma"},
["tkn"] = {"Toku-No-Shima"},
["tkp"] = {"Tikopia"},
["tkq"] = {"Tee"},
["tkr"] = {"Tsakhur"},
["tks"] = {"Takestani"},
["tkt"] = {"Kathoriya Tharu"},
["tku"] = {"Upper Necaxa Totonac"},
["tkv"] = {"Mur Pano"},
["tkw"] = {"Teanu"},
["tkx"] = {"Tangko"},
["tkz"] = {"Takua"},
["tla"] = {"Southwestern Tepehuan"},
["tlb"] = {"Tobelo"},
["tlc"] = {"Yecuatla Totonac"},
["tld"] = {"Talaud"},
["tlf"] = {"Telefol"},
["tlg"] = {"Tofanma"},
["tlh"] = {"Klingon", "tlhIngan Hol"},
["tli"] = {"Tlingit"},
["tlj"] = {"Talinga-Bwisi"},
["tlk"] = {"Taloki"},
["tll"] = {"Tetela"},
["tlm"] = {"Tolomako"},
["tln"] = {"Talondo'"},
["tlo"] = {"Talodi"},
["tlp"] = {"Filomena Mata-Coahuitlán Totonac"},
["tlq"] = {"Tai Loi"},
["tlr"] = {"Talise"},
["tls"] = {"Tambotalo"},
["tlt"] = {"Sou Nama", "Teluti"},
["tlu"] = {"Tulehu"},
["tlv"] = {"Taliabu"},
["tlx"] = {"Khehek"},
["tly"] = {"Talysh"},
["tma"] = {"Tama (Chad)"},
["tmb"] = {"Katbol", "Avava"},
["tmc"] = {"Tumak"},
["tmd"] = {"Haruai"},
["tme"] = {"Tremembé"},
["tmf"] = {"Toba-Maskoy"},
["tmg"] = {"Ternateño"},
["tmh"] = {"Tamashek"},
["tmi"] = {"Tutuba"},
["tmj"] = {"Samarokena"},
["tml"] = {"Tamnim Citak"},
["tmm"] = {"Tai Thanh"},
["tmn"] = {"Taman (Indonesia)"},
["tmo"] = {"Temoq"},
["tmq"] = {"Tumleo"},
["tmr"] = {"Jewish Babylonian Aramaic (ca. 200-1200 CE)"},
["tms"] = {"Tima"},
["tmt"] = {"Tasmate"},
["tmu"] = {"Iau"},
["tmv"] = {"Tembo (Motembo)"},
["tmw"] = {"Temuan"},
["tmy"] = {"Tami"},
["tmz"] = {"Tamanaku"},
["tna"] = {"Tacana"},
["tnb"] = {"Western Tunebo"},
["tnc"] = {"Tanimuca-Retuarã"},
["tnd"] = {"Angosturas Tunebo"},
["tng"] = {"Tobanga"},
["tnh"] = {"Maiani"},
["tni"] = {"Tandia"},
["tnk"] = {"Kwamera"},
["tnl"] = {"Lenakel"},
["tnm"] = {"Tabla"},
["tnn"] = {"North Tanna"},
["tno"] = {"Toromono"},
["tnp"] = {"Whitesands"},
["tnq"] = {"Taino"},
["tnr"] = {"Ménik"},
["tns"] = {"Tenis"},
["tnt"] = {"Tontemboan"},
["tnu"] = {"Tay Khang"},
["tnv"] = {"Tangchangya"},
["tnw"] = {"Tonsawang"},
["tnx"] = {"Tanema"},
["tny"] = {"Tongwe"},
["tnz"] = {"Ten'edn"},
["tob"] = {"Toba"},
["toc"] = {"Coyutla Totonac"},
["tod"] = {"Toma"},
["tof"] = {"Gizrra"},
["tog"] = {"Tonga (Nyasa)"},
["toh"] = {"Gitonga"},
["toi"] = {"Tonga (Zambia)"},
["toj"] = {"Tojolabal"},
["tok"] = {"Toki Pona"},
["tol"] = {"Tolowa"},
["tom"] = {"Tombulu"},
["too"] = {"Xicotepec De Juárez Totonac"},
["top"] = {"Papantla Totonac"},
["toq"] = {"Toposa"},
["tor"] = {"Togbo-Vara Banda"},
["tos"] = {"Highland Totonac"},
["tou"] = {"Tho"},
["tov"] = {"Upper Taromi"},
["tow"] = {"Jemez"},
["tox"] = {"Tobian"},
["toy"] = {"Topoiyo"},
["toz"] = {"To"},
["tpa"] = {"Taupota"},
["tpc"] = {"Azoyú Me'phaa", "Azoyú Tlapanec"},
["tpe"] = {"Tippera"},
["tpf"] = {"Tarpia"},
["tpg"] = {"Kula"},
["tpi"] = {"Tok Pisin"},
["tpj"] = {"Tapieté"},
["tpk"] = {"Tupinikin"},
["tpl"] = {"Tlacoapa Me'phaa", "Tlacoapa Tlapanec"},
["tpm"] = {"Tampulma"},
["tpn"] = {"Tupinambá"},
["tpo"] = {"Tai Pao"},
["tpp"] = {"Pisaflores Tepehua"},
["tpq"] = {"Tukpa"},
["tpr"] = {"Tuparí"},
["tpt"] = {"Tlachichilco Tepehua"},
["tpu"] = {"Tampuan"},
["tpv"] = {"Tanapag"},
["tpx"] = {"Acatepec Me'phaa", "Acatepec Tlapanec"},
["tpy"] = {"Trumai"},
["tpz"] = {"Tinputz"},
["tqb"] = {"Tembé"},
["tql"] = {"Lehali"},
["tqm"] = {"Turumsa"},
["tqn"] = {"Tenino"},
["tqo"] = {"Toaripi"},
["tqp"] = {"Tomoip"},
["tqq"] = {"Tunni"},
["tqr"] = {"Torona"},
["tqt"] = {"Western Totonac"},
["tqu"] = {"Touo"},
["tqw"] = {"Tonkawa"},
["tra"] = {"Tirahi"},
["trb"] = {"Terebu"},
["trc"] = {"Copala Triqui"},
["trd"] = {"Turi"},
["tre"] = {"East Tarangan"},
["trf"] = {"Trinidadian Creole English"},
["trg"] = {"Lishán Didán"},
["trh"] = {"Turaka"},
["tri"] = {"Trió"},
["trj"] = {"Toram"},
["trk"] = {"Turkic languages"},
["trl"] = {"Traveller Scottish"},
["trm"] = {"Tregami"},
["trn"] = {"Trinitario"},
["tro"] = {"Tarao Naga"},
["trp"] = {"Kok Borok"},
["trq"] = {"San Martín Itunyoso Triqui"},
["trr"] = {"Taushiro"},
["trs"] = {"Chicahuaxtla Triqui"},
["trt"] = {"Tunggare"},
["tru"] = {"Turoyo", "Surayt"},
["trv"] = {"Sediq", "Seediq", "Taroko"},
["trw"] = {"Torwali"},
["trx"] = {"Tringgus-Sembaan Bidayuh"},
["try"] = {"Turung"},
["trz"] = {"Torá"},
["tsa"] = {"Tsaangi"},
["tsb"] = {"Tsamai"},
["tsc"] = {"Tswa"},
["tsd"] = {"Tsakonian"},
["tse"] = {"Tunisian Sign Language"},
["tsg"] = {"Tausug"},
["tsh"] = {"Tsuvan"},
["tsi"] = {"Tsimshian"},
["tsj"] = {"Tshangla"},
["tsk"] = {"Tseku"},
["tsl"] = {"Ts'ün-Lao"},
["tsm"] = {"Turkish Sign Language", "Türk İşaret Dili"},
["tsp"] = {"Northern Toussian"},
["tsq"] = {"Thai Sign Language"},
["tsr"] = {"Akei"},
["tss"] = {"Taiwan Sign Language"},
["tst"] = {"Tondi Songway Kiini"},
["tsu"] = {"Tsou"},
["tsv"] = {"Tsogo"},
["tsw"] = {"Tsishingini"},
["tsx"] = {"Mubami"},
["tsy"] = {"Tebul Sign Language"},
["tsz"] = {"Purepecha"},
["tta"] = {"Tutelo"},
["ttb"] = {"Gaa"},
["ttc"] = {"Tektiteko"},
["ttd"] = {"Tauade"},
["tte"] = {"Bwanabwana"},
["ttf"] = {"Tuotomb"},
["ttg"] = {"Tutong"},
["tth"] = {"Upper Ta'oih"},
["tti"] = {"Tobati"},
["ttj"] = {"Tooro"},
["ttk"] = {"Totoro"},
["ttl"] = {"Totela"},
["ttm"] = {"Northern Tutchone"},
["ttn"] = {"Towei"},
["tto"] = {"Lower Ta'oih"},
["ttp"] = {"Tombelala"},
["ttq"] = {"Tawallammat Tamajaq"},
["ttr"] = {"Tera"},
["tts"] = {"Northeastern Thai"},
["ttt"] = {"Muslim Tat"},
["ttu"] = {"Torau"},
["ttv"] = {"Titan"},
["ttw"] = {"Long Wat"},
["tty"] = {"Sikaritai"},
["ttz"] = {"Tsum"},
["tua"] = {"Wiarumus"},
["tub"] = {"Tübatulabal"},
["tuc"] = {"Mutu"},
["tud"] = {"Tuxá"},
["tue"] = {"Tuyuca"},
["tuf"] = {"Central Tunebo"},
["tug"] = {"Tunia"},
["tuh"] = {"Taulil"},
["tui"] = {"Tupuri"},
["tuj"] = {"Tugutil"},
["tul"] = {"Tula"},
["tum"] = {"Tumbuka"},
["tun"] = {"Tunica"},
["tuo"] = {"Tucano"},
["tup"] = {"Tupi languages"},
["tuq"] = {"Tedaga"},
["tus"] = {"Tuscarora"},
["tut"] = {"Altaic languages"},
["tuu"] = {"Tututni"},
["tuv"] = {"Turkana"},
["tuw"] = {"Tungus languages"},
["tux"] = {"Tuxináwa"},
["tuy"] = {"Tugen"},
["tuz"] = {"Turka"},
["tva"] = {"Vaghua"},
["tvd"] = {"Tsuvadi"},
["tve"] = {"Te'un"},
["tvg"] = {"Tugunese", "Batavian Portuguese Creole", "Mardijker Creole"},
["tvi"] = {"Tulai"},
["tvk"] = {"Southeast Ambrym"},
["tvl"] = {"Tuvalu"},
["tvm"] = {"Tela-Masbuar"},
["tvn"] = {"Tavoyan"},
["tvo"] = {"Tidore"},
["tvs"] = {"Taveta"},
["tvt"] = {"Tutsa Naga"},
["tvu"] = {"Tunen"},
["tvw"] = {"Sedoa"},
["tvx"] = {"Taivoan"},
["tvy"] = {"Timor Pidgin"},
["twa"] = {"Twana"},
["twb"] = {"Western Tawbuid"},
["twc"] = {"Teshenawa"},
["twd"] = {"Twents"},
["twe"] = {"Tewa (Indonesia)"},
["twf"] = {"Northern Tiwa"},
["twg"] = {"Tereweng"},
["twh"] = {"Tai Dón"},
["twl"] = {"Tawara"},
["twm"] = {"Tawang Monpa"},
["twn"] = {"Twendi"},
["two"] = {"Tswapong"},
["twp"] = {"Ere"},
["twq"] = {"Tasawaq"},
["twr"] = {"Southwestern Tarahumara"},
["twt"] = {"Turiwára"},
["twu"] = {"Termanu"},
["tww"] = {"Tuwari"},
["twx"] = {"Tewe"},
["twy"] = {"Tawoyan"},
["txa"] = {"Tombonuo"},
["txb"] = {"Tokharian B"},
["txc"] = {"Tsetsaut"},
["txe"] = {"Totoli"},
["txg"] = {"Tangut"},
["txh"] = {"Thracian"},
["txi"] = {"Ikpeng"},
["txj"] = {"Tarjumo"},
["txm"] = {"Tomini"},
["txn"] = {"West Tarangan"},
["txo"] = {"Toto"},
["txq"] = {"Tii"},
["txr"] = {"Tartessian"},
["txs"] = {"Tonsea"},
["txt"] = {"Citak"},
["txu"] = {"Kayapó"},
["txx"] = {"Tatana"},
["txy"] = {"Tanosy Malagasy"},
["tya"] = {"Tauya"},
["tye"] = {"Kyanga"},
["tyh"] = {"O'du"},
["tyi"] = {"Teke-Tsaayi"},
["tyj"] = {"Tai Do", "Tai Yo"},
["tyl"] = {"Thu Lao"},
["tyn"] = {"Kombai"},
["typ"] = {"Thaypan"},
["tyr"] = {"Tai Daeng"},
["tys"] = {"Tày Sa Pa"},
["tyt"] = {"Tày Tac"},
["tyu"] = {"Kua"},
["tyv"] = {"Tuvinian"},
["tyx"] = {"Teke-Tyee"},
["tyy"] = {"Tiyaa"},
["tyz"] = {"Tày"},
["tza"] = {"Tanzanian Sign Language"},
["tzh"] = {"Tzeltal"},
["tzj"] = {"Tz'utujil"},
["tzl"] = {"Talossan"},
["tzm"] = {"Central Atlas Tamazight"},
["tzn"] = {"Tugun"},
["tzo"] = {"Tzotzil"},
["tzx"] = {"Tabriak"},
["uam"] = {"Uamué"},
["uan"] = {"Kuan"},
["uar"] = {"Tairuma"},
["uba"] = {"Ubang"},
["ubi"] = {"Ubi"},
["ubl"] = {"Buhi'non Bikol"},
["ubr"] = {"Ubir"},
["ubu"] = {"Umbu-Ungu"},
["uby"] = {"Ubykh"},
["uda"] = {"Uda"},
["ude"] = {"Udihe"},
["udg"] = {"Muduga"},
["udi"] = {"Udi"},
["udj"] = {"Ujir"},
["udl"] = {"Wuzlam"},
["udm"] = {"Udmurt"},
["udu"] = {"Uduk"},
["ues"] = {"Kioko"},
["ufi"] = {"Ufim"},
["uga"] = {"Ugaritic"},
["ugb"] = {"Kuku-Ugbanh"},
["uge"] = {"Ughele"},
["ugh"] = {"Kubachi"},
["ugn"] = {"Ugandan Sign Language"},
["ugo"] = {"Ugong"},
["ugy"] = {"Uruguayan Sign Language"},
["uha"] = {"Uhami"},
["uhn"] = {"Damal"},
["uis"] = {"Uisai"},
["uiv"] = {"Iyive"},
["uji"] = {"Tanjijili"},
["uka"] = {"Kaburi"},
["ukg"] = {"Ukuriguma"},
["ukh"] = {"Ukhwejo"},
["uki"] = {"Kui (India)"},
["ukk"] = {"Muak Sa-aak"},
["ukl"] = {"Ukrainian Sign Language"},
["ukp"] = {"Ukpe-Bayobiri"},
["ukq"] = {"Ukwa"},
["uks"] = {"Urubú-Kaapor Sign Language", "Kaapor Sign Language"},
["uku"] = {"Ukue"},
["ukv"] = {"Kuku"},
["ukw"] = {"Ukwuani-Aboh-Ndoni"},
["uky"] = {"Kuuk-Yak"},
["ula"] = {"Fungwa"},
["ulb"] = {"Ulukwumi"},
["ulc"] = {"Ulch"},
["ule"] = {"Lule"},
["ulf"] = {"Usku", "Afra"},
["uli"] = {"Ulithian"},
["ulk"] = {"Meriam Mir"},
["ull"] = {"Ullatan"},
["ulm"] = {"Ulumanda'"},
["uln"] = {"Unserdeutsch"},
["ulu"] = {"Uma' Lung"},
["ulw"] = {"Ulwa"},
["uly"] = {"Buli"},
["uma"] = {"Umatilla"},
["umb"] = {"Umbundu"},
["umc"] = {"Marrucinian"},
["umd"] = {"Umbindhamu"},
["umg"] = {"Morrobalama", "Umbuygamu"},
["umi"] = {"Ukit"},
["umm"] = {"Umon"},
["umn"] = {"Makyan Naga"},
["umo"] = {"Umotína"},
["ump"] = {"Umpila"},
["umr"] = {"Umbugarla"},
["ums"] = {"Pendau"},
["umu"] = {"Munsee"},
["una"] = {"North Watut"},
["und"] = {"Undetermined"},
["une"] = {"Uneme"},
["ung"] = {"Ngarinyin"},
["uni"] = {"Uni"},
["unk"] = {"Enawené-Nawé"},
["unm"] = {"Unami"},
["unn"] = {"Kurnai"},
["unr"] = {"Mundari"},
["unu"] = {"Unubahe"},
["unx"] = {"Munda"},
["unz"] = {"Unde Kaili"},
["uon"] = {"Kulon"},
["upi"] = {"Umeda"},
["upv"] = {"Uripiv-Wala-Rano-Atchin"},
["ura"] = {"Urarina"},
["urb"] = {"Urubú-Kaapor", "Kaapor"},
["urc"] = {"Urningangg"},
["ure"] = {"Uru"},
["urf"] = {"Uradhi"},
["urg"] = {"Urigina"},
["urh"] = {"Urhobo"},
["uri"] = {"Urim"},
["urj"] = {"Uralic languages"},
["urk"] = {"Urak Lawoi'"},
["url"] = {"Urali"},
["urm"] = {"Urapmin"},
["urn"] = {"Uruangnirin"},
["uro"] = {"Ura (Papua New Guinea)"},
["urp"] = {"Uru-Pa-In"},
["urr"] = {"Lehalurup", "Löyöp"},
["urt"] = {"Urat"},
["uru"] = {"Urumi"},
["urv"] = {"Uruava"},
["urw"] = {"Sop"},
["urx"] = {"Urimo"},
["ury"] = {"Orya"},
["urz"] = {"Uru-Eu-Wau-Wau"},
["usa"] = {"Usarufa"},
["ush"] = {"Ushojo"},
["usi"] = {"Usui"},
["usk"] = {"Usaghade"},
["usp"] = {"Uspanteco"},
["uss"] = {"us-Saare"},
["usu"] = {"Uya"},
["uta"] = {"Otank"},
["ute"] = {"Ute-Southern Paiute"},
["uth"] = {"ut-Hun"},
["utp"] = {"Amba (Solomon Islands)"},
["utr"] = {"Etulo"},
["utu"] = {"Utu"},
["uum"] = {"Urum"},
["uur"] = {"Ura (Vanuatu)"},
["uuu"] = {"U"},
["uve"] = {"West Uvean", "Fagauvea"},
["uvh"] = {"Uri"},
["uvl"] = {"Lote"},
["uwa"] = {"Kuku-Uwanh"},
["uya"] = {"Doko-Uyanga"},
["uzn"] = {"Northern Uzbek"},
["uzs"] = {"Southern Uzbek"},
["vaa"] = {"Vaagri Booli"},
["vae"] = {"Vale"},
["vaf"] = {"Vafsi"},
["vag"] = {"Vagla"},
["vah"] = {"Varhadi-Nagpuri"},
["vai"] = {"Vai"},
["vaj"] = {"Sekele", "Northwestern ǃKung", "Vasekele"},
["val"] = {"Vehes"},
["vam"] = {"Vanimo"},
["van"] = {"Valman"},
["vao"] = {"Vao"},
["vap"] = {"Vaiphei"},
["var"] = {"Huarijio"},
["vas"] = {"Vasavi"},
["vau"] = {"Vanuma"},
["vav"] = {"Varli"},
["vay"] = {"Wayu"},
["vbb"] = {"Southeast Babar"},
["vbk"] = {"Southwestern Bontok"},
["vec"] = {"Venetian"},
["ved"] = {"Veddah"},
["vel"] = {"Veluws"},
["vem"] = {"Vemgo-Mabas"},
["veo"] = {"Ventureño"},
["vep"] = {"Veps"},
["ver"] = {"Mom Jango"},
["vgr"] = {"Vaghri"},
["vgt"] = {"Vlaamse Gebarentaal", "Flemish Sign Language"},
["vic"] = {"Virgin Islands Creole English"},
["vid"] = {"Vidunda"},
["vif"] = {"Vili"},
["vig"] = {"Viemo"},
["vil"] = {"Vilela"},
["vin"] = {"Vinza"},
["vis"] = {"Vishavan"},
["vit"] = {"Viti"},
["viv"] = {"Iduna"},
["vjk"] = {"Bajjika"},
["vka"] = {"Kariyarra"},
["vkj"] = {"Kujarge"},
["vkk"] = {"Kaur"},
["vkl"] = {"Kulisusu"},
["vkm"] = {"Kamakan"},
["vkn"] = {"Koro Nulu"},
["vko"] = {"Kodeoha"},
["vkp"] = {"Korlai Creole Portuguese"},
["vkt"] = {"Tenggarong Kutai Malay"},
["vku"] = {"Kurrama"},
["vkz"] = {"Koro Zuba"},
["vlp"] = {"Valpei"},
["vls"] = {"Vlaams"},
["vma"] = {"Martuyhunira"},
["vmb"] = {"Barbaram"},
["vmc"] = {"Juxtlahuaca Mixtec"},
["vmd"] = {"Mudu Koraga"},
["vme"] = {"East Masela"},
["vmf"] = {"Mainfränkisch"},
["vmg"] = {"Lungalunga"},
["vmh"] = {"Maraghei"},
["vmi"] = {"Miwa"},
["vmj"] = {"Ixtayutla Mixtec"},
["vmk"] = {"Makhuwa-Shirima"},
["vml"] = {"Malgana"},
["vmm"] = {"Mitlatongo Mixtec"},
["vmp"] = {"Soyaltepec Mazatec"},
["vmq"] = {"Soyaltepec Mixtec"},
["vmr"] = {"Marenje"},
["vms"] = {"Moksela"},
["vmu"] = {"Muluridyi"},
["vmv"] = {"Valley Maidu"},
["vmw"] = {"Makhuwa"},
["vmx"] = {"Tamazola Mixtec"},
["vmy"] = {"Ayautla Mazatec"},
["vmz"] = {"Mazatlán Mazatec"},
["vnk"] = {"Vano", "Lovono"},
["vnm"] = {"Vinmavis", "Neve'ei"},
["vnp"] = {"Vunapu"},
["vor"] = {"Voro"},
["vot"] = {"Votic"},
["vra"] = {"Vera'a"},
["vro"] = {"Võro"},
["vrs"] = {"Varisi"},
["vrt"] = {"Burmbar", "Banam Bay"},
["vsi"] = {"Moldova Sign Language"},
["vsl"] = {"Venezuelan Sign Language"},
["vsn"] = {"Vedic Sanskrit"},
["vsv"] = {"Valencian Sign Language", "Llengua de signes valenciana"},
["vto"] = {"Vitou"},
["vum"] = {"Vumbu"},
["vun"] = {"Vunjo"},
["vut"] = {"Vute"},
["vwa"] = {"Awa (China)"},
["waa"] = {"Walla Walla"},
["wab"] = {"Yote", "Wab"},
["wac"] = {"Wasco-Wishram"},
["wad"] = {"Wamesa", "Wondama"},
["wae"] = {"Walser"},
["waf"] = {"Wakoná"},
["wag"] = {"Wa'ema"},
["wah"] = {"Watubela"},
["wai"] = {"Wares"},
["waj"] = {"Waffa"},
["wak"] = {"Wakashan languages"},
["wal"] = {"Wolaytta", "Wolaitta"},
["wam"] = {"Wampanoag"},
["wan"] = {"Wan"},
["wao"] = {"Wappo"},
["wap"] = {"Wapishana"},
["waq"] = {"Wagiman"},
["war"] = {"Waray (Philippines)"},
["was"] = {"Washo"},
["wat"] = {"Kaninuwa"},
["wau"] = {"Waurá"},
["wav"] = {"Waka"},
["waw"] = {"Waiwai"},
["wax"] = {"Watam", "Marangis"},
["way"] = {"Wayana"},
["waz"] = {"Wampur"},
["wba"] = {"Warao"},
["wbb"] = {"Wabo"},
["wbe"] = {"Waritai"},
["wbf"] = {"Wara"},
["wbh"] = {"Wanda"},
["wbi"] = {"Vwanji"},
["wbj"] = {"Alagwa"},
["wbk"] = {"Waigali"},
["wbl"] = {"Wakhi"},
["wbm"] = {"Wa"},
["wbp"] = {"Warlpiri"},
["wbq"] = {"Waddar"},
["wbr"] = {"Wagdi"},
["wbs"] = {"West Bengal Sign Language"},
["wbt"] = {"Warnman"},
["wbv"] = {"Wajarri"},
["wbw"] = {"Woi"},
["wca"] = {"Yanomámi"},
["wci"] = {"Waci Gbe"},
["wdd"] = {"Wandji"},
["wdg"] = {"Wadaginam"},
["wdj"] = {"Wadjiginy"},
["wdk"] = {"Wadikali"},
["wdt"] = {"Wendat"},
["wdu"] = {"Wadjigu"},
["wdy"] = {"Wadjabangayi"},
["wea"] = {"Wewaw"},
["wec"] = {"Wè Western"},
["wed"] = {"Wedau"},
["weg"] = {"Wergaia"},
["weh"] = {"Weh"},
["wei"] = {"Kiunum"},
["wem"] = {"Weme Gbe"},
["wen"] = {"Sorbian languages"},
["weo"] = {"Wemale"},
["wep"] = {"Westphalien"},
["wer"] = {"Weri"},
["wes"] = {"Cameroon Pidgin"},
["wet"] = {"Perai"},
["weu"] = {"Rawngtu Chin"},
["wew"] = {"Wejewa"},
["wfg"] = {"Yafi", "Zorop"},
["wga"] = {"Wagaya"},
["wgb"] = {"Wagawaga"},
["wgg"] = {"Wangkangurru", "Wangganguru"},
["wgi"] = {"Wahgi"},
["wgo"] = {"Waigeo"},
["wgu"] = {"Wirangu"},
["wgy"] = {"Warrgamay"},
["wha"] = {"Sou Upaa", "Manusela"},
["whg"] = {"North Wahgi"},
["whk"] = {"Wahau Kenyah"},
["whu"] = {"Wahau Kayan"},
["wib"] = {"Southern Toussian"},
["wic"] = {"Wichita"},
["wie"] = {"Wik-Epa"},
["wif"] = {"Wik-Keyangan"},
["wig"] = {"Wik Ngathan"},
["wih"] = {"Wik-Me'anha"},
["wii"] = {"Minidien"},
["wij"] = {"Wik-Iiyanh"},
["wik"] = {"Wikalkan"},
["wil"] = {"Wilawila"},
["wim"] = {"Wik-Mungkan"},
["win"] = {"Ho-Chunk"},
["wir"] = {"Wiraféd"},
["wiu"] = {"Wiru"},
["wiv"] = {"Vitu"},
["wiy"] = {"Wiyot"},
["wja"] = {"Waja"},
["wji"] = {"Warji"},
["wka"] = {"Kw'adza"},
["wkb"] = {"Kumbaran"},
["wkd"] = {"Wakde", "Mo"},
["wkl"] = {"Kalanadi"},
["wkr"] = {"Keerray-Woorroong"},
["wku"] = {"Kunduvadi"},
["wkw"] = {"Wakawaka"},
["wky"] = {"Wangkayutyuru"},
["wla"] = {"Walio"},
["wlc"] = {"Mwali Comorian"},
["wle"] = {"Wolane"},
["wlg"] = {"Kunbarlang"},
["wlh"] = {"Welaun"},
["wli"] = {"Waioli"},
["wlk"] = {"Wailaki"},
["wll"] = {"Wali (Sudan)"},
["wlm"] = {"Middle Welsh"},
["wlo"] = {"Wolio"},
["wlr"] = {"Wailapa"},
["wls"] = {"Wallisian"},
["wlu"] = {"Wuliwuli"},
["wlv"] = {"Wichí Lhamtés Vejoz"},
["wlw"] = {"Walak"},
["wlx"] = {"Wali (Ghana)"},
["wly"] = {"Waling"},
["wma"] = {"Mawa (Nigeria)"},
["wmb"] = {"Wambaya"},
["wmc"] = {"Wamas"},
["wmd"] = {"Mamaindé"},
["wme"] = {"Wambule"},
["wmg"] = {"Western Minyag"},
["wmh"] = {"Waima'a"},
["wmi"] = {"Wamin"},
["wmm"] = {"Maiwa (Indonesia)"},
["wmn"] = {"Waamwang"},
["wmo"] = {"Wom (Papua New Guinea)"},
["wms"] = {"Wambon"},
["wmt"] = {"Walmajarri"},
["wmw"] = {"Mwani"},
["wmx"] = {"Womo"},
["wnb"] = {"Mokati"},
["wnc"] = {"Wantoat"},
["wnd"] = {"Wandarang"},
["wne"] = {"Waneci"},
["wng"] = {"Wanggom"},
["wni"] = {"Ndzwani Comorian"},
["wnk"] = {"Wanukaka"},
["wnm"] = {"Wanggamala"},
["wnn"] = {"Wunumara"},
["wno"] = {"Wano"},
["wnp"] = {"Wanap"},
["wnu"] = {"Usan"},
["wnw"] = {"Wintu"},
["wny"] = {"Wanyi", "Waanyi"},
["woa"] = {"Kuwema", "Tyaraity"},
["wob"] = {"Wè Northern"},
["woc"] = {"Wogeo"},
["wod"] = {"Wolani"},
["woe"] = {"Woleaian"},
["wof"] = {"Gambian Wolof"},
["wog"] = {"Wogamusin"},
["woi"] = {"Kamang"},
["wok"] = {"Longto"},
["wom"] = {"Wom (Nigeria)"},
["won"] = {"Wongo"},
["woo"] = {"Manombai"},
["wor"] = {"Woria"},
["wos"] = {"Hanga Hundi"},
["wow"] = {"Wawonii"},
["woy"] = {"Weyto"},
["wpc"] = {"Maco"},
["wrb"] = {"Waluwarra", "Warluwara"},
["wrg"] = {"Warungu", "Gudjal"},
["wrh"] = {"Wiradjuri"},
["wri"] = {"Wariyangga"},
["wrk"] = {"Garrwa"},
["wrl"] = {"Warlmanpa"},
["wrm"] = {"Warumungu"},
["wrn"] = {"Warnang"},
["wro"] = {"Worrorra"},
["wrp"] = {"Waropen"},
["wrr"] = {"Wardaman"},
["wrs"] = {"Waris"},
["wru"] = {"Waru"},
["wrv"] = {"Waruna"},
["wrw"] = {"Gugu Warra"},
["wrx"] = {"Wae Rana"},
["wry"] = {"Merwari"},
["wrz"] = {"Waray (Australia)"},
["wsa"] = {"Warembori"},
["wsg"] = {"Adilabad Gondi"},
["wsi"] = {"Wusi"},
["wsk"] = {"Waskia"},
["wsr"] = {"Owenia"},
["wss"] = {"Wasa"},
["wsu"] = {"Wasu"},
["wsv"] = {"Wotapuri-Katarqalai"},
["wtb"] = {"Matambwe"},
["wtf"] = {"Watiwa"},
["wth"] = {"Wathawurrung"},
["wti"] = {"Berta"},
["wtk"] = {"Watakataui"},
["wtm"] = {"Mewati"},
["wtw"] = {"Wotu"},
["wua"] = {"Wikngenchera"},
["wub"] = {"Wunambal"},
["wud"] = {"Wudu"},
["wuh"] = {"Wutunhua"},
["wul"] = {"Silimo"},
["wum"] = {"Wumbvu"},
["wun"] = {"Bungu"},
["wur"] = {"Wurrugu"},
["wut"] = {"Wutung"},
["wuu"] = {"Wu Chinese"},
["wuv"] = {"Wuvulu-Aua"},
["wux"] = {"Wulna"},
["wuy"] = {"Wauyai"},
["wwa"] = {"Waama"},
["wwb"] = {"Wakabunga"},
["wwo"] = {"Wetamut", "Dorig"},
["wwr"] = {"Warrwa"},
["www"] = {"Wawa"},
["wxa"] = {"Waxianghua"},
["wxw"] = {"Wardandi"},
["wyb"] = {"Wangaaybuwan-Ngiyambaa"},
["wyi"] = {"Woiwurrung"},
["wym"] = {"Wymysorys"},
["wyn"] = {"Wyandot"},
["wyr"] = {"Wayoró"},
["wyy"] = {"Western Fijian"},
["xaa"] = {"Andalusian Arabic"},
["xab"] = {"Sambe"},
["xac"] = {"Kachari"},
["xad"] = {"Adai"},
["xae"] = {"Aequian"},
["xag"] = {"Aghwan"},
["xai"] = {"Kaimbé"},
["xaj"] = {"Ararandewára"},
["xak"] = {"Máku"},
["xal"] = {"Kalmyk", "Oirat"},
["xam"] = {"ǀXam"},
["xan"] = {"Xamtanga"},
["xao"] = {"Khao"},
["xap"] = {"Apalachee"},
["xaq"] = {"Aquitanian"},
["xar"] = {"Karami"},
["xas"] = {"Kamas"},
["xat"] = {"Katawixi"},
["xau"] = {"Kauwera"},
["xav"] = {"Xavánte"},
["xaw"] = {"Kawaiisu"},
["xay"] = {"Kayan Mahakam"},
["xbb"] = {"Lower Burdekin"},
["xbc"] = {"Bactrian"},
["xbd"] = {"Bindal"},
["xbe"] = {"Bigambal"},
["xbg"] = {"Bunganditj"},
["xbi"] = {"Kombio"},
["xbj"] = {"Birrpayi"},
["xbm"] = {"Middle Breton"},
["xbn"] = {"Kenaboi"},
["xbo"] = {"Bolgarian"},
["xbp"] = {"Bibbulman"},
["xbr"] = {"Kambera"},
["xbw"] = {"Kambiwá"},
["xby"] = {"Batjala", "Batyala"},
["xcb"] = {"Cumbric"},
["xcc"] = {"Camunic"},
["xce"] = {"Celtiberian"},
["xcg"] = {"Cisalpine Gaulish"},
["xch"] = {"Chemakum", "Chimakum"},
["xcl"] = {"Classical Armenian"},
["xcm"] = {"Comecrudo"},
["xcn"] = {"Cotoname"},
["xco"] = {"Chorasmian"},
["xcr"] = {"Carian"},
["xct"] = {"Classical Tibetan"},
["xcu"] = {"Curonian"},
["xcv"] = {"Chuvantsy"},
["xcw"] = {"Coahuilteco"},
["xcy"] = {"Cayuse"},
["xda"] = {"Darkinyung"},
["xdc"] = {"Dacian"},
["xdk"] = {"Dharuk"},
["xdm"] = {"Edomite"},
["xdo"] = {"Kwandu"},
["xdq"] = {"Kaitag"},
["xdy"] = {"Malayic Dayak"},
["xeb"] = {"Eblan"},
["xed"] = {"Hdi"},
["xeg"] = {"ǁXegwi"},
["xel"] = {"Kelo"},
["xem"] = {"Kembayan"},
["xep"] = {"Epi-Olmec"},
["xer"] = {"Xerénte"},
["xes"] = {"Kesawai"},
["xet"] = {"Xetá"},
["xeu"] = {"Keoru-Ahia"},
["xfa"] = {"Faliscan"},
["xga"] = {"Galatian"},
["xgb"] = {"Gbin"},
["xgd"] = {"Gudang"},
["xgf"] = {"Gabrielino-Fernandeño"},
["xgg"] = {"Goreng"},
["xgi"] = {"Garingbal"},
["xgl"] = {"Galindan"},
["xgm"] = {"Dharumbal", "Guwinmal"},
["xgn"] = {"Mongolian languages"},
["xgr"] = {"Garza"},
["xgu"] = {"Unggumi"},
["xgw"] = {"Guwa"},
["xha"] = {"Harami"},
["xhc"] = {"Hunnic"},
["xhd"] = {"Hadrami"},
["xhe"] = {"Khetrani"},
["xhm"] = {"Middle Khmer (1400 to 1850 CE)"},
["xhr"] = {"Hernican"},
["xht"] = {"Hattic"},
["xhu"] = {"Hurrian"},
["xhv"] = {"Khua"},
["xib"] = {"Iberian"},
["xii"] = {"Xiri"},
["xil"] = {"Illyrian"},
["xin"] = {"Xinca"},
["xir"] = {"Xiriâna"},
["xis"] = {"Kisan"},
["xiv"] = {"Indus Valley Language"},
["xiy"] = {"Xipaya"},
["xjb"] = {"Minjungbal"},
["xjt"] = {"Jaitmatang"},
["xka"] = {"Kalkoti"},
["xkb"] = {"Northern Nago"},
["xkc"] = {"Kho'ini"},
["xkd"] = {"Mendalam Kayan"},
["xke"] = {"Kereho"},
["xkf"] = {"Khengkha"},
["xkg"] = {"Kagoro"},
["xki"] = {"Kenyan Sign Language"},
["xkj"] = {"Kajali"},
["xkk"] = {"Kachok", "Kaco'"},
["xkl"] = {"Mainstream Kenyah"},
["xkn"] = {"Kayan River Kayan"},
["xko"] = {"Kiorr"},
["xkp"] = {"Kabatei"},
["xkq"] = {"Koroni"},
["xkr"] = {"Xakriabá"},
["xks"] = {"Kumbewaha"},
["xkt"] = {"Kantosi"},
["xku"] = {"Kaamba"},
["xkv"] = {"Kgalagadi"},
["xkw"] = {"Kembra"},
["xkx"] = {"Karore"},
["xky"] = {"Uma' Lasan"},
["xkz"] = {"Kurtokha"},
["xla"] = {"Kamula"},
["xlb"] = {"Loup B"},
["xlc"] = {"Lycian"},
["xld"] = {"Lydian"},
["xle"] = {"Lemnian"},
["xlg"] = {"Ligurian (Ancient)"},
["xli"] = {"Liburnian"},
["xln"] = {"Alanic"},
["xlo"] = {"Loup A"},
["xlp"] = {"Lepontic"},
["xls"] = {"Lusitanian"},
["xlu"] = {"Cuneiform Luwian"},
["xly"] = {"Elymian"},
["xma"] = {"Mushungulu"},
["xmb"] = {"Mbonga"},
["xmc"] = {"Makhuwa-Marrevone"},
["xmd"] = {"Mbudum"},
["xme"] = {"Median"},
["xmf"] = {"Mingrelian"},
["xmg"] = {"Mengaka"},
["xmh"] = {"Kugu-Muminh"},
["xmj"] = {"Majera"},
["xmk"] = {"Ancient Macedonian"},
["xml"] = {"Malaysian Sign Language"},
["xmm"] = {"Manado Malay"},
["xmn"] = {"Manichaean Middle Persian"},
["xmo"] = {"Morerebi"},
["xmp"] = {"Kuku-Mu'inh"},
["xmq"] = {"Kuku-Mangk"},
["xmr"] = {"Meroitic"},
["xms"] = {"Moroccan Sign Language"},
["xmt"] = {"Matbat"},
["xmu"] = {"Kamu"},
["xmv"] = {"Antankarana Malagasy", "Tankarana Malagasy"},
["xmw"] = {"Tsimihety Malagasy"},
["xmx"] = {"Salawati", "Maden"},
["xmy"] = {"Mayaguduna"},
["xmz"] = {"Mori Bawah"},
["xna"] = {"Ancient North Arabian"},
["xnb"] = {"Kanakanabu"},
["xnd"] = {"Na-Dene languages"},
["xng"] = {"Middle Mongolian"},
["xnh"] = {"Kuanhua"},
["xni"] = {"Ngarigu"},
["xnj"] = {"Ngoni (Tanzania)"},
["xnk"] = {"Nganakarti"},
["xnm"] = {"Ngumbarl"},
["xnn"] = {"Northern Kankanay"},
["xno"] = {"Anglo-Norman"},
["xnq"] = {"Ngoni (Mozambique)"},
["xnr"] = {"Kangri"},
["xns"] = {"Kanashi"},
["xnt"] = {"Narragansett"},
["xnu"] = {"Nukunul"},
["xny"] = {"Nyiyaparli"},
["xnz"] = {"Kenzi", "Mattoki"},
["xoc"] = {"O'chi'chi'"},
["xod"] = {"Kokoda"},
["xog"] = {"Soga"},
["xoi"] = {"Kominimung"},
["xok"] = {"Xokleng"},
["xom"] = {"Komo (Sudan)"},
["xon"] = {"Konkomba"},
["xoo"] = {"Xukurú"},
["xop"] = {"Kopar"},
["xor"] = {"Korubo"},
["xow"] = {"Kowaki"},
["xpa"] = {"Pirriya"},
["xpb"] = {"Northeastern Tasmanian", "Pyemmairrener"},
["xpc"] = {"Pecheneg"},
["xpd"] = {"Oyster Bay Tasmanian"},
["xpe"] = {"Liberia Kpelle"},
["xpf"] = {"Southeast Tasmanian", "Nuenonne"},
["xpg"] = {"Phrygian"},
["xph"] = {"North Midlands Tasmanian", "Tyerrenoterpanner"},
["xpi"] = {"Pictish"},
["xpj"] = {"Mpalitjanh"},
["xpk"] = {"Kulina Pano"},
["xpl"] = {"Port Sorell Tasmanian"},
["xpm"] = {"Pumpokol"},
["xpn"] = {"Kapinawá"},
["xpo"] = {"Pochutec"},
["xpp"] = {"Puyo-Paekche"},
["xpq"] = {"Mohegan-Pequot"},
["xpr"] = {"Parthian"},
["xps"] = {"Pisidian"},
["xpt"] = {"Punthamara"},
["xpu"] = {"Punic"},
["xpv"] = {"Northern Tasmanian", "Tommeginne"},
["xpw"] = {"Northwestern Tasmanian", "Peerapper"},
["xpx"] = {"Southwestern Tasmanian", "Toogee"},
["xpy"] = {"Puyo"},
["xpz"] = {"Bruny Island Tasmanian"},
["xqa"] = {"Karakhanid"},
["xqt"] = {"Qatabanian"},
["xra"] = {"Krahô"},
["xrb"] = {"Eastern Karaboro"},
["xrd"] = {"Gundungurra"},
["xre"] = {"Kreye"},
["xrg"] = {"Minang"},
["xri"] = {"Krikati-Timbira"},
["xrm"] = {"Armazic"},
["xrn"] = {"Arin"},
["xrr"] = {"Raetic"},
["xrt"] = {"Aranama-Tamique"},
["xru"] = {"Marriammu"},
["xrw"] = {"Karawa"},
["xsa"] = {"Sabaean"},
["xsb"] = {"Sambal"},
["xsc"] = {"Scythian"},
["xsd"] = {"Sidetic"},
["xse"] = {"Sempan"},
["xsh"] = {"Shamang"},
["xsi"] = {"Sio"},
["xsj"] = {"Subi"},
["xsl"] = {"South Slavey", "Dene Zhatié"},
["xsm"] = {"Kasem"},
["xsn"] = {"Sanga (Nigeria)"},
["xso"] = {"Solano"},
["xsp"] = {"Silopi"},
["xsq"] = {"Makhuwa-Saka"},
["xsr"] = {"Sherpa"},
["xsu"] = {"Sanumá"},
["xsv"] = {"Sudovian"},
["xsy"] = {"Saisiyat"},
["xta"] = {"Alcozauca Mixtec"},
["xtb"] = {"Chazumba Mixtec"},
["xtc"] = {"Katcha-Kadugli-Miri"},
["xtd"] = {"Diuxi-Tilantongo Mixtec"},
["xte"] = {"Ketengban"},
["xtg"] = {"Transalpine Gaulish"},
["xth"] = {"Yitha Yitha"},
["xti"] = {"Sinicahua Mixtec"},
["xtj"] = {"San Juan Teita Mixtec"},
["xtl"] = {"Tijaltepec Mixtec"},
["xtm"] = {"Magdalena Peñasco Mixtec"},
["xtn"] = {"Northern Tlaxiaco Mixtec"},
["xto"] = {"Tokharian A"},
["xtp"] = {"San Miguel Piedras Mixtec"},
["xtq"] = {"Tumshuqese"},
["xtr"] = {"Early Tripuri"},
["xts"] = {"Sindihui Mixtec"},
["xtt"] = {"Tacahua Mixtec"},
["xtu"] = {"Cuyamecalco Mixtec"},
["xtv"] = {"Thawa"},
["xtw"] = {"Tawandê"},
["xty"] = {"Yoloxochitl Mixtec"},
["xua"] = {"Alu Kurumba"},
["xub"] = {"Betta Kurumba"},
["xud"] = {"Umiida"},
["xug"] = {"Kunigami"},
["xuj"] = {"Jennu Kurumba"},
["xul"] = {"Ngunawal", "Nunukul"},
["xum"] = {"Umbrian"},
["xun"] = {"Unggaranggu"},
["xuo"] = {"Kuo"},
["xup"] = {"Upper Umpqua"},
["xur"] = {"Urartian"},
["xut"] = {"Kuthant"},
["xuu"] = {"Kxoe", "Khwedam"},
["xve"] = {"Venetic"},
["xvi"] = {"Kamviri"},
["xvn"] = {"Vandalic"},
["xvo"] = {"Volscian"},
["xvs"] = {"Vestinian"},
["xwa"] = {"Kwaza"},
["xwc"] = {"Woccon"},
["xwd"] = {"Wadi Wadi"},
["xwe"] = {"Xwela Gbe"},
["xwg"] = {"Kwegu"},
["xwj"] = {"Wajuk"},
["xwk"] = {"Wangkumara"},
["xwl"] = {"Western Xwla Gbe"},
["xwo"] = {"Written Oirat"},
["xwr"] = {"Kwerba Mamberamo"},
["xwt"] = {"Wotjobaluk"},
["xww"] = {"Wemba Wemba"},
["xxb"] = {"Boro (Ghana)"},
["xxk"] = {"Ke'o"},
["xxm"] = {"Minkin"},
["xxr"] = {"Koropó"},
["xxt"] = {"Tambora"},
["xya"] = {"Yaygir"},
["xyb"] = {"Yandjibara"},
["xyj"] = {"Mayi-Yapi"},
["xyk"] = {"Mayi-Kulan"},
["xyl"] = {"Yalakalore"},
["xyt"] = {"Mayi-Thakurti"},
["xyy"] = {"Yorta Yorta"},
["xzh"] = {"Zhang-Zhung"},
["xzm"] = {"Zemgalian"},
["xzp"] = {"Ancient Zapotec"},
["yaa"] = {"Yaminahua"},
["yab"] = {"Yuhup"},
["yac"] = {"Pass Valley Yali"},
["yad"] = {"Yagua"},
["yae"] = {"Pumé"},
["yaf"] = {"Yaka (Democratic Republic of Congo)"},
["yag"] = {"Yámana"},
["yah"] = {"Yazgulyam"},
["yai"] = {"Yagnobi"},
["yaj"] = {"Banda-Yangere"},
["yak"] = {"Yakama"},
["yal"] = {"Yalunka"},
["yam"] = {"Yamba"},
["yan"] = {"Mayangna"},
["yao"] = {"Yao"},
["yap"] = {"Yapese"},
["yaq"] = {"Yaqui"},
["yar"] = {"Yabarana"},
["yas"] = {"Nugunu (Cameroon)"},
["yat"] = {"Yambeta"},
["yau"] = {"Yuwana"},
["yav"] = {"Yangben"},
["yaw"] = {"Yawalapití"},
["yax"] = {"Yauma"},
["yay"] = {"Agwagwune"},
["yaz"] = {"Lokaa"},
["yba"] = {"Yala"},
["ybb"] = {"Yemba"},
["ybe"] = {"West Yugur"},
["ybh"] = {"Yakha"},
["ybi"] = {"Yamphu"},
["ybj"] = {"Hasha"},
["ybk"] = {"Bokha"},
["ybl"] = {"Yukuben"},
["ybm"] = {"Yaben"},
["ybn"] = {"Yabaâna"},
["ybo"] = {"Yabong"},
["ybx"] = {"Yawiyo"},
["yby"] = {"Yaweyuha"},
["ych"] = {"Chesu"},
["ycl"] = {"Lolopo"},
["ycn"] = {"Yucuna"},
["ycp"] = {"Chepya"},
["ycr"] = {"Yilan Creole"},
["yda"] = {"Yanda"},
["ydd"] = {"Eastern Yiddish"},
["yde"] = {"Yangum Dey"},
["ydg"] = {"Yidgha"},
["ydk"] = {"Yoidik"},
["yea"] = {"Ravula"},
["yec"] = {"Yeniche"},
["yee"] = {"Yimas"},
["yei"] = {"Yeni"},
["yej"] = {"Yevanic"},
["yel"] = {"Yela"},
["yer"] = {"Tarok"},
["yes"] = {"Nyankpa"},
["yet"] = {"Yetfa"},
["yeu"] = {"Yerukula"},
["yev"] = {"Yapunda"},
["yey"] = {"Yeyi"},
["yga"] = {"Malyangapa"},
["ygi"] = {"Yiningayi"},
["ygl"] = {"Yangum Gel"},
["ygm"] = {"Yagomi"},
["ygp"] = {"Gepo"},
["ygr"] = {"Yagaria"},
["ygs"] = {"Yolŋu Sign Language"},
["ygu"] = {"Yugul"},
["ygw"] = {"Yagwoia"},
["yha"] = {"Baha Buyang"},
["yhd"] = {"Judeo-Iraqi Arabic"},
["yhl"] = {"Hlepho Phowa"},
["yhs"] = {"Yan-nhaŋu Sign Language"},
["yia"] = {"Yinggarda"},
["yif"] = {"Ache"},
["yig"] = {"Wusa Nasu"},
["yih"] = {"Western Yiddish"},
["yii"] = {"Yidiny"},
["yij"] = {"Yindjibarndi"},
["yik"] = {"Dongshanba Lalo"},
["yil"] = {"Yindjilandji"},
["yim"] = {"Yimchungru Naga"},
["yin"] = {"Riang Lai", "Yinchia"},
["yip"] = {"Pholo"},
["yiq"] = {"Miqie"},
["yir"] = {"North Awyu"},
["yis"] = {"Yis"},
["yit"] = {"Eastern Lalu"},
["yiu"] = {"Awu"},
["yiv"] = {"Northern Nisu"},
["yix"] = {"Axi Yi"},
["yiz"] = {"Azhe"},
["yka"] = {"Yakan"},
["ykg"] = {"Northern Yukaghir"},
["ykh"] = {"Khamnigan Mongol"},
["yki"] = {"Yoke"},
["ykk"] = {"Yakaikeke"},
["ykl"] = {"Khlula"},
["ykm"] = {"Kap"},
["ykn"] = {"Kua-nsi"},
["yko"] = {"Iyasa", "Yasa"},
["ykr"] = {"Yekora"},
["ykt"] = {"Kathu"},
["yku"] = {"Kuamasi"},
["yky"] = {"Yakoma"},
["yla"] = {"Yaul"},
["ylb"] = {"Yaleba"},
["yle"] = {"Yele"},
["ylg"] = {"Yelogu"},
["yli"] = {"Angguruk Yali"},
["yll"] = {"Yil"},
["ylm"] = {"Limi"},
["yln"] = {"Langnian Buyang"},
["ylo"] = {"Naluo Yi"},
["ylr"] = {"Yalarnnga"},
["ylu"] = {"Aribwaung"},
["yly"] = {"Nyâlayu", "Nyelâyu"},
["ymb"] = {"Yambes"},
["ymc"] = {"Southern Muji"},
["ymd"] = {"Muda"},
["yme"] = {"Yameo"},
["ymg"] = {"Yamongeri"},
["ymh"] = {"Mili"},
["ymi"] = {"Moji"},
["ymk"] = {"Makwe"},
["yml"] = {"Iamalele"},
["ymm"] = {"Maay"},
["ymn"] = {"Yamna", "Sunum"},
["ymo"] = {"Yangum Mon"},
["ymp"] = {"Yamap"},
["ymq"] = {"Qila Muji"},
["ymr"] = {"Malasar"},
["yms"] = {"Mysian"},
["ymx"] = {"Northern Muji"},
["ymz"] = {"Muzi"},
["yna"] = {"Aluo"},
["ynb"] = {"Yamben"},
["ynd"] = {"Yandruwandha"},
["yne"] = {"Lang'e"},
["yng"] = {"Yango"},
["ynk"] = {"Naukan Yupik"},
["ynl"] = {"Yangulam"},
["ynn"] = {"Yana"},
["yno"] = {"Yong"},
["ynq"] = {"Yendang"},
["yns"] = {"Yansi"},
["ynu"] = {"Yahuna"},
["yob"] = {"Yoba"},
["yog"] = {"Yogad"},
["yoi"] = {"Yonaguni"},
["yok"] = {"Yokuts"},
["yom"] = {"Yombe"},
["yon"] = {"Yongkom"},
["yot"] = {"Yotti"},
["yox"] = {"Yoron"},
["yoy"] = {"Yoy"},
["ypa"] = {"Phala"},
["ypb"] = {"Labo Phowa"},
["ypg"] = {"Phola"},
["yph"] = {"Phupha"},
["ypk"] = {"Yupik languages"},
["ypm"] = {"Phuma"},
["ypn"] = {"Ani Phowa"},
["ypo"] = {"Alo Phola"},
["ypp"] = {"Phupa"},
["ypz"] = {"Phuza"},
["yra"] = {"Yerakai"},
["yrb"] = {"Yareba"},
["yre"] = {"Yaouré"},
["yrk"] = {"Nenets"},
["yrl"] = {"Nhengatu"},
["yrm"] = {"Yirrk-Mel"},
["yrn"] = {"Yerong"},
["yro"] = {"Yaroamë"},
["yrs"] = {"Yarsun"},
["yrw"] = {"Yarawata"},
["yry"] = {"Yarluyandi"},
["ysc"] = {"Yassic"},
["ysd"] = {"Samatao"},
["ysg"] = {"Sonaga"},
["ysl"] = {"Yugoslavian Sign Language"},
["ysm"] = {"Myanmar Sign Language"},
["ysn"] = {"Sani"},
["yso"] = {"Nisi (China)"},
["ysp"] = {"Southern Lolopo"},
["ysr"] = {"Sirenik Yupik"},
["yss"] = {"Yessan-Mayo"},
["ysy"] = {"Sanie"},
["yta"] = {"Talu"},
["ytl"] = {"Tanglang"},
["ytp"] = {"Thopho"},
["ytw"] = {"Yout Wam"},
["yty"] = {"Yatay"},
["yua"] = {"Yucateco", "Yucatec Maya"},
["yub"] = {"Yugambal"},
["yuc"] = {"Yuchi"},
["yud"] = {"Judeo-Tripolitanian Arabic"},
["yue"] = {"Yue Chinese", "Cantonese"},
["yuf"] = {"Havasupai-Walapai-Yavapai"},
["yug"] = {"Yug"},
["yui"] = {"Yurutí"},
["yuj"] = {"Karkar-Yuri"},
["yuk"] = {"Yuki"},
["yul"] = {"Yulu"},
["yum"] = {"Quechan"},
["yun"] = {"Bena (Nigeria)"},
["yup"] = {"Yukpa"},
["yuq"] = {"Yuqui"},
["yur"] = {"Yurok"},
["yut"] = {"Yopno"},
["yuw"] = {"Yau (Morobe Province)"},
["yux"] = {"Southern Yukaghir"},
["yuy"] = {"East Yugur"},
["yuz"] = {"Yuracare"},
["yva"] = {"Yawa"},
["yvt"] = {"Yavitero"},
["ywa"] = {"Kalou"},
["ywg"] = {"Yinhawangka"},
["ywl"] = {"Western Lalu"},
["ywn"] = {"Yawanawa"},
["ywq"] = {"Wuding-Luquan Yi"},
["ywr"] = {"Yawuru"},
["ywt"] = {"Xishanba Lalo", "Central Lalo"},
["ywu"] = {"Wumeng Nasu"},
["yww"] = {"Yawarawarga"},
["yxa"] = {"Mayawali"},
["yxg"] = {"Yagara"},
["yxl"] = {"Yardliyawarra"},
["yxm"] = {"Yinwum"},
["yxu"] = {"Yuyu"},
["yxy"] = {"Yabula Yabula"},
["yyr"] = {"Yir Yoront"},
["yyu"] = {"Yau (Sandaun Province)"},
["yyz"] = {"Ayizi"},
["yzg"] = {"E'ma Buyang"},
["yzk"] = {"Zokhuo"},
["zaa"] = {"Sierra de Juárez Zapotec"},
["zab"] = {"Western Tlacolula Valley Zapotec", "San Juan Guelavía Zapotec"},
["zac"] = {"Ocotlán Zapotec"},
["zad"] = {"Cajonos Zapotec"},
["zae"] = {"Yareni Zapotec"},
["zaf"] = {"Ayoquesco Zapotec"},
["zag"] = {"Zaghawa"},
["zah"] = {"Zangwal"},
["zai"] = {"Isthmus Zapotec"},
["zaj"] = {"Zaramo"},
["zak"] = {"Zanaki"},
["zal"] = {"Zauzou"},
["zam"] = {"Miahuatlán Zapotec"},
["zao"] = {"Ozolotepec Zapotec"},
["zap"] = {"Zapotec"},
["zaq"] = {"Aloápam Zapotec"},
["zar"] = {"Rincón Zapotec"},
["zas"] = {"Santo Domingo Albarradas Zapotec"},
["zat"] = {"Tabaa Zapotec"},
["zau"] = {"Zangskari"},
["zav"] = {"Yatzachi Zapotec"},
["zaw"] = {"Mitla Zapotec"},
["zax"] = {"Xadani Zapotec"},
["zay"] = {"Zayse-Zergulla", "Zaysete"},
["zaz"] = {"Zari"},
["zba"] = {"Balaibalan"},
["zbc"] = {"Central Berawan"},
["zbe"] = {"East Berawan"},
["zbl"] = {"Blissymbols", "Bliss", "Blissymbolics"},
["zbt"] = {"Batui"},
["zbu"] = {"Bu (Bauchi State)"},
["zbw"] = {"West Berawan"},
["zca"] = {"Coatecas Altas Zapotec"},
["zcd"] = {"Las Delicias Zapotec"},
["zch"] = {"Central Hongshuihe Zhuang"},
["zdj"] = {"Ngazidja Comorian"},
["zea"] = {"Zeeuws"},
["zeg"] = {"Zenag"},
["zeh"] = {"Eastern Hongshuihe Zhuang"},
["zem"] = {"Zeem"},
["zen"] = {"Zenaga"},
["zga"] = {"Kinga"},
["zgb"] = {"Guibei Zhuang"},
["zgh"] = {"Standard Moroccan Tamazight"},
["zgm"] = {"Minz Zhuang"},
["zgn"] = {"Guibian Zhuang"},
["zgr"] = {"Magori"},
["zhb"] = {"Zhaba"},
["zhd"] = {"Dai Zhuang"},
["zhi"] = {"Zhire"},
["zhk"] = {"Kurdish Sign Language"},
["zhn"] = {"Nong Zhuang"},
["zhw"] = {"Zhoa"},
["zhx"] = {"Chinese (family)"},
["zia"] = {"Zia"},
["zib"] = {"Zimbabwe Sign Language"},
["zik"] = {"Zimakani"},
["zil"] = {"Zialo"},
["zim"] = {"Mesme"},
["zin"] = {"Zinza"},
["ziw"] = {"Zigula"},
["ziz"] = {"Zizilivakan"},
["zka"] = {"Kaimbulawa"},
["zkd"] = {"Kadu"},
["zkg"] = {"Koguryo"},
["zkh"] = {"Khorezmian"},
["zkk"] = {"Karankawa"},
["zkn"] = {"Kanan"},
["zko"] = {"Kott"},
["zkp"] = {"São Paulo Kaingáng"},
["zkr"] = {"Zakhring"},
["zkt"] = {"Kitan"},
["zku"] = {"Kaurna"},
["zkv"] = {"Krevinian"},
["zkz"] = {"Khazar"},
["zla"] = {"Zula"},
["zle"] = {"East Slavic languages"},
["zlj"] = {"Liujiang Zhuang"},
["zlm"] = {"Malay (individual language)"},
["zln"] = {"Lianshan Zhuang"},
["zlq"] = {"Liuqian Zhuang"},
["zls"] = {"South Slavic languages"},
["zlu"] = {"Zul"},
["zlw"] = {"West Slavic languages"},
["zma"] = {"Manda (Australia)"},
["zmb"] = {"Zimba"},
["zmc"] = {"Margany"},
["zmd"] = {"Maridan"},
["zme"] = {"Mangerr"},
["zmf"] = {"Mfinu"},
["zmg"] = {"Marti Ke"},
["zmh"] = {"Makolkol"},
["zmi"] = {"Negeri Sembilan Malay"},
["zmj"] = {"Maridjabin"},
["zmk"] = {"Mandandanyi"},
["zml"] = {"Matngala"},
["zmm"] = {"Marimanindji", "Marramaninyshi"},
["zmn"] = {"Mbangwe"},
["zmo"] = {"Molo"},
["zmp"] = {"Mbuun"},
["zmq"] = {"Mituku"},
["zmr"] = {"Maranunggu"},
["zms"] = {"Mbesa"},
["zmt"] = {"Maringarr"},
["zmu"] = {"Muruwari"},
["zmv"] = {"Mbariman-Gudhinma"},
["zmw"] = {"Mbo (Democratic Republic of Congo)"},
["zmx"] = {"Bomitaba"},
["zmy"] = {"Mariyedi"},
["zmz"] = {"Mbandja"},
["zna"] = {"Zan Gula"},
["znd"] = {"Zande languages"},
["zne"] = {"Zande (individual language)"},
["zng"] = {"Mang"},
["znk"] = {"Manangkari"},
["zns"] = {"Mangas"},
["zoc"] = {"Copainalá Zoque"},
["zoh"] = {"Chimalapa Zoque"},
["zom"] = {"Zou"},
["zoo"] = {"Asunción Mixtepec Zapotec"},
["zoq"] = {"Tabasco Zoque"},
["zor"] = {"Rayón Zoque"},
["zos"] = {"Francisco León Zoque"},
["zpa"] = {"Lachiguiri Zapotec"},
["zpb"] = {"Yautepec Zapotec"},
["zpc"] = {"Choapan Zapotec"},
["zpd"] = {"Southeastern Ixtlán Zapotec"},
["zpe"] = {"Petapa Zapotec"},
["zpf"] = {"San Pedro Quiatoni Zapotec"},
["zpg"] = {"Guevea De Humboldt Zapotec"},
["zph"] = {"Totomachapan Zapotec"},
["zpi"] = {"Santa María Quiegolani Zapotec"},
["zpj"] = {"Quiavicuzas Zapotec"},
["zpk"] = {"Tlacolulita Zapotec"},
["zpl"] = {"Lachixío Zapotec"},
["zpm"] = {"Mixtepec Zapotec"},
["zpn"] = {"Santa Inés Yatzechi Zapotec"},
["zpo"] = {"Amatlán Zapotec"},
["zpp"] = {"El Alto Zapotec"},
["zpq"] = {"Zoogocho Zapotec"},
["zpr"] = {"Santiago Xanica Zapotec"},
["zps"] = {"Coatlán Zapotec"},
["zpt"] = {"San Vicente Coatlán Zapotec"},
["zpu"] = {"Yalálag Zapotec"},
["zpv"] = {"Chichicapan Zapotec"},
["zpw"] = {"Zaniza Zapotec"},
["zpx"] = {"San Baltazar Loxicha Zapotec"},
["zpy"] = {"Mazaltepec Zapotec"},
["zpz"] = {"Texmelucan Zapotec"},
["zqe"] = {"Qiubei Zhuang"},
["zra"] = {"Kara (Korea)"},
["zrg"] = {"Mirgan"},
["zrn"] = {"Zerenkel"},
["zro"] = {"Záparo"},
["zrp"] = {"Zarphatic"},
["zrs"] = {"Mairasi"},
["zsa"] = {"Sarasira"},
["zsk"] = {"Kaskean"},
["zsl"] = {"Zambian Sign Language"},
["zsm"] = {"Standard Malay"},
["zsr"] = {"Southern Rincon Zapotec"},
["zsu"] = {"Sukurum"},
["zte"] = {"Elotepec Zapotec"},
["ztg"] = {"Xanaguía Zapotec"},
["ztl"] = {"Lapaguía-Guivini Zapotec"},
["ztm"] = {"San Agustín Mixtepec Zapotec"},
["ztn"] = {"Santa Catarina Albarradas Zapotec"},
["ztp"] = {"Loxicha Zapotec"},
["ztq"] = {"Quioquitani-Quierí Zapotec"},
["zts"] = {"Tilquiapan Zapotec"},
["ztt"] = {"Tejalapan Zapotec"},
["ztu"] = {"Güilá Zapotec"},
["ztx"] = {"Zaachila Zapotec"},
["zty"] = {"Yatee Zapotec"},
["zuh"] = {"Tokano"},
["zum"] = {"Kumzari"},
["zun"] = {"Zuni"},
["zuy"] = {"Zumaya"},
["zwa"] = {"Zay"},
["zxx"] = {"No linguistic content", "Not applicable"},
["zyb"] = {"Yongbei Zhuang"},
["zyg"] = {"Yang Zhuang"},
["zyj"] = {"Youjiang Zhuang"},
["zyn"] = {"Yongnan Zhuang"},
["zyp"] = {"Zyphe Chin"},
["zza"] = {"Zaza", "Dimili", "Dimli (macrolanguage)", "Kirdki", "Kirmanjki (macrolanguage)", "Zazaki"},
["zzj"] = {"Zuojiang Zhuang"}
}
local deprecated = {
["bh"] = {"Bihari languages"},
["in"] = {"Indonesian"},
["iw"] = {"Hebrew"},
["ji"] = {"Yiddish"},
["jw"] = {"Javanese"},
["mo"] = {"Moldavian", "Moldovan"},
["aam"] = {"Aramanik"},
["adp"] = {"Adap"},
["agp"] = {"Paranan"},
["ais"] = {"Nataoran Amis"},
["ajp"] = {"South Levantine Arabic"},
["ajt"] = {"Judeo-Tunisian Arabic"},
["aoh"] = {"Arma"},
["asd"] = {"Asas"},
["aue"] = {"ǂKxʼauǁʼein"},
["ayx"] = {"Ayi (China)"},
["ayy"] = {"Tayabas Ayta"},
["baz"] = {"Tunen"},
["bbz"] = {"Babalia Creole Arabic"},
["bgm"] = {"Baga Mboteni"},
["bhk"] = {"Albay Bicolano"},
["bic"] = {"Bikaru"},
["bij"] = {"Vaghat-Ya-Bijim-Legeri"},
["bjd"] = {"Bandjigali"},
["bjq"] = {"Southern Betsimisaraka Malagasy"},
["bkb"] = {"Finallig"},
["blg"] = {"Balau"},
["bmy"] = {"Bemba (Democratic Republic of Congo)"},
["bpb"] = {"Barbacoas"},
["btb"] = {"Beti (Cameroon)"},
["btl"] = {"Bhatola"},
["bxx"] = {"Borna (Democratic Republic of Congo)"},
["byy"] = {"Buya"},
["cbe"] = {"Chipiajes"},
["cbh"] = {"Cagua"},
["cca"] = {"Cauca"},
["ccq"] = {"Chaungtha"},
["cdg"] = {"Chamari"},
["cjr"] = {"Chorotega"},
["cka"] = {"Khumi Awa Chin"},
["cmk"] = {"Chimakum"},
["coy"] = {"Coyaima"},
["cqu"] = {"Chilean Quechua"},
["cug"] = {"Chungmboko", "Cung"},
["cum"] = {"Cumeral"},
["daf"] = {"Dan"},
["dap"] = {"Nisi (India)"},
["dek"] = {"Dek"},
["dgu"] = {"Degaru"},
["dha"] = {"Dhanwar (India)"},
["dit"] = {"Dirari"},
["djl"] = {"Djiwarli"},
["dkl"] = {"Kolum So Dogon"},
["drh"] = {"Darkhat"},
["drr"] = {"Dororo"},
["drw"] = {"Darwazi"},
["dud"] = {"Hun-Saare"},
["duj"] = {"Dhuwal"},
["dwl"] = {"Walo Kumbe Dogon"},
["ekc"] = {"Eastern Karnic"},
["elp"] = {"Elpaputih"},
["emo"] = {"Emok"},
["gav"] = {"Gabutamon"},
["gbc"] = {"Garawa"},
["gfx"] = {"Mangetti Dune ǃXung"},
["ggn"] = {"Eastern Gurung"},
["ggo"] = {"Southern Gondi"},
["ggr"] = {"Aghu Tharnggalu"},
["gio"] = {"Gelao"},
["gji"] = {"Geji"},
["gli"] = {"Guliguli"},
["gti"] = {"Gbati-ri"},
["guv"] = {"Gey"},
["hrr"] = {"Horuru"},
["iap"] = {"Iapama"},
["ibi"] = {"Ibilo"},
["ill"] = {"Iranun"},
["ilw"] = {"Talur"},
["ime"] = {"Imeraguen"},
["izi"] = {"Izi-Ezaa-Ikwo-Mgbo"},
["jar"] = {"Jarawa (Nigeria)"},
["jeg"] = {"Jeng"},
["kbf"] = {"Kakauhua"},
["kdv"] = {"Kado"},
["kgc"] = {"Kasseng"},
["kgd"] = {"Kataang"},
["kgh"] = {"Upper Tanudan Kalinga"},
["kgm"] = {"Karipúna"},
["kjf"] = {"Khalaj [Indo-Iranian]"},
["koj"] = {"Sara Dunjo"},
["kox"] = {"Coxima"},
["kpp"] = {"Paku Karen"},
["krm"] = {"Krim"},
["ksa"] = {"Shuwa-Zamani"},
["ktr"] = {"Kota Marudu Tinagas"},
["kvs"] = {"Kunggara"},
["kwq"] = {"Kwak"},
["kxe"] = {"Kakihum"},
["kxl"] = {"Nepali Kurux"},
["kxu"] = {"Kui (India)"},
["kzh"] = {"Kenuzi-Dongola"},
["kzj"] = {"Coastal Kadazan"},
["kzt"] = {"Tambunan Dusun"},
["lak"] = {"Laka (Nigeria)"},
["lba"] = {"Lui"},
["leg"] = {"Lengua"},
["lii"] = {"Lingkhim"},
["llo"] = {"Khlor"},
["lmm"] = {"Lamam"},
["lmz"] = {"Lumbee"},
["lno"] = {"Lango (South Sudan)"},
["lsg"] = {"Lyons Sign Language"},
["meg"] = {"Mea"},
["mgx"] = {"Omati"},
["mhh"] = {"Maskoy Pidgin"},
["mja"] = {"Mahei"},
["mld"] = {"Malakhel"},
["mnt"] = {"Maykulan"},
["mof"] = {"Mohegan-Montauk-Narragansett"},
["mrd"] = {"Western Magar"},
["mst"] = {"Cataelano Mandaya"},
["mvm"] = {"Muya"},
["mwd"] = {"Mudbura"},
["mwj"] = {"Maligo"},
["mwx"] = {"Mediak"},
["mwy"] = {"Mosiro"},
["myd"] = {"Maramba"},
["myi"] = {"Mina (India)"},
["myq"] = {"Forest Maninka"},
["myt"] = {"Sangab Mandaya"},
["nad"] = {"Nijadali"},
["nbf"] = {"Naxi"},
["nbx"] = {"Ngura"},
["ncp"] = {"Ndaktup"},
["ngo"] = {"Ngoni"},
["nln"] = {"Durango Nahuatl"},
["nlr"] = {"Ngarla"},
["nns"] = {"Ningye"},
["nnx"] = {"Ngong"},
["nom"] = {"Nocamán"},
["noo"] = {"Nootka"},
["nte"] = {"Nathembo"},
["nts"] = {"Natagaimas"},
["nxu"] = {"Narau"},
["ome"] = {"Omejes"},
["oun"] = {"ǃOǃung"},
["pat"] = {"Papitalai"},
["pbz"] = {"Palu"},
["pcr"] = {"Panang"},
["pgy"] = {"Pongyong"},
["pii"] = {"Pini"},
["plj"] = {"Polci"},
["plp"] = {"Palpa"},
["pmc"] = {"Palumata"},
["pmk"] = {"Pamlico"},
["pmu"] = {"Mirpur Panjabi"},
["pod"] = {"Ponares"},
["ppa"] = {"Pao"},
["ppr"] = {"Piru"},
["prb"] = {"Lua'"},
["prp"] = {"Parsi"},
["pry"] = {"Pray 3"},
["puk"] = {"Pu Ko"},
["puz"] = {"Purum Naga"},
["rie"] = {"Rien"},
["rmr"] = {"Caló"},
["rna"] = {"Runa"},
["rsi"] = {"Rennellese Sign Language"},
["sap"] = {"Sanapaná"},
["sca"] = {"Sansu"},
["sdm"] = {"Semandang"},
["sgl"] = {"Sanglechi-Ishkashimi"},
["sgo"] = {"Songa"},
["shl"] = {"Shendu"},
["skk"] = {"Sok"},
["slq"] = {"Salchuq"},
["smd"] = {"Sama"},
["snb"] = {"Sebuyau"},
["snh"] = {"Shinabo"},
["sul"] = {"Surigaonon"},
["sum"] = {"Sumo-Mayangna"},
["svr"] = {"Savara"},
["szd"] = {"Seru"},
["tbb"] = {"Tapeba"},
["tdu"] = {"Tempasuk Dusun"},
["tgg"] = {"Tangga"},
["thc"] = {"Tai Hang Tong"},
["thw"] = {"Thudam"},
["thx"] = {"The"},
["tid"] = {"Tidong"},
["tie"] = {"Tingal"},
["tkk"] = {"Takpa"},
["tlw"] = {"South Wemale"},
["tmk"] = {"Northwestern Tamang"},
["tmp"] = {"Tai Mène"},
["tne"] = {"Tinoc Kallahan"},
["tnf"] = {"Tangshewi"},
["toe"] = {"Tomedes"},
["tpw"] = {"Tupí"},
["tsf"] = {"Southwestern Tamang"},
["unp"] = {"Worora"},
["uok"] = {"Uokha"},
["uun"] = {"Kulon-Pazeh"},
["vki"] = {"Ija-Zuba"},
["wgw"] = {"Wagawaga"},
["wit"] = {"Wintu"},
["wiw"] = {"Wirangu"},
["wra"] = {"Warapu"},
["wrd"] = {"Warduji"},
["wya"] = {"Wyandot"},
["xba"] = {"Kamba (Brazil)"},
["xbx"] = {"Kabixí"},
["xia"] = {"Xiandao"},
["xip"] = {"Xipináwa"},
["xkh"] = {"Karahawyana"},
["xrq"] = {"Karranga"},
["xss"] = {"Assan"},
["xtz"] = {"Tasmanian"},
["ybd"] = {"Yangbye"},
["yds"] = {"Yiddish Sign Language"},
["yen"] = {"Yendang"},
["yiy"] = {"Yir Yoront"},
["yma"] = {"Yamphe"},
["ymt"] = {"Mator-Taygi-Karagas"},
["ynh"] = {"Yangho"},
["yol"] = {"Yola"},
["yos"] = {"Yos"},
["yri"] = {"Yarí"},
["yuu"] = {"Yugh"},
["zir"] = {"Ziriya"},
["zkb"] = {"Koibal"},
["zua"] = {"Zeem"}
}
return {
active = active,
deprecated = deprecated,
}
dwxccqkm27xvpvxbjnwmpa3l7h226s0
Module:Lang/data/iana scripts
828
1030
32903
8983
2026-10-10T22:29:04Z
en>Trappist the monk
0
update to 2026-09-17 data;
32903
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["Adlm"] = {"Adlam"},
["Afak"] = {"Afaka"},
["Aghb"] = {"Caucasian Albanian"},
["Ahom"] = {"Ahom", "Tai Ahom"},
["Arab"] = {"Arabic"},
["Aran"] = {"Arabic (Nastaliq variant)"},
["Armi"] = {"Imperial Aramaic"},
["Armn"] = {"Armenian"},
["Avst"] = {"Avestan"},
["Bali"] = {"Balinese"},
["Bamu"] = {"Bamum"},
["Bass"] = {"Bassa Vah"},
["Batk"] = {"Batak"},
["Beng"] = {"Bengali", "Bangla"},
["Berf"] = {"Beria Erfe"},
["Bhks"] = {"Bhaiksuki"},
["Blis"] = {"Blissymbols"},
["Bopo"] = {"Bopomofo"},
["Brah"] = {"Brahmi"},
["Brai"] = {"Braille"},
["Bugi"] = {"Buginese"},
["Buhd"] = {"Buhid"},
["Cakm"] = {"Chakma"},
["Cans"] = {"Unified Canadian Aboriginal Syllabics"},
["Cari"] = {"Carian"},
["Cham"] = {"Cham"},
["Cher"] = {"Cherokee"},
["Chis"] = {"Chisoi"},
["Chrs"] = {"Chorasmian"},
["Cirt"] = {"Cirth"},
["Copt"] = {"Coptic"},
["Cpmn"] = {"Cypro-Minoan"},
["Cprt"] = {"Cypriot syllabary"},
["Cyrl"] = {"Cyrillic"},
["Cyrs"] = {"Cyrillic (Old Church Slavonic variant)"},
["Deva"] = {"Devanagari", "Nagari"},
["Diak"] = {"Dives Akuru"},
["Dogr"] = {"Dogra"},
["Dsrt"] = {"Deseret", "Mormon"},
["Dupl"] = {"Duployan shorthand", "Duployan stenography"},
["Egyd"] = {"Egyptian demotic"},
["Egyh"] = {"Egyptian hieratic"},
["Egyp"] = {"Egyptian hieroglyphs"},
["Elba"] = {"Elbasan"},
["Elym"] = {"Elymaic"},
["Ethi"] = {"Ethiopic", "Geʻez", "Ge'ez"},
["Gara"] = {"Garay"},
["Geok"] = {"Khutsuri (Asomtavruli and Nuskhuri)"},
["Geor"] = {"Georgian (Mkhedruli and Mtavruli)"},
["Glag"] = {"Glagolitic"},
["Gong"] = {"Gunjala Gondi"},
["Gonm"] = {"Masaram Gondi"},
["Goth"] = {"Gothic"},
["Gran"] = {"Grantha"},
["Grek"] = {"Greek"},
["Gujr"] = {"Gujarati"},
["Gukh"] = {"Gurung Khema"},
["Guru"] = {"Gurmukhi"},
["Hanb"] = {"Han with Bopomofo (alias for Han + Bopomofo)"},
["Hang"] = {"Hangul", "Hangŭl", "Hangeul"},
["Hani"] = {"Han", "Hanzi", "Kanji", "Hanja"},
["Hano"] = {"Hanunoo", "Hanunóo"},
["Hans"] = {"Han (Simplified variant)"},
["Hant"] = {"Han (Traditional variant)"},
["Hatr"] = {"Hatran"},
["Hebr"] = {"Hebrew"},
["Hira"] = {"Hiragana"},
["Hluw"] = {"Anatolian Hieroglyphs", "Luwian Hieroglyphs", "Hittite Hieroglyphs"},
["Hmng"] = {"Pahawh Hmong"},
["Hmnp"] = {"Nyiakeng Puachue Hmong"},
["Hntl"] = {"Han (Traditional variant) with Latin (alias for Hant + Latn)"},
["Hrkt"] = {"Japanese syllabaries (alias for Hiragana + Katakana)"},
["Hung"] = {"Old Hungarian", "Hungarian Runic"},
["Inds"] = {"Indus", "Harappan"},
["Ital"] = {"Old Italic (Etruscan, Oscan, etc.)"},
["Jamo"] = {"Jamo (alias for Jamo subset of Hangul)"},
["Java"] = {"Javanese"},
["Jpan"] = {"Japanese (alias for Han + Hiragana + Katakana)"},
["Jurc"] = {"Jurchen"},
["Kali"] = {"Kayah Li"},
["Kana"] = {"Katakana"},
["Kawi"] = {"Kawi"},
["Khar"] = {"Kharoshthi"},
["Khmr"] = {"Khmer"},
["Khoj"] = {"Khojki"},
["Kitl"] = {"Khitan large script"},
["Kits"] = {"Khitan small script"},
["Knda"] = {"Kannada"},
["Kore"] = {"Korean (alias for Hangul + Han)"},
["Kpel"] = {"Kpelle"},
["Krai"] = {"Kirat Rai"},
["Kthi"] = {"Kaithi"},
["Lana"] = {"Tai Tham", "Lanna"},
["Laoo"] = {"Lao"},
["Latf"] = {"Latin (Fraktur variant)"},
["Latg"] = {"Latin (Gaelic variant)"},
["Latn"] = {"Latin"},
["Leke"] = {"Leke"},
["Lepc"] = {"Lepcha", "Róng"},
["Limb"] = {"Limbu"},
["Lina"] = {"Linear A"},
["Linb"] = {"Linear B"},
["Lisu"] = {"Lisu", "Fraser"},
["Loma"] = {"Loma"},
["Lyci"] = {"Lycian"},
["Lydi"] = {"Lydian"},
["Mahj"] = {"Mahajani"},
["Maka"] = {"Makasar"},
["Mand"] = {"Mandaic", "Mandaean"},
["Mani"] = {"Manichaean"},
["Marc"] = {"Marchen"},
["Maya"] = {"Mayan hieroglyphs"},
["Medf"] = {"Medefaidrin", "Oberi Okaime", "Oberi Ɔkaimɛ"},
["Mend"] = {"Mende Kikakui"},
["Merc"] = {"Meroitic Cursive"},
["Mero"] = {"Meroitic Hieroglyphs"},
["Mlym"] = {"Malayalam"},
["Modi"] = {"Modi", "Moḍī"},
["Mong"] = {"Mongolian"},
["Moon"] = {"Moon", "Moon code", "Moon script", "Moon type"},
["Mroo"] = {"Mro", "Mru"},
["Mtei"] = {"Meitei Mayek", "Meithei", "Meetei"},
["Mult"] = {"Multani"},
["Mymr"] = {"Myanmar", "Burmese"},
["Nagm"] = {"Nag Mundari"},
["Nand"] = {"Nandinagari"},
["Narb"] = {"Old North Arabian", "Ancient North Arabian"},
["Nbat"] = {"Nabataean"},
["Newa"] = {"Newa", "Newar", "Newari", "Nepāla lipi"},
["Nkdb"] = {"Naxi Dongba", "na²¹ɕi³³ to³³ba²¹", "Nakhi Tomba"},
["Nkgb"] = {"Naxi Geba", "na²¹ɕi³³ gʌ²¹ba²¹", "'Na-'Khi ²Ggŏ-¹baw", "Nakhi Geba"},
["Nkoo"] = {"N’Ko", "N'Ko"},
["Nshu"] = {"Nüshu"},
["Ogam"] = {"Ogham"},
["Olck"] = {"Ol Chiki", "Ol Cemet'", "Ol", "Santali"},
["Onao"] = {"Ol Onal"},
["Orkh"] = {"Old Turkic", "Orkhon Runic"},
["Orya"] = {"Oriya", "Odia"},
["Osge"] = {"Osage"},
["Osma"] = {"Osmanya"},
["Ougr"] = {"Old Uyghur"},
["Palm"] = {"Palmyrene"},
["Pauc"] = {"Pau Cin Hau"},
["Pcun"] = {"Proto-Cuneiform"},
["Pelm"] = {"Proto-Elamite"},
["Perm"] = {"Old Permic"},
["Phag"] = {"Phags-pa"},
["Phli"] = {"Inscriptional Pahlavi"},
["Phlp"] = {"Psalter Pahlavi"},
["Phlv"] = {"Book Pahlavi"},
["Phnx"] = {"Phoenician"},
["Piqd"] = {"Klingon (KLI pIqaD)"},
["Plrd"] = {"Miao", "Pollard"},
["Prti"] = {"Inscriptional Parthian"},
["Psin"] = {"Proto-Sinaitic"},
["Ranj"] = {"Ranjana"},
["Rjng"] = {"Rejang", "Redjang", "Kaganga"},
["Rohg"] = {"Hanifi Rohingya"},
["Roro"] = {"Rongorongo"},
["Runr"] = {"Runic"},
["Samr"] = {"Samaritan"},
["Sara"] = {"Sarati"},
["Sarb"] = {"Old South Arabian"},
["Saur"] = {"Saurashtra"},
["Seal"] = {"Seal", "Small Seal"},
["Sgnw"] = {"SignWriting"},
["Shaw"] = {"Shavian", "Shaw"},
["Shrd"] = {"Sharada", "Śāradā"},
["Shui"] = {"Shuishu"},
["Sidd"] = {"Siddham", "Siddhaṃ", "Siddhamātṛkā"},
["Sidt"] = {"Sidetic"},
["Sind"] = {"Khudawadi", "Sindhi"},
["Sinh"] = {"Sinhala"},
["Sogd"] = {"Sogdian"},
["Sogo"] = {"Old Sogdian"},
["Sora"] = {"Sora Sompeng"},
["Soyo"] = {"Soyombo"},
["Sund"] = {"Sundanese"},
["Sunu"] = {"Sunuwar"},
["Sylo"] = {"Syloti Nagri"},
["Syrc"] = {"Syriac"},
["Syre"] = {"Syriac (Estrangelo variant)"},
["Syrj"] = {"Syriac (Western variant)"},
["Syrn"] = {"Syriac (Eastern variant)"},
["Tagb"] = {"Tagbanwa"},
["Takr"] = {"Takri", "Ṭākrī", "Ṭāṅkrī"},
["Tale"] = {"Tai Le"},
["Talu"] = {"New Tai Lue"},
["Taml"] = {"Tamil"},
["Tang"] = {"Tangut"},
["Tavt"] = {"Tai Viet"},
["Tayo"] = {"Tai Yo"},
["Telu"] = {"Telugu"},
["Teng"] = {"Tengwar"},
["Tfng"] = {"Tifinagh", "Berber"},
["Tglg"] = {"Tagalog", "Baybayin", "Alibata"},
["Thaa"] = {"Thaana"},
["Thai"] = {"Thai"},
["Tibt"] = {"Tibetan"},
["Tirh"] = {"Tirhuta"},
["Tnsa"] = {"Tangsa"},
["Todr"] = {"Todhri"},
["Tols"] = {"Tolong Siki"},
["Toto"] = {"Toto"},
["Tutg"] = {"Tulu-Tigalari"},
["Ugar"] = {"Ugaritic"},
["Vaii"] = {"Vai"},
["Visp"] = {"Visible Speech"},
["Vith"] = {"Vithkuqi"},
["Wara"] = {"Warang Citi", "Varang Kshiti"},
["Wcho"] = {"Wancho"},
["Wole"] = {"Woleai"},
["Xpeo"] = {"Old Persian"},
["Xsux"] = {"Sumero-Akkadian cuneiform"},
["Yezi"] = {"Yezidi"},
["Yiii"] = {"Yi"},
["Zanb"] = {"Zanabazar Square", "Zanabazarin Dörböljin Useg", "Xewtee Dörböljin Bicig", "Horizontal Square Script"},
["Zinh"] = {"Code for inherited script"},
["Zmth"] = {"Mathematical notation"},
["Zsye"] = {"Symbols (Emoji variant)"},
["Zsym"] = {"Symbols"},
["Zxxx"] = {"Code for unwritten documents"},
["Zyyy"] = {"Code for undetermined script"},
["Zzzz"] = {"Code for uncoded script"}
}
s1g2fhep3lz77c893e23z3s6lz2ht1r
32904
32903
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lang/data/iana_scripts]]
32903
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["Adlm"] = {"Adlam"},
["Afak"] = {"Afaka"},
["Aghb"] = {"Caucasian Albanian"},
["Ahom"] = {"Ahom", "Tai Ahom"},
["Arab"] = {"Arabic"},
["Aran"] = {"Arabic (Nastaliq variant)"},
["Armi"] = {"Imperial Aramaic"},
["Armn"] = {"Armenian"},
["Avst"] = {"Avestan"},
["Bali"] = {"Balinese"},
["Bamu"] = {"Bamum"},
["Bass"] = {"Bassa Vah"},
["Batk"] = {"Batak"},
["Beng"] = {"Bengali", "Bangla"},
["Berf"] = {"Beria Erfe"},
["Bhks"] = {"Bhaiksuki"},
["Blis"] = {"Blissymbols"},
["Bopo"] = {"Bopomofo"},
["Brah"] = {"Brahmi"},
["Brai"] = {"Braille"},
["Bugi"] = {"Buginese"},
["Buhd"] = {"Buhid"},
["Cakm"] = {"Chakma"},
["Cans"] = {"Unified Canadian Aboriginal Syllabics"},
["Cari"] = {"Carian"},
["Cham"] = {"Cham"},
["Cher"] = {"Cherokee"},
["Chis"] = {"Chisoi"},
["Chrs"] = {"Chorasmian"},
["Cirt"] = {"Cirth"},
["Copt"] = {"Coptic"},
["Cpmn"] = {"Cypro-Minoan"},
["Cprt"] = {"Cypriot syllabary"},
["Cyrl"] = {"Cyrillic"},
["Cyrs"] = {"Cyrillic (Old Church Slavonic variant)"},
["Deva"] = {"Devanagari", "Nagari"},
["Diak"] = {"Dives Akuru"},
["Dogr"] = {"Dogra"},
["Dsrt"] = {"Deseret", "Mormon"},
["Dupl"] = {"Duployan shorthand", "Duployan stenography"},
["Egyd"] = {"Egyptian demotic"},
["Egyh"] = {"Egyptian hieratic"},
["Egyp"] = {"Egyptian hieroglyphs"},
["Elba"] = {"Elbasan"},
["Elym"] = {"Elymaic"},
["Ethi"] = {"Ethiopic", "Geʻez", "Ge'ez"},
["Gara"] = {"Garay"},
["Geok"] = {"Khutsuri (Asomtavruli and Nuskhuri)"},
["Geor"] = {"Georgian (Mkhedruli and Mtavruli)"},
["Glag"] = {"Glagolitic"},
["Gong"] = {"Gunjala Gondi"},
["Gonm"] = {"Masaram Gondi"},
["Goth"] = {"Gothic"},
["Gran"] = {"Grantha"},
["Grek"] = {"Greek"},
["Gujr"] = {"Gujarati"},
["Gukh"] = {"Gurung Khema"},
["Guru"] = {"Gurmukhi"},
["Hanb"] = {"Han with Bopomofo (alias for Han + Bopomofo)"},
["Hang"] = {"Hangul", "Hangŭl", "Hangeul"},
["Hani"] = {"Han", "Hanzi", "Kanji", "Hanja"},
["Hano"] = {"Hanunoo", "Hanunóo"},
["Hans"] = {"Han (Simplified variant)"},
["Hant"] = {"Han (Traditional variant)"},
["Hatr"] = {"Hatran"},
["Hebr"] = {"Hebrew"},
["Hira"] = {"Hiragana"},
["Hluw"] = {"Anatolian Hieroglyphs", "Luwian Hieroglyphs", "Hittite Hieroglyphs"},
["Hmng"] = {"Pahawh Hmong"},
["Hmnp"] = {"Nyiakeng Puachue Hmong"},
["Hntl"] = {"Han (Traditional variant) with Latin (alias for Hant + Latn)"},
["Hrkt"] = {"Japanese syllabaries (alias for Hiragana + Katakana)"},
["Hung"] = {"Old Hungarian", "Hungarian Runic"},
["Inds"] = {"Indus", "Harappan"},
["Ital"] = {"Old Italic (Etruscan, Oscan, etc.)"},
["Jamo"] = {"Jamo (alias for Jamo subset of Hangul)"},
["Java"] = {"Javanese"},
["Jpan"] = {"Japanese (alias for Han + Hiragana + Katakana)"},
["Jurc"] = {"Jurchen"},
["Kali"] = {"Kayah Li"},
["Kana"] = {"Katakana"},
["Kawi"] = {"Kawi"},
["Khar"] = {"Kharoshthi"},
["Khmr"] = {"Khmer"},
["Khoj"] = {"Khojki"},
["Kitl"] = {"Khitan large script"},
["Kits"] = {"Khitan small script"},
["Knda"] = {"Kannada"},
["Kore"] = {"Korean (alias for Hangul + Han)"},
["Kpel"] = {"Kpelle"},
["Krai"] = {"Kirat Rai"},
["Kthi"] = {"Kaithi"},
["Lana"] = {"Tai Tham", "Lanna"},
["Laoo"] = {"Lao"},
["Latf"] = {"Latin (Fraktur variant)"},
["Latg"] = {"Latin (Gaelic variant)"},
["Latn"] = {"Latin"},
["Leke"] = {"Leke"},
["Lepc"] = {"Lepcha", "Róng"},
["Limb"] = {"Limbu"},
["Lina"] = {"Linear A"},
["Linb"] = {"Linear B"},
["Lisu"] = {"Lisu", "Fraser"},
["Loma"] = {"Loma"},
["Lyci"] = {"Lycian"},
["Lydi"] = {"Lydian"},
["Mahj"] = {"Mahajani"},
["Maka"] = {"Makasar"},
["Mand"] = {"Mandaic", "Mandaean"},
["Mani"] = {"Manichaean"},
["Marc"] = {"Marchen"},
["Maya"] = {"Mayan hieroglyphs"},
["Medf"] = {"Medefaidrin", "Oberi Okaime", "Oberi Ɔkaimɛ"},
["Mend"] = {"Mende Kikakui"},
["Merc"] = {"Meroitic Cursive"},
["Mero"] = {"Meroitic Hieroglyphs"},
["Mlym"] = {"Malayalam"},
["Modi"] = {"Modi", "Moḍī"},
["Mong"] = {"Mongolian"},
["Moon"] = {"Moon", "Moon code", "Moon script", "Moon type"},
["Mroo"] = {"Mro", "Mru"},
["Mtei"] = {"Meitei Mayek", "Meithei", "Meetei"},
["Mult"] = {"Multani"},
["Mymr"] = {"Myanmar", "Burmese"},
["Nagm"] = {"Nag Mundari"},
["Nand"] = {"Nandinagari"},
["Narb"] = {"Old North Arabian", "Ancient North Arabian"},
["Nbat"] = {"Nabataean"},
["Newa"] = {"Newa", "Newar", "Newari", "Nepāla lipi"},
["Nkdb"] = {"Naxi Dongba", "na²¹ɕi³³ to³³ba²¹", "Nakhi Tomba"},
["Nkgb"] = {"Naxi Geba", "na²¹ɕi³³ gʌ²¹ba²¹", "'Na-'Khi ²Ggŏ-¹baw", "Nakhi Geba"},
["Nkoo"] = {"N’Ko", "N'Ko"},
["Nshu"] = {"Nüshu"},
["Ogam"] = {"Ogham"},
["Olck"] = {"Ol Chiki", "Ol Cemet'", "Ol", "Santali"},
["Onao"] = {"Ol Onal"},
["Orkh"] = {"Old Turkic", "Orkhon Runic"},
["Orya"] = {"Oriya", "Odia"},
["Osge"] = {"Osage"},
["Osma"] = {"Osmanya"},
["Ougr"] = {"Old Uyghur"},
["Palm"] = {"Palmyrene"},
["Pauc"] = {"Pau Cin Hau"},
["Pcun"] = {"Proto-Cuneiform"},
["Pelm"] = {"Proto-Elamite"},
["Perm"] = {"Old Permic"},
["Phag"] = {"Phags-pa"},
["Phli"] = {"Inscriptional Pahlavi"},
["Phlp"] = {"Psalter Pahlavi"},
["Phlv"] = {"Book Pahlavi"},
["Phnx"] = {"Phoenician"},
["Piqd"] = {"Klingon (KLI pIqaD)"},
["Plrd"] = {"Miao", "Pollard"},
["Prti"] = {"Inscriptional Parthian"},
["Psin"] = {"Proto-Sinaitic"},
["Ranj"] = {"Ranjana"},
["Rjng"] = {"Rejang", "Redjang", "Kaganga"},
["Rohg"] = {"Hanifi Rohingya"},
["Roro"] = {"Rongorongo"},
["Runr"] = {"Runic"},
["Samr"] = {"Samaritan"},
["Sara"] = {"Sarati"},
["Sarb"] = {"Old South Arabian"},
["Saur"] = {"Saurashtra"},
["Seal"] = {"Seal", "Small Seal"},
["Sgnw"] = {"SignWriting"},
["Shaw"] = {"Shavian", "Shaw"},
["Shrd"] = {"Sharada", "Śāradā"},
["Shui"] = {"Shuishu"},
["Sidd"] = {"Siddham", "Siddhaṃ", "Siddhamātṛkā"},
["Sidt"] = {"Sidetic"},
["Sind"] = {"Khudawadi", "Sindhi"},
["Sinh"] = {"Sinhala"},
["Sogd"] = {"Sogdian"},
["Sogo"] = {"Old Sogdian"},
["Sora"] = {"Sora Sompeng"},
["Soyo"] = {"Soyombo"},
["Sund"] = {"Sundanese"},
["Sunu"] = {"Sunuwar"},
["Sylo"] = {"Syloti Nagri"},
["Syrc"] = {"Syriac"},
["Syre"] = {"Syriac (Estrangelo variant)"},
["Syrj"] = {"Syriac (Western variant)"},
["Syrn"] = {"Syriac (Eastern variant)"},
["Tagb"] = {"Tagbanwa"},
["Takr"] = {"Takri", "Ṭākrī", "Ṭāṅkrī"},
["Tale"] = {"Tai Le"},
["Talu"] = {"New Tai Lue"},
["Taml"] = {"Tamil"},
["Tang"] = {"Tangut"},
["Tavt"] = {"Tai Viet"},
["Tayo"] = {"Tai Yo"},
["Telu"] = {"Telugu"},
["Teng"] = {"Tengwar"},
["Tfng"] = {"Tifinagh", "Berber"},
["Tglg"] = {"Tagalog", "Baybayin", "Alibata"},
["Thaa"] = {"Thaana"},
["Thai"] = {"Thai"},
["Tibt"] = {"Tibetan"},
["Tirh"] = {"Tirhuta"},
["Tnsa"] = {"Tangsa"},
["Todr"] = {"Todhri"},
["Tols"] = {"Tolong Siki"},
["Toto"] = {"Toto"},
["Tutg"] = {"Tulu-Tigalari"},
["Ugar"] = {"Ugaritic"},
["Vaii"] = {"Vai"},
["Visp"] = {"Visible Speech"},
["Vith"] = {"Vithkuqi"},
["Wara"] = {"Warang Citi", "Varang Kshiti"},
["Wcho"] = {"Wancho"},
["Wole"] = {"Woleai"},
["Xpeo"] = {"Old Persian"},
["Xsux"] = {"Sumero-Akkadian cuneiform"},
["Yezi"] = {"Yezidi"},
["Yiii"] = {"Yi"},
["Zanb"] = {"Zanabazar Square", "Zanabazarin Dörböljin Useg", "Xewtee Dörböljin Bicig", "Horizontal Square Script"},
["Zinh"] = {"Code for inherited script"},
["Zmth"] = {"Mathematical notation"},
["Zsye"] = {"Symbols (Emoji variant)"},
["Zsym"] = {"Symbols"},
["Zxxx"] = {"Code for unwritten documents"},
["Zyyy"] = {"Code for undetermined script"},
["Zzzz"] = {"Code for uncoded script"}
}
s1g2fhep3lz77c893e23z3s6lz2ht1r
Module:Lang/data/iana regions
828
1031
32905
8985
2026-10-10T22:29:09Z
en>Trappist the monk
0
update to 2026-09-17 data;
32905
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["AC"] = {"Ascension Island"},
["AD"] = {"Andorra"},
["AE"] = {"United Arab Emirates"},
["AF"] = {"Afghanistan"},
["AG"] = {"Antigua and Barbuda"},
["AI"] = {"Anguilla"},
["AL"] = {"Albania"},
["AM"] = {"Armenia"},
["AO"] = {"Angola"},
["AQ"] = {"Antarctica"},
["AR"] = {"Argentina"},
["AS"] = {"American Samoa"},
["AT"] = {"Austria"},
["AU"] = {"Australia"},
["AW"] = {"Aruba"},
["AX"] = {"Åland Islands"},
["AZ"] = {"Azerbaijan"},
["BA"] = {"Bosnia and Herzegovina"},
["BB"] = {"Barbados"},
["BD"] = {"Bangladesh"},
["BE"] = {"Belgium"},
["BF"] = {"Burkina Faso"},
["BG"] = {"Bulgaria"},
["BH"] = {"Bahrain"},
["BI"] = {"Burundi"},
["BJ"] = {"Benin"},
["BL"] = {"Saint Barthélemy"},
["BM"] = {"Bermuda"},
["BN"] = {"Brunei Darussalam"},
["BO"] = {"Bolivia"},
["BQ"] = {"Bonaire, Sint Eustatius and Saba"},
["BR"] = {"Brazil"},
["BS"] = {"Bahamas"},
["BT"] = {"Bhutan"},
["BV"] = {"Bouvet Island"},
["BW"] = {"Botswana"},
["BY"] = {"Belarus"},
["BZ"] = {"Belize"},
["CA"] = {"Canada"},
["CC"] = {"Cocos (Keeling) Islands"},
["CD"] = {"The Democratic Republic of the Congo"},
["CF"] = {"Central African Republic"},
["CG"] = {"Congo"},
["CH"] = {"Switzerland"},
["CI"] = {"Côte d'Ivoire"},
["CK"] = {"Cook Islands"},
["CL"] = {"Chile"},
["CM"] = {"Cameroon"},
["CN"] = {"China"},
["CO"] = {"Colombia"},
["CP"] = {"Clipperton Island"},
["CQ"] = {"Sark"},
["CR"] = {"Costa Rica"},
["CU"] = {"Cuba"},
["CV"] = {"Cabo Verde", "Cape Verde"},
["CW"] = {"Curaçao"},
["CX"] = {"Christmas Island"},
["CY"] = {"Cyprus"},
["CZ"] = {"Czechia", "Czech Republic"},
["DE"] = {"Germany"},
["DG"] = {"Diego Garcia"},
["DJ"] = {"Djibouti"},
["DK"] = {"Denmark"},
["DM"] = {"Dominica"},
["DO"] = {"Dominican Republic"},
["DZ"] = {"Algeria"},
["EA"] = {"Ceuta, Melilla"},
["EC"] = {"Ecuador"},
["EE"] = {"Estonia"},
["EG"] = {"Egypt"},
["EH"] = {"Western Sahara"},
["ER"] = {"Eritrea"},
["ES"] = {"Spain"},
["ET"] = {"Ethiopia"},
["EU"] = {"European Union"},
["EZ"] = {"Eurozone"},
["FI"] = {"Finland"},
["FJ"] = {"Fiji"},
["FK"] = {"Falkland Islands (Malvinas)"},
["FM"] = {"Federated States of Micronesia"},
["FO"] = {"Faroe Islands"},
["FR"] = {"France"},
["GA"] = {"Gabon"},
["GB"] = {"United Kingdom"},
["GD"] = {"Grenada"},
["GE"] = {"Georgia"},
["GF"] = {"French Guiana"},
["GG"] = {"Guernsey"},
["GH"] = {"Ghana"},
["GI"] = {"Gibraltar"},
["GL"] = {"Greenland"},
["GM"] = {"Gambia"},
["GN"] = {"Guinea"},
["GP"] = {"Guadeloupe"},
["GQ"] = {"Equatorial Guinea"},
["GR"] = {"Greece"},
["GS"] = {"South Georgia and the South Sandwich Islands"},
["GT"] = {"Guatemala"},
["GU"] = {"Guam"},
["GW"] = {"Guinea-Bissau"},
["GY"] = {"Guyana"},
["HK"] = {"Hong Kong"},
["HM"] = {"Heard Island and McDonald Islands"},
["HN"] = {"Honduras"},
["HR"] = {"Croatia"},
["HT"] = {"Haiti"},
["HU"] = {"Hungary"},
["IC"] = {"Canary Islands"},
["ID"] = {"Indonesia"},
["IE"] = {"Ireland"},
["IL"] = {"Israel"},
["IM"] = {"Isle of Man"},
["IN"] = {"India"},
["IO"] = {"British Indian Ocean Territory"},
["IQ"] = {"Iraq"},
["IR"] = {"Islamic Republic of Iran"},
["IS"] = {"Iceland"},
["IT"] = {"Italy"},
["JE"] = {"Jersey"},
["JM"] = {"Jamaica"},
["JO"] = {"Jordan"},
["JP"] = {"Japan"},
["KE"] = {"Kenya"},
["KG"] = {"Kyrgyzstan"},
["KH"] = {"Cambodia"},
["KI"] = {"Kiribati"},
["KM"] = {"Comoros"},
["KN"] = {"Saint Kitts and Nevis"},
["KP"] = {"Democratic People's Republic of Korea"},
["KR"] = {"Republic of Korea"},
["KW"] = {"Kuwait"},
["KY"] = {"Cayman Islands"},
["KZ"] = {"Kazakhstan"},
["LA"] = {"Lao People's Democratic Republic"},
["LB"] = {"Lebanon"},
["LC"] = {"Saint Lucia"},
["LI"] = {"Liechtenstein"},
["LK"] = {"Sri Lanka"},
["LR"] = {"Liberia"},
["LS"] = {"Lesotho"},
["LT"] = {"Lithuania"},
["LU"] = {"Luxembourg"},
["LV"] = {"Latvia"},
["LY"] = {"Libya"},
["MA"] = {"Morocco"},
["MC"] = {"Monaco"},
["MD"] = {"Moldova"},
["ME"] = {"Montenegro"},
["MF"] = {"Saint Martin (French part)"},
["MG"] = {"Madagascar"},
["MH"] = {"Marshall Islands"},
["MK"] = {"North Macedonia"},
["ML"] = {"Mali"},
["MM"] = {"Myanmar"},
["MN"] = {"Mongolia"},
["MO"] = {"Macao"},
["MP"] = {"Northern Mariana Islands"},
["MQ"] = {"Martinique"},
["MR"] = {"Mauritania"},
["MS"] = {"Montserrat"},
["MT"] = {"Malta"},
["MU"] = {"Mauritius"},
["MV"] = {"Maldives"},
["MW"] = {"Malawi"},
["MX"] = {"Mexico"},
["MY"] = {"Malaysia"},
["MZ"] = {"Mozambique"},
["NA"] = {"Namibia"},
["NC"] = {"New Caledonia"},
["NE"] = {"Niger"},
["NF"] = {"Norfolk Island"},
["NG"] = {"Nigeria"},
["NI"] = {"Nicaragua"},
["NL"] = {"Netherlands"},
["NO"] = {"Norway"},
["NP"] = {"Nepal"},
["NR"] = {"Naoero", "Nauru"},
["NU"] = {"Niue"},
["NZ"] = {"New Zealand"},
["OM"] = {"Oman"},
["PA"] = {"Panama"},
["PE"] = {"Peru"},
["PF"] = {"French Polynesia"},
["PG"] = {"Papua New Guinea"},
["PH"] = {"Philippines"},
["PK"] = {"Pakistan"},
["PL"] = {"Poland"},
["PM"] = {"Saint Pierre and Miquelon"},
["PN"] = {"Pitcairn"},
["PR"] = {"Puerto Rico"},
["PS"] = {"State of Palestine"},
["PT"] = {"Portugal"},
["PW"] = {"Palau"},
["PY"] = {"Paraguay"},
["QA"] = {"Qatar"},
["RE"] = {"Réunion"},
["RO"] = {"Romania"},
["RS"] = {"Serbia"},
["RU"] = {"Russian Federation"},
["RW"] = {"Rwanda"},
["SA"] = {"Saudi Arabia"},
["SB"] = {"Solomon Islands"},
["SC"] = {"Seychelles"},
["SD"] = {"Sudan"},
["SE"] = {"Sweden"},
["SG"] = {"Singapore"},
["SH"] = {"Saint Helena, Ascension and Tristan da Cunha"},
["SI"] = {"Slovenia"},
["SJ"] = {"Svalbard and Jan Mayen"},
["SK"] = {"Slovakia"},
["SL"] = {"Sierra Leone"},
["SM"] = {"San Marino"},
["SN"] = {"Senegal"},
["SO"] = {"Somalia"},
["SR"] = {"Suriname"},
["SS"] = {"South Sudan"},
["ST"] = {"Sao Tome and Principe"},
["SV"] = {"El Salvador"},
["SX"] = {"Sint Maarten (Dutch part)"},
["SY"] = {"Syrian Arab Republic"},
["SZ"] = {"Eswatini", "eSwatini", "Swaziland"},
["TA"] = {"Tristan da Cunha"},
["TC"] = {"Turks and Caicos Islands"},
["TD"] = {"Chad"},
["TF"] = {"French Southern Territories"},
["TG"] = {"Togo"},
["TH"] = {"Thailand"},
["TJ"] = {"Tajikistan"},
["TK"] = {"Tokelau"},
["TL"] = {"Timor-Leste"},
["TM"] = {"Turkmenistan"},
["TN"] = {"Tunisia"},
["TO"] = {"Tonga"},
["TR"] = {"Türkiye", "Turkey"},
["TT"] = {"Trinidad and Tobago"},
["TV"] = {"Tuvalu"},
["TW"] = {"Taiwan, Province of China"},
["TZ"] = {"United Republic of Tanzania"},
["UA"] = {"Ukraine"},
["UG"] = {"Uganda"},
["UM"] = {"United States Minor Outlying Islands"},
["UN"] = {"United Nations"},
["US"] = {"United States"},
["UY"] = {"Uruguay"},
["UZ"] = {"Uzbekistan"},
["VA"] = {"Holy See (Vatican City State)"},
["VC"] = {"Saint Vincent and the Grenadines"},
["VE"] = {"Venezuela"},
["VG"] = {"British Virgin Islands"},
["VI"] = {"U.S. Virgin Islands"},
["VN"] = {"Viet Nam"},
["VU"] = {"Vanuatu"},
["WF"] = {"Wallis and Futuna"},
["WS"] = {"Samoa"},
["YE"] = {"Yemen"},
["YT"] = {"Mayotte"},
["ZA"] = {"South Africa"},
["ZM"] = {"Zambia"},
["ZW"] = {"Zimbabwe"},
["001"] = {"World"},
["002"] = {"Africa"},
["003"] = {"North America"},
["005"] = {"South America"},
["009"] = {"Oceania"},
["011"] = {"Western Africa"},
["013"] = {"Central America"},
["014"] = {"Eastern Africa"},
["015"] = {"Northern Africa"},
["017"] = {"Middle Africa"},
["018"] = {"Southern Africa"},
["019"] = {"Americas"},
["021"] = {"Northern America"},
["029"] = {"Caribbean"},
["030"] = {"Eastern Asia"},
["034"] = {"Southern Asia"},
["035"] = {"South-Eastern Asia"},
["039"] = {"Southern Europe"},
["053"] = {"Australia and New Zealand"},
["054"] = {"Melanesia"},
["057"] = {"Micronesia"},
["061"] = {"Polynesia"},
["142"] = {"Asia"},
["143"] = {"Central Asia"},
["145"] = {"Western Asia"},
["150"] = {"Europe"},
["151"] = {"Eastern Europe"},
["154"] = {"Northern Europe"},
["155"] = {"Western Europe"},
["202"] = {"Sub-Saharan Africa"},
["419"] = {"Latin America and the Caribbean"}
}
czjl78i63gr1vs4oqxs9s7lbfc3bhdp
32906
32905
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lang/data/iana_regions]]
32905
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["AC"] = {"Ascension Island"},
["AD"] = {"Andorra"},
["AE"] = {"United Arab Emirates"},
["AF"] = {"Afghanistan"},
["AG"] = {"Antigua and Barbuda"},
["AI"] = {"Anguilla"},
["AL"] = {"Albania"},
["AM"] = {"Armenia"},
["AO"] = {"Angola"},
["AQ"] = {"Antarctica"},
["AR"] = {"Argentina"},
["AS"] = {"American Samoa"},
["AT"] = {"Austria"},
["AU"] = {"Australia"},
["AW"] = {"Aruba"},
["AX"] = {"Åland Islands"},
["AZ"] = {"Azerbaijan"},
["BA"] = {"Bosnia and Herzegovina"},
["BB"] = {"Barbados"},
["BD"] = {"Bangladesh"},
["BE"] = {"Belgium"},
["BF"] = {"Burkina Faso"},
["BG"] = {"Bulgaria"},
["BH"] = {"Bahrain"},
["BI"] = {"Burundi"},
["BJ"] = {"Benin"},
["BL"] = {"Saint Barthélemy"},
["BM"] = {"Bermuda"},
["BN"] = {"Brunei Darussalam"},
["BO"] = {"Bolivia"},
["BQ"] = {"Bonaire, Sint Eustatius and Saba"},
["BR"] = {"Brazil"},
["BS"] = {"Bahamas"},
["BT"] = {"Bhutan"},
["BV"] = {"Bouvet Island"},
["BW"] = {"Botswana"},
["BY"] = {"Belarus"},
["BZ"] = {"Belize"},
["CA"] = {"Canada"},
["CC"] = {"Cocos (Keeling) Islands"},
["CD"] = {"The Democratic Republic of the Congo"},
["CF"] = {"Central African Republic"},
["CG"] = {"Congo"},
["CH"] = {"Switzerland"},
["CI"] = {"Côte d'Ivoire"},
["CK"] = {"Cook Islands"},
["CL"] = {"Chile"},
["CM"] = {"Cameroon"},
["CN"] = {"China"},
["CO"] = {"Colombia"},
["CP"] = {"Clipperton Island"},
["CQ"] = {"Sark"},
["CR"] = {"Costa Rica"},
["CU"] = {"Cuba"},
["CV"] = {"Cabo Verde", "Cape Verde"},
["CW"] = {"Curaçao"},
["CX"] = {"Christmas Island"},
["CY"] = {"Cyprus"},
["CZ"] = {"Czechia", "Czech Republic"},
["DE"] = {"Germany"},
["DG"] = {"Diego Garcia"},
["DJ"] = {"Djibouti"},
["DK"] = {"Denmark"},
["DM"] = {"Dominica"},
["DO"] = {"Dominican Republic"},
["DZ"] = {"Algeria"},
["EA"] = {"Ceuta, Melilla"},
["EC"] = {"Ecuador"},
["EE"] = {"Estonia"},
["EG"] = {"Egypt"},
["EH"] = {"Western Sahara"},
["ER"] = {"Eritrea"},
["ES"] = {"Spain"},
["ET"] = {"Ethiopia"},
["EU"] = {"European Union"},
["EZ"] = {"Eurozone"},
["FI"] = {"Finland"},
["FJ"] = {"Fiji"},
["FK"] = {"Falkland Islands (Malvinas)"},
["FM"] = {"Federated States of Micronesia"},
["FO"] = {"Faroe Islands"},
["FR"] = {"France"},
["GA"] = {"Gabon"},
["GB"] = {"United Kingdom"},
["GD"] = {"Grenada"},
["GE"] = {"Georgia"},
["GF"] = {"French Guiana"},
["GG"] = {"Guernsey"},
["GH"] = {"Ghana"},
["GI"] = {"Gibraltar"},
["GL"] = {"Greenland"},
["GM"] = {"Gambia"},
["GN"] = {"Guinea"},
["GP"] = {"Guadeloupe"},
["GQ"] = {"Equatorial Guinea"},
["GR"] = {"Greece"},
["GS"] = {"South Georgia and the South Sandwich Islands"},
["GT"] = {"Guatemala"},
["GU"] = {"Guam"},
["GW"] = {"Guinea-Bissau"},
["GY"] = {"Guyana"},
["HK"] = {"Hong Kong"},
["HM"] = {"Heard Island and McDonald Islands"},
["HN"] = {"Honduras"},
["HR"] = {"Croatia"},
["HT"] = {"Haiti"},
["HU"] = {"Hungary"},
["IC"] = {"Canary Islands"},
["ID"] = {"Indonesia"},
["IE"] = {"Ireland"},
["IL"] = {"Israel"},
["IM"] = {"Isle of Man"},
["IN"] = {"India"},
["IO"] = {"British Indian Ocean Territory"},
["IQ"] = {"Iraq"},
["IR"] = {"Islamic Republic of Iran"},
["IS"] = {"Iceland"},
["IT"] = {"Italy"},
["JE"] = {"Jersey"},
["JM"] = {"Jamaica"},
["JO"] = {"Jordan"},
["JP"] = {"Japan"},
["KE"] = {"Kenya"},
["KG"] = {"Kyrgyzstan"},
["KH"] = {"Cambodia"},
["KI"] = {"Kiribati"},
["KM"] = {"Comoros"},
["KN"] = {"Saint Kitts and Nevis"},
["KP"] = {"Democratic People's Republic of Korea"},
["KR"] = {"Republic of Korea"},
["KW"] = {"Kuwait"},
["KY"] = {"Cayman Islands"},
["KZ"] = {"Kazakhstan"},
["LA"] = {"Lao People's Democratic Republic"},
["LB"] = {"Lebanon"},
["LC"] = {"Saint Lucia"},
["LI"] = {"Liechtenstein"},
["LK"] = {"Sri Lanka"},
["LR"] = {"Liberia"},
["LS"] = {"Lesotho"},
["LT"] = {"Lithuania"},
["LU"] = {"Luxembourg"},
["LV"] = {"Latvia"},
["LY"] = {"Libya"},
["MA"] = {"Morocco"},
["MC"] = {"Monaco"},
["MD"] = {"Moldova"},
["ME"] = {"Montenegro"},
["MF"] = {"Saint Martin (French part)"},
["MG"] = {"Madagascar"},
["MH"] = {"Marshall Islands"},
["MK"] = {"North Macedonia"},
["ML"] = {"Mali"},
["MM"] = {"Myanmar"},
["MN"] = {"Mongolia"},
["MO"] = {"Macao"},
["MP"] = {"Northern Mariana Islands"},
["MQ"] = {"Martinique"},
["MR"] = {"Mauritania"},
["MS"] = {"Montserrat"},
["MT"] = {"Malta"},
["MU"] = {"Mauritius"},
["MV"] = {"Maldives"},
["MW"] = {"Malawi"},
["MX"] = {"Mexico"},
["MY"] = {"Malaysia"},
["MZ"] = {"Mozambique"},
["NA"] = {"Namibia"},
["NC"] = {"New Caledonia"},
["NE"] = {"Niger"},
["NF"] = {"Norfolk Island"},
["NG"] = {"Nigeria"},
["NI"] = {"Nicaragua"},
["NL"] = {"Netherlands"},
["NO"] = {"Norway"},
["NP"] = {"Nepal"},
["NR"] = {"Naoero", "Nauru"},
["NU"] = {"Niue"},
["NZ"] = {"New Zealand"},
["OM"] = {"Oman"},
["PA"] = {"Panama"},
["PE"] = {"Peru"},
["PF"] = {"French Polynesia"},
["PG"] = {"Papua New Guinea"},
["PH"] = {"Philippines"},
["PK"] = {"Pakistan"},
["PL"] = {"Poland"},
["PM"] = {"Saint Pierre and Miquelon"},
["PN"] = {"Pitcairn"},
["PR"] = {"Puerto Rico"},
["PS"] = {"State of Palestine"},
["PT"] = {"Portugal"},
["PW"] = {"Palau"},
["PY"] = {"Paraguay"},
["QA"] = {"Qatar"},
["RE"] = {"Réunion"},
["RO"] = {"Romania"},
["RS"] = {"Serbia"},
["RU"] = {"Russian Federation"},
["RW"] = {"Rwanda"},
["SA"] = {"Saudi Arabia"},
["SB"] = {"Solomon Islands"},
["SC"] = {"Seychelles"},
["SD"] = {"Sudan"},
["SE"] = {"Sweden"},
["SG"] = {"Singapore"},
["SH"] = {"Saint Helena, Ascension and Tristan da Cunha"},
["SI"] = {"Slovenia"},
["SJ"] = {"Svalbard and Jan Mayen"},
["SK"] = {"Slovakia"},
["SL"] = {"Sierra Leone"},
["SM"] = {"San Marino"},
["SN"] = {"Senegal"},
["SO"] = {"Somalia"},
["SR"] = {"Suriname"},
["SS"] = {"South Sudan"},
["ST"] = {"Sao Tome and Principe"},
["SV"] = {"El Salvador"},
["SX"] = {"Sint Maarten (Dutch part)"},
["SY"] = {"Syrian Arab Republic"},
["SZ"] = {"Eswatini", "eSwatini", "Swaziland"},
["TA"] = {"Tristan da Cunha"},
["TC"] = {"Turks and Caicos Islands"},
["TD"] = {"Chad"},
["TF"] = {"French Southern Territories"},
["TG"] = {"Togo"},
["TH"] = {"Thailand"},
["TJ"] = {"Tajikistan"},
["TK"] = {"Tokelau"},
["TL"] = {"Timor-Leste"},
["TM"] = {"Turkmenistan"},
["TN"] = {"Tunisia"},
["TO"] = {"Tonga"},
["TR"] = {"Türkiye", "Turkey"},
["TT"] = {"Trinidad and Tobago"},
["TV"] = {"Tuvalu"},
["TW"] = {"Taiwan, Province of China"},
["TZ"] = {"United Republic of Tanzania"},
["UA"] = {"Ukraine"},
["UG"] = {"Uganda"},
["UM"] = {"United States Minor Outlying Islands"},
["UN"] = {"United Nations"},
["US"] = {"United States"},
["UY"] = {"Uruguay"},
["UZ"] = {"Uzbekistan"},
["VA"] = {"Holy See (Vatican City State)"},
["VC"] = {"Saint Vincent and the Grenadines"},
["VE"] = {"Venezuela"},
["VG"] = {"British Virgin Islands"},
["VI"] = {"U.S. Virgin Islands"},
["VN"] = {"Viet Nam"},
["VU"] = {"Vanuatu"},
["WF"] = {"Wallis and Futuna"},
["WS"] = {"Samoa"},
["YE"] = {"Yemen"},
["YT"] = {"Mayotte"},
["ZA"] = {"South Africa"},
["ZM"] = {"Zambia"},
["ZW"] = {"Zimbabwe"},
["001"] = {"World"},
["002"] = {"Africa"},
["003"] = {"North America"},
["005"] = {"South America"},
["009"] = {"Oceania"},
["011"] = {"Western Africa"},
["013"] = {"Central America"},
["014"] = {"Eastern Africa"},
["015"] = {"Northern Africa"},
["017"] = {"Middle Africa"},
["018"] = {"Southern Africa"},
["019"] = {"Americas"},
["021"] = {"Northern America"},
["029"] = {"Caribbean"},
["030"] = {"Eastern Asia"},
["034"] = {"Southern Asia"},
["035"] = {"South-Eastern Asia"},
["039"] = {"Southern Europe"},
["053"] = {"Australia and New Zealand"},
["054"] = {"Melanesia"},
["057"] = {"Micronesia"},
["061"] = {"Polynesia"},
["142"] = {"Asia"},
["143"] = {"Central Asia"},
["145"] = {"Western Asia"},
["150"] = {"Europe"},
["151"] = {"Eastern Europe"},
["154"] = {"Northern Europe"},
["155"] = {"Western Europe"},
["202"] = {"Sub-Saharan Africa"},
["419"] = {"Latin America and the Caribbean"}
}
czjl78i63gr1vs4oqxs9s7lbfc3bhdp
Module:Lang/data/iana variants
828
1032
32907
8987
2026-10-10T22:29:13Z
en>Trappist the monk
0
update to 2026-09-17 data;
32907
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["1606nict"] = {
["descriptions"] = {"Late Middle French (to 1606)"},
["prefixes"] = {"frm"},
},
["1694acad"] = {
["descriptions"] = {"Early Modern French"},
["prefixes"] = {"fr"},
},
["1901"] = {
["descriptions"] = {"Traditional German orthography"},
["prefixes"] = {"de"},
},
["1959acad"] = {
["descriptions"] = {"\"Academic\" (\"governmental\") variant of Belarusian as codified in 1959"},
["prefixes"] = {"be"},
},
["1994"] = {
["descriptions"] = {"Standardized Resian orthography"},
["prefixes"] = {"sl-rozaj", "sl-rozaj-biske", "sl-rozaj-njiva", "sl-rozaj-osojs", "sl-rozaj-solba"},
},
["1996"] = {
["descriptions"] = {"German orthography of 1996"},
["prefixes"] = {"de"},
},
["abl1943"] = {
["descriptions"] = {"Orthographic formulation of 1943 - Official in Brazil (Formulário Ortográfico de 1943 - Oficial no Brasil)"},
["prefixes"] = {"pt-br"},
},
["akhmimic"] = {
["descriptions"] = {"Akhmimic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["akuapem"] = {
["descriptions"] = {"Akuapem Twi"},
["prefixes"] = {"tw"},
},
["alalc97"] = {
["descriptions"] = {"ALA-LC Romanization, 1997 edition"},
["prefixes"] = {},
},
["aluku"] = {
["descriptions"] = {"Aluku dialect", "Boni dialect"},
["prefixes"] = {"djk"},
},
["anpezo"] = {
["descriptions"] = {"Anpezo standard of Ladin"},
["prefixes"] = {"lld"},
},
["ao1990"] = {
["descriptions"] = {"Portuguese Language Orthographic Agreement of 1990 (Acordo Ortográfico da Língua Portuguesa de 1990)"},
["prefixes"] = {"pt", "gl"},
},
["aranes"] = {
["descriptions"] = {"Aranese"},
["prefixes"] = {"oc"},
},
["arkaika"] = {
["descriptions"] = {"Arcaicam Esperantom", "Arkaika Esperanto"},
["prefixes"] = {"eo"},
},
["asante"] = {
["descriptions"] = {"Asante Twi", "Ashanti Twi"},
["prefixes"] = {"tw"},
},
["auvern"] = {
["descriptions"] = {"Auvergnat"},
["prefixes"] = {"oc"},
},
["baku1926"] = {
["descriptions"] = {"Unified Turkic Latin Alphabet (Historical)"},
["prefixes"] = {"az", "ba", "crh", "kk", "krc", "ky", "sah", "tk", "tt", "uz"},
},
["balanka"] = {
["descriptions"] = {"The Balanka dialect of Anii"},
["prefixes"] = {"blo"},
},
["barla"] = {
["descriptions"] = {"The Barlavento dialect group of Kabuverdianu"},
["prefixes"] = {"kea"},
},
["basiceng"] = {
["descriptions"] = {"Basic English"},
["prefixes"] = {"en"},
},
["bauddha"] = {
["descriptions"] = {"Buddhist Hybrid Sanskrit"},
["prefixes"] = {"sa"},
},
["bciav"] = {
["descriptions"] = {"BCI Blissymbolics AV"},
["prefixes"] = {"zbl"},
},
["bcizbl"] = {
["descriptions"] = {"BCI Blissymbolics"},
["prefixes"] = {"zbl"},
},
["biscayan"] = {
["descriptions"] = {"Biscayan dialect of Basque"},
["prefixes"] = {"eu"},
},
["biske"] = {
["descriptions"] = {"The San Giorgio dialect of Resian", "The Bila dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["blasl"] = {
["descriptions"] = {"Black American Sign Language dialect"},
["prefixes"] = {"ase", "sgn-ase"},
},
["bohairic"] = {
["descriptions"] = {"Bohairic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["bohoric"] = {
["descriptions"] = {"Slovene in Bohorič alphabet"},
["prefixes"] = {"sl"},
},
["boont"] = {
["descriptions"] = {"Boontling"},
["prefixes"] = {"en"},
},
["bornholm"] = {
["descriptions"] = {"Bornholmsk"},
["prefixes"] = {"da"},
},
["cisaup"] = {
["descriptions"] = {"Cisalpine"},
["prefixes"] = {"oc"},
},
["colb1945"] = {
["descriptions"] = {"Portuguese-Brazilian Orthographic Convention of 1945 (Convenção Ortográfica Luso-Brasileira de 1945)"},
["prefixes"] = {"pt"},
},
["cornu"] = {
["descriptions"] = {"Cornu-English", "Cornish English", "Anglo-Cornish"},
["prefixes"] = {"en"},
},
["creiss"] = {
["descriptions"] = {"Occitan variants of the Croissant area"},
["prefixes"] = {"oc"},
},
["dajnko"] = {
["descriptions"] = {"Slovene in Dajnko alphabet"},
["prefixes"] = {"sl"},
},
["ekavsk"] = {
["descriptions"] = {"Serbian with Ekavian pronunciation"},
["prefixes"] = {"sr", "sr-latn", "sr-cyrl"},
},
["emodeng"] = {
["descriptions"] = {"Early Modern English (1500-1700)"},
["prefixes"] = {"en"},
},
["fascia"] = {
["descriptions"] = {"Fascia standard of Ladin"},
["prefixes"] = {"lld"},
},
["fayyumic"] = {
["descriptions"] = {"Fayyumic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["fodom"] = {
["descriptions"] = {"Fodom standard of Ladin"},
["prefixes"] = {"lld"},
},
["fonipa"] = {
["descriptions"] = {"International Phonetic Alphabet"},
["prefixes"] = {},
},
["fonkirsh"] = {
["descriptions"] = {"Kirshenbaum Phonetic Alphabet"},
["prefixes"] = {},
},
["fonnapa"] = {
["descriptions"] = {"North American Phonetic Alphabet", "Americanist Phonetic Notation"},
["prefixes"] = {},
},
["fonupa"] = {
["descriptions"] = {"Uralic Phonetic Alphabet"},
["prefixes"] = {},
},
["fonxsamp"] = {
["descriptions"] = {"X-SAMPA transcription"},
["prefixes"] = {},
},
["gallo"] = {
["descriptions"] = {"Gallo"},
["prefixes"] = {"fr"},
},
["gascon"] = {
["descriptions"] = {"Gascon"},
["prefixes"] = {"oc"},
},
["gherd"] = {
["descriptions"] = {"Gherdëina standard of Ladin"},
["prefixes"] = {"lld"},
},
["grclass"] = {
["descriptions"] = {"Classical Occitan orthography"},
["prefixes"] = {"oc", "oc-aranes", "oc-auvern", "oc-cisaup", "oc-creiss", "oc-gascon", "oc-lemosin", "oc-lengadoc", "oc-nicard", "oc-provenc", "oc-vivaraup"},
},
["grital"] = {
["descriptions"] = {"Italian-inspired Occitan orthography"},
["prefixes"] = {"oc", "oc-cisaup", "oc-nicard", "oc-provenc"},
},
["grmistr"] = {
["descriptions"] = {"Mistralian or Mistralian-inspired Occitan orthography"},
["prefixes"] = {"oc", "oc-aranes", "oc-auvern", "oc-cisaup", "oc-creiss", "oc-gascon", "oc-lemosin", "oc-lengadoc", "oc-nicard", "oc-provenc", "oc-vivaraup"},
},
["hanoi"] = {
["descriptions"] = {"The Hà Nội variant of Vietnamese"},
["prefixes"] = {"vi"},
},
["hepburn"] = {
["descriptions"] = {"Hepburn romanization"},
["prefixes"] = {"ja-latn"},
},
["hognorsk"] = {
["descriptions"] = {"Norwegian in Høgnorsk (High Norwegian) orthography"},
["prefixes"] = {"nn"},
},
["hsistemo"] = {
["descriptions"] = {"Standard H-system orthographic fallback for spelling Esperanto"},
["prefixes"] = {"eo"},
},
["huett"] = {
["descriptions"] = {"The Huế (province Thừa Thiên) variant of Vietnamese"},
["prefixes"] = {"vi"},
},
["ijekavsk"] = {
["descriptions"] = {"Serbian with Ijekavian pronunciation"},
["prefixes"] = {"sr", "sr-latn", "sr-cyrl"},
},
["itihasa"] = {
["descriptions"] = {"Epic Sanskrit"},
["prefixes"] = {"sa"},
},
["ivanchov"] = {
["descriptions"] = {"Bulgarian in 1899 orthography"},
["prefixes"] = {"bg"},
},
["jauer"] = {
["descriptions"] = {"Jauer dialect of Romansh"},
["prefixes"] = {"rm"},
},
["jyutping"] = {
["descriptions"] = {"Jyutping Cantonese Romanization"},
["prefixes"] = {"yue"},
},
["kkcor"] = {
["descriptions"] = {"Common Cornish orthography of Revived Cornish"},
["prefixes"] = {"kw"},
},
["kleinsch"] = {
["descriptions"] = {"Kleinschmidt orthography", "Allattaasitaamut"},
["prefixes"] = {"kl", "kl-tunumiit"},
},
["kociewie"] = {
["descriptions"] = {"The Kociewie dialect of Polish"},
["prefixes"] = {"pl"},
},
["kscor"] = {
["descriptions"] = {"Standard Cornish orthography of Revived Cornish", "Kernowek Standard"},
["prefixes"] = {"kw"},
},
["leidentr"] = {
["descriptions"] = {"Ancient Egyptian in Leiden Unified Transliteration"},
["prefixes"] = {"egy"},
},
["lemosin"] = {
["descriptions"] = {"Limousin"},
["prefixes"] = {"oc"},
},
["lengadoc"] = {
["descriptions"] = {"Languedocien"},
["prefixes"] = {"oc"},
},
["lipaw"] = {
["descriptions"] = {"The Lipovaz dialect of Resian", "The Lipovec dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["ltg1929"] = {
["descriptions"] = {"The Latgalian language orthography codified in 1929"},
["prefixes"] = {"ltg"},
},
["ltg2007"] = {
["descriptions"] = {"The Latgalian language orthography codified in the language law in 2007"},
["prefixes"] = {"ltg"},
},
["luna1918"] = {
["descriptions"] = {"Post-1917 Russian orthography"},
["prefixes"] = {"ru"},
},
["lycopol"] = {
["descriptions"] = {"Lycopolitan alias Subakhmimic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["mdcegyp"] = {
["descriptions"] = {"Ancient Egyptian hieroglyphs encoded in Manuel de Codage"},
["prefixes"] = {"egy"},
},
["mdctrans"] = {
["descriptions"] = {"Ancient Egyptian transliteration encoded in Manuel de Codage"},
["prefixes"] = {"egy"},
},
["mesokem"] = {
["descriptions"] = {"Mesokemic alias Oxyrhynchite dialect of Coptic"},
["prefixes"] = {"cop"},
},
["metelko"] = {
["descriptions"] = {"Slovene in Metelko alphabet"},
["prefixes"] = {"sl"},
},
["moderat"] = {
["descriptions"] = {"The moderate (conservative, i.e. Danish-like) spelling variant of Bokmål"},
["prefixes"] = {"nb"},
},
["monoton"] = {
["descriptions"] = {"Monotonic Greek"},
["prefixes"] = {"el"},
},
["ndyuka"] = {
["descriptions"] = {"Ndyuka dialect", "Aukan dialect"},
["prefixes"] = {"djk"},
},
["nedis"] = {
["descriptions"] = {"Natisone dialect", "Nadiza dialect"},
["prefixes"] = {"sl"},
},
["newfound"] = {
["descriptions"] = {"Newfoundland English"},
["prefixes"] = {"en-ca"},
},
["nicard"] = {
["descriptions"] = {"Niçard"},
["prefixes"] = {"oc"},
},
["njiva"] = {
["descriptions"] = {"The Gniva dialect of Resian", "The Njiva dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["nulik"] = {
["descriptions"] = {"Volapük nulik", "Volapük perevidöl", "Volapük nulädik", "de Jong's Volapük", "New Volapük", "Revised Volapük", "Modern Volapük"},
["prefixes"] = {"vo"},
},
["osojs"] = {
["descriptions"] = {"The Oseacco dialect of Resian", "The Osojane dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["oxendict"] = {
["descriptions"] = {"Oxford English Dictionary spelling"},
["prefixes"] = {"en"},
},
["pahawh2"] = {
["descriptions"] = {"Pahawh Hmong Second Stage Reduced orthography"},
["prefixes"] = {"mww", "hnj"},
},
["pahawh3"] = {
["descriptions"] = {"Pahawh Hmong Third Stage Reduced orthography"},
["prefixes"] = {"mww", "hnj"},
},
["pahawh4"] = {
["descriptions"] = {"Pahawh Hmong Final Version orthography"},
["prefixes"] = {"mww", "hnj"},
},
["pamaka"] = {
["descriptions"] = {"Pamaka dialect"},
["prefixes"] = {"djk"},
},
["peano"] = {
["descriptions"] = {"Latino Sine Flexione", "Interlingua de API", "Interlingua de Peano"},
["prefixes"] = {"la"},
},
["pehoeji"] = {
["descriptions"] = {"Hokkien Vernacular Romanization System", "Pe̍h-ōe-jī orthography/romanization"},
["prefixes"] = {"nan-latn"},
},
["petr1708"] = {
["descriptions"] = {"Petrine orthography"},
["prefixes"] = {"ru"},
},
["pinyin"] = {
["descriptions"] = {"Pinyin romanization"},
["prefixes"] = {"zh-latn", "bo-latn"},
},
["polyton"] = {
["descriptions"] = {"Polytonic Greek"},
["prefixes"] = {"el"},
},
["provenc"] = {
["descriptions"] = {"Provençal"},
["prefixes"] = {"oc"},
},
["puter"] = {
["descriptions"] = {"Puter idiom of Romansh"},
["prefixes"] = {"rm"},
},
["radikalt"] = {
["descriptions"] = {"Radical (i.e. Nynorsk-like) spelling variant of Bokmål"},
["prefixes"] = {"nb"},
},
["rigik"] = {
["descriptions"] = {"Volapük rigik", "Schleyer's Volapük", "Original Volapük", "Classic Volapük"},
["prefixes"] = {"vo"},
},
["rozaj"] = {
["descriptions"] = {"Resian", "Resianic", "Rezijan"},
["prefixes"] = {"sl"},
},
["rumgr"] = {
["descriptions"] = {"Rumantsch Grischun"},
["prefixes"] = {"rm"},
},
["sahidic"] = {
["descriptions"] = {"Sahidic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["saigon"] = {
["descriptions"] = {"The Sài Gòn variant of Vietnamese"},
["prefixes"] = {"vi"},
},
["scotland"] = {
["descriptions"] = {"Scottish Standard English"},
["prefixes"] = {"en"},
},
["scouse"] = {
["descriptions"] = {"Scouse"},
["prefixes"] = {"en"},
},
["simple"] = {
["descriptions"] = {"Simplified form"},
["prefixes"] = {},
},
["slepe"] = {
["descriptions"] = {"Sorbian dialect of Schleife"},
["prefixes"] = {"dsb"},
},
["solba"] = {
["descriptions"] = {"The Stolvizza dialect of Resian", "The Solbica dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["sotav"] = {
["descriptions"] = {"The Sotavento dialect group of Kabuverdianu"},
["prefixes"] = {"kea"},
},
["spanglis"] = {
["descriptions"] = {"Spanglish"},
["prefixes"] = {"en", "es"},
},
["stadi"] = {
["descriptions"] = {"The \"Stadin slangi\" dialect of Finnish"},
["prefixes"] = {"fi"},
},
["surmiran"] = {
["descriptions"] = {"Surmiran idiom of Romansh"},
["prefixes"] = {"rm"},
},
["sursilv"] = {
["descriptions"] = {"Sursilvan idiom of Romansh"},
["prefixes"] = {"rm"},
},
["sutsilv"] = {
["descriptions"] = {"Sutsilvan idiom of Romansh"},
["prefixes"] = {"rm"},
},
["synnejyl"] = {
["descriptions"] = {"Synnejysk", "South Jutish"},
["prefixes"] = {"da"},
},
["taglish"] = {
["descriptions"] = {"Tagalog-English code-switching"},
["prefixes"] = {"en", "tl", "fil"},
},
["tailo"] = {
["descriptions"] = {"Taiwanese Hokkien Romanization System for Hokkien languages", "Tâi-lô orthography/romanization"},
["prefixes"] = {"nan-latn"},
},
["tarask"] = {
["descriptions"] = {"Belarusian in Taraskievica orthography"},
["prefixes"] = {"be"},
},
["tongyong"] = {
["descriptions"] = {"Tongyong Pinyin romanization"},
["prefixes"] = {"zh-latn"},
},
["tunumiit"] = {
["descriptions"] = {"Tunumiisiut", "East Greenlandic", "Østgrønlandsk"},
["prefixes"] = {"kl"},
},
["uccor"] = {
["descriptions"] = {"Unified Cornish orthography of Revived Cornish"},
["prefixes"] = {"kw"},
},
["ucrcor"] = {
["descriptions"] = {"Unified Cornish Revised orthography of Revived Cornish"},
["prefixes"] = {"kw"},
},
["ulster"] = {
["descriptions"] = {"Ulster dialect of Scots"},
["prefixes"] = {"sco"},
},
["unifon"] = {
["descriptions"] = {"Unifon phonetic alphabet"},
["prefixes"] = {"en", "hup", "kyh", "tol", "yur"},
},
["valbadia"] = {
["descriptions"] = {"Val Badia standard of Ladin"},
["prefixes"] = {"lld"},
},
["valencia"] = {
["descriptions"] = {"Valencian"},
["prefixes"] = {"ca"},
},
["vallader"] = {
["descriptions"] = {"Vallader idiom of Romansh"},
["prefixes"] = {"rm"},
},
["vecdruka"] = {
["descriptions"] = {"Latvian orthography used before 1920s (\"vecā druka\")"},
["prefixes"] = {"lv"},
},
["viennese"] = {
["descriptions"] = {"The Viennese dialect of German"},
["prefixes"] = {"de"},
},
["vivaraup"] = {
["descriptions"] = {"Vivaro-Alpine"},
["prefixes"] = {"oc"},
},
["wadegile"] = {
["descriptions"] = {"Wade-Giles romanization"},
["prefixes"] = {"zh-latn"},
},
["xsistemo"] = {
["descriptions"] = {"Standard X-system orthographic fallback for spelling Esperanto"},
["prefixes"] = {"eo"},
}
}
4lwwsa3pxn54ocmxwq5vtidb5y4gvdr
32908
32907
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lang/data/iana_variants]]
32907
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["1606nict"] = {
["descriptions"] = {"Late Middle French (to 1606)"},
["prefixes"] = {"frm"},
},
["1694acad"] = {
["descriptions"] = {"Early Modern French"},
["prefixes"] = {"fr"},
},
["1901"] = {
["descriptions"] = {"Traditional German orthography"},
["prefixes"] = {"de"},
},
["1959acad"] = {
["descriptions"] = {"\"Academic\" (\"governmental\") variant of Belarusian as codified in 1959"},
["prefixes"] = {"be"},
},
["1994"] = {
["descriptions"] = {"Standardized Resian orthography"},
["prefixes"] = {"sl-rozaj", "sl-rozaj-biske", "sl-rozaj-njiva", "sl-rozaj-osojs", "sl-rozaj-solba"},
},
["1996"] = {
["descriptions"] = {"German orthography of 1996"},
["prefixes"] = {"de"},
},
["abl1943"] = {
["descriptions"] = {"Orthographic formulation of 1943 - Official in Brazil (Formulário Ortográfico de 1943 - Oficial no Brasil)"},
["prefixes"] = {"pt-br"},
},
["akhmimic"] = {
["descriptions"] = {"Akhmimic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["akuapem"] = {
["descriptions"] = {"Akuapem Twi"},
["prefixes"] = {"tw"},
},
["alalc97"] = {
["descriptions"] = {"ALA-LC Romanization, 1997 edition"},
["prefixes"] = {},
},
["aluku"] = {
["descriptions"] = {"Aluku dialect", "Boni dialect"},
["prefixes"] = {"djk"},
},
["anpezo"] = {
["descriptions"] = {"Anpezo standard of Ladin"},
["prefixes"] = {"lld"},
},
["ao1990"] = {
["descriptions"] = {"Portuguese Language Orthographic Agreement of 1990 (Acordo Ortográfico da Língua Portuguesa de 1990)"},
["prefixes"] = {"pt", "gl"},
},
["aranes"] = {
["descriptions"] = {"Aranese"},
["prefixes"] = {"oc"},
},
["arkaika"] = {
["descriptions"] = {"Arcaicam Esperantom", "Arkaika Esperanto"},
["prefixes"] = {"eo"},
},
["asante"] = {
["descriptions"] = {"Asante Twi", "Ashanti Twi"},
["prefixes"] = {"tw"},
},
["auvern"] = {
["descriptions"] = {"Auvergnat"},
["prefixes"] = {"oc"},
},
["baku1926"] = {
["descriptions"] = {"Unified Turkic Latin Alphabet (Historical)"},
["prefixes"] = {"az", "ba", "crh", "kk", "krc", "ky", "sah", "tk", "tt", "uz"},
},
["balanka"] = {
["descriptions"] = {"The Balanka dialect of Anii"},
["prefixes"] = {"blo"},
},
["barla"] = {
["descriptions"] = {"The Barlavento dialect group of Kabuverdianu"},
["prefixes"] = {"kea"},
},
["basiceng"] = {
["descriptions"] = {"Basic English"},
["prefixes"] = {"en"},
},
["bauddha"] = {
["descriptions"] = {"Buddhist Hybrid Sanskrit"},
["prefixes"] = {"sa"},
},
["bciav"] = {
["descriptions"] = {"BCI Blissymbolics AV"},
["prefixes"] = {"zbl"},
},
["bcizbl"] = {
["descriptions"] = {"BCI Blissymbolics"},
["prefixes"] = {"zbl"},
},
["biscayan"] = {
["descriptions"] = {"Biscayan dialect of Basque"},
["prefixes"] = {"eu"},
},
["biske"] = {
["descriptions"] = {"The San Giorgio dialect of Resian", "The Bila dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["blasl"] = {
["descriptions"] = {"Black American Sign Language dialect"},
["prefixes"] = {"ase", "sgn-ase"},
},
["bohairic"] = {
["descriptions"] = {"Bohairic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["bohoric"] = {
["descriptions"] = {"Slovene in Bohorič alphabet"},
["prefixes"] = {"sl"},
},
["boont"] = {
["descriptions"] = {"Boontling"},
["prefixes"] = {"en"},
},
["bornholm"] = {
["descriptions"] = {"Bornholmsk"},
["prefixes"] = {"da"},
},
["cisaup"] = {
["descriptions"] = {"Cisalpine"},
["prefixes"] = {"oc"},
},
["colb1945"] = {
["descriptions"] = {"Portuguese-Brazilian Orthographic Convention of 1945 (Convenção Ortográfica Luso-Brasileira de 1945)"},
["prefixes"] = {"pt"},
},
["cornu"] = {
["descriptions"] = {"Cornu-English", "Cornish English", "Anglo-Cornish"},
["prefixes"] = {"en"},
},
["creiss"] = {
["descriptions"] = {"Occitan variants of the Croissant area"},
["prefixes"] = {"oc"},
},
["dajnko"] = {
["descriptions"] = {"Slovene in Dajnko alphabet"},
["prefixes"] = {"sl"},
},
["ekavsk"] = {
["descriptions"] = {"Serbian with Ekavian pronunciation"},
["prefixes"] = {"sr", "sr-latn", "sr-cyrl"},
},
["emodeng"] = {
["descriptions"] = {"Early Modern English (1500-1700)"},
["prefixes"] = {"en"},
},
["fascia"] = {
["descriptions"] = {"Fascia standard of Ladin"},
["prefixes"] = {"lld"},
},
["fayyumic"] = {
["descriptions"] = {"Fayyumic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["fodom"] = {
["descriptions"] = {"Fodom standard of Ladin"},
["prefixes"] = {"lld"},
},
["fonipa"] = {
["descriptions"] = {"International Phonetic Alphabet"},
["prefixes"] = {},
},
["fonkirsh"] = {
["descriptions"] = {"Kirshenbaum Phonetic Alphabet"},
["prefixes"] = {},
},
["fonnapa"] = {
["descriptions"] = {"North American Phonetic Alphabet", "Americanist Phonetic Notation"},
["prefixes"] = {},
},
["fonupa"] = {
["descriptions"] = {"Uralic Phonetic Alphabet"},
["prefixes"] = {},
},
["fonxsamp"] = {
["descriptions"] = {"X-SAMPA transcription"},
["prefixes"] = {},
},
["gallo"] = {
["descriptions"] = {"Gallo"},
["prefixes"] = {"fr"},
},
["gascon"] = {
["descriptions"] = {"Gascon"},
["prefixes"] = {"oc"},
},
["gherd"] = {
["descriptions"] = {"Gherdëina standard of Ladin"},
["prefixes"] = {"lld"},
},
["grclass"] = {
["descriptions"] = {"Classical Occitan orthography"},
["prefixes"] = {"oc", "oc-aranes", "oc-auvern", "oc-cisaup", "oc-creiss", "oc-gascon", "oc-lemosin", "oc-lengadoc", "oc-nicard", "oc-provenc", "oc-vivaraup"},
},
["grital"] = {
["descriptions"] = {"Italian-inspired Occitan orthography"},
["prefixes"] = {"oc", "oc-cisaup", "oc-nicard", "oc-provenc"},
},
["grmistr"] = {
["descriptions"] = {"Mistralian or Mistralian-inspired Occitan orthography"},
["prefixes"] = {"oc", "oc-aranes", "oc-auvern", "oc-cisaup", "oc-creiss", "oc-gascon", "oc-lemosin", "oc-lengadoc", "oc-nicard", "oc-provenc", "oc-vivaraup"},
},
["hanoi"] = {
["descriptions"] = {"The Hà Nội variant of Vietnamese"},
["prefixes"] = {"vi"},
},
["hepburn"] = {
["descriptions"] = {"Hepburn romanization"},
["prefixes"] = {"ja-latn"},
},
["hognorsk"] = {
["descriptions"] = {"Norwegian in Høgnorsk (High Norwegian) orthography"},
["prefixes"] = {"nn"},
},
["hsistemo"] = {
["descriptions"] = {"Standard H-system orthographic fallback for spelling Esperanto"},
["prefixes"] = {"eo"},
},
["huett"] = {
["descriptions"] = {"The Huế (province Thừa Thiên) variant of Vietnamese"},
["prefixes"] = {"vi"},
},
["ijekavsk"] = {
["descriptions"] = {"Serbian with Ijekavian pronunciation"},
["prefixes"] = {"sr", "sr-latn", "sr-cyrl"},
},
["itihasa"] = {
["descriptions"] = {"Epic Sanskrit"},
["prefixes"] = {"sa"},
},
["ivanchov"] = {
["descriptions"] = {"Bulgarian in 1899 orthography"},
["prefixes"] = {"bg"},
},
["jauer"] = {
["descriptions"] = {"Jauer dialect of Romansh"},
["prefixes"] = {"rm"},
},
["jyutping"] = {
["descriptions"] = {"Jyutping Cantonese Romanization"},
["prefixes"] = {"yue"},
},
["kkcor"] = {
["descriptions"] = {"Common Cornish orthography of Revived Cornish"},
["prefixes"] = {"kw"},
},
["kleinsch"] = {
["descriptions"] = {"Kleinschmidt orthography", "Allattaasitaamut"},
["prefixes"] = {"kl", "kl-tunumiit"},
},
["kociewie"] = {
["descriptions"] = {"The Kociewie dialect of Polish"},
["prefixes"] = {"pl"},
},
["kscor"] = {
["descriptions"] = {"Standard Cornish orthography of Revived Cornish", "Kernowek Standard"},
["prefixes"] = {"kw"},
},
["leidentr"] = {
["descriptions"] = {"Ancient Egyptian in Leiden Unified Transliteration"},
["prefixes"] = {"egy"},
},
["lemosin"] = {
["descriptions"] = {"Limousin"},
["prefixes"] = {"oc"},
},
["lengadoc"] = {
["descriptions"] = {"Languedocien"},
["prefixes"] = {"oc"},
},
["lipaw"] = {
["descriptions"] = {"The Lipovaz dialect of Resian", "The Lipovec dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["ltg1929"] = {
["descriptions"] = {"The Latgalian language orthography codified in 1929"},
["prefixes"] = {"ltg"},
},
["ltg2007"] = {
["descriptions"] = {"The Latgalian language orthography codified in the language law in 2007"},
["prefixes"] = {"ltg"},
},
["luna1918"] = {
["descriptions"] = {"Post-1917 Russian orthography"},
["prefixes"] = {"ru"},
},
["lycopol"] = {
["descriptions"] = {"Lycopolitan alias Subakhmimic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["mdcegyp"] = {
["descriptions"] = {"Ancient Egyptian hieroglyphs encoded in Manuel de Codage"},
["prefixes"] = {"egy"},
},
["mdctrans"] = {
["descriptions"] = {"Ancient Egyptian transliteration encoded in Manuel de Codage"},
["prefixes"] = {"egy"},
},
["mesokem"] = {
["descriptions"] = {"Mesokemic alias Oxyrhynchite dialect of Coptic"},
["prefixes"] = {"cop"},
},
["metelko"] = {
["descriptions"] = {"Slovene in Metelko alphabet"},
["prefixes"] = {"sl"},
},
["moderat"] = {
["descriptions"] = {"The moderate (conservative, i.e. Danish-like) spelling variant of Bokmål"},
["prefixes"] = {"nb"},
},
["monoton"] = {
["descriptions"] = {"Monotonic Greek"},
["prefixes"] = {"el"},
},
["ndyuka"] = {
["descriptions"] = {"Ndyuka dialect", "Aukan dialect"},
["prefixes"] = {"djk"},
},
["nedis"] = {
["descriptions"] = {"Natisone dialect", "Nadiza dialect"},
["prefixes"] = {"sl"},
},
["newfound"] = {
["descriptions"] = {"Newfoundland English"},
["prefixes"] = {"en-ca"},
},
["nicard"] = {
["descriptions"] = {"Niçard"},
["prefixes"] = {"oc"},
},
["njiva"] = {
["descriptions"] = {"The Gniva dialect of Resian", "The Njiva dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["nulik"] = {
["descriptions"] = {"Volapük nulik", "Volapük perevidöl", "Volapük nulädik", "de Jong's Volapük", "New Volapük", "Revised Volapük", "Modern Volapük"},
["prefixes"] = {"vo"},
},
["osojs"] = {
["descriptions"] = {"The Oseacco dialect of Resian", "The Osojane dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["oxendict"] = {
["descriptions"] = {"Oxford English Dictionary spelling"},
["prefixes"] = {"en"},
},
["pahawh2"] = {
["descriptions"] = {"Pahawh Hmong Second Stage Reduced orthography"},
["prefixes"] = {"mww", "hnj"},
},
["pahawh3"] = {
["descriptions"] = {"Pahawh Hmong Third Stage Reduced orthography"},
["prefixes"] = {"mww", "hnj"},
},
["pahawh4"] = {
["descriptions"] = {"Pahawh Hmong Final Version orthography"},
["prefixes"] = {"mww", "hnj"},
},
["pamaka"] = {
["descriptions"] = {"Pamaka dialect"},
["prefixes"] = {"djk"},
},
["peano"] = {
["descriptions"] = {"Latino Sine Flexione", "Interlingua de API", "Interlingua de Peano"},
["prefixes"] = {"la"},
},
["pehoeji"] = {
["descriptions"] = {"Hokkien Vernacular Romanization System", "Pe̍h-ōe-jī orthography/romanization"},
["prefixes"] = {"nan-latn"},
},
["petr1708"] = {
["descriptions"] = {"Petrine orthography"},
["prefixes"] = {"ru"},
},
["pinyin"] = {
["descriptions"] = {"Pinyin romanization"},
["prefixes"] = {"zh-latn", "bo-latn"},
},
["polyton"] = {
["descriptions"] = {"Polytonic Greek"},
["prefixes"] = {"el"},
},
["provenc"] = {
["descriptions"] = {"Provençal"},
["prefixes"] = {"oc"},
},
["puter"] = {
["descriptions"] = {"Puter idiom of Romansh"},
["prefixes"] = {"rm"},
},
["radikalt"] = {
["descriptions"] = {"Radical (i.e. Nynorsk-like) spelling variant of Bokmål"},
["prefixes"] = {"nb"},
},
["rigik"] = {
["descriptions"] = {"Volapük rigik", "Schleyer's Volapük", "Original Volapük", "Classic Volapük"},
["prefixes"] = {"vo"},
},
["rozaj"] = {
["descriptions"] = {"Resian", "Resianic", "Rezijan"},
["prefixes"] = {"sl"},
},
["rumgr"] = {
["descriptions"] = {"Rumantsch Grischun"},
["prefixes"] = {"rm"},
},
["sahidic"] = {
["descriptions"] = {"Sahidic dialect of Coptic"},
["prefixes"] = {"cop"},
},
["saigon"] = {
["descriptions"] = {"The Sài Gòn variant of Vietnamese"},
["prefixes"] = {"vi"},
},
["scotland"] = {
["descriptions"] = {"Scottish Standard English"},
["prefixes"] = {"en"},
},
["scouse"] = {
["descriptions"] = {"Scouse"},
["prefixes"] = {"en"},
},
["simple"] = {
["descriptions"] = {"Simplified form"},
["prefixes"] = {},
},
["slepe"] = {
["descriptions"] = {"Sorbian dialect of Schleife"},
["prefixes"] = {"dsb"},
},
["solba"] = {
["descriptions"] = {"The Stolvizza dialect of Resian", "The Solbica dialect of Resian"},
["prefixes"] = {"sl-rozaj"},
},
["sotav"] = {
["descriptions"] = {"The Sotavento dialect group of Kabuverdianu"},
["prefixes"] = {"kea"},
},
["spanglis"] = {
["descriptions"] = {"Spanglish"},
["prefixes"] = {"en", "es"},
},
["stadi"] = {
["descriptions"] = {"The \"Stadin slangi\" dialect of Finnish"},
["prefixes"] = {"fi"},
},
["surmiran"] = {
["descriptions"] = {"Surmiran idiom of Romansh"},
["prefixes"] = {"rm"},
},
["sursilv"] = {
["descriptions"] = {"Sursilvan idiom of Romansh"},
["prefixes"] = {"rm"},
},
["sutsilv"] = {
["descriptions"] = {"Sutsilvan idiom of Romansh"},
["prefixes"] = {"rm"},
},
["synnejyl"] = {
["descriptions"] = {"Synnejysk", "South Jutish"},
["prefixes"] = {"da"},
},
["taglish"] = {
["descriptions"] = {"Tagalog-English code-switching"},
["prefixes"] = {"en", "tl", "fil"},
},
["tailo"] = {
["descriptions"] = {"Taiwanese Hokkien Romanization System for Hokkien languages", "Tâi-lô orthography/romanization"},
["prefixes"] = {"nan-latn"},
},
["tarask"] = {
["descriptions"] = {"Belarusian in Taraskievica orthography"},
["prefixes"] = {"be"},
},
["tongyong"] = {
["descriptions"] = {"Tongyong Pinyin romanization"},
["prefixes"] = {"zh-latn"},
},
["tunumiit"] = {
["descriptions"] = {"Tunumiisiut", "East Greenlandic", "Østgrønlandsk"},
["prefixes"] = {"kl"},
},
["uccor"] = {
["descriptions"] = {"Unified Cornish orthography of Revived Cornish"},
["prefixes"] = {"kw"},
},
["ucrcor"] = {
["descriptions"] = {"Unified Cornish Revised orthography of Revived Cornish"},
["prefixes"] = {"kw"},
},
["ulster"] = {
["descriptions"] = {"Ulster dialect of Scots"},
["prefixes"] = {"sco"},
},
["unifon"] = {
["descriptions"] = {"Unifon phonetic alphabet"},
["prefixes"] = {"en", "hup", "kyh", "tol", "yur"},
},
["valbadia"] = {
["descriptions"] = {"Val Badia standard of Ladin"},
["prefixes"] = {"lld"},
},
["valencia"] = {
["descriptions"] = {"Valencian"},
["prefixes"] = {"ca"},
},
["vallader"] = {
["descriptions"] = {"Vallader idiom of Romansh"},
["prefixes"] = {"rm"},
},
["vecdruka"] = {
["descriptions"] = {"Latvian orthography used before 1920s (\"vecā druka\")"},
["prefixes"] = {"lv"},
},
["viennese"] = {
["descriptions"] = {"The Viennese dialect of German"},
["prefixes"] = {"de"},
},
["vivaraup"] = {
["descriptions"] = {"Vivaro-Alpine"},
["prefixes"] = {"oc"},
},
["wadegile"] = {
["descriptions"] = {"Wade-Giles romanization"},
["prefixes"] = {"zh-latn"},
},
["xsistemo"] = {
["descriptions"] = {"Standard X-system orthographic fallback for spelling Esperanto"},
["prefixes"] = {"eo"},
}
}
4lwwsa3pxn54ocmxwq5vtidb5y4gvdr
Module:Lang/data/iana suppressed scripts
828
1033
32909
8989
2026-10-10T22:29:17Z
en>Trappist the monk
0
update to 2026-09-17 data;
32909
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["Arab"] = {"ar", "fa", "ps", "ur"},
["Armn"] = {"hy"},
["Beng"] = {"as", "bn"},
["Blis"] = {"zbl"},
["Cyrl"] = {"ab", "be", "bg", "kk", "mk", "ru", "uk"},
["Deva"] = {"hi", "mr", "ne", "kok", "mai"},
["Ethi"] = {"am", "ti"},
["Geor"] = {"ka"},
["Grek"] = {"el"},
["Gujr"] = {"gu"},
["Guru"] = {"pa"},
["Hebr"] = {"he", "iw", "yi"},
["Jpan"] = {"ja"},
["Khmr"] = {"km"},
["Knda"] = {"kn"},
["Kore"] = {"ko"},
["Laoo"] = {"lo"},
["Latn"] = {"af", "ay", "bs", "ca", "ch", "cs", "cy", "da", "de", "en", "eo",
"es", "et", "eu", "fi", "fj", "fo", "fr", "fy", "ga", "gl", "gn",
"gv", "hr", "ht", "hu", "id", "in", "is", "it", "kl", "la", "lb",
"ln", "lt", "lv", "mg", "mh", "mo", "ms", "mt", "na", "nb", "nd",
"nl", "nn", "no", "nr", "ny", "om", "pl", "pt", "qu", "rm", "rn",
"ro", "rw", "sg", "sk", "sl", "sm", "so", "sq", "ss", "st", "sv",
"sw", "tl", "tn", "to", "tr", "ts", "ve", "vi", "xh", "zu", "dsb",
"frr", "frs", "gsw", "hsb", "men", "nds", "niu", "nso", "tem", "tkl", "tmh",
"tpi", "tvl"},
["Mlym"] = {"ml"},
["Mymr"] = {"my"},
["Nkoo"] = {"nqo"},
["Orya"] = {"or"},
["Sinh"] = {"si"},
["Taml"] = {"ta"},
["Telu"] = {"te"},
["Thaa"] = {"dv"},
["Thai"] = {"th"},
["Tibt"] = {"dz"}
}
s9owkj9w89lf8p6a2w0gvqh5spdfltr
32910
32909
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lang/data/iana_suppressed_scripts]]
32909
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["Arab"] = {"ar", "fa", "ps", "ur"},
["Armn"] = {"hy"},
["Beng"] = {"as", "bn"},
["Blis"] = {"zbl"},
["Cyrl"] = {"ab", "be", "bg", "kk", "mk", "ru", "uk"},
["Deva"] = {"hi", "mr", "ne", "kok", "mai"},
["Ethi"] = {"am", "ti"},
["Geor"] = {"ka"},
["Grek"] = {"el"},
["Gujr"] = {"gu"},
["Guru"] = {"pa"},
["Hebr"] = {"he", "iw", "yi"},
["Jpan"] = {"ja"},
["Khmr"] = {"km"},
["Knda"] = {"kn"},
["Kore"] = {"ko"},
["Laoo"] = {"lo"},
["Latn"] = {"af", "ay", "bs", "ca", "ch", "cs", "cy", "da", "de", "en", "eo",
"es", "et", "eu", "fi", "fj", "fo", "fr", "fy", "ga", "gl", "gn",
"gv", "hr", "ht", "hu", "id", "in", "is", "it", "kl", "la", "lb",
"ln", "lt", "lv", "mg", "mh", "mo", "ms", "mt", "na", "nb", "nd",
"nl", "nn", "no", "nr", "ny", "om", "pl", "pt", "qu", "rm", "rn",
"ro", "rw", "sg", "sk", "sl", "sm", "so", "sq", "ss", "st", "sv",
"sw", "tl", "tn", "to", "tr", "ts", "ve", "vi", "xh", "zu", "dsb",
"frr", "frs", "gsw", "hsb", "men", "nds", "niu", "nso", "tem", "tkl", "tmh",
"tpi", "tvl"},
["Mlym"] = {"ml"},
["Mymr"] = {"my"},
["Nkoo"] = {"nqo"},
["Orya"] = {"or"},
["Sinh"] = {"si"},
["Taml"] = {"ta"},
["Telu"] = {"te"},
["Thaa"] = {"dv"},
["Thai"] = {"th"},
["Tibt"] = {"dz"}
}
s9owkj9w89lf8p6a2w0gvqh5spdfltr
Module:Shortcut
828
1055
33017
9064
2026-09-20T14:55:19Z
en>Nux
0
nowrap per https://en.wikipedia.org/wiki/Template_talk:Shortcut#c-FaviFake-20260803192700-ER_nowrap
33017
Scribunto
text/plain
-- This module implements {{shortcut}}.
-- Set constants
local CONFIG_MODULE = 'Module:Shortcut/config'
-- Load required modules
local checkType = require('libraryUtil').checkType
local yesno = require('Module:Yesno')
local p = {}
local function message(msg, ...)
return mw.message.newRawMessage(msg, ...):plain()
end
local function makeCategoryLink(cat)
return string.format('[[%s:%s]]', mw.site.namespaces[14].name, cat)
end
function p._main(shortcuts, options, frame, cfg)
checkType('_main', 1, shortcuts, 'table')
checkType('_main', 2, options, 'table', true)
options = options or {}
frame = frame or mw.getCurrentFrame()
cfg = cfg or mw.loadData(CONFIG_MODULE)
local templateMode = options.template and yesno(options.template)
local redirectMode = options.redirect and yesno(options.redirect)
local isCategorized = not options.category or yesno(options.category) ~= false
-- Validate shortcuts
for i, shortcut in ipairs(shortcuts) do
if type(shortcut) ~= 'string' or #shortcut < 1 then
error(message(cfg['invalid-shortcut-error'], i), 2)
end
end
-- Make the list items. These are the shortcuts plus any extra lines such
-- as options.msg.
local listItems = {}
for i, shortcut in ipairs(shortcuts) do
local templatePath, prefix
if templateMode then
-- Namespace detection
local titleObj = mw.title.new(shortcut, 10)
if titleObj.namespace == 10 then
templatePath = titleObj.fullText
else
templatePath = shortcut
end
prefix = options['pre' .. i] or options.pre or ''
end
if options.target and yesno(options.target) then
listItems[i] = templateMode
and string.format("{{%s[[%s|%s]]}}", prefix, templatePath, shortcut)
or string.format("[[%s]]", shortcut)
else
listItems[i] = frame:expandTemplate{
title = 'No redirect',
args = templateMode and {templatePath, shortcut} or {shortcut, shortcut}
}
if templateMode then
listItems[i] = string.format("{{%s%s}}", prefix, listItems[i])
end
end
-- Wrap each shortcut in a nowrap span
-- e.g. [[WP:CFORK/I]] in [[Special:PermanentLink/1366587294]]
listItems[i] = string.format('<span class="nowrap">%s</span>', listItems[i])
end
table.insert(listItems, options.msg)
-- Return an error if we have nothing to display
if #listItems < 1 then
local msg = cfg['no-content-error']
msg = string.format('<strong class="error">%s</strong>', msg)
if isCategorized and cfg['no-content-error-category'] then
msg = msg .. makeCategoryLink(cfg['no-content-error-category'])
end
return msg
end
local root = mw.html.create()
root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Shortcut/styles.css'} })
-- Anchors
local anchorDiv = root
:tag('div')
:addClass('module-shortcutanchordiv')
for i, shortcut in ipairs(shortcuts) do
local anchor = mw.uri.anchorEncode(shortcut)
anchorDiv:tag('span'):attr('id', anchor)
end
-- Shortcut heading
local shortcutHeading
do
local nShortcuts = #shortcuts
if nShortcuts > 0 then
local headingMsg = options['shortcut-heading'] or
redirectMode and cfg['redirect-heading'] or
cfg['shortcut-heading']
shortcutHeading = message(headingMsg, nShortcuts)
shortcutHeading = frame:preprocess(shortcutHeading)
end
end
-- Shortcut box
local shortcutList = root
:tag('div')
:addClass('module-shortcutboxplain noprint')
:attr('role', 'note')
if options.float and options.float:lower() == 'left' then
shortcutList:addClass('module-shortcutboxleft')
end
if options.clear and options.clear ~= '' then
shortcutList:css('clear', options.clear)
end
if shortcutHeading then
shortcutList
:tag('div')
:addClass('module-shortcutlist')
:wikitext(shortcutHeading)
end
local ubl = require('Module:List').unbulleted(listItems)
shortcutList:wikitext(ubl)
return tostring(root)
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
-- Separate shortcuts from options
local shortcuts, options = {}, {}
for k, v in pairs(args) do
if type(k) == 'number' then
shortcuts[k] = v
else
options[k] = v
end
end
-- Compress the shortcut array, which may contain nils.
local function compressArray(t)
local nums, ret = {}, {}
for k in pairs(t) do
nums[#nums + 1] = k
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end
shortcuts = compressArray(shortcuts)
return p._main(shortcuts, options, frame)
end
return p
2ffvf8o7i2lpgr8nnkkd82g24i6nwsv
33018
33017
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Shortcut]]
33017
Scribunto
text/plain
-- This module implements {{shortcut}}.
-- Set constants
local CONFIG_MODULE = 'Module:Shortcut/config'
-- Load required modules
local checkType = require('libraryUtil').checkType
local yesno = require('Module:Yesno')
local p = {}
local function message(msg, ...)
return mw.message.newRawMessage(msg, ...):plain()
end
local function makeCategoryLink(cat)
return string.format('[[%s:%s]]', mw.site.namespaces[14].name, cat)
end
function p._main(shortcuts, options, frame, cfg)
checkType('_main', 1, shortcuts, 'table')
checkType('_main', 2, options, 'table', true)
options = options or {}
frame = frame or mw.getCurrentFrame()
cfg = cfg or mw.loadData(CONFIG_MODULE)
local templateMode = options.template and yesno(options.template)
local redirectMode = options.redirect and yesno(options.redirect)
local isCategorized = not options.category or yesno(options.category) ~= false
-- Validate shortcuts
for i, shortcut in ipairs(shortcuts) do
if type(shortcut) ~= 'string' or #shortcut < 1 then
error(message(cfg['invalid-shortcut-error'], i), 2)
end
end
-- Make the list items. These are the shortcuts plus any extra lines such
-- as options.msg.
local listItems = {}
for i, shortcut in ipairs(shortcuts) do
local templatePath, prefix
if templateMode then
-- Namespace detection
local titleObj = mw.title.new(shortcut, 10)
if titleObj.namespace == 10 then
templatePath = titleObj.fullText
else
templatePath = shortcut
end
prefix = options['pre' .. i] or options.pre or ''
end
if options.target and yesno(options.target) then
listItems[i] = templateMode
and string.format("{{%s[[%s|%s]]}}", prefix, templatePath, shortcut)
or string.format("[[%s]]", shortcut)
else
listItems[i] = frame:expandTemplate{
title = 'No redirect',
args = templateMode and {templatePath, shortcut} or {shortcut, shortcut}
}
if templateMode then
listItems[i] = string.format("{{%s%s}}", prefix, listItems[i])
end
end
-- Wrap each shortcut in a nowrap span
-- e.g. [[WP:CFORK/I]] in [[Special:PermanentLink/1366587294]]
listItems[i] = string.format('<span class="nowrap">%s</span>', listItems[i])
end
table.insert(listItems, options.msg)
-- Return an error if we have nothing to display
if #listItems < 1 then
local msg = cfg['no-content-error']
msg = string.format('<strong class="error">%s</strong>', msg)
if isCategorized and cfg['no-content-error-category'] then
msg = msg .. makeCategoryLink(cfg['no-content-error-category'])
end
return msg
end
local root = mw.html.create()
root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Shortcut/styles.css'} })
-- Anchors
local anchorDiv = root
:tag('div')
:addClass('module-shortcutanchordiv')
for i, shortcut in ipairs(shortcuts) do
local anchor = mw.uri.anchorEncode(shortcut)
anchorDiv:tag('span'):attr('id', anchor)
end
-- Shortcut heading
local shortcutHeading
do
local nShortcuts = #shortcuts
if nShortcuts > 0 then
local headingMsg = options['shortcut-heading'] or
redirectMode and cfg['redirect-heading'] or
cfg['shortcut-heading']
shortcutHeading = message(headingMsg, nShortcuts)
shortcutHeading = frame:preprocess(shortcutHeading)
end
end
-- Shortcut box
local shortcutList = root
:tag('div')
:addClass('module-shortcutboxplain noprint')
:attr('role', 'note')
if options.float and options.float:lower() == 'left' then
shortcutList:addClass('module-shortcutboxleft')
end
if options.clear and options.clear ~= '' then
shortcutList:css('clear', options.clear)
end
if shortcutHeading then
shortcutList
:tag('div')
:addClass('module-shortcutlist')
:wikitext(shortcutHeading)
end
local ubl = require('Module:List').unbulleted(listItems)
shortcutList:wikitext(ubl)
return tostring(root)
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
-- Separate shortcuts from options
local shortcuts, options = {}, {}
for k, v in pairs(args) do
if type(k) == 'number' then
shortcuts[k] = v
else
options[k] = v
end
end
-- Compress the shortcut array, which may contain nils.
local function compressArray(t)
local nums, ret = {}, {}
for k in pairs(t) do
nums[#nums + 1] = k
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end
shortcuts = compressArray(shortcuts)
return p._main(shortcuts, options, frame)
end
return p
2ffvf8o7i2lpgr8nnkkd82g24i6nwsv
Module:Transclusion count/data/D
828
1059
33497
12110
2026-10-18T05:09:06Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33497
Scribunto
text/plain
return {
["D&D_to-do"] = 6600,
["DANFS"] = 8100,
["DBCatsURL"] = 2000,
["DCS_Sri_Lanka"] = 2000,
["DDR"] = 2900,
["DEC"] = 11000,
["DECADE"] = 321000,
["DEN"] = 7600,
["DEU"] = 20000,
["DGRBM"] = 2000,
["DMC"] = 45000,
["DMCA"] = 3320000,
["DNB"] = 9600,
["DNB-Portal"] = 2300,
["DNB_portal"] = 3600,
["DNK"] = 8700,
["DNZB"] = 3700,
["DOM"] = 2400,
["DOWs"] = 2800,
["DRV_links"] = 4300,
["DWT"] = 2600,
["DYKC"] = 6700,
["DYKF"] = 2100,
["DYK_blue"] = 3400,
["DYK_checklist"] = 25000,
["DYK_conditions"] = 64000,
["DYK_files"] = 2100,
["DYK_header"] = 60000,
["DYK_nompage_links"] = 104000,
["DYK_talk"] = 111000,
["DYK_talk/date"] = 111000,
["DYK_tools"] = 82000,
["DYK_tools/styles.css"] = 82000,
["DYKfile"] = 13000,
["DZA"] = 3100,
["Dab"] = 21000,
["Dagger"] = 25000,
["Dark_red"] = 3500,
["Darkred"] = 3200,
["Dash"] = 2700,
["Dashboard.wikiedu.org_assignment"] = 37000,
["Dashboard.wikiedu.org_bibliography/bibliography"] = 13000,
["Dashboard.wikiedu.org_bibliography/guide"] = 20000,
["Dashboard.wikiedu.org_bibliography/outline"] = 13000,
["Dashboard.wikiedu.org_course_header"] = 8500,
["Dashboard.wikiedu.org_course_header/edit-note"] = 8500,
["Dashboard.wikiedu.org_draft_template/about_this_sandbox"] = 21000,
["Dashboard.wikiedu.org_evaluate_article/guide"] = 25000,
["Dashboard.wikiedu.org_peer_review/guide"] = 27000,
["Dashboard.wikiedu.org_sandbox"] = 117000,
["Dashboard.wikiedu.org_student_editor"] = 124000,
["Dashboard.wikiedu.org_student_program_sandbox"] = 116000,
["Dashboard.wikiedu.org_talk_course_link"] = 125000,
["Dashboard.wikiedu.org_user_talk"] = 2200,
["Date"] = 52000,
["Date-mf"] = 64000,
["DateStyle"] = 2000,
["Date_table_sorting"] = 46000,
["Dated_maintenance_category"] = 3400000,
["Dated_maintenance_category_(articles)"] = 3360000,
["Dated_maintenance_category_by_type_(articles)"] = 23000,
["Davis_Cup_player"] = 2500,
["Day+1"] = 6900,
["Day-1"] = 8300,
["Db-meta"] = 2000,
["Dbox"] = 3000,
["Dda"] = 2500,
["Dead_YouTube_link"] = 2300,
["Dead_link"] = 371000,
["Deadweight_tonnage"] = 2700,
["Death-date_and_age"] = 4700,
["Death_date"] = 15000,
["Death_date_and_age"] = 538000,
["Death_date_and_given_age"] = 4700,
["Death_date_text"] = 6200,
["Death_year"] = 4600,
["Death_year_and_age"] = 29000,
["Death_year_category_header"] = 2000,
["Decade_link"] = 38000,
["Decimals"] = 3600,
["Declination"] = 11000,
["Decline"] = 2700,
["Declined"] = 3600,
["Decrease"] = 53000,
["Define"] = 2200,
["Deg2DMS"] = 3300,
["Deleted_on_Commons"] = 5700,
["Deletion_review_log_header"] = 6800,
["Deletion_review_log_header/Core"] = 6800,
["Delink"] = 1960000,
["Delink_question_hyphen-minus"] = 445000,
["Delrevxfd"] = 4000,
["Democratic_Party_(US)/meta/shading"] = 19000,
["Deprecated_archive"] = 85000,
["Description_missing"] = 5500,
["Designation/text"] = 18000,
["Designation_list"] = 8100,
["Details"] = 3300,
["DetailsLink"] = 5500,
["Details_link"] = 6600,
["Detect_singular"] = 259000,
["Deutsche_Bahn_station_codes"] = 2200,
["DfE_performance_tables"] = 4500,
["Dictionary_of_National_Biography"] = 9600,
["Diff"] = 34000,
["Diff2"] = 16000,
["Diffusing_occupation_by_nationality_and_century_category_header"] = 4400,
["Diffusing_occupation_by_nationality_and_century_category_header/core"] = 7900,
["Digits"] = 6500,
["Directories_box"] = 3200,
["Disamb"] = 2200,
["Disambig"] = 63000,
["Disambig-Class"] = 12000,
["Disambiguation"] = 236000,
["Disambiguation/cat"] = 235000,
["Disambiguation_page_short_description"] = 382000,
["Discogs_artist"] = 25000,
["Discogs_master"] = 16000,
["Discogs_release"] = 3700,
["Discussion_bottom"] = 14000,
["Discussion_top"] = 15000,
["Disestablishment_category_in_country"] = 10000,
["Disestablishment_category_in_country/core"] = 10000,
["Disestablishment_category_in_country_by_decade"] = 2500,
["Disestablishment_category_in_country_by_decade/core"] = 2500,
["DisestcatCountry"] = 10000,
["DisestcatCountry/core"] = 10000,
["DisestcatUSstate"] = 5200,
["DisestcatUSstate/core"] = 5200,
["Disputed"] = 2100,
["Distinguish"] = 130000,
["Disused_Rail_Start"] = 4000,
["Disused_rail_start"] = 4300,
["Div_col"] = 506000,
["Div_col/styles.css"] = 509000,
["Div_col_end"] = 368000,
["Divbox"] = 500000,
["Divbox/styles.css"] = 500000,
["Dividing_line"] = 4500,
["Dmbox"] = 513000,
["Dmbox/styles.css"] = 514000,
["Do_not_move_to_Commons"] = 24000,
["Doc"] = 3900,
["Documentation"] = 156000,
["Documentation_subpage"] = 102000,
["Dog_opentask"] = 4200,
["Doi"] = 29000,
["Doing"] = 4200,
["Don't_edit_this_line"] = 151000,
["Don't_edit_this_line_always_display"] = 657000,
["Don't_edit_this_line_extinct"] = 657000,
["Don't_edit_this_line_link_target"] = 657000,
["Don't_edit_this_line_link_text"] = 657000,
["Don't_edit_this_line_parent"] = 657000,
["Don't_edit_this_line_rank"] = 657000,
["Don't_edit_this_line_refs"] = 151000,
["Don't_edit_this_line_same_as"] = 657000,
["Done"] = 125000,
["Doppelganger"] = 2900,
["Double+single"] = 4500,
["Double-dagger"] = 29000,
["Dow_tooltip"] = 2500,
["Dr"] = 3300,
["Dr-logno"] = 3300,
["Dr-make"] = 3300,
["Dr-yr"] = 3300,
["Draft_article"] = 11000,
["Draft_article_check"] = 11000,
["Draft_categories"] = 11000,
["Draft_other"] = 118000,
["Draft_topics"] = 31000,
["Drafts_moved_from_mainspace"] = 10000,
["Drainage"] = 8300,
["Draw"] = 4800,
["Draw_key"] = 22000,
["Draw_links"] = 16000,
["Drep"] = 3300,
["DriverDB_driver"] = 2900,
["Drugbankcite"] = 4200,
["Drugbox"] = 6200,
["Drugs.com"] = 3300,
["Dts"] = 45000,
["Dubious"] = 8700,
["Duck"] = 3300,
["Dummytab"] = 6700,
["Duplication"] = 5800,
["Duration"] = 45000,
["Dutch_municipality"] = 2700,
["Dyktalk"] = 39000,
["Dynamic_list"] = 14000,
["Module:DYK_checklist"] = 25000,
["Module:DYK_checklist/data"] = 25000,
["Module:DYK_nompage_links"] = 104000,
["Module:Data"] = 58000,
["Module:Date"] = 2120000,
["Module:DateI18n"] = 49000,
["Module:Date_table_sorting"] = 49000,
["Module:Date_time"] = 568000,
["Module:DecodeEncode"] = 91000,
["Module:Delink"] = 4330000,
["Module:Deprecated_archive"] = 85000,
["Module:Designation"] = 107000,
["Module:Designation/list"] = 107000,
["Module:Designation/lookup"] = 26000,
["Module:Detect_singular"] = 3220000,
["Module:Diff"] = 3600,
["Module:Disambiguation"] = 24000,
["Module:Disambiguation/templates"] = 13400000,
["Module:Distinguish"] = 130000,
["Module:Documentation"] = 210000,
["Module:Documentation/config"] = 210000,
["Module:Documentation/styles.css"] = 210000,
["Module:Domain_handler"] = 17000,
["Module:Draft_topics"] = 31000,
["Module:Dts"] = 3400,
["Module:Duration"] = 254000,
}
dwplygiul7174wxy272pwwfp9ilyv1e
33498
33497
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/D]]
33497
Scribunto
text/plain
return {
["D&D_to-do"] = 6600,
["DANFS"] = 8100,
["DBCatsURL"] = 2000,
["DCS_Sri_Lanka"] = 2000,
["DDR"] = 2900,
["DEC"] = 11000,
["DECADE"] = 321000,
["DEN"] = 7600,
["DEU"] = 20000,
["DGRBM"] = 2000,
["DMC"] = 45000,
["DMCA"] = 3320000,
["DNB"] = 9600,
["DNB-Portal"] = 2300,
["DNB_portal"] = 3600,
["DNK"] = 8700,
["DNZB"] = 3700,
["DOM"] = 2400,
["DOWs"] = 2800,
["DRV_links"] = 4300,
["DWT"] = 2600,
["DYKC"] = 6700,
["DYKF"] = 2100,
["DYK_blue"] = 3400,
["DYK_checklist"] = 25000,
["DYK_conditions"] = 64000,
["DYK_files"] = 2100,
["DYK_header"] = 60000,
["DYK_nompage_links"] = 104000,
["DYK_talk"] = 111000,
["DYK_talk/date"] = 111000,
["DYK_tools"] = 82000,
["DYK_tools/styles.css"] = 82000,
["DYKfile"] = 13000,
["DZA"] = 3100,
["Dab"] = 21000,
["Dagger"] = 25000,
["Dark_red"] = 3500,
["Darkred"] = 3200,
["Dash"] = 2700,
["Dashboard.wikiedu.org_assignment"] = 37000,
["Dashboard.wikiedu.org_bibliography/bibliography"] = 13000,
["Dashboard.wikiedu.org_bibliography/guide"] = 20000,
["Dashboard.wikiedu.org_bibliography/outline"] = 13000,
["Dashboard.wikiedu.org_course_header"] = 8500,
["Dashboard.wikiedu.org_course_header/edit-note"] = 8500,
["Dashboard.wikiedu.org_draft_template/about_this_sandbox"] = 21000,
["Dashboard.wikiedu.org_evaluate_article/guide"] = 25000,
["Dashboard.wikiedu.org_peer_review/guide"] = 27000,
["Dashboard.wikiedu.org_sandbox"] = 117000,
["Dashboard.wikiedu.org_student_editor"] = 124000,
["Dashboard.wikiedu.org_student_program_sandbox"] = 116000,
["Dashboard.wikiedu.org_talk_course_link"] = 125000,
["Dashboard.wikiedu.org_user_talk"] = 2200,
["Date"] = 52000,
["Date-mf"] = 64000,
["DateStyle"] = 2000,
["Date_table_sorting"] = 46000,
["Dated_maintenance_category"] = 3400000,
["Dated_maintenance_category_(articles)"] = 3360000,
["Dated_maintenance_category_by_type_(articles)"] = 23000,
["Davis_Cup_player"] = 2500,
["Day+1"] = 6900,
["Day-1"] = 8300,
["Db-meta"] = 2000,
["Dbox"] = 3000,
["Dda"] = 2500,
["Dead_YouTube_link"] = 2300,
["Dead_link"] = 371000,
["Deadweight_tonnage"] = 2700,
["Death-date_and_age"] = 4700,
["Death_date"] = 15000,
["Death_date_and_age"] = 538000,
["Death_date_and_given_age"] = 4700,
["Death_date_text"] = 6200,
["Death_year"] = 4600,
["Death_year_and_age"] = 29000,
["Death_year_category_header"] = 2000,
["Decade_link"] = 38000,
["Decimals"] = 3600,
["Declination"] = 11000,
["Decline"] = 2700,
["Declined"] = 3600,
["Decrease"] = 53000,
["Define"] = 2200,
["Deg2DMS"] = 3300,
["Deleted_on_Commons"] = 5700,
["Deletion_review_log_header"] = 6800,
["Deletion_review_log_header/Core"] = 6800,
["Delink"] = 1960000,
["Delink_question_hyphen-minus"] = 445000,
["Delrevxfd"] = 4000,
["Democratic_Party_(US)/meta/shading"] = 19000,
["Deprecated_archive"] = 85000,
["Description_missing"] = 5500,
["Designation/text"] = 18000,
["Designation_list"] = 8100,
["Details"] = 3300,
["DetailsLink"] = 5500,
["Details_link"] = 6600,
["Detect_singular"] = 259000,
["Deutsche_Bahn_station_codes"] = 2200,
["DfE_performance_tables"] = 4500,
["Dictionary_of_National_Biography"] = 9600,
["Diff"] = 34000,
["Diff2"] = 16000,
["Diffusing_occupation_by_nationality_and_century_category_header"] = 4400,
["Diffusing_occupation_by_nationality_and_century_category_header/core"] = 7900,
["Digits"] = 6500,
["Directories_box"] = 3200,
["Disamb"] = 2200,
["Disambig"] = 63000,
["Disambig-Class"] = 12000,
["Disambiguation"] = 236000,
["Disambiguation/cat"] = 235000,
["Disambiguation_page_short_description"] = 382000,
["Discogs_artist"] = 25000,
["Discogs_master"] = 16000,
["Discogs_release"] = 3700,
["Discussion_bottom"] = 14000,
["Discussion_top"] = 15000,
["Disestablishment_category_in_country"] = 10000,
["Disestablishment_category_in_country/core"] = 10000,
["Disestablishment_category_in_country_by_decade"] = 2500,
["Disestablishment_category_in_country_by_decade/core"] = 2500,
["DisestcatCountry"] = 10000,
["DisestcatCountry/core"] = 10000,
["DisestcatUSstate"] = 5200,
["DisestcatUSstate/core"] = 5200,
["Disputed"] = 2100,
["Distinguish"] = 130000,
["Disused_Rail_Start"] = 4000,
["Disused_rail_start"] = 4300,
["Div_col"] = 506000,
["Div_col/styles.css"] = 509000,
["Div_col_end"] = 368000,
["Divbox"] = 500000,
["Divbox/styles.css"] = 500000,
["Dividing_line"] = 4500,
["Dmbox"] = 513000,
["Dmbox/styles.css"] = 514000,
["Do_not_move_to_Commons"] = 24000,
["Doc"] = 3900,
["Documentation"] = 156000,
["Documentation_subpage"] = 102000,
["Dog_opentask"] = 4200,
["Doi"] = 29000,
["Doing"] = 4200,
["Don't_edit_this_line"] = 151000,
["Don't_edit_this_line_always_display"] = 657000,
["Don't_edit_this_line_extinct"] = 657000,
["Don't_edit_this_line_link_target"] = 657000,
["Don't_edit_this_line_link_text"] = 657000,
["Don't_edit_this_line_parent"] = 657000,
["Don't_edit_this_line_rank"] = 657000,
["Don't_edit_this_line_refs"] = 151000,
["Don't_edit_this_line_same_as"] = 657000,
["Done"] = 125000,
["Doppelganger"] = 2900,
["Double+single"] = 4500,
["Double-dagger"] = 29000,
["Dow_tooltip"] = 2500,
["Dr"] = 3300,
["Dr-logno"] = 3300,
["Dr-make"] = 3300,
["Dr-yr"] = 3300,
["Draft_article"] = 11000,
["Draft_article_check"] = 11000,
["Draft_categories"] = 11000,
["Draft_other"] = 118000,
["Draft_topics"] = 31000,
["Drafts_moved_from_mainspace"] = 10000,
["Drainage"] = 8300,
["Draw"] = 4800,
["Draw_key"] = 22000,
["Draw_links"] = 16000,
["Drep"] = 3300,
["DriverDB_driver"] = 2900,
["Drugbankcite"] = 4200,
["Drugbox"] = 6200,
["Drugs.com"] = 3300,
["Dts"] = 45000,
["Dubious"] = 8700,
["Duck"] = 3300,
["Dummytab"] = 6700,
["Duplication"] = 5800,
["Duration"] = 45000,
["Dutch_municipality"] = 2700,
["Dyktalk"] = 39000,
["Dynamic_list"] = 14000,
["Module:DYK_checklist"] = 25000,
["Module:DYK_checklist/data"] = 25000,
["Module:DYK_nompage_links"] = 104000,
["Module:Data"] = 58000,
["Module:Date"] = 2120000,
["Module:DateI18n"] = 49000,
["Module:Date_table_sorting"] = 49000,
["Module:Date_time"] = 568000,
["Module:DecodeEncode"] = 91000,
["Module:Delink"] = 4330000,
["Module:Deprecated_archive"] = 85000,
["Module:Designation"] = 107000,
["Module:Designation/list"] = 107000,
["Module:Designation/lookup"] = 26000,
["Module:Detect_singular"] = 3220000,
["Module:Diff"] = 3600,
["Module:Disambiguation"] = 24000,
["Module:Disambiguation/templates"] = 13400000,
["Module:Distinguish"] = 130000,
["Module:Documentation"] = 210000,
["Module:Documentation/config"] = 210000,
["Module:Documentation/styles.css"] = 210000,
["Module:Domain_handler"] = 17000,
["Module:Draft_topics"] = 31000,
["Module:Dts"] = 3400,
["Module:Duration"] = 254000,
}
dwplygiul7174wxy272pwwfp9ilyv1e
Tempilet:Pval
10
1074
33045
9114
2026-10-07T09:22:30Z
en>EmausBot
0
Bot: Fixing double redirect from [[Template:Param value]] to [[Template:Parameter value]]
33045
wikitext
text/x-wiki
#REDIRECT [[Template:Parameter value]]
{{Rcat shell|
{{R shortcut}}
}}
2vlduzsu6xnh97bdn2uzcn97lfvb45z
33046
33045
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Pval]]
33045
wikitext
text/x-wiki
#REDIRECT [[Template:Parameter value]]
{{Rcat shell|
{{R shortcut}}
}}
2vlduzsu6xnh97bdn2uzcn97lfvb45z
Module:Transclusion count/data/S
828
1086
33051
9165
2026-10-18T05:11:36Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33051
Scribunto
text/plain
return {
["S"] = 4400,
["S-aca"] = 6700,
["S-ach"] = 17000,
["S-aft"] = 231000,
["S-aft/check"] = 231000,
["S-aft/filter"] = 231000,
["S-bef"] = 235000,
["S-bef/check"] = 235000,
["S-bef/filter"] = 235000,
["S-break"] = 6600,
["S-bus"] = 2100,
["S-civ"] = 2900,
["S-dip"] = 6000,
["S-end"] = 262000,
["S-gov"] = 8500,
["S-hon"] = 4000,
["S-hou"] = 9800,
["S-inc"] = 13000,
["S-legal"] = 9900,
["S-line_label"] = 2000,
["S-mil"] = 13000,
["S-new"] = 17000,
["S-non"] = 11000,
["S-npo"] = 4200,
["S-off"] = 43000,
["S-par"] = 52000,
["S-par/en"] = 3300,
["S-par/gb"] = 3300,
["S-par/uk"] = 12000,
["S-par/us-hs"] = 12000,
["S-par/us-sen"] = 2100,
["S-ppo"] = 15000,
["S-prec"] = 3200,
["S-reg"] = 22000,
["S-rel"] = 19000,
["S-roy"] = 2800,
["S-sports"] = 12000,
["S-start"] = 254000,
["S-ttl"] = 243000,
["S-ttl/check"] = 243000,
["S-vac"] = 7800,
["SAU"] = 2100,
["SCO"] = 3800,
["SDcat"] = 6850000,
["SECOND"] = 2300,
["SGP"] = 2900,
["SIA"] = 2500,
["SLL"] = 2000,
["SLO"] = 4900,
["SMS"] = 6900,
["SMU"] = 2500,
["SPI_archive_notice"] = 85000,
["SPIarchive_notice"] = 82000,
["SPIcat"] = 3800,
["SPIclose"] = 3300,
["SPIpriorcases"] = 78000,
["SR/Olympics_profile"] = 2200,
["SRB"] = 4400,
["SS"] = 22000,
["SSPa"] = 2600,
["STN"] = 11000,
["SUBJECTSPACE_formatted"] = 45000,
["SUI"] = 9700,
["SVG"] = 2600,
["SVG-Logo"] = 26000,
["SVG-Res"] = 24000,
["SVG-logo"] = 14000,
["SVK"] = 8800,
["SVN"] = 5900,
["SWE"] = 14000,
["Salts_by_element"] = 2300,
["Sandbox_other"] = 481000,
["Saturday"] = 2800,
["Saved_book"] = 52000,
["Sc"] = 2900,
["Scholia"] = 3700,
["School_block"] = 13000,
["School_disambiguation"] = 3500,
["Schoolblock"] = 6900,
["Schooldis"] = 2700,
["Schoolip"] = 12000,
["Scientist_icon"] = 16000,
["Scientist_icon2"] = 16000,
["Sclass"] = 34000,
["Sclass2"] = 11000,
["Screen_reader-only"] = 109000,
["Screen_reader-only/styles.css"] = 150000,
["Script"] = 7600,
["Script/Arabic"] = 4100,
["Script/Hebrew"] = 4900,
["Script/Nastaliq"] = 15000,
["Script/doc/id-unk"] = 3200,
["Script/doc/id-unk/core"] = 3300,
["Script/doc/id-unk/is-iso-alpha4"] = 3200,
["Script/doc/id-unk/name-to-alpha4"] = 3300,
["Script/styles.css"] = 3400,
["Script/styles_arabic.css"] = 4100,
["Script/styles_hebrew.css"] = 4900,
["Sdash"] = 4100,
["Search_box"] = 74000,
["Search_link"] = 28000,
["Section_link"] = 167000,
["Section_sizes"] = 4400,
["See"] = 8900,
["See_also"] = 220000,
["Seealso"] = 8200,
["Seiner_Majestät_Schiff"] = 6900,
["Seiner_Majestät_Unterseeboot"] = 2500,
["Select_skin"] = 5500,
["Selected"] = 2000,
["Selected_article"] = 2500,
["Selected_picture"] = 2400,
["Self"] = 45000,
["Self-published_inline"] = 4800,
["Self-published_source"] = 6100,
["Self-reference"] = 2200,
["Self-reference_tool"] = 8300,
["Semi-protected_indefinitely"] = 4800,
["Sent_off"] = 17000,
["Sentoff"] = 6400,
["Separated_entries"] = 2900,
["Sequence"] = 4200,
["Series_overview"] = 10000,
["Serif"] = 5000,
["Set_category"] = 38000,
["Set_index_article"] = 6400,
["Sets_taxobox_colour"] = 3200,
["Sfn"] = 212000,
["SfnRef"] = 167000,
["Sfn_whitelist"] = 2600,
["Sfnm"] = 6000,
["Sfnp"] = 24000,
["Sfnref"] = 19000,
["Sfrac"] = 5200,
["Sfrac/styles.css"] = 5200,
["SharedIPEDU"] = 3300,
["Shared_IP"] = 10000,
["Shared_IP_corp"] = 4100,
["Shared_IP_edu"] = 186000,
["Shared_IP_gov"] = 2300,
["Sharedip"] = 3000,
["Sharedipedu"] = 3800,
["Sherdog"] = 2700,
["Ship"] = 42000,
["Ship_index"] = 7600,
["Shipboxflag"] = 22000,
["Shipboxflag/core"] = 22000,
["Shipwrecks_navbox_footer"] = 11000,
["Shipwrecks_navbox_footer/link"] = 11000,
["Short_description"] = 7000000,
["Short_description/lowercasecheck"] = 7000000,
["Shortcut"] = 22000,
["Should_be_SVG"] = 7900,
["Shy"] = 2300,
["Sic"] = 39000,
["Side_box"] = 1250000,
["Sidebar"] = 322000,
["Sidebar_games_events"] = 43000,
["Sidebar_person"] = 4900,
["Sidebar_person/styles.css"] = 6300,
["Sidebar_with_collapsible_lists"] = 83000,
["Sigfig"] = 4000,
["Significant_figures"] = 5600,
["Significant_figures/rnd"] = 5300,
["Signpost-subscription"] = 2100,
["Signpost-subscription/styles.css"] = 2100,
["Signpost/item"] = 50000,
["Signpost/item/core"] = 50000,
["Signpost/snippet-nopic"] = 3400,
["Signpost/snippet/styles.css"] = 3700,
["Sildb_prim"] = 2200,
["Silver02"] = 18000,
["Silver2"] = 46000,
["Silver_medal"] = 6800,
["Silver_medal_icon"] = 60000,
["Similar_names"] = 3400,
["Single+double"] = 11000,
["Single+space"] = 17000,
["Single-innings_cricket_match"] = 4100,
["Single_chart"] = 43000,
["Single_namespace"] = 340000,
["Single_source"] = 3000,
["Singlechart"] = 12000,
["Singles"] = 50000,
["Sister-inline"] = 225000,
["Sister-inline/styles.css"] = 225000,
["Sister_project"] = 1130000,
["Sister_project/styles.css"] = 1130000,
["Sister_project_links"] = 14000,
["Skip_to_talk"] = 12000,
["Skip_to_talk/styles.css"] = 12000,
["Sky"] = 3300,
["Sky/styles.css"] = 3300,
["Slink"] = 64000,
["Slovak_municipality"] = 3000,
["Slovak_municipality/geo"] = 2800,
["Small"] = 652000,
["Small_Solar_System_bodies"] = 3600,
["Smallcaps"] = 21000,
["Smallcaps/styles.css"] = 23000,
["Smalldiv"] = 47000,
["Smaller"] = 79000,
["Smiley"] = 54000,
["Snd"] = 619000,
["Snds"] = 6500,
["Soccer_icon"] = 124000,
["Soccer_icon2"] = 124000,
["Soccer_icon4"] = 3500,
["Soccerbase"] = 13000,
["Soccerbase_season"] = 8100,
["Soccerway"] = 84000,
["Sock"] = 56000,
["Sock_list"] = 11000,
["Sockcat"] = 2000,
["Sockmaster"] = 10000,
["Sockpuppet"] = 288000,
["Sockpuppet/altmaster"] = 3700,
["Sockpuppet/categorise"] = 288000,
["SockpuppetCheckuser"] = 5500,
["Sockpuppet_category"] = 52000,
["Sockpuppet_category/confirmed"] = 28000,
["Sockpuppet_category/suspected"] = 24000,
["Sockpuppetcheckuser"] = 3600,
["Sockpuppeteer"] = 29000,
["Soft_hyphen"] = 2300,
["Soft_redirect"] = 6100,
["Soft_redirect_protection"] = 9800,
["Softredirect"] = 3200,
["Solar_luminosity"] = 5200,
["Solar_mass"] = 6600,
["Solar_radius"] = 5300,
["Soldier_icon"] = 3900,
["Soldier_icon2"] = 3900,
["Songs_category"] = 9600,
["Songs_category/core"] = 9600,
["Sort"] = 123000,
["Sort_under"] = 2200,
["Sort_under/styles.css"] = 2200,
["Sortname"] = 65000,
["Source-attribution"] = 9400,
["Source_assess"] = 2700,
["Source_assess_table"] = 2700,
["Source_attribution"] = 40000,
["Source_check"] = 927000,
["Sourcecheck"] = 927000,
["Sources"] = 3500,
["Sources_exist"] = 4400,
["South_America_topic"] = 2700,
["Sp"] = 166000,
["Space"] = 124000,
["Space+apostrophe+s"] = 27000,
["Space+double"] = 7300,
["Space+single"] = 15000,
["Spaced_en_dash"] = 653000,
["Spaced_en_dash_space"] = 6600,
["Spaced_ndash"] = 22000,
["Spaces"] = 736000,
["Spain_metadata_Wikidata"] = 7400,
["Spamlink"] = 14000,
["Species_Latin_name_abbreviation_disambiguation"] = 2400,
["Species_list"] = 25000,
["Speciesbox"] = 396000,
["Speciesbox/checkgenus"] = 394000,
["Speciesbox/getGenus"] = 397000,
["Speciesbox/getSpecies"] = 396000,
["Speciesbox/name"] = 396000,
["Speciesbox/parameterCheck"] = 396000,
["Speciesbox/trim"] = 396000,
["Specieslist"] = 9300,
["Split_article"] = 4200,
["Spnd"] = 4800,
["Spoken_Wikipedia"] = 2200,
["Sport_icon"] = 16000,
["Sport_icon2"] = 17000,
["SportsYearCatUSstate"] = 6700,
["Sports_club_or_team_people_category_header"] = 14000,
["Sports_club_or_team_people_category_header/category1"] = 14000,
["Sports_club_or_team_people_category_header/club_name"] = 14000,
["Sports_links"] = 82000,
["Sports_reference"] = 5000,
["Squad_maintenance"] = 3900,
["Sro"] = 2000,
["Sronly"] = 49000,
["Srt"] = 7300,
["Stack"] = 30000,
["Stack/styles.css"] = 42000,
["Stack_begin"] = 12000,
["Stack_end"] = 12000,
["StaleIP"] = 3600,
["StandardEbooks"] = 2500,
["Standings_table_end"] = 64000,
["Standings_table_entry"] = 25000,
["Standings_table_entry/record"] = 64000,
["Standings_table_start"] = 64000,
["Standings_table_start/colheader"] = 64000,
["Standings_table_start/colspan"] = 64000,
["Standings_table_start/styles.css"] = 64000,
["Starbox_astrometry"] = 5700,
["Starbox_begin"] = 5900,
["Starbox_catalog"] = 5700,
["Starbox_character"] = 5700,
["Starbox_detail"] = 5600,
["Starbox_end"] = 5800,
["Starbox_image"] = 4100,
["Starbox_observe"] = 5800,
["Starbox_reference"] = 5800,
["Start-Class"] = 18000,
["Start-date"] = 2200,
["Start_and_end_dates"] = 3800,
["Start_box"] = 5400,
["Start_date"] = 552000,
["Start_date_and_age"] = 190000,
["Start_date_and_years_ago"] = 4000,
["Start_date_text"] = 3900,
["Start_of_course_timeline"] = 5800,
["Start_of_course_week"] = 6000,
["Start_tab"] = 6700,
["Startflatlist"] = 164000,
["Startplainlist"] = 2300,
["Static_IP"] = 5000,
["Static_row_numbers"] = 2900,
["Static_row_numbers/styles.css"] = 2900,
["Station"] = 22000,
["Station_link"] = 19000,
["Stdinchicite"] = 10000,
["Steady"] = 19000,
["Sticky_header"] = 10000,
["Sticky_header/styles.css"] = 27000,
["Stl"] = 17000,
["Stn"] = 11000,
["Stn_art_lnk"] = 2200,
["Stnlnk"] = 35000,
["Stop"] = 2000,
["Store_norske_leksikon"] = 2400,
["Storm_colour"] = 5800,
["Storm_name"] = 2400,
["Storm_path"] = 2200,
["Stortingetbio"] = 2100,
["StoryTeleplay"] = 3200,
["Str_count"] = 167000,
["Str_endswith"] = 238000,
["Str_find"] = 284000,
["Str_index"] = 15000,
["Str_left"] = 316000,
["Str_len"] = 169000,
["Str_letter"] = 185000,
["Str_letter/trim"] = 24000,
["Str_number"] = 7400,
["Str_number/trim"] = 227000,
["Str_rep"] = 300000,
["Str_right"] = 7200,
["Str_rightc"] = 4200,
["Str_startswith"] = 2900,
["Str_trim"] = 4200,
["Str_≠_len"] = 49000,
["Str_≤_len"] = 2900,
["Str_≥_len"] = 106000,
["Strfind_short"] = 5400,
["Strike"] = 2300,
["Strikethrough"] = 21000,
["String_split"] = 5600,
["Strip_tags"] = 41000,
["Strong"] = 214000,
["Structurae"] = 2100,
["Stub-Class"] = 18000,
["Stub_Category"] = 14000,
["Stub_category"] = 21000,
["Stub_documentation"] = 42000,
["Student_editor"] = 27000,
["Student_sandbox"] = 4000,
["Student_table_row"] = 7300,
["Students_table"] = 7300,
["Su"] = 4800,
["Su-census1989"] = 4600,
["Sub"] = 4600,
["Subinfobox_bodystyle"] = 75000,
["Subject_bar"] = 21000,
["Suboff"] = 7500,
["Subon"] = 7600,
["Subpage_other"] = 416000,
["Subscription"] = 2200,
["Subscription_required"] = 36000,
["Subsidebar_bodystyle"] = 6400,
["Subst_only"] = 5500,
["Substituted_comment"] = 19000,
["Succession_box"] = 119000,
["Succession_box/check"] = 119000,
["Succession_links"] = 219000,
["Summer_Olympics_by_year_category_navigation"] = 2600,
["Summer_Olympics_by_year_category_navigation/core"] = 2600,
["Sunday"] = 2800,
["Sup"] = 95000,
["Suppress_categories"] = 6600,
["Surname"] = 81000,
["Swiss_metadata_Wikidata"] = 3000,
["Swiss_populations"] = 2400,
["Swiss_populations_NC"] = 3200,
["Swiss_populations_YM"] = 2300,
["Swiss_populations_ref"] = 2400,
["Switcher"] = 8600,
["Sz"] = 2500,
["Module:SDcat"] = 6850000,
["Module:SPI_archive_notice"] = 39000,
["Module:SST"] = 13000,
["Module:SST/hosts"] = 13000,
["Module:SST/registry"] = 277000,
["Module:SST/shards/sets/COLLEDGE_SHIPS_RN"] = 3000,
["Module:SST/shards/sets/TALBERT_BARRINGTON_ATLAS"] = 2100,
["Module:Science_redirect"] = 323000,
["Module:Science_redirect/conf"] = 323000,
["Module:Section_link"] = 167000,
["Module:Section_sizes"] = 6000,
["Module:See_also_if_exists"] = 96000,
["Module:Self"] = 45000,
["Module:Self/license_migration_data.json"] = 23000,
["Module:Self/styles.css"] = 45000,
["Module:Separated_entries"] = 2820000,
["Module:Series_overview"] = 10000,
["Module:Settlement_Wikidata"] = 52000,
["Module:Settlement_short_description"] = 730000,
["Module:Shortcut"] = 29000,
["Module:Shortcut/config"] = 29000,
["Module:Shortcut/styles.css"] = 29000,
["Module:Side_box"] = 1290000,
["Module:Side_box/styles.css"] = 1290000,
["Module:Sidebar"] = 438000,
["Module:Sidebar/configuration"] = 438000,
["Module:Sidebar/styles.css"] = 444000,
["Module:Sidebar_games_events"] = 43000,
["Module:Sidebar_games_events/styles.css"] = 43000,
["Module:Singles"] = 50000,
["Module:Sister_project_links"] = 22000,
["Module:Sister_project_links/bar/styles.css"] = 7400,
["Module:Sister_project_links/config"] = 22000,
["Module:Sister_project_links/styles.css"] = 14000,
["Module:Sister_project_logo"] = 1370000,
["Module:Sister_project_logo/data"] = 1370000,
["Module:Slovak_municipality"] = 3000,
["Module:Sock_list"] = 11000,
["Module:Sort"] = 157000,
["Module:Sort_title"] = 41000,
["Module:Sortkey"] = 106000,
["Module:Split_article"] = 4200,
["Module:Spoken_Wikipedia"] = 2200,
["Module:Spoken_Wikipedia/configuration"] = 2200,
["Module:Spoken_Wikipedia/styles.css"] = 2200,
["Module:Sports_career"] = 21000,
["Module:Sports_color"] = 79000,
["Module:Sports_color/baseball"] = 36000,
["Module:Sports_color/basketball"] = 19000,
["Module:Sports_color/ice_hockey"] = 3400,
["Module:Sports_color/international_football"] = 43000,
["Module:Sports_rbr_table"] = 15000,
["Module:Sports_rbr_table/styles.css"] = 15000,
["Module:Sports_reference"] = 5000,
["Module:Sports_results"] = 19000,
["Module:Sports_results/styles.css"] = 12000,
["Module:Sports_table"] = 74000,
["Module:Sports_table/Volleyball"] = 2500,
["Module:Sports_table/WDL"] = 64000,
["Module:Sports_table/WDL_OT"] = 4100,
["Module:Sports_table/WL"] = 5600,
["Module:Sports_table/WL_OT"] = 3100,
["Module:Sports_table/argcheck"] = 74000,
["Module:Sports_table/auto"] = 66000,
["Module:Sports_table/styles.css"] = 74000,
["Module:Sports_table/sub"] = 75000,
["Module:Sports_table/totalscheck"] = 53000,
["Module:Stock_tickers/NYSE"] = 2000,
["Module:Storm_categories"] = 5900,
["Module:Storm_categories/categories"] = 5900,
["Module:Storm_categories/colors"] = 5900,
["Module:Storm_categories/icons"] = 5900,
["Module:Str_rightc"] = 4200,
["Module:String"] = 14200000,
["Module:String2"] = 2100000,
["Module:Su"] = 14000,
["Module:Subject_bar"] = 21000,
["Module:Suppress_categories"] = 6600,
["Module:Switcher"] = 8600,
}
iiyqj34xlgfjmdhkb2oyufejcdw0rsn
33052
33051
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/S]]
33051
Scribunto
text/plain
return {
["S"] = 4400,
["S-aca"] = 6700,
["S-ach"] = 17000,
["S-aft"] = 231000,
["S-aft/check"] = 231000,
["S-aft/filter"] = 231000,
["S-bef"] = 235000,
["S-bef/check"] = 235000,
["S-bef/filter"] = 235000,
["S-break"] = 6600,
["S-bus"] = 2100,
["S-civ"] = 2900,
["S-dip"] = 6000,
["S-end"] = 262000,
["S-gov"] = 8500,
["S-hon"] = 4000,
["S-hou"] = 9800,
["S-inc"] = 13000,
["S-legal"] = 9900,
["S-line_label"] = 2000,
["S-mil"] = 13000,
["S-new"] = 17000,
["S-non"] = 11000,
["S-npo"] = 4200,
["S-off"] = 43000,
["S-par"] = 52000,
["S-par/en"] = 3300,
["S-par/gb"] = 3300,
["S-par/uk"] = 12000,
["S-par/us-hs"] = 12000,
["S-par/us-sen"] = 2100,
["S-ppo"] = 15000,
["S-prec"] = 3200,
["S-reg"] = 22000,
["S-rel"] = 19000,
["S-roy"] = 2800,
["S-sports"] = 12000,
["S-start"] = 254000,
["S-ttl"] = 243000,
["S-ttl/check"] = 243000,
["S-vac"] = 7800,
["SAU"] = 2100,
["SCO"] = 3800,
["SDcat"] = 6850000,
["SECOND"] = 2300,
["SGP"] = 2900,
["SIA"] = 2500,
["SLL"] = 2000,
["SLO"] = 4900,
["SMS"] = 6900,
["SMU"] = 2500,
["SPI_archive_notice"] = 85000,
["SPIarchive_notice"] = 82000,
["SPIcat"] = 3800,
["SPIclose"] = 3300,
["SPIpriorcases"] = 78000,
["SR/Olympics_profile"] = 2200,
["SRB"] = 4400,
["SS"] = 22000,
["SSPa"] = 2600,
["STN"] = 11000,
["SUBJECTSPACE_formatted"] = 45000,
["SUI"] = 9700,
["SVG"] = 2600,
["SVG-Logo"] = 26000,
["SVG-Res"] = 24000,
["SVG-logo"] = 14000,
["SVK"] = 8800,
["SVN"] = 5900,
["SWE"] = 14000,
["Salts_by_element"] = 2300,
["Sandbox_other"] = 481000,
["Saturday"] = 2800,
["Saved_book"] = 52000,
["Sc"] = 2900,
["Scholia"] = 3700,
["School_block"] = 13000,
["School_disambiguation"] = 3500,
["Schoolblock"] = 6900,
["Schooldis"] = 2700,
["Schoolip"] = 12000,
["Scientist_icon"] = 16000,
["Scientist_icon2"] = 16000,
["Sclass"] = 34000,
["Sclass2"] = 11000,
["Screen_reader-only"] = 109000,
["Screen_reader-only/styles.css"] = 150000,
["Script"] = 7600,
["Script/Arabic"] = 4100,
["Script/Hebrew"] = 4900,
["Script/Nastaliq"] = 15000,
["Script/doc/id-unk"] = 3200,
["Script/doc/id-unk/core"] = 3300,
["Script/doc/id-unk/is-iso-alpha4"] = 3200,
["Script/doc/id-unk/name-to-alpha4"] = 3300,
["Script/styles.css"] = 3400,
["Script/styles_arabic.css"] = 4100,
["Script/styles_hebrew.css"] = 4900,
["Sdash"] = 4100,
["Search_box"] = 74000,
["Search_link"] = 28000,
["Section_link"] = 167000,
["Section_sizes"] = 4400,
["See"] = 8900,
["See_also"] = 220000,
["Seealso"] = 8200,
["Seiner_Majestät_Schiff"] = 6900,
["Seiner_Majestät_Unterseeboot"] = 2500,
["Select_skin"] = 5500,
["Selected"] = 2000,
["Selected_article"] = 2500,
["Selected_picture"] = 2400,
["Self"] = 45000,
["Self-published_inline"] = 4800,
["Self-published_source"] = 6100,
["Self-reference"] = 2200,
["Self-reference_tool"] = 8300,
["Semi-protected_indefinitely"] = 4800,
["Sent_off"] = 17000,
["Sentoff"] = 6400,
["Separated_entries"] = 2900,
["Sequence"] = 4200,
["Series_overview"] = 10000,
["Serif"] = 5000,
["Set_category"] = 38000,
["Set_index_article"] = 6400,
["Sets_taxobox_colour"] = 3200,
["Sfn"] = 212000,
["SfnRef"] = 167000,
["Sfn_whitelist"] = 2600,
["Sfnm"] = 6000,
["Sfnp"] = 24000,
["Sfnref"] = 19000,
["Sfrac"] = 5200,
["Sfrac/styles.css"] = 5200,
["SharedIPEDU"] = 3300,
["Shared_IP"] = 10000,
["Shared_IP_corp"] = 4100,
["Shared_IP_edu"] = 186000,
["Shared_IP_gov"] = 2300,
["Sharedip"] = 3000,
["Sharedipedu"] = 3800,
["Sherdog"] = 2700,
["Ship"] = 42000,
["Ship_index"] = 7600,
["Shipboxflag"] = 22000,
["Shipboxflag/core"] = 22000,
["Shipwrecks_navbox_footer"] = 11000,
["Shipwrecks_navbox_footer/link"] = 11000,
["Short_description"] = 7000000,
["Short_description/lowercasecheck"] = 7000000,
["Shortcut"] = 22000,
["Should_be_SVG"] = 7900,
["Shy"] = 2300,
["Sic"] = 39000,
["Side_box"] = 1250000,
["Sidebar"] = 322000,
["Sidebar_games_events"] = 43000,
["Sidebar_person"] = 4900,
["Sidebar_person/styles.css"] = 6300,
["Sidebar_with_collapsible_lists"] = 83000,
["Sigfig"] = 4000,
["Significant_figures"] = 5600,
["Significant_figures/rnd"] = 5300,
["Signpost-subscription"] = 2100,
["Signpost-subscription/styles.css"] = 2100,
["Signpost/item"] = 50000,
["Signpost/item/core"] = 50000,
["Signpost/snippet-nopic"] = 3400,
["Signpost/snippet/styles.css"] = 3700,
["Sildb_prim"] = 2200,
["Silver02"] = 18000,
["Silver2"] = 46000,
["Silver_medal"] = 6800,
["Silver_medal_icon"] = 60000,
["Similar_names"] = 3400,
["Single+double"] = 11000,
["Single+space"] = 17000,
["Single-innings_cricket_match"] = 4100,
["Single_chart"] = 43000,
["Single_namespace"] = 340000,
["Single_source"] = 3000,
["Singlechart"] = 12000,
["Singles"] = 50000,
["Sister-inline"] = 225000,
["Sister-inline/styles.css"] = 225000,
["Sister_project"] = 1130000,
["Sister_project/styles.css"] = 1130000,
["Sister_project_links"] = 14000,
["Skip_to_talk"] = 12000,
["Skip_to_talk/styles.css"] = 12000,
["Sky"] = 3300,
["Sky/styles.css"] = 3300,
["Slink"] = 64000,
["Slovak_municipality"] = 3000,
["Slovak_municipality/geo"] = 2800,
["Small"] = 652000,
["Small_Solar_System_bodies"] = 3600,
["Smallcaps"] = 21000,
["Smallcaps/styles.css"] = 23000,
["Smalldiv"] = 47000,
["Smaller"] = 79000,
["Smiley"] = 54000,
["Snd"] = 619000,
["Snds"] = 6500,
["Soccer_icon"] = 124000,
["Soccer_icon2"] = 124000,
["Soccer_icon4"] = 3500,
["Soccerbase"] = 13000,
["Soccerbase_season"] = 8100,
["Soccerway"] = 84000,
["Sock"] = 56000,
["Sock_list"] = 11000,
["Sockcat"] = 2000,
["Sockmaster"] = 10000,
["Sockpuppet"] = 288000,
["Sockpuppet/altmaster"] = 3700,
["Sockpuppet/categorise"] = 288000,
["SockpuppetCheckuser"] = 5500,
["Sockpuppet_category"] = 52000,
["Sockpuppet_category/confirmed"] = 28000,
["Sockpuppet_category/suspected"] = 24000,
["Sockpuppetcheckuser"] = 3600,
["Sockpuppeteer"] = 29000,
["Soft_hyphen"] = 2300,
["Soft_redirect"] = 6100,
["Soft_redirect_protection"] = 9800,
["Softredirect"] = 3200,
["Solar_luminosity"] = 5200,
["Solar_mass"] = 6600,
["Solar_radius"] = 5300,
["Soldier_icon"] = 3900,
["Soldier_icon2"] = 3900,
["Songs_category"] = 9600,
["Songs_category/core"] = 9600,
["Sort"] = 123000,
["Sort_under"] = 2200,
["Sort_under/styles.css"] = 2200,
["Sortname"] = 65000,
["Source-attribution"] = 9400,
["Source_assess"] = 2700,
["Source_assess_table"] = 2700,
["Source_attribution"] = 40000,
["Source_check"] = 927000,
["Sourcecheck"] = 927000,
["Sources"] = 3500,
["Sources_exist"] = 4400,
["South_America_topic"] = 2700,
["Sp"] = 166000,
["Space"] = 124000,
["Space+apostrophe+s"] = 27000,
["Space+double"] = 7300,
["Space+single"] = 15000,
["Spaced_en_dash"] = 653000,
["Spaced_en_dash_space"] = 6600,
["Spaced_ndash"] = 22000,
["Spaces"] = 736000,
["Spain_metadata_Wikidata"] = 7400,
["Spamlink"] = 14000,
["Species_Latin_name_abbreviation_disambiguation"] = 2400,
["Species_list"] = 25000,
["Speciesbox"] = 396000,
["Speciesbox/checkgenus"] = 394000,
["Speciesbox/getGenus"] = 397000,
["Speciesbox/getSpecies"] = 396000,
["Speciesbox/name"] = 396000,
["Speciesbox/parameterCheck"] = 396000,
["Speciesbox/trim"] = 396000,
["Specieslist"] = 9300,
["Split_article"] = 4200,
["Spnd"] = 4800,
["Spoken_Wikipedia"] = 2200,
["Sport_icon"] = 16000,
["Sport_icon2"] = 17000,
["SportsYearCatUSstate"] = 6700,
["Sports_club_or_team_people_category_header"] = 14000,
["Sports_club_or_team_people_category_header/category1"] = 14000,
["Sports_club_or_team_people_category_header/club_name"] = 14000,
["Sports_links"] = 82000,
["Sports_reference"] = 5000,
["Squad_maintenance"] = 3900,
["Sro"] = 2000,
["Sronly"] = 49000,
["Srt"] = 7300,
["Stack"] = 30000,
["Stack/styles.css"] = 42000,
["Stack_begin"] = 12000,
["Stack_end"] = 12000,
["StaleIP"] = 3600,
["StandardEbooks"] = 2500,
["Standings_table_end"] = 64000,
["Standings_table_entry"] = 25000,
["Standings_table_entry/record"] = 64000,
["Standings_table_start"] = 64000,
["Standings_table_start/colheader"] = 64000,
["Standings_table_start/colspan"] = 64000,
["Standings_table_start/styles.css"] = 64000,
["Starbox_astrometry"] = 5700,
["Starbox_begin"] = 5900,
["Starbox_catalog"] = 5700,
["Starbox_character"] = 5700,
["Starbox_detail"] = 5600,
["Starbox_end"] = 5800,
["Starbox_image"] = 4100,
["Starbox_observe"] = 5800,
["Starbox_reference"] = 5800,
["Start-Class"] = 18000,
["Start-date"] = 2200,
["Start_and_end_dates"] = 3800,
["Start_box"] = 5400,
["Start_date"] = 552000,
["Start_date_and_age"] = 190000,
["Start_date_and_years_ago"] = 4000,
["Start_date_text"] = 3900,
["Start_of_course_timeline"] = 5800,
["Start_of_course_week"] = 6000,
["Start_tab"] = 6700,
["Startflatlist"] = 164000,
["Startplainlist"] = 2300,
["Static_IP"] = 5000,
["Static_row_numbers"] = 2900,
["Static_row_numbers/styles.css"] = 2900,
["Station"] = 22000,
["Station_link"] = 19000,
["Stdinchicite"] = 10000,
["Steady"] = 19000,
["Sticky_header"] = 10000,
["Sticky_header/styles.css"] = 27000,
["Stl"] = 17000,
["Stn"] = 11000,
["Stn_art_lnk"] = 2200,
["Stnlnk"] = 35000,
["Stop"] = 2000,
["Store_norske_leksikon"] = 2400,
["Storm_colour"] = 5800,
["Storm_name"] = 2400,
["Storm_path"] = 2200,
["Stortingetbio"] = 2100,
["StoryTeleplay"] = 3200,
["Str_count"] = 167000,
["Str_endswith"] = 238000,
["Str_find"] = 284000,
["Str_index"] = 15000,
["Str_left"] = 316000,
["Str_len"] = 169000,
["Str_letter"] = 185000,
["Str_letter/trim"] = 24000,
["Str_number"] = 7400,
["Str_number/trim"] = 227000,
["Str_rep"] = 300000,
["Str_right"] = 7200,
["Str_rightc"] = 4200,
["Str_startswith"] = 2900,
["Str_trim"] = 4200,
["Str_≠_len"] = 49000,
["Str_≤_len"] = 2900,
["Str_≥_len"] = 106000,
["Strfind_short"] = 5400,
["Strike"] = 2300,
["Strikethrough"] = 21000,
["String_split"] = 5600,
["Strip_tags"] = 41000,
["Strong"] = 214000,
["Structurae"] = 2100,
["Stub-Class"] = 18000,
["Stub_Category"] = 14000,
["Stub_category"] = 21000,
["Stub_documentation"] = 42000,
["Student_editor"] = 27000,
["Student_sandbox"] = 4000,
["Student_table_row"] = 7300,
["Students_table"] = 7300,
["Su"] = 4800,
["Su-census1989"] = 4600,
["Sub"] = 4600,
["Subinfobox_bodystyle"] = 75000,
["Subject_bar"] = 21000,
["Suboff"] = 7500,
["Subon"] = 7600,
["Subpage_other"] = 416000,
["Subscription"] = 2200,
["Subscription_required"] = 36000,
["Subsidebar_bodystyle"] = 6400,
["Subst_only"] = 5500,
["Substituted_comment"] = 19000,
["Succession_box"] = 119000,
["Succession_box/check"] = 119000,
["Succession_links"] = 219000,
["Summer_Olympics_by_year_category_navigation"] = 2600,
["Summer_Olympics_by_year_category_navigation/core"] = 2600,
["Sunday"] = 2800,
["Sup"] = 95000,
["Suppress_categories"] = 6600,
["Surname"] = 81000,
["Swiss_metadata_Wikidata"] = 3000,
["Swiss_populations"] = 2400,
["Swiss_populations_NC"] = 3200,
["Swiss_populations_YM"] = 2300,
["Swiss_populations_ref"] = 2400,
["Switcher"] = 8600,
["Sz"] = 2500,
["Module:SDcat"] = 6850000,
["Module:SPI_archive_notice"] = 39000,
["Module:SST"] = 13000,
["Module:SST/hosts"] = 13000,
["Module:SST/registry"] = 277000,
["Module:SST/shards/sets/COLLEDGE_SHIPS_RN"] = 3000,
["Module:SST/shards/sets/TALBERT_BARRINGTON_ATLAS"] = 2100,
["Module:Science_redirect"] = 323000,
["Module:Science_redirect/conf"] = 323000,
["Module:Section_link"] = 167000,
["Module:Section_sizes"] = 6000,
["Module:See_also_if_exists"] = 96000,
["Module:Self"] = 45000,
["Module:Self/license_migration_data.json"] = 23000,
["Module:Self/styles.css"] = 45000,
["Module:Separated_entries"] = 2820000,
["Module:Series_overview"] = 10000,
["Module:Settlement_Wikidata"] = 52000,
["Module:Settlement_short_description"] = 730000,
["Module:Shortcut"] = 29000,
["Module:Shortcut/config"] = 29000,
["Module:Shortcut/styles.css"] = 29000,
["Module:Side_box"] = 1290000,
["Module:Side_box/styles.css"] = 1290000,
["Module:Sidebar"] = 438000,
["Module:Sidebar/configuration"] = 438000,
["Module:Sidebar/styles.css"] = 444000,
["Module:Sidebar_games_events"] = 43000,
["Module:Sidebar_games_events/styles.css"] = 43000,
["Module:Singles"] = 50000,
["Module:Sister_project_links"] = 22000,
["Module:Sister_project_links/bar/styles.css"] = 7400,
["Module:Sister_project_links/config"] = 22000,
["Module:Sister_project_links/styles.css"] = 14000,
["Module:Sister_project_logo"] = 1370000,
["Module:Sister_project_logo/data"] = 1370000,
["Module:Slovak_municipality"] = 3000,
["Module:Sock_list"] = 11000,
["Module:Sort"] = 157000,
["Module:Sort_title"] = 41000,
["Module:Sortkey"] = 106000,
["Module:Split_article"] = 4200,
["Module:Spoken_Wikipedia"] = 2200,
["Module:Spoken_Wikipedia/configuration"] = 2200,
["Module:Spoken_Wikipedia/styles.css"] = 2200,
["Module:Sports_career"] = 21000,
["Module:Sports_color"] = 79000,
["Module:Sports_color/baseball"] = 36000,
["Module:Sports_color/basketball"] = 19000,
["Module:Sports_color/ice_hockey"] = 3400,
["Module:Sports_color/international_football"] = 43000,
["Module:Sports_rbr_table"] = 15000,
["Module:Sports_rbr_table/styles.css"] = 15000,
["Module:Sports_reference"] = 5000,
["Module:Sports_results"] = 19000,
["Module:Sports_results/styles.css"] = 12000,
["Module:Sports_table"] = 74000,
["Module:Sports_table/Volleyball"] = 2500,
["Module:Sports_table/WDL"] = 64000,
["Module:Sports_table/WDL_OT"] = 4100,
["Module:Sports_table/WL"] = 5600,
["Module:Sports_table/WL_OT"] = 3100,
["Module:Sports_table/argcheck"] = 74000,
["Module:Sports_table/auto"] = 66000,
["Module:Sports_table/styles.css"] = 74000,
["Module:Sports_table/sub"] = 75000,
["Module:Sports_table/totalscheck"] = 53000,
["Module:Stock_tickers/NYSE"] = 2000,
["Module:Storm_categories"] = 5900,
["Module:Storm_categories/categories"] = 5900,
["Module:Storm_categories/colors"] = 5900,
["Module:Storm_categories/icons"] = 5900,
["Module:Str_rightc"] = 4200,
["Module:String"] = 14200000,
["Module:String2"] = 2100000,
["Module:Su"] = 14000,
["Module:Subject_bar"] = 21000,
["Module:Suppress_categories"] = 6600,
["Module:Switcher"] = 8600,
}
iiyqj34xlgfjmdhkb2oyufejcdw0rsn
Tempilet:Redirect category shell
10
1089
33114
9172
2026-10-24T19:12:16Z
en>AntiCompositeNumber
0
Add auto-sensing for pending changes per [[Template_talk:Redirect_category_shell#c-OrderlyOhioan-20261022123900-Template-protected_edit_request_on_22_October_2026|edit request]] by [[User:OrderlyOhioan]]
33114
wikitext
text/x-wiki
__NONEWSECTIONLINK__{{Mbox
| name = Redirect category shell
| type = move
| image = none
| style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em;
| textstyle = padding-top: 0.9em; padding-bottom: 0.9em;
| text = '''This {{Talk other|talk page|page}} is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''{{#if:{{{h|}}}
|{{block indent|1= ''{{{h}}}''}}
}}
<!--
Automatically detect protected redirects:
--><includeonly>{{#switch: {{PROTECTIONLEVEL:move}}
|sysop|templateeditor|extendedconfirmed={{pp-move|small=yes|catonly=no}}
}}{{#switch: {{PROTECTIONLEVEL:edit}}
|sysop
|templateeditor
|extendedconfirmed
|autoconfirmed={{pp-protected|small=yes}}{{R protected}}
| <!--Not protected, or only semi-move-protected-->
}}{{#switch: {{PENDINGCHANGELEVEL}}
|autoconfirmed={{pp-pc|small=yes}}
| <!--Not pending changes protected-->
}}</includeonly>{{#if: {{{1|}}}||<includeonly>
* <strong style="color:var(--color-error, red);">Important – Please Read! <span style="color:var(--color-option-maroon, maroon)">This template should {{em|not}} be applied without parameters by bot nor by any automated or semi-automated process. It should {{em|not}} be used without parameters {{em|unless you want to learn how to categorize redirects}}. For editors who want to learn how to categorize redirects, this template is a {{em|learning tool}}. {{em|Only}} those editors who intend to return to the redirect to learn which rcats to use should apply this template without parameters, or with an empty first parameter!</span></strong></includeonly>
* '''Manifold sort''': If help is needed to determine appropriate categories, then this redirect populates '''{{Cat|Miscellaneous redirects}}'''. Monitors of that category will check this redirect and add or remove [[Wikipedia:Categorizing redirects|rcats]] as needed.{{#ifeq: {{lc:{{{nocat|false}}}}} | false |{{{category|<includeonly>[[Category:Miscellaneous redirects]]</includeonly>}}}}}
}}
{{#if: {{{2|}}}|{{{2}}}|{{{1|}}}}}{{#if: {{{1|}}}{{{2|}}}||{{#ifeq: {{ROOTPAGENAME}}|Redirect category shell||[[Category:Redirect category shell without parameters]]}}}}
''<small>When appropriate, [[Wikipedia:Protection policy|protection levels]] are automatically sensed, described and categorized.</small>''
}}<includeonly>__EXPECTSHORTPAGE__<!--To prevent pages from appearing on Special:ShortPages. See Tech News 2026-34. --></includeonly><noinclude>
{{Documentation}}
</noinclude>
phgmoz4x58srr1tzh9pvb7ch656j4uo
33115
33114
2026-11-11T21:29:19Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Redirect_category_shell]]
33114
wikitext
text/x-wiki
__NONEWSECTIONLINK__{{Mbox
| name = Redirect category shell
| type = move
| image = none
| style = margin-top: 1.1em; border: solid 1px darkblue; border-left-width: 0.5em;
| textstyle = padding-top: 0.9em; padding-bottom: 0.9em;
| text = '''This {{Talk other|talk page|page}} is a [[Wikipedia:Redirect|redirect]]. <small>The following [[Wikipedia:Categorizing redirects|categories]] are used to track and monitor this redirect:</small>'''{{#if:{{{h|}}}
|{{block indent|1= ''{{{h}}}''}}
}}
<!--
Automatically detect protected redirects:
--><includeonly>{{#switch: {{PROTECTIONLEVEL:move}}
|sysop|templateeditor|extendedconfirmed={{pp-move|small=yes|catonly=no}}
}}{{#switch: {{PROTECTIONLEVEL:edit}}
|sysop
|templateeditor
|extendedconfirmed
|autoconfirmed={{pp-protected|small=yes}}{{R protected}}
| <!--Not protected, or only semi-move-protected-->
}}{{#switch: {{PENDINGCHANGELEVEL}}
|autoconfirmed={{pp-pc|small=yes}}
| <!--Not pending changes protected-->
}}</includeonly>{{#if: {{{1|}}}||<includeonly>
* <strong style="color:var(--color-error, red);">Important – Please Read! <span style="color:var(--color-option-maroon, maroon)">This template should {{em|not}} be applied without parameters by bot nor by any automated or semi-automated process. It should {{em|not}} be used without parameters {{em|unless you want to learn how to categorize redirects}}. For editors who want to learn how to categorize redirects, this template is a {{em|learning tool}}. {{em|Only}} those editors who intend to return to the redirect to learn which rcats to use should apply this template without parameters, or with an empty first parameter!</span></strong></includeonly>
* '''Manifold sort''': If help is needed to determine appropriate categories, then this redirect populates '''{{Cat|Miscellaneous redirects}}'''. Monitors of that category will check this redirect and add or remove [[Wikipedia:Categorizing redirects|rcats]] as needed.{{#ifeq: {{lc:{{{nocat|false}}}}} | false |{{{category|<includeonly>[[Category:Miscellaneous redirects]]</includeonly>}}}}}
}}
{{#if: {{{2|}}}|{{{2}}}|{{{1|}}}}}{{#if: {{{1|}}}{{{2|}}}||{{#ifeq: {{ROOTPAGENAME}}|Redirect category shell||[[Category:Redirect category shell without parameters]]}}}}
''<small>When appropriate, [[Wikipedia:Protection policy|protection levels]] are automatically sensed, described and categorized.</small>''
}}<includeonly>__EXPECTSHORTPAGE__<!--To prevent pages from appearing on Special:ShortPages. See Tech News 2026-34. --></includeonly><noinclude>
{{Documentation}}
</noinclude>
phgmoz4x58srr1tzh9pvb7ch656j4uo
Tempilet:Pp-template
10
1100
33116
11858
2026-11-05T08:31:33Z
en>Xqbot
0
Bot: Fixing double redirect from [[Template:Template-protected]] to [[Template:Protected template]]
33116
wikitext
text/x-wiki
#REDIRECT [[Template:Protected template]]
{{Redirect category shell|
{{R from move}}
}}
427ceenmsmduabnoo537aln3f8wpzy6
33117
33116
2026-11-11T21:29:20Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Pp-template]]
33116
wikitext
text/x-wiki
#REDIRECT [[Template:Protected template]]
{{Redirect category shell|
{{R from move}}
}}
427ceenmsmduabnoo537aln3f8wpzy6
Tempilet:Hlist
10
1195
32821
9529
2026-09-12T17:59:44Z
en>MusikBot II
0
Protected "[[Template:Hlist]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 310424 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32821
wikitext
text/x-wiki
#REDIRECT [[Template:Horizontal list]]
j3di4tswthkvewum4j2tczpbseqofxy
32822
32821
2026-11-11T18:30:07Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hlist]]
32821
wikitext
text/x-wiki
#REDIRECT [[Template:Horizontal list]]
j3di4tswthkvewum4j2tczpbseqofxy
Tempilet:Plainlist
10
1199
32833
9431
2026-09-12T01:13:43Z
en>BD2412
0
{{R from move}}
32833
wikitext
text/x-wiki
#REDIRECT [[Template:Plain list]]
{{R from move}}
hcdzegqcdhppb6tsd4vj2h7yun6z44e
32834
32833
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Plainlist]]
32833
wikitext
text/x-wiki
#REDIRECT [[Template:Plain list]]
{{R from move}}
hcdzegqcdhppb6tsd4vj2h7yun6z44e
Module:Section link
828
1216
32979
9465
2026-10-04T15:07:46Z
en>Axolitl
0
Use standard error formatting for easy detection with {{#iferror}} and a consistent appearance
32979
Scribunto
text/plain
-- This module implements {{section link}}.
require('strict');
local checkType = require('libraryUtil').checkType
local p = {}
local function makeSectionLink(page, section, display)
display = display or section
page = page or ''
-- MediaWiki doesn't allow these in 'page', so only need to do for 'section'
if type(section) == 'string' then
section = string.gsub(section, "{", "{")
section = string.gsub(section, "}", "}")
end
return string.format('[[%s#%s|%s]]', page, section, display)
end
local function normalizeTitle(title)
title = mw.ustring.gsub(mw.ustring.gsub(title, "'", ""), '"', '')
title = mw.ustring.gsub(title, "%b<>", "")
return mw.title.new(title).prefixedText
end
function p._main(page, sections, options, title)
-- Validate input.
checkType('_main', 1, page, 'string', true)
checkType('_main', 3, options, 'table', true)
if sections == nil then
sections = {}
elseif type(sections) == 'string' then
sections = {sections}
elseif type(sections) ~= 'table' then
error(string.format(
"type error in argument #2 to '_main' " ..
"(string, table or nil expected, got %s)",
type(sections)
), 2)
end
options = options or {}
title = title or mw.title.getCurrentTitle()
-- Deal with blank page names elegantly
if page and not page:find('%S') then
page = nil
options.nopage = true
end
-- Make the link(s).
local isShowingPage = not options.nopage
if #sections <= 1 then
local linkPage = page or ''
if options.permalink then -- when oldid provided
linkPage = 'Special:Permalink/' .. options.permalink; -- make Special:Permalink/oldid wikilink
end
local section = sections[1]; -- sections[1] must have a value
local display = '§ ' .. section
if isShowingPage then
page = page or title.prefixedText
if options.display and options.display ~= '' then
if normalizeTitle(options.display) == normalizeTitle(page) then
display = options.display .. ' ' .. display
else
error(string.format(
'Display title "%s" was ignored since it is ' ..
"not equivalent to the page's actual title",
options.display
), 0)
end
else
display = page .. ' ' .. display
end
end
return makeSectionLink(linkPage, section, display)
else
-- Multiple sections. First, make a list of the links to display.
local ret = {}
for i, section in ipairs(sections) do
ret[i] = makeSectionLink(page, section)
end
-- Assemble the list of links into a string with mw.text.listToText.
-- We use the default separator for mw.text.listToText, but a custom
-- conjunction. There is also a special case conjunction if we only
-- have two links.
local conjunction
if #sections == 2 then
conjunction = '​ and '
else
conjunction = ', and '
end
ret = mw.text.listToText(ret, nil, conjunction)
-- Add the intro text.
local intro = '§§ '
if isShowingPage then
intro = (page or title.prefixedText) .. ' ' .. intro
end
ret = intro .. ret
return ret
end
end
function p.main(frame)
local yesno = require('Module:Yesno')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Section link',
valueFunc = function (key, value)
value = value:match('^%s*(.-)%s*$') -- Trim whitespace
-- Allow blank first parameters, as the wikitext template does this.
if value ~= '' or key == 1 then
return value
end
end
})
for k, v in pairs(args) do -- replace underscores in the positional parameter values
if 'number' == type(k) then
if not yesno (args['keep-underscores']) then -- unless |keep-underscores=yes
args[k] = mw.uri.decode (v, 'WIKI'); -- percent-decode; replace underscores with space characters
else
args[k] = mw.uri.decode (v, 'PATH'); -- percent-decode; retain underscores
end
end
end
-- Sort the arguments.
local page
local sections, options = {}, {}
for k, v in pairs(args) do
if k == 1 then
-- Doing this in the loop because of a bug in [[Module:Arguments]]
-- when using pairs with deleted arguments.
page = mw.text.decode(v, true)
elseif type(k) == 'number' then
sections[k] = v
else
options[k] = v
end
end
options.nopage = yesno (options.nopage); -- make boolean
-- Extract section from page, if present
if page then
local p, s = page:match('^(.-)#(.*)$')
if p then page, sections[1] = p, s end
end
-- Compress the sections array.
local function compressArray(t)
local nums, ret = {}, {}
for num in pairs(t) do
nums[#nums + 1] = num
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end
sections = compressArray(sections)
if not sections[1] then -- empty section parameter makes {{Section link}} meaningless
return ('<strong class=error><span style="font-family:monospace">{{[[Template:Section link|Section link]]}}</span>: required section parameter(s) missing</strong>'); -- emit error message and abandon
end
return p._main(page, sections, options)
end
return p
t2ivt9h77zh9i33xq70ubnt1t8lcwgp
32980
32979
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Section_link]]
32979
Scribunto
text/plain
-- This module implements {{section link}}.
require('strict');
local checkType = require('libraryUtil').checkType
local p = {}
local function makeSectionLink(page, section, display)
display = display or section
page = page or ''
-- MediaWiki doesn't allow these in 'page', so only need to do for 'section'
if type(section) == 'string' then
section = string.gsub(section, "{", "{")
section = string.gsub(section, "}", "}")
end
return string.format('[[%s#%s|%s]]', page, section, display)
end
local function normalizeTitle(title)
title = mw.ustring.gsub(mw.ustring.gsub(title, "'", ""), '"', '')
title = mw.ustring.gsub(title, "%b<>", "")
return mw.title.new(title).prefixedText
end
function p._main(page, sections, options, title)
-- Validate input.
checkType('_main', 1, page, 'string', true)
checkType('_main', 3, options, 'table', true)
if sections == nil then
sections = {}
elseif type(sections) == 'string' then
sections = {sections}
elseif type(sections) ~= 'table' then
error(string.format(
"type error in argument #2 to '_main' " ..
"(string, table or nil expected, got %s)",
type(sections)
), 2)
end
options = options or {}
title = title or mw.title.getCurrentTitle()
-- Deal with blank page names elegantly
if page and not page:find('%S') then
page = nil
options.nopage = true
end
-- Make the link(s).
local isShowingPage = not options.nopage
if #sections <= 1 then
local linkPage = page or ''
if options.permalink then -- when oldid provided
linkPage = 'Special:Permalink/' .. options.permalink; -- make Special:Permalink/oldid wikilink
end
local section = sections[1]; -- sections[1] must have a value
local display = '§ ' .. section
if isShowingPage then
page = page or title.prefixedText
if options.display and options.display ~= '' then
if normalizeTitle(options.display) == normalizeTitle(page) then
display = options.display .. ' ' .. display
else
error(string.format(
'Display title "%s" was ignored since it is ' ..
"not equivalent to the page's actual title",
options.display
), 0)
end
else
display = page .. ' ' .. display
end
end
return makeSectionLink(linkPage, section, display)
else
-- Multiple sections. First, make a list of the links to display.
local ret = {}
for i, section in ipairs(sections) do
ret[i] = makeSectionLink(page, section)
end
-- Assemble the list of links into a string with mw.text.listToText.
-- We use the default separator for mw.text.listToText, but a custom
-- conjunction. There is also a special case conjunction if we only
-- have two links.
local conjunction
if #sections == 2 then
conjunction = '​ and '
else
conjunction = ', and '
end
ret = mw.text.listToText(ret, nil, conjunction)
-- Add the intro text.
local intro = '§§ '
if isShowingPage then
intro = (page or title.prefixedText) .. ' ' .. intro
end
ret = intro .. ret
return ret
end
end
function p.main(frame)
local yesno = require('Module:Yesno')
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Section link',
valueFunc = function (key, value)
value = value:match('^%s*(.-)%s*$') -- Trim whitespace
-- Allow blank first parameters, as the wikitext template does this.
if value ~= '' or key == 1 then
return value
end
end
})
for k, v in pairs(args) do -- replace underscores in the positional parameter values
if 'number' == type(k) then
if not yesno (args['keep-underscores']) then -- unless |keep-underscores=yes
args[k] = mw.uri.decode (v, 'WIKI'); -- percent-decode; replace underscores with space characters
else
args[k] = mw.uri.decode (v, 'PATH'); -- percent-decode; retain underscores
end
end
end
-- Sort the arguments.
local page
local sections, options = {}, {}
for k, v in pairs(args) do
if k == 1 then
-- Doing this in the loop because of a bug in [[Module:Arguments]]
-- when using pairs with deleted arguments.
page = mw.text.decode(v, true)
elseif type(k) == 'number' then
sections[k] = v
else
options[k] = v
end
end
options.nopage = yesno (options.nopage); -- make boolean
-- Extract section from page, if present
if page then
local p, s = page:match('^(.-)#(.*)$')
if p then page, sections[1] = p, s end
end
-- Compress the sections array.
local function compressArray(t)
local nums, ret = {}, {}
for num in pairs(t) do
nums[#nums + 1] = num
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end
sections = compressArray(sections)
if not sections[1] then -- empty section parameter makes {{Section link}} meaningless
return ('<strong class=error><span style="font-family:monospace">{{[[Template:Section link|Section link]]}}</span>: required section parameter(s) missing</strong>'); -- emit error message and abandon
end
return p._main(page, sections, options)
end
return p
t2ivt9h77zh9i33xq70ubnt1t8lcwgp
Module:Uses TemplateStyles
828
1233
33295
9501
2026-09-28T18:00:00Z
en>MusikBot II
0
Changed protection settings for "[[Module:Uses TemplateStyles]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2529 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
9500
Scribunto
text/plain
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local TNT = require('Module:TNT')
local p = {}
local function format(msg, ...)
return TNT.format('I18n/Uses TemplateStyles', msg, ...)
end
local function getConfig()
return mw.loadData('Module:Uses TemplateStyles/config')
end
local function makeEditSup(pageName)
return string.format('<sup>[[[Special:Edit/%s|e]]]</sup>', pageName)
end
-- Build just the "(sandbox)" suffix using the i18n message, without duplicating the main link.
local function makeSandboxSuffix(tsSandboxPrefixed)
-- i18n message is: "$1 ([[$2|sandbox]])"
-- Passing empty $1 yields " ([[:...|sandbox]])" -> trim leading whitespace to get "(sandbox)" portion.
local s = format('sandboxlink', '', ':' .. tsSandboxPrefixed)
return (s:gsub('^%s+', ''))
end
local function renderBox(tStyles)
local boxArgs = {
type = 'notice',
small = true,
image = string.format('[[File:Farm-Fresh css add.svg|32px|alt=%s]]', format('logo-alt'))
}
if #tStyles < 1 then
boxArgs.text = string.format('<strong class="error">%s</strong>', format('error-emptylist'))
else
local cfg = getConfig()
local tStylesLinks = {}
for i, ts in ipairs(tStyles) do
local viewLink = string.format('[[:%s]]', ts)
local editSup = makeEditSup(ts)
local out = viewLink .. editSup
-- Optional sandbox link + sandbox edit link
local tsTitle = mw.title.new(ts)
if tsTitle and cfg['sandbox_title'] then
local tsSandboxTitle = mw.title.new(string.format(
'%s:%s/%s/%s',
tsTitle.nsText,
tsTitle.baseText,
cfg['sandbox_title'],
tsTitle.subpageText
))
if tsSandboxTitle and tsSandboxTitle.exists then
local sandboxSuffix = makeSandboxSuffix(tsSandboxTitle.prefixedText)
local sandboxEditSup = makeEditSup(tsSandboxTitle.prefixedText)
out = out .. ' ' .. sandboxSuffix .. ' ' .. sandboxEditSup
end
end
tStylesLinks[i] = out
end
local tStylesList = mList.makeList('bulleted', tStylesLinks)
boxArgs.text = format(
mw.title.getCurrentTitle():inNamespaces(828, 829) and 'header-module' or 'header-template'
) .. '\n' .. tStylesList
end
return mMessageBox.main('mbox', boxArgs)
end
local function renderTrackingCategories(args, tStyles, titleObj)
if yesno(args.nocat) then
return ''
end
local cfg = getConfig()
local cats = {}
-- Error category
if #tStyles < 1 and cfg['error_category'] then
cats[#cats + 1] = cfg['error_category']
end
-- TemplateStyles category
titleObj = titleObj or mw.title.getCurrentTitle()
if (titleObj.namespace == 10 or titleObj.namespace == 828)
and not cfg['subpage_blacklist'][titleObj.subpageText]
then
local category = args.category or cfg['default_category']
if category then
cats[#cats + 1] = category
end
if not yesno(args.noprotcat) and (cfg['protection_conflict_category'] or cfg['padlock_pattern']) then
local currentProt = titleObj.protectionLevels["edit"] and titleObj.protectionLevels["edit"][1] or nil
local addedLevelCat = false
local addedPadlockCat = false
for _, ts in ipairs(tStyles) do
local tsTitleObj = mw.title.new(ts)
local tsProt = tsTitleObj.protectionLevels["edit"] and tsTitleObj.protectionLevels["edit"][1] or nil
if cfg['padlock_pattern'] and tsProt and not addedPadlockCat then
local content = tsTitleObj:getContent()
if not content:find(cfg['padlock_pattern']) then
cats[#cats + 1] = cfg['missing_padlock_category']
addedPadlockCat = true
end
end
if cfg['protection_conflict_category'] and currentProt and tsProt ~= currentProt and not addedLevelCat then
currentProt = cfg['protection_hierarchy'][currentProt] or 0
tsProt = cfg['protection_hierarchy'][tsProt] or 0
if tsProt < currentProt then
addedLevelCat = true
cats[#cats + 1] = cfg['protection_conflict_category']
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
function p._main(args)
local cfg = getConfig()
if #args == 0 then
local prefixed = mw.title.getCurrentTitle().prefixedText
prefixed = prefixed:gsub("/doc", "")
args[1] = prefixed .. "/" .. cfg["default_subpage_name"]
end
local tStyles = mTableTools.compressSparseArray(args)
local box = renderBox(tStyles)
local trackingCategories = renderTrackingCategories(args, tStyles)
return box .. trackingCategories
end
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p
fzxzfes95mnfacwuhc6k9zeaixdtemr
33296
33295
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Uses_TemplateStyles]]
9500
Scribunto
text/plain
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local TNT = require('Module:TNT')
local p = {}
local function format(msg, ...)
return TNT.format('I18n/Uses TemplateStyles', msg, ...)
end
local function getConfig()
return mw.loadData('Module:Uses TemplateStyles/config')
end
local function makeEditSup(pageName)
return string.format('<sup>[[[Special:Edit/%s|e]]]</sup>', pageName)
end
-- Build just the "(sandbox)" suffix using the i18n message, without duplicating the main link.
local function makeSandboxSuffix(tsSandboxPrefixed)
-- i18n message is: "$1 ([[$2|sandbox]])"
-- Passing empty $1 yields " ([[:...|sandbox]])" -> trim leading whitespace to get "(sandbox)" portion.
local s = format('sandboxlink', '', ':' .. tsSandboxPrefixed)
return (s:gsub('^%s+', ''))
end
local function renderBox(tStyles)
local boxArgs = {
type = 'notice',
small = true,
image = string.format('[[File:Farm-Fresh css add.svg|32px|alt=%s]]', format('logo-alt'))
}
if #tStyles < 1 then
boxArgs.text = string.format('<strong class="error">%s</strong>', format('error-emptylist'))
else
local cfg = getConfig()
local tStylesLinks = {}
for i, ts in ipairs(tStyles) do
local viewLink = string.format('[[:%s]]', ts)
local editSup = makeEditSup(ts)
local out = viewLink .. editSup
-- Optional sandbox link + sandbox edit link
local tsTitle = mw.title.new(ts)
if tsTitle and cfg['sandbox_title'] then
local tsSandboxTitle = mw.title.new(string.format(
'%s:%s/%s/%s',
tsTitle.nsText,
tsTitle.baseText,
cfg['sandbox_title'],
tsTitle.subpageText
))
if tsSandboxTitle and tsSandboxTitle.exists then
local sandboxSuffix = makeSandboxSuffix(tsSandboxTitle.prefixedText)
local sandboxEditSup = makeEditSup(tsSandboxTitle.prefixedText)
out = out .. ' ' .. sandboxSuffix .. ' ' .. sandboxEditSup
end
end
tStylesLinks[i] = out
end
local tStylesList = mList.makeList('bulleted', tStylesLinks)
boxArgs.text = format(
mw.title.getCurrentTitle():inNamespaces(828, 829) and 'header-module' or 'header-template'
) .. '\n' .. tStylesList
end
return mMessageBox.main('mbox', boxArgs)
end
local function renderTrackingCategories(args, tStyles, titleObj)
if yesno(args.nocat) then
return ''
end
local cfg = getConfig()
local cats = {}
-- Error category
if #tStyles < 1 and cfg['error_category'] then
cats[#cats + 1] = cfg['error_category']
end
-- TemplateStyles category
titleObj = titleObj or mw.title.getCurrentTitle()
if (titleObj.namespace == 10 or titleObj.namespace == 828)
and not cfg['subpage_blacklist'][titleObj.subpageText]
then
local category = args.category or cfg['default_category']
if category then
cats[#cats + 1] = category
end
if not yesno(args.noprotcat) and (cfg['protection_conflict_category'] or cfg['padlock_pattern']) then
local currentProt = titleObj.protectionLevels["edit"] and titleObj.protectionLevels["edit"][1] or nil
local addedLevelCat = false
local addedPadlockCat = false
for _, ts in ipairs(tStyles) do
local tsTitleObj = mw.title.new(ts)
local tsProt = tsTitleObj.protectionLevels["edit"] and tsTitleObj.protectionLevels["edit"][1] or nil
if cfg['padlock_pattern'] and tsProt and not addedPadlockCat then
local content = tsTitleObj:getContent()
if not content:find(cfg['padlock_pattern']) then
cats[#cats + 1] = cfg['missing_padlock_category']
addedPadlockCat = true
end
end
if cfg['protection_conflict_category'] and currentProt and tsProt ~= currentProt and not addedLevelCat then
currentProt = cfg['protection_hierarchy'][currentProt] or 0
tsProt = cfg['protection_hierarchy'][tsProt] or 0
if tsProt < currentProt then
addedLevelCat = true
cats[#cats + 1] = cfg['protection_conflict_category']
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
function p._main(args)
local cfg = getConfig()
if #args == 0 then
local prefixed = mw.title.getCurrentTitle().prefixedText
prefixed = prefixed:gsub("/doc", "")
args[1] = prefixed .. "/" .. cfg["default_subpage_name"]
end
local tStyles = mTableTools.compressSparseArray(args)
local box = renderBox(tStyles)
local trackingCategories = renderTrackingCategories(args, tStyles)
return box .. trackingCategories
end
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p
fzxzfes95mnfacwuhc6k9zeaixdtemr
Module:Uses TemplateStyles/config
828
1234
33297
9503
2026-09-28T18:00:00Z
en>MusikBot II
0
Changed protection settings for "[[Module:Uses TemplateStyles/config]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2531 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
9502
Scribunto
text/plain
local cfg = {} -- Don’t touch this line.
-- Subpage blacklist: these subpages will not be categorized (except for the
-- error category, which is always added if there is an error).
-- For example “Template:Foo/doc” matches the `doc = true` rule, so it will have
-- no categories. “Template:Foo” and “Template:Foo/documentation” match no rules,
-- so they *will* have categories. All rules should be in the
-- ['<subpage name>'] = true,
-- format.
cfg['subpage_blacklist'] = {
['doc'] = true,
['sandbox'] = true,
['sandbox2'] = true,
['testcases'] = true,
}
-- Sandbox title: if the stylesheet’s title is <template>/<stylesheet>.css, the
-- stylesheet’s sandbox is expected to be at <template>/<sandbox_title>/<stylesheet>.css
-- Set to nil to disable sandbox links.
cfg['sandbox_title'] = 'sandbox'
-- Error category: this category is added if the module call contains errors
-- (e.g. no stylesheet listed). A category name without namespace, or nil
-- to disable categorization (not recommended).
cfg['error_category'] = 'Uses TemplateStyles templates with errors'
-- Default category: this category is added if no custom category is specified
-- in module/template call. A category name without namespace, or nil
-- to disable categorization.
cfg['default_category'] = 'Templates using TemplateStyles'
-- Protection conflict category: this category is added if the protection level
-- of any stylesheet is lower than the protection level of the template. A category name
-- without namespace, or nil to disable categorization (not recommended).
cfg['protection_conflict_category'] = 'Templates using TemplateStyles with a different protection level'
-- Hierarchy of protection levels, used to determine whether one protection level is lower
-- than another and thus should populate protection_conflict_category. No protection is treated as zero
cfg['protection_hierarchy'] = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
-- Padlock pattern: Lua pattern to search on protected stylesheets for, or nil
-- to disable padlock check.
cfg['padlock_pattern'] = '{{pp-'
-- Missing padlock category: this category is added if a protected stylesheet
-- doesn’t contain any padlock template (specified by the above Lua pattern).
-- A category name without namespace (no nil allowed) if the pattern is not nil,
-- unused (and thus may be nil) otherwise.
cfg['missing_padlock_category'] = 'Templates using TemplateStyles without padlocks'
-- Default subpage for the stylesheet if none is given
cfg['default_subpage_name'] = 'styles.css'
return cfg -- Don’t touch this line.
jobuplor7csgdjcx4c6xrtnslslvft4
33298
33297
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Uses_TemplateStyles/config]]
9502
Scribunto
text/plain
local cfg = {} -- Don’t touch this line.
-- Subpage blacklist: these subpages will not be categorized (except for the
-- error category, which is always added if there is an error).
-- For example “Template:Foo/doc” matches the `doc = true` rule, so it will have
-- no categories. “Template:Foo” and “Template:Foo/documentation” match no rules,
-- so they *will* have categories. All rules should be in the
-- ['<subpage name>'] = true,
-- format.
cfg['subpage_blacklist'] = {
['doc'] = true,
['sandbox'] = true,
['sandbox2'] = true,
['testcases'] = true,
}
-- Sandbox title: if the stylesheet’s title is <template>/<stylesheet>.css, the
-- stylesheet’s sandbox is expected to be at <template>/<sandbox_title>/<stylesheet>.css
-- Set to nil to disable sandbox links.
cfg['sandbox_title'] = 'sandbox'
-- Error category: this category is added if the module call contains errors
-- (e.g. no stylesheet listed). A category name without namespace, or nil
-- to disable categorization (not recommended).
cfg['error_category'] = 'Uses TemplateStyles templates with errors'
-- Default category: this category is added if no custom category is specified
-- in module/template call. A category name without namespace, or nil
-- to disable categorization.
cfg['default_category'] = 'Templates using TemplateStyles'
-- Protection conflict category: this category is added if the protection level
-- of any stylesheet is lower than the protection level of the template. A category name
-- without namespace, or nil to disable categorization (not recommended).
cfg['protection_conflict_category'] = 'Templates using TemplateStyles with a different protection level'
-- Hierarchy of protection levels, used to determine whether one protection level is lower
-- than another and thus should populate protection_conflict_category. No protection is treated as zero
cfg['protection_hierarchy'] = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
-- Padlock pattern: Lua pattern to search on protected stylesheets for, or nil
-- to disable padlock check.
cfg['padlock_pattern'] = '{{pp-'
-- Missing padlock category: this category is added if a protected stylesheet
-- doesn’t contain any padlock template (specified by the above Lua pattern).
-- A category name without namespace (no nil allowed) if the pattern is not nil,
-- unused (and thus may be nil) otherwise.
cfg['missing_padlock_category'] = 'Templates using TemplateStyles without padlocks'
-- Default subpage for the stylesheet if none is given
cfg['default_subpage_name'] = 'styles.css'
return cfg -- Don’t touch this line.
jobuplor7csgdjcx4c6xrtnslslvft4
Tempilet:Markup/styles.css
10
1241
33073
9517
2026-09-12T17:03:49Z
en>Axolitl
0
Dark mode border
33073
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.markup {
margin: 0;
margin-bottom: 0.5em;
border-width: medium;
padding: 0;
}
.markup > caption {
font-weight: bold;
}
.markup > tbody > tr > th[scope=col] {
width: 50%;
}
.markup > tbody > tr > td {
background: var(--background-color-interactive-subtle, #f8f9fa);
color:inherit;
border: 1px solid var(--background-color-neutral, #eaecf0);
padding: 5px;
vertical-align: top;
}
.markup-wrapper > :first-child {
margin-top: 0;
}
.markup-wrapper > :last-child {
margin-bottom: 0;
}
.markup-markup {
margin: 0;
border: none;
overflow-wrap: break-word;
white-space: pre-wrap;
}
code.markup-markup {
padding: 0;
}
pre.markup-markup {
padding: 2px 0 0;
}
/* These are for the anti-pattern of using <syntaxhighlight> inside {{Markup}},
use |tag=syntaxhighlight instead */
.markup-markup .mw-highlight {
margin: 0;
}
.markup-markup .mw-highlight pre {
border: none;
}
/* These are for |tag=syntaxhighlight */
div.markup-markup.mw-highlight > pre {
padding: 0;
border: 0;
}
kj465il7qjvutnbg00y24p91a0zb1l2
33074
33073
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Markup/styles.css]]
33073
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.markup {
margin: 0;
margin-bottom: 0.5em;
border-width: medium;
padding: 0;
}
.markup > caption {
font-weight: bold;
}
.markup > tbody > tr > th[scope=col] {
width: 50%;
}
.markup > tbody > tr > td {
background: var(--background-color-interactive-subtle, #f8f9fa);
color:inherit;
border: 1px solid var(--background-color-neutral, #eaecf0);
padding: 5px;
vertical-align: top;
}
.markup-wrapper > :first-child {
margin-top: 0;
}
.markup-wrapper > :last-child {
margin-bottom: 0;
}
.markup-markup {
margin: 0;
border: none;
overflow-wrap: break-word;
white-space: pre-wrap;
}
code.markup-markup {
padding: 0;
}
pre.markup-markup {
padding: 2px 0 0;
}
/* These are for the anti-pattern of using <syntaxhighlight> inside {{Markup}},
use |tag=syntaxhighlight instead */
.markup-markup .mw-highlight {
margin: 0;
}
.markup-markup .mw-highlight pre {
border: none;
}
/* These are for |tag=syntaxhighlight */
div.markup-markup.mw-highlight > pre {
padding: 0;
border: 0;
}
kj465il7qjvutnbg00y24p91a0zb1l2
Module:Location map
828
1290
32841
10590
2026-10-06T20:43:54Z
en>Paine Ellsworth
0
Undid revision [[Special:Diff/1378831002|1378831002]] by [[Special:Contributions/Paine Ellsworth|Paine Ellsworth]] ([[User talk:Paine Ellsworth|talk]])
10589
Scribunto
text/plain
require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local function round(n, decimals)
local pow = 10^(decimals or 0)
return math.floor(n * pow + 0.5) / pow
end
function p.getMapParams(map, frame)
if not map then
error('The name of the location map definition to use must be specified', 2)
end
local moduletitle = mw.title.new('Module:Location map/data/' .. map)
if not moduletitle then
error(string.format('%q is not a valid name for a location map definition', map), 2)
elseif moduletitle.exists then
local mapData = mw.loadData('Module:Location map/data/' .. map)
return function(name, params)
if name == nil then
return 'Module:Location map/data/' .. map
elseif mapData[name] == nil then
return ''
elseif params then
return mw.message.newRawMessage(tostring(mapData[name]), unpack(params)):plain()
else
return mapData[name]
end
end
else
error('Unable to find the specified location map definition: "Module:Location map/data/' .. map .. '" does not exist', 2)
end
end
function p.data(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local params = {}
for k,v in ipairs(args) do
if k > 2 then
params[k-2] = v
end
end
return map(args[2], #params ~= 0 and params)
end
local hemisphereMultipliers = {
longitude = { W = -1, w = -1, E = 1, e = 1 },
latitude = { S = -1, s = -1, N = 1, n = 1 }
}
local function decdeg(degrees, minutes, seconds, hemisphere, decimal, direction)
if decimal then
if degrees then
error('Decimal and DMS degrees cannot both be provided for ' .. direction, 2)
elseif minutes then
error('Minutes can only be provided with DMS degrees for ' .. direction, 2)
elseif seconds then
error('Seconds can only be provided with DMS degrees for ' .. direction, 2)
elseif hemisphere then
error('A hemisphere can only be provided with DMS degrees for ' .. direction, 2)
end
local retval = tonumber(decimal)
if retval then
return retval
end
error('The value "' .. decimal .. '" provided for ' .. direction .. ' is not valid', 2)
elseif seconds and not minutes then
error('Seconds were provided for ' .. direction .. ' without minutes also being provided', 2)
elseif not degrees then
if minutes then
error('Minutes were provided for ' .. direction .. ' without degrees also being provided', 2)
elseif hemisphere then
error('A hemisphere was provided for ' .. direction .. ' without degrees also being provided', 2)
end
return nil
end
decimal = tonumber(degrees)
if not decimal then
error('The degree value "' .. degrees .. '" provided for ' .. direction .. ' is not valid', 2)
elseif minutes and not tonumber(minutes) then
error('The minute value "' .. minutes .. '" provided for ' .. direction .. ' is not valid', 2)
elseif seconds and not tonumber(seconds) then
error('The second value "' .. seconds .. '" provided for ' .. direction .. ' is not valid', 2)
end
decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600
if hemisphere then
local multiplier = hemisphereMultipliers[direction][hemisphere]
if not multiplier then
error('The hemisphere "' .. hemisphere .. '" provided for ' .. direction .. ' is not valid', 2)
end
decimal = decimal * multiplier
end
return decimal
end
-- Finds a parameter in a transclusion of {{Coord}}.
local function coord2text(para,coord) -- this should be changed for languages which do not use Arabic numerals or the degree sign
local lat, long = mw.ustring.match(coord,'<span class="p%-latitude latitude">([^<]+)</span><span class="p%-longitude longitude">([^<]+)</span>')
if lat then
return tonumber(para == 'longitude' and long or lat)
end
local result = mw.text.split(mw.ustring.match(coord,'%-?[%.%d]+°[NS] %-?[%.%d]+°[EW]') or '', '[ °]')
if para == 'longitude' then result = {result[3], result[4]} end
if not tonumber(result[1]) or not result[2] then
mw.log('Malformed coordinates value')
mw.logObject(para, 'para')
mw.logObject(coord, 'coord')
return error('Malformed coordinates value', 2)
end
return tonumber(result[1]) * hemisphereMultipliers[para][result[2]]
end
-- effectively make removeBlanks false for caption and maplink, and true for everything else
-- if useWikidata is present but blank, convert it to false instead of nil
-- p.top, p.bottom, and their callers need to use this
function p.valueFunc(key, value)
if value then
value = mw.text.trim(value)
end
if value ~= '' or key == 'caption' or key == 'maplink' then
return value
elseif key == 'useWikidata' then
return false
end
end
local function getContainerImage(args, map)
if args.AlternativeMap then
return args.AlternativeMap
elseif args.relief then
local digits = mw.ustring.match(args.relief,'^[1-9][0-9]?$') -- image1 to image99
if digits then
local imageDigits = map('image' .. digits)
if imageDigits ~= '' then return imageDigits end
end
local yesNo = require('Module:Yesno')
if yesNo(args.relief,true) then
local image1 = map('image1')
if image1 ~= '' then return image1 end
end
end
return map('image')
end
function p.top(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local width
local default_as_number = tonumber(mw.ustring.match(tostring(args.default_width),"%d*"))
if not args.width then
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1))
elseif mw.ustring.sub(args.width, -2) == 'px' then
width = mw.ustring.sub(args.width, 1, -3)
else
width = args.width
end
local width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0;
if width_as_number == 0 then
-- check to see if width is junk. If it is, then use default calculation
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1))
width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0;
end
if args.max_width ~= "" and args.max_width ~= nil then
-- check to see if width bigger than max_width
local max_as_number = tonumber(mw.ustring.match(args.max_width,"%d*")) or 0;
if width_as_number>max_as_number and max_as_number>0 then
width = args.max_width;
end
end
local retval = frame:extensionTag{name = 'templatestyles', args = {src = 'Module:Location map/styles.css'}}
if args.float == 'center' then
retval = retval .. '<div class="center">'
end
if args.caption and args.caption ~= '' and args.border ~= 'infobox' then
retval = retval .. '<div class="locmap noresize thumb '
if args.float == '"left"' or args.float == 'left' then
retval = retval .. 'floatleft'
elseif args.float == '"center"' or args.float == 'center' or args.float == '"none"' or args.float == 'none' then
retval = retval .. 'tnone'
else
retval = retval .. 'floatright'
end
retval = retval .. '"><div class="thumbinner" style="width:' .. (width + 2) .. 'px'
if args.border == 'none' then
retval = retval .. ';border:none'
elseif args.border then
retval = retval .. ';border-color:' .. args.border
end
retval = retval .. '"><div style="position:relative;width:' .. width .. 'px' .. (args.border ~= 'none' and ';border:1px solid lightgray">' or '">')
else
retval = retval .. '<div class="locmap" style="width:' .. width .. 'px;'
if args.float == '"left"' or args.float == 'left' then
retval = retval .. 'float:left;clear:left'
elseif args.float == '"center"' or args.float == 'center' then
retval = retval .. 'float:none;clear:both;margin-left:auto;margin-right:auto'
elseif args.float == '"none"' or args.float == 'none' then
retval = retval .. 'float:none;clear:none'
else
retval = retval .. 'float:right;clear:right'
end
retval = retval .. '"><div style="width:' .. width .. 'px;padding:0"><div style="position:relative;width:' .. width .. 'px">'
end
local image = getContainerImage(args, map)
local currentTitle = mw.title.getCurrentTitle()
retval = string.format(
'%s[[File:%s|%spx|%s%s|class=notpageimage noviewer]]',
retval,
image,
width,
args.alt or ((args.label or currentTitle.text) .. ' is located in ' .. map('name')),
args.maplink and ('|link=' .. args.maplink) or ''
)
if args.caption and args.caption ~= '' then
if (currentTitle.namespace == 0) and mw.ustring.find(args.caption, '##') then
retval = retval .. '[[Category:Pages using location map with a double number sign in the caption]]'
end
end
if args.overlay_image then
return retval .. '<div style="position:absolute;top:0;left:0">[[File:' .. args.overlay_image .. '|' .. width .. 'px|class=notpageimage noviewer]]</div>'
else
return retval
end
end
function p.bottom(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local retval = '</div>'
local currentTitle = mw.title.getCurrentTitle()
if not args.caption or args.border == 'infobox' then
if args.border then
retval = retval .. '<div style="padding-top:0.2em">'
else
retval = retval .. '<div style="font-size:91%;padding-top:3px">'
end
retval = retval
.. (args.caption or (args.label or currentTitle.text) .. ' (' .. map('name') .. ')')
.. '</div>'
elseif args.caption ~= '' then
-- This is not the pipe trick. We're creating a link with no text on purpose, so that CSS can give us a nice image
retval = retval .. '<div class="thumbcaption"><div class="magnify">[[:File:' .. getContainerImage(args, map) .. '| ]]</div>' .. args.caption .. '</div>'
end
if args.switcherLabel then
retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>'
elseif args.autoSwitcherLabel then
retval = retval .. '<span class="switcher-label" style="display:none">Show map of ' .. map('name') .. '</span>'
end
retval = retval .. '</div></div>'
if args.caption_undefined then
mw.log('Removed parameter caption_undefined used.')
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
retval = retval .. '[[Category:Location maps with removed parameters|caption_undefined]]'
end
end
if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then
mw.log('Removed parameter used in map definition ' .. map())
if currentTitle.namespace == 0 then
local key = (map('skew') ~= '' and 'skew' or '') ..
(map('lat_skew') ~= '' and 'lat_skew' or '') ..
(map('crosses180') ~= '' and 'crosses180' or '') ..
(map('type') ~= '' and 'type' or '')
retval = retval .. '[[Category:Location maps with removed parameters|' .. key .. ' ]]'
end
end
if string.find(map('name'), '|', 1, true) then
mw.log('Pipe used in name of map definition ' .. map())
if currentTitle.namespace == 0 then
retval = retval .. '[[Category:Location maps with a name containing a pipe]]'
end
end
if args.float == 'center' then
retval = retval .. '</div>'
end
return retval
end
local function markOuterDiv(x, y, imageDiv, labelDiv, label_size)
return mw.html.create('div')
:addClass('od')
:addClass('notheme') -- T236137
:cssText('top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '%;font-size:' .. label_size .. '%')
:node(imageDiv)
:node(labelDiv)
end
local function markImageDiv(mark, marksize, label, link, alt, title)
local builder = mw.html.create('div')
:addClass('id')
:cssText('left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px')
:attr('title', title)
if marksize ~= 0 then
builder:wikitext(string.format(
'[[File:%s|%dx%dpx|%s|link=%s%s|class=notpageimage noviewer]]',
mark,
marksize,
marksize,
label,
link,
alt and ('|alt=' .. alt) or ''
))
end
return builder
end
local function markLabelDiv(label, label_size, label_width, position, background, x, marksize)
if tonumber(label_size) == 0 then
return mw.html.create('div'):addClass('l0'):wikitext(label)
end
local builder = mw.html.create('div')
:cssText('width:' .. label_width .. 'em')
local distance = round(marksize / 2 + 1)
if position == 'top' then -- specified top
builder:addClass('pv'):cssText('bottom:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em')
elseif position == 'bottom' then -- specified bottom
builder:addClass('pv'):cssText('top:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em')
elseif position == 'left' or (tonumber(x) > 70 and position ~= 'right') then -- specified left or autodetected to left
builder:addClass('pl'):cssText('right:' .. distance .. 'px')
else -- specified right or autodetected to right
builder:addClass('pr'):cssText('left:' .. distance .. 'px')
end
builder = builder:tag('div')
:wikitext(label)
if background then
builder:cssText('background-color:' .. background)
end
return builder:done()
end
local function getX(longitude, left, right)
local width = (right - left) % 360
if width == 0 then
width = 360
end
local distanceFromLeft = (longitude - left) % 360
-- the distance needed past the map to the right equals distanceFromLeft - width. the distance needed past the map to the left equals 360 - distanceFromLeft. to minimize page stretching, go whichever way is shorter
if distanceFromLeft - width / 2 >= 180 then
distanceFromLeft = distanceFromLeft - 360
end
return 100 * distanceFromLeft / width
end
local function getY(latitude, top, bottom)
return 100 * (top - latitude) / (top - bottom)
end
function p.mark(frame, args, map)
if not args then
args = getArgs(frame, {wrappers = 'Template:Location map~'})
end
local mapnames = {}
if not map then
if args[1] then
map = {}
for mapname in mw.text.gsplit(args[1], '#', true) do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
mapnames[#mapnames + 1] = mapname
end
if #map == 1 then map = map[1] end
else
map = p.getMapParams('World', frame)
args[1] = 'World'
end
end
if type(map) == 'table' then
local outputs = {}
local oldargs = args[1]
for k,v in ipairs(map) do
args[1] = mapnames[k]
outputs[k] = tostring(p.mark(frame, args, v))
end
args[1] = oldargs
return table.concat(outputs, '#PlaceList#') .. '#PlaceList#'
end
local x, y, longitude, latitude
longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'longitude')
latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude')
if args.excludefrom then
-- If this mark is to be excluded from certain maps entirely (useful in the context of multiple maps)
for exclusionmap in mw.text.gsplit(args.excludefrom, '#', true) do
-- Check if this map is excluded. If so, return an empty string.
if args[1] == exclusionmap then
return ''
end
end
end
local builder = mw.html.create()
local currentTitle = mw.title.getCurrentTitle()
if args.coordinates then
-- Temporarily removed to facilitate infobox conversion. See [[Wikipedia:Coordinates in infoboxes]]
-- if longitude or latitude then
-- error('Coordinates from [[Module:Coordinates]] and individual coordinates cannot both be provided')
-- end
longitude = coord2text('longitude', args.coordinates)
latitude = coord2text('latitude', args.coordinates)
elseif not longitude and not latitude and args.useWikidata then
-- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't.
local entity = mw.wikibase.getEntity()
if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1].mainsnak.snaktype == 'value' then
local value = entity.claims.P625[1].mainsnak.datavalue.value
longitude, latitude = value.longitude, value.latitude
end
if args.link and (currentTitle.namespace == 0) then
builder:wikitext('[[Category:Location maps with linked markers with coordinates from Wikidata]]')
end
end
if not longitude then
error('No value was provided for longitude')
elseif not latitude then
error('No value was provided for latitude')
end
if currentTitle.namespace > 0 then
if (not args.lon_deg) ~= (not args.lat_deg) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Degrees]]')
elseif (not args.lon_min) ~= (not args.lat_min) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Minutes]]')
elseif (not args.lon_sec) ~= (not args.lat_sec) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Seconds]]')
elseif (not args.lon_dir) ~= (not args.lat_dir) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Hemisphere]]')
elseif (not args.long) ~= (not args.lat) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Decimal]]')
end
end
if ((tonumber(args.lat_deg) or 0) < 0) and ((tonumber(args.lat_min) or 0) ~= 0 or (tonumber(args.lat_sec) or 0) ~= 0 or (args.lat_dir and args.lat_dir ~='')) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if ((tonumber(args.lon_deg) or 0) < 0) and ((tonumber(args.lon_min) or 0) ~= 0 or (tonumber(args.lon_sec) or 0) ~= 0 or (args.lon_dir and args.lon_dir ~= '')) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if (((tonumber(args.lat_min) or 0) < 0) or ((tonumber(args.lat_sec) or 0) < 0)) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if (((tonumber(args.lon_min) or 0) < 0) or ((tonumber(args.lon_sec) or 0) < 0)) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if args.skew or args.lon_shift or args.markhigh then
mw.log('Removed parameter used in invocation.')
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
local key = (args.skew and 'skew' or '') ..
(args.lon_shift and 'lon_shift' or '') ..
(args.markhigh and 'markhigh' or '')
builder:wikitext('[[Category:Location maps with removed parameters|' .. key ..' ]]')
end
end
if map('x') ~= '' then
x = tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude })))
else
x = tonumber(getX(longitude, map('left'), map('right')))
end
if map('y') ~= '' then
y = tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude })))
else
y = tonumber(getY(latitude, map('top'), map('bottom')))
end
if (x < 0 or x > 100 or y < 0 or y > 100) and not args.outside then
mw.log('Mark placed outside map boundaries without outside flag set. x = ' .. x .. ', y = ' .. y)
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
local key = currentTitle.prefixedText
builder:wikitext('[[Category:Location maps with marks outside map and outside parameter not set|' .. key .. ' ]]')
end
end
local mark = args.mark or map('mark')
if mark == '' then
mark = 'Red pog.svg'
end
local marksize = tonumber(args.marksize) or tonumber(map('marksize')) or 8
local imageDiv = markImageDiv(mark, marksize, args.label or mw.title.getCurrentTitle().text, args.link or '', args.alt, args[2])
local label_size = args.label_size or 91
local labelDiv
if args.label and args.position ~= 'none' then
labelDiv = markLabelDiv(args.label, label_size, args.label_width or 6, args.position, args.background, x, marksize)
end
return builder:node(markOuterDiv(x, y, imageDiv, labelDiv, label_size))
end
local function switcherSeparate(s)
if s == nil then return {} end
local retval = {}
for i in string.gmatch(s .. '#', '([^#]*)#') do
i = mw.text.trim(i)
retval[#retval + 1] = (i ~= '' and i)
end
return retval
end
function p.infobox_pushpin_map(frame)
--This function is designed to be invoked from an infobox template
--* Some parameters (generally starting with "pushpin_") are meant to be exposed as parameters
-- in the outer infobox, settable by editors
--* Others are meant to be "hidden" (e.g., only set inside the infobox template code)
-- First get the combined arguments from both parent and invocation frame
local raw_args = getArgs(frame,{parentFirst=true})
--If no map is supplied, return.
if not raw_args['pushpin_map'] then
return
end
-- Now get arguments from just the invocation frame
local frame_args = getArgs(frame,{frameOnly=true})
-- parsed_args will have the resulting merged parameters
local parsed_args = {}
-- Default to using wikidata coodinates if no other coordiantes supplied.
if raw_args.useWikidata == nil then
parsed_args.useWikidata = true
else
parsed_args.useWikidata = raw_args.useWikidata
end
-- Parse the arguments
parsed_args[1] = raw_args['pushpin_map']
parsed_args.float = frame_args.float or 'center'
parsed_args.border = frame_args.border or 'infobox'
parsed_args.default_width = frame_args.default_width
parsed_args.max_width = frame_args.max_width
parsed_args.coordinates = raw_args['coordinates']
parsed_args.caption = raw_args['pushpin_caption']
parsed_args.relief = raw_args['pushpin_relief']
parsed_args.label = raw_args['pushpin_label']
parsed_args.label_size = raw_args['pushpin_label_size']
parsed_args.position = raw_args['pushpin_label_position']
parsed_args.mark = raw_args['pushpin_mark']
parsed_args.marksize = raw_args['pushpin_mark_size']
parsed_args.alt = raw_args['pushpin_alt']
parsed_args.background = raw_args['pushpin_background']
parsed_args.width = raw_args['pushpin_map_size']
local map = {}
local caption_list = {}
for mapname in string.gmatch(parsed_args[1], '[^#]+') do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
end
if parsed_args['caption'] then
for caption in mw.text.gsplit(parsed_args['caption'], '##', true) do
caption_list[#caption_list + 1] = caption
end
end
if #map == 1 then
map = map[1]
if not parsed_args.caption then
parsed_args.caption = 'Location within ' .. map('name')
end
end
if type(map) == 'table' then
mw.log('----')
mw.logObject(map)
if #caption_list > #map then
error(string.format('%d captions were provided, but only %d maps were provided', #caption_list, #map))
elseif not parsed_args.caption then
-- Set a default caption for each of the multiple maps
for i=1, #map do
caption_list[#caption_list + 1] = 'Location within '.. map[i]('name')
end
end
local outputs = {}
parsed_args.autoSwitcherLabel = true
for k,v in ipairs(map) do
parsed_args.caption = caption_list[k]
outputs[k] = p.main(frame, parsed_args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
else
return p.top(frame, parsed_args, map) .. tostring( p.mark(frame, parsed_args, map) ) .. p.bottom(frame, parsed_args, map)
end
end
function p.main(frame, args, map)
local caption_list = {}
if not args then
args = getArgs(frame, {wrappers = 'Template:Location map', valueFunc = p.valueFunc})
end
if args.useWikidata == nil then
args.useWikidata = true
end
if not map then
if args[1] then
map = {}
for mapname in string.gmatch(args[1], '[^#]+') do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
end
if args['caption'] then
if args['caption'] == "" then
while #caption_list < #map do
caption_list[#caption_list + 1] = args['caption']
end
else
for caption in mw.text.gsplit(args['caption'], '##', true) do
caption_list[#caption_list + 1] = caption
end
end
end
if #map == 1 then map = map[1] end
else
map = p.getMapParams('World', frame)
end
end
if type(map) == 'table' then
local altmaps = switcherSeparate(args.AlternativeMap)
if #altmaps > #map then
error(string.format('%d AlternativeMaps were provided, but only %d maps were provided', #altmaps, #map))
end
local overlays = switcherSeparate(args.overlay_image)
if #overlays > #map then
error(string.format('%d overlay_images were provided, but only %d maps were provided', #overlays, #map))
end
if #caption_list > #map then
error(string.format('%d captions were provided, but only %d maps were provided', #caption_list, #map))
end
local outputs = {}
args.autoSwitcherLabel = true
for k,v in ipairs(map) do
args.AlternativeMap = altmaps[k]
args.overlay_image = overlays[k]
args.caption = caption_list[k]
outputs[k] = p.main(frame, args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
else
return p.top(frame, args, map) .. tostring( p.mark(frame, args, map) ) .. p.bottom(frame, args, map)
end
end
return p
3pqbnkg8pemwulwnvka0szt6hqc0tii
32842
32841
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Location_map]]
10589
Scribunto
text/plain
require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local function round(n, decimals)
local pow = 10^(decimals or 0)
return math.floor(n * pow + 0.5) / pow
end
function p.getMapParams(map, frame)
if not map then
error('The name of the location map definition to use must be specified', 2)
end
local moduletitle = mw.title.new('Module:Location map/data/' .. map)
if not moduletitle then
error(string.format('%q is not a valid name for a location map definition', map), 2)
elseif moduletitle.exists then
local mapData = mw.loadData('Module:Location map/data/' .. map)
return function(name, params)
if name == nil then
return 'Module:Location map/data/' .. map
elseif mapData[name] == nil then
return ''
elseif params then
return mw.message.newRawMessage(tostring(mapData[name]), unpack(params)):plain()
else
return mapData[name]
end
end
else
error('Unable to find the specified location map definition: "Module:Location map/data/' .. map .. '" does not exist', 2)
end
end
function p.data(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local params = {}
for k,v in ipairs(args) do
if k > 2 then
params[k-2] = v
end
end
return map(args[2], #params ~= 0 and params)
end
local hemisphereMultipliers = {
longitude = { W = -1, w = -1, E = 1, e = 1 },
latitude = { S = -1, s = -1, N = 1, n = 1 }
}
local function decdeg(degrees, minutes, seconds, hemisphere, decimal, direction)
if decimal then
if degrees then
error('Decimal and DMS degrees cannot both be provided for ' .. direction, 2)
elseif minutes then
error('Minutes can only be provided with DMS degrees for ' .. direction, 2)
elseif seconds then
error('Seconds can only be provided with DMS degrees for ' .. direction, 2)
elseif hemisphere then
error('A hemisphere can only be provided with DMS degrees for ' .. direction, 2)
end
local retval = tonumber(decimal)
if retval then
return retval
end
error('The value "' .. decimal .. '" provided for ' .. direction .. ' is not valid', 2)
elseif seconds and not minutes then
error('Seconds were provided for ' .. direction .. ' without minutes also being provided', 2)
elseif not degrees then
if minutes then
error('Minutes were provided for ' .. direction .. ' without degrees also being provided', 2)
elseif hemisphere then
error('A hemisphere was provided for ' .. direction .. ' without degrees also being provided', 2)
end
return nil
end
decimal = tonumber(degrees)
if not decimal then
error('The degree value "' .. degrees .. '" provided for ' .. direction .. ' is not valid', 2)
elseif minutes and not tonumber(minutes) then
error('The minute value "' .. minutes .. '" provided for ' .. direction .. ' is not valid', 2)
elseif seconds and not tonumber(seconds) then
error('The second value "' .. seconds .. '" provided for ' .. direction .. ' is not valid', 2)
end
decimal = decimal + (minutes or 0)/60 + (seconds or 0)/3600
if hemisphere then
local multiplier = hemisphereMultipliers[direction][hemisphere]
if not multiplier then
error('The hemisphere "' .. hemisphere .. '" provided for ' .. direction .. ' is not valid', 2)
end
decimal = decimal * multiplier
end
return decimal
end
-- Finds a parameter in a transclusion of {{Coord}}.
local function coord2text(para,coord) -- this should be changed for languages which do not use Arabic numerals or the degree sign
local lat, long = mw.ustring.match(coord,'<span class="p%-latitude latitude">([^<]+)</span><span class="p%-longitude longitude">([^<]+)</span>')
if lat then
return tonumber(para == 'longitude' and long or lat)
end
local result = mw.text.split(mw.ustring.match(coord,'%-?[%.%d]+°[NS] %-?[%.%d]+°[EW]') or '', '[ °]')
if para == 'longitude' then result = {result[3], result[4]} end
if not tonumber(result[1]) or not result[2] then
mw.log('Malformed coordinates value')
mw.logObject(para, 'para')
mw.logObject(coord, 'coord')
return error('Malformed coordinates value', 2)
end
return tonumber(result[1]) * hemisphereMultipliers[para][result[2]]
end
-- effectively make removeBlanks false for caption and maplink, and true for everything else
-- if useWikidata is present but blank, convert it to false instead of nil
-- p.top, p.bottom, and their callers need to use this
function p.valueFunc(key, value)
if value then
value = mw.text.trim(value)
end
if value ~= '' or key == 'caption' or key == 'maplink' then
return value
elseif key == 'useWikidata' then
return false
end
end
local function getContainerImage(args, map)
if args.AlternativeMap then
return args.AlternativeMap
elseif args.relief then
local digits = mw.ustring.match(args.relief,'^[1-9][0-9]?$') -- image1 to image99
if digits then
local imageDigits = map('image' .. digits)
if imageDigits ~= '' then return imageDigits end
end
local yesNo = require('Module:Yesno')
if yesNo(args.relief,true) then
local image1 = map('image1')
if image1 ~= '' then return image1 end
end
end
return map('image')
end
function p.top(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local width
local default_as_number = tonumber(mw.ustring.match(tostring(args.default_width),"%d*"))
if not args.width then
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1))
elseif mw.ustring.sub(args.width, -2) == 'px' then
width = mw.ustring.sub(args.width, 1, -3)
else
width = args.width
end
local width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0;
if width_as_number == 0 then
-- check to see if width is junk. If it is, then use default calculation
width = round((default_as_number or 240) * (tonumber(map('defaultscale')) or 1))
width_as_number = tonumber(mw.ustring.match(tostring(width),"%d*")) or 0;
end
if args.max_width ~= "" and args.max_width ~= nil then
-- check to see if width bigger than max_width
local max_as_number = tonumber(mw.ustring.match(args.max_width,"%d*")) or 0;
if width_as_number>max_as_number and max_as_number>0 then
width = args.max_width;
end
end
local retval = frame:extensionTag{name = 'templatestyles', args = {src = 'Module:Location map/styles.css'}}
if args.float == 'center' then
retval = retval .. '<div class="center">'
end
if args.caption and args.caption ~= '' and args.border ~= 'infobox' then
retval = retval .. '<div class="locmap noresize thumb '
if args.float == '"left"' or args.float == 'left' then
retval = retval .. 'floatleft'
elseif args.float == '"center"' or args.float == 'center' or args.float == '"none"' or args.float == 'none' then
retval = retval .. 'tnone'
else
retval = retval .. 'floatright'
end
retval = retval .. '"><div class="thumbinner" style="width:' .. (width + 2) .. 'px'
if args.border == 'none' then
retval = retval .. ';border:none'
elseif args.border then
retval = retval .. ';border-color:' .. args.border
end
retval = retval .. '"><div style="position:relative;width:' .. width .. 'px' .. (args.border ~= 'none' and ';border:1px solid lightgray">' or '">')
else
retval = retval .. '<div class="locmap" style="width:' .. width .. 'px;'
if args.float == '"left"' or args.float == 'left' then
retval = retval .. 'float:left;clear:left'
elseif args.float == '"center"' or args.float == 'center' then
retval = retval .. 'float:none;clear:both;margin-left:auto;margin-right:auto'
elseif args.float == '"none"' or args.float == 'none' then
retval = retval .. 'float:none;clear:none'
else
retval = retval .. 'float:right;clear:right'
end
retval = retval .. '"><div style="width:' .. width .. 'px;padding:0"><div style="position:relative;width:' .. width .. 'px">'
end
local image = getContainerImage(args, map)
local currentTitle = mw.title.getCurrentTitle()
retval = string.format(
'%s[[File:%s|%spx|%s%s|class=notpageimage noviewer]]',
retval,
image,
width,
args.alt or ((args.label or currentTitle.text) .. ' is located in ' .. map('name')),
args.maplink and ('|link=' .. args.maplink) or ''
)
if args.caption and args.caption ~= '' then
if (currentTitle.namespace == 0) and mw.ustring.find(args.caption, '##') then
retval = retval .. '[[Category:Pages using location map with a double number sign in the caption]]'
end
end
if args.overlay_image then
return retval .. '<div style="position:absolute;top:0;left:0">[[File:' .. args.overlay_image .. '|' .. width .. 'px|class=notpageimage noviewer]]</div>'
else
return retval
end
end
function p.bottom(frame, args, map)
if not args then
args = getArgs(frame, {frameOnly = true, valueFunc = p.valueFunc})
end
if not map then
map = p.getMapParams(args[1], frame)
end
local retval = '</div>'
local currentTitle = mw.title.getCurrentTitle()
if not args.caption or args.border == 'infobox' then
if args.border then
retval = retval .. '<div style="padding-top:0.2em">'
else
retval = retval .. '<div style="font-size:91%;padding-top:3px">'
end
retval = retval
.. (args.caption or (args.label or currentTitle.text) .. ' (' .. map('name') .. ')')
.. '</div>'
elseif args.caption ~= '' then
-- This is not the pipe trick. We're creating a link with no text on purpose, so that CSS can give us a nice image
retval = retval .. '<div class="thumbcaption"><div class="magnify">[[:File:' .. getContainerImage(args, map) .. '| ]]</div>' .. args.caption .. '</div>'
end
if args.switcherLabel then
retval = retval .. '<span class="switcher-label" style="display:none">' .. args.switcherLabel .. '</span>'
elseif args.autoSwitcherLabel then
retval = retval .. '<span class="switcher-label" style="display:none">Show map of ' .. map('name') .. '</span>'
end
retval = retval .. '</div></div>'
if args.caption_undefined then
mw.log('Removed parameter caption_undefined used.')
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
retval = retval .. '[[Category:Location maps with removed parameters|caption_undefined]]'
end
end
if map('skew') ~= '' or map('lat_skew') ~= '' or map('crosses180') ~= '' or map('type') ~= '' then
mw.log('Removed parameter used in map definition ' .. map())
if currentTitle.namespace == 0 then
local key = (map('skew') ~= '' and 'skew' or '') ..
(map('lat_skew') ~= '' and 'lat_skew' or '') ..
(map('crosses180') ~= '' and 'crosses180' or '') ..
(map('type') ~= '' and 'type' or '')
retval = retval .. '[[Category:Location maps with removed parameters|' .. key .. ' ]]'
end
end
if string.find(map('name'), '|', 1, true) then
mw.log('Pipe used in name of map definition ' .. map())
if currentTitle.namespace == 0 then
retval = retval .. '[[Category:Location maps with a name containing a pipe]]'
end
end
if args.float == 'center' then
retval = retval .. '</div>'
end
return retval
end
local function markOuterDiv(x, y, imageDiv, labelDiv, label_size)
return mw.html.create('div')
:addClass('od')
:addClass('notheme') -- T236137
:cssText('top:' .. round(y, 3) .. '%;left:' .. round(x, 3) .. '%;font-size:' .. label_size .. '%')
:node(imageDiv)
:node(labelDiv)
end
local function markImageDiv(mark, marksize, label, link, alt, title)
local builder = mw.html.create('div')
:addClass('id')
:cssText('left:-' .. round(marksize / 2) .. 'px;top:-' .. round(marksize / 2) .. 'px')
:attr('title', title)
if marksize ~= 0 then
builder:wikitext(string.format(
'[[File:%s|%dx%dpx|%s|link=%s%s|class=notpageimage noviewer]]',
mark,
marksize,
marksize,
label,
link,
alt and ('|alt=' .. alt) or ''
))
end
return builder
end
local function markLabelDiv(label, label_size, label_width, position, background, x, marksize)
if tonumber(label_size) == 0 then
return mw.html.create('div'):addClass('l0'):wikitext(label)
end
local builder = mw.html.create('div')
:cssText('width:' .. label_width .. 'em')
local distance = round(marksize / 2 + 1)
if position == 'top' then -- specified top
builder:addClass('pv'):cssText('bottom:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em')
elseif position == 'bottom' then -- specified bottom
builder:addClass('pv'):cssText('top:' .. distance .. 'px;left:' .. (-label_width / 2) .. 'em')
elseif position == 'left' or (tonumber(x) > 70 and position ~= 'right') then -- specified left or autodetected to left
builder:addClass('pl'):cssText('right:' .. distance .. 'px')
else -- specified right or autodetected to right
builder:addClass('pr'):cssText('left:' .. distance .. 'px')
end
builder = builder:tag('div')
:wikitext(label)
if background then
builder:cssText('background-color:' .. background)
end
return builder:done()
end
local function getX(longitude, left, right)
local width = (right - left) % 360
if width == 0 then
width = 360
end
local distanceFromLeft = (longitude - left) % 360
-- the distance needed past the map to the right equals distanceFromLeft - width. the distance needed past the map to the left equals 360 - distanceFromLeft. to minimize page stretching, go whichever way is shorter
if distanceFromLeft - width / 2 >= 180 then
distanceFromLeft = distanceFromLeft - 360
end
return 100 * distanceFromLeft / width
end
local function getY(latitude, top, bottom)
return 100 * (top - latitude) / (top - bottom)
end
function p.mark(frame, args, map)
if not args then
args = getArgs(frame, {wrappers = 'Template:Location map~'})
end
local mapnames = {}
if not map then
if args[1] then
map = {}
for mapname in mw.text.gsplit(args[1], '#', true) do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
mapnames[#mapnames + 1] = mapname
end
if #map == 1 then map = map[1] end
else
map = p.getMapParams('World', frame)
args[1] = 'World'
end
end
if type(map) == 'table' then
local outputs = {}
local oldargs = args[1]
for k,v in ipairs(map) do
args[1] = mapnames[k]
outputs[k] = tostring(p.mark(frame, args, v))
end
args[1] = oldargs
return table.concat(outputs, '#PlaceList#') .. '#PlaceList#'
end
local x, y, longitude, latitude
longitude = decdeg(args.lon_deg, args.lon_min, args.lon_sec, args.lon_dir, args.long, 'longitude')
latitude = decdeg(args.lat_deg, args.lat_min, args.lat_sec, args.lat_dir, args.lat, 'latitude')
if args.excludefrom then
-- If this mark is to be excluded from certain maps entirely (useful in the context of multiple maps)
for exclusionmap in mw.text.gsplit(args.excludefrom, '#', true) do
-- Check if this map is excluded. If so, return an empty string.
if args[1] == exclusionmap then
return ''
end
end
end
local builder = mw.html.create()
local currentTitle = mw.title.getCurrentTitle()
if args.coordinates then
-- Temporarily removed to facilitate infobox conversion. See [[Wikipedia:Coordinates in infoboxes]]
-- if longitude or latitude then
-- error('Coordinates from [[Module:Coordinates]] and individual coordinates cannot both be provided')
-- end
longitude = coord2text('longitude', args.coordinates)
latitude = coord2text('latitude', args.coordinates)
elseif not longitude and not latitude and args.useWikidata then
-- If they didn't provide either coordinate, try Wikidata. If they provided one but not the other, don't.
local entity = mw.wikibase.getEntity()
if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1].mainsnak.snaktype == 'value' then
local value = entity.claims.P625[1].mainsnak.datavalue.value
longitude, latitude = value.longitude, value.latitude
end
if args.link and (currentTitle.namespace == 0) then
builder:wikitext('[[Category:Location maps with linked markers with coordinates from Wikidata]]')
end
end
if not longitude then
error('No value was provided for longitude')
elseif not latitude then
error('No value was provided for latitude')
end
if currentTitle.namespace > 0 then
if (not args.lon_deg) ~= (not args.lat_deg) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Degrees]]')
elseif (not args.lon_min) ~= (not args.lat_min) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Minutes]]')
elseif (not args.lon_sec) ~= (not args.lat_sec) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Seconds]]')
elseif (not args.lon_dir) ~= (not args.lat_dir) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Hemisphere]]')
elseif (not args.long) ~= (not args.lat) then
builder:wikitext('[[Category:Location maps with different longitude and latitude precisions|Decimal]]')
end
end
if ((tonumber(args.lat_deg) or 0) < 0) and ((tonumber(args.lat_min) or 0) ~= 0 or (tonumber(args.lat_sec) or 0) ~= 0 or (args.lat_dir and args.lat_dir ~='')) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if ((tonumber(args.lon_deg) or 0) < 0) and ((tonumber(args.lon_min) or 0) ~= 0 or (tonumber(args.lon_sec) or 0) ~= 0 or (args.lon_dir and args.lon_dir ~= '')) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if (((tonumber(args.lat_min) or 0) < 0) or ((tonumber(args.lat_sec) or 0) < 0)) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if (((tonumber(args.lon_min) or 0) < 0) or ((tonumber(args.lon_sec) or 0) < 0)) then
builder:wikitext('[[Category:Location maps with negative degrees and minutes or seconds]]')
end
if args.skew or args.lon_shift or args.markhigh then
mw.log('Removed parameter used in invocation.')
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
local key = (args.skew and 'skew' or '') ..
(args.lon_shift and 'lon_shift' or '') ..
(args.markhigh and 'markhigh' or '')
builder:wikitext('[[Category:Location maps with removed parameters|' .. key ..' ]]')
end
end
if map('x') ~= '' then
x = tonumber(mw.ext.ParserFunctions.expr(map('x', { latitude, longitude })))
else
x = tonumber(getX(longitude, map('left'), map('right')))
end
if map('y') ~= '' then
y = tonumber(mw.ext.ParserFunctions.expr(map('y', { latitude, longitude })))
else
y = tonumber(getY(latitude, map('top'), map('bottom')))
end
if (x < 0 or x > 100 or y < 0 or y > 100) and not args.outside then
mw.log('Mark placed outside map boundaries without outside flag set. x = ' .. x .. ', y = ' .. y)
local parent = frame:getParent()
if parent then
mw.log('Parent is ' .. parent:getTitle())
end
mw.logObject(args, 'args')
if currentTitle.namespace == 0 then
local key = currentTitle.prefixedText
builder:wikitext('[[Category:Location maps with marks outside map and outside parameter not set|' .. key .. ' ]]')
end
end
local mark = args.mark or map('mark')
if mark == '' then
mark = 'Red pog.svg'
end
local marksize = tonumber(args.marksize) or tonumber(map('marksize')) or 8
local imageDiv = markImageDiv(mark, marksize, args.label or mw.title.getCurrentTitle().text, args.link or '', args.alt, args[2])
local label_size = args.label_size or 91
local labelDiv
if args.label and args.position ~= 'none' then
labelDiv = markLabelDiv(args.label, label_size, args.label_width or 6, args.position, args.background, x, marksize)
end
return builder:node(markOuterDiv(x, y, imageDiv, labelDiv, label_size))
end
local function switcherSeparate(s)
if s == nil then return {} end
local retval = {}
for i in string.gmatch(s .. '#', '([^#]*)#') do
i = mw.text.trim(i)
retval[#retval + 1] = (i ~= '' and i)
end
return retval
end
function p.infobox_pushpin_map(frame)
--This function is designed to be invoked from an infobox template
--* Some parameters (generally starting with "pushpin_") are meant to be exposed as parameters
-- in the outer infobox, settable by editors
--* Others are meant to be "hidden" (e.g., only set inside the infobox template code)
-- First get the combined arguments from both parent and invocation frame
local raw_args = getArgs(frame,{parentFirst=true})
--If no map is supplied, return.
if not raw_args['pushpin_map'] then
return
end
-- Now get arguments from just the invocation frame
local frame_args = getArgs(frame,{frameOnly=true})
-- parsed_args will have the resulting merged parameters
local parsed_args = {}
-- Default to using wikidata coodinates if no other coordiantes supplied.
if raw_args.useWikidata == nil then
parsed_args.useWikidata = true
else
parsed_args.useWikidata = raw_args.useWikidata
end
-- Parse the arguments
parsed_args[1] = raw_args['pushpin_map']
parsed_args.float = frame_args.float or 'center'
parsed_args.border = frame_args.border or 'infobox'
parsed_args.default_width = frame_args.default_width
parsed_args.max_width = frame_args.max_width
parsed_args.coordinates = raw_args['coordinates']
parsed_args.caption = raw_args['pushpin_caption']
parsed_args.relief = raw_args['pushpin_relief']
parsed_args.label = raw_args['pushpin_label']
parsed_args.label_size = raw_args['pushpin_label_size']
parsed_args.position = raw_args['pushpin_label_position']
parsed_args.mark = raw_args['pushpin_mark']
parsed_args.marksize = raw_args['pushpin_mark_size']
parsed_args.alt = raw_args['pushpin_alt']
parsed_args.background = raw_args['pushpin_background']
parsed_args.width = raw_args['pushpin_map_size']
local map = {}
local caption_list = {}
for mapname in string.gmatch(parsed_args[1], '[^#]+') do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
end
if parsed_args['caption'] then
for caption in mw.text.gsplit(parsed_args['caption'], '##', true) do
caption_list[#caption_list + 1] = caption
end
end
if #map == 1 then
map = map[1]
if not parsed_args.caption then
parsed_args.caption = 'Location within ' .. map('name')
end
end
if type(map) == 'table' then
mw.log('----')
mw.logObject(map)
if #caption_list > #map then
error(string.format('%d captions were provided, but only %d maps were provided', #caption_list, #map))
elseif not parsed_args.caption then
-- Set a default caption for each of the multiple maps
for i=1, #map do
caption_list[#caption_list + 1] = 'Location within '.. map[i]('name')
end
end
local outputs = {}
parsed_args.autoSwitcherLabel = true
for k,v in ipairs(map) do
parsed_args.caption = caption_list[k]
outputs[k] = p.main(frame, parsed_args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
else
return p.top(frame, parsed_args, map) .. tostring( p.mark(frame, parsed_args, map) ) .. p.bottom(frame, parsed_args, map)
end
end
function p.main(frame, args, map)
local caption_list = {}
if not args then
args = getArgs(frame, {wrappers = 'Template:Location map', valueFunc = p.valueFunc})
end
if args.useWikidata == nil then
args.useWikidata = true
end
if not map then
if args[1] then
map = {}
for mapname in string.gmatch(args[1], '[^#]+') do
map[#map + 1] = p.getMapParams(mw.ustring.gsub(mapname, '^%s*(.-)%s*$', '%1'), frame)
end
if args['caption'] then
if args['caption'] == "" then
while #caption_list < #map do
caption_list[#caption_list + 1] = args['caption']
end
else
for caption in mw.text.gsplit(args['caption'], '##', true) do
caption_list[#caption_list + 1] = caption
end
end
end
if #map == 1 then map = map[1] end
else
map = p.getMapParams('World', frame)
end
end
if type(map) == 'table' then
local altmaps = switcherSeparate(args.AlternativeMap)
if #altmaps > #map then
error(string.format('%d AlternativeMaps were provided, but only %d maps were provided', #altmaps, #map))
end
local overlays = switcherSeparate(args.overlay_image)
if #overlays > #map then
error(string.format('%d overlay_images were provided, but only %d maps were provided', #overlays, #map))
end
if #caption_list > #map then
error(string.format('%d captions were provided, but only %d maps were provided', #caption_list, #map))
end
local outputs = {}
args.autoSwitcherLabel = true
for k,v in ipairs(map) do
args.AlternativeMap = altmaps[k]
args.overlay_image = overlays[k]
args.caption = caption_list[k]
outputs[k] = p.main(frame, args, v)
end
return '<div class="switcher-container">' .. table.concat(outputs) .. '</div>'
else
return p.top(frame, args, map) .. tostring( p.mark(frame, args, map) ) .. p.bottom(frame, args, map)
end
end
return p
3pqbnkg8pemwulwnvka0szt6hqc0tii
Module:Transclusion count/data/L
828
1303
33462
10618
2026-10-18T05:10:26Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33462
Scribunto
text/plain
return {
["LASTYEAR"] = 855000,
["LAT"] = 4200,
["LCAuth"] = 3300,
["LCCN"] = 2300,
["LKA"] = 2100,
["LTU"] = 5000,
["LUX"] = 2500,
["LVA"] = 4700,
["La"] = 522000,
["LaPreferente"] = 2300,
["Label"] = 42000,
["Lafc"] = 7000,
["Lang"] = 462000,
["Lang-ka"] = 5900,
["Lang-sr-Cyrl"] = 13000,
["Lang-sr-cyr"] = 3200,
["Lang-sr-cyrl"] = 2300,
["Lang-zh"] = 84000,
["Lang2iso"] = 4600,
["Lang_unset_italics"] = 2600,
["Langnf"] = 2800,
["Langr"] = 2500,
["Language_with_name"] = 7500,
["Language_with_name/for"] = 3400,
["Languages"] = 2800,
["Langx"] = 675000,
["Large"] = 510000,
["Large_category_TOC"] = 11000,
["Last_edited_by"] = 57000,
["Last_word"] = 41000,
["LaunchesByYear_footer"] = 3600,
["LaunchesByYear_header"] = 3600,
["Law_sidebar_style/styles.css"] = 2200,
["Lc"] = 10000,
["Lead_too_short"] = 11000,
["League_icon"] = 3600,
["Leagueicon"] = 3500,
["Leave_feedback/link"] = 86000,
["Left"] = 11000,
["Left-pointing_double_angles"] = 2500,
["Left_angles"] = 2500,
["Leftlegend"] = 2000,
["Legend"] = 36000,
["Legend/styles.css"] = 153000,
["Legend0"] = 13000,
["Legend2"] = 23000,
["Legend_inline"] = 28000,
["LepIndex"] = 12000,
["Letter-NumberCombDisambig"] = 3500,
["Letter–number_combination_disambiguation"] = 4900,
["Lgtext"] = 3900,
["Libera.Chat"] = 11000,
["Library_link_about"] = 4100,
["Library_of_Congress_Control_Number"] = 2400,
["Library_resources_box"] = 4300,
["Librivox_author"] = 7300,
["Librivox_book"] = 4000,
["LicenseTagFairUseQualifier"] = 12000,
["License_migration"] = 44000,
["License_migration_complete"] = 19000,
["License_migration_not_eligible"] = 6900,
["License_migration_redundant"] = 19000,
["Lichengloss"] = 3100,
["Like"] = 2600,
["Likely"] = 5400,
["Line_link"] = 15000,
["Linear-gradient_text"] = 9200,
["Linescore_Amfootball"] = 2400,
["LinkCatIfExists2"] = 16000,
["LinkStatusLocal"] = 45000,
["LinkSummary"] = 249000,
["LinkSummaryLive"] = 9800,
["Link_if_exists"] = 300000,
["Link_note"] = 75000,
["Link_summary"] = 263000,
["Link_target"] = 36000,
["Linkcolor"] = 2500,
["Linkless_exists"] = 26000,
["Linksearch"] = 2800,
["Linksummarylive"] = 5700,
["Linktext"] = 15000,
["List-Class"] = 17000,
["Listen"] = 17000,
["Listen_live"] = 4900,
["Listenlive"] = 4000,
["Lists_of_people_editnotice"] = 2600,
["Lit"] = 18000,
["Literal_translation"] = 28000,
["Lnl"] = 11000,
["LoMP"] = 4800,
["Location_map"] = 51000,
["Location_map+"] = 31000,
["Location_map_data_documentation"] = 6800,
["Location_map_many"] = 4900,
["Location_map~"] = 31000,
["Location_mark"] = 2700,
["Location_mark+"] = 2800,
["Location_mark~"] = 2800,
["Log"] = 3700,
["Logo_fur"] = 64000,
["Logo_requested"] = 6900,
["London_Gazette"] = 37000,
["Long_plot"] = 4000,
["Longitem"] = 2130000,
["Longlink"] = 5300,
["Look_from"] = 11000,
["Lookfrom"] = 5600,
["Loop"] = 102000,
["Loss"] = 4500,
["Low-Class"] = 15000,
["Low-importance"] = 16000,
["Lower"] = 8400,
["Lowercase"] = 4600,
["Lowercase_title"] = 18000,
["Lowercasetitle"] = 2500,
["Lpsn"] = 2200,
["Lt"] = 2500,
["Lua"] = 12000,
["Lua_escape"] = 5700,
["Module:LCCN"] = 2400,
["Module:Labelled_list_hatnote"] = 640000,
["Module:Lang"] = 1800000,
["Module:Lang-zh"] = 85000,
["Module:Lang/ISO_639_synonyms"] = 1800000,
["Module:Lang/configuration"] = 1800000,
["Module:Lang/data"] = 1800000,
["Module:Lang/data/iana_languages"] = 1800000,
["Module:Lang/data/iana_regions"] = 1800000,
["Module:Lang/data/iana_scripts"] = 1800000,
["Module:Lang/data/iana_suppressed_scripts"] = 1800000,
["Module:Lang/data/iana_variants"] = 1800000,
["Module:Lang/data/is_latn_data"] = 1800000,
["Module:Lang/documentor_tool"] = 4200,
["Module:Lang/langx"] = 696000,
["Module:Lang/tag_from_name"] = 7500,
["Module:Language_with_name/for"] = 3400,
["Module:Large_category_TOC"] = 12000,
["Module:Large_category_TOC/styles.css"] = 12000,
["Module:Latin"] = 9000,
["Module:Librivox_book"] = 4000,
["Module:Lighthouse_tracking"] = 2600,
["Module:Link_if_exists"] = 309000,
["Module:Link_summary"] = 263000,
["Module:List"] = 2650000,
["Module:Listen"] = 17000,
["Module:Listen/styles.css"] = 16000,
["Module:Location_map"] = 1210000,
["Module:Location_map/data/Antarctica"] = 2700,
["Module:Location_map/data/Arkansas"] = 3400,
["Module:Location_map/data/Australia"] = 3400,
["Module:Location_map/data/Australia_New_South_Wales"] = 3700,
["Module:Location_map/data/Australia_Queensland"] = 6000,
["Module:Location_map/data/Australia_South_Australia"] = 2200,
["Module:Location_map/data/Austria"] = 3500,
["Module:Location_map/data/Azerbaijan"] = 4900,
["Module:Location_map/data/Bangladesh"] = 2300,
["Module:Location_map/data/Belgium"] = 2000,
["Module:Location_map/data/Bosnia_and_Herzegovina"] = 5500,
["Module:Location_map/data/Brazil"] = 5300,
["Module:Location_map/data/Bulgaria"] = 3400,
["Module:Location_map/data/California"] = 6200,
["Module:Location_map/data/Canada"] = 5000,
["Module:Location_map/data/Canada_Alberta"] = 2200,
["Module:Location_map/data/Canada_British_Columbia"] = 3500,
["Module:Location_map/data/Canada_Ontario"] = 2000,
["Module:Location_map/data/China"] = 3900,
["Module:Location_map/data/Croatia"] = 4400,
["Module:Location_map/data/Czech_Republic"] = 6900,
["Module:Location_map/data/Estonia"] = 3100,
["Module:Location_map/data/Europe"] = 4500,
["Module:Location_map/data/Florida"] = 2700,
["Module:Location_map/data/France"] = 40000,
["Module:Location_map/data/France_Auvergne-Rhône-Alpes"] = 4400,
["Module:Location_map/data/France_Bourgogne-Franche-Comté"] = 4000,
["Module:Location_map/data/France_Grand_Est"] = 5300,
["Module:Location_map/data/France_Hauts-de-France"] = 3900,
["Module:Location_map/data/France_Normandy"] = 3400,
["Module:Location_map/data/France_Nouvelle-Aquitaine"] = 4800,
["Module:Location_map/data/France_Occitanie"] = 4800,
["Module:Location_map/data/Germany"] = 17000,
["Module:Location_map/data/Germany_Bavaria"] = 2900,
["Module:Location_map/data/Germany_Rhineland-Palatinate"] = 2800,
["Module:Location_map/data/Greece"] = 5000,
["Module:Location_map/data/Hungary"] = 3000,
["Module:Location_map/data/Illinois"] = 3500,
["Module:Location_map/data/India"] = 24000,
["Module:Location_map/data/India3"] = 2900,
["Module:Location_map/data/India_Andhra_Pradesh"] = 2900,
["Module:Location_map/data/India_Karnataka"] = 2200,
["Module:Location_map/data/India_Kerala"] = 2900,
["Module:Location_map/data/India_Maharashtra"] = 3100,
["Module:Location_map/data/India_Punjab"] = 2300,
["Module:Location_map/data/India_Tamil_Nadu"] = 3300,
["Module:Location_map/data/India_Uttar_Pradesh"] = 3600,
["Module:Location_map/data/India_West_Bengal"] = 3000,
["Module:Location_map/data/Indiana"] = 3200,
["Module:Location_map/data/Iowa"] = 3000,
["Module:Location_map/data/Iran"] = 51000,
["Module:Location_map/data/Ireland"] = 4000,
["Module:Location_map/data/Italy"] = 12000,
["Module:Location_map/data/Japan"] = 15000,
["Module:Location_map/data/Maine"] = 2100,
["Module:Location_map/data/Maryland"] = 2100,
["Module:Location_map/data/Massachusetts"] = 4700,
["Module:Location_map/data/Mexico"] = 3900,
["Module:Location_map/data/Michigan"] = 3900,
["Module:Location_map/data/Minnesota"] = 4200,
["Module:Location_map/data/Nepal"] = 4800,
["Module:Location_map/data/Netherlands"] = 3100,
["Module:Location_map/data/New_York"] = 8100,
["Module:Location_map/data/North_Carolina"] = 3600,
["Module:Location_map/data/Ohio"] = 2700,
["Module:Location_map/data/Pakistan"] = 3100,
["Module:Location_map/data/Pennsylvania"] = 6100,
["Module:Location_map/data/Peru"] = 2900,
["Module:Location_map/data/Philippines"] = 3800,
["Module:Location_map/data/Poland"] = 54000,
["Module:Location_map/data/Queensland"] = 2500,
["Module:Location_map/data/Romania"] = 6000,
["Module:Location_map/data/Russia"] = 29000,
["Module:Location_map/data/Russia_Bashkortostan"] = 4500,
["Module:Location_map/data/Russia_Vladimir_Oblast"] = 2200,
["Module:Location_map/data/Russia_Vologda_Oblast"] = 4800,
["Module:Location_map/data/Serbia"] = 4400,
["Module:Location_map/data/Slovakia"] = 3300,
["Module:Location_map/data/Slovenia"] = 6800,
["Module:Location_map/data/South_Africa"] = 3300,
["Module:Location_map/data/Spain"] = 8700,
["Module:Location_map/data/Sweden"] = 2900,
["Module:Location_map/data/Switzerland"] = 6300,
["Module:Location_map/data/Syria"] = 2800,
["Module:Location_map/data/Texas"] = 3900,
["Module:Location_map/data/Turkey"] = 22000,
["Module:Location_map/data/Turkey_Central_Anatolia"] = 2100,
["Module:Location_map/data/Turkey_Marmara"] = 2300,
["Module:Location_map/data/USA"] = 115000,
["Module:Location_map/data/USA_Alabama"] = 2200,
["Module:Location_map/data/USA_Alaska"] = 2400,
["Module:Location_map/data/USA_Arizona"] = 2100,
["Module:Location_map/data/USA_Arkansas"] = 3500,
["Module:Location_map/data/USA_California"] = 8100,
["Module:Location_map/data/USA_Colorado"] = 2400,
["Module:Location_map/data/USA_Florida"] = 3400,
["Module:Location_map/data/USA_Georgia"] = 2100,
["Module:Location_map/data/USA_Illinois"] = 3800,
["Module:Location_map/data/USA_Indiana"] = 3400,
["Module:Location_map/data/USA_Iowa"] = 3200,
["Module:Location_map/data/USA_Kentucky"] = 3200,
["Module:Location_map/data/USA_Maine"] = 2300,
["Module:Location_map/data/USA_Maryland"] = 2600,
["Module:Location_map/data/USA_Massachusetts"] = 5000,
["Module:Location_map/data/USA_Michigan"] = 4300,
["Module:Location_map/data/USA_Minnesota"] = 4500,
["Module:Location_map/data/USA_Missouri"] = 2200,
["Module:Location_map/data/USA_New_Jersey"] = 3000,
["Module:Location_map/data/USA_New_York"] = 9000,
["Module:Location_map/data/USA_North_Carolina"] = 4500,
["Module:Location_map/data/USA_Ohio"] = 3000,
["Module:Location_map/data/USA_Oregon"] = 2600,
["Module:Location_map/data/USA_Pennsylvania"] = 7300,
["Module:Location_map/data/USA_Tennessee"] = 2200,
["Module:Location_map/data/USA_Texas"] = 4400,
["Module:Location_map/data/USA_Virginia"] = 5100,
["Module:Location_map/data/USA_Washington"] = 3200,
["Module:Location_map/data/USA_West_Virginia"] = 4400,
["Module:Location_map/data/USA_Wisconsin"] = 3000,
["Module:Location_map/data/Ukraine"] = 4100,
["Module:Location_map/data/United_States"] = 2700,
["Module:Location_map/data/Virginia"] = 4000,
["Module:Location_map/data/Washington"] = 2400,
["Module:Location_map/data/West_Virginia"] = 4100,
["Module:Location_map/data/Wisconsin"] = 2600,
["Module:Location_map/data/doc"] = 6700,
["Module:Location_map/info"] = 6800,
["Module:Location_map/multi"] = 36000,
["Module:Location_map/styles.css"] = 787000,
["Module:London_Gazette_util"] = 37000,
["Module:Lua_banner"] = 12000,
}
j40n20unkrsod3ylsihaq3v7gpe1ql8
33463
33462
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/L]]
33462
Scribunto
text/plain
return {
["LASTYEAR"] = 855000,
["LAT"] = 4200,
["LCAuth"] = 3300,
["LCCN"] = 2300,
["LKA"] = 2100,
["LTU"] = 5000,
["LUX"] = 2500,
["LVA"] = 4700,
["La"] = 522000,
["LaPreferente"] = 2300,
["Label"] = 42000,
["Lafc"] = 7000,
["Lang"] = 462000,
["Lang-ka"] = 5900,
["Lang-sr-Cyrl"] = 13000,
["Lang-sr-cyr"] = 3200,
["Lang-sr-cyrl"] = 2300,
["Lang-zh"] = 84000,
["Lang2iso"] = 4600,
["Lang_unset_italics"] = 2600,
["Langnf"] = 2800,
["Langr"] = 2500,
["Language_with_name"] = 7500,
["Language_with_name/for"] = 3400,
["Languages"] = 2800,
["Langx"] = 675000,
["Large"] = 510000,
["Large_category_TOC"] = 11000,
["Last_edited_by"] = 57000,
["Last_word"] = 41000,
["LaunchesByYear_footer"] = 3600,
["LaunchesByYear_header"] = 3600,
["Law_sidebar_style/styles.css"] = 2200,
["Lc"] = 10000,
["Lead_too_short"] = 11000,
["League_icon"] = 3600,
["Leagueicon"] = 3500,
["Leave_feedback/link"] = 86000,
["Left"] = 11000,
["Left-pointing_double_angles"] = 2500,
["Left_angles"] = 2500,
["Leftlegend"] = 2000,
["Legend"] = 36000,
["Legend/styles.css"] = 153000,
["Legend0"] = 13000,
["Legend2"] = 23000,
["Legend_inline"] = 28000,
["LepIndex"] = 12000,
["Letter-NumberCombDisambig"] = 3500,
["Letter–number_combination_disambiguation"] = 4900,
["Lgtext"] = 3900,
["Libera.Chat"] = 11000,
["Library_link_about"] = 4100,
["Library_of_Congress_Control_Number"] = 2400,
["Library_resources_box"] = 4300,
["Librivox_author"] = 7300,
["Librivox_book"] = 4000,
["LicenseTagFairUseQualifier"] = 12000,
["License_migration"] = 44000,
["License_migration_complete"] = 19000,
["License_migration_not_eligible"] = 6900,
["License_migration_redundant"] = 19000,
["Lichengloss"] = 3100,
["Like"] = 2600,
["Likely"] = 5400,
["Line_link"] = 15000,
["Linear-gradient_text"] = 9200,
["Linescore_Amfootball"] = 2400,
["LinkCatIfExists2"] = 16000,
["LinkStatusLocal"] = 45000,
["LinkSummary"] = 249000,
["LinkSummaryLive"] = 9800,
["Link_if_exists"] = 300000,
["Link_note"] = 75000,
["Link_summary"] = 263000,
["Link_target"] = 36000,
["Linkcolor"] = 2500,
["Linkless_exists"] = 26000,
["Linksearch"] = 2800,
["Linksummarylive"] = 5700,
["Linktext"] = 15000,
["List-Class"] = 17000,
["Listen"] = 17000,
["Listen_live"] = 4900,
["Listenlive"] = 4000,
["Lists_of_people_editnotice"] = 2600,
["Lit"] = 18000,
["Literal_translation"] = 28000,
["Lnl"] = 11000,
["LoMP"] = 4800,
["Location_map"] = 51000,
["Location_map+"] = 31000,
["Location_map_data_documentation"] = 6800,
["Location_map_many"] = 4900,
["Location_map~"] = 31000,
["Location_mark"] = 2700,
["Location_mark+"] = 2800,
["Location_mark~"] = 2800,
["Log"] = 3700,
["Logo_fur"] = 64000,
["Logo_requested"] = 6900,
["London_Gazette"] = 37000,
["Long_plot"] = 4000,
["Longitem"] = 2130000,
["Longlink"] = 5300,
["Look_from"] = 11000,
["Lookfrom"] = 5600,
["Loop"] = 102000,
["Loss"] = 4500,
["Low-Class"] = 15000,
["Low-importance"] = 16000,
["Lower"] = 8400,
["Lowercase"] = 4600,
["Lowercase_title"] = 18000,
["Lowercasetitle"] = 2500,
["Lpsn"] = 2200,
["Lt"] = 2500,
["Lua"] = 12000,
["Lua_escape"] = 5700,
["Module:LCCN"] = 2400,
["Module:Labelled_list_hatnote"] = 640000,
["Module:Lang"] = 1800000,
["Module:Lang-zh"] = 85000,
["Module:Lang/ISO_639_synonyms"] = 1800000,
["Module:Lang/configuration"] = 1800000,
["Module:Lang/data"] = 1800000,
["Module:Lang/data/iana_languages"] = 1800000,
["Module:Lang/data/iana_regions"] = 1800000,
["Module:Lang/data/iana_scripts"] = 1800000,
["Module:Lang/data/iana_suppressed_scripts"] = 1800000,
["Module:Lang/data/iana_variants"] = 1800000,
["Module:Lang/data/is_latn_data"] = 1800000,
["Module:Lang/documentor_tool"] = 4200,
["Module:Lang/langx"] = 696000,
["Module:Lang/tag_from_name"] = 7500,
["Module:Language_with_name/for"] = 3400,
["Module:Large_category_TOC"] = 12000,
["Module:Large_category_TOC/styles.css"] = 12000,
["Module:Latin"] = 9000,
["Module:Librivox_book"] = 4000,
["Module:Lighthouse_tracking"] = 2600,
["Module:Link_if_exists"] = 309000,
["Module:Link_summary"] = 263000,
["Module:List"] = 2650000,
["Module:Listen"] = 17000,
["Module:Listen/styles.css"] = 16000,
["Module:Location_map"] = 1210000,
["Module:Location_map/data/Antarctica"] = 2700,
["Module:Location_map/data/Arkansas"] = 3400,
["Module:Location_map/data/Australia"] = 3400,
["Module:Location_map/data/Australia_New_South_Wales"] = 3700,
["Module:Location_map/data/Australia_Queensland"] = 6000,
["Module:Location_map/data/Australia_South_Australia"] = 2200,
["Module:Location_map/data/Austria"] = 3500,
["Module:Location_map/data/Azerbaijan"] = 4900,
["Module:Location_map/data/Bangladesh"] = 2300,
["Module:Location_map/data/Belgium"] = 2000,
["Module:Location_map/data/Bosnia_and_Herzegovina"] = 5500,
["Module:Location_map/data/Brazil"] = 5300,
["Module:Location_map/data/Bulgaria"] = 3400,
["Module:Location_map/data/California"] = 6200,
["Module:Location_map/data/Canada"] = 5000,
["Module:Location_map/data/Canada_Alberta"] = 2200,
["Module:Location_map/data/Canada_British_Columbia"] = 3500,
["Module:Location_map/data/Canada_Ontario"] = 2000,
["Module:Location_map/data/China"] = 3900,
["Module:Location_map/data/Croatia"] = 4400,
["Module:Location_map/data/Czech_Republic"] = 6900,
["Module:Location_map/data/Estonia"] = 3100,
["Module:Location_map/data/Europe"] = 4500,
["Module:Location_map/data/Florida"] = 2700,
["Module:Location_map/data/France"] = 40000,
["Module:Location_map/data/France_Auvergne-Rhône-Alpes"] = 4400,
["Module:Location_map/data/France_Bourgogne-Franche-Comté"] = 4000,
["Module:Location_map/data/France_Grand_Est"] = 5300,
["Module:Location_map/data/France_Hauts-de-France"] = 3900,
["Module:Location_map/data/France_Normandy"] = 3400,
["Module:Location_map/data/France_Nouvelle-Aquitaine"] = 4800,
["Module:Location_map/data/France_Occitanie"] = 4800,
["Module:Location_map/data/Germany"] = 17000,
["Module:Location_map/data/Germany_Bavaria"] = 2900,
["Module:Location_map/data/Germany_Rhineland-Palatinate"] = 2800,
["Module:Location_map/data/Greece"] = 5000,
["Module:Location_map/data/Hungary"] = 3000,
["Module:Location_map/data/Illinois"] = 3500,
["Module:Location_map/data/India"] = 24000,
["Module:Location_map/data/India3"] = 2900,
["Module:Location_map/data/India_Andhra_Pradesh"] = 2900,
["Module:Location_map/data/India_Karnataka"] = 2200,
["Module:Location_map/data/India_Kerala"] = 2900,
["Module:Location_map/data/India_Maharashtra"] = 3100,
["Module:Location_map/data/India_Punjab"] = 2300,
["Module:Location_map/data/India_Tamil_Nadu"] = 3300,
["Module:Location_map/data/India_Uttar_Pradesh"] = 3600,
["Module:Location_map/data/India_West_Bengal"] = 3000,
["Module:Location_map/data/Indiana"] = 3200,
["Module:Location_map/data/Iowa"] = 3000,
["Module:Location_map/data/Iran"] = 51000,
["Module:Location_map/data/Ireland"] = 4000,
["Module:Location_map/data/Italy"] = 12000,
["Module:Location_map/data/Japan"] = 15000,
["Module:Location_map/data/Maine"] = 2100,
["Module:Location_map/data/Maryland"] = 2100,
["Module:Location_map/data/Massachusetts"] = 4700,
["Module:Location_map/data/Mexico"] = 3900,
["Module:Location_map/data/Michigan"] = 3900,
["Module:Location_map/data/Minnesota"] = 4200,
["Module:Location_map/data/Nepal"] = 4800,
["Module:Location_map/data/Netherlands"] = 3100,
["Module:Location_map/data/New_York"] = 8100,
["Module:Location_map/data/North_Carolina"] = 3600,
["Module:Location_map/data/Ohio"] = 2700,
["Module:Location_map/data/Pakistan"] = 3100,
["Module:Location_map/data/Pennsylvania"] = 6100,
["Module:Location_map/data/Peru"] = 2900,
["Module:Location_map/data/Philippines"] = 3800,
["Module:Location_map/data/Poland"] = 54000,
["Module:Location_map/data/Queensland"] = 2500,
["Module:Location_map/data/Romania"] = 6000,
["Module:Location_map/data/Russia"] = 29000,
["Module:Location_map/data/Russia_Bashkortostan"] = 4500,
["Module:Location_map/data/Russia_Vladimir_Oblast"] = 2200,
["Module:Location_map/data/Russia_Vologda_Oblast"] = 4800,
["Module:Location_map/data/Serbia"] = 4400,
["Module:Location_map/data/Slovakia"] = 3300,
["Module:Location_map/data/Slovenia"] = 6800,
["Module:Location_map/data/South_Africa"] = 3300,
["Module:Location_map/data/Spain"] = 8700,
["Module:Location_map/data/Sweden"] = 2900,
["Module:Location_map/data/Switzerland"] = 6300,
["Module:Location_map/data/Syria"] = 2800,
["Module:Location_map/data/Texas"] = 3900,
["Module:Location_map/data/Turkey"] = 22000,
["Module:Location_map/data/Turkey_Central_Anatolia"] = 2100,
["Module:Location_map/data/Turkey_Marmara"] = 2300,
["Module:Location_map/data/USA"] = 115000,
["Module:Location_map/data/USA_Alabama"] = 2200,
["Module:Location_map/data/USA_Alaska"] = 2400,
["Module:Location_map/data/USA_Arizona"] = 2100,
["Module:Location_map/data/USA_Arkansas"] = 3500,
["Module:Location_map/data/USA_California"] = 8100,
["Module:Location_map/data/USA_Colorado"] = 2400,
["Module:Location_map/data/USA_Florida"] = 3400,
["Module:Location_map/data/USA_Georgia"] = 2100,
["Module:Location_map/data/USA_Illinois"] = 3800,
["Module:Location_map/data/USA_Indiana"] = 3400,
["Module:Location_map/data/USA_Iowa"] = 3200,
["Module:Location_map/data/USA_Kentucky"] = 3200,
["Module:Location_map/data/USA_Maine"] = 2300,
["Module:Location_map/data/USA_Maryland"] = 2600,
["Module:Location_map/data/USA_Massachusetts"] = 5000,
["Module:Location_map/data/USA_Michigan"] = 4300,
["Module:Location_map/data/USA_Minnesota"] = 4500,
["Module:Location_map/data/USA_Missouri"] = 2200,
["Module:Location_map/data/USA_New_Jersey"] = 3000,
["Module:Location_map/data/USA_New_York"] = 9000,
["Module:Location_map/data/USA_North_Carolina"] = 4500,
["Module:Location_map/data/USA_Ohio"] = 3000,
["Module:Location_map/data/USA_Oregon"] = 2600,
["Module:Location_map/data/USA_Pennsylvania"] = 7300,
["Module:Location_map/data/USA_Tennessee"] = 2200,
["Module:Location_map/data/USA_Texas"] = 4400,
["Module:Location_map/data/USA_Virginia"] = 5100,
["Module:Location_map/data/USA_Washington"] = 3200,
["Module:Location_map/data/USA_West_Virginia"] = 4400,
["Module:Location_map/data/USA_Wisconsin"] = 3000,
["Module:Location_map/data/Ukraine"] = 4100,
["Module:Location_map/data/United_States"] = 2700,
["Module:Location_map/data/Virginia"] = 4000,
["Module:Location_map/data/Washington"] = 2400,
["Module:Location_map/data/West_Virginia"] = 4100,
["Module:Location_map/data/Wisconsin"] = 2600,
["Module:Location_map/data/doc"] = 6700,
["Module:Location_map/info"] = 6800,
["Module:Location_map/multi"] = 36000,
["Module:Location_map/styles.css"] = 787000,
["Module:London_Gazette_util"] = 37000,
["Module:Lua_banner"] = 12000,
}
j40n20unkrsod3ylsihaq3v7gpe1ql8
Tempilet:Kbd/styles.css
10
1305
33577
10622
2026-09-10T00:11:20Z
en>Axolitl
0
Better colors in dark mode
33577
sanitized-css
text/css
/* {{pp-template}} */
.mw-tmpl-kbd {
background: #eaecf0;
color: var(--color-base);
}
@media screen {
html.skin-theme-clientpref-night .mw-tmpl-kbd {
background: #202122;
}
}
@media screen and ( prefers-color-scheme: dark ) {
html.skin-theme-clientpref-os .mw-tmpl-kbd {
background: #202122;
}
}
e88bnay3b7f4xp25s5o700e7qi2s9i7
33578
33577
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Kbd/styles.css]]
33577
sanitized-css
text/css
/* {{pp-template}} */
.mw-tmpl-kbd {
background: #eaecf0;
color: var(--color-base);
}
@media screen {
html.skin-theme-clientpref-night .mw-tmpl-kbd {
background: #202122;
}
}
@media screen and ( prefers-color-scheme: dark ) {
html.skin-theme-clientpref-os .mw-tmpl-kbd {
background: #202122;
}
}
e88bnay3b7f4xp25s5o700e7qi2s9i7
Tempilet:Nobold
10
1330
33224
2018-10-23T17:15:13Z
en>Frietjes
0
33224
wikitext
text/x-wiki
<templatestyles src="Nobold/styles.css"/><span class="nobold">{{{1}}}</span><noinclude>
{{documentation}}
<!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS -->
</noinclude>
iaf63qvx3m2zxytvj4dw3wwalq5wusd
33225
10692
2026-11-11T21:49:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Nobold]]
10691
wikitext
text/x-wiki
<{{{tag|span}}} style="font-weight:normal">{{{1<noinclude>|unbolds the text given with 1=[[Category:Formatting templates|{{PAGENAME}}]]</noinclude>}}}</{{{tag|span}}}>
acoimcdc0kucys901f39nptjdmjlxby
Tempilet:Mono/styles.css
10
1332
33539
2019-03-04T00:01:15Z
en>Pppery
0
Adding protection template
33539
sanitized-css
text/css
/* {{pp-template}} */
.monospaced {
/* "monospace, monospace" per [[WP:MONO]] */
font-family: monospace, monospace;
}
np4jqak6c9salmg4ht0lxddkoh7wqt0
33540
10696
2026-11-11T22:44:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Mono/styles.css]]
10695
sanitized-css
text/css
/* Styling for Template:Mono */
.monospaced {
/* Keep it like this: "monospace, monospace". Those are the rules from [[w:en:WP:MONO]]. */
font-family: monospace, monospace;
}
7nftleo0w4bj250ouquesl28ukyzx56
Tempilet:Mono
10
1436
33537
2019-10-13T01:15:06Z
en>Izno
0
implement ifsubst
33537
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>ifsubst|1=|2=<templatestyles src="Mono/styles.css" />}}<span class="monospaced">{{{2|{{{1}}}}}}</span><noinclude>
{{Documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
eyigcpktddtgno85j4vajm121b6hlip
33538
10964
2026-11-11T22:44:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Mono]]
10963
wikitext
text/x-wiki
<templatestyles src="Template:Mono/styles.css"/><span class="monospaced">{{{2|{{{1}}}}}}</span><noinclude>
{{Documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
30zpd0g5gc7hnagu8xmaj3lr9bb9o90
Module:Transclusion count/data/C
828
1498
33212
12748
2026-10-18T05:08:56Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33212
Scribunto
text/plain
return {
["C"] = 807000,
["C-Class"] = 17000,
["C-SPAN"] = 13000,
["C-cmn"] = 2800,
["C-pl"] = 51000,
["C."] = 356000,
["CAN"] = 21000,
["CANelec"] = 18000,
["CANelec/gain"] = 3700,
["CANelec/hold"] = 7000,
["CANelec/source"] = 11000,
["CANelec/top"] = 9300,
["CANelec/total"] = 9800,
["CAS"] = 3800,
["CAS_Registry_Number"] = 3800,
["CBB_Yearly_Record_End"] = 3500,
["CBB_Yearly_Record_Entry"] = 3600,
["CBB_Yearly_Record_Start"] = 3400,
["CBB_Yearly_Record_Subhead"] = 4200,
["CBB_Yearly_Record_Subtotal"] = 3300,
["CBB_roster/Footer"] = 11000,
["CBB_roster/Header"] = 11000,
["CBB_roster/Player"] = 11000,
["CBB_schedule_end"] = 14000,
["CBB_schedule_entry"] = 14000,
["CBB_schedule_start"] = 14000,
["CBB_standings_end"] = 20000,
["CBB_standings_entry"] = 20000,
["CBB_standings_start"] = 20000,
["CBB_yearly_record_end"] = 4700,
["CBB_yearly_record_end/legend"] = 4100,
["CBB_yearly_record_entry"] = 4600,
["CBB_yearly_record_start"] = 4500,
["CBB_yearly_record_subhead"] = 4300,
["CBB_yearly_record_subtotal"] = 4400,
["CBSB_Standings_End"] = 2700,
["CBSB_Standings_Entry"] = 2700,
["CBSB_Standings_Start"] = 2700,
["CBSB_link"] = 4100,
["CBSB_standings_end"] = 5600,
["CBSB_standings_entry"] = 5600,
["CBSB_standings_start"] = 5600,
["CC0"] = 4000,
["CC_BY-SA_2.5"] = 2100,
["CC_BY-SA_2.5,_2.0,_1.0"] = 2100,
["CC_BY-SA_3.0"] = 20000,
["CC_BY-SA_3.0_migrated"] = 19000,
["CC_BY-SA_4.0"] = 14000,
["CC_BY_2.5"] = 2600,
["CC_BY_3.0"] = 7000,
["CFB_Standings_End"] = 16000,
["CFB_Standings_Entry"] = 16000,
["CFB_Standings_Start"] = 16000,
["CFB_Yearly_Record_End"] = 7900,
["CFB_Yearly_Record_End/legend"] = 2900,
["CFB_Yearly_Record_Entry"] = 7900,
["CFB_Yearly_Record_Start"] = 7900,
["CFB_Yearly_Record_Subhead"] = 8000,
["CFB_Yearly_Record_Subtotal"] = 7800,
["CFB_schedule"] = 29000,
["CFB_schedule_entry"] = 22000,
["CFB_standings_end"] = 39000,
["CFB_standings_entry"] = 39000,
["CFB_standings_start"] = 39000,
["CFL_Year"] = 7400,
["CGF_year"] = 3900,
["CGNDB_URL"] = 5400,
["CHE"] = 12000,
["CHI"] = 3400,
["CHL"] = 4300,
["CHN"] = 15000,
["CN"] = 3900,
["CO2"] = 3500,
["COI"] = 14000,
["COIUL"] = 131000,
["COI_editnotice"] = 7900,
["COL"] = 5700,
["COLON"] = 14000,
["CRI"] = 2300,
["CRO"] = 6600,
["CS1_config"] = 16000,
["CSK"] = 2800,
["CSS_crop"] = 2100,
["CSS_image_crop"] = 9900,
["CUB"] = 4200,
["CURRENTDATE"] = 3600,
["CYP"] = 2200,
["CZE"] = 17000,
["Calendar"] = 2500,
["Calendar/styles.css"] = 2800,
["California/color"] = 12000,
["Call_sign_disambiguation"] = 3100,
["Campaignbox"] = 26000,
["CanProvName"] = 19000,
["CanadaByProvinceCatNav"] = 9500,
["CanadaProvinceThe"] = 4500,
["Canada_NTS_Map_Sheet"] = 2200,
["Canada_by_province_category_navigation"] = 9900,
["Canadian_English"] = 13000,
["Canadian_Parliament_links"] = 5100,
["Canadian_election_result"] = 18000,
["Canadian_election_result/gain"] = 3800,
["Canadian_election_result/hold"] = 7200,
["Canadian_election_result/source"] = 13000,
["Canadian_election_result/top"] = 19000,
["Canadian_election_result/total"] = 15000,
["Canadian_party_colour"] = 11000,
["Canadian_party_colour/colour"] = 23000,
["Canadian_party_colour/colour/default"] = 23000,
["Canadian_party_colour/name"] = 19000,
["Canadian_party_colour/name/default"] = 8400,
["Canadian_province_name"] = 19000,
["Canned_search"] = 8500,
["Cascite"] = 17000,
["Caselaw_source"] = 4800,
["Cassini-Ehess"] = 3300,
["Cast_listing"] = 30000,
["Castlist"] = 6100,
["Cat"] = 503000,
["CatAutoTOC"] = 373000,
["CatRel"] = 4100,
["CatTrack"] = 20000,
["Cat_class"] = 6100,
["Cat_explanation"] = 2000,
["Cat_handler"] = 2500,
["Cat_main"] = 149000,
["Cat_more"] = 103000,
["Cat_more_if_exists"] = 30000,
["Cat_see_also"] = 3800,
["Catalog_lookup_link"] = 61000,
["Catalog_of_Fishes"] = 9800,
["Catalogue_of_Life"] = 25000,
["Category"] = 2400,
["Category-Class"] = 14000,
["Category-inline"] = 21000,
["Category_TOC"] = 81000,
["Category_U.S._State_elections_by_year"] = 7500,
["Category_U.S._State_elections_by_year/core"] = 7500,
["Category_class"] = 25000,
["Category_described_in_year"] = 6400,
["Category_diffuse"] = 11000,
["Category_disambiguation"] = 2700,
["Category_explanation"] = 417000,
["Category_handler"] = 2740000,
["Category_if_exists"] = 130000,
["Category_ifexist"] = 4900,
["Category_importance"] = 8800,
["Category_link"] = 729000,
["Category_link/core"] = 729000,
["Category_link_if_exists"] = 81000,
["Category_link_with_count"] = 9300,
["Category_link_without_namespace"] = 808000,
["Category_links"] = 10000,
["Category_main_article"] = 222000,
["Category_more"] = 143000,
["Category_more_if_exists"] = 49000,
["Category_ordered_by_date"] = 13000,
["Category_other"] = 1130000,
["Category_pair"] = 2200,
["Category_redirect"] = 159000,
["Category_redirect/core"] = 159000,
["Category_see_also"] = 56000,
["Category_see_also/Category_pair_check"] = 56000,
["Category_see_also_if_exists"] = 96000,
["Category_see_also_if_exists_2"] = 100000,
["Category_series_navigation"] = 601000,
["Category_title"] = 2400,
["Catexp"] = 5900,
["CathEncy"] = 2300,
["Catholic"] = 3700,
["Catholic_Encyclopedia"] = 5100,
["Catmain"] = 29000,
["Catmore"] = 9800,
["Catseealso"] = 2300,
["Cbb_link"] = 10000,
["Cbignore"] = 134000,
["Cbsb_link"] = 2500,
["Cc-by-2.5"] = 2600,
["Cc-by-3.0"] = 6900,
["Cc-by-sa-2.5"] = 2000,
["Cc-by-sa-2.5,2.0,1.0"] = 2100,
["Cc-by-sa-3.0"] = 20000,
["Cc-by-sa-4.0"] = 14000,
["Cc-zero"] = 3800,
["CensusAU"] = 9100,
["Census_2016_AUS"] = 5700,
["Census_2021_AUS"] = 6200,
["Cent"] = 6900,
["Center"] = 306000,
["Centered_quote"] = 37000,
["Centralized_discussion"] = 7300,
["Centralized_discussion/core"] = 7200,
["Centralized_discussion/styles.css"] = 7300,
["Centre"] = 4300,
["Century"] = 16000,
["Century_name_from_decade"] = 2400,
["Century_name_from_decade_or_year"] = 127000,
["Century_name_from_title_decade"] = 7600,
["Century_name_from_title_year"] = 9300,
["Certification_Cite_Ref"] = 38000,
["Certification_Table_Bottom"] = 38000,
["Certification_Table_Entry"] = 39000,
["Certification_Table_Entry/Foot"] = 37000,
["Certification_Table_Entry/Foot/helper"] = 37000,
["Certification_Table_Entry/MexicanAward"] = 2400,
["Certification_Table_Entry/Region"] = 39000,
["Certification_Table_Entry/Sales"] = 37000,
["Certification_Table_Entry/Sales/AustrianPeriod"] = 2500,
["Certification_Table_Entry/Sales/BelgianPeriod"] = 2400,
["Certification_Table_Entry/Sales/DanishPeriod"] = 4500,
["Certification_Table_Entry/Sales/DanishPeriodHelper1"] = 4500,
["Certification_Table_Entry/Sales/DanishPeriodHelper2"] = 4500,
["Certification_Table_Entry/Sales/FrenchPeriod"] = 2300,
["Certification_Table_Entry/Sales/FrenchPeriodAlbum"] = 2100,
["Certification_Table_Entry/Sales/GermanPeriod"] = 4100,
["Certification_Table_Entry/Sales/ItalianHelper"] = 4500,
["Certification_Table_Entry/Sales/MexicanSales"] = 2300,
["Certification_Table_Entry/Sales/NewZealandPeriod"] = 8000,
["Certification_Table_Entry/Sales/SpanishSinglesPeriod"] = 2800,
["Certification_Table_Entry/Sales/SwedishPeriod"] = 2300,
["Certification_Table_Separator"] = 3300,
["Certification_Table_Top"] = 39000,
["Cfb_link"] = 26000,
["Chart/styles.css"] = 2000,
["Chart_bottom"] = 4600,
["Chart_top"] = 4600,
["Check_completeness_of_transclusions"] = 66000,
["Check_talk"] = 64000,
["Check_talk_wp"] = 1460000,
["Check_winner_by_scores"] = 16000,
["CheckedSockpuppet"] = 7200,
["Checked_sockpuppet"] = 18000,
["Checkedsockpuppet"] = 5300,
["Checkip"] = 12000,
["Checkuser"] = 91000,
["Checkuserblock-account"] = 48000,
["Chem"] = 6000,
["Chem/atom"] = 5900,
["Chem/link"] = 6000,
["Chem2"] = 11000,
["Chem_molar_mass"] = 22000,
["Chem_molar_mass/format"] = 22000,
["Chembox"] = 16000,
["Chembox/styles.css"] = 16000,
["Chembox_3DMet"] = 16000,
["Chembox_AllOtherNames"] = 14000,
["Chembox_AllOtherNames/format"] = 14000,
["Chembox_Appearance"] = 7400,
["Chembox_BoilingPt"] = 4200,
["Chembox_CASNo"] = 16000,
["Chembox_CASNo/format"] = 16000,
["Chembox_CalcTemperatures"] = 7600,
["Chembox_ChEBI"] = 16000,
["Chembox_ChEBI/format"] = 16000,
["Chembox_ChEMBL"] = 16000,
["Chembox_ChEMBL/format"] = 16000,
["Chembox_ChemSpiderID"] = 16000,
["Chembox_ChemSpiderID/format"] = 16000,
["Chembox_CompTox"] = 16000,
["Chembox_CompTox/format"] = 16000,
["Chembox_Datapage_check"] = 16000,
["Chembox_Density"] = 5700,
["Chembox_DrugBank"] = 16000,
["Chembox_DrugBank/format"] = 16000,
["Chembox_ECHA"] = 8300,
["Chembox_ECNumber"] = 16000,
["Chembox_ECNumber/format"] = 16000,
["Chembox_Elements"] = 15000,
["Chembox_Elements/molecular_formula"] = 22000,
["Chembox_FlashPt"] = 2100,
["Chembox_Footer"] = 16000,
["Chembox_Footer/tracking"] = 16000,
["Chembox_GHS_(set)"] = 4500,
["Chembox_Hazards"] = 13000,
["Chembox_IUPHAR_ligand"] = 16000,
["Chembox_IUPHAR_ligand/format"] = 16000,
["Chembox_Identifiers"] = 16000,
["Chembox_InChI"] = 15000,
["Chembox_InChI/format"] = 15000,
["Chembox_Indexlist"] = 16000,
["Chembox_Jmol"] = 16000,
["Chembox_Jmol/format"] = 16000,
["Chembox_KEGG"] = 16000,
["Chembox_KEGG/format"] = 16000,
["Chembox_MeltingPt"] = 6700,
["Chembox_OtherCpds"] = 2100,
["Chembox_Properties"] = 15000,
["Chembox_PubChem"] = 16000,
["Chembox_PubChem/format"] = 16000,
["Chembox_RTECS"] = 16000,
["Chembox_RTECS/format"] = 16000,
["Chembox_Related"] = 4200,
["Chembox_SMILES"] = 15000,
["Chembox_SMILES/format"] = 15000,
["Chembox_SolubilityInWater"] = 4600,
["Chembox_Structure"] = 2500,
["Chembox_UNII"] = 16000,
["Chembox_UNII/format"] = 16000,
["Chembox_headerbar"] = 16000,
["Chembox_image"] = 14000,
["Chembox_image_cell"] = 14000,
["Chembox_image_sbs"] = 14000,
["Chembox_parametercheck"] = 15000,
["Chembox_setDatarow"] = 5500,
["Chembox_setHeader"] = 5500,
["Chembox_templatePar/formatPreviewMessage"] = 16000,
["Chembox_verification"] = 6900,
["Chemspidercite"] = 11000,
["Chessgames_player"] = 3800,
["Chinese"] = 3500,
["Circa"] = 475000,
["Circular_reference"] = 3900,
["Citation"] = 415000,
["Citation/make_link"] = 8000,
["Citation/styles.css"] = 53000,
["Citation_needed"] = 637000,
["Citation_needed_span"] = 3600,
["Citation_style"] = 4400,
["Cite"] = 2200,
["Cite_AV_media"] = 83000,
["Cite_AV_media_notes"] = 34000,
["Cite_Appletons'"] = 2400,
["Cite_Australian_Dictionary_of_Biography"] = 5000,
["Cite_Box_Office_Mojo"] = 2600,
["Cite_Catholic_Encyclopedia"] = 8600,
["Cite_DCB"] = 3400,
["Cite_DGRBM"] = 2200,
["Cite_DNB"] = 20000,
["Cite_EB1911"] = 26000,
["Cite_FTP"] = 2500,
["Cite_GBIF"] = 4300,
["Cite_GNIS"] = 2400,
["Cite_Gaia_DR3"] = 3100,
["Cite_Google_Maps"] = 20000,
["Cite_Hansard"] = 2800,
["Cite_IUCN"] = 72000,
["Cite_Instagram"] = 7800,
["Cite_Jewish_Encyclopedia"] = 3200,
["Cite_LCDB"] = 2000,
["Cite_Metacritic"] = 2400,
["Cite_NIE"] = 3500,
["Cite_NSW_Parliament"] = 3300,
["Cite_NSW_SHR"] = 2700,
["Cite_NatureServe"] = 3300,
["Cite_ODNB"] = 22000,
["Cite_OED"] = 2500,
["Cite_POWO"] = 7300,
["Cite_Q"] = 18000,
["Cite_QHR"] = 3100,
["Cite_QPN"] = 4100,
["Cite_Rotten_Tomatoes"] = 3000,
["Cite_Rowlett"] = 2500,
["Cite_Russian_law"] = 7800,
["Cite_Ryan"] = 3300,
["Cite_SNL"] = 2200,
["Cite_Sports-Reference"] = 55000,
["Cite_USGov"] = 13000,
["Cite_WoRMS"] = 14000,
["Cite_act"] = 4000,
["Cite_arXiv"] = 7200,
["Cite_bcgnis"] = 3700,
["Cite_book"] = 1920000,
["Cite_certification"] = 43000,
["Cite_certification/Title"] = 40000,
["Cite_certification/URL"] = 43000,
["Cite_certification/archivedate"] = 7700,
["Cite_certification/archiveurl"] = 7700,
["Cite_cgndb"] = 5400,
["Cite_comic"] = 2100,
["Cite_conference"] = 23000,
["Cite_court"] = 7100,
["Cite_dictionary"] = 3600,
["Cite_document"] = 2100,
["Cite_encyclopedia"] = 245000,
["Cite_episode"] = 20000,
["Cite_gnis"] = 35000,
["Cite_instagram"] = 3100,
["Cite_interview"] = 11000,
["Cite_iucn"] = 71000,
["Cite_journal"] = 1190000,
["Cite_legislation_UK"] = 4300,
["Cite_magazine"] = 387000,
["Cite_map"] = 60000,
["Cite_news"] = 1950000,
["Cite_newspaper"] = 2100,
["Cite_newspaper_The_Times"] = 7200,
["Cite_patent"] = 7400,
["Cite_patent/authors"] = 6200,
["Cite_patent/core"] = 7700,
["Cite_peakbagger"] = 5300,
["Cite_podcast"] = 6400,
["Cite_press_release"] = 87000,
["Cite_report"] = 80000,
["Cite_rowlett"] = 2500,
["Cite_ship_register"] = 2000,
["Cite_simbad"] = 5700,
["Cite_sports-reference"] = 60000,
["Cite_taxon"] = 6400,
["Cite_tech_report"] = 3100,
["Cite_thesis"] = 51000,
["Cite_tweet"] = 49000,
["Cite_video"] = 13000,
["Cite_video_game"] = 3500,
["Cite_web"] = 5460000,
["Cite_wikisource"] = 7200,
["Cite_wikisource/make_link"] = 65000,
["Citeweb"] = 4300,
["Civil_navigation"] = 2100,
["Cjersey"] = 3100,
["Cl"] = 223000,
["Clade"] = 10000,
["Clade/styles.css"] = 10000,
["Clarification_needed"] = 2600,
["Clarify"] = 45000,
["Class"] = 39000,
["Class/colour"] = 19000,
["Class/icon"] = 21000,
["Class_mask"] = 467000,
["Classicon"] = 5300,
["Clc"] = 7300,
["Cleanup"] = 8300,
["Cleanup_reorganize"] = 2300,
["Cleanup_rewrite"] = 6900,
["Clear"] = 3780000,
["Clear_left"] = 23000,
["Clear_right"] = 2800,
["Clerk_Request"] = 2600,
["Clerk_note"] = 11000,
["Clerknote"] = 8700,
["Clickable_button"] = 1850000,
["Clickable_button_2"] = 226000,
["Closed_access"] = 5700,
["Closed_peer_review_page"] = 3300,
["Closed_rfc_bottom"] = 2300,
["Closed_rfc_top"] = 2300,
["Clr"] = 3000,
["Club_players_category"] = 9500,
["Clubplayerscat"] = 9500,
["Cmbox"] = 539000,
["Cn"] = 111000,
["Cnote2"] = 2900,
["Cnote2_Begin"] = 2900,
["Cnote2_End"] = 2900,
["Coat_of_arms"] = 2500,
["Cob"] = 15000,
["Code"] = 117000,
["Cof_family"] = 4600,
["Cof_genus"] = 5400,
["Col-1-of-2"] = 2400,
["Col-2"] = 183000,
["Col-2-of-2"] = 2300,
["Col-3"] = 11000,
["Col-4"] = 3200,
["Col-begin"] = 227000,
["Col-begin/styles.css"] = 227000,
["Col-break"] = 225000,
["Col-end"] = 227000,
["Col-float"] = 3300,
["Col-float-break"] = 3200,
["Col-float-end"] = 3300,
["Col-float/styles.css"] = 3300,
["Col-start"] = 9800,
["Col_div"] = 2200,
["Colbegin"] = 25000,
["Colend"] = 27000,
["Collapse"] = 8900,
["Collapse_AI_top"] = 2400,
["Collapse_AI_top/styles.css"] = 2400,
["Collapse_bottom"] = 57000,
["Collapse_top"] = 57000,
["Collapse_top/styles.css"] = 57000,
["Collapsebottom"] = 4100,
["Collapsed_infobox_section_begin"] = 9500,
["Collapsed_infobox_section_begin/cont"] = 9500,
["Collapsed_infobox_section_begin/styles.css"] = 9500,
["Collapsed_infobox_section_end"] = 9500,
["Collapsetop"] = 4100,
["Collapsible_list"] = 68000,
["Collapsible_option"] = 153000,
["Colledge:_Ships_RN"] = 3000,
["College"] = 12000,
["CollegePrimaryHeader"] = 8300,
["CollegePrimaryStyle"] = 111000,
["CollegeSecondaryStyle"] = 11000,
["College_Athlete_Recruit_End"] = 2800,
["College_Athlete_Recruit_Entry"] = 3000,
["College_Athlete_Recruit_Start"] = 2900,
["College_athlete_recruit_end"] = 5000,
["College_athlete_recruit_entry"] = 5200,
["College_athlete_recruit_start"] = 5200,
["College_color_list"] = 4400,
["College_sports_team_link"] = 31000,
["Colon"] = 20000,
["Color"] = 508000,
["Color/styles.css"] = 508000,
["Color_box"] = 87000,
["Colorbox"] = 2600,
["Colorbull"] = 4500,
["Colored_link"] = 108000,
["Coloredlink"] = 4000,
["Colors"] = 3700,
["Colour"] = 5600,
["Colour_box"] = 2500,
["Coloured_link"] = 12000,
["Column"] = 8500,
["Column/styles.css"] = 8600,
["Columns-end"] = 8200,
["Columns-list"] = 126000,
["Columns-start"] = 8200,
["Columns_list"] = 100000,
["Comic_Book_DB"] = 3500,
["Comicbookdb"] = 3400,
["Comics-replaceability"] = 2700,
["Comics_infobox_sec/formcat"] = 3400,
["Comics_infobox_sec/genre"] = 4200,
["Comics_infobox_sec/genrecat"] = 3800,
["Comics_infobox_sec/styles.css"] = 8100,
["Comma-separated_entries"] = 444000,
["Comma-separated_list"] = 3800,
["Comma-separated_list/styles.css"] = 3800,
["Comma_separated_entries"] = 439000,
["Comment"] = 7800,
["Committed_identity"] = 3200,
["Committed_identity/styles.css"] = 3200,
["Commons"] = 73000,
["Commons-inline"] = 26000,
["Commons_cat"] = 45000,
["Commons_category"] = 908000,
["Commons_category-inline"] = 179000,
["Commons_category_inline"] = 5800,
["Commonscat"] = 59000,
["Commonscat-inline"] = 14000,
["Commonscat_inline"] = 2200,
["Commonscatinline"] = 7000,
["Compact_TOC"] = 7300,
["Compact_ToC"] = 3100,
["Compose_molecular_formula"] = 2400,
["Composition_bar"] = 13000,
["Confirmed"] = 20000,
["Confused"] = 3300,
["Confusing"] = 2400,
["CongBio"] = 9400,
["CongLinks"] = 4800,
["Connected_contributor"] = 22000,
["Connected_contributor_(paid)"] = 10000,
["Constellation_navbox"] = 10000,
["Container"] = 14000,
["Container_cat"] = 9100,
["Container_category"] = 93000,
["Containercat"] = 2800,
["Contains_special_characters"] = 5200,
["Contains_special_characters/core"] = 5200,
["Contains_special_characters/styles.css"] = 5200,
["Content_category"] = 7900,
["Contentious_topics/Additional_restrictions.json"] = 21000,
["Contentious_topics/Arab-Israeli_editnotice"] = 7000,
["Contentious_topics/Arab-Israeli_talk_notice"] = 6100,
["Contentious_topics/Category_database.json"] = 21000,
["Contentious_topics/Restrictions_definition.json"] = 21000,
["Contentious_topics/Standard_set.json"] = 21000,
["Contentious_topics/list"] = 30000,
["Contentious_topics/page_restriction_editnotice_base"] = 7500,
["Contentious_topics/page_restriction_talk_notice"] = 2700,
["Contentious_topics/talk_notice"] = 21000,
["Context"] = 2600,
["Continent2continental"] = 46000,
["Continent_adjective_to_noun"] = 10000,
["Continental2continent"] = 23000,
["Controversial"] = 3000,
["Convert"] = 1420000,
["Convert_abbreviated"] = 177000,
["Convinfobox"] = 328000,
["Coord"] = 1400000,
["Coord_missing"] = 71000,
["Coord_missing/CheckCat"] = 70000,
["Coords"] = 6600,
["Copied"] = 22000,
["Copy_edit"] = 2000,
["Copy_to_Commons"] = 2700,
["Copy_to_Wikimedia_Commons"] = 86000,
["Copy_to_Wikimedia_Commons_in"] = 4300,
["Copyvios"] = 3500,
["Cospar"] = 2800,
["Cot"] = 14000,
["Count"] = 1100000,
["Country2continent"] = 125000,
["Country2continental"] = 32000,
["Country2nationality"] = 35000,
["Country2parent"] = 36000,
["Country2parent/core"] = 36000,
["CountryPrefixThe"] = 66000,
["Country_abbreviation"] = 83000,
["Country_alias"] = 17000,
["Country_at_games_navbox"] = 5900,
["Country_at_games_navbox/below"] = 5900,
["Country_data"] = 12000,
["Country_data_AFG"] = 2700,
["Country_data_ALB"] = 7300,
["Country_data_ALG"] = 11000,
["Country_data_AND"] = 3700,
["Country_data_ANG"] = 4500,
["Country_data_ARG"] = 53000,
["Country_data_ARM"] = 8500,
["Country_data_AUS"] = 89000,
["Country_data_AUT"] = 53000,
["Country_data_AZE"] = 11000,
["Country_data_Afghanistan"] = 22000,
["Country_data_Alabama"] = 2700,
["Country_data_Alaska"] = 2200,
["Country_data_Albania"] = 35000,
["Country_data_Alberta"] = 3200,
["Country_data_Algeria"] = 47000,
["Country_data_American_Samoa"] = 2900,
["Country_data_Andorra"] = 9400,
["Country_data_Angola"] = 21000,
["Country_data_Anguilla"] = 2400,
["Country_data_Antigua_and_Barbuda"] = 6500,
["Country_data_Apulia"] = 7900,
["Country_data_Argentina"] = 152000,
["Country_data_Arizona"] = 2500,
["Country_data_Arkansas"] = 2800,
["Country_data_Armenia"] = 46000,
["Country_data_Aruba"] = 4100,
["Country_data_Australia"] = 276000,
["Country_data_Austria"] = 145000,
["Country_data_Austria-Hungary"] = 2300,
["Country_data_Azerbaijan"] = 51000,
["Country_data_BAH"] = 4700,
["Country_data_BAN"] = 4500,
["Country_data_BAR"] = 2700,
["Country_data_BDI"] = 2100,
["Country_data_BEL"] = 61000,
["Country_data_BEN"] = 2100,
["Country_data_BER"] = 2500,
["Country_data_BFA"] = 2100,
["Country_data_BHR"] = 5900,
["Country_data_BIH"] = 14000,
["Country_data_BLR"] = 26000,
["Country_data_BOL"] = 6700,
["Country_data_BOT"] = 3200,
["Country_data_BRA"] = 65000,
["Country_data_BUL"] = 32000,
["Country_data_Bahamas"] = 11000,
["Country_data_Bahrain"] = 22000,
["Country_data_Bangladesh"] = 35000,
["Country_data_Barbados"] = 8800,
["Country_data_Belarus"] = 90000,
["Country_data_Belgium"] = 157000,
["Country_data_Belize"] = 5300,
["Country_data_Benin"] = 8200,
["Country_data_Bermuda"] = 6400,
["Country_data_Bhutan"] = 5000,
["Country_data_Bolivia"] = 24000,
["Country_data_Bosnia_and_Herzegovina"] = 53000,
["Country_data_Botswana"] = 10000,
["Country_data_Brazil"] = 171000,
["Country_data_British_Columbia"] = 3700,
["Country_data_British_Empire"] = 2100,
["Country_data_British_Raj"] = 2500,
["Country_data_British_Virgin_Islands"] = 3400,
["Country_data_Brunei"] = 7000,
["Country_data_Bulgaria"] = 102000,
["Country_data_Burkina_Faso"] = 11000,
["Country_data_Burma"] = 2300,
["Country_data_Burundi"] = 6900,
["Country_data_CAM"] = 2600,
["Country_data_CAN"] = 70000,
["Country_data_CGO"] = 2500,
["Country_data_CHE"] = 5900,
["Country_data_CHI"] = 20000,
["Country_data_CHL"] = 2400,
["Country_data_CHN"] = 50000,
["Country_data_CIV"] = 8700,
["Country_data_CMR"] = 8900,
["Country_data_COD"] = 3600,
["Country_data_COL"] = 29000,
["Country_data_CPV"] = 2400,
["Country_data_CRC"] = 7100,
["Country_data_CRO"] = 38000,
["Country_data_CUB"] = 13000,
["Country_data_CYP"] = 11000,
["Country_data_CZE"] = 55000,
["Country_data_California"] = 6300,
["Country_data_Cambodia"] = 10000,
["Country_data_Cameroon"] = 32000,
["Country_data_Canada"] = 262000,
["Country_data_Cape_Verde"] = 7200,
["Country_data_Castile_and_León"] = 2000,
["Country_data_Catalonia"] = 3400,
["Country_data_Cayman_Islands"] = 4600,
["Country_data_Central_African_Republic"] = 5200,
["Country_data_Chad"] = 5500,
["Country_data_Chile"] = 91000,
["Country_data_China"] = 150000,
["Country_data_Chinese_Taipei"] = 39000,
["Country_data_Colombia"] = 96000,
["Country_data_Colorado"] = 5100,
["Country_data_Commonwealth_of_Independent_States"] = 2100,
["Country_data_Comoros"] = 4800,
["Country_data_Confederate_States_of_America"] = 3100,
["Country_data_Connecticut"] = 3500,
["Country_data_Cook_Islands"] = 3900,
["Country_data_Costa_Rica"] = 33000,
["Country_data_Croatia"] = 106000,
["Country_data_Cuba"] = 46000,
["Country_data_Curaçao"] = 4500,
["Country_data_Cyprus"] = 46000,
["Country_data_Czech_Republic"] = 153000,
["Country_data_Czechoslovakia"] = 34000,
["Country_data_DEN"] = 40000,
["Country_data_DEU"] = 11000,
["Country_data_DNK"] = 4500,
["Country_data_DOM"] = 8500,
["Country_data_DRC"] = 2100,
["Country_data_Delaware"] = 2700,
["Country_data_Democratic_Republic_of_the_Congo"] = 23000,
["Country_data_Denmark"] = 121000,
["Country_data_Djibouti"] = 5000,
["Country_data_Dominica"] = 4300,
["Country_data_Dominican_Republic"] = 35000,
["Country_data_ECU"] = 13000,
["Country_data_EGY"] = 16000,
["Country_data_ENG"] = 52000,
["Country_data_ESA"] = 2500,
["Country_data_ESP"] = 85000,
["Country_data_EST"] = 17000,
["Country_data_ETH"] = 4600,
["Country_data_EU"] = 2800,
["Country_data_East_Germany"] = 28000,
["Country_data_Ecuador"] = 48000,
["Country_data_Egypt"] = 66000,
["Country_data_El_Salvador"] = 23000,
["Country_data_Empire_of_Japan"] = 4400,
["Country_data_England"] = 163000,
["Country_data_Equatorial_Guinea"] = 5600,
["Country_data_Eritrea"] = 5600,
["Country_data_Estonia"] = 68000,
["Country_data_Eswatini"] = 5100,
["Country_data_Ethiopia"] = 21000,
["Country_data_Europe"] = 2800,
["Country_data_European_Union"] = 8100,
["Country_data_FIJ"] = 4600,
["Country_data_FIN"] = 41000,
["Country_data_FRA"] = 116000,
["Country_data_FRG"] = 18000,
["Country_data_FRO"] = 2200,
["Country_data_FR_Yugoslavia"] = 4400,
["Country_data_Faroe_Islands"] = 5800,
["Country_data_Federated_States_of_Micronesia"] = 2700,
["Country_data_Fiji"] = 21000,
["Country_data_Finland"] = 114000,
["Country_data_Florida"] = 5800,
["Country_data_France"] = 335000,
["Country_data_French_Polynesia"] = 3900,
["Country_data_GAB"] = 2600,
["Country_data_GAM"] = 2300,
["Country_data_GBR"] = 68000,
["Country_data_GDR"] = 11000,
["Country_data_GEO"] = 16000,
["Country_data_GER"] = 96000,
["Country_data_GHA"] = 10000,
["Country_data_GIB"] = 2200,
["Country_data_GRE"] = 30000,
["Country_data_GUA"] = 5400,
["Country_data_GUI"] = 3400,
["Country_data_GUY"] = 2600,
["Country_data_Gabon"] = 8200,
["Country_data_Gambia"] = 7700,
["Country_data_Georgia"] = 8700,
["Country_data_Georgia_(U.S._state)"] = 3200,
["Country_data_Georgia_(country)"] = 54000,
["Country_data_German_Empire"] = 5700,
["Country_data_Germany"] = 293000,
["Country_data_Ghana"] = 46000,
["Country_data_Gibraltar"] = 5300,
["Country_data_Great_Britain"] = 128000,
["Country_data_Greece"] = 106000,
["Country_data_Greenland"] = 2800,
["Country_data_Grenada"] = 5700,
["Country_data_Guadeloupe"] = 2900,
["Country_data_Guam"] = 4700,
["Country_data_Guatemala"] = 22000,
["Country_data_Guinea"] = 9500,
["Country_data_Guinea-Bissau"] = 5500,
["Country_data_Guyana"] = 7800,
["Country_data_HAI"] = 3400,
["Country_data_HKG"] = 15000,
["Country_data_HON"] = 4400,
["Country_data_HUN"] = 45000,
["Country_data_Haiti"] = 9900,
["Country_data_Hawaii"] = 2200,
["Country_data_Honduras"] = 21000,
["Country_data_Hong_Kong"] = 51000,
["Country_data_Hungary"] = 115000,
["Country_data_IDN"] = 5800,
["Country_data_INA"] = 12000,
["Country_data_IND"] = 34000,
["Country_data_IRE"] = 13000,
["Country_data_IRI"] = 6700,
["Country_data_IRL"] = 24000,
["Country_data_IRN"] = 7400,
["Country_data_IRQ"] = 4900,
["Country_data_ISL"] = 9300,
["Country_data_ISR"] = 23000,
["Country_data_ITA"] = 103000,
["Country_data_Iceland"] = 46000,
["Country_data_Idaho"] = 2200,
["Country_data_Illinois"] = 4600,
["Country_data_India"] = 259000,
["Country_data_Indiana"] = 3400,
["Country_data_Indonesia"] = 72000,
["Country_data_Iowa"] = 2400,
["Country_data_Iran"] = 160000,
["Country_data_Iraq"] = 23000,
["Country_data_Ireland"] = 67000,
["Country_data_Isle_of_Man"] = 2900,
["Country_data_Israel"] = 94000,
["Country_data_Italy"] = 288000,
["Country_data_Ivory_Coast"] = 33000,
["Country_data_JAM"] = 12000,
["Country_data_JAP"] = 2300,
["Country_data_JOR"] = 4900,
["Country_data_JP"] = 8800,
["Country_data_JPN"] = 70000,
["Country_data_Jamaica"] = 45000,
["Country_data_Japan"] = 265000,
["Country_data_Jersey"] = 2700,
["Country_data_Jordan"] = 22000,
["Country_data_KAZ"] = 24000,
["Country_data_KEN"] = 10000,
["Country_data_KGZ"] = 4600,
["Country_data_KOR"] = 36000,
["Country_data_KOS"] = 3200,
["Country_data_KSA"] = 7600,
["Country_data_KUW"] = 4700,
["Country_data_Kansas"] = 2100,
["Country_data_Kazakhstan"] = 68000,
["Country_data_Kentucky"] = 2100,
["Country_data_Kenya"] = 35000,
["Country_data_Kingdom_of_France"] = 2200,
["Country_data_Kingdom_of_Great_Britain"] = 4600,
["Country_data_Kingdom_of_Italy"] = 4900,
["Country_data_Kiribati"] = 2600,
["Country_data_Kosovo"] = 11000,
["Country_data_Kuwait"] = 21000,
["Country_data_Kyrgyzstan"] = 11000,
["Country_data_LAO"] = 2200,
["Country_data_LAT"] = 17000,
["Country_data_LBN"] = 2900,
["Country_data_LBR"] = 2100,
["Country_data_LIB"] = 2600,
["Country_data_LIE"] = 3800,
["Country_data_LIT"] = 3700,
["Country_data_LTU"] = 15000,
["Country_data_LUX"] = 12000,
["Country_data_LVA"] = 3100,
["Country_data_Laos"] = 8100,
["Country_data_Latvia"] = 55000,
["Country_data_Lebanon"] = 24000,
["Country_data_Lesotho"] = 5500,
["Country_data_Liberia"] = 8000,
["Country_data_Libya"] = 9200,
["Country_data_Liechtenstein"] = 9000,
["Country_data_Lithuania"] = 54000,
["Country_data_Louisiana"] = 2300,
["Country_data_Luxembourg"] = 48000,
["Country_data_MAC"] = 3100,
["Country_data_MAD"] = 2400,
["Country_data_MAR"] = 15000,
["Country_data_MAS"] = 13000,
["Country_data_MDA"] = 9000,
["Country_data_MDV"] = 2000,
["Country_data_MEX"] = 36000,
["Country_data_MGL"] = 3600,
["Country_data_MKD"] = 8600,
["Country_data_MLI"] = 4700,
["Country_data_MLT"] = 6500,
["Country_data_MNE"] = 8700,
["Country_data_MON"] = 4700,
["Country_data_MOZ"] = 2700,
["Country_data_MRI"] = 2300,
["Country_data_MYA"] = 3400,
["Country_data_MYS"] = 4300,
["Country_data_Macau"] = 7000,
["Country_data_Macedonia"] = 4600,
["Country_data_Madagascar"] = 9700,
["Country_data_Malawi"] = 6200,
["Country_data_Malaysia"] = 72000,
["Country_data_Maldives"] = 6900,
["Country_data_Mali"] = 21000,
["Country_data_Malta"] = 32000,
["Country_data_Manitoba"] = 3000,
["Country_data_Marshall_Islands"] = 3400,
["Country_data_Martinique"] = 2800,
["Country_data_Maryland"] = 3300,
["Country_data_Massachusetts"] = 2600,
["Country_data_Mauritania"] = 6000,
["Country_data_Mauritius"] = 8500,
["Country_data_Mexico"] = 115000,
["Country_data_Michigan"] = 3900,
["Country_data_Minas_Gerais"] = 2100,
["Country_data_Minnesota"] = 3700,
["Country_data_Missouri"] = 2500,
["Country_data_Moldova"] = 34000,
["Country_data_Monaco"] = 12000,
["Country_data_Mongolia"] = 12000,
["Country_data_Montana"] = 2400,
["Country_data_Montenegro"] = 33000,
["Country_data_Montserrat"] = 2500,
["Country_data_Morocco"] = 51000,
["Country_data_Mozambique"] = 8000,
["Country_data_Myanmar"] = 23000,
["Country_data_NAM"] = 4000,
["Country_data_NED"] = 73000,
["Country_data_NEP"] = 3400,
["Country_data_NGA"] = 8800,
["Country_data_NGR"] = 9500,
["Country_data_NIR"] = 11000,
["Country_data_NLD"] = 7500,
["Country_data_NOR"] = 35000,
["Country_data_NZ"] = 3700,
["Country_data_NZL"] = 39000,
["Country_data_Namibia"] = 11000,
["Country_data_Nauru"] = 2600,
["Country_data_Nazi_Germany"] = 10000,
["Country_data_Nepal"] = 32000,
["Country_data_Netherlands"] = 262000,
["Country_data_Netherlands_Antilles"] = 2400,
["Country_data_Nevada"] = 2100,
["Country_data_New_Brunswick"] = 2600,
["Country_data_New_Caledonia"] = 3300,
["Country_data_New_Hampshire"] = 2100,
["Country_data_New_Jersey"] = 4200,
["Country_data_New_South_Wales"] = 6400,
["Country_data_New_York"] = 4300,
["Country_data_New_York_(state)"] = 6800,
["Country_data_New_Zealand"] = 119000,
["Country_data_Newfoundland_and_Labrador"] = 2900,
["Country_data_Nicaragua"] = 9000,
["Country_data_Niger"] = 6300,
["Country_data_Nigeria"] = 67000,
["Country_data_North_Carolina"] = 3600,
["Country_data_North_Korea"] = 23000,
["Country_data_North_Macedonia"] = 34000,
["Country_data_Northern_Ireland"] = 27000,
["Country_data_Northern_Mariana_Islands"] = 2900,
["Country_data_Norway"] = 117000,
["Country_data_Nova_Scotia"] = 2900,
["Country_data_OMA"] = 3300,
["Country_data_Ohio"] = 6000,
["Country_data_Oklahoma"] = 2500,
["Country_data_Oman"] = 10000,
["Country_data_Ontario"] = 3900,
["Country_data_Ottoman_Empire"] = 3200,
["Country_data_PAK"] = 9100,
["Country_data_PAN"] = 6000,
["Country_data_PAR"] = 11000,
["Country_data_PER"] = 14000,
["Country_data_PHI"] = 13000,
["Country_data_PLE"] = 2100,
["Country_data_PNG"] = 3200,
["Country_data_POL"] = 61000,
["Country_data_POR"] = 38000,
["Country_data_PRK"] = 5000,
["Country_data_PRT"] = 3600,
["Country_data_PUR"] = 8200,
["Country_data_Pakistan"] = 52000,
["Country_data_Palau"] = 2700,
["Country_data_Palestine"] = 7800,
["Country_data_Panama"] = 30000,
["Country_data_Papua_New_Guinea"] = 8500,
["Country_data_Paraguay"] = 45000,
["Country_data_Pennsylvania"] = 3600,
["Country_data_Peru"] = 65000,
["Country_data_Philippines"] = 69000,
["Country_data_Poland"] = 242000,
["Country_data_Portugal"] = 117000,
["Country_data_Prussia"] = 2800,
["Country_data_Puerto_Rico"] = 34000,
["Country_data_QAT"] = 9700,
["Country_data_Qatar"] = 32000,
["Country_data_Quebec"] = 4500,
["Country_data_Queensland"] = 2400,
["Country_data_ROM"] = 15000,
["Country_data_ROU"] = 32000,
["Country_data_RSA"] = 37000,
["Country_data_RUS"] = 69000,
["Country_data_RWA"] = 2500,
["Country_data_Republic_of_China"] = 4600,
["Country_data_Republic_of_Ireland"] = 55000,
["Country_data_Republic_of_the_Congo"] = 8400,
["Country_data_Romania"] = 114000,
["Country_data_Russia"] = 255000,
["Country_data_Russian_Empire"] = 5600,
["Country_data_Rwanda"] = 8600,
["Country_data_SAM"] = 3700,
["Country_data_SCG"] = 3000,
["Country_data_SCO"] = 29000,
["Country_data_SEN"] = 8600,
["Country_data_SER"] = 3700,
["Country_data_SGP"] = 4600,
["Country_data_SIN"] = 7400,
["Country_data_SLE"] = 2100,
["Country_data_SLO"] = 22000,
["Country_data_SLV"] = 3300,
["Country_data_SMR"] = 3600,
["Country_data_SPA"] = 5600,
["Country_data_SRB"] = 31000,
["Country_data_SRI"] = 5300,
["Country_data_SUI"] = 51000,
["Country_data_SUR"] = 2300,
["Country_data_SVK"] = 33000,
["Country_data_SVN"] = 7400,
["Country_data_SWE"] = 66000,
["Country_data_SWI"] = 5100,
["Country_data_SYR"] = 4000,
["Country_data_Saint_Kitts_and_Nevis"] = 5000,
["Country_data_Saint_Lucia"] = 5300,
["Country_data_Saint_Vincent_and_the_Grenadines"] = 5000,
["Country_data_Samoa"] = 8100,
["Country_data_San_Marino"] = 9700,
["Country_data_Saskatchewan"] = 4000,
["Country_data_Saudi_Arabia"] = 37000,
["Country_data_Scotland"] = 102000,
["Country_data_Senegal"] = 31000,
["Country_data_Serbia"] = 105000,
["Country_data_Serbia_and_Montenegro"] = 5400,
["Country_data_Seychelles"] = 5800,
["Country_data_Sierra_Leone"] = 7700,
["Country_data_Singapore"] = 50000,
["Country_data_Slovakia"] = 96000,
["Country_data_Slovenia"] = 91000,
["Country_data_Solomon_Islands"] = 4700,
["Country_data_Somalia"] = 6600,
["Country_data_South_Africa"] = 121000,
["Country_data_South_Australia"] = 2300,
["Country_data_South_Carolina"] = 3100,
["Country_data_South_Korea"] = 116000,
["Country_data_South_Sudan"] = 4900,
["Country_data_Soviet_Union"] = 77000,
["Country_data_Spain"] = 277000,
["Country_data_Sri_Lanka"] = 36000,
["Country_data_Sudan"] = 8700,
["Country_data_Suriname"] = 6800,
["Country_data_Sweden"] = 167000,
["Country_data_Switzerland"] = 150000,
["Country_data_Syria"] = 22000,
["Country_data_São_Tomé_and_Príncipe"] = 3400,
["Country_data_TAN"] = 3500,
["Country_data_TCH"] = 12000,
["Country_data_THA"] = 25000,
["Country_data_TJK"] = 3000,
["Country_data_TKM"] = 3100,
["Country_data_TOG"] = 2100,
["Country_data_TON"] = 2000,
["Country_data_TPE"] = 19000,
["Country_data_TRI"] = 5100,
["Country_data_TTO"] = 2200,
["Country_data_TUN"] = 12000,
["Country_data_TUR"] = 34000,
["Country_data_TWN"] = 2200,
["Country_data_Taiwan"] = 27000,
["Country_data_Tajikistan"] = 9800,
["Country_data_Tanzania"] = 22000,
["Country_data_Tennessee"] = 2300,
["Country_data_Texas"] = 5800,
["Country_data_Thailand"] = 96000,
["Country_data_Timor-Leste"] = 5100,
["Country_data_Togo"] = 7700,
["Country_data_Tonga"] = 6800,
["Country_data_Trinidad_and_Tobago"] = 24000,
["Country_data_Tunisia"] = 46000,
["Country_data_Turkey"] = 140000,
["Country_data_Turkmenistan"] = 8400,
["Country_data_Turks_and_Caicos_Islands"] = 2800,
["Country_data_Tuvalu"] = 2600,
["Country_data_U.S."] = 2000,
["Country_data_U.S._Virgin_Islands"] = 4900,
["Country_data_UAE"] = 11000,
["Country_data_UGA"] = 5300,
["Country_data_UK"] = 19000,
["Country_data_UKGBI"] = 3500,
["Country_data_UKR"] = 45000,
["Country_data_URS"] = 19000,
["Country_data_URU"] = 16000,
["Country_data_US"] = 5200,
["Country_data_USA"] = 152000,
["Country_data_USSR"] = 5300,
["Country_data_UZB"] = 14000,
["Country_data_Uganda"] = 22000,
["Country_data_Ukraine"] = 119000,
["Country_data_United_Arab_Emirates"] = 38000,
["Country_data_United_Kingdom"] = 158000,
["Country_data_United_Kingdom_of_Great_Britain_and_Ireland"] = 4900,
["Country_data_United_Nations"] = 4400,
["Country_data_United_States"] = 440000,
["Country_data_United_States_of_America"] = 4500,
["Country_data_Uruguay"] = 52000,
["Country_data_Uzbekistan"] = 36000,
["Country_data_VEN"] = 18000,
["Country_data_VIE"] = 7300,
["Country_data_Vanuatu"] = 5100,
["Country_data_Vatican_City"] = 3000,
["Country_data_Venezuela"] = 66000,
["Country_data_Victoria"] = 2400,
["Country_data_Vietnam"] = 47000,
["Country_data_Virginia"] = 3100,
["Country_data_WAL"] = 19000,
["Country_data_Wales"] = 68000,
["Country_data_Washington"] = 2700,
["Country_data_Washington,_D.C."] = 2300,
["Country_data_Washington_(state)"] = 3400,
["Country_data_West_Germany"] = 52000,
["Country_data_West_Indies"] = 2900,
["Country_data_Wisconsin"] = 5700,
["Country_data_Wyoming"] = 2100,
["Country_data_YUG"] = 11000,
["Country_data_Yemen"] = 8100,
["Country_data_Yugoslavia"] = 34000,
["Country_data_ZAF"] = 5400,
["Country_data_ZAM"] = 3900,
["Country_data_ZIM"] = 9200,
["Country_data_Zambia"] = 11000,
["Country_data_Zimbabwe"] = 32000,
["Country_data_none"] = 2100,
["Country_flagbio"] = 41000,
["Country_in_the_Eurovision_Song_Contest"] = 2900,
["Country_name"] = 59000,
["Country_prefix_the"] = 176000,
["Country_showdata"] = 7000,
["Country_topics"] = 25000,
["County"] = 7000,
["County_(judet)_of_Romania"] = 3300,
["Course_assignment"] = 4200,
["Course_details"] = 8700,
["Course_instructor"] = 3200,
["Cquote"] = 35000,
["Cr"] = 5100,
["Cr-rt"] = 2500,
["Create_taxonomy/link"] = 151000,
["Creative_Commons_text_attribution_notice"] = 7200,
["Cref2"] = 2900,
["Cricinfo"] = 24000,
["Cricket_squad2_player"] = 2700,
["Cricketarchive"] = 3000,
["Croatian_Census_2021"] = 4200,
["Cross"] = 4200,
["Crossreference"] = 2600,
["Crossreference/styles.css"] = 2600,
["Cs1_config"] = 14000,
["Cslist"] = 3700,
["Csv"] = 77000,
["Currency"] = 5600,
["Current_events"] = 9500,
["Current_events/styles.css"] = 9500,
["Current_leader"] = 5400,
["Currentdate"] = 24000,
["Cvt"] = 176000,
["Cycling_Archives"] = 4300,
["Cycling_data_DAT"] = 2100,
["Cycling_data_LTD"] = 2500,
["Cycling_data_MOV_men"] = 2300,
["Cycling_data_SOQ"] = 2200,
["Cycling_data_TVL"] = 2400,
["Cycling_data_UEX"] = 2300,
["Cycling_team_link"] = 14000,
["Module:CFB_schedule"] = 29000,
["Module:CS1_identifiers"] = 507000,
["Module:Calendar"] = 2000,
["Module:Calendrical_Calculations"] = 2700,
["Module:CallAssert"] = 124000,
["Module:Canada_NTS"] = 2200,
["Module:Canada_NTS/data"] = 2200,
["Module:Canada_by_province_category_navigation"] = 9900,
["Module:Catalog_lookup_link"] = 63000,
["Module:Category_described_in_year"] = 6400,
["Module:Category_described_in_year/config"] = 6400,
["Module:Category_disambiguation"] = 2700,
["Module:Category_handler"] = 5010000,
["Module:Category_handler/blacklist"] = 5010000,
["Module:Category_handler/config"] = 5010000,
["Module:Category_handler/data"] = 5010000,
["Module:Category_handler/shared"] = 5010000,
["Module:Category_main_article"] = 222000,
["Module:Category_more_if_exists"] = 49000,
["Module:Category_pair"] = 7100,
["Module:Category_see_also"] = 56000,
["Module:Category_series_navigation"] = 601000,
["Module:Category_series_navigation/styles.css"] = 600000,
["Module:Celestial_object_quadrangle"] = 2100,
["Module:Chart"] = 2900,
["Module:Chart/Default_colors"] = 2900,
["Module:Check_DYK_hook"] = 127000,
["Module:Check_blp_parameter"] = 2970000,
["Module:Check_for_conflicting_parameters"] = 4640000,
["Module:Check_for_deprecated_parameters"] = 786000,
["Module:Check_for_unknown_parameters"] = 23600000,
["Module:Check_height"] = 153000,
["Module:Check_isxn"] = 16000,
["Module:Check_winner_by_scores"] = 16000,
["Module:Checkuser"] = 91000,
["Module:Chem2"] = 11000,
["Module:Chem2/styles.css"] = 11000,
["Module:Citation/CS1"] = 6590000,
["Module:Citation/CS1/COinS"] = 6590000,
["Module:Citation/CS1/Configuration"] = 6710000,
["Module:Citation/CS1/Date_validation"] = 6590000,
["Module:Citation/CS1/Identifiers"] = 6710000,
["Module:Citation/CS1/Suggestions"] = 26000,
["Module:Citation/CS1/Utilities"] = 6710000,
["Module:Citation/CS1/Whitelist"] = 6590000,
["Module:Citation/CS1/styles.css"] = 6710000,
["Module:Citation_mode"] = 49000,
["Module:Cite"] = 53000,
["Module:Cite/config"] = 71000,
["Module:Cite_IUCN"] = 72000,
["Module:Cite_Q"] = 18000,
["Module:Cite_Q/config"] = 18000,
["Module:Cite_taxon"] = 57000,
["Module:Cite_tweet"] = 49000,
["Module:Clade"] = 10000,
["Module:Class"] = 61000,
["Module:Class/definition.json"] = 61000,
["Module:Class/styles.css"] = 39000,
["Module:Class_mask"] = 467000,
["Module:Clickable_button"] = 1850000,
["Module:Collapsible_list"] = 70000,
["Module:College_color"] = 138000,
["Module:College_color/data"] = 138000,
["Module:Color_contrast"] = 580000,
["Module:Color_contrast/colors"] = 582000,
["Module:Comma-separated_list"] = 3800,
["Module:Commons_link"] = 1180000,
["Module:Compact_list"] = 2000,
["Module:Complex_date"] = 49000,
["Module:Conservation_status"] = 90000,
["Module:Contentious_topics/talk_notice"] = 21000,
["Module:Convert"] = 1530000,
["Module:Convert/data"] = 1530000,
["Module:Convert/helper"] = 13000,
["Module:Convert/text"] = 1530000,
["Module:Convert/wikidata"] = 2700,
["Module:Convert/wikidata/data"] = 2700,
["Module:ConvertIB"] = 821000,
["Module:ConvertIB/data"] = 275000,
["Module:ConvertNumeric"] = 21000,
["Module:Convert_character_width"] = 3100,
["Module:Convert_character_width/data"] = 3100,
["Module:Coordinates"] = 1410000,
["Module:Coordinates/styles.css"] = 1410000,
["Module:Copied"] = 43000,
["Module:Country2nationality"] = 97000,
["Module:CountryAdjectiveDemonym"] = 117000,
["Module:CountryAdjectiveDemonym/Adjectives"] = 117000,
["Module:CountryAdjectiveDemonym/Demonyms"] = 117000,
["Module:CountryAdjectiveDemonym/The"] = 117000,
["Module:CountryData"] = 478000,
["Module:CountryData/cacheA"] = 166000,
["Module:CountryData/cacheB"] = 82000,
["Module:CountryData/cacheC"] = 59000,
["Module:CountryData/cacheD"] = 57000,
["Module:CountryData/cacheE"] = 38000,
["Module:CountryData/cacheF"] = 27000,
["Module:CountryData/cacheG"] = 27000,
["Module:CountryData/cacheH"] = 18000,
["Module:CountryData/cacheI"] = 17000,
["Module:CountryData/cacheJ"] = 11000,
["Module:CountryData/cacheK"] = 11000,
["Module:CountryData/summary"] = 478000,
["Module:Country_adjective"] = 4700,
["Module:Country_alias"] = 63000,
["Module:Country_alias/data"] = 64000,
["Module:Cslist"] = 3800,
["Module:Currency"] = 5600,
["Module:Currency/Presentation"] = 5600,
["Module:Current_leader"] = 5500,
["Module:Current_leader/data"] = 5500,
}
gndwtm5a3owio9927z4wogahuirh6ib
33213
33212
2026-11-11T21:48:18Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/C]]
33212
Scribunto
text/plain
return {
["C"] = 807000,
["C-Class"] = 17000,
["C-SPAN"] = 13000,
["C-cmn"] = 2800,
["C-pl"] = 51000,
["C."] = 356000,
["CAN"] = 21000,
["CANelec"] = 18000,
["CANelec/gain"] = 3700,
["CANelec/hold"] = 7000,
["CANelec/source"] = 11000,
["CANelec/top"] = 9300,
["CANelec/total"] = 9800,
["CAS"] = 3800,
["CAS_Registry_Number"] = 3800,
["CBB_Yearly_Record_End"] = 3500,
["CBB_Yearly_Record_Entry"] = 3600,
["CBB_Yearly_Record_Start"] = 3400,
["CBB_Yearly_Record_Subhead"] = 4200,
["CBB_Yearly_Record_Subtotal"] = 3300,
["CBB_roster/Footer"] = 11000,
["CBB_roster/Header"] = 11000,
["CBB_roster/Player"] = 11000,
["CBB_schedule_end"] = 14000,
["CBB_schedule_entry"] = 14000,
["CBB_schedule_start"] = 14000,
["CBB_standings_end"] = 20000,
["CBB_standings_entry"] = 20000,
["CBB_standings_start"] = 20000,
["CBB_yearly_record_end"] = 4700,
["CBB_yearly_record_end/legend"] = 4100,
["CBB_yearly_record_entry"] = 4600,
["CBB_yearly_record_start"] = 4500,
["CBB_yearly_record_subhead"] = 4300,
["CBB_yearly_record_subtotal"] = 4400,
["CBSB_Standings_End"] = 2700,
["CBSB_Standings_Entry"] = 2700,
["CBSB_Standings_Start"] = 2700,
["CBSB_link"] = 4100,
["CBSB_standings_end"] = 5600,
["CBSB_standings_entry"] = 5600,
["CBSB_standings_start"] = 5600,
["CC0"] = 4000,
["CC_BY-SA_2.5"] = 2100,
["CC_BY-SA_2.5,_2.0,_1.0"] = 2100,
["CC_BY-SA_3.0"] = 20000,
["CC_BY-SA_3.0_migrated"] = 19000,
["CC_BY-SA_4.0"] = 14000,
["CC_BY_2.5"] = 2600,
["CC_BY_3.0"] = 7000,
["CFB_Standings_End"] = 16000,
["CFB_Standings_Entry"] = 16000,
["CFB_Standings_Start"] = 16000,
["CFB_Yearly_Record_End"] = 7900,
["CFB_Yearly_Record_End/legend"] = 2900,
["CFB_Yearly_Record_Entry"] = 7900,
["CFB_Yearly_Record_Start"] = 7900,
["CFB_Yearly_Record_Subhead"] = 8000,
["CFB_Yearly_Record_Subtotal"] = 7800,
["CFB_schedule"] = 29000,
["CFB_schedule_entry"] = 22000,
["CFB_standings_end"] = 39000,
["CFB_standings_entry"] = 39000,
["CFB_standings_start"] = 39000,
["CFL_Year"] = 7400,
["CGF_year"] = 3900,
["CGNDB_URL"] = 5400,
["CHE"] = 12000,
["CHI"] = 3400,
["CHL"] = 4300,
["CHN"] = 15000,
["CN"] = 3900,
["CO2"] = 3500,
["COI"] = 14000,
["COIUL"] = 131000,
["COI_editnotice"] = 7900,
["COL"] = 5700,
["COLON"] = 14000,
["CRI"] = 2300,
["CRO"] = 6600,
["CS1_config"] = 16000,
["CSK"] = 2800,
["CSS_crop"] = 2100,
["CSS_image_crop"] = 9900,
["CUB"] = 4200,
["CURRENTDATE"] = 3600,
["CYP"] = 2200,
["CZE"] = 17000,
["Calendar"] = 2500,
["Calendar/styles.css"] = 2800,
["California/color"] = 12000,
["Call_sign_disambiguation"] = 3100,
["Campaignbox"] = 26000,
["CanProvName"] = 19000,
["CanadaByProvinceCatNav"] = 9500,
["CanadaProvinceThe"] = 4500,
["Canada_NTS_Map_Sheet"] = 2200,
["Canada_by_province_category_navigation"] = 9900,
["Canadian_English"] = 13000,
["Canadian_Parliament_links"] = 5100,
["Canadian_election_result"] = 18000,
["Canadian_election_result/gain"] = 3800,
["Canadian_election_result/hold"] = 7200,
["Canadian_election_result/source"] = 13000,
["Canadian_election_result/top"] = 19000,
["Canadian_election_result/total"] = 15000,
["Canadian_party_colour"] = 11000,
["Canadian_party_colour/colour"] = 23000,
["Canadian_party_colour/colour/default"] = 23000,
["Canadian_party_colour/name"] = 19000,
["Canadian_party_colour/name/default"] = 8400,
["Canadian_province_name"] = 19000,
["Canned_search"] = 8500,
["Cascite"] = 17000,
["Caselaw_source"] = 4800,
["Cassini-Ehess"] = 3300,
["Cast_listing"] = 30000,
["Castlist"] = 6100,
["Cat"] = 503000,
["CatAutoTOC"] = 373000,
["CatRel"] = 4100,
["CatTrack"] = 20000,
["Cat_class"] = 6100,
["Cat_explanation"] = 2000,
["Cat_handler"] = 2500,
["Cat_main"] = 149000,
["Cat_more"] = 103000,
["Cat_more_if_exists"] = 30000,
["Cat_see_also"] = 3800,
["Catalog_lookup_link"] = 61000,
["Catalog_of_Fishes"] = 9800,
["Catalogue_of_Life"] = 25000,
["Category"] = 2400,
["Category-Class"] = 14000,
["Category-inline"] = 21000,
["Category_TOC"] = 81000,
["Category_U.S._State_elections_by_year"] = 7500,
["Category_U.S._State_elections_by_year/core"] = 7500,
["Category_class"] = 25000,
["Category_described_in_year"] = 6400,
["Category_diffuse"] = 11000,
["Category_disambiguation"] = 2700,
["Category_explanation"] = 417000,
["Category_handler"] = 2740000,
["Category_if_exists"] = 130000,
["Category_ifexist"] = 4900,
["Category_importance"] = 8800,
["Category_link"] = 729000,
["Category_link/core"] = 729000,
["Category_link_if_exists"] = 81000,
["Category_link_with_count"] = 9300,
["Category_link_without_namespace"] = 808000,
["Category_links"] = 10000,
["Category_main_article"] = 222000,
["Category_more"] = 143000,
["Category_more_if_exists"] = 49000,
["Category_ordered_by_date"] = 13000,
["Category_other"] = 1130000,
["Category_pair"] = 2200,
["Category_redirect"] = 159000,
["Category_redirect/core"] = 159000,
["Category_see_also"] = 56000,
["Category_see_also/Category_pair_check"] = 56000,
["Category_see_also_if_exists"] = 96000,
["Category_see_also_if_exists_2"] = 100000,
["Category_series_navigation"] = 601000,
["Category_title"] = 2400,
["Catexp"] = 5900,
["CathEncy"] = 2300,
["Catholic"] = 3700,
["Catholic_Encyclopedia"] = 5100,
["Catmain"] = 29000,
["Catmore"] = 9800,
["Catseealso"] = 2300,
["Cbb_link"] = 10000,
["Cbignore"] = 134000,
["Cbsb_link"] = 2500,
["Cc-by-2.5"] = 2600,
["Cc-by-3.0"] = 6900,
["Cc-by-sa-2.5"] = 2000,
["Cc-by-sa-2.5,2.0,1.0"] = 2100,
["Cc-by-sa-3.0"] = 20000,
["Cc-by-sa-4.0"] = 14000,
["Cc-zero"] = 3800,
["CensusAU"] = 9100,
["Census_2016_AUS"] = 5700,
["Census_2021_AUS"] = 6200,
["Cent"] = 6900,
["Center"] = 306000,
["Centered_quote"] = 37000,
["Centralized_discussion"] = 7300,
["Centralized_discussion/core"] = 7200,
["Centralized_discussion/styles.css"] = 7300,
["Centre"] = 4300,
["Century"] = 16000,
["Century_name_from_decade"] = 2400,
["Century_name_from_decade_or_year"] = 127000,
["Century_name_from_title_decade"] = 7600,
["Century_name_from_title_year"] = 9300,
["Certification_Cite_Ref"] = 38000,
["Certification_Table_Bottom"] = 38000,
["Certification_Table_Entry"] = 39000,
["Certification_Table_Entry/Foot"] = 37000,
["Certification_Table_Entry/Foot/helper"] = 37000,
["Certification_Table_Entry/MexicanAward"] = 2400,
["Certification_Table_Entry/Region"] = 39000,
["Certification_Table_Entry/Sales"] = 37000,
["Certification_Table_Entry/Sales/AustrianPeriod"] = 2500,
["Certification_Table_Entry/Sales/BelgianPeriod"] = 2400,
["Certification_Table_Entry/Sales/DanishPeriod"] = 4500,
["Certification_Table_Entry/Sales/DanishPeriodHelper1"] = 4500,
["Certification_Table_Entry/Sales/DanishPeriodHelper2"] = 4500,
["Certification_Table_Entry/Sales/FrenchPeriod"] = 2300,
["Certification_Table_Entry/Sales/FrenchPeriodAlbum"] = 2100,
["Certification_Table_Entry/Sales/GermanPeriod"] = 4100,
["Certification_Table_Entry/Sales/ItalianHelper"] = 4500,
["Certification_Table_Entry/Sales/MexicanSales"] = 2300,
["Certification_Table_Entry/Sales/NewZealandPeriod"] = 8000,
["Certification_Table_Entry/Sales/SpanishSinglesPeriod"] = 2800,
["Certification_Table_Entry/Sales/SwedishPeriod"] = 2300,
["Certification_Table_Separator"] = 3300,
["Certification_Table_Top"] = 39000,
["Cfb_link"] = 26000,
["Chart/styles.css"] = 2000,
["Chart_bottom"] = 4600,
["Chart_top"] = 4600,
["Check_completeness_of_transclusions"] = 66000,
["Check_talk"] = 64000,
["Check_talk_wp"] = 1460000,
["Check_winner_by_scores"] = 16000,
["CheckedSockpuppet"] = 7200,
["Checked_sockpuppet"] = 18000,
["Checkedsockpuppet"] = 5300,
["Checkip"] = 12000,
["Checkuser"] = 91000,
["Checkuserblock-account"] = 48000,
["Chem"] = 6000,
["Chem/atom"] = 5900,
["Chem/link"] = 6000,
["Chem2"] = 11000,
["Chem_molar_mass"] = 22000,
["Chem_molar_mass/format"] = 22000,
["Chembox"] = 16000,
["Chembox/styles.css"] = 16000,
["Chembox_3DMet"] = 16000,
["Chembox_AllOtherNames"] = 14000,
["Chembox_AllOtherNames/format"] = 14000,
["Chembox_Appearance"] = 7400,
["Chembox_BoilingPt"] = 4200,
["Chembox_CASNo"] = 16000,
["Chembox_CASNo/format"] = 16000,
["Chembox_CalcTemperatures"] = 7600,
["Chembox_ChEBI"] = 16000,
["Chembox_ChEBI/format"] = 16000,
["Chembox_ChEMBL"] = 16000,
["Chembox_ChEMBL/format"] = 16000,
["Chembox_ChemSpiderID"] = 16000,
["Chembox_ChemSpiderID/format"] = 16000,
["Chembox_CompTox"] = 16000,
["Chembox_CompTox/format"] = 16000,
["Chembox_Datapage_check"] = 16000,
["Chembox_Density"] = 5700,
["Chembox_DrugBank"] = 16000,
["Chembox_DrugBank/format"] = 16000,
["Chembox_ECHA"] = 8300,
["Chembox_ECNumber"] = 16000,
["Chembox_ECNumber/format"] = 16000,
["Chembox_Elements"] = 15000,
["Chembox_Elements/molecular_formula"] = 22000,
["Chembox_FlashPt"] = 2100,
["Chembox_Footer"] = 16000,
["Chembox_Footer/tracking"] = 16000,
["Chembox_GHS_(set)"] = 4500,
["Chembox_Hazards"] = 13000,
["Chembox_IUPHAR_ligand"] = 16000,
["Chembox_IUPHAR_ligand/format"] = 16000,
["Chembox_Identifiers"] = 16000,
["Chembox_InChI"] = 15000,
["Chembox_InChI/format"] = 15000,
["Chembox_Indexlist"] = 16000,
["Chembox_Jmol"] = 16000,
["Chembox_Jmol/format"] = 16000,
["Chembox_KEGG"] = 16000,
["Chembox_KEGG/format"] = 16000,
["Chembox_MeltingPt"] = 6700,
["Chembox_OtherCpds"] = 2100,
["Chembox_Properties"] = 15000,
["Chembox_PubChem"] = 16000,
["Chembox_PubChem/format"] = 16000,
["Chembox_RTECS"] = 16000,
["Chembox_RTECS/format"] = 16000,
["Chembox_Related"] = 4200,
["Chembox_SMILES"] = 15000,
["Chembox_SMILES/format"] = 15000,
["Chembox_SolubilityInWater"] = 4600,
["Chembox_Structure"] = 2500,
["Chembox_UNII"] = 16000,
["Chembox_UNII/format"] = 16000,
["Chembox_headerbar"] = 16000,
["Chembox_image"] = 14000,
["Chembox_image_cell"] = 14000,
["Chembox_image_sbs"] = 14000,
["Chembox_parametercheck"] = 15000,
["Chembox_setDatarow"] = 5500,
["Chembox_setHeader"] = 5500,
["Chembox_templatePar/formatPreviewMessage"] = 16000,
["Chembox_verification"] = 6900,
["Chemspidercite"] = 11000,
["Chessgames_player"] = 3800,
["Chinese"] = 3500,
["Circa"] = 475000,
["Circular_reference"] = 3900,
["Citation"] = 415000,
["Citation/make_link"] = 8000,
["Citation/styles.css"] = 53000,
["Citation_needed"] = 637000,
["Citation_needed_span"] = 3600,
["Citation_style"] = 4400,
["Cite"] = 2200,
["Cite_AV_media"] = 83000,
["Cite_AV_media_notes"] = 34000,
["Cite_Appletons'"] = 2400,
["Cite_Australian_Dictionary_of_Biography"] = 5000,
["Cite_Box_Office_Mojo"] = 2600,
["Cite_Catholic_Encyclopedia"] = 8600,
["Cite_DCB"] = 3400,
["Cite_DGRBM"] = 2200,
["Cite_DNB"] = 20000,
["Cite_EB1911"] = 26000,
["Cite_FTP"] = 2500,
["Cite_GBIF"] = 4300,
["Cite_GNIS"] = 2400,
["Cite_Gaia_DR3"] = 3100,
["Cite_Google_Maps"] = 20000,
["Cite_Hansard"] = 2800,
["Cite_IUCN"] = 72000,
["Cite_Instagram"] = 7800,
["Cite_Jewish_Encyclopedia"] = 3200,
["Cite_LCDB"] = 2000,
["Cite_Metacritic"] = 2400,
["Cite_NIE"] = 3500,
["Cite_NSW_Parliament"] = 3300,
["Cite_NSW_SHR"] = 2700,
["Cite_NatureServe"] = 3300,
["Cite_ODNB"] = 22000,
["Cite_OED"] = 2500,
["Cite_POWO"] = 7300,
["Cite_Q"] = 18000,
["Cite_QHR"] = 3100,
["Cite_QPN"] = 4100,
["Cite_Rotten_Tomatoes"] = 3000,
["Cite_Rowlett"] = 2500,
["Cite_Russian_law"] = 7800,
["Cite_Ryan"] = 3300,
["Cite_SNL"] = 2200,
["Cite_Sports-Reference"] = 55000,
["Cite_USGov"] = 13000,
["Cite_WoRMS"] = 14000,
["Cite_act"] = 4000,
["Cite_arXiv"] = 7200,
["Cite_bcgnis"] = 3700,
["Cite_book"] = 1920000,
["Cite_certification"] = 43000,
["Cite_certification/Title"] = 40000,
["Cite_certification/URL"] = 43000,
["Cite_certification/archivedate"] = 7700,
["Cite_certification/archiveurl"] = 7700,
["Cite_cgndb"] = 5400,
["Cite_comic"] = 2100,
["Cite_conference"] = 23000,
["Cite_court"] = 7100,
["Cite_dictionary"] = 3600,
["Cite_document"] = 2100,
["Cite_encyclopedia"] = 245000,
["Cite_episode"] = 20000,
["Cite_gnis"] = 35000,
["Cite_instagram"] = 3100,
["Cite_interview"] = 11000,
["Cite_iucn"] = 71000,
["Cite_journal"] = 1190000,
["Cite_legislation_UK"] = 4300,
["Cite_magazine"] = 387000,
["Cite_map"] = 60000,
["Cite_news"] = 1950000,
["Cite_newspaper"] = 2100,
["Cite_newspaper_The_Times"] = 7200,
["Cite_patent"] = 7400,
["Cite_patent/authors"] = 6200,
["Cite_patent/core"] = 7700,
["Cite_peakbagger"] = 5300,
["Cite_podcast"] = 6400,
["Cite_press_release"] = 87000,
["Cite_report"] = 80000,
["Cite_rowlett"] = 2500,
["Cite_ship_register"] = 2000,
["Cite_simbad"] = 5700,
["Cite_sports-reference"] = 60000,
["Cite_taxon"] = 6400,
["Cite_tech_report"] = 3100,
["Cite_thesis"] = 51000,
["Cite_tweet"] = 49000,
["Cite_video"] = 13000,
["Cite_video_game"] = 3500,
["Cite_web"] = 5460000,
["Cite_wikisource"] = 7200,
["Cite_wikisource/make_link"] = 65000,
["Citeweb"] = 4300,
["Civil_navigation"] = 2100,
["Cjersey"] = 3100,
["Cl"] = 223000,
["Clade"] = 10000,
["Clade/styles.css"] = 10000,
["Clarification_needed"] = 2600,
["Clarify"] = 45000,
["Class"] = 39000,
["Class/colour"] = 19000,
["Class/icon"] = 21000,
["Class_mask"] = 467000,
["Classicon"] = 5300,
["Clc"] = 7300,
["Cleanup"] = 8300,
["Cleanup_reorganize"] = 2300,
["Cleanup_rewrite"] = 6900,
["Clear"] = 3780000,
["Clear_left"] = 23000,
["Clear_right"] = 2800,
["Clerk_Request"] = 2600,
["Clerk_note"] = 11000,
["Clerknote"] = 8700,
["Clickable_button"] = 1850000,
["Clickable_button_2"] = 226000,
["Closed_access"] = 5700,
["Closed_peer_review_page"] = 3300,
["Closed_rfc_bottom"] = 2300,
["Closed_rfc_top"] = 2300,
["Clr"] = 3000,
["Club_players_category"] = 9500,
["Clubplayerscat"] = 9500,
["Cmbox"] = 539000,
["Cn"] = 111000,
["Cnote2"] = 2900,
["Cnote2_Begin"] = 2900,
["Cnote2_End"] = 2900,
["Coat_of_arms"] = 2500,
["Cob"] = 15000,
["Code"] = 117000,
["Cof_family"] = 4600,
["Cof_genus"] = 5400,
["Col-1-of-2"] = 2400,
["Col-2"] = 183000,
["Col-2-of-2"] = 2300,
["Col-3"] = 11000,
["Col-4"] = 3200,
["Col-begin"] = 227000,
["Col-begin/styles.css"] = 227000,
["Col-break"] = 225000,
["Col-end"] = 227000,
["Col-float"] = 3300,
["Col-float-break"] = 3200,
["Col-float-end"] = 3300,
["Col-float/styles.css"] = 3300,
["Col-start"] = 9800,
["Col_div"] = 2200,
["Colbegin"] = 25000,
["Colend"] = 27000,
["Collapse"] = 8900,
["Collapse_AI_top"] = 2400,
["Collapse_AI_top/styles.css"] = 2400,
["Collapse_bottom"] = 57000,
["Collapse_top"] = 57000,
["Collapse_top/styles.css"] = 57000,
["Collapsebottom"] = 4100,
["Collapsed_infobox_section_begin"] = 9500,
["Collapsed_infobox_section_begin/cont"] = 9500,
["Collapsed_infobox_section_begin/styles.css"] = 9500,
["Collapsed_infobox_section_end"] = 9500,
["Collapsetop"] = 4100,
["Collapsible_list"] = 68000,
["Collapsible_option"] = 153000,
["Colledge:_Ships_RN"] = 3000,
["College"] = 12000,
["CollegePrimaryHeader"] = 8300,
["CollegePrimaryStyle"] = 111000,
["CollegeSecondaryStyle"] = 11000,
["College_Athlete_Recruit_End"] = 2800,
["College_Athlete_Recruit_Entry"] = 3000,
["College_Athlete_Recruit_Start"] = 2900,
["College_athlete_recruit_end"] = 5000,
["College_athlete_recruit_entry"] = 5200,
["College_athlete_recruit_start"] = 5200,
["College_color_list"] = 4400,
["College_sports_team_link"] = 31000,
["Colon"] = 20000,
["Color"] = 508000,
["Color/styles.css"] = 508000,
["Color_box"] = 87000,
["Colorbox"] = 2600,
["Colorbull"] = 4500,
["Colored_link"] = 108000,
["Coloredlink"] = 4000,
["Colors"] = 3700,
["Colour"] = 5600,
["Colour_box"] = 2500,
["Coloured_link"] = 12000,
["Column"] = 8500,
["Column/styles.css"] = 8600,
["Columns-end"] = 8200,
["Columns-list"] = 126000,
["Columns-start"] = 8200,
["Columns_list"] = 100000,
["Comic_Book_DB"] = 3500,
["Comicbookdb"] = 3400,
["Comics-replaceability"] = 2700,
["Comics_infobox_sec/formcat"] = 3400,
["Comics_infobox_sec/genre"] = 4200,
["Comics_infobox_sec/genrecat"] = 3800,
["Comics_infobox_sec/styles.css"] = 8100,
["Comma-separated_entries"] = 444000,
["Comma-separated_list"] = 3800,
["Comma-separated_list/styles.css"] = 3800,
["Comma_separated_entries"] = 439000,
["Comment"] = 7800,
["Committed_identity"] = 3200,
["Committed_identity/styles.css"] = 3200,
["Commons"] = 73000,
["Commons-inline"] = 26000,
["Commons_cat"] = 45000,
["Commons_category"] = 908000,
["Commons_category-inline"] = 179000,
["Commons_category_inline"] = 5800,
["Commonscat"] = 59000,
["Commonscat-inline"] = 14000,
["Commonscat_inline"] = 2200,
["Commonscatinline"] = 7000,
["Compact_TOC"] = 7300,
["Compact_ToC"] = 3100,
["Compose_molecular_formula"] = 2400,
["Composition_bar"] = 13000,
["Confirmed"] = 20000,
["Confused"] = 3300,
["Confusing"] = 2400,
["CongBio"] = 9400,
["CongLinks"] = 4800,
["Connected_contributor"] = 22000,
["Connected_contributor_(paid)"] = 10000,
["Constellation_navbox"] = 10000,
["Container"] = 14000,
["Container_cat"] = 9100,
["Container_category"] = 93000,
["Containercat"] = 2800,
["Contains_special_characters"] = 5200,
["Contains_special_characters/core"] = 5200,
["Contains_special_characters/styles.css"] = 5200,
["Content_category"] = 7900,
["Contentious_topics/Additional_restrictions.json"] = 21000,
["Contentious_topics/Arab-Israeli_editnotice"] = 7000,
["Contentious_topics/Arab-Israeli_talk_notice"] = 6100,
["Contentious_topics/Category_database.json"] = 21000,
["Contentious_topics/Restrictions_definition.json"] = 21000,
["Contentious_topics/Standard_set.json"] = 21000,
["Contentious_topics/list"] = 30000,
["Contentious_topics/page_restriction_editnotice_base"] = 7500,
["Contentious_topics/page_restriction_talk_notice"] = 2700,
["Contentious_topics/talk_notice"] = 21000,
["Context"] = 2600,
["Continent2continental"] = 46000,
["Continent_adjective_to_noun"] = 10000,
["Continental2continent"] = 23000,
["Controversial"] = 3000,
["Convert"] = 1420000,
["Convert_abbreviated"] = 177000,
["Convinfobox"] = 328000,
["Coord"] = 1400000,
["Coord_missing"] = 71000,
["Coord_missing/CheckCat"] = 70000,
["Coords"] = 6600,
["Copied"] = 22000,
["Copy_edit"] = 2000,
["Copy_to_Commons"] = 2700,
["Copy_to_Wikimedia_Commons"] = 86000,
["Copy_to_Wikimedia_Commons_in"] = 4300,
["Copyvios"] = 3500,
["Cospar"] = 2800,
["Cot"] = 14000,
["Count"] = 1100000,
["Country2continent"] = 125000,
["Country2continental"] = 32000,
["Country2nationality"] = 35000,
["Country2parent"] = 36000,
["Country2parent/core"] = 36000,
["CountryPrefixThe"] = 66000,
["Country_abbreviation"] = 83000,
["Country_alias"] = 17000,
["Country_at_games_navbox"] = 5900,
["Country_at_games_navbox/below"] = 5900,
["Country_data"] = 12000,
["Country_data_AFG"] = 2700,
["Country_data_ALB"] = 7300,
["Country_data_ALG"] = 11000,
["Country_data_AND"] = 3700,
["Country_data_ANG"] = 4500,
["Country_data_ARG"] = 53000,
["Country_data_ARM"] = 8500,
["Country_data_AUS"] = 89000,
["Country_data_AUT"] = 53000,
["Country_data_AZE"] = 11000,
["Country_data_Afghanistan"] = 22000,
["Country_data_Alabama"] = 2700,
["Country_data_Alaska"] = 2200,
["Country_data_Albania"] = 35000,
["Country_data_Alberta"] = 3200,
["Country_data_Algeria"] = 47000,
["Country_data_American_Samoa"] = 2900,
["Country_data_Andorra"] = 9400,
["Country_data_Angola"] = 21000,
["Country_data_Anguilla"] = 2400,
["Country_data_Antigua_and_Barbuda"] = 6500,
["Country_data_Apulia"] = 7900,
["Country_data_Argentina"] = 152000,
["Country_data_Arizona"] = 2500,
["Country_data_Arkansas"] = 2800,
["Country_data_Armenia"] = 46000,
["Country_data_Aruba"] = 4100,
["Country_data_Australia"] = 276000,
["Country_data_Austria"] = 145000,
["Country_data_Austria-Hungary"] = 2300,
["Country_data_Azerbaijan"] = 51000,
["Country_data_BAH"] = 4700,
["Country_data_BAN"] = 4500,
["Country_data_BAR"] = 2700,
["Country_data_BDI"] = 2100,
["Country_data_BEL"] = 61000,
["Country_data_BEN"] = 2100,
["Country_data_BER"] = 2500,
["Country_data_BFA"] = 2100,
["Country_data_BHR"] = 5900,
["Country_data_BIH"] = 14000,
["Country_data_BLR"] = 26000,
["Country_data_BOL"] = 6700,
["Country_data_BOT"] = 3200,
["Country_data_BRA"] = 65000,
["Country_data_BUL"] = 32000,
["Country_data_Bahamas"] = 11000,
["Country_data_Bahrain"] = 22000,
["Country_data_Bangladesh"] = 35000,
["Country_data_Barbados"] = 8800,
["Country_data_Belarus"] = 90000,
["Country_data_Belgium"] = 157000,
["Country_data_Belize"] = 5300,
["Country_data_Benin"] = 8200,
["Country_data_Bermuda"] = 6400,
["Country_data_Bhutan"] = 5000,
["Country_data_Bolivia"] = 24000,
["Country_data_Bosnia_and_Herzegovina"] = 53000,
["Country_data_Botswana"] = 10000,
["Country_data_Brazil"] = 171000,
["Country_data_British_Columbia"] = 3700,
["Country_data_British_Empire"] = 2100,
["Country_data_British_Raj"] = 2500,
["Country_data_British_Virgin_Islands"] = 3400,
["Country_data_Brunei"] = 7000,
["Country_data_Bulgaria"] = 102000,
["Country_data_Burkina_Faso"] = 11000,
["Country_data_Burma"] = 2300,
["Country_data_Burundi"] = 6900,
["Country_data_CAM"] = 2600,
["Country_data_CAN"] = 70000,
["Country_data_CGO"] = 2500,
["Country_data_CHE"] = 5900,
["Country_data_CHI"] = 20000,
["Country_data_CHL"] = 2400,
["Country_data_CHN"] = 50000,
["Country_data_CIV"] = 8700,
["Country_data_CMR"] = 8900,
["Country_data_COD"] = 3600,
["Country_data_COL"] = 29000,
["Country_data_CPV"] = 2400,
["Country_data_CRC"] = 7100,
["Country_data_CRO"] = 38000,
["Country_data_CUB"] = 13000,
["Country_data_CYP"] = 11000,
["Country_data_CZE"] = 55000,
["Country_data_California"] = 6300,
["Country_data_Cambodia"] = 10000,
["Country_data_Cameroon"] = 32000,
["Country_data_Canada"] = 262000,
["Country_data_Cape_Verde"] = 7200,
["Country_data_Castile_and_León"] = 2000,
["Country_data_Catalonia"] = 3400,
["Country_data_Cayman_Islands"] = 4600,
["Country_data_Central_African_Republic"] = 5200,
["Country_data_Chad"] = 5500,
["Country_data_Chile"] = 91000,
["Country_data_China"] = 150000,
["Country_data_Chinese_Taipei"] = 39000,
["Country_data_Colombia"] = 96000,
["Country_data_Colorado"] = 5100,
["Country_data_Commonwealth_of_Independent_States"] = 2100,
["Country_data_Comoros"] = 4800,
["Country_data_Confederate_States_of_America"] = 3100,
["Country_data_Connecticut"] = 3500,
["Country_data_Cook_Islands"] = 3900,
["Country_data_Costa_Rica"] = 33000,
["Country_data_Croatia"] = 106000,
["Country_data_Cuba"] = 46000,
["Country_data_Curaçao"] = 4500,
["Country_data_Cyprus"] = 46000,
["Country_data_Czech_Republic"] = 153000,
["Country_data_Czechoslovakia"] = 34000,
["Country_data_DEN"] = 40000,
["Country_data_DEU"] = 11000,
["Country_data_DNK"] = 4500,
["Country_data_DOM"] = 8500,
["Country_data_DRC"] = 2100,
["Country_data_Delaware"] = 2700,
["Country_data_Democratic_Republic_of_the_Congo"] = 23000,
["Country_data_Denmark"] = 121000,
["Country_data_Djibouti"] = 5000,
["Country_data_Dominica"] = 4300,
["Country_data_Dominican_Republic"] = 35000,
["Country_data_ECU"] = 13000,
["Country_data_EGY"] = 16000,
["Country_data_ENG"] = 52000,
["Country_data_ESA"] = 2500,
["Country_data_ESP"] = 85000,
["Country_data_EST"] = 17000,
["Country_data_ETH"] = 4600,
["Country_data_EU"] = 2800,
["Country_data_East_Germany"] = 28000,
["Country_data_Ecuador"] = 48000,
["Country_data_Egypt"] = 66000,
["Country_data_El_Salvador"] = 23000,
["Country_data_Empire_of_Japan"] = 4400,
["Country_data_England"] = 163000,
["Country_data_Equatorial_Guinea"] = 5600,
["Country_data_Eritrea"] = 5600,
["Country_data_Estonia"] = 68000,
["Country_data_Eswatini"] = 5100,
["Country_data_Ethiopia"] = 21000,
["Country_data_Europe"] = 2800,
["Country_data_European_Union"] = 8100,
["Country_data_FIJ"] = 4600,
["Country_data_FIN"] = 41000,
["Country_data_FRA"] = 116000,
["Country_data_FRG"] = 18000,
["Country_data_FRO"] = 2200,
["Country_data_FR_Yugoslavia"] = 4400,
["Country_data_Faroe_Islands"] = 5800,
["Country_data_Federated_States_of_Micronesia"] = 2700,
["Country_data_Fiji"] = 21000,
["Country_data_Finland"] = 114000,
["Country_data_Florida"] = 5800,
["Country_data_France"] = 335000,
["Country_data_French_Polynesia"] = 3900,
["Country_data_GAB"] = 2600,
["Country_data_GAM"] = 2300,
["Country_data_GBR"] = 68000,
["Country_data_GDR"] = 11000,
["Country_data_GEO"] = 16000,
["Country_data_GER"] = 96000,
["Country_data_GHA"] = 10000,
["Country_data_GIB"] = 2200,
["Country_data_GRE"] = 30000,
["Country_data_GUA"] = 5400,
["Country_data_GUI"] = 3400,
["Country_data_GUY"] = 2600,
["Country_data_Gabon"] = 8200,
["Country_data_Gambia"] = 7700,
["Country_data_Georgia"] = 8700,
["Country_data_Georgia_(U.S._state)"] = 3200,
["Country_data_Georgia_(country)"] = 54000,
["Country_data_German_Empire"] = 5700,
["Country_data_Germany"] = 293000,
["Country_data_Ghana"] = 46000,
["Country_data_Gibraltar"] = 5300,
["Country_data_Great_Britain"] = 128000,
["Country_data_Greece"] = 106000,
["Country_data_Greenland"] = 2800,
["Country_data_Grenada"] = 5700,
["Country_data_Guadeloupe"] = 2900,
["Country_data_Guam"] = 4700,
["Country_data_Guatemala"] = 22000,
["Country_data_Guinea"] = 9500,
["Country_data_Guinea-Bissau"] = 5500,
["Country_data_Guyana"] = 7800,
["Country_data_HAI"] = 3400,
["Country_data_HKG"] = 15000,
["Country_data_HON"] = 4400,
["Country_data_HUN"] = 45000,
["Country_data_Haiti"] = 9900,
["Country_data_Hawaii"] = 2200,
["Country_data_Honduras"] = 21000,
["Country_data_Hong_Kong"] = 51000,
["Country_data_Hungary"] = 115000,
["Country_data_IDN"] = 5800,
["Country_data_INA"] = 12000,
["Country_data_IND"] = 34000,
["Country_data_IRE"] = 13000,
["Country_data_IRI"] = 6700,
["Country_data_IRL"] = 24000,
["Country_data_IRN"] = 7400,
["Country_data_IRQ"] = 4900,
["Country_data_ISL"] = 9300,
["Country_data_ISR"] = 23000,
["Country_data_ITA"] = 103000,
["Country_data_Iceland"] = 46000,
["Country_data_Idaho"] = 2200,
["Country_data_Illinois"] = 4600,
["Country_data_India"] = 259000,
["Country_data_Indiana"] = 3400,
["Country_data_Indonesia"] = 72000,
["Country_data_Iowa"] = 2400,
["Country_data_Iran"] = 160000,
["Country_data_Iraq"] = 23000,
["Country_data_Ireland"] = 67000,
["Country_data_Isle_of_Man"] = 2900,
["Country_data_Israel"] = 94000,
["Country_data_Italy"] = 288000,
["Country_data_Ivory_Coast"] = 33000,
["Country_data_JAM"] = 12000,
["Country_data_JAP"] = 2300,
["Country_data_JOR"] = 4900,
["Country_data_JP"] = 8800,
["Country_data_JPN"] = 70000,
["Country_data_Jamaica"] = 45000,
["Country_data_Japan"] = 265000,
["Country_data_Jersey"] = 2700,
["Country_data_Jordan"] = 22000,
["Country_data_KAZ"] = 24000,
["Country_data_KEN"] = 10000,
["Country_data_KGZ"] = 4600,
["Country_data_KOR"] = 36000,
["Country_data_KOS"] = 3200,
["Country_data_KSA"] = 7600,
["Country_data_KUW"] = 4700,
["Country_data_Kansas"] = 2100,
["Country_data_Kazakhstan"] = 68000,
["Country_data_Kentucky"] = 2100,
["Country_data_Kenya"] = 35000,
["Country_data_Kingdom_of_France"] = 2200,
["Country_data_Kingdom_of_Great_Britain"] = 4600,
["Country_data_Kingdom_of_Italy"] = 4900,
["Country_data_Kiribati"] = 2600,
["Country_data_Kosovo"] = 11000,
["Country_data_Kuwait"] = 21000,
["Country_data_Kyrgyzstan"] = 11000,
["Country_data_LAO"] = 2200,
["Country_data_LAT"] = 17000,
["Country_data_LBN"] = 2900,
["Country_data_LBR"] = 2100,
["Country_data_LIB"] = 2600,
["Country_data_LIE"] = 3800,
["Country_data_LIT"] = 3700,
["Country_data_LTU"] = 15000,
["Country_data_LUX"] = 12000,
["Country_data_LVA"] = 3100,
["Country_data_Laos"] = 8100,
["Country_data_Latvia"] = 55000,
["Country_data_Lebanon"] = 24000,
["Country_data_Lesotho"] = 5500,
["Country_data_Liberia"] = 8000,
["Country_data_Libya"] = 9200,
["Country_data_Liechtenstein"] = 9000,
["Country_data_Lithuania"] = 54000,
["Country_data_Louisiana"] = 2300,
["Country_data_Luxembourg"] = 48000,
["Country_data_MAC"] = 3100,
["Country_data_MAD"] = 2400,
["Country_data_MAR"] = 15000,
["Country_data_MAS"] = 13000,
["Country_data_MDA"] = 9000,
["Country_data_MDV"] = 2000,
["Country_data_MEX"] = 36000,
["Country_data_MGL"] = 3600,
["Country_data_MKD"] = 8600,
["Country_data_MLI"] = 4700,
["Country_data_MLT"] = 6500,
["Country_data_MNE"] = 8700,
["Country_data_MON"] = 4700,
["Country_data_MOZ"] = 2700,
["Country_data_MRI"] = 2300,
["Country_data_MYA"] = 3400,
["Country_data_MYS"] = 4300,
["Country_data_Macau"] = 7000,
["Country_data_Macedonia"] = 4600,
["Country_data_Madagascar"] = 9700,
["Country_data_Malawi"] = 6200,
["Country_data_Malaysia"] = 72000,
["Country_data_Maldives"] = 6900,
["Country_data_Mali"] = 21000,
["Country_data_Malta"] = 32000,
["Country_data_Manitoba"] = 3000,
["Country_data_Marshall_Islands"] = 3400,
["Country_data_Martinique"] = 2800,
["Country_data_Maryland"] = 3300,
["Country_data_Massachusetts"] = 2600,
["Country_data_Mauritania"] = 6000,
["Country_data_Mauritius"] = 8500,
["Country_data_Mexico"] = 115000,
["Country_data_Michigan"] = 3900,
["Country_data_Minas_Gerais"] = 2100,
["Country_data_Minnesota"] = 3700,
["Country_data_Missouri"] = 2500,
["Country_data_Moldova"] = 34000,
["Country_data_Monaco"] = 12000,
["Country_data_Mongolia"] = 12000,
["Country_data_Montana"] = 2400,
["Country_data_Montenegro"] = 33000,
["Country_data_Montserrat"] = 2500,
["Country_data_Morocco"] = 51000,
["Country_data_Mozambique"] = 8000,
["Country_data_Myanmar"] = 23000,
["Country_data_NAM"] = 4000,
["Country_data_NED"] = 73000,
["Country_data_NEP"] = 3400,
["Country_data_NGA"] = 8800,
["Country_data_NGR"] = 9500,
["Country_data_NIR"] = 11000,
["Country_data_NLD"] = 7500,
["Country_data_NOR"] = 35000,
["Country_data_NZ"] = 3700,
["Country_data_NZL"] = 39000,
["Country_data_Namibia"] = 11000,
["Country_data_Nauru"] = 2600,
["Country_data_Nazi_Germany"] = 10000,
["Country_data_Nepal"] = 32000,
["Country_data_Netherlands"] = 262000,
["Country_data_Netherlands_Antilles"] = 2400,
["Country_data_Nevada"] = 2100,
["Country_data_New_Brunswick"] = 2600,
["Country_data_New_Caledonia"] = 3300,
["Country_data_New_Hampshire"] = 2100,
["Country_data_New_Jersey"] = 4200,
["Country_data_New_South_Wales"] = 6400,
["Country_data_New_York"] = 4300,
["Country_data_New_York_(state)"] = 6800,
["Country_data_New_Zealand"] = 119000,
["Country_data_Newfoundland_and_Labrador"] = 2900,
["Country_data_Nicaragua"] = 9000,
["Country_data_Niger"] = 6300,
["Country_data_Nigeria"] = 67000,
["Country_data_North_Carolina"] = 3600,
["Country_data_North_Korea"] = 23000,
["Country_data_North_Macedonia"] = 34000,
["Country_data_Northern_Ireland"] = 27000,
["Country_data_Northern_Mariana_Islands"] = 2900,
["Country_data_Norway"] = 117000,
["Country_data_Nova_Scotia"] = 2900,
["Country_data_OMA"] = 3300,
["Country_data_Ohio"] = 6000,
["Country_data_Oklahoma"] = 2500,
["Country_data_Oman"] = 10000,
["Country_data_Ontario"] = 3900,
["Country_data_Ottoman_Empire"] = 3200,
["Country_data_PAK"] = 9100,
["Country_data_PAN"] = 6000,
["Country_data_PAR"] = 11000,
["Country_data_PER"] = 14000,
["Country_data_PHI"] = 13000,
["Country_data_PLE"] = 2100,
["Country_data_PNG"] = 3200,
["Country_data_POL"] = 61000,
["Country_data_POR"] = 38000,
["Country_data_PRK"] = 5000,
["Country_data_PRT"] = 3600,
["Country_data_PUR"] = 8200,
["Country_data_Pakistan"] = 52000,
["Country_data_Palau"] = 2700,
["Country_data_Palestine"] = 7800,
["Country_data_Panama"] = 30000,
["Country_data_Papua_New_Guinea"] = 8500,
["Country_data_Paraguay"] = 45000,
["Country_data_Pennsylvania"] = 3600,
["Country_data_Peru"] = 65000,
["Country_data_Philippines"] = 69000,
["Country_data_Poland"] = 242000,
["Country_data_Portugal"] = 117000,
["Country_data_Prussia"] = 2800,
["Country_data_Puerto_Rico"] = 34000,
["Country_data_QAT"] = 9700,
["Country_data_Qatar"] = 32000,
["Country_data_Quebec"] = 4500,
["Country_data_Queensland"] = 2400,
["Country_data_ROM"] = 15000,
["Country_data_ROU"] = 32000,
["Country_data_RSA"] = 37000,
["Country_data_RUS"] = 69000,
["Country_data_RWA"] = 2500,
["Country_data_Republic_of_China"] = 4600,
["Country_data_Republic_of_Ireland"] = 55000,
["Country_data_Republic_of_the_Congo"] = 8400,
["Country_data_Romania"] = 114000,
["Country_data_Russia"] = 255000,
["Country_data_Russian_Empire"] = 5600,
["Country_data_Rwanda"] = 8600,
["Country_data_SAM"] = 3700,
["Country_data_SCG"] = 3000,
["Country_data_SCO"] = 29000,
["Country_data_SEN"] = 8600,
["Country_data_SER"] = 3700,
["Country_data_SGP"] = 4600,
["Country_data_SIN"] = 7400,
["Country_data_SLE"] = 2100,
["Country_data_SLO"] = 22000,
["Country_data_SLV"] = 3300,
["Country_data_SMR"] = 3600,
["Country_data_SPA"] = 5600,
["Country_data_SRB"] = 31000,
["Country_data_SRI"] = 5300,
["Country_data_SUI"] = 51000,
["Country_data_SUR"] = 2300,
["Country_data_SVK"] = 33000,
["Country_data_SVN"] = 7400,
["Country_data_SWE"] = 66000,
["Country_data_SWI"] = 5100,
["Country_data_SYR"] = 4000,
["Country_data_Saint_Kitts_and_Nevis"] = 5000,
["Country_data_Saint_Lucia"] = 5300,
["Country_data_Saint_Vincent_and_the_Grenadines"] = 5000,
["Country_data_Samoa"] = 8100,
["Country_data_San_Marino"] = 9700,
["Country_data_Saskatchewan"] = 4000,
["Country_data_Saudi_Arabia"] = 37000,
["Country_data_Scotland"] = 102000,
["Country_data_Senegal"] = 31000,
["Country_data_Serbia"] = 105000,
["Country_data_Serbia_and_Montenegro"] = 5400,
["Country_data_Seychelles"] = 5800,
["Country_data_Sierra_Leone"] = 7700,
["Country_data_Singapore"] = 50000,
["Country_data_Slovakia"] = 96000,
["Country_data_Slovenia"] = 91000,
["Country_data_Solomon_Islands"] = 4700,
["Country_data_Somalia"] = 6600,
["Country_data_South_Africa"] = 121000,
["Country_data_South_Australia"] = 2300,
["Country_data_South_Carolina"] = 3100,
["Country_data_South_Korea"] = 116000,
["Country_data_South_Sudan"] = 4900,
["Country_data_Soviet_Union"] = 77000,
["Country_data_Spain"] = 277000,
["Country_data_Sri_Lanka"] = 36000,
["Country_data_Sudan"] = 8700,
["Country_data_Suriname"] = 6800,
["Country_data_Sweden"] = 167000,
["Country_data_Switzerland"] = 150000,
["Country_data_Syria"] = 22000,
["Country_data_São_Tomé_and_Príncipe"] = 3400,
["Country_data_TAN"] = 3500,
["Country_data_TCH"] = 12000,
["Country_data_THA"] = 25000,
["Country_data_TJK"] = 3000,
["Country_data_TKM"] = 3100,
["Country_data_TOG"] = 2100,
["Country_data_TON"] = 2000,
["Country_data_TPE"] = 19000,
["Country_data_TRI"] = 5100,
["Country_data_TTO"] = 2200,
["Country_data_TUN"] = 12000,
["Country_data_TUR"] = 34000,
["Country_data_TWN"] = 2200,
["Country_data_Taiwan"] = 27000,
["Country_data_Tajikistan"] = 9800,
["Country_data_Tanzania"] = 22000,
["Country_data_Tennessee"] = 2300,
["Country_data_Texas"] = 5800,
["Country_data_Thailand"] = 96000,
["Country_data_Timor-Leste"] = 5100,
["Country_data_Togo"] = 7700,
["Country_data_Tonga"] = 6800,
["Country_data_Trinidad_and_Tobago"] = 24000,
["Country_data_Tunisia"] = 46000,
["Country_data_Turkey"] = 140000,
["Country_data_Turkmenistan"] = 8400,
["Country_data_Turks_and_Caicos_Islands"] = 2800,
["Country_data_Tuvalu"] = 2600,
["Country_data_U.S."] = 2000,
["Country_data_U.S._Virgin_Islands"] = 4900,
["Country_data_UAE"] = 11000,
["Country_data_UGA"] = 5300,
["Country_data_UK"] = 19000,
["Country_data_UKGBI"] = 3500,
["Country_data_UKR"] = 45000,
["Country_data_URS"] = 19000,
["Country_data_URU"] = 16000,
["Country_data_US"] = 5200,
["Country_data_USA"] = 152000,
["Country_data_USSR"] = 5300,
["Country_data_UZB"] = 14000,
["Country_data_Uganda"] = 22000,
["Country_data_Ukraine"] = 119000,
["Country_data_United_Arab_Emirates"] = 38000,
["Country_data_United_Kingdom"] = 158000,
["Country_data_United_Kingdom_of_Great_Britain_and_Ireland"] = 4900,
["Country_data_United_Nations"] = 4400,
["Country_data_United_States"] = 440000,
["Country_data_United_States_of_America"] = 4500,
["Country_data_Uruguay"] = 52000,
["Country_data_Uzbekistan"] = 36000,
["Country_data_VEN"] = 18000,
["Country_data_VIE"] = 7300,
["Country_data_Vanuatu"] = 5100,
["Country_data_Vatican_City"] = 3000,
["Country_data_Venezuela"] = 66000,
["Country_data_Victoria"] = 2400,
["Country_data_Vietnam"] = 47000,
["Country_data_Virginia"] = 3100,
["Country_data_WAL"] = 19000,
["Country_data_Wales"] = 68000,
["Country_data_Washington"] = 2700,
["Country_data_Washington,_D.C."] = 2300,
["Country_data_Washington_(state)"] = 3400,
["Country_data_West_Germany"] = 52000,
["Country_data_West_Indies"] = 2900,
["Country_data_Wisconsin"] = 5700,
["Country_data_Wyoming"] = 2100,
["Country_data_YUG"] = 11000,
["Country_data_Yemen"] = 8100,
["Country_data_Yugoslavia"] = 34000,
["Country_data_ZAF"] = 5400,
["Country_data_ZAM"] = 3900,
["Country_data_ZIM"] = 9200,
["Country_data_Zambia"] = 11000,
["Country_data_Zimbabwe"] = 32000,
["Country_data_none"] = 2100,
["Country_flagbio"] = 41000,
["Country_in_the_Eurovision_Song_Contest"] = 2900,
["Country_name"] = 59000,
["Country_prefix_the"] = 176000,
["Country_showdata"] = 7000,
["Country_topics"] = 25000,
["County"] = 7000,
["County_(judet)_of_Romania"] = 3300,
["Course_assignment"] = 4200,
["Course_details"] = 8700,
["Course_instructor"] = 3200,
["Cquote"] = 35000,
["Cr"] = 5100,
["Cr-rt"] = 2500,
["Create_taxonomy/link"] = 151000,
["Creative_Commons_text_attribution_notice"] = 7200,
["Cref2"] = 2900,
["Cricinfo"] = 24000,
["Cricket_squad2_player"] = 2700,
["Cricketarchive"] = 3000,
["Croatian_Census_2021"] = 4200,
["Cross"] = 4200,
["Crossreference"] = 2600,
["Crossreference/styles.css"] = 2600,
["Cs1_config"] = 14000,
["Cslist"] = 3700,
["Csv"] = 77000,
["Currency"] = 5600,
["Current_events"] = 9500,
["Current_events/styles.css"] = 9500,
["Current_leader"] = 5400,
["Currentdate"] = 24000,
["Cvt"] = 176000,
["Cycling_Archives"] = 4300,
["Cycling_data_DAT"] = 2100,
["Cycling_data_LTD"] = 2500,
["Cycling_data_MOV_men"] = 2300,
["Cycling_data_SOQ"] = 2200,
["Cycling_data_TVL"] = 2400,
["Cycling_data_UEX"] = 2300,
["Cycling_team_link"] = 14000,
["Module:CFB_schedule"] = 29000,
["Module:CS1_identifiers"] = 507000,
["Module:Calendar"] = 2000,
["Module:Calendrical_Calculations"] = 2700,
["Module:CallAssert"] = 124000,
["Module:Canada_NTS"] = 2200,
["Module:Canada_NTS/data"] = 2200,
["Module:Canada_by_province_category_navigation"] = 9900,
["Module:Catalog_lookup_link"] = 63000,
["Module:Category_described_in_year"] = 6400,
["Module:Category_described_in_year/config"] = 6400,
["Module:Category_disambiguation"] = 2700,
["Module:Category_handler"] = 5010000,
["Module:Category_handler/blacklist"] = 5010000,
["Module:Category_handler/config"] = 5010000,
["Module:Category_handler/data"] = 5010000,
["Module:Category_handler/shared"] = 5010000,
["Module:Category_main_article"] = 222000,
["Module:Category_more_if_exists"] = 49000,
["Module:Category_pair"] = 7100,
["Module:Category_see_also"] = 56000,
["Module:Category_series_navigation"] = 601000,
["Module:Category_series_navigation/styles.css"] = 600000,
["Module:Celestial_object_quadrangle"] = 2100,
["Module:Chart"] = 2900,
["Module:Chart/Default_colors"] = 2900,
["Module:Check_DYK_hook"] = 127000,
["Module:Check_blp_parameter"] = 2970000,
["Module:Check_for_conflicting_parameters"] = 4640000,
["Module:Check_for_deprecated_parameters"] = 786000,
["Module:Check_for_unknown_parameters"] = 23600000,
["Module:Check_height"] = 153000,
["Module:Check_isxn"] = 16000,
["Module:Check_winner_by_scores"] = 16000,
["Module:Checkuser"] = 91000,
["Module:Chem2"] = 11000,
["Module:Chem2/styles.css"] = 11000,
["Module:Citation/CS1"] = 6590000,
["Module:Citation/CS1/COinS"] = 6590000,
["Module:Citation/CS1/Configuration"] = 6710000,
["Module:Citation/CS1/Date_validation"] = 6590000,
["Module:Citation/CS1/Identifiers"] = 6710000,
["Module:Citation/CS1/Suggestions"] = 26000,
["Module:Citation/CS1/Utilities"] = 6710000,
["Module:Citation/CS1/Whitelist"] = 6590000,
["Module:Citation/CS1/styles.css"] = 6710000,
["Module:Citation_mode"] = 49000,
["Module:Cite"] = 53000,
["Module:Cite/config"] = 71000,
["Module:Cite_IUCN"] = 72000,
["Module:Cite_Q"] = 18000,
["Module:Cite_Q/config"] = 18000,
["Module:Cite_taxon"] = 57000,
["Module:Cite_tweet"] = 49000,
["Module:Clade"] = 10000,
["Module:Class"] = 61000,
["Module:Class/definition.json"] = 61000,
["Module:Class/styles.css"] = 39000,
["Module:Class_mask"] = 467000,
["Module:Clickable_button"] = 1850000,
["Module:Collapsible_list"] = 70000,
["Module:College_color"] = 138000,
["Module:College_color/data"] = 138000,
["Module:Color_contrast"] = 580000,
["Module:Color_contrast/colors"] = 582000,
["Module:Comma-separated_list"] = 3800,
["Module:Commons_link"] = 1180000,
["Module:Compact_list"] = 2000,
["Module:Complex_date"] = 49000,
["Module:Conservation_status"] = 90000,
["Module:Contentious_topics/talk_notice"] = 21000,
["Module:Convert"] = 1530000,
["Module:Convert/data"] = 1530000,
["Module:Convert/helper"] = 13000,
["Module:Convert/text"] = 1530000,
["Module:Convert/wikidata"] = 2700,
["Module:Convert/wikidata/data"] = 2700,
["Module:ConvertIB"] = 821000,
["Module:ConvertIB/data"] = 275000,
["Module:ConvertNumeric"] = 21000,
["Module:Convert_character_width"] = 3100,
["Module:Convert_character_width/data"] = 3100,
["Module:Coordinates"] = 1410000,
["Module:Coordinates/styles.css"] = 1410000,
["Module:Copied"] = 43000,
["Module:Country2nationality"] = 97000,
["Module:CountryAdjectiveDemonym"] = 117000,
["Module:CountryAdjectiveDemonym/Adjectives"] = 117000,
["Module:CountryAdjectiveDemonym/Demonyms"] = 117000,
["Module:CountryAdjectiveDemonym/The"] = 117000,
["Module:CountryData"] = 478000,
["Module:CountryData/cacheA"] = 166000,
["Module:CountryData/cacheB"] = 82000,
["Module:CountryData/cacheC"] = 59000,
["Module:CountryData/cacheD"] = 57000,
["Module:CountryData/cacheE"] = 38000,
["Module:CountryData/cacheF"] = 27000,
["Module:CountryData/cacheG"] = 27000,
["Module:CountryData/cacheH"] = 18000,
["Module:CountryData/cacheI"] = 17000,
["Module:CountryData/cacheJ"] = 11000,
["Module:CountryData/cacheK"] = 11000,
["Module:CountryData/summary"] = 478000,
["Module:Country_adjective"] = 4700,
["Module:Country_alias"] = 63000,
["Module:Country_alias/data"] = 64000,
["Module:Cslist"] = 3800,
["Module:Currency"] = 5600,
["Module:Currency/Presentation"] = 5600,
["Module:Current_leader"] = 5500,
["Module:Current_leader/data"] = 5500,
}
gndwtm5a3owio9927z4wogahuirh6ib
Tempilet:Endplainlist
10
1539
32877
11429
2026-10-05T18:06:49Z
en>Asukite
0
Change categorization templates (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]])
32877
wikitext
text/x-wiki
#REDIRECT [[Template:End plain list]]
{{Redirect category shell|
{{R from alternative spacing}}
{{R from move}}
}}
cn18ofksz4lktroeiy16ykv40aqg7xr
32878
32877
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Endplainlist]]
32877
wikitext
text/x-wiki
#REDIRECT [[Template:End plain list]]
{{Redirect category shell|
{{R from alternative spacing}}
{{R from move}}
}}
cn18ofksz4lktroeiy16ykv40aqg7xr
Module:Side box/styles.css
828
1551
33375
11455
2026-10-07T01:47:25Z
en>Axolitl
0
use variable border colors for dark mode
33375
sanitized-css
text/css
/* {{pp-template|small=y}} */
.side-box {
margin: 4px 0;
box-sizing: border-box;
border: 1px solid var(--border-color-base, #a2a9b1);
font-size: 88%;
line-height: 1.25em;
background-color: var(--background-color-interactive-subtle, #f8f9fa);
color: inherit;
display: flow-root;
}
/* embedded side boxes need larger font */
.infobox .side-box {
font-size: 100%;
}
.side-box-abovebelow,
.side-box-text {
padding: 0.25em 0.9em;
}
.side-box-image {
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.side-box-imageright {
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* roughly the skin's sidebar + size of side box */
@media (min-width: 500px) {
.side-box-flex {
display: flex;
align-items: center;
}
.side-box-text {
flex: 1;
min-width: 0;
}
}
@media (min-width: 640px) {
.side-box {
width: 238px;
}
.side-box-right {
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin-left: 1em;
}
/* derives from mbox classes, which do not float left in mbox-small-left
* so far as I can tell, that was a deliberate decision, since only .ambox
* supports mbox-left
*/
.side-box-left {
/* @noflip */
margin-right: 1em;
}
}
gkx8yo4apbjofqy10xy0l5ds5o2ajmy
33376
33375
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Side_box/styles.css]]
33375
sanitized-css
text/css
/* {{pp-template|small=y}} */
.side-box {
margin: 4px 0;
box-sizing: border-box;
border: 1px solid var(--border-color-base, #a2a9b1);
font-size: 88%;
line-height: 1.25em;
background-color: var(--background-color-interactive-subtle, #f8f9fa);
color: inherit;
display: flow-root;
}
/* embedded side boxes need larger font */
.infobox .side-box {
font-size: 100%;
}
.side-box-abovebelow,
.side-box-text {
padding: 0.25em 0.9em;
}
.side-box-image {
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.side-box-imageright {
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* roughly the skin's sidebar + size of side box */
@media (min-width: 500px) {
.side-box-flex {
display: flex;
align-items: center;
}
.side-box-text {
flex: 1;
min-width: 0;
}
}
@media (min-width: 640px) {
.side-box {
width: 238px;
}
.side-box-right {
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin-left: 1em;
}
/* derives from mbox classes, which do not float left in mbox-small-left
* so far as I can tell, that was a deliberate decision, since only .ambox
* supports mbox-left
*/
.side-box-left {
/* @noflip */
margin-right: 1em;
}
}
gkx8yo4apbjofqy10xy0l5ds5o2ajmy
Module:ISO 639 name/ISO 639-1
828
1554
32911
11461
2026-10-10T22:29:20Z
en>Trappist the monk
0
update to 2026-09-17 data;
32911
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["aa"] = {"Afar"},
["ab"] = {"Abkhazian"},
["ae"] = {"Avestan"},
["af"] = {"Afrikaans"},
["ak"] = {"Akan"},
["am"] = {"Amharic"},
["an"] = {"Aragonese"},
["ar"] = {"Arabic"},
["as"] = {"Assamese"},
["av"] = {"Avaric"},
["ay"] = {"Aymara"},
["az"] = {"Azerbaijani"},
["ba"] = {"Bashkir"},
["be"] = {"Belarusian"},
["bg"] = {"Bulgarian"},
["bi"] = {"Bislama"},
["bm"] = {"Bambara"},
["bn"] = {"Bengali", "Bangla"},
["bo"] = {"Tibetan"},
["br"] = {"Breton"},
["bs"] = {"Bosnian"},
["ca"] = {"Catalan", "Valencian"},
["ce"] = {"Chechen"},
["ch"] = {"Chamorro"},
["co"] = {"Corsican"},
["cr"] = {"Cree"},
["cs"] = {"Czech"},
["cu"] = {"Church Slavic", "Church Slavonic", "Old Bulgarian", "Old Church Slavonic", "Old Slavonic"},
["cv"] = {"Chuvash"},
["cy"] = {"Welsh"},
["da"] = {"Danish"},
["de"] = {"German"},
["dv"] = {"Dhivehi", "Divehi", "Maldivian"},
["dz"] = {"Dzongkha"},
["ee"] = {"Ewe"},
["el"] = {"Modern Greek (1453-)"},
["en"] = {"English"},
["eo"] = {"Esperanto"},
["es"] = {"Spanish", "Castilian"},
["et"] = {"Estonian"},
["eu"] = {"Basque"},
["fa"] = {"Persian"},
["ff"] = {"Fulah"},
["fi"] = {"Finnish"},
["fj"] = {"Fijian"},
["fo"] = {"Faroese"},
["fr"] = {"French"},
["fy"] = {"Western Frisian"},
["ga"] = {"Irish"},
["gd"] = {"Scottish Gaelic", "Gaelic"},
["gl"] = {"Galician"},
["gn"] = {"Guarani"},
["gu"] = {"Gujarati"},
["gv"] = {"Manx"},
["ha"] = {"Hausa"},
["he"] = {"Hebrew"},
["hi"] = {"Hindi"},
["ho"] = {"Hiri Motu"},
["hr"] = {"Croatian"},
["ht"] = {"Haitian", "Haitian Creole"},
["hu"] = {"Hungarian"},
["hy"] = {"Armenian"},
["hz"] = {"Herero"},
["ia"] = {"Interlingua (IALA)", "Interlingua (International Auxiliary Language Association)"},
["id"] = {"Indonesian"},
["ie"] = {"Interlingue", "Occidental"},
["ig"] = {"Igbo"},
["ii"] = {"Sichuan Yi", "Nuosu"},
["ik"] = {"Inupiaq"},
["io"] = {"Ido"},
["is"] = {"Icelandic"},
["it"] = {"Italian"},
["iu"] = {"Inuktitut"},
["ja"] = {"Japanese"},
["jv"] = {"Javanese"},
["ka"] = {"Georgian"},
["kg"] = {"Kongo"},
["ki"] = {"Kikuyu", "Gikuyu"},
["kj"] = {"Kuanyama", "Kwanyama"},
["kk"] = {"Kazakh"},
["kl"] = {"Kalaallisut", "Greenlandic"},
["km"] = {"Khmer", "Central Khmer"},
["kn"] = {"Kannada"},
["ko"] = {"Korean"},
["kr"] = {"Kanuri"},
["ks"] = {"Kashmiri"},
["ku"] = {"Kurdish"},
["kv"] = {"Komi"},
["kw"] = {"Cornish"},
["ky"] = {"Kirghiz", "Kyrgyz"},
["la"] = {"Latin"},
["lb"] = {"Luxembourgish", "Letzeburgesch"},
["lg"] = {"Ganda", "Luganda"},
["li"] = {"Limburgan", "Limburger", "Limburgish"},
["ln"] = {"Lingala"},
["lo"] = {"Lao"},
["lt"] = {"Lithuanian"},
["lu"] = {"Luba-Katanga"},
["lv"] = {"Latvian"},
["mg"] = {"Malagasy"},
["mh"] = {"Marshallese"},
["mi"] = {"Maori"},
["mk"] = {"Macedonian"},
["ml"] = {"Malayalam"},
["mn"] = {"Mongolian"},
["mr"] = {"Marathi"},
["ms"] = {"Malay (macrolanguage)"},
["mt"] = {"Maltese"},
["my"] = {"Burmese"},
["na"] = {"Nauru"},
["nb"] = {"Norwegian Bokmål"},
["nd"] = {"North Ndebele"},
["ne"] = {"Nepali (macrolanguage)"},
["ng"] = {"Ndonga"},
["nl"] = {"Dutch", "Flemish"},
["nn"] = {"Norwegian Nynorsk"},
["no"] = {"Norwegian"},
["nr"] = {"South Ndebele"},
["nv"] = {"Navajo", "Navaho"},
["ny"] = {"Chichewa", "Chewa", "Nyanja"},
["oc"] = {"Occitan (post 1500)"},
["oj"] = {"Ojibwa"},
["om"] = {"Oromo"},
["or"] = {"Oriya (macrolanguage)", "Odia (macrolanguage)"},
["os"] = {"Iron Ossetic", "Iron", "Iron Ossetian", "Ossetian", "Ossetic"},
["pa"] = {"Panjabi", "Punjabi"},
["pi"] = {"Pali"},
["pl"] = {"Polish"},
["ps"] = {"Pushto", "Pashto"},
["pt"] = {"Portuguese"},
["qu"] = {"Quechua"},
["rm"] = {"Romansh"},
["rn"] = {"Rundi"},
["ro"] = {"Romanian", "Moldavian", "Moldovan"},
["ru"] = {"Russian"},
["rw"] = {"Kinyarwanda"},
["sa"] = {"Sanskrit"},
["sc"] = {"Sardinian"},
["sd"] = {"Sindhi"},
["se"] = {"Northern Sami"},
["sg"] = {"Sango"},
["sh"] = {"Serbo-Croatian"},
["si"] = {"Sinhala", "Sinhalese"},
["sk"] = {"Slovak"},
["sl"] = {"Slovenian"},
["sm"] = {"Samoan"},
["sn"] = {"Shona"},
["so"] = {"Somali"},
["sq"] = {"Albanian"},
["sr"] = {"Serbian"},
["ss"] = {"Swati"},
["st"] = {"Southern Sotho"},
["su"] = {"Sundanese"},
["sv"] = {"Swedish"},
["sw"] = {"Swahili (macrolanguage)"},
["ta"] = {"Tamil"},
["te"] = {"Telugu"},
["tg"] = {"Tajik"},
["th"] = {"Thai"},
["ti"] = {"Tigrinya"},
["tk"] = {"Turkmen"},
["tl"] = {"Tagalog"},
["tn"] = {"Tswana"},
["to"] = {"Tonga (Tonga Islands)"},
["tr"] = {"Turkish"},
["ts"] = {"Tsonga"},
["tt"] = {"Tatar"},
["tw"] = {"Twi"},
["ty"] = {"Tahitian"},
["ug"] = {"Uighur", "Uyghur"},
["uk"] = {"Ukrainian"},
["ur"] = {"Urdu"},
["uz"] = {"Uzbek"},
["ve"] = {"Venda"},
["vi"] = {"Vietnamese"},
["vo"] = {"Volapük"},
["wa"] = {"Walloon"},
["wo"] = {"Wolof"},
["xh"] = {"Xhosa"},
["yi"] = {"Yiddish"},
["yo"] = {"Yoruba"},
["za"] = {"Zhuang", "Chuang"},
["zh"] = {"Chinese"},
["zu"] = {"Zulu"}
}
i47h3sjqdk1xshvs21iw7edsz16ctzm
32912
32911
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Module:ISO_639_name/ISO_639-1]]
32911
Scribunto
text/plain
-- File-Date: 2026-09-17
return {
["aa"] = {"Afar"},
["ab"] = {"Abkhazian"},
["ae"] = {"Avestan"},
["af"] = {"Afrikaans"},
["ak"] = {"Akan"},
["am"] = {"Amharic"},
["an"] = {"Aragonese"},
["ar"] = {"Arabic"},
["as"] = {"Assamese"},
["av"] = {"Avaric"},
["ay"] = {"Aymara"},
["az"] = {"Azerbaijani"},
["ba"] = {"Bashkir"},
["be"] = {"Belarusian"},
["bg"] = {"Bulgarian"},
["bi"] = {"Bislama"},
["bm"] = {"Bambara"},
["bn"] = {"Bengali", "Bangla"},
["bo"] = {"Tibetan"},
["br"] = {"Breton"},
["bs"] = {"Bosnian"},
["ca"] = {"Catalan", "Valencian"},
["ce"] = {"Chechen"},
["ch"] = {"Chamorro"},
["co"] = {"Corsican"},
["cr"] = {"Cree"},
["cs"] = {"Czech"},
["cu"] = {"Church Slavic", "Church Slavonic", "Old Bulgarian", "Old Church Slavonic", "Old Slavonic"},
["cv"] = {"Chuvash"},
["cy"] = {"Welsh"},
["da"] = {"Danish"},
["de"] = {"German"},
["dv"] = {"Dhivehi", "Divehi", "Maldivian"},
["dz"] = {"Dzongkha"},
["ee"] = {"Ewe"},
["el"] = {"Modern Greek (1453-)"},
["en"] = {"English"},
["eo"] = {"Esperanto"},
["es"] = {"Spanish", "Castilian"},
["et"] = {"Estonian"},
["eu"] = {"Basque"},
["fa"] = {"Persian"},
["ff"] = {"Fulah"},
["fi"] = {"Finnish"},
["fj"] = {"Fijian"},
["fo"] = {"Faroese"},
["fr"] = {"French"},
["fy"] = {"Western Frisian"},
["ga"] = {"Irish"},
["gd"] = {"Scottish Gaelic", "Gaelic"},
["gl"] = {"Galician"},
["gn"] = {"Guarani"},
["gu"] = {"Gujarati"},
["gv"] = {"Manx"},
["ha"] = {"Hausa"},
["he"] = {"Hebrew"},
["hi"] = {"Hindi"},
["ho"] = {"Hiri Motu"},
["hr"] = {"Croatian"},
["ht"] = {"Haitian", "Haitian Creole"},
["hu"] = {"Hungarian"},
["hy"] = {"Armenian"},
["hz"] = {"Herero"},
["ia"] = {"Interlingua (IALA)", "Interlingua (International Auxiliary Language Association)"},
["id"] = {"Indonesian"},
["ie"] = {"Interlingue", "Occidental"},
["ig"] = {"Igbo"},
["ii"] = {"Sichuan Yi", "Nuosu"},
["ik"] = {"Inupiaq"},
["io"] = {"Ido"},
["is"] = {"Icelandic"},
["it"] = {"Italian"},
["iu"] = {"Inuktitut"},
["ja"] = {"Japanese"},
["jv"] = {"Javanese"},
["ka"] = {"Georgian"},
["kg"] = {"Kongo"},
["ki"] = {"Kikuyu", "Gikuyu"},
["kj"] = {"Kuanyama", "Kwanyama"},
["kk"] = {"Kazakh"},
["kl"] = {"Kalaallisut", "Greenlandic"},
["km"] = {"Khmer", "Central Khmer"},
["kn"] = {"Kannada"},
["ko"] = {"Korean"},
["kr"] = {"Kanuri"},
["ks"] = {"Kashmiri"},
["ku"] = {"Kurdish"},
["kv"] = {"Komi"},
["kw"] = {"Cornish"},
["ky"] = {"Kirghiz", "Kyrgyz"},
["la"] = {"Latin"},
["lb"] = {"Luxembourgish", "Letzeburgesch"},
["lg"] = {"Ganda", "Luganda"},
["li"] = {"Limburgan", "Limburger", "Limburgish"},
["ln"] = {"Lingala"},
["lo"] = {"Lao"},
["lt"] = {"Lithuanian"},
["lu"] = {"Luba-Katanga"},
["lv"] = {"Latvian"},
["mg"] = {"Malagasy"},
["mh"] = {"Marshallese"},
["mi"] = {"Maori"},
["mk"] = {"Macedonian"},
["ml"] = {"Malayalam"},
["mn"] = {"Mongolian"},
["mr"] = {"Marathi"},
["ms"] = {"Malay (macrolanguage)"},
["mt"] = {"Maltese"},
["my"] = {"Burmese"},
["na"] = {"Nauru"},
["nb"] = {"Norwegian Bokmål"},
["nd"] = {"North Ndebele"},
["ne"] = {"Nepali (macrolanguage)"},
["ng"] = {"Ndonga"},
["nl"] = {"Dutch", "Flemish"},
["nn"] = {"Norwegian Nynorsk"},
["no"] = {"Norwegian"},
["nr"] = {"South Ndebele"},
["nv"] = {"Navajo", "Navaho"},
["ny"] = {"Chichewa", "Chewa", "Nyanja"},
["oc"] = {"Occitan (post 1500)"},
["oj"] = {"Ojibwa"},
["om"] = {"Oromo"},
["or"] = {"Oriya (macrolanguage)", "Odia (macrolanguage)"},
["os"] = {"Iron Ossetic", "Iron", "Iron Ossetian", "Ossetian", "Ossetic"},
["pa"] = {"Panjabi", "Punjabi"},
["pi"] = {"Pali"},
["pl"] = {"Polish"},
["ps"] = {"Pushto", "Pashto"},
["pt"] = {"Portuguese"},
["qu"] = {"Quechua"},
["rm"] = {"Romansh"},
["rn"] = {"Rundi"},
["ro"] = {"Romanian", "Moldavian", "Moldovan"},
["ru"] = {"Russian"},
["rw"] = {"Kinyarwanda"},
["sa"] = {"Sanskrit"},
["sc"] = {"Sardinian"},
["sd"] = {"Sindhi"},
["se"] = {"Northern Sami"},
["sg"] = {"Sango"},
["sh"] = {"Serbo-Croatian"},
["si"] = {"Sinhala", "Sinhalese"},
["sk"] = {"Slovak"},
["sl"] = {"Slovenian"},
["sm"] = {"Samoan"},
["sn"] = {"Shona"},
["so"] = {"Somali"},
["sq"] = {"Albanian"},
["sr"] = {"Serbian"},
["ss"] = {"Swati"},
["st"] = {"Southern Sotho"},
["su"] = {"Sundanese"},
["sv"] = {"Swedish"},
["sw"] = {"Swahili (macrolanguage)"},
["ta"] = {"Tamil"},
["te"] = {"Telugu"},
["tg"] = {"Tajik"},
["th"] = {"Thai"},
["ti"] = {"Tigrinya"},
["tk"] = {"Turkmen"},
["tl"] = {"Tagalog"},
["tn"] = {"Tswana"},
["to"] = {"Tonga (Tonga Islands)"},
["tr"] = {"Turkish"},
["ts"] = {"Tsonga"},
["tt"] = {"Tatar"},
["tw"] = {"Twi"},
["ty"] = {"Tahitian"},
["ug"] = {"Uighur", "Uyghur"},
["uk"] = {"Ukrainian"},
["ur"] = {"Urdu"},
["uz"] = {"Uzbek"},
["ve"] = {"Venda"},
["vi"] = {"Vietnamese"},
["vo"] = {"Volapük"},
["wa"] = {"Walloon"},
["wo"] = {"Wolof"},
["xh"] = {"Xhosa"},
["yi"] = {"Yiddish"},
["yo"] = {"Yoruba"},
["za"] = {"Zhuang", "Chuang"},
["zh"] = {"Chinese"},
["zu"] = {"Zulu"}
}
i47h3sjqdk1xshvs21iw7edsz16ctzm
Tempilet:Sister project/styles.css
10
1560
33387
11473
2026-11-07T19:45:50Z
en>Axolitl
0
Unneeded now that Wiktionary coloring is centralized in [[Module:Sister project logo]]
33387
sanitized-css
text/css
/* {{pp-template|small=yes}} */
@media print {
body.ns-0 .sistersitebox {
display: none !important;
}
}
g7v4cmbilobgy78llynqh77kyp8o7fw
33388
33387
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sister_project/styles.css]]
33387
sanitized-css
text/css
/* {{pp-template|small=yes}} */
@media print {
body.ns-0 .sistersitebox {
display: none !important;
}
}
g7v4cmbilobgy78llynqh77kyp8o7fw
Module:Sister project logo
828
1566
33389
11485
2026-11-07T19:34:45Z
en>Pppery
0
Copy from sandbox per request
33389
Scribunto
text/plain
require('strict')
local p = {}
-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''
-- Lazy-load logo file names and other metadata
local data = mw.loadData('Module:Sister project logo/data'..sandbox)
-- path to styles file
local stylesFile = 'Module:Sister project logo'..sandbox..'/styles.css'
-- Convert table of arguments into wiki image markup
local function imageMarkup(args)
local x = {}
-- positional arguments first
for _, arg in ipairs(args) do
table.insert(x,arg)
end
-- named arguments converted to foo=bar
for k, v in pairs(args) do
if not tonumber(k) then
table.insert(x,k..'='..v)
end
end
return '[['..table.concat(x,'|')..']]'
end
function p._main(args)
local localArgs = {}
-- map possibly verbose project argument into canonical project string
local project = args.project and args.project:lower()
project = data.projectMap[project] or project
-- image=none means bail (for [[Template:Sister project]])
if args.image == 'none' then
return ''
-- if image specified, return it instead of stored logo (for [[Template:Sister project]])
elseif args.image then
return args.image
else
local logoImage = data.logo[project]
-- if project is unknown, use Wikimedia logo (for [[Template:Sister project]])
if not logoImage then
project = 'wm'
logoImage = data.logo['wm']
end
table.insert(localArgs,'File:'..logoImage)
end
-- size=large means use sizes from [[Template:Wikipedia's sister projects]]
-- size defaults to 40x40px (for [[Template:Sister project]])
table.insert(localArgs,args.size == 'large' and (data.largeSize[project] or '35px') or args.size or '40x40px')
-- if logo is PD, blank link and alt (to suppress from screen readers)
if data.PDicon[project] then
localArgs.link = ''
localArgs.alt = ''
else
localArgs.alt = data.logoAlt[project]
end
-- Use editor-specified classes (for [[Template:Sister-inline]])
localArgs.class = "noviewer sister-project-logo"..(args.class and " "..args.class or "")
local result = imageMarkup(localArgs)
-- if custom CSS is available in styles.css, import it using templatestyles tag
if data.customCSS[project] then
local frame = mw.getCurrentFrame()
local styleTag = frame:extensionTag{name = 'templatestyles', args = { src = stylesFile }}
return styleTag..result
end
return result
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args) or ''
end
return p
qcx1jjtj6yyoqskoq2p9ctlmqffj52y
33390
33389
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Sister_project_logo]]
33389
Scribunto
text/plain
require('strict')
local p = {}
-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''
-- Lazy-load logo file names and other metadata
local data = mw.loadData('Module:Sister project logo/data'..sandbox)
-- path to styles file
local stylesFile = 'Module:Sister project logo'..sandbox..'/styles.css'
-- Convert table of arguments into wiki image markup
local function imageMarkup(args)
local x = {}
-- positional arguments first
for _, arg in ipairs(args) do
table.insert(x,arg)
end
-- named arguments converted to foo=bar
for k, v in pairs(args) do
if not tonumber(k) then
table.insert(x,k..'='..v)
end
end
return '[['..table.concat(x,'|')..']]'
end
function p._main(args)
local localArgs = {}
-- map possibly verbose project argument into canonical project string
local project = args.project and args.project:lower()
project = data.projectMap[project] or project
-- image=none means bail (for [[Template:Sister project]])
if args.image == 'none' then
return ''
-- if image specified, return it instead of stored logo (for [[Template:Sister project]])
elseif args.image then
return args.image
else
local logoImage = data.logo[project]
-- if project is unknown, use Wikimedia logo (for [[Template:Sister project]])
if not logoImage then
project = 'wm'
logoImage = data.logo['wm']
end
table.insert(localArgs,'File:'..logoImage)
end
-- size=large means use sizes from [[Template:Wikipedia's sister projects]]
-- size defaults to 40x40px (for [[Template:Sister project]])
table.insert(localArgs,args.size == 'large' and (data.largeSize[project] or '35px') or args.size or '40x40px')
-- if logo is PD, blank link and alt (to suppress from screen readers)
if data.PDicon[project] then
localArgs.link = ''
localArgs.alt = ''
else
localArgs.alt = data.logoAlt[project]
end
-- Use editor-specified classes (for [[Template:Sister-inline]])
localArgs.class = "noviewer sister-project-logo"..(args.class and " "..args.class or "")
local result = imageMarkup(localArgs)
-- if custom CSS is available in styles.css, import it using templatestyles tag
if data.customCSS[project] then
local frame = mw.getCurrentFrame()
local styleTag = frame:extensionTag{name = 'templatestyles', args = { src = stylesFile }}
return styleTag..result
end
return result
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args) or ''
end
return p
qcx1jjtj6yyoqskoq2p9ctlmqffj52y
Module:Sister project logo/data
828
1567
33391
11487
2026-11-07T19:35:03Z
en>Pppery
0
Copy from sandbox per request
33391
Scribunto
text/plain
-- map of verbose project names to canonical ones
local projectMap = {
commons = 'c', commonscat = 'c', ["wikimedia commons"] = 'c', meta = 'm', metawiki = 'm', ["meta-wiki"] = 'm',
wikibooks = 'b', wbk = 'b', wb = 'b', cookbook = 'b', wikijunior = 'b',
wikidata = 'd', data = 'd', wikiquote = 'q', quote = 'q', wqt = 'q',
wikipedia = 'iw', wp = 'iw', w = 'iw', iw1 = 'iw', iw2 = 'iw',
wikisource = 's', source = 's', ws = 's', wikisource2 = 's', source2 = 's', ws2 = 's', s2 = 's',
wiktionary = 'wikt', wkt = 'wikt', wdy = 'wikt',
wikinews = 'n', news = 'n', wnw = 'n', wikispecies = 'species', wikiversity='v', wvy='v',
wikivoyage = 'voy', voyage = 'voy', mediawiki = 'mw', outreachwiki = 'outreach', wikifunctions = 'f'
}
-- logos per project
local logo = {
c = "Commons-logo.svg",
m = 'Wikimedia Community Logo.svg',
b = 'Wikibooks-logo.svg',
d = 'Wikidata-logo.svg',
q = 'Wikiquote-logo.svg',
iw = 'Wikipedia-logo-v2.svg',
s = 'Wikisource-logo.svg',
wikt = 'Wiktionary-logo-en-v2.svg',
n = 'Wikinews-logo.svg',
species = 'Wikispecies-logo.svg',
v = 'Wikiversity logo 2017.svg',
voy = 'Wikivoyage-Logo-v3-icon.svg',
mw = 'MediaWiki-2020-icon.svg',
outreach = 'Wikimedia Outreach.png',
incubator = 'Incubator-notext.svg',
f = 'Wikifunctions-logo.svg',
wm = 'Wikimedia-logo.svg'
}
-- which logos are PD and don't need link/alt
local PDicon = {
m=true,q=true,d=true,outreach=true,wm=true
}
-- which logos have custom css in styles.css
local customCSS = {wikt=true}
-- descriptive alt
local logoAlt = {
c = 'Wikimedia Commons logo',
m = 'Meta-Wiki logo',
b = 'Wikibooks logo',
d = 'Wikidata logo',
q = 'Wikiquote logo',
iw = 'Wikipedia logo',
s = 'Wikisource logo',
wikt = 'Wiktionary logo',
n = 'Wikinews logo',
species = 'Wikispecies logo',
v = 'Wikiversity logo',
voy = 'Wikivoyage logo',
mw = 'MediaWiki logo',
outreach = 'Wikimedia Outreach logo',
incubator = 'Wikimedia Incubator logo',
f = 'Wikifunctions logo',
wm = 'Wikimedia logo'
}
-- size for [[Template:Wikipedia's sister projects]], defaults to 35px
local largeSize = {
c = '31px',
d = '47px',
n = '51px',
v = '41px'
}
return {projectMap=projectMap, logo=logo, PDicon=PDicon, customCSS=customCSS, logoAlt=logoAlt, largeSize=largeSize}
7ldvcg5yhdtkti2frdj9htrbc1zck3q
33392
33391
2026-11-11T21:54:28Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Sister_project_logo/data]]
33391
Scribunto
text/plain
-- map of verbose project names to canonical ones
local projectMap = {
commons = 'c', commonscat = 'c', ["wikimedia commons"] = 'c', meta = 'm', metawiki = 'm', ["meta-wiki"] = 'm',
wikibooks = 'b', wbk = 'b', wb = 'b', cookbook = 'b', wikijunior = 'b',
wikidata = 'd', data = 'd', wikiquote = 'q', quote = 'q', wqt = 'q',
wikipedia = 'iw', wp = 'iw', w = 'iw', iw1 = 'iw', iw2 = 'iw',
wikisource = 's', source = 's', ws = 's', wikisource2 = 's', source2 = 's', ws2 = 's', s2 = 's',
wiktionary = 'wikt', wkt = 'wikt', wdy = 'wikt',
wikinews = 'n', news = 'n', wnw = 'n', wikispecies = 'species', wikiversity='v', wvy='v',
wikivoyage = 'voy', voyage = 'voy', mediawiki = 'mw', outreachwiki = 'outreach', wikifunctions = 'f'
}
-- logos per project
local logo = {
c = "Commons-logo.svg",
m = 'Wikimedia Community Logo.svg',
b = 'Wikibooks-logo.svg',
d = 'Wikidata-logo.svg',
q = 'Wikiquote-logo.svg',
iw = 'Wikipedia-logo-v2.svg',
s = 'Wikisource-logo.svg',
wikt = 'Wiktionary-logo-en-v2.svg',
n = 'Wikinews-logo.svg',
species = 'Wikispecies-logo.svg',
v = 'Wikiversity logo 2017.svg',
voy = 'Wikivoyage-Logo-v3-icon.svg',
mw = 'MediaWiki-2020-icon.svg',
outreach = 'Wikimedia Outreach.png',
incubator = 'Incubator-notext.svg',
f = 'Wikifunctions-logo.svg',
wm = 'Wikimedia-logo.svg'
}
-- which logos are PD and don't need link/alt
local PDicon = {
m=true,q=true,d=true,outreach=true,wm=true
}
-- which logos have custom css in styles.css
local customCSS = {wikt=true}
-- descriptive alt
local logoAlt = {
c = 'Wikimedia Commons logo',
m = 'Meta-Wiki logo',
b = 'Wikibooks logo',
d = 'Wikidata logo',
q = 'Wikiquote logo',
iw = 'Wikipedia logo',
s = 'Wikisource logo',
wikt = 'Wiktionary logo',
n = 'Wikinews logo',
species = 'Wikispecies logo',
v = 'Wikiversity logo',
voy = 'Wikivoyage logo',
mw = 'MediaWiki logo',
outreach = 'Wikimedia Outreach logo',
incubator = 'Wikimedia Incubator logo',
f = 'Wikifunctions logo',
wm = 'Wikimedia logo'
}
-- size for [[Template:Wikipedia's sister projects]], defaults to 35px
local largeSize = {
c = '31px',
d = '47px',
n = '51px',
v = '41px'
}
return {projectMap=projectMap, logo=logo, PDicon=PDicon, customCSS=customCSS, logoAlt=logoAlt, largeSize=largeSize}
7ldvcg5yhdtkti2frdj9htrbc1zck3q
Ruta:RAPTOR7762/sandbox
2
1597
32921
11686
2026-11-11T21:10:07Z
RAPTOR7762
18
/* */
32921
wikitext
text/x-wiki
{{Infobox country/sandbox
| conventional_long_name = Federal Republic of Nigeria
| image_flag = Flag of Nigeria.svg
| image_coat = Coat of arms of Nigeria.svg
| image_map = Nigeria (orthographic projection).svg
| national_motto = "Unity and Faith, Peace and Progress"
| national_anthem = "[[Nigeria, We Hail Thee]]"<br>[[Fayil:Nigeria, We Hail Thee - Banda do Batalhão da Guarda Presidencial, 2025.ogg]]
| official_languages = [[Yarenshe Turanci]]
| capital = [[Abuja]]
| largest_city = [[Lagos]]
| demonym = Nigerian
| ethnic_groups = 30% Hausa<br>15.5% Yoruba<br>15.2% Igbo<br>6% Fulani<br>2.4% Tiv<br>2.4% Kanuri<br>1.8% Ibibio<br>1.8% Ijaw<br>24.7% other
| government = Federal presidential republic
| leader1 = [[Bola Ahmed Tinubu]]
| leader1_type = President
| leader2 = [[Godswill Akpabio]]
| leader2_type = Senate President
| leader3 = Kudirat Kekere-Ekun
| leader3_type = Chief Justice
| sovereignty_type = Independence from [[United Kingdom]]
}}
e8s3ox7f057yc3srpte1sawro2qsi8l
Module:Transclusion count/data/U
828
1600
33450
11696
2026-10-18T05:11:56Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33450
Scribunto
text/plain
return {
["U"] = 283000,
["U.S._Coast_Guard_Cutter"] = 2800,
["U.S._House_of_Representatives_abbreviation"] = 17000,
["UAF_player"] = 2700,
["UCI_team_code"] = 14000,
["UEFA_player"] = 6100,
["UK"] = 4300,
["UK-LEG"] = 3400,
["UKR"] = 15000,
["UK_Parliament_by-election_footer"] = 2100,
["UK_legislation"] = 3800,
["URL"] = 440000,
["URL2"] = 21000,
["URS"] = 7300,
["URU"] = 2000,
["URY"] = 2400,
["US$"] = 7600,
["US-railway-routemap"] = 2100,
["US20_Invite"] = 3700,
["USA"] = 46000,
["USBill"] = 2500,
["USCGC"] = 2800,
["USCongRep-end"] = 5400,
["USCongRep-row"] = 5900,
["USCongRep-start"] = 5400,
["USCongressOrdinal"] = 6400,
["USCongressOrdinal/code"] = 6400,
["USD"] = 6500,
["USGS_gazetteer"] = 5600,
["USGovernment"] = 2100,
["USNS"] = 3500,
["USN_flag"] = 10000,
["USPL"] = 2300,
["USRaceRating"] = 2900,
["USS"] = 39000,
["USSR"] = 2200,
["USStat"] = 2600,
["US_Census_population"] = 41000,
["US_Census_population/styles.css"] = 41000,
["US_House_succession_box"] = 8200,
["US_State_Abbrev"] = 18000,
["US_county_navigation_box"] = 99000,
["US_dollar"] = 14000,
["US_government_sources"] = 2700,
["US_patent"] = 2900,
["US_political_race_rating"] = 2900,
["US_state_abbreviation_to_name"] = 19000,
["US_state_disestablishment_category"] = 5200,
["US_state_disestablishment_category/core"] = 5200,
["US_state_establishment_category"] = 10000,
["US_state_establishment_category/core"] = 10000,
["US_state_navigation_box"] = 16000,
["US_state_sports_year_category"] = 6700,
["US_state_sports_year_category/core"] = 6700,
["UTRS"] = 8800,
["UTRS-unblock-user"] = 4900,
["UTZ"] = 4400,
["UZB"] = 3100,
["Ubl"] = 303000,
["Ubli"] = 6400,
["Ublist"] = 7400,
["Ucat"] = 41000,
["Uir"] = 33000,
["Ul"] = 5900,
["Ulist"] = 8000,
["Umbox"] = 80000,
["Umbox/styles.css"] = 80000,
["Unassessed-Class"] = 12000,
["Unblock-auto_reviewed"] = 5600,
["Unblock-spamun_reviewed"] = 5400,
["Unblock-un_reviewed"] = 22000,
["Unblock_reviewed"] = 82000,
["Unblock_wizard_link"] = 8300,
["Unbulleted_indent_list"] = 8500,
["Unbulleted_list"] = 760000,
["Unbulleted_list_citebundle"] = 2700,
["Under_construction"] = 2500,
["Underline"] = 4900,
["Undisclosed_paid"] = 2900,
["Unindent"] = 4600,
["United_States_Code"] = 3800,
["United_States_Naval_Ship"] = 3500,
["United_States_Ship"] = 39000,
["United_States_presidential_election_results_table_footer"] = 3300,
["United_States_presidential_election_results_table_header"] = 3900,
["United_States_presidential_election_results_table_row"] = 3900,
["United_States_topic"] = 6000,
["Unknown"] = 3600,
["Unknown-Class"] = 12000,
["Unlikely"] = 2300,
["Unlink"] = 23000,
["Unreferenced"] = 82000,
["Unreferenced_section"] = 42000,
["Unrelated"] = 6200,
["Unreliable_source?"] = 14000,
["Unreliable_sources"] = 11000,
["Unsourced"] = 2100,
["Unsourced_section"] = 2300,
["Unspaced_apostrophe"] = 4600,
["Update"] = 36000,
["Update_after"] = 4200,
["Update_inline"] = 9500,
["Update_inline_span"] = 2500,
["Update_section"] = 5300,
["Update_span"] = 2600,
["Updated"] = 72000,
["Uploader_information"] = 160000,
["Url"] = 58000,
["Urldecode"] = 15000,
["Use_American_English"] = 737000,
["Use_Australian_English"] = 142000,
["Use_British_English"] = 433000,
["Use_Canadian_English"] = 63000,
["Use_Hiberno-English"] = 36000,
["Use_Hong_Kong_English"] = 5100,
["Use_Indian_English"] = 173000,
["Use_Irish_English"] = 10000,
["Use_New_Zealand_English"] = 40000,
["Use_Nigerian_English"] = 12000,
["Use_Oxford_spelling"] = 5400,
["Use_Pakistani_English"] = 10000,
["Use_Philippine_English"] = 12000,
["Use_South_African_English"] = 13000,
["Use_dmy_dates"] = 2000000,
["Use_list-defined_references"] = 6600,
["Use_mdy_dates"] = 1130000,
["Use_shortened_footnotes"] = 2900,
["User"] = 728000,
["User-generated_source"] = 4600,
["User-multi"] = 406000,
["User0"] = 45000,
["User19"] = 11000,
["User2"] = 4000,
["User21"] = 60000,
["User3"] = 291000,
["User4"] = 4000,
["User5"] = 7000,
["UserSummary"] = 125000,
["User_American"] = 2400,
["User_COI"] = 40000,
["User_Copy_Edit"] = 2600,
["User_Firefox"] = 6100,
["User_HTML"] = 3000,
["User_OS:Dos/style.css"] = 2200,
["User_QAIbox"] = 7300,
["User_QAIbox/auto"] = 5000,
["User_Translator"] = 2500,
["User_UN"] = 2400,
["User_WP"] = 21000,
["User_WP/switch"] = 21000,
["User_Wikipedia"] = 2700,
["User_Wikipedia/RC_Patrol"] = 3900,
["User_Wikipedia/Rollback"] = 2400,
["User_Wikipedia/WikiGnome"] = 3000,
["User_Wikipedia_reference"] = 2800,
["User_Wikipedian_For"] = 11000,
["User_Wikipedian_for"] = 17000,
["User_Wikipediholic"] = 2600,
["User_category_header"] = 2200,
["User_committed_identity"] = 2400,
["User_contrib"] = 5100,
["User_contributions"] = 5300,
["User_current_age"] = 2500,
["User_current_age/days"] = 2500,
["User_current_age/months"] = 2500,
["User_current_age/years"] = 2500,
["User_de"] = 6000,
["User_de-1"] = 8100,
["User_de-2"] = 4700,
["User_de-3"] = 2400,
["User_en"] = 43000,
["User_en-1"] = 2500,
["User_en-2"] = 7900,
["User_en-3"] = 16000,
["User_en-4"] = 10000,
["User_en-5"] = 7300,
["User_en-N"] = 5500,
["User_en-us"] = 2200,
["User_es"] = 4100,
["User_es-1"] = 7600,
["User_es-2"] = 5100,
["User_es-3"] = 2800,
["User_fr"] = 4300,
["User_fr-1"] = 9500,
["User_fr-2"] = 6900,
["User_fr-3"] = 4100,
["User_html"] = 2700,
["User_in_region"] = 33000,
["User_in_the_United_Kingdom"] = 2300,
["User_in_the_United_States"] = 5000,
["User_infobox"] = 3100,
["User_instrument"] = 2900,
["User_invitation"] = 5900,
["User_iso15924"] = 2700,
["User_iso15924/level-text"] = 3100,
["User_iso15924/user_script_catlink"] = 3000,
["User_it"] = 2000,
["User_it-1"] = 2900,
["User_ja-1"] = 3200,
["User_la-1"] = 2900,
["User_link"] = 287000,
["User_lives_in"] = 7300,
["User_male"] = 2900,
["User_oops"] = 2600,
["User_other"] = 558000,
["User_page"] = 47000,
["User_precious"] = 2100,
["User_proud"] = 5700,
["User_rights"] = 5800,
["User_ru"] = 3200,
["User_ru-1"] = 2200,
["User_sandbox"] = 186000,
["User_summary"] = 125000,
["User_talk_other"] = 83000,
["User_time_zone"] = 4300,
["User_visited"] = 6700,
["User_wikipedia"] = 2200,
["User_wikipedia/RC_Patrol"] = 3500,
["User_wikipedia/WikiGnome"] = 2900,
["User_wishes_to_visit"] = 6200,
["User_x"] = 2100,
["User_zh"] = 2500,
["Userbox"] = 346000,
["Userbox-2"] = 37000,
["Userbox-level"] = 111000,
["Userbox-r"] = 6800,
["Userbox/styles.css"] = 353000,
["UserboxCOI"] = 39000,
["Userbox_table_bottom"] = 12000,
["Userbox_table_category"] = 2400,
["Userbox_table_top"] = 12000,
["Userbox_table_userbox"] = 11000,
["Userboxbottom"] = 57000,
["Userboxtop"] = 62000,
["Usercheck-short"] = 3900,
["Userlinks"] = 36000,
["Userpage"] = 31000,
["Userpage_blanked"] = 10000,
["Userspace_draft"] = 32000,
["Userspace_file"] = 2200,
["Usertalk_other"] = 2400,
["Uses_TemplateStyles"] = 2500,
["Usgs-gazetteer"] = 5600,
["Ushr"] = 17000,
["Ussc"] = 6200,
["Usurped"] = 64000,
["Utrs"] = 5300,
["Uwl"] = 8300,
["Module:URL"] = 681000,
["Module:Unicode_data"] = 1800000,
["Module:Unicode_data/scripts"] = 402000,
["Module:Unstrip"] = 138000,
["Module:Unsubst"] = 14800000,
["Module:Unsubst-infobox"] = 208000,
["Module:Urldecode"] = 25000,
["Module:User"] = 728000,
["Module:User:AnomieBOT/Auto-G8"] = 528000,
["Module:UserLinks"] = 1130000,
["Module:UserLinks/config"] = 1130000,
["Module:UserLinks/extra"] = 23000,
["Module:UserLinks/shared"] = 1130000,
["Module:User_contrib"] = 5300,
["Module:User_name_utils"] = 128000,
["Module:Userbox"] = 353000,
["Module:Uses_TemplateStyles"] = 2500,
["Module:Uses_TemplateStyles/config"] = 2600,
["Module:Uses_Wikidata"] = 3600,
["Module:Ustring"] = 818000,
}
5xqwsnbeta3dv56cmh5nvfwpqjlf2y0
33451
33450
2026-11-11T21:57:53Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/U]]
33450
Scribunto
text/plain
return {
["U"] = 283000,
["U.S._Coast_Guard_Cutter"] = 2800,
["U.S._House_of_Representatives_abbreviation"] = 17000,
["UAF_player"] = 2700,
["UCI_team_code"] = 14000,
["UEFA_player"] = 6100,
["UK"] = 4300,
["UK-LEG"] = 3400,
["UKR"] = 15000,
["UK_Parliament_by-election_footer"] = 2100,
["UK_legislation"] = 3800,
["URL"] = 440000,
["URL2"] = 21000,
["URS"] = 7300,
["URU"] = 2000,
["URY"] = 2400,
["US$"] = 7600,
["US-railway-routemap"] = 2100,
["US20_Invite"] = 3700,
["USA"] = 46000,
["USBill"] = 2500,
["USCGC"] = 2800,
["USCongRep-end"] = 5400,
["USCongRep-row"] = 5900,
["USCongRep-start"] = 5400,
["USCongressOrdinal"] = 6400,
["USCongressOrdinal/code"] = 6400,
["USD"] = 6500,
["USGS_gazetteer"] = 5600,
["USGovernment"] = 2100,
["USNS"] = 3500,
["USN_flag"] = 10000,
["USPL"] = 2300,
["USRaceRating"] = 2900,
["USS"] = 39000,
["USSR"] = 2200,
["USStat"] = 2600,
["US_Census_population"] = 41000,
["US_Census_population/styles.css"] = 41000,
["US_House_succession_box"] = 8200,
["US_State_Abbrev"] = 18000,
["US_county_navigation_box"] = 99000,
["US_dollar"] = 14000,
["US_government_sources"] = 2700,
["US_patent"] = 2900,
["US_political_race_rating"] = 2900,
["US_state_abbreviation_to_name"] = 19000,
["US_state_disestablishment_category"] = 5200,
["US_state_disestablishment_category/core"] = 5200,
["US_state_establishment_category"] = 10000,
["US_state_establishment_category/core"] = 10000,
["US_state_navigation_box"] = 16000,
["US_state_sports_year_category"] = 6700,
["US_state_sports_year_category/core"] = 6700,
["UTRS"] = 8800,
["UTRS-unblock-user"] = 4900,
["UTZ"] = 4400,
["UZB"] = 3100,
["Ubl"] = 303000,
["Ubli"] = 6400,
["Ublist"] = 7400,
["Ucat"] = 41000,
["Uir"] = 33000,
["Ul"] = 5900,
["Ulist"] = 8000,
["Umbox"] = 80000,
["Umbox/styles.css"] = 80000,
["Unassessed-Class"] = 12000,
["Unblock-auto_reviewed"] = 5600,
["Unblock-spamun_reviewed"] = 5400,
["Unblock-un_reviewed"] = 22000,
["Unblock_reviewed"] = 82000,
["Unblock_wizard_link"] = 8300,
["Unbulleted_indent_list"] = 8500,
["Unbulleted_list"] = 760000,
["Unbulleted_list_citebundle"] = 2700,
["Under_construction"] = 2500,
["Underline"] = 4900,
["Undisclosed_paid"] = 2900,
["Unindent"] = 4600,
["United_States_Code"] = 3800,
["United_States_Naval_Ship"] = 3500,
["United_States_Ship"] = 39000,
["United_States_presidential_election_results_table_footer"] = 3300,
["United_States_presidential_election_results_table_header"] = 3900,
["United_States_presidential_election_results_table_row"] = 3900,
["United_States_topic"] = 6000,
["Unknown"] = 3600,
["Unknown-Class"] = 12000,
["Unlikely"] = 2300,
["Unlink"] = 23000,
["Unreferenced"] = 82000,
["Unreferenced_section"] = 42000,
["Unrelated"] = 6200,
["Unreliable_source?"] = 14000,
["Unreliable_sources"] = 11000,
["Unsourced"] = 2100,
["Unsourced_section"] = 2300,
["Unspaced_apostrophe"] = 4600,
["Update"] = 36000,
["Update_after"] = 4200,
["Update_inline"] = 9500,
["Update_inline_span"] = 2500,
["Update_section"] = 5300,
["Update_span"] = 2600,
["Updated"] = 72000,
["Uploader_information"] = 160000,
["Url"] = 58000,
["Urldecode"] = 15000,
["Use_American_English"] = 737000,
["Use_Australian_English"] = 142000,
["Use_British_English"] = 433000,
["Use_Canadian_English"] = 63000,
["Use_Hiberno-English"] = 36000,
["Use_Hong_Kong_English"] = 5100,
["Use_Indian_English"] = 173000,
["Use_Irish_English"] = 10000,
["Use_New_Zealand_English"] = 40000,
["Use_Nigerian_English"] = 12000,
["Use_Oxford_spelling"] = 5400,
["Use_Pakistani_English"] = 10000,
["Use_Philippine_English"] = 12000,
["Use_South_African_English"] = 13000,
["Use_dmy_dates"] = 2000000,
["Use_list-defined_references"] = 6600,
["Use_mdy_dates"] = 1130000,
["Use_shortened_footnotes"] = 2900,
["User"] = 728000,
["User-generated_source"] = 4600,
["User-multi"] = 406000,
["User0"] = 45000,
["User19"] = 11000,
["User2"] = 4000,
["User21"] = 60000,
["User3"] = 291000,
["User4"] = 4000,
["User5"] = 7000,
["UserSummary"] = 125000,
["User_American"] = 2400,
["User_COI"] = 40000,
["User_Copy_Edit"] = 2600,
["User_Firefox"] = 6100,
["User_HTML"] = 3000,
["User_OS:Dos/style.css"] = 2200,
["User_QAIbox"] = 7300,
["User_QAIbox/auto"] = 5000,
["User_Translator"] = 2500,
["User_UN"] = 2400,
["User_WP"] = 21000,
["User_WP/switch"] = 21000,
["User_Wikipedia"] = 2700,
["User_Wikipedia/RC_Patrol"] = 3900,
["User_Wikipedia/Rollback"] = 2400,
["User_Wikipedia/WikiGnome"] = 3000,
["User_Wikipedia_reference"] = 2800,
["User_Wikipedian_For"] = 11000,
["User_Wikipedian_for"] = 17000,
["User_Wikipediholic"] = 2600,
["User_category_header"] = 2200,
["User_committed_identity"] = 2400,
["User_contrib"] = 5100,
["User_contributions"] = 5300,
["User_current_age"] = 2500,
["User_current_age/days"] = 2500,
["User_current_age/months"] = 2500,
["User_current_age/years"] = 2500,
["User_de"] = 6000,
["User_de-1"] = 8100,
["User_de-2"] = 4700,
["User_de-3"] = 2400,
["User_en"] = 43000,
["User_en-1"] = 2500,
["User_en-2"] = 7900,
["User_en-3"] = 16000,
["User_en-4"] = 10000,
["User_en-5"] = 7300,
["User_en-N"] = 5500,
["User_en-us"] = 2200,
["User_es"] = 4100,
["User_es-1"] = 7600,
["User_es-2"] = 5100,
["User_es-3"] = 2800,
["User_fr"] = 4300,
["User_fr-1"] = 9500,
["User_fr-2"] = 6900,
["User_fr-3"] = 4100,
["User_html"] = 2700,
["User_in_region"] = 33000,
["User_in_the_United_Kingdom"] = 2300,
["User_in_the_United_States"] = 5000,
["User_infobox"] = 3100,
["User_instrument"] = 2900,
["User_invitation"] = 5900,
["User_iso15924"] = 2700,
["User_iso15924/level-text"] = 3100,
["User_iso15924/user_script_catlink"] = 3000,
["User_it"] = 2000,
["User_it-1"] = 2900,
["User_ja-1"] = 3200,
["User_la-1"] = 2900,
["User_link"] = 287000,
["User_lives_in"] = 7300,
["User_male"] = 2900,
["User_oops"] = 2600,
["User_other"] = 558000,
["User_page"] = 47000,
["User_precious"] = 2100,
["User_proud"] = 5700,
["User_rights"] = 5800,
["User_ru"] = 3200,
["User_ru-1"] = 2200,
["User_sandbox"] = 186000,
["User_summary"] = 125000,
["User_talk_other"] = 83000,
["User_time_zone"] = 4300,
["User_visited"] = 6700,
["User_wikipedia"] = 2200,
["User_wikipedia/RC_Patrol"] = 3500,
["User_wikipedia/WikiGnome"] = 2900,
["User_wishes_to_visit"] = 6200,
["User_x"] = 2100,
["User_zh"] = 2500,
["Userbox"] = 346000,
["Userbox-2"] = 37000,
["Userbox-level"] = 111000,
["Userbox-r"] = 6800,
["Userbox/styles.css"] = 353000,
["UserboxCOI"] = 39000,
["Userbox_table_bottom"] = 12000,
["Userbox_table_category"] = 2400,
["Userbox_table_top"] = 12000,
["Userbox_table_userbox"] = 11000,
["Userboxbottom"] = 57000,
["Userboxtop"] = 62000,
["Usercheck-short"] = 3900,
["Userlinks"] = 36000,
["Userpage"] = 31000,
["Userpage_blanked"] = 10000,
["Userspace_draft"] = 32000,
["Userspace_file"] = 2200,
["Usertalk_other"] = 2400,
["Uses_TemplateStyles"] = 2500,
["Usgs-gazetteer"] = 5600,
["Ushr"] = 17000,
["Ussc"] = 6200,
["Usurped"] = 64000,
["Utrs"] = 5300,
["Uwl"] = 8300,
["Module:URL"] = 681000,
["Module:Unicode_data"] = 1800000,
["Module:Unicode_data/scripts"] = 402000,
["Module:Unstrip"] = 138000,
["Module:Unsubst"] = 14800000,
["Module:Unsubst-infobox"] = 208000,
["Module:Urldecode"] = 25000,
["Module:User"] = 728000,
["Module:User:AnomieBOT/Auto-G8"] = 528000,
["Module:UserLinks"] = 1130000,
["Module:UserLinks/config"] = 1130000,
["Module:UserLinks/extra"] = 23000,
["Module:UserLinks/shared"] = 1130000,
["Module:User_contrib"] = 5300,
["Module:User_name_utils"] = 128000,
["Module:Userbox"] = 353000,
["Module:Uses_TemplateStyles"] = 2500,
["Module:Uses_TemplateStyles/config"] = 2600,
["Module:Uses_Wikidata"] = 3600,
["Module:Ustring"] = 818000,
}
5xqwsnbeta3dv56cmh5nvfwpqjlf2y0
Tempilet:Country data Nigeria
10
1710
33183
2023-04-30T14:36:57Z
en>Paine Ellsworth
0
per edit request on talk page - include flag variant
33183
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Nigeria
| flag alias = Flag of Nigeria.svg
| flag alias-state = Flag of Nigeria (state).svg
| flag alias-colonial = Flag of Nigeria (1914–1952).svg
| flag alias-naval = Naval Ensign of Nigeria.svg
| link alias-naval = Nigerian Navy
| flag alias-army = Flag of the Nigerian Army Headquarters.svg
| link alias-army = Nigerian Army
| flag alias-military=Flag of the Nigerian Armed Forces.svg
| link alias-military=Nigerian Armed Forces
| flag alias-air force = Air Force Ensign of Nigeria.svg
| link alias-air force = Nigerian Air Force
| flag alias-navy = Naval Ensign of Nigeria.svg
| link alias-navy = Nigerian Navy
| flag alias-civil = Civil Ensign of Nigeria.svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = state
| var2 = colonial
| var3 = civil
| redir1 = NGA
| redir2 = NGR
</noinclude>
}}
lr05sv4m5jeuwlz75laq7pfyam1hcas
33184
11957
2026-11-11T21:44:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Nigeria]]
11957
wikitext
text/x-wiki
#REDIRECT [[Tempilet:Country data Nijeriya]]
j7w9auxcd08qzxxrlnctduopj3h4ng9
Module:IPA symbol/data
828
2310
33091
15671
2026-11-10T20:49:40Z
en>Oklopfer
0
new syntax example
33091
Scribunto
text/plain
local data = {
sounds = {},
diacritics = {},
univPatterns = {
{
pat = "g", -- Latin Small Letter G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵍ", -- Modifier Letter Small G
rep = "ᶢ" -- Modifier Letter Small Script G
},
{
pat = "l̴", -- 'l' + Combining Tilde Overlay
rep = "ɫ" -- Latin Small Letter L with Middle Tilde
},
{
pat = "ˁ", -- Modifier Letter Reversed Glottal Stop
rep = "ˤ" -- Modifier Letter Small Reversed Glottal Stop
},
{
pat = "’", -- Right Single Quotation Mark
rep = "ʼ" -- Modifier Letter Apostrophe
},
{
pat = "ı", -- Latin Small Letter Dotless I
rep = "i" -- Latin Small Letter I
},
{
pat = "ȷ", -- Latin Small Letter Dotless J
rep = "j" -- Latin Small Letter J
},
{
pat = "ʇ", -- Latin Small Letter Turned T
rep = "ǀ" -- Latin Letter Dental Click
},
{
pat = "[!ʗ]", -- Exclamation Mark / Latin Letter Stretched C
rep = "ǃ" -- Latin Letter Retroflex Click
},
{
pat = "𝼋", --
rep = "ǂ" --
},
{
pat = "ψ", -- Greek Letter Psi
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "‼", -- Double exclamation mark
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ǃǃ", -- Latin Letter Retroflex Click x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "!!", -- Exclamation mark x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ʖ", -- Latin Letter Inverted Glottal Stop
rep = "ǁ" -- Latin Letter Lateral Click
},
{
pat = "ɋ", --
rep = "ʘ" --
},
{
pat = "ꞵ", -- Latin Small Letter Beta
rep = "β" -- Greek Small Letter Beta
},
{
pat = "γ", -- Greek Small Letter Gamma
rep = "ɣ" -- Latin Small Letter Gamma
},
{
pat = "φ", -- Greek Small Letter Phi
rep = "ɸ" -- Latin Small Letter Phi
},
{
pat = "ꭓ", -- Latin Small Letter Chi
rep = "χ" -- Greek Small Letter Chi
},
{
pat = "̮", -- Combining Breve Below
rep = "̆" -- Combining Breve
},
},
keyPatterns = {
-- These do not affect the reverse look for diacritics
{
pat = "[͜͡ːˑ◌]", -- Tie bars, length marks, dotted circle
rep = ""
},
{
pat = "ᵏ", -- Modifier Letter Small K
rep = "k" -- Latin Small Letter K
},
{
pat = "ᶢ", -- Modifier Letter Small Script G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵑ", -- Modifier Letter Small Eng
rep = "ŋ" -- Latin Small Letter Eng
},
}
}
local rawData = {
sounds = {
-- PULMONIC CONSONANTS
-- Nasals
{
name = "Voiceless bilabial nasal",
symbols = { "m̥" },
audio = "Voiceless Bilabial Nasal.ogg"
},
{
name = "Voiced bilabial nasal",
symbols = { "m" },
audio = "Bilabial nasal.ogg"
},
{
name = "Voiceless labiodental nasal",
symbols = { "ɱ̊", "ɱ̥" },
audio = "Voiceless labiodental nasal.ogg"
},
{
name = "Voiced labiodental nasal",
symbols = { "ɱ" },
audio = "Labiodental nasal.ogg"
},
{
name = "Voiced linguolabial nasal",
symbols = { "n̼", "m̺", "m̼" },
audio = "Linguolabial nasal.ogg"
},
{
name = "Voiceless dental nasal",
symbols = { "n̪̊" }
},
{
name = "Voiced dental nasal",
symbols = { "n̪" },
audio = "Voiced Dental Nasal.ogg"
},
{
name = "Voiceless alveolar nasal",
symbols = { "n̥" },
audio = "Voiceless Alveolar Nasal.ogg"
},
{
name = "Voiced alveolar nasal",
symbols = { "n" },
audio = "Alveolar nasal.ogg"
},
{
name = "Voiceless postalveolar nasal",
symbols = { "n̠̊" },
},
{
name = "Voiced postalveolar nasal",
symbols = { "n̠" },
audio = "Voiced postalveolar nasal.ogg"
},
{
name = "Voiceless retroflex nasal",
symbols = { "ɳ̊", "ɳ̥" },
audio = "Voiceless retroflex nasal.wav"
},
{
name = "Voiced retroflex nasal",
symbols = { "ɳ" },
audio = "Retroflex nasal.ogg"
},
{
name = "Voiceless alveolo-palatal nasal",
symbols = { "n̠̊ʲ", "ɲ̊˖", "ɲ̟̊", "ȵ̊" },
},
{
name = "Voiced alveolo-palatal nasal",
symbols = { "n̠ʲ", "ɲ˖", "ɲ̟", "ȵ" },
},
{
name = "Voiceless palatal nasal",
symbols = { "ɲ̊", "ɲ̥" },
audio = "Voiceless palatal nasal.ogg"
},
{
name = "Voiced palatal nasal",
symbols = { "ɲ" },
audio = "Palatal nasal.ogg"
},
{
name = "Voiced post-palatal or pre-velar nasal",
symbols = { "ɲ˗", "ɲ̠", "ɲ", "ŋ˖", "ŋ᫈", "ŋ̟" },
article = "Voiced post-palatal nasal"
},
{
name = "Voiceless velar nasal",
symbols = { "ŋ̊", "ŋ̥" },
audio = "Voiceless velar nasal.wav"
},
{
name = "Voiced velar nasal",
symbols = { "ŋ" },
audio = "Velar nasal.ogg"
},
{
name = "Voiced pre-uvular nasal",
symbols = { "ɴ̟", "ŋ˗", "ŋ", "ŋ̠" },
},
{
name = "Voiceless uvular nasal",
symbols = { "ɴ̥", "ɴ̊" },
audio = "Voiceless uvular nasal.ogg"
},
{
name = "Voiced uvular nasal",
symbols = { "ɴ" },
audio = "Uvular nasal.ogg"
},
-- Plosives
{
name = "Voiceless bilabial plosive",
symbols = { "p" },
audio = "Voiceless bilabial plosive.ogg"
},
{
name = "Voiced bilabial plosive",
symbols = { "b" },
image = "IPA Unicode 0x0062.svg",
audio = "Voiced bilabial plosive.ogg"
},
{
name = "Voiceless labiodental plosive",
symbols = { "p̪" },
audio = "Voiceless labiodental plosive.ogg"
},
{
name = "Voiced labiodental plosive",
symbols = { "b̪" },
audio = "Voiced labiodental plosive.wav"
},
{
name = "Voiceless linguolabial plosive",
symbols = { "t̼", "p̺", "p̼" },
audio = "Voiceless linguolabial stop.ogg"
},
{
name = "Voiced linguolabial plosive",
symbols = { "d̼", "b̺", "b̼" },
audio = "Voiced linguolabial stop.ogg"
},
{
name = "Voiceless dental plosive",
symbols = { "t̪", "θ̝" },
audio = "Voiceless dental stop.ogg"
},
{
name = "Voiced dental plosive",
symbols = { "d̪", "ð̝" },
audio = "Voiced dental stop.ogg"
},
{
name = "Voiceless alveolar plosive",
symbols = { "t" },
audio = "Voiceless alveolar plosive.ogg"
},
{
name = "Voiced alveolar plosive",
symbols = { "d" },
audio = "Voiced alveolar plosive.ogg"
},
{
name = "Voiceless postalveolar plosive",
symbols = { "t̠" },
audio = "Voiceless postalveolar stop.ogg"
},
{
name = "Voiced postalveolar plosive",
symbols = { "d̠" },
audio = "Voiced postalveolar stop.ogg"
},
{
name = "Voiceless retroflex plosive",
symbols = { "ʈ" },
audio = "Voiceless retroflex stop.oga"
},
{
name = "Voiced retroflex plosive",
symbols = { "ɖ" },
audio = "Voiced retroflex stop.oga"
},
{
name = "Voiceless alveolo-palatal plosive",
symbols = { "t̠ʲ", "c̟", "ȶ" },
audio = "IPA sound - ȶ.ogg"
},
{
name = "Voiced alveolo-palatal plosive",
symbols = { "d̠ʲ", "ɟ˖", "ɟ᫈", "ɟ̟", "ȡ" },
audio = "Voiced alveolo-palatal plosive.ogg"
},
{
name = "Voiceless palatal plosive",
symbols = { "c" },
audio = "Voiceless palatal plosive.ogg"
},
{
name = "Voiced palatal plosive",
symbols = { "ɟ" },
audio = "Voiced palatal plosive.ogg"
},
{
name = "Voiceless post-palatal or pre-velar plosive",
symbols = { "c̠", "k̟" },
article = "Voiceless post-palatal plosive"
},
{
name = "Voiced post-palatal or pre-velar plosive",
symbols = { "ɟ˗", "ɟ", "ɟ̠", "ɡ˖", "ɡ᫈", "ɡ̟" },
article = "Voiced post-palatal plosive"
},
{
name = "Voiceless velar plosive",
symbols = { "k" },
audio = "Voiceless velar plosive.ogg"
},
{
name = "Voiced velar plosive",
symbols = { "ɡ" },
audio = "Voiced velar plosive 02.ogg"
},
{
name = "Voiceless pre-uvular plosive",
symbols = { "q˖", "q᫈", "q̟", "k̠" },
},
{
name = "Voiced pre-uvular plosive",
symbols = { "ɢ̟", "ɡ˗", "ɡ", "ɡ̠" },
audio = "Voiced velar-uvular plosive.ogg"
},
{
name = "Voiceless uvular plosive",
symbols = { "q" },
audio = "Voiceless uvular plosive.ogg"
},
{
name = "Voiced uvular plosive",
symbols = { "ɢ" },
audio = "Voiced uvular stop.oga"
},
{
name = "Voiceless upper-pharyngeal plosive",
symbols = { "ꞯ", "q˗", "q", "ʡ̟̥", "ʡ̥˖" },
audio = "Voiceless pharyngeal stop.ogg"
},
{
name = "Voiced upper-pharyngeal plosive",
symbols = { "𝼂", "ɢ̠", "ʡ̟̬", "ʡ̬˖" },
audio = "Voiced pharyngeal stop.ogg"
},
{
name = "Epiglottal plosive",
symbols = { "ʡ" },
audio = "Epiglottal stop.ogg"
},
{
name = "Voiceless epiglottal plosive",
symbols = { "ʡ̥" },
},
{
name = "Voiced epiglottal plosive",
symbols = { "ʡ̬" },
},
{
name = "Glottal stop",
symbols = { "ʔ" },
audio = "Glottal stop.ogg"
},
-- Affricates
{
name = "Voiceless bilabial affricate",
symbols = { "pɸ" },
audio = "Voiceless bilabial affricate.ogg"
},
{
name = "Voiced bilabial affricate",
symbols = { "bβ" },
audio = "Voiced bilabial affricate.wav"
},
{
name = "Voiceless bilabial trilled affricate",
symbols = { "t̪ʙ̥", "tʙ̥", "tʙ̥ʰ", "pʙ̥", "pʙ̥ʰ", "kʙ̥" },
article = "Voiceless bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiced bilabial trilled affricate",
symbols = { "t̪ʙ", "tʙ", "d̪ʙ", "dʙ", "pʙ", "bʙ", "ɡʙ" },
article = "Voiced bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiceless labiodental affricate",
symbols = { "p̪f", "pf" },
audio = "Voiceless labiodental affricate.ogg"
},
{
name = "Voiced labiodental affricate",
symbols = { "b̪v", "bv" },
audio = "Voiced labiodental affricate.ogg"
},
{
name = "Voiceless dental sibilant affricate",
symbols = { "t̪s̪", "ts̪", "t̟s̟", "ts̟" },
audio = "Voiceless dental sibilant affricate.oga"
},
{
name = "Voiced dental sibilant affricate",
symbols = { "d̪z̪", "dz̪", "d̟z̟", "dz̟" },
audio = "Voiced dental sibilant affricate.oga"
},
{
name = "Voiceless dental affricate",
symbols = { "t̪θ", "t̟θ", "tθ" },
audio = "Voiceless dental non-sibilant affricate.oga"
},
{
name = "Voiced dental affricate",
symbols = { "d̪ð", "d̟ð", "dð" },
audio = "Voiced dental non-sibilant affricate.oga"
},
{
name = "Voiceless alveolar affricate",
symbols = { "ts", "ʦ" },
audio = "Voiceless alveolar sibilant affricate.oga"
},
{
name = "Voiced alveolar affricate",
symbols = { "dz", "ʣ" },
audio = "Voiced alveolar sibilant affricate.oga"
},
{
name = "Voiceless apico-alveolar affricate",
symbols = { "t̺s̺", "ts̺", "t̠s̠", "ts̠" },
},
{
name = "Voiced apico-alveolar affricate",
symbols = { "d̺z̺", "dz̺", "d̠z̠", "dz̠" },
},
{
name = "Voiceless alveolar non-sibilant affricate",
symbols = { "tɹ̝̊", "tɹ̥", "tθ̠", "tθ͇" },
},
{
name = "Voiced alveolar non-sibilant affricate",
symbols = { "dɹ̝", "dɹ", "dð̠", "dð͇" },
},
{
name = "Voiceless postalveolar affricate",
symbols = { "t̠ʃ", "tʃ", "ʧ" },
audio = "Voiceless palato-alveolar affricate.ogg"
},
{
name = "Voiced postalveolar affricate",
symbols = { "d̠ʒ", "dʒ", "ʤ" },
audio = "Voiced palato-alveolar affricate.ogg"
},
{
name = "Voiceless postalveolar non-sibilant affricate",
symbols = { "t̠ɹ̠̊˔", "tɹ̠̊˔", "tɹ̝̊˗", "t̠ɹ̝̊˗", "t̠ɹ̠̊", "tɹ̠̊" },
audio = "Voiceless postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiced postalveolar non-sibilant affricate",
symbols = { "d̠ɹ̠˔", "d̠ɹ̠᷵", "dɹ̠˔", "dɹ̝˗", "d̠ɹ̝˗", "d̠ɹ̠", "dɹ̠" },
audio = "Voiced postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiceless retroflex affricate",
symbols = { "ʈʂ", "tʂ", "ꭧ" },
audio = "Voiceless retroflex affricate.ogg"
},
{
name = "Voiced retroflex affricate",
symbols = { "ɖʐ", "dʐ", "ꭦ" },
audio = "Voiced retroflex affricate.ogg"
},
{
name = "Voiced retroflex non-sibilant affricate",
symbols = { "dɻ˔", "ɖɻ᷵", "d̠ɻ̝", "ɖɻ˔" },
audio = "Voiced retroflex non-sibilant affricate.ogg"
},
{
name = "Voiceless alveolo-palatal affricate",
symbols = { "tɕ", "cɕ", "t̠ʃʲ", "tʃʲ", "t̺s̺ʲ", "ts̺ʲ", "t̠s̠ʲ", "ts̠ʲ", "ʨ" },
audio = "Voiceless alveolo-palatal affricate.ogg"
},
{
name = "Voiced alveolo-palatal affricate",
symbols = { "dʑ", "ɟʑ", "d̠ʒʲ", "dʒʲ", "d̺z̺ʲ", "dz̺ʲ", "d̠z̠ʲ", "dz̠ʲ", "ʥ" },
audio = "Voiced alveolo-palatal affricate.ogg"
},
{
name = "Voiceless palatal affricate",
symbols = { "cç" },
audio = "Voiceless palatal affricate.ogg"
},
{
name = "Voiced palatal affricate",
symbols = { "ɟʝ" },
audio = "Voiced palatal affricate.ogg"
},
{
name = "Voiceless post-palatal or pre-velar affricate",
symbols = { "c̠ç˗", "cç˗", "c̠ç̠", "cç̠", "k̟x̟", "kx̟" },
article = "Voiceless post-palatal affricate"
},
{
name = "Voiceless velar affricate",
symbols = { "kx" },
audio = "Voiceless velar affricate.ogg"
},
{
name = "Voiced velar affricate",
symbols = { "ɡɣ" },
audio = "Voiced velar affricate.ogg"
},
{
name = "Voiceless pre-uvular affricate",
symbols = { "q˖χ˖", "qχ˖", "q̟χ̟", "qχ̟", "k̠x̠", "kx̠" },
},
{
name = "Voiceless uvular affricate",
symbols = { "qχ" },
audio = "Voiceless uvular affricate.ogg"
},
{
name = "Voiced uvular affricate",
symbols = { "ɢʁ" },
audio = "Voiced uvular affricate.ogg"
},
{
name = "Voiceless pharyngeal affricate",
symbols = { "ʡħ", "ʡ̥ħ" },
},
{
name = "Voiced pharyngeal affricate",
symbols = { "ʡʕ", "ʡ̬ʕ" },
},
{
name = "Voiceless epiglottal affricate",
symbols = { "ʡʜ", "ʡ̥ʜ" },
audio = "Voiceless epiglottal affricate.ogg"
},
{
name = "Voiced epiglottal affricate",
symbols = { "ʡʢ", "ʡ̬ʢ" },
audio = "Voiced epiglottal affricate.ogg"
},
{
name = "Voiceless glottal affricate",
symbols = { "ʔh" },
audio = "Voiceless glottal affricate.ogg"
},
-- Fricatives
{
name = "Voiceless bilabial fricative",
symbols = { "ɸ" },
audio = "Voiceless bilabial fricative.ogg"
},
{
name = "Voiced bilabial fricative",
symbols = { "β" },
audio = "Voiced bilabial fricative.ogg"
},
{
name = "Voiceless labiodental fricative",
symbols = { "f" },
audio = "Voiceless labio-dental fricative.ogg"
},
{
name = "Voiced labiodental fricative",
symbols = { "v" },
audio = "Voiced labio-dental fricative.ogg"
},
{
name = "Voiceless linguolabial fricative",
symbols = { "θ̼", "ɸ̺", "f̼", "ɸ̼" },
audio = "Voiceless linguolabial fricative.ogg"
},
{
name = "Voiced linguolabial fricative",
symbols = { "ð̼", "β̺", "v̼", "β̼" },
audio = "Voiced linguolabial fricative.wav"
},
{
name = "Voiceless dental fricative",
symbols = { "θ" },
audio = "Voiceless dental fricative.ogg"
},
{
name = "Voiced dental fricative",
symbols = { "ð" },
audio = "Voiced dental fricative.ogg"
},
{
name = "Voiceless dental sibilant fricative",
symbols = { "s̪" },
audio = "Voiceless dental sibilant fricative.ogg"
},
{
name = "Voiced dental sibilant fricative",
symbols = { "z̪" },
},
{
name = "Voiceless denti-alveolar fricative",
symbols = { "s̻̪", "s̪̻", "s̻͆", "s̟" },
},
{
name = "Voiceless alveolar fricative",
symbols = { "s" },
audio = "Voiceless alveolar sibilant.ogg"
},
{
name = "Voiced alveolar fricative",
symbols = { "z" },
audio = "Voiced alveolar sibilant.ogg"
},
{
name = "Voiceless apico-alveolar fricative",
symbols = { "s̺" },
},
{
name = "Voiced apico-alveolar fricative",
symbols = { "z̺" },
},
{
name = "Voiceless retracted alveolar fricative",
symbols = { "s̠" },
audio = "Voiceless alveolar retracted sibilant.ogg"
},
{
name = "Voiced retracted alveolar fricative",
symbols = { "z̠" },
},
{
name = "Voiceless alveolar non-sibilant fricative",
symbols = { "θ̠", "θ͇", "t̞", "ɹ̝̊" },
},
{
name = "Voiced alveolar non-sibilant fricative",
symbols = { "ð̠", "ð͇", "d̞", "ɹ̝" },
},
{
name = "Voiceless alveolar tapped fricative",
symbols = { "ɾ̞̊" },
},
{
name = "Voiced alveolar tapped fricative",
symbols = { "ɾ̞" },
},
{
name = "Voiceless postalveolar fricative",
symbols = { "ʃ" },
audio = "Voiceless palato-alveolar sibilant.ogg"
},
{
name = "Voiced postalveolar fricative",
symbols = { "ʒ" },
audio = "Voiced palato-alveolar sibilant.ogg"
},
{
name = "Voiceless postalveolar non-sibilant fricative",
symbols = { "ɹ̠̊˔", "ɹ̝̊˗" },
audio = "Voiceless postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiced postalveolar non-sibilant fricative",
symbols = { "ɹ̠˔", "ɹ̠᷵", "ɹ̝˗" },
audio = "Voiced postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiceless retroflex fricative",
symbols = { "ʂ" },
audio = "Voiceless retroflex sibilant.ogg"
},
{
name = "Voiced retroflex fricative",
symbols = { "ʐ" },
audio = "Voiced retroflex sibilant.ogg"
},
{
name = "Voiceless retroflex non-sibilant fricative",
symbols = { "ɻ̝̊", "ɻ̊˔", "ʈ̞", "ʈ˕" },
audio = "Voiceless retroflex non-sibilant fricative.ogg"
},
{
name = "Voiced retroflex non-sibilant fricative",
symbols = { "ɻ̝", "ɻ˔", "ɻ᷵", "ɖ̞", "ɖ˕" },
audio = "Voiced retroflex non-sibilant fricative.ogg"
},
{
name = "Voiceless alveolo-palatal fricative",
symbols = { "ɕ", "ʃʲ", "s̺ʲ", "s̠ʲ"},
audio = "Voiceless alveolo-palatal sibilant.ogg"
},
{
name = "Voiced alveolo-palatal fricative",
symbols = { "ʑ", "ʒʲ", "z̺ʲ", "z̠ʲ"},
audio = "Voiced alveolo-palatal sibilant.ogg"
},
{
name = "Voiceless palatal fricative",
symbols = { "ç" },
audio = "Voiceless palatal fricative.ogg"
},
{
name = "Voiced palatal fricative",
symbols = { "ʝ" },
audio = "Voiced palatal fricative.ogg"
},
{
name = "Voiceless post-palatal or pre-velar fricative",
symbols = { "ç˗", "ç̠", "ç", "x̟" },
article = "Voiceless post-palatal fricative",
audio = "Voiceless post-palatal fricative.ogg"
},
{
name = "Voiced post-palatal or pre-velar fricative",
symbols = { "ʝ", "ʝ̠", "ɣ᫈", "ɣ̟" },
article = "Voiced post-palatal fricative",
audio = "Voiced post-palatal fricative.ogg"
},
{
name = "Voiceless velar fricative",
symbols = { "x" },
audio = "Voiceless velar fricative.ogg"
},
{
name = "Voiced velar fricative",
symbols = { "ɣ" },
audio = "Voiced velar fricative.ogg"
},
{
name = "Voiceless pre-uvular fricative",
symbols = { "χ˖", "χ̟", "x̠" },
},
{
name = "Voiced pre-uvular fricative",
symbols = { "ʁ̟", "ɣ˗", "ɣ̠" },
},
{
name = "Voiceless uvular fricative",
symbols = { "χ" },
audio = "Voiceless uvular fricative.ogg"
},
{
name = "Voiced uvular fricative",
symbols = { "ʁ" },
audio = "Voiced uvular fricative.ogg"
},
{
name = "Voiceless pharyngeal fricative",
symbols = { "ħ" },
audio = "Voiceless pharyngeal fricative.ogg"
},
{
name = "Voiced pharyngeal fricative",
symbols = { "ʕ", "ʕ̝" },
audio = "Voiced pharyngeal fricative.ogg"
},
{
name = "Voiceless glottal fricative",
symbols = { "h" },
audio = "Voiceless glottal fricative.ogg"
},
{
name = "Voiced glottal fricative",
symbols = { "ɦ" },
audio = "Voiced glottal fricative.ogg"
},
{
name = "Voiceless bidental fricative",
symbols = { "h̪͆" },
audio = "Voiceless bidental fricative.ogg"
},
{
name = "Voiceless dentolabial fricative",
symbols = { "f͆" },
audio = "Voiceless dentolabial fricative.ogg"
},
-- Approximants
{
name = "Voiceless bilabial approximant",
symbols = { "ɸ̞", "ɸ˕" },
audio = "Voiceless bilabial approximant.ogg"
},
{
name = "Voiced bilabial approximant",
symbols = { "β̞", "ʋ̟" },
audio = "Bilabial approximant.ogg"
},
{
name = "Voiceless labiodental approximant",
symbols = { "ʋ̥" },
audio = "Voiceless labiodental approximant.ogg"
},
{
name = "Voiced labiodental approximant",
symbols = { "ʋ" },
audio = "Labiodental approximant.ogg"
},
{
name = "Voiceless dental approximant",
symbols = { "θ̞", "θ̞᫈", "ɹ̪̊" },
},
{
name = "Voiced dental approximant",
symbols = { "ð̞", "ɹ̪" },
},
{
name = "Voiceless alveolar approximant",
symbols = { "ɹ̥" },
audio = "Voiceless alveolar approximant.ogg"
},
{
name = "Voiceless alveolar spirant approximant",
symbols = { "s̞" },
},
{
name = "Voiced alveolar approximant",
symbols = { "ɹ" },
audio = "Alveolar approximant.ogg"
},
{
name = "Voiced alveolar spirant approximant",
symbols = { "z̞", "ð̠˕" },
},
{
name = "Voiceless postalveolar approximant",
symbols = { "ɹ̠̊" },
},
{
name = "Voiced postalveolar approximant",
symbols = { "ɹ̠" },
audio = "Postalveolar approximant.ogg"
},
{
name = "Voiceless retroflex approximant",
symbols = { "ɻ̊" },
},
{
name = "Voiced retroflex approximant",
symbols = { "ɻ" },
audio = "Retroflex Approximant2.oga"
},
{
name = "Voiceless palatal approximant",
symbols = { "j̊", "ç˕", "ç̞"},
audio = "Voiceless palatal approximant.wav"
},
{
name = "Voiced palatal approximant",
symbols = { "j", "ʝ˕", "ʝ̞" },
audio = "Palatal approximant.ogg"
},
{
name = "Voiced post-palatal or pre-velar approximant",
symbols = { "j", "j̠", "j˗", "j̈", "ʝ̞˗", "ʝ̞", "ɰ̈", "ɰ̟", "ɰ˖", "ɣ̞˖", "ɣ̞᫈" },
article = "Voiced post-palatal approximant",
audio = "Post-palatal approximant.ogg"
},
{
name = "Protruded post-palatal or pre-velar approximant",
symbols = { "j˗ʷ", "jʷ", "j̈ʷ", "ɥ̫̈", "ẅ", "w̟" },
audio = "Voiced labialized post-palatal approximant.ogg",
article = "Protruded post-palatal approximant"
},
{
name = "Compressed post-palatal or pre-velar approximant",
symbols = { "ɥ̈", "ɥ˗", "ɥ", "j̈ᵝ", "j˗ᵝ", "jᵝ" },
article = "Compressed post-palatal approximant"
},
{
name = "Voiced velar approximant",
symbols = { "ɰ", "ɣ˕", "ɣ", "ɣ̞" },
audio = "Voiced velar approximant.ogg"
},
{
name = "Voiced velar bunched approximant",
symbols = { "ɹ̈ "},
},
{
name = "Voiced uvular approximant",
symbols = { "ʁ̞" },
audio = "Voiced Uvular Approximant.ogg"
},
{
name = "Voiced pharyngeal approximant",
symbols = { "ʕ̞" },
audio = "Voiced pharyngeal approximant.ogg"
},
{
name = "Voiced epiglottal approximant",
symbols = { "ʢ̞", "ʕ̞˗" },
audio = "Voiced epiglottal trill.ogg"
},
{
name = "Creaky-voiced glottal approximant",
symbols = { "ʔ̬", "ʔ̞", "ʔ̰", "˷" },
audio = "Creaky-voiced glottal approximant.wav"
},
-- Taps/flaps
{
name = "Voiced bilabial flap",
symbols = { "ⱱ̟", "b̆", "w̆" },
audio = "Voiced bilabial flap.wav"
},
{
name = "Voiced labiodental flap",
symbols = { "ⱱ", "v̆" },
audio = "Labiodental flap.ogg"
},
{
name = "Voiceless dental tap or flap",
symbols = { "ɾ̪̊", "t̪̆" },
article = "Voiceless dental tap"
},
{
name = "Voiced dental tap or flap",
symbols = { "ɾ̪", "d̪̆" },
article = "Dental tap",
},
{
name = "Voiceless alveolar tap or flap",
symbols = { "ɾ̥", "t̆" },
article = "Voiceless alveolar tap",
audio = "Voiceless alveolar tap.wav"
},
{
name = "Voiced alveolar tap or flap",
symbols = { "ɾ", "d̆" },
audio = "Alveolar tap.ogg"
},
{
name = "Voiced postalveolar flap",
symbols = { "ɾ̠", "d̠̆"},
},
{
name = "Voiced alveolar nasal tap or flap",
symbols = { "ɾ̃", "n̆" },
article = "Alveolar nasal tap",
},
{
name = "Voiceless retroflex flap",
symbols = { "ɽ̊", "ʈ̆" },
--audio = "Voiceless retroflex tap.wav"
},
{
name = "Voiced retroflex flap",
symbols = { "ɽ", "ɖ̆" },
audio = "Retroflex flap.ogg"
},
{
name = "Voiced retroflex nasal flap",
symbols = { "ɽ̃", "ɳ̆" },
},
{
name = "Voiced velar tap",
symbols = { "ɡ̆" },
audio = "Voiced velar tap.wav"
},
{
name = "Voiced uvular tap or flap",
symbols = { "ɢ̆", "ʀ̆" },
article = "Voiced uvular tap and flap",
audio = "Voiced uvular tap.wav"
},
{
name = "Voiced epiglottal tap",
symbols = { "ʡ̆", "ʢ̆", "ʕ̆" },
audio = "Epiglottal flap.oga"
},
-- Trills
{
name = "Voiceless bilabial trill",
symbols = { "ʙ̥" },
audio = "Voiceless bilabial trill with aspiration.ogg"
},
{
name = "Voiced bilabial trill",
symbols = { "ʙ" },
audio = "Bilabial trill.ogg"
},
{
name = "Voiceless labiolingual trill",
symbols = { "r̼̊", "ʙ̺̊", "ʙ̼̊" },
audio = "Voiceless linguolabial trill.wav"
},
{
name = "Voiced labiolingual trill",
symbols = { "r̼", "ʙ̺", "ʙ̼" },
audio = "Voiced linguolabial trill.wav"
},
{
name = "Voiceless dental trill",
symbols = { "r̪̊" }
},
{
name = "Voiced dental trill",
symbols = { "r̪" },
},
{
name = "Voiceless alveolar trill",
symbols = { "r̥" },
audio = "Voiceless alveolar trill.ogg"
},
{
name = "Voiced alveolar trill",
symbols = { "r" },
audio = "Alveolar trill.ogg"
},
{
name = "Voiceless alveolar fricative trill",
symbols = { "r̝̊" },
audio = "Voiceless alveolar raised non-sonorant trill.ogg"
},
{
name = "Voiced alveolar fricative trill",
symbols = { "r̝" },
audio = "Raised alveolar non-sonorant trill.ogg"
},
{
name = "Voiceless postalveolar trill",
symbols = { "r̠̊" }
},
{
name = "Voiced postalveolar trill",
symbols = { "r̠" },
audio = "Voiced postalveolar trill.ogg"
},
{
name = "Voiceless retroflex trill",
symbols = { "ɽ̊r̥", "ɽr̥", "ɽ̊ʳ" },
audio = "Voiceless retroflex trill.ogg"
},
{
name = "Voiced retroflex trill",
symbols = { "ɽr", "ɽʳ" },
audio = "Voiced retroflex trill.ogg"
},
{
name = "Voiceless pre-uvular fricative trill",
symbols = { "ʀ̝̊˖", "ʀ̟̊˔" },
},
{
name = "Voiced pre-uvular fricative trill",
symbols = { "ʀ̝˖", "ʀ̟˔" },
},
{
name = "Voiceless uvular trill",
symbols = { "ʀ̥" },
audio = "Voiceless uvular trill.ogg"
},
{
name = "Voiced uvular trill",
symbols = { "ʀ" },
audio = "Uvular trill.ogg"
},
{
name = "Voiceless uvular fricative trill",
symbols = { "ʀ̝̊" },
audio = "Voiceless uvular fricative trill.ogg"
},
{
name = "Voiced uvular fricative trill",
symbols = { "ʀ̝" },
audio = "Voiced uvular fricative trill.wav"
},
{
name = "Voiceless epiglottal trill",
symbols = { "ʜ" },
audio = "Voiceless epiglottal trill.ogg"
},
{
name = "Voiced epiglottal trill",
symbols = { "ʢ" },
audio = "Voiced epiglottal trill 2.ogg"
},
-- Lateral affricates
{
name = "Voiceless alveolar lateral affricate",
symbols = { "tɬ" },
audio = "Voiceless alveolar lateral affricate.ogg"
},
{
name = "Voiced alveolar lateral affricate",
symbols = { "dɮ" },
audio = "Voiced alveolar lateral affricate.ogg"
},
{
name = "Voiceless retroflex lateral affricate",
symbols = { "ʈꞎ", "tꞎ", "ʈɭ̊˔", "tɭ̊˔", "ʈɭ̊", "tɭ̊" },
audio = "Voiceless retroflex lateral affricate.ogg"
},
{
name = "Voiced retroflex lateral affricate",
symbols = { "ɖ𝼅", "d𝼅", "ɖɭ˔", "dɭ˔", "ɖɭ", "dɭ" },
audio = "Voiced retroflex lateral affricate.ogg"
},
{
name = "Voiceless palatal lateral affricate",
symbols = { "cʎ̝̊", "cʎ̥", "c𝼆", "t𝼆" },
audio = "Voiceless palatal lateral affricate.ogg"
},
{
name = "Voiced palatal lateral affricate",
symbols = { "ɟʎ̝", "ɟʎ", "ɟ𝼆̬", "d𝼆̬" },
audio = "Voiced palatal lateral affricate.ogg"
},
{
name = "Voiceless post-palatal lateral affricate",
symbols = { "c𝼆˗" },
article = "Voiceless velar lateral affricate"
},
{
name = "Voiceless velar lateral affricate",
symbols = { "kʟ̝̊", "kʟ̥", "k𝼄" },
audio = "Voiceless velar lateral affricate.ogg"
},
{
name = "Voiced velar lateral affricate",
symbols = { "ɡʟ̝", "ɡʟ", "ɡ𝼄̬" },
audio = "Voiced velar lateral affricate.ogg"
},
-- Lateral fricatives
{
name = "Voiceless dental lateral fricative",
symbols = { "ɬ̪" },
},
{
name = "Voiced dental lateral fricative",
symbols = { "ɮ̪", "ɮ͆" },
},
{
name = "Voiceless alveolar lateral fricative",
symbols = { "ɬ" },
audio = "Voiceless alveolar lateral fricative.ogg"
},
{
name = "Voiced alveolar lateral fricative",
symbols = { "ɮ" },
audio = "Voiced alveolar lateral fricative.ogg"
},
{
name = "Voiceless postalveolar lateral fricative",
symbols = { "ɬ̠" }
},
{
name = "Voiced postalveolar lateral fricative",
symbols = { "ɮ̠" },
audio = "Voiced postalveolar lateral fricative.ogg"
},
{
name = "Voiceless retroflex lateral fricative",
symbols = { "ɭ̊˔", "ꞎ"},
audio = "Voiceless retroflex lateral fricative.ogg"
},
{
name = "Voiced retroflex lateral fricative",
symbols = { "ɭ˔", "𝼅" },
audio = "Voiced retroflex lateral fricative.wav"
},
{
name = "Voiceless alveolo-palatal lateral fricative",
symbols = { "ɬ̠ʲ", "ʎ̝̊˖", "ȴ̊˔", "l̠̊ʲ", "ʎ̟̊", "ȴ̊" },
},
{
name = "Voiceless palatal lateral fricative",
symbols = { "ʎ̝̊", "𝼆" },
audio = "Voiceless palatal lateral fricative.ogg"
},
{
name = "Voiced palatal lateral fricative",
symbols = { "ʎ̝", "𝼆̬" },
audio = "ʎ̝ IPA sound.opus"
},
{
name = "Voiceless post-palatal lateral fricative",
symbols = { "𝼆̠" },
},
{
name = "Voiced post-palatal or pre-velar lateral fricative",
symbols = { "ʎ̝˗", "ʟ̟᷵" },
article = "Voiced pre-velar lateral fricative"
},
{
name = "Voiceless velar lateral fricative",
symbols = { "ʟ̝̊", "𝼄" },
audio = "Voiceless velar lateral fricative.ogg"
},
{
name = "Voiced velar lateral fricative",
symbols = { "ʟ̝", "𝼄̬" },
audio = "Voiced velar lateral fricative.ogg"
},
-- Lateral approximants
{
name = "Voiced dental lateral approximant",
symbols = { "l̪" },
audio = "Voiced dental lateral approximant.ogg"
},
{
name = "Voiceless alveolar lateral approximant",
symbols = { "l̥" },
audio = "Voiceless alveolar lateral approximant.ogg"
},
{
name = "Voiced alveolar lateral approximant",
symbols = { "l" },
audio = "Alveolar lateral approximant.ogg"
},
{
name = "Voiced postalveolar lateral approximant",
symbols = { "l̠" },
audio = "Voiced postalveolar lateral approximant.ogg"
},
{
name = "Voiceless retroflex lateral approximant",
symbols = { "ɭ̊" },
},
{
name = "Voiced retroflex lateral approximant",
symbols = { "ɭ" },
audio = "Retroflex lateral approximant.ogg"
},
{
name = "Voiced alveolo-palatal lateral approximant",
symbols = { "l̠ʲ", "ʎ̟", "ȴ" },
audio = "Alveolo-palatal lateral approximant.ogg"
},
{
name = "Voiceless palatal lateral approximant",
symbols = { "ʎ̥" },
},
{
name = "Voiced palatal lateral approximant",
symbols = { "ʎ" },
audio = "Palatal lateral approximant.ogg"
},
{
name = "Voiceless velar lateral approximant",
symbols = { "ʟ̥" },
},
{
name = "Voiced velar lateral approximant",
symbols = { "ʟ" },
audio = "Velar lateral approximant.ogg"
},
{
name = "Voiced uvular lateral approximant",
symbols = { "ʟ̠" },
audio = "Uvular lateral approximant.ogg"
},
-- Lateral taps/flaps
{
name = "Voiced linguolabial lateral flap",
symbols = { "ɺ̼", "l̼̆"}
},
{
name = "Voiced dental lateral flap",
symbols = { "ɺ̪", "l̪̆" }
},
{
name = "Voiceless alveolar lateral flap",
symbols = { "ɺ̥", "l̥̆" },
audio = "Voiceless alveolar lateral flap.wav"
},
{
name = "Voiced alveolar lateral flap",
symbols = { "ɺ", "l̆"},
audio = "Voiced alveolar lateral flap.wav"
},
{
name = "Voiced postalveolar lateral flap",
symbols = { "ɺ̠", "l̠̆" },
audio = "Voiced postalveolar lateral flap.ogg"
},
{
name = "Voiceless retroflex lateral flap",
symbols = { "𝼈̊", "𝼈̥", "ɭ̥̆" },
audio = "Voiceless retroflex lateral flap.wav"
},
{
name = "Voiced retroflex lateral flap",
symbols = { "𝼈", "ɭ̆" },
audio = "Voiced retroflex lateral flap (correct).wav"
},
{
name = "Voiced palatal lateral flap",
symbols = { "ʎ̆" },
audio = "Voiced palatal lateral flap.wav"
},
{
name = "Voiced velar lateral tap",
symbols = { "ʟ̆" }
},
-- NON-PULMONIC CONSONANTS
-- Ejective stops
{
name = "Bilabial ejective stop",
symbols = { "pʼ" },
audio = "Bilabial ejective plosive.ogg"
},
{
name = "Dental ejective stop",
symbols = { "t̪ʼ" },
audio = "Dental ejective stop.ogg"
},
{
name = "Alveolar ejective stop",
symbols = { "tʼ" },
audio = "Alveolar ejective plosive.ogg"
},
{
name = "Retroflex ejective stop",
symbols = { "ʈʼ" },
audio = "Retroflex ejective.ogg"
},
{
name = "Palatal ejective stop",
symbols = { "cʼ" },
audio = "Palatal ejective.ogg"
},
{
name = "Velar ejective stop",
symbols = { "kʼ" },
audio = "Velar ejective plosive.ogg"
},
{
name = "Uvular ejective stop",
symbols = { "qʼ" },
audio = "Uvular ejective plosive.ogg"
},
-- Ejective affricates
{
name = "Labiodental ejective affricate",
symbols = { "p̪fʼ" },
},
{
name = "Dental ejective affricate",
symbols = { "t̪θʼ", "t̟θʼ", "tθʼ" },
audio = "Dental ejective affricate.ogg"
},
{
name = "Alveolar ejective affricate",
symbols = { "tsʼ" },
audio = "Alveolar ejective affricate.ogg"
},
{
name = "Postalveolar ejective affricate",
symbols = { "t̠ʃʼ", "tʃʼ" },
audio = "Palato-alveolar ejective affricate.ogg"
},
{
name = "Retroflex ejective affricate",
symbols = { "ʈʂʼ", "tʂʼ" },
audio = "Retroflex ejective affricate.ogg"
},
{
name = "Alveolo-palatal ejective affricate",
symbols = { "t̠ɕʼ", "tɕʼ", "t̠ʃʲʼ", "tʃʲʼ", "t̠s̠ʲʼ", "cɕʼ" },
},
{
name = "Palatal ejective affricate",
symbols = { "cçʼ" },
audio = "Palatal ejective affricate.ogg"
},
{
name = "Velar ejective affricate",
symbols = { "kxʼ" },
audio = "Velar ejective affricate.ogg"
},
{
name = "Uvular ejective affricate",
symbols = { "qχʼ" },
audio = "Uvular ejective affricate.ogg"
},
-- Ejective fricatives
{
name = "Bilabial ejective fricative",
symbols = { "ɸʼ" },
audio = "Bilabial ejective fricative.ogg"
},
{
name = "Labiodental ejective fricative",
symbols = { "fʼ" },
audio = "Labiodental ejective fricative.ogg"
},
{
name = "Dental ejective fricative",
symbols = { "θʼ" },
audio = "Dental ejective fricative.ogg"
},
{
name = "Alveolar ejective fricative",
symbols = { "sʼ" },
audio = "Alveolar ejective fricative.ogg"
},
{
name = "Postalveolar ejective fricative",
symbols = { "ʃʼ" },
audio = "Palato-alveolar ejective fricative.ogg"
},
{
name = "Retroflex ejective fricative",
symbols = { "ʂʼ" },
audio = "Retroflex ejective fricative.ogg"
},
{
name = "Alveolo-palatal ejective fricative",
symbols = { "ɕʼ" , "ʃʲʼ", "s̠ʲʼ"},
audio = "Alveolo-palatal ejective fricative.ogg"
},
{
name = "Palatal ejective fricative",
symbols = { "çʼ" },
audio = "Palatal ejective fricative.ogg"
},
{
name = "Velar ejective fricative",
symbols = { "xʼ" },
audio = "Velar ejective fricative.ogg"
},
{
name = "Uvular ejective fricative",
symbols = { "χʼ" },
audio = "Uvular ejective fricative.ogg"
},
-- Lateral ejective affricates
{
name = "Alveolar lateral ejective affricate",
symbols = { "tɬʼ", "ƛʼ" },
audio = "Alveolar lateral ejective affricate.ogg"
},
{
name = "Palatal lateral ejective affricate",
symbols = { "cʎ̝̊ʼ", "cʎ̥ʼ", "c𝼆ʼ" },
audio = "Palatal lateral ejective affricate.ogg"
},
{
name = "Velar lateral ejective affricate",
symbols = { "kʟ̝̊ʼ", "kʟ̥ʼ", "k𝼄ʼ" },
audio = "Velar lateral ejective affricate.ogg"
},
{
name = "Uvular lateral ejective affricate",
symbols = { "q𝼄ʼ", "q𝼄̠ʼ", "qʟ̝̊ʼ" },
},
-- Lateral ejective fricatives
{
name = "Alveolar lateral ejective fricative",
symbols = { "ɬʼ" },
audio = "Alveolar lateral ejective fricative.ogg"
},
-- Ejective trills
{
name = "Ejective trill",
symbols = { "ʙ̥ʼ", "r̼̊ʼ", "ʙ̺̊ʼ", "ʙ̼̊ʼ", "r̪̊ʼ", "r̥ʼ", "r̠̊ʼ", "ɽr̥ʼ", "ʀ̥ʼ" },
article = "Ejective consonant"
},
-- Tenuis clicks
{
name = "Tenuis bilabial click",
symbols = { "ʘ", "kʘ" },
audio = "Clic bilabial sourd.ogg"
},
{
name = "Tenuis dental click",
symbols = { "ǀ", "kǀ" },
audio = "Dental click.ogg"
},
{
name = "Tenuis alveolar click",
symbols = { "ǃ", "kǃ" },
audio = "Postalveolar click.ogg"
},
{
name = "Tenuis palatal click",
symbols = { "ǂ", "kǂ" },
audio = "Palatoalveolar click.ogg"
},
{
name = "Tenuis retroflex click",
symbols = { "𝼊", "k𝼊" },
audio = "Retrflx click.wav"
},
{
name = "Back-released click",
symbols = { "ʞ" },
},
-- Voiced clicks
{
name = "Voiced bilabial click",
symbols = { "ʘ̬", "ɡʘ" },
},
{
name = "Voiced dental click",
symbols = { "ǀ̬", "ɡǀ" },
},
{
name = "Voiced alveolar click",
symbols = { "ǃ̬", "ɡǃ" },
},
{
name = "Voiced palatal click",
symbols = { "ǂ̬", "ɡǂ" },
},
{
name = "Voiced retroflex click",
symbols = { "𝼊̬", "ɡ𝼊" },
},
-- Nasal clicks
{
name = "Bilabial nasal click",
symbols = { "ʘ̃", "ŋʘ", "ⁿʘ" },
audio = "Bilabial nasal click.ogg"
},
{
name = "Dental nasal click",
symbols = { "ǀ̃", "ŋǀ", "ⁿǀ", "ŋǀʱ" },
},
{
name = "Alveolar nasal click",
symbols = { "ǃ̃", "ŋǃ", "ⁿǃ" },
audio = "Intervocalic nasal alveolar clicks.ogg"
},
{
name = "Palatal nasal click",
symbols = { "ǂ̃", "ŋǂ", "ⁿǂ" },
},
{
name = "Retroflex nasal click",
symbols = { "𝼊̃", "ŋ𝼊", "ⁿ𝼊" },
},
-- Lateral clicks
{
name = "Tenuis alveolar lateral click",
symbols = { "ǁ", "kǁ" },
audio = "Alveolar lateral click.ogg"
},
{
name = "Voiced alveolar lateral click",
symbols = { "ǁ̬", "ɡǁ" },
},
-- Lateral nasal clicks
{
name = "Alveolar lateral nasal click",
symbols = { "ǁ̃", "ŋǁ", "ⁿǁ" },
},
-- Glottalized clicks
{
name = "Glottalized bilabial nasal click",
symbols = { "ʘ̃ˀ", "ʘˀ", "ŋ̊ʘˀ", "ŋʘˀ" },
},
{
name = "Glottalized dental nasal click",
symbols = { "ǀ̃ˀ", "ǀˀ", "ŋ̊ǀˀ", "ŋǀˀ" },
},
{
name = "Glottalized alveolar nasal click",
symbols = { "ǃ̃ˀ", "ǃˀ", "ŋ̊ǃˀ", "ŋǃˀ" },
},
{
name = "Glottalized retroflex nasal click",
symbols = { "𝼊̃ˀ", "𝼊ˀ", "ŋ𝼊ˀ", "ŋ̊𝼊ˀ" },
},
{
name = "Glottalized palatal nasal click",
symbols = { "ǂ̃ˀ", "ǂˀ", "ŋ̊ǂˀ", "ŋǂˀ" },
},
{
name = "Glottalized alveolar lateral nasal click",
symbols = { "ǁ̃ˀ", "ǁˀ", "ŋ̊ǁˀ", "ŋǁˀ" },
},
-- Egressive clicks (for Damin)
{
name = "Egressive bilabial click",
symbols = { "ʘ↑" },
},
-- Implosives
{
name = "Voiceless bilabial implosive",
symbols = { "ɓ̥", "ƥ", "pʼ↓" },
audio = "Voiceless-bilabial-implosive.ogg",
},
{
name = "Voiced bilabial implosive",
symbols = { "ɓ" },
audio = "Voiced bilabial implosive.ogg"
},
{
name = "Voiceless dental implosive",
symbols = { "ɗ̪̥", "ɗ̪̊", "ƭ̪", "t̪ʼ↓" },
},
{
name = "Voiced dental implosive",
symbols = { "ɗ̪" },
},
{
name = "Voiceless alveolar implosive",
symbols = { "ɗ̥", "ƭ", "tʼ↓" },
audio = "Voiceless-alveolar-implosive.ogg",
},
{
name = "Voiced alveolar implosive",
symbols = { "ɗ" },
audio = "Voiced alveolar implosive.ogg"
},
{
name = "Voiceless retroflex implosive",
symbols = { "ᶑ̊", "ᶑ̥", "𝼉", "ʈʼ↓" },
audio = "Voiceless-retroflex-implosive.ogg",
},
{
name = "Voiced retroflex implosive",
symbols = { "ᶑ" },
audio = "Voiced-retroflex-implosive.ogg",
},
{
name = "Voiceless palatal implosive",
symbols = { "ʄ̊", "ʄ̥", "ƈ", "cʼ↓" },
audio = "Voiceless palatal implosive.ogg",
},
{
name = "Voiced palatal implosive",
symbols = { "ʄ" },
audio = "Voiced palatal implosive.ogg"
},
{
name = "Voiced post-palatal or pre-velar implosive",
symbols = { "ʄ̠", "ʄ˗", "ɠ̟", "ɠ˖" },
audio = "Voiced post palatal and pre velar implosives.ogg",
article = "Voiced pre-velar implosive"
},
{
name = "Voiceless velar implosive",
symbols = { "ɠ̊", "ƙ", "kʼ↓" },
audio = "Voiceless-velar-implosive.ogg",
},
{
name = "Voiced velar implosive",
symbols = { "ɠ" },
audio = "Voiced velar implosive.ogg"
},
{
name = "Voiceless uvular implosive",
symbols = { "ʛ̥", "ʠ", "qʼ↓" },
audio = "Voiceless-uvular-implosive.ogg",
},
{
name = "Voiced uvular implosive",
symbols = { "ʛ" },
audio = "Voiced uvular implosive.ogg"
},
-- CO-ARTICULATED CONSONANTS
-- Co-articulated nasals
{
name = "Voiced labial–alveolar nasal",
symbols = { "nm" },
},
{
name = "Voiced labial–retroflex nasal",
symbols = { "ɳm" },
},
{
name = "Voiced labial–velar nasal",
symbols = { "ŋm" },
audio = "Labial-velar nasal stop.ogg"
},
-- Co-articulated plosives
{
name = "Voiceless labial–alveolar plosive",
symbols = { "tp" },
audio = "Voiceless labial-alveolar plosive.ogg"
},
{
name = "Voiced labial–alveolar plosive",
symbols = { "db" },
},
{
name = "Voiceless labial–retroflex plosive",
symbols = { "ʈp" },
},
{
name = "Voiced labial–retroflex plosive",
symbols = { "ɖb" },
},
{
name = "Voiceless labial–velar plosive",
symbols = { "kp" },
audio = "Voiceless labial-velar plosive.ogg"
},
{
name = "Voiced labial–velar plosive",
symbols = { "ɡb" },
audio = "Voiced labial-velar plosive.ogg"
},
{
name = "Voiceless labial–uvular plosive",
symbols = { "qp" },
audio = "Voiceless labial–uvular plosive.ogg"
},
{
name = "Voiceless uvular–epiglottal plosive",
symbols = { "qʡ" },
},
-- Co-articulated implosives
{
name = "Voiceless labial–velar implosive",
symbols = { "ɠ̊ɓ̥", "kɓ̥", "ƙƥ", "kpʼ↓", "kƥ" },
audio = "Voiceless-labial–velar-implosive.ogg",
},
{
name = "Voiced labial–velar implosive",
symbols = { "ɠɓ", "ɡɓ" },
audio = "Voiced-labial-velar-implosive.ogg"
},
-- Co-articulated ejectives
{
name = "Labial–alveolar ejective stop",
symbols = { "tpʼ" },
},
-- Co-articulated continuants
{
name = "Voiceless labial–palatal fricative",
symbols = { "ɥ̊˔", "ɥ̝̊", "çᶣ", "çᵝ", "çʷ" },
},
{
name = "Voiceless labial–palatal approximant",
symbols = { "ɥ̊", "ç̞ᶣ", "ç̞ᵝ", "ç̞ʷ" },
},
{
name = "Voiced labial–palatal approximant",
symbols = { "ɥ" },
audio = "LL-Q150 (fra)-WikiLucas00-IPA ɥ.wav"
},
{
name = "Voiceless labial–velar fricative",
symbols = { "ʍ", "xʷ" },
audio = "Voiceless labio-velar fricative.ogg"
},
{
name = "Voiceless labial–velar approximant",
symbols = { "w̥", "ẘ", "ʍ̞" },
},
{
name = "Voiced labial–velar approximant",
symbols = { "w", "ɰʷ", "ɣ̞ʷ", "ɣʷ"},
audio = "Voiced labio-velar approximant.ogg"
},
{
name = "Compressed voiced labial–velar approximant",
symbols = { "wᵝ", "ɰᵝ", "ɣ̞ᵝ", "ɣᵝ"},
article = "Voiced labial–velar approximant",
},
{
name = "Sj-sound",
symbols = { "ɧ" },
audio = "Voiceless dorso-palatal velar fricative.ogg"
},
-- Co-articulated lateral approximants
{
name = "Velarized dental lateral approximant",
symbols = { "ɫ̪", "l̪ˠ" },
},
{
name = "Velarized alveolar lateral approximant",
symbols = { "ɫ", "lˠ" },
audio = "Velarized alveolar lateral approximant.ogg"
},
{
name = "Pharyngealized dental lateral approximant",
symbols = { "l̪ˤ" },
},
{
name = "Pharyngealized alveolar lateral approximant",
symbols = { "lˤ" },
},
-- Nasalized approximants
{
name = "Nasalized voiced alveolar lateral approximant",
symbols = { "l̃" },
},
{
name = "Nasalized voiced palatal approximant",
symbols = { "j̃" },
audio = "Nasal palatal approximant.ogg"
},
{
name = "Nasalized voiced velar approximant",
symbols = { "ɰ̃", "ɣ̞̃", "ɣ̃˕" },
audio = "Nasal velar approximant.ogg"
},
{
name = "Nasalized voiced labial–velar approximant",
symbols = { "w̃" },
audio = "Voiced labialized velar nasal approximant.ogg"
},
{
name = "Nasalized voiceless glottal approximant",
symbols = { "h̃" },
audio = "IPA h̃.ogg"
},
{
name = "Nasalized voiced glottal approximant",
symbols = { "ɦ̃" },
},
-- VOWELS
-- Close vowels
{
name = "Close front unrounded vowel",
symbols = { "i" },
audio = "Close front unrounded vowel.ogg"
},
{
name = "Close front rounded vowel",
symbols = { "y" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front compressed vowel",
symbols = { "y͍", "iᵝ" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front protruded vowel",
symbols = { "y̫", "yʷ", "iʷ", "y᫇" },
audio = "Close front protruded vowel.ogg"
},
{
name = "Close central unrounded vowel",
symbols = { "ɨ", "ï", "ɯ̈" },
audio = "Close central unrounded vowel.ogg"
},
{
name = "Close central rounded vowel",
symbols = { "ʉ", "ü" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central protruded vowel",
symbols = { "ʉ̫", "ʉʷ", "ɨʷ" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central compressed vowel",
symbols = { "ÿ", "ɨᵝ" },
},
{
name = "Close back unrounded vowel",
symbols = { "ɯ" },
audio = "Close back unrounded vowel.ogg"
},
{
name = "Close back rounded vowel",
symbols = { "u" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back protruded vowel",
symbols = { "u̫", "uʷ", "ɯʷ" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back compressed vowel",
symbols = { "u͍", "ɯᵝ" },
audio = "Ja-U.oga"
},
-- Near-close vowels
{
name = "Near-close front unrounded vowel",
symbols = { "ɪ̟", "i̞", "e̝" },
},
{
name = "Near-close front rounded vowel",
symbols = { "ʏ̟", "y̞", "y˕", "ø̝" },
},
{
name = "Near-close near-front unrounded vowel",
symbols = { "ɪ", "i̽", "ï̞", "ë̝" },
audio = "Near-close near-front unrounded vowel.ogg"
},
{
name = "Near-close near-front rounded vowel",
symbols = { "ʏ", "y̽", "ÿ̞", "ÿ˕", "ø̝̈" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front compressed vowel",
symbols = { "ʏ͍", "ɪᵝ" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front protruded vowel",
symbols = { "ʏ̫", "ʏʷ", "ɪʷ" },
},
{
name = "Near-close central unrounded vowel",
symbols = { "ɪ̈", "ɪ̠", "ɨ̞", "ɘ̝" },
audio = "Near-close central unrounded vowel.ogg"
},
{
name = "Near-close central rounded vowel",
symbols = { "ʊ̈", "ʊ̟", "ʉ̞", "ɵ̝" },
audio = "Near-close central rounded vowel2.ogg"
},
{
name = "Near-close central protruded vowel",
symbols = { "ʊ̫̈", "ʉ̫˕", "ʊ̈ʷ", "ʉ̞ʷ", "ɪ̈ʷ", "ɨ̞ʷ" },
},
{
name = "Near-close central compressed vowel",
symbols = { "ʏ̈", "ɨ̞ᵝ" },
},
{
name = "Near-close near-back unrounded vowel",
symbols = { "ɯ̽", "ɯ̞̈", "ɤ̝̈" },
audio = "Near-close near-back unrounded vowel.ogg"
},
{
name = "Near-close near-back rounded vowel",
symbols = { "ʊ", "u̽", "ü̞", "ö̝" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back protruded vowel",
symbols = { "ʊ̫", "ʊʷ", "ɯ̽ʷ", "ɤ̝̈ʷ", "u̫˕", "u̞ʷ", "ɯ̞ʷ", "ɤ̝ʷ" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back compressed vowel",
symbols = { "ʊ͍", "ɯ̽ᵝ", "ɯ̞̈ᵝ", "ɯ̞ᵝ" },
},
{
name = "Near-close back unrounded vowel",
symbols = { "ɯ̞", "ɤ̝" },
},
{
name = "Near-close back rounded vowel",
symbols = { "ʊ̠", "u̞", "o̝" },
},
-- Close-mid vowels
{
name = "Close-mid front unrounded vowel",
symbols = { "e" },
audio = "Close-mid front unrounded vowel.ogg"
},
{
name = "Close-mid front rounded vowel",
symbols = { "ø" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front compressed vowel",
symbols = { "ø͍", "eᵝ" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front protruded vowel",
symbols = { "ø̫", "øʷ", "eʷ" },
},
{
name = "Close-mid near-front unrounded vowel",
symbols = { "ɪ̞", "e̠", "ɘ̟" },
},
{
name = "Close-mid near-front rounded vowel",
symbols = { "ʏ̞", "ø̠", "ɵ̟" },
},
{
name = "Close-mid central unrounded vowel",
symbols = { "ɘ", "ë", "ɤ̈" },
audio = "Close-mid central unrounded vowel.ogg"
},
{
name = "Close-mid central rounded vowel",
symbols = { "ɵ", "ɵ̫", "ɵʷ", "ö", "ɘʷ" },
audio = "Close-mid central rounded vowel.ogg"
},
{
name = "Close-mid central compressed vowel",
symbols = { "ø̈", "ɘᵝ" },
},
{
name = "Close-mid near-back unrounded vowel",
symbols = { "ɘ̠", "ɤ̟", "ɯ̞̽" },
},
{
name = "Close-mid near-back rounded vowel",
symbols = { "ʊ̞", "ɵ̠", "o̟" },
},
{
name = "Close-mid back unrounded vowel",
symbols = { "ɤ" },
audio = "Close-mid back unrounded vowel.ogg"
},
{
name = "Close-mid back rounded vowel",
symbols = { "o", "o̫", "oʷ", "ɤʷ" },
audio = "Close-mid back rounded vowel.ogg"
},
{
name = "Close-mid back compressed vowel",
symbols = { "o͍", "ɤᵝ" },
},
-- Mid vowels
{
name = "Mid front unrounded vowel",
symbols = { "e̞", "ɛ̝" },
audio = "Mid front unrounded vowel.ogg"
},
{
name = "Mid front rounded vowel",
symbols = { "ø̞", "œ̝" },
audio = "Mid front rounded vowel (trimmed).ogg"
},
{
name = "Mid front compressed vowel",
symbols = { "ø͍˕", "œ͍˔", "e̞ᵝ", "ɛ̝ᵝ" },
},
{
name = "Mid front protruded vowel",
symbols = { "ø̫˕", "œ̫˔", "ø̞ʷ", "œ̝ʷ", "e̞ʷ", "ɛ̝ʷ" },
},
{
name = "Mid near-front unrounded vowel",
symbols = { "e̽", "ɛ̽", "ë̞", "ɛ̝̈" },
},
{
name = "Mid near-front rounded vowel",
symbols = { "ø̽", "œ̽", "ø̞̈", "œ̝̈" },
},
{
name = "Mid central vowel",
symbols = { "ə" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central unrounded vowel",
symbols = { "ə̜", "ɘ̞", "ɜ̝" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central rounded vowel",
symbols = { "ə̹", "ɵ̞", "ɞ̝" },
audio = "Mid central rounded vowel.ogg"
},
{
name = "Mid near-back unrounded vowel",
symbols = { "ɤ̽", "ʌ̽", "ɤ̞̈", "ʌ̝̈" },
},
{
name = "Mid near-back rounded vowel",
symbols = { "o̽", "ɔ̽", "ö̞", "ɔ̝̈" },
},
{
name = "Mid back unrounded vowel",
symbols = { "ɤ̞", "ʌ̝" },
audio = "ɤ̞ IPA sound.opus"
},
{
name = "Mid back rounded vowel",
symbols = { "o̞", "ɔ̝" },
audio = "Mid back rounded vowel.ogg"
},
-- Open-mid vowels
{
name = "Open-mid front unrounded vowel",
symbols = { "ɛ" , "æ̝"},
audio = "Open-mid front unrounded vowel.ogg"
},
{
name = "Open-mid front rounded vowel",
symbols = { "œ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front compressed vowel",
symbols = { "œ͍", "ɛᵝ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front protruded vowel",
symbols = { "œ̫", "œʷ", "ɛʷ" },
},
{
name = "Open-mid central unrounded vowel",
symbols = { "ɜ", "ɛ̈", "ʌ̈" },
audio = "Open-mid central unrounded vowel.ogg"
},
{
name = "Open-mid central rounded vowel",
symbols = { "ɞ", "œ̈", "ɔ̈" },
audio = "Open-mid central rounded vowel.ogg"
},
{
name = "Open-mid back unrounded vowel",
symbols = { "ʌ" },
audio = "PR-open-mid back unrounded vowel2.ogg"
},
{
name = "Open-mid back rounded vowel",
symbols = { "ɔ" },
audio = "PR-open-mid back rounded vowel.ogg"
},
-- Near-open vowels
{
name = "Near-open front unrounded vowel",
symbols = { "æ", "ɛ̞", "a̝" },
audio = "Near-open front unrounded vowel.ogg"
},
{
name = "Near-open front rounded vowel",
symbols = { "œ̞", "ɶ̝" },
},
{
name = "Near-open near-front unrounded vowel",
symbols = { "æ̈", "æ̠", "ä̝", "a̽", "ɛ̞̈" },
},
{
name = "Near-open near-front rounded vowel",
symbols = { "ɶ̝̈", "ɶ̽", "œ̞̈" },
},
{
name = "Near-open central vowel",
symbols = { "ɐ" },
audio = "Near-open central unrounded vowel.ogg"
},
{
name = "Near-open central unrounded vowel",
symbols = { "ɐ̜", "ɜ̞" },
audio = "PR-near-open central unrounded vowel.ogg"
},
{
name = "Near-open central rounded vowel",
symbols = { "ɐ̹", "ɞ̞" },
audio = "Near-open central rounded vowel.ogg"
},
{
name = "Near-open near-back unrounded vowel",
symbols = { "ɑ̽", "ɑ̝̈", "ʌ̞̈" },
},
{
name = "Near-open near-back rounded vowel",
symbols = { "ɒ̽", "ɒ̝̈", "ɔ̞̈" },
},
{
name = "Near-open back unrounded vowel",
symbols = { "ʌ̞", "ɑ̝" },
},
{
name = "Near-open back rounded vowel",
symbols = { "ɔ̞", "ɒ̝" },
},
-- Open vowels
{
name = "Open front unrounded vowel",
symbols = { "a", "æ̞" },
audio = "PR-open front unrounded vowel.ogg"
},
{
name = "Open front rounded vowel",
symbols = { "ɶ" },
audio = "Open front rounded vowel.ogg"
},
{
name = "Open central unrounded vowel",
symbols = { "ä", "a̠", "ɑ̈", "ɑ̟" },
audio = "Open central unrounded vowel.ogg"
},
{
name = "Open central rounded vowel",
symbols = { "ɒ̈", "ɒ̟", "ɶ̈", "ɶ̠" },
audio = "Open central rounded vowel.ogg"
},
{
name = "Open back unrounded vowel",
symbols = { "ɑ" },
audio = "Open back unrounded vowel.ogg"
},
{
name = "Open back rounded vowel",
symbols = { "ɒ" },
audio = "PR-open back rounded vowel.ogg"
},
{
name = "R-colored vowel",
symbols = { "ɚ", "ɝ", "ɹ̩", "ɻ̍" },
audio = "En-us-er.ogg"
},
-- SUPRASEGMENTALS
{
name = "Primary stress",
symbols = { "ˈ" },
article = "Stress (linguistics)",
},
{
name = "Secondary stress",
symbols = { "ˌ" },
},
{
name = "Minor (foot) group",
symbols = { "|" },
article = "Prosodic unit",
},
{
name = "Major (intonation) group",
symbols = { "‖" },
article = "Prosodic unit",
},
{
name = "Syllable break",
symbols = { "." },
article = "Syllable",
},
{
name = "Linking (absence of a break)",
symbols = { "‿" },
article = "Connected speech",
},
-- TONES AND WORD ACCENTS
{
name = "Downstep",
symbols = { "ꜜ" },
},
{
name = "Upstep",
symbols = { "ꜛ" },
},
{
name = "Global rise",
symbols = { "↗" },
article = "Intonation (linguistics)",
},
{
name = "Global fall",
symbols = { "↘" },
article = "Intonation (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Bilabial percussive",
symbols = { "ʬ" },
audio = "Voiceless bilabial percussive.wav"
},
{
name = "Bidental percussive",
symbols = { "ʭ" },
audio = "Voiceless bidental percussive.wav"
},
{
name = "Velopharyngeal fricative",
symbols = { "ʩ" },
},
{
name = "Voiceless velopharyngeal trill",
symbols = { "𝼀", "ʩ𐞪" },
article = "Velopharyngeal consonant"
},
{
name = "Voiced velopharyngeal trill",
symbols = { "𝼀̬" },
article = "Velopharyngeal consonant"
},
{
name = "Voiceless dental lateral–median fricative",
symbols = { "ʪ̪" },
},
{
name = "Voiced dental lateral–median fricative",
symbols = { "ʫ̪" },
},
{
name = "Voiceless alveolar lateral–median fricative",
symbols = { "ʪ" },
audio = "Voiceless alveolar lateral lisp fricative.ogg"
},
{
name = "Voiced alveolar lateral–median fricative",
symbols = { "ʫ" },
audio = "Voiced alveolar lateral lisp fricative.ogg"
},
{
name = "Ingressive airflow",
symbols = { "↓" },
article = "Ingressive sound",
},
{
name = "Egressive airflow",
symbols = { "↑" },
article = "Egressive sound",
},
{
name = "Apical r",
symbols = { "ɹ̺" },
article = "Voiced alveolar approximant",
},
{
name = "Bunched r",
symbols = { "ɹ̈" },
article = "Voiced velar bunched approximant",
},
{
name = "Sublaminal lower alveolar percussive",
symbols = { "¡" },
article = "Sublingual percussive",
},
{
name = "Percussive alveolar click",
symbols = { "ǃ¡" },
audio = "Percussive alveolar click.ogg"
},
{
name = "Buccal interdental trill",
symbols = { "ↀr̪͆" },
article = "Blowing a raspberry",
},
-- NON-IPA
{
name = "Morphological boundary",
symbols = { "#" },
article = "Word stem",
},
{
name = "Zero",
symbols = { "∅" },
article = "Zero (linguistics)",
},
},
diacritics = {
-- DIACRITICS
{
name = "Voiceless",
symbols = { "̥", "̊", "ḁ", "å", "ů", "ẙ" },
},
{
name = "Voiced",
symbols = { "̬" },
article = "Voice (phonetics)",
},
{
name = "Aspirated",
symbols = { "ʰ" },
article = "Aspirated consonant",
},
{
name = "More rounded",
symbols = { "̹", "͗", "˒" },
article = "Relative articulation#More rounded",
},
{
name = "Less rounded",
symbols = { "̜", "͑", "˓", "͍" },
article = "Relative articulation#Less rounded",
},
{
name = "Advanced",
symbols = { "̟", "᫈", "˖" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Retracted",
symbols = { "̠", "", "˗" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Centralized",
symbols = { "̈" },
article = "Relative articulation#Centralized vowels",
},
{
name = "Mid-centralized",
symbols = { "̽", "͓" },
article = "Relative articulation#Mid-centralized vowel",
},
{
name = "Syllabic",
symbols = { "̩", "̍" },
article = "Syllabic consonant",
},
{
name = "Non-syllabic",
symbols = { "̯", "̑" },
article = "Semivowel",
},
{
name = "Rhoticity",
symbols = { "˞" },
article = "R-colored vowel",
audio = "En-us-er.ogg"
},
{
name = "Breathy voiced",
symbols = { "̤", "ṳ", "ʱ" },
article = "Breathy voice",
},
{
name = "Creaky voiced",
symbols = { "̰", "ḛ", "ḭ", "ṵ" },
article = "Creaky voice",
},
{
name = "Nasalized and glottalized",
symbols = { "̰̃", "ã̰", "ḛ̃", "ḭ̃", "õ̰", "ṵ̃" },
article = "Rhinoglottophilia",
},
{
name = "Linguolabial",
symbols = { "̼", "" },
article = "Linguolabial consonant",
},
{
name = "Labialized",
symbols = { "ʷ", "ᵝ", "̫", "᫇", "", "" },
article = "Labialization",
},
{
name = "Open-labialized",
symbols = { "ꟹ" },
article = "Labialization",
},
{
name = "Labiodentalized",
symbols = { "ᶹ" },
article = "Labialization",
},
{
name = "Labio-palatalized",
symbols = { "ᶣ" },
article = "Labio-palatalization",
},
{
name = "Palatalized",
symbols = { "ʲ" },
article = "Palatalization (phonetics)",
},
{
name = "Velarized",
symbols = { "ˠ" },
article = "Velarization",
},
{
name = "Uvularized",
symbols = { "ʶ", "ᵡ" },
article = "Uvularization",
},
{
name = "Pharyngealized",
symbols = { "ˤ", "𐞕" },
article = "Pharyngealization",
},
{
name = "Velarized or pharyngealized",
symbols = { "̴", "ᵯ", "ᵰ", "ᵱ", "ᵬ", "ᵮ", "ᵵ", "ᵭ", "ᵴ", "ᵶ", "ᵳ", "ᵲ", "ꭨ" },
article = "Pharyngealization",
},
{
name = "Epiglottalized",
symbols = { "𐞴", "ᵸ" },
article = "Pharyngealization",
},
{
name = "Raised",
symbols = { "̝", "᷵", "˔" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Lowered",
symbols = { "̞", "", "˕" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Advanced tongue root",
symbols = { "̘", "", "꭪" },
},
{
name = "Retracted tongue root",
symbols = { "̙", "", "꭫" },
},
{
name = "Dental",
symbols = { "̪", "͆" },
article = "Dental consonant",
},
{
name = "Interdental",
symbols = { "̪͆" },
article = "Interdental consonant",
},
{
name = "Apical",
symbols = { "̺" },
article = "Apical consonant",
},
{
name = "Laminal",
symbols = { "̻" },
article = "Laminal consonant",
},
{
name = "Nasalized",
symbols = { "̃", "ṽ" },
article = "Nasalization",
},
{
name = "Nasal vowel",
symbols = { "ĩ", "ỹ", "ɨ̃", "ʉ̃", "ɯ̃", "ũ", "ɪ̃", "ʏ̃", "ʊ̃", "ẽ", "ø̃", "ɘ̃", "ɵ̃", "ɤ̃", "õ", "ə̃", "ɛ̃", "œ̃", "ɜ̃", "ɞ̃", "ʌ̃", "ɔ̃", "æ̃", "ɐ̃", "ã", "ɶ̃", "ä̃", "ɑ̃", "ɒ̃" },
},
{
name = "Nasal release",
symbols = { "ⁿ" },
},
{
name = "Lateral release",
symbols = { "ˡ" },
article = "Lateral release (phonetics)",
},
{
name = "No audible release",
symbols = { "̚" },
},
{
name = "Ejective",
symbols = { "ʼ" },
article = "Ejective consonant",
},
{
name = "Glottalized",
symbols = { "ˀ" },
article = "Glottalization",
},
{
name = "Buccal speech",
symbols = { "ↀ" },
},
{
name = "Esophageal speech",
symbols = { "Œ" },
},
{
name = "Electrolaryngeal speech",
symbols = { "И" },
},
{
name = "Tracheo-esophageal speech",
symbols = { "Ю" },
},
-- SUPRASEGMENTALS
{
name = "Long",
symbols = { "ː" },
article = "Length (phonetics)",
},
{
name = "Half-long",
symbols = { "ˑ" },
article = "Length (phonetics)",
},
{
name = "Extra-short",
symbols = { "̆", "ŏ", "ӗ", "ă", "ĭ", "ŭ" },
article = "Extra-shortness",
},
-- TONES AND WORD ACCENTS
{
name = "Accent",
symbols = { "̋", "ű", "ӳ", "ő", "́", "í", "ý", "ú", "é", "ǿ", "ó", "ǽ", "á", "̄", "ī", "ȳ", "ū", "ē", "ō", "ǣ", "ā", "̀", "ì", "ỳ", "ù", "è", "ò", "à", "̏", "ȉ", "ȕ", "ȅ", "ȍ", "ȁ" },
article = "Pitch-accent language",
},
{
name = "Tone",
symbols = { "̌", "̂", "᷄", "᷅", "᷇", "᷆", "᷈", "᷉", "˥", "˦", "˧", "˨", "˩" },
article = "Tone (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Alveolar",
symbols = { "͇" },
article = "Alveolar consonant",
},
{
name = "Strong articulation",
symbols = { "͈", "̎" },
article = "Fortis and lenis",
},
{
name = "Weak articulation",
symbols = { "͉", "᷂" },
article = "Fortis and lenis",
},
{
name = "Denasalized",
symbols = { "͊" },
article = "Denasalization",
},
{
name = "Velopharyngeal friction",
symbols = { "͌", "𐞐" },
article = "Velopharyngeal consonant",
},
{
name = "Whistled articulation",
symbols = { "͎" },
article = "Whistled sibilant",
},
{
name = "Unaspirated",
symbols = { "˭" },
article = "Tenuis consonant",
},
{
name = "Pre-aspiration",
symbols = { "ʰp", "ʰt", "ʰʈ", "ʰc", "ʰk", "ʰq", "ʰn" },
article = "Preaspiration",
},
-- NON-IPA
{
name = "Retroflex",
symbols = { "̣", "̢" },
article = "Retroflex consonant",
},
{
name = "Prenasalized consonant",
symbols = { "ᵐ", "ᶬ", "ⁿ̼d̼", "ᵐ̺b̺", "ⁿt", "ⁿd", "ⁿθ", "ⁿð", "ⁿs", "ⁿz", "ⁿʃ", "ⁿʒ", "ⁿɕ", "ⁿʑ", "ⁿr", "ⁿɬ", "ⁿɮ", "ⁿl", "ᶯ", "ᶮ", "ᵑ", "ᶰ" },
},
{
name = "Pre-stopped consonant",
symbols = { "ᵖ", "ᵇ", "ᵗ", "ᵈ", "𐞯", "𐞋", "ᶜ", "ᶡ", "ᵏ", "ᶢ", "𐞥", "𐞒", "𐞳" },
},
{
name = "Post-stopped nasal",
symbols = { "mᵇ", "nᵈ", "ɳ𐞋", "ɲᶡ", "ŋᶢ", "ɴ𐞒" },
},
{
name = "Trilled affricate",
symbols = { "ʳ", "𐞄", "𐞪", "tr̥", "dr" },
},
}
}
for k, group in pairs(rawData) do
for _, v in ipairs(group) do
local t = {
name = v.name,
symbol = v.symbols[1],
article = v.article or v.name,
audio = v.audio or "",
image = v.image or ""
}
for _, s in ipairs(v.symbols) do
data[k][s] = t
end
end
end
return { data = data, rawData = rawData }
hpporybcceght36o5cql3a62kr9ug02
33092
33091
2026-11-11T21:19:43Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPA_symbol/data]]
33091
Scribunto
text/plain
local data = {
sounds = {},
diacritics = {},
univPatterns = {
{
pat = "g", -- Latin Small Letter G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵍ", -- Modifier Letter Small G
rep = "ᶢ" -- Modifier Letter Small Script G
},
{
pat = "l̴", -- 'l' + Combining Tilde Overlay
rep = "ɫ" -- Latin Small Letter L with Middle Tilde
},
{
pat = "ˁ", -- Modifier Letter Reversed Glottal Stop
rep = "ˤ" -- Modifier Letter Small Reversed Glottal Stop
},
{
pat = "’", -- Right Single Quotation Mark
rep = "ʼ" -- Modifier Letter Apostrophe
},
{
pat = "ı", -- Latin Small Letter Dotless I
rep = "i" -- Latin Small Letter I
},
{
pat = "ȷ", -- Latin Small Letter Dotless J
rep = "j" -- Latin Small Letter J
},
{
pat = "ʇ", -- Latin Small Letter Turned T
rep = "ǀ" -- Latin Letter Dental Click
},
{
pat = "[!ʗ]", -- Exclamation Mark / Latin Letter Stretched C
rep = "ǃ" -- Latin Letter Retroflex Click
},
{
pat = "𝼋", --
rep = "ǂ" --
},
{
pat = "ψ", -- Greek Letter Psi
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "‼", -- Double exclamation mark
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ǃǃ", -- Latin Letter Retroflex Click x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "!!", -- Exclamation mark x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ʖ", -- Latin Letter Inverted Glottal Stop
rep = "ǁ" -- Latin Letter Lateral Click
},
{
pat = "ɋ", --
rep = "ʘ" --
},
{
pat = "ꞵ", -- Latin Small Letter Beta
rep = "β" -- Greek Small Letter Beta
},
{
pat = "γ", -- Greek Small Letter Gamma
rep = "ɣ" -- Latin Small Letter Gamma
},
{
pat = "φ", -- Greek Small Letter Phi
rep = "ɸ" -- Latin Small Letter Phi
},
{
pat = "ꭓ", -- Latin Small Letter Chi
rep = "χ" -- Greek Small Letter Chi
},
{
pat = "̮", -- Combining Breve Below
rep = "̆" -- Combining Breve
},
},
keyPatterns = {
-- These do not affect the reverse look for diacritics
{
pat = "[͜͡ːˑ◌]", -- Tie bars, length marks, dotted circle
rep = ""
},
{
pat = "ᵏ", -- Modifier Letter Small K
rep = "k" -- Latin Small Letter K
},
{
pat = "ᶢ", -- Modifier Letter Small Script G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵑ", -- Modifier Letter Small Eng
rep = "ŋ" -- Latin Small Letter Eng
},
}
}
local rawData = {
sounds = {
-- PULMONIC CONSONANTS
-- Nasals
{
name = "Voiceless bilabial nasal",
symbols = { "m̥" },
audio = "Voiceless Bilabial Nasal.ogg"
},
{
name = "Voiced bilabial nasal",
symbols = { "m" },
audio = "Bilabial nasal.ogg"
},
{
name = "Voiceless labiodental nasal",
symbols = { "ɱ̊", "ɱ̥" },
audio = "Voiceless labiodental nasal.ogg"
},
{
name = "Voiced labiodental nasal",
symbols = { "ɱ" },
audio = "Labiodental nasal.ogg"
},
{
name = "Voiced linguolabial nasal",
symbols = { "n̼", "m̺", "m̼" },
audio = "Linguolabial nasal.ogg"
},
{
name = "Voiceless dental nasal",
symbols = { "n̪̊" }
},
{
name = "Voiced dental nasal",
symbols = { "n̪" },
audio = "Voiced Dental Nasal.ogg"
},
{
name = "Voiceless alveolar nasal",
symbols = { "n̥" },
audio = "Voiceless Alveolar Nasal.ogg"
},
{
name = "Voiced alveolar nasal",
symbols = { "n" },
audio = "Alveolar nasal.ogg"
},
{
name = "Voiceless postalveolar nasal",
symbols = { "n̠̊" },
},
{
name = "Voiced postalveolar nasal",
symbols = { "n̠" },
audio = "Voiced postalveolar nasal.ogg"
},
{
name = "Voiceless retroflex nasal",
symbols = { "ɳ̊", "ɳ̥" },
audio = "Voiceless retroflex nasal.wav"
},
{
name = "Voiced retroflex nasal",
symbols = { "ɳ" },
audio = "Retroflex nasal.ogg"
},
{
name = "Voiceless alveolo-palatal nasal",
symbols = { "n̠̊ʲ", "ɲ̊˖", "ɲ̟̊", "ȵ̊" },
},
{
name = "Voiced alveolo-palatal nasal",
symbols = { "n̠ʲ", "ɲ˖", "ɲ̟", "ȵ" },
},
{
name = "Voiceless palatal nasal",
symbols = { "ɲ̊", "ɲ̥" },
audio = "Voiceless palatal nasal.ogg"
},
{
name = "Voiced palatal nasal",
symbols = { "ɲ" },
audio = "Palatal nasal.ogg"
},
{
name = "Voiced post-palatal or pre-velar nasal",
symbols = { "ɲ˗", "ɲ̠", "ɲ", "ŋ˖", "ŋ᫈", "ŋ̟" },
article = "Voiced post-palatal nasal"
},
{
name = "Voiceless velar nasal",
symbols = { "ŋ̊", "ŋ̥" },
audio = "Voiceless velar nasal.wav"
},
{
name = "Voiced velar nasal",
symbols = { "ŋ" },
audio = "Velar nasal.ogg"
},
{
name = "Voiced pre-uvular nasal",
symbols = { "ɴ̟", "ŋ˗", "ŋ", "ŋ̠" },
},
{
name = "Voiceless uvular nasal",
symbols = { "ɴ̥", "ɴ̊" },
audio = "Voiceless uvular nasal.ogg"
},
{
name = "Voiced uvular nasal",
symbols = { "ɴ" },
audio = "Uvular nasal.ogg"
},
-- Plosives
{
name = "Voiceless bilabial plosive",
symbols = { "p" },
audio = "Voiceless bilabial plosive.ogg"
},
{
name = "Voiced bilabial plosive",
symbols = { "b" },
image = "IPA Unicode 0x0062.svg",
audio = "Voiced bilabial plosive.ogg"
},
{
name = "Voiceless labiodental plosive",
symbols = { "p̪" },
audio = "Voiceless labiodental plosive.ogg"
},
{
name = "Voiced labiodental plosive",
symbols = { "b̪" },
audio = "Voiced labiodental plosive.wav"
},
{
name = "Voiceless linguolabial plosive",
symbols = { "t̼", "p̺", "p̼" },
audio = "Voiceless linguolabial stop.ogg"
},
{
name = "Voiced linguolabial plosive",
symbols = { "d̼", "b̺", "b̼" },
audio = "Voiced linguolabial stop.ogg"
},
{
name = "Voiceless dental plosive",
symbols = { "t̪", "θ̝" },
audio = "Voiceless dental stop.ogg"
},
{
name = "Voiced dental plosive",
symbols = { "d̪", "ð̝" },
audio = "Voiced dental stop.ogg"
},
{
name = "Voiceless alveolar plosive",
symbols = { "t" },
audio = "Voiceless alveolar plosive.ogg"
},
{
name = "Voiced alveolar plosive",
symbols = { "d" },
audio = "Voiced alveolar plosive.ogg"
},
{
name = "Voiceless postalveolar plosive",
symbols = { "t̠" },
audio = "Voiceless postalveolar stop.ogg"
},
{
name = "Voiced postalveolar plosive",
symbols = { "d̠" },
audio = "Voiced postalveolar stop.ogg"
},
{
name = "Voiceless retroflex plosive",
symbols = { "ʈ" },
audio = "Voiceless retroflex stop.oga"
},
{
name = "Voiced retroflex plosive",
symbols = { "ɖ" },
audio = "Voiced retroflex stop.oga"
},
{
name = "Voiceless alveolo-palatal plosive",
symbols = { "t̠ʲ", "c̟", "ȶ" },
audio = "IPA sound - ȶ.ogg"
},
{
name = "Voiced alveolo-palatal plosive",
symbols = { "d̠ʲ", "ɟ˖", "ɟ᫈", "ɟ̟", "ȡ" },
audio = "Voiced alveolo-palatal plosive.ogg"
},
{
name = "Voiceless palatal plosive",
symbols = { "c" },
audio = "Voiceless palatal plosive.ogg"
},
{
name = "Voiced palatal plosive",
symbols = { "ɟ" },
audio = "Voiced palatal plosive.ogg"
},
{
name = "Voiceless post-palatal or pre-velar plosive",
symbols = { "c̠", "k̟" },
article = "Voiceless post-palatal plosive"
},
{
name = "Voiced post-palatal or pre-velar plosive",
symbols = { "ɟ˗", "ɟ", "ɟ̠", "ɡ˖", "ɡ᫈", "ɡ̟" },
article = "Voiced post-palatal plosive"
},
{
name = "Voiceless velar plosive",
symbols = { "k" },
audio = "Voiceless velar plosive.ogg"
},
{
name = "Voiced velar plosive",
symbols = { "ɡ" },
audio = "Voiced velar plosive 02.ogg"
},
{
name = "Voiceless pre-uvular plosive",
symbols = { "q˖", "q᫈", "q̟", "k̠" },
},
{
name = "Voiced pre-uvular plosive",
symbols = { "ɢ̟", "ɡ˗", "ɡ", "ɡ̠" },
audio = "Voiced velar-uvular plosive.ogg"
},
{
name = "Voiceless uvular plosive",
symbols = { "q" },
audio = "Voiceless uvular plosive.ogg"
},
{
name = "Voiced uvular plosive",
symbols = { "ɢ" },
audio = "Voiced uvular stop.oga"
},
{
name = "Voiceless upper-pharyngeal plosive",
symbols = { "ꞯ", "q˗", "q", "ʡ̟̥", "ʡ̥˖" },
audio = "Voiceless pharyngeal stop.ogg"
},
{
name = "Voiced upper-pharyngeal plosive",
symbols = { "𝼂", "ɢ̠", "ʡ̟̬", "ʡ̬˖" },
audio = "Voiced pharyngeal stop.ogg"
},
{
name = "Epiglottal plosive",
symbols = { "ʡ" },
audio = "Epiglottal stop.ogg"
},
{
name = "Voiceless epiglottal plosive",
symbols = { "ʡ̥" },
},
{
name = "Voiced epiglottal plosive",
symbols = { "ʡ̬" },
},
{
name = "Glottal stop",
symbols = { "ʔ" },
audio = "Glottal stop.ogg"
},
-- Affricates
{
name = "Voiceless bilabial affricate",
symbols = { "pɸ" },
audio = "Voiceless bilabial affricate.ogg"
},
{
name = "Voiced bilabial affricate",
symbols = { "bβ" },
audio = "Voiced bilabial affricate.wav"
},
{
name = "Voiceless bilabial trilled affricate",
symbols = { "t̪ʙ̥", "tʙ̥", "tʙ̥ʰ", "pʙ̥", "pʙ̥ʰ", "kʙ̥" },
article = "Voiceless bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiced bilabial trilled affricate",
symbols = { "t̪ʙ", "tʙ", "d̪ʙ", "dʙ", "pʙ", "bʙ", "ɡʙ" },
article = "Voiced bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiceless labiodental affricate",
symbols = { "p̪f", "pf" },
audio = "Voiceless labiodental affricate.ogg"
},
{
name = "Voiced labiodental affricate",
symbols = { "b̪v", "bv" },
audio = "Voiced labiodental affricate.ogg"
},
{
name = "Voiceless dental sibilant affricate",
symbols = { "t̪s̪", "ts̪", "t̟s̟", "ts̟" },
audio = "Voiceless dental sibilant affricate.oga"
},
{
name = "Voiced dental sibilant affricate",
symbols = { "d̪z̪", "dz̪", "d̟z̟", "dz̟" },
audio = "Voiced dental sibilant affricate.oga"
},
{
name = "Voiceless dental affricate",
symbols = { "t̪θ", "t̟θ", "tθ" },
audio = "Voiceless dental non-sibilant affricate.oga"
},
{
name = "Voiced dental affricate",
symbols = { "d̪ð", "d̟ð", "dð" },
audio = "Voiced dental non-sibilant affricate.oga"
},
{
name = "Voiceless alveolar affricate",
symbols = { "ts", "ʦ" },
audio = "Voiceless alveolar sibilant affricate.oga"
},
{
name = "Voiced alveolar affricate",
symbols = { "dz", "ʣ" },
audio = "Voiced alveolar sibilant affricate.oga"
},
{
name = "Voiceless apico-alveolar affricate",
symbols = { "t̺s̺", "ts̺", "t̠s̠", "ts̠" },
},
{
name = "Voiced apico-alveolar affricate",
symbols = { "d̺z̺", "dz̺", "d̠z̠", "dz̠" },
},
{
name = "Voiceless alveolar non-sibilant affricate",
symbols = { "tɹ̝̊", "tɹ̥", "tθ̠", "tθ͇" },
},
{
name = "Voiced alveolar non-sibilant affricate",
symbols = { "dɹ̝", "dɹ", "dð̠", "dð͇" },
},
{
name = "Voiceless postalveolar affricate",
symbols = { "t̠ʃ", "tʃ", "ʧ" },
audio = "Voiceless palato-alveolar affricate.ogg"
},
{
name = "Voiced postalveolar affricate",
symbols = { "d̠ʒ", "dʒ", "ʤ" },
audio = "Voiced palato-alveolar affricate.ogg"
},
{
name = "Voiceless postalveolar non-sibilant affricate",
symbols = { "t̠ɹ̠̊˔", "tɹ̠̊˔", "tɹ̝̊˗", "t̠ɹ̝̊˗", "t̠ɹ̠̊", "tɹ̠̊" },
audio = "Voiceless postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiced postalveolar non-sibilant affricate",
symbols = { "d̠ɹ̠˔", "d̠ɹ̠᷵", "dɹ̠˔", "dɹ̝˗", "d̠ɹ̝˗", "d̠ɹ̠", "dɹ̠" },
audio = "Voiced postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiceless retroflex affricate",
symbols = { "ʈʂ", "tʂ", "ꭧ" },
audio = "Voiceless retroflex affricate.ogg"
},
{
name = "Voiced retroflex affricate",
symbols = { "ɖʐ", "dʐ", "ꭦ" },
audio = "Voiced retroflex affricate.ogg"
},
{
name = "Voiced retroflex non-sibilant affricate",
symbols = { "dɻ˔", "ɖɻ᷵", "d̠ɻ̝", "ɖɻ˔" },
audio = "Voiced retroflex non-sibilant affricate.ogg"
},
{
name = "Voiceless alveolo-palatal affricate",
symbols = { "tɕ", "cɕ", "t̠ʃʲ", "tʃʲ", "t̺s̺ʲ", "ts̺ʲ", "t̠s̠ʲ", "ts̠ʲ", "ʨ" },
audio = "Voiceless alveolo-palatal affricate.ogg"
},
{
name = "Voiced alveolo-palatal affricate",
symbols = { "dʑ", "ɟʑ", "d̠ʒʲ", "dʒʲ", "d̺z̺ʲ", "dz̺ʲ", "d̠z̠ʲ", "dz̠ʲ", "ʥ" },
audio = "Voiced alveolo-palatal affricate.ogg"
},
{
name = "Voiceless palatal affricate",
symbols = { "cç" },
audio = "Voiceless palatal affricate.ogg"
},
{
name = "Voiced palatal affricate",
symbols = { "ɟʝ" },
audio = "Voiced palatal affricate.ogg"
},
{
name = "Voiceless post-palatal or pre-velar affricate",
symbols = { "c̠ç˗", "cç˗", "c̠ç̠", "cç̠", "k̟x̟", "kx̟" },
article = "Voiceless post-palatal affricate"
},
{
name = "Voiceless velar affricate",
symbols = { "kx" },
audio = "Voiceless velar affricate.ogg"
},
{
name = "Voiced velar affricate",
symbols = { "ɡɣ" },
audio = "Voiced velar affricate.ogg"
},
{
name = "Voiceless pre-uvular affricate",
symbols = { "q˖χ˖", "qχ˖", "q̟χ̟", "qχ̟", "k̠x̠", "kx̠" },
},
{
name = "Voiceless uvular affricate",
symbols = { "qχ" },
audio = "Voiceless uvular affricate.ogg"
},
{
name = "Voiced uvular affricate",
symbols = { "ɢʁ" },
audio = "Voiced uvular affricate.ogg"
},
{
name = "Voiceless pharyngeal affricate",
symbols = { "ʡħ", "ʡ̥ħ" },
},
{
name = "Voiced pharyngeal affricate",
symbols = { "ʡʕ", "ʡ̬ʕ" },
},
{
name = "Voiceless epiglottal affricate",
symbols = { "ʡʜ", "ʡ̥ʜ" },
audio = "Voiceless epiglottal affricate.ogg"
},
{
name = "Voiced epiglottal affricate",
symbols = { "ʡʢ", "ʡ̬ʢ" },
audio = "Voiced epiglottal affricate.ogg"
},
{
name = "Voiceless glottal affricate",
symbols = { "ʔh" },
audio = "Voiceless glottal affricate.ogg"
},
-- Fricatives
{
name = "Voiceless bilabial fricative",
symbols = { "ɸ" },
audio = "Voiceless bilabial fricative.ogg"
},
{
name = "Voiced bilabial fricative",
symbols = { "β" },
audio = "Voiced bilabial fricative.ogg"
},
{
name = "Voiceless labiodental fricative",
symbols = { "f" },
audio = "Voiceless labio-dental fricative.ogg"
},
{
name = "Voiced labiodental fricative",
symbols = { "v" },
audio = "Voiced labio-dental fricative.ogg"
},
{
name = "Voiceless linguolabial fricative",
symbols = { "θ̼", "ɸ̺", "f̼", "ɸ̼" },
audio = "Voiceless linguolabial fricative.ogg"
},
{
name = "Voiced linguolabial fricative",
symbols = { "ð̼", "β̺", "v̼", "β̼" },
audio = "Voiced linguolabial fricative.wav"
},
{
name = "Voiceless dental fricative",
symbols = { "θ" },
audio = "Voiceless dental fricative.ogg"
},
{
name = "Voiced dental fricative",
symbols = { "ð" },
audio = "Voiced dental fricative.ogg"
},
{
name = "Voiceless dental sibilant fricative",
symbols = { "s̪" },
audio = "Voiceless dental sibilant fricative.ogg"
},
{
name = "Voiced dental sibilant fricative",
symbols = { "z̪" },
},
{
name = "Voiceless denti-alveolar fricative",
symbols = { "s̻̪", "s̪̻", "s̻͆", "s̟" },
},
{
name = "Voiceless alveolar fricative",
symbols = { "s" },
audio = "Voiceless alveolar sibilant.ogg"
},
{
name = "Voiced alveolar fricative",
symbols = { "z" },
audio = "Voiced alveolar sibilant.ogg"
},
{
name = "Voiceless apico-alveolar fricative",
symbols = { "s̺" },
},
{
name = "Voiced apico-alveolar fricative",
symbols = { "z̺" },
},
{
name = "Voiceless retracted alveolar fricative",
symbols = { "s̠" },
audio = "Voiceless alveolar retracted sibilant.ogg"
},
{
name = "Voiced retracted alveolar fricative",
symbols = { "z̠" },
},
{
name = "Voiceless alveolar non-sibilant fricative",
symbols = { "θ̠", "θ͇", "t̞", "ɹ̝̊" },
},
{
name = "Voiced alveolar non-sibilant fricative",
symbols = { "ð̠", "ð͇", "d̞", "ɹ̝" },
},
{
name = "Voiceless alveolar tapped fricative",
symbols = { "ɾ̞̊" },
},
{
name = "Voiced alveolar tapped fricative",
symbols = { "ɾ̞" },
},
{
name = "Voiceless postalveolar fricative",
symbols = { "ʃ" },
audio = "Voiceless palato-alveolar sibilant.ogg"
},
{
name = "Voiced postalveolar fricative",
symbols = { "ʒ" },
audio = "Voiced palato-alveolar sibilant.ogg"
},
{
name = "Voiceless postalveolar non-sibilant fricative",
symbols = { "ɹ̠̊˔", "ɹ̝̊˗" },
audio = "Voiceless postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiced postalveolar non-sibilant fricative",
symbols = { "ɹ̠˔", "ɹ̠᷵", "ɹ̝˗" },
audio = "Voiced postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiceless retroflex fricative",
symbols = { "ʂ" },
audio = "Voiceless retroflex sibilant.ogg"
},
{
name = "Voiced retroflex fricative",
symbols = { "ʐ" },
audio = "Voiced retroflex sibilant.ogg"
},
{
name = "Voiceless retroflex non-sibilant fricative",
symbols = { "ɻ̝̊", "ɻ̊˔", "ʈ̞", "ʈ˕" },
audio = "Voiceless retroflex non-sibilant fricative.ogg"
},
{
name = "Voiced retroflex non-sibilant fricative",
symbols = { "ɻ̝", "ɻ˔", "ɻ᷵", "ɖ̞", "ɖ˕" },
audio = "Voiced retroflex non-sibilant fricative.ogg"
},
{
name = "Voiceless alveolo-palatal fricative",
symbols = { "ɕ", "ʃʲ", "s̺ʲ", "s̠ʲ"},
audio = "Voiceless alveolo-palatal sibilant.ogg"
},
{
name = "Voiced alveolo-palatal fricative",
symbols = { "ʑ", "ʒʲ", "z̺ʲ", "z̠ʲ"},
audio = "Voiced alveolo-palatal sibilant.ogg"
},
{
name = "Voiceless palatal fricative",
symbols = { "ç" },
audio = "Voiceless palatal fricative.ogg"
},
{
name = "Voiced palatal fricative",
symbols = { "ʝ" },
audio = "Voiced palatal fricative.ogg"
},
{
name = "Voiceless post-palatal or pre-velar fricative",
symbols = { "ç˗", "ç̠", "ç", "x̟" },
article = "Voiceless post-palatal fricative",
audio = "Voiceless post-palatal fricative.ogg"
},
{
name = "Voiced post-palatal or pre-velar fricative",
symbols = { "ʝ", "ʝ̠", "ɣ᫈", "ɣ̟" },
article = "Voiced post-palatal fricative",
audio = "Voiced post-palatal fricative.ogg"
},
{
name = "Voiceless velar fricative",
symbols = { "x" },
audio = "Voiceless velar fricative.ogg"
},
{
name = "Voiced velar fricative",
symbols = { "ɣ" },
audio = "Voiced velar fricative.ogg"
},
{
name = "Voiceless pre-uvular fricative",
symbols = { "χ˖", "χ̟", "x̠" },
},
{
name = "Voiced pre-uvular fricative",
symbols = { "ʁ̟", "ɣ˗", "ɣ̠" },
},
{
name = "Voiceless uvular fricative",
symbols = { "χ" },
audio = "Voiceless uvular fricative.ogg"
},
{
name = "Voiced uvular fricative",
symbols = { "ʁ" },
audio = "Voiced uvular fricative.ogg"
},
{
name = "Voiceless pharyngeal fricative",
symbols = { "ħ" },
audio = "Voiceless pharyngeal fricative.ogg"
},
{
name = "Voiced pharyngeal fricative",
symbols = { "ʕ", "ʕ̝" },
audio = "Voiced pharyngeal fricative.ogg"
},
{
name = "Voiceless glottal fricative",
symbols = { "h" },
audio = "Voiceless glottal fricative.ogg"
},
{
name = "Voiced glottal fricative",
symbols = { "ɦ" },
audio = "Voiced glottal fricative.ogg"
},
{
name = "Voiceless bidental fricative",
symbols = { "h̪͆" },
audio = "Voiceless bidental fricative.ogg"
},
{
name = "Voiceless dentolabial fricative",
symbols = { "f͆" },
audio = "Voiceless dentolabial fricative.ogg"
},
-- Approximants
{
name = "Voiceless bilabial approximant",
symbols = { "ɸ̞", "ɸ˕" },
audio = "Voiceless bilabial approximant.ogg"
},
{
name = "Voiced bilabial approximant",
symbols = { "β̞", "ʋ̟" },
audio = "Bilabial approximant.ogg"
},
{
name = "Voiceless labiodental approximant",
symbols = { "ʋ̥" },
audio = "Voiceless labiodental approximant.ogg"
},
{
name = "Voiced labiodental approximant",
symbols = { "ʋ" },
audio = "Labiodental approximant.ogg"
},
{
name = "Voiceless dental approximant",
symbols = { "θ̞", "θ̞᫈", "ɹ̪̊" },
},
{
name = "Voiced dental approximant",
symbols = { "ð̞", "ɹ̪" },
},
{
name = "Voiceless alveolar approximant",
symbols = { "ɹ̥" },
audio = "Voiceless alveolar approximant.ogg"
},
{
name = "Voiceless alveolar spirant approximant",
symbols = { "s̞" },
},
{
name = "Voiced alveolar approximant",
symbols = { "ɹ" },
audio = "Alveolar approximant.ogg"
},
{
name = "Voiced alveolar spirant approximant",
symbols = { "z̞", "ð̠˕" },
},
{
name = "Voiceless postalveolar approximant",
symbols = { "ɹ̠̊" },
},
{
name = "Voiced postalveolar approximant",
symbols = { "ɹ̠" },
audio = "Postalveolar approximant.ogg"
},
{
name = "Voiceless retroflex approximant",
symbols = { "ɻ̊" },
},
{
name = "Voiced retroflex approximant",
symbols = { "ɻ" },
audio = "Retroflex Approximant2.oga"
},
{
name = "Voiceless palatal approximant",
symbols = { "j̊", "ç˕", "ç̞"},
audio = "Voiceless palatal approximant.wav"
},
{
name = "Voiced palatal approximant",
symbols = { "j", "ʝ˕", "ʝ̞" },
audio = "Palatal approximant.ogg"
},
{
name = "Voiced post-palatal or pre-velar approximant",
symbols = { "j", "j̠", "j˗", "j̈", "ʝ̞˗", "ʝ̞", "ɰ̈", "ɰ̟", "ɰ˖", "ɣ̞˖", "ɣ̞᫈" },
article = "Voiced post-palatal approximant",
audio = "Post-palatal approximant.ogg"
},
{
name = "Protruded post-palatal or pre-velar approximant",
symbols = { "j˗ʷ", "jʷ", "j̈ʷ", "ɥ̫̈", "ẅ", "w̟" },
audio = "Voiced labialized post-palatal approximant.ogg",
article = "Protruded post-palatal approximant"
},
{
name = "Compressed post-palatal or pre-velar approximant",
symbols = { "ɥ̈", "ɥ˗", "ɥ", "j̈ᵝ", "j˗ᵝ", "jᵝ" },
article = "Compressed post-palatal approximant"
},
{
name = "Voiced velar approximant",
symbols = { "ɰ", "ɣ˕", "ɣ", "ɣ̞" },
audio = "Voiced velar approximant.ogg"
},
{
name = "Voiced velar bunched approximant",
symbols = { "ɹ̈ "},
},
{
name = "Voiced uvular approximant",
symbols = { "ʁ̞" },
audio = "Voiced Uvular Approximant.ogg"
},
{
name = "Voiced pharyngeal approximant",
symbols = { "ʕ̞" },
audio = "Voiced pharyngeal approximant.ogg"
},
{
name = "Voiced epiglottal approximant",
symbols = { "ʢ̞", "ʕ̞˗" },
audio = "Voiced epiglottal trill.ogg"
},
{
name = "Creaky-voiced glottal approximant",
symbols = { "ʔ̬", "ʔ̞", "ʔ̰", "˷" },
audio = "Creaky-voiced glottal approximant.wav"
},
-- Taps/flaps
{
name = "Voiced bilabial flap",
symbols = { "ⱱ̟", "b̆", "w̆" },
audio = "Voiced bilabial flap.wav"
},
{
name = "Voiced labiodental flap",
symbols = { "ⱱ", "v̆" },
audio = "Labiodental flap.ogg"
},
{
name = "Voiceless dental tap or flap",
symbols = { "ɾ̪̊", "t̪̆" },
article = "Voiceless dental tap"
},
{
name = "Voiced dental tap or flap",
symbols = { "ɾ̪", "d̪̆" },
article = "Dental tap",
},
{
name = "Voiceless alveolar tap or flap",
symbols = { "ɾ̥", "t̆" },
article = "Voiceless alveolar tap",
audio = "Voiceless alveolar tap.wav"
},
{
name = "Voiced alveolar tap or flap",
symbols = { "ɾ", "d̆" },
audio = "Alveolar tap.ogg"
},
{
name = "Voiced postalveolar flap",
symbols = { "ɾ̠", "d̠̆"},
},
{
name = "Voiced alveolar nasal tap or flap",
symbols = { "ɾ̃", "n̆" },
article = "Alveolar nasal tap",
},
{
name = "Voiceless retroflex flap",
symbols = { "ɽ̊", "ʈ̆" },
--audio = "Voiceless retroflex tap.wav"
},
{
name = "Voiced retroflex flap",
symbols = { "ɽ", "ɖ̆" },
audio = "Retroflex flap.ogg"
},
{
name = "Voiced retroflex nasal flap",
symbols = { "ɽ̃", "ɳ̆" },
},
{
name = "Voiced velar tap",
symbols = { "ɡ̆" },
audio = "Voiced velar tap.wav"
},
{
name = "Voiced uvular tap or flap",
symbols = { "ɢ̆", "ʀ̆" },
article = "Voiced uvular tap and flap",
audio = "Voiced uvular tap.wav"
},
{
name = "Voiced epiglottal tap",
symbols = { "ʡ̆", "ʢ̆", "ʕ̆" },
audio = "Epiglottal flap.oga"
},
-- Trills
{
name = "Voiceless bilabial trill",
symbols = { "ʙ̥" },
audio = "Voiceless bilabial trill with aspiration.ogg"
},
{
name = "Voiced bilabial trill",
symbols = { "ʙ" },
audio = "Bilabial trill.ogg"
},
{
name = "Voiceless labiolingual trill",
symbols = { "r̼̊", "ʙ̺̊", "ʙ̼̊" },
audio = "Voiceless linguolabial trill.wav"
},
{
name = "Voiced labiolingual trill",
symbols = { "r̼", "ʙ̺", "ʙ̼" },
audio = "Voiced linguolabial trill.wav"
},
{
name = "Voiceless dental trill",
symbols = { "r̪̊" }
},
{
name = "Voiced dental trill",
symbols = { "r̪" },
},
{
name = "Voiceless alveolar trill",
symbols = { "r̥" },
audio = "Voiceless alveolar trill.ogg"
},
{
name = "Voiced alveolar trill",
symbols = { "r" },
audio = "Alveolar trill.ogg"
},
{
name = "Voiceless alveolar fricative trill",
symbols = { "r̝̊" },
audio = "Voiceless alveolar raised non-sonorant trill.ogg"
},
{
name = "Voiced alveolar fricative trill",
symbols = { "r̝" },
audio = "Raised alveolar non-sonorant trill.ogg"
},
{
name = "Voiceless postalveolar trill",
symbols = { "r̠̊" }
},
{
name = "Voiced postalveolar trill",
symbols = { "r̠" },
audio = "Voiced postalveolar trill.ogg"
},
{
name = "Voiceless retroflex trill",
symbols = { "ɽ̊r̥", "ɽr̥", "ɽ̊ʳ" },
audio = "Voiceless retroflex trill.ogg"
},
{
name = "Voiced retroflex trill",
symbols = { "ɽr", "ɽʳ" },
audio = "Voiced retroflex trill.ogg"
},
{
name = "Voiceless pre-uvular fricative trill",
symbols = { "ʀ̝̊˖", "ʀ̟̊˔" },
},
{
name = "Voiced pre-uvular fricative trill",
symbols = { "ʀ̝˖", "ʀ̟˔" },
},
{
name = "Voiceless uvular trill",
symbols = { "ʀ̥" },
audio = "Voiceless uvular trill.ogg"
},
{
name = "Voiced uvular trill",
symbols = { "ʀ" },
audio = "Uvular trill.ogg"
},
{
name = "Voiceless uvular fricative trill",
symbols = { "ʀ̝̊" },
audio = "Voiceless uvular fricative trill.ogg"
},
{
name = "Voiced uvular fricative trill",
symbols = { "ʀ̝" },
audio = "Voiced uvular fricative trill.wav"
},
{
name = "Voiceless epiglottal trill",
symbols = { "ʜ" },
audio = "Voiceless epiglottal trill.ogg"
},
{
name = "Voiced epiglottal trill",
symbols = { "ʢ" },
audio = "Voiced epiglottal trill 2.ogg"
},
-- Lateral affricates
{
name = "Voiceless alveolar lateral affricate",
symbols = { "tɬ" },
audio = "Voiceless alveolar lateral affricate.ogg"
},
{
name = "Voiced alveolar lateral affricate",
symbols = { "dɮ" },
audio = "Voiced alveolar lateral affricate.ogg"
},
{
name = "Voiceless retroflex lateral affricate",
symbols = { "ʈꞎ", "tꞎ", "ʈɭ̊˔", "tɭ̊˔", "ʈɭ̊", "tɭ̊" },
audio = "Voiceless retroflex lateral affricate.ogg"
},
{
name = "Voiced retroflex lateral affricate",
symbols = { "ɖ𝼅", "d𝼅", "ɖɭ˔", "dɭ˔", "ɖɭ", "dɭ" },
audio = "Voiced retroflex lateral affricate.ogg"
},
{
name = "Voiceless palatal lateral affricate",
symbols = { "cʎ̝̊", "cʎ̥", "c𝼆", "t𝼆" },
audio = "Voiceless palatal lateral affricate.ogg"
},
{
name = "Voiced palatal lateral affricate",
symbols = { "ɟʎ̝", "ɟʎ", "ɟ𝼆̬", "d𝼆̬" },
audio = "Voiced palatal lateral affricate.ogg"
},
{
name = "Voiceless post-palatal lateral affricate",
symbols = { "c𝼆˗" },
article = "Voiceless velar lateral affricate"
},
{
name = "Voiceless velar lateral affricate",
symbols = { "kʟ̝̊", "kʟ̥", "k𝼄" },
audio = "Voiceless velar lateral affricate.ogg"
},
{
name = "Voiced velar lateral affricate",
symbols = { "ɡʟ̝", "ɡʟ", "ɡ𝼄̬" },
audio = "Voiced velar lateral affricate.ogg"
},
-- Lateral fricatives
{
name = "Voiceless dental lateral fricative",
symbols = { "ɬ̪" },
},
{
name = "Voiced dental lateral fricative",
symbols = { "ɮ̪", "ɮ͆" },
},
{
name = "Voiceless alveolar lateral fricative",
symbols = { "ɬ" },
audio = "Voiceless alveolar lateral fricative.ogg"
},
{
name = "Voiced alveolar lateral fricative",
symbols = { "ɮ" },
audio = "Voiced alveolar lateral fricative.ogg"
},
{
name = "Voiceless postalveolar lateral fricative",
symbols = { "ɬ̠" }
},
{
name = "Voiced postalveolar lateral fricative",
symbols = { "ɮ̠" },
audio = "Voiced postalveolar lateral fricative.ogg"
},
{
name = "Voiceless retroflex lateral fricative",
symbols = { "ɭ̊˔", "ꞎ"},
audio = "Voiceless retroflex lateral fricative.ogg"
},
{
name = "Voiced retroflex lateral fricative",
symbols = { "ɭ˔", "𝼅" },
audio = "Voiced retroflex lateral fricative.wav"
},
{
name = "Voiceless alveolo-palatal lateral fricative",
symbols = { "ɬ̠ʲ", "ʎ̝̊˖", "ȴ̊˔", "l̠̊ʲ", "ʎ̟̊", "ȴ̊" },
},
{
name = "Voiceless palatal lateral fricative",
symbols = { "ʎ̝̊", "𝼆" },
audio = "Voiceless palatal lateral fricative.ogg"
},
{
name = "Voiced palatal lateral fricative",
symbols = { "ʎ̝", "𝼆̬" },
audio = "ʎ̝ IPA sound.opus"
},
{
name = "Voiceless post-palatal lateral fricative",
symbols = { "𝼆̠" },
},
{
name = "Voiced post-palatal or pre-velar lateral fricative",
symbols = { "ʎ̝˗", "ʟ̟᷵" },
article = "Voiced pre-velar lateral fricative"
},
{
name = "Voiceless velar lateral fricative",
symbols = { "ʟ̝̊", "𝼄" },
audio = "Voiceless velar lateral fricative.ogg"
},
{
name = "Voiced velar lateral fricative",
symbols = { "ʟ̝", "𝼄̬" },
audio = "Voiced velar lateral fricative.ogg"
},
-- Lateral approximants
{
name = "Voiced dental lateral approximant",
symbols = { "l̪" },
audio = "Voiced dental lateral approximant.ogg"
},
{
name = "Voiceless alveolar lateral approximant",
symbols = { "l̥" },
audio = "Voiceless alveolar lateral approximant.ogg"
},
{
name = "Voiced alveolar lateral approximant",
symbols = { "l" },
audio = "Alveolar lateral approximant.ogg"
},
{
name = "Voiced postalveolar lateral approximant",
symbols = { "l̠" },
audio = "Voiced postalveolar lateral approximant.ogg"
},
{
name = "Voiceless retroflex lateral approximant",
symbols = { "ɭ̊" },
},
{
name = "Voiced retroflex lateral approximant",
symbols = { "ɭ" },
audio = "Retroflex lateral approximant.ogg"
},
{
name = "Voiced alveolo-palatal lateral approximant",
symbols = { "l̠ʲ", "ʎ̟", "ȴ" },
audio = "Alveolo-palatal lateral approximant.ogg"
},
{
name = "Voiceless palatal lateral approximant",
symbols = { "ʎ̥" },
},
{
name = "Voiced palatal lateral approximant",
symbols = { "ʎ" },
audio = "Palatal lateral approximant.ogg"
},
{
name = "Voiceless velar lateral approximant",
symbols = { "ʟ̥" },
},
{
name = "Voiced velar lateral approximant",
symbols = { "ʟ" },
audio = "Velar lateral approximant.ogg"
},
{
name = "Voiced uvular lateral approximant",
symbols = { "ʟ̠" },
audio = "Uvular lateral approximant.ogg"
},
-- Lateral taps/flaps
{
name = "Voiced linguolabial lateral flap",
symbols = { "ɺ̼", "l̼̆"}
},
{
name = "Voiced dental lateral flap",
symbols = { "ɺ̪", "l̪̆" }
},
{
name = "Voiceless alveolar lateral flap",
symbols = { "ɺ̥", "l̥̆" },
audio = "Voiceless alveolar lateral flap.wav"
},
{
name = "Voiced alveolar lateral flap",
symbols = { "ɺ", "l̆"},
audio = "Voiced alveolar lateral flap.wav"
},
{
name = "Voiced postalveolar lateral flap",
symbols = { "ɺ̠", "l̠̆" },
audio = "Voiced postalveolar lateral flap.ogg"
},
{
name = "Voiceless retroflex lateral flap",
symbols = { "𝼈̊", "𝼈̥", "ɭ̥̆" },
audio = "Voiceless retroflex lateral flap.wav"
},
{
name = "Voiced retroflex lateral flap",
symbols = { "𝼈", "ɭ̆" },
audio = "Voiced retroflex lateral flap (correct).wav"
},
{
name = "Voiced palatal lateral flap",
symbols = { "ʎ̆" },
audio = "Voiced palatal lateral flap.wav"
},
{
name = "Voiced velar lateral tap",
symbols = { "ʟ̆" }
},
-- NON-PULMONIC CONSONANTS
-- Ejective stops
{
name = "Bilabial ejective stop",
symbols = { "pʼ" },
audio = "Bilabial ejective plosive.ogg"
},
{
name = "Dental ejective stop",
symbols = { "t̪ʼ" },
audio = "Dental ejective stop.ogg"
},
{
name = "Alveolar ejective stop",
symbols = { "tʼ" },
audio = "Alveolar ejective plosive.ogg"
},
{
name = "Retroflex ejective stop",
symbols = { "ʈʼ" },
audio = "Retroflex ejective.ogg"
},
{
name = "Palatal ejective stop",
symbols = { "cʼ" },
audio = "Palatal ejective.ogg"
},
{
name = "Velar ejective stop",
symbols = { "kʼ" },
audio = "Velar ejective plosive.ogg"
},
{
name = "Uvular ejective stop",
symbols = { "qʼ" },
audio = "Uvular ejective plosive.ogg"
},
-- Ejective affricates
{
name = "Labiodental ejective affricate",
symbols = { "p̪fʼ" },
},
{
name = "Dental ejective affricate",
symbols = { "t̪θʼ", "t̟θʼ", "tθʼ" },
audio = "Dental ejective affricate.ogg"
},
{
name = "Alveolar ejective affricate",
symbols = { "tsʼ" },
audio = "Alveolar ejective affricate.ogg"
},
{
name = "Postalveolar ejective affricate",
symbols = { "t̠ʃʼ", "tʃʼ" },
audio = "Palato-alveolar ejective affricate.ogg"
},
{
name = "Retroflex ejective affricate",
symbols = { "ʈʂʼ", "tʂʼ" },
audio = "Retroflex ejective affricate.ogg"
},
{
name = "Alveolo-palatal ejective affricate",
symbols = { "t̠ɕʼ", "tɕʼ", "t̠ʃʲʼ", "tʃʲʼ", "t̠s̠ʲʼ", "cɕʼ" },
},
{
name = "Palatal ejective affricate",
symbols = { "cçʼ" },
audio = "Palatal ejective affricate.ogg"
},
{
name = "Velar ejective affricate",
symbols = { "kxʼ" },
audio = "Velar ejective affricate.ogg"
},
{
name = "Uvular ejective affricate",
symbols = { "qχʼ" },
audio = "Uvular ejective affricate.ogg"
},
-- Ejective fricatives
{
name = "Bilabial ejective fricative",
symbols = { "ɸʼ" },
audio = "Bilabial ejective fricative.ogg"
},
{
name = "Labiodental ejective fricative",
symbols = { "fʼ" },
audio = "Labiodental ejective fricative.ogg"
},
{
name = "Dental ejective fricative",
symbols = { "θʼ" },
audio = "Dental ejective fricative.ogg"
},
{
name = "Alveolar ejective fricative",
symbols = { "sʼ" },
audio = "Alveolar ejective fricative.ogg"
},
{
name = "Postalveolar ejective fricative",
symbols = { "ʃʼ" },
audio = "Palato-alveolar ejective fricative.ogg"
},
{
name = "Retroflex ejective fricative",
symbols = { "ʂʼ" },
audio = "Retroflex ejective fricative.ogg"
},
{
name = "Alveolo-palatal ejective fricative",
symbols = { "ɕʼ" , "ʃʲʼ", "s̠ʲʼ"},
audio = "Alveolo-palatal ejective fricative.ogg"
},
{
name = "Palatal ejective fricative",
symbols = { "çʼ" },
audio = "Palatal ejective fricative.ogg"
},
{
name = "Velar ejective fricative",
symbols = { "xʼ" },
audio = "Velar ejective fricative.ogg"
},
{
name = "Uvular ejective fricative",
symbols = { "χʼ" },
audio = "Uvular ejective fricative.ogg"
},
-- Lateral ejective affricates
{
name = "Alveolar lateral ejective affricate",
symbols = { "tɬʼ", "ƛʼ" },
audio = "Alveolar lateral ejective affricate.ogg"
},
{
name = "Palatal lateral ejective affricate",
symbols = { "cʎ̝̊ʼ", "cʎ̥ʼ", "c𝼆ʼ" },
audio = "Palatal lateral ejective affricate.ogg"
},
{
name = "Velar lateral ejective affricate",
symbols = { "kʟ̝̊ʼ", "kʟ̥ʼ", "k𝼄ʼ" },
audio = "Velar lateral ejective affricate.ogg"
},
{
name = "Uvular lateral ejective affricate",
symbols = { "q𝼄ʼ", "q𝼄̠ʼ", "qʟ̝̊ʼ" },
},
-- Lateral ejective fricatives
{
name = "Alveolar lateral ejective fricative",
symbols = { "ɬʼ" },
audio = "Alveolar lateral ejective fricative.ogg"
},
-- Ejective trills
{
name = "Ejective trill",
symbols = { "ʙ̥ʼ", "r̼̊ʼ", "ʙ̺̊ʼ", "ʙ̼̊ʼ", "r̪̊ʼ", "r̥ʼ", "r̠̊ʼ", "ɽr̥ʼ", "ʀ̥ʼ" },
article = "Ejective consonant"
},
-- Tenuis clicks
{
name = "Tenuis bilabial click",
symbols = { "ʘ", "kʘ" },
audio = "Clic bilabial sourd.ogg"
},
{
name = "Tenuis dental click",
symbols = { "ǀ", "kǀ" },
audio = "Dental click.ogg"
},
{
name = "Tenuis alveolar click",
symbols = { "ǃ", "kǃ" },
audio = "Postalveolar click.ogg"
},
{
name = "Tenuis palatal click",
symbols = { "ǂ", "kǂ" },
audio = "Palatoalveolar click.ogg"
},
{
name = "Tenuis retroflex click",
symbols = { "𝼊", "k𝼊" },
audio = "Retrflx click.wav"
},
{
name = "Back-released click",
symbols = { "ʞ" },
},
-- Voiced clicks
{
name = "Voiced bilabial click",
symbols = { "ʘ̬", "ɡʘ" },
},
{
name = "Voiced dental click",
symbols = { "ǀ̬", "ɡǀ" },
},
{
name = "Voiced alveolar click",
symbols = { "ǃ̬", "ɡǃ" },
},
{
name = "Voiced palatal click",
symbols = { "ǂ̬", "ɡǂ" },
},
{
name = "Voiced retroflex click",
symbols = { "𝼊̬", "ɡ𝼊" },
},
-- Nasal clicks
{
name = "Bilabial nasal click",
symbols = { "ʘ̃", "ŋʘ", "ⁿʘ" },
audio = "Bilabial nasal click.ogg"
},
{
name = "Dental nasal click",
symbols = { "ǀ̃", "ŋǀ", "ⁿǀ", "ŋǀʱ" },
},
{
name = "Alveolar nasal click",
symbols = { "ǃ̃", "ŋǃ", "ⁿǃ" },
audio = "Intervocalic nasal alveolar clicks.ogg"
},
{
name = "Palatal nasal click",
symbols = { "ǂ̃", "ŋǂ", "ⁿǂ" },
},
{
name = "Retroflex nasal click",
symbols = { "𝼊̃", "ŋ𝼊", "ⁿ𝼊" },
},
-- Lateral clicks
{
name = "Tenuis alveolar lateral click",
symbols = { "ǁ", "kǁ" },
audio = "Alveolar lateral click.ogg"
},
{
name = "Voiced alveolar lateral click",
symbols = { "ǁ̬", "ɡǁ" },
},
-- Lateral nasal clicks
{
name = "Alveolar lateral nasal click",
symbols = { "ǁ̃", "ŋǁ", "ⁿǁ" },
},
-- Glottalized clicks
{
name = "Glottalized bilabial nasal click",
symbols = { "ʘ̃ˀ", "ʘˀ", "ŋ̊ʘˀ", "ŋʘˀ" },
},
{
name = "Glottalized dental nasal click",
symbols = { "ǀ̃ˀ", "ǀˀ", "ŋ̊ǀˀ", "ŋǀˀ" },
},
{
name = "Glottalized alveolar nasal click",
symbols = { "ǃ̃ˀ", "ǃˀ", "ŋ̊ǃˀ", "ŋǃˀ" },
},
{
name = "Glottalized retroflex nasal click",
symbols = { "𝼊̃ˀ", "𝼊ˀ", "ŋ𝼊ˀ", "ŋ̊𝼊ˀ" },
},
{
name = "Glottalized palatal nasal click",
symbols = { "ǂ̃ˀ", "ǂˀ", "ŋ̊ǂˀ", "ŋǂˀ" },
},
{
name = "Glottalized alveolar lateral nasal click",
symbols = { "ǁ̃ˀ", "ǁˀ", "ŋ̊ǁˀ", "ŋǁˀ" },
},
-- Egressive clicks (for Damin)
{
name = "Egressive bilabial click",
symbols = { "ʘ↑" },
},
-- Implosives
{
name = "Voiceless bilabial implosive",
symbols = { "ɓ̥", "ƥ", "pʼ↓" },
audio = "Voiceless-bilabial-implosive.ogg",
},
{
name = "Voiced bilabial implosive",
symbols = { "ɓ" },
audio = "Voiced bilabial implosive.ogg"
},
{
name = "Voiceless dental implosive",
symbols = { "ɗ̪̥", "ɗ̪̊", "ƭ̪", "t̪ʼ↓" },
},
{
name = "Voiced dental implosive",
symbols = { "ɗ̪" },
},
{
name = "Voiceless alveolar implosive",
symbols = { "ɗ̥", "ƭ", "tʼ↓" },
audio = "Voiceless-alveolar-implosive.ogg",
},
{
name = "Voiced alveolar implosive",
symbols = { "ɗ" },
audio = "Voiced alveolar implosive.ogg"
},
{
name = "Voiceless retroflex implosive",
symbols = { "ᶑ̊", "ᶑ̥", "𝼉", "ʈʼ↓" },
audio = "Voiceless-retroflex-implosive.ogg",
},
{
name = "Voiced retroflex implosive",
symbols = { "ᶑ" },
audio = "Voiced-retroflex-implosive.ogg",
},
{
name = "Voiceless palatal implosive",
symbols = { "ʄ̊", "ʄ̥", "ƈ", "cʼ↓" },
audio = "Voiceless palatal implosive.ogg",
},
{
name = "Voiced palatal implosive",
symbols = { "ʄ" },
audio = "Voiced palatal implosive.ogg"
},
{
name = "Voiced post-palatal or pre-velar implosive",
symbols = { "ʄ̠", "ʄ˗", "ɠ̟", "ɠ˖" },
audio = "Voiced post palatal and pre velar implosives.ogg",
article = "Voiced pre-velar implosive"
},
{
name = "Voiceless velar implosive",
symbols = { "ɠ̊", "ƙ", "kʼ↓" },
audio = "Voiceless-velar-implosive.ogg",
},
{
name = "Voiced velar implosive",
symbols = { "ɠ" },
audio = "Voiced velar implosive.ogg"
},
{
name = "Voiceless uvular implosive",
symbols = { "ʛ̥", "ʠ", "qʼ↓" },
audio = "Voiceless-uvular-implosive.ogg",
},
{
name = "Voiced uvular implosive",
symbols = { "ʛ" },
audio = "Voiced uvular implosive.ogg"
},
-- CO-ARTICULATED CONSONANTS
-- Co-articulated nasals
{
name = "Voiced labial–alveolar nasal",
symbols = { "nm" },
},
{
name = "Voiced labial–retroflex nasal",
symbols = { "ɳm" },
},
{
name = "Voiced labial–velar nasal",
symbols = { "ŋm" },
audio = "Labial-velar nasal stop.ogg"
},
-- Co-articulated plosives
{
name = "Voiceless labial–alveolar plosive",
symbols = { "tp" },
audio = "Voiceless labial-alveolar plosive.ogg"
},
{
name = "Voiced labial–alveolar plosive",
symbols = { "db" },
},
{
name = "Voiceless labial–retroflex plosive",
symbols = { "ʈp" },
},
{
name = "Voiced labial–retroflex plosive",
symbols = { "ɖb" },
},
{
name = "Voiceless labial–velar plosive",
symbols = { "kp" },
audio = "Voiceless labial-velar plosive.ogg"
},
{
name = "Voiced labial–velar plosive",
symbols = { "ɡb" },
audio = "Voiced labial-velar plosive.ogg"
},
{
name = "Voiceless labial–uvular plosive",
symbols = { "qp" },
audio = "Voiceless labial–uvular plosive.ogg"
},
{
name = "Voiceless uvular–epiglottal plosive",
symbols = { "qʡ" },
},
-- Co-articulated implosives
{
name = "Voiceless labial–velar implosive",
symbols = { "ɠ̊ɓ̥", "kɓ̥", "ƙƥ", "kpʼ↓", "kƥ" },
audio = "Voiceless-labial–velar-implosive.ogg",
},
{
name = "Voiced labial–velar implosive",
symbols = { "ɠɓ", "ɡɓ" },
audio = "Voiced-labial-velar-implosive.ogg"
},
-- Co-articulated ejectives
{
name = "Labial–alveolar ejective stop",
symbols = { "tpʼ" },
},
-- Co-articulated continuants
{
name = "Voiceless labial–palatal fricative",
symbols = { "ɥ̊˔", "ɥ̝̊", "çᶣ", "çᵝ", "çʷ" },
},
{
name = "Voiceless labial–palatal approximant",
symbols = { "ɥ̊", "ç̞ᶣ", "ç̞ᵝ", "ç̞ʷ" },
},
{
name = "Voiced labial–palatal approximant",
symbols = { "ɥ" },
audio = "LL-Q150 (fra)-WikiLucas00-IPA ɥ.wav"
},
{
name = "Voiceless labial–velar fricative",
symbols = { "ʍ", "xʷ" },
audio = "Voiceless labio-velar fricative.ogg"
},
{
name = "Voiceless labial–velar approximant",
symbols = { "w̥", "ẘ", "ʍ̞" },
},
{
name = "Voiced labial–velar approximant",
symbols = { "w", "ɰʷ", "ɣ̞ʷ", "ɣʷ"},
audio = "Voiced labio-velar approximant.ogg"
},
{
name = "Compressed voiced labial–velar approximant",
symbols = { "wᵝ", "ɰᵝ", "ɣ̞ᵝ", "ɣᵝ"},
article = "Voiced labial–velar approximant",
},
{
name = "Sj-sound",
symbols = { "ɧ" },
audio = "Voiceless dorso-palatal velar fricative.ogg"
},
-- Co-articulated lateral approximants
{
name = "Velarized dental lateral approximant",
symbols = { "ɫ̪", "l̪ˠ" },
},
{
name = "Velarized alveolar lateral approximant",
symbols = { "ɫ", "lˠ" },
audio = "Velarized alveolar lateral approximant.ogg"
},
{
name = "Pharyngealized dental lateral approximant",
symbols = { "l̪ˤ" },
},
{
name = "Pharyngealized alveolar lateral approximant",
symbols = { "lˤ" },
},
-- Nasalized approximants
{
name = "Nasalized voiced alveolar lateral approximant",
symbols = { "l̃" },
},
{
name = "Nasalized voiced palatal approximant",
symbols = { "j̃" },
audio = "Nasal palatal approximant.ogg"
},
{
name = "Nasalized voiced velar approximant",
symbols = { "ɰ̃", "ɣ̞̃", "ɣ̃˕" },
audio = "Nasal velar approximant.ogg"
},
{
name = "Nasalized voiced labial–velar approximant",
symbols = { "w̃" },
audio = "Voiced labialized velar nasal approximant.ogg"
},
{
name = "Nasalized voiceless glottal approximant",
symbols = { "h̃" },
audio = "IPA h̃.ogg"
},
{
name = "Nasalized voiced glottal approximant",
symbols = { "ɦ̃" },
},
-- VOWELS
-- Close vowels
{
name = "Close front unrounded vowel",
symbols = { "i" },
audio = "Close front unrounded vowel.ogg"
},
{
name = "Close front rounded vowel",
symbols = { "y" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front compressed vowel",
symbols = { "y͍", "iᵝ" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front protruded vowel",
symbols = { "y̫", "yʷ", "iʷ", "y᫇" },
audio = "Close front protruded vowel.ogg"
},
{
name = "Close central unrounded vowel",
symbols = { "ɨ", "ï", "ɯ̈" },
audio = "Close central unrounded vowel.ogg"
},
{
name = "Close central rounded vowel",
symbols = { "ʉ", "ü" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central protruded vowel",
symbols = { "ʉ̫", "ʉʷ", "ɨʷ" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central compressed vowel",
symbols = { "ÿ", "ɨᵝ" },
},
{
name = "Close back unrounded vowel",
symbols = { "ɯ" },
audio = "Close back unrounded vowel.ogg"
},
{
name = "Close back rounded vowel",
symbols = { "u" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back protruded vowel",
symbols = { "u̫", "uʷ", "ɯʷ" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back compressed vowel",
symbols = { "u͍", "ɯᵝ" },
audio = "Ja-U.oga"
},
-- Near-close vowels
{
name = "Near-close front unrounded vowel",
symbols = { "ɪ̟", "i̞", "e̝" },
},
{
name = "Near-close front rounded vowel",
symbols = { "ʏ̟", "y̞", "y˕", "ø̝" },
},
{
name = "Near-close near-front unrounded vowel",
symbols = { "ɪ", "i̽", "ï̞", "ë̝" },
audio = "Near-close near-front unrounded vowel.ogg"
},
{
name = "Near-close near-front rounded vowel",
symbols = { "ʏ", "y̽", "ÿ̞", "ÿ˕", "ø̝̈" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front compressed vowel",
symbols = { "ʏ͍", "ɪᵝ" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front protruded vowel",
symbols = { "ʏ̫", "ʏʷ", "ɪʷ" },
},
{
name = "Near-close central unrounded vowel",
symbols = { "ɪ̈", "ɪ̠", "ɨ̞", "ɘ̝" },
audio = "Near-close central unrounded vowel.ogg"
},
{
name = "Near-close central rounded vowel",
symbols = { "ʊ̈", "ʊ̟", "ʉ̞", "ɵ̝" },
audio = "Near-close central rounded vowel2.ogg"
},
{
name = "Near-close central protruded vowel",
symbols = { "ʊ̫̈", "ʉ̫˕", "ʊ̈ʷ", "ʉ̞ʷ", "ɪ̈ʷ", "ɨ̞ʷ" },
},
{
name = "Near-close central compressed vowel",
symbols = { "ʏ̈", "ɨ̞ᵝ" },
},
{
name = "Near-close near-back unrounded vowel",
symbols = { "ɯ̽", "ɯ̞̈", "ɤ̝̈" },
audio = "Near-close near-back unrounded vowel.ogg"
},
{
name = "Near-close near-back rounded vowel",
symbols = { "ʊ", "u̽", "ü̞", "ö̝" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back protruded vowel",
symbols = { "ʊ̫", "ʊʷ", "ɯ̽ʷ", "ɤ̝̈ʷ", "u̫˕", "u̞ʷ", "ɯ̞ʷ", "ɤ̝ʷ" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back compressed vowel",
symbols = { "ʊ͍", "ɯ̽ᵝ", "ɯ̞̈ᵝ", "ɯ̞ᵝ" },
},
{
name = "Near-close back unrounded vowel",
symbols = { "ɯ̞", "ɤ̝" },
},
{
name = "Near-close back rounded vowel",
symbols = { "ʊ̠", "u̞", "o̝" },
},
-- Close-mid vowels
{
name = "Close-mid front unrounded vowel",
symbols = { "e" },
audio = "Close-mid front unrounded vowel.ogg"
},
{
name = "Close-mid front rounded vowel",
symbols = { "ø" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front compressed vowel",
symbols = { "ø͍", "eᵝ" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front protruded vowel",
symbols = { "ø̫", "øʷ", "eʷ" },
},
{
name = "Close-mid near-front unrounded vowel",
symbols = { "ɪ̞", "e̠", "ɘ̟" },
},
{
name = "Close-mid near-front rounded vowel",
symbols = { "ʏ̞", "ø̠", "ɵ̟" },
},
{
name = "Close-mid central unrounded vowel",
symbols = { "ɘ", "ë", "ɤ̈" },
audio = "Close-mid central unrounded vowel.ogg"
},
{
name = "Close-mid central rounded vowel",
symbols = { "ɵ", "ɵ̫", "ɵʷ", "ö", "ɘʷ" },
audio = "Close-mid central rounded vowel.ogg"
},
{
name = "Close-mid central compressed vowel",
symbols = { "ø̈", "ɘᵝ" },
},
{
name = "Close-mid near-back unrounded vowel",
symbols = { "ɘ̠", "ɤ̟", "ɯ̞̽" },
},
{
name = "Close-mid near-back rounded vowel",
symbols = { "ʊ̞", "ɵ̠", "o̟" },
},
{
name = "Close-mid back unrounded vowel",
symbols = { "ɤ" },
audio = "Close-mid back unrounded vowel.ogg"
},
{
name = "Close-mid back rounded vowel",
symbols = { "o", "o̫", "oʷ", "ɤʷ" },
audio = "Close-mid back rounded vowel.ogg"
},
{
name = "Close-mid back compressed vowel",
symbols = { "o͍", "ɤᵝ" },
},
-- Mid vowels
{
name = "Mid front unrounded vowel",
symbols = { "e̞", "ɛ̝" },
audio = "Mid front unrounded vowel.ogg"
},
{
name = "Mid front rounded vowel",
symbols = { "ø̞", "œ̝" },
audio = "Mid front rounded vowel (trimmed).ogg"
},
{
name = "Mid front compressed vowel",
symbols = { "ø͍˕", "œ͍˔", "e̞ᵝ", "ɛ̝ᵝ" },
},
{
name = "Mid front protruded vowel",
symbols = { "ø̫˕", "œ̫˔", "ø̞ʷ", "œ̝ʷ", "e̞ʷ", "ɛ̝ʷ" },
},
{
name = "Mid near-front unrounded vowel",
symbols = { "e̽", "ɛ̽", "ë̞", "ɛ̝̈" },
},
{
name = "Mid near-front rounded vowel",
symbols = { "ø̽", "œ̽", "ø̞̈", "œ̝̈" },
},
{
name = "Mid central vowel",
symbols = { "ə" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central unrounded vowel",
symbols = { "ə̜", "ɘ̞", "ɜ̝" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central rounded vowel",
symbols = { "ə̹", "ɵ̞", "ɞ̝" },
audio = "Mid central rounded vowel.ogg"
},
{
name = "Mid near-back unrounded vowel",
symbols = { "ɤ̽", "ʌ̽", "ɤ̞̈", "ʌ̝̈" },
},
{
name = "Mid near-back rounded vowel",
symbols = { "o̽", "ɔ̽", "ö̞", "ɔ̝̈" },
},
{
name = "Mid back unrounded vowel",
symbols = { "ɤ̞", "ʌ̝" },
audio = "ɤ̞ IPA sound.opus"
},
{
name = "Mid back rounded vowel",
symbols = { "o̞", "ɔ̝" },
audio = "Mid back rounded vowel.ogg"
},
-- Open-mid vowels
{
name = "Open-mid front unrounded vowel",
symbols = { "ɛ" , "æ̝"},
audio = "Open-mid front unrounded vowel.ogg"
},
{
name = "Open-mid front rounded vowel",
symbols = { "œ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front compressed vowel",
symbols = { "œ͍", "ɛᵝ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front protruded vowel",
symbols = { "œ̫", "œʷ", "ɛʷ" },
},
{
name = "Open-mid central unrounded vowel",
symbols = { "ɜ", "ɛ̈", "ʌ̈" },
audio = "Open-mid central unrounded vowel.ogg"
},
{
name = "Open-mid central rounded vowel",
symbols = { "ɞ", "œ̈", "ɔ̈" },
audio = "Open-mid central rounded vowel.ogg"
},
{
name = "Open-mid back unrounded vowel",
symbols = { "ʌ" },
audio = "PR-open-mid back unrounded vowel2.ogg"
},
{
name = "Open-mid back rounded vowel",
symbols = { "ɔ" },
audio = "PR-open-mid back rounded vowel.ogg"
},
-- Near-open vowels
{
name = "Near-open front unrounded vowel",
symbols = { "æ", "ɛ̞", "a̝" },
audio = "Near-open front unrounded vowel.ogg"
},
{
name = "Near-open front rounded vowel",
symbols = { "œ̞", "ɶ̝" },
},
{
name = "Near-open near-front unrounded vowel",
symbols = { "æ̈", "æ̠", "ä̝", "a̽", "ɛ̞̈" },
},
{
name = "Near-open near-front rounded vowel",
symbols = { "ɶ̝̈", "ɶ̽", "œ̞̈" },
},
{
name = "Near-open central vowel",
symbols = { "ɐ" },
audio = "Near-open central unrounded vowel.ogg"
},
{
name = "Near-open central unrounded vowel",
symbols = { "ɐ̜", "ɜ̞" },
audio = "PR-near-open central unrounded vowel.ogg"
},
{
name = "Near-open central rounded vowel",
symbols = { "ɐ̹", "ɞ̞" },
audio = "Near-open central rounded vowel.ogg"
},
{
name = "Near-open near-back unrounded vowel",
symbols = { "ɑ̽", "ɑ̝̈", "ʌ̞̈" },
},
{
name = "Near-open near-back rounded vowel",
symbols = { "ɒ̽", "ɒ̝̈", "ɔ̞̈" },
},
{
name = "Near-open back unrounded vowel",
symbols = { "ʌ̞", "ɑ̝" },
},
{
name = "Near-open back rounded vowel",
symbols = { "ɔ̞", "ɒ̝" },
},
-- Open vowels
{
name = "Open front unrounded vowel",
symbols = { "a", "æ̞" },
audio = "PR-open front unrounded vowel.ogg"
},
{
name = "Open front rounded vowel",
symbols = { "ɶ" },
audio = "Open front rounded vowel.ogg"
},
{
name = "Open central unrounded vowel",
symbols = { "ä", "a̠", "ɑ̈", "ɑ̟" },
audio = "Open central unrounded vowel.ogg"
},
{
name = "Open central rounded vowel",
symbols = { "ɒ̈", "ɒ̟", "ɶ̈", "ɶ̠" },
audio = "Open central rounded vowel.ogg"
},
{
name = "Open back unrounded vowel",
symbols = { "ɑ" },
audio = "Open back unrounded vowel.ogg"
},
{
name = "Open back rounded vowel",
symbols = { "ɒ" },
audio = "PR-open back rounded vowel.ogg"
},
{
name = "R-colored vowel",
symbols = { "ɚ", "ɝ", "ɹ̩", "ɻ̍" },
audio = "En-us-er.ogg"
},
-- SUPRASEGMENTALS
{
name = "Primary stress",
symbols = { "ˈ" },
article = "Stress (linguistics)",
},
{
name = "Secondary stress",
symbols = { "ˌ" },
},
{
name = "Minor (foot) group",
symbols = { "|" },
article = "Prosodic unit",
},
{
name = "Major (intonation) group",
symbols = { "‖" },
article = "Prosodic unit",
},
{
name = "Syllable break",
symbols = { "." },
article = "Syllable",
},
{
name = "Linking (absence of a break)",
symbols = { "‿" },
article = "Connected speech",
},
-- TONES AND WORD ACCENTS
{
name = "Downstep",
symbols = { "ꜜ" },
},
{
name = "Upstep",
symbols = { "ꜛ" },
},
{
name = "Global rise",
symbols = { "↗" },
article = "Intonation (linguistics)",
},
{
name = "Global fall",
symbols = { "↘" },
article = "Intonation (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Bilabial percussive",
symbols = { "ʬ" },
audio = "Voiceless bilabial percussive.wav"
},
{
name = "Bidental percussive",
symbols = { "ʭ" },
audio = "Voiceless bidental percussive.wav"
},
{
name = "Velopharyngeal fricative",
symbols = { "ʩ" },
},
{
name = "Voiceless velopharyngeal trill",
symbols = { "𝼀", "ʩ𐞪" },
article = "Velopharyngeal consonant"
},
{
name = "Voiced velopharyngeal trill",
symbols = { "𝼀̬" },
article = "Velopharyngeal consonant"
},
{
name = "Voiceless dental lateral–median fricative",
symbols = { "ʪ̪" },
},
{
name = "Voiced dental lateral–median fricative",
symbols = { "ʫ̪" },
},
{
name = "Voiceless alveolar lateral–median fricative",
symbols = { "ʪ" },
audio = "Voiceless alveolar lateral lisp fricative.ogg"
},
{
name = "Voiced alveolar lateral–median fricative",
symbols = { "ʫ" },
audio = "Voiced alveolar lateral lisp fricative.ogg"
},
{
name = "Ingressive airflow",
symbols = { "↓" },
article = "Ingressive sound",
},
{
name = "Egressive airflow",
symbols = { "↑" },
article = "Egressive sound",
},
{
name = "Apical r",
symbols = { "ɹ̺" },
article = "Voiced alveolar approximant",
},
{
name = "Bunched r",
symbols = { "ɹ̈" },
article = "Voiced velar bunched approximant",
},
{
name = "Sublaminal lower alveolar percussive",
symbols = { "¡" },
article = "Sublingual percussive",
},
{
name = "Percussive alveolar click",
symbols = { "ǃ¡" },
audio = "Percussive alveolar click.ogg"
},
{
name = "Buccal interdental trill",
symbols = { "ↀr̪͆" },
article = "Blowing a raspberry",
},
-- NON-IPA
{
name = "Morphological boundary",
symbols = { "#" },
article = "Word stem",
},
{
name = "Zero",
symbols = { "∅" },
article = "Zero (linguistics)",
},
},
diacritics = {
-- DIACRITICS
{
name = "Voiceless",
symbols = { "̥", "̊", "ḁ", "å", "ů", "ẙ" },
},
{
name = "Voiced",
symbols = { "̬" },
article = "Voice (phonetics)",
},
{
name = "Aspirated",
symbols = { "ʰ" },
article = "Aspirated consonant",
},
{
name = "More rounded",
symbols = { "̹", "͗", "˒" },
article = "Relative articulation#More rounded",
},
{
name = "Less rounded",
symbols = { "̜", "͑", "˓", "͍" },
article = "Relative articulation#Less rounded",
},
{
name = "Advanced",
symbols = { "̟", "᫈", "˖" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Retracted",
symbols = { "̠", "", "˗" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Centralized",
symbols = { "̈" },
article = "Relative articulation#Centralized vowels",
},
{
name = "Mid-centralized",
symbols = { "̽", "͓" },
article = "Relative articulation#Mid-centralized vowel",
},
{
name = "Syllabic",
symbols = { "̩", "̍" },
article = "Syllabic consonant",
},
{
name = "Non-syllabic",
symbols = { "̯", "̑" },
article = "Semivowel",
},
{
name = "Rhoticity",
symbols = { "˞" },
article = "R-colored vowel",
audio = "En-us-er.ogg"
},
{
name = "Breathy voiced",
symbols = { "̤", "ṳ", "ʱ" },
article = "Breathy voice",
},
{
name = "Creaky voiced",
symbols = { "̰", "ḛ", "ḭ", "ṵ" },
article = "Creaky voice",
},
{
name = "Nasalized and glottalized",
symbols = { "̰̃", "ã̰", "ḛ̃", "ḭ̃", "õ̰", "ṵ̃" },
article = "Rhinoglottophilia",
},
{
name = "Linguolabial",
symbols = { "̼", "" },
article = "Linguolabial consonant",
},
{
name = "Labialized",
symbols = { "ʷ", "ᵝ", "̫", "᫇", "", "" },
article = "Labialization",
},
{
name = "Open-labialized",
symbols = { "ꟹ" },
article = "Labialization",
},
{
name = "Labiodentalized",
symbols = { "ᶹ" },
article = "Labialization",
},
{
name = "Labio-palatalized",
symbols = { "ᶣ" },
article = "Labio-palatalization",
},
{
name = "Palatalized",
symbols = { "ʲ" },
article = "Palatalization (phonetics)",
},
{
name = "Velarized",
symbols = { "ˠ" },
article = "Velarization",
},
{
name = "Uvularized",
symbols = { "ʶ", "ᵡ" },
article = "Uvularization",
},
{
name = "Pharyngealized",
symbols = { "ˤ", "𐞕" },
article = "Pharyngealization",
},
{
name = "Velarized or pharyngealized",
symbols = { "̴", "ᵯ", "ᵰ", "ᵱ", "ᵬ", "ᵮ", "ᵵ", "ᵭ", "ᵴ", "ᵶ", "ᵳ", "ᵲ", "ꭨ" },
article = "Pharyngealization",
},
{
name = "Epiglottalized",
symbols = { "𐞴", "ᵸ" },
article = "Pharyngealization",
},
{
name = "Raised",
symbols = { "̝", "᷵", "˔" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Lowered",
symbols = { "̞", "", "˕" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Advanced tongue root",
symbols = { "̘", "", "꭪" },
},
{
name = "Retracted tongue root",
symbols = { "̙", "", "꭫" },
},
{
name = "Dental",
symbols = { "̪", "͆" },
article = "Dental consonant",
},
{
name = "Interdental",
symbols = { "̪͆" },
article = "Interdental consonant",
},
{
name = "Apical",
symbols = { "̺" },
article = "Apical consonant",
},
{
name = "Laminal",
symbols = { "̻" },
article = "Laminal consonant",
},
{
name = "Nasalized",
symbols = { "̃", "ṽ" },
article = "Nasalization",
},
{
name = "Nasal vowel",
symbols = { "ĩ", "ỹ", "ɨ̃", "ʉ̃", "ɯ̃", "ũ", "ɪ̃", "ʏ̃", "ʊ̃", "ẽ", "ø̃", "ɘ̃", "ɵ̃", "ɤ̃", "õ", "ə̃", "ɛ̃", "œ̃", "ɜ̃", "ɞ̃", "ʌ̃", "ɔ̃", "æ̃", "ɐ̃", "ã", "ɶ̃", "ä̃", "ɑ̃", "ɒ̃" },
},
{
name = "Nasal release",
symbols = { "ⁿ" },
},
{
name = "Lateral release",
symbols = { "ˡ" },
article = "Lateral release (phonetics)",
},
{
name = "No audible release",
symbols = { "̚" },
},
{
name = "Ejective",
symbols = { "ʼ" },
article = "Ejective consonant",
},
{
name = "Glottalized",
symbols = { "ˀ" },
article = "Glottalization",
},
{
name = "Buccal speech",
symbols = { "ↀ" },
},
{
name = "Esophageal speech",
symbols = { "Œ" },
},
{
name = "Electrolaryngeal speech",
symbols = { "И" },
},
{
name = "Tracheo-esophageal speech",
symbols = { "Ю" },
},
-- SUPRASEGMENTALS
{
name = "Long",
symbols = { "ː" },
article = "Length (phonetics)",
},
{
name = "Half-long",
symbols = { "ˑ" },
article = "Length (phonetics)",
},
{
name = "Extra-short",
symbols = { "̆", "ŏ", "ӗ", "ă", "ĭ", "ŭ" },
article = "Extra-shortness",
},
-- TONES AND WORD ACCENTS
{
name = "Accent",
symbols = { "̋", "ű", "ӳ", "ő", "́", "í", "ý", "ú", "é", "ǿ", "ó", "ǽ", "á", "̄", "ī", "ȳ", "ū", "ē", "ō", "ǣ", "ā", "̀", "ì", "ỳ", "ù", "è", "ò", "à", "̏", "ȉ", "ȕ", "ȅ", "ȍ", "ȁ" },
article = "Pitch-accent language",
},
{
name = "Tone",
symbols = { "̌", "̂", "᷄", "᷅", "᷇", "᷆", "᷈", "᷉", "˥", "˦", "˧", "˨", "˩" },
article = "Tone (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Alveolar",
symbols = { "͇" },
article = "Alveolar consonant",
},
{
name = "Strong articulation",
symbols = { "͈", "̎" },
article = "Fortis and lenis",
},
{
name = "Weak articulation",
symbols = { "͉", "᷂" },
article = "Fortis and lenis",
},
{
name = "Denasalized",
symbols = { "͊" },
article = "Denasalization",
},
{
name = "Velopharyngeal friction",
symbols = { "͌", "𐞐" },
article = "Velopharyngeal consonant",
},
{
name = "Whistled articulation",
symbols = { "͎" },
article = "Whistled sibilant",
},
{
name = "Unaspirated",
symbols = { "˭" },
article = "Tenuis consonant",
},
{
name = "Pre-aspiration",
symbols = { "ʰp", "ʰt", "ʰʈ", "ʰc", "ʰk", "ʰq", "ʰn" },
article = "Preaspiration",
},
-- NON-IPA
{
name = "Retroflex",
symbols = { "̣", "̢" },
article = "Retroflex consonant",
},
{
name = "Prenasalized consonant",
symbols = { "ᵐ", "ᶬ", "ⁿ̼d̼", "ᵐ̺b̺", "ⁿt", "ⁿd", "ⁿθ", "ⁿð", "ⁿs", "ⁿz", "ⁿʃ", "ⁿʒ", "ⁿɕ", "ⁿʑ", "ⁿr", "ⁿɬ", "ⁿɮ", "ⁿl", "ᶯ", "ᶮ", "ᵑ", "ᶰ" },
},
{
name = "Pre-stopped consonant",
symbols = { "ᵖ", "ᵇ", "ᵗ", "ᵈ", "𐞯", "𐞋", "ᶜ", "ᶡ", "ᵏ", "ᶢ", "𐞥", "𐞒", "𐞳" },
},
{
name = "Post-stopped nasal",
symbols = { "mᵇ", "nᵈ", "ɳ𐞋", "ɲᶡ", "ŋᶢ", "ɴ𐞒" },
},
{
name = "Trilled affricate",
symbols = { "ʳ", "𐞄", "𐞪", "tr̥", "dr" },
},
}
}
for k, group in pairs(rawData) do
for _, v in ipairs(group) do
local t = {
name = v.name,
symbol = v.symbols[1],
article = v.article or v.name,
audio = v.audio or "",
image = v.image or ""
}
for _, s in ipairs(v.symbols) do
data[k][s] = t
end
end
end
return { data = data, rawData = rawData }
hpporybcceght36o5cql3a62kr9ug02
Tempilet:Infobox language
10
2336
32919
32805
2026-11-11T20:56:54Z
RAPTOR7762
18
/* */
32919
wikitext
text/x-wiki
{{Infobox
| above = <includeonly>{{{name|{{#if:{{#invoke:Wikidata|ViewSomething|labels|en|value}}|{{#invoke:Wikidata|ViewSomething|labels|en|value}}|{{PAGENAMEBASE}}}}}}}</includeonly>
| subheader1 = {{{altname|}}}
| subheader2 = {{{nativename|}}}
| subheader3 = {{#if:{{{acceptance|}}}|({{{acceptance|}}})}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|upright={{if empty|{{{imagescale|}}}|0.9}}|alt={{{imagealt|}}}|class={{{image_class|}}}}}
| captionstyle = padding:0.35em 0.35em 0.25em;line-height:1.25em;
| caption = {{{imagecaption|}}}
| headerstyle = color: {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}|white|{{if empty|{{{fontcolor|}}}|black}}}}; background-color: {{#if:{{{signers|}}}|silver|{{#if:{{{creator|}}}{{{setting|}}}|#114057|{{Infobox language/family-color|{{if empty|{{{familycolor|}}}|Default}}}}}}}};
<!--------------------------------------------------------->
| labelstyle = white-space:nowrap;padding-right:0.65em<!--(to ensure gap between any long/nonwrapped label and subsequent data on same line-->;
| datastyle = line-height:1.3em;
| label1 = Pronunciation
| data1 = {{#if:{{{pronunciation|}}}| {{if empty|{{{pronunciation|}}}|''to be added''}}}}
| label2 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
| Created by
| Native to
}}
| data2 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|{{if empty|{{{creator|}}}|–}}
|{{if empty|{{{states|}}}|{{{state|}}}|{{{native_to|}}}}}
}}
| label3 = Date
| data3 = {{{created|}}}
| label4 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|Setting and usage
|{{#if:{{{region|}}}|Region}}
}}
| data4 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|{{{setting|}}}
|{{{region|}}}
}}
| label6 = Ethnicity
| data6 = {{{ethnicity|}}}
| label7 = {{#if:{{{extinct|}}} |[[Extinct language|Extinct]] |{{#if:{{{era|}}} |Era |{{#if:{{{creator|}}}{{{speakers_label|}}} |{{if empty|{{{speakers_label|}}}|Users}} |{{longitem|Native speakers}} }} }} }}
| data7 =<!--
-->{{#if:{{{extinct|}}}|{{#ifeq:{{{extinct}}}|?|(date missing)[[Category:Language articles with unknown extinction date]]|{{{extinct|}}}}}<!-- extinct input used
-->|{{#if:{{{era|}}}|{{{era}}}<!-- era input used
-->|<!-- no era, check for sign/spoken -->{{#if:{{{signers|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}} }}|silver|1}}<!-- check for signers/silver
-->|<!-- SIGN language (silver) -->{{#if:{{{signers|}}}{{{speakers|}}}|{{#ifeq: {{lc:{{{date}}}}}|na|{{if empty|{{{signers|}}}|{{{speakers|}}}|–}}
|{{#ifeq:{{if empty|{{{signers|}}}|{{{speakers}}}}}|?|<!--
-->|{{#ifeq:{{if empty|{{{signers|}}}|{{{speakers}}}}}|none|''None''
|{{#if:{{{date|}}}|{{if empty|{{{signers|}}}|{{{speakers|}}}|–}} ({{{dateprefix|}}}{{{date}}})
|{{if empty|{{{signers|}}}|{{{speakers|}}}|–}}{{main other|[[Category:Language articles with speaker number undated]]}}}} }} }} }} }}<!--(end if:date, ifeq:date=na, if:signers. end of SIGN)
-->|<!-- SPOKEN language (not silver) -->{{#if:{{{speakers|}}}|{{#ifeq: {{lc:{{{date}}}}}|na|{{if empty|{{{speakers|}}}|–}}
|{{#ifeq: {{{date}}}|no date|(undated figure of {{{speakers|}}})|<!--
The following changes the display depending on the age of the data. Limit set to 25 years, as a population can double in that time.
-->{{#if:{{{date|}}}|{{#iferror:{{#expr: {{padleft:|4|{{{date}}}|}} }}||{{#ifexpr:(({{CURRENTYEAR}} - {{padleft:|4|{{{date}}}|}}) < 25)<!--
-->|<!-- regular-->{{if empty|{{{speakers|}}}|–}} ({{{dateprefix|}}}{{{date}}})<!--
-->|<!-- old (25+) -->({{{speakers}}} cited {{{dateprefix|}}}{{{date}}}){{main other|{{#ifeq:{{{ref}}}|e19|[[Category:Language articles with old Ethnologue 19 speaker data]]|{{#ifeq:{{{ref}}}|e18|[[Category:Language articles with old Ethnologue 18 speaker data]]|[[Category:Language articles with old speaker data]]}}}}}}}}}}<!--(end ifexpr:25+, iferror:)
-->|{{#ifeq:{{{speakers}}}|?|<!--
-->|{{#ifeq:{{{speakers}}}|none|''None''
|<!-- no date input -->{{if empty|{{{speakers|}}}|–}}{{main other|[[Category:Language articles with speaker number undated]]}}}} }} }}<!--(end if:date, before the 25+ expr check)
-->}}<!--(end ifeq:date=no date)
-->}}<!--(end ifeq:date=na)
-->|<!--(no speakers number to be shown)-->}}}}<!--(end if:speakers (in 2nd param of silver-check), if:silver. end of SPOKEN)
-->}} }}<!--(end if:era, if:extinct. No open #if:s left)
If there is a ref, and there is any input for this row (data7), then we add the reference:
-->{{#if:{{{ref|}}}|{{#if:{{{extinct|}}}{{{era|}}}{{{signers|}}}{{{speakers|}}}{{{date|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|silver|sign_language}}|{{Infobox language/ref|{{{ref}}}|iso3={{{iso3|}}}|refname={{{refname|}}}|name={{if empty|{{{name|}}}|{{PAGENAME}}}}|lc1={{{lc1|}}}|ld1={{Delink|{{{ld1}}}}}|lc2={{{lc2|}}}|ld2={{Delink|{{{ld2}}}}}|lc3={{{lc3|}}}|ld3={{Delink|{{{ld3}}}}}|lc4={{{lc4|}}}|ld4={{Delink|{{{ld4}}}}}|lc5={{{lc5|}}}|ld5={{Delink|{{{ld5}}}}}|lc6={{{lc6|}}}|ld6={{Delink|{{{ld6}}}}}|lc7={{{lc7|}}}|ld7={{Delink|{{{ld7}}}}}}}}}}}<!--
Add speakers2 after the ref:
-->{{#if:{{{speakers2|}}}|<br />{{{speakers2|}}} }}
| label8 = {{#if:{{{revived|}}} |[[Language revitalization|Revival]]{{#if:{{{revived-category|}}}{{{revived-cat|}}}|{{#ifeq:{{if empty|{{{revived-category|}}}|{{{revived-cat}}}}}|nocat|<!--suppress-->|[[Category:{{if empty|{{{revived-category|}}}|{{{revived-cat}}}}}]]|[[Category:Language revival]]}} }} }}
| data8 = {{{revived|}}}
| label9 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|Purpose
|{{longitem|{{Wrap|[[Language family]]}}}}
}}
| data9 = {{#ifeq: {{lc:{{{family}}}}}|na||<div style="text-align:left;">{{{family|{{{fam1|{{#if:{{{signers|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|silver|1}}
|''Unknown''{{main other|[[Category:Languages without classification]]}}
|{{#if:{{{creator|}}}{{{setting|}}}
|[[Constructed language]]
|{{Infobox language/genetic|{{if empty|{{{familycolor|}}}|Default}}}}
}}
}}}}}
<ul style="line-height:100%; margin-left:1.35em;padding-left:0"><li>
{{#ifeq:{{{familycolor|}}}|unclassified||{{#ifeq:{{{familycolor|}}}|Unclassified||{{#ifeq:{{{familycolor|}}}|isolate||{{#ifeq:{{{familycolor|}}}|Isolate||{{#if:{{{fam2|}}}
| {{{fam2}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam3|}}}
| {{{fam3}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam4|}}}
| {{{fam4}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam5|}}}
| {{{fam5}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam6|}}}
| {{{fam6}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam7|}}}
| {{{fam7}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam8|}}}
| {{{fam8}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam9|}}}
| {{{fam9}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam10|}}}
| {{{fam10}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam11|}}}
| {{{fam11}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam12|}}}
| {{{fam12}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam13|}}}
| {{{fam13}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam14|}}}
| {{{fam14}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam15|}}}
| {{{fam15}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>'''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''</li></ul>
| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}
}}}}}}}}</li></ul>}}}</div>}}
| label10 = {{longitem|{{#if:{{{ancestor2|}}}|Early forms|Early form}}}}
| data10 = {{#if:{{{protoname|}}}{{{ancestor|}}}|<div style="text-align:left;">{{if empty|{{{protoname|}}}|{{{ancestor|}}}}}
{{#if:{{{ancestor2|}}}|<ul style="line-height:100%; margin-left:1.35em; padding-left:0"><li>{{{ancestor2}}}
{{#if:{{{ancestor3|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor3}}}
{{#if:{{{ancestor4|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor4}}}
{{#if:{{{ancestor5|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor5}}}
{{#if:{{{ancestor6|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor6}}}
{{#if:{{{ancestor7|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor7}}}
{{#if:{{{ancestor8|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor8}}}
{{#if:{{{ancestor9|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor9}}}
{{#if:{{{ancestor10|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor10}}}
{{#if:{{{ancestor11|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor11}}}
{{#if:{{{ancestor12|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor12}}}
{{#if:{{{ancestor13|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor13}}}
{{#if:{{{ancestor14|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor14}}}
{{#if:{{{ancestor15|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor15}}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</div>}}
| label11 = {{longitem|Standard forms}}
| data11 = {{#if:{{{standards|}}}|{{{standards}}}
|{{#if:{{{stand1|}}}|{{plainlist|
*{{{stand1|}}}{{#if:{{{stand2|}}}|
*{{{stand2|}}}|}}{{#if:{{{stand3|}}}|
*{{{stand3|}}}|}}{{#if:{{{stand4|}}}|
*{{{stand4|}}}|}}{{#if:{{{stand5|}}}|
*{{{stand5|}}}|}}{{#if:{{{stand6|}}}|
*{{{stand6|}}}}}}}}}}}
| label12 = {{if empty|{{{dialect_label|}}}|Dialects}}
| data12 = {{#if:{{{dialects|}}}|{{{dialects}}}
|{{#if:{{{dia1|}}}|
{{#if:{{{dia1|}}}|*{{{dia1}}}}}
{{#if:{{{dia2|}}}|*{{{dia2}}}}}
{{#if:{{{dia3|}}}|*{{{dia3}}}}}
{{#if:{{{dia4|}}}|*{{{dia4}}}}}
{{#if:{{{dia5|}}}|*{{{dia5}}}}}
{{#if:{{{dia6|}}}|*{{{dia6}}}}}
{{#if:{{{dia7|}}}|*{{{dia7}}}}}
{{#if:{{{dia8|}}}|*{{{dia8}}}}}
{{#if:{{{dia9|}}}|*{{{dia9}}}}}
{{#if:{{{dia10|}}}|*{{{dia10}}}}}
{{#if:{{{dia11|}}}|*{{{dia11}}}}}
{{#if:{{{dia12|}}}|*{{{dia12}}}}}
{{#if:{{{dia13|}}}|*{{{dia13}}}}}
{{#if:{{{dia14|}}}|*{{{dia14}}}}}
{{#if:{{{dia15|}}}|*{{{dia15}}}}}
{{#if:{{{dia16|}}}|*{{{dia16}}}}}
{{#if:{{{dia17|}}}|*{{{dia17}}}}}
{{#if:{{{dia18|}}}|*{{{dia18}}}}}
{{#if:{{{dia19|}}}|*{{{dia19}}}}}
{{#if:{{{dia20|}}}|*{{{dia20}}}}}
{{#if:{{{dia21|}}}|*{{{dia21}}}}}
{{#if:{{{dia22|}}}|*{{{dia22}}}}}
{{#if:{{{dia23|}}}|*{{{dia23}}}}}
{{#if:{{{dia24|}}}|*{{{dia24}}}}}
{{#if:{{{dia25|}}}|*{{{dia25}}}}}
{{#if:{{{dia26|}}}|*{{{dia26}}}}}
{{#if:{{{dia27|}}}|*{{{dia27}}}}}
{{#if:{{{dia28|}}}|*{{{dia28}}}}}
{{#if:{{{dia29|}}}|*{{{dia29}}}}}
{{#if:{{{dia30|}}}|*{{{dia30}}}}}
{{#if:{{{dia31|}}}|*{{{dia31}}}}}
{{#if:{{{dia32|}}}|*{{{dia32}}}}}
{{#if:{{{dia33|}}}|*{{{dia33}}}}}
{{#if:{{{dia34|}}}|*{{{dia34}}}}}
{{#if:{{{dia35|}}}|*{{{dia35}}}}}
{{#if:{{{dia36|}}}|*{{{dia36}}}}}
{{#if:{{{dia37|}}}|*{{{dia37}}}}}
{{#if:{{{dia38|}}}|*{{{dia38}}}}}
{{#if:{{{dia39|}}}|*{{{dia39}}}}}
{{#if:{{{dia40|}}}|*{{{dia40}}}}}
}}}}
| rowclass12 = {{#if:{{{dialects|}}}||{{#if:{{{dia1|}}}|{{if empty|{{{listclass|}}}|{{{liststyle|}}}|plainlist}}}}}}
| label13 = {{longitem|{{Wrap|[[Writing system]]}}}}
| data13 = {{#switch: {{lc:{{{script|}}}}}
| latin
| [[latin]]
| latin alphabet
| [[latin alphabet]]
| [[latin alphabet|latin]] = [[Latin script|Latin]]
| #default = {{{script|}}}
}}
| label14 = {{longitem|{{Wrap|[[Manually coded language|Signed forms]]}}}}
| data14 = {{#if:{{{sign|}}}|{{{sign}}}}}
| label15 = Sources
| data15 = {{{posteriori|}}}
<!--------------------------------------------------------->
| header16 = {{#if:{{{nation|}}}{{{official|}}}{{{minority|}}}{{{agency|}}}{{{development_body|}}}|Official status}}
| label17 = {{longitem|Official language in}}
| data17 = {{if empty|{{{nation|}}}|{{{official|}}}}}
| label18 = {{longitem|class=nowrap|Recognised minority<br />language in}}
| data18 = {{#if:{{{minority|}}} |<div style="<!--label17 above almost always linewraps, so:-->vertical-align:middle;">{{{minority}}}</div>}}
| label19 = [[List of language regulators|Regulated by]]
| data19 = {{{agency|{{#ifexpr:{{#if:{{{agency|}}}|1|0}} and {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{if empty|{{{familycolor|}}}|Default}}}}|#114057|1}}|1|0}}
| ''None''
<!-- | {{#if:{{{nation|}}}|''No official regulation''}} [this ends up claiming that languages have no regulation just because no-one bothered to add the regulator -->
}}}}}
| label20 = Development body
| data20 = {{{development_body|}}}
<!--------------------------------------------------------->
| header21 = Language codes
| label22 = {{nowrap|[[ISO 639-1]]}}
| data22 = {{#if:{{{iso1|}}}|<code>{{#ifeq:{{str len|{{{iso1|}}}}}| 2 | {{ISO 639-1|{{{iso1}}}}} | {{{iso1}}} }}</code> {{{iso1comment|}}}}}
| label23 = {{nowrap|[[ISO 639-2]]}}
| data23 = {{#if:{{{iso2|}}}{{{iso2b|}}}{{{iso2t|}}}
|<code>{{#if:{{{iso2b|}}}{{{iso2t|}}}
|{{#ifeq:{{str len|{{{iso2b|}}}}}| 3 | {{ISO 639-2|{{{iso2b}}}}} | {{{iso2b}}} }} ([[ISO 639-2/B|B]])
|{{#if:{{{signers|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|silver|1}}
|{{if empty|{{{iso2|}}}|sgn}}
|{{
#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|{{if empty|{{{iso2|}}}|art}}
|{{#ifeq:{{str len|{{{iso2|}}}}}| 3 | {{ISO 639-2|{{{iso2}}}}} | {{{iso2}}} }}}}}}}}</code> {{{iso2comment|}}}{{
#if:{{{iso2b|}}}{{{iso2t|}}}
|<br /><code>{{#ifeq:{{str len|{{{iso2t|}}}}}| 3 | {{ISO 639-2|{{{iso2t}}}}} | {{{iso2t}}} }} ([[ISO 639-2/T|T]])</code>}}
}}
| label24 = {{nowrap|[[ISO 639-3]]}}
| data24 = {{#if:{{{iso3|}}}
|{{#ifeq:{{lc:{{{iso3|}}}}}|none|{{if empty|{{{iso3comment|}}}|''None'' (<code>mis</code>)}}|<code>{{#ifeq:{{str len|{{{iso3}}}}}| 3 | [[ISO639-3:{{{iso3}}}|{{{iso3}}}]] | {{{iso3}}} }}</code> {{#if:{{{lc1|}}}| – inclusive code<!--not all are 'macrolanguages': Hittite, for example-->}} {{{iso3comment|}}}}}|{{#if:{{{lc1|}}}| |–}}}}{{#ifexpr:{{#if:{{{lc1|}}}|1|0}} and {{#if:{{{lc2|}}}|1|0}}|{{#if:{{{iso3|}}}|<br />Individual codes|{{#if:{{{lc3|}}}|Variously|Either}}}}:{{Infobox language/codelist
|{{{lc1|}}}|{{{ld1|}}}}}{{Infobox language/codelist
|{{{lc2|}}}|{{{ld2|}}}}}{{Infobox language/codelist
|{{{lc3|}}}|{{{ld3|}}}}}{{Infobox language/codelist
|{{{lc4|}}}|{{{ld4|}}}}}{{Infobox language/codelist
|{{{lc5|}}}|{{{ld5|}}}}}{{Infobox language/codelist
|{{{lc6|}}}|{{{ld6|}}}}}{{Infobox language/codelist
|{{{lc7|}}}|{{{ld7|}}}}}{{Infobox language/codelist
|{{{lc8|}}}|{{{ld8|}}}}}{{Infobox language/codelist
|{{{lc9|}}}|{{{ld9|}}}}}{{Infobox language/codelist
|{{{lc10|}}}|{{{ld10|}}}}}{{Infobox language/codelist
|{{{lc11|}}}|{{{ld11|}}}}}{{Infobox language/codelist
|{{{lc12|}}}|{{{ld12|}}}}}{{Infobox language/codelist
|{{{lc13|}}}|{{{ld13|}}}}}{{Infobox language/codelist
|{{{lc14|}}}|{{{ld14|}}}}}{{Infobox language/codelist
|{{{lc15|}}}|{{{ld15|}}}}}{{Infobox language/codelist
|{{{lc16|}}}|{{{ld16|}}}}}{{Infobox language/codelist
|{{{lc17|}}}|{{{ld17|}}}}}{{Infobox language/codelist
|{{{lc18|}}}|{{{ld18|}}}}}{{Infobox language/codelist
|{{{lc19|}}}|{{{ld19|}}}}}{{Infobox language/codelist
|{{{lc20|}}}|{{{ld20|}}}}}{{Infobox language/codelist
|{{{lc21|}}}|{{{ld21|}}}}}{{Infobox language/codelist
|{{{lc22|}}}|{{{ld22|}}}}}{{Infobox language/codelist
|{{{lc23|}}}|{{{ld23|}}}}}{{Infobox language/codelist
|{{{lc24|}}}|{{{ld24|}}}}}{{Infobox language/codelist
|{{{lc25|}}}|{{{ld25|}}}}}{{Infobox language/codelist
|{{{lc26|}}}|{{{ld26|}}}}}{{Infobox language/codelist
|{{{lc27|}}}|{{{ld27|}}}}}{{Infobox language/codelist
|{{{lc28|}}}|{{{ld28|}}}}}{{Infobox language/codelist
|{{{lc29|}}}|{{{ld29|}}}}}{{Infobox language/codelist
|{{{lc30|}}}|{{{ld30|}}}}}{{Infobox language/codelist
|{{{lc31|}}}|{{{ld31|}}}}}{{Infobox language/codelist
|{{{lc32|}}}|{{{ld32|}}}}}{{Infobox language/codelist
|{{{lc33|}}}|{{{ld33|}}}}}{{Infobox language/codelist
|{{{lc34|}}}|{{{ld34|}}}}}{{Infobox language/codelist
|{{{lc35|}}}|{{{ld35|}}}}}{{Infobox language/codelist
|{{{lc36|}}}|{{{ld36|}}}}}{{Infobox language/codelist
|{{{lc37|}}}|{{{ld37|}}}}}{{Infobox language/codelist
|{{{lc38|}}}|{{{ld38|}}}}}{{Infobox language/codelist
|{{{lc39|}}}|{{{ld39|}}}}}{{Infobox language/codelist
|{{{lc40|}}}|{{{ld40|}}} }}
|{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br />Individual code:}}{{Infobox language/codelist|code={{{lc1}}}|2={{{ld1|}}} }} }} }}
| label25 = {{nowrap|[[ISO 639-6]]}}<!-- NOTE: ISO 639-6 was withdrawn in 2014.-->
| data25 = {{#if:{{{iso6|}}}|<code>{{{iso6}}}</code>[[Category:Languages with ISO6 code]]}}
| label26 = {{longitem|[[Linguist List]]}}
| data26 = {{Infobox language/linguistlist|1={{{linglist|}}} |2={{{lingname|}}}}}
| label27 =
| data27 = {{Infobox language/linguistlist|1={{{linglist2|}}}|2={{{lingname2|}}}}}
| label28 =
| data28 = {{Infobox language/linguistlist|1={{{linglist3|}}}|2={{{lingname3|}}}}}
| label29 =
| data29 = {{Infobox language/linguistlist|1={{{linglist4|}}}|2={{{lingname4|}}}}}
| label30 =
| data30 = {{Infobox language/linguistlist|1={{{linglist5|}}}|2={{{lingname5|}}}}}
| label31 =
| data31 = {{Infobox language/linguistlist|1={{{linglist6|}}}|2={{{lingname6|}}}}}
| label32 = ''[[Glottolog]]''
| data32 = {{#if:{{{glotto|}}}|{{#ifeq:{{lc:{{{glotto|}}}}}|none|''None''[[Category:Languages without Glottolog code]]|{{#ifeq:{{lc:{{{glotto|}}}}}|spurious|(insufficiently attested or not a distinct language){{main other|[[Category:Languages rejected by Glottolog]]}}|<code>{{glottolink|{{{glotto}}}}}</code>{{#if:{{{glottoname|}}}| {{{glottoname}}}}}}}}}}}<!--
-->{{#if:{{{glotto2|}}}|{{#if:{{{glotto|}}}|<br />|<!--no break when more than one box on a page-->}}<code>{{glottolink|{{{glotto2}}}}}</code>{{#if:{{{glottoname2|}}}| {{{glottoname2}}}}}}}<!--
-->{{#if:{{{glotto3|}}}|{{#if:{{{glotto2|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto3}}}}}</code>{{#if:{{{glottoname3|}}}| {{{glottoname3}}}}}}}<!--
-->{{#if:{{{glotto4|}}}|{{#if:{{{glotto3|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto4}}}}}</code>{{#if:{{{glottoname4|}}}| {{{glottoname4}}}}}}}<!--
-->{{#if:{{{glotto5|}}}|{{#if:{{{glotto4|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto5}}}}}</code>{{#if:{{{glottoname5|}}}| {{{glottoname5}}}}}}}
| label33 = [[Australian Institute of Aboriginal and Torres Strait Islander Studies|AIATSIS]]{{#if:{{{aiatsis|}}}|{{#tag:ref|{{AIATSIS|{{{aiatsis|}}}|{{if empty|{{{aiatsisname|}}}|{{{name}}}}}|{{{aiatsis2|}}}}}|name="AIATSIS"}}}}
| data33 = {{#if:{{{aiatsis|}}}|<code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis}}} {{{aiatsis}}}]</code>{{#if:{{{aiatsisname|}}}| {{{aiatsisname}}}}} }}{{#if:{{{aiatsis2|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis2}}} {{{aiatsis2}}}]</code>{{#if:{{{aiatsisname2|}}}| {{{aiatsisname2}}}}} }}{{#if:{{{aiatsis3|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis3}}} {{{aiatsis3}}}]</code>{{#if:{{{aiatsisname3|}}}| {{{aiatsisname3}}}}} }}{{#if:{{{aiatsis4|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis4}}} {{{aiatsis4}}}]</code>{{#if:{{{aiatsisname4|}}}| {{{aiatsisname4}}}}} }}{{#if:{{{aiatsis5|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis5}}} {{{aiatsis5}}}]</code>{{#if:{{{aiatsisname5|}}}| {{{aiatsisname5}}}}} }}{{#if:{{{aiatsis6|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis6}}} {{{aiatsis6}}}]</code>{{#if:{{{aiatsisname6|}}}| {{{aiatsisname6}}}}} }}
| label34 = {{longitem|{{Wrap|[[Guthrie classification of Bantu languages|Guthrie code]]}}}}
| data34 = {{#if:{{{guthrie|}}}|<code>{{{guthrie}}}</code><ref name="Guthrie">Jouni Filip Maho, 2009. [https://web.archive.org/web/20180203191542/http://goto.glocalnet.net/mahopapers/nuglonline.pdf New Updated Guthrie List Online]</ref>}}
| label35 = [[Endangered Languages Project|ELP]]
| data35 = {{#ifeq: {{lc: {{{ELP|}}} }} | none | | {{Endangered Languages Project |ELP={{{ELP|}}} |ELPname={{{ELPname|}}} |qid={{{qid|}}} }} }}
| label36 = <!--keeps ELP entries aligned-->
| data36 = {{#if:{{{ELP2|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP2}}} {{{ELPname2}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label37 =
| data37 = {{#if:{{{ELP3|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP3}}} {{{ELPname3}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label38 =
| data38 = {{#if:{{{ELP4|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP4}}} {{{ELPname4}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label39 =
| data39 = {{#if:{{{ELP5|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP5}}} {{{ELPname5}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label40 =
| data40 = {{#if:{{{ELP6|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP6}}} {{{ELPname6}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label41 = [[Glottopedia]]
| data41 = {{#if:{{{glottopedia|}}}|<code>[http://www.glottopedia.org/index.php/{{{glottopedia}}} {{{glottopedia}}}]</code>{{#tag:ref|[http://www.glottopedia.org/index.php/{{{glottopedia}}} Glottopedia article on {{PAGENAMEBASE}}].|name="Glottopedia"}}}}
| label42 = [[Linguasphere Observatory|Linguasphere]]
| data42 = {{Infobox language/lingualist|1={{{lingua|}}} |2={{{linguaname|}}}}}
| label43 =
| data43 = {{Infobox language/lingualist|1={{{lingua2|}}}|2={{{linguaname2|}}}}}
| label44 =
| data44 = {{Infobox language/lingualist|1={{{lingua3|}}}|2={{{linguaname3|}}}}}
| label45 =
| data45 = {{Infobox language/lingualist|1={{{lingua4|}}}|2={{{linguaname4|}}}}}
| label46 =
| data46 = {{Infobox language/lingualist|1={{{lingua5|}}}|2={{{linguaname5|}}}}}
| label47 =
| data47 = {{Infobox language/lingualist|1={{{lingua6|}}}|2={{{linguaname6|}}}}}
| label48 =
| data48 = {{Infobox language/lingualist|1={{{lingua7|}}}|2={{{linguaname7|}}}}}
| label49 =
| data49 = {{Infobox language/lingualist|1={{{lingua8|}}}|2={{{linguaname8|}}}}}
| label50 =
| data50 = {{Infobox language/lingualist|1={{{lingua9|}}}|2={{{linguaname9|}}}}}
| label51 =
| data51 = {{Infobox language/lingualist|1={{{lingua10|}}}|2={{{linguaname10|}}}}}
| label52 = [[IETF language tag|IETF]]
| data52 = {{#if:{{{ietf|}}}|<code>{{{ietf}}}</code>{{Main other|[[Category:Language articles with IETF language tag]]}}}}
| data53 = {{#if:{{{map|}}}
|{{#invoke:InfoboxImage|InfoboxImage|image={{{map}}}|upright={{if empty|{{{mapscale|}}}|1.15}}|alt={{{mapalt|}}}|class={{{map_class|}}}}}{{#if:{{{mapcaption|}}}|<div style="text-align:left;">{{{mapcaption}}}</div>}}|
}}
| data54 = {{#if:{{{map2|}}}
| {{#invoke:InfoboxImage|InfoboxImage|image={{{map2}}}|upright={{if empty|{{{mapscale|}}}|1.45}}|alt={{{mapalt2|}}}|class={{{map_class2|}}}}}{{#if:{{{mapcaption2|}}}|<div style="text-align:left;">{{{mapcaption2}}}</div>}}
}}
| data55 = {{#invoke:Location map|infobox_pushpin_map
| default_width = 250
| pushpin_alt = Approximate location where {{if empty|{{{name|}}}|the language}} is spoken
}}
| data56 = {{#if:{{{coordinates|}}} |Coordinates: {{#invoke:Coordinates|coordinsert|{{{coordinates|}}}|type:landmark}}| }}
| data57 = {{{module|}}}
<!--------------------------------------------------------->
| belowclass = noprint selfref
| belowstyle = background-color:#E7E7FF;color:inherit;padding:0.3em 0.5em;text-align:left;line-height:1.3;
| below = {{#ifeq:{{lc:{{if empty|{{{notice|}}}|{{{notice2|}}}}}}}|ipa
|'''This article contains [[International Phonetic Alphabet|IPA]] phonetic symbols.''' Without proper [[Help:IPA#Rendering issues|rendering support]], you may see [[Specials (Unicode block)#Replacement character|question marks, boxes, or other symbols]] instead of [[Unicode]] characters. For an introductory guide on IPA symbols, see [[Help:IPA]].
}}
}}<!--
---- Adding tracking categories ----
Note 1: Above in this code, already tracking [[Category:...]]'s may be added.
Note 2: All categories are using {{main other|[[Cat:...]}}.
-->{{main other|<!--
-->{{#if:{{Infobox language/family-color|{{{familycolor|}}}}}{{{signers|}}}{{{creator|}}}||[[Category:Languages without family color codes]]}}<!--
-->{{#if:{{{extinct|}}}{{{era|}}}{{{signers|}}}{{{speakers|}}}{{{creator|}}}{{{setting|}}}||<!-- no main input for data7 -->[[Category:Language articles without speaker estimate]]}}<!--
-->{{#ifeq:{{{speakers|}}}|?|{{#if:{{{iso3|}}}{{{lc1|}}}|{{#ifeq:{{{iso3|}}}|none|<!-- ok -->|{{#ifeq:{{{ref|}}}|e18|<!-- ok -->|[[Category:Language articles with unknown population not citing Ethnologue 18]]}}}}}}}}<!--
-->{{#ifeq:{{lc:{{{iso3|}}}}}|none|{{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}|[[Category:Conlangs without ISO 639-3 code]]}}}}<!--
-->{{#if:{{{date|}}}|{{#iferror: {{#expr: {{padleft:|4|{{{date}}}|}} }} |<!--
-->{{#switch: {{lc:{{{date}}}}}
| na = [[Category:Language articles with NA population dates]]
| no date = [[Category:Language articles with 'no date' set]]
| #default = [[Category:Language articles with invalid population dates]]<!--
-->}}|<!-- no error -->}}|<!-- no date -->}}<!--
-->{{#if:{{{iso3|}}}|<!--ok-->|{{#if:{{{lc1|}}}|<!--ok-->|<!--
-->{{#switch: {{lc:{{{isoexception}}}}}
| dialect = [[Category:Dialects of languages with ISO 639-3 code]]
| historical = [[Category:Historical forms of languages with ISO codes]]
| protolanguage = [[Category:Protolanguages without ISO codes]]
| talkpage =
|}}}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#if:{{{glotto|}}}|<!--ok-->|{{#if:{{{linglist|}}}|<!--ok-->|{{#if:{{{lingua|}}}|<!--ok-->|{{#if:{{{aiatsis|}}}|<!--ok-->|{{#if:{{{guthrie|}}}|<!--ok-->|{{#if:{{{creator|}}}|<!--ok-->|{{#if:{{{created|}}}|<!--ok-->|[[Category:Languages without ISO 639-3 code]]}}}}}}}}}}}}}}}}<!--
-->{{#if:{{{iso3|}}}{{{lc1|}}}{{{glotto|}}}{{{glotto2|}}}{{{glotto3|}}}{{{glotto4|}}}{{{glotto5|}}}{{{linglist|}}}{{{lingua|}}}{{{aiatsis|}}}{{{guthrie|}}}{{{isoexception|}}}|<!--ok-->|[[Category:Language articles without language codes]]}}<!--
-->{{#if:{{{lc1|}}}|{{#if:{{{lc2|}}}|<!--ok-->|[[Category:Languages which need ISO 639-3 comment]]}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#ifeq:{{{ref|}}}|e18|[[Category:Nonexistent E18 links]]}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#if:{{{linglist|}}}|{{#ifeq:{{{isoexception|}}}|dialect|[[Category:Dialects with Linguist List code]]|[[Category:Languages without ISO 639-3 code but with Linguist List code]]}}}}<!--
-->{{#ifeq:{{{glotto|}}}|none|<!--ok-->||{{#if:{{{glotto|}}}|[[Category:Languages without ISO 639-3 code but with Glottolog code]]}}}}<!--
-->{{#if:{{{lingua|}}}|[[Category:Languages without ISO 639-3 code but with Linguasphere code]]}}<!--
-->{{#if:{{{aiatsis|}}}|[[Category:Languages without ISO 639-3 code but with AIATSIS code]]}}<!--
-->{{#if:{{{guthrie|}}}|[[Category:Languages without ISO 639-3 code but with Guthrie code]]}}}}<!--
-->{{#if:{{{iso3|}}}|<!--okay-->|{{#if:{{{lc1|}}}|<!--ok-->|{{#if:{{{linglist|}}}|{{#ifeq:{{{isoexception|}}}|dialect|[[Category:Dialects with Linguist List code]]|[[Category:Languages without ISO 639-3 code but with Linguist List code]]}}}}<!--
-->{{#ifeq:{{{glotto|}}}|none|<!--ok-->|{{#if:{{{glotto|}}}|[[Category:Languages without ISO 639-3 code but with Glottolog code]]}}}}<!--
-->{{#if:{{{lingua|}}}|[[Category:Languages without ISO 639-3 code but with Linguasphere code]]}}<!--
-->{{#if:{{{aiatsis|}}}|[[Category:Languages without ISO 639-3 code but with AIATSIS code]]}}<!--
-->{{#if:{{{guthrie|}}}|[[Category:Languages without ISO 639-3 code but with Guthrie code]]}}}}}}<!--
-->{{#if:{{{glotto|}}}|{{#if:{{{glottorefname|}}}{{{glottoname|}}}|<!--ok-->
|{{#switch: {{lc:{{{glotto}}}}} |none = |spurious =
|#default = [[Category:Articles with unnamed Glottolog code]]}}}}}}<!--
-->{{#if:{{{glotto2|}}}|{{#if:{{{glottoname2|}}}{{{glottorefname2|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#if:{{{glotto3|}}}|{{#if:{{{glottoname3|}}}{{{glottorefname3|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#if:{{{glotto4|}}}|{{#if:{{{glottoname4|}}}{{{glottorefname4|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#if:{{{glotto5|}}}|{{#if:{{{glottoname5|}}}{{{glottorefname5|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#ifeq:{{Str index|{{{map|}}}|1}}|[|[[Category:Ill-formatted infobox-language images]]|<!--ok-->}}<!--
-->{{#ifeq:{{Str index|{{{map2|}}}|1}}|[|[[Category:Ill-formatted infobox-language images]]|<!--ok-->}}<!--
-->{{#ifeq:{{Str index|{{{image|}}}|1}}|[|[[Category:Ill-formatted infobox-language images]]|<!--ok-->}}<!--
-->{{#if:{{{iso2|}}}{{{iso2b|}}}{{{iso2t|}}}|[[Category:Languages with ISO 639-2 code]]|<!--ok-->}}<!--
-->{{#if:{{{iso1|}}}|[[Category:Languages with ISO 639-1 code]]|<!--ok-->}}<!--
-->{{#if:{{{speakers|}}}|{{#ifeq:{{{speakers|}}}|?|{{#if:{{{ref|}}}|[[Category:Language articles with speakers set to 'unknown' despite a reference]]|{{#ifeq:{{{isoexception|}}}|dialect|[[Category:Dialect articles with speakers set to 'unknown']]|[[Category:Language articles with speakers set to 'unknown']]}}}}|{{#ifeq:{{{speakers|}}}|none|{{#ifeq:{{lc:{{{familycolor|}}}}}|pidgin|<!--ok: pidgins don't have native speakers-->|[[Category:Language articles with speakers set to 'none']]}}|{{#if:{{{ref|}}}|<!--ok-->|[[Category:Language articles without reference field]]}}}}}}}}<!--
-->{{#if:{{{extinct|}}}{{{era|}}}|{{#if:{{{ref|}}}|<!--ok-->|{{#ifeq:{{{extinct}}}|?|<!--ok-->|[[Category:Language articles with unreferenced extinction date]]}}}}}}<!--
-->{{#if:{{{boxsize|}}}|}}<!--
-->{{#if:{{{glotto|}}}{{{glotto2|}}}{{{glotto3|}}}{{{glotto4|}}}{{{glotto5|}}}|<!--ok-->|[[Category:Language articles missing Glottolog code]]}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#ifeq:{{{glotto|}}}|none|[[Category:Languages with neither ISO nor Glottolog code]]}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none||{{#if:{{{iso3|}}}{{{lc1|}}}|{{#if:{{{ref|}}}|{{#switch: {{{ref}}} | e26 = | e25 = | e24 = | e23 = | e22 = | e21 = | e20 = | e19 = | e18 = | e17 = | e16 = | e15 = | e14 = | e13 = | e12 = | e11 = | e10 = | e09 = | e08 = | ne2007 = [[Category:Articles citing Nationalencyklopedin]] | ne2010 = [[Category:Articles citing Nationalencyklopedin]] | inali = [[Category:Articles citing INALI]] | linglist = [[Category:Articles citing Linguist List]] | aiatsis= [[Category:Articles citing AIATSIS]] | guthrie = [[Category:Articles citing Maho/Guthrie]] | = [[Category:Articles opting out of population reference]] | {{#if:{{{extinct|}}}{{{era|}}}|[[Category:Extinct ISO language articles citing sources other than Ethnologue]]|[[Category:ISO language articles citing sources other than Ethnologue]]}}}}}}}}}}<!--
Close wrapping {{main other}} for the categories:-->}}{{#invoke:Check for unknown parameters|check
|unknown={{main other|[[Category:Pages using infobox language with unknown parameters|_VALUE_{{PAGENAME}}]]}}
|preview=Page using [[Template:Infobox language]] with unknown parameter "_VALUE_"|ignoreblank=y| pushpin_map_args = y | acceptance | agency | aiatsis | aiatsis2 | aiatsis3 | aiatsis4 | aiatsis5 | aiatsis6 | aiatsisname | aiatsisname2 | aiatsisname3 | aiatsisname4 | aiatsisname5 | aiatsisname6 | altname | ancestor | ancestor2 | ancestor3 | ancestor4 | ancestor5 | ancestor6 | ancestor7 | ancestor8 | ancestor9 | ancestor10 | ancestor11 | ancestor12 | ancestor13 | ancestor14 | ancestor15 | boxsize | coordinates | created | creator | date | dateprefix | development_body | dia1 | dia2 | dia3 | dia4 | dia5 | dia6 | dia7 | dia8 | dia9 | dia10 | dia11 | dia12 | dia13 | dia14 | dia15 | dia16 | dia17 | dia18 | dia19 | dia20 | dia21 | dia22 | dia23 | dia24 | dia25 | dia26 | dia27 | dia28 | dia29 | dia30 | dia31 | dia32 | dia33 | dia34 | dia35 | dia36 | dia37 | dia38 | dia39 | dia40 | dialect_label | dialects | ELP | ELP2 | ELP3 | ELP4 | ELP5 | ELP6 | ELPname | ELPname2 | ELPname3 | ELPname4 | ELPname5 | ELPname6 | era | ethnicity | extinct | fam1 | fam2 | fam3 | fam4 | fam5 | fam6 | fam7 | fam8 | fam9 | fam10 | fam11 | fam12 | fam13 | fam14 | fam15 | family | familycolor | fontcolor | glotto | glotto2 | glotto3 | glotto4 | glotto5 | glottoname | glottoname2 | glottoname3 | glottoname4 | glottoname5 | glottopedia | glottorefname | glottorefname2 | glottorefname3 | glottorefname4 | glottorefname5 | guthrie | ietf | image | imagealt | imagecaption | imagescale | image_class | iso1 | iso1comment | iso2 | iso2b | iso2comment | iso2t | iso3 | iso3comment | iso6 | isoexception | lc1 | lc2 | lc3 | lc4 | lc5 | lc6 | lc7 | lc8 | lc9 | lc10 | lc11 | lc12 | lc13 | lc14 | lc15 | lc16 | lc17 | lc18 | lc19 | lc20 | lc21 | lc22 | lc23 | lc24 | lc25 | lc26 | lc27 | lc28 | lc29 | lc30 | lc31 | lc32 | lc33 | lc34 | lc35 | lc36 | lc37 | lc38 | lc39 | lc40 | ld1 | ld2 | ld3 | ld4 | ld5 | ld6 | ld7 | ld8 | ld9 | ld10 | ld11 | ld12 | ld13 | ld14 | ld15 | ld16 | ld17 | ld18 | ld19 | ld20 | ld21 | ld22 | ld23 | ld24 | ld25 | ld26 | ld27 | ld28 | ld29 | ld30 | ld31 | ld32 | ld33 | ld34 | ld35 | ld36 | ld37 | ld38 | ld39 | ld40 | linglist | linglist2 | linglist3 | linglist4 | linglist5 | linglist6 | lingname | lingname2 | lingname3 | lingname4 | lingname5 | lingname6 | lingua | lingua2 | lingua3 | lingua4 | lingua5 | lingua6 | lingua7 | lingua8 | lingua9 | lingua10 | linguaname | linguaname2 | linguaname3 | linguaname4 | linguaname5 | linguaname6 | linguaname7 | linguaname8 | linguaname9 | linguaname10 | listclass | liststyle | map | map2 | mapalt | mapalt2 | mapcaption | mapcaption2 | map_class | map_class2 | mapscale | minority | module | name | nation | nativename | native_to | notice | notice2 | official | posteriori | pronunciation | protoname | qid | ref | refname | region | revived | revived-cat | revived-category | script | setting | sign | signers | speakers | speakers_label | speakers2 | stand1 | stand2 | stand3 | stand4 | stand5 | stand6 | standards | state | states }}<templatestyles src="Template:Infobox/styles-images.css" />{{#invoke:Check for conflicting parameters|check
| template = [[Template:Infobox language]]
| cat = {{main other|Category:Pages using infobox language with conflicting parameters}}
| states; state
| signers; speakers
| revived-category; revived-cat
| protoname; ancestor
| listclass; liststyle
| nation; official
}}<noinclude>
{{documentation}}
</noinclude>
bkn0nplpl5k9su4575wkpvuwfeddbfm
32922
32919
2026-11-11T21:11:18Z
RAPTOR7762
18
/* */
32922
wikitext
text/x-wiki
{{Infobox/sandbox
| above = <includeonly>{{{name|{{#if:{{#invoke:Wikidata|ViewSomething|labels|en|value}}|{{#invoke:Wikidata|ViewSomething|labels|en|value}}|{{PAGENAMEBASE}}}}}}}</includeonly>
| subheader1 = {{{altname|}}}
| subheader2 = {{{nativename|}}}
| subheader3 = {{#if:{{{acceptance|}}}|({{{acceptance|}}})}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|upright={{if empty|{{{imagescale|}}}|0.9}}|alt={{{imagealt|}}}|class={{{image_class|}}}}}
| captionstyle = padding:0.35em 0.35em 0.25em;line-height:1.25em;
| caption = {{{imagecaption|}}}
| headerstyle = color: {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}|white|{{if empty|{{{fontcolor|}}}|black}}}}; background-color: {{#if:{{{signers|}}}|silver|{{#if:{{{creator|}}}{{{setting|}}}|#114057|{{Infobox language/family-color|{{if empty|{{{familycolor|}}}|Default}}}}}}}};
<!--------------------------------------------------------->
| labelstyle = white-space:nowrap;padding-right:0.65em<!--(to ensure gap between any long/nonwrapped label and subsequent data on same line-->;
| datastyle = line-height:1.3em;
| label1 = Pronunciation
| data1 = {{#if:{{{pronunciation|}}}| {{if empty|{{{pronunciation|}}}|''to be added''}}}}
| label2 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
| Created by
| Native to
}}
| data2 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|{{if empty|{{{creator|}}}|–}}
|{{if empty|{{{states|}}}|{{{state|}}}|{{{native_to|}}}}}
}}
| label3 = Date
| data3 = {{{created|}}}
| label4 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|Setting and usage
|{{#if:{{{region|}}}|Region}}
}}
| data4 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|{{{setting|}}}
|{{{region|}}}
}}
| label6 = Ethnicity
| data6 = {{{ethnicity|}}}
| label7 = {{#if:{{{extinct|}}} |[[Extinct language|Extinct]] |{{#if:{{{era|}}} |Era |{{#if:{{{creator|}}}{{{speakers_label|}}} |{{if empty|{{{speakers_label|}}}|Users}} |{{longitem|Native speakers}} }} }} }}
| data7 =<!--
-->{{#if:{{{extinct|}}}|{{#ifeq:{{{extinct}}}|?|(date missing)[[Category:Language articles with unknown extinction date]]|{{{extinct|}}}}}<!-- extinct input used
-->|{{#if:{{{era|}}}|{{{era}}}<!-- era input used
-->|<!-- no era, check for sign/spoken -->{{#if:{{{signers|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}} }}|silver|1}}<!-- check for signers/silver
-->|<!-- SIGN language (silver) -->{{#if:{{{signers|}}}{{{speakers|}}}|{{#ifeq: {{lc:{{{date}}}}}|na|{{if empty|{{{signers|}}}|{{{speakers|}}}|–}}
|{{#ifeq:{{if empty|{{{signers|}}}|{{{speakers}}}}}|?|<!--
-->|{{#ifeq:{{if empty|{{{signers|}}}|{{{speakers}}}}}|none|''None''
|{{#if:{{{date|}}}|{{if empty|{{{signers|}}}|{{{speakers|}}}|–}} ({{{dateprefix|}}}{{{date}}})
|{{if empty|{{{signers|}}}|{{{speakers|}}}|–}}{{main other|[[Category:Language articles with speaker number undated]]}}}} }} }} }} }}<!--(end if:date, ifeq:date=na, if:signers. end of SIGN)
-->|<!-- SPOKEN language (not silver) -->{{#if:{{{speakers|}}}|{{#ifeq: {{lc:{{{date}}}}}|na|{{if empty|{{{speakers|}}}|–}}
|{{#ifeq: {{{date}}}|no date|(undated figure of {{{speakers|}}})|<!--
The following changes the display depending on the age of the data. Limit set to 25 years, as a population can double in that time.
-->{{#if:{{{date|}}}|{{#iferror:{{#expr: {{padleft:|4|{{{date}}}|}} }}||{{#ifexpr:(({{CURRENTYEAR}} - {{padleft:|4|{{{date}}}|}}) < 25)<!--
-->|<!-- regular-->{{if empty|{{{speakers|}}}|–}} ({{{dateprefix|}}}{{{date}}})<!--
-->|<!-- old (25+) -->({{{speakers}}} cited {{{dateprefix|}}}{{{date}}}){{main other|{{#ifeq:{{{ref}}}|e19|[[Category:Language articles with old Ethnologue 19 speaker data]]|{{#ifeq:{{{ref}}}|e18|[[Category:Language articles with old Ethnologue 18 speaker data]]|[[Category:Language articles with old speaker data]]}}}}}}}}}}<!--(end ifexpr:25+, iferror:)
-->|{{#ifeq:{{{speakers}}}|?|<!--
-->|{{#ifeq:{{{speakers}}}|none|''None''
|<!-- no date input -->{{if empty|{{{speakers|}}}|–}}{{main other|[[Category:Language articles with speaker number undated]]}}}} }} }}<!--(end if:date, before the 25+ expr check)
-->}}<!--(end ifeq:date=no date)
-->}}<!--(end ifeq:date=na)
-->|<!--(no speakers number to be shown)-->}}}}<!--(end if:speakers (in 2nd param of silver-check), if:silver. end of SPOKEN)
-->}} }}<!--(end if:era, if:extinct. No open #if:s left)
If there is a ref, and there is any input for this row (data7), then we add the reference:
-->{{#if:{{{ref|}}}|{{#if:{{{extinct|}}}{{{era|}}}{{{signers|}}}{{{speakers|}}}{{{date|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|silver|sign_language}}|{{Infobox language/ref|{{{ref}}}|iso3={{{iso3|}}}|refname={{{refname|}}}|name={{if empty|{{{name|}}}|{{PAGENAME}}}}|lc1={{{lc1|}}}|ld1={{Delink|{{{ld1}}}}}|lc2={{{lc2|}}}|ld2={{Delink|{{{ld2}}}}}|lc3={{{lc3|}}}|ld3={{Delink|{{{ld3}}}}}|lc4={{{lc4|}}}|ld4={{Delink|{{{ld4}}}}}|lc5={{{lc5|}}}|ld5={{Delink|{{{ld5}}}}}|lc6={{{lc6|}}}|ld6={{Delink|{{{ld6}}}}}|lc7={{{lc7|}}}|ld7={{Delink|{{{ld7}}}}}}}}}}}<!--
Add speakers2 after the ref:
-->{{#if:{{{speakers2|}}}|<br />{{{speakers2|}}} }}
| label8 = {{#if:{{{revived|}}} |[[Language revitalization|Revival]]{{#if:{{{revived-category|}}}{{{revived-cat|}}}|{{#ifeq:{{if empty|{{{revived-category|}}}|{{{revived-cat}}}}}|nocat|<!--suppress-->|[[Category:{{if empty|{{{revived-category|}}}|{{{revived-cat}}}}}]]|[[Category:Language revival]]}} }} }}
| data8 = {{{revived|}}}
| label9 = {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|Purpose
|{{longitem|{{Wrap|[[Language family]]}}}}
}}
| data9 = {{#ifeq: {{lc:{{{family}}}}}|na||<div style="text-align:left;">{{{family|{{{fam1|{{#if:{{{signers|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|silver|1}}
|''Unknown''{{main other|[[Category:Languages without classification]]}}
|{{#if:{{{creator|}}}{{{setting|}}}
|[[Constructed language]]
|{{Infobox language/genetic|{{if empty|{{{familycolor|}}}|Default}}}}
}}
}}}}}
<ul style="line-height:100%; margin-left:1.35em;padding-left:0"><li>
{{#ifeq:{{{familycolor|}}}|unclassified||{{#ifeq:{{{familycolor|}}}|Unclassified||{{#ifeq:{{{familycolor|}}}|isolate||{{#ifeq:{{{familycolor|}}}|Isolate||{{#if:{{{fam2|}}}
| {{{fam2}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam3|}}}
| {{{fam3}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam4|}}}
| {{{fam4}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam5|}}}
| {{{fam5}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam6|}}}
| {{{fam6}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam7|}}}
| {{{fam7}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam8|}}}
| {{{fam8}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam9|}}}
| {{{fam9}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam10|}}}
| {{{fam10}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam11|}}}
| {{{fam11}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam12|}}}
| {{{fam12}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam13|}}}
| {{{fam13}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam14|}}}
| {{{fam14}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>{{#if:{{{fam15|}}}
| {{{fam15}}}<ul style="line-height:100%;margin-left:0.45em;padding-left:0;"><li>'''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''</li></ul>
| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}</li></ul>| '''{{if empty|{{{name|}}}|{{PAGENAME}}}}'''
}}
}}}}}}}}</li></ul>}}}</div>}}
| label10 = {{longitem|{{#if:{{{ancestor2|}}}|Early forms|Early form}}}}
| data10 = {{#if:{{{protoname|}}}{{{ancestor|}}}|<div style="text-align:left;">{{if empty|{{{protoname|}}}|{{{ancestor|}}}}}
{{#if:{{{ancestor2|}}}|<ul style="line-height:100%; margin-left:1.35em; padding-left:0"><li>{{{ancestor2}}}
{{#if:{{{ancestor3|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor3}}}
{{#if:{{{ancestor4|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor4}}}
{{#if:{{{ancestor5|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor5}}}
{{#if:{{{ancestor6|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor6}}}
{{#if:{{{ancestor7|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor7}}}
{{#if:{{{ancestor8|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor8}}}
{{#if:{{{ancestor9|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor9}}}
{{#if:{{{ancestor10|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor10}}}
{{#if:{{{ancestor11|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor11}}}
{{#if:{{{ancestor12|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor12}}}
{{#if:{{{ancestor13|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor13}}}
{{#if:{{{ancestor14|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor14}}}
{{#if:{{{ancestor15|}}}|<ul style="line-height:100%; margin-left:0.45em; padding-left:0"><li>{{{ancestor15}}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</li></ul>}}
</div>}}
| label11 = {{longitem|Standard forms}}
| data11 = {{#if:{{{standards|}}}|{{{standards}}}
|{{#if:{{{stand1|}}}|{{plainlist|
*{{{stand1|}}}{{#if:{{{stand2|}}}|
*{{{stand2|}}}|}}{{#if:{{{stand3|}}}|
*{{{stand3|}}}|}}{{#if:{{{stand4|}}}|
*{{{stand4|}}}|}}{{#if:{{{stand5|}}}|
*{{{stand5|}}}|}}{{#if:{{{stand6|}}}|
*{{{stand6|}}}}}}}}}}}
| label12 = {{if empty|{{{dialect_label|}}}|Dialects}}
| data12 = {{#if:{{{dialects|}}}|{{{dialects}}}
|{{#if:{{{dia1|}}}|
{{#if:{{{dia1|}}}|*{{{dia1}}}}}
{{#if:{{{dia2|}}}|*{{{dia2}}}}}
{{#if:{{{dia3|}}}|*{{{dia3}}}}}
{{#if:{{{dia4|}}}|*{{{dia4}}}}}
{{#if:{{{dia5|}}}|*{{{dia5}}}}}
{{#if:{{{dia6|}}}|*{{{dia6}}}}}
{{#if:{{{dia7|}}}|*{{{dia7}}}}}
{{#if:{{{dia8|}}}|*{{{dia8}}}}}
{{#if:{{{dia9|}}}|*{{{dia9}}}}}
{{#if:{{{dia10|}}}|*{{{dia10}}}}}
{{#if:{{{dia11|}}}|*{{{dia11}}}}}
{{#if:{{{dia12|}}}|*{{{dia12}}}}}
{{#if:{{{dia13|}}}|*{{{dia13}}}}}
{{#if:{{{dia14|}}}|*{{{dia14}}}}}
{{#if:{{{dia15|}}}|*{{{dia15}}}}}
{{#if:{{{dia16|}}}|*{{{dia16}}}}}
{{#if:{{{dia17|}}}|*{{{dia17}}}}}
{{#if:{{{dia18|}}}|*{{{dia18}}}}}
{{#if:{{{dia19|}}}|*{{{dia19}}}}}
{{#if:{{{dia20|}}}|*{{{dia20}}}}}
{{#if:{{{dia21|}}}|*{{{dia21}}}}}
{{#if:{{{dia22|}}}|*{{{dia22}}}}}
{{#if:{{{dia23|}}}|*{{{dia23}}}}}
{{#if:{{{dia24|}}}|*{{{dia24}}}}}
{{#if:{{{dia25|}}}|*{{{dia25}}}}}
{{#if:{{{dia26|}}}|*{{{dia26}}}}}
{{#if:{{{dia27|}}}|*{{{dia27}}}}}
{{#if:{{{dia28|}}}|*{{{dia28}}}}}
{{#if:{{{dia29|}}}|*{{{dia29}}}}}
{{#if:{{{dia30|}}}|*{{{dia30}}}}}
{{#if:{{{dia31|}}}|*{{{dia31}}}}}
{{#if:{{{dia32|}}}|*{{{dia32}}}}}
{{#if:{{{dia33|}}}|*{{{dia33}}}}}
{{#if:{{{dia34|}}}|*{{{dia34}}}}}
{{#if:{{{dia35|}}}|*{{{dia35}}}}}
{{#if:{{{dia36|}}}|*{{{dia36}}}}}
{{#if:{{{dia37|}}}|*{{{dia37}}}}}
{{#if:{{{dia38|}}}|*{{{dia38}}}}}
{{#if:{{{dia39|}}}|*{{{dia39}}}}}
{{#if:{{{dia40|}}}|*{{{dia40}}}}}
}}}}
| rowclass12 = {{#if:{{{dialects|}}}||{{#if:{{{dia1|}}}|{{if empty|{{{listclass|}}}|{{{liststyle|}}}|plainlist}}}}}}
| label13 = {{longitem|{{Wrap|[[Writing system]]}}}}
| data13 = {{#switch: {{lc:{{{script|}}}}}
| latin
| [[latin]]
| latin alphabet
| [[latin alphabet]]
| [[latin alphabet|latin]] = [[Latin script|Latin]]
| #default = {{{script|}}}
}}
| label14 = {{longitem|{{Wrap|[[Manually coded language|Signed forms]]}}}}
| data14 = {{#if:{{{sign|}}}|{{{sign}}}}}
| label15 = Sources
| data15 = {{{posteriori|}}}
<!--------------------------------------------------------->
| header16 = {{#if:{{{nation|}}}{{{official|}}}{{{minority|}}}{{{agency|}}}{{{development_body|}}}|Official status}}
| label17 = {{longitem|Official language in}}
| data17 = {{if empty|{{{nation|}}}|{{{official|}}}}}
| label18 = {{longitem|class=nowrap|Recognised minority<br />language in}}
| data18 = {{#if:{{{minority|}}} |<div style="<!--label17 above almost always linewraps, so:-->vertical-align:middle;">{{{minority}}}</div>}}
| label19 = [[List of language regulators|Regulated by]]
| data19 = {{{agency|{{#ifexpr:{{#if:{{{agency|}}}|1|0}} and {{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{if empty|{{{familycolor|}}}|Default}}}}|#114057|1}}|1|0}}
| ''None''
<!-- | {{#if:{{{nation|}}}|''No official regulation''}} [this ends up claiming that languages have no regulation just because no-one bothered to add the regulator -->
}}}}}
| label20 = Development body
| data20 = {{{development_body|}}}
<!--------------------------------------------------------->
| header21 = Language codes
| label22 = {{nowrap|[[ISO 639-1]]}}
| data22 = {{#if:{{{iso1|}}}|<code>{{#ifeq:{{str len|{{{iso1|}}}}}| 2 | {{ISO 639-1|{{{iso1}}}}} | {{{iso1}}} }}</code> {{{iso1comment|}}}}}
| label23 = {{nowrap|[[ISO 639-2]]}}
| data23 = {{#if:{{{iso2|}}}{{{iso2b|}}}{{{iso2t|}}}
|<code>{{#if:{{{iso2b|}}}{{{iso2t|}}}
|{{#ifeq:{{str len|{{{iso2b|}}}}}| 3 | {{ISO 639-2|{{{iso2b}}}}} | {{{iso2b}}} }} ([[ISO 639-2/B|B]])
|{{#if:{{{signers|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|silver|1}}
|{{if empty|{{{iso2|}}}|sgn}}
|{{
#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}
|{{if empty|{{{iso2|}}}|art}}
|{{#ifeq:{{str len|{{{iso2|}}}}}| 3 | {{ISO 639-2|{{{iso2}}}}} | {{{iso2}}} }}}}}}}}</code> {{{iso2comment|}}}{{
#if:{{{iso2b|}}}{{{iso2t|}}}
|<br /><code>{{#ifeq:{{str len|{{{iso2t|}}}}}| 3 | {{ISO 639-2|{{{iso2t}}}}} | {{{iso2t}}} }} ([[ISO 639-2/T|T]])</code>}}
}}
| label24 = {{nowrap|[[ISO 639-3]]}}
| data24 = {{#if:{{{iso3|}}}
|{{#ifeq:{{lc:{{{iso3|}}}}}|none|{{if empty|{{{iso3comment|}}}|''None'' (<code>mis</code>)}}|<code>{{#ifeq:{{str len|{{{iso3}}}}}| 3 | [[ISO639-3:{{{iso3}}}|{{{iso3}}}]] | {{{iso3}}} }}</code> {{#if:{{{lc1|}}}| – inclusive code<!--not all are 'macrolanguages': Hittite, for example-->}} {{{iso3comment|}}}}}|{{#if:{{{lc1|}}}| |–}}}}{{#ifexpr:{{#if:{{{lc1|}}}|1|0}} and {{#if:{{{lc2|}}}|1|0}}|{{#if:{{{iso3|}}}|<br />Individual codes|{{#if:{{{lc3|}}}|Variously|Either}}}}:{{Infobox language/codelist
|{{{lc1|}}}|{{{ld1|}}}}}{{Infobox language/codelist
|{{{lc2|}}}|{{{ld2|}}}}}{{Infobox language/codelist
|{{{lc3|}}}|{{{ld3|}}}}}{{Infobox language/codelist
|{{{lc4|}}}|{{{ld4|}}}}}{{Infobox language/codelist
|{{{lc5|}}}|{{{ld5|}}}}}{{Infobox language/codelist
|{{{lc6|}}}|{{{ld6|}}}}}{{Infobox language/codelist
|{{{lc7|}}}|{{{ld7|}}}}}{{Infobox language/codelist
|{{{lc8|}}}|{{{ld8|}}}}}{{Infobox language/codelist
|{{{lc9|}}}|{{{ld9|}}}}}{{Infobox language/codelist
|{{{lc10|}}}|{{{ld10|}}}}}{{Infobox language/codelist
|{{{lc11|}}}|{{{ld11|}}}}}{{Infobox language/codelist
|{{{lc12|}}}|{{{ld12|}}}}}{{Infobox language/codelist
|{{{lc13|}}}|{{{ld13|}}}}}{{Infobox language/codelist
|{{{lc14|}}}|{{{ld14|}}}}}{{Infobox language/codelist
|{{{lc15|}}}|{{{ld15|}}}}}{{Infobox language/codelist
|{{{lc16|}}}|{{{ld16|}}}}}{{Infobox language/codelist
|{{{lc17|}}}|{{{ld17|}}}}}{{Infobox language/codelist
|{{{lc18|}}}|{{{ld18|}}}}}{{Infobox language/codelist
|{{{lc19|}}}|{{{ld19|}}}}}{{Infobox language/codelist
|{{{lc20|}}}|{{{ld20|}}}}}{{Infobox language/codelist
|{{{lc21|}}}|{{{ld21|}}}}}{{Infobox language/codelist
|{{{lc22|}}}|{{{ld22|}}}}}{{Infobox language/codelist
|{{{lc23|}}}|{{{ld23|}}}}}{{Infobox language/codelist
|{{{lc24|}}}|{{{ld24|}}}}}{{Infobox language/codelist
|{{{lc25|}}}|{{{ld25|}}}}}{{Infobox language/codelist
|{{{lc26|}}}|{{{ld26|}}}}}{{Infobox language/codelist
|{{{lc27|}}}|{{{ld27|}}}}}{{Infobox language/codelist
|{{{lc28|}}}|{{{ld28|}}}}}{{Infobox language/codelist
|{{{lc29|}}}|{{{ld29|}}}}}{{Infobox language/codelist
|{{{lc30|}}}|{{{ld30|}}}}}{{Infobox language/codelist
|{{{lc31|}}}|{{{ld31|}}}}}{{Infobox language/codelist
|{{{lc32|}}}|{{{ld32|}}}}}{{Infobox language/codelist
|{{{lc33|}}}|{{{ld33|}}}}}{{Infobox language/codelist
|{{{lc34|}}}|{{{ld34|}}}}}{{Infobox language/codelist
|{{{lc35|}}}|{{{ld35|}}}}}{{Infobox language/codelist
|{{{lc36|}}}|{{{ld36|}}}}}{{Infobox language/codelist
|{{{lc37|}}}|{{{ld37|}}}}}{{Infobox language/codelist
|{{{lc38|}}}|{{{ld38|}}}}}{{Infobox language/codelist
|{{{lc39|}}}|{{{ld39|}}}}}{{Infobox language/codelist
|{{{lc40|}}}|{{{ld40|}}} }}
|{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br />Individual code:}}{{Infobox language/codelist|code={{{lc1}}}|2={{{ld1|}}} }} }} }}
| label25 = {{nowrap|[[ISO 639-6]]}}<!-- NOTE: ISO 639-6 was withdrawn in 2014.-->
| data25 = {{#if:{{{iso6|}}}|<code>{{{iso6}}}</code>[[Category:Languages with ISO6 code]]}}
| label26 = {{longitem|[[Linguist List]]}}
| data26 = {{Infobox language/linguistlist|1={{{linglist|}}} |2={{{lingname|}}}}}
| label27 =
| data27 = {{Infobox language/linguistlist|1={{{linglist2|}}}|2={{{lingname2|}}}}}
| label28 =
| data28 = {{Infobox language/linguistlist|1={{{linglist3|}}}|2={{{lingname3|}}}}}
| label29 =
| data29 = {{Infobox language/linguistlist|1={{{linglist4|}}}|2={{{lingname4|}}}}}
| label30 =
| data30 = {{Infobox language/linguistlist|1={{{linglist5|}}}|2={{{lingname5|}}}}}
| label31 =
| data31 = {{Infobox language/linguistlist|1={{{linglist6|}}}|2={{{lingname6|}}}}}
| label32 = ''[[Glottolog]]''
| data32 = {{#if:{{{glotto|}}}|{{#ifeq:{{lc:{{{glotto|}}}}}|none|''None''[[Category:Languages without Glottolog code]]|{{#ifeq:{{lc:{{{glotto|}}}}}|spurious|(insufficiently attested or not a distinct language){{main other|[[Category:Languages rejected by Glottolog]]}}|<code>{{glottolink|{{{glotto}}}}}</code>{{#if:{{{glottoname|}}}| {{{glottoname}}}}}}}}}}}<!--
-->{{#if:{{{glotto2|}}}|{{#if:{{{glotto|}}}|<br />|<!--no break when more than one box on a page-->}}<code>{{glottolink|{{{glotto2}}}}}</code>{{#if:{{{glottoname2|}}}| {{{glottoname2}}}}}}}<!--
-->{{#if:{{{glotto3|}}}|{{#if:{{{glotto2|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto3}}}}}</code>{{#if:{{{glottoname3|}}}| {{{glottoname3}}}}}}}<!--
-->{{#if:{{{glotto4|}}}|{{#if:{{{glotto3|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto4}}}}}</code>{{#if:{{{glottoname4|}}}| {{{glottoname4}}}}}}}<!--
-->{{#if:{{{glotto5|}}}|{{#if:{{{glotto4|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto5}}}}}</code>{{#if:{{{glottoname5|}}}| {{{glottoname5}}}}}}}
| label33 = [[Australian Institute of Aboriginal and Torres Strait Islander Studies|AIATSIS]]{{#if:{{{aiatsis|}}}|{{#tag:ref|{{AIATSIS|{{{aiatsis|}}}|{{if empty|{{{aiatsisname|}}}|{{{name}}}}}|{{{aiatsis2|}}}}}|name="AIATSIS"}}}}
| data33 = {{#if:{{{aiatsis|}}}|<code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis}}} {{{aiatsis}}}]</code>{{#if:{{{aiatsisname|}}}| {{{aiatsisname}}}}} }}{{#if:{{{aiatsis2|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis2}}} {{{aiatsis2}}}]</code>{{#if:{{{aiatsisname2|}}}| {{{aiatsisname2}}}}} }}{{#if:{{{aiatsis3|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis3}}} {{{aiatsis3}}}]</code>{{#if:{{{aiatsisname3|}}}| {{{aiatsisname3}}}}} }}{{#if:{{{aiatsis4|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis4}}} {{{aiatsis4}}}]</code>{{#if:{{{aiatsisname4|}}}| {{{aiatsisname4}}}}} }}{{#if:{{{aiatsis5|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis5}}} {{{aiatsis5}}}]</code>{{#if:{{{aiatsisname5|}}}| {{{aiatsisname5}}}}} }}{{#if:{{{aiatsis6|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis6}}} {{{aiatsis6}}}]</code>{{#if:{{{aiatsisname6|}}}| {{{aiatsisname6}}}}} }}
| label34 = {{longitem|{{Wrap|[[Guthrie classification of Bantu languages|Guthrie code]]}}}}
| data34 = {{#if:{{{guthrie|}}}|<code>{{{guthrie}}}</code><ref name="Guthrie">Jouni Filip Maho, 2009. [https://web.archive.org/web/20180203191542/http://goto.glocalnet.net/mahopapers/nuglonline.pdf New Updated Guthrie List Online]</ref>}}
| label35 = [[Endangered Languages Project|ELP]]
| data35 = {{#ifeq: {{lc: {{{ELP|}}} }} | none | | {{Endangered Languages Project |ELP={{{ELP|}}} |ELPname={{{ELPname|}}} |qid={{{qid|}}} }} }}
| label36 = <!--keeps ELP entries aligned-->
| data36 = {{#if:{{{ELP2|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP2}}} {{{ELPname2}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label37 =
| data37 = {{#if:{{{ELP3|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP3}}} {{{ELPname3}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label38 =
| data38 = {{#if:{{{ELP4|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP4}}} {{{ELPname4}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label39 =
| data39 = {{#if:{{{ELP5|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP5}}} {{{ELPname5}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label40 =
| data40 = {{#if:{{{ELP6|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP6}}} {{{ELPname6}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}}
| label41 = [[Glottopedia]]
| data41 = {{#if:{{{glottopedia|}}}|<code>[http://www.glottopedia.org/index.php/{{{glottopedia}}} {{{glottopedia}}}]</code>{{#tag:ref|[http://www.glottopedia.org/index.php/{{{glottopedia}}} Glottopedia article on {{PAGENAMEBASE}}].|name="Glottopedia"}}}}
| label42 = [[Linguasphere Observatory|Linguasphere]]
| data42 = {{Infobox language/lingualist|1={{{lingua|}}} |2={{{linguaname|}}}}}
| label43 =
| data43 = {{Infobox language/lingualist|1={{{lingua2|}}}|2={{{linguaname2|}}}}}
| label44 =
| data44 = {{Infobox language/lingualist|1={{{lingua3|}}}|2={{{linguaname3|}}}}}
| label45 =
| data45 = {{Infobox language/lingualist|1={{{lingua4|}}}|2={{{linguaname4|}}}}}
| label46 =
| data46 = {{Infobox language/lingualist|1={{{lingua5|}}}|2={{{linguaname5|}}}}}
| label47 =
| data47 = {{Infobox language/lingualist|1={{{lingua6|}}}|2={{{linguaname6|}}}}}
| label48 =
| data48 = {{Infobox language/lingualist|1={{{lingua7|}}}|2={{{linguaname7|}}}}}
| label49 =
| data49 = {{Infobox language/lingualist|1={{{lingua8|}}}|2={{{linguaname8|}}}}}
| label50 =
| data50 = {{Infobox language/lingualist|1={{{lingua9|}}}|2={{{linguaname9|}}}}}
| label51 =
| data51 = {{Infobox language/lingualist|1={{{lingua10|}}}|2={{{linguaname10|}}}}}
| label52 = [[IETF language tag|IETF]]
| data52 = {{#if:{{{ietf|}}}|<code>{{{ietf}}}</code>{{Main other|[[Category:Language articles with IETF language tag]]}}}}
| data53 = {{#if:{{{map|}}}
|{{#invoke:InfoboxImage|InfoboxImage|image={{{map}}}|upright={{if empty|{{{mapscale|}}}|1.15}}|alt={{{mapalt|}}}|class={{{map_class|}}}}}{{#if:{{{mapcaption|}}}|<div style="text-align:left;">{{{mapcaption}}}</div>}}|
}}
| data54 = {{#if:{{{map2|}}}
| {{#invoke:InfoboxImage|InfoboxImage|image={{{map2}}}|upright={{if empty|{{{mapscale|}}}|1.45}}|alt={{{mapalt2|}}}|class={{{map_class2|}}}}}{{#if:{{{mapcaption2|}}}|<div style="text-align:left;">{{{mapcaption2}}}</div>}}
}}
| data55 = {{#invoke:Location map|infobox_pushpin_map
| default_width = 250
| pushpin_alt = Approximate location where {{if empty|{{{name|}}}|the language}} is spoken
}}
| data56 = {{#if:{{{coordinates|}}} |Coordinates: {{#invoke:Coordinates|coordinsert|{{{coordinates|}}}|type:landmark}}| }}
| data57 = {{{module|}}}
<!--------------------------------------------------------->
| belowclass = noprint selfref
| belowstyle = background-color:#E7E7FF;color:inherit;padding:0.3em 0.5em;text-align:left;line-height:1.3;
| below = {{#ifeq:{{lc:{{if empty|{{{notice|}}}|{{{notice2|}}}}}}}|ipa
|'''This article contains [[International Phonetic Alphabet|IPA]] phonetic symbols.''' Without proper [[Help:IPA#Rendering issues|rendering support]], you may see [[Specials (Unicode block)#Replacement character|question marks, boxes, or other symbols]] instead of [[Unicode]] characters. For an introductory guide on IPA symbols, see [[Help:IPA]].
}}
}}<!--
---- Adding tracking categories ----
Note 1: Above in this code, already tracking [[Category:...]]'s may be added.
Note 2: All categories are using {{main other|[[Cat:...]}}.
-->{{main other|<!--
-->{{#if:{{Infobox language/family-color|{{{familycolor|}}}}}{{{signers|}}}{{{creator|}}}||[[Category:Languages without family color codes]]}}<!--
-->{{#if:{{{extinct|}}}{{{era|}}}{{{signers|}}}{{{speakers|}}}{{{creator|}}}{{{setting|}}}||<!-- no main input for data7 -->[[Category:Language articles without speaker estimate]]}}<!--
-->{{#ifeq:{{{speakers|}}}|?|{{#if:{{{iso3|}}}{{{lc1|}}}|{{#ifeq:{{{iso3|}}}|none|<!-- ok -->|{{#ifeq:{{{ref|}}}|e18|<!-- ok -->|[[Category:Language articles with unknown population not citing Ethnologue 18]]}}}}}}}}<!--
-->{{#ifeq:{{lc:{{{iso3|}}}}}|none|{{#if:{{{creator|}}}{{{setting|}}}{{#ifeq:{{Infobox language/family-color|{{{familycolor|}}}}}|#114057|1}}|[[Category:Conlangs without ISO 639-3 code]]}}}}<!--
-->{{#if:{{{date|}}}|{{#iferror: {{#expr: {{padleft:|4|{{{date}}}|}} }} |<!--
-->{{#switch: {{lc:{{{date}}}}}
| na = [[Category:Language articles with NA population dates]]
| no date = [[Category:Language articles with 'no date' set]]
| #default = [[Category:Language articles with invalid population dates]]<!--
-->}}|<!-- no error -->}}|<!-- no date -->}}<!--
-->{{#if:{{{iso3|}}}|<!--ok-->|{{#if:{{{lc1|}}}|<!--ok-->|<!--
-->{{#switch: {{lc:{{{isoexception}}}}}
| dialect = [[Category:Dialects of languages with ISO 639-3 code]]
| historical = [[Category:Historical forms of languages with ISO codes]]
| protolanguage = [[Category:Protolanguages without ISO codes]]
| talkpage =
|}}}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#if:{{{glotto|}}}|<!--ok-->|{{#if:{{{linglist|}}}|<!--ok-->|{{#if:{{{lingua|}}}|<!--ok-->|{{#if:{{{aiatsis|}}}|<!--ok-->|{{#if:{{{guthrie|}}}|<!--ok-->|{{#if:{{{creator|}}}|<!--ok-->|{{#if:{{{created|}}}|<!--ok-->|[[Category:Languages without ISO 639-3 code]]}}}}}}}}}}}}}}}}<!--
-->{{#if:{{{iso3|}}}{{{lc1|}}}{{{glotto|}}}{{{glotto2|}}}{{{glotto3|}}}{{{glotto4|}}}{{{glotto5|}}}{{{linglist|}}}{{{lingua|}}}{{{aiatsis|}}}{{{guthrie|}}}{{{isoexception|}}}|<!--ok-->|[[Category:Language articles without language codes]]}}<!--
-->{{#if:{{{lc1|}}}|{{#if:{{{lc2|}}}|<!--ok-->|[[Category:Languages which need ISO 639-3 comment]]}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#ifeq:{{{ref|}}}|e18|[[Category:Nonexistent E18 links]]}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#if:{{{linglist|}}}|{{#ifeq:{{{isoexception|}}}|dialect|[[Category:Dialects with Linguist List code]]|[[Category:Languages without ISO 639-3 code but with Linguist List code]]}}}}<!--
-->{{#ifeq:{{{glotto|}}}|none|<!--ok-->||{{#if:{{{glotto|}}}|[[Category:Languages without ISO 639-3 code but with Glottolog code]]}}}}<!--
-->{{#if:{{{lingua|}}}|[[Category:Languages without ISO 639-3 code but with Linguasphere code]]}}<!--
-->{{#if:{{{aiatsis|}}}|[[Category:Languages without ISO 639-3 code but with AIATSIS code]]}}<!--
-->{{#if:{{{guthrie|}}}|[[Category:Languages without ISO 639-3 code but with Guthrie code]]}}}}<!--
-->{{#if:{{{iso3|}}}|<!--okay-->|{{#if:{{{lc1|}}}|<!--ok-->|{{#if:{{{linglist|}}}|{{#ifeq:{{{isoexception|}}}|dialect|[[Category:Dialects with Linguist List code]]|[[Category:Languages without ISO 639-3 code but with Linguist List code]]}}}}<!--
-->{{#ifeq:{{{glotto|}}}|none|<!--ok-->|{{#if:{{{glotto|}}}|[[Category:Languages without ISO 639-3 code but with Glottolog code]]}}}}<!--
-->{{#if:{{{lingua|}}}|[[Category:Languages without ISO 639-3 code but with Linguasphere code]]}}<!--
-->{{#if:{{{aiatsis|}}}|[[Category:Languages without ISO 639-3 code but with AIATSIS code]]}}<!--
-->{{#if:{{{guthrie|}}}|[[Category:Languages without ISO 639-3 code but with Guthrie code]]}}}}}}<!--
-->{{#if:{{{glotto|}}}|{{#if:{{{glottorefname|}}}{{{glottoname|}}}|<!--ok-->
|{{#switch: {{lc:{{{glotto}}}}} |none = |spurious =
|#default = [[Category:Articles with unnamed Glottolog code]]}}}}}}<!--
-->{{#if:{{{glotto2|}}}|{{#if:{{{glottoname2|}}}{{{glottorefname2|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#if:{{{glotto3|}}}|{{#if:{{{glottoname3|}}}{{{glottorefname3|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#if:{{{glotto4|}}}|{{#if:{{{glottoname4|}}}{{{glottorefname4|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#if:{{{glotto5|}}}|{{#if:{{{glottoname5|}}}{{{glottorefname5|}}}|<!--ok-->|[[Category:Articles with unnamed Glottolog code]]}}}}<!--
-->{{#ifeq:{{Str index|{{{map|}}}|1}}|[|[[Category:Ill-formatted infobox-language images]]|<!--ok-->}}<!--
-->{{#ifeq:{{Str index|{{{map2|}}}|1}}|[|[[Category:Ill-formatted infobox-language images]]|<!--ok-->}}<!--
-->{{#ifeq:{{Str index|{{{image|}}}|1}}|[|[[Category:Ill-formatted infobox-language images]]|<!--ok-->}}<!--
-->{{#if:{{{iso2|}}}{{{iso2b|}}}{{{iso2t|}}}|[[Category:Languages with ISO 639-2 code]]|<!--ok-->}}<!--
-->{{#if:{{{iso1|}}}|[[Category:Languages with ISO 639-1 code]]|<!--ok-->}}<!--
-->{{#if:{{{speakers|}}}|{{#ifeq:{{{speakers|}}}|?|{{#if:{{{ref|}}}|[[Category:Language articles with speakers set to 'unknown' despite a reference]]|{{#ifeq:{{{isoexception|}}}|dialect|[[Category:Dialect articles with speakers set to 'unknown']]|[[Category:Language articles with speakers set to 'unknown']]}}}}|{{#ifeq:{{{speakers|}}}|none|{{#ifeq:{{lc:{{{familycolor|}}}}}|pidgin|<!--ok: pidgins don't have native speakers-->|[[Category:Language articles with speakers set to 'none']]}}|{{#if:{{{ref|}}}|<!--ok-->|[[Category:Language articles without reference field]]}}}}}}}}<!--
-->{{#if:{{{extinct|}}}{{{era|}}}|{{#if:{{{ref|}}}|<!--ok-->|{{#ifeq:{{{extinct}}}|?|<!--ok-->|[[Category:Language articles with unreferenced extinction date]]}}}}}}<!--
-->{{#if:{{{boxsize|}}}|}}<!--
-->{{#if:{{{glotto|}}}{{{glotto2|}}}{{{glotto3|}}}{{{glotto4|}}}{{{glotto5|}}}|<!--ok-->|[[Category:Language articles missing Glottolog code]]}}<!--
-->{{#ifeq:{{{iso3|}}}|none|{{#ifeq:{{{glotto|}}}|none|[[Category:Languages with neither ISO nor Glottolog code]]}}}}<!--
-->{{#ifeq:{{{iso3|}}}|none||{{#if:{{{iso3|}}}{{{lc1|}}}|{{#if:{{{ref|}}}|{{#switch: {{{ref}}} | e26 = | e25 = | e24 = | e23 = | e22 = | e21 = | e20 = | e19 = | e18 = | e17 = | e16 = | e15 = | e14 = | e13 = | e12 = | e11 = | e10 = | e09 = | e08 = | ne2007 = [[Category:Articles citing Nationalencyklopedin]] | ne2010 = [[Category:Articles citing Nationalencyklopedin]] | inali = [[Category:Articles citing INALI]] | linglist = [[Category:Articles citing Linguist List]] | aiatsis= [[Category:Articles citing AIATSIS]] | guthrie = [[Category:Articles citing Maho/Guthrie]] | = [[Category:Articles opting out of population reference]] | {{#if:{{{extinct|}}}{{{era|}}}|[[Category:Extinct ISO language articles citing sources other than Ethnologue]]|[[Category:ISO language articles citing sources other than Ethnologue]]}}}}}}}}}}<!--
Close wrapping {{main other}} for the categories:-->}}{{#invoke:Check for unknown parameters|check
|unknown={{main other|[[Category:Pages using infobox language with unknown parameters|_VALUE_{{PAGENAME}}]]}}
|preview=Page using [[Template:Infobox language]] with unknown parameter "_VALUE_"|ignoreblank=y| pushpin_map_args = y | acceptance | agency | aiatsis | aiatsis2 | aiatsis3 | aiatsis4 | aiatsis5 | aiatsis6 | aiatsisname | aiatsisname2 | aiatsisname3 | aiatsisname4 | aiatsisname5 | aiatsisname6 | altname | ancestor | ancestor2 | ancestor3 | ancestor4 | ancestor5 | ancestor6 | ancestor7 | ancestor8 | ancestor9 | ancestor10 | ancestor11 | ancestor12 | ancestor13 | ancestor14 | ancestor15 | boxsize | coordinates | created | creator | date | dateprefix | development_body | dia1 | dia2 | dia3 | dia4 | dia5 | dia6 | dia7 | dia8 | dia9 | dia10 | dia11 | dia12 | dia13 | dia14 | dia15 | dia16 | dia17 | dia18 | dia19 | dia20 | dia21 | dia22 | dia23 | dia24 | dia25 | dia26 | dia27 | dia28 | dia29 | dia30 | dia31 | dia32 | dia33 | dia34 | dia35 | dia36 | dia37 | dia38 | dia39 | dia40 | dialect_label | dialects | ELP | ELP2 | ELP3 | ELP4 | ELP5 | ELP6 | ELPname | ELPname2 | ELPname3 | ELPname4 | ELPname5 | ELPname6 | era | ethnicity | extinct | fam1 | fam2 | fam3 | fam4 | fam5 | fam6 | fam7 | fam8 | fam9 | fam10 | fam11 | fam12 | fam13 | fam14 | fam15 | family | familycolor | fontcolor | glotto | glotto2 | glotto3 | glotto4 | glotto5 | glottoname | glottoname2 | glottoname3 | glottoname4 | glottoname5 | glottopedia | glottorefname | glottorefname2 | glottorefname3 | glottorefname4 | glottorefname5 | guthrie | ietf | image | imagealt | imagecaption | imagescale | image_class | iso1 | iso1comment | iso2 | iso2b | iso2comment | iso2t | iso3 | iso3comment | iso6 | isoexception | lc1 | lc2 | lc3 | lc4 | lc5 | lc6 | lc7 | lc8 | lc9 | lc10 | lc11 | lc12 | lc13 | lc14 | lc15 | lc16 | lc17 | lc18 | lc19 | lc20 | lc21 | lc22 | lc23 | lc24 | lc25 | lc26 | lc27 | lc28 | lc29 | lc30 | lc31 | lc32 | lc33 | lc34 | lc35 | lc36 | lc37 | lc38 | lc39 | lc40 | ld1 | ld2 | ld3 | ld4 | ld5 | ld6 | ld7 | ld8 | ld9 | ld10 | ld11 | ld12 | ld13 | ld14 | ld15 | ld16 | ld17 | ld18 | ld19 | ld20 | ld21 | ld22 | ld23 | ld24 | ld25 | ld26 | ld27 | ld28 | ld29 | ld30 | ld31 | ld32 | ld33 | ld34 | ld35 | ld36 | ld37 | ld38 | ld39 | ld40 | linglist | linglist2 | linglist3 | linglist4 | linglist5 | linglist6 | lingname | lingname2 | lingname3 | lingname4 | lingname5 | lingname6 | lingua | lingua2 | lingua3 | lingua4 | lingua5 | lingua6 | lingua7 | lingua8 | lingua9 | lingua10 | linguaname | linguaname2 | linguaname3 | linguaname4 | linguaname5 | linguaname6 | linguaname7 | linguaname8 | linguaname9 | linguaname10 | listclass | liststyle | map | map2 | mapalt | mapalt2 | mapcaption | mapcaption2 | map_class | map_class2 | mapscale | minority | module | name | nation | nativename | native_to | notice | notice2 | official | posteriori | pronunciation | protoname | qid | ref | refname | region | revived | revived-cat | revived-category | script | setting | sign | signers | speakers | speakers_label | speakers2 | stand1 | stand2 | stand3 | stand4 | stand5 | stand6 | standards | state | states }}<templatestyles src="Template:Infobox/styles-images.css" />{{#invoke:Check for conflicting parameters|check
| template = [[Template:Infobox language]]
| cat = {{main other|Category:Pages using infobox language with conflicting parameters}}
| states; state
| signers; speakers
| revived-category; revived-cat
| protoname; ancestor
| listclass; liststyle
| nation; official
}}<noinclude>
{{documentation}}
</noinclude>
6v6zqb19lulf8y819fb3aups5m0pylv
Module:Exponential search
828
2409
32835
2023-02-10T20:10:53Z
en>Uzume
0
strict
32835
Scribunto
text/plain
-- This module provides a generic exponential search algorithm.
require[[strict]]
local checkType = require('libraryUtil').checkType
local floor = math.floor
local function midPoint(lower, upper)
return floor(lower + (upper - lower) / 2)
end
local function search(testFunc, i, lower, upper)
if testFunc(i) then
if i + 1 == upper then
return i
end
lower = i
if upper then
i = midPoint(lower, upper)
else
i = i * 2
end
return search(testFunc, i, lower, upper)
else
upper = i
i = midPoint(lower, upper)
return search(testFunc, i, lower, upper)
end
end
return function (testFunc, init)
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, init, 'number', true)
if init and (init < 1 or init ~= floor(init) or init == math.huge) then
error(string.format(
"invalid init value '%s' detected in argument #2 to " ..
"'Exponential search' (init value must be a positive integer)",
tostring(init)
), 2)
end
init = init or 2
if not testFunc(1) then
return nil
end
return search(testFunc, init, 1, nil)
end
jqqi8l27tb73lglksbukg2g3bzt3fmv
32836
32835
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Exponential_search]]
32835
Scribunto
text/plain
-- This module provides a generic exponential search algorithm.
require[[strict]]
local checkType = require('libraryUtil').checkType
local floor = math.floor
local function midPoint(lower, upper)
return floor(lower + (upper - lower) / 2)
end
local function search(testFunc, i, lower, upper)
if testFunc(i) then
if i + 1 == upper then
return i
end
lower = i
if upper then
i = midPoint(lower, upper)
else
i = i * 2
end
return search(testFunc, i, lower, upper)
else
upper = i
i = midPoint(lower, upper)
return search(testFunc, i, lower, upper)
end
end
return function (testFunc, init)
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, init, 'number', true)
if init and (init < 1 or init ~= floor(init) or init == math.huge) then
error(string.format(
"invalid init value '%s' detected in argument #2 to " ..
"'Exponential search' (init value must be a positive integer)",
tostring(init)
), 2)
end
init = init or 2
if not testFunc(1) then
return nil
end
return search(testFunc, init, 1, nil)
end
jqqi8l27tb73lglksbukg2g3bzt3fmv
Module:Unicode data/scripts
828
2410
32837
2026-09-16T19:41:41Z
en>Drmccreedy
0
Update for v18.0
32837
Scribunto
text/plain
--[=[
-- Official Unicode script values for individual codepoints and ranges of
-- codepoints.
-- https://www.unicode.org/Public/UCD/latest/ucd/Scripts.txt provided
-- the script names, and https://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt
-- provided script codes corresponding to the names (see [[Script (Unicode)]]).
--]=]
local data = {
singles = {
[0x000AA] = "Latn",
[0x000BA] = "Latn",
[0x000D7] = "Zyyy",
[0x000F7] = "Zyyy",
[0x00374] = "Zyyy",
[0x0037E] = "Zyyy",
[0x0037F] = "Grek",
[0x00384] = "Grek",
[0x00385] = "Zyyy",
[0x00386] = "Grek",
[0x00387] = "Zyyy",
[0x0038C] = "Grek",
[0x00605] = "Zyyy",
[0x0060C] = "Zyyy",
[0x0061B] = "Zyyy",
[0x0061F] = "Zyyy",
[0x00640] = "Zyyy",
[0x00670] = "Zinh",
[0x006DD] = "Zyyy",
[0x0085E] = "Mand",
[0x008E2] = "Zyyy",
[0x009B2] = "Beng",
[0x009D7] = "Beng",
[0x00A3C] = "Guru",
[0x00A51] = "Guru",
[0x00A5E] = "Guru",
[0x00AD0] = "Gujr",
[0x00B9C] = "Taml",
[0x00BD0] = "Taml",
[0x00BD7] = "Taml",
[0x00DBD] = "Sinh",
[0x00DCA] = "Sinh",
[0x00DD6] = "Sinh",
[0x00E3F] = "Zyyy",
[0x00E84] = "Laoo",
[0x00EA5] = "Laoo",
[0x00EC6] = "Laoo",
[0x010C7] = "Geor",
[0x010CD] = "Geor",
[0x010FB] = "Zyyy",
[0x01258] = "Ethi",
[0x012C0] = "Ethi",
[0x0171F] = "Tglg",
[0x01804] = "Mong",
[0x01805] = "Zyyy",
[0x01940] = "Limb",
[0x01CD3] = "Zyyy",
[0x01CE1] = "Zyyy",
[0x01CED] = "Zinh",
[0x01CF4] = "Zinh",
[0x01CFA] = "Zyyy",
[0x01D2B] = "Cyrl",
[0x01D78] = "Cyrl",
[0x01DBF] = "Grek",
[0x01F59] = "Grek",
[0x01F5B] = "Grek",
[0x01F5D] = "Grek",
[0x02071] = "Latn",
[0x0207F] = "Latn",
[0x02126] = "Grek",
[0x02132] = "Latn",
[0x0214E] = "Latn",
[0x02D27] = "Geor",
[0x02D2D] = "Geor",
[0x02D7F] = "Tfng",
[0x03005] = "Hani",
[0x03006] = "Zyyy",
[0x03007] = "Hani",
[0x030A0] = "Zyyy",
[0x031EF] = "Zyyy",
[0x032FF] = "Zyyy",
[0x0A7E2] = "Latn",
[0x0A92E] = "Zyyy",
[0x0A92F] = "Kali",
[0x0A95F] = "Rjng",
[0x0A9CF] = "Zyyy",
[0x0AB5B] = "Zyyy",
[0x0AB65] = "Grek",
[0x0FB3E] = "Hebr",
[0x0FEFF] = "Zyyy",
[0x0FF70] = "Zyyy",
[0x101A0] = "Grek",
[0x101FD] = "Zinh",
[0x102E0] = "Zinh",
[0x1039F] = "Ugar",
[0x1056F] = "Aghb",
[0x10808] = "Cprt",
[0x1083C] = "Cprt",
[0x1083F] = "Cprt",
[0x1091F] = "Phnx",
[0x1093F] = "Lydi",
[0x1107F] = "Brah",
[0x110CD] = "Kthi",
[0x11288] = "Mult",
[0x1133B] = "Zinh",
[0x11350] = "Gran",
[0x11357] = "Gran",
[0x1138B] = "Tutg",
[0x1138E] = "Tutg",
[0x113C2] = "Tutg",
[0x113C5] = "Tutg",
[0x118FF] = "Wara",
[0x11909] = "Diak",
[0x11D3A] = "Gonm",
[0x11FB0] = "Lisu",
[0x11FFF] = "Taml",
[0x16FE0] = "Tang",
[0x16FE1] = "Nshu",
[0x16FE4] = "Kits",
[0x18CFF] = "Kits",
[0x1B000] = "Kana",
[0x1B123] = "Hira",
[0x1B132] = "Hira",
[0x1B155] = "Kana",
[0x1D4A2] = "Zyyy",
[0x1D4BB] = "Zyyy",
[0x1D546] = "Zyyy",
[0x1E08F] = "Cyrl",
[0x1E2FF] = "Wcho",
[0x1E5FF] = "Onao",
[0x1EE24] = "Arab",
[0x1EE27] = "Arab",
[0x1EE39] = "Arab",
[0x1EE3B] = "Arab",
[0x1EE42] = "Arab",
[0x1EE47] = "Arab",
[0x1EE49] = "Arab",
[0x1EE4B] = "Arab",
[0x1EE54] = "Arab",
[0x1EE57] = "Arab",
[0x1EE59] = "Arab",
[0x1EE5B] = "Arab",
[0x1EE5D] = "Arab",
[0x1EE5F] = "Arab",
[0x1EE64] = "Arab",
[0x1EE7E] = "Arab",
[0x1F200] = "Hira",
[0x1FAC8] = "Zyyy",
[0xE0001] = "Zyyy",
},
ranges = {
{ 0x00000, 0x00040, "Zyyy" },
{ 0x00041, 0x0005A, "Latn" },
{ 0x0005B, 0x00060, "Zyyy" },
{ 0x00061, 0x0007A, "Latn" },
{ 0x0007B, 0x000A9, "Zyyy" },
{ 0x000AB, 0x000B9, "Zyyy" },
{ 0x000BB, 0x000BF, "Zyyy" },
{ 0x000C0, 0x000D6, "Latn" },
{ 0x000D8, 0x000F6, "Latn" },
{ 0x000F8, 0x002B8, "Latn" },
{ 0x002B9, 0x002DF, "Zyyy" },
{ 0x002E0, 0x002E4, "Latn" },
{ 0x002E5, 0x002E9, "Zyyy" },
{ 0x002EA, 0x002EB, "Bopo" },
{ 0x002EC, 0x002FF, "Zyyy" },
{ 0x00300, 0x0036F, "Zinh" },
{ 0x00370, 0x00373, "Grek" },
{ 0x00375, 0x00377, "Grek" },
{ 0x0037A, 0x0037D, "Grek" },
{ 0x00388, 0x0038A, "Grek" },
{ 0x0038E, 0x003A1, "Grek" },
{ 0x003A3, 0x003E1, "Grek" },
{ 0x003E2, 0x003EF, "Copt" },
{ 0x003F0, 0x003FF, "Grek" },
{ 0x00400, 0x00484, "Cyrl" },
{ 0x00485, 0x00486, "Zinh" },
{ 0x00487, 0x0052F, "Cyrl" },
{ 0x00531, 0x00556, "Armn" },
{ 0x00558, 0x0058F, "Armn" },
{ 0x00591, 0x005C9, "Hebr" },
{ 0x005D0, 0x005EA, "Hebr" },
{ 0x005EF, 0x005F4, "Hebr" },
{ 0x00600, 0x00604, "Arab" },
{ 0x00606, 0x0060B, "Arab" },
{ 0x0060D, 0x0061A, "Arab" },
{ 0x0061C, 0x0061E, "Arab" },
{ 0x00620, 0x0063F, "Arab" },
{ 0x00641, 0x0064A, "Arab" },
{ 0x0064B, 0x00655, "Zinh" },
{ 0x00656, 0x0066F, "Arab" },
{ 0x00671, 0x006DC, "Arab" },
{ 0x006DE, 0x006FF, "Arab" },
{ 0x00700, 0x0070D, "Syrc" },
{ 0x0070F, 0x0074A, "Syrc" },
{ 0x0074D, 0x0074F, "Syrc" },
{ 0x00750, 0x0077F, "Arab" },
{ 0x00780, 0x007B1, "Thaa" },
{ 0x007C0, 0x007FA, "Nkoo" },
{ 0x007FD, 0x007FF, "Nkoo" },
{ 0x00800, 0x0082D, "Samr" },
{ 0x00830, 0x0083E, "Samr" },
{ 0x00840, 0x0085B, "Mand" },
{ 0x00860, 0x0086A, "Syrc" },
{ 0x00870, 0x00891, "Arab" },
{ 0x00897, 0x008E1, "Arab" },
{ 0x008E3, 0x008FF, "Arab" },
{ 0x00900, 0x00950, "Deva" },
{ 0x00951, 0x00954, "Zinh" },
{ 0x00955, 0x00963, "Deva" },
{ 0x00964, 0x00965, "Zyyy" },
{ 0x00966, 0x0097F, "Deva" },
{ 0x00980, 0x00983, "Beng" },
{ 0x00985, 0x0098C, "Beng" },
{ 0x0098F, 0x00990, "Beng" },
{ 0x00993, 0x009A8, "Beng" },
{ 0x009AA, 0x009B0, "Beng" },
{ 0x009B6, 0x009B9, "Beng" },
{ 0x009BC, 0x009C4, "Beng" },
{ 0x009C7, 0x009C8, "Beng" },
{ 0x009CB, 0x009CE, "Beng" },
{ 0x009DC, 0x009DD, "Beng" },
{ 0x009DF, 0x009E3, "Beng" },
{ 0x009E6, 0x009FE, "Beng" },
{ 0x00A01, 0x00A03, "Guru" },
{ 0x00A05, 0x00A0A, "Guru" },
{ 0x00A0F, 0x00A10, "Guru" },
{ 0x00A13, 0x00A28, "Guru" },
{ 0x00A2A, 0x00A30, "Guru" },
{ 0x00A32, 0x00A33, "Guru" },
{ 0x00A35, 0x00A36, "Guru" },
{ 0x00A38, 0x00A39, "Guru" },
{ 0x00A3E, 0x00A42, "Guru" },
{ 0x00A47, 0x00A48, "Guru" },
{ 0x00A4B, 0x00A4D, "Guru" },
{ 0x00A59, 0x00A5C, "Guru" },
{ 0x00A66, 0x00A76, "Guru" },
{ 0x00A81, 0x00A83, "Gujr" },
{ 0x00A85, 0x00A8D, "Gujr" },
{ 0x00A8F, 0x00A91, "Gujr" },
{ 0x00A93, 0x00AA8, "Gujr" },
{ 0x00AAA, 0x00AB0, "Gujr" },
{ 0x00AB2, 0x00AB3, "Gujr" },
{ 0x00AB5, 0x00AB9, "Gujr" },
{ 0x00ABC, 0x00AC5, "Gujr" },
{ 0x00AC7, 0x00AC9, "Gujr" },
{ 0x00ACB, 0x00ACD, "Gujr" },
{ 0x00AE0, 0x00AE3, "Gujr" },
{ 0x00AE6, 0x00AF1, "Gujr" },
{ 0x00AF9, 0x00AFF, "Gujr" },
{ 0x00B01, 0x00B03, "Orya" },
{ 0x00B05, 0x00B0C, "Orya" },
{ 0x00B0F, 0x00B10, "Orya" },
{ 0x00B13, 0x00B28, "Orya" },
{ 0x00B2A, 0x00B30, "Orya" },
{ 0x00B32, 0x00B33, "Orya" },
{ 0x00B35, 0x00B39, "Orya" },
{ 0x00B3C, 0x00B44, "Orya" },
{ 0x00B47, 0x00B48, "Orya" },
{ 0x00B4B, 0x00B4D, "Orya" },
{ 0x00B53, 0x00B57, "Orya" },
{ 0x00B5C, 0x00B5D, "Orya" },
{ 0x00B5F, 0x00B63, "Orya" },
{ 0x00B66, 0x00B77, "Orya" },
{ 0x00B82, 0x00B83, "Taml" },
{ 0x00B85, 0x00B8A, "Taml" },
{ 0x00B8E, 0x00B90, "Taml" },
{ 0x00B92, 0x00B95, "Taml" },
{ 0x00B99, 0x00B9A, "Taml" },
{ 0x00B9E, 0x00B9F, "Taml" },
{ 0x00BA3, 0x00BA4, "Taml" },
{ 0x00BA8, 0x00BAA, "Taml" },
{ 0x00BAE, 0x00BB9, "Taml" },
{ 0x00BBE, 0x00BC2, "Taml" },
{ 0x00BC6, 0x00BC8, "Taml" },
{ 0x00BCA, 0x00BCD, "Taml" },
{ 0x00BE6, 0x00BFA, "Taml" },
{ 0x00C00, 0x00C0C, "Telu" },
{ 0x00C0E, 0x00C10, "Telu" },
{ 0x00C12, 0x00C28, "Telu" },
{ 0x00C2A, 0x00C39, "Telu" },
{ 0x00C3C, 0x00C44, "Telu" },
{ 0x00C46, 0x00C48, "Telu" },
{ 0x00C4A, 0x00C4D, "Telu" },
{ 0x00C55, 0x00C56, "Telu" },
{ 0x00C58, 0x00C5A, "Telu" },
{ 0x00C5C, 0x00C5D, "Telu" },
{ 0x00C60, 0x00C63, "Telu" },
{ 0x00C66, 0x00C6F, "Telu" },
{ 0x00C77, 0x00C7F, "Telu" },
{ 0x00C80, 0x00C8C, "Knda" },
{ 0x00C8E, 0x00C90, "Knda" },
{ 0x00C92, 0x00CA8, "Knda" },
{ 0x00CAA, 0x00CB3, "Knda" },
{ 0x00CB5, 0x00CB9, "Knda" },
{ 0x00CBC, 0x00CC4, "Knda" },
{ 0x00CC6, 0x00CC8, "Knda" },
{ 0x00CCA, 0x00CCD, "Knda" },
{ 0x00CD5, 0x00CD6, "Knda" },
{ 0x00CDC, 0x00CDE, "Knda" },
{ 0x00CE0, 0x00CE3, "Knda" },
{ 0x00CE6, 0x00CEF, "Knda" },
{ 0x00CF1, 0x00CF3, "Knda" },
{ 0x00D00, 0x00D0C, "Mlym" },
{ 0x00D0E, 0x00D10, "Mlym" },
{ 0x00D12, 0x00D44, "Mlym" },
{ 0x00D46, 0x00D48, "Mlym" },
{ 0x00D4A, 0x00D4F, "Mlym" },
{ 0x00D54, 0x00D63, "Mlym" },
{ 0x00D66, 0x00D7F, "Mlym" },
{ 0x00D81, 0x00D83, "Sinh" },
{ 0x00D85, 0x00D96, "Sinh" },
{ 0x00D9A, 0x00DB1, "Sinh" },
{ 0x00DB3, 0x00DBB, "Sinh" },
{ 0x00DC0, 0x00DC6, "Sinh" },
{ 0x00DCF, 0x00DD4, "Sinh" },
{ 0x00DD8, 0x00DDF, "Sinh" },
{ 0x00DE6, 0x00DEF, "Sinh" },
{ 0x00DF2, 0x00DF4, "Sinh" },
{ 0x00E01, 0x00E3A, "Thai" },
{ 0x00E40, 0x00E5B, "Thai" },
{ 0x00E81, 0x00E82, "Laoo" },
{ 0x00E86, 0x00E8A, "Laoo" },
{ 0x00E8C, 0x00EA3, "Laoo" },
{ 0x00EA7, 0x00EBD, "Laoo" },
{ 0x00EC0, 0x00EC4, "Laoo" },
{ 0x00EC8, 0x00ECE, "Laoo" },
{ 0x00ED0, 0x00ED9, "Laoo" },
{ 0x00EDC, 0x00EDF, "Laoo" },
{ 0x00F00, 0x00F47, "Tibt" },
{ 0x00F49, 0x00F6C, "Tibt" },
{ 0x00F71, 0x00F97, "Tibt" },
{ 0x00F99, 0x00FBC, "Tibt" },
{ 0x00FBE, 0x00FCC, "Tibt" },
{ 0x00FCE, 0x00FD4, "Tibt" },
{ 0x00FD5, 0x00FD8, "Zyyy" },
{ 0x00FD9, 0x00FDA, "Tibt" },
{ 0x01000, 0x0109F, "Mymr" },
{ 0x010A0, 0x010C5, "Geor" },
{ 0x010D0, 0x010FA, "Geor" },
{ 0x010FC, 0x010FF, "Geor" },
{ 0x01100, 0x011FF, "Hang" },
{ 0x01200, 0x01248, "Ethi" },
{ 0x0124A, 0x0124D, "Ethi" },
{ 0x01250, 0x01256, "Ethi" },
{ 0x0125A, 0x0125D, "Ethi" },
{ 0x01260, 0x01288, "Ethi" },
{ 0x0128A, 0x0128D, "Ethi" },
{ 0x01290, 0x012B0, "Ethi" },
{ 0x012B2, 0x012B5, "Ethi" },
{ 0x012B8, 0x012BE, "Ethi" },
{ 0x012C2, 0x012C5, "Ethi" },
{ 0x012C8, 0x012D6, "Ethi" },
{ 0x012D8, 0x01310, "Ethi" },
{ 0x01312, 0x01315, "Ethi" },
{ 0x01318, 0x0135A, "Ethi" },
{ 0x0135D, 0x0137C, "Ethi" },
{ 0x01380, 0x01399, "Ethi" },
{ 0x013A0, 0x013F5, "Cher" },
{ 0x013F8, 0x013FD, "Cher" },
{ 0x01400, 0x0167F, "Cans" },
{ 0x01680, 0x0169C, "Ogam" },
{ 0x016A0, 0x016EA, "Runr" },
{ 0x016EB, 0x016ED, "Zyyy" },
{ 0x016EE, 0x016F8, "Runr" },
{ 0x01700, 0x01715, "Tglg" },
{ 0x01720, 0x01734, "Hano" },
{ 0x01735, 0x01736, "Zyyy" },
{ 0x01740, 0x01753, "Buhd" },
{ 0x01760, 0x0176C, "Tagb" },
{ 0x0176E, 0x01770, "Tagb" },
{ 0x01772, 0x01773, "Tagb" },
{ 0x01780, 0x017DD, "Khmr" },
{ 0x017E0, 0x017E9, "Khmr" },
{ 0x017F0, 0x017F9, "Khmr" },
{ 0x01800, 0x01801, "Mong" },
{ 0x01802, 0x01803, "Zyyy" },
{ 0x01806, 0x01819, "Mong" },
{ 0x01820, 0x01878, "Mong" },
{ 0x01880, 0x018AA, "Mong" },
{ 0x018B0, 0x018F5, "Cans" },
{ 0x01900, 0x0191E, "Limb" },
{ 0x01920, 0x0192B, "Limb" },
{ 0x01930, 0x0193B, "Limb" },
{ 0x01944, 0x0194F, "Limb" },
{ 0x01950, 0x0196D, "Tale" },
{ 0x01970, 0x01974, "Tale" },
{ 0x01980, 0x019AB, "Talu" },
{ 0x019B0, 0x019C9, "Talu" },
{ 0x019D0, 0x019DA, "Talu" },
{ 0x019DE, 0x019DF, "Talu" },
{ 0x019E0, 0x019FF, "Khmr" },
{ 0x01A00, 0x01A1B, "Bugi" },
{ 0x01A1E, 0x01A1F, "Bugi" },
{ 0x01A20, 0x01A5E, "Lana" },
{ 0x01A60, 0x01A7C, "Lana" },
{ 0x01A7F, 0x01A89, "Lana" },
{ 0x01A90, 0x01A99, "Lana" },
{ 0x01AA0, 0x01AAD, "Lana" },
{ 0x01AB0, 0x01AF0, "Zinh" },
{ 0x01B00, 0x01B4C, "Bali" },
{ 0x01B4E, 0x01B7F, "Bali" },
{ 0x01B80, 0x01BBF, "Sund" },
{ 0x01BC0, 0x01BF3, "Batk" },
{ 0x01BFC, 0x01BFF, "Batk" },
{ 0x01C00, 0x01C37, "Lepc" },
{ 0x01C3B, 0x01C49, "Lepc" },
{ 0x01C4D, 0x01C4F, "Lepc" },
{ 0x01C50, 0x01C7F, "Olck" },
{ 0x01C80, 0x01C8A, "Cyrl" },
{ 0x01C90, 0x01CBA, "Geor" },
{ 0x01CBD, 0x01CBF, "Geor" },
{ 0x01CC0, 0x01CC7, "Sund" },
{ 0x01CD0, 0x01CD2, "Zinh" },
{ 0x01CD4, 0x01CE0, "Zinh" },
{ 0x01CE2, 0x01CE8, "Zinh" },
{ 0x01CE9, 0x01CEC, "Zyyy" },
{ 0x01CEE, 0x01CF3, "Zyyy" },
{ 0x01CF5, 0x01CF7, "Zyyy" },
{ 0x01CF8, 0x01CF9, "Zinh" },
{ 0x01D00, 0x01D25, "Latn" },
{ 0x01D26, 0x01D2A, "Grek" },
{ 0x01D2C, 0x01D5C, "Latn" },
{ 0x01D5D, 0x01D61, "Grek" },
{ 0x01D62, 0x01D65, "Latn" },
{ 0x01D66, 0x01D6A, "Grek" },
{ 0x01D6B, 0x01D77, "Latn" },
{ 0x01D79, 0x01DBE, "Latn" },
{ 0x01DC0, 0x01DFF, "Zinh" },
{ 0x01E00, 0x01EFF, "Latn" },
{ 0x01F00, 0x01F15, "Grek" },
{ 0x01F18, 0x01F1D, "Grek" },
{ 0x01F20, 0x01F45, "Grek" },
{ 0x01F48, 0x01F4D, "Grek" },
{ 0x01F50, 0x01F57, "Grek" },
{ 0x01F5F, 0x01F7D, "Grek" },
{ 0x01F80, 0x01FB4, "Grek" },
{ 0x01FB6, 0x01FC4, "Grek" },
{ 0x01FC6, 0x01FD3, "Grek" },
{ 0x01FD6, 0x01FDB, "Grek" },
{ 0x01FDD, 0x01FEF, "Grek" },
{ 0x01FF2, 0x01FF4, "Grek" },
{ 0x01FF6, 0x01FFE, "Grek" },
{ 0x02000, 0x0200B, "Zyyy" },
{ 0x0200C, 0x0200D, "Zinh" },
{ 0x0200E, 0x02064, "Zyyy" },
{ 0x02066, 0x02070, "Zyyy" },
{ 0x02074, 0x0207E, "Zyyy" },
{ 0x02080, 0x0208F, "Zyyy" },
{ 0x02090, 0x0209F, "Latn" },
{ 0x020A0, 0x020C4, "Zyyy" },
{ 0x020D0, 0x020F0, "Zinh" },
{ 0x02100, 0x02125, "Zyyy" },
{ 0x02127, 0x02129, "Zyyy" },
{ 0x0212A, 0x0212B, "Latn" },
{ 0x0212C, 0x02131, "Zyyy" },
{ 0x02133, 0x0214D, "Zyyy" },
{ 0x0214F, 0x0215F, "Zyyy" },
{ 0x02160, 0x02188, "Latn" },
{ 0x02189, 0x0218B, "Zyyy" },
{ 0x02190, 0x02429, "Zyyy" },
{ 0x02440, 0x0244A, "Zyyy" },
{ 0x02460, 0x027FF, "Zyyy" },
{ 0x02800, 0x028FF, "Brai" },
{ 0x02900, 0x02B73, "Zyyy" },
{ 0x02B76, 0x02BFF, "Zyyy" },
{ 0x02C00, 0x02C5F, "Glag" },
{ 0x02C60, 0x02C7F, "Latn" },
{ 0x02C80, 0x02CF3, "Copt" },
{ 0x02CF9, 0x02CFF, "Copt" },
{ 0x02D00, 0x02D25, "Geor" },
{ 0x02D30, 0x02D67, "Tfng" },
{ 0x02D6F, 0x02D70, "Tfng" },
{ 0x02D80, 0x02D96, "Ethi" },
{ 0x02DA0, 0x02DA6, "Ethi" },
{ 0x02DA8, 0x02DAE, "Ethi" },
{ 0x02DB0, 0x02DB6, "Ethi" },
{ 0x02DB8, 0x02DBE, "Ethi" },
{ 0x02DC0, 0x02DC6, "Ethi" },
{ 0x02DC8, 0x02DCE, "Ethi" },
{ 0x02DD0, 0x02DD6, "Ethi" },
{ 0x02DD8, 0x02DDE, "Ethi" },
{ 0x02DE0, 0x02DFF, "Cyrl" },
{ 0x02E00, 0x02E5D, "Zyyy" },
{ 0x02E60, 0x02E63, "Zyyy" },
{ 0x02E80, 0x02E99, "Hani" },
{ 0x02E9B, 0x02EF3, "Hani" },
{ 0x02F00, 0x02FD5, "Hani" },
{ 0x02FF0, 0x03004, "Zyyy" },
{ 0x03008, 0x03020, "Zyyy" },
{ 0x03021, 0x03029, "Hani" },
{ 0x0302A, 0x0302D, "Zinh" },
{ 0x0302E, 0x0302F, "Hang" },
{ 0x03030, 0x03037, "Zyyy" },
{ 0x03038, 0x0303B, "Hani" },
{ 0x0303C, 0x0303F, "Zyyy" },
{ 0x03041, 0x03096, "Hira" },
{ 0x03099, 0x0309A, "Zinh" },
{ 0x0309B, 0x0309C, "Zyyy" },
{ 0x0309D, 0x0309F, "Hira" },
{ 0x030A1, 0x030FA, "Kana" },
{ 0x030FB, 0x030FC, "Zyyy" },
{ 0x030FD, 0x030FF, "Kana" },
{ 0x03105, 0x0312F, "Bopo" },
{ 0x03131, 0x0318E, "Hang" },
{ 0x03190, 0x0319F, "Zyyy" },
{ 0x031A0, 0x031BF, "Bopo" },
{ 0x031C0, 0x031E5, "Zyyy" },
{ 0x031F0, 0x031FF, "Kana" },
{ 0x03200, 0x0321E, "Hang" },
{ 0x03220, 0x0325F, "Zyyy" },
{ 0x03260, 0x0327E, "Hang" },
{ 0x0327F, 0x032CF, "Zyyy" },
{ 0x032D0, 0x032FE, "Kana" },
{ 0x03300, 0x03357, "Kana" },
{ 0x03358, 0x033FF, "Zyyy" },
{ 0x03400, 0x04DBF, "Hani" },
{ 0x04DC0, 0x04DFF, "Zyyy" },
{ 0x04E00, 0x09FFF, "Hani" },
{ 0x0A000, 0x0A48C, "Yiii" },
{ 0x0A490, 0x0A4C6, "Yiii" },
{ 0x0A4D0, 0x0A4FF, "Lisu" },
{ 0x0A500, 0x0A62B, "Vaii" },
{ 0x0A640, 0x0A69F, "Cyrl" },
{ 0x0A6A0, 0x0A6F7, "Bamu" },
{ 0x0A700, 0x0A721, "Zyyy" },
{ 0x0A722, 0x0A787, "Latn" },
{ 0x0A788, 0x0A78A, "Zyyy" },
{ 0x0A78B, 0x0A7DD, "Latn" },
{ 0x0A7F1, 0x0A7FF, "Latn" },
{ 0x0A800, 0x0A82C, "Sylo" },
{ 0x0A830, 0x0A839, "Zyyy" },
{ 0x0A840, 0x0A877, "Phag" },
{ 0x0A880, 0x0A8C5, "Saur" },
{ 0x0A8CE, 0x0A8D9, "Saur" },
{ 0x0A8E0, 0x0A8FF, "Deva" },
{ 0x0A900, 0x0A92D, "Kali" },
{ 0x0A930, 0x0A953, "Rjng" },
{ 0x0A960, 0x0A97C, "Hang" },
{ 0x0A980, 0x0A9CD, "Java" },
{ 0x0A9D0, 0x0A9D9, "Java" },
{ 0x0A9DE, 0x0A9DF, "Java" },
{ 0x0A9E0, 0x0A9FE, "Mymr" },
{ 0x0AA00, 0x0AA36, "Cham" },
{ 0x0AA40, 0x0AA4D, "Cham" },
{ 0x0AA50, 0x0AA59, "Cham" },
{ 0x0AA5C, 0x0AA5F, "Cham" },
{ 0x0AA60, 0x0AA7F, "Mymr" },
{ 0x0AA80, 0x0AAC2, "Tavt" },
{ 0x0AADB, 0x0AADF, "Tavt" },
{ 0x0AAE0, 0x0AAF6, "Mtei" },
{ 0x0AB01, 0x0AB06, "Ethi" },
{ 0x0AB09, 0x0AB0E, "Ethi" },
{ 0x0AB11, 0x0AB16, "Ethi" },
{ 0x0AB20, 0x0AB26, "Ethi" },
{ 0x0AB28, 0x0AB2E, "Ethi" },
{ 0x0AB30, 0x0AB5A, "Latn" },
{ 0x0AB5C, 0x0AB64, "Latn" },
{ 0x0AB66, 0x0AB69, "Latn" },
{ 0x0AB6A, 0x0AB6B, "Zyyy" },
{ 0x0AB6C, 0x0AB6D, "Latn" },
{ 0x0AB70, 0x0ABBF, "Cher" },
{ 0x0ABC0, 0x0ABED, "Mtei" },
{ 0x0ABF0, 0x0ABF9, "Mtei" },
{ 0x0AC00, 0x0D7A3, "Hang" },
{ 0x0D7B0, 0x0D7C6, "Hang" },
{ 0x0D7CB, 0x0D7FB, "Hang" },
{ 0x0F900, 0x0FA6D, "Hani" },
{ 0x0FA70, 0x0FAD9, "Hani" },
{ 0x0FB00, 0x0FB06, "Latn" },
{ 0x0FB13, 0x0FB17, "Armn" },
{ 0x0FB1D, 0x0FB36, "Hebr" },
{ 0x0FB38, 0x0FB3C, "Hebr" },
{ 0x0FB40, 0x0FB41, "Hebr" },
{ 0x0FB43, 0x0FB44, "Hebr" },
{ 0x0FB46, 0x0FB4F, "Hebr" },
{ 0x0FB50, 0x0FD3D, "Arab" },
{ 0x0FD3E, 0x0FD3F, "Zyyy" },
{ 0x0FD40, 0x0FDCF, "Arab" },
{ 0x0FDF0, 0x0FDFF, "Arab" },
{ 0x0FE00, 0x0FE0F, "Zinh" },
{ 0x0FE10, 0x0FE19, "Zyyy" },
{ 0x0FE20, 0x0FE2D, "Zinh" },
{ 0x0FE2E, 0x0FE2F, "Cyrl" },
{ 0x0FE30, 0x0FE52, "Zyyy" },
{ 0x0FE54, 0x0FE66, "Zyyy" },
{ 0x0FE68, 0x0FE6B, "Zyyy" },
{ 0x0FE70, 0x0FE74, "Arab" },
{ 0x0FE76, 0x0FEFC, "Arab" },
{ 0x0FF01, 0x0FF20, "Zyyy" },
{ 0x0FF21, 0x0FF3A, "Latn" },
{ 0x0FF3B, 0x0FF40, "Zyyy" },
{ 0x0FF41, 0x0FF5A, "Latn" },
{ 0x0FF5B, 0x0FF65, "Zyyy" },
{ 0x0FF66, 0x0FF6F, "Kana" },
{ 0x0FF71, 0x0FF9D, "Kana" },
{ 0x0FF9E, 0x0FF9F, "Zyyy" },
{ 0x0FFA0, 0x0FFBE, "Hang" },
{ 0x0FFC2, 0x0FFC7, "Hang" },
{ 0x0FFCA, 0x0FFCF, "Hang" },
{ 0x0FFD2, 0x0FFD7, "Hang" },
{ 0x0FFDA, 0x0FFDC, "Hang" },
{ 0x0FFE0, 0x0FFE6, "Zyyy" },
{ 0x0FFE8, 0x0FFEE, "Zyyy" },
{ 0x0FFF9, 0x0FFFD, "Zyyy" },
{ 0x10000, 0x1000B, "Linb" },
{ 0x1000D, 0x10026, "Linb" },
{ 0x10028, 0x1003A, "Linb" },
{ 0x1003C, 0x1003D, "Linb" },
{ 0x1003F, 0x1004D, "Linb" },
{ 0x10050, 0x1005D, "Linb" },
{ 0x10080, 0x100FA, "Linb" },
{ 0x10100, 0x10102, "Zyyy" },
{ 0x10107, 0x10133, "Zyyy" },
{ 0x10137, 0x1013F, "Zyyy" },
{ 0x10140, 0x1018E, "Grek" },
{ 0x10190, 0x1019C, "Zyyy" },
{ 0x101D0, 0x101FC, "Zyyy" },
{ 0x10280, 0x1029C, "Lyci" },
{ 0x102A0, 0x102D0, "Cari" },
{ 0x102E1, 0x102FB, "Zyyy" },
{ 0x10300, 0x10323, "Ital" },
{ 0x1032D, 0x1032F, "Ital" },
{ 0x10330, 0x1034A, "Goth" },
{ 0x10350, 0x1037A, "Perm" },
{ 0x10380, 0x1039D, "Ugar" },
{ 0x103A0, 0x103C3, "Xpeo" },
{ 0x103C8, 0x103D5, "Xpeo" },
{ 0x10400, 0x1044F, "Dsrt" },
{ 0x10450, 0x1047F, "Shaw" },
{ 0x10480, 0x1049D, "Osma" },
{ 0x104A0, 0x104A9, "Osma" },
{ 0x104B0, 0x104D3, "Osge" },
{ 0x104D8, 0x104FB, "Osge" },
{ 0x10500, 0x10527, "Elba" },
{ 0x10530, 0x10563, "Aghb" },
{ 0x10570, 0x1057A, "Vith" },
{ 0x1057C, 0x1058A, "Vith" },
{ 0x1058C, 0x10592, "Vith" },
{ 0x10594, 0x10595, "Vith" },
{ 0x10597, 0x105A1, "Vith" },
{ 0x105A3, 0x105B1, "Vith" },
{ 0x105B3, 0x105B9, "Vith" },
{ 0x105BB, 0x105BC, "Vith" },
{ 0x105C0, 0x105F3, "Todr" },
{ 0x10600, 0x10736, "Lina" },
{ 0x10740, 0x10755, "Lina" },
{ 0x10760, 0x10767, "Lina" },
{ 0x10780, 0x10785, "Latn" },
{ 0x10787, 0x107B0, "Latn" },
{ 0x107B2, 0x107BF, "Latn" },
{ 0x10800, 0x10805, "Cprt" },
{ 0x1080A, 0x10835, "Cprt" },
{ 0x10837, 0x10838, "Cprt" },
{ 0x10840, 0x10855, "Armi" },
{ 0x10857, 0x1085F, "Armi" },
{ 0x10860, 0x1087F, "Palm" },
{ 0x10880, 0x1089E, "Nbat" },
{ 0x108A7, 0x108AF, "Nbat" },
{ 0x108E0, 0x108F2, "Hatr" },
{ 0x108F4, 0x108F5, "Hatr" },
{ 0x108FB, 0x108FF, "Hatr" },
{ 0x10900, 0x1091B, "Phnx" },
{ 0x10920, 0x10939, "Lydi" },
{ 0x10940, 0x10959, "Sidt" },
{ 0x10980, 0x1099F, "Mero" },
{ 0x109A0, 0x109B7, "Merc" },
{ 0x109BC, 0x109CF, "Merc" },
{ 0x109D2, 0x109FF, "Merc" },
{ 0x10A00, 0x10A03, "Khar" },
{ 0x10A05, 0x10A06, "Khar" },
{ 0x10A0C, 0x10A13, "Khar" },
{ 0x10A15, 0x10A17, "Khar" },
{ 0x10A19, 0x10A35, "Khar" },
{ 0x10A38, 0x10A3A, "Khar" },
{ 0x10A3F, 0x10A48, "Khar" },
{ 0x10A50, 0x10A58, "Khar" },
{ 0x10A60, 0x10A7F, "Sarb" },
{ 0x10A80, 0x10A9F, "Narb" },
{ 0x10AC0, 0x10AE6, "Mani" },
{ 0x10AEB, 0x10AF6, "Mani" },
{ 0x10B00, 0x10B35, "Avst" },
{ 0x10B39, 0x10B3F, "Avst" },
{ 0x10B40, 0x10B55, "Prti" },
{ 0x10B58, 0x10B5F, "Prti" },
{ 0x10B60, 0x10B72, "Phli" },
{ 0x10B78, 0x10B7F, "Phli" },
{ 0x10B80, 0x10B91, "Phlp" },
{ 0x10B99, 0x10B9C, "Phlp" },
{ 0x10BA9, 0x10BAF, "Phlp" },
{ 0x10C00, 0x10C48, "Orkh" },
{ 0x10C80, 0x10CB2, "Hung" },
{ 0x10CC0, 0x10CF2, "Hung" },
{ 0x10CFA, 0x10CFF, "Hung" },
{ 0x10D00, 0x10D27, "Rohg" },
{ 0x10D30, 0x10D39, "Rohg" },
{ 0x10D40, 0x10D65, "Gara" },
{ 0x10D69, 0x10D85, "Gara" },
{ 0x10D8E, 0x10D8F, "Gara" },
{ 0x10E60, 0x10E7E, "Arab" },
{ 0x10E80, 0x10EA9, "Yezi" },
{ 0x10EAB, 0x10EAD, "Yezi" },
{ 0x10EB0, 0x10EB1, "Yezi" },
{ 0x10EC2, 0x10EC7, "Arab" },
{ 0x10EC9, 0x10EEE, "Arab" },
{ 0x10EF0, 0x10EFF, "Arab" },
{ 0x10F00, 0x10F27, "Sogo" },
{ 0x10F30, 0x10F59, "Sogd" },
{ 0x10F70, 0x10F89, "Ougr" },
{ 0x10FB0, 0x10FCB, "Chrs" },
{ 0x10FE0, 0x10FF6, "Elym" },
{ 0x11000, 0x1104D, "Brah" },
{ 0x11052, 0x11075, "Brah" },
{ 0x11080, 0x110C2, "Kthi" },
{ 0x110D0, 0x110E8, "Sora" },
{ 0x110F0, 0x110F9, "Sora" },
{ 0x11100, 0x11134, "Cakm" },
{ 0x11136, 0x11147, "Cakm" },
{ 0x11150, 0x11176, "Mahj" },
{ 0x11180, 0x111DF, "Shrd" },
{ 0x111E1, 0x111F4, "Sinh" },
{ 0x11200, 0x11211, "Khoj" },
{ 0x11213, 0x11241, "Khoj" },
{ 0x11280, 0x11286, "Mult" },
{ 0x1128A, 0x1128D, "Mult" },
{ 0x1128F, 0x1129D, "Mult" },
{ 0x1129F, 0x112A9, "Mult" },
{ 0x112B0, 0x112EA, "Sind" },
{ 0x112F0, 0x112F9, "Sind" },
{ 0x11300, 0x11303, "Gran" },
{ 0x11305, 0x1130C, "Gran" },
{ 0x1130F, 0x11310, "Gran" },
{ 0x11313, 0x11328, "Gran" },
{ 0x1132A, 0x11330, "Gran" },
{ 0x11332, 0x11333, "Gran" },
{ 0x11335, 0x11339, "Gran" },
{ 0x1133C, 0x11344, "Gran" },
{ 0x11347, 0x11348, "Gran" },
{ 0x1134B, 0x1134D, "Gran" },
{ 0x1135D, 0x11363, "Gran" },
{ 0x11366, 0x1136C, "Gran" },
{ 0x11370, 0x11374, "Gran" },
{ 0x11380, 0x11389, "Tutg" },
{ 0x11390, 0x113B5, "Tutg" },
{ 0x113B7, 0x113C0, "Tutg" },
{ 0x113C7, 0x113CA, "Tutg" },
{ 0x113CC, 0x113D5, "Tutg" },
{ 0x113D7, 0x113D8, "Tutg" },
{ 0x113E1, 0x113E2, "Tutg" },
{ 0x11400, 0x1145B, "Newa" },
{ 0x1145D, 0x11461, "Newa" },
{ 0x11480, 0x114C7, "Tirh" },
{ 0x114D0, 0x114D9, "Tirh" },
{ 0x11580, 0x115B5, "Sidd" },
{ 0x115B8, 0x115DD, "Sidd" },
{ 0x11600, 0x11644, "Modi" },
{ 0x11650, 0x11659, "Modi" },
{ 0x11660, 0x1166C, "Mong" },
{ 0x11680, 0x116B9, "Takr" },
{ 0x116C0, 0x116C9, "Takr" },
{ 0x116D0, 0x116E3, "Mymr" },
{ 0x11700, 0x1171A, "Ahom" },
{ 0x1171D, 0x1172B, "Ahom" },
{ 0x11730, 0x11746, "Ahom" },
{ 0x11800, 0x1183B, "Dogr" },
{ 0x118A0, 0x118F2, "Wara" },
{ 0x11900, 0x11906, "Diak" },
{ 0x1190C, 0x11913, "Diak" },
{ 0x11915, 0x11916, "Diak" },
{ 0x11918, 0x11935, "Diak" },
{ 0x11937, 0x11938, "Diak" },
{ 0x1193B, 0x11946, "Diak" },
{ 0x11950, 0x11959, "Diak" },
{ 0x119A0, 0x119A7, "Nand" },
{ 0x119AA, 0x119D7, "Nand" },
{ 0x119DA, 0x119E4, "Nand" },
{ 0x11A00, 0x11A47, "Zanb" },
{ 0x11A50, 0x11AA2, "Soyo" },
{ 0x11AB0, 0x11ABF, "Cans" },
{ 0x11AC0, 0x11AF8, "Pauc" },
{ 0x11B00, 0x11B0A, "Deva" },
{ 0x11B60, 0x11B67, "Shrd" },
{ 0x11BC0, 0x11BE1, "Sunu" },
{ 0x11BF0, 0x11BF9, "Sunu" },
{ 0x11C00, 0x11C08, "Bhks" },
{ 0x11C0A, 0x11C36, "Bhks" },
{ 0x11C38, 0x11C45, "Bhks" },
{ 0x11C50, 0x11C6C, "Bhks" },
{ 0x11C70, 0x11C8F, "Marc" },
{ 0x11C92, 0x11CA7, "Marc" },
{ 0x11CA9, 0x11CB6, "Marc" },
{ 0x11D00, 0x11D06, "Gonm" },
{ 0x11D08, 0x11D09, "Gonm" },
{ 0x11D0B, 0x11D36, "Gonm" },
{ 0x11D3C, 0x11D3D, "Gonm" },
{ 0x11D3F, 0x11D47, "Gonm" },
{ 0x11D50, 0x11D59, "Gonm" },
{ 0x11D60, 0x11D65, "Gong" },
{ 0x11D67, 0x11D68, "Gong" },
{ 0x11D6A, 0x11D8E, "Gong" },
{ 0x11D90, 0x11D91, "Gong" },
{ 0x11D93, 0x11D98, "Gong" },
{ 0x11DA0, 0x11DA9, "Gong" },
{ 0x11DB0, 0x11DDB, "Tols" },
{ 0x11DE0, 0x11DE9, "Tols" },
{ 0x11DF0, 0x11DF1, "Beng" },
{ 0x11EE0, 0x11EF8, "Maka" },
{ 0x11F00, 0x11F10, "Kawi" },
{ 0x11F12, 0x11F3A, "Kawi" },
{ 0x11F3E, 0x11F5A, "Kawi" },
{ 0x11FC0, 0x11FF1, "Taml" },
{ 0x12000, 0x12399, "Xsux" },
{ 0x12400, 0x12543, "Xsux" },
{ 0x12550, 0x125A7, "Xsux" },
{ 0x125A8, 0x1264B, "Pcun" },
{ 0x1264C, 0x12686, "Xsux" },
{ 0x12F90, 0x12FF2, "Cpmn" },
{ 0x13000, 0x13455, "Egyp" },
{ 0x13460, 0x143FA, "Egyp" },
{ 0x14400, 0x14646, "Hluw" },
{ 0x16100, 0x16139, "Gukh" },
{ 0x16800, 0x16A38, "Bamu" },
{ 0x16A40, 0x16A5E, "Mroo" },
{ 0x16A60, 0x16A69, "Mroo" },
{ 0x16A6E, 0x16A6F, "Mroo" },
{ 0x16A70, 0x16ABE, "Tnsa" },
{ 0x16AC0, 0x16AC9, "Tnsa" },
{ 0x16AD0, 0x16AED, "Bass" },
{ 0x16AF0, 0x16AF5, "Bass" },
{ 0x16B00, 0x16B45, "Hmng" },
{ 0x16B50, 0x16B59, "Hmng" },
{ 0x16B5B, 0x16B61, "Hmng" },
{ 0x16B63, 0x16B77, "Hmng" },
{ 0x16B7D, 0x16B8F, "Hmng" },
{ 0x16D40, 0x16D79, "Krai" },
{ 0x16E40, 0x16E9A, "Medf" },
{ 0x16EA0, 0x16EB8, "Berf" },
{ 0x16EBB, 0x16ED3, "Berf" },
{ 0x16F00, 0x16F4A, "Plrd" },
{ 0x16F4F, 0x16F87, "Plrd" },
{ 0x16F8F, 0x16F9F, "Plrd" },
{ 0x16FE2, 0x16FE3, "Hani" },
{ 0x16FF0, 0x16FF6, "Hani" },
{ 0x17000, 0x18AFF, "Tang" },
{ 0x18B00, 0x18CDA, "Kits" },
{ 0x18D00, 0x18D20, "Tang" },
{ 0x18D80, 0x18DF2, "Tang" },
{ 0x18E00, 0x19191, "Jurc" },
{ 0x191A0, 0x191D2, "Jurc" },
{ 0x1AFF0, 0x1AFF3, "Kana" },
{ 0x1AFF5, 0x1AFFB, "Kana" },
{ 0x1AFFD, 0x1AFFE, "Kana" },
{ 0x1B001, 0x1B11F, "Hira" },
{ 0x1B120, 0x1B122, "Kana" },
{ 0x1B124, 0x1B128, "Kana" },
{ 0x1B150, 0x1B152, "Hira" },
{ 0x1B164, 0x1B168, "Kana" },
{ 0x1B170, 0x1B2FB, "Nshu" },
{ 0x1BC00, 0x1BC6A, "Dupl" },
{ 0x1BC70, 0x1BC7C, "Dupl" },
{ 0x1BC80, 0x1BC88, "Dupl" },
{ 0x1BC90, 0x1BC99, "Dupl" },
{ 0x1BC9C, 0x1BC9F, "Dupl" },
{ 0x1BCA0, 0x1BCA3, "Zyyy" },
{ 0x1CC00, 0x1CCFC, "Zyyy" },
{ 0x1CD00, 0x1CEB3, "Zyyy" },
{ 0x1CEBA, 0x1CED0, "Zyyy" },
{ 0x1CED2, 0x1CED4, "Zyyy" },
{ 0x1CEDD, 0x1CEFD, "Zyyy" },
{ 0x1CF00, 0x1CF2D, "Zinh" },
{ 0x1CF30, 0x1CF46, "Zinh" },
{ 0x1CF50, 0x1CFC3, "Zyyy" },
{ 0x1D000, 0x1D0F5, "Zyyy" },
{ 0x1D100, 0x1D126, "Zyyy" },
{ 0x1D127, 0x1D128, "Zinh" },
{ 0x1D129, 0x1D166, "Zyyy" },
{ 0x1D167, 0x1D169, "Zinh" },
{ 0x1D16A, 0x1D17A, "Zyyy" },
{ 0x1D17B, 0x1D182, "Zinh" },
{ 0x1D183, 0x1D184, "Zyyy" },
{ 0x1D185, 0x1D18B, "Zinh" },
{ 0x1D18C, 0x1D1A9, "Zyyy" },
{ 0x1D1AA, 0x1D1AD, "Zinh" },
{ 0x1D1AE, 0x1D1FF, "Zyyy" },
{ 0x1D200, 0x1D245, "Grek" },
{ 0x1D250, 0x1D25A, "Zyyy" },
{ 0x1D25B, 0x1D25C, "Zinh" },
{ 0x1D25D, 0x1D281, "Zyyy" },
{ 0x1D2C0, 0x1D2D3, "Zyyy" },
{ 0x1D2E0, 0x1D2F3, "Zyyy" },
{ 0x1D300, 0x1D356, "Zyyy" },
{ 0x1D360, 0x1D378, "Zyyy" },
{ 0x1D400, 0x1D454, "Zyyy" },
{ 0x1D456, 0x1D49C, "Zyyy" },
{ 0x1D49E, 0x1D49F, "Zyyy" },
{ 0x1D4A5, 0x1D4A6, "Zyyy" },
{ 0x1D4A9, 0x1D4AC, "Zyyy" },
{ 0x1D4AE, 0x1D4B9, "Zyyy" },
{ 0x1D4BD, 0x1D4C3, "Zyyy" },
{ 0x1D4C5, 0x1D505, "Zyyy" },
{ 0x1D507, 0x1D50A, "Zyyy" },
{ 0x1D50D, 0x1D514, "Zyyy" },
{ 0x1D516, 0x1D51C, "Zyyy" },
{ 0x1D51E, 0x1D539, "Zyyy" },
{ 0x1D53B, 0x1D53E, "Zyyy" },
{ 0x1D540, 0x1D544, "Zyyy" },
{ 0x1D54A, 0x1D550, "Zyyy" },
{ 0x1D552, 0x1D6A6, "Zyyy" },
{ 0x1D6A8, 0x1D7CB, "Zyyy" },
{ 0x1D7CE, 0x1D7FF, "Zyyy" },
{ 0x1D800, 0x1DA8B, "Sgnw" },
{ 0x1DA9B, 0x1DA9F, "Sgnw" },
{ 0x1DAA1, 0x1DAAF, "Sgnw" },
{ 0x1DB00, 0x1DB1C, "Zyyy" },
{ 0x1DF00, 0x1DF81, "Latn" },
{ 0x1DF90, 0x1DF96, "Latn" },
{ 0x1DFCD, 0x1DFF2, "Latn" },
{ 0x1DFF3, 0x1DFF4, "Grek" },
{ 0x1DFF5, 0x1DFFF, "Latn" },
{ 0x1E000, 0x1E006, "Glag" },
{ 0x1E008, 0x1E018, "Glag" },
{ 0x1E01B, 0x1E021, "Glag" },
{ 0x1E023, 0x1E024, "Glag" },
{ 0x1E026, 0x1E02A, "Glag" },
{ 0x1E030, 0x1E06D, "Cyrl" },
{ 0x1E100, 0x1E12C, "Hmnp" },
{ 0x1E130, 0x1E13D, "Hmnp" },
{ 0x1E140, 0x1E149, "Hmnp" },
{ 0x1E14E, 0x1E14F, "Hmnp" },
{ 0x1E290, 0x1E2AE, "Toto" },
{ 0x1E2C0, 0x1E2F9, "Wcho" },
{ 0x1E4D0, 0x1E4F9, "Nagm" },
{ 0x1E5D0, 0x1E5FA, "Onao" },
{ 0x1E6C0, 0x1E6DE, "Tayo" },
{ 0x1E6E0, 0x1E6F5, "Tayo" },
{ 0x1E6FE, 0x1E6FF, "Tayo" },
{ 0x1E7E0, 0x1E7E6, "Ethi" },
{ 0x1E7E8, 0x1E7EB, "Ethi" },
{ 0x1E7ED, 0x1E7EE, "Ethi" },
{ 0x1E7F0, 0x1E7FE, "Ethi" },
{ 0x1E800, 0x1E8C4, "Mend" },
{ 0x1E8C7, 0x1E8D6, "Mend" },
{ 0x1E900, 0x1E94B, "Adlm" },
{ 0x1E950, 0x1E959, "Adlm" },
{ 0x1E95E, 0x1E95F, "Adlm" },
{ 0x1EC71, 0x1ECB4, "Zyyy" },
{ 0x1ED01, 0x1ED3D, "Zyyy" },
{ 0x1EE00, 0x1EE03, "Arab" },
{ 0x1EE05, 0x1EE1F, "Arab" },
{ 0x1EE21, 0x1EE22, "Arab" },
{ 0x1EE29, 0x1EE32, "Arab" },
{ 0x1EE34, 0x1EE37, "Arab" },
{ 0x1EE4D, 0x1EE4F, "Arab" },
{ 0x1EE51, 0x1EE52, "Arab" },
{ 0x1EE61, 0x1EE62, "Arab" },
{ 0x1EE67, 0x1EE6A, "Arab" },
{ 0x1EE6C, 0x1EE72, "Arab" },
{ 0x1EE74, 0x1EE77, "Arab" },
{ 0x1EE79, 0x1EE7C, "Arab" },
{ 0x1EE80, 0x1EE89, "Arab" },
{ 0x1EE8B, 0x1EE9B, "Arab" },
{ 0x1EEA1, 0x1EEA3, "Arab" },
{ 0x1EEA5, 0x1EEA9, "Arab" },
{ 0x1EEAB, 0x1EEBB, "Arab" },
{ 0x1EEF0, 0x1EEF1, "Arab" },
{ 0x1F000, 0x1F02B, "Zyyy" },
{ 0x1F030, 0x1F093, "Zyyy" },
{ 0x1F0A0, 0x1F0AE, "Zyyy" },
{ 0x1F0B1, 0x1F0BF, "Zyyy" },
{ 0x1F0C1, 0x1F0CF, "Zyyy" },
{ 0x1F0D1, 0x1F0F5, "Zyyy" },
{ 0x1F100, 0x1F1AE, "Zyyy" },
{ 0x1F1E6, 0x1F1FF, "Zyyy" },
{ 0x1F201, 0x1F202, "Zyyy" },
{ 0x1F210, 0x1F23B, "Zyyy" },
{ 0x1F240, 0x1F248, "Zyyy" },
{ 0x1F250, 0x1F251, "Zyyy" },
{ 0x1F260, 0x1F265, "Zyyy" },
{ 0x1F300, 0x1F6D9, "Zyyy" },
{ 0x1F6DC, 0x1F6EC, "Zyyy" },
{ 0x1F6F0, 0x1F6FC, "Zyyy" },
{ 0x1F700, 0x1F7DB, "Zyyy" },
{ 0x1F7E0, 0x1F7EB, "Zyyy" },
{ 0x1F7F0, 0x1F80B, "Zyyy" },
{ 0x1F810, 0x1F847, "Zyyy" },
{ 0x1F850, 0x1F859, "Zyyy" },
{ 0x1F860, 0x1F887, "Zyyy" },
{ 0x1F890, 0x1F8AD, "Zyyy" },
{ 0x1F8B0, 0x1F8BB, "Zyyy" },
{ 0x1F8C0, 0x1F8C1, "Zyyy" },
{ 0x1F8D0, 0x1F8D8, "Zyyy" },
{ 0x1F900, 0x1FA57, "Zyyy" },
{ 0x1FA60, 0x1FA6D, "Zyyy" },
{ 0x1FA70, 0x1FA7C, "Zyyy" },
{ 0x1FA80, 0x1FAC6, "Zyyy" },
{ 0x1FACC, 0x1FADD, "Zyyy" },
{ 0x1FADF, 0x1FAEB, "Zyyy" },
{ 0x1FAEF, 0x1FAFA, "Zyyy" },
{ 0x1FB00, 0x1FB92, "Zyyy" },
{ 0x1FB94, 0x1FBFA, "Zyyy" },
{ 0x20000, 0x2A6DF, "Hani" },
{ 0x2A700, 0x2B81E, "Hani" },
{ 0x2B820, 0x2CEAD, "Hani" },
{ 0x2CEB0, 0x2EBE0, "Hani" },
{ 0x2EBF0, 0x2EE5D, "Hani" },
{ 0x2F800, 0x2FA1D, "Hani" },
{ 0x30000, 0x3134A, "Hani" },
{ 0x31350, 0x33479, "Hani" },
{ 0x3D000, 0x3FC3F, "Seal" },
{ 0xE0020, 0xE007F, "Zyyy" },
{ 0xE0100, 0xE01EF, "Zinh" },
},
-- Scripts.txt gives full names; here we consider them aliases to save space.
aliases = {
Adlm = "Adlam",
Aghb = "Caucasian Albanian",
Ahom = "Ahom",
Arab = "Arabic",
Armi = "Imperial Aramaic",
Armn = "Armenian",
Avst = "Avestan",
Bali = "Balinese",
Bamu = "Bamum",
Bass = "Bassa Vah",
Batk = "Batak",
Beng = "Bengali",
Berf = "Beria Erfe",
Bhks = "Bhaiksuki",
Bopo = "Bopomofo",
Brah = "Brahmi",
Brai = "Braille",
Bugi = "Buginese",
Buhd = "Buhid",
Cakm = "Chakma",
Cans = "Canadian Aboriginal",
Cari = "Carian",
Cham = "Cham",
Cher = "Cherokee",
Chrs = "Chorasmian",
Copt = "Coptic",
Cpmn = "Cypro Minoan",
Cprt = "Cypriot",
Cyrl = "Cyrillic",
Deva = "Devanagari",
Diak = "Dives Akuru",
Dogr = "Dogra",
Dsrt = "Deseret",
Dupl = "Duployan",
Egyp = "Egyptian Hieroglyphs",
Elba = "Elbasan",
Elym = "Elymaic",
Ethi = "Ethiopic",
Gara = "Garay",
Geor = "Georgian",
Glag = "Glagolitic",
Gong = "Gunjala Gondi",
Gonm = "Masaram Gondi",
Goth = "Gothic",
Gran = "Grantha",
Grek = "Greek",
Gujr = "Gujarati",
Gukh = "Gurung Khema",
Guru = "Gurmukhi",
Hang = "Hangul",
Hani = "Han",
Hano = "Hanunoo",
Hatr = "Hatran",
Hebr = "Hebrew",
Hira = "Hiragana",
Hluw = "Anatolian Hieroglyphs",
Hmng = "Pahawh Hmong",
Hmnp = "Nyiakeng Puachue Hmong",
Hrkt = "Katakana Or Hiragana",
Hung = "Old Hungarian",
Ital = "Old Italic",
Java = "Javanese",
Jurc = "Jurchen",
Kali = "Kayah Li",
Kana = "Katakana",
Kawi = "Kawi",
Khar = "Kharoshthi",
Khmr = "Khmer",
Khoj = "Khojki",
Kits = "Khitan Small Script",
Knda = "Kannada",
Krai = "Kirat Rai",
Kthi = "Kaithi",
Lana = "Tai Tham",
Laoo = "Lao",
Latn = "Latin",
Lepc = "Lepcha",
Limb = "Limbu",
Lina = "Linear A",
Linb = "Linear B",
Lisu = "Lisu",
Lyci = "Lycian",
Lydi = "Lydian",
Mahj = "Mahajani",
Maka = "Makasar",
Mand = "Mandaic",
Mani = "Manichaean",
Marc = "Marchen",
Medf = "Medefaidrin",
Mend = "Mende Kikakui",
Merc = "Meroitic Cursive",
Mero = "Meroitic Hieroglyphs",
Mlym = "Malayalam",
Modi = "Modi",
Mong = "Mongolian",
Mroo = "Mro",
Mtei = "Meetei Mayek",
Mult = "Multani",
Mymr = "Myanmar",
Nagm = "Nag Mundari",
Nand = "Nandinagari",
Narb = "Old North Arabian",
Nbat = "Nabataean",
Newa = "Newa",
Nkoo = "NKo",
Nshu = "Nushu",
Ogam = "Ogham",
Olck = "Ol Chiki",
Onao = "Ol Onal",
Orkh = "Old Turkic",
Orya = "Oriya",
Osge = "Osage",
Osma = "Osmanya",
Ougr = "Old Uyghur",
Palm = "Palmyrene",
Pauc = "Pau Cin Hau",
Pcun = "Proto Cuneiform",
Perm = "Old Permic",
Phag = "Phags Pa",
Phli = "Inscriptional Pahlavi",
Phlp = "Psalter Pahlavi",
Phnx = "Phoenician",
Plrd = "Miao",
Prti = "Inscriptional Parthian",
Rjng = "Rejang",
Rohg = "Hanifi Rohingya",
Runr = "Runic",
Samr = "Samaritan",
Sarb = "Old South Arabian",
Saur = "Saurashtra",
Seal = "Seal",
Sgnw = "SignWriting",
Shaw = "Shavian",
Shrd = "Sharada",
Sidd = "Siddham",
Sidt = "Sidetic",
Sind = "Khudawadi",
Sinh = "Sinhala",
Sogd = "Sogdian",
Sogo = "Old Sogdian",
Sora = "Sora Sompeng",
Soyo = "Soyombo",
Sund = "Sundanese",
Sunu = "Sunuwar",
Sylo = "Syloti Nagri",
Syrc = "Syriac",
Tagb = "Tagbanwa",
Takr = "Takri",
Tale = "Tai Le",
Talu = "New Tai Lue",
Taml = "Tamil",
Tang = "Tangut",
Tavt = "Tai Viet",
Tayo = "Tai Yo",
Telu = "Telugu",
Tfng = "Tifinagh",
Tglg = "Tagalog",
Thaa = "Thaana",
Thai = "Thai",
Tibt = "Tibetan",
Tirh = "Tirhuta",
Tnsa = "Tangsa",
Todr = "Todhri",
Tols = "Tolong Siki",
Toto = "Toto",
Tutg = "Tulu Tigalari",
Ugar = "Ugaritic",
Vaii = "Vai",
Vith = "Vithkuqi",
Wara = "Warang Citi",
Wcho = "Wancho",
Xpeo = "Old Persian",
Xsux = "Cuneiform",
Yezi = "Yezidi",
Yiii = "Yi",
Zanb = "Zanabazar Square",
Zinh = "Inherited",
Zyyy = "Common",
Zzzz = "Unknown",
},
}
-- Required for binary search function in [[Module:Language/scripts]].
-- Cannot get length of module loaded with mw.loadData.
data.ranges.length = #data.ranges
data.rtl = {}
for _, script in ipairs(mw.loadData "Module:Lang/data".rtl_scripts) do
-- [[Module:Lang/data]] has script codes in lowercase;
-- this module has script codes with the first letter capitalized.
data.rtl[script:gsub("^%a", string.upper)] = true
end
return data
fjhxlm1zuz2q0wxkqoboghr4ezh7nqn
32838
32837
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Unicode_data/scripts]]
32837
Scribunto
text/plain
--[=[
-- Official Unicode script values for individual codepoints and ranges of
-- codepoints.
-- https://www.unicode.org/Public/UCD/latest/ucd/Scripts.txt provided
-- the script names, and https://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt
-- provided script codes corresponding to the names (see [[Script (Unicode)]]).
--]=]
local data = {
singles = {
[0x000AA] = "Latn",
[0x000BA] = "Latn",
[0x000D7] = "Zyyy",
[0x000F7] = "Zyyy",
[0x00374] = "Zyyy",
[0x0037E] = "Zyyy",
[0x0037F] = "Grek",
[0x00384] = "Grek",
[0x00385] = "Zyyy",
[0x00386] = "Grek",
[0x00387] = "Zyyy",
[0x0038C] = "Grek",
[0x00605] = "Zyyy",
[0x0060C] = "Zyyy",
[0x0061B] = "Zyyy",
[0x0061F] = "Zyyy",
[0x00640] = "Zyyy",
[0x00670] = "Zinh",
[0x006DD] = "Zyyy",
[0x0085E] = "Mand",
[0x008E2] = "Zyyy",
[0x009B2] = "Beng",
[0x009D7] = "Beng",
[0x00A3C] = "Guru",
[0x00A51] = "Guru",
[0x00A5E] = "Guru",
[0x00AD0] = "Gujr",
[0x00B9C] = "Taml",
[0x00BD0] = "Taml",
[0x00BD7] = "Taml",
[0x00DBD] = "Sinh",
[0x00DCA] = "Sinh",
[0x00DD6] = "Sinh",
[0x00E3F] = "Zyyy",
[0x00E84] = "Laoo",
[0x00EA5] = "Laoo",
[0x00EC6] = "Laoo",
[0x010C7] = "Geor",
[0x010CD] = "Geor",
[0x010FB] = "Zyyy",
[0x01258] = "Ethi",
[0x012C0] = "Ethi",
[0x0171F] = "Tglg",
[0x01804] = "Mong",
[0x01805] = "Zyyy",
[0x01940] = "Limb",
[0x01CD3] = "Zyyy",
[0x01CE1] = "Zyyy",
[0x01CED] = "Zinh",
[0x01CF4] = "Zinh",
[0x01CFA] = "Zyyy",
[0x01D2B] = "Cyrl",
[0x01D78] = "Cyrl",
[0x01DBF] = "Grek",
[0x01F59] = "Grek",
[0x01F5B] = "Grek",
[0x01F5D] = "Grek",
[0x02071] = "Latn",
[0x0207F] = "Latn",
[0x02126] = "Grek",
[0x02132] = "Latn",
[0x0214E] = "Latn",
[0x02D27] = "Geor",
[0x02D2D] = "Geor",
[0x02D7F] = "Tfng",
[0x03005] = "Hani",
[0x03006] = "Zyyy",
[0x03007] = "Hani",
[0x030A0] = "Zyyy",
[0x031EF] = "Zyyy",
[0x032FF] = "Zyyy",
[0x0A7E2] = "Latn",
[0x0A92E] = "Zyyy",
[0x0A92F] = "Kali",
[0x0A95F] = "Rjng",
[0x0A9CF] = "Zyyy",
[0x0AB5B] = "Zyyy",
[0x0AB65] = "Grek",
[0x0FB3E] = "Hebr",
[0x0FEFF] = "Zyyy",
[0x0FF70] = "Zyyy",
[0x101A0] = "Grek",
[0x101FD] = "Zinh",
[0x102E0] = "Zinh",
[0x1039F] = "Ugar",
[0x1056F] = "Aghb",
[0x10808] = "Cprt",
[0x1083C] = "Cprt",
[0x1083F] = "Cprt",
[0x1091F] = "Phnx",
[0x1093F] = "Lydi",
[0x1107F] = "Brah",
[0x110CD] = "Kthi",
[0x11288] = "Mult",
[0x1133B] = "Zinh",
[0x11350] = "Gran",
[0x11357] = "Gran",
[0x1138B] = "Tutg",
[0x1138E] = "Tutg",
[0x113C2] = "Tutg",
[0x113C5] = "Tutg",
[0x118FF] = "Wara",
[0x11909] = "Diak",
[0x11D3A] = "Gonm",
[0x11FB0] = "Lisu",
[0x11FFF] = "Taml",
[0x16FE0] = "Tang",
[0x16FE1] = "Nshu",
[0x16FE4] = "Kits",
[0x18CFF] = "Kits",
[0x1B000] = "Kana",
[0x1B123] = "Hira",
[0x1B132] = "Hira",
[0x1B155] = "Kana",
[0x1D4A2] = "Zyyy",
[0x1D4BB] = "Zyyy",
[0x1D546] = "Zyyy",
[0x1E08F] = "Cyrl",
[0x1E2FF] = "Wcho",
[0x1E5FF] = "Onao",
[0x1EE24] = "Arab",
[0x1EE27] = "Arab",
[0x1EE39] = "Arab",
[0x1EE3B] = "Arab",
[0x1EE42] = "Arab",
[0x1EE47] = "Arab",
[0x1EE49] = "Arab",
[0x1EE4B] = "Arab",
[0x1EE54] = "Arab",
[0x1EE57] = "Arab",
[0x1EE59] = "Arab",
[0x1EE5B] = "Arab",
[0x1EE5D] = "Arab",
[0x1EE5F] = "Arab",
[0x1EE64] = "Arab",
[0x1EE7E] = "Arab",
[0x1F200] = "Hira",
[0x1FAC8] = "Zyyy",
[0xE0001] = "Zyyy",
},
ranges = {
{ 0x00000, 0x00040, "Zyyy" },
{ 0x00041, 0x0005A, "Latn" },
{ 0x0005B, 0x00060, "Zyyy" },
{ 0x00061, 0x0007A, "Latn" },
{ 0x0007B, 0x000A9, "Zyyy" },
{ 0x000AB, 0x000B9, "Zyyy" },
{ 0x000BB, 0x000BF, "Zyyy" },
{ 0x000C0, 0x000D6, "Latn" },
{ 0x000D8, 0x000F6, "Latn" },
{ 0x000F8, 0x002B8, "Latn" },
{ 0x002B9, 0x002DF, "Zyyy" },
{ 0x002E0, 0x002E4, "Latn" },
{ 0x002E5, 0x002E9, "Zyyy" },
{ 0x002EA, 0x002EB, "Bopo" },
{ 0x002EC, 0x002FF, "Zyyy" },
{ 0x00300, 0x0036F, "Zinh" },
{ 0x00370, 0x00373, "Grek" },
{ 0x00375, 0x00377, "Grek" },
{ 0x0037A, 0x0037D, "Grek" },
{ 0x00388, 0x0038A, "Grek" },
{ 0x0038E, 0x003A1, "Grek" },
{ 0x003A3, 0x003E1, "Grek" },
{ 0x003E2, 0x003EF, "Copt" },
{ 0x003F0, 0x003FF, "Grek" },
{ 0x00400, 0x00484, "Cyrl" },
{ 0x00485, 0x00486, "Zinh" },
{ 0x00487, 0x0052F, "Cyrl" },
{ 0x00531, 0x00556, "Armn" },
{ 0x00558, 0x0058F, "Armn" },
{ 0x00591, 0x005C9, "Hebr" },
{ 0x005D0, 0x005EA, "Hebr" },
{ 0x005EF, 0x005F4, "Hebr" },
{ 0x00600, 0x00604, "Arab" },
{ 0x00606, 0x0060B, "Arab" },
{ 0x0060D, 0x0061A, "Arab" },
{ 0x0061C, 0x0061E, "Arab" },
{ 0x00620, 0x0063F, "Arab" },
{ 0x00641, 0x0064A, "Arab" },
{ 0x0064B, 0x00655, "Zinh" },
{ 0x00656, 0x0066F, "Arab" },
{ 0x00671, 0x006DC, "Arab" },
{ 0x006DE, 0x006FF, "Arab" },
{ 0x00700, 0x0070D, "Syrc" },
{ 0x0070F, 0x0074A, "Syrc" },
{ 0x0074D, 0x0074F, "Syrc" },
{ 0x00750, 0x0077F, "Arab" },
{ 0x00780, 0x007B1, "Thaa" },
{ 0x007C0, 0x007FA, "Nkoo" },
{ 0x007FD, 0x007FF, "Nkoo" },
{ 0x00800, 0x0082D, "Samr" },
{ 0x00830, 0x0083E, "Samr" },
{ 0x00840, 0x0085B, "Mand" },
{ 0x00860, 0x0086A, "Syrc" },
{ 0x00870, 0x00891, "Arab" },
{ 0x00897, 0x008E1, "Arab" },
{ 0x008E3, 0x008FF, "Arab" },
{ 0x00900, 0x00950, "Deva" },
{ 0x00951, 0x00954, "Zinh" },
{ 0x00955, 0x00963, "Deva" },
{ 0x00964, 0x00965, "Zyyy" },
{ 0x00966, 0x0097F, "Deva" },
{ 0x00980, 0x00983, "Beng" },
{ 0x00985, 0x0098C, "Beng" },
{ 0x0098F, 0x00990, "Beng" },
{ 0x00993, 0x009A8, "Beng" },
{ 0x009AA, 0x009B0, "Beng" },
{ 0x009B6, 0x009B9, "Beng" },
{ 0x009BC, 0x009C4, "Beng" },
{ 0x009C7, 0x009C8, "Beng" },
{ 0x009CB, 0x009CE, "Beng" },
{ 0x009DC, 0x009DD, "Beng" },
{ 0x009DF, 0x009E3, "Beng" },
{ 0x009E6, 0x009FE, "Beng" },
{ 0x00A01, 0x00A03, "Guru" },
{ 0x00A05, 0x00A0A, "Guru" },
{ 0x00A0F, 0x00A10, "Guru" },
{ 0x00A13, 0x00A28, "Guru" },
{ 0x00A2A, 0x00A30, "Guru" },
{ 0x00A32, 0x00A33, "Guru" },
{ 0x00A35, 0x00A36, "Guru" },
{ 0x00A38, 0x00A39, "Guru" },
{ 0x00A3E, 0x00A42, "Guru" },
{ 0x00A47, 0x00A48, "Guru" },
{ 0x00A4B, 0x00A4D, "Guru" },
{ 0x00A59, 0x00A5C, "Guru" },
{ 0x00A66, 0x00A76, "Guru" },
{ 0x00A81, 0x00A83, "Gujr" },
{ 0x00A85, 0x00A8D, "Gujr" },
{ 0x00A8F, 0x00A91, "Gujr" },
{ 0x00A93, 0x00AA8, "Gujr" },
{ 0x00AAA, 0x00AB0, "Gujr" },
{ 0x00AB2, 0x00AB3, "Gujr" },
{ 0x00AB5, 0x00AB9, "Gujr" },
{ 0x00ABC, 0x00AC5, "Gujr" },
{ 0x00AC7, 0x00AC9, "Gujr" },
{ 0x00ACB, 0x00ACD, "Gujr" },
{ 0x00AE0, 0x00AE3, "Gujr" },
{ 0x00AE6, 0x00AF1, "Gujr" },
{ 0x00AF9, 0x00AFF, "Gujr" },
{ 0x00B01, 0x00B03, "Orya" },
{ 0x00B05, 0x00B0C, "Orya" },
{ 0x00B0F, 0x00B10, "Orya" },
{ 0x00B13, 0x00B28, "Orya" },
{ 0x00B2A, 0x00B30, "Orya" },
{ 0x00B32, 0x00B33, "Orya" },
{ 0x00B35, 0x00B39, "Orya" },
{ 0x00B3C, 0x00B44, "Orya" },
{ 0x00B47, 0x00B48, "Orya" },
{ 0x00B4B, 0x00B4D, "Orya" },
{ 0x00B53, 0x00B57, "Orya" },
{ 0x00B5C, 0x00B5D, "Orya" },
{ 0x00B5F, 0x00B63, "Orya" },
{ 0x00B66, 0x00B77, "Orya" },
{ 0x00B82, 0x00B83, "Taml" },
{ 0x00B85, 0x00B8A, "Taml" },
{ 0x00B8E, 0x00B90, "Taml" },
{ 0x00B92, 0x00B95, "Taml" },
{ 0x00B99, 0x00B9A, "Taml" },
{ 0x00B9E, 0x00B9F, "Taml" },
{ 0x00BA3, 0x00BA4, "Taml" },
{ 0x00BA8, 0x00BAA, "Taml" },
{ 0x00BAE, 0x00BB9, "Taml" },
{ 0x00BBE, 0x00BC2, "Taml" },
{ 0x00BC6, 0x00BC8, "Taml" },
{ 0x00BCA, 0x00BCD, "Taml" },
{ 0x00BE6, 0x00BFA, "Taml" },
{ 0x00C00, 0x00C0C, "Telu" },
{ 0x00C0E, 0x00C10, "Telu" },
{ 0x00C12, 0x00C28, "Telu" },
{ 0x00C2A, 0x00C39, "Telu" },
{ 0x00C3C, 0x00C44, "Telu" },
{ 0x00C46, 0x00C48, "Telu" },
{ 0x00C4A, 0x00C4D, "Telu" },
{ 0x00C55, 0x00C56, "Telu" },
{ 0x00C58, 0x00C5A, "Telu" },
{ 0x00C5C, 0x00C5D, "Telu" },
{ 0x00C60, 0x00C63, "Telu" },
{ 0x00C66, 0x00C6F, "Telu" },
{ 0x00C77, 0x00C7F, "Telu" },
{ 0x00C80, 0x00C8C, "Knda" },
{ 0x00C8E, 0x00C90, "Knda" },
{ 0x00C92, 0x00CA8, "Knda" },
{ 0x00CAA, 0x00CB3, "Knda" },
{ 0x00CB5, 0x00CB9, "Knda" },
{ 0x00CBC, 0x00CC4, "Knda" },
{ 0x00CC6, 0x00CC8, "Knda" },
{ 0x00CCA, 0x00CCD, "Knda" },
{ 0x00CD5, 0x00CD6, "Knda" },
{ 0x00CDC, 0x00CDE, "Knda" },
{ 0x00CE0, 0x00CE3, "Knda" },
{ 0x00CE6, 0x00CEF, "Knda" },
{ 0x00CF1, 0x00CF3, "Knda" },
{ 0x00D00, 0x00D0C, "Mlym" },
{ 0x00D0E, 0x00D10, "Mlym" },
{ 0x00D12, 0x00D44, "Mlym" },
{ 0x00D46, 0x00D48, "Mlym" },
{ 0x00D4A, 0x00D4F, "Mlym" },
{ 0x00D54, 0x00D63, "Mlym" },
{ 0x00D66, 0x00D7F, "Mlym" },
{ 0x00D81, 0x00D83, "Sinh" },
{ 0x00D85, 0x00D96, "Sinh" },
{ 0x00D9A, 0x00DB1, "Sinh" },
{ 0x00DB3, 0x00DBB, "Sinh" },
{ 0x00DC0, 0x00DC6, "Sinh" },
{ 0x00DCF, 0x00DD4, "Sinh" },
{ 0x00DD8, 0x00DDF, "Sinh" },
{ 0x00DE6, 0x00DEF, "Sinh" },
{ 0x00DF2, 0x00DF4, "Sinh" },
{ 0x00E01, 0x00E3A, "Thai" },
{ 0x00E40, 0x00E5B, "Thai" },
{ 0x00E81, 0x00E82, "Laoo" },
{ 0x00E86, 0x00E8A, "Laoo" },
{ 0x00E8C, 0x00EA3, "Laoo" },
{ 0x00EA7, 0x00EBD, "Laoo" },
{ 0x00EC0, 0x00EC4, "Laoo" },
{ 0x00EC8, 0x00ECE, "Laoo" },
{ 0x00ED0, 0x00ED9, "Laoo" },
{ 0x00EDC, 0x00EDF, "Laoo" },
{ 0x00F00, 0x00F47, "Tibt" },
{ 0x00F49, 0x00F6C, "Tibt" },
{ 0x00F71, 0x00F97, "Tibt" },
{ 0x00F99, 0x00FBC, "Tibt" },
{ 0x00FBE, 0x00FCC, "Tibt" },
{ 0x00FCE, 0x00FD4, "Tibt" },
{ 0x00FD5, 0x00FD8, "Zyyy" },
{ 0x00FD9, 0x00FDA, "Tibt" },
{ 0x01000, 0x0109F, "Mymr" },
{ 0x010A0, 0x010C5, "Geor" },
{ 0x010D0, 0x010FA, "Geor" },
{ 0x010FC, 0x010FF, "Geor" },
{ 0x01100, 0x011FF, "Hang" },
{ 0x01200, 0x01248, "Ethi" },
{ 0x0124A, 0x0124D, "Ethi" },
{ 0x01250, 0x01256, "Ethi" },
{ 0x0125A, 0x0125D, "Ethi" },
{ 0x01260, 0x01288, "Ethi" },
{ 0x0128A, 0x0128D, "Ethi" },
{ 0x01290, 0x012B0, "Ethi" },
{ 0x012B2, 0x012B5, "Ethi" },
{ 0x012B8, 0x012BE, "Ethi" },
{ 0x012C2, 0x012C5, "Ethi" },
{ 0x012C8, 0x012D6, "Ethi" },
{ 0x012D8, 0x01310, "Ethi" },
{ 0x01312, 0x01315, "Ethi" },
{ 0x01318, 0x0135A, "Ethi" },
{ 0x0135D, 0x0137C, "Ethi" },
{ 0x01380, 0x01399, "Ethi" },
{ 0x013A0, 0x013F5, "Cher" },
{ 0x013F8, 0x013FD, "Cher" },
{ 0x01400, 0x0167F, "Cans" },
{ 0x01680, 0x0169C, "Ogam" },
{ 0x016A0, 0x016EA, "Runr" },
{ 0x016EB, 0x016ED, "Zyyy" },
{ 0x016EE, 0x016F8, "Runr" },
{ 0x01700, 0x01715, "Tglg" },
{ 0x01720, 0x01734, "Hano" },
{ 0x01735, 0x01736, "Zyyy" },
{ 0x01740, 0x01753, "Buhd" },
{ 0x01760, 0x0176C, "Tagb" },
{ 0x0176E, 0x01770, "Tagb" },
{ 0x01772, 0x01773, "Tagb" },
{ 0x01780, 0x017DD, "Khmr" },
{ 0x017E0, 0x017E9, "Khmr" },
{ 0x017F0, 0x017F9, "Khmr" },
{ 0x01800, 0x01801, "Mong" },
{ 0x01802, 0x01803, "Zyyy" },
{ 0x01806, 0x01819, "Mong" },
{ 0x01820, 0x01878, "Mong" },
{ 0x01880, 0x018AA, "Mong" },
{ 0x018B0, 0x018F5, "Cans" },
{ 0x01900, 0x0191E, "Limb" },
{ 0x01920, 0x0192B, "Limb" },
{ 0x01930, 0x0193B, "Limb" },
{ 0x01944, 0x0194F, "Limb" },
{ 0x01950, 0x0196D, "Tale" },
{ 0x01970, 0x01974, "Tale" },
{ 0x01980, 0x019AB, "Talu" },
{ 0x019B0, 0x019C9, "Talu" },
{ 0x019D0, 0x019DA, "Talu" },
{ 0x019DE, 0x019DF, "Talu" },
{ 0x019E0, 0x019FF, "Khmr" },
{ 0x01A00, 0x01A1B, "Bugi" },
{ 0x01A1E, 0x01A1F, "Bugi" },
{ 0x01A20, 0x01A5E, "Lana" },
{ 0x01A60, 0x01A7C, "Lana" },
{ 0x01A7F, 0x01A89, "Lana" },
{ 0x01A90, 0x01A99, "Lana" },
{ 0x01AA0, 0x01AAD, "Lana" },
{ 0x01AB0, 0x01AF0, "Zinh" },
{ 0x01B00, 0x01B4C, "Bali" },
{ 0x01B4E, 0x01B7F, "Bali" },
{ 0x01B80, 0x01BBF, "Sund" },
{ 0x01BC0, 0x01BF3, "Batk" },
{ 0x01BFC, 0x01BFF, "Batk" },
{ 0x01C00, 0x01C37, "Lepc" },
{ 0x01C3B, 0x01C49, "Lepc" },
{ 0x01C4D, 0x01C4F, "Lepc" },
{ 0x01C50, 0x01C7F, "Olck" },
{ 0x01C80, 0x01C8A, "Cyrl" },
{ 0x01C90, 0x01CBA, "Geor" },
{ 0x01CBD, 0x01CBF, "Geor" },
{ 0x01CC0, 0x01CC7, "Sund" },
{ 0x01CD0, 0x01CD2, "Zinh" },
{ 0x01CD4, 0x01CE0, "Zinh" },
{ 0x01CE2, 0x01CE8, "Zinh" },
{ 0x01CE9, 0x01CEC, "Zyyy" },
{ 0x01CEE, 0x01CF3, "Zyyy" },
{ 0x01CF5, 0x01CF7, "Zyyy" },
{ 0x01CF8, 0x01CF9, "Zinh" },
{ 0x01D00, 0x01D25, "Latn" },
{ 0x01D26, 0x01D2A, "Grek" },
{ 0x01D2C, 0x01D5C, "Latn" },
{ 0x01D5D, 0x01D61, "Grek" },
{ 0x01D62, 0x01D65, "Latn" },
{ 0x01D66, 0x01D6A, "Grek" },
{ 0x01D6B, 0x01D77, "Latn" },
{ 0x01D79, 0x01DBE, "Latn" },
{ 0x01DC0, 0x01DFF, "Zinh" },
{ 0x01E00, 0x01EFF, "Latn" },
{ 0x01F00, 0x01F15, "Grek" },
{ 0x01F18, 0x01F1D, "Grek" },
{ 0x01F20, 0x01F45, "Grek" },
{ 0x01F48, 0x01F4D, "Grek" },
{ 0x01F50, 0x01F57, "Grek" },
{ 0x01F5F, 0x01F7D, "Grek" },
{ 0x01F80, 0x01FB4, "Grek" },
{ 0x01FB6, 0x01FC4, "Grek" },
{ 0x01FC6, 0x01FD3, "Grek" },
{ 0x01FD6, 0x01FDB, "Grek" },
{ 0x01FDD, 0x01FEF, "Grek" },
{ 0x01FF2, 0x01FF4, "Grek" },
{ 0x01FF6, 0x01FFE, "Grek" },
{ 0x02000, 0x0200B, "Zyyy" },
{ 0x0200C, 0x0200D, "Zinh" },
{ 0x0200E, 0x02064, "Zyyy" },
{ 0x02066, 0x02070, "Zyyy" },
{ 0x02074, 0x0207E, "Zyyy" },
{ 0x02080, 0x0208F, "Zyyy" },
{ 0x02090, 0x0209F, "Latn" },
{ 0x020A0, 0x020C4, "Zyyy" },
{ 0x020D0, 0x020F0, "Zinh" },
{ 0x02100, 0x02125, "Zyyy" },
{ 0x02127, 0x02129, "Zyyy" },
{ 0x0212A, 0x0212B, "Latn" },
{ 0x0212C, 0x02131, "Zyyy" },
{ 0x02133, 0x0214D, "Zyyy" },
{ 0x0214F, 0x0215F, "Zyyy" },
{ 0x02160, 0x02188, "Latn" },
{ 0x02189, 0x0218B, "Zyyy" },
{ 0x02190, 0x02429, "Zyyy" },
{ 0x02440, 0x0244A, "Zyyy" },
{ 0x02460, 0x027FF, "Zyyy" },
{ 0x02800, 0x028FF, "Brai" },
{ 0x02900, 0x02B73, "Zyyy" },
{ 0x02B76, 0x02BFF, "Zyyy" },
{ 0x02C00, 0x02C5F, "Glag" },
{ 0x02C60, 0x02C7F, "Latn" },
{ 0x02C80, 0x02CF3, "Copt" },
{ 0x02CF9, 0x02CFF, "Copt" },
{ 0x02D00, 0x02D25, "Geor" },
{ 0x02D30, 0x02D67, "Tfng" },
{ 0x02D6F, 0x02D70, "Tfng" },
{ 0x02D80, 0x02D96, "Ethi" },
{ 0x02DA0, 0x02DA6, "Ethi" },
{ 0x02DA8, 0x02DAE, "Ethi" },
{ 0x02DB0, 0x02DB6, "Ethi" },
{ 0x02DB8, 0x02DBE, "Ethi" },
{ 0x02DC0, 0x02DC6, "Ethi" },
{ 0x02DC8, 0x02DCE, "Ethi" },
{ 0x02DD0, 0x02DD6, "Ethi" },
{ 0x02DD8, 0x02DDE, "Ethi" },
{ 0x02DE0, 0x02DFF, "Cyrl" },
{ 0x02E00, 0x02E5D, "Zyyy" },
{ 0x02E60, 0x02E63, "Zyyy" },
{ 0x02E80, 0x02E99, "Hani" },
{ 0x02E9B, 0x02EF3, "Hani" },
{ 0x02F00, 0x02FD5, "Hani" },
{ 0x02FF0, 0x03004, "Zyyy" },
{ 0x03008, 0x03020, "Zyyy" },
{ 0x03021, 0x03029, "Hani" },
{ 0x0302A, 0x0302D, "Zinh" },
{ 0x0302E, 0x0302F, "Hang" },
{ 0x03030, 0x03037, "Zyyy" },
{ 0x03038, 0x0303B, "Hani" },
{ 0x0303C, 0x0303F, "Zyyy" },
{ 0x03041, 0x03096, "Hira" },
{ 0x03099, 0x0309A, "Zinh" },
{ 0x0309B, 0x0309C, "Zyyy" },
{ 0x0309D, 0x0309F, "Hira" },
{ 0x030A1, 0x030FA, "Kana" },
{ 0x030FB, 0x030FC, "Zyyy" },
{ 0x030FD, 0x030FF, "Kana" },
{ 0x03105, 0x0312F, "Bopo" },
{ 0x03131, 0x0318E, "Hang" },
{ 0x03190, 0x0319F, "Zyyy" },
{ 0x031A0, 0x031BF, "Bopo" },
{ 0x031C0, 0x031E5, "Zyyy" },
{ 0x031F0, 0x031FF, "Kana" },
{ 0x03200, 0x0321E, "Hang" },
{ 0x03220, 0x0325F, "Zyyy" },
{ 0x03260, 0x0327E, "Hang" },
{ 0x0327F, 0x032CF, "Zyyy" },
{ 0x032D0, 0x032FE, "Kana" },
{ 0x03300, 0x03357, "Kana" },
{ 0x03358, 0x033FF, "Zyyy" },
{ 0x03400, 0x04DBF, "Hani" },
{ 0x04DC0, 0x04DFF, "Zyyy" },
{ 0x04E00, 0x09FFF, "Hani" },
{ 0x0A000, 0x0A48C, "Yiii" },
{ 0x0A490, 0x0A4C6, "Yiii" },
{ 0x0A4D0, 0x0A4FF, "Lisu" },
{ 0x0A500, 0x0A62B, "Vaii" },
{ 0x0A640, 0x0A69F, "Cyrl" },
{ 0x0A6A0, 0x0A6F7, "Bamu" },
{ 0x0A700, 0x0A721, "Zyyy" },
{ 0x0A722, 0x0A787, "Latn" },
{ 0x0A788, 0x0A78A, "Zyyy" },
{ 0x0A78B, 0x0A7DD, "Latn" },
{ 0x0A7F1, 0x0A7FF, "Latn" },
{ 0x0A800, 0x0A82C, "Sylo" },
{ 0x0A830, 0x0A839, "Zyyy" },
{ 0x0A840, 0x0A877, "Phag" },
{ 0x0A880, 0x0A8C5, "Saur" },
{ 0x0A8CE, 0x0A8D9, "Saur" },
{ 0x0A8E0, 0x0A8FF, "Deva" },
{ 0x0A900, 0x0A92D, "Kali" },
{ 0x0A930, 0x0A953, "Rjng" },
{ 0x0A960, 0x0A97C, "Hang" },
{ 0x0A980, 0x0A9CD, "Java" },
{ 0x0A9D0, 0x0A9D9, "Java" },
{ 0x0A9DE, 0x0A9DF, "Java" },
{ 0x0A9E0, 0x0A9FE, "Mymr" },
{ 0x0AA00, 0x0AA36, "Cham" },
{ 0x0AA40, 0x0AA4D, "Cham" },
{ 0x0AA50, 0x0AA59, "Cham" },
{ 0x0AA5C, 0x0AA5F, "Cham" },
{ 0x0AA60, 0x0AA7F, "Mymr" },
{ 0x0AA80, 0x0AAC2, "Tavt" },
{ 0x0AADB, 0x0AADF, "Tavt" },
{ 0x0AAE0, 0x0AAF6, "Mtei" },
{ 0x0AB01, 0x0AB06, "Ethi" },
{ 0x0AB09, 0x0AB0E, "Ethi" },
{ 0x0AB11, 0x0AB16, "Ethi" },
{ 0x0AB20, 0x0AB26, "Ethi" },
{ 0x0AB28, 0x0AB2E, "Ethi" },
{ 0x0AB30, 0x0AB5A, "Latn" },
{ 0x0AB5C, 0x0AB64, "Latn" },
{ 0x0AB66, 0x0AB69, "Latn" },
{ 0x0AB6A, 0x0AB6B, "Zyyy" },
{ 0x0AB6C, 0x0AB6D, "Latn" },
{ 0x0AB70, 0x0ABBF, "Cher" },
{ 0x0ABC0, 0x0ABED, "Mtei" },
{ 0x0ABF0, 0x0ABF9, "Mtei" },
{ 0x0AC00, 0x0D7A3, "Hang" },
{ 0x0D7B0, 0x0D7C6, "Hang" },
{ 0x0D7CB, 0x0D7FB, "Hang" },
{ 0x0F900, 0x0FA6D, "Hani" },
{ 0x0FA70, 0x0FAD9, "Hani" },
{ 0x0FB00, 0x0FB06, "Latn" },
{ 0x0FB13, 0x0FB17, "Armn" },
{ 0x0FB1D, 0x0FB36, "Hebr" },
{ 0x0FB38, 0x0FB3C, "Hebr" },
{ 0x0FB40, 0x0FB41, "Hebr" },
{ 0x0FB43, 0x0FB44, "Hebr" },
{ 0x0FB46, 0x0FB4F, "Hebr" },
{ 0x0FB50, 0x0FD3D, "Arab" },
{ 0x0FD3E, 0x0FD3F, "Zyyy" },
{ 0x0FD40, 0x0FDCF, "Arab" },
{ 0x0FDF0, 0x0FDFF, "Arab" },
{ 0x0FE00, 0x0FE0F, "Zinh" },
{ 0x0FE10, 0x0FE19, "Zyyy" },
{ 0x0FE20, 0x0FE2D, "Zinh" },
{ 0x0FE2E, 0x0FE2F, "Cyrl" },
{ 0x0FE30, 0x0FE52, "Zyyy" },
{ 0x0FE54, 0x0FE66, "Zyyy" },
{ 0x0FE68, 0x0FE6B, "Zyyy" },
{ 0x0FE70, 0x0FE74, "Arab" },
{ 0x0FE76, 0x0FEFC, "Arab" },
{ 0x0FF01, 0x0FF20, "Zyyy" },
{ 0x0FF21, 0x0FF3A, "Latn" },
{ 0x0FF3B, 0x0FF40, "Zyyy" },
{ 0x0FF41, 0x0FF5A, "Latn" },
{ 0x0FF5B, 0x0FF65, "Zyyy" },
{ 0x0FF66, 0x0FF6F, "Kana" },
{ 0x0FF71, 0x0FF9D, "Kana" },
{ 0x0FF9E, 0x0FF9F, "Zyyy" },
{ 0x0FFA0, 0x0FFBE, "Hang" },
{ 0x0FFC2, 0x0FFC7, "Hang" },
{ 0x0FFCA, 0x0FFCF, "Hang" },
{ 0x0FFD2, 0x0FFD7, "Hang" },
{ 0x0FFDA, 0x0FFDC, "Hang" },
{ 0x0FFE0, 0x0FFE6, "Zyyy" },
{ 0x0FFE8, 0x0FFEE, "Zyyy" },
{ 0x0FFF9, 0x0FFFD, "Zyyy" },
{ 0x10000, 0x1000B, "Linb" },
{ 0x1000D, 0x10026, "Linb" },
{ 0x10028, 0x1003A, "Linb" },
{ 0x1003C, 0x1003D, "Linb" },
{ 0x1003F, 0x1004D, "Linb" },
{ 0x10050, 0x1005D, "Linb" },
{ 0x10080, 0x100FA, "Linb" },
{ 0x10100, 0x10102, "Zyyy" },
{ 0x10107, 0x10133, "Zyyy" },
{ 0x10137, 0x1013F, "Zyyy" },
{ 0x10140, 0x1018E, "Grek" },
{ 0x10190, 0x1019C, "Zyyy" },
{ 0x101D0, 0x101FC, "Zyyy" },
{ 0x10280, 0x1029C, "Lyci" },
{ 0x102A0, 0x102D0, "Cari" },
{ 0x102E1, 0x102FB, "Zyyy" },
{ 0x10300, 0x10323, "Ital" },
{ 0x1032D, 0x1032F, "Ital" },
{ 0x10330, 0x1034A, "Goth" },
{ 0x10350, 0x1037A, "Perm" },
{ 0x10380, 0x1039D, "Ugar" },
{ 0x103A0, 0x103C3, "Xpeo" },
{ 0x103C8, 0x103D5, "Xpeo" },
{ 0x10400, 0x1044F, "Dsrt" },
{ 0x10450, 0x1047F, "Shaw" },
{ 0x10480, 0x1049D, "Osma" },
{ 0x104A0, 0x104A9, "Osma" },
{ 0x104B0, 0x104D3, "Osge" },
{ 0x104D8, 0x104FB, "Osge" },
{ 0x10500, 0x10527, "Elba" },
{ 0x10530, 0x10563, "Aghb" },
{ 0x10570, 0x1057A, "Vith" },
{ 0x1057C, 0x1058A, "Vith" },
{ 0x1058C, 0x10592, "Vith" },
{ 0x10594, 0x10595, "Vith" },
{ 0x10597, 0x105A1, "Vith" },
{ 0x105A3, 0x105B1, "Vith" },
{ 0x105B3, 0x105B9, "Vith" },
{ 0x105BB, 0x105BC, "Vith" },
{ 0x105C0, 0x105F3, "Todr" },
{ 0x10600, 0x10736, "Lina" },
{ 0x10740, 0x10755, "Lina" },
{ 0x10760, 0x10767, "Lina" },
{ 0x10780, 0x10785, "Latn" },
{ 0x10787, 0x107B0, "Latn" },
{ 0x107B2, 0x107BF, "Latn" },
{ 0x10800, 0x10805, "Cprt" },
{ 0x1080A, 0x10835, "Cprt" },
{ 0x10837, 0x10838, "Cprt" },
{ 0x10840, 0x10855, "Armi" },
{ 0x10857, 0x1085F, "Armi" },
{ 0x10860, 0x1087F, "Palm" },
{ 0x10880, 0x1089E, "Nbat" },
{ 0x108A7, 0x108AF, "Nbat" },
{ 0x108E0, 0x108F2, "Hatr" },
{ 0x108F4, 0x108F5, "Hatr" },
{ 0x108FB, 0x108FF, "Hatr" },
{ 0x10900, 0x1091B, "Phnx" },
{ 0x10920, 0x10939, "Lydi" },
{ 0x10940, 0x10959, "Sidt" },
{ 0x10980, 0x1099F, "Mero" },
{ 0x109A0, 0x109B7, "Merc" },
{ 0x109BC, 0x109CF, "Merc" },
{ 0x109D2, 0x109FF, "Merc" },
{ 0x10A00, 0x10A03, "Khar" },
{ 0x10A05, 0x10A06, "Khar" },
{ 0x10A0C, 0x10A13, "Khar" },
{ 0x10A15, 0x10A17, "Khar" },
{ 0x10A19, 0x10A35, "Khar" },
{ 0x10A38, 0x10A3A, "Khar" },
{ 0x10A3F, 0x10A48, "Khar" },
{ 0x10A50, 0x10A58, "Khar" },
{ 0x10A60, 0x10A7F, "Sarb" },
{ 0x10A80, 0x10A9F, "Narb" },
{ 0x10AC0, 0x10AE6, "Mani" },
{ 0x10AEB, 0x10AF6, "Mani" },
{ 0x10B00, 0x10B35, "Avst" },
{ 0x10B39, 0x10B3F, "Avst" },
{ 0x10B40, 0x10B55, "Prti" },
{ 0x10B58, 0x10B5F, "Prti" },
{ 0x10B60, 0x10B72, "Phli" },
{ 0x10B78, 0x10B7F, "Phli" },
{ 0x10B80, 0x10B91, "Phlp" },
{ 0x10B99, 0x10B9C, "Phlp" },
{ 0x10BA9, 0x10BAF, "Phlp" },
{ 0x10C00, 0x10C48, "Orkh" },
{ 0x10C80, 0x10CB2, "Hung" },
{ 0x10CC0, 0x10CF2, "Hung" },
{ 0x10CFA, 0x10CFF, "Hung" },
{ 0x10D00, 0x10D27, "Rohg" },
{ 0x10D30, 0x10D39, "Rohg" },
{ 0x10D40, 0x10D65, "Gara" },
{ 0x10D69, 0x10D85, "Gara" },
{ 0x10D8E, 0x10D8F, "Gara" },
{ 0x10E60, 0x10E7E, "Arab" },
{ 0x10E80, 0x10EA9, "Yezi" },
{ 0x10EAB, 0x10EAD, "Yezi" },
{ 0x10EB0, 0x10EB1, "Yezi" },
{ 0x10EC2, 0x10EC7, "Arab" },
{ 0x10EC9, 0x10EEE, "Arab" },
{ 0x10EF0, 0x10EFF, "Arab" },
{ 0x10F00, 0x10F27, "Sogo" },
{ 0x10F30, 0x10F59, "Sogd" },
{ 0x10F70, 0x10F89, "Ougr" },
{ 0x10FB0, 0x10FCB, "Chrs" },
{ 0x10FE0, 0x10FF6, "Elym" },
{ 0x11000, 0x1104D, "Brah" },
{ 0x11052, 0x11075, "Brah" },
{ 0x11080, 0x110C2, "Kthi" },
{ 0x110D0, 0x110E8, "Sora" },
{ 0x110F0, 0x110F9, "Sora" },
{ 0x11100, 0x11134, "Cakm" },
{ 0x11136, 0x11147, "Cakm" },
{ 0x11150, 0x11176, "Mahj" },
{ 0x11180, 0x111DF, "Shrd" },
{ 0x111E1, 0x111F4, "Sinh" },
{ 0x11200, 0x11211, "Khoj" },
{ 0x11213, 0x11241, "Khoj" },
{ 0x11280, 0x11286, "Mult" },
{ 0x1128A, 0x1128D, "Mult" },
{ 0x1128F, 0x1129D, "Mult" },
{ 0x1129F, 0x112A9, "Mult" },
{ 0x112B0, 0x112EA, "Sind" },
{ 0x112F0, 0x112F9, "Sind" },
{ 0x11300, 0x11303, "Gran" },
{ 0x11305, 0x1130C, "Gran" },
{ 0x1130F, 0x11310, "Gran" },
{ 0x11313, 0x11328, "Gran" },
{ 0x1132A, 0x11330, "Gran" },
{ 0x11332, 0x11333, "Gran" },
{ 0x11335, 0x11339, "Gran" },
{ 0x1133C, 0x11344, "Gran" },
{ 0x11347, 0x11348, "Gran" },
{ 0x1134B, 0x1134D, "Gran" },
{ 0x1135D, 0x11363, "Gran" },
{ 0x11366, 0x1136C, "Gran" },
{ 0x11370, 0x11374, "Gran" },
{ 0x11380, 0x11389, "Tutg" },
{ 0x11390, 0x113B5, "Tutg" },
{ 0x113B7, 0x113C0, "Tutg" },
{ 0x113C7, 0x113CA, "Tutg" },
{ 0x113CC, 0x113D5, "Tutg" },
{ 0x113D7, 0x113D8, "Tutg" },
{ 0x113E1, 0x113E2, "Tutg" },
{ 0x11400, 0x1145B, "Newa" },
{ 0x1145D, 0x11461, "Newa" },
{ 0x11480, 0x114C7, "Tirh" },
{ 0x114D0, 0x114D9, "Tirh" },
{ 0x11580, 0x115B5, "Sidd" },
{ 0x115B8, 0x115DD, "Sidd" },
{ 0x11600, 0x11644, "Modi" },
{ 0x11650, 0x11659, "Modi" },
{ 0x11660, 0x1166C, "Mong" },
{ 0x11680, 0x116B9, "Takr" },
{ 0x116C0, 0x116C9, "Takr" },
{ 0x116D0, 0x116E3, "Mymr" },
{ 0x11700, 0x1171A, "Ahom" },
{ 0x1171D, 0x1172B, "Ahom" },
{ 0x11730, 0x11746, "Ahom" },
{ 0x11800, 0x1183B, "Dogr" },
{ 0x118A0, 0x118F2, "Wara" },
{ 0x11900, 0x11906, "Diak" },
{ 0x1190C, 0x11913, "Diak" },
{ 0x11915, 0x11916, "Diak" },
{ 0x11918, 0x11935, "Diak" },
{ 0x11937, 0x11938, "Diak" },
{ 0x1193B, 0x11946, "Diak" },
{ 0x11950, 0x11959, "Diak" },
{ 0x119A0, 0x119A7, "Nand" },
{ 0x119AA, 0x119D7, "Nand" },
{ 0x119DA, 0x119E4, "Nand" },
{ 0x11A00, 0x11A47, "Zanb" },
{ 0x11A50, 0x11AA2, "Soyo" },
{ 0x11AB0, 0x11ABF, "Cans" },
{ 0x11AC0, 0x11AF8, "Pauc" },
{ 0x11B00, 0x11B0A, "Deva" },
{ 0x11B60, 0x11B67, "Shrd" },
{ 0x11BC0, 0x11BE1, "Sunu" },
{ 0x11BF0, 0x11BF9, "Sunu" },
{ 0x11C00, 0x11C08, "Bhks" },
{ 0x11C0A, 0x11C36, "Bhks" },
{ 0x11C38, 0x11C45, "Bhks" },
{ 0x11C50, 0x11C6C, "Bhks" },
{ 0x11C70, 0x11C8F, "Marc" },
{ 0x11C92, 0x11CA7, "Marc" },
{ 0x11CA9, 0x11CB6, "Marc" },
{ 0x11D00, 0x11D06, "Gonm" },
{ 0x11D08, 0x11D09, "Gonm" },
{ 0x11D0B, 0x11D36, "Gonm" },
{ 0x11D3C, 0x11D3D, "Gonm" },
{ 0x11D3F, 0x11D47, "Gonm" },
{ 0x11D50, 0x11D59, "Gonm" },
{ 0x11D60, 0x11D65, "Gong" },
{ 0x11D67, 0x11D68, "Gong" },
{ 0x11D6A, 0x11D8E, "Gong" },
{ 0x11D90, 0x11D91, "Gong" },
{ 0x11D93, 0x11D98, "Gong" },
{ 0x11DA0, 0x11DA9, "Gong" },
{ 0x11DB0, 0x11DDB, "Tols" },
{ 0x11DE0, 0x11DE9, "Tols" },
{ 0x11DF0, 0x11DF1, "Beng" },
{ 0x11EE0, 0x11EF8, "Maka" },
{ 0x11F00, 0x11F10, "Kawi" },
{ 0x11F12, 0x11F3A, "Kawi" },
{ 0x11F3E, 0x11F5A, "Kawi" },
{ 0x11FC0, 0x11FF1, "Taml" },
{ 0x12000, 0x12399, "Xsux" },
{ 0x12400, 0x12543, "Xsux" },
{ 0x12550, 0x125A7, "Xsux" },
{ 0x125A8, 0x1264B, "Pcun" },
{ 0x1264C, 0x12686, "Xsux" },
{ 0x12F90, 0x12FF2, "Cpmn" },
{ 0x13000, 0x13455, "Egyp" },
{ 0x13460, 0x143FA, "Egyp" },
{ 0x14400, 0x14646, "Hluw" },
{ 0x16100, 0x16139, "Gukh" },
{ 0x16800, 0x16A38, "Bamu" },
{ 0x16A40, 0x16A5E, "Mroo" },
{ 0x16A60, 0x16A69, "Mroo" },
{ 0x16A6E, 0x16A6F, "Mroo" },
{ 0x16A70, 0x16ABE, "Tnsa" },
{ 0x16AC0, 0x16AC9, "Tnsa" },
{ 0x16AD0, 0x16AED, "Bass" },
{ 0x16AF0, 0x16AF5, "Bass" },
{ 0x16B00, 0x16B45, "Hmng" },
{ 0x16B50, 0x16B59, "Hmng" },
{ 0x16B5B, 0x16B61, "Hmng" },
{ 0x16B63, 0x16B77, "Hmng" },
{ 0x16B7D, 0x16B8F, "Hmng" },
{ 0x16D40, 0x16D79, "Krai" },
{ 0x16E40, 0x16E9A, "Medf" },
{ 0x16EA0, 0x16EB8, "Berf" },
{ 0x16EBB, 0x16ED3, "Berf" },
{ 0x16F00, 0x16F4A, "Plrd" },
{ 0x16F4F, 0x16F87, "Plrd" },
{ 0x16F8F, 0x16F9F, "Plrd" },
{ 0x16FE2, 0x16FE3, "Hani" },
{ 0x16FF0, 0x16FF6, "Hani" },
{ 0x17000, 0x18AFF, "Tang" },
{ 0x18B00, 0x18CDA, "Kits" },
{ 0x18D00, 0x18D20, "Tang" },
{ 0x18D80, 0x18DF2, "Tang" },
{ 0x18E00, 0x19191, "Jurc" },
{ 0x191A0, 0x191D2, "Jurc" },
{ 0x1AFF0, 0x1AFF3, "Kana" },
{ 0x1AFF5, 0x1AFFB, "Kana" },
{ 0x1AFFD, 0x1AFFE, "Kana" },
{ 0x1B001, 0x1B11F, "Hira" },
{ 0x1B120, 0x1B122, "Kana" },
{ 0x1B124, 0x1B128, "Kana" },
{ 0x1B150, 0x1B152, "Hira" },
{ 0x1B164, 0x1B168, "Kana" },
{ 0x1B170, 0x1B2FB, "Nshu" },
{ 0x1BC00, 0x1BC6A, "Dupl" },
{ 0x1BC70, 0x1BC7C, "Dupl" },
{ 0x1BC80, 0x1BC88, "Dupl" },
{ 0x1BC90, 0x1BC99, "Dupl" },
{ 0x1BC9C, 0x1BC9F, "Dupl" },
{ 0x1BCA0, 0x1BCA3, "Zyyy" },
{ 0x1CC00, 0x1CCFC, "Zyyy" },
{ 0x1CD00, 0x1CEB3, "Zyyy" },
{ 0x1CEBA, 0x1CED0, "Zyyy" },
{ 0x1CED2, 0x1CED4, "Zyyy" },
{ 0x1CEDD, 0x1CEFD, "Zyyy" },
{ 0x1CF00, 0x1CF2D, "Zinh" },
{ 0x1CF30, 0x1CF46, "Zinh" },
{ 0x1CF50, 0x1CFC3, "Zyyy" },
{ 0x1D000, 0x1D0F5, "Zyyy" },
{ 0x1D100, 0x1D126, "Zyyy" },
{ 0x1D127, 0x1D128, "Zinh" },
{ 0x1D129, 0x1D166, "Zyyy" },
{ 0x1D167, 0x1D169, "Zinh" },
{ 0x1D16A, 0x1D17A, "Zyyy" },
{ 0x1D17B, 0x1D182, "Zinh" },
{ 0x1D183, 0x1D184, "Zyyy" },
{ 0x1D185, 0x1D18B, "Zinh" },
{ 0x1D18C, 0x1D1A9, "Zyyy" },
{ 0x1D1AA, 0x1D1AD, "Zinh" },
{ 0x1D1AE, 0x1D1FF, "Zyyy" },
{ 0x1D200, 0x1D245, "Grek" },
{ 0x1D250, 0x1D25A, "Zyyy" },
{ 0x1D25B, 0x1D25C, "Zinh" },
{ 0x1D25D, 0x1D281, "Zyyy" },
{ 0x1D2C0, 0x1D2D3, "Zyyy" },
{ 0x1D2E0, 0x1D2F3, "Zyyy" },
{ 0x1D300, 0x1D356, "Zyyy" },
{ 0x1D360, 0x1D378, "Zyyy" },
{ 0x1D400, 0x1D454, "Zyyy" },
{ 0x1D456, 0x1D49C, "Zyyy" },
{ 0x1D49E, 0x1D49F, "Zyyy" },
{ 0x1D4A5, 0x1D4A6, "Zyyy" },
{ 0x1D4A9, 0x1D4AC, "Zyyy" },
{ 0x1D4AE, 0x1D4B9, "Zyyy" },
{ 0x1D4BD, 0x1D4C3, "Zyyy" },
{ 0x1D4C5, 0x1D505, "Zyyy" },
{ 0x1D507, 0x1D50A, "Zyyy" },
{ 0x1D50D, 0x1D514, "Zyyy" },
{ 0x1D516, 0x1D51C, "Zyyy" },
{ 0x1D51E, 0x1D539, "Zyyy" },
{ 0x1D53B, 0x1D53E, "Zyyy" },
{ 0x1D540, 0x1D544, "Zyyy" },
{ 0x1D54A, 0x1D550, "Zyyy" },
{ 0x1D552, 0x1D6A6, "Zyyy" },
{ 0x1D6A8, 0x1D7CB, "Zyyy" },
{ 0x1D7CE, 0x1D7FF, "Zyyy" },
{ 0x1D800, 0x1DA8B, "Sgnw" },
{ 0x1DA9B, 0x1DA9F, "Sgnw" },
{ 0x1DAA1, 0x1DAAF, "Sgnw" },
{ 0x1DB00, 0x1DB1C, "Zyyy" },
{ 0x1DF00, 0x1DF81, "Latn" },
{ 0x1DF90, 0x1DF96, "Latn" },
{ 0x1DFCD, 0x1DFF2, "Latn" },
{ 0x1DFF3, 0x1DFF4, "Grek" },
{ 0x1DFF5, 0x1DFFF, "Latn" },
{ 0x1E000, 0x1E006, "Glag" },
{ 0x1E008, 0x1E018, "Glag" },
{ 0x1E01B, 0x1E021, "Glag" },
{ 0x1E023, 0x1E024, "Glag" },
{ 0x1E026, 0x1E02A, "Glag" },
{ 0x1E030, 0x1E06D, "Cyrl" },
{ 0x1E100, 0x1E12C, "Hmnp" },
{ 0x1E130, 0x1E13D, "Hmnp" },
{ 0x1E140, 0x1E149, "Hmnp" },
{ 0x1E14E, 0x1E14F, "Hmnp" },
{ 0x1E290, 0x1E2AE, "Toto" },
{ 0x1E2C0, 0x1E2F9, "Wcho" },
{ 0x1E4D0, 0x1E4F9, "Nagm" },
{ 0x1E5D0, 0x1E5FA, "Onao" },
{ 0x1E6C0, 0x1E6DE, "Tayo" },
{ 0x1E6E0, 0x1E6F5, "Tayo" },
{ 0x1E6FE, 0x1E6FF, "Tayo" },
{ 0x1E7E0, 0x1E7E6, "Ethi" },
{ 0x1E7E8, 0x1E7EB, "Ethi" },
{ 0x1E7ED, 0x1E7EE, "Ethi" },
{ 0x1E7F0, 0x1E7FE, "Ethi" },
{ 0x1E800, 0x1E8C4, "Mend" },
{ 0x1E8C7, 0x1E8D6, "Mend" },
{ 0x1E900, 0x1E94B, "Adlm" },
{ 0x1E950, 0x1E959, "Adlm" },
{ 0x1E95E, 0x1E95F, "Adlm" },
{ 0x1EC71, 0x1ECB4, "Zyyy" },
{ 0x1ED01, 0x1ED3D, "Zyyy" },
{ 0x1EE00, 0x1EE03, "Arab" },
{ 0x1EE05, 0x1EE1F, "Arab" },
{ 0x1EE21, 0x1EE22, "Arab" },
{ 0x1EE29, 0x1EE32, "Arab" },
{ 0x1EE34, 0x1EE37, "Arab" },
{ 0x1EE4D, 0x1EE4F, "Arab" },
{ 0x1EE51, 0x1EE52, "Arab" },
{ 0x1EE61, 0x1EE62, "Arab" },
{ 0x1EE67, 0x1EE6A, "Arab" },
{ 0x1EE6C, 0x1EE72, "Arab" },
{ 0x1EE74, 0x1EE77, "Arab" },
{ 0x1EE79, 0x1EE7C, "Arab" },
{ 0x1EE80, 0x1EE89, "Arab" },
{ 0x1EE8B, 0x1EE9B, "Arab" },
{ 0x1EEA1, 0x1EEA3, "Arab" },
{ 0x1EEA5, 0x1EEA9, "Arab" },
{ 0x1EEAB, 0x1EEBB, "Arab" },
{ 0x1EEF0, 0x1EEF1, "Arab" },
{ 0x1F000, 0x1F02B, "Zyyy" },
{ 0x1F030, 0x1F093, "Zyyy" },
{ 0x1F0A0, 0x1F0AE, "Zyyy" },
{ 0x1F0B1, 0x1F0BF, "Zyyy" },
{ 0x1F0C1, 0x1F0CF, "Zyyy" },
{ 0x1F0D1, 0x1F0F5, "Zyyy" },
{ 0x1F100, 0x1F1AE, "Zyyy" },
{ 0x1F1E6, 0x1F1FF, "Zyyy" },
{ 0x1F201, 0x1F202, "Zyyy" },
{ 0x1F210, 0x1F23B, "Zyyy" },
{ 0x1F240, 0x1F248, "Zyyy" },
{ 0x1F250, 0x1F251, "Zyyy" },
{ 0x1F260, 0x1F265, "Zyyy" },
{ 0x1F300, 0x1F6D9, "Zyyy" },
{ 0x1F6DC, 0x1F6EC, "Zyyy" },
{ 0x1F6F0, 0x1F6FC, "Zyyy" },
{ 0x1F700, 0x1F7DB, "Zyyy" },
{ 0x1F7E0, 0x1F7EB, "Zyyy" },
{ 0x1F7F0, 0x1F80B, "Zyyy" },
{ 0x1F810, 0x1F847, "Zyyy" },
{ 0x1F850, 0x1F859, "Zyyy" },
{ 0x1F860, 0x1F887, "Zyyy" },
{ 0x1F890, 0x1F8AD, "Zyyy" },
{ 0x1F8B0, 0x1F8BB, "Zyyy" },
{ 0x1F8C0, 0x1F8C1, "Zyyy" },
{ 0x1F8D0, 0x1F8D8, "Zyyy" },
{ 0x1F900, 0x1FA57, "Zyyy" },
{ 0x1FA60, 0x1FA6D, "Zyyy" },
{ 0x1FA70, 0x1FA7C, "Zyyy" },
{ 0x1FA80, 0x1FAC6, "Zyyy" },
{ 0x1FACC, 0x1FADD, "Zyyy" },
{ 0x1FADF, 0x1FAEB, "Zyyy" },
{ 0x1FAEF, 0x1FAFA, "Zyyy" },
{ 0x1FB00, 0x1FB92, "Zyyy" },
{ 0x1FB94, 0x1FBFA, "Zyyy" },
{ 0x20000, 0x2A6DF, "Hani" },
{ 0x2A700, 0x2B81E, "Hani" },
{ 0x2B820, 0x2CEAD, "Hani" },
{ 0x2CEB0, 0x2EBE0, "Hani" },
{ 0x2EBF0, 0x2EE5D, "Hani" },
{ 0x2F800, 0x2FA1D, "Hani" },
{ 0x30000, 0x3134A, "Hani" },
{ 0x31350, 0x33479, "Hani" },
{ 0x3D000, 0x3FC3F, "Seal" },
{ 0xE0020, 0xE007F, "Zyyy" },
{ 0xE0100, 0xE01EF, "Zinh" },
},
-- Scripts.txt gives full names; here we consider them aliases to save space.
aliases = {
Adlm = "Adlam",
Aghb = "Caucasian Albanian",
Ahom = "Ahom",
Arab = "Arabic",
Armi = "Imperial Aramaic",
Armn = "Armenian",
Avst = "Avestan",
Bali = "Balinese",
Bamu = "Bamum",
Bass = "Bassa Vah",
Batk = "Batak",
Beng = "Bengali",
Berf = "Beria Erfe",
Bhks = "Bhaiksuki",
Bopo = "Bopomofo",
Brah = "Brahmi",
Brai = "Braille",
Bugi = "Buginese",
Buhd = "Buhid",
Cakm = "Chakma",
Cans = "Canadian Aboriginal",
Cari = "Carian",
Cham = "Cham",
Cher = "Cherokee",
Chrs = "Chorasmian",
Copt = "Coptic",
Cpmn = "Cypro Minoan",
Cprt = "Cypriot",
Cyrl = "Cyrillic",
Deva = "Devanagari",
Diak = "Dives Akuru",
Dogr = "Dogra",
Dsrt = "Deseret",
Dupl = "Duployan",
Egyp = "Egyptian Hieroglyphs",
Elba = "Elbasan",
Elym = "Elymaic",
Ethi = "Ethiopic",
Gara = "Garay",
Geor = "Georgian",
Glag = "Glagolitic",
Gong = "Gunjala Gondi",
Gonm = "Masaram Gondi",
Goth = "Gothic",
Gran = "Grantha",
Grek = "Greek",
Gujr = "Gujarati",
Gukh = "Gurung Khema",
Guru = "Gurmukhi",
Hang = "Hangul",
Hani = "Han",
Hano = "Hanunoo",
Hatr = "Hatran",
Hebr = "Hebrew",
Hira = "Hiragana",
Hluw = "Anatolian Hieroglyphs",
Hmng = "Pahawh Hmong",
Hmnp = "Nyiakeng Puachue Hmong",
Hrkt = "Katakana Or Hiragana",
Hung = "Old Hungarian",
Ital = "Old Italic",
Java = "Javanese",
Jurc = "Jurchen",
Kali = "Kayah Li",
Kana = "Katakana",
Kawi = "Kawi",
Khar = "Kharoshthi",
Khmr = "Khmer",
Khoj = "Khojki",
Kits = "Khitan Small Script",
Knda = "Kannada",
Krai = "Kirat Rai",
Kthi = "Kaithi",
Lana = "Tai Tham",
Laoo = "Lao",
Latn = "Latin",
Lepc = "Lepcha",
Limb = "Limbu",
Lina = "Linear A",
Linb = "Linear B",
Lisu = "Lisu",
Lyci = "Lycian",
Lydi = "Lydian",
Mahj = "Mahajani",
Maka = "Makasar",
Mand = "Mandaic",
Mani = "Manichaean",
Marc = "Marchen",
Medf = "Medefaidrin",
Mend = "Mende Kikakui",
Merc = "Meroitic Cursive",
Mero = "Meroitic Hieroglyphs",
Mlym = "Malayalam",
Modi = "Modi",
Mong = "Mongolian",
Mroo = "Mro",
Mtei = "Meetei Mayek",
Mult = "Multani",
Mymr = "Myanmar",
Nagm = "Nag Mundari",
Nand = "Nandinagari",
Narb = "Old North Arabian",
Nbat = "Nabataean",
Newa = "Newa",
Nkoo = "NKo",
Nshu = "Nushu",
Ogam = "Ogham",
Olck = "Ol Chiki",
Onao = "Ol Onal",
Orkh = "Old Turkic",
Orya = "Oriya",
Osge = "Osage",
Osma = "Osmanya",
Ougr = "Old Uyghur",
Palm = "Palmyrene",
Pauc = "Pau Cin Hau",
Pcun = "Proto Cuneiform",
Perm = "Old Permic",
Phag = "Phags Pa",
Phli = "Inscriptional Pahlavi",
Phlp = "Psalter Pahlavi",
Phnx = "Phoenician",
Plrd = "Miao",
Prti = "Inscriptional Parthian",
Rjng = "Rejang",
Rohg = "Hanifi Rohingya",
Runr = "Runic",
Samr = "Samaritan",
Sarb = "Old South Arabian",
Saur = "Saurashtra",
Seal = "Seal",
Sgnw = "SignWriting",
Shaw = "Shavian",
Shrd = "Sharada",
Sidd = "Siddham",
Sidt = "Sidetic",
Sind = "Khudawadi",
Sinh = "Sinhala",
Sogd = "Sogdian",
Sogo = "Old Sogdian",
Sora = "Sora Sompeng",
Soyo = "Soyombo",
Sund = "Sundanese",
Sunu = "Sunuwar",
Sylo = "Syloti Nagri",
Syrc = "Syriac",
Tagb = "Tagbanwa",
Takr = "Takri",
Tale = "Tai Le",
Talu = "New Tai Lue",
Taml = "Tamil",
Tang = "Tangut",
Tavt = "Tai Viet",
Tayo = "Tai Yo",
Telu = "Telugu",
Tfng = "Tifinagh",
Tglg = "Tagalog",
Thaa = "Thaana",
Thai = "Thai",
Tibt = "Tibetan",
Tirh = "Tirhuta",
Tnsa = "Tangsa",
Todr = "Todhri",
Tols = "Tolong Siki",
Toto = "Toto",
Tutg = "Tulu Tigalari",
Ugar = "Ugaritic",
Vaii = "Vai",
Vith = "Vithkuqi",
Wara = "Warang Citi",
Wcho = "Wancho",
Xpeo = "Old Persian",
Xsux = "Cuneiform",
Yezi = "Yezidi",
Yiii = "Yi",
Zanb = "Zanabazar Square",
Zinh = "Inherited",
Zyyy = "Common",
Zzzz = "Unknown",
},
}
-- Required for binary search function in [[Module:Language/scripts]].
-- Cannot get length of module loaded with mw.loadData.
data.ranges.length = #data.ranges
data.rtl = {}
for _, script in ipairs(mw.loadData "Module:Lang/data".rtl_scripts) do
-- [[Module:Lang/data]] has script codes in lowercase;
-- this module has script codes with the first letter capitalized.
data.rtl[script:gsub("^%a", string.upper)] = true
end
return data
fjhxlm1zuz2q0wxkqoboghr4ezh7nqn
Tempilet:Angle bracket
10
2411
32839
2023-03-12T06:36:44Z
en>Kwamikagami
0
nowrap
32839
wikitext
text/x-wiki
{{nowrap|⟨{{{1|}}}⟩}}<noinclude>
{{documentation}}
</noinclude>
52dqqijjyce1qbva5k0gb4kcbuqdqoc
32840
32839
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Angle_bracket]]
32839
wikitext
text/x-wiki
{{nowrap|⟨{{{1|}}}⟩}}<noinclude>
{{documentation}}
</noinclude>
52dqqijjyce1qbva5k0gb4kcbuqdqoc
Tempilet:Ifnumber
10
2412
32843
2025-08-05T05:23:12Z
en>Theknightwho
0
Make substable.
32843
wikitext
text/x-wiki
<includeonly>{{safesubst:#ifeq: {{safesubst:lc:{{{1|}}}}} | e | {{{3|0}}} | {{safesubst:#iferror:{{safesubst:#expr:{{{1|}}}*0}}|{{{3|0}}}|{{{2|1}}}}} }}</includeonly><noinclude>{{Documentation}}</noinclude>
8nd300px3togeighpfyhamb0j2zhahp
32844
32843
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Ifnumber]]
32843
wikitext
text/x-wiki
<includeonly>{{safesubst:#ifeq: {{safesubst:lc:{{{1|}}}}} | e | {{{3|0}}} | {{safesubst:#iferror:{{safesubst:#expr:{{{1|}}}*0}}|{{{3|0}}}|{{{2|1}}}}} }}</includeonly><noinclude>{{Documentation}}</noinclude>
8nd300px3togeighpfyhamb0j2zhahp
Tempilet:Longlink
10
2413
32845
2020-08-15T01:59:49Z
en>Neveselbert
0
display:inline-block
32845
wikitext
text/x-wiki
<div style="display:inline-block; padding:0.2em 0.4em; line-height:1.2em; {{{style|}}}">{{{1}}}</div><noinclude>
{{documentation}}
<!---Please add metadata (categories, interwikis) to the <includeonly>
section at the bottom of [[Template:Longlink/doc]], not here - thanks!--->
</noinclude>
jbpwb5t2ccokkysfg9wbpo3chgz7vpn
32846
32845
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Longlink]]
32845
wikitext
text/x-wiki
<div style="display:inline-block; padding:0.2em 0.4em; line-height:1.2em; {{{style|}}}">{{{1}}}</div><noinclude>
{{documentation}}
<!---Please add metadata (categories, interwikis) to the <includeonly>
section at the bottom of [[Template:Longlink/doc]], not here - thanks!--->
</noinclude>
jbpwb5t2ccokkysfg9wbpo3chgz7vpn
Tempilet:Greater color contrast ratio
10
2414
32847
2018-02-23T16:29:56Z
en>Primefac
0
Changed protection level for "[[Template:Greater color contrast ratio]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32847
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:Color contrast|greatercontrast}}</includeonly><noinclude>
{{documentation}}
</noinclude>
rf2pxg07x3v7fq91j9zzu6nj4e8wbrh
32848
32847
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Greater_color_contrast_ratio]]
32847
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:Color contrast|greatercontrast}}</includeonly><noinclude>
{{documentation}}
</noinclude>
rf2pxg07x3v7fq91j9zzu6nj4e8wbrh
Tempilet:Legend
10
2415
32849
2026-11-10T03:08:12Z
en>Vestrian24Bio
0
add opacity (TPER)
32849
wikitext
text/x-wiki
<includeonly><!--
--><templatestyles src="Legend/styles.css" /><!--
--><div class="legend"><!--
--><span class="legend-color {{#if:{{{invert|}}}|skin-invert|mw-no-invert}}" style="<!--
-->{{#if:{{{border|}}}|border: {{{border}}};|{{#if:{{{outline|}}}|border: 1px solid {{{outline}}};}}}}<!--
-->{{#if:{{{1|}}}|{{greater color contrast ratio|{{{1}}}|white|black|css=y}}}}<!--
-->{{#if:{{{textcolor|}}}|color:{{{textcolor}}};}}<!--
-->{{#if:{{{size|}}}|font-size:{{{size}}};}}<!--
-->{{#if:{{{opacity|}}}|opacity:{{{opacity}}};}}<!--
-->-webkit-print-color-adjust: exact; print-color-adjust: exact;<!--
-->"><!--
-->{{#if:{{{text|}}}{{{alt|}}}
| <span class="legend-text" style="{{#if:{{{alt|}}}|color:{{{1|}}};}}{{#ifeq:{{{monospace|}}}|no||font-family: monospace, monospace;}}">{{If empty|{{{alt|}}}|{{Encodefirst|{{{text|}}}}}| }}</span>| }}<!--
--></span><!--
--> {{{2|}}}<!--
--></div><!--
--></includeonly><noinclude>
{{Documentation}}
</noinclude>
k4qvktoiwjls91j4gi1chx08ubg1ynj
32850
32849
2026-11-11T18:30:08Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Legend]]
32849
wikitext
text/x-wiki
<includeonly><!--
--><templatestyles src="Legend/styles.css" /><!--
--><div class="legend"><!--
--><span class="legend-color {{#if:{{{invert|}}}|skin-invert|mw-no-invert}}" style="<!--
-->{{#if:{{{border|}}}|border: {{{border}}};|{{#if:{{{outline|}}}|border: 1px solid {{{outline}}};}}}}<!--
-->{{#if:{{{1|}}}|{{greater color contrast ratio|{{{1}}}|white|black|css=y}}}}<!--
-->{{#if:{{{textcolor|}}}|color:{{{textcolor}}};}}<!--
-->{{#if:{{{size|}}}|font-size:{{{size}}};}}<!--
-->{{#if:{{{opacity|}}}|opacity:{{{opacity}}};}}<!--
-->-webkit-print-color-adjust: exact; print-color-adjust: exact;<!--
-->"><!--
-->{{#if:{{{text|}}}{{{alt|}}}
| <span class="legend-text" style="{{#if:{{{alt|}}}|color:{{{1|}}};}}{{#ifeq:{{{monospace|}}}|no||font-family: monospace, monospace;}}">{{If empty|{{{alt|}}}|{{Encodefirst|{{{text|}}}}}| }}</span>| }}<!--
--></span><!--
--> {{{2|}}}<!--
--></div><!--
--></includeonly><noinclude>
{{Documentation}}
</noinclude>
k4qvktoiwjls91j4gi1chx08ubg1ynj
Tempilet:Legend/styles.css
10
2416
32851
2020-10-03T19:24:47Z
en>Nihiltres
0
Updated (a touch boldly) based on discussion on talk; sets legend-color size and line-height to 1.25 em, makes width minimum, not fixed, and removes font-size
32851
sanitized-css
text/css
/* {{pp-template}} */
.legend {
page-break-inside: avoid;
break-inside: avoid-column;
}
.legend-color {
display: inline-block;
min-width: 1.25em;
height: 1.25em;
line-height: 1.25;
margin: 1px 0;
text-align: center;
border: 1px solid black;
background-color: transparent;
color: black;
}
.legend-text {/*empty for now, but part of the design!*/}
snsolhs3l12896xqc89e8b5hu9itnmf
32852
32851
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Legend/styles.css]]
32851
sanitized-css
text/css
/* {{pp-template}} */
.legend {
page-break-inside: avoid;
break-inside: avoid-column;
}
.legend-color {
display: inline-block;
min-width: 1.25em;
height: 1.25em;
line-height: 1.25;
margin: 1px 0;
text-align: center;
border: 1px solid black;
background-color: transparent;
color: black;
}
.legend-text {/*empty for now, but part of the design!*/}
snsolhs3l12896xqc89e8b5hu9itnmf
Tempilet:Wrap
10
2417
32853
2026-04-12T21:37:46Z
en>TechnoSquirrel69
0
Implementing [[Template talk:Nowrap begin#Template-protected edit request on 2 April 2026 - move hatnote to doc|template-protected edit request]] from W.andrea
32853
wikitext
text/x-wiki
<includeonly><span class="wrap">{{{1| }}}</span></includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
jx32097fuqyo6uie238zvhezzt5d0r5
32854
32853
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wrap]]
32853
wikitext
text/x-wiki
<includeonly><span class="wrap">{{{1| }}}</span></includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
jx32097fuqyo6uie238zvhezzt5d0r5
Tempilet:First word
10
2418
32855
2018-02-13T16:56:52Z
en>Rich Farmbrough
0
/* top */
32855
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:String|match|s={{{1}}}|^[^{{{sep|%s}}}]*}}<noinclude>
{{documentation}}</noinclude>
4k6jihkqglgyeyxoy1zxc8gp6efqis0
32856
32855
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:First_word]]
32855
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:String|match|s={{{1}}}|^[^{{{sep|%s}}}]*}}<noinclude>
{{documentation}}</noinclude>
4k6jihkqglgyeyxoy1zxc8gp6efqis0
Tempilet:Endangered Languages Project
10
2419
32857
2021-01-29T18:02:06Z
en>MusikBot II
0
Protected "[[Template:Endangered Languages Project]]": [[Wikipedia:High-risk templates|High-risk template or module]] ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32857
wikitext
text/x-wiki
{{#invoke:Endangered Languages Project |make_entry |elpname={{{ELPname|}}} |elpcode={{{ELP|}}} |qid={{{qid|}}} }}<noinclude>
{{documentation}}
</noinclude>
0gibu7vfktmukqa04kp6juaqa7zhsrp
32858
32857
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Endangered_Languages_Project]]
32857
wikitext
text/x-wiki
{{#invoke:Endangered Languages Project |make_entry |elpname={{{ELPname|}}} |elpcode={{{ELP|}}} |qid={{{qid|}}} }}<noinclude>
{{documentation}}
</noinclude>
0gibu7vfktmukqa04kp6juaqa7zhsrp
Tempilet:Glottolink
10
2420
32859
2026-07-06T06:40:09Z
en>Amire80
0
add TemplateData
32859
wikitext
text/x-wiki
[https://glottolog.org/resource/languoid/id/{{{1|}}} {{{2|{{{1|}}}}}}]<noinclude>
{{documentation}}
<templatedata>
{
"params": {
"1": {
"label": "Glottolog language code",
"type": "line",
"required": true
},
"2": {
"label": "Glottolog language name",
"type": "line",
"suggested": true,
"description": "If not given, the code is shown."
}
}
}
</templatedata></noinclude>
nqqkfn1uatzyc6dmiefjrm3y6kp1eqk
32860
32859
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Glottolink]]
32859
wikitext
text/x-wiki
[https://glottolog.org/resource/languoid/id/{{{1|}}} {{{2|{{{1|}}}}}}]<noinclude>
{{documentation}}
<templatedata>
{
"params": {
"1": {
"label": "Glottolog language code",
"type": "line",
"required": true
},
"2": {
"label": "Glottolog language name",
"type": "line",
"suggested": true,
"description": "If not given, the code is shown."
}
}
}
</templatedata></noinclude>
nqqkfn1uatzyc6dmiefjrm3y6kp1eqk
Tempilet:Infobox language/family-color
10
2421
32861
2026-04-18T06:40:55Z
en>Santiago Claudio
0
Restored Quechuan
32861
wikitext
text/x-wiki
{{#switch:{{lc:{{{1|}}}}}
| afro-asiatic | afrasiatic | afroasiatic = /**/#faecc8
| algic | algonkian = lightskyblue
| altaic = yellowgreen
| american | american (areal) = /**/#c0dde6
| andamanese = /**/#c99fee
| arawakan = /**/#98b1c7
| australian | australian (areal) = /**/#eba9ee
| austroasiatic | austro-asiatic = lightcoral
| austronesian = pink
| cariban = /**/#1d8c97
| caucasian | caucasian (areal) = lightgreen
| chibchan = /**/#a0c7f9
| conlang | artificial | constructed | constructed language = /**/#114057
| creole | mixed | pidgin | creole/pidgin/mixed = tan
| dravidian = mediumspringgreen
| eskimo-aleut | eskimo–aleut | eskaleut = lightcyan
| hmong-mien | miao-yao | hmong–mien | miao–yao = /**/#f2ceee
| hokan = /**/#66c0cf
| indo-european = /**/#c9ffd9
| isolate | language isolate | gray | grey | #dddddd = /**/#dddddd
| khoisan | khoisan (areal) = goldenrod
| macro-jê | macro-je = /**/#275379
| mayan = /**/#4865bd
| na-dene | na-dené | dene-yeniseian | dené-yeniseian | na–dene | na–dené | dene–yeniseian | dené–yeniseian = /**/#99ddff
| niger-congo | niger–congo = /**/#ffddaa
| nilo-saharan | nilo-saharan? = gold
| oto-manguean = /**/#3686cc
| palaeosiberian | palaeo-siberian | paleosiberian | paleo-siberian | palaeosiberian (areal) = darkseagreen
| pano-tacanan = /**/#1f1780
| papuan | papuan (areal) = /**/#fd79da
| penutian = /**/#6bc4de
| quechuan | quechumaran = /**/#c0e5e0
| salishan = /**/#afced1
| sign | sign language = silver
| sino-tibetan = salmon
| kra-dai | kadai | kradai | tai-kadai | kra–dai | tai–kadai = lavender
| tucanoan = /**/#5491a3
| tupian = /**/#638ba8
| uralic = /**/#a8fe74
| uto-aztecan | utoaztecan = /**/#80bfff
| unclassified | superfamily = white
| #default =<!--blank-->
}}<noinclude>
{{documentation}}
</noinclude>
k2hle6202vod0uzm766w121q6vgvmb8
32862
32861
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/family-color]]
32861
wikitext
text/x-wiki
{{#switch:{{lc:{{{1|}}}}}
| afro-asiatic | afrasiatic | afroasiatic = /**/#faecc8
| algic | algonkian = lightskyblue
| altaic = yellowgreen
| american | american (areal) = /**/#c0dde6
| andamanese = /**/#c99fee
| arawakan = /**/#98b1c7
| australian | australian (areal) = /**/#eba9ee
| austroasiatic | austro-asiatic = lightcoral
| austronesian = pink
| cariban = /**/#1d8c97
| caucasian | caucasian (areal) = lightgreen
| chibchan = /**/#a0c7f9
| conlang | artificial | constructed | constructed language = /**/#114057
| creole | mixed | pidgin | creole/pidgin/mixed = tan
| dravidian = mediumspringgreen
| eskimo-aleut | eskimo–aleut | eskaleut = lightcyan
| hmong-mien | miao-yao | hmong–mien | miao–yao = /**/#f2ceee
| hokan = /**/#66c0cf
| indo-european = /**/#c9ffd9
| isolate | language isolate | gray | grey | #dddddd = /**/#dddddd
| khoisan | khoisan (areal) = goldenrod
| macro-jê | macro-je = /**/#275379
| mayan = /**/#4865bd
| na-dene | na-dené | dene-yeniseian | dené-yeniseian | na–dene | na–dené | dene–yeniseian | dené–yeniseian = /**/#99ddff
| niger-congo | niger–congo = /**/#ffddaa
| nilo-saharan | nilo-saharan? = gold
| oto-manguean = /**/#3686cc
| palaeosiberian | palaeo-siberian | paleosiberian | paleo-siberian | palaeosiberian (areal) = darkseagreen
| pano-tacanan = /**/#1f1780
| papuan | papuan (areal) = /**/#fd79da
| penutian = /**/#6bc4de
| quechuan | quechumaran = /**/#c0e5e0
| salishan = /**/#afced1
| sign | sign language = silver
| sino-tibetan = salmon
| kra-dai | kadai | kradai | tai-kadai | kra–dai | tai–kadai = lavender
| tucanoan = /**/#5491a3
| tupian = /**/#638ba8
| uralic = /**/#a8fe74
| uto-aztecan | utoaztecan = /**/#80bfff
| unclassified | superfamily = white
| #default =<!--blank-->
}}<noinclude>
{{documentation}}
</noinclude>
k2hle6202vod0uzm766w121q6vgvmb8
Module:Endangered Languages Project
828
2422
32863
2025-09-24T22:15:11Z
en>Andrybak
0
update URL per [[Template talk:Infobox language#Edit request 13 September 2025]]
32863
Scribunto
text/plain
local p = {}
local elpf = "https://www.endangeredlanguages.com/elp-language/" -- or get P1630
local tidy_param = function(param)
if param == "" then param = nil end
return param
end
p.make_entry = function(frame)
local out = {}
local make_display = function(elpc, elpn)
if elpc and elpn then
table.insert(out, "[" .. elpf .. elpc .. " " .. elpn .. "]")
elseif elpc or elpn then
table.insert(out, (elpc or "") .. (elpn or "") .. "[[Category:Language articles with missing ELP parameters]]")
end
end
local elpname = tidy_param(frame.args.elpname)
local elpcode = tidy_param(frame.args.elpcode)
local qid = tidy_param((frame.args.qid or ""):upper()) or mw.wikibase.getEntityIdForCurrentPage()
make_display(elpcode, elpname)
if qid then
local props = mw.wikibase.getBestStatements(qid, "P2192")
if props[1] then
for _, v in ipairs(props) do
local elpc = v.mainsnak.datavalue and v.mainsnak.datavalue.value
local elpn = v.qualifiers and v.qualifiers.P1810 and v.qualifiers.P1810[1].datavalue and v.qualifiers.P1810[1].datavalue.value
make_display(elpc, elpn)
end
end
end
local ret = ""
if #out > 1 then
return frame:expandTemplate{title = "ubl", args = out}
elseif #out==1 then
return out[1]
end
end
return p
nyvptcjqe25612mia4uih7cz87jlm64
32864
32863
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Endangered_Languages_Project]]
32863
Scribunto
text/plain
local p = {}
local elpf = "https://www.endangeredlanguages.com/elp-language/" -- or get P1630
local tidy_param = function(param)
if param == "" then param = nil end
return param
end
p.make_entry = function(frame)
local out = {}
local make_display = function(elpc, elpn)
if elpc and elpn then
table.insert(out, "[" .. elpf .. elpc .. " " .. elpn .. "]")
elseif elpc or elpn then
table.insert(out, (elpc or "") .. (elpn or "") .. "[[Category:Language articles with missing ELP parameters]]")
end
end
local elpname = tidy_param(frame.args.elpname)
local elpcode = tidy_param(frame.args.elpcode)
local qid = tidy_param((frame.args.qid or ""):upper()) or mw.wikibase.getEntityIdForCurrentPage()
make_display(elpcode, elpname)
if qid then
local props = mw.wikibase.getBestStatements(qid, "P2192")
if props[1] then
for _, v in ipairs(props) do
local elpc = v.mainsnak.datavalue and v.mainsnak.datavalue.value
local elpn = v.qualifiers and v.qualifiers.P1810 and v.qualifiers.P1810[1].datavalue and v.qualifiers.P1810[1].datavalue.value
make_display(elpc, elpn)
end
end
end
local ret = ""
if #out > 1 then
return frame:expandTemplate{title = "ubl", args = out}
elseif #out==1 then
return out[1]
end
end
return p
nyvptcjqe25612mia4uih7cz87jlm64
Tempilet:ISO 639-1
10
2423
32865
2026-07-06T00:18:54Z
en>PK2
0
32865
wikitext
text/x-wiki
<span class="plainlinks">[https://www.loc.gov/standards/iso639-2/php/langcodes-keyword.php?SearchType=iso_639_1&SearchTerm={{#iferror:{{#invoke:ISO 639 name|iso_639_code_1_to_name|{{{1|}}}}}|<!-- error -->|{{{1|}}}}} {{{2|{{{1}}}}}}]</span><noinclude>
{{documentation}}
</noinclude>
ms1foymxqtuedf6ue59gin2dsv05quo
32866
32865
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:ISO_639-1]]
32865
wikitext
text/x-wiki
<span class="plainlinks">[https://www.loc.gov/standards/iso639-2/php/langcodes-keyword.php?SearchType=iso_639_1&SearchTerm={{#iferror:{{#invoke:ISO 639 name|iso_639_code_1_to_name|{{{1|}}}}}|<!-- error -->|{{{1|}}}}} {{{2|{{{1}}}}}}]</span><noinclude>
{{documentation}}
</noinclude>
ms1foymxqtuedf6ue59gin2dsv05quo
Tempilet:ISO 639-2
10
2424
32867
2026-07-06T00:19:23Z
en>PK2
0
32867
wikitext
text/x-wiki
<span class="plainlinks">[https://www.loc.gov/standards/iso639-2/php/langcodes_name.php?code_ID={{#switch:{{{1|}}}
|aar=1
|abk=2
|ace=3
|ach=4
|ada=5
|ady=6
|afa=7
|afh=8
|afr=9
|ain=10
|aka=11
|akk=12
|alb=14
|ale=15
|alg=16
|alt=17
|amh=18
|ang=19
|anp=20
|apa=21
|ara=22
|arc=23
|arg=24
|arm=26
|arn=27
|arp=28
|art=29
|arw=30
|asm=31
|ast=32
|ath=33
|aus=34
|ava=35
|ave=36
|awa=37
|aym=38
|aze=39
|bad=40
|bai=41
|bak=42
|bal=43
|bam=44
|ban=45
|baq=47
|bas=48
|bat=49
|bej=50
|bel=51
|bem=52
|ben=53
|ber=54
|bho=55
|bih=56
|bik=57
|bin=58
|bis=59
|bla=60
|bnt=61
|bod=447
|bos=62
|bra=63
|bre=64
|btk=65
|bua=66
|bug=67
|bul=68
|bur=70
|byn=71
|cad=72
|cai=73
|car=74
|cat=75
|cau=76
|ceb=77
|cel=78
|ces=107
|cha=79
|chb=80
|che=81
|chg=82
|chi=84
|chk=85
|chm=86
|chn=87
|cho=88
|chp=89
|chr=90
|chu=91
|chv=92
|chy=93
|cmc=94
|cnr=515
|cop=95
|cor=96
|cos=97
|cpe=98
|cpf=99
|cpp=100
|cre=101
|crh=102
|crp=103
|csb=104
|cus=105
|cym=487
|cze=107
|dak=108
|dan=109
|dar=110
|day=111
|del=112
|den=113
|deu=160
|dgr=114
|din=115
|div=116
|doi=117
|dra=118
|dsb=119
|dua=120
|dum=121
|dut=123
|dyu=124
|dzo=125
|efi=126
|egy=127
|eka=128
|ell=175
|elx=129
|eng=130
|enm=131
|epo=132
|est=133
|eus=47
|ewe=134
|ewo=135
|fan=136
|fao=137
|fas=357
|fat=138
|fij=139
|fil=140
|fin=141
|fiu=142
|fon=143
|fra=145
|fre=145
|frm=146
|fro=147
|frr=148
|frs=149
|fry=150
|ful=151
|fur=152
|gaa=153
|gay=154
|gba=155
|gem=156
|geo=158
|ger=160
|gez=161
|gil=162
|gla=163
|gle=164
|glg=165
|glv=166
|gmh=167
|goh=168
|gon=169
|gor=170
|got=171
|grb=172
|grc=173
|gre=175
|grn=176
|gsw=177
|guj=178
|gwi=179
|hai=180
|hat=181
|hau=182
|haw=183
|heb=184
|her=185
|hil=186
|him=187
|hin=188
|hit=189
|hmn=190
|hmo=191
|hrv=394
|hsb=192
|hun=193
|hup=194
|hye=26
|iba=195
|ibo=196
|ice=198
|ido=199
|iii=200
|ijo=201
|iku=202
|ile=203
|ilo=204
|ina=205
|inc=206
|ind=207
|ine=208
|inh=209
|ipk=210
|ira=211
|iro=212
|isl=198
|ita=213
|jav=214
|jbo=215
|jpn=216
|jpr=217
|jrb=218
|kaa=219
|kab=220
|kac=221
|kal=222
|kam=223
|kan=224
|kar=225
|kas=226
|kat=158
|kau=227
|kaw=228
|kaz=229
|kbd=230
|kha=231
|khi=232
|khm=233
|kho=234
|kik=235
|kin=236
|kir=237
|kmb=238
|kok=239
|kom=240
|kon=241
|kor=242
|kos=243
|kpe=244
|krc=245
|krl=246
|kro=247
|kru=248
|kua=249
|kum=250
|kur=251
|kut=252
|lad=253
|lah=254
|lam=255
|lao=256
|lat=257
|lav=258
|lez=259
|lim=260
|lin=261
|lit=262
|lol=263
|loz=264
|ltz=265
|lua=266
|lub=267
|lug=268
|lui=269
|lun=270
|luo=271
|lus=272
|mac=274
|mad=275
|mag=276
|mah=277
|mai=278
|mak=279
|mal=280
|man=281
|mao=283
|map=284
|mar=285
|mas=286
|may=288
|mdf=289
|mdr=290
|men=291
|mga=292
|mic=293
|min=294
|mis=295
|mkd=274
|mkh=296
|mlg=297
|mlt=298
|mnc=299
|mni=300
|mno=301
|moh=302
|mon=304
|mos=305
|mri=283
|msa=288
|mul=306
|mun=307
|mus=308
|mwl=309
|mwr=310
|mya=70
|myn=311
|myv=312
|nah=313
|nai=314
|nap=315
|nau=316
|nav=317
|nbl=318
|nde=319
|ndo=320
|nds=321
|nep=322
|new=323
|nia=324
|nic=325
|niu=326
|nld=123
|nno=327
|nob=328
|nog=329
|non=330
|nor=331
|nqo=506
|nso=332
|nub=333
|nwc=334
|nya=335
|nym=336
|nyn=337
|nyo=338
|nzi=339
|oci=340
|oji=341
|ori=342
|orm=343
|osa=344
|oss=345
|ota=346
|oto=347
|paa=348
|pag=349
|pal=350
|pam=351
|pan=352
|pap=353
|pau=354
|peo=355
|per=357
|phi=358
|phn=359
|pli=360
|pol=361
|pon=362
|por=363
|pra=364
|pro=365
|pus=366
|qaa-qtz=367
|que=368
|raj=369
|rap=370
|rar=371
|roa=372
|roh=373
|rom=374
|ron=376
|rum=376
|run=377
|rup=378
|rus=379
|sad=380
|sag=381
|sah=382
|sai=383
|sal=384
|sam=385
|san=386
|sas=387
|sat=388
|scn=391
|sco=392
|sel=395
|sem=396
|sga=397
|sgn=398
|shn=399
|sid=400
|sin=401
|sio=402
|sit=403
|sla=404
|slk=406
|slo=406
|slv=407
|sma=408
|sme=409
|smi=410
|smj=411
|smn=412
|smo=413
|sms=414
|sna=415
|snd=416
|snk=417
|sog=418
|som=419
|son=420
|sot=421
|spa=422
|sqi=14
|srd=423
|srn=424
|srp=390
|srr=425
|ssa=426
|ssw=427
|suk=428
|sun=429
|sus=430
|sux=431
|swa=432
|swe=433
|syc=511
|syr=434
|tah=435
|tai=436
|tam=437
|tat=438
|tel=439
|tem=440
|ter=441
|tet=442
|tgk=443
|tgl=444
|tha=445
|tib=447
|tig=448
|tir=449
|tiv=450
|tkl=451
|tlh=452
|tli=453
|tmh=454
|tog=455
|ton=456
|tpi=457
|tsi=458
|tsn=459
|tso=460
|tuk=461
|tum=462
|tup=463
|tur=464
|tut=465
|tvl=466
|twi=467
|tyv=468
|udm=469
|uga=470
|uig=471
|ukr=472
|umb=473
|und=474
|urd=475
|uzb=476
|vai=477
|ven=478
|vie=479
|vol=480
|vot=481
|wak=482
|wal=483
|war=484
|was=485
|wel=487
|wen=488
|wln=489
|wol=490
|xal=491
|xho=492
|yao=493
|yap=494
|yid=495
|yor=496
|ypk=497
|zap=498
|zbl=512
|zen=499
|zgh=514
|zha=500
|zho=84
|znd=501
|zul=502
|zun=503
|zxx=504
|zza=510
}} {{{2|{{{1}}}}}}]</span><noinclude>
{{documentation}}
</noinclude>
oyqopaoabi5omw1kdknz3rg4mpr90pz
32868
32867
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:ISO_639-2]]
32867
wikitext
text/x-wiki
<span class="plainlinks">[https://www.loc.gov/standards/iso639-2/php/langcodes_name.php?code_ID={{#switch:{{{1|}}}
|aar=1
|abk=2
|ace=3
|ach=4
|ada=5
|ady=6
|afa=7
|afh=8
|afr=9
|ain=10
|aka=11
|akk=12
|alb=14
|ale=15
|alg=16
|alt=17
|amh=18
|ang=19
|anp=20
|apa=21
|ara=22
|arc=23
|arg=24
|arm=26
|arn=27
|arp=28
|art=29
|arw=30
|asm=31
|ast=32
|ath=33
|aus=34
|ava=35
|ave=36
|awa=37
|aym=38
|aze=39
|bad=40
|bai=41
|bak=42
|bal=43
|bam=44
|ban=45
|baq=47
|bas=48
|bat=49
|bej=50
|bel=51
|bem=52
|ben=53
|ber=54
|bho=55
|bih=56
|bik=57
|bin=58
|bis=59
|bla=60
|bnt=61
|bod=447
|bos=62
|bra=63
|bre=64
|btk=65
|bua=66
|bug=67
|bul=68
|bur=70
|byn=71
|cad=72
|cai=73
|car=74
|cat=75
|cau=76
|ceb=77
|cel=78
|ces=107
|cha=79
|chb=80
|che=81
|chg=82
|chi=84
|chk=85
|chm=86
|chn=87
|cho=88
|chp=89
|chr=90
|chu=91
|chv=92
|chy=93
|cmc=94
|cnr=515
|cop=95
|cor=96
|cos=97
|cpe=98
|cpf=99
|cpp=100
|cre=101
|crh=102
|crp=103
|csb=104
|cus=105
|cym=487
|cze=107
|dak=108
|dan=109
|dar=110
|day=111
|del=112
|den=113
|deu=160
|dgr=114
|din=115
|div=116
|doi=117
|dra=118
|dsb=119
|dua=120
|dum=121
|dut=123
|dyu=124
|dzo=125
|efi=126
|egy=127
|eka=128
|ell=175
|elx=129
|eng=130
|enm=131
|epo=132
|est=133
|eus=47
|ewe=134
|ewo=135
|fan=136
|fao=137
|fas=357
|fat=138
|fij=139
|fil=140
|fin=141
|fiu=142
|fon=143
|fra=145
|fre=145
|frm=146
|fro=147
|frr=148
|frs=149
|fry=150
|ful=151
|fur=152
|gaa=153
|gay=154
|gba=155
|gem=156
|geo=158
|ger=160
|gez=161
|gil=162
|gla=163
|gle=164
|glg=165
|glv=166
|gmh=167
|goh=168
|gon=169
|gor=170
|got=171
|grb=172
|grc=173
|gre=175
|grn=176
|gsw=177
|guj=178
|gwi=179
|hai=180
|hat=181
|hau=182
|haw=183
|heb=184
|her=185
|hil=186
|him=187
|hin=188
|hit=189
|hmn=190
|hmo=191
|hrv=394
|hsb=192
|hun=193
|hup=194
|hye=26
|iba=195
|ibo=196
|ice=198
|ido=199
|iii=200
|ijo=201
|iku=202
|ile=203
|ilo=204
|ina=205
|inc=206
|ind=207
|ine=208
|inh=209
|ipk=210
|ira=211
|iro=212
|isl=198
|ita=213
|jav=214
|jbo=215
|jpn=216
|jpr=217
|jrb=218
|kaa=219
|kab=220
|kac=221
|kal=222
|kam=223
|kan=224
|kar=225
|kas=226
|kat=158
|kau=227
|kaw=228
|kaz=229
|kbd=230
|kha=231
|khi=232
|khm=233
|kho=234
|kik=235
|kin=236
|kir=237
|kmb=238
|kok=239
|kom=240
|kon=241
|kor=242
|kos=243
|kpe=244
|krc=245
|krl=246
|kro=247
|kru=248
|kua=249
|kum=250
|kur=251
|kut=252
|lad=253
|lah=254
|lam=255
|lao=256
|lat=257
|lav=258
|lez=259
|lim=260
|lin=261
|lit=262
|lol=263
|loz=264
|ltz=265
|lua=266
|lub=267
|lug=268
|lui=269
|lun=270
|luo=271
|lus=272
|mac=274
|mad=275
|mag=276
|mah=277
|mai=278
|mak=279
|mal=280
|man=281
|mao=283
|map=284
|mar=285
|mas=286
|may=288
|mdf=289
|mdr=290
|men=291
|mga=292
|mic=293
|min=294
|mis=295
|mkd=274
|mkh=296
|mlg=297
|mlt=298
|mnc=299
|mni=300
|mno=301
|moh=302
|mon=304
|mos=305
|mri=283
|msa=288
|mul=306
|mun=307
|mus=308
|mwl=309
|mwr=310
|mya=70
|myn=311
|myv=312
|nah=313
|nai=314
|nap=315
|nau=316
|nav=317
|nbl=318
|nde=319
|ndo=320
|nds=321
|nep=322
|new=323
|nia=324
|nic=325
|niu=326
|nld=123
|nno=327
|nob=328
|nog=329
|non=330
|nor=331
|nqo=506
|nso=332
|nub=333
|nwc=334
|nya=335
|nym=336
|nyn=337
|nyo=338
|nzi=339
|oci=340
|oji=341
|ori=342
|orm=343
|osa=344
|oss=345
|ota=346
|oto=347
|paa=348
|pag=349
|pal=350
|pam=351
|pan=352
|pap=353
|pau=354
|peo=355
|per=357
|phi=358
|phn=359
|pli=360
|pol=361
|pon=362
|por=363
|pra=364
|pro=365
|pus=366
|qaa-qtz=367
|que=368
|raj=369
|rap=370
|rar=371
|roa=372
|roh=373
|rom=374
|ron=376
|rum=376
|run=377
|rup=378
|rus=379
|sad=380
|sag=381
|sah=382
|sai=383
|sal=384
|sam=385
|san=386
|sas=387
|sat=388
|scn=391
|sco=392
|sel=395
|sem=396
|sga=397
|sgn=398
|shn=399
|sid=400
|sin=401
|sio=402
|sit=403
|sla=404
|slk=406
|slo=406
|slv=407
|sma=408
|sme=409
|smi=410
|smj=411
|smn=412
|smo=413
|sms=414
|sna=415
|snd=416
|snk=417
|sog=418
|som=419
|son=420
|sot=421
|spa=422
|sqi=14
|srd=423
|srn=424
|srp=390
|srr=425
|ssa=426
|ssw=427
|suk=428
|sun=429
|sus=430
|sux=431
|swa=432
|swe=433
|syc=511
|syr=434
|tah=435
|tai=436
|tam=437
|tat=438
|tel=439
|tem=440
|ter=441
|tet=442
|tgk=443
|tgl=444
|tha=445
|tib=447
|tig=448
|tir=449
|tiv=450
|tkl=451
|tlh=452
|tli=453
|tmh=454
|tog=455
|ton=456
|tpi=457
|tsi=458
|tsn=459
|tso=460
|tuk=461
|tum=462
|tup=463
|tur=464
|tut=465
|tvl=466
|twi=467
|tyv=468
|udm=469
|uga=470
|uig=471
|ukr=472
|umb=473
|und=474
|urd=475
|uzb=476
|vai=477
|ven=478
|vie=479
|vol=480
|vot=481
|wak=482
|wal=483
|war=484
|was=485
|wel=487
|wen=488
|wln=489
|wol=490
|xal=491
|xho=492
|yao=493
|yap=494
|yid=495
|yor=496
|ypk=497
|zap=498
|zbl=512
|zen=499
|zgh=514
|zha=500
|zho=84
|znd=501
|zul=502
|zun=503
|zxx=504
|zza=510
}} {{{2|{{{1}}}}}}]</span><noinclude>
{{documentation}}
</noinclude>
oyqopaoabi5omw1kdknz3rg4mpr90pz
Tempilet:Infobox language/codelist
10
2425
32869
2017-07-08T20:22:59Z
en>Zyxw
0
Use <code> to match output of other language codes in [[Template:Infobox language]]. Another option would be to change both templates to use <kbd>.
32869
wikitext
text/x-wiki
{{#if:{{{1|{{{code|}}}}}}
|<br /><code>[[iso639-3:{{{1|{{{code|}}}}}}|{{{1|{{{code}}}}}}]]</code>{{#if:{{{2|}}}| – {{{2|}}}}}}}<noinclude>
{{documentation}}
</noinclude>
lbxfdz8ccjkb5x4kd8fs9y6qwgmge99
32870
32869
2026-11-11T18:30:09Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/codelist]]
32869
wikitext
text/x-wiki
{{#if:{{{1|{{{code|}}}}}}
|<br /><code>[[iso639-3:{{{1|{{{code|}}}}}}|{{{1|{{{code}}}}}}]]</code>{{#if:{{{2|}}}| – {{{2|}}}}}}}<noinclude>
{{documentation}}
</noinclude>
lbxfdz8ccjkb5x4kd8fs9y6qwgmge99
Tempilet:Infobox language/genetic
10
2426
32871
2023-12-22T13:37:20Z
en>Jonesey95
0
update redirect after move
32871
wikitext
text/x-wiki
{{#switch:{{lc:{{{1|}}}}}
| afro-asiatic | afroasiatic = [[Afroasiatic languages|Afro-Asiatic]]
| niger-congo | niger–congo = [[Niger–Congo languages|Niger–Congo]]?
| nilo-saharan = [[Nilo-Saharan languages|Nilo-Saharan]]?
| khoisan = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| indo-european = [[Indo-European languages|Indo-European]]
| caucasian = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| altaic = [[Altaic languages|Altaic]]?
| uralic = [[Uralic languages|Uralic]]
| dravidian = [[Dravidian languages|Dravidian]]
| paleosiberian | paleo-siberian | palaeosiberian | palaeo-siberian = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| austronesian = [[Austronesian languages|Austronesian]]
| austro-asiatic | austroasiatic = [[Austroasiatic languages|Austroasiatic]]
| sino-tibetan = [[Sino-Tibetan languages|Sino-Tibetan]]
| hmong-mien | hmong–mien = [[Hmong–Mien languages|Hmong–Mien]]
| andamanese = (specify language family under 'fam1' or 'family')[[Category:Language articles with spurious family]]
| australian = (specify language family under 'fam1' or 'family')[[Category:Language articles with spurious family]]
| papuan = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| tai-kadai | tai–kadai | kadai | kradai | kra-dai | kra–dai = [[Kra–Dai languages|Kra–Dai]]
| american = (specify language family under 'fam1' or 'family')[[Category:Language articles with spurious family]]
| na-dene | na-dené | dene-yeniseian | dené-yeniseian | dene–yeniseian | dené–yeniseian = [[Dené–Yeniseian languages|Dené–Yeniseian]]?
| eskimo-aleut | eskimo–aleut = [[Eskaleut languages|Eskaleut]]
| uto-aztecan = [[Uto-Aztecan languages|Uto-Aztecan]]
| creole = [[Creole language|Creole]]
| pidgin = [[Pidgin]]
| mixed = [[Mixed language|Mixed]]
| isolate | language isolate = [[language isolate]]
| sign | sign language = [[sign language]]
| conlang | constructed language = [[constructed language]]
| unclassified = [[Unclassified language|unclassified]]
| = {{main other|[[Category:Languages without family color codes]]}}
| #default = {{{1}}}{{main other|[[Category:Languages without family color codes]]}}
}}<noinclude>
{{documentation}}
</noinclude>
2sfrxldg6whh9q8y75ss13sd2o4n0wy
32872
32871
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/genetic]]
32871
wikitext
text/x-wiki
{{#switch:{{lc:{{{1|}}}}}
| afro-asiatic | afroasiatic = [[Afroasiatic languages|Afro-Asiatic]]
| niger-congo | niger–congo = [[Niger–Congo languages|Niger–Congo]]?
| nilo-saharan = [[Nilo-Saharan languages|Nilo-Saharan]]?
| khoisan = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| indo-european = [[Indo-European languages|Indo-European]]
| caucasian = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| altaic = [[Altaic languages|Altaic]]?
| uralic = [[Uralic languages|Uralic]]
| dravidian = [[Dravidian languages|Dravidian]]
| paleosiberian | paleo-siberian | palaeosiberian | palaeo-siberian = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| austronesian = [[Austronesian languages|Austronesian]]
| austro-asiatic | austroasiatic = [[Austroasiatic languages|Austroasiatic]]
| sino-tibetan = [[Sino-Tibetan languages|Sino-Tibetan]]
| hmong-mien | hmong–mien = [[Hmong–Mien languages|Hmong–Mien]]
| andamanese = (specify language family under 'fam1' or 'family')[[Category:Language articles with spurious family]]
| australian = (specify language family under 'fam1' or 'family')[[Category:Language articles with spurious family]]
| papuan = (specify language family under 'fam1')[[Category:Language articles with spurious family]]
| tai-kadai | tai–kadai | kadai | kradai | kra-dai | kra–dai = [[Kra–Dai languages|Kra–Dai]]
| american = (specify language family under 'fam1' or 'family')[[Category:Language articles with spurious family]]
| na-dene | na-dené | dene-yeniseian | dené-yeniseian | dene–yeniseian | dené–yeniseian = [[Dené–Yeniseian languages|Dené–Yeniseian]]?
| eskimo-aleut | eskimo–aleut = [[Eskaleut languages|Eskaleut]]
| uto-aztecan = [[Uto-Aztecan languages|Uto-Aztecan]]
| creole = [[Creole language|Creole]]
| pidgin = [[Pidgin]]
| mixed = [[Mixed language|Mixed]]
| isolate | language isolate = [[language isolate]]
| sign | sign language = [[sign language]]
| conlang | constructed language = [[constructed language]]
| unclassified = [[Unclassified language|unclassified]]
| = {{main other|[[Category:Languages without family color codes]]}}
| #default = {{{1}}}{{main other|[[Category:Languages without family color codes]]}}
}}<noinclude>
{{documentation}}
</noinclude>
2sfrxldg6whh9q8y75ss13sd2o4n0wy
Tempilet:Infobox language/linguistlist
10
2427
32873
2024-05-05T20:24:57Z
en>Jonesey95
0
cat move per [[Wikipedia:Categories_for_discussion/Log/2024_April_21#Category:Languages_with_Linglist_code]]
32873
wikitext
text/x-wiki
{{#if:{{{1|}}}
|<code>[https://web.archive.org/web/20200101010101/http://multitree.org/codes/{{{1|}}} {{{1|}}}]</code>[[Category:Language articles with Linglist code]] {{{2|{{{lingname|}}}}}}}}<noinclude>
{{documentation}}
</noinclude>
e3vkvnjxowi82dwlkoyf8hfssyy7s5l
32874
32873
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/linguistlist]]
32873
wikitext
text/x-wiki
{{#if:{{{1|}}}
|<code>[https://web.archive.org/web/20200101010101/http://multitree.org/codes/{{{1|}}} {{{1|}}}]</code>[[Category:Language articles with Linglist code]] {{{2|{{{lingname|}}}}}}}}<noinclude>
{{documentation}}
</noinclude>
e3vkvnjxowi82dwlkoyf8hfssyy7s5l
Tempilet:Infobox language/ref
10
2428
32875
2026-10-30T15:51:24Z
en>Jonesey95
0
add e29
32875
wikitext
text/x-wiki
{{#switch: {{{1}}}
| =<!-- blank -->
| e29 = {{#ifexist:Template:Ethnologue29|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue29|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue29|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue29|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue29|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue29|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue29|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue29|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e29}}|<span class="error">[[Template:Ethnologue29]] does not exist</span>}}<!--
-->| e28 = {{#ifexist:Template:Ethnologue28|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue28|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue28|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue28|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue28|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue28|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue28|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue28|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e28}}|<span class="error">[[Template:Ethnologue28]] does not exist</span>}}<!--
-->| e27 = {{#ifexist:Template:Ethnologue27|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue27|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue27|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue27|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue27|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue27|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue27|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue27|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e27}}|<span class="error">[[Template:Ethnologue27]] does not exist</span>}}<!--
-->| e26 = {{#ifexist:Template:Ethnologue26|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue26|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue26|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue26|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue26|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue26|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue26|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue26|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e26}}|<span class="error">[[Template:Ethnologue26]] does not exist</span>}}<!--
-->| e25 = {{#ifexist:Template:Ethnologue25|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue25|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue25|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue25|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue25|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue25|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue25|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue25|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e25}}|<span class="error">[[Template:Ethnologue25]] does not exist</span>}}<!--
-->| e24 = {{#ifexist:Template:Ethnologue24|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue24|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue24|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue24|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue24|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue24|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue24|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue24|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e24}}|<span class="error">[[Template:Ethnologue24]] does not exist</span>}}<!--
-->| e23 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue23|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue23|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue23|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue23|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue23|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue23|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue23|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e23}}<!--
-->| e22 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue22|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue22|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue22|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue22|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue22|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue22|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue22|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e22}}<!--
-->| e21 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue21|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue21|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue21|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue21|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue21|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue21|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue21|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e21}}<!--
-->| e20 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue20|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue20|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue20|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue20|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue20|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue20|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue20|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e20}}<!--
-->| e19 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue19|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue19|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue19|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue19|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue19|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue19|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue19|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e19}}<!--
-->| e18 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue18|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue18|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue18|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue18|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue18|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue18|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue18|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e18}}<!--
-->| e17 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue17|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue17|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue17|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue17|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e17}}<!--
-->| e16 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue16|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue16|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue16|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue16|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e16}}
| e15 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue15|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue15|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue15|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue15|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e15}}
| e14 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue14|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue14|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue14|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue14|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e14}}
| e13 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue13|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue13|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue13|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue13|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e13}}
| e12 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue12|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue12|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue12|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue12|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e12}}
| e11 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue11|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue11|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue11|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue11|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e11}}
| e10 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue10|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue10|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue10|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue10|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e10}}
| e09 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue09|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue09|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue09|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue09|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e09}}
| e08 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue08|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue08|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue08|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue08|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e08}}<!--
-->| linglist = {{#tag:ref|[https://web.archive.org/web/20200101010101/http://multitree.org/codes/{{{iso3|}}} {{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}] at ''[[MultiTree]]'' on [[the Linguist List]]|name=linglist}}
| ne2007 = {{#tag:ref|Mikael Parkvall, "Världens 100 största språk 2007" (The World's 100 Largest Languages in 2007), in ''[[Nationalencyklopedin]]''|name=NE100}}
| ne2010 = {{#tag:ref|"Världens 100 största språk 2010" (The World's 100 Largest Languages in 2010), in ''[[Nationalencyklopedin]]''|name=NE100_2}}
| inali = {{#tag:ref|[[INALI]] (2012) [http://site.inali.gob.mx/pdf/libro_lenguas_indigenas_nacionales_en_riesgo_de_desaparicion.pdf ''México: Lenguas indígenas nacionales'']|name=INALI}}
| aiatsis = <ref name=AIATSIS/>
| ELP = <ref name=ELP/>
| guthrie = <ref name=Guthrie/>
| #default = {{{1|}}}
}}<noinclude>
{{Documentation}}
</noinclude>
t9ijhltq8r96dpxpbzpracikx1vd231
32876
32875
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/ref]]
32875
wikitext
text/x-wiki
{{#switch: {{{1}}}
| =<!-- blank -->
| e29 = {{#ifexist:Template:Ethnologue29|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue29|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue29|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue29|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue29|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue29|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue29|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue29|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e29}}|<span class="error">[[Template:Ethnologue29]] does not exist</span>}}<!--
-->| e28 = {{#ifexist:Template:Ethnologue28|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue28|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue28|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue28|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue28|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue28|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue28|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue28|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e28}}|<span class="error">[[Template:Ethnologue28]] does not exist</span>}}<!--
-->| e27 = {{#ifexist:Template:Ethnologue27|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue27|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue27|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue27|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue27|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue27|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue27|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue27|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e27}}|<span class="error">[[Template:Ethnologue27]] does not exist</span>}}<!--
-->| e26 = {{#ifexist:Template:Ethnologue26|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue26|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue26|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue26|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue26|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue26|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue26|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue26|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e26}}|<span class="error">[[Template:Ethnologue26]] does not exist</span>}}<!--
-->| e25 = {{#ifexist:Template:Ethnologue25|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue25|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue25|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue25|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue25|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue25|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue25|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue25|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e25}}|<span class="error">[[Template:Ethnologue25]] does not exist</span>}}<!--
-->| e24 = {{#ifexist:Template:Ethnologue24|{{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue24|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue24|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue24|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue24|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue24|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue24|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue24|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e24}}|<span class="error">[[Template:Ethnologue24]] does not exist</span>}}<!--
-->| e23 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue23|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue23|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue23|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue23|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue23|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue23|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue23|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e23}}<!--
-->| e22 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue22|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue22|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue22|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue22|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue22|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue22|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue22|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e22}}<!--
-->| e21 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue21|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue21|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue21|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue21|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue21|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue21|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue21|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e21}}<!--
-->| e20 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue20|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue20|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue20|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue20|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue20|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue20|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue20|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e20}}<!--
-->| e19 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue19|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue19|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue19|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue19|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue19|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue19|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue19|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e19}}<!--
-->| e18 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue18|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue18|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue18|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue18|{{{lc3|}}}|{{{ld3|}}}}}}}{{#if:{{{lc4|}}}|<br>{{Ethnologue18|{{{lc4|}}}|{{{ld4|}}}}}}}{{#if:{{{lc5|}}}|<br>{{Ethnologue18|{{{lc5|}}}|{{{ld5|}}}}}}}{{#if:{{{lc6|}}}|<br>{{Ethnologue18|{{{lc6|}}}|{{{ld6|}}}}}}}{{#if:{{{lc7|}}}|<br>(Additional references under 'Language codes' in the information box)}}|name=e18}}<!--
-->| e17 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue17|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue17|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue17|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue17|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e17}}<!--
-->| e16 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue16|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue16|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue16|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue16|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e16}}
| e15 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue15|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue15|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue15|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue15|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e15}}
| e14 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue14|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue14|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue14|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue14|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e14}}
| e13 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue13|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue13|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue13|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue13|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e13}}
| e12 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue12|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue12|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue12|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue12|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e12}}
| e11 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue11|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue11|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue11|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue11|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e11}}
| e10 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue10|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue10|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue10|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue10|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e10}}
| e09 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue09|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue09|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue09|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue09|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e09}}
| e08 = {{#tag:ref|{{#if:{{{iso3|}}}|{{Ethnologue08|{{{iso3|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}}}}}{{#if:{{{lc1|}}}|{{#if:{{{iso3|}}}|<br>}}{{Ethnologue08|{{{lc1|}}}|{{#if:{{{iso3|}}}|{{{ld1|}}}|{{#if:{{{refname|}}}|{{{refname}}}|{{{ld1|}}}}}}}}}}}{{#if:{{{lc2|}}}|<br>{{Ethnologue08|{{{lc2|}}}|{{{ld2|}}}}}}}{{#if:{{{lc3|}}}|<br>{{Ethnologue08|{{{lc3|}}}|{{{ld3|}}}}}}}|name=e08}}<!--
-->| linglist = {{#tag:ref|[https://web.archive.org/web/20200101010101/http://multitree.org/codes/{{{iso3|}}} {{#if:{{{refname|}}}|{{{refname}}}|{{{name|}}}}}] at ''[[MultiTree]]'' on [[the Linguist List]]|name=linglist}}
| ne2007 = {{#tag:ref|Mikael Parkvall, "Världens 100 största språk 2007" (The World's 100 Largest Languages in 2007), in ''[[Nationalencyklopedin]]''|name=NE100}}
| ne2010 = {{#tag:ref|"Världens 100 största språk 2010" (The World's 100 Largest Languages in 2010), in ''[[Nationalencyklopedin]]''|name=NE100_2}}
| inali = {{#tag:ref|[[INALI]] (2012) [http://site.inali.gob.mx/pdf/libro_lenguas_indigenas_nacionales_en_riesgo_de_desaparicion.pdf ''México: Lenguas indígenas nacionales'']|name=INALI}}
| aiatsis = <ref name=AIATSIS/>
| ELP = <ref name=ELP/>
| guthrie = <ref name=Guthrie/>
| #default = {{{1|}}}
}}<noinclude>
{{Documentation}}
</noinclude>
t9ijhltq8r96dpxpbzpracikx1vd231
Tempilet:Startplainlist
10
2429
32879
2026-09-12T07:48:33Z
en>EmausBot
0
Bot: Fixing double redirect from [[Template:Plainlist]] to [[Template:Plain list]]
32879
wikitext
text/x-wiki
#REDIRECT [[Template:Plain list]]
{{Redirect category shell|
{{R with history}}
{{R from modification}}
}}
b8zz3jisbbo8ln2pssrsdu1lwfflj5k
32880
32879
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Startplainlist]]
32879
wikitext
text/x-wiki
#REDIRECT [[Template:Plain list]]
{{Redirect category shell|
{{R with history}}
{{R from modification}}
}}
b8zz3jisbbo8ln2pssrsdu1lwfflj5k
Tempilet:Plain list
10
2430
32881
2026-09-12T01:14:02Z
en>BD2412
0
RM closed as moved.
32881
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}|
{{{1}}}
</div>}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using plainlist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Plainlist]] with unknown parameter "_VALUE_"|ignoreblank=y| class | style | indent | 1 }}<noinclude></div>
{{documentation}}
</noinclude>
3dxfjhodv9m8vibb93y5xdv5zsvp5nu
32882
32881
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Plain_list]]
32881
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{safesubst<noinclude />:#if:{{{style|}}}{{{indent|}}}|style="{{safesubst<noinclude />:#if:{{{indent|}}}|margin-left: {{safesubst<noinclude />:#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{safesubst<noinclude />:#if:{{{1|}}}|
{{{1}}}
</div>}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using plainlist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Plainlist]] with unknown parameter "_VALUE_"|ignoreblank=y| class | style | indent | 1 }}<noinclude></div>
{{documentation}}
</noinclude>
3dxfjhodv9m8vibb93y5xdv5zsvp5nu
Tempilet:Colored link
10
2431
32883
2025-10-16T18:20:23Z
en>Moxy
0
Restored revision 1279824535 by [[Special:Contributions/Pppery|Pppery]] ([[User talk:Pppery|talk]]): Was there a talk....are we doing with this all over Category:Text color templates? as of now we have a mismatch of things happening
32883
wikitext
text/x-wiki
[[:{{{2}}}|<span class="tmpl-colored-link {{{{{|safesubst:}}}#if:{{{noinvert|}}}|mw-no-invert|}}" style="color: {{{1}}}; text-decoration: inherit;">{{{3|{{{2}}}}}}</span>]]<noinclude>
{{Documentation}}<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
bm2i1cvm8jj7zvsf6gc1j4e7lbbma1q
32884
32883
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Colored_link]]
32883
wikitext
text/x-wiki
[[:{{{2}}}|<span class="tmpl-colored-link {{{{{|safesubst:}}}#if:{{{noinvert|}}}|mw-no-invert|}}" style="color: {{{1}}}; text-decoration: inherit;">{{{3|{{{2}}}}}}</span>]]<noinclude>
{{Documentation}}<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
bm2i1cvm8jj7zvsf6gc1j4e7lbbma1q
Tempilet:Infobox language/language family color table
10
2432
32885
2026-08-01T19:11:51Z
en>~2026-42766-12
0
32885
wikitext
text/x-wiki
{|style="text-align:center;"
<!-- Colour codes for language families and groups: [[Wikipedia:WikiProject Languages]] -->
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Afroasiatic}}"|{{Infobox language/genetic|Afroasiatic}}<br /><code>#faecc8</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Nilo-Saharan}}"|{{Infobox language/genetic|Nilo-Saharan}}<br /><code>gold (#ffd700)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Niger–Congo}}"|{{Infobox language/genetic|Niger–Congo}}<br /><code>#ffddaa</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Khoisan}}"|[[Khoisan languages|Khoisan (areal)]]<br /><code>goldenrod (#daa520)</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Indo-European}}"|{{Infobox language/genetic|Indo-European}}<br /><code>#c9ffd9</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Caucasian}}"|[[Languages of the Caucasus|Caucasian (areal)]]<br /><code>lightgreen (#90ee90)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Uralic}}"|{{Infobox language/genetic|Uralic}}<br /><code>lime (#a8fe74)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Dravidian}}"|{{Infobox language/genetic|Dravidian}}<br /><code>mediumspringgreen (#00fa9a)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Altaic}}"|[[Altaic languages|Altaic (areal)]]<br /><code>yellowgreen (#9acd32)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Paleo-Siberian}}"|[[Paleo-Siberian languages|Paleo-Siberian (areal)]]<br /><code>darkseagreen (#8fbc8f)</code>
|-
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Sino-Tibetan}}"|{{Infobox language/genetic|Sino-Tibetan}}<br /><code>salmon (#fa8072)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Hmong–Mien}}"|{{Infobox language/genetic|Hmong–Mien}}<br /><code>#f2ceee</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Kra–Dai}}"|{{Infobox language/genetic|Kra–Dai}}<br /><code>lavender (#e6e6fa)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Austroasiatic}}"|{{Infobox language/genetic|Austroasiatic}}<br /><code>lightcoral (#f08080)</code>
|-
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Austronesian}}"|{{Infobox language/genetic|Austronesian}}<br /><code>pink (#ffc0cb)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Papuan}}"|[[Papuan languages|Papuan (areal)]]<br /><code>#fd79da</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Australian}}"|[[Australian Aboriginal languages|Australian (areal)]]<br /><code>#eba9ee</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Andamanese}}"|[[Andamanese languages|Andamanese (areal)]]<br /><code>#c99fee</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Eskaleut}}"|[[Eskaleut languages|Eskaleut]]<br /><code>lightcyan (#e0ffff)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Algic}}"|[[Algic languages|Algic]]<br /><code>lightskyblue (#87cefa)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Uto-Aztecan}}"|{{Infobox language/genetic|Uto-Aztecan}}<br /><code>#80bfff</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Na-Dene}}"|[[Na-Dene languages|Na-Dene]] (and [[Dene–Yeniseian languages|Dene–Yeniseian]]?)<br /><code>#99ddff</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|American}}"|[[Indigenous languages of the Americas|American (areal)]]<br /><code>#c0dde6</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|salishan}}"|[[Salishan languages|Salishan]]<br /><code>#afced1</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|arawakan}}"|[[Arawakan languages|Arawakan]]<br /><code>#98b1c7</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|cariban}}"|[[Cariban languages|Cariban]]<br /><code>#1d8c97</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|hokan}}"|[[Hokan languages|Hokan (disputed)]]<br /><code>#66c0cf</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|macro-jê}}"|{{colored link|white|macro-Jê languages|Macro-Jê}}<br /><code>#275379</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|mayan}}"|{{colored link|white|Mayan languages|Mayan}}<br /><code>#4865bd</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|tucanoan}}"|[[Tucanoan languages|Tucanoan]]<br /><code>#5491a3</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|oto-manguean}}"|[[Oto-Manguean languages|Oto-Manguean]]<br /><code>#3686cc</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|pano-tacanan}}; color:white"|{{colored link|white|Pano-Tacanan languages|Pano-Tacanan}}<br /><code>#1f1780</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|penutian}}"|[[Penutian languages|Penutian (disputed)]]<br /><code>#91d1e3</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|quechuan}}"|[[Quechuan languages|Quechuan]]<br /><code>#c0e5e0</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|tupian}}"|[[Tupian languages|Tupian]]<br /><code>#638ba8</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|chibchan}}"|[[Chibchan languages|Chibchan]]<br /><code>#a0c7f9</code>
|-
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Creole}}"|{{Infobox language/genetic|Creole}}/{{Infobox language/genetic|Pidgin}}/{{Infobox language/genetic|Mixed}}<br /><code>tan (#d2b48c)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Isolate}}"|[[Language isolate]]<br /><code>#dddddd</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Sign}}"|[[Sign language]]<br /><code>silver (#c0c0c0)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Conlang}}; color:white"|{{colored link|white|Constructed language}}<br /><code>#114057</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|unclassified}}"|[[Unclassified language|Unclassified]]<br /><code>white (#ffffff)</code>
|}<noinclude>{{documentation}}
</noinclude>
ms72u0a9iezlwy3ufezvpesykivadtc
32886
32885
2026-11-11T18:30:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/language_family_color_table]]
32885
wikitext
text/x-wiki
{|style="text-align:center;"
<!-- Colour codes for language families and groups: [[Wikipedia:WikiProject Languages]] -->
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Afroasiatic}}"|{{Infobox language/genetic|Afroasiatic}}<br /><code>#faecc8</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Nilo-Saharan}}"|{{Infobox language/genetic|Nilo-Saharan}}<br /><code>gold (#ffd700)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Niger–Congo}}"|{{Infobox language/genetic|Niger–Congo}}<br /><code>#ffddaa</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Khoisan}}"|[[Khoisan languages|Khoisan (areal)]]<br /><code>goldenrod (#daa520)</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Indo-European}}"|{{Infobox language/genetic|Indo-European}}<br /><code>#c9ffd9</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Caucasian}}"|[[Languages of the Caucasus|Caucasian (areal)]]<br /><code>lightgreen (#90ee90)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Uralic}}"|{{Infobox language/genetic|Uralic}}<br /><code>lime (#a8fe74)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Dravidian}}"|{{Infobox language/genetic|Dravidian}}<br /><code>mediumspringgreen (#00fa9a)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Altaic}}"|[[Altaic languages|Altaic (areal)]]<br /><code>yellowgreen (#9acd32)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Paleo-Siberian}}"|[[Paleo-Siberian languages|Paleo-Siberian (areal)]]<br /><code>darkseagreen (#8fbc8f)</code>
|-
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Sino-Tibetan}}"|{{Infobox language/genetic|Sino-Tibetan}}<br /><code>salmon (#fa8072)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Hmong–Mien}}"|{{Infobox language/genetic|Hmong–Mien}}<br /><code>#f2ceee</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Kra–Dai}}"|{{Infobox language/genetic|Kra–Dai}}<br /><code>lavender (#e6e6fa)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Austroasiatic}}"|{{Infobox language/genetic|Austroasiatic}}<br /><code>lightcoral (#f08080)</code>
|-
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Austronesian}}"|{{Infobox language/genetic|Austronesian}}<br /><code>pink (#ffc0cb)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Papuan}}"|[[Papuan languages|Papuan (areal)]]<br /><code>#fd79da</code>
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Australian}}"|[[Australian Aboriginal languages|Australian (areal)]]<br /><code>#eba9ee</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Andamanese}}"|[[Andamanese languages|Andamanese (areal)]]<br /><code>#c99fee</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Eskaleut}}"|[[Eskaleut languages|Eskaleut]]<br /><code>lightcyan (#e0ffff)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Algic}}"|[[Algic languages|Algic]]<br /><code>lightskyblue (#87cefa)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Uto-Aztecan}}"|{{Infobox language/genetic|Uto-Aztecan}}<br /><code>#80bfff</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Na-Dene}}"|[[Na-Dene languages|Na-Dene]] (and [[Dene–Yeniseian languages|Dene–Yeniseian]]?)<br /><code>#99ddff</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|American}}"|[[Indigenous languages of the Americas|American (areal)]]<br /><code>#c0dde6</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|salishan}}"|[[Salishan languages|Salishan]]<br /><code>#afced1</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|arawakan}}"|[[Arawakan languages|Arawakan]]<br /><code>#98b1c7</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|cariban}}"|[[Cariban languages|Cariban]]<br /><code>#1d8c97</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|hokan}}"|[[Hokan languages|Hokan (disputed)]]<br /><code>#66c0cf</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|macro-jê}}"|{{colored link|white|macro-Jê languages|Macro-Jê}}<br /><code>#275379</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|mayan}}"|{{colored link|white|Mayan languages|Mayan}}<br /><code>#4865bd</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|tucanoan}}"|[[Tucanoan languages|Tucanoan]]<br /><code>#5491a3</code>
|-
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|oto-manguean}}"|[[Oto-Manguean languages|Oto-Manguean]]<br /><code>#3686cc</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|pano-tacanan}}; color:white"|{{colored link|white|Pano-Tacanan languages|Pano-Tacanan}}<br /><code>#1f1780</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|penutian}}"|[[Penutian languages|Penutian (disputed)]]<br /><code>#91d1e3</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|quechuan}}"|[[Quechuan languages|Quechuan]]<br /><code>#c0e5e0</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|tupian}}"|[[Tupian languages|Tupian]]<br /><code>#638ba8</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|chibchan}}"|[[Chibchan languages|Chibchan]]<br /><code>#a0c7f9</code>
|-
|colspan="2" style="color:inherit;background-color:{{Infobox language/family-color|Creole}}"|{{Infobox language/genetic|Creole}}/{{Infobox language/genetic|Pidgin}}/{{Infobox language/genetic|Mixed}}<br /><code>tan (#d2b48c)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Isolate}}"|[[Language isolate]]<br /><code>#dddddd</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Sign}}"|[[Sign language]]<br /><code>silver (#c0c0c0)</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|Conlang}}; color:white"|{{colored link|white|Constructed language}}<br /><code>#114057</code>
|colspan="1" style="color:inherit;background-color:{{Infobox language/family-color|unclassified}}"|[[Unclassified language|Unclassified]]<br /><code>white (#ffffff)</code>
|}<noinclude>{{documentation}}
</noinclude>
ms72u0a9iezlwy3ufezvpesykivadtc
Tempilet:Infobox language/quilt
10
2433
32887
2026-04-23T09:07:50Z
en>PK2
0
remove unneeded spaces
32887
wikitext
text/x-wiki
{{Main other|{{Error|This template shouldn't be used in mainspace.}}|{{infobox
| title = Background colors used on Wikipedia for various language families and groups
| bodyclass = metadata
| data1 = {{Infobox language/language family color table}}
| label2 = See also
| data2 = {{main other||[[Wikipedia:WikiProject Languages]]}}
}}}}<noinclude>
{{documentation}}
</noinclude>
5fbgimx5bfipzaw9i0i2uwo65d5xmy9
32888
32887
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/quilt]]
32887
wikitext
text/x-wiki
{{Main other|{{Error|This template shouldn't be used in mainspace.}}|{{infobox
| title = Background colors used on Wikipedia for various language families and groups
| bodyclass = metadata
| data1 = {{Infobox language/language family color table}}
| label2 = See also
| data2 = {{main other||[[Wikipedia:WikiProject Languages]]}}
}}}}<noinclude>
{{documentation}}
</noinclude>
5fbgimx5bfipzaw9i0i2uwo65d5xmy9
Module:Parameter names example
828
2434
32889
2025-04-23T18:00:35Z
en>MusikBot II
0
Changed protection settings for "[[Module:Parameter names example]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2500 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
32889
Scribunto
text/plain
-- This module implements {{parameter names example}}.
local p = {}
local function makeParam(s)
local lb = '{'
local rb = '}'
return lb:rep(3) .. s .. rb:rep(3)
end
local function italicize(s)
return "''" .. s .. "''"
end
local function plain(s)
return s
end
function p._main(args, frame)
-- Find how we want to format the arguments to the template.
local formatFunc
if args._display == 'italics' or args._display == 'italic' then
formatFunc = italicize
elseif args._display == 'plain' then
formatFunc = plain
else
formatFunc = makeParam
end
-- Build the table of template arguments.
local targs = {}
for k, v in pairs(args) do
if type(k) == 'number' then
targs[v] = formatFunc(v)
elseif not k:find('^_') then
targs[k] = v
end
end
--targs['nocat'] = 'yes';
--targs['categories'] = 'no';
--targs['demo'] = 'yes';
-- Find the template name.
local template
if args._template then
template = args._template
else
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.prefixedText:find('/sandbox$') then
template = currentTitle.prefixedText
else
template = currentTitle.basePageTitle.prefixedText
end
end
-- Call the template with the arguments.
frame = frame or mw.getCurrentFrame()
local success, result = pcall(
frame.expandTemplate,
frame,
{title = template, args = targs}
)
if success then
return result
else
return ''
end
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Parameter names example'
})
return p._main(args, frame)
end
return p
to0eolw8xx8fiql0ynvd8cfvp3ukqw4
32890
32889
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Parameter_names_example]]
32889
Scribunto
text/plain
-- This module implements {{parameter names example}}.
local p = {}
local function makeParam(s)
local lb = '{'
local rb = '}'
return lb:rep(3) .. s .. rb:rep(3)
end
local function italicize(s)
return "''" .. s .. "''"
end
local function plain(s)
return s
end
function p._main(args, frame)
-- Find how we want to format the arguments to the template.
local formatFunc
if args._display == 'italics' or args._display == 'italic' then
formatFunc = italicize
elseif args._display == 'plain' then
formatFunc = plain
else
formatFunc = makeParam
end
-- Build the table of template arguments.
local targs = {}
for k, v in pairs(args) do
if type(k) == 'number' then
targs[v] = formatFunc(v)
elseif not k:find('^_') then
targs[k] = v
end
end
--targs['nocat'] = 'yes';
--targs['categories'] = 'no';
--targs['demo'] = 'yes';
-- Find the template name.
local template
if args._template then
template = args._template
else
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.prefixedText:find('/sandbox$') then
template = currentTitle.prefixedText
else
template = currentTitle.basePageTitle.prefixedText
end
end
-- Call the template with the arguments.
frame = frame or mw.getCurrentFrame()
local success, result = pcall(
frame.expandTemplate,
frame,
{title = template, args = targs}
)
if success then
return result
else
return ''
end
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Parameter names example'
})
return p._main(args, frame)
end
return p
to0eolw8xx8fiql0ynvd8cfvp3ukqw4
Tempilet:Parameter names example
10
2435
32891
2025-04-23T18:00:14Z
en>MusikBot II
0
Changed protection settings for "[[Template:Parameter names example]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2501 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
32891
wikitext
text/x-wiki
<includeonly>{{#invoke:Parameter names example|main}}</includeonly><noinclude>
{{documentation}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
4dc1wzmglz31ir81jrn4ik3iy1v4jpt
32892
32891
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Parameter_names_example]]
32891
wikitext
text/x-wiki
<includeonly>{{#invoke:Parameter names example|main}}</includeonly><noinclude>
{{documentation}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
4dc1wzmglz31ir81jrn4ik3iy1v4jpt
Tempilet:AIATSIS
10
2436
32893
2020-07-01T05:03:01Z
en>Kwamikagami
0
32893
wikitext
text/x-wiki
[https://collection.aiatsis.gov.au/austlang/language/{{{1|}}} {{{1|}}}] {{{2|{{PAGENAME}}}}} at the Australian Indigenous Languages Database, [[Australian Institute of Aboriginal and Torres Strait Islander Studies]]{{#if: {{{3|}}}
| (see the info box for additional links)
}}<noinclude>{{doc|content=
This template creates a reference to the [[AIATSIS]]. The format is,
<nowiki>{{AIATSIS|code|name}}</nowiki>
The code field is required to generate the URL for the link. The name field is optional. Its value is displayed in the citation. If nothing is entered, the name of the article will be used.
This template is called when one or more of the <code>aiatsis</code> fields are used in [[:Template:Infobox language]], in which case the citation may be cross-referenced in the text of the article with the code <code><nowiki><ref name=AIATSIS/></nowiki></code>.
[[Category:Specific-source templates]]
}}
</noinclude>
jee4m0x6qemoad1t4u5m33k93787um8
32894
32893
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:AIATSIS]]
32893
wikitext
text/x-wiki
[https://collection.aiatsis.gov.au/austlang/language/{{{1|}}} {{{1|}}}] {{{2|{{PAGENAME}}}}} at the Australian Indigenous Languages Database, [[Australian Institute of Aboriginal and Torres Strait Islander Studies]]{{#if: {{{3|}}}
| (see the info box for additional links)
}}<noinclude>{{doc|content=
This template creates a reference to the [[AIATSIS]]. The format is,
<nowiki>{{AIATSIS|code|name}}</nowiki>
The code field is required to generate the URL for the link. The name field is optional. Its value is displayed in the citation. If nothing is entered, the name of the article will be used.
This template is called when one or more of the <code>aiatsis</code> fields are used in [[:Template:Infobox language]], in which case the citation may be cross-referenced in the text of the article with the code <code><nowiki><ref name=AIATSIS/></nowiki></code>.
[[Category:Specific-source templates]]
}}
</noinclude>
jee4m0x6qemoad1t4u5m33k93787um8
Tempilet:Horizontal list
10
2437
32895
2026-09-12T00:36:18Z
en>BD2412
0
RM closed as moved.
32895
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
ihcdy525o8nnmq114czc48dpk6pnojd
32896
32895
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Horizontal_list]]
32895
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:list|horizontal}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
ihcdy525o8nnmq114czc48dpk6pnojd
Module:IPA/data
828
2438
32897
2026-10-30T01:29:51Z
en>Paine Ellsworth
0
per edit request on talk page - include [[Rapa Nui language]]
32897
Scribunto
text/plain
return {
defaultLabel = "%s pronunciation:",
labels = {
["lang"] = "%s:",
["pron"] = "pronounced",
["also"] = "also",
["alsolang"] = "also %s:",
["langalso"] = "%s also",
["local"] = "locally",
["localpron"] = "local pronunciation:",
["ipa"] = "IPA:",
},
defaultKey = "Help:IPA",
langs = {
["und"] = {
text = "",
defaultLabelCode = "ipa",
},
["mis"] = {
text = "",
defaultLabelCode = "ipa",
},
["en"] = {
key = "Help:IPA/English",
format = "/%s/",
defaultLabelCode = "",
dialects = {
["GB"] = {
text = "UK",
defaultLabelCode = "lang",
},
["UK"] = { aliasOf = "GB" },
["US"] = {
text = "US",
defaultLabelCode = "lang",
},
},
},
["acw"] = {
name = "Hejazi Arabic",
key = "Help:IPA/Hejazi Arabic",
},
["ady"] = {
key = "Help:IPA/Adyghe",
},
["aeb"] = {
key = "Help:IPA/Tunisian Arabic",
},
["aer"] = {
key = "Help:IPA/Australian languages",
},
["af"] = {
key = "Help:IPA/Afrikaans",
},
["aln"] = {
key = "Help:IPA/Albanian",
},
["als"] = {
key = "Help:IPA/Albanian",
},
["am"] = {
key = "Help:IPA/Amharic",
},
["ang"] = {
key = "Help:IPA/Old English",
},
["apc"] = {
dialects = {
["LB"] = {
name = "Lebanese Arabic",
key = "Help:IPA/Lebanese Arabic",
},
},
},
["ar"] = {
key = "Help:IPA/Arabic",
},
["arb"] = {
key = "Help:IPA/Arabic",
},
["arz"] = {
key = "Help:IPA/Egyptian Arabic",
},
["as"] = {
key = "Help:IPA/Assamese",
},
["ast"] = {
key = "Help:IPA/Astur-Leonese",
dialects = {
["ES-LE"] = {
name = "Leonese",
},
},
},
["aus"] = {
text = "Aboriginal",
key = "Help:IPA/Australian languages",
},
["az"] = {
key = "Help:IPA/Azerbaijani",
},
["be"] = {
key = "Help:IPA/Belarusian",
},
["ber"] = {
key = "Help:IPA/Berber",
},
["bg"] = {
key = "Help:IPA/Bulgarian",
},
["bn"] = {
key = "Help:IPA/Bengali",
},
["bo"] = {
text = "Tibetan",
key = "Help:IPA/Tibetan",
},
["br"] = {
key = "Help:IPA/Breton",
},
["bs"] = {
key = "Help:IPA/Serbo-Croatian",
},
["ca"] = {
key = "Help:IPA/Catalan",
dialects = {
["ES-IB"] = {
name = "Balearic Catalan",
key = "Help:IPA/Insular Catalan",
},
["IT"] = {
name = "Algherese",
key = "Help:IPA/Insular Catalan",
},
["VALENCIA"] = {
isVariant = true, -- makes it lowercase
},
},
},
["ckb"] = {
name = "Central Kurdish",
key = "Help:IPA/Kurdish",
},
["ch"] = {
key = "Help:IPA/Chamorro"
},
["cjy"] = {
name = "Jin Chinese",
key = "Help:IPA/Jin Chinese",
},
["cmn"] = {
name = "Mandarin",
link = "Standard Chinese",
key = "Help:IPA/Mandarin",
},
["cnr"] = {
key = "Help:IPA/Serbo-Croatian",
},
["co"] = {
key = "Help:IPA/Corsican",
},
["crh"] = {
key = "Help:IPA/Tatar",
},
["cs"] = {
key = "Help:IPA/Czech",
},
["cy"] = {
key = "Help:IPA/Welsh",
},
["da"] = {
key = "Help:IPA/Danish",
},
["de"] = {
key = "Help:IPA/Standard German",
dialects = {
["AT"] = {},
["CH"] = {},
},
},
["dsb"] = {
key = "Help:IPA/Sorbian",
},
["egl"] = {
key = "Help:IPA/Emilian-Romagnol",
},
["el"] = {
key = "Help:IPA/Greek",
},
["eo"] = {
key = "Help:IPA/Esperanto",
},
["es"] = {
key = "Help:IPA/Spanish",
dialects = {
["419"] = {
name = "Latin American Spanish",
},
},
},
["et"] = {
key = "Help:IPA/Estonian",
},
["eu"] = {
key = "Help:IPA/Basque",
},
["ext"] = {
key = "Help:IPA/Astur-Leonese",
},
["fa"] = {
key = "Help:IPA/Persian",
},
["fi"] = {
key = "Help:IPA/Finnish",
},
["fil"] = {
key = "Help:IPA/Tagalog",
},
["fj"] = {
key = "Help:IPA/Fijian",
},
["fr"] = {
key = "Help:IPA/French",
},
["frp"] = {
name = "Franco-Provençal",
key = "Help:IPA/Franco-Provençal",
},
["fy"] = {
key = "Help:IPA/West Frisian",
},
["ga"] = {
key = "Help:IPA/Irish",
dialects = {
["GB"] = { aliasOf = "x-ulster" },
["IE-C"] = {
name = "Connacht Irish",
},
["IE-M"] = {
name = "Munster Irish",
},
["IE-U"] = { aliasOf = "x-ulster" },
["x-ulster"] = {
name = "Ulster Irish",
},
}
},
["gct"] = {
key = "Help:IPA/Alemannic German",
},
["gd"] = {
key = "Help:IPA/Scottish Gaelic",
},
["gl"] = {
key = "Help:IPA/Galician",
},
["grc"] = {
key = "Help:IPA/Greek",
dialects = {
["x-attic"] = {},
["x-classic"] = {},
},
},
["gsw"] = {
key = "Help:IPA/Alemannic German",
},
["gu"] = {
key = "Help:IPA/Gujarati",
},
["gv"] = {
key = "Help:IPA/Manx",
},
["haw"] = {
key = "Help:IPA/Hawaiian",
},
["hbo"] = {
key = "Help:IPA/Hebrew",
},
["he"] = {
key = "Help:IPA/Hebrew",
},
["hi"] = {
key = "Help:IPA/Hindi and Urdu",
},
["hmn"] = {
key = "Help:IPA/Hmong",
},
["hns"] = {
name = "Hindustani",
key = "Help:IPA/Hindi and Urdu",
},
["hr"] = {
key = "Help:IPA/Serbo-Croatian",
},
["hsb"] = {
key = "Help:IPA/Sorbian",
},
["hsn"] = {
key = "Help:IPA/Xiang Chinese",
},
["ht"] = {
key = "Help:IPA/Haitian Creole",
},
["hu"] = {
key = "Help:IPA/Hungarian",
},
["hy"] = {
key = "Help:IPA/Armenian",
},
["id"] = {
key = "Help:IPA/Malay",
},
["ig"] = {
key = "Help:IPA/Igbo",
},
["ik"] = {
key = "Help:IPA/Inupiaq",
},
["is"] = {
key = "Help:IPA/Icelandic",
},
["it"] = {
key = "Help:IPA/Italian",
dialects = {
["IT-52"] = {
name = "Tuscan",
key = "Help:IPA/Central Italian",
},
["IT-55"] = {
name = "Central Italian",
key = "Help:IPA/Central Italian",
},
["IT-57"] = {
name = "Central Italian",
key = "Help:IPA/Central Italian",
},
["IT-RM"] = {
name = "Romanesco",
key = "Help:IPA/Central Italian",
},
},
},
["iu"] = {
key = "Help:IPA/Inuktitut",
},
["ja"] = {
key = "Help:IPA/Japanese",
},
["ka"] = {
key = "Help:IPA/Georgian",
},
["khb"] = {
name = "Tai Lue",
key = "Help:IPA/Shan and Tai Lue",
},
["kjb"] = {
key = "Help:IPA/Mayan"
},
["kk"] = {
key = "Help:IPA/Kazakh",
},
["kl"] = {
key = "Help:IPA/Greenlandic",
},
["km"] = {
key = "Help:IPA/Khmer",
},
["kmr"] = {
name = "Northern Kurdish",
key = "Help:IPA/Kurdish",
},
["ko"] = {
key = "Help:IPA/Korean",
},
["ksh"] = {
name = "Colognian",
key = "Help:IPA/Colognian",
},
["ku"] = {
key = "Help:IPA/Kurdish",
},
["ky"] = {
key = "Help:IPA/Kyrgyz",
},
["la"] = {
key = "Help:IPA/Latin",
dialects = {
["x-church"] = {
name = "Ecclesiastical Latin",
},
["x-classic"] = {
name = "Classical Latin",
},
},
},
["lac"] = {
key = "Help:IPA/Mayan"
},
["lb"] = {
key = "Help:IPA/Luxembourgish",
},
["lij"] = {
key = "Help:IPA/Ligurian",
},
["lkt"] = {
key = "Help:IPA/Lakota",
},
["lmo"] = {
key = "Help:IPA/Lombard",
},
["lo"] = {
key = "Help:IPA/Lao",
},
["lt"] = {
key = "Help:IPA/Lithuanian",
},
["lv"] = {
key = "Help:IPA/Latvian",
},
["mai"] = {
name = "Maithili",
key = "Help:IPA/Maithili",
},
["mfe"] = {
name = "Mauritian Creole",
key = "Help:IPA/Mauritian Creole",
},
["mg"] = {
key = "Help:IPA/Malagasy",
},
["mh"] = {
key = "Help:IPA/Marshallese",
},
["mi"] = {
key = "Help:IPA/Māori",
},
["mk"] = {
key = "Help:IPA/Macedonian",
},
["ml"] = {
key = "Help:IPA/Malayalam",
},
["mn"] = {
key = "Help:IPA/Mongolian",
},
["mr"] = {
key = "Help:IPA/Marathi",
},
["ms"] = {
key = "Help:IPA/Malay",
},
["mt"] = {
key = "Help:IPA/Maltese",
},
["mwl"] = {
key = "Help:IPA/Astur-Leonese",
},
["my"] = {
key = "Help:IPA/Burmese",
},
["myn"] = {
key = "Help:IPA/Mayan",
},
["nah"] = {
key = "Help:IPA/Nahuatl",
},
["nan"] = {
dialects = {
["TW"] = {
key = "Help:IPA/Taiwanese Hokkien",
},
},
},
["nap"] = {
key = "Help:IPA/Neapolitan",
},
["nci"] = {
key = "Help:IPA/Nahuatl",
},
["ne"] = {
key = "Help:IPA/Nepali",
},
["nhe"] = {
name = "Huasteca Nahuatl",
key = "Help:IPA/Nahuatl",
},
["nl"] = {
key = "Help:IPA/Dutch",
dialects = {
["BE"] = {},
},
},
["nlv"] = {
key = "Help:IPA/Nahuatl",
},
["no"] = {
key = "Help:IPA/Norwegian",
dialects = {
["NO-03"] = {
name = "Urban East Norwegian",
},
}
},
["nod"] = {
key = "Help:IPA/Northern Thai",
},
["nv"] = {
key = "Help:IPA/Navajo",
},
["oc"] = {
key = "Help:IPA/Occitan",
},
["or"] = {
key = "Help:IPA/Odia",
},
["pa"] = {
key = "Help:IPA/Punjabi",
},
["pht"] = {
key = "Help:IPA/Lao",
},
["pi"] = {
key = "Help:IPA/Sanskrit",
},
["pjt"] = {
key = "Help:IPA/Australian languages",
},
["pl"] = {
key = "Help:IPA/Polish",
},
["pms"] = {
key = "Help:IPA/Piedmontese",
},
["prs"] = {
key = "Help:IPA/Persian",
},
["ps"] = {
key = "Help:IPA/Pashto",
},
["pt"] = {
key = "Help:IPA/Portuguese",
dialects = {
["BR"] = {
name = "Brazilian Portuguese",
},
["PT"] = {
name = "European Portuguese",
},
}
},
["qu"] = {
key = "Help:IPA/Quechua",
},
["quc"] = {
key ="Help:IPA/Mayan",
},
["rap"] = {
key = "Help:IPA/Rapa Nui",
},
["rgn"] = {
key = "Help:IPA/Emilian-Romagnol",
},
["rm"] = {
key = "Help:IPA/Romansh",
},
["ro"] = {
key = "Help:IPA/Romanian",
},
["ru"] = {
key = "Help:IPA/Russian",
},
["ryu"] = {
key = "Help:IPA/Okinawan",
},
["sa"] = {
key = "Help:IPA/Sanskrit",
},
["sc"] = {
key = "Help:IPA/Sardinian",
},
["scn"] = {
key = "Help:IPA/Sicilian",
dialects = {
["IT-75"] = {
name = "Salentino",
},
["IT-78"] = {
name = "Calabrian",
link = "Central-Southern Calabrian",
},
},
},
["sdh"] = {
key = "Help:IPA/Kurdish",
},
["sh"] = {
key = "Help:IPA/Serbo-Croatian",
},
["shn"] = {
key = "Help:IPA/Shan and Tai Lue",
},
["sk"] = {
key = "Help:IPA/Slovak",
},
["sl"] = {
key = "Help:IPA/Slovene",
},
["sou"] = {
key = "Help:IPA/Thai",
},
["sq"] = {
key = "Help:IPA/Albanian",
},
["sr"] = {
key = "Help:IPA/Serbo-Croatian",
},
["ss"] = {
key = "Help:IPA/Nguni",
},
["sv"] = {
key = "Help:IPA/Swedish",
dialects = {
["FI"] = {
name = "Finland Swedish",
},
},
},
["sw"] = {
key = "Help:IPA/Swahili",
},
["swg"] = {
key = "Help:IPA/Alemannic German",
},
["syl"] = {
key = "Help:IPA/Sylheti",
},
["ta"] = {
key = "Help:IPA/Tamil",
},
["te"] = {
key = "Help:IPA/Telugu",
},
["tg"] = {
key = "Help:IPA/Persian",
},
["th"] = {
key = "Help:IPA/Thai",
},
["ti"] = {
key = "Help:IPA/Tigrinya",
},
["tk"] = {
key = "Help:IPA/Turkmen",
},
["tl"] = {
key = "Help:IPA/Tagalog",
},
["tr"] = {
key = "Help:IPA/Turkish",
},
["tt"] = {
key = "Help:IPA/Tatar",
},
["tts"] = {
name = "Isan",
key = "Help:IPA/Lao",
},
["uk"] = {
key = "Help:IPA/Ukrainian",
},
["ur"] = {
key = "Help:IPA/Hindi and Urdu",
},
["uz"] = {
key = "Help:IPA/Uzbek",
},
["vec"] = {
key = "Help:IPA/Venetian",
},
["vi"] = {
key = "Help:IPA/Vietnamese",
dialects = {
["VN-26"] = {
name = "Central Vietnamese",
},
["VN-DN"] = {
name = "Central Vietnamese",
},
["VN-HN"] = {
name = "Northern Vietnamese",
},
["VN-SG"] = {
name = "Southern Vietnamese",
},
},
},
["wa"] = {
key = "Help:IPA/Walloon",
},
["wae"] = {
key = "Help:IPA/Alemannic German",
},
["wbp"] = {
key = "Help:IPA/Australian languages",
},
["wen"] = {
key = "Help:IPA/Sorbian",
},
["wuu"] = {
key = "Help:IPA/Wu Chinese",
},
["xh"] = {
key = "Help:IPA/Nguni",
},
["yi"] = {
key = "Help:IPA/Yiddish",
},
["yo"] = {
key = "Help:IPA/Yoruba",
},
["yue"] = {
name = "Cantonese",
key = "Help:IPA/Cantonese",
},
["za"] = {
key = "Help:IPA/Zhuang",
},
["zsm"] = {
name = "Malaysian",
key = "Help:IPA/Malay",
},
["zu"] = {
key = "Help:IPA/Nguni",
},
},
}
8dh0xkkvfktrofy733u2qfb3195e8bi
32898
32897
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPA/data]]
32897
Scribunto
text/plain
return {
defaultLabel = "%s pronunciation:",
labels = {
["lang"] = "%s:",
["pron"] = "pronounced",
["also"] = "also",
["alsolang"] = "also %s:",
["langalso"] = "%s also",
["local"] = "locally",
["localpron"] = "local pronunciation:",
["ipa"] = "IPA:",
},
defaultKey = "Help:IPA",
langs = {
["und"] = {
text = "",
defaultLabelCode = "ipa",
},
["mis"] = {
text = "",
defaultLabelCode = "ipa",
},
["en"] = {
key = "Help:IPA/English",
format = "/%s/",
defaultLabelCode = "",
dialects = {
["GB"] = {
text = "UK",
defaultLabelCode = "lang",
},
["UK"] = { aliasOf = "GB" },
["US"] = {
text = "US",
defaultLabelCode = "lang",
},
},
},
["acw"] = {
name = "Hejazi Arabic",
key = "Help:IPA/Hejazi Arabic",
},
["ady"] = {
key = "Help:IPA/Adyghe",
},
["aeb"] = {
key = "Help:IPA/Tunisian Arabic",
},
["aer"] = {
key = "Help:IPA/Australian languages",
},
["af"] = {
key = "Help:IPA/Afrikaans",
},
["aln"] = {
key = "Help:IPA/Albanian",
},
["als"] = {
key = "Help:IPA/Albanian",
},
["am"] = {
key = "Help:IPA/Amharic",
},
["ang"] = {
key = "Help:IPA/Old English",
},
["apc"] = {
dialects = {
["LB"] = {
name = "Lebanese Arabic",
key = "Help:IPA/Lebanese Arabic",
},
},
},
["ar"] = {
key = "Help:IPA/Arabic",
},
["arb"] = {
key = "Help:IPA/Arabic",
},
["arz"] = {
key = "Help:IPA/Egyptian Arabic",
},
["as"] = {
key = "Help:IPA/Assamese",
},
["ast"] = {
key = "Help:IPA/Astur-Leonese",
dialects = {
["ES-LE"] = {
name = "Leonese",
},
},
},
["aus"] = {
text = "Aboriginal",
key = "Help:IPA/Australian languages",
},
["az"] = {
key = "Help:IPA/Azerbaijani",
},
["be"] = {
key = "Help:IPA/Belarusian",
},
["ber"] = {
key = "Help:IPA/Berber",
},
["bg"] = {
key = "Help:IPA/Bulgarian",
},
["bn"] = {
key = "Help:IPA/Bengali",
},
["bo"] = {
text = "Tibetan",
key = "Help:IPA/Tibetan",
},
["br"] = {
key = "Help:IPA/Breton",
},
["bs"] = {
key = "Help:IPA/Serbo-Croatian",
},
["ca"] = {
key = "Help:IPA/Catalan",
dialects = {
["ES-IB"] = {
name = "Balearic Catalan",
key = "Help:IPA/Insular Catalan",
},
["IT"] = {
name = "Algherese",
key = "Help:IPA/Insular Catalan",
},
["VALENCIA"] = {
isVariant = true, -- makes it lowercase
},
},
},
["ckb"] = {
name = "Central Kurdish",
key = "Help:IPA/Kurdish",
},
["ch"] = {
key = "Help:IPA/Chamorro"
},
["cjy"] = {
name = "Jin Chinese",
key = "Help:IPA/Jin Chinese",
},
["cmn"] = {
name = "Mandarin",
link = "Standard Chinese",
key = "Help:IPA/Mandarin",
},
["cnr"] = {
key = "Help:IPA/Serbo-Croatian",
},
["co"] = {
key = "Help:IPA/Corsican",
},
["crh"] = {
key = "Help:IPA/Tatar",
},
["cs"] = {
key = "Help:IPA/Czech",
},
["cy"] = {
key = "Help:IPA/Welsh",
},
["da"] = {
key = "Help:IPA/Danish",
},
["de"] = {
key = "Help:IPA/Standard German",
dialects = {
["AT"] = {},
["CH"] = {},
},
},
["dsb"] = {
key = "Help:IPA/Sorbian",
},
["egl"] = {
key = "Help:IPA/Emilian-Romagnol",
},
["el"] = {
key = "Help:IPA/Greek",
},
["eo"] = {
key = "Help:IPA/Esperanto",
},
["es"] = {
key = "Help:IPA/Spanish",
dialects = {
["419"] = {
name = "Latin American Spanish",
},
},
},
["et"] = {
key = "Help:IPA/Estonian",
},
["eu"] = {
key = "Help:IPA/Basque",
},
["ext"] = {
key = "Help:IPA/Astur-Leonese",
},
["fa"] = {
key = "Help:IPA/Persian",
},
["fi"] = {
key = "Help:IPA/Finnish",
},
["fil"] = {
key = "Help:IPA/Tagalog",
},
["fj"] = {
key = "Help:IPA/Fijian",
},
["fr"] = {
key = "Help:IPA/French",
},
["frp"] = {
name = "Franco-Provençal",
key = "Help:IPA/Franco-Provençal",
},
["fy"] = {
key = "Help:IPA/West Frisian",
},
["ga"] = {
key = "Help:IPA/Irish",
dialects = {
["GB"] = { aliasOf = "x-ulster" },
["IE-C"] = {
name = "Connacht Irish",
},
["IE-M"] = {
name = "Munster Irish",
},
["IE-U"] = { aliasOf = "x-ulster" },
["x-ulster"] = {
name = "Ulster Irish",
},
}
},
["gct"] = {
key = "Help:IPA/Alemannic German",
},
["gd"] = {
key = "Help:IPA/Scottish Gaelic",
},
["gl"] = {
key = "Help:IPA/Galician",
},
["grc"] = {
key = "Help:IPA/Greek",
dialects = {
["x-attic"] = {},
["x-classic"] = {},
},
},
["gsw"] = {
key = "Help:IPA/Alemannic German",
},
["gu"] = {
key = "Help:IPA/Gujarati",
},
["gv"] = {
key = "Help:IPA/Manx",
},
["haw"] = {
key = "Help:IPA/Hawaiian",
},
["hbo"] = {
key = "Help:IPA/Hebrew",
},
["he"] = {
key = "Help:IPA/Hebrew",
},
["hi"] = {
key = "Help:IPA/Hindi and Urdu",
},
["hmn"] = {
key = "Help:IPA/Hmong",
},
["hns"] = {
name = "Hindustani",
key = "Help:IPA/Hindi and Urdu",
},
["hr"] = {
key = "Help:IPA/Serbo-Croatian",
},
["hsb"] = {
key = "Help:IPA/Sorbian",
},
["hsn"] = {
key = "Help:IPA/Xiang Chinese",
},
["ht"] = {
key = "Help:IPA/Haitian Creole",
},
["hu"] = {
key = "Help:IPA/Hungarian",
},
["hy"] = {
key = "Help:IPA/Armenian",
},
["id"] = {
key = "Help:IPA/Malay",
},
["ig"] = {
key = "Help:IPA/Igbo",
},
["ik"] = {
key = "Help:IPA/Inupiaq",
},
["is"] = {
key = "Help:IPA/Icelandic",
},
["it"] = {
key = "Help:IPA/Italian",
dialects = {
["IT-52"] = {
name = "Tuscan",
key = "Help:IPA/Central Italian",
},
["IT-55"] = {
name = "Central Italian",
key = "Help:IPA/Central Italian",
},
["IT-57"] = {
name = "Central Italian",
key = "Help:IPA/Central Italian",
},
["IT-RM"] = {
name = "Romanesco",
key = "Help:IPA/Central Italian",
},
},
},
["iu"] = {
key = "Help:IPA/Inuktitut",
},
["ja"] = {
key = "Help:IPA/Japanese",
},
["ka"] = {
key = "Help:IPA/Georgian",
},
["khb"] = {
name = "Tai Lue",
key = "Help:IPA/Shan and Tai Lue",
},
["kjb"] = {
key = "Help:IPA/Mayan"
},
["kk"] = {
key = "Help:IPA/Kazakh",
},
["kl"] = {
key = "Help:IPA/Greenlandic",
},
["km"] = {
key = "Help:IPA/Khmer",
},
["kmr"] = {
name = "Northern Kurdish",
key = "Help:IPA/Kurdish",
},
["ko"] = {
key = "Help:IPA/Korean",
},
["ksh"] = {
name = "Colognian",
key = "Help:IPA/Colognian",
},
["ku"] = {
key = "Help:IPA/Kurdish",
},
["ky"] = {
key = "Help:IPA/Kyrgyz",
},
["la"] = {
key = "Help:IPA/Latin",
dialects = {
["x-church"] = {
name = "Ecclesiastical Latin",
},
["x-classic"] = {
name = "Classical Latin",
},
},
},
["lac"] = {
key = "Help:IPA/Mayan"
},
["lb"] = {
key = "Help:IPA/Luxembourgish",
},
["lij"] = {
key = "Help:IPA/Ligurian",
},
["lkt"] = {
key = "Help:IPA/Lakota",
},
["lmo"] = {
key = "Help:IPA/Lombard",
},
["lo"] = {
key = "Help:IPA/Lao",
},
["lt"] = {
key = "Help:IPA/Lithuanian",
},
["lv"] = {
key = "Help:IPA/Latvian",
},
["mai"] = {
name = "Maithili",
key = "Help:IPA/Maithili",
},
["mfe"] = {
name = "Mauritian Creole",
key = "Help:IPA/Mauritian Creole",
},
["mg"] = {
key = "Help:IPA/Malagasy",
},
["mh"] = {
key = "Help:IPA/Marshallese",
},
["mi"] = {
key = "Help:IPA/Māori",
},
["mk"] = {
key = "Help:IPA/Macedonian",
},
["ml"] = {
key = "Help:IPA/Malayalam",
},
["mn"] = {
key = "Help:IPA/Mongolian",
},
["mr"] = {
key = "Help:IPA/Marathi",
},
["ms"] = {
key = "Help:IPA/Malay",
},
["mt"] = {
key = "Help:IPA/Maltese",
},
["mwl"] = {
key = "Help:IPA/Astur-Leonese",
},
["my"] = {
key = "Help:IPA/Burmese",
},
["myn"] = {
key = "Help:IPA/Mayan",
},
["nah"] = {
key = "Help:IPA/Nahuatl",
},
["nan"] = {
dialects = {
["TW"] = {
key = "Help:IPA/Taiwanese Hokkien",
},
},
},
["nap"] = {
key = "Help:IPA/Neapolitan",
},
["nci"] = {
key = "Help:IPA/Nahuatl",
},
["ne"] = {
key = "Help:IPA/Nepali",
},
["nhe"] = {
name = "Huasteca Nahuatl",
key = "Help:IPA/Nahuatl",
},
["nl"] = {
key = "Help:IPA/Dutch",
dialects = {
["BE"] = {},
},
},
["nlv"] = {
key = "Help:IPA/Nahuatl",
},
["no"] = {
key = "Help:IPA/Norwegian",
dialects = {
["NO-03"] = {
name = "Urban East Norwegian",
},
}
},
["nod"] = {
key = "Help:IPA/Northern Thai",
},
["nv"] = {
key = "Help:IPA/Navajo",
},
["oc"] = {
key = "Help:IPA/Occitan",
},
["or"] = {
key = "Help:IPA/Odia",
},
["pa"] = {
key = "Help:IPA/Punjabi",
},
["pht"] = {
key = "Help:IPA/Lao",
},
["pi"] = {
key = "Help:IPA/Sanskrit",
},
["pjt"] = {
key = "Help:IPA/Australian languages",
},
["pl"] = {
key = "Help:IPA/Polish",
},
["pms"] = {
key = "Help:IPA/Piedmontese",
},
["prs"] = {
key = "Help:IPA/Persian",
},
["ps"] = {
key = "Help:IPA/Pashto",
},
["pt"] = {
key = "Help:IPA/Portuguese",
dialects = {
["BR"] = {
name = "Brazilian Portuguese",
},
["PT"] = {
name = "European Portuguese",
},
}
},
["qu"] = {
key = "Help:IPA/Quechua",
},
["quc"] = {
key ="Help:IPA/Mayan",
},
["rap"] = {
key = "Help:IPA/Rapa Nui",
},
["rgn"] = {
key = "Help:IPA/Emilian-Romagnol",
},
["rm"] = {
key = "Help:IPA/Romansh",
},
["ro"] = {
key = "Help:IPA/Romanian",
},
["ru"] = {
key = "Help:IPA/Russian",
},
["ryu"] = {
key = "Help:IPA/Okinawan",
},
["sa"] = {
key = "Help:IPA/Sanskrit",
},
["sc"] = {
key = "Help:IPA/Sardinian",
},
["scn"] = {
key = "Help:IPA/Sicilian",
dialects = {
["IT-75"] = {
name = "Salentino",
},
["IT-78"] = {
name = "Calabrian",
link = "Central-Southern Calabrian",
},
},
},
["sdh"] = {
key = "Help:IPA/Kurdish",
},
["sh"] = {
key = "Help:IPA/Serbo-Croatian",
},
["shn"] = {
key = "Help:IPA/Shan and Tai Lue",
},
["sk"] = {
key = "Help:IPA/Slovak",
},
["sl"] = {
key = "Help:IPA/Slovene",
},
["sou"] = {
key = "Help:IPA/Thai",
},
["sq"] = {
key = "Help:IPA/Albanian",
},
["sr"] = {
key = "Help:IPA/Serbo-Croatian",
},
["ss"] = {
key = "Help:IPA/Nguni",
},
["sv"] = {
key = "Help:IPA/Swedish",
dialects = {
["FI"] = {
name = "Finland Swedish",
},
},
},
["sw"] = {
key = "Help:IPA/Swahili",
},
["swg"] = {
key = "Help:IPA/Alemannic German",
},
["syl"] = {
key = "Help:IPA/Sylheti",
},
["ta"] = {
key = "Help:IPA/Tamil",
},
["te"] = {
key = "Help:IPA/Telugu",
},
["tg"] = {
key = "Help:IPA/Persian",
},
["th"] = {
key = "Help:IPA/Thai",
},
["ti"] = {
key = "Help:IPA/Tigrinya",
},
["tk"] = {
key = "Help:IPA/Turkmen",
},
["tl"] = {
key = "Help:IPA/Tagalog",
},
["tr"] = {
key = "Help:IPA/Turkish",
},
["tt"] = {
key = "Help:IPA/Tatar",
},
["tts"] = {
name = "Isan",
key = "Help:IPA/Lao",
},
["uk"] = {
key = "Help:IPA/Ukrainian",
},
["ur"] = {
key = "Help:IPA/Hindi and Urdu",
},
["uz"] = {
key = "Help:IPA/Uzbek",
},
["vec"] = {
key = "Help:IPA/Venetian",
},
["vi"] = {
key = "Help:IPA/Vietnamese",
dialects = {
["VN-26"] = {
name = "Central Vietnamese",
},
["VN-DN"] = {
name = "Central Vietnamese",
},
["VN-HN"] = {
name = "Northern Vietnamese",
},
["VN-SG"] = {
name = "Southern Vietnamese",
},
},
},
["wa"] = {
key = "Help:IPA/Walloon",
},
["wae"] = {
key = "Help:IPA/Alemannic German",
},
["wbp"] = {
key = "Help:IPA/Australian languages",
},
["wen"] = {
key = "Help:IPA/Sorbian",
},
["wuu"] = {
key = "Help:IPA/Wu Chinese",
},
["xh"] = {
key = "Help:IPA/Nguni",
},
["yi"] = {
key = "Help:IPA/Yiddish",
},
["yo"] = {
key = "Help:IPA/Yoruba",
},
["yue"] = {
name = "Cantonese",
key = "Help:IPA/Cantonese",
},
["za"] = {
key = "Help:IPA/Zhuang",
},
["zsm"] = {
name = "Malaysian",
key = "Help:IPA/Malay",
},
["zu"] = {
key = "Help:IPA/Nguni",
},
},
}
8dh0xkkvfktrofy733u2qfb3195e8bi
Tempilet:Infobox language/lingualist
10
2439
32899
2026-10-05T02:05:55Z
en>Jonesey95
0
fix code typo
32899
wikitext
text/x-wiki
{{#if:{{{1|}}}|{{#ifeq:{{#invoke:Plain text|main|{{{1}}}}}|{{{1}}}|<code>[http://www.hortensj-garden.org/index.php?tnc=1&tr=lsr&nid={{first word|{{{1}}}}}{{ifnumber|{{first word|{{{1}}}}}|{{=}}|}} {{first word|{{{1}}}}}]</code>|{{{1}}}}}{{main other|[[Category:Language articles with Linguasphere code]]}}{{{2|{{{linguaname|}}}}}}}}<noinclude>
{{documentation}}
</noinclude>
66bo0hngwfqhid31twux8bz8czamqwl
32900
32899
2026-11-11T18:30:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_language/lingualist]]
32899
wikitext
text/x-wiki
{{#if:{{{1|}}}|{{#ifeq:{{#invoke:Plain text|main|{{{1}}}}}|{{{1}}}|<code>[http://www.hortensj-garden.org/index.php?tnc=1&tr=lsr&nid={{first word|{{{1}}}}}{{ifnumber|{{first word|{{{1}}}}}|{{=}}|}} {{first word|{{{1}}}}}]</code>|{{{1}}}}}{{main other|[[Category:Language articles with Linguasphere code]]}}{{{2|{{{linguaname|}}}}}}}}<noinclude>
{{documentation}}
</noinclude>
66bo0hngwfqhid31twux8bz8czamqwl
Tempilet:Infobox/styles-images.css
10
2440
32913
2024-07-24T00:03:36Z
en>Pppery
0
/* {{pp-template}} */
32913
sanitized-css
text/css
/* {{pp-template}} */
@media screen {
html.skin-theme-clientpref-night .infobox-has-images-with-white-backgrounds img {
background: white;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .infobox-has-images-with-white-backgrounds img {
background: white;
}
}
pjojbxx5a40qdgq9on8w4p6f0elc881
32914
32913
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox/styles-images.css]]
32913
sanitized-css
text/css
/* {{pp-template}} */
@media screen {
html.skin-theme-clientpref-night .infobox-has-images-with-white-backgrounds img {
background: white;
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .infobox-has-images-with-white-backgrounds img {
background: white;
}
}
pjojbxx5a40qdgq9on8w4p6f0elc881
Tempilet:End plain list
10
2441
32915
2026-10-05T18:12:41Z
en>Asukite
0
bypass doc page link in case this ever gets moved again
32915
wikitext
text/x-wiki
<includeonly></div></includeonly><noinclude>
{{documentation|Template:Plain list/doc}}
</noinclude>
4rtg0iwl3jjgi2p5g4szf7vx2h2wo83
32916
32915
2026-11-11T18:30:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:End_plain_list]]
32915
wikitext
text/x-wiki
<includeonly></div></includeonly><noinclude>
{{documentation|Template:Plain list/doc}}
</noinclude>
4rtg0iwl3jjgi2p5g4szf7vx2h2wo83
Harshe Turanci
0
2442
32923
2026-11-11T21:13:06Z
RAPTOR7762
18
/* */
32923
wikitext
text/x-wiki
#REDIRECT [[Yarenshe Turanci]]
4x6hy9sh2epomvkyk6z4nvh9sv0sspi
Tempilet:Sfn
10
2443
32925
2025-03-02T03:30:06Z
en>Queen of Hearts
0
upd param check
32925
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfn|template=sfn}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using sfn with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Sfn]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | ignore-err | at | loc | p | page | pages | postscript | pp | ps | ref | Ref | group }}<noinclude>
{{documentation}}
</noinclude>
hf60u92ffzfq6o1za215x4pem9daxo1
32926
32925
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sfn]]
32925
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfn|template=sfn}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using sfn with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Sfn]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | ignore-err | at | loc | p | page | pages | postscript | pp | ps | ref | Ref | group }}<noinclude>
{{documentation}}
</noinclude>
hf60u92ffzfq6o1za215x4pem9daxo1
Tempilet:Error
10
2444
32927
2013-10-29T00:20:58Z
en>Mr. Stradivarius
0
Protected Template:Error: [[WP:High-risk templates|Highly visible template]]: 32,000 transclusions ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))
32927
wikitext
text/x-wiki
{{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}<noinclude>
{{documentation}}
</noinclude>
axsripqkyjus55mon24y6efvuedy0d2
32928
32927
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Error]]
32927
wikitext
text/x-wiki
{{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}<noinclude>
{{documentation}}
</noinclude>
axsripqkyjus55mon24y6efvuedy0d2
Tempilet:Cite magazine
10
2445
32929
2019-03-05T14:21:58Z
en>Xaosflux
0
Changed protection level for "[[Template:Cite magazine]]": Pages alread protected from [[Wikipedia:Cascade-protected items/content]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
32929
wikitext
text/x-wiki
<includeonly>{{#invoke:Citation/CS1|citation
|CitationClass=magazine
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
ihdnkvb90c6voz3z3uc97mmw5bytrkw
32930
32929
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cite_magazine]]
32929
wikitext
text/x-wiki
<includeonly>{{#invoke:Citation/CS1|citation
|CitationClass=magazine
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
ihdnkvb90c6voz3z3uc97mmw5bytrkw
Tempilet:Refbegin
10
2446
32931
2023-10-08T12:55:12Z
en>Paine Ellsworth
0
per edit request on talk page - update - see [[Template talk:Refbegin#Template-protected edit request on 7 October 2023|talk page]]
32931
wikitext
text/x-wiki
<includeonly><templatestyles src="Refbegin/styles.css" /><!--
--><div class="refbegin <!--
-->{{#if: {{{indent|}}} | refbegin-hanging-indents }} <!--
-->{{#if: {{{1|{{{colwidth|}}}}}} |
{{#ifeq: {{{1}}} | 1
| <!--default to no columns-->
| refbegin-columns references-column-width
}}
}}
" style="<!--
-->{{#if: {{{1|}}}
|{{#ifeq: {{{1}}} | 1
|<!--default to no columns-->
| {{#iferror: {{#ifexpr: {{{1|1}}} > 1 }}
| column-width: {{#if:1|{{{1|30em}}}}}
| column-width: 30em
}}
}}
| {{#if: {{{colwidth|}}}
| column-width: {{{colwidth|30em}}}
}}
}}"></includeonly><noinclude>
{{Documentation}}
</noinclude>
rz10foumf51h4wlxnfafkna26j6u0xc
32932
32931
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Refbegin]]
32931
wikitext
text/x-wiki
<includeonly><templatestyles src="Refbegin/styles.css" /><!--
--><div class="refbegin <!--
-->{{#if: {{{indent|}}} | refbegin-hanging-indents }} <!--
-->{{#if: {{{1|{{{colwidth|}}}}}} |
{{#ifeq: {{{1}}} | 1
| <!--default to no columns-->
| refbegin-columns references-column-width
}}
}}
" style="<!--
-->{{#if: {{{1|}}}
|{{#ifeq: {{{1}}} | 1
|<!--default to no columns-->
| {{#iferror: {{#ifexpr: {{{1|1}}} > 1 }}
| column-width: {{#if:1|{{{1|30em}}}}}
| column-width: 30em
}}
}}
| {{#if: {{{colwidth|}}}
| column-width: {{{colwidth|30em}}}
}}
}}"></includeonly><noinclude>
{{Documentation}}
</noinclude>
rz10foumf51h4wlxnfafkna26j6u0xc
Tempilet:Refbegin/styles.css
10
2447
32933
2026-07-20T16:56:32Z
en>Pppery
0
Restore
32933
sanitized-css
text/css
/* {{pp-template}} */
.refbegin {
margin-bottom: 0.5em;
}
.refbegin-hanging-indents > ul,
.refbegin-hanging-indents section > ul {
margin-left: 0;
}
.refbegin-hanging-indents > ul > li,
.refbegin-hanging-indents section > ul > li {
margin-left: 0;
padding-left: 3.2em;
text-indent: -3.2em;
}
.refbegin-hanging-indents ul,
.refbegin-hanging-indents ul li {
list-style: none;
}
@media (max-width: 720px) {
.refbegin-hanging-indents > ul > li,
.refbegin-hanging-indents section > ul > li {
padding-left: 1.6em;
text-indent: -1.6em;
}
}
.refbegin-columns {
margin-top: 0.3em;
}
/* Reset top margin for lists embedded in columns */
.refbegin-columns ul {
margin-top: 0;
}
/* Avoid elements breaking between columns */
.refbegin-columns li {
page-break-inside: avoid; /* Removed from CSS in favor of break-inside c. 2020 */
break-inside: avoid-column;
}
/* make font smaller only on a display */
@media screen {
.refbegin {
font-size: 90%;
}
}
syhssffxzvjdex92fyznunfw3rhji6k
32934
32933
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Refbegin/styles.css]]
32933
sanitized-css
text/css
/* {{pp-template}} */
.refbegin {
margin-bottom: 0.5em;
}
.refbegin-hanging-indents > ul,
.refbegin-hanging-indents section > ul {
margin-left: 0;
}
.refbegin-hanging-indents > ul > li,
.refbegin-hanging-indents section > ul > li {
margin-left: 0;
padding-left: 3.2em;
text-indent: -3.2em;
}
.refbegin-hanging-indents ul,
.refbegin-hanging-indents ul li {
list-style: none;
}
@media (max-width: 720px) {
.refbegin-hanging-indents > ul > li,
.refbegin-hanging-indents section > ul > li {
padding-left: 1.6em;
text-indent: -1.6em;
}
}
.refbegin-columns {
margin-top: 0.3em;
}
/* Reset top margin for lists embedded in columns */
.refbegin-columns ul {
margin-top: 0;
}
/* Avoid elements breaking between columns */
.refbegin-columns li {
page-break-inside: avoid; /* Removed from CSS in favor of break-inside c. 2020 */
break-inside: avoid-column;
}
/* make font smaller only on a display */
@media screen {
.refbegin {
font-size: 90%;
}
}
syhssffxzvjdex92fyznunfw3rhji6k
Tempilet:Refend
10
2448
32935
2017-07-24T21:40:56Z
en>WOSlinker
0
remove </dl> since no <dl> in Template:Refbegin
32935
wikitext
text/x-wiki
<includeonly></div></includeonly><noinclude>
{{template doc|Template:refbegin/doc}}
{{TemplateDataHeader}}
<templatedata>
{
"description": "Ends a reference lists started by {{refbegin}}.",
"params": {
}
}
</templatedata>
</noinclude>
kcrxzrf6v4rvbl0yhnfcb5labufpnsp
32936
32935
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Refend]]
32935
wikitext
text/x-wiki
<includeonly></div></includeonly><noinclude>
{{template doc|Template:refbegin/doc}}
{{TemplateDataHeader}}
<templatedata>
{
"description": "Ends a reference lists started by {{refbegin}}.",
"params": {
}
}
</templatedata>
</noinclude>
kcrxzrf6v4rvbl0yhnfcb5labufpnsp
Tempilet:SfnRef
10
2449
32937
2020-07-04T15:54:11Z
en>Ahecht
0
safesubst<noinclude />:
32937
wikitext
text/x-wiki
{{safesubst<noinclude />:#invoke:Footnotes|sfnref}}<noinclude>
{{documentation}}
</noinclude>
a5bwsbkzmzfw9xjrhfy0ur5p5priatn
32938
32937
2026-11-11T21:18:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:SfnRef]]
32937
wikitext
text/x-wiki
{{safesubst<noinclude />:#invoke:Footnotes|sfnref}}<noinclude>
{{documentation}}
</noinclude>
a5bwsbkzmzfw9xjrhfy0ur5p5priatn
Tempilet:Sfnm
10
2450
32939
2020-03-27T22:18:25Z
en>Trappist the monk
0
+template;
32939
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfnm|template=sfnm}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
30eu4d1lwkb49nkua2fvoy409c5paxk
32940
32939
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sfnm]]
32939
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfnm|template=sfnm}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
30eu4d1lwkb49nkua2fvoy409c5paxk
Tempilet:Sfnref
10
2451
32941
2018-02-23T17:02:56Z
en>Primefac
0
Changed protection level for "[[Template:Sfnref]]": [[WP:HIGHRISK|high-risk]] template with 2000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32941
wikitext
text/x-wiki
#REDIRECT [[Template:SfnRef]]
d8l1vb18fcu3qm7s9i6zpuvzib89w62
32942
32941
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sfnref]]
32941
wikitext
text/x-wiki
#REDIRECT [[Template:SfnRef]]
d8l1vb18fcu3qm7s9i6zpuvzib89w62
Module:Footnotes
828
2452
32945
2026-07-03T00:30:32Z
en>Trappist the monk
0
Undid revision [[Special:Diff/1362282867|1362282867]] by [[Special:Contributions/Zackmann08|Zackmann08]] ([[User talk:Zackmann08|talk]]) I find the log useful when editors are having problems with the harv error detection; no need to remove;
32945
Scribunto
text/plain
require('strict');
local getArgs = require ('Module:Arguments').getArgs;
--[[--------------------------< A R G S _ D E F A U L T >------------------------------------------------------
a table to specify initial values.
]]
local args_default = {
group = '',
bracket_left = '',
bracket_right = '',
bracket_year_left = '',
bracket_year_right = '',
postscript = '',
page = '',
pages = '',
location = '',
page_sep = ", p. ",
pages_sep = ", pp. ",
ref = '',
template = 'harv', -- if template name not provided in {{#invoke:}} use this
};
--[[--------------------------< T A R G E T _ C H E C K >------------------------------------------------------
look for anchor_id (CITEREF name-list and year or text from |ref=) in anchor_id_list
the 'no target' error may be suppressed with |ignore-err=yes when target cannot be found because target is inside
a template that wraps another template; 'multiple targets' error may not be suppressed
]]
local function target_check (anchor_id, args)
local namespace = mw.title.getCurrentTitle().namespace;
local anchor_id_list_module = mw.loadData ('Module:Footnotes/anchor_id_list');
local anchor_id_list = anchor_id_list_module.anchor_id_list;
local article_whitelist = anchor_id_list_module.article_whitelist;
local template_list = anchor_id_list_module.template_list;
local citeref_patterns = anchor_id_list_module.citeref_patterns
local whitelist_module = mw.loadData ('Module:Footnotes/whitelist');
local whitelist = whitelist_module.whitelist;
local tally = anchor_id_list[anchor_id]; -- nil when anchor_id not in list; else a tally
local msg;
local category;
if not tally then
if args.ignore then
return ''; -- if ignore is true then no message, no category
end
if article_whitelist and article_whitelist[anchor_id] then -- if an article-local whitelist and anchor ID is in it
return ''; -- done
end
local wl_anchor_id = anchor_id; -- copy to be modified to index into the whitelist
if args.year then -- for anchor IDs created by this template (not in |ref=) that have a date
if args.year:match ('%d%l$') or -- use the date value to determine if we should remove the disambiguator
args.year:match ('n%.d%.%l$') or
args.year:match ('nd%l$') then
wl_anchor_id = wl_anchor_id:gsub ('%l$', ''); -- remove the disambiguator
end
end
local t_tbl = whitelist[wl_anchor_id]; -- get list of templates associated with this anchor ID
if t_tbl then -- when anchor ID not whitelisted t_tbl is nil
for _, t in ipairs (t_tbl) do -- spin through the list of templates associated with this anchor ID
if template_list[t] then -- if associated template is found in the list of templates in the article
return ''; -- anchor ID is whitlisted and article has matching template so no error
end
end
end
for _, pattern in ipairs(citeref_patterns) do -- load patterns for wrapper templates on this page
if anchor_id:match(pattern) then -- spin through the special patterns and try to match
return ''
end
end
msg = 'no target: ' .. anchor_id; -- anchor_id not found
mw.log(msg)
if namespace == 10 and not args.show then -- do not generate error message in template namespace
return ''
end
category = '[[Category:Harv and Sfn no-target errors]]';
elseif 1 < tally then
msg = 'multiple targets (' .. tally .. '×): ' .. anchor_id; -- more than one anchor_id in this article
mw.log(msg)
if namespace == 10 and not args.show then -- do not generate error message in template namespace
return ''
end
category = 0 == namespace and '[[Category:Harv and Sfn multiple-target errors]]' or ''; -- only categorize in article space
return '<span class="error harv-error" style="display: inline; font-size:100%"> ' .. args.template .. ' error: ' .. msg .. ' ([[:Category:Harv and Sfn template errors|help]])</span>' .. category;
end
-- category = 0 == namespace and '[[Category:Harv and Sfn template errors]]' or ''; -- only categorize in article space
category = 0 == namespace and category or ''; -- only categorize in article space
-- display based on args.show (no display by default)
local display = args.show and 'inline' or 'none'
return msg and '<span class="error harv-error" style="display: '..display..'; font-size:100%"> ' .. args.template .. ' error: ' .. msg .. ' ([[:Category:Harv and Sfn template errors|help]])</span>' .. category or '';
end
--[[--------------------------< I S _ Y E A R >----------------------------------------------------------------
evaluates param to see if it is one of these forms with or without lowercase letter disambiguator:
YYYY
n.d.
nd
c. YYYY
YYYY–YYYY (separator is endash)
YYYY–YY (separator is endash)
return true when param has a recognized form; false else
]]
local patterns_date= {
'^%d%d%d%d?%l?$',
'^n%.d%.%l?$',
'^nd%l?$',
'^c%. %d%d%d%d?%l?$',
'^%d%d%d%d–%d%d%d%d%l?$',
'^%d%d%d%d–%d%d%l?$',
}
local function is_year (param, args)
args.year = ''; -- used for harv error;
for _, pattern in ipairs (patterns_date) do
if mw.ustring.match (param, pattern) then
args.year = param; -- used for harv error;
return true;
end
end
end
--[[--------------------------< C O R E >----------------------------------------------------------------------
returns an anchor link (CITEREF) formed from one to four author names, year, and insource location (|p=, |pp=, loc=)
]]
local function core( args )
local result;
local err_msg = ''
if args.P5 ~= '' then
if is_year (args.P5, args) then
result = table.concat ({args.P1, ' et al. ', args.bracket_year_left, args.P5, args.bracket_year_right});
else
args.P5 = ''; -- when P5 not a year don't include in anchor
result = table.concat ({args.P1, ' et al.'}); -- and don't render it
end
elseif args.P4 ~= '' then
if is_year (args.P4, args) then
result = table.concat ({args.P1, ', ', args.P2, ' & ', args.P3, ' ', args.bracket_year_left, args.P4, args.bracket_year_right}); -- three names and a year
else
result = table.concat ({args.P1, ' et al.'}); -- four names
end
elseif args.P3 ~= '' then
if is_year (args.P3, args) then
result = table.concat ({args.P1, ' & ', args.P2, ' ', args.bracket_year_left, args.P3, args.bracket_year_right}); -- two names and a year
else
result = table.concat ({args.P1, ', ', args.P2, ' ', ' & ', args.P3}); -- three names
end
elseif args.P2 ~= '' then
if is_year (args.P2, args) then
result = table.concat ({args.P1, ' ', args.bracket_year_left, args.P2, args.bracket_year_right}); -- one name and year
else
result = table.concat ({args.P1, ' & ', args.P2}); -- two names
end
else
result = args.P1; -- one name
end
-- when author-date result ends with a dot (typically when the last positional parameter holds 'n.d.')
-- and when no in-source location (no |p=, |pp=, or |loc=)
-- and when the first or only character in args.postscript is a dot
-- remove the author-date result trailing dot
-- the author-date result trailing dot will be replaced later with the content of args.postscript (usually a dot)
if ('.' == result:sub(-1)) and ('.' == args.postscript:sub(1)) and ('' == args.page) and ('' == args.pages) and ('' == args.location) then
result = result:gsub ('%.$', '');
end
if args.ref ~= 'none' then
local anchor_id;
if args.ref ~= '' then
anchor_id = mw.uri.anchorEncode (args.ref);
err_msg = target_check (anchor_id, args);
result = table.concat ({'[[#', anchor_id, '|', result, ']]'});
else
anchor_id = mw.uri.anchorEncode (table.concat ({'CITEREF', args.P1, args.P2, args.P3, args.P4, args.P5}));
err_msg = target_check (anchor_id, args);
result = table.concat ({'[[#', anchor_id, '|', result, ']]'});
end
end
if args.page ~= '' then
result = table.concat ({result, args.page_sep, args.page});
elseif args.pages ~= ''then
result = table.concat ({result, args.pages_sep, args.pages});
end
if args.location ~= '' then
result = table.concat ({result, ', ', args.location});
end
result = table.concat ({args.bracket_left, result, args.bracket_right, args.postscript}):gsub ('%s+', ' '); -- strip redundant spaces
return result .. err_msg;
end
--[[--------------------------< H Y P H E N _ T O _ D A S H >--------------------------------------------------
Converts a hyphen to a dash under certain conditions. The hyphen must separate
like items; unlike items are returned unmodified. These forms are modified:
letter - letter (A - B)
digit - digit (4-5)
digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)
letterdigit - letterdigit (A1-A5) (an optional separator between letter and
digit is supported – a.1-a.5 or a-1-a-5)
digitletter - digitletter (5a - 5d) (an optional separator between letter and
digit is supported – 5.a-5.d or 5-a-5-d)
any other forms are returned unmodified.
str may be a comma- or semicolon-separated list
This code copied from Module:Citation/CS1. The only modification is to require Module:Citation/CS1/Utilities
so that it has access to the functions is_set() and has_accept_as_written()
]]
local function hyphen_to_dash( str )
local utilities = require ('Module:Citation/CS1/Utilities'); -- only modification so that this function has access to is_set() and has_accept_as_written()
if not utilities.is_set (str) then
return str;
end
local accept; -- Boolean
str = str:gsub ('&[nm]dash;', {['–'] = '–', ['—'] = '—'}); -- replace — and – entities with their characters; semicolon mucks up the text.split
str = str:gsub ('-', '-'); -- replace HTML numeric entity with hyphen character
str = str:gsub (' ', ' '); -- replace entity with generic keyboard space character
local out = {};
local list = mw.text.split (str, '%s*[,;]%s*'); -- split str at comma or semicolon separators if there are any
for _, item in ipairs (list) do -- for each item in the list
item, accept = utilities.has_accept_as_written (item); -- remove accept-this-as-written markup when it wraps all of item
if not accept and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators
if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit)
item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter)
item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit
item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit
item:match ('^%a+%s*%-%s*%a+$') then -- letter hyphen letter
item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters
else
item = mw.ustring.gsub (item, '%s*[–—]%s*', '–'); -- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace
end
end
table.insert (out, item); -- add the (possibly modified) item to the output table
end
local temp_str = ''; -- concatenate the output table into a comma separated string
temp_str, accept = utilities.has_accept_as_written (table.concat (out, ', ')); -- remove accept-this-as-written markup when it wraps all of concatenated out
if accept then
temp_str = utilities.has_accept_as_written (str); -- when global markup removed, return original str; do it this way to suppress boolean second return value
return temp_str;
else
return temp_str; -- else, return assembled temp_str
end
end
--[[--------------------------< A R G S _ F E T C H >---------------------------------------------------------
Because all of the templates share a common set of parameters, a single common function to fetch those parameters
from frame and parent frame.
]]
local function args_fetch (frame, ps)
local args = args_default; -- create a copy of the default table
local pframe = frame:getParent(); -- point to the template's parameter table
for k, v in pairs (frame.args) do -- override defaults with values provided in the #invoke: if any
args[k] = v;
end
args.postscript = pframe.args.postscript or pframe.args.ps or ps;
if 'none' == args.postscript then
args.postscript = '';
end
args.group = pframe.args.group or '';
args.page = pframe.args.p or pframe.args.page or '';
args.pages = pframe.args.pp or pframe.args.pages or '';
args.pages = ('' ~= args.pages) and hyphen_to_dash (args.pages) or '';
args.location = pframe.args.at or pframe.args.loc or '';
args.ref = pframe.args.ref or pframe.args.Ref or '';
args.ignore = ('yes' == pframe.args['ignore-false-positive']) or ('yes' == pframe.args['ignore-err']);
for i, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- loop through the five positional parameters and trim if set else empty string
args[v] = (pframe.args[i] and mw.text.trim (pframe.args[i])) or '';
end
if args.P5 and not is_year (args.P5, args) then
local i = 6; -- initialize the indexer to the sixth positional parameter
while pframe.args[i] do -- in case there are too many authors loop through the authors looking for a year
local v = mw.text.trim (pframe.args[i]); -- trim
if is_year (v, args) then -- if a year
args.P5 = v; -- overwrite whatever was in args.P5 with year
break; -- and abandon the search
end
i = i + 1; -- bump the indexer
end
end
return args;
end
--[[--------------------------< H A R V A R D _ C I T A T I O N >----------------------------------------------
common entry point for:
{{harvard citation}} aka {{harv}}
{{Harvard citation no brackets}} aka {{harvnb}}
{{harvcol}}
{{harvcolnb}}
{{harvcoltxt}}
{{Harvard citation text}} aka {{harvtxt}}
{{Harvp}}
Distinguishing features (brackets and page separators) are specified in this module's {{#invoke}} in the respective templates.
]]
local function harvard_citation (frame)
local args = args_fetch (frame, ''); -- get the template and invoke parameters; default postscript is empty string
return core (args);
end
--[[--------------------------< S T R I P _ U R L >------------------------------------------------------------
used by sfn() and sfnm(). This function fixes an issue with reference tooltip gadget where the tooltip is not displayed
when an insource locator (|p=, |pp=, |loc=) has an external wikilink that contains a # character
strip uri-reserved characters from urls in |p=, |pp-, and |loc= parameters The researved characters are:
!#$&'()*+,/:;=?@[]
]]
local function strip_url (pages)
local escaped_uri;
if not pages or ('' == pages) then
return pages;
end
for uri in pages:gmatch ('%[(%a[%w%+%.%-]*://%S+)') do -- for each external link get the uri
escaped_uri = uri:gsub ("([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ); -- save a copy with lua pattern characters escaped
uri = uri:gsub ("[!#%$&'%(%)%*%+,/:;=%?@%[%]%.%%]", ''); -- remove reserved characters and '%' because '%20' (space character) is a lua 'invalid capture index'
pages = pages:gsub (escaped_uri, uri, 1); -- replace original uri with the stripped version
end
return pages;
end
--[[--------------------------< S F N >------------------------------------------------------------------------
entry point for {{sfn}} and {{sfnp}}
]]
local function sfn (frame)
local args = args_fetch (frame, '.'); -- get the template and invoke parameters; default postscript is a dot
local result = core (args); -- go make a CITEREF anchor
-- put it all together and then strip redundant spaces
local name = table.concat ({'FOOTNOTE', args.P1, args.P2, args.P3, args.P4, args.P5, strip_url (args.page), strip_url (args.pages), strip_url (args.location)}):gsub ('%s+', ' ');
return frame:extensionTag ({name='ref', args={group=args.group, name=name}, content=result});
end
--[[--------------------------< S F N M >----------------------------------------------------------------------
common entry point for {{sfnm}} and {{sfnmp}}
Distinguishing features (brackets) are specified in this module's {{#invoke}} in the respective templates.
]]
local function sfnm (frame)
local args = args_default; -- create a copy of the default table
local pframe = frame:getParent(); -- point to the template's parameter table
local n = 1; -- index of source; this is the 'n' in na1, ny, etc
local first_pnum = 1; -- first of a pair of positional parameters
local second_pnum = 2; -- second of a pair of positional parameters
local last_ps = 0; -- index of the last source with |nps= set
local last_index = 0; -- index of the last source; these used to determine which of |ps= or |nps= will terminate the whole rendering
local out = {}; -- table to hold rendered sources
local footnote = {'FOOTNOTE'}; -- all author, date, insource location stuff becomes part of the reference's footnote id; added as we go
for k, v in pairs (frame.args) do -- override defaults with values provided in the #invoke: if any
args[k] = v;
end
while true do
if not pframe.args[table.concat ({n, 'a1'})] and not pframe.args[first_pnum] then
break; -- no na1 or matching positional parameter so done
end
if pframe.args[table.concat ({n, 'a1'})] then -- does this source use named parameters?
for _, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- initialize for this source
args[v] = '';
end
for i, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- extract author and year parameters for this source
args[v] = pframe.args[table.concat ({n, 'a', i})] or ''; -- attempt to assign author name
if '' == args[v] then -- when there wasn't an author name
args[v] = pframe.args[table.concat ({n, 'y'})] or ''; -- attempt to assign year
break; -- done with author/date for this source
end
end
else -- this source uses positional parameters
args.P1 = mw.text.trim (pframe.args[first_pnum]); -- yes, only one author supported
args.P2 = (pframe.args[second_pnum] and mw.text.trim (pframe.args[second_pnum])) or ''; -- when positional author, year must also be positional
for _, v in ipairs ({'P3', 'P4', 'P5'}) do -- blank the rest of these for this source
args[v] = '';
end
first_pnum = first_pnum + 2; -- source must use positional author and positional year
second_pnum = first_pnum + 1; -- bump these for possible next positional source
end
args.postscript = pframe.args[table.concat ({n, 'ps'})] or '';
if 'none' == args.postscript then -- this for compatibility with other footnote templates; does nothing
args.postscript = '';
end
args.group = pframe.args.group or ''; -- reference group
args.ref = pframe.args[table.concat ({n, 'ref'})] or ''; -- alternate reference for this source
args.page = pframe.args[table.concat ({n, 'p'})] or ''; -- insource locations for this source
args.pages = pframe.args[table.concat ({n, 'pp'})] or '';
args.pages = ('' ~= args.pages) and hyphen_to_dash (args.pages) or '';
args.location = pframe.args[table.concat ({n, 'loc'})] or pframe.args[table.concat ({n, 'at'})] or '';
args.ignore = ('yes' == pframe.args[table.concat ({n, 'ignore-false-positive'})]) or ('yes' == pframe.args[table.concat ({n, 'ignore-err'})]);
table.insert (out, core (args)); -- save the rendering of this source
for k, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- create the FOOTNOTE id
if '' ~= args[v] then
table.insert (footnote, args[v]);
end
end
for k, v in ipairs ({'page', 'pages', 'location'}) do -- these done separately so that we can strip uri-reserved characters from extlinked page numbers
if '' ~= args[v] then
table.insert (footnote, strip_url (args[v]))
end
end
last_index = n; -- flags used to select terminal postscript from nps or from end_ps
if '' ~= args.postscript then
last_ps = n;
end
n = n+1; -- bump for the next one
end
local name = table.concat (footnote):gsub ('%s+', ' '); -- put the footnote together and strip redundant space
args.end_ps = pframe.args.postscript or pframe.args.ps or '.'; -- this is the postscript for the whole not for the individual sources
if 'none' == args.end_ps then -- not an original sfnm parameter value; added for compatibility with other footnote templates
args.end_ps = '';
end
local result = table.concat ({table.concat (out, '; '), (last_index == last_ps) and '' or args.end_ps});
return frame:extensionTag ({name='ref', args={group=args.group, name=name}, content=result});
end
--[[--------------------------< S F N R E F >------------------------------------------------------------------
implements {{sfnref}}
]]
local function sfnref (frame)
local args = getArgs (frame);
local out = {};
for i=1, 5 do -- get the first five args if there are five args
if args[i] then
out[i] = args[i];
else
break; -- less than 5 args break out
end
end
if 5 == #out then -- when we have seen five args there may bemore
local i = 6; -- initialize the indexer to the sixth positional parameter
while args[i] do -- in case there are too many authors loop through the authors looking for a year
if is_year (args[i], args) then -- if a year
out[5] = args[i]; -- overwrite whatever was in args[5] with year
break; -- and abandon the search
end
i = i + 1; -- bump the indexer
end
end
return mw.uri.anchorEncode ('CITEREF' .. table.concat (out));
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
harvard_citation = harvard_citation,
sfn = sfn,
sfnm = sfnm,
sfnref = sfnref,
target_check = target_check,
};
3ecgpqdblqy50cj0ke12x56x7g6qre8
32946
32945
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Footnotes]]
32945
Scribunto
text/plain
require('strict');
local getArgs = require ('Module:Arguments').getArgs;
--[[--------------------------< A R G S _ D E F A U L T >------------------------------------------------------
a table to specify initial values.
]]
local args_default = {
group = '',
bracket_left = '',
bracket_right = '',
bracket_year_left = '',
bracket_year_right = '',
postscript = '',
page = '',
pages = '',
location = '',
page_sep = ", p. ",
pages_sep = ", pp. ",
ref = '',
template = 'harv', -- if template name not provided in {{#invoke:}} use this
};
--[[--------------------------< T A R G E T _ C H E C K >------------------------------------------------------
look for anchor_id (CITEREF name-list and year or text from |ref=) in anchor_id_list
the 'no target' error may be suppressed with |ignore-err=yes when target cannot be found because target is inside
a template that wraps another template; 'multiple targets' error may not be suppressed
]]
local function target_check (anchor_id, args)
local namespace = mw.title.getCurrentTitle().namespace;
local anchor_id_list_module = mw.loadData ('Module:Footnotes/anchor_id_list');
local anchor_id_list = anchor_id_list_module.anchor_id_list;
local article_whitelist = anchor_id_list_module.article_whitelist;
local template_list = anchor_id_list_module.template_list;
local citeref_patterns = anchor_id_list_module.citeref_patterns
local whitelist_module = mw.loadData ('Module:Footnotes/whitelist');
local whitelist = whitelist_module.whitelist;
local tally = anchor_id_list[anchor_id]; -- nil when anchor_id not in list; else a tally
local msg;
local category;
if not tally then
if args.ignore then
return ''; -- if ignore is true then no message, no category
end
if article_whitelist and article_whitelist[anchor_id] then -- if an article-local whitelist and anchor ID is in it
return ''; -- done
end
local wl_anchor_id = anchor_id; -- copy to be modified to index into the whitelist
if args.year then -- for anchor IDs created by this template (not in |ref=) that have a date
if args.year:match ('%d%l$') or -- use the date value to determine if we should remove the disambiguator
args.year:match ('n%.d%.%l$') or
args.year:match ('nd%l$') then
wl_anchor_id = wl_anchor_id:gsub ('%l$', ''); -- remove the disambiguator
end
end
local t_tbl = whitelist[wl_anchor_id]; -- get list of templates associated with this anchor ID
if t_tbl then -- when anchor ID not whitelisted t_tbl is nil
for _, t in ipairs (t_tbl) do -- spin through the list of templates associated with this anchor ID
if template_list[t] then -- if associated template is found in the list of templates in the article
return ''; -- anchor ID is whitlisted and article has matching template so no error
end
end
end
for _, pattern in ipairs(citeref_patterns) do -- load patterns for wrapper templates on this page
if anchor_id:match(pattern) then -- spin through the special patterns and try to match
return ''
end
end
msg = 'no target: ' .. anchor_id; -- anchor_id not found
mw.log(msg)
if namespace == 10 and not args.show then -- do not generate error message in template namespace
return ''
end
category = '[[Category:Harv and Sfn no-target errors]]';
elseif 1 < tally then
msg = 'multiple targets (' .. tally .. '×): ' .. anchor_id; -- more than one anchor_id in this article
mw.log(msg)
if namespace == 10 and not args.show then -- do not generate error message in template namespace
return ''
end
category = 0 == namespace and '[[Category:Harv and Sfn multiple-target errors]]' or ''; -- only categorize in article space
return '<span class="error harv-error" style="display: inline; font-size:100%"> ' .. args.template .. ' error: ' .. msg .. ' ([[:Category:Harv and Sfn template errors|help]])</span>' .. category;
end
-- category = 0 == namespace and '[[Category:Harv and Sfn template errors]]' or ''; -- only categorize in article space
category = 0 == namespace and category or ''; -- only categorize in article space
-- display based on args.show (no display by default)
local display = args.show and 'inline' or 'none'
return msg and '<span class="error harv-error" style="display: '..display..'; font-size:100%"> ' .. args.template .. ' error: ' .. msg .. ' ([[:Category:Harv and Sfn template errors|help]])</span>' .. category or '';
end
--[[--------------------------< I S _ Y E A R >----------------------------------------------------------------
evaluates param to see if it is one of these forms with or without lowercase letter disambiguator:
YYYY
n.d.
nd
c. YYYY
YYYY–YYYY (separator is endash)
YYYY–YY (separator is endash)
return true when param has a recognized form; false else
]]
local patterns_date= {
'^%d%d%d%d?%l?$',
'^n%.d%.%l?$',
'^nd%l?$',
'^c%. %d%d%d%d?%l?$',
'^%d%d%d%d–%d%d%d%d%l?$',
'^%d%d%d%d–%d%d%l?$',
}
local function is_year (param, args)
args.year = ''; -- used for harv error;
for _, pattern in ipairs (patterns_date) do
if mw.ustring.match (param, pattern) then
args.year = param; -- used for harv error;
return true;
end
end
end
--[[--------------------------< C O R E >----------------------------------------------------------------------
returns an anchor link (CITEREF) formed from one to four author names, year, and insource location (|p=, |pp=, loc=)
]]
local function core( args )
local result;
local err_msg = ''
if args.P5 ~= '' then
if is_year (args.P5, args) then
result = table.concat ({args.P1, ' et al. ', args.bracket_year_left, args.P5, args.bracket_year_right});
else
args.P5 = ''; -- when P5 not a year don't include in anchor
result = table.concat ({args.P1, ' et al.'}); -- and don't render it
end
elseif args.P4 ~= '' then
if is_year (args.P4, args) then
result = table.concat ({args.P1, ', ', args.P2, ' & ', args.P3, ' ', args.bracket_year_left, args.P4, args.bracket_year_right}); -- three names and a year
else
result = table.concat ({args.P1, ' et al.'}); -- four names
end
elseif args.P3 ~= '' then
if is_year (args.P3, args) then
result = table.concat ({args.P1, ' & ', args.P2, ' ', args.bracket_year_left, args.P3, args.bracket_year_right}); -- two names and a year
else
result = table.concat ({args.P1, ', ', args.P2, ' ', ' & ', args.P3}); -- three names
end
elseif args.P2 ~= '' then
if is_year (args.P2, args) then
result = table.concat ({args.P1, ' ', args.bracket_year_left, args.P2, args.bracket_year_right}); -- one name and year
else
result = table.concat ({args.P1, ' & ', args.P2}); -- two names
end
else
result = args.P1; -- one name
end
-- when author-date result ends with a dot (typically when the last positional parameter holds 'n.d.')
-- and when no in-source location (no |p=, |pp=, or |loc=)
-- and when the first or only character in args.postscript is a dot
-- remove the author-date result trailing dot
-- the author-date result trailing dot will be replaced later with the content of args.postscript (usually a dot)
if ('.' == result:sub(-1)) and ('.' == args.postscript:sub(1)) and ('' == args.page) and ('' == args.pages) and ('' == args.location) then
result = result:gsub ('%.$', '');
end
if args.ref ~= 'none' then
local anchor_id;
if args.ref ~= '' then
anchor_id = mw.uri.anchorEncode (args.ref);
err_msg = target_check (anchor_id, args);
result = table.concat ({'[[#', anchor_id, '|', result, ']]'});
else
anchor_id = mw.uri.anchorEncode (table.concat ({'CITEREF', args.P1, args.P2, args.P3, args.P4, args.P5}));
err_msg = target_check (anchor_id, args);
result = table.concat ({'[[#', anchor_id, '|', result, ']]'});
end
end
if args.page ~= '' then
result = table.concat ({result, args.page_sep, args.page});
elseif args.pages ~= ''then
result = table.concat ({result, args.pages_sep, args.pages});
end
if args.location ~= '' then
result = table.concat ({result, ', ', args.location});
end
result = table.concat ({args.bracket_left, result, args.bracket_right, args.postscript}):gsub ('%s+', ' '); -- strip redundant spaces
return result .. err_msg;
end
--[[--------------------------< H Y P H E N _ T O _ D A S H >--------------------------------------------------
Converts a hyphen to a dash under certain conditions. The hyphen must separate
like items; unlike items are returned unmodified. These forms are modified:
letter - letter (A - B)
digit - digit (4-5)
digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)
letterdigit - letterdigit (A1-A5) (an optional separator between letter and
digit is supported – a.1-a.5 or a-1-a-5)
digitletter - digitletter (5a - 5d) (an optional separator between letter and
digit is supported – 5.a-5.d or 5-a-5-d)
any other forms are returned unmodified.
str may be a comma- or semicolon-separated list
This code copied from Module:Citation/CS1. The only modification is to require Module:Citation/CS1/Utilities
so that it has access to the functions is_set() and has_accept_as_written()
]]
local function hyphen_to_dash( str )
local utilities = require ('Module:Citation/CS1/Utilities'); -- only modification so that this function has access to is_set() and has_accept_as_written()
if not utilities.is_set (str) then
return str;
end
local accept; -- Boolean
str = str:gsub ('&[nm]dash;', {['–'] = '–', ['—'] = '—'}); -- replace — and – entities with their characters; semicolon mucks up the text.split
str = str:gsub ('-', '-'); -- replace HTML numeric entity with hyphen character
str = str:gsub (' ', ' '); -- replace entity with generic keyboard space character
local out = {};
local list = mw.text.split (str, '%s*[,;]%s*'); -- split str at comma or semicolon separators if there are any
for _, item in ipairs (list) do -- for each item in the list
item, accept = utilities.has_accept_as_written (item); -- remove accept-this-as-written markup when it wraps all of item
if not accept and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators
if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit)
item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter)
item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit
item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit
item:match ('^%a+%s*%-%s*%a+$') then -- letter hyphen letter
item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters
else
item = mw.ustring.gsub (item, '%s*[–—]%s*', '–'); -- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace
end
end
table.insert (out, item); -- add the (possibly modified) item to the output table
end
local temp_str = ''; -- concatenate the output table into a comma separated string
temp_str, accept = utilities.has_accept_as_written (table.concat (out, ', ')); -- remove accept-this-as-written markup when it wraps all of concatenated out
if accept then
temp_str = utilities.has_accept_as_written (str); -- when global markup removed, return original str; do it this way to suppress boolean second return value
return temp_str;
else
return temp_str; -- else, return assembled temp_str
end
end
--[[--------------------------< A R G S _ F E T C H >---------------------------------------------------------
Because all of the templates share a common set of parameters, a single common function to fetch those parameters
from frame and parent frame.
]]
local function args_fetch (frame, ps)
local args = args_default; -- create a copy of the default table
local pframe = frame:getParent(); -- point to the template's parameter table
for k, v in pairs (frame.args) do -- override defaults with values provided in the #invoke: if any
args[k] = v;
end
args.postscript = pframe.args.postscript or pframe.args.ps or ps;
if 'none' == args.postscript then
args.postscript = '';
end
args.group = pframe.args.group or '';
args.page = pframe.args.p or pframe.args.page or '';
args.pages = pframe.args.pp or pframe.args.pages or '';
args.pages = ('' ~= args.pages) and hyphen_to_dash (args.pages) or '';
args.location = pframe.args.at or pframe.args.loc or '';
args.ref = pframe.args.ref or pframe.args.Ref or '';
args.ignore = ('yes' == pframe.args['ignore-false-positive']) or ('yes' == pframe.args['ignore-err']);
for i, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- loop through the five positional parameters and trim if set else empty string
args[v] = (pframe.args[i] and mw.text.trim (pframe.args[i])) or '';
end
if args.P5 and not is_year (args.P5, args) then
local i = 6; -- initialize the indexer to the sixth positional parameter
while pframe.args[i] do -- in case there are too many authors loop through the authors looking for a year
local v = mw.text.trim (pframe.args[i]); -- trim
if is_year (v, args) then -- if a year
args.P5 = v; -- overwrite whatever was in args.P5 with year
break; -- and abandon the search
end
i = i + 1; -- bump the indexer
end
end
return args;
end
--[[--------------------------< H A R V A R D _ C I T A T I O N >----------------------------------------------
common entry point for:
{{harvard citation}} aka {{harv}}
{{Harvard citation no brackets}} aka {{harvnb}}
{{harvcol}}
{{harvcolnb}}
{{harvcoltxt}}
{{Harvard citation text}} aka {{harvtxt}}
{{Harvp}}
Distinguishing features (brackets and page separators) are specified in this module's {{#invoke}} in the respective templates.
]]
local function harvard_citation (frame)
local args = args_fetch (frame, ''); -- get the template and invoke parameters; default postscript is empty string
return core (args);
end
--[[--------------------------< S T R I P _ U R L >------------------------------------------------------------
used by sfn() and sfnm(). This function fixes an issue with reference tooltip gadget where the tooltip is not displayed
when an insource locator (|p=, |pp=, |loc=) has an external wikilink that contains a # character
strip uri-reserved characters from urls in |p=, |pp-, and |loc= parameters The researved characters are:
!#$&'()*+,/:;=?@[]
]]
local function strip_url (pages)
local escaped_uri;
if not pages or ('' == pages) then
return pages;
end
for uri in pages:gmatch ('%[(%a[%w%+%.%-]*://%S+)') do -- for each external link get the uri
escaped_uri = uri:gsub ("([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ); -- save a copy with lua pattern characters escaped
uri = uri:gsub ("[!#%$&'%(%)%*%+,/:;=%?@%[%]%.%%]", ''); -- remove reserved characters and '%' because '%20' (space character) is a lua 'invalid capture index'
pages = pages:gsub (escaped_uri, uri, 1); -- replace original uri with the stripped version
end
return pages;
end
--[[--------------------------< S F N >------------------------------------------------------------------------
entry point for {{sfn}} and {{sfnp}}
]]
local function sfn (frame)
local args = args_fetch (frame, '.'); -- get the template and invoke parameters; default postscript is a dot
local result = core (args); -- go make a CITEREF anchor
-- put it all together and then strip redundant spaces
local name = table.concat ({'FOOTNOTE', args.P1, args.P2, args.P3, args.P4, args.P5, strip_url (args.page), strip_url (args.pages), strip_url (args.location)}):gsub ('%s+', ' ');
return frame:extensionTag ({name='ref', args={group=args.group, name=name}, content=result});
end
--[[--------------------------< S F N M >----------------------------------------------------------------------
common entry point for {{sfnm}} and {{sfnmp}}
Distinguishing features (brackets) are specified in this module's {{#invoke}} in the respective templates.
]]
local function sfnm (frame)
local args = args_default; -- create a copy of the default table
local pframe = frame:getParent(); -- point to the template's parameter table
local n = 1; -- index of source; this is the 'n' in na1, ny, etc
local first_pnum = 1; -- first of a pair of positional parameters
local second_pnum = 2; -- second of a pair of positional parameters
local last_ps = 0; -- index of the last source with |nps= set
local last_index = 0; -- index of the last source; these used to determine which of |ps= or |nps= will terminate the whole rendering
local out = {}; -- table to hold rendered sources
local footnote = {'FOOTNOTE'}; -- all author, date, insource location stuff becomes part of the reference's footnote id; added as we go
for k, v in pairs (frame.args) do -- override defaults with values provided in the #invoke: if any
args[k] = v;
end
while true do
if not pframe.args[table.concat ({n, 'a1'})] and not pframe.args[first_pnum] then
break; -- no na1 or matching positional parameter so done
end
if pframe.args[table.concat ({n, 'a1'})] then -- does this source use named parameters?
for _, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- initialize for this source
args[v] = '';
end
for i, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- extract author and year parameters for this source
args[v] = pframe.args[table.concat ({n, 'a', i})] or ''; -- attempt to assign author name
if '' == args[v] then -- when there wasn't an author name
args[v] = pframe.args[table.concat ({n, 'y'})] or ''; -- attempt to assign year
break; -- done with author/date for this source
end
end
else -- this source uses positional parameters
args.P1 = mw.text.trim (pframe.args[first_pnum]); -- yes, only one author supported
args.P2 = (pframe.args[second_pnum] and mw.text.trim (pframe.args[second_pnum])) or ''; -- when positional author, year must also be positional
for _, v in ipairs ({'P3', 'P4', 'P5'}) do -- blank the rest of these for this source
args[v] = '';
end
first_pnum = first_pnum + 2; -- source must use positional author and positional year
second_pnum = first_pnum + 1; -- bump these for possible next positional source
end
args.postscript = pframe.args[table.concat ({n, 'ps'})] or '';
if 'none' == args.postscript then -- this for compatibility with other footnote templates; does nothing
args.postscript = '';
end
args.group = pframe.args.group or ''; -- reference group
args.ref = pframe.args[table.concat ({n, 'ref'})] or ''; -- alternate reference for this source
args.page = pframe.args[table.concat ({n, 'p'})] or ''; -- insource locations for this source
args.pages = pframe.args[table.concat ({n, 'pp'})] or '';
args.pages = ('' ~= args.pages) and hyphen_to_dash (args.pages) or '';
args.location = pframe.args[table.concat ({n, 'loc'})] or pframe.args[table.concat ({n, 'at'})] or '';
args.ignore = ('yes' == pframe.args[table.concat ({n, 'ignore-false-positive'})]) or ('yes' == pframe.args[table.concat ({n, 'ignore-err'})]);
table.insert (out, core (args)); -- save the rendering of this source
for k, v in ipairs ({'P1', 'P2', 'P3', 'P4', 'P5'}) do -- create the FOOTNOTE id
if '' ~= args[v] then
table.insert (footnote, args[v]);
end
end
for k, v in ipairs ({'page', 'pages', 'location'}) do -- these done separately so that we can strip uri-reserved characters from extlinked page numbers
if '' ~= args[v] then
table.insert (footnote, strip_url (args[v]))
end
end
last_index = n; -- flags used to select terminal postscript from nps or from end_ps
if '' ~= args.postscript then
last_ps = n;
end
n = n+1; -- bump for the next one
end
local name = table.concat (footnote):gsub ('%s+', ' '); -- put the footnote together and strip redundant space
args.end_ps = pframe.args.postscript or pframe.args.ps or '.'; -- this is the postscript for the whole not for the individual sources
if 'none' == args.end_ps then -- not an original sfnm parameter value; added for compatibility with other footnote templates
args.end_ps = '';
end
local result = table.concat ({table.concat (out, '; '), (last_index == last_ps) and '' or args.end_ps});
return frame:extensionTag ({name='ref', args={group=args.group, name=name}, content=result});
end
--[[--------------------------< S F N R E F >------------------------------------------------------------------
implements {{sfnref}}
]]
local function sfnref (frame)
local args = getArgs (frame);
local out = {};
for i=1, 5 do -- get the first five args if there are five args
if args[i] then
out[i] = args[i];
else
break; -- less than 5 args break out
end
end
if 5 == #out then -- when we have seen five args there may bemore
local i = 6; -- initialize the indexer to the sixth positional parameter
while args[i] do -- in case there are too many authors loop through the authors looking for a year
if is_year (args[i], args) then -- if a year
out[5] = args[i]; -- overwrite whatever was in args[5] with year
break; -- and abandon the search
end
i = i + 1; -- bump the indexer
end
end
return mw.uri.anchorEncode ('CITEREF' .. table.concat (out));
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
harvard_citation = harvard_citation,
sfn = sfn,
sfnm = sfnm,
sfnref = sfnref,
target_check = target_check,
};
3ecgpqdblqy50cj0ke12x56x7g6qre8
Module:Footnotes/anchor id list
828
2453
32947
2025-01-14T02:04:50Z
en>Hike395
0
fix errors when using Visual Editor
32947
Scribunto
text/plain
require('strict');
local data = mw.loadData ('Module:Footnotes/anchor id list/data');
local whitelist = mw.loadData ('Module:Footnotes/whitelist');
local Lang_obj = mw.language.getContentLanguage(); -- used by template_list_add() to uppercase first letter of template name TODO: better way to do that?
local redirects_date = {
['date'] = true,
['datetomos'] = true,
['formatdate'] = true,
['isotodmymdy'] = true,
['isotomos'] = true,
}
local redirects_patent = { -- special case cs1-like templates because uses different parameters for name and date in anchor ID
['Cite patent'] = true,
['Citeref patent'] = true,
['Ref patent'] = true,
}
local redirects_sfnref = {
['sfnref'] = true,
['harvid'] = true,
}
local aliases_author = { -- these use pseudo-patterns in the same way as cs1|2; '#' represents 1 or more enumerator digits
'last#',
'author#',
'surname#',
'author-last#',
'author#-last',
'subject#',
'host#',
}
local aliases_contributor = {
'contributor#',
'contributor-last#',
'contributor#-last',
'contributor-surname#',
'contributor#-surname',
}
local aliases_editor = {
'editor#',
'editor-last#',
'editor#-last',
'editor-surname#',
'editor#-surname',
}
local aliases_harvc_author = {
'last#',
'author#',
}
local aliases_inventor = { -- cite patent
'inventor#',
'inventor-last#',
'inventor#-last',
'inventor-surname#',
'inventor#-surname',
'invent#',
'invent-#',
}
local alias_patterns_date = { -- normal lua patterns for most cs1|2-like templates
'|%s*year%s*=%s*',
'|%s*date%s*=%s*',
'|%s*publication%-?date%s*=%s*',
'|%s*air%-?date%s*=%s*',
}
local alias_patterns_harvc_date = { -- normal lua patterns for harvc template
'|%s*anchor%-year%s*=%s*',
'|%s*year%s*=%s*',
}
local alias_patterns_patent_date = { -- normal lua patterns for cite patent templates
'|%s*issue%-date%s*=%s*',
'|%s*gdate%s*=%s*',
'|%s*publication%-date%s*=%s*',
'|%s*pubdate%s*=%s*',
}
local patterns_date = { -- normal lua patterns
-- '(%d%d%d%d–%d%d%d%d%l?)$', -- YYYY–YYYY four-digit year range at end (Season YYYY–YYYY); with or without dab
'(%d%d%d%d)%D+(%d%d%d%d%l?)$', -- any range with four-digit years; with or without dab; not two captures
'^(%d%d%d%d–%d%d%l?)$', -- YYYY–YY two-digit year range; with or without dab
'^(c%. %d%d%d%d?%l?)$', -- three- or four-digit circa year; with or without dab
'(%d%d%d%d?%l?)$', -- three- or four-digit year at end of date (dmy or mdy); with or without dab
'^(%d%d%d%d?%l?)', -- three- or four-digit year at beginning of date (ymd or YYYY); with or without dab
'^(n%.d%.%l?)$', -- 'no date' with dots; with or without dab
'^(nd%l?)$', -- 'no date' without dots; with or without dab
}
local patterns_tags = {
'<nowiki>.-</nowiki>',
'<!%-%-.-%-%->',
'<pre>.-</pre>',
'<syntaxhighlight.->.-</syntaxhighlight>',
'<source.->.-</source>', -- deprecated alias of syntaxhighlight tag
}
local template_skip = { -- templates to be skipped for whatever reason; mostly because they resemble cs1-like templates
['Citation-attribution'] = true,
}
local global_article_content = nil
local global_anchor_id_list = nil -- exported tables
local global_template_list = nil
local global_article_whitelist = nil
--[[--------------------------< A R T I C L E _ C O N T E N T _ G E T >----------------------------------------
get article content, remove certain html-like tags and their content so that this code doesn't include any citation
templates inside the tags as valid tagets; they are not.
]]
local function article_content_get ()
if global_article_content then return global_article_content end
local article_content = mw.title.getCurrentTitle():getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
for _, tag in ipairs (patterns_tags) do
article_content = article_content:gsub (tag, ''); -- remove certain html-like tags and their content
end
global_article_content = article_content
return article_content
end
--[[--------------------------< S F N R E F _ G E T >----------------------------------------------------------
make an anchor id from the contents of {{sfnref}} or {{harvid}}. this function assumes that {{sfnref}} and {{harvid}}
are correctly formed.
]]
local function sfnref_get (template)
template = template:gsub ('{{%s*(.-)%s*}}', '%1'); -- strip bounding template markup and trim
local parts = mw.text.split (template, '%s*|%s*'); -- split at the pipe and remove extraneous space characters
local anchor_id = {};
if redirects_sfnref[parts[1]:lower()] then
anchor_id[1] = 'CITEREF';
else
return nil; -- not an sfnref or harvid template
end
local i = 2; -- indexer into parts{} table
local j = 2; -- indexer into anchor_id{} table which already has 'CITEREF' at [1]
while parts[i] and 7 > j do -- loop through what should be just positional parameters for names and year (2-6 four names and a date)
if not parts[i]:find ('=') then -- look for equal sign (named paraneter in a template that doesn't support named parameters)
anchor_id[j] = parts[i]; -- positional parameters are saved
j = j+1; -- bump the anchor_id{} indexer
end
i = i+ 1; -- bump the parts{} indexer
end
return table.concat (anchor_id, '');
end
--[[--------------------------< D A T E _ G E T >--------------------------------------------------------------
extract year from one of |year=, |date=, |publicationdate=, or |publication-date in that order. Does not error
check (that is left to the cs1|2 templates to do)
also gets date from |<date alias>={{date|...}}
]]
local function date_get (template, aliases)
local rvalue;
for _, pattern in ipairs (aliases) do -- spin through the date alias patterns
rvalue = tostring(template):match (pattern); -- is this |<date alias>= used (tostring() because something makes match() think template is a table)
if rvalue then
rvalue = tostring(template):match (pattern .. '(%b{})'); -- is rvalue a template?
if rvalue then
rvalue = rvalue:gsub ('{{%s*(.-)%s*}}', '%1'); -- strip bounding template markup and trim
local parts = mw.text.split (rvalue, '%s*|%s*'); -- split at the pipe and remove extraneous space characters
if redirects_date[parts[1]:lower()] then -- if parts[1] names {{date}} or redirect
rvalue = parts[2]; -- assume that date template is properly formed, first positional parameter is the date
else
return ''; -- |date= holds some other template than {{date}} or redirect
end
else
rvalue = template:match (pattern .. '([^|}]+)');
if rvalue then -- if rvalue is something
rvalue = mw.text.trim (rvalue); -- trim it
end
if not rvalue or '' == rvalue then -- if rvale was nothing or trimed to nothing
rvalue = nil; -- ensure that it is unset so we can try the next parameter in the list
end
end
if rvalue then
for _, pattern in ipairs (patterns_date) do -- spin through the recognized date formats
-- date = rvalue:match (pattern); -- attempt to extract year portion according to the pattern
local date, date2 = rvalue:match (pattern); -- attempt to extract year portion according to the pattern; <date2> gets second year in any range
if date then
if date2 then -- when a second year
date = table.concat ({date, '–', date2}); -- build a date range
end
return date; -- matched so return;
end
end
break; -- found a date but it was malformed so abandon
end
end
end
return ''; -- no date param or date param doesn't hold a recognized date; empty string for concatenation
end
--[[--------------------------< V N A M E S _ G E T >----------------------------------------------------------
extract names from |vauthors= or |veditors=; there is no |vcontributors= parameter.
splits the v parameter value at the comma; correctly handles accept-as-witten markup when used to wrap a comma-
separated names (corporate)
]]
local function vnames_get (params, vparam)
local vnames = {}; -- first four author or editor names go here
local split = {}; -- temp table to assist in decoding accept-as-witten-markup
if params[vparam] then -- test for |vauthors= or |veditor=
split = mw.text.split (params[vparam], '%s*,%s*'); -- this will separate portions of ((Black, Brown, White, an Co.))
local i = 1; -- an indexer
while split[i] do
if split[i]:match ('^%(%(.*[^%)][^%)]$') then -- first segment of comma-separated accept-as-witten; this segment has the opening doubled parens
local name = split[i];
i=i+1; -- bump indexer to next segment
while split[i] do
name = name .. ', ' .. split[i]; -- concatenate with previous segments
if split[i]:match ('^.*%)%)$') then -- if this table member has the closing doubled parens
break; -- and done reassembling so
end
i=i+1; -- bump indexer
end
table.insert (vnames, name); -- and add accept-as-witten name to the vnames table
else
table.insert (vnames, split[i]); -- and add name to the vnames table
end
i=i+1; -- bump indexer
if 5 == i then break; end -- limit to four names
end
for i, vname in ipairs (vnames) do
if not vname:match ('%(%(.-%)%)') then -- without accept-this-value-as-written markup
vnames[i] = vname:gsub ('(.-)%s+%u+$', '%1'); -- extract and save surname(s)
end
end
for i, vname in ipairs (vnames) do -- repeat, this time for accept-this-value-as-written markup
vnames[i] = vname:gsub ('%(%((.-)%)%)', '%1'); -- remove markup if present and save the whole name
end
end
return 0 ~= #vnames and table.concat (vnames) or nil -- return a concatenation of the vnames; nil else
end
--[[--------------------------< N A M E S _ G E T >------------------------------------------------------------
cs1|2 makes anchor id from contributor, author, or editor name-lists in that order
get the names from the cs1|2 template; if there are no contributor names, try author names, then try editor names.
returns concatenated names in enumeration order when successful; nil else
empty name (nameholding parameter n is present without value) and missing name (nameholding parameter n is not
present) are included as empty string with all other names
]]
local function names_get (params, aliases_list)
local names = {}; -- first four author or editor names go here
local enum_alias; -- alias with '#' replaced with a digit
for enum=1, 4 do -- four names only
for i, alias in ipairs (aliases_list) do
if not names[enum] then -- hanven't found a previous alias with this [enum]? see if we can find this alias with this enum
enum_alias = alias:gsub ('#', enum); -- replace '#' to make 'lastn'
if 1 == enum then -- because |last= and last1= are exact aliases
if params[enum_alias] then -- test |last1= first
names[enum] = params[enum_alias]; -- found so save the value assigned to |last1=
break; -- next enum
else
enum_alias = alias:gsub ('#', ''); -- replace '#' to make 'last'
if params[enum_alias] then
names[enum] = params[enum_alias]; -- found so save the value assigned to |last=
break; -- next enum
end
end
else -- here for enum 2, 3, 4
if params[enum_alias] then
names[enum] = params[enum_alias]; -- found so save the value assigned to |lastn=
break; -- next enum
end
end
end
end
end
for enum=1, 4 do -- spin through the names table and
local name = names[enum];
if not name then -- when nameholding parameter n is not present (nil)
name = ''; -- convert to empty string for concatenation
end
name = name:gsub('%(%((.-)%)%)', '%1'); -- remove accept-as-written markup if present
names[enum] = name; -- save the modified name
end
local name_str = table.concat (names); -- concatenate the names
return '' ~= name_str and name_str or nil; -- return the concatenation if not empty string; nil else
end
--[[--------------------------< T E M P L A T E _ S T R I P >--------------------------------------------------
removes the citation or havrc template's {{ and }} markup then removes, in whole, any templates found inside the
citation or harvc template.
Templates are not allowed in parameters that are made part of COinS metadata; yet, they will appear. cs1|2 does
not see the template markup but instead sees the result of the template as html. cs1|2 strips the html which
leaves the displayed value for the anchor id. We can't do that here so, because templates aren't allowed in
parameters, we simply discard any templates found in the cs1|2 template.
this may leave a |lastn= parameter empty which will be treated as if it were really empty as cs1|2 do (three authors,
|last2= empty -> CITEREFLast1Last3YYYY (the harv and sfn render: 'Last1, & Last3 YYYY' with CITEREFLast1Last3YYYY).
]]
local function template_strip (template)
template = template:gsub ('^{{%s*', ''):gsub ('%s*}}$', '', 1); -- remove outer {{ and }} (cs1|2 template delimiters with trailing/leading whitespace)
template = template:gsub ('%b{}', ''); -- remove any templates from the cs1|2 template
return template;
end
--[[--------------------------< E S C A P E _ L U A _ M A G I C _ C H A R S >----------------------------------
Returns a string where all of lua's magic characters have been escaped. This is important because functions like
string.gsub() treat their pattern and replace strings as patterns, not literal strings.
]]
local function escape_lua_magic_chars (argument)
argument = argument:gsub("%%", "%%%%"); -- replace % with %%
argument = argument:gsub("([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1"); -- replace all other lua magic pattern characters
return argument;
end
--[=[-------------------------< W I K I L I N K _ S T R I P >--------------------------------------------------
Wikilink markup does not belong in an anchor id and can / does confuse the code that parses apart citation and
harvc templates so here we remove any wiki markup:
[[link|label]] -> label
[[link]] -> link
]=]
local function wikilink_strip (template)
for wikilink in template:gmatch ('%[%b[]%]') do -- get a wikilink
template = template:gsub ('%[%b[]%]', '__57r1P__', 1); -- install a marker
if wikilink:match ('%[%[.-|(.-)%]%]') then
wikilink = wikilink:match ('%[%[.-|(.-)%]%]'); -- extract label from complex [[link|label]] wikilink
else
wikilink = wikilink:match ('%[%[(.-)%]%]'); -- extract link from simple [[link]] wikilinks
end
wikilink = escape_lua_magic_chars (wikilink); -- in case there are lua magic characters in wikilink
template = template:gsub ('__57r1P__', wikilink, 1); -- replace the marker with the appropriate text
end
return template;
end
--[[--------------------------< T E M P L A T E _ N A M E _ G E T >--------------------------------------------
return the citation or harvc template's name; convert to lower case and trim leading and trailing whitespace;
when the template is a sandbox the subpage portion of the template name is omitted from the returned template name
{{Cite book/new |...}} returns cite book
]]
local function template_name_get (template)
local template_name = template:match ('^{{%s*([^/|}]+)'); -- get template name; ignore subpages ~/new, ~/sandbox; parser functions
if not template_name or template_name:match ('^#') then -- parser functions, magic words don't count as templates
return nil; -- could not get template name from (possibly corrupt) template; extraneous opening { mid template can cause this;
end;
template_name = template_name:gsub ('%s*$', ''); -- trim trailing whitespace; leading whitespace already removed
return Lang_obj:ucfirst (template_name); -- first character in template name must be uppercase (same as canonical template name) TODO: better way to do this?
end
--[[--------------------------< T E M P L A T E _ P A R A M S _ G E T >----------------------------------------
parse apart a template's parameters and store in the params table where key is the parameter's name and value is
the parameter's value; empty parameters are not saved
]]
local function template_params_get (template, params_t)
template = wikilink_strip (template); -- because piped wikilinks confuse code that builds params_t{} and because wikilinks not allowed in an anchor id
-- strip templates after getting |ref= value because |ref={{sfnref}} and |ref={{harvid}} are allowed
template = template_strip (template); -- because template markup can confuse code that builds params_t{} and because templates in name parameters are not allowed
local temp_t = mw.text.split (template, '%s*|%s*'); --split on the pipe
for _, param in ipairs (temp_t) do
if param:find ('=', 1, true) then -- a named parameter?
local k, v = param:match ('%s*([^=]-)%s*=%s*([^|}]+)');
if v then -- there must be a value
if '' ~= v and not v:match ('^%s$') then -- skip when value is empty string or only whitespace
params_t[k] = mw.text.trim (v); -- add trimmed value else
end
end
end
end
end
--[[--------------------------< C I T E R E F _ M A K E _ H A R V C >------------------------------------------
makes anchor_id from {{harvc}} or redirects
]]
local function anchor_id_make_harvc (template)
local date = date_get (template, alias_patterns_harvc_date); -- get date; done here because might be in {{date}}; return date if valid; empty string else
local anchor_id;
local params = {}; -- table of harvc parameters
local id; -- custom anchor id for this {{harvc}} template
id = template:match ('|%s*id%s*=%s*(%b{})'); -- in case |id={{sfnref}}; done here because templates will be stripped
template_params_get (template, params); -- build a table of template parameters and their values; this strips wikilinks and templates
if id then -- when set is {{sfnref}} or {{harvid}} template
return sfnref_get (id); -- returns content of {{sfnref}} or {{harvid}}; nil else
end
if params.id then -- custom anchor for this {{harvc}} template (text)
return params.id; -- |id= value as written
end
anchor_id = names_get (params, aliases_harvc_author); -- get the harvc contributor names
if anchor_id then -- if names were gotten
return 'CITEREF' .. anchor_id .. date;
end
return nil; -- no names; no anchor_id
end
--[[--------------------------< A N C H O R _ I D _ M A K E _ W R A P P E R >----------------------------------
for wrapper templates
inspect externally visible |ref= to decide what to do:
|ref= - empty or missing: get names and date from whitelist defaults; override defaults from externally visible template parameters
|ref=harv - same as empty or missing
|ref={{SfnRef|name|name|name|name|year}} - assemble an anchor id from {{sfnref}} positional parameters
|ref={{Harvid|name|name|name|name|year}} - assemble an anchor id from {{harvid}} positional parameters
|ref=none - skip; do nothing because an anchor id intentionally suppressed; TODO: keep with a type code of '0'?
|ref=<text> - save param value because may match an anchor id override value in {{harv}} template |ref= parameter or {{harvc}} |id= parameter
]]
local function anchor_id_make_wrapper (template)
local ref; -- content of |ref=
local template_name; -- name of the template
local anchor_id; -- the assembled anchor id from this template
local date;
local name_default;
local date_default;
local vol;
local params = {}; -- table of template parameters
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
if not template_name or template_skip[template_name] then
return nil; -- could not extract template name from (possibly corrupted) template (extraneous opening { in the template will cause this)
end
date = date_get (template, alias_patterns_date); -- get date; done here because might be in {{date}}
-- if '' == date then
-- date = whitelist.wrapper_templates[template_name][2] or ''; -- no externally visible date so get default date
-- end
ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the wrapper template
if not ref then
if template:match ('|%s*ref%s*=([^|}]+)') then -- |ref={{template}} not found; if there is a |ref= param with an assigned value
ref = template:match ('|%s*ref%s*=([^|}]+)'); -- get the value; whitespace is a 'value'
if ref then -- nil when |ref=|... or when |ref=}} (no spaces between assignment operator and pipe or closing brace)
ref = mw.text.trim (ref); -- something, could be just whitespace, so trim leading / trailing whitespace
if '' == ref then -- trimming a string of whitespace makes an empty string
ref = nil; -- make empty ref same as missing ref
end
end
end
end
template_params_get (template, params); -- build a table of template parameters and their values
local wrap_data = whitelist.wrapper_templates[template_name]
if wrap_data[1] then -- is this wrapper a simple-default wrapper?
name_default = wrap_data[1]; -- get the default names
date_default = wrap_data[2]; -- get the default date
else
vol = params['volume'] or 'default';
local fascicle = params['fascicle'] -- some templates use "fascicle" to mean "subvolume"
if fascicle then
local subvol = vol..'/'..fascicle -- if fascicle is used, subvolume = "vol/fascicle"
if wrap_data[subvol] then -- if subvolume exists, use it, otherwise fall back to volume
vol = subvol
end
end
if not wrap_data[vol] then -- make sure this volume exists
vol = 'default'; -- doesn't exist, use default volume
end
name_default = wrap_data[vol][1]; -- get the default names
date_default = wrap_data[vol][2]; -- get the default date
end
if 'harv' == ref or not ref then -- |ref=harv specified or |ref= missing or empty
anchor_id = names_get (params, aliases_contributor) or -- get contributor, author, or editor names
names_get (params, aliases_author) or
vnames_get (params, 'vauthors') or -- |vauthors=
names_get (params, aliases_editor) or
vnames_get (params, 'veditors') or -- |veditors=
name_default; -- default names from whitelist
-- whitelist.wrapper_templates[template_name][1]; -- default names from whitelist
if '' == date then -- if date not provided in the template
date = date_default; -- use the default date from whitelist
end
if anchor_id then -- if names were gotten
anchor_id = 'CITEREF' .. anchor_id .. date;
end
elseif ref:match ('%b{}') then -- ref holds a template
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
elseif 'none' == ref then -- |ref=none
return nil; -- anchor id expicitly suppressed
else
anchor_id = ref; -- |ref=<text> may match an anchor id override value in {{harv}} template |ref= parameter
end
return anchor_id; -- anchor_id text; nil else
end
--[[--------------------------< A N C H O R _ I D _ M A K E _ C S 1 2 >----------------------------------------
for cs1|2 template and cs1-like templates
inspect |ref= to decide what to do:
|ref= - empty or missing: get names and date from template parameters; all cs1|2 create CITEREF anchor IDs
|ref=harv - get names and date from template parameters
|ref={{SfnRef|name|name|name|name|year}} - assemble an anchor id from {{sfnref}} positional parameters
|ref={{Harvid|name|name|name|name|year}} - assemble an anchor id from {{harvid}} positional parameters
|ref=none - skip; do nothing because an anchor id intentionally suppressed; TODO: keep with a type code of '0'?
|ref=<text> - save param value because may match an anchor id override value in {{harv}} template |ref= parameter or {{harvc}} |id= parameter
]]
local function anchor_id_make_cs12 (template)
local ref; -- content of |ref=
local template_name; -- name of the template
local anchor_id; -- the assembled anchor id from this template
local date;
local params = {}; -- table of template parameters
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
if not template_name or template_skip[template_name] then
return nil; -- could not extract template name from (possibly corrupted) template (extraneous opening { in the template will cause this)
end
if redirects_patent[template_name] then
date = date_get (template, alias_patterns_patent_date); -- get date; done here because might be in {{date}}
else
date = date_get (template, alias_patterns_date);
end
ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the cs1|2 template
if not ref then
if template:match ('|%s*ref%s*=([^|}]+)') then -- |ref={{template}} not found; if there is a |ref= param with an assigned value
ref = template:match ('|%s*ref%s*=([^|}]+)'); -- get the value; whitespace is a 'value'
if ref then -- nil when |ref=|... or when |ref=}} (no spaces between assignment operator and pipe or closing brace)
ref = mw.text.trim (ref); -- something, could be just whitespace, so trim leading / trailing whitespace
if '' == ref then -- trimming a string of whitespace makes an empty string
ref = nil; -- make empty ref same as missing ref
end
end
end
end
template_params_get (template, params); -- build a table of template parameters and their values
if 'harv' == ref or not ref then -- |ref=harv specified or |ref= missing or empty
if redirects_patent[template_name] then -- if this is a cite patent template
anchor_id = names_get (params, aliases_inventor); -- inventor names only
else -- cs1|2 template
anchor_id = names_get (params, aliases_contributor) or -- get contributor, author, or editor names
names_get (params, aliases_author) or
vnames_get (params, 'vauthors') or -- |vauthors=
names_get (params, aliases_editor) or
vnames_get (params, 'veditors'); -- |veditors=
end
if anchor_id then -- if names were gotten
anchor_id = 'CITEREF' .. anchor_id .. date;
end
elseif ref:match ('%b{}') then -- ref holds a template
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
elseif 'none' == ref and not redirects_patent[template_name] then -- |ref=none; not supported by cite patent
return nil; -- anchor id expicitly suppressed
else
anchor_id = ref; -- |ref=<text> may match an anchor id override value in {{harv}} template |ref= parameter
end
return anchor_id; -- anchor_id text; nil else
end
--[[--------------------------< L I S T _ A D D >--------------------------------------------------------------
adds an <item> to <list> table; for anchor IDs, the boolean <encode> argument must be set true; no return value
]]
local function list_add (item, list, encode)
if item then -- if there was an item
if encode then -- for anchor IDs ...
item = mw.uri.anchorEncode (item); -- encode to remove wikimarkup, convert spaces to underscores etc
end
if not list[item] then -- if not already saved
list[item] = 1; -- save it
else -- here when this item already saved
list[item] = list[item] + 1; -- to indicate that there are multiple items
end
end
end
--[[--------------------------< A N C H O R _ I D _ M A K E _ A N C H O R >------------------------------------
make anchor IDs from {{anchor}}; there may be more than one because {{anchor}} is not limited to the number of
anchors it may hold.
]]
local function anchor_id_make_anchor (template, anchor_id_list)
template = template:gsub ('^{{[^|]+|', ''):gsub ('}}$', '', 1); -- remove outer {{ and }} and template name
template = wikilink_strip (template); -- strip any wikilink markup (there shouldn't be any but just in case)
local params = {};
local anchor_id;
for param in template:gmatch ('%b{}') do -- loop through the template; remove and save templates (presumed to be sfnref or harvid)
table.insert (params, param); -- save it
template = template:gsub ('%b{}', '', 1); -- remove it from source template
end
for _, t in ipairs (params) do -- spin through the templates in params
anchor_id = sfnref_get (t); -- attempt to decode {{sfnref}} and {{harvid}}
if anchor_id then -- nil when not {{sfnref}} or {{harvid}}
list_add (anchor_id, anchor_id_list, true); -- add anchor ID to the list
end
end
template = template:gsub ('|%s*|', '|'); -- when pipe follows pipe with or without white space, remove extraneous pipe
template = template:gsub ('^|', ''):gsub('|$', ''); -- remove extraneous leading and trailing pipes
params = mw.text.split (template, '%s*|%s*'); -- split at the pipe and remove extraneous space characters
for _, t in ipairs (params) do -- spin through the anchor IDs
anchor_id = mw.text.trim (t); -- trim white space
if '' ~= anchor_id then -- should always have something
list_add (anchor_id, anchor_id_list, true); -- add anchor ID to the list
end
end
end
--[[--------------------------< T E M P L A T E _ L I S T _ A D D >--------------------------------------------
makes a list of templates use in the article.
]]
local function template_list_add (template, template_list)
local template = template:match ('{{%s*(.-)[|}]'); -- keep the case of the template - this is different from template_name_get()
if template and not template:match ('^#') then -- found a template or magic word; ignore magic words
template=mw.text.trim (template); -- trim whitespace
template = Lang_obj:ucfirst (template); -- first character in template name must be uppercase (same as canonical template name) TODO: better way to do this?
list_add (template, template_list); -- add to list with (unused) tally
end
end
--[[--------------------------< A N C H O R _ I D _ L I S T _ M A K E >----------------------------------------
makes a list of anchor ids from cs1|2, cs1|2-like, vcite xxx, harvc, anchor, wikicite templates
Because cs1|2 wrapper templates can, and often do, hide the author and date parameters inside the wrapper,
these parameters are not available in the article's wikisource so {{harv}}, {{sfn}}, and {{harvc}} templates that
link correctly to those wrapper templates will incorrectly show error messages. Use |ignore-err=yes in the {{harv}},
{{sfn}}, and {{harvc}} templates to supress the error message.
creates a list of templates used in the article for use with the whitelist
creates a list of article-local whitelisted anchor IDs from {{sfn whitelist}}
]]
local function anchor_id_list_make ()
local anchor_id_list = {}
local template_list = {}
local article_whitelist = {}
local article_content = article_content_get (); -- attempt to get this article's content
if article_content == '' then -- when there is no article content
return ''; -- no point in continuing
end
local template; -- place to hold the template that we found
local template_name;
local anchor_id; -- place to hold an anchor id as it is extracted / decoded
local find_pattern = '%f[{]{{[^{]';
local tstart, tend = article_content:find (find_pattern); -- find the first template; do not find template variables: {{{template var|}}}
while tstart do
template = article_content:match ('%b{}', tstart); -- get the whole template
if not template then
break; -- template is nil for some reason (last template missing closing }} for example) so declare ourselves done
end
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
template_list_add (template, template_list); -- add this template's name to the list
if data.known_templates_cs12 [template_name] then
anchor_id = anchor_id_make_cs12 (template); -- extract an anchor id from this template
list_add (anchor_id, anchor_id_list, true)
elseif data.known_templates_vcite [template_name] then
local ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the vcite template
if ref then -- |ref={{template}}
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
list_add (anchor_id, anchor_id_list, true);
else
local params = {};
template_params_get (template, params); -- build a table of template parameters and their values
anchor_id = params['ref']; -- when both set, vcite uses value from |ref=
if not anchor_id and params['harvid'] then
anchor_id = 'CITEREF' .. params['harvid']; -- in vcite, |harvid= auto-adds 'CITEREF' prefix to the value in |harvid=
end
list_add (anchor_id, anchor_id_list, true);
end
elseif data.known_templates_harvc [template_name] then
anchor_id = anchor_id_make_harvc (template); -- extract an anchor id from this template
list_add (anchor_id, anchor_id_list, true);
elseif data.known_templates_wikicite [template_name] then
local ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}}
if ref then
anchor_id = sfnref_get (ref);
elseif template:match ('|%s*ref%s*=([^|}]+)') then
anchor_id = template:match ('|%s*ref%s*=([^|}]+)'); -- plain-text
elseif template:match ('|%s*id%s*=%s*(%b{})') then
ref = template:match ('|%s*id%s*=%s*(%b{})');
anchor_id = 'Reference-' .. sfnref_get (ref);
elseif template:match ('|%s*id%s*=([^|}]+)') then
anchor_id = 'Reference-' .. template:match ('|%s*id%s*=([^|}]+)'); -- plain-text
else
anchor_id = nil; -- no matches, ensure that anchor_id has no value
end
if anchor_id then
list_add (anchor_id, anchor_id_list, true);
end
elseif data.known_templates_anchor [template_name] then
anchor_id_make_anchor (template, anchor_id_list); -- extract anchor ids from this template if any
elseif data.known_templates_sfn_whitelist [template_name] then
template = template:gsub ('^{{[^|]+|', ''):gsub ('}}$', '', 1); -- remove outer {{ and }} and template name
template = mw.text.trim (template, '%s|'); -- trim leading trailing white space and pipes
template = mw.text.split (template, '%s*|%s*'); -- make a table of the template's parameters
for _, anchor_id in ipairs (template) do -- spin through this template's parameter
if '' ~= anchor_id and not article_whitelist[anchor_id] then
anchor_id = mw.uri.anchorEncode (anchor_id)
article_whitelist[anchor_id] = 1; -- add to the whitelist
end
end
elseif template_name and whitelist.wrapper_templates[template_name] then
anchor_id = anchor_id_make_wrapper (template); -- extract an anchor id from this template if possible
list_add (anchor_id, anchor_id_list, true);
elseif template_name and template_name:match ('^Cit[ea]') then -- not known, not known wrapper; last gasp, try as cs1-like
anchor_id = anchor_id_make_cs12 (template); -- extract an anchor id from this template if possible
list_add (anchor_id, anchor_id_list, true);
end
tstart, tend = article_content:find (find_pattern, tend); -- search for another template; begin at end of last search
end
mw.logObject (anchor_id_list, 'anchor_id_list');
mw.logObject (template_list, 'template_list');
mw.logObject (article_whitelist, 'article_whitelist');
global_anchor_id_list = anchor_id_list
global_template_list = template_list
global_article_whitelist = article_whitelist
end
--[[--------------------------< C I T E R E F _ P A T T E R N S _ M A K E >--------------------------------------------
Scans template_list to look for wrapper templates that generate citerefs that require Lua patterns.
This scan is only done once per page load, to save time
]]
local function citeref_patterns_make()
if not global_template_list then return end
local citeref_patterns = {}
local template_patterns = whitelist.wrapper_template_patterns
for _, p in ipairs(template_patterns) do
for _, t in ipairs(p[1]) do -- loop through list of template wrappers
if global_template_list[t] then -- if wrapper is found in article, record corresponding patterns
for _, pat in ipairs(p[2]) do
table.insert(citeref_patterns, pat)
end
break
end
end
end
mw.logObject(citeref_patterns,'citeref_patterns')
return citeref_patterns
end
--[[--------------------------< E X P O R T E D _ T A B L E S >------------------------------------------------
]]
-- First create global_anchor_id_list, global_template_list, global_article_whitelist
anchor_id_list_make()
-- Then stuff them (and derived tables) into return table
return {
anchor_id_list = global_anchor_id_list or {}, -- table of anchor ids available in this article
article_whitelist = global_article_whitelist or {}, -- table of anchor ids with false-positive error message to be suppressed
template_list = global_template_list or {}, -- table of templates used in this article
citeref_patterns = citeref_patterns_make() or {} -- table of Lua patterns to search for citeref from wrappers
}
0orpdb6kvjbedhkjrp2xgq9fc8lbvmb
32948
32947
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Footnotes/anchor_id_list]]
32947
Scribunto
text/plain
require('strict');
local data = mw.loadData ('Module:Footnotes/anchor id list/data');
local whitelist = mw.loadData ('Module:Footnotes/whitelist');
local Lang_obj = mw.language.getContentLanguage(); -- used by template_list_add() to uppercase first letter of template name TODO: better way to do that?
local redirects_date = {
['date'] = true,
['datetomos'] = true,
['formatdate'] = true,
['isotodmymdy'] = true,
['isotomos'] = true,
}
local redirects_patent = { -- special case cs1-like templates because uses different parameters for name and date in anchor ID
['Cite patent'] = true,
['Citeref patent'] = true,
['Ref patent'] = true,
}
local redirects_sfnref = {
['sfnref'] = true,
['harvid'] = true,
}
local aliases_author = { -- these use pseudo-patterns in the same way as cs1|2; '#' represents 1 or more enumerator digits
'last#',
'author#',
'surname#',
'author-last#',
'author#-last',
'subject#',
'host#',
}
local aliases_contributor = {
'contributor#',
'contributor-last#',
'contributor#-last',
'contributor-surname#',
'contributor#-surname',
}
local aliases_editor = {
'editor#',
'editor-last#',
'editor#-last',
'editor-surname#',
'editor#-surname',
}
local aliases_harvc_author = {
'last#',
'author#',
}
local aliases_inventor = { -- cite patent
'inventor#',
'inventor-last#',
'inventor#-last',
'inventor-surname#',
'inventor#-surname',
'invent#',
'invent-#',
}
local alias_patterns_date = { -- normal lua patterns for most cs1|2-like templates
'|%s*year%s*=%s*',
'|%s*date%s*=%s*',
'|%s*publication%-?date%s*=%s*',
'|%s*air%-?date%s*=%s*',
}
local alias_patterns_harvc_date = { -- normal lua patterns for harvc template
'|%s*anchor%-year%s*=%s*',
'|%s*year%s*=%s*',
}
local alias_patterns_patent_date = { -- normal lua patterns for cite patent templates
'|%s*issue%-date%s*=%s*',
'|%s*gdate%s*=%s*',
'|%s*publication%-date%s*=%s*',
'|%s*pubdate%s*=%s*',
}
local patterns_date = { -- normal lua patterns
-- '(%d%d%d%d–%d%d%d%d%l?)$', -- YYYY–YYYY four-digit year range at end (Season YYYY–YYYY); with or without dab
'(%d%d%d%d)%D+(%d%d%d%d%l?)$', -- any range with four-digit years; with or without dab; not two captures
'^(%d%d%d%d–%d%d%l?)$', -- YYYY–YY two-digit year range; with or without dab
'^(c%. %d%d%d%d?%l?)$', -- three- or four-digit circa year; with or without dab
'(%d%d%d%d?%l?)$', -- three- or four-digit year at end of date (dmy or mdy); with or without dab
'^(%d%d%d%d?%l?)', -- three- or four-digit year at beginning of date (ymd or YYYY); with or without dab
'^(n%.d%.%l?)$', -- 'no date' with dots; with or without dab
'^(nd%l?)$', -- 'no date' without dots; with or without dab
}
local patterns_tags = {
'<nowiki>.-</nowiki>',
'<!%-%-.-%-%->',
'<pre>.-</pre>',
'<syntaxhighlight.->.-</syntaxhighlight>',
'<source.->.-</source>', -- deprecated alias of syntaxhighlight tag
}
local template_skip = { -- templates to be skipped for whatever reason; mostly because they resemble cs1-like templates
['Citation-attribution'] = true,
}
local global_article_content = nil
local global_anchor_id_list = nil -- exported tables
local global_template_list = nil
local global_article_whitelist = nil
--[[--------------------------< A R T I C L E _ C O N T E N T _ G E T >----------------------------------------
get article content, remove certain html-like tags and their content so that this code doesn't include any citation
templates inside the tags as valid tagets; they are not.
]]
local function article_content_get ()
if global_article_content then return global_article_content end
local article_content = mw.title.getCurrentTitle():getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
for _, tag in ipairs (patterns_tags) do
article_content = article_content:gsub (tag, ''); -- remove certain html-like tags and their content
end
global_article_content = article_content
return article_content
end
--[[--------------------------< S F N R E F _ G E T >----------------------------------------------------------
make an anchor id from the contents of {{sfnref}} or {{harvid}}. this function assumes that {{sfnref}} and {{harvid}}
are correctly formed.
]]
local function sfnref_get (template)
template = template:gsub ('{{%s*(.-)%s*}}', '%1'); -- strip bounding template markup and trim
local parts = mw.text.split (template, '%s*|%s*'); -- split at the pipe and remove extraneous space characters
local anchor_id = {};
if redirects_sfnref[parts[1]:lower()] then
anchor_id[1] = 'CITEREF';
else
return nil; -- not an sfnref or harvid template
end
local i = 2; -- indexer into parts{} table
local j = 2; -- indexer into anchor_id{} table which already has 'CITEREF' at [1]
while parts[i] and 7 > j do -- loop through what should be just positional parameters for names and year (2-6 four names and a date)
if not parts[i]:find ('=') then -- look for equal sign (named paraneter in a template that doesn't support named parameters)
anchor_id[j] = parts[i]; -- positional parameters are saved
j = j+1; -- bump the anchor_id{} indexer
end
i = i+ 1; -- bump the parts{} indexer
end
return table.concat (anchor_id, '');
end
--[[--------------------------< D A T E _ G E T >--------------------------------------------------------------
extract year from one of |year=, |date=, |publicationdate=, or |publication-date in that order. Does not error
check (that is left to the cs1|2 templates to do)
also gets date from |<date alias>={{date|...}}
]]
local function date_get (template, aliases)
local rvalue;
for _, pattern in ipairs (aliases) do -- spin through the date alias patterns
rvalue = tostring(template):match (pattern); -- is this |<date alias>= used (tostring() because something makes match() think template is a table)
if rvalue then
rvalue = tostring(template):match (pattern .. '(%b{})'); -- is rvalue a template?
if rvalue then
rvalue = rvalue:gsub ('{{%s*(.-)%s*}}', '%1'); -- strip bounding template markup and trim
local parts = mw.text.split (rvalue, '%s*|%s*'); -- split at the pipe and remove extraneous space characters
if redirects_date[parts[1]:lower()] then -- if parts[1] names {{date}} or redirect
rvalue = parts[2]; -- assume that date template is properly formed, first positional parameter is the date
else
return ''; -- |date= holds some other template than {{date}} or redirect
end
else
rvalue = template:match (pattern .. '([^|}]+)');
if rvalue then -- if rvalue is something
rvalue = mw.text.trim (rvalue); -- trim it
end
if not rvalue or '' == rvalue then -- if rvale was nothing or trimed to nothing
rvalue = nil; -- ensure that it is unset so we can try the next parameter in the list
end
end
if rvalue then
for _, pattern in ipairs (patterns_date) do -- spin through the recognized date formats
-- date = rvalue:match (pattern); -- attempt to extract year portion according to the pattern
local date, date2 = rvalue:match (pattern); -- attempt to extract year portion according to the pattern; <date2> gets second year in any range
if date then
if date2 then -- when a second year
date = table.concat ({date, '–', date2}); -- build a date range
end
return date; -- matched so return;
end
end
break; -- found a date but it was malformed so abandon
end
end
end
return ''; -- no date param or date param doesn't hold a recognized date; empty string for concatenation
end
--[[--------------------------< V N A M E S _ G E T >----------------------------------------------------------
extract names from |vauthors= or |veditors=; there is no |vcontributors= parameter.
splits the v parameter value at the comma; correctly handles accept-as-witten markup when used to wrap a comma-
separated names (corporate)
]]
local function vnames_get (params, vparam)
local vnames = {}; -- first four author or editor names go here
local split = {}; -- temp table to assist in decoding accept-as-witten-markup
if params[vparam] then -- test for |vauthors= or |veditor=
split = mw.text.split (params[vparam], '%s*,%s*'); -- this will separate portions of ((Black, Brown, White, an Co.))
local i = 1; -- an indexer
while split[i] do
if split[i]:match ('^%(%(.*[^%)][^%)]$') then -- first segment of comma-separated accept-as-witten; this segment has the opening doubled parens
local name = split[i];
i=i+1; -- bump indexer to next segment
while split[i] do
name = name .. ', ' .. split[i]; -- concatenate with previous segments
if split[i]:match ('^.*%)%)$') then -- if this table member has the closing doubled parens
break; -- and done reassembling so
end
i=i+1; -- bump indexer
end
table.insert (vnames, name); -- and add accept-as-witten name to the vnames table
else
table.insert (vnames, split[i]); -- and add name to the vnames table
end
i=i+1; -- bump indexer
if 5 == i then break; end -- limit to four names
end
for i, vname in ipairs (vnames) do
if not vname:match ('%(%(.-%)%)') then -- without accept-this-value-as-written markup
vnames[i] = vname:gsub ('(.-)%s+%u+$', '%1'); -- extract and save surname(s)
end
end
for i, vname in ipairs (vnames) do -- repeat, this time for accept-this-value-as-written markup
vnames[i] = vname:gsub ('%(%((.-)%)%)', '%1'); -- remove markup if present and save the whole name
end
end
return 0 ~= #vnames and table.concat (vnames) or nil -- return a concatenation of the vnames; nil else
end
--[[--------------------------< N A M E S _ G E T >------------------------------------------------------------
cs1|2 makes anchor id from contributor, author, or editor name-lists in that order
get the names from the cs1|2 template; if there are no contributor names, try author names, then try editor names.
returns concatenated names in enumeration order when successful; nil else
empty name (nameholding parameter n is present without value) and missing name (nameholding parameter n is not
present) are included as empty string with all other names
]]
local function names_get (params, aliases_list)
local names = {}; -- first four author or editor names go here
local enum_alias; -- alias with '#' replaced with a digit
for enum=1, 4 do -- four names only
for i, alias in ipairs (aliases_list) do
if not names[enum] then -- hanven't found a previous alias with this [enum]? see if we can find this alias with this enum
enum_alias = alias:gsub ('#', enum); -- replace '#' to make 'lastn'
if 1 == enum then -- because |last= and last1= are exact aliases
if params[enum_alias] then -- test |last1= first
names[enum] = params[enum_alias]; -- found so save the value assigned to |last1=
break; -- next enum
else
enum_alias = alias:gsub ('#', ''); -- replace '#' to make 'last'
if params[enum_alias] then
names[enum] = params[enum_alias]; -- found so save the value assigned to |last=
break; -- next enum
end
end
else -- here for enum 2, 3, 4
if params[enum_alias] then
names[enum] = params[enum_alias]; -- found so save the value assigned to |lastn=
break; -- next enum
end
end
end
end
end
for enum=1, 4 do -- spin through the names table and
local name = names[enum];
if not name then -- when nameholding parameter n is not present (nil)
name = ''; -- convert to empty string for concatenation
end
name = name:gsub('%(%((.-)%)%)', '%1'); -- remove accept-as-written markup if present
names[enum] = name; -- save the modified name
end
local name_str = table.concat (names); -- concatenate the names
return '' ~= name_str and name_str or nil; -- return the concatenation if not empty string; nil else
end
--[[--------------------------< T E M P L A T E _ S T R I P >--------------------------------------------------
removes the citation or havrc template's {{ and }} markup then removes, in whole, any templates found inside the
citation or harvc template.
Templates are not allowed in parameters that are made part of COinS metadata; yet, they will appear. cs1|2 does
not see the template markup but instead sees the result of the template as html. cs1|2 strips the html which
leaves the displayed value for the anchor id. We can't do that here so, because templates aren't allowed in
parameters, we simply discard any templates found in the cs1|2 template.
this may leave a |lastn= parameter empty which will be treated as if it were really empty as cs1|2 do (three authors,
|last2= empty -> CITEREFLast1Last3YYYY (the harv and sfn render: 'Last1, & Last3 YYYY' with CITEREFLast1Last3YYYY).
]]
local function template_strip (template)
template = template:gsub ('^{{%s*', ''):gsub ('%s*}}$', '', 1); -- remove outer {{ and }} (cs1|2 template delimiters with trailing/leading whitespace)
template = template:gsub ('%b{}', ''); -- remove any templates from the cs1|2 template
return template;
end
--[[--------------------------< E S C A P E _ L U A _ M A G I C _ C H A R S >----------------------------------
Returns a string where all of lua's magic characters have been escaped. This is important because functions like
string.gsub() treat their pattern and replace strings as patterns, not literal strings.
]]
local function escape_lua_magic_chars (argument)
argument = argument:gsub("%%", "%%%%"); -- replace % with %%
argument = argument:gsub("([%^%$%(%)%.%[%]%*%+%-%?])", "%%%1"); -- replace all other lua magic pattern characters
return argument;
end
--[=[-------------------------< W I K I L I N K _ S T R I P >--------------------------------------------------
Wikilink markup does not belong in an anchor id and can / does confuse the code that parses apart citation and
harvc templates so here we remove any wiki markup:
[[link|label]] -> label
[[link]] -> link
]=]
local function wikilink_strip (template)
for wikilink in template:gmatch ('%[%b[]%]') do -- get a wikilink
template = template:gsub ('%[%b[]%]', '__57r1P__', 1); -- install a marker
if wikilink:match ('%[%[.-|(.-)%]%]') then
wikilink = wikilink:match ('%[%[.-|(.-)%]%]'); -- extract label from complex [[link|label]] wikilink
else
wikilink = wikilink:match ('%[%[(.-)%]%]'); -- extract link from simple [[link]] wikilinks
end
wikilink = escape_lua_magic_chars (wikilink); -- in case there are lua magic characters in wikilink
template = template:gsub ('__57r1P__', wikilink, 1); -- replace the marker with the appropriate text
end
return template;
end
--[[--------------------------< T E M P L A T E _ N A M E _ G E T >--------------------------------------------
return the citation or harvc template's name; convert to lower case and trim leading and trailing whitespace;
when the template is a sandbox the subpage portion of the template name is omitted from the returned template name
{{Cite book/new |...}} returns cite book
]]
local function template_name_get (template)
local template_name = template:match ('^{{%s*([^/|}]+)'); -- get template name; ignore subpages ~/new, ~/sandbox; parser functions
if not template_name or template_name:match ('^#') then -- parser functions, magic words don't count as templates
return nil; -- could not get template name from (possibly corrupt) template; extraneous opening { mid template can cause this;
end;
template_name = template_name:gsub ('%s*$', ''); -- trim trailing whitespace; leading whitespace already removed
return Lang_obj:ucfirst (template_name); -- first character in template name must be uppercase (same as canonical template name) TODO: better way to do this?
end
--[[--------------------------< T E M P L A T E _ P A R A M S _ G E T >----------------------------------------
parse apart a template's parameters and store in the params table where key is the parameter's name and value is
the parameter's value; empty parameters are not saved
]]
local function template_params_get (template, params_t)
template = wikilink_strip (template); -- because piped wikilinks confuse code that builds params_t{} and because wikilinks not allowed in an anchor id
-- strip templates after getting |ref= value because |ref={{sfnref}} and |ref={{harvid}} are allowed
template = template_strip (template); -- because template markup can confuse code that builds params_t{} and because templates in name parameters are not allowed
local temp_t = mw.text.split (template, '%s*|%s*'); --split on the pipe
for _, param in ipairs (temp_t) do
if param:find ('=', 1, true) then -- a named parameter?
local k, v = param:match ('%s*([^=]-)%s*=%s*([^|}]+)');
if v then -- there must be a value
if '' ~= v and not v:match ('^%s$') then -- skip when value is empty string or only whitespace
params_t[k] = mw.text.trim (v); -- add trimmed value else
end
end
end
end
end
--[[--------------------------< C I T E R E F _ M A K E _ H A R V C >------------------------------------------
makes anchor_id from {{harvc}} or redirects
]]
local function anchor_id_make_harvc (template)
local date = date_get (template, alias_patterns_harvc_date); -- get date; done here because might be in {{date}}; return date if valid; empty string else
local anchor_id;
local params = {}; -- table of harvc parameters
local id; -- custom anchor id for this {{harvc}} template
id = template:match ('|%s*id%s*=%s*(%b{})'); -- in case |id={{sfnref}}; done here because templates will be stripped
template_params_get (template, params); -- build a table of template parameters and their values; this strips wikilinks and templates
if id then -- when set is {{sfnref}} or {{harvid}} template
return sfnref_get (id); -- returns content of {{sfnref}} or {{harvid}}; nil else
end
if params.id then -- custom anchor for this {{harvc}} template (text)
return params.id; -- |id= value as written
end
anchor_id = names_get (params, aliases_harvc_author); -- get the harvc contributor names
if anchor_id then -- if names were gotten
return 'CITEREF' .. anchor_id .. date;
end
return nil; -- no names; no anchor_id
end
--[[--------------------------< A N C H O R _ I D _ M A K E _ W R A P P E R >----------------------------------
for wrapper templates
inspect externally visible |ref= to decide what to do:
|ref= - empty or missing: get names and date from whitelist defaults; override defaults from externally visible template parameters
|ref=harv - same as empty or missing
|ref={{SfnRef|name|name|name|name|year}} - assemble an anchor id from {{sfnref}} positional parameters
|ref={{Harvid|name|name|name|name|year}} - assemble an anchor id from {{harvid}} positional parameters
|ref=none - skip; do nothing because an anchor id intentionally suppressed; TODO: keep with a type code of '0'?
|ref=<text> - save param value because may match an anchor id override value in {{harv}} template |ref= parameter or {{harvc}} |id= parameter
]]
local function anchor_id_make_wrapper (template)
local ref; -- content of |ref=
local template_name; -- name of the template
local anchor_id; -- the assembled anchor id from this template
local date;
local name_default;
local date_default;
local vol;
local params = {}; -- table of template parameters
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
if not template_name or template_skip[template_name] then
return nil; -- could not extract template name from (possibly corrupted) template (extraneous opening { in the template will cause this)
end
date = date_get (template, alias_patterns_date); -- get date; done here because might be in {{date}}
-- if '' == date then
-- date = whitelist.wrapper_templates[template_name][2] or ''; -- no externally visible date so get default date
-- end
ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the wrapper template
if not ref then
if template:match ('|%s*ref%s*=([^|}]+)') then -- |ref={{template}} not found; if there is a |ref= param with an assigned value
ref = template:match ('|%s*ref%s*=([^|}]+)'); -- get the value; whitespace is a 'value'
if ref then -- nil when |ref=|... or when |ref=}} (no spaces between assignment operator and pipe or closing brace)
ref = mw.text.trim (ref); -- something, could be just whitespace, so trim leading / trailing whitespace
if '' == ref then -- trimming a string of whitespace makes an empty string
ref = nil; -- make empty ref same as missing ref
end
end
end
end
template_params_get (template, params); -- build a table of template parameters and their values
local wrap_data = whitelist.wrapper_templates[template_name]
if wrap_data[1] then -- is this wrapper a simple-default wrapper?
name_default = wrap_data[1]; -- get the default names
date_default = wrap_data[2]; -- get the default date
else
vol = params['volume'] or 'default';
local fascicle = params['fascicle'] -- some templates use "fascicle" to mean "subvolume"
if fascicle then
local subvol = vol..'/'..fascicle -- if fascicle is used, subvolume = "vol/fascicle"
if wrap_data[subvol] then -- if subvolume exists, use it, otherwise fall back to volume
vol = subvol
end
end
if not wrap_data[vol] then -- make sure this volume exists
vol = 'default'; -- doesn't exist, use default volume
end
name_default = wrap_data[vol][1]; -- get the default names
date_default = wrap_data[vol][2]; -- get the default date
end
if 'harv' == ref or not ref then -- |ref=harv specified or |ref= missing or empty
anchor_id = names_get (params, aliases_contributor) or -- get contributor, author, or editor names
names_get (params, aliases_author) or
vnames_get (params, 'vauthors') or -- |vauthors=
names_get (params, aliases_editor) or
vnames_get (params, 'veditors') or -- |veditors=
name_default; -- default names from whitelist
-- whitelist.wrapper_templates[template_name][1]; -- default names from whitelist
if '' == date then -- if date not provided in the template
date = date_default; -- use the default date from whitelist
end
if anchor_id then -- if names were gotten
anchor_id = 'CITEREF' .. anchor_id .. date;
end
elseif ref:match ('%b{}') then -- ref holds a template
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
elseif 'none' == ref then -- |ref=none
return nil; -- anchor id expicitly suppressed
else
anchor_id = ref; -- |ref=<text> may match an anchor id override value in {{harv}} template |ref= parameter
end
return anchor_id; -- anchor_id text; nil else
end
--[[--------------------------< A N C H O R _ I D _ M A K E _ C S 1 2 >----------------------------------------
for cs1|2 template and cs1-like templates
inspect |ref= to decide what to do:
|ref= - empty or missing: get names and date from template parameters; all cs1|2 create CITEREF anchor IDs
|ref=harv - get names and date from template parameters
|ref={{SfnRef|name|name|name|name|year}} - assemble an anchor id from {{sfnref}} positional parameters
|ref={{Harvid|name|name|name|name|year}} - assemble an anchor id from {{harvid}} positional parameters
|ref=none - skip; do nothing because an anchor id intentionally suppressed; TODO: keep with a type code of '0'?
|ref=<text> - save param value because may match an anchor id override value in {{harv}} template |ref= parameter or {{harvc}} |id= parameter
]]
local function anchor_id_make_cs12 (template)
local ref; -- content of |ref=
local template_name; -- name of the template
local anchor_id; -- the assembled anchor id from this template
local date;
local params = {}; -- table of template parameters
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
if not template_name or template_skip[template_name] then
return nil; -- could not extract template name from (possibly corrupted) template (extraneous opening { in the template will cause this)
end
if redirects_patent[template_name] then
date = date_get (template, alias_patterns_patent_date); -- get date; done here because might be in {{date}}
else
date = date_get (template, alias_patterns_date);
end
ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the cs1|2 template
if not ref then
if template:match ('|%s*ref%s*=([^|}]+)') then -- |ref={{template}} not found; if there is a |ref= param with an assigned value
ref = template:match ('|%s*ref%s*=([^|}]+)'); -- get the value; whitespace is a 'value'
if ref then -- nil when |ref=|... or when |ref=}} (no spaces between assignment operator and pipe or closing brace)
ref = mw.text.trim (ref); -- something, could be just whitespace, so trim leading / trailing whitespace
if '' == ref then -- trimming a string of whitespace makes an empty string
ref = nil; -- make empty ref same as missing ref
end
end
end
end
template_params_get (template, params); -- build a table of template parameters and their values
if 'harv' == ref or not ref then -- |ref=harv specified or |ref= missing or empty
if redirects_patent[template_name] then -- if this is a cite patent template
anchor_id = names_get (params, aliases_inventor); -- inventor names only
else -- cs1|2 template
anchor_id = names_get (params, aliases_contributor) or -- get contributor, author, or editor names
names_get (params, aliases_author) or
vnames_get (params, 'vauthors') or -- |vauthors=
names_get (params, aliases_editor) or
vnames_get (params, 'veditors'); -- |veditors=
end
if anchor_id then -- if names were gotten
anchor_id = 'CITEREF' .. anchor_id .. date;
end
elseif ref:match ('%b{}') then -- ref holds a template
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
elseif 'none' == ref and not redirects_patent[template_name] then -- |ref=none; not supported by cite patent
return nil; -- anchor id expicitly suppressed
else
anchor_id = ref; -- |ref=<text> may match an anchor id override value in {{harv}} template |ref= parameter
end
return anchor_id; -- anchor_id text; nil else
end
--[[--------------------------< L I S T _ A D D >--------------------------------------------------------------
adds an <item> to <list> table; for anchor IDs, the boolean <encode> argument must be set true; no return value
]]
local function list_add (item, list, encode)
if item then -- if there was an item
if encode then -- for anchor IDs ...
item = mw.uri.anchorEncode (item); -- encode to remove wikimarkup, convert spaces to underscores etc
end
if not list[item] then -- if not already saved
list[item] = 1; -- save it
else -- here when this item already saved
list[item] = list[item] + 1; -- to indicate that there are multiple items
end
end
end
--[[--------------------------< A N C H O R _ I D _ M A K E _ A N C H O R >------------------------------------
make anchor IDs from {{anchor}}; there may be more than one because {{anchor}} is not limited to the number of
anchors it may hold.
]]
local function anchor_id_make_anchor (template, anchor_id_list)
template = template:gsub ('^{{[^|]+|', ''):gsub ('}}$', '', 1); -- remove outer {{ and }} and template name
template = wikilink_strip (template); -- strip any wikilink markup (there shouldn't be any but just in case)
local params = {};
local anchor_id;
for param in template:gmatch ('%b{}') do -- loop through the template; remove and save templates (presumed to be sfnref or harvid)
table.insert (params, param); -- save it
template = template:gsub ('%b{}', '', 1); -- remove it from source template
end
for _, t in ipairs (params) do -- spin through the templates in params
anchor_id = sfnref_get (t); -- attempt to decode {{sfnref}} and {{harvid}}
if anchor_id then -- nil when not {{sfnref}} or {{harvid}}
list_add (anchor_id, anchor_id_list, true); -- add anchor ID to the list
end
end
template = template:gsub ('|%s*|', '|'); -- when pipe follows pipe with or without white space, remove extraneous pipe
template = template:gsub ('^|', ''):gsub('|$', ''); -- remove extraneous leading and trailing pipes
params = mw.text.split (template, '%s*|%s*'); -- split at the pipe and remove extraneous space characters
for _, t in ipairs (params) do -- spin through the anchor IDs
anchor_id = mw.text.trim (t); -- trim white space
if '' ~= anchor_id then -- should always have something
list_add (anchor_id, anchor_id_list, true); -- add anchor ID to the list
end
end
end
--[[--------------------------< T E M P L A T E _ L I S T _ A D D >--------------------------------------------
makes a list of templates use in the article.
]]
local function template_list_add (template, template_list)
local template = template:match ('{{%s*(.-)[|}]'); -- keep the case of the template - this is different from template_name_get()
if template and not template:match ('^#') then -- found a template or magic word; ignore magic words
template=mw.text.trim (template); -- trim whitespace
template = Lang_obj:ucfirst (template); -- first character in template name must be uppercase (same as canonical template name) TODO: better way to do this?
list_add (template, template_list); -- add to list with (unused) tally
end
end
--[[--------------------------< A N C H O R _ I D _ L I S T _ M A K E >----------------------------------------
makes a list of anchor ids from cs1|2, cs1|2-like, vcite xxx, harvc, anchor, wikicite templates
Because cs1|2 wrapper templates can, and often do, hide the author and date parameters inside the wrapper,
these parameters are not available in the article's wikisource so {{harv}}, {{sfn}}, and {{harvc}} templates that
link correctly to those wrapper templates will incorrectly show error messages. Use |ignore-err=yes in the {{harv}},
{{sfn}}, and {{harvc}} templates to supress the error message.
creates a list of templates used in the article for use with the whitelist
creates a list of article-local whitelisted anchor IDs from {{sfn whitelist}}
]]
local function anchor_id_list_make ()
local anchor_id_list = {}
local template_list = {}
local article_whitelist = {}
local article_content = article_content_get (); -- attempt to get this article's content
if article_content == '' then -- when there is no article content
return ''; -- no point in continuing
end
local template; -- place to hold the template that we found
local template_name;
local anchor_id; -- place to hold an anchor id as it is extracted / decoded
local find_pattern = '%f[{]{{[^{]';
local tstart, tend = article_content:find (find_pattern); -- find the first template; do not find template variables: {{{template var|}}}
while tstart do
template = article_content:match ('%b{}', tstart); -- get the whole template
if not template then
break; -- template is nil for some reason (last template missing closing }} for example) so declare ourselves done
end
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
template_list_add (template, template_list); -- add this template's name to the list
if data.known_templates_cs12 [template_name] then
anchor_id = anchor_id_make_cs12 (template); -- extract an anchor id from this template
list_add (anchor_id, anchor_id_list, true)
elseif data.known_templates_vcite [template_name] then
local ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the vcite template
if ref then -- |ref={{template}}
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
list_add (anchor_id, anchor_id_list, true);
else
local params = {};
template_params_get (template, params); -- build a table of template parameters and their values
anchor_id = params['ref']; -- when both set, vcite uses value from |ref=
if not anchor_id and params['harvid'] then
anchor_id = 'CITEREF' .. params['harvid']; -- in vcite, |harvid= auto-adds 'CITEREF' prefix to the value in |harvid=
end
list_add (anchor_id, anchor_id_list, true);
end
elseif data.known_templates_harvc [template_name] then
anchor_id = anchor_id_make_harvc (template); -- extract an anchor id from this template
list_add (anchor_id, anchor_id_list, true);
elseif data.known_templates_wikicite [template_name] then
local ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}}
if ref then
anchor_id = sfnref_get (ref);
elseif template:match ('|%s*ref%s*=([^|}]+)') then
anchor_id = template:match ('|%s*ref%s*=([^|}]+)'); -- plain-text
elseif template:match ('|%s*id%s*=%s*(%b{})') then
ref = template:match ('|%s*id%s*=%s*(%b{})');
anchor_id = 'Reference-' .. sfnref_get (ref);
elseif template:match ('|%s*id%s*=([^|}]+)') then
anchor_id = 'Reference-' .. template:match ('|%s*id%s*=([^|}]+)'); -- plain-text
else
anchor_id = nil; -- no matches, ensure that anchor_id has no value
end
if anchor_id then
list_add (anchor_id, anchor_id_list, true);
end
elseif data.known_templates_anchor [template_name] then
anchor_id_make_anchor (template, anchor_id_list); -- extract anchor ids from this template if any
elseif data.known_templates_sfn_whitelist [template_name] then
template = template:gsub ('^{{[^|]+|', ''):gsub ('}}$', '', 1); -- remove outer {{ and }} and template name
template = mw.text.trim (template, '%s|'); -- trim leading trailing white space and pipes
template = mw.text.split (template, '%s*|%s*'); -- make a table of the template's parameters
for _, anchor_id in ipairs (template) do -- spin through this template's parameter
if '' ~= anchor_id and not article_whitelist[anchor_id] then
anchor_id = mw.uri.anchorEncode (anchor_id)
article_whitelist[anchor_id] = 1; -- add to the whitelist
end
end
elseif template_name and whitelist.wrapper_templates[template_name] then
anchor_id = anchor_id_make_wrapper (template); -- extract an anchor id from this template if possible
list_add (anchor_id, anchor_id_list, true);
elseif template_name and template_name:match ('^Cit[ea]') then -- not known, not known wrapper; last gasp, try as cs1-like
anchor_id = anchor_id_make_cs12 (template); -- extract an anchor id from this template if possible
list_add (anchor_id, anchor_id_list, true);
end
tstart, tend = article_content:find (find_pattern, tend); -- search for another template; begin at end of last search
end
mw.logObject (anchor_id_list, 'anchor_id_list');
mw.logObject (template_list, 'template_list');
mw.logObject (article_whitelist, 'article_whitelist');
global_anchor_id_list = anchor_id_list
global_template_list = template_list
global_article_whitelist = article_whitelist
end
--[[--------------------------< C I T E R E F _ P A T T E R N S _ M A K E >--------------------------------------------
Scans template_list to look for wrapper templates that generate citerefs that require Lua patterns.
This scan is only done once per page load, to save time
]]
local function citeref_patterns_make()
if not global_template_list then return end
local citeref_patterns = {}
local template_patterns = whitelist.wrapper_template_patterns
for _, p in ipairs(template_patterns) do
for _, t in ipairs(p[1]) do -- loop through list of template wrappers
if global_template_list[t] then -- if wrapper is found in article, record corresponding patterns
for _, pat in ipairs(p[2]) do
table.insert(citeref_patterns, pat)
end
break
end
end
end
mw.logObject(citeref_patterns,'citeref_patterns')
return citeref_patterns
end
--[[--------------------------< E X P O R T E D _ T A B L E S >------------------------------------------------
]]
-- First create global_anchor_id_list, global_template_list, global_article_whitelist
anchor_id_list_make()
-- Then stuff them (and derived tables) into return table
return {
anchor_id_list = global_anchor_id_list or {}, -- table of anchor ids available in this article
article_whitelist = global_article_whitelist or {}, -- table of anchor ids with false-positive error message to be suppressed
template_list = global_template_list or {}, -- table of templates used in this article
citeref_patterns = citeref_patterns_make() or {} -- table of Lua patterns to search for citeref from wrappers
}
0orpdb6kvjbedhkjrp2xgq9fc8lbvmb
Module:Footnotes/anchor id list/data
828
2454
32949
2026-06-20T21:20:11Z
en>Hike395
0
+1 cs1 wrapper
32949
Scribunto
text/plain
-- copied from Module:Ref info/data - maybe overkill here?
-- for this application make lists from the redirect lists and force all template names first character uppercase
require('strict');
--[[--------------------------< C S 1 _ T E M P L A T E _ P A T T E R N S >------------------------------------
These are patterns for cs1 templates and their redirects. These patterns exclude redirects that are vcite-like
which redirects should be deleted because vcite is not cs1.
]]
local cs1_template_patterns = { -- lua patterns of the cannonical names and redirects
'[Cc]ite ar[Xx]iv', -- arXiv is the canonical name
'[Cc]ite ArXiv',
'[Cc]ite AV media', -- canonical
'[Cc]ite audio', '[Cc]ite AV', '[Cc]ite AV ?Media', '[Cc]ite av media',
'[Cc]ite cd', '[Cc]ite DVD', '[Cc]ite dvd', '[Cc]ite film',
'[Cc]ite image', '[Cc]ite media', '[Cc]ite movie',
'[Cc]ite music video', '[Cc]ite radio', '[Cc]ite song',
'[Cc]ite ?video', '[Cc]ite visual', '[Cc]ite You[Tt]ube',
'[Cc]ita vídeo', -- non-English redirect; TODO: tally separately?
'[Cc]ite AV media notes', -- canonical
'[Cc]ite album[ %-]notes', '[Cc]ite av media notes',
'[Cc]ite DVD[ %-]notes', '[Cc]ite dvd%-notes', '[Cc]ite liner notes',
'[Cc]ite music release notes', '[Ll]iner notes',
'[Cc]ite bio[Rr]xiv', -- bioRxiv is the canonical form
'[Cc]ite [Bb]ook', -- book is the canonical form
'[Bb]ook cite', '[Bb]ook reference', '[Bb]ook reference url',
'[Cc] book', '[Cc]it book', '[Cc]ite books', '[Cc]ite chapter',
'[Cc]ite ebook', '[Cc]ite manual', '[Cc]ite page',
'[Cc]ite publication', '[Cc]ite score',
'[Cc]ite work', '[Cc]ite%-?book',
'[Bb]okref', '[Cc]itace monografie', '[Cc]itar livro', -- non-English redirects; TODO: tally separately?
'[Cc]iteer boek', '[Oo]uvrage', '[Rr]ef%-llibre', '서적 인용',
'[Cc]ite citeseerx', -- canonical
'[Cc]ite conference', -- canonical
'[Cc]ita conferenza', '[Cc]ite proceedings', '[Cc]onference reference', -- cita conferenza is non-English; TODO: tally separately?
'[Cc]ite ?encyclopedia', -- cite encyclopedia is the canonical name
'[Cc]ite contribution', '[Cc]ite dic', '[Cc]ite dictionary',
'[Cc]ite encyclopaedia', '[Cc]ite encyclopædia', '[Ee]ncyclopedia',
'[Cc]ite [Ee]pisode', -- episode is the canonical form
'[Cc]ite show',
'[Cc]ite interview', -- canonical
'[Cc]ite ?journal', -- cite journal is the canonical form
'[Cc] journal', '[Cc]itation journal', '[Cc]ite abstract',
'[Cc]ite document', '[Cc]ite Journal', '[Cc]ite journal zh',
'[Cc]ite ?paper', '[Vv]cite2 journal',
'[Cc]ita pubblicazione', '[Cc]itace periodika', '[Cc]itar jornal', -- non-English redirects; TODO: tally separately?
'[Cc]itar publicació', '[Cc]ytuj pismo', '[Tt]idskriftsref',
'Навод из стручног часописа', '저널 인용',
'[Cc]ite [Mm]agazine', -- magazine is the canonical form
'[Cc]ite mag', '[Cc]ite magazine article', '[Cc]ite newsletter',
'[Cc]ite periodical',
'[Cc]ite mailing ?list', -- mailing list is the canonical form
'[Cc]ite list',
'[Cc]ite maps?', -- map is the canonical form
'[Cc]ite[ %-]?news', -- cite news is the canonical form
'[Cc] news', '[Cc]it news', '[Cc]itation news', '[Cc]ite article',
'[Cc]ite n', '[Cc]ite new', '[Cc]ite newspaper', '[Cc]ite News',
'[Cc]ite news%-q', '[Cc]ite news2', '[Cc]itenewsauthor', '[Cc]ute news',
'[Cc]itar notícia', '[Hh]aber kaynağı', '[Tt]idningsref', 'استشهاد بخبر', -- non-English redirects; TODO: tally separately?
'뉴스 인용',
'[Cc]ite newsgroup', -- canonical
'[Cc]ite usenet',
'[Cc]ite podcast', -- canonical
'[Cc]ite [Pp]ress release', -- press release is the canonical form
'[Cc]ite media release', '[Cc]ite news release', '[Cc]ite pr',
'[Cc]ite press', '[Cc]ite press release%.', '[Cc]ite press[%-]?release',
'[Cc]ite report', -- canonical
'[Cc]ite serial', -- canonical
'[Cc]ite sign', -- canonical
'[Cc]ite plaque',
'[Cc]ite speech', -- canonical
'[Cc]ite ssrn', -- canonical
'[Cc]ite SSRN',
'[Cc]ite tech ?report', -- techreport is the canonical form
'[Cc]ite standard', '[Cc]ite technical report', '[Tt]echrep reference',
'[Cc]ite thesis', -- canonical
'[Cc]ite dissertation',
'[Cc]itar tese', -- non-English redirect; TODO: tally separately?
'[Cc]ite [Ww]eb', -- web is the canonical form
'[Cc] web', '[Cc]it web', '[Cc]ite blog', '[Cc]ite URL', '[Cc]ite url',
'[Cc]ite w', '[Cc]ite wb', '[Cc]ite we', '[Cc]ite web%.',
'[Cc]ite webpage', '[Cc]ite website', '[Cc]ite website article', '[Cc]ite web archived',
'[Cc]ite%-?web', '[Cc]itweb', '[Cc]w', '[Rr]ef web', '[Ww]eb citation',
'[Ww]eb cite', '[Ww]eb link', '[Ww]eb[ %-]reference', '[Ww]eblink',
'[Cc]hú thích web', '[Cc]ita web', '[Cc]itace elektronické monografie', -- non-English redirects; TODO: tally separately?
'[Cc]itat web', 'مرجع ويب', 'یادکرد وب', '웹 인용',
}
--[[--------------------------< C S 2 _ T E M P L A T E _ P A T T E R N S >------------------------------------
These are patterns for cs2 templates redirects.
]]
local cs2_template_patterns = { -- lua patterns of the cannonical names and redirects
'[Cc]itation',
'[Cc]ite', '[Cc]ite citation', '[Cc]ite study',
'[Cc]ite [Tt]echnical standard',
}
--[[--------------------------< V C I T E _ T E M P L A T E _ P A T T E R N S >--------------------------------
These are patterns for Vcite-family templates and their redirects.
]]
local vcite_template_patterns = {
'[Vv]cite book', -- canonical
'[Vv]ancite book', '[Vv]ancite report', '[Vv]cite encyclopedia',
'[Vv]cite report',
'[Vv]cite journal', -- canonical
'[Cc]it journal', '[Cc]it paper', '[Vv]ancite journal', '[Vv]cite paper',
'[Vv]cite news', -- canonical
'[Vv]ancite news',
'[Vv]cite web', -- canonical
'[Vv]ancite web',
}
--[[--------------------------< H A R V C _ T E M P L A T E _ P A T T E R N S >--------------------------------
These are patterns for the harvc template and its redirects.
]]
local harvc_template_patterns = {
'[Hh]arvc', -- canonical
'[Cc]itec',
}
--[[--------------------------< C S 1 _ L I K E _ T E M P L A T E _ P A T T E R N S >--------------------------
These are patterns for miscellaneous templates and their redirects that 'look like' cs1 templates (begin with cite ...)
Because they 'look like' cs1 templates they are handled as if they were cs1 templates. These templates are NOT
wrapper templates; names and dates are always to be extracted from the article instantiation of the template.
]]
local cs1_like_template_patterns = {
}
--[[--------------------------< W I K I C I T E _ T E M P L A T E _ P A T T E R N S >--------------------------
These are patterns for the wikicite template and its redirects.
]]
local wikicite_template_patterns = {
'[Ww]ikicite', -- canonical
}
--[[--------------------------< A N C H O R _ T E M P L A T E _ P A T T E R N S >------------------------------
These are patterns for the anchor template and its redirects.
]]
local anchor_template_patterns = {
'[Aa]nchors?', -- anchor is canonical form
'[Aa]nchor for redirect',
'[Aa]nchro',
'[Aa]ncor',
}
--[[--------------------------< S F N _ W H I T E L I S T _ P A T T E R N S >----------------------------------
These are patterns for the anchor template and its redirects.
]]
local sfn_whitelist_patterns = {
'[Ss]fn whitelist', -- canonical
'[Hh]arv whitelist',
}
--[[--------------------------< K N O W N _ T E M P L A T E S >------------------------------------------------
These tables are created from the *_template_patterns tables. To make these tables, entries in the source tables
are evaluated to replace lua patterns with the appropriate characters to create names for the output tables.
First charqacter is always uppercase
For example:
[Cc]ite ar[Xx]iv
becomes
Cite arXiv
Cite arxiv
]]
local known_templates_cs12 = {}; -- the exported tables
local known_templates_vcite = {};
local known_templates_harvc = {};
local known_templates_wikicite = {};
local known_templates_anchor = {};
local known_templates_sfn_whitelist = {};
local function add_stripped (list, name)
if not list[name] then
list[name] = true;
end
end
local function pattern_convert (pattern, list)
local lead, tail, c, l, name;
local first_char_patterns = {
'^%[(%a)%a%]', -- leading character (usually uppercase)
'^%[%a(%a)%]', -- leading character (usually lowercase)
}
c = tostring (pattern:match ('%u')); -- tostring() required because I don't know why; lua chokes complaining that c is not a string
name = pattern:gsub ('^%[%a%a%]', c); -- replace bracketed first character [Xx] with selected character from the match
if name:match ('(.-)%[(%a)(%a)%](.*)') then -- mixed case optional letters
lead, c, l, tail = name:match ('(.-)%[(%a)(%a)%](.*)');
add_stripped (list, lead .. c .. tail); -- uppercase
add_stripped (list, lead .. l .. tail); -- lowercase
elseif name:match ('^([^%[]+)(%[ %%%-%]%?)(.+)$') then -- [ %-]?
lead, c, tail = name:match ('^([^%[]+)(%[ %%%-%]%?)(.+)$');
add_stripped (list, lead .. tail); -- neither char
add_stripped (list, lead .. ' ' .. tail); -- space
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^([^%[]+)(%[%%%-%]%?)(.+)$') then -- [%-]?
lead, c, tail = name:match ('^([^%[]+)(%[%%%-%]%?)(.+)$');
add_stripped (list, lead .. tail); -- no hyphen
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^([^%[]+)(%[ %%%-%])(.+)$') then -- [ %-]
lead, c, tail = name:match ('^([^%[]+)(%[ %%%-%])(.+)$');
add_stripped (list, lead .. ' ' .. tail); -- space
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^([^%?]+)(%%%-%?)(.+)$') then -- %-?
lead, c, tail = name:match ('^([^%?]+)(%%%-%?)(.+)$');
add_stripped (list, lead .. tail); -- no hyphen
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^(.-)(%%%-)(.+)$') then -- %-
lead, c, tail = name:match ('^(.-)(%%%-)(.+)$');
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^(.-)(.)%?(.*)$') then -- .?
lead, c, tail = name:match ('^(.-)(.)%?(.*)$');
add_stripped (list, lead .. tail); -- no character
add_stripped (list, lead .. c .. tail); -- character
else
add_stripped (list, name); -- no patterns so save as is
end
end
for _, t in ipairs ({
{cs1_template_patterns, known_templates_cs12},
{cs2_template_patterns, known_templates_cs12},
{cs1_like_template_patterns, known_templates_cs12},
{vcite_template_patterns, known_templates_vcite},
{harvc_template_patterns, known_templates_harvc},
{wikicite_template_patterns, known_templates_wikicite},
{anchor_template_patterns, known_templates_anchor},
{sfn_whitelist_patterns, known_templates_sfn_whitelist},
}) do
for _, pattern in ipairs (t[1]) do -- for each patern in *_template_patterns
pattern_convert (pattern, t[2]) -- convert and store in known_templates_*
end
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return
{
known_templates_anchor = known_templates_anchor,
known_templates_cs12 = known_templates_cs12,
known_templates_harvc = known_templates_harvc,
known_templates_vcite = known_templates_vcite,
known_templates_wikicite = known_templates_wikicite,
known_templates_sfn_whitelist = known_templates_sfn_whitelist,
}
ac2kk9di798tezmbw1dis0wrp2b139q
32950
32949
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Footnotes/anchor_id_list/data]]
32949
Scribunto
text/plain
-- copied from Module:Ref info/data - maybe overkill here?
-- for this application make lists from the redirect lists and force all template names first character uppercase
require('strict');
--[[--------------------------< C S 1 _ T E M P L A T E _ P A T T E R N S >------------------------------------
These are patterns for cs1 templates and their redirects. These patterns exclude redirects that are vcite-like
which redirects should be deleted because vcite is not cs1.
]]
local cs1_template_patterns = { -- lua patterns of the cannonical names and redirects
'[Cc]ite ar[Xx]iv', -- arXiv is the canonical name
'[Cc]ite ArXiv',
'[Cc]ite AV media', -- canonical
'[Cc]ite audio', '[Cc]ite AV', '[Cc]ite AV ?Media', '[Cc]ite av media',
'[Cc]ite cd', '[Cc]ite DVD', '[Cc]ite dvd', '[Cc]ite film',
'[Cc]ite image', '[Cc]ite media', '[Cc]ite movie',
'[Cc]ite music video', '[Cc]ite radio', '[Cc]ite song',
'[Cc]ite ?video', '[Cc]ite visual', '[Cc]ite You[Tt]ube',
'[Cc]ita vídeo', -- non-English redirect; TODO: tally separately?
'[Cc]ite AV media notes', -- canonical
'[Cc]ite album[ %-]notes', '[Cc]ite av media notes',
'[Cc]ite DVD[ %-]notes', '[Cc]ite dvd%-notes', '[Cc]ite liner notes',
'[Cc]ite music release notes', '[Ll]iner notes',
'[Cc]ite bio[Rr]xiv', -- bioRxiv is the canonical form
'[Cc]ite [Bb]ook', -- book is the canonical form
'[Bb]ook cite', '[Bb]ook reference', '[Bb]ook reference url',
'[Cc] book', '[Cc]it book', '[Cc]ite books', '[Cc]ite chapter',
'[Cc]ite ebook', '[Cc]ite manual', '[Cc]ite page',
'[Cc]ite publication', '[Cc]ite score',
'[Cc]ite work', '[Cc]ite%-?book',
'[Bb]okref', '[Cc]itace monografie', '[Cc]itar livro', -- non-English redirects; TODO: tally separately?
'[Cc]iteer boek', '[Oo]uvrage', '[Rr]ef%-llibre', '서적 인용',
'[Cc]ite citeseerx', -- canonical
'[Cc]ite conference', -- canonical
'[Cc]ita conferenza', '[Cc]ite proceedings', '[Cc]onference reference', -- cita conferenza is non-English; TODO: tally separately?
'[Cc]ite ?encyclopedia', -- cite encyclopedia is the canonical name
'[Cc]ite contribution', '[Cc]ite dic', '[Cc]ite dictionary',
'[Cc]ite encyclopaedia', '[Cc]ite encyclopædia', '[Ee]ncyclopedia',
'[Cc]ite [Ee]pisode', -- episode is the canonical form
'[Cc]ite show',
'[Cc]ite interview', -- canonical
'[Cc]ite ?journal', -- cite journal is the canonical form
'[Cc] journal', '[Cc]itation journal', '[Cc]ite abstract',
'[Cc]ite document', '[Cc]ite Journal', '[Cc]ite journal zh',
'[Cc]ite ?paper', '[Vv]cite2 journal',
'[Cc]ita pubblicazione', '[Cc]itace periodika', '[Cc]itar jornal', -- non-English redirects; TODO: tally separately?
'[Cc]itar publicació', '[Cc]ytuj pismo', '[Tt]idskriftsref',
'Навод из стручног часописа', '저널 인용',
'[Cc]ite [Mm]agazine', -- magazine is the canonical form
'[Cc]ite mag', '[Cc]ite magazine article', '[Cc]ite newsletter',
'[Cc]ite periodical',
'[Cc]ite mailing ?list', -- mailing list is the canonical form
'[Cc]ite list',
'[Cc]ite maps?', -- map is the canonical form
'[Cc]ite[ %-]?news', -- cite news is the canonical form
'[Cc] news', '[Cc]it news', '[Cc]itation news', '[Cc]ite article',
'[Cc]ite n', '[Cc]ite new', '[Cc]ite newspaper', '[Cc]ite News',
'[Cc]ite news%-q', '[Cc]ite news2', '[Cc]itenewsauthor', '[Cc]ute news',
'[Cc]itar notícia', '[Hh]aber kaynağı', '[Tt]idningsref', 'استشهاد بخبر', -- non-English redirects; TODO: tally separately?
'뉴스 인용',
'[Cc]ite newsgroup', -- canonical
'[Cc]ite usenet',
'[Cc]ite podcast', -- canonical
'[Cc]ite [Pp]ress release', -- press release is the canonical form
'[Cc]ite media release', '[Cc]ite news release', '[Cc]ite pr',
'[Cc]ite press', '[Cc]ite press release%.', '[Cc]ite press[%-]?release',
'[Cc]ite report', -- canonical
'[Cc]ite serial', -- canonical
'[Cc]ite sign', -- canonical
'[Cc]ite plaque',
'[Cc]ite speech', -- canonical
'[Cc]ite ssrn', -- canonical
'[Cc]ite SSRN',
'[Cc]ite tech ?report', -- techreport is the canonical form
'[Cc]ite standard', '[Cc]ite technical report', '[Tt]echrep reference',
'[Cc]ite thesis', -- canonical
'[Cc]ite dissertation',
'[Cc]itar tese', -- non-English redirect; TODO: tally separately?
'[Cc]ite [Ww]eb', -- web is the canonical form
'[Cc] web', '[Cc]it web', '[Cc]ite blog', '[Cc]ite URL', '[Cc]ite url',
'[Cc]ite w', '[Cc]ite wb', '[Cc]ite we', '[Cc]ite web%.',
'[Cc]ite webpage', '[Cc]ite website', '[Cc]ite website article', '[Cc]ite web archived',
'[Cc]ite%-?web', '[Cc]itweb', '[Cc]w', '[Rr]ef web', '[Ww]eb citation',
'[Ww]eb cite', '[Ww]eb link', '[Ww]eb[ %-]reference', '[Ww]eblink',
'[Cc]hú thích web', '[Cc]ita web', '[Cc]itace elektronické monografie', -- non-English redirects; TODO: tally separately?
'[Cc]itat web', 'مرجع ويب', 'یادکرد وب', '웹 인용',
}
--[[--------------------------< C S 2 _ T E M P L A T E _ P A T T E R N S >------------------------------------
These are patterns for cs2 templates redirects.
]]
local cs2_template_patterns = { -- lua patterns of the cannonical names and redirects
'[Cc]itation',
'[Cc]ite', '[Cc]ite citation', '[Cc]ite study',
'[Cc]ite [Tt]echnical standard',
}
--[[--------------------------< V C I T E _ T E M P L A T E _ P A T T E R N S >--------------------------------
These are patterns for Vcite-family templates and their redirects.
]]
local vcite_template_patterns = {
'[Vv]cite book', -- canonical
'[Vv]ancite book', '[Vv]ancite report', '[Vv]cite encyclopedia',
'[Vv]cite report',
'[Vv]cite journal', -- canonical
'[Cc]it journal', '[Cc]it paper', '[Vv]ancite journal', '[Vv]cite paper',
'[Vv]cite news', -- canonical
'[Vv]ancite news',
'[Vv]cite web', -- canonical
'[Vv]ancite web',
}
--[[--------------------------< H A R V C _ T E M P L A T E _ P A T T E R N S >--------------------------------
These are patterns for the harvc template and its redirects.
]]
local harvc_template_patterns = {
'[Hh]arvc', -- canonical
'[Cc]itec',
}
--[[--------------------------< C S 1 _ L I K E _ T E M P L A T E _ P A T T E R N S >--------------------------
These are patterns for miscellaneous templates and their redirects that 'look like' cs1 templates (begin with cite ...)
Because they 'look like' cs1 templates they are handled as if they were cs1 templates. These templates are NOT
wrapper templates; names and dates are always to be extracted from the article instantiation of the template.
]]
local cs1_like_template_patterns = {
}
--[[--------------------------< W I K I C I T E _ T E M P L A T E _ P A T T E R N S >--------------------------
These are patterns for the wikicite template and its redirects.
]]
local wikicite_template_patterns = {
'[Ww]ikicite', -- canonical
}
--[[--------------------------< A N C H O R _ T E M P L A T E _ P A T T E R N S >------------------------------
These are patterns for the anchor template and its redirects.
]]
local anchor_template_patterns = {
'[Aa]nchors?', -- anchor is canonical form
'[Aa]nchor for redirect',
'[Aa]nchro',
'[Aa]ncor',
}
--[[--------------------------< S F N _ W H I T E L I S T _ P A T T E R N S >----------------------------------
These are patterns for the anchor template and its redirects.
]]
local sfn_whitelist_patterns = {
'[Ss]fn whitelist', -- canonical
'[Hh]arv whitelist',
}
--[[--------------------------< K N O W N _ T E M P L A T E S >------------------------------------------------
These tables are created from the *_template_patterns tables. To make these tables, entries in the source tables
are evaluated to replace lua patterns with the appropriate characters to create names for the output tables.
First charqacter is always uppercase
For example:
[Cc]ite ar[Xx]iv
becomes
Cite arXiv
Cite arxiv
]]
local known_templates_cs12 = {}; -- the exported tables
local known_templates_vcite = {};
local known_templates_harvc = {};
local known_templates_wikicite = {};
local known_templates_anchor = {};
local known_templates_sfn_whitelist = {};
local function add_stripped (list, name)
if not list[name] then
list[name] = true;
end
end
local function pattern_convert (pattern, list)
local lead, tail, c, l, name;
local first_char_patterns = {
'^%[(%a)%a%]', -- leading character (usually uppercase)
'^%[%a(%a)%]', -- leading character (usually lowercase)
}
c = tostring (pattern:match ('%u')); -- tostring() required because I don't know why; lua chokes complaining that c is not a string
name = pattern:gsub ('^%[%a%a%]', c); -- replace bracketed first character [Xx] with selected character from the match
if name:match ('(.-)%[(%a)(%a)%](.*)') then -- mixed case optional letters
lead, c, l, tail = name:match ('(.-)%[(%a)(%a)%](.*)');
add_stripped (list, lead .. c .. tail); -- uppercase
add_stripped (list, lead .. l .. tail); -- lowercase
elseif name:match ('^([^%[]+)(%[ %%%-%]%?)(.+)$') then -- [ %-]?
lead, c, tail = name:match ('^([^%[]+)(%[ %%%-%]%?)(.+)$');
add_stripped (list, lead .. tail); -- neither char
add_stripped (list, lead .. ' ' .. tail); -- space
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^([^%[]+)(%[%%%-%]%?)(.+)$') then -- [%-]?
lead, c, tail = name:match ('^([^%[]+)(%[%%%-%]%?)(.+)$');
add_stripped (list, lead .. tail); -- no hyphen
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^([^%[]+)(%[ %%%-%])(.+)$') then -- [ %-]
lead, c, tail = name:match ('^([^%[]+)(%[ %%%-%])(.+)$');
add_stripped (list, lead .. ' ' .. tail); -- space
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^([^%?]+)(%%%-%?)(.+)$') then -- %-?
lead, c, tail = name:match ('^([^%?]+)(%%%-%?)(.+)$');
add_stripped (list, lead .. tail); -- no hyphen
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^(.-)(%%%-)(.+)$') then -- %-
lead, c, tail = name:match ('^(.-)(%%%-)(.+)$');
add_stripped (list, lead .. '-' .. tail); -- hyphen
elseif name:match ('^(.-)(.)%?(.*)$') then -- .?
lead, c, tail = name:match ('^(.-)(.)%?(.*)$');
add_stripped (list, lead .. tail); -- no character
add_stripped (list, lead .. c .. tail); -- character
else
add_stripped (list, name); -- no patterns so save as is
end
end
for _, t in ipairs ({
{cs1_template_patterns, known_templates_cs12},
{cs2_template_patterns, known_templates_cs12},
{cs1_like_template_patterns, known_templates_cs12},
{vcite_template_patterns, known_templates_vcite},
{harvc_template_patterns, known_templates_harvc},
{wikicite_template_patterns, known_templates_wikicite},
{anchor_template_patterns, known_templates_anchor},
{sfn_whitelist_patterns, known_templates_sfn_whitelist},
}) do
for _, pattern in ipairs (t[1]) do -- for each patern in *_template_patterns
pattern_convert (pattern, t[2]) -- convert and store in known_templates_*
end
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return
{
known_templates_anchor = known_templates_anchor,
known_templates_cs12 = known_templates_cs12,
known_templates_harvc = known_templates_harvc,
known_templates_vcite = known_templates_vcite,
known_templates_wikicite = known_templates_wikicite,
known_templates_sfn_whitelist = known_templates_sfn_whitelist,
}
ac2kk9di798tezmbw1dis0wrp2b139q
Module:Footnotes/whitelist
828
2455
32951
2026-11-01T01:36:16Z
en>Mackensen
0
+Thiele-Hebrew Kings
32951
Scribunto
text/plain
--[[--------------------------< W R A P P E R _ T E M P L A T E _ D E F A U L T S >----------------------------
A list of wrapper templates by their canonical names – spelling and capitalization is important. Each wrapper
template has a table of two values: [1] is the wrapper's default name-list as it is used in an anchor ID; [2] is
the default year. This table is indexed indirectly through the wrapper_templates table.
This table is not available externally.
]]
local wrapper_template_defaults = { -- keys are canonical template names
['Americana'] = {'Rines', '1920'}, -- tables with default name and default year
['Cite bryonames'] = {'BrindaAtwood', ''},
['Cite EB1911'] = {'Chisholm', '1911'}, -- tables with default name and default year
['Encyclopaedia Islamica'] = {'Islamica', ''},
['EB1911'] = {'Chisholm', '1911'},
['EI3'] = {'FleetKrämerMatringeNawas', ''},
['FEIS'] = {'', ''},
['Jepson eFlora'] = {'Jepson_Flora_Project', ''},
['Cite Merriam-Webster'] = {'Merriam-Webster', ''},
['Cite NatureServe'] = {'NatureServe', ''},
['ODNB'] = {'', ''}, -- there is no default anchor ID; this forces evaluation of {{cite ODNB}} redirects
['PLANTS'] = {'NRCS', ''},
['Silvics'] = {'BurnsHonkala', '1990'}
}
--[[--------------------------< W R A P P E R _ T E M P L A T E _ D E F A U L T S _ V O L >--------------------
For wrapper templates that use |volume= to specify default name (often editor names) and year. Wrapper templates
are indexed by their canonical names – spelling and capitalization is important. Each wrapper template has a table
of values for every volume. Volumes may be indexed by Arabic or Roman numerals. Each volume index has a table of
twp values" [1] is the wrapper's default name-list as it is used in an anchor ID; [2] is the default year. Each
wrapper template in this table must have a ['default'] key for those occasions when |volume= is omitted or empty.
This table is indexed indirectly through the wrapper_templates table.
This table is not available externally.
]]
-- Helper function to create Encyclopedia Iranica volume table
local iranica_years = {
['1'] = 1985,
['1/1'] = 1982, ['1/2'] = 1982, ['1/3'] = 1983, ['1/4'] = 1983, ['1/5'] = 1983, ['1/6'] = 1984, ['1/7'] = 1984,
['2'] = 1987,
['2/1'] = 1985, ['2/2'] = 1985, ['2/3'] = 1986, ['2/4'] = 1986, ['2/5'] = 1986, ['2/6'] = 1986,
['3'] = 1989,
['3/1'] = 1987, ['3/2'] = 1987, ['3/3'] = 1988, ['3/4'] = 1988, ['3/5'] = 1988, ['3/6'] = 1988, ['3/7'] = 1988, ['3/8'] = 1988,
['4'] = 1990,
['4/1'] = 1989, ['4/2'] = 1989, ['4/3'] = 1989, ['4/4'] = 1989, ['4/5'] = 1989, ['4/6'] = 1990, ['4/7'] = 1990, ['4/8'] = 1989,
['5'] = 1992,
['5/1'] = 1990, ['5/2'] = 1990, ['5/3'] = 1991, ['5/4'] = 1991, ['5/5'] = 1991, ['5/6'] = 1991,
['6'] = 1993,
['6/1'] = 1992, ['6/2'] = 1992,
['7'] = 1996,
['7/1'] = 1994, ['7/2'] = 1994, ['7/3'] = 1994, ['7/4'] = 1995, ['7/5'] = 1995, ['7/6'] = 1995,
['8'] = 1998,
['8/1'] = 1997, ['8/2'] = 1997, ['8/3'] = 1997,
['9'] = 1999,
['9/1'] = 1998,
['10'] = 2001,
['10/1'] = 1999, ['10/2'] = 2000, ['10/3'] = 2000, ['10/4'] = 2000,
['11'] = 2003,
['11/1'] = 2001, ['11/2'] = 2002, ['11/3'] = 2002, ['11/4'] = 2002, ['11/5'] = 2002,
['12'] = 2004,
['12/1'] = 2003, ['12/2'] = 2003, ['12/3'] = 2003,
['13'] = 2006,
['13/1'] = 2004, ['13/2'] = 2004, ['13/3'] = 2004, ['13/4'] = 2004,
['14'] = 2008,
['14/1'] = 2007, ['14/2'] = 2007, ['14/3'] = 2007,
['15'] = 2011,
['15/1'] = 2009, ['15/2'] = 2009, ['15/3'] = 2009, ['15/4'] = 2010, ['15/5'] = 2010, ['15/6'] = 2011,
['16'] = 2020,
['16/1'] = 2012, ['16/2'] = 2013, ['16/3'] = 2017,
['default'] = '1982–2021'
}
local iranica_volumes = {}
for k, yr in pairs(iranica_years) do
iranica_volumes[k] = {'Yarshater', tostring(yr)}
end
-- Helper function to create "TDV Encyclopedia of Islam" volume table
local TDV_years = {
['1'] = '1988', ['2'] = '1989', ['3'] = '1991', ['4'] = '1991', ['5'] = '1992',
['6'] = '1992', ['7'] = '1993', ['8'] = '1993', ['9'] = '1994', ['10'] = '1994',
['11'] = '1995', ['12'] = '1995', ['13'] = '1996', ['14'] = '1996', ['15'] = '1997',
['16'] = '1997', ['17'] = '1998', ['18'] = '1998', ['19'] = '1999', ['20'] = '1999',
['21'] = '2000', ['22'] = '2000', ['23'] = '2001', ['24'] = '2001', ['25'] = '2002',
['26'] = '2002', ['27'] = '2003', ['28'] = '2003', ['29'] = '2004', ['30'] = '2005',
['31'] = '2006', ['32'] = '2006', ['33'] = '2007', ['34'] = '2007', ['35'] = '2008',
['36'] = '2009', ['37'] = '2009', ['38'] = '2010', ['39'] = '2010', ['40'] = '2011',
['41'] = '2012', ['42'] = '2012', ['43'] = '2013', ['44'] = '2013',
['Supplement 1'] = '2016', ['Supplement 2'] = '2016', ['default'] = '1988–2016'
}
local TDV_volumes = {}
for k, yr in pairs(TDV_years) do
TDV_volumes[k] = {'TDVIA', yr}
end
local wrapper_template_defaults_vol = { -- primary keys are canonical template names; TODO: do these keys have to be canonical template names?
['Cite Catholic Encyclopedia'] = { -- secondary keys are volume
['1'] = {'Herbermann', '1907'},
['2'] = {'Herbermann', '1907'},
['3'] = {'Herbermann', '1908'},
['4'] = {'Herbermann', '1908'},
['5'] = {'Herbermann', '1909'},
['6'] = {'Herbermann', '1909'},
['7'] = {'Herbermann', '1910'},
['8'] = {'Herbermann', '1910'},
['9'] = {'Herbermann', '1910'},
['10'] = {'Herbermann', '1911'},
['11'] = {'Herbermann', '1911'},
['12'] = {'Herbermann', '1911'},
['13'] = {'Herbermann', '1912'},
['14'] = {'Herbermann', '1912'},
['15'] = {'Herbermann', '1912'},
['default'] = {'Herbermann', '1913'},
},
['Cite EB9'] = {
['1'] = {'Baynes', '1878'}, ['I'] = {'Baynes', '1878'},
['2'] = {'Baynes', '1878'}, ['II'] = {'Baynes', '1878'},
['3'] = {'Baynes', '1878'}, ['III'] = {'Baynes', '1878'},
['4'] = {'Baynes', '1878'}, ['IV'] = {'Baynes', '1878'},
['5'] = {'Baynes', '1878'}, ['V'] = {'Baynes', '1878'},
['6'] = {'Baynes', '1878'}, ['VI'] = {'Baynes', '1878'},
['7'] = {'Baynes', '1878'}, ['VII'] = {'Baynes', '1878'},
['8'] = {'Baynes', '1878'}, ['VIII'] = {'Baynes', '1878'},
['9'] = {'Baynes', '1879'}, ['IX'] = {'Baynes', '1879'},
['10'] = {'Baynes', '1879'}, ['X'] = {'Baynes', '1879'},
['11'] = {'BaynesSmith', '1880'}, ['XI'] = {'BaynesSmith', '1880'},
['12'] = {'BaynesSmith', '1881'}, ['XII'] = {'BaynesSmith', '1881'},
['13'] = {'BaynesSmith', '1881'}, ['XIII'] = {'BaynesSmith', '1881'},
['14'] = {'BaynesSmith', '1882'}, ['XIV'] = {'BaynesSmith', '1882'},
['15'] = {'BaynesSmith', '1883'}, ['XV'] = {'BaynesSmith', '1883'},
['16'] = {'BaynesSmith', '1883'}, ['XVI'] = {'BaynesSmith', '1883'},
['17'] = {'BaynesSmith', '1884'}, ['XVII'] = {'BaynesSmith', '1884'},
['18'] = {'BaynesSmith', '1885'}, ['XVIII'] = {'BaynesSmith', '1885'},
['19'] = {'BaynesSmith', '1885'}, ['XIX'] = {'BaynesSmith', '1885'},
['20'] = {'BaynesSmith', '1886'}, ['XX'] = {'BaynesSmith', '1886'},
['21'] = {'BaynesSmith', '1886'}, ['XXI'] = {'BaynesSmith', '1886'},
['22'] = {'BaynesSmith', '1887'}, ['XXII'] = {'BaynesSmith', '1887'},
['23'] = {'BaynesSmith', '1888'}, ['XXIII'] = {'BaynesSmith', '1888'},
['24'] = {'BaynesSmith', '1888'}, ['XXIV'] = {'BaynesSmith', '1888'},
['default'] = {'Baynes', '1875–1889'},
},
['The Cambridge History of Iran'] = {
['1'] = {'Fischer', '1968'},
['2'] = {'Gershevitch', '1985'},
['3a'] = {'Yarshater', '1983'},
['3b'] = {'Yarshater', '1983'},
['4'] = {'Frye', '1975'},
['5'] = {'Boyle', '1968'},
['6'] = {'LockhartJackson', '1986'},
['7'] = {'AveryHamblyMelville', '1991'},
['default'] = {'', '1968–1991'}
},
['Encyclopædia Iranica'] = iranica_volumes,
['Encyclopaedia of Islam, New Edition'] = {
['1'] = {'GibbKramersLévi-ProvençalSchacht', '1960'},
['2'] = {'LewisPellatSchacht', '1965'},
['3'] = {'LewisMénagePellatSchacht', '1971'},
['4'] = {'van_DonzelLewisPellatBosworth', '1978'},
['5'] = {'Bosworthvan_DonzelLewisPellat', '1986'},
['6'] = {'Bosworthvan_DonzelPellat', '1991'},
['7'] = {'Bosworthvan_DonzelHeinrichsPellat', '1993'},
['8'] = {'Bosworthvan_DonzelHeinrichsLecomte', '1995'},
['9'] = {'Bosworthvan_DonzelHeinrichsLecomte', '1997'},
['10'] = {'BearmanBianquisBosworthvan_Donzel', '2000'},
['11'] = {'BearmanBianquisBosworthvan_Donzel', '2002'},
['12'] = {'BearmanBianquisBosworthvan_Donzel', '2004'},
['atlas'] = {'Brice', '1981'},
['abridged'] = {'van_Donzel', '1994'},
['default'] = {'BearmanBianquisBosworthvan_Donzel', '1960–2005'},
},
['TDV Encyclopedia of Islam'] = TDV_volumes,
['New Cambridge Medieval History'] = {
['1'] = {'Fouracre', '2005'},
['2'] = {'McKitterick', '1995'},
['3'] = {'Reuter', '2000'},
['4a'] = {'LuscombeRiley-Smith', '2004'},
['4b'] = {'LuscombeRiley-Smith', '2004'},
['5'] = {'Abulafia', '1999'},
['6'] = {'Jones', '2000'},
['7'] = {'Allmand', '1998'},
['default'] = {'', '1995–2005'},
},
['The History of al-Tabari'] = {
['1'] = {'Rosenthal', '1989'},
['2'] = {'Brinner', '1986'},
['3'] = {'Brinner', '1991'},
['4'] = {'Perlmann', '1987'},
['5'] = {'Bosworth', '1999'},
['6'] = {'WattMcDonald', '1989'},
['7'] = {'McDonald', '1987'},
['8'] = {'Fishbein', '1997'},
['9'] = {'Poonawala', '1990'},
['10'] = {'Donner', '1993'},
['11'] = {'Blankinship', '1993'},
['12'] = {'Friedmann', '1992'},
['13'] = {'Juynboll', '1989'},
['14'] = {'Smith', '1994'},
['15'] = {'Humphreys', '1990'},
['16'] = {'Brockett', '1997'},
['17'] = {'Hawting', '1996'},
['18'] = {'Morony', '1987'},
['19'] = {'Howard', '1990'},
['20'] = {'Hawting', '1989'},
['21'] = {'Fishbein', '1990'},
['22'] = {'Rowson', '1989'},
['23'] = {'Hinds', '1990'},
['24'] = {'Powers', '1989'},
['25'] = {'Blankinship', '1989'},
['26'] = {'Hillenbrand', '1989'},
['27'] = {'Williams', '1985'},
['28'] = {'McAuliffe', '1995'},
['29'] = {'Kennedy', '1990'},
['30'] = {'Bosworth', '1989'},
['31'] = {'Fishbein', '1992'},
['32'] = {'Bosworth', '1987'},
['33'] = {'Bosworth', '1991'},
['34'] = {'Kraemer', '1989'},
['35'] = {'Saliba', '1985'},
['36'] = {'Waines', '1992'},
['37'] = {'Fields', '1987'},
['38'] = {'Rosenthal', '1985'},
['39'] = {'Landau-Tasseron', '1998'},
['40'] = {'Popovkin', '2007'},
['default'] = {'Yarshater', '1985–2007'},
},
}
--[[--------------------------< W R A P P E R _ T E M P L A T E S >--------------------------------------------
A list of wrapper templates and their redirects – spelling and capitalization is important; first character is
always uppercase. Each wrapper template gets its value from a k/v pair in the wrapper_template_defaults table.
article reader queries this table to see if template_name is a wrapper template
]]
local wrapper_templates = { -- keys are names of wrapper templates and their redirects
['Americana'] = wrapper_template_defaults['Americana'], -- canonical name; this template calls Cite Americana
['Cite bryonames'] = wrapper_template_defaults['Cite bryonames'],
['Catholic Encyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['1913Catholic'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Catholic'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Catholic encyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CatholicEncyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CE13'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CE1913'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite Americana'] = wrapper_template_defaults['Americana'], -- canonical name
['Cite Catholic Encyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CathEncy'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite Catholic Encyclopædia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite CE1913'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite EB1911'] = wrapper_template_defaults['Cite EB1911'], -- canonical name
['1911EB'] = wrapper_template_defaults['Cite EB1911'], -- redirects
['EB1911 cite'] = wrapper_template_defaults['Cite EB1911'],
['Wikisource1911Enc Citation'] = wrapper_template_defaults['Cite EB1911'],
['Wikisource1911Enc citation'] = wrapper_template_defaults['Cite EB1911'],
['Cite EB9'] = wrapper_template_defaults_vol['Cite EB9'], -- canonical
['Eb9'] = wrapper_template_defaults_vol['Cite EB9'],
['The Cambridge History of Iran'] = wrapper_template_defaults_vol['The Cambridge History of Iran'],
['Cambridge History of Iran'] = wrapper_template_defaults_vol['The Cambridge History of Iran'],
['Encyclopædia Iranica'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Encyclopædia Iranica Online'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Encyclopaedia Iranica'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Cite Encyclopædia Iranica Online'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Encyclopaedia Islamica'] = wrapper_template_defaults['Encyclopaedia Islamica'],
['TDV Encyclopedia of Islam'] = wrapper_template_defaults_vol['TDV Encyclopedia of Islam'],
['TDV İslâm Ansiklopedisi'] = wrapper_template_defaults_vol['TDV Encyclopedia of Islam'],
['Cite ODNB'] = wrapper_template_defaults['ODNB'], -- canonical
['Cite odnb'] = wrapper_template_defaults['ODNB'],
['DNBweb'] = wrapper_template_defaults['ODNB'],
['OBDNweb'] = wrapper_template_defaults['ODNB'],
['ODNB'] = wrapper_template_defaults['ODNB'],
['ODNBref'] = wrapper_template_defaults['ODNB'],
['ODNBweb'] = wrapper_template_defaults['ODNB'],
['EB1911'] = wrapper_template_defaults['EB1911'], -- canonical name; this template calls Cite EB1911
['1911'] = wrapper_template_defaults['EB1911'], -- redirects
['1911s'] = wrapper_template_defaults['EB1911'],
['Britannica 1911'] = wrapper_template_defaults['EB1911'],
['Encyclopedia Britannica 1911'] = wrapper_template_defaults['EB1911'],
['Encyclopædia Britannica 1911'] = wrapper_template_defaults['EB1911'],
['EB9'] = wrapper_template_defaults_vol['Cite EB9'], -- canonical; this template calls Cite EB9
['Encyclopaedia of Islam, New Edition'] = wrapper_template_defaults_vol['Encyclopaedia of Islam, New Edition'], -- canonical
['EI2'] = wrapper_template_defaults_vol['Encyclopaedia of Islam, New Edition'],
['Encyclopaedia of Islam, THREE'] = wrapper_template_defaults['EI3'], -- canonical
['EI3'] = wrapper_template_defaults['EI3'],
['FEIS'] = wrapper_template_defaults['FEIS'],
['Jepson eFlora'] = wrapper_template_defaults['Jepson eFlora'],
['Cite Jepson eFlora'] = wrapper_template_defaults['Jepson eFlora'],
['Cite NatureServe'] = wrapper_template_defaults['Cite NatureServe'],
['New Cambridge Medieval History'] = wrapper_template_defaults_vol['New Cambridge Medieval History'], -- canonical
['Cite Merriam-Webster'] = wrapper_template_defaults['Cite Merriam-Webster'],
['Merriam-Webster'] = wrapper_template_defaults['Cite Merriam-Webster'],
['MW'] = wrapper_template_defaults['Cite Merriam-Webster'],
['MerriamWebsterDictionary'] = wrapper_template_defaults['Cite Merriam-Webster'],
['Cite MW'] = wrapper_template_defaults['Cite Merriam-Webster'],
['M-W'] = wrapper_template_defaults['Cite Merriam-Webster'],
['PLANTS'] = wrapper_template_defaults['PLANTS'],
['NRCS Plant Profile'] = wrapper_template_defaults['PLANTS'],
['NRCS Plants Profile'] = wrapper_template_defaults['PLANTS'],
['Cite PLANTS'] = wrapper_template_defaults['PLANTS'],
['Cite usda plants'] = wrapper_template_defaults['PLANTS'],
['The History of al-Tabari'] = wrapper_template_defaults_vol['The History of al-Tabari'], -- canonical
['The History of Al-Tabari'] = wrapper_template_defaults_vol['The History of al-Tabari'], -- redirects
['The History of al-Ṭabarī'] = wrapper_template_defaults_vol['The History of al-Tabari'], -- redirects
['Silvics'] = wrapper_template_defaults['Silvics'],
}
--[[--------------------------< T E M P L A T E _ N A M E S >--------------------------------------------------
This table holds the names of templates and the names of their redirects. Template names must be written exactly
as they are named at their templatespace page. This same also applies to redirects.
The indexes in this table are not critical but should be short and concise.
]]
local template_names = {
['ADB'] = {'Allgemeine Deutsche Biographie', 'Cite ADB'},
['Butt_Stations'] = {'Butt-Stations', 'Butt-stations'},
['Cam_Hist_Iran'] = {'Cambridge History of Iran', 'The Cambridge History of Iran'},
['DNB'] = {'Cite DNB', 'DNB', 'DNB Cite', 'Cite DNBSupp', 'DNBSupp', 'Cite DNB12', 'Cite DNBIE', 'DNB12', 'DNBIE', 'DNBfirst'},
['EI2'] = {'Encyclopaedia of Islam, New Edition','EI2'},
['ME-ref'] = {'ME-ref', 'Me-ref'},
['ODB'] = {'ODB', 'Oxford Dictionary of Byzantium'},
['ODLA'] = {'ODLA', 'Oxford Dictionary of Late Antiquity'},
['NDB'] = {'Cite NDB', 'NDB'},
['Iranica'] = {'Encyclopædia Iranica Online', 'Encyclopædia Iranica', 'Encyclopaedia Iranica', 'Cite Encyclopædia Iranica Online'},
['Tabari'] = {'The History of al-Tabari','The History of al-Ṭabarī'}
}
--[[--------------------------< W R A P P E R _ T E M P L A T E _ P A T T E R N S >----------------------------
A list of pairs: each pair is a (list of wrapper templates, list of corresponding whitelisted patterns).
The main code will sweep through the list of wrapper templates, checking if they are used, the match against corresponding whitelisted patterns.
]]
local wrapper_template_patterns = {
{{'Acad','Alumni Cantabrigienses','Venn'},{'ACAD%u%u%u?%u?%d+%u%u?'}},
{{'Cite AHD','Australian Heritage Database'},{'AHD%d+'}},
{{'Cite Austrian gazette'},{'[BR]GBl_[12]%d%d%d%-?I?I?%/%d+','StGBl_[12]%d%d%d%/%d+','GBlÖ_[12]%d%d%d%/%d+'}},
{{'Cite Bach Digital harvard','BDh'},{'[%d%a_%pöüäß→]+_at_Bach_Digital'}},
{{'Cite DNB', 'DNB', 'DNB Cite', 'Cite DNBSupp', 'DNBSupp', 'Cite DNB12', 'Cite DNBIE', 'DNB12', 'DNBIE', 'DNBfirst'},
{'CITEREF%a[%a%-_\']*188[5-9]', -- 1885–1889
'CITEREF%a[%a%-_\']*189%d', -- 1890–1899
'CITEREF%a[%a%-_\']*190[0-1]', -- 1900–1901
'CITEREF%a[%a%-_\']*1903', -- 1903 IE
'CITEREF%a[%a%-_\']*1912', -- 1912 supplement
}},
{{'Cite gnis2','GNIS 0'},{'%a.*_USGS$'}},
{{'Coflein'},{'RCAHMW[%s_]*%d+'}},
{{'Historic Environment Scotland','HEScotland'},{'Historic_Environment_Scotland%u%u%u?%u?%d'}},
{{'London Gazette'},{'Gazette%d+'}},
{template_names['ME-ref'],{'Tolkien19%d%d'}},
{{'National Heritage List for England','Images of England','IoEEntry','Heritage Gateway',
'NHLE','English Heritage List entry','IoE','National Heritage List for England entry','Historic England',
'Historic England research records','Cite PastScape','PastScape','HERR'},{'Historic_England%d+'}},
{{'Cite QHR','Cite CHIMS'},{'QHR%d+'}}
}
local noDefault = {'', ''}
-- ensure that all templates with patterns are classified as wrapper templates
for _, wtp in ipairs(wrapper_template_patterns) do
for _, t in ipairs(wtp[1]) do
if not wrapper_templates[t] then
wrapper_templates[t] = noDefault
end
end
end
--[[--------------------------< W H I T E L I S T >------------------------------------------------------------
This is a list of anchor IDs known to be associated with specific wrapper templates. The anchor ID serves as an
index into the table. The assigned value is another table that lists the associated template and any redirects.
Except for year disambiguators, anchor IDs must have the same form as the anchor creator makes; must be the
anchor-encoded form. Remove the year disambiguator.
Template names must be written exactly as they are named at their templatespace page. This same also applies to
redirects. Module:Footnotes reads the template names left to right so most-commonly-used template or redirect name
should appear first. When there are more than one name and when those templates have various anchor IDs the template
namelist should be added to the template_names{} table.
Note that references to Template:EB1911 are listed under "E" in the alphabetical list below to keep them organized.
]]
local whitelist = {
----------< # >----------
['CITEREF2013_Statistical_Yearbook_of_the_Republic_of_Croatia'] = {'Croatia Yearbook 2013'},
----------< A >----------
['CITEREFAGA_1884–1897'] = {'Schubert\'s compositions (references)'},
['CITEREFATOC2009'] = {'ATOCConnectingCommunitiesReportS10'},
['CITEREFAbramowitzStegun1983'] = {'Abramowitz Stegun ref'},
['CITEREFAbulafia1999'] = {'New Cambridge Medieval History'},
['CITEREFActa_Lipsiensium1723'] = {'Bach\'s compositions (sources)'},
['CITEREFAdamsFranzosa2009'] = {'Adams Franzosa Introduction to Topology Pure and Applied'},
['CITEREFAdaschErnstKeim1978'] = {'Adasch Topological Vector Spaces'},
['CITEREFAEF1920'] = {'Histories of Two Hundred and Fifty-One Divisions of the German Army'},
['CITEREFAffleck1978'] = {'Affleck-On Track'},
['CITEREFAhlgrimm1969'] = {'Bach\'s compositions (sources)'},
['CITEREFAhrons1927'] = {'Book-Ahrons-British Steam Railway Locomotive'},
['CITEREFAl-Kindi1912'] = {'The Governors and Judges of Egypt'},
['CITEREFAlbert_Schumann1886'] = {'Cite ADB'},
['CITEREFAlden1916'] = {'Shakespeare sonnets bibliography'},
['CITEREFAldrich1969'] = {'Aldrich-LocosGER7'},
['CITEREFAleksidze2018'] = template_names['ODLA'],
['CITEREFAlexiou2010'] = {'Cite flatiron'},
['CITEREFAliprantisBorder2006'] = {'Aliprantis Border Infinite Dimensional Analysis A Hitchhiker\'s Guide Third Edition'},
['CITEREFAllamaniPanagiotopoulou1978'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFAllcockDaviesle_FlemingMaskelyne1951'] = {'RCTS-LocosGWR-1'},
['CITEREFAllcockDaviesle_FlemingMaskelyne1968'] = {'RCTS-LocosGWR-1'},
['CITEREFAllen1936'] = {'Allen-Star Names'},
['CITEREFAllenBoddyBrownFry1970'] = {'RCTS-LocosLNER-8A', 'RCTS-LocosLNER'},
['CITEREFAllenBoddyBrownFry1971'] = {'RCTS-LocosLNER-8B', 'RCTS-LocosLNER'},
['CITEREFAllenBoddyBrownFry1983'] = {'RCTS-LocosLNER-8A', 'RCTS-LocosLNER'},
['CITEREFAllmand1998'] = {'New Cambridge Medieval History'},
['CITEREFAmerican_Railway_Association1922'] = {'1922 Locomotive Cyclopedia'},
['CITEREFAnderson1952'] = {'Naval Wars in the Levant 1559–1853'},
['CITEREFAngelov2018'] = template_names['ODLA'],
['CITEREFApostol1976'] = {'Apostol IANT'},
['CITEREFArkhangel'skiiPonomarev1984'] = {'Arkhangel\'skii Ponomarev Fundamentals of General Topology Problems and Exercises'},
['CITEREFArrey_von_Dommer1875'] = {'Cite ADB'},
['CITEREFAsmus1966'] = template_names['NDB'],
['CITEREFAspreas1929'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFAtkins2007'] = {'Shakespeare sonnets bibliography'},
['CITEREFAudiKondevWangHuang2017'] = {'NUBASE2016'},
['CITEREFAvdoyan2018'] = template_names['ODLA'],
['CITEREFAwdry1990'] = {'Awdry-RailCo', 'Carnarvonshire Railway'},
['CITEREFRamelli2018'] = {'Oxford Dictionary of Late Antiquity'},['CITEREFA_History_of_the_Crusades'] = {'Setton-A History of the Crusades'},
----------< B >----------
['CITEREFBabinger1962'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFBabinger1978'] = {'Mehmed the Conqueror and His Time'},
['CITEREFBabinger1992'] = {'Mehmed the Conqueror and His Time'},
['CITEREFBachAgricola1754'] = {'Bach\'s compositions (sources)'},
['CITEREFBadura-SkodaBranscombe2008'] = {'Schubert\'s compositions (references)'},
['CITEREFBagley1999'] = {'Cite Cambridge History of China'},
['CITEREFBaldwin1969'] = {'Setton-A History of the Crusades'},
['CITEREFBaldwin1985'] = {'Setton-A History of the Crusades'},
['CITEREFBaldwin1991'] = template_names['ODB'],
['CITEREFBaldwinKazhdan1991'] = template_names['ODB'],
['CITEREFBaldwinTalbot1991'] = template_names['ODB'],
['CITEREFBaltzer1916'] = {'Baltzer-Kolonialbahnen'},
['CITEREFBanach1932'] = {'Banach Théorie des Opérations Linéaires'},
['CITEREFBangFrankKowanskiVondrak2007'] = {'Forgotten Railroads Through Westchester County'},
['CITEREFBartusis1991'] = template_names['ODB'],
['CITEREFBaxter1971'] = {'Baxter-BritishLocoCat1'},
['CITEREFBaxter1977'] = {'Baxter-BritishLocoCat1', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1978'] = {'Baxter-BritishLocoCat2A', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1979'] = {'Baxter-BritishLocoCat2B', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1982'] = {'Baxter-BritishLocoCat3A', 'Baxter-BritishLocoCat3B', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1982a'] = {'Baxter-BritishLocoCat3A', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1984'] = {'Baxter-BritishLocoCat4', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1986'] = {'Baxter-BritishLocoCat5A', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1988'] = {'Baxter-BritishLocoCat5B', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter2012'] = {'Baxter-BritishLocoCat6', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBecke1935'] = {'Order of Battle of Divisions-1'},
['CITEREFBecke1936'] = {'Order of Battle of Divisions-2A'},
['CITEREFBecke1937'] = {'Order of Battle of Divisions-2B'},
['CITEREFBecke1938'] = {'Order of Battle of Divisions-3A'},
['CITEREFBecke1945'] = {'Order of Battle of Divisions-3B', 'Order of Battle of Divisions-4'},
['CITEREFBeißwenger1991'] = {'Bach\'s compositions (sources)'},
['CITEREFBek2001'] = {'Cite Grove'},
['CITEREFBelke1996'] = {'Tabula Imperii Byzantini'},
['CITEREFBelkeMersisch1990'] = {'Tabula Imperii Byzantini'},
['CITEREFBelkeRestle1984'] = {'Tabula Imperii Byzantini'},
['CITEREFBellini2008'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFBernhard_von_Poten1889'] = template_names['ADB'],
['CITEREFBernhard_von_Poten1898'] = template_names['ADB'],
['CITEREFBezilla1980'] = {'Bezilla-PRR-Electric-Traction'},
['CITEREFBianquis1998'] = {'The Cambridge History of Egypt', 'Cambridge History of Egypt'},
['CITEREFBierstedt1988'] = {'Bierstedt An Introduction to Locally Convex Inductive Limits'},
['CITEREFBirken1976'] = {'Die Provinzen des Osmanischen Reiches'},
['CITEREFBirtchnell1972'] = {'A Short History of Berkhamsted'},
['CITEREFBlake1966'] = {'DisraeliRef'},
['CITEREFBlanken2019'] = {'Bach\'s compositions (sources)'},
['CITEREFBlankinship1994'] = {'The End of the Jihâd State', 'The End of the Jihad State'},
['CITEREFBlautSchulze2008'] = {'Bach\'s compositions (sources)'},
['CITEREFBloom2007'] = {'Cite Routledge Broadway', 'Cite Broadway Routledge', 'Cite Routledge Guide to Broadway', 'Routledge Guide to Broadway'},
['CITEREFBoatner1988'] = {'Civil War Dictionary'},
['CITEREFBock1978'] = {'Audie-bock-directors'},
['CITEREFBodde1986'] = {'Cite Cambridge History of China'},
['CITEREFBoddyBrownFryHennigan1968'] = {'RCTS-LocosLNER-4', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownFryHennigan1975'] = {'RCTS-LocosLNER-2B', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownFryHennigan1977'] = {'RCTS-LocosLNER-9A', 'RCTS-LocosLNER-9B', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownFryHennigan1979'] = {'RCTS-LocosLNER-3A', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownHenniganHoole1984'] = {'RCTS-LocosLNER-6C', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownHenniganNeve1981'] = {'RCTS-LocosLNER-3B', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownNeveYeadon1983'] = {'RCTS-LocosLNER-6B', 'RCTS-LocosLNER'},
['CITEREFBoddyFryHenniganHoole1988'] = {'RCTS-LocosLNER-10A', 'RCTS-LocosLNER'},
['CITEREFBoddyFryHenniganHoole1990'] = {'RCTS-LocosLNER-10B', 'RCTS-LocosLNER'},
['CITEREFBoddyFryHenniganProud1963'] = {'RCTS-LocosLNER-1', 'RCTS-LocosLNER'},
['CITEREFBoddyNeveTeeYeadon1982'] = {'RCTS-LocosLNER-6A', 'RCTS-LocosLNER'},
['CITEREFBoddyNeveYeadon1973'] = {'RCTS-LocosLNER-2A', 'RCTS-LocosLNER'},
['CITEREFBody1989'] = {'Body-Railways-Vol2'},
['CITEREFBon1969'] = {'La Morée franque'},
['CITEREFBonner2010'] = {'New Cambridge History of Islam'},
['CITEREFBonnett2005'] = {'Bonnett Practical Rail Engineering'},
['CITEREFBonporti1712'] = {'Bach\'s compositions (sources)'},
['CITEREFBooth2000'] = {'Shakespeare sonnets bibliography'},
['CITEREFBorsari1964'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFBossert1914'] = {'Schaff-Herzog'},
['CITEREFBottoMitchell2002'] = {'Cite ATT Broadway', 'Cite At This Theatre Broadway', 'Cite Broadway At This Theatre', 'Cite Broadway ATT'},
['CITEREFBourbaki1987'] = {'Bourbaki Topological Vector Spaces', 'Bourbaki Topological Vector Spaces Part 1 Chapters 1–5'},
['CITEREFBourbaki1989'] = {'Bourbaki General Topology Part I Chapters 1-4', 'Bourbaki General Topology Part II Chapters 5-10', 'Bourbaki Algebra I Chapters 1-3 Springer'},
['CITEREFBourbaki1994'] = {'Bourbaki EHM'},
['CITEREFBournoutian2018'] = {'Cite Armenia and Imperial Decline'},
['CITEREFBowen1928'] = {'The Life and Times of Ali ibn Isa'},
['CITEREFBowmanCameronGarnsey2005'] = {'Cambridge Ancient History'},
['CITEREFBoyd1970'] = {'Boyd-MidWales'},
['CITEREFBoyd1975'] = {'Boyd-FR1'},
['CITEREFBoyd1985'] = {'Boyd-NCaerns2Penrhyn'},
['CITEREFBoyd1986'] = {'Boyd-NCaerns3Dinorwic'},
['CITEREFBoyd1988'] = {'Boyd-SCaerns1'},
['CITEREFBoyd1989'] = {'Boyd-SCaerns2'},
['CITEREFBoyd1990'] = {'Boyd-NCaerns1'},
['CITEREFBradshaw1968'] = {'Bradshaw-1910April'},
['CITEREFBradshaw1985'] = {'Bradshaw-1922July'},
['CITEREFBradshaw2011'] = {'Bradshaw-1895December'},
['CITEREFBradshaw2012'] = {'Bradshaw-1850March'},
['CITEREFBrand1968'] = {'Byzantium Confronts the West'},
['CITEREFBrand1991'] = {'DBI', 'ODB', 'Oxford Dictionary of Byzantium'},
['CITEREFBray2010'] = {'Bray-SDJR'},
['CITEREFBrett2010'] = {'New Cambridge History of Islam'},
['CITEREFBrown2008'] = {'The Cambridge History of the Byzantine Empire'},
['CITEREFBrown2021'] = {'Cite Gaia EDR3'},
['CITEREFBryan1886'] = {'Bryan (3rd edition)'},
['CITEREFBryan1889'] = {'Bryan (3rd edition)'},
['CITEREFBützerJeker1980'] = {'Grosser Eisenbahn-Atlas Schweiz'},
['CITEREFBuhle1909'] = {'Bach\'s compositions (sources)'},
['CITEREFBunbury1857'] = {'DGRG'},
['CITEREFBurant1987'] = {'Cite DCB'},
['CITEREFBurch1911'] = {'Burch Electric Traction'},
['CITEREFBurke1866'] = {'O\'Donnell family tree'},
['CITEREFBurrowsWallace1999'] = {'Cite gotham'},
['CITEREFBury1911'] = {'The Imperial Administrative System of the Ninth Century'},
['CITEREFButcherNicholson2018'] = template_names['ODLA'],
['CITEREFButt1995'] = template_names['Butt_Stations'],
----------< C >----------
['CITEREFCIC1983'] = {'CIC1983bib'},
['CITEREFCalifornia1988'] = {'CA-Rail Passenger Development Plan-1988'},
['CITEREFCallwell1999'] = {'Muni Chronology'},
['CITEREFCaltrans1984'] = {'Countrystudy'},
['CITEREFCameronWard-PerkinsWhitby2000'] = {'Cambridge Ancient History'},
['CITEREFCanepa2018'] = template_names['ODLA'],
['CITEREFCanny2008'] = {'O\'Donnell family tree'},
['CITEREFCappelCutlerKazhdan1991'] = template_names['ODB'],
['CITEREFCarl_von_Prantl1879'] = {'Cite ADB'},
['CITEREFCarlson2010'] = {'Dlmf'},
['CITEREFCaro1974'] = {'Cite Power Broker'},
['CITEREFCarpenter1977'] = template_names['ME-ref'],
['CITEREFCarpenter1981'] = template_names['ME-ref'],
['CITEREFCarpenter2023'] = template_names['ME-ref'],
['CITEREFCarra_de_VauxHodgson1965'] = {'EI2'},
['CITEREFCarter2006'] = {'Carter-RailwaysMotivePowerArgentina'},
['CITEREFCasserley1968'] = {'Casserley-joint'},
['CITEREFCasserleyJohnston1966'] = {'Casserley-LocoGrouping3'},
['CITEREFCasserleyJohnston1974'] = {'Casserley-LocoGrouping3', 'Casserley-LocoGrouping2', '0-7110-0554-0'},
['CITEREFCasway1984'] = {'O\'Donnell family tree'},
['CITEREFCavanna_Ciappina2001'] = {'DBI'},
['CITEREFCaveBucklandBeardsell2002'] = {'Cave-First Fifty'},
['CITEREFCawley2001'] = {'Medieval Lands by Charles Cawley', 'MLCC'},
['CITEREFCawley2001'] = {'Medieval Lands by Charles Cawley'},
['CITEREFCawley2010'] = {'MLCC'},
['CITEREFCawley2011'] = {'MLCC'},
['CITEREFCawley2012'] = {'Medieval Lands by Charles Cawley'},
['CITEREFChaffeeTwitchett2015'] = {'Cite Cambridge History of China'},
['CITEREFChaléardChanson-JabeurBéranger2006'] = {'Chaléard-Le cdf en Afrique'},
['CITEREFChambers1728'] = {'Cyclopaedia 1728'},
['CITEREFChasiotis1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFCheyneBlack1899'] = {'Biblica', 'Cite Biblica'},
['CITEREFCheyneBlack1899–1903'] = {'Cite Biblica'},
['CITEREFCheyneBlack1901'] = {'Cite Biblica'},
['CITEREFCheyneBlack1902'] = {'Cite Biblica'},
['CITEREFCheyneBlack1903'] = {'Cite Biblica'},
['CITEREFChisholm1911'] = {'Cite EB1911','EB1911','1911EB','EB1911 cite','1911','1911s','Britannica 1911','Encyclopedia Britannica 1911','Encyclopædia Britannica 1911','Wikisource1911Enc Citation','Wikisource1911Enc citation'},
['CITEREFChisholm1922'] = {'EB1922', 'Cite EB1922'},
['CITEREFChoniates1984'] = {'O City of Byzantium'},
['CITEREFChrista_Jost1999'] = template_names['NDB'],
['CITEREFChung1994'] = {'Country study'},
['CITEREFChurchmanHurst2001'] = {'Churchman & Hurst Railways of New Zealand'},
['CITEREFChurchman_&_Hurst2001'] = {'Churchman & Hurst Railways of New Zealand'},
['CITEREFChurella2013'] = {'Churella-PRR-1'},
['CITEREFClementsMcMahon2008'] = {'ClementsMcMahon-GSR Locomotives'},
['CITEREFClinker1978'] = {'Clinker-Stations'},
['CITEREFClinker1988'] = {'Clinker-Stations'},
['CITEREFCoates1990'] = {'Coates-Reading'},
['CITEREFColbyWilliams1916'] = {'New International Encyclopedia', 'NIE'},
['CITEREFColledgeWarlow2006'] = {'Colledge', 'Cite Colledge2006'},
['CITEREFColledgeWarlow2010'] = {'Cite Colledge2010'},
['CITEREFCollins2016'] = {'Cite Collins 2016'},
['CITEREFColvin1947'] = {'Colvin1947'},
['CITEREFConolly1998'] = {'IanAllan-PreGroup-Atlas1998'},
['CITEREFConway1990'] = {'Conway A Course in Functional Analysis'},
['CITEREFCookZimmermann1992'] = {'Cook-Western Maryland'},
['CITEREFCosentino2008'] = {'DBI'},
['CITEREFCotsonis2020'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFCoulthard-Clark2002'] = {'Australian Dictionary of Biography'},
['CITEREFCousin1910'] = {'A Short Biographical Dictionary of English Literature', 'Cite SBDEL'},
['CITEREFCoverdale_&_Colpitts1946'] = {'Coverdale & Colpitts 1', 'Coverdale & Colpitts 2', 'Coverdale & Colpitts 3', 'Coverdale & Colpitts 4'},
['CITEREFCox1967'] = {'Cox-Upper Darby'},
['CITEREFCox2011'] = {'Cox-Dixie'},
['CITEREFCrevier1993'] = {'Crevier 1993'},
['CITEREFCrockett2007'] = {'Australian Dictionary of Biography'},
['CITEREFCroke2018'] = template_names['ODLA'],
['CITEREFCrone1980'] = {'Slaves on Horses'},
['CITEREFCrone2003'] = {'Slaves on Horses'},
['CITEREFCroughtonKidnerYoung1982'] = {'Croughton-PrivateStations'},
['CITEREFCruickshanks1970'] = {'HistoryofParliament'},
['CITEREFCsászár1978'] = {'Császár General Topology'},
['CITEREFCudahy2002'] = {'Cudahy-Hudson'},
['CITEREFCudahy2003'] = {'Cudahy-Subways'},
['CITEREFCurta2006'] = {'Southeastern Europe in the Middle Ages, 500–1250'},
----------< D >----------
['CITEREFDBI'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFDZS2015'] = {'Croatia Yearbook 2015'},
['CITEREFDadelsen1957'] = {'Bach\'s compositions (sources)'},
['CITEREFDaftary1990'] = {'Daftary-The Ismailis'},
['CITEREFDaftary2007'] = {'Daftary-The Ismailis'},
['CITEREFDaniel2010'] = {'New Cambridge History of Islam'},
['CITEREFDanielsDench1963'] = {'Daniels-NoMore'},
['CITEREFDanielsDench1973'] = {'Daniels-NoMore'},
['CITEREFDarleyCanepa2018'] = {'Oxford Dictionary of Late Antiquity'},
['CITEREFDaryaee2018'] = template_names['ODLA'],
['CITEREFDaryaeeCanepa2018'] = template_names['ODLA'],
['CITEREFDavid1961'] = {'Bach\'s compositions (sources)'},
['CITEREFDavidson2010'] = {'HistoryofParliament'},
['CITEREFDavidsonThrush2010'] = {'HistoryofParliament'},
['CITEREFDavies1956'] = {'RCTS-LocosGWR-11'},
['CITEREFDavies1996'] = {'Davies-PLMLocoList'},
['CITEREFDavies1997'] = {'Davies-NordLocoList'},
['CITEREFDavies2001'] = {'Davies-EstLocoList3', 'Davies-ÉtatLocoList'},
['CITEREFDavies2003'] = {'Davies-SNCFLocoList'},
['CITEREFDaviesFirthLuckingThomas1966'] = {'RCTS-LocosGWR-10'},
['CITEREFDe_Negri1997'] = {'DBI'},
['CITEREFDendy_MarshallKidner1982'] = {'Dendy Marshall-Southern Railway'},
['CITEREFDer_Matossian2020'] = {'Cite The First Republic of Armenia'},
['CITEREFDeutsch1951'] = {'Schubert\'s compositions (references)'},
['CITEREFDeutsch1978'] = {'Schubert\'s compositions (references)'},
['CITEREFDeutsche_Autos,_Band_2,2001'] = {'Deutsche Autos-2'},
['CITEREFDeutsche_Autos,_Band_3,2001'] = {'Deutsche Autos-3'},
['CITEREFDeutsche_Autos,_Band_4,2001'] = {'Deutsche Autos-4'},
['CITEREFDeutsche_Autos,_Band_5,2001'] = {'Deutsche Autos-5'},
['CITEREFDeutsche_Autos,_Band_6,2001'] = {'Deutsche Autos-6'},
['CITEREFDewick2005'] = {'Dewick-Atlas'},
['CITEREFDiamonstein-Spielvogel2011'] = {'Cite landmarks'},
['CITEREFDickens2018'] = template_names['ODLA'],
['CITEREFDienKnapp2019'] = {'Cite Cambridge History of China'},
['CITEREFDirksen1998'] = {'Bach\'s compositions (sources)'},
['CITEREFDirksen2010'] = {'Bach\'s compositions (sources)'},
['CITEREFDirksen2016'] = {'Bach\'s compositions (sources)'},
['CITEREFDixmier1984'] = {'Dixmier General Topology'},
['CITEREFDoganis1930'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFDoleckiMynard2016'] = {'Dolecki Mynard Convergence Foundations Of Topology'},
['CITEREFDolkart1998'] = {'Cite morningside'},
['CITEREFDonaghy1972'] = {'Donaghy-LMR'},
['CITEREFDonohue2003'] = {'The Buwayhid Dynasty in Iraq'},
['CITEREFDorin1972'] = {'Dorin-North Western'},
['CITEREFDow1985'] = {'Dow-GC1', 'Dow-GC2', 'Dow-GC3'},
['CITEREFDowney2007'] = {'Downey-Chicago'},
['CITEREFDrummond1964'] = {'HistoryofParliament'},
['CITEREFDrury1985'] = {'Drury Historical Guide 1985'},
['CITEREFDrury1993'] = {'Drury-North American Steam'},
['CITEREFDugundji1966'] = {'Dugundji Topology'},
['CITEREFDuke1995'] = {'Duke-Santa Fe-1'},
['CITEREFDukeKeilty1990'] = {'Duke-RDC'},
['CITEREFDumbarton_Oaks_Hagiography_Database'] = {'Dumbarton Oaks Hagiography Database'},
['CITEREFDunbar1969'] = {'Dunbar-Railroads'},
['CITEREFDuncan-Jones2010'] = {'Shakespeare sonnets bibliography'},
['CITEREFDunlop1895'] = {'O\'Donnell family tree'},
['CITEREFDunn2013'] = {'Dunn-Comeng-5'},
['CITEREFDurham1998'] = {'California\'s Geographic Names'},
['CITEREFDurrant1972'] = {'Durrant-Steam Locos Eastern Europe'},
['CITEREFDurrant1981'] = {'Durrant-Garratt-Rev'},
['CITEREFDurrantLewisJorgensen1981'] = {'Durrant-SteamAfrica'},
['CITEREFDömlingKohlhase1971'] = {'Bach\'s compositions (sources)'},
['CITEREFDürr1952'] = {'Bach\'s compositions (sources)'},
['CITEREFDürr1954'] = {'Bach\'s compositions (sources)'},
['CITEREFDürr1987'] = {'Bach\'s compositions (sources)'},
['CITEREFDürrJones2006'] = {'Bach\'s compositions (sources)'},
['CITEREFDürrKobayashi1998'] = {'Bach\'s compositions (sources)'},
----------< E >----------
['CITEREFEarle2018'] = {'Gymnosperm Database'},
['CITEREFEaston1897'] = {'Eastons', 'EBD'},
['CITEREFEbata2019'] = {'BDh'},
['CITEREFEbata2020'] = {'BDh'},
['CITEREFEdwards1995'] = {'Edwards Functional Analysis Theory and Applications'},
['CITEREFEichberg1976'] = {'Bach\'s compositions (sources)'},
['CITEREFEl-Hibri2010'] = {'New Cambridge History of Islam'},
['CITEREFEl-Hibri2021'] = {'The Abbasid Caliphate: A History'},
['CITEREFEldredgeHorenstein2014'] = {'Cite concrete'},
['CITEREFElsholz1982'] = {'Schubert\'s compositions (references)'},
['CITEREFEppstein1966'] = {'Bach\'s compositions (sources)'},
['CITEREFEppstein1982'] = {'Bach\'s compositions (sources)'},
['CITEREFEquasis'] = {'Csr', 'Cite ship register'},
['CITEREFEsposito1959'] = {'West Point Atlas of American Wars-1'},
['CITEREFEuDaly2009'] = {'Complete Book of North American Railroading'},
['CITEREFEuDalySchaferJessupBoyd2009'] = {'Complete Book of North American Railroading'},
----------< F >----------
['CITEREFFairbank1978'] = {'Cite Cambridge History of China'},
['CITEREFFairbank1983'] = {'Cite Cambridge History of China'},
['CITEREFFairbankFeuerwerker1986'] = {'Cite Cambridge History of China'},
['CITEREFFairbankLiu1980'] = {'Cite Cambridge History of China'},
['CITEREFFang1943'] = {'Cite ECCP'},
['CITEREFFarinella2001'] = {'DBI'},
['CITEREFFeder1958'] = {'Bach\'s compositions (sources)'},
['CITEREFFederal_Writers'_Project1939'] = {'Cite fednyc'},
['CITEREFFernandez1983'] = {'Fernandez1983'},
['CITEREFFerneyhough1980'] = {'Ferneyhough-LMR'},
['CITEREFFiaccadori1991'] = template_names['ODB'],
['CITEREFFine1991'] = {'The Early Medieval Balkans'},
['CITEREFFine1994'] = {'The Late Medieval Balkans'},
['CITEREFFitzpatrickLink1960'] = {'Nebraska Place-Names'},
['CITEREFFleetKrämerMatringeNawas'] = {'Encyclopaedia of Islam, THREE','EI3'},
['CITEREFFletcher,_Great_Tank_Scandal'] = {'Book-Fletcher-Great Tank Scandal'},
['CITEREFFletcher,_Universal_Tank'] = {'Book-Fletcher-Universal Tank'},
['CITEREFFlora_of_China'] = {'EFloras'},
['CITEREFFlora_of_North_America'] = {'EFloras'},
['CITEREFFlora_of_North_America2009'] = {'EFloras'},
['CITEREFFluckMarshallWilson1996'] = {'FluMarWil-LocRailCR'},
['CITEREFFonstad1991'] = template_names['ME-ref'],
['CITEREFFordCrowther1922'] = {'Ford1922'},
['CITEREFForkelTerry1920'] = {'Bach\'s compositions (sources)'},
['CITEREFFornaçon,_Siegfried1957'] = template_names['NDB'],
['CITEREFForrestal1999'] = {'Forrestal-Wineries'},
['CITEREFForster1990'] = {'Cite DCB'},
['CITEREFFoss1991'] = template_names['ODB'],
['CITEREFFoster1971'] = template_names['ME-ref'],
['CITEREFFoster1996'] = {'Foster-Field Guide'},
['CITEREFFouracre2005'] = {'New Cambridge Medieval History'},
['CITEREFFrailey2010'] = {'Frailey-Twilight'},
['CITEREFFranke1994'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFFranke1994'] = {'Cite Cambridge History of China'},
['CITEREFFrankeTwitchett1994'] = {'Cite Cambridge History of China'},
['CITEREFFranz_Schnorr_von_Carolsfeld1883'] = {'Cite ADB'},
['CITEREFFriedrich_Wilhelm_Bautz1975'] = {'BBKL'},
['CITEREFFriedrich_Wilhelm_Bautz1990'] = {'BBKL'},
['CITEREFFry1964'] = {'RCTS-LocosLNER-7', 'RCTS-LocosLNER'},
['CITEREFFry1966'] = {'RCTS-LocosLNER-5', 'RCTS-LocosLNER'},
['CITEREFFryHooleMannersNeve1981'] = {'RCTS-LocosLNER-3C', 'RCTS-LocosLNER'},
['CITEREFFubini2012'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFFudenbergTirole1991'] = {'Cite Fudenberg Tirole 1991'},
['CITEREFFultonHarris1991'] = {'Fulton-Harris'},
----------< G >----------
['CITEREFGaines2008'] = {'Cite Gaines 2008'},
['CITEREFGardner2005'] = {'MSW3 Microbiotheria'},
['CITEREFGardoni2015'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFGareyJohnson1979'] = {'Garey-Johnson'},
['CITEREFGarth2003'] = template_names['ME-ref'],
['CITEREFGeanakoplos1959'] = {'Emperor Michael Palaeologus and the West'},
['CITEREFGeorg_von_Dadelsen1953'] = template_names['NDB'],
['CITEREFGiannasi1975'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFGibb1923'] = {'The Arab Conquests in Central Asia'},
['CITEREFGibbs1964'] = {'Gibbs-Graveyard'},
['CITEREFGil1997'] = {'A History of Palestine, 634-1099', 'A History of Palestine, 634–1099'},
['CITEREFGillham1988'] = {'Gillham-Electric'},
['CITEREFGillham2001'] = {'Gillham-Waterloo-City'},
['CITEREFGilliland1969'] = {'Gilliland'},
['CITEREFGilliland1994'] = {'Pop Chronicles 40s'},
['CITEREFGilliverMarshallWeiner2006'] = template_names['ME-ref'],
['CITEREFGilmanPeckColby1905'] = {'Cite NIE', 'New International Encyclopedia', 'NIE'},
['CITEREFGilmanPeckColby1916'] = {'New International Encyclopedia', 'NIE'},
['CITEREFGleaves1921'] = {'Gleaves'},
['CITEREFGlischinski1997'] = {'Glischinski-Santa Fe'},
['CITEREFGlöckner1983'] = {'Bach\'s compositions (sources)'},
['CITEREFGoldberg1981'] = {'Goldberg-Amtrak'},
['CITEREFGordon2001'] = {'Gordon-The Breaking of a Thousand Swords'},
['CITEREFGraham1974'] = {'Cite DCB'},
['CITEREFGrant1994'] = {'Grant-Death'},
['CITEREFGrant2010'] = {'Grant-Twilight'},
['CITEREFGrant2017'] = {'Grant-RailCo'},
['CITEREFGreenlaw2007'] = {'Greenlaw-Via Rail'},
['CITEREFGreenwoodEarnshaw1997'] = {'Greenwood&Earnshaw2nd'},
['CITEREFGregory1991'] = template_names['ODB'],
['CITEREFGregoryKazhdan1991'] = template_names['ODB'],
['CITEREFGregoryŠevčenko1991'] = template_names['ODB'],
['CITEREFGrete_Schemann1957'] = template_names['NDB'],
['CITEREFGrey2002'] = {'Australian Dictionary of Biography'},
['CITEREFGrierson1903'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGrierson1908'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGrierson1919'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGrierson1967'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGriffith1991'] = template_names['ODB'],
['CITEREFGriffithsSmith1999'] = {'Griffiths-Sheds1'},
['CITEREFGriffithsSmith2000'] = {'Griffiths-Sheds2'},
['CITEREFGrothendieck1955'] = {'Grothendieck Produits Tensoriels Topologiques et Espaces Nucléaires'},
['CITEREFGrothendieck1973'] = {'Grothendieck Topological Vector Spaces'},
['CITEREFGrothendieckDieudonné1960'] = {'EGA'},
['CITEREFGrothendieckDieudonné1961'] = {'EGA'},
['CITEREFGrothendieckDieudonné1963'] = {'EGA'},
['CITEREFGrothendieckDieudonné1964'] = {'EGA'},
['CITEREFGrothendieckDieudonné1965'] = {'EGA'},
['CITEREFGrothendieckDieudonné1966'] = {'EGA'},
['CITEREFGrothendieckDieudonné1967'] = {'EGA'},
['CITEREFGrothendieckDieudonné1971'] = {'EGA'},
['CITEREFGroves2005'] = {'MSW3 Primates', 'MSW3 Groves'},
['CITEREFGrubb2005'] = {'MSW3 Artiodactyla'},
['CITEREFGuilland1967'] = {'Recherches sur les institutions byzantines'},
['CITEREFGulino2005'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFGunzburg1984'] = {'Gunzburg-History WAGR Steam'},
['CITEREFGunzburg1989'] = {'Gunzburg-MRWA Locomotives'},
----------< H >----------
['CITEREFHaarer2018'] = template_names['ODLA'],
['CITEREFHaldon1999'] = {'Warfare, State and Society in the Byzantine World, 565–1204'},
['CITEREFHalliday1985'] = {'Halliday-AustWineCompend'},
['CITEREFHalliday2008'] = {'Halliday-JHWAtlasAust2008'},
['CITEREFHalliday2009'] = {'Halliday-AustWineEncyc'},
['CITEREFHalm1991'] = {'Das Reich des Mahdi'},
['CITEREFHalm2003'] = {'Die Kalifen von Kairo'},
['CITEREFHalm2014'] = {'Kalifen und Assassinen'},
['CITEREFHalmos1982'] = {'Halmos A Hilbert Space Problem Book 1982'},
['CITEREFHalpenny1990'] = {'Canadabio'},
['CITEREFHammondAnderson1993'] = template_names['ME-ref'],
['CITEREFHammondScull1995'] = template_names['ME-ref'],
['CITEREFHammondScull2005'] = template_names['ME-ref'],
['CITEREFHammondScull2006'] = template_names['ME-ref'],
['CITEREFHans_Heinrich_Borcherdt1955'] = template_names['NDB'],
['CITEREFHans_Knudsen1972'] = template_names['NDB'],
['CITEREFHansen1988'] = {'Book-Hansen-US Nuclear Weapons'},
['CITEREFHartshorne1977'] = {'Hartshorne AG'},
['CITEREFHasumi2003'] = {'Hasumi-shiguehiko-ozu-2003'},
['CITEREFHaswell-Smith2004'] = {'Haswell-Smith'},
['CITEREFHaugic1908'] = {'Schaff-Herzog'},
['CITEREFHawting1987'] = {'The First Dynasty of Islam'},
['CITEREFHawting2000'] = {'The First Dynasty of Islam'},
['CITEREFHaynes2011'] = {'RubberBible92nd'},
['CITEREFHeinichen1728'] = {'Bach\'s compositions (sources)'},
['CITEREFHeinrich_Welti1890'] = {'Cite ADB'},
['CITEREFHeitman1903'] = {'Historical Register and Dictionary of the United States Army-1', 'Historical Register and Dictionary of the United States Army-2'},
['CITEREFHelgen2005'] = {'MSW3 Scandentia'},
['CITEREFHellmann1965'] = {'Bach\'s compositions (sources)'},
['CITEREFHenderson2004'] = {'Cite History of New York Playhouses'},
['CITEREFHenrici1725'] = {'Bach\'s compositions (sources)'},
['CITEREFHenryOrsmond1928'] = {'Raiatea family tree'},
['CITEREFHermann_Palm1876'] = {'Cite ADB'},
['CITEREFHerr2000'] = {'Herr-LN'},
['CITEREFHeschel2007'] = {'Encyclopaedia Judaica', 'Cite EJ', 'Cite Encyclopaedia Judaica'},
['CITEREFHidyHidyScottHofsummer2004'] = {'Hidy-Great Northern'},
['CITEREFHildHellenkemper1990'] = {'Tabula Imperii Byzantini'},
['CITEREFHildHellenkemper1994'] = {'Tabula Imperii Byzantini'},
['CITEREFHildRestle1981'] = {'Tabula Imperii Byzantini'},
['CITEREFHills,_Power_from_Steam'] = {'Book-Hills-Power from Steam'},
['CITEREFHills1989'] = {'Book-Hills-Power from Steam'},
['CITEREFHilmarJestremski2004'] = {'Schubert\'s compositions (references)'},
['CITEREFHilton1980'] = {'Hilton-Amtrak'},
['CITEREFHilton1990'] = {'Hilton Narrow Gauge'},
['CITEREFHiltonDue1960'] = {'Hilton-Interurban'},
['CITEREFHinton1986'] = {'HistoryofParliament'},
['CITEREFHirsch1906'] = {'Cite JE1906'},
['CITEREFHistoric_England'] = {'NHLE', 'National Heritage List for England'},
['CITEREFHistoric_England_Benty_Grange'] = {'NHLE'},
['CITEREFHistoric_Environment_Scotland'] = {'Canmore'},
['CITEREFHistoric_Environment_Scotland1972'] = {'Historic Environment Scotland'},
['CITEREFHistoric_Environment_Scotland1976'] = {'Historic Environment Scotland'},
['CITEREFHistoric_Environment_Scotland2020'] = {'Historic Environment Scotland'},
['CITEREFHistoric_Environment_Scotland:_Rusco_Tower2020'] = {'Historic Environment Scotland'},
['CITEREFHob.'] = {'Schubert\'s compositions (references)'},
['CITEREFHoffmanSmith2005'] = {'MSW3 Lagomorpha'},
['CITEREFHoffmann1738'] = {'Bach\'s compositions (sources)'},
['CITEREFHofmann1983'] = {'Bach\'s compositions (sources)'},
['CITEREFHofmann1987'] = {'Bach\'s compositions (sources)'},
['CITEREFHofmann1999'] = {'Bach\'s compositions (sources)'},
['CITEREFHolland1972'] = {'Holland-Vol 2'},
['CITEREFHolland1988'] = {'Cite DCB'},
['CITEREFHolland1989'] = {'Holland1989'},
['CITEREFHolland2001'] = {'Holland-Classic'},
['CITEREFHollingsworth1980'] = {'Hollingsworth-Atlas-Rigby'},
['CITEREFHollingsworth1991'] = template_names['ODB'],
['CITEREFHollingsworthCutler1991'] = template_names['ODB'],
['CITEREFHolmgren2003'] = {'EFloras'},
['CITEREFHoltBiddle1986'] = {'Holt-NorthWest'},
['CITEREFHolton1989'] = {'Holton-Reading-1'},
['CITEREFHonigmann1935'] = {'Byzance et les Arabes'},
['CITEREFHopley1983'] = {'Australian Dictionary of Biography'},
['CITEREFHort1911'] = {'DCBL'},
['CITEREFHorváth1966'] = {'Horváth Topological Vector Spaces and Distributions Volume 1 1966'},
['CITEREFHounshell1984'] = {'Hounshell1984'},
['CITEREFHovannisian1967'] = {'Cite Armenia on the Road to Independence'},
['CITEREFHovannisian1971'] = {'Cite The Republic of Armenia Volume 1'},
['CITEREFHovannisian1982'] = {'Cite The Republic of Armenia Volume 2'},
['CITEREFHovannisian1996'] = {'Cite The Republic of Armenia Volume 3', 'Cite The Republic of Armenia Volume 4'},
['CITEREFHowes1995'] = {'Howes Modern Analysis and Topology 1995'},
['CITEREFHudson1997'] = {'Country study'},
['CITEREFHughes1979'] = {'Hughes-SteamLocosIndia3'},
['CITEREFHughes1990'] = {'Hughes-IndianLocos1'},
['CITEREFHughes1992'] = {'Hughes-IndianLocos2'},
['CITEREFHughes1994'] = {'Hughes-IndianLocos3'},
['CITEREFHughes1996'] = {'Hughes-IndianLocos4'},
['CITEREFHummel1943'] = {'Cite ECCP'},
['CITEREFHumphreys2018'] = template_names['ODLA'],
['CITEREFHunter-Crawley2018'] = template_names['ODLA'],
['CITEREFHunter1949'] = {'Hunter-Steamboats-1949'},
['CITEREFHunter1993'] = {'Hunter-Steamboats-1993'},
['CITEREFHunter2008'] = {'Country study'},
['CITEREFHunter2012'] = {'Cite HGOC', 'Cite Hunter'},
['CITEREFHutterer2005'] = {'MSW3 Soricomorpha'},
['CITEREFHütter2012'] = {'Hütter-50bis53'},
['CITEREFHütter2015'] = {'Hütter-54bis59'},
['CITEREFHütter2021'] = {'Hütter-60bis91'},
----------< I >----------
['CITEREFIacocca1984'] = {'Iacocca1984'},
['CITEREFIbn_Khallikan1843'] = {'Ibn Khallikan\'s Biographical Dictionary'},
['CITEREFImber2002'] = {'Imber-The Ottoman Empire, 1300–1650'},
['CITEREFInalcik1989'] = {'Setton-A History of the Crusades'},
['CITEREFIshino1998'] = {'Teishajo'},
['CITEREFIvey1919'] = {'Ivey-Marquette'},
----------< J >----------
['CITEREFJackson1908'] = {'Schaff-Herzog'},
['CITEREFJackson1995'] = {'Cite enc-nyc'},
['CITEREFJackson2010'] = {'Cite enc-nyc2'},
['CITEREFJacobs1904'] = {'Cite Jewish Encyclopedia'},
['CITEREFJarchow1981'] = {'Jarchow Locally Convex Spaces'},
['CITEREFJohn_O'Donovan1856'] = {'Cite AFM'},
['CITEREFJohnson1906'] = {'BDA1906', 'Cite BDA1906'},
['CITEREFJohnstonWelshSchafer2001'] = {'Johnston-Streamliner'},
['CITEREFJones2000'] = {'New Cambridge Medieval History'},
['CITEREFJones2011'] = {'Cite EPD'},
['CITEREFJordan2002'] = {'Jordan-WineWABest'},
['CITEREFJoshi1983'] = {'Joshi Introduction to General Topology'},
['CITEREFJoslen2003'] = {'Joslen-OOB'},
['CITEREFJowett1867'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFJowett1989'] = {'Jowett-Atlas', 'Carnarvonshire Railway'},
['CITEREFJowett2000'] = {'Jowett-Nationalised'},
['CITEREFJullien2018'] = template_names['ODLA'],
['CITEREFJupp1986'] = {'HistoryofParliament'},
----------< K >----------
['CITEREFK.'] = {'Schubert\'s compositions (references)'},
['CITEREFKadinsky2016'] = {'Cite Hidden Waters NYC'},
['CITEREFKaegi1991'] = template_names['ODB'],
['CITEREFKalla-Bishop1986'] = {'Kalla-Bishop-FS-Steam'},
['CITEREFKamp1981'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFKang2008'] = {'Country study'},
['CITEREFKarl_Frohnmeyer1953'] = template_names['NDB'],
['CITEREFKarnow1989'] = {'Cite-Karnow'},
['CITEREFKartesz2014'] = {'BONAP'},
['CITEREFKazemzadeh1951'] = {'Cite The Struggle for Transcaucasia'},
['CITEREFKazemzadeh1951'] = {'The Struggle for Transcaucasia'},
['CITEREFKazhdan1991'] = template_names['ODB'],
['CITEREFKazhdanCutler1991'] = template_names['ODB'],
['CITEREFKazhdanJeffreys1991'] = template_names['ODB'],
['CITEREFKazhdanŠevčenko1991'] = template_names['ODB'],
['CITEREFKeefe2006'] = {'Schubert\'s compositions (references)'},
['CITEREFKeightley1999'] = {'Cite Cambridge History of China'},
['CITEREFKeller1937'] = {'Bach\'s compositions (sources)'},
['CITEREFKelley1975'] = {'Kelley General Topology'},
['CITEREFKelly1988'] = {'Cite GEIL'},
['CITEREFKellyBurrage1920'] = {'Cite AMB1920'},
['CITEREFKennedy1998'] = {'The Cambridge History of Egypt', 'Cite Kennedy 1998', 'Cambridge History of Egypt'},
['CITEREFKennedy2001'] = {'Kennedy-The Armies of the Caliphs'},
['CITEREFKennedy2004'] = {'The Prophet and the Age of the Caliphates'},
['CITEREFKennedy2007'] = {'Kennedy-The Great Arab Conquests'},
['CITEREFKennedy2016'] = {'The Prophet and the Age of the Caliphates'},
['CITEREFKenyon2011'] = {'Bach\'s compositions (sources)'},
['CITEREFKerrigan1995'] = {'Shakespeare sonnets bibliography'},
['CITEREFKhaleelulla1982'] = {'Khaleelulla Counterexamples in Topological Vector Spaces'},
['CITEREFKhan2012'] = {'Cite Banglapedia'},
['CITEREFKim1994'] = {'Country study'},
['CITEREFKirnberger1774'] = {'Bach\'s compositions (sources)'},
['CITEREFKirnberger1780'] = {'Bach\'s compositions (sources)'},
['CITEREFKlein2006'] = {'Klein-UP-2'},
['CITEREFKobayashi1978'] = {'Bach\'s compositions (sources)'},
['CITEREFKoderHild1976'] = {'Tabula Imperii Byzantini'},
['CITEREFKoderSoustalKoder1998'] = {'Tabula Imperii Byzantini'},
['CITEREFKoeppel2015'] = {'Cite citygrid'},
['CITEREFKofos1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFKohler1902'] = {'Cite Jewish Encyclopedia'},
['CITEREFKolde1914'] = {'Schaff-Herzog'},
['CITEREFKoliopoulos1978'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFKolmogorovFomin1957'] = {'Kolmogorov Fomin Elements of the Theory of Functions and Functional Analysis'},
['CITEREFKonrad_Ameln1985'] = template_names['NDB'],
['CITEREFKorkotyan1932'] = {'Cite The Population of Soviet Armenia'},
['CITEREFKoska2011'] = {'Bach\'s compositions (sources)'},
['CITEREFKratville1962'] = {'Kratville-SSL'},
['CITEREFKretzschmar1910'] = {'Bach\'s compositions (sources)'},
['CITEREFKube2009'] = {'Schubert\'s compositions (references)'},
['CITEREFKubrusly2011'] = {'Kubrusly The Elements of Operator Theory 2nd Edition 2011'},
['CITEREFKulp1972'] = {'Kulp-Lehigh and New England'},
['CITEREFKuznik2008'] = {'Bach\'s compositions (sources)'},
['CITEREFKöthe1969'] = {'Köthe Topological Vector Spaces I'},
['CITEREFKöthe1979'] = {'Köthe Topological Vector Spaces II'},
['CITEREFKöthe1983'] = {'Köthe Topological Vector Spaces I'},
['CITEREFKülzer2008'] = {'Tabula Imperii Byzantini'},
----------< L >----------
['CITEREFLa_Porta2018'] = template_names['ODLA'],
['CITEREFLacourcière1974'] = {'Cite DCB'},
['CITEREFLadefogedMaddieson1996'] = {'SOWL'},
['CITEREFLandau-Tasseron2010'] = {'New Cambridge History of Islam'},
['CITEREFLandauCondit1996'] = {'Cite nysky'},
['CITEREFLandmann1907'] = {'Bach\'s compositions (sources)'},
['CITEREFLang2002'] = {'Lang Algebra'},
['CITEREFLane1973'] = {'Venice: A Maritime Republic'},
['CITEREFLaërtius1925'] = {'Cite Lives of the Eminent Philosophers', 'Cite LotEP'},
['CITEREFLe_Quien1740'] = {'Oriens Christianus'},
['CITEREFLe_Strange1900'] = {'Baghdad During the Abbasid Caliphate'},
['CITEREFLe_Strange1905'] = {'Lands of the Eastern Caliphate'},
['CITEREFLe_Strange1922'] = {'Baghdad During the Abbasid Caliphate'},
['CITEREFLeblanc1979'] = {'Cite DCB'},
['CITEREFLee1903'] = {'Cite DNBIE'},
['CITEREFLee2018'] = template_names['ODLA'],
['CITEREFLegifrance'] = {'Cite Legifrance', 'Cite Légifrance'},
['CITEREFLeisingerWollny1993'] = {'Bach\'s compositions (sources)'},
['CITEREFLev1999'] = {'Saladin in Egypt'},
['CITEREFLevitan2001'] = {'Springer'},
['CITEREFLewin1925'] = {'Lewin-EarlyRail'},
['CITEREFLewis1969'] = {'Setton-A History of the Crusades'},
['CITEREFLewis1986'] = {'Lewis-Shortline-1986'},
['CITEREFLewis1991'] = {'Lewis-Shortline-1991'},
['CITEREFLewis1996'] = {'Lewis-Shortline-1996'},
['CITEREFLi2002'] = {'Cite Cambridge History of China'},
['CITEREFLiederNet_Archive'] = {'Schubert\'s compositions (references)'},
['CITEREFLighthouses_of_Australia_Inc'] = {'Cite loa'},
['CITEREFLilieLudwigPratschZielke1998–2013'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke1999'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2000'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2001'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2002'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2009'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2013'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLind1986'] = {'Lind-Limiteds'},
['CITEREFLindsay1968'] = {'Lindsay-CanalScot'},
['CITEREFLittle1974'] = {'Cite DCB'},
['CITEREFLoeweShaughnessy1999'] = {'Cite Cambridge History of China'},
['CITEREFLohrThielmann1988'] = {'Lohr-EFA2.7'},
['CITEREFLongnon1969'] = {'Setton-A History of the Crusades'},
['CITEREFLoverance2018'] = template_names['ODLA'],
['CITEREFLowryMcCardle1974'] = {'A History of Mississippi'},
['CITEREFLukonin1983'] = {'Cambridge History of Iran'},
['CITEREFLurie'] = {'Lurie-HA'},
['CITEREFLuscombeRiley-Smith2004'] = {'New Cambridge Medieval History'},
['CITEREFLuttrell1975'] = {'Setton-A History of the Crusades'},
['CITEREFLuttrell1987'] = {'DBI'},
['CITEREFLynch2004'] = {'Lynch-Penn Central'},
['CITEREFLynch2005'] = {'Lynch-New Haven passenger'},
['CITEREFLynch2018'] = template_names['ODLA'],
['CITEREFLéger1990'] = {'Cite DCB'},
['CITEREFle_Fleming1953'] = {'RCTS-LocosGWR-8'},
['CITEREFle_Fleming1954'] = {'RCTS-LocosGWR-7'},
['CITEREFle_Fleming1958'] = {'RCTS-LocosGWR-5'},
['CITEREFle_Fleming1960'] = {'RCTS-LocosGWR-8'},
['CITEREFle_Fleming1962'] = {'RCTS-LocosGWR-9'},
----------< M >----------
['CITEREFMacDermot1927'] = {'Infobox GWR'},
['CITEREFMacDermot1931'] = {'Infobox GWR'},
['CITEREFMacFarquharFairbank1987'] = {'Cite Cambridge History of China'},
['CITEREFMacFarquharFairbank1991'] = {'Cite Cambridge History of China'},
['CITEREFMachinery's_Handbook1996'] = {'MachinerysHandbook25e'},
['CITEREFMacMullen1970'] = {'MacMullen-Paddle-Wheel'},
['CITEREFMadelung1978'] = {'EI2'},
['CITEREFMagdalino2002'] = {'The Empire of Manuel I Komnenos'},
['CITEREFMaiken1989'] = {'Maiken-Night Trains'},
['CITEREFMailer2004'] = {'Mailer-Omaha Road'},
['CITEREFManfred_Knedlik2007'] = {'BBKL'},
['CITEREFMarre1995'] = {'Marre-diesel-50'},
['CITEREFMarshall1823'] = {'Cite RNB1823'},
['CITEREFMarshall1824'] = {'Cite RNB1823'},
['CITEREFMarshall1825'] = {'Cite RNB1823'},
['CITEREFMarshall1827'] = {'Cite RNB1823'},
['CITEREFMarshall1828'] = {'Cite RNB1823'},
['CITEREFMarshall1829'] = {'Cite RNB1823'},
['CITEREFMarshall1830'] = {'Cite RNB1823'},
['CITEREFMarshall1831'] = {'Cite RNB1823'},
['CITEREFMarshall1832'] = {'Cite RNB1823'},
['CITEREFMarshall1833'] = {'Cite RNB1823'},
['CITEREFMarshall1835'] = {'Cite RNB1823'},
['CITEREFMarshall1969'] = {'Lancashire & Yorkshire Railway 1'},
['CITEREFMarshall1970'] = {'Lancashire & Yorkshire Railway 2'},
['CITEREFMarshall1972'] = {'Lancashire & Yorkshire Railway 3'},
['CITEREFMarshall2001'] = {'Marshall-INGSR'},
['CITEREFMartin_Persch1992'] = {'BBKL'},
['CITEREFMartin_Persch1993'] = {'BBKL'},
['CITEREFMartin_Persch1996'] = {'BBKL'},
['CITEREFMartindale1980'] = {'Prosopography of the Later Roman Empire', 'PLRE'},
['CITEREFMartindale1992'] = {'Prosopography of the Later Roman Empire', 'PLRE'},
['CITEREFMartindaleJonesMorris1971'] = {'Prosopography of the Later Roman Empire', 'PLRE'},
['CITEREFMaul2005'] = {'Bach\'s compositions (sources)'},
['CITEREFMayGray2006'] = {'MayGray-WAGRPassCar'},
['CITEREFMcArthurMcArthur2003'] = {'Cite ogn', 'Cite OGN', 'Cite Oregon Geographic Names'},
['CITEREFMcCorduck2004'] = {'McCorduck 2004'},
['CITEREFMcCurdyRogers1902'] = {'Cite Jewish Encyclopedia'},
['CITEREFMcDonnell2015'] = {'McDonnell-Locomotives-2nd'},
['CITEREFMcGeerNesbittOikonomides2001'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFMcGeerNesbittOikonomides2005'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFMcGhee2008'] = {'Cite McGhee 2008'},
['CITEREFMcKitterick1995'] = {'New Cambridge Medieval History'},
['CITEREFMeiningen1704'] = {'Bach\'s compositions (sources)'},
['CITEREFMeints1992'] = {'Meints-Companies'},
['CITEREFMeints2005'] = {'Meints-Lines'},
['CITEREFMelamed1988'] = {'Bach\'s compositions (sources)'},
['CITEREFMelamed1995'] = {'Bach\'s compositions (sources)'},
['CITEREFMennell1892'] = {'Dictionary of Australasian Biography'},
['CITEREFMetcalfe2009'] = {'The Muslims of Medieval Italy'},
['CITEREFMiddleton1961'] = {'Middleton-Interurban'},
['CITEREFMiddleton2001'] = {'Middleton-Electrified-2nd'},
['CITEREFMiddleton2002'] = {'Middleton-PRR-Under-Wire'},
['CITEREFMiddletonSmerkDiehl2007'] = {'Encyclopedia of North American Railroads'},
['CITEREFMillar2011'] = {'NZR Steam Locomotive'},
['CITEREFMiller1908'] = {'The Latins in the Levant', 'Latins in the Levant'},
['CITEREFMiller1921'] = {'Essays on the Latin Orient'},
['CITEREFMills1977'] = {'Mills-Columbia'},
['CITEREFMinnich2008'] = {'Country study'},
['CITEREFMiramar_Ship_Index'] = {'Csr', 'Cite ship register'},
['CITEREFMitchell1965'] = {'Mitchell TOC'},
['CITEREFMittermeierKonstantHawkinsLouis2006'] = {'LoM2'},
['CITEREFMittermeierLouisRichardsonSchwitzer2010'] = {'LoM3'},
['CITEREFMittermeierTattersallKonstantMeyers1994'] = {'LoM1'},
['CITEREFMoore1875'] = {'Cite CEM'},
['CITEREFMorana1993'] = {'Bach\'s compositions (sources)'},
['CITEREFMorrison1999'] = {'Cite Morrison Broadway'},
['CITEREFMoschonas1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFMoteTwitchett1988'] = {'Cite Cambridge History of China'},
['CITEREFMozartHaydnHaydn2008'] = {'Schubert\'s compositions (references)'},
['CITEREFMullié1852'] = {'Cite Mullié', 'Mullié'},
['CITEREFMunkres1974'] = {'Munkres Topology'},
['CITEREFMunkres2000'] = {'Munkres Topology'},
['CITEREFMurray2006'] = {'Murray-Illinois Central'},
['CITEREFMusserCarleton2005'] = {'MSW3 Muroidea'},
['CITEREFMyersWang2002'] = {'Cite Cambridge History of China'},
['CITEREFMyrick1992'] = {'Railroads of Nevada and Eastern California 1', 'Railroads of Nevada and Eastern California 2'},
['CITEREFMüller,_Hans-Christian1966'] = template_names['NDB'],
----------< N >----------
['CITEREFNSA_II,_15'] = {'Schubert\'s compositions (references)'},
['CITEREFNSA_scores'] = {'Schubert\'s compositions (references)'},
['CITEREFNSA_website'] = {'Schubert\'s compositions (references)'},
['CITEREFNariciBeckenstein2011'] = {'Narici Beckenstein Topological Vector Spaces'},
['CITEREFNemiroffBonnell1998'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2004'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2005'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2006'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2007'] = {'Cite APOD'},
['CITEREFNersessian2018'] = template_names['ODLA'],
['CITEREFNesbittMorrisson2009'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNesbittOikonomides1991'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNesbittOikonomides1994'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNesbittOikonomides1996'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNestruev2020'] = {'Nestruev Smooth Manifolds and Observables 2020'},
['CITEREFNeukirch1999'] = {'Neukirch ANT'},
['CITEREFNeukirchSchmidtWingberg2000'] = {'Neukirch et al. CNF'},
['CITEREFNew_Cambridge_Medieval_History'] = {'New Cambridge Medieval History'},
['CITEREFNew_York_City_Landmarks_Preservation_CommissionDolkartPostal2009'] = {'Cite nycland'},
['CITEREFNewbould1999'] = {'Schubert\'s compositions (references)'},
['CITEREFNicholson2018'] = template_names['ODLA'],
['CITEREFNicholsonCanepaDaryaee2018'] = template_names['ODLA'],
['CITEREFNicol1968'] = {'The Byzantine Family of Kantakouzenos'},
['CITEREFNicol1984'] = {'The Despotate of Epiros, 1267–1479'},
['CITEREFNicol1988'] = {'Byzantium and Venice: A Study in Diplomatic and Cultural Relations'},
['CITEREFNicol1992'] = {'The Immortal Emperor: The Life and Legend of Constantine Palaiologos, Last Emperor of the Romans'},
['CITEREFNicol1993'] = {'The Last Centuries of Byzantium, 1261–1453', 'The Last Centuries of Byzantium'},
['CITEREFNicol1994'] = {'The Byzantine Lady: Ten Portraits, 1250–1500'},
['CITEREFNock1974'] = {'Nock-EustonGlasgow'},
----------< O >----------
['CITEREFO'Byrne1849'] = {'Cite NBD1849'},
['CITEREFO'ConnorRobertson'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'ConnorRobertson1996'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'ConnorRobertson2000'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'ConnorRobertson2004'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'Donoghue1897'] = {'Cite DNB'},
['CITEREFODB'] = template_names['ODB'],
['CITEREFODLA'] = template_names['ODLA'],
['CITEREFOdisheli2018'] = template_names['ODLA'],
['CITEREFOfficial_Army_Register1865'] = {'Official Army Register of the Volunteer Force of the United States Army'},
['CITEREFOfficial_Army_Register1867'] = {'Official Army Register of the Volunteer Force of the United States Army'},
['CITEREFOfficial_Guide_of_the_Railways1950'] = {'Official Guide of the Railways'},
['CITEREFOgorek2012'] = {'Ogorek-South Shore'},
['CITEREFOikonomides1991'] = template_names['ODB'],
['CITEREFOikonomou1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFOrmsby1982'] = {'Cite DCB'},
----------< P >----------
['CITEREFPLP'] = {'Prosopographisches Lexikon der Palaiologenzeit', 'PLP'},
['CITEREFPalmer1875'] = {'Cite ADB'},
['CITEREFPalmerStewart1965'] = {'Palmer & Stewart'},
['CITEREFParkhouse,_BRHIC,_Vol_1'] = {'Book-Parkhouse-BRHIC-1'},
['CITEREFPatience1996'] = {'Patience-SteamTwilight'},
['CITEREFPatton2005'] = {'MSW3 Geomyidae'},
['CITEREFPawson1979'] = {'Pawson-Delaware Valley'},
['CITEREFPaxtonBourne1985'] = {'Paxton-Bourne'},
['CITEREFPeck1898'] = {'HDCA'},
['CITEREFPerlis2001'] = {'Springer'},
['CITEREFPerreault2004'] = {'Bach\'s compositions (sources)'},
['CITEREFPeterson2002'] = {'Cite Cambridge History of China'},
['CITEREFPeterson2016'] = {'Cite Cambridge History of China'},
['CITEREFPetropoulosKoumarianou1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFPetrucci1982'] = {'DBI'},
['CITEREFPfau2008'] = {'Bach\'s compositions (sources)'},
['CITEREFPikros1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFPinkepank1973'] = {'Pinkepank diesel spotters guide 2'},
['CITEREFPlantlist2016'] = {'Plantlist'},
['CITEREFPlaten1976'] = {'Bach\'s compositions (sources)'},
['CITEREFPloumidisAlexiou1974'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFPmbZ'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFPolemis1968'] = {'Polemis-The Doukai'},
['CITEREFPope2007'] = {'Encyclopaedia Judaica', 'Cite EJ', 'Cite Encyclopaedia Judaica'},
['CITEREFPopplewell'] = {'Popplewell-Gazetteer'},
['CITEREFPopplewell1989'] = {'Popplewell-Gazetteer'},
['CITEREFPotts2018'] = template_names['ODLA'],
['CITEREFPottsCanepa2018'] = template_names['ODLA'],
['CITEREFPourshariati2017'] = {'Encyclopædia Iranica Online'},
['CITEREFPozza1992'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFPrawer1985'] = {'Setton-A History of the Crusades'},
['CITEREFPritsak1991'] = template_names['ODB'],
['CITEREFProsopographie_der_mittelbyz._Zeit'] = {'Prosopographie der mittelbyzantinischen Zeit'},
----------< Q >----------
['CITEREFQuick2009'] = {'Quick-Stations'},
['CITEREFQuick2019'] = {'Quick-stations-5'},
['CITEREFQuick2020'] = {'Quick-stations-5'},
['CITEREFQuick2022'] = {'Quick-stations-5'},
['CITEREFQuick2023'] = {'Quick-stations-5.05'},
----------< R >----------
['CITEREFRailway_Atlas2010'] = {'Eisenbahnatlas Italien'},
['CITEREFRailway_Atlas2012'] = {'Eisenbahnatlas Schweiz'},
['CITEREFRailway_Atlas2020'] = {'Eisenbahnatlas Deutschland'},
['CITEREFRailway_Atlas2021'] = {'Eisenbahnatlas Österreich'},
['CITEREFRailway_Atlas2024'] = {'Eisenbahnatlas Schweiz 2024'},
['CITEREFRamaer1974'] = {'Ramaer-SteamLocosEAR'},
['CITEREFRansome-Wallis1971'] = {'Ransome-Wallis 1'},
['CITEREFRansome-Wallis2001'] = {'Ransome-Wallis Encyclopedia'},
['CITEREFRateliff2007'] = template_names['ME-ref'],
['CITEREFRavegnano2000'] = {'DBI'},
['CITEREFReed1953'] = {'RCTS-LocosGWR-2'},
['CITEREFReed1956'] = {'RCTS-LocosGWR-3'},
['CITEREFReed1975'] = {'Reed-Streamline era'},
['CITEREFReed1997'] = {'Schubert\'s compositions (references)'},
['CITEREFReinhard_Tenberg1990'] = {'BBKL'},
['CITEREFRettinghaus2020'] = {'BDh'},
['CITEREFReuter2000'] = {'New Cambridge Medieval History'},
['CITEREFReynolds1921'] = {'Cite Collier\'s', 'Collier\'s'},
['CITEREFReynoldsOroszi2000'] = {'Reynolds-BO'},
['CITEREFRezakhani2018'] = template_names['ODLA'],
['CITEREFRichter2018'] = {'BDh'},
['CITEREFRigo2005'] = template_names['ODB'],
['CITEREFRines1920'] = {'Americana','Cite Americana'},
['CITEREFRipleyDana1863'] = {'New American Cyclopedia'},
['CITEREFRipleyDana1864'] = {'New American Cyclopedia'},
['CITEREFRipleyDana1879'] = {'Cite AmCyc'},
['CITEREFRistaino1988'] = {'Country study'},
['CITEREFRobert_Eitner1891'] = {'Cite ADB'},
['CITEREFRobertson1983'] = {'Robertson-OriginScot'},
['CITEREFRobertson1998'] = {'Robertson-Western Railroad-4'},
['CITEREFRobins2017'] = {'Cite New York Art Deco'},
['CITEREFRockafellarWets2009'] = {'Rockafellar Wets Variational Analysis 2009 Springer'},
['CITEREFRoe1916'] = {'Roe1916'},
['CITEREFRoe1937'] = {'Roe1937'},
['CITEREFRolt1965'] = {'Rolt1965'},
['CITEREFRoltKichenside1982'] = {'Rolt-Red'},
['CITEREFRose1857'] = {'Cite Newgenbio'},
['CITEREFRosenfeld1974'] = template_names['NDB'],
['CITEREFRosenzweigBlackmar1992'] = {'Cite Central Park History', 'Cite Central Park history'},
['CITEREFRowe2002'] = {'Cite Cambridge History of China'},
['CITEREFRowledge1975'] = {'Rowledge-Engines of the LMS'},
['CITEREFRowledge1993'] = {'Rowledge-Irish Steam Register'},
['CITEREFRowlett'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2007'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2012'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2013'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2016'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2017'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowling1997'] = {'HP1ref'},
['CITEREFRowling1998'] = {'HP2ref'},
['CITEREFRowling1999'] = {'HP3ref'},
['CITEREFRowling2000'] = {'HP4ref'},
['CITEREFRowling2003'] = {'HP5ref'},
['CITEREFRowling2005'] = {'HP6ref'},
['CITEREFRowling2007'] = {'HP7ref'},
['CITEREFRudin1973'] = {'Rudin Walter Functional Analysis'},
['CITEREFRudin1991'] = {'Rudin Walter Functional Analysis'},
['CITEREFRunciman1951'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1951–1954'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1952'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1954'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1989'] = {'Runciman-A History of the Crusades'},
['CITEREFRussell1985'] = {'Setton-A History of the Crusades', 'Encyclopædia Iranica Online', 'Encyclopædia Iranica', 'Encyclopaedia Iranica', 'Cite Encyclopædia Iranica Online'},
['CITEREFRussellNorvig2003'] = {'Russell Norvig 2003'},
['CITEREFRybczynski2000'] = {'Rybczynski2000'},
----------< S >----------
['CITEREFSR_staff2013'] = {'Houston family tree'},
['CITEREFSalo2004'] = template_names['ME-ref'],
['CITEREFSanders1998'] = {'The Cambridge History of Egypt', 'Cambridge History of Egypt'},
['CITEREFSanders2003'] = {'Sanders-Indiana'},
['CITEREFSanders2006'] = {'Sanders-Heartland'},
['CITEREFSanders2007'] = {'Sanders-Akron'},
['CITEREFSansom1978'] = {'Sansom-History of Japan-2'},
['CITEREFSarikakis1974'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFSaunders2001'] = {'Saunders-Merging Lines'},
['CITEREFSaunders2013'] = {'Saunders-Giants of the Seas'},
['CITEREFSavadaShaw1992'] = {'Country study'},
['CITEREFSchaeferWolff1999'] = {'Schaefer Wolff Topological Vector Spaces'},
['CITEREFSchafer1991'] = {'All Aboard Amtrak'},
['CITEREFSchafer1996'] = {'Schafer-Classic-Railroads-1'},
['CITEREFSchafer1998'] = {'Schafer-Vintage Diesel'},
['CITEREFSchafer2000'] = {'Schafer-More-Classic'},
['CITEREFSchafer2003'] = {'Schafer-Classic-Railroads-3'},
['CITEREFSchaferSolomon1997'] = {'Schafer-Pennsylvania'},
['CITEREFSchaferWelsh1997'] = {'Schafer-Classic'},
['CITEREFSchaferWelsh2002'] = {'Schafer-Streamliners'},
['CITEREFSchaferWelshHolland2001'] = {'Schafer-American passenger train'},
['CITEREFSchaff-Herzog'] = {'Schaff-Herzog'},
['CITEREFScharf1996'] = {'Scharf-History'},
['CITEREFSchechter1996'] = {'Schechter Handbook of Analysis and Its Foundations'},
['CITEREFScheide1960'] = {'Bach\'s compositions (sources)'},
['CITEREFSchicht1805'] = {'Bach\'s compositions (sources)'},
['CITEREFSchilling1997'] = {'Schilling-pop-culture'},
['CITEREFShirer1960'] = {'Shirer-Third Reich'},
['CITEREFSchlitter2005'] = {'MSW3 Tubulidentata'},
['CITEREFSchmieder1950'] = {'Bach\'s compositions (sources)'},
['CITEREFSchmieder1990'] = {'Bach\'s compositions (sources)'},
['CITEREFSchmitz1870'] = {'Cite DGRBM'},
['CITEREFSchnabel1987'] = {'Schnabel-EFA2.5'},
['CITEREFSchneider1907'] = {'Bach\'s compositions (sources)'},
['CITEREFSchneider1912'] = {'Bach\'s compositions (sources)'},
['CITEREFScholze1736'] = {'Bach\'s compositions (sources)'},
['CITEREFSchroeter1961'] = {'Schroeter-Eisenbahnen'},
['CITEREFSchroeterRamaer1993'] = {'Schroeter-Ramaer-Eisenbahnen'},
['CITEREFSchubert-online'] = {'Schubert\'s compositions (references)'},
['CITEREFSchubert1968'] = {'Schubert Topology'},
['CITEREFSchulenberg2010'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulenberg2013'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulze1980'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulze1983'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulze1984'] = {'Bach\'s compositions (sources)'},
['CITEREFSchwieterman2001'] = {'Schwieterman-Leaves-Eastern'},
['CITEREFSchwieterman2004'] = {'Schwieterman-Leaves-Western'},
['CITEREFScottNegus2011'] = {'Scott-Negus-Cellar Door'},
['CITEREFScribbins1970'] = {'Scribbins-Hiawatha'},
['CITEREFScribbins2007'] = {'Scribbins-Hiawatha-2007'},
['CITEREFScribbins2008'] = {'Scribbins-400-2008', 'Scribbins-Remembered'},
['CITEREFSearle'] = {'Cite sslidx'},
['CITEREFSearle1980'] = {'Searle 1980'},
['CITEREFSemmensGoldfinch2003'] = {'Book-Semmens-Goldfinch-How Steam Locomotives Really Work'},
['CITEREFSetton1975'] = {'Setton-A History of the Crusades'},
['CITEREFSetton1976'] = {'The Papacy and the Levant'},
['CITEREFSetton1978'] = {'The Papacy and the Levant'},
['CITEREFSetton1984'] = {'The Papacy and the Levant'},
['CITEREFSettonHazard1975'] = {'Setton-A History of the Crusades'},
['CITEREFSfyroeras1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFShaughnessy1997'] = {'Shaughnessy-DH'},
['CITEREFShaw1978'] = {'Shaw-RailroadAccidents'},
['CITEREFSherrod1952'] = {'Sherrod-Marine Corps'},
['CITEREFShiji'] = {'Cite Shiji'},
['CITEREFShindo2004'] = {'Kaneto-shindo-shinario-jinsei'},
['CITEREFShippey2001'] = template_names['ME-ref'],
['CITEREFShippey2005'] = template_names['ME-ref'],
['CITEREFShoshani2005'] = {'MSW3 Shoshani'},
['CITEREFShtern2001'] = {'Springer', 'SpringerEOM'},
['CITEREFSiegele1957'] = {'Bach\'s compositions (sources)'},
['CITEREFSilanos2014'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFSilke2006'] = {'O\'Donnell family tree'},
['CITEREFSima'] = {'Cite Shiji'},
['CITEREFSimaSima'] = {'Cite Shiji'},
['CITEREFSimmons2005'] = {'MSW3 Chiroptera'},
['CITEREFSimon1966'] = {'Simon-Wines Australia'},
['CITEREFSimonWarner2011'] = {'Amtrak By the Numbers'},
['CITEREFSimonWarnerEuDaly2023'] = {'Amtrak by the Numbers 2'},
['CITEREFSinclair1911'] = {'DCBL'},
['CITEREFSinger1905'] = {'Jewish Encyclopedia'},
['CITEREFSix1934'] = {'Cite Six', 'Cite six'},
['CITEREFSkjærvø2018'] = template_names['ODLA'],
['CITEREFSkoulatos1980'] = {'Les personnages byzantins de l\'Alexiade'},
['CITEREFSloan1964'] = {'Sloan1964'},
['CITEREFSmid2008'] = {'Smid2008'},
['CITEREFSmid2010'] = {'Smid2010'},
['CITEREFSmith1854'] = {'Cite DGRG', 'DGRG'},
['CITEREFSmith1870'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith1873'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith1876'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith1880'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith2010'] = {'Smith-Cruise Ships-2010'},
['CITEREFSmithJohnstonAlvesHackländer2018'] = {'Lagomorphs2018'},
['CITEREFSolomentsev2001'] = {'Springer', 'SpringerEOM'},
['CITEREFSolomon2000'] = {'Solomon-American Diesel', 'Solomon-UP'},
['CITEREFSolomon2003'] = {'Solomon-Masterpieces'},
['CITEREFSolomon2004'] = {'Solomon-Amtrak'},
['CITEREFSolomon2005'] = {'Solomon-CSX', 'Solomon-SP-Passenger'},
['CITEREFSolomon2006'] = {'Solomon-EMD Locomotives'},
['CITEREFSolomon2007'] = {'Solomon-SP'},
['CITEREFSolomon2011'] = {'Solomon-Modern Diesel', 'Solomon-Electro-Motive'},
['CITEREFSolomon2012'] = {'Solomon-North American Locomotives'},
['CITEREFSolomon2014'] = {'Solomon-GE and EMD'},
['CITEREFSolomonSchafer2007'] = {'Solomon-New York Central'},
['CITEREFSolopova2009'] = template_names['ME-ref'],
['CITEREFSorensen1956'] = {'Sorensen1956'},
['CITEREFSoustal1991'] = {'Tabula Imperii Byzantini'},
['CITEREFSoustalKoder1981'] = {'Tabula Imperii Byzantini'},
['CITEREFSpielhoff1991'] = {'Spielhoff-EL'},
['CITEREFSpitta1894'] = {'Bach\'s compositions (sources)'},
['CITEREFSpitta1899'] = {'Bach\'s compositions (sources)'},
['CITEREFSpringirth2016'] = {'Springirth-Philadelphia'},
['CITEREFSpyropoulos1928'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFStagner1993'] = {'Stagner-Transition'},
['CITEREFStansfield1999'] = {'Stansfield-AyrRenfrew'},
['CITEREFStatistical_Yearbook_of_the_Republic_of_Croatia_2015'] = {'Croatia Yearbook 2015'},
['CITEREFStaufer1993'] = {'Staufer-Pennsy_III'},
['CITEREFStauferPennypacker1962'] = {'Staufer-Pennsy'},
['CITEREFStauferPennypacker1968'] = {'Staufer-Pennsy Power II'},
['CITEREFStaunton1988'] = {'Australian Dictionary of Biography'},
['CITEREFSternFishmanTilove2006'] = {'Cite New York 2000', 'Cite NY2000', 'Cite ny2000', 'Cite NY 2000', 'Cite ny 2000', 'Stern: New York' },
['CITEREFSternGilmartinMassengale1983'] = {'Cite New York 1900', 'Cite NY1900', 'Cite NY1900', 'Cite ny1900', 'Cite ny 1900', 'Stern: New York'},
['CITEREFSternGilmartinMellins1987'] = {'Cite New York 1930', 'Cite NY 1930', 'Cite NY1930', 'Cite ny1930', 'Cite ny 1930', 'Stern: New York'},
['CITEREFSternMellinsFishman1995'] = {'Cite New York 1960', 'Cite NY1960', 'Cite NY 1960', 'Cite ny1960', 'Cite ny 1960', 'Stern: New York'},
['CITEREFSternMellinsFishman1999'] = {'Cite New York 1880', 'Cite NY1880', 'Cite NY 1880', 'Cite ny1880', 'Cite ny 1880', 'Stern: New York'},
['CITEREFStevens1907'] = {'Cite TCOF02'},
['CITEREFStewart1974'] = {'When Steam Was King'},
['CITEREFStrachey1981'] = template_names['ME-ref'],
['CITEREFStrickland1983'] = {'Strickland Locomotive Directory'},
['CITEREFStähelin1909'] = {'Schaff-Herzog'},
['CITEREFStorrer1993'] = {'cite Wright Companion'},
['CITEREFSuetin2001'] = {'Springer', 'SpringerEOM'},
['CITEREFSusanne_Schurr1992'] = {'BBKL'},
['CITEREFSusanne_Siebert1992'] = {'BBKL'},
['CITEREFSvolopoulos1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFSwartz1992'] = {'Swartz An Introduction to Functional Analysis'},
----------< T >----------
['CITEREFLondon_Gazette'] = {'London Gazette'},
['CITEREFTaber1977'] = {'Taber-DLW-19th'},
['CITEREFTaberTaber1980'] = {'Taber-DLW-20th-1'},
['CITEREFTaberTaber1981'] = {'Taber-DLW-20th-2'},
['CITEREFTabor1956'] = {'RCTS-LocosGWR-4'},
['CITEREFTabor1959'] = {'RCTS-LocosGWR-6'},
['CITEREFTalbot1991'] = template_names['ODB'],
['CITEREFTalbotKazhdan1991'] = template_names['ODB'],
['CITEREFTao2009'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFTao2009'] = {'Cite Cambridge History of China'},
['CITEREFTauranac1985'] = {'Cite Elegant New York'},
['CITEREFTer-Ghewondyan1976'] = {'The Arab Emirates in Bagratid Armenia'},
['CITEREFThe_London_Gazette1950'] = {'London Gazette'},
['CITEREFThe_London_Gazette_26_September_1919'] = {'London Gazette'},
['CITEREFThiele1983'] = {'Thiele-Hebrew Kings'},
['CITEREFThielemann2012'] = {'Bach\'s compositions (sources)'},
['CITEREFThomas1970'] = {'HistoryofParliament'},
['CITEREFThomas1971'] = {'Thomas-History-VI'},
['CITEREFThrush2010'] = {'HistoryofParliament'},
['CITEREFTikhomirov2001'] = {'Springer'},
['CITEREFTittel1966'] = {'Bach\'s compositions (sources)'},
['CITEREFTodt1996'] = {'BBKL'},
['CITEREFTodtVest2014'] = {'Tabula Imperii Byzantini'},
['CITEREFTolkien2007'] = template_names['ME-ref'],
['CITEREFTolkien2014'] = template_names['ME-ref'],
['CITEREFTolkien2015'] = template_names['ME-ref'],
['CITEREFTolkien2017'] = template_names['ME-ref'],
['CITEREFTolkien2018'] = template_names['ME-ref'],
['CITEREFTolkien2024'] = template_names['ME-ref'],
['CITEREFTolkienSwann1978'] = template_names['ME-ref'],
['CITEREFTolkienSwann2002'] = {'ME-ref'},
['CITEREFTolkienTolkien1992'] = template_names['ME-ref'],
['CITEREFTonks1988'] = {'Tonks ironstone'},
['CITEREFTonks1989'] = {'Tonks ironstone'},
['CITEREFTonks1992'] = {'Tonks ironstone'},
['CITEREFTopping1975'] = {'Setton-A History of the Crusades', 'Wisconsin History of the Crusades'},
['CITEREFTorri2013'] = {'Bach\'s compositions (sources)'},
['CITEREFTougher2018'] = template_names['ODLA'],
['CITEREFTourret1995'] = {'Tourret-Allied Military Locomotives'},
['CITEREFTrapp1991'] = template_names['ODB'],
['CITEREFTrappBeyerSturm-Schnabl1983'] = {'Prosopographisches Lexikon der Palaiologenzeit'},
['CITEREFTrappWaltherBeyer1976'] = {'Prosopographisches Lexikon der Palaiologenzeit'},
['CITEREFTrappWaltherBeyerSturm-Schnabl1978'] = {'Prosopographisches Lexikon der Palaiologenzeit'},
['CITEREFTreadgold1988'] = {'The Byzantine Revival, 780–842'},
['CITEREFTreadgold1997'] = {'A History of the Byzantine State and Society'},
['CITEREFTrèves2006'] = {'Trèves François Topological vector spaces, distributions and kernels'},
['CITEREFTsutsiev2014'] = {'Cite Atlas of the Ethno-Political History of the Caucasus'},
['CITEREFTurim1998'] = {'Turim-oshima'},
['CITEREFTuring1950'] = {'Turing 1950'},
['CITEREFTwitchett1979'] = {'Cite Cambridge History of China'},
['CITEREFTwitchettLoewe1986'] = {'Cite Cambridge History of China'},
['CITEREFTwitchettMote1988'] = {'Cite Cambridge History of China'},
['CITEREFTwitchettSmith2009'] = {'Cite Cambridge History of China'},
----------< U >----------
['CITEREFUS-NHub_Music_Deposit_31_(Klavierbüchlein_für_W._F._Bach)_at_Bach_Digital'] = {'Bach\'s compositions (sources)'},
['CITEREFUwe_Eckardt2001'] = {'BBKL'},
['CITEREFunknown_author1881'] = {'Cite ADB'},
['CITEREFunknown_author1882'] = {'Cite ADB'},
----------< V >----------
['CITEREFVakalopoulos1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFVan_Cleve1969'] = {'Setton-A History of the Crusades'},
['CITEREFVan_Hoorickx1971'] = {'Schubert\'s compositions (references)'},
['CITEREFVan_Hoorickx_1974–1976'] = {'Schubert\'s compositions (references)'},
['CITEREFVan_Lint2018'] = template_names['ODLA'],
['CITEREFVan_Riemsdijk,_Compound_Locomotives'] = {'Book-Van Riemsdijk-Compound Locomotives'},
['CITEREFVan_Riemsdijk1994'] = {'Book-Van Riemsdijk-Compound Locomotives'},
['CITEREFVan_Tricht2011'] = {'The Latin Renovatio of Byzantium'},
['CITEREFVandenberghen1989'] = {'Vandenberghen-SNCB12.2'},
['CITEREFVarzos1984'] = {'Η Γενεαλογία των Κομνηνών', 'Varzos-Genealogy of the Komnenoi'},
['CITEREFVasiliev1935'] = {'Byzance et les Arabes'},
['CITEREFVasiliev1968'] = {'Byzance et les Arabes'},
['CITEREFVenables1911'] = {'DCBL'},
['CITEREFVendler1997'] = {'Shakespeare sonnets bibliography'},
['CITEREFVenn1954'] = {'VennAC'},
['CITEREFVentura1963'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFVetter1713'] = {'Bach\'s compositions (sources)'},
['CITEREFVevainaCanepa2018'] = template_names['ODLA'],
['CITEREFVeysey1958'] = {'Veysey-PE-1958'},
['CITEREFVischer1912'] = {'Schaff-Herzog'},
['CITEREFVolkmer1991'] = {'Volkmer-Pennsy-Electric'},
['CITEREFvan_Leyden1956'] = {'Bach\'s compositions (sources)'},
['CITEREFvan_Lint2018'] = template_names['ODLA'],
['CITEREFvon_Prantl1879'] = {'Cite ADB'},
----------< W >----------
['CITEREFWagnerBäzoldZschechLüderitz1990'] = {'Wagner-EFA2.3.2'},
['CITEREFWallace2017'] = {'Cite greater'},
['CITEREFWalter1967'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFWalter_Asmus1966'] = template_names['NDB'],
['CITEREFWar_Office1918'] = {'German Forces in the Field'},
['CITEREFWarner1959'] = {'Generals in Gray'},
['CITEREFWarner1992'] = {'Generals in Blue'},
['CITEREFWayner1972'] = {'Wayner - Car names, numbers, consists'},
['CITEREFWayner1973'] = {'Wayner-Spotter-2nd'},
['CITEREFWebb2018'] = template_names['ODLA'],
['CITEREFWechsler1979'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFWechsler1979'] = {'Cite Cambridge History of China'},
['CITEREFWegman2008'] = {'Wegman-Illustrated'},
['CITEREFWeibel1994'] = {'Weibel IHA'},
['CITEREFWeinrebHibbertKeayKeay2008'] = {'London encyclopedia'},
['CITEREFWeisbrod1991'] = {'Weisbrod-EFA1.5'},
['CITEREFWeisbrodMüllerPetznik1978'] = {'Weisbrod-EFA1.2'},
['CITEREFWellhausen1927'] = {'The Arab Kingdom and its Fall'},
['CITEREFWells1982'] = {'Accents of English'},
['CITEREFWells1990'] = {'Cite LPD'},
['CITEREFWells2000'] = {'Cite LPD'},
['CITEREFWells2008'] = {'Cite LPD'},
['CITEREFWelsh2006'] = {'Welsh-Broadway'},
['CITEREFWelsh2008'] = {'Welsh-UP'},
['CITEREFWerner_Raupp2001'] = {'BBKL'},
['CITEREFWestcott1911'] = {'DCBL'},
['CITEREFWestermayer,_Georg1882'] = {'Cite ADB'},
['CITEREFWham1997'] = {'Wham-Ayrshire'},
['CITEREFWhishaw1842'] = {'Whishaw-RailofGB-2ndEd'},
['CITEREFWhishaw1969'] = {'Whishaw-RailofGB'},
['CITEREFWhite1985'] = {'White-Passenger-1985'},
['CITEREFWhite1993'] = {'White - American railroad freight car'},
['CITEREFWhiteWillenskyLeadon2010'] = {'Cite aia5'},
['CITEREFWhitehurst1973'] = {'Whitehurst GW Engines from 1940'},
['CITEREFWhittow1996'] = {'The Making of Byzantium, 600–1025'},
['CITEREFWickman1982'] = {'Country study'},
['CITEREFWiesehöfer2018'] = template_names['ODLA'],
['CITEREFWilansky2008'] = {'Wilansky Topology for Analysis 2008'},
['CITEREFWilansky2013'] = {'Wilansky Modern Methods in Topological Vector Spaces'},
['CITEREFWillard2004'] = {'Willard General Topology'},
['CITEREFWilliams1998'] = {'Williams-Philadelphia'},
['CITEREFWilliams2003'] = {'Bach\'s compositions (sources)'},
['CITEREFWillis1750'] = {'Cite Notitia Parliamentaria'},
['CITEREFWilson2017'] = {'Wilson-Guide'},
['CITEREFWilsonFiske1889'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonFiske1891'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonFiske1892'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonFiske1900'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonLacherMittermeier2016'] = {'HMW2016 Volume 6'},
['CITEREFWiltshire2000'] = {'Lloyd-Margaret River'},
['CITEREFWinfieldLyon2004'] = {'Winfield'},
['CITEREFWinkler1883'] = template_names['ADB'],
['CITEREFWitakowski2018'] = template_names['ODLA'],
['CITEREFWolff1969'] = {'Setton-A History of the Crusades'},
['CITEREFWollny2015'] = {'Bach\'s compositions (sources)'},
['CITEREFWood1907'] = {'Cite Nuttall', 'Nuttall'},
['CITEREFWoodsKilpatrick2005'] = {'MSW3 Hystricognathi'},
['CITEREFWorden2008'] = {'Country study'},
['CITEREFWortley2010'] = {'John Skylitzes: A Synopsis of Byzantine History, 811–1057'},
['CITEREFWozencraft2005'] = {'MSW3 Carnivora'},
['CITEREFWright1979'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFWright1979'] = {'Cite Cambridge History of China'},
['CITEREFWright2000'] = {'Bach\'s compositions (sources)'},
['CITEREFWrightWinter1922'] = {'1922 Locomotive Cyclopedia'},
['CITEREFWägliJacobi2010'] = {'Schienennetz Schweiz'},
----------< X >----------
----------< Y >----------
['CITEREFYenne2005'] = {'Yenne-Chiefs'},
['CITEREFYonge1990'] = {'Quail-4'},
['CITEREFYonge1994'] = {'Quail-5'},
['CITEREFYonge2002'] = {'Quail-5'},
['CITEREFYonge2008'] = {'Quail-5'},
['CITEREFYonge2016'] = {'Quail-2-2016'},
['CITEREFYongePadgettSzwenk2013'] = {'Quail-4-Paper-3rdEd'},
['CITEREFYu1986'] = {'Cite Cambridge History of China'},
----------< Z >----------
['CITEREFZahn1889–1893'] = {'Bach\'s compositions (sources)'},
['CITEREFZeiniWiesehöfer2018'] = template_names['ODLA'],
['CITEREFZekulich2000'] = {'Zekulich-WineWA'},
['CITEREFZimmermann2004'] = {'Zimmermann-Burlington'},
['CITEREFZimmermann2007'] = {'Zimmermann-GrandLuxe'},
['CITEREFZuccaric._1747'] = {'Bach\'s compositions (sources)'},
['CITEREFZălinescu2002'] = {'Zălinescu Convex Analysis in General Vector Spaces 2002'},
----------< OTHER >----------
['CITEREFΙστορία_του_Ελληνικού_Έθνους'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFΜεγάλη_Στρατιωτικὴ_καὶ_Ναυτικὴ_Ἐγκυκλοπαιδεία'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFКавказский_календарь_на_1910_год'] = {'Cite Kavkazskiy Kalendar 1910'},
['CITEREFКавказский_календарь_на_1913_год'] = {'Cite Kavkazskiy Kalendar 1913'},
['CITEREFКавказский_календарь_на_1915_год'] = {'Cite Kavkazskiy Kalendar 1915'},
['CITEREFКавказский_календарь_на_1917_год'] = {'Cite Kavkazskiy Kalendar 1917'},
----------< UNSORTED >----------
}
-- Auto-classify templates mentioned in whitelist as wrapper templates
for _, tlist in pairs(whitelist) do
for _, t in ipairs(tlist) do
if not wrapper_templates[t] then
wrapper_templates[t] = noDefault
end
end
end
--[[--------------------------< S S T S I N T E G R A T I O N >----------------------------------------------
]]
local success, ssts_registry = pcall(require, 'Module:SST/registry')
if success and type(ssts_registry) == 'table' then
if ssts_registry.defaults then
for t_name, data in pairs(ssts_registry.defaults) do
wrapper_templates[t_name] = data
end
end
if ssts_registry.patterns then
for _, pattern_block in ipairs(ssts_registry.patterns) do
table.insert(wrapper_template_patterns, pattern_block)
end
end
end
--[[--------------------------< E X P O R T E D T A B L E S >------------------------------------------------
]]
return {
whitelist = whitelist,
wrapper_template_patterns = wrapper_template_patterns,
wrapper_templates = wrapper_templates
}
su0v3o88zeqoxkv5m70kh51bj895pxi
32952
32951
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Footnotes/whitelist]]
32951
Scribunto
text/plain
--[[--------------------------< W R A P P E R _ T E M P L A T E _ D E F A U L T S >----------------------------
A list of wrapper templates by their canonical names – spelling and capitalization is important. Each wrapper
template has a table of two values: [1] is the wrapper's default name-list as it is used in an anchor ID; [2] is
the default year. This table is indexed indirectly through the wrapper_templates table.
This table is not available externally.
]]
local wrapper_template_defaults = { -- keys are canonical template names
['Americana'] = {'Rines', '1920'}, -- tables with default name and default year
['Cite bryonames'] = {'BrindaAtwood', ''},
['Cite EB1911'] = {'Chisholm', '1911'}, -- tables with default name and default year
['Encyclopaedia Islamica'] = {'Islamica', ''},
['EB1911'] = {'Chisholm', '1911'},
['EI3'] = {'FleetKrämerMatringeNawas', ''},
['FEIS'] = {'', ''},
['Jepson eFlora'] = {'Jepson_Flora_Project', ''},
['Cite Merriam-Webster'] = {'Merriam-Webster', ''},
['Cite NatureServe'] = {'NatureServe', ''},
['ODNB'] = {'', ''}, -- there is no default anchor ID; this forces evaluation of {{cite ODNB}} redirects
['PLANTS'] = {'NRCS', ''},
['Silvics'] = {'BurnsHonkala', '1990'}
}
--[[--------------------------< W R A P P E R _ T E M P L A T E _ D E F A U L T S _ V O L >--------------------
For wrapper templates that use |volume= to specify default name (often editor names) and year. Wrapper templates
are indexed by their canonical names – spelling and capitalization is important. Each wrapper template has a table
of values for every volume. Volumes may be indexed by Arabic or Roman numerals. Each volume index has a table of
twp values" [1] is the wrapper's default name-list as it is used in an anchor ID; [2] is the default year. Each
wrapper template in this table must have a ['default'] key for those occasions when |volume= is omitted or empty.
This table is indexed indirectly through the wrapper_templates table.
This table is not available externally.
]]
-- Helper function to create Encyclopedia Iranica volume table
local iranica_years = {
['1'] = 1985,
['1/1'] = 1982, ['1/2'] = 1982, ['1/3'] = 1983, ['1/4'] = 1983, ['1/5'] = 1983, ['1/6'] = 1984, ['1/7'] = 1984,
['2'] = 1987,
['2/1'] = 1985, ['2/2'] = 1985, ['2/3'] = 1986, ['2/4'] = 1986, ['2/5'] = 1986, ['2/6'] = 1986,
['3'] = 1989,
['3/1'] = 1987, ['3/2'] = 1987, ['3/3'] = 1988, ['3/4'] = 1988, ['3/5'] = 1988, ['3/6'] = 1988, ['3/7'] = 1988, ['3/8'] = 1988,
['4'] = 1990,
['4/1'] = 1989, ['4/2'] = 1989, ['4/3'] = 1989, ['4/4'] = 1989, ['4/5'] = 1989, ['4/6'] = 1990, ['4/7'] = 1990, ['4/8'] = 1989,
['5'] = 1992,
['5/1'] = 1990, ['5/2'] = 1990, ['5/3'] = 1991, ['5/4'] = 1991, ['5/5'] = 1991, ['5/6'] = 1991,
['6'] = 1993,
['6/1'] = 1992, ['6/2'] = 1992,
['7'] = 1996,
['7/1'] = 1994, ['7/2'] = 1994, ['7/3'] = 1994, ['7/4'] = 1995, ['7/5'] = 1995, ['7/6'] = 1995,
['8'] = 1998,
['8/1'] = 1997, ['8/2'] = 1997, ['8/3'] = 1997,
['9'] = 1999,
['9/1'] = 1998,
['10'] = 2001,
['10/1'] = 1999, ['10/2'] = 2000, ['10/3'] = 2000, ['10/4'] = 2000,
['11'] = 2003,
['11/1'] = 2001, ['11/2'] = 2002, ['11/3'] = 2002, ['11/4'] = 2002, ['11/5'] = 2002,
['12'] = 2004,
['12/1'] = 2003, ['12/2'] = 2003, ['12/3'] = 2003,
['13'] = 2006,
['13/1'] = 2004, ['13/2'] = 2004, ['13/3'] = 2004, ['13/4'] = 2004,
['14'] = 2008,
['14/1'] = 2007, ['14/2'] = 2007, ['14/3'] = 2007,
['15'] = 2011,
['15/1'] = 2009, ['15/2'] = 2009, ['15/3'] = 2009, ['15/4'] = 2010, ['15/5'] = 2010, ['15/6'] = 2011,
['16'] = 2020,
['16/1'] = 2012, ['16/2'] = 2013, ['16/3'] = 2017,
['default'] = '1982–2021'
}
local iranica_volumes = {}
for k, yr in pairs(iranica_years) do
iranica_volumes[k] = {'Yarshater', tostring(yr)}
end
-- Helper function to create "TDV Encyclopedia of Islam" volume table
local TDV_years = {
['1'] = '1988', ['2'] = '1989', ['3'] = '1991', ['4'] = '1991', ['5'] = '1992',
['6'] = '1992', ['7'] = '1993', ['8'] = '1993', ['9'] = '1994', ['10'] = '1994',
['11'] = '1995', ['12'] = '1995', ['13'] = '1996', ['14'] = '1996', ['15'] = '1997',
['16'] = '1997', ['17'] = '1998', ['18'] = '1998', ['19'] = '1999', ['20'] = '1999',
['21'] = '2000', ['22'] = '2000', ['23'] = '2001', ['24'] = '2001', ['25'] = '2002',
['26'] = '2002', ['27'] = '2003', ['28'] = '2003', ['29'] = '2004', ['30'] = '2005',
['31'] = '2006', ['32'] = '2006', ['33'] = '2007', ['34'] = '2007', ['35'] = '2008',
['36'] = '2009', ['37'] = '2009', ['38'] = '2010', ['39'] = '2010', ['40'] = '2011',
['41'] = '2012', ['42'] = '2012', ['43'] = '2013', ['44'] = '2013',
['Supplement 1'] = '2016', ['Supplement 2'] = '2016', ['default'] = '1988–2016'
}
local TDV_volumes = {}
for k, yr in pairs(TDV_years) do
TDV_volumes[k] = {'TDVIA', yr}
end
local wrapper_template_defaults_vol = { -- primary keys are canonical template names; TODO: do these keys have to be canonical template names?
['Cite Catholic Encyclopedia'] = { -- secondary keys are volume
['1'] = {'Herbermann', '1907'},
['2'] = {'Herbermann', '1907'},
['3'] = {'Herbermann', '1908'},
['4'] = {'Herbermann', '1908'},
['5'] = {'Herbermann', '1909'},
['6'] = {'Herbermann', '1909'},
['7'] = {'Herbermann', '1910'},
['8'] = {'Herbermann', '1910'},
['9'] = {'Herbermann', '1910'},
['10'] = {'Herbermann', '1911'},
['11'] = {'Herbermann', '1911'},
['12'] = {'Herbermann', '1911'},
['13'] = {'Herbermann', '1912'},
['14'] = {'Herbermann', '1912'},
['15'] = {'Herbermann', '1912'},
['default'] = {'Herbermann', '1913'},
},
['Cite EB9'] = {
['1'] = {'Baynes', '1878'}, ['I'] = {'Baynes', '1878'},
['2'] = {'Baynes', '1878'}, ['II'] = {'Baynes', '1878'},
['3'] = {'Baynes', '1878'}, ['III'] = {'Baynes', '1878'},
['4'] = {'Baynes', '1878'}, ['IV'] = {'Baynes', '1878'},
['5'] = {'Baynes', '1878'}, ['V'] = {'Baynes', '1878'},
['6'] = {'Baynes', '1878'}, ['VI'] = {'Baynes', '1878'},
['7'] = {'Baynes', '1878'}, ['VII'] = {'Baynes', '1878'},
['8'] = {'Baynes', '1878'}, ['VIII'] = {'Baynes', '1878'},
['9'] = {'Baynes', '1879'}, ['IX'] = {'Baynes', '1879'},
['10'] = {'Baynes', '1879'}, ['X'] = {'Baynes', '1879'},
['11'] = {'BaynesSmith', '1880'}, ['XI'] = {'BaynesSmith', '1880'},
['12'] = {'BaynesSmith', '1881'}, ['XII'] = {'BaynesSmith', '1881'},
['13'] = {'BaynesSmith', '1881'}, ['XIII'] = {'BaynesSmith', '1881'},
['14'] = {'BaynesSmith', '1882'}, ['XIV'] = {'BaynesSmith', '1882'},
['15'] = {'BaynesSmith', '1883'}, ['XV'] = {'BaynesSmith', '1883'},
['16'] = {'BaynesSmith', '1883'}, ['XVI'] = {'BaynesSmith', '1883'},
['17'] = {'BaynesSmith', '1884'}, ['XVII'] = {'BaynesSmith', '1884'},
['18'] = {'BaynesSmith', '1885'}, ['XVIII'] = {'BaynesSmith', '1885'},
['19'] = {'BaynesSmith', '1885'}, ['XIX'] = {'BaynesSmith', '1885'},
['20'] = {'BaynesSmith', '1886'}, ['XX'] = {'BaynesSmith', '1886'},
['21'] = {'BaynesSmith', '1886'}, ['XXI'] = {'BaynesSmith', '1886'},
['22'] = {'BaynesSmith', '1887'}, ['XXII'] = {'BaynesSmith', '1887'},
['23'] = {'BaynesSmith', '1888'}, ['XXIII'] = {'BaynesSmith', '1888'},
['24'] = {'BaynesSmith', '1888'}, ['XXIV'] = {'BaynesSmith', '1888'},
['default'] = {'Baynes', '1875–1889'},
},
['The Cambridge History of Iran'] = {
['1'] = {'Fischer', '1968'},
['2'] = {'Gershevitch', '1985'},
['3a'] = {'Yarshater', '1983'},
['3b'] = {'Yarshater', '1983'},
['4'] = {'Frye', '1975'},
['5'] = {'Boyle', '1968'},
['6'] = {'LockhartJackson', '1986'},
['7'] = {'AveryHamblyMelville', '1991'},
['default'] = {'', '1968–1991'}
},
['Encyclopædia Iranica'] = iranica_volumes,
['Encyclopaedia of Islam, New Edition'] = {
['1'] = {'GibbKramersLévi-ProvençalSchacht', '1960'},
['2'] = {'LewisPellatSchacht', '1965'},
['3'] = {'LewisMénagePellatSchacht', '1971'},
['4'] = {'van_DonzelLewisPellatBosworth', '1978'},
['5'] = {'Bosworthvan_DonzelLewisPellat', '1986'},
['6'] = {'Bosworthvan_DonzelPellat', '1991'},
['7'] = {'Bosworthvan_DonzelHeinrichsPellat', '1993'},
['8'] = {'Bosworthvan_DonzelHeinrichsLecomte', '1995'},
['9'] = {'Bosworthvan_DonzelHeinrichsLecomte', '1997'},
['10'] = {'BearmanBianquisBosworthvan_Donzel', '2000'},
['11'] = {'BearmanBianquisBosworthvan_Donzel', '2002'},
['12'] = {'BearmanBianquisBosworthvan_Donzel', '2004'},
['atlas'] = {'Brice', '1981'},
['abridged'] = {'van_Donzel', '1994'},
['default'] = {'BearmanBianquisBosworthvan_Donzel', '1960–2005'},
},
['TDV Encyclopedia of Islam'] = TDV_volumes,
['New Cambridge Medieval History'] = {
['1'] = {'Fouracre', '2005'},
['2'] = {'McKitterick', '1995'},
['3'] = {'Reuter', '2000'},
['4a'] = {'LuscombeRiley-Smith', '2004'},
['4b'] = {'LuscombeRiley-Smith', '2004'},
['5'] = {'Abulafia', '1999'},
['6'] = {'Jones', '2000'},
['7'] = {'Allmand', '1998'},
['default'] = {'', '1995–2005'},
},
['The History of al-Tabari'] = {
['1'] = {'Rosenthal', '1989'},
['2'] = {'Brinner', '1986'},
['3'] = {'Brinner', '1991'},
['4'] = {'Perlmann', '1987'},
['5'] = {'Bosworth', '1999'},
['6'] = {'WattMcDonald', '1989'},
['7'] = {'McDonald', '1987'},
['8'] = {'Fishbein', '1997'},
['9'] = {'Poonawala', '1990'},
['10'] = {'Donner', '1993'},
['11'] = {'Blankinship', '1993'},
['12'] = {'Friedmann', '1992'},
['13'] = {'Juynboll', '1989'},
['14'] = {'Smith', '1994'},
['15'] = {'Humphreys', '1990'},
['16'] = {'Brockett', '1997'},
['17'] = {'Hawting', '1996'},
['18'] = {'Morony', '1987'},
['19'] = {'Howard', '1990'},
['20'] = {'Hawting', '1989'},
['21'] = {'Fishbein', '1990'},
['22'] = {'Rowson', '1989'},
['23'] = {'Hinds', '1990'},
['24'] = {'Powers', '1989'},
['25'] = {'Blankinship', '1989'},
['26'] = {'Hillenbrand', '1989'},
['27'] = {'Williams', '1985'},
['28'] = {'McAuliffe', '1995'},
['29'] = {'Kennedy', '1990'},
['30'] = {'Bosworth', '1989'},
['31'] = {'Fishbein', '1992'},
['32'] = {'Bosworth', '1987'},
['33'] = {'Bosworth', '1991'},
['34'] = {'Kraemer', '1989'},
['35'] = {'Saliba', '1985'},
['36'] = {'Waines', '1992'},
['37'] = {'Fields', '1987'},
['38'] = {'Rosenthal', '1985'},
['39'] = {'Landau-Tasseron', '1998'},
['40'] = {'Popovkin', '2007'},
['default'] = {'Yarshater', '1985–2007'},
},
}
--[[--------------------------< W R A P P E R _ T E M P L A T E S >--------------------------------------------
A list of wrapper templates and their redirects – spelling and capitalization is important; first character is
always uppercase. Each wrapper template gets its value from a k/v pair in the wrapper_template_defaults table.
article reader queries this table to see if template_name is a wrapper template
]]
local wrapper_templates = { -- keys are names of wrapper templates and their redirects
['Americana'] = wrapper_template_defaults['Americana'], -- canonical name; this template calls Cite Americana
['Cite bryonames'] = wrapper_template_defaults['Cite bryonames'],
['Catholic Encyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['1913Catholic'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Catholic'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Catholic encyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CatholicEncyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CE13'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CE1913'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite Americana'] = wrapper_template_defaults['Americana'], -- canonical name
['Cite Catholic Encyclopedia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['CathEncy'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite Catholic Encyclopædia'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite CE1913'] = wrapper_template_defaults_vol['Cite Catholic Encyclopedia'],
['Cite EB1911'] = wrapper_template_defaults['Cite EB1911'], -- canonical name
['1911EB'] = wrapper_template_defaults['Cite EB1911'], -- redirects
['EB1911 cite'] = wrapper_template_defaults['Cite EB1911'],
['Wikisource1911Enc Citation'] = wrapper_template_defaults['Cite EB1911'],
['Wikisource1911Enc citation'] = wrapper_template_defaults['Cite EB1911'],
['Cite EB9'] = wrapper_template_defaults_vol['Cite EB9'], -- canonical
['Eb9'] = wrapper_template_defaults_vol['Cite EB9'],
['The Cambridge History of Iran'] = wrapper_template_defaults_vol['The Cambridge History of Iran'],
['Cambridge History of Iran'] = wrapper_template_defaults_vol['The Cambridge History of Iran'],
['Encyclopædia Iranica'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Encyclopædia Iranica Online'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Encyclopaedia Iranica'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Cite Encyclopædia Iranica Online'] = wrapper_template_defaults_vol['Encyclopædia Iranica'],
['Encyclopaedia Islamica'] = wrapper_template_defaults['Encyclopaedia Islamica'],
['TDV Encyclopedia of Islam'] = wrapper_template_defaults_vol['TDV Encyclopedia of Islam'],
['TDV İslâm Ansiklopedisi'] = wrapper_template_defaults_vol['TDV Encyclopedia of Islam'],
['Cite ODNB'] = wrapper_template_defaults['ODNB'], -- canonical
['Cite odnb'] = wrapper_template_defaults['ODNB'],
['DNBweb'] = wrapper_template_defaults['ODNB'],
['OBDNweb'] = wrapper_template_defaults['ODNB'],
['ODNB'] = wrapper_template_defaults['ODNB'],
['ODNBref'] = wrapper_template_defaults['ODNB'],
['ODNBweb'] = wrapper_template_defaults['ODNB'],
['EB1911'] = wrapper_template_defaults['EB1911'], -- canonical name; this template calls Cite EB1911
['1911'] = wrapper_template_defaults['EB1911'], -- redirects
['1911s'] = wrapper_template_defaults['EB1911'],
['Britannica 1911'] = wrapper_template_defaults['EB1911'],
['Encyclopedia Britannica 1911'] = wrapper_template_defaults['EB1911'],
['Encyclopædia Britannica 1911'] = wrapper_template_defaults['EB1911'],
['EB9'] = wrapper_template_defaults_vol['Cite EB9'], -- canonical; this template calls Cite EB9
['Encyclopaedia of Islam, New Edition'] = wrapper_template_defaults_vol['Encyclopaedia of Islam, New Edition'], -- canonical
['EI2'] = wrapper_template_defaults_vol['Encyclopaedia of Islam, New Edition'],
['Encyclopaedia of Islam, THREE'] = wrapper_template_defaults['EI3'], -- canonical
['EI3'] = wrapper_template_defaults['EI3'],
['FEIS'] = wrapper_template_defaults['FEIS'],
['Jepson eFlora'] = wrapper_template_defaults['Jepson eFlora'],
['Cite Jepson eFlora'] = wrapper_template_defaults['Jepson eFlora'],
['Cite NatureServe'] = wrapper_template_defaults['Cite NatureServe'],
['New Cambridge Medieval History'] = wrapper_template_defaults_vol['New Cambridge Medieval History'], -- canonical
['Cite Merriam-Webster'] = wrapper_template_defaults['Cite Merriam-Webster'],
['Merriam-Webster'] = wrapper_template_defaults['Cite Merriam-Webster'],
['MW'] = wrapper_template_defaults['Cite Merriam-Webster'],
['MerriamWebsterDictionary'] = wrapper_template_defaults['Cite Merriam-Webster'],
['Cite MW'] = wrapper_template_defaults['Cite Merriam-Webster'],
['M-W'] = wrapper_template_defaults['Cite Merriam-Webster'],
['PLANTS'] = wrapper_template_defaults['PLANTS'],
['NRCS Plant Profile'] = wrapper_template_defaults['PLANTS'],
['NRCS Plants Profile'] = wrapper_template_defaults['PLANTS'],
['Cite PLANTS'] = wrapper_template_defaults['PLANTS'],
['Cite usda plants'] = wrapper_template_defaults['PLANTS'],
['The History of al-Tabari'] = wrapper_template_defaults_vol['The History of al-Tabari'], -- canonical
['The History of Al-Tabari'] = wrapper_template_defaults_vol['The History of al-Tabari'], -- redirects
['The History of al-Ṭabarī'] = wrapper_template_defaults_vol['The History of al-Tabari'], -- redirects
['Silvics'] = wrapper_template_defaults['Silvics'],
}
--[[--------------------------< T E M P L A T E _ N A M E S >--------------------------------------------------
This table holds the names of templates and the names of their redirects. Template names must be written exactly
as they are named at their templatespace page. This same also applies to redirects.
The indexes in this table are not critical but should be short and concise.
]]
local template_names = {
['ADB'] = {'Allgemeine Deutsche Biographie', 'Cite ADB'},
['Butt_Stations'] = {'Butt-Stations', 'Butt-stations'},
['Cam_Hist_Iran'] = {'Cambridge History of Iran', 'The Cambridge History of Iran'},
['DNB'] = {'Cite DNB', 'DNB', 'DNB Cite', 'Cite DNBSupp', 'DNBSupp', 'Cite DNB12', 'Cite DNBIE', 'DNB12', 'DNBIE', 'DNBfirst'},
['EI2'] = {'Encyclopaedia of Islam, New Edition','EI2'},
['ME-ref'] = {'ME-ref', 'Me-ref'},
['ODB'] = {'ODB', 'Oxford Dictionary of Byzantium'},
['ODLA'] = {'ODLA', 'Oxford Dictionary of Late Antiquity'},
['NDB'] = {'Cite NDB', 'NDB'},
['Iranica'] = {'Encyclopædia Iranica Online', 'Encyclopædia Iranica', 'Encyclopaedia Iranica', 'Cite Encyclopædia Iranica Online'},
['Tabari'] = {'The History of al-Tabari','The History of al-Ṭabarī'}
}
--[[--------------------------< W R A P P E R _ T E M P L A T E _ P A T T E R N S >----------------------------
A list of pairs: each pair is a (list of wrapper templates, list of corresponding whitelisted patterns).
The main code will sweep through the list of wrapper templates, checking if they are used, the match against corresponding whitelisted patterns.
]]
local wrapper_template_patterns = {
{{'Acad','Alumni Cantabrigienses','Venn'},{'ACAD%u%u%u?%u?%d+%u%u?'}},
{{'Cite AHD','Australian Heritage Database'},{'AHD%d+'}},
{{'Cite Austrian gazette'},{'[BR]GBl_[12]%d%d%d%-?I?I?%/%d+','StGBl_[12]%d%d%d%/%d+','GBlÖ_[12]%d%d%d%/%d+'}},
{{'Cite Bach Digital harvard','BDh'},{'[%d%a_%pöüäß→]+_at_Bach_Digital'}},
{{'Cite DNB', 'DNB', 'DNB Cite', 'Cite DNBSupp', 'DNBSupp', 'Cite DNB12', 'Cite DNBIE', 'DNB12', 'DNBIE', 'DNBfirst'},
{'CITEREF%a[%a%-_\']*188[5-9]', -- 1885–1889
'CITEREF%a[%a%-_\']*189%d', -- 1890–1899
'CITEREF%a[%a%-_\']*190[0-1]', -- 1900–1901
'CITEREF%a[%a%-_\']*1903', -- 1903 IE
'CITEREF%a[%a%-_\']*1912', -- 1912 supplement
}},
{{'Cite gnis2','GNIS 0'},{'%a.*_USGS$'}},
{{'Coflein'},{'RCAHMW[%s_]*%d+'}},
{{'Historic Environment Scotland','HEScotland'},{'Historic_Environment_Scotland%u%u%u?%u?%d'}},
{{'London Gazette'},{'Gazette%d+'}},
{template_names['ME-ref'],{'Tolkien19%d%d'}},
{{'National Heritage List for England','Images of England','IoEEntry','Heritage Gateway',
'NHLE','English Heritage List entry','IoE','National Heritage List for England entry','Historic England',
'Historic England research records','Cite PastScape','PastScape','HERR'},{'Historic_England%d+'}},
{{'Cite QHR','Cite CHIMS'},{'QHR%d+'}}
}
local noDefault = {'', ''}
-- ensure that all templates with patterns are classified as wrapper templates
for _, wtp in ipairs(wrapper_template_patterns) do
for _, t in ipairs(wtp[1]) do
if not wrapper_templates[t] then
wrapper_templates[t] = noDefault
end
end
end
--[[--------------------------< W H I T E L I S T >------------------------------------------------------------
This is a list of anchor IDs known to be associated with specific wrapper templates. The anchor ID serves as an
index into the table. The assigned value is another table that lists the associated template and any redirects.
Except for year disambiguators, anchor IDs must have the same form as the anchor creator makes; must be the
anchor-encoded form. Remove the year disambiguator.
Template names must be written exactly as they are named at their templatespace page. This same also applies to
redirects. Module:Footnotes reads the template names left to right so most-commonly-used template or redirect name
should appear first. When there are more than one name and when those templates have various anchor IDs the template
namelist should be added to the template_names{} table.
Note that references to Template:EB1911 are listed under "E" in the alphabetical list below to keep them organized.
]]
local whitelist = {
----------< # >----------
['CITEREF2013_Statistical_Yearbook_of_the_Republic_of_Croatia'] = {'Croatia Yearbook 2013'},
----------< A >----------
['CITEREFAGA_1884–1897'] = {'Schubert\'s compositions (references)'},
['CITEREFATOC2009'] = {'ATOCConnectingCommunitiesReportS10'},
['CITEREFAbramowitzStegun1983'] = {'Abramowitz Stegun ref'},
['CITEREFAbulafia1999'] = {'New Cambridge Medieval History'},
['CITEREFActa_Lipsiensium1723'] = {'Bach\'s compositions (sources)'},
['CITEREFAdamsFranzosa2009'] = {'Adams Franzosa Introduction to Topology Pure and Applied'},
['CITEREFAdaschErnstKeim1978'] = {'Adasch Topological Vector Spaces'},
['CITEREFAEF1920'] = {'Histories of Two Hundred and Fifty-One Divisions of the German Army'},
['CITEREFAffleck1978'] = {'Affleck-On Track'},
['CITEREFAhlgrimm1969'] = {'Bach\'s compositions (sources)'},
['CITEREFAhrons1927'] = {'Book-Ahrons-British Steam Railway Locomotive'},
['CITEREFAl-Kindi1912'] = {'The Governors and Judges of Egypt'},
['CITEREFAlbert_Schumann1886'] = {'Cite ADB'},
['CITEREFAlden1916'] = {'Shakespeare sonnets bibliography'},
['CITEREFAldrich1969'] = {'Aldrich-LocosGER7'},
['CITEREFAleksidze2018'] = template_names['ODLA'],
['CITEREFAlexiou2010'] = {'Cite flatiron'},
['CITEREFAliprantisBorder2006'] = {'Aliprantis Border Infinite Dimensional Analysis A Hitchhiker\'s Guide Third Edition'},
['CITEREFAllamaniPanagiotopoulou1978'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFAllcockDaviesle_FlemingMaskelyne1951'] = {'RCTS-LocosGWR-1'},
['CITEREFAllcockDaviesle_FlemingMaskelyne1968'] = {'RCTS-LocosGWR-1'},
['CITEREFAllen1936'] = {'Allen-Star Names'},
['CITEREFAllenBoddyBrownFry1970'] = {'RCTS-LocosLNER-8A', 'RCTS-LocosLNER'},
['CITEREFAllenBoddyBrownFry1971'] = {'RCTS-LocosLNER-8B', 'RCTS-LocosLNER'},
['CITEREFAllenBoddyBrownFry1983'] = {'RCTS-LocosLNER-8A', 'RCTS-LocosLNER'},
['CITEREFAllmand1998'] = {'New Cambridge Medieval History'},
['CITEREFAmerican_Railway_Association1922'] = {'1922 Locomotive Cyclopedia'},
['CITEREFAnderson1952'] = {'Naval Wars in the Levant 1559–1853'},
['CITEREFAngelov2018'] = template_names['ODLA'],
['CITEREFApostol1976'] = {'Apostol IANT'},
['CITEREFArkhangel'skiiPonomarev1984'] = {'Arkhangel\'skii Ponomarev Fundamentals of General Topology Problems and Exercises'},
['CITEREFArrey_von_Dommer1875'] = {'Cite ADB'},
['CITEREFAsmus1966'] = template_names['NDB'],
['CITEREFAspreas1929'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFAtkins2007'] = {'Shakespeare sonnets bibliography'},
['CITEREFAudiKondevWangHuang2017'] = {'NUBASE2016'},
['CITEREFAvdoyan2018'] = template_names['ODLA'],
['CITEREFAwdry1990'] = {'Awdry-RailCo', 'Carnarvonshire Railway'},
['CITEREFRamelli2018'] = {'Oxford Dictionary of Late Antiquity'},['CITEREFA_History_of_the_Crusades'] = {'Setton-A History of the Crusades'},
----------< B >----------
['CITEREFBabinger1962'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFBabinger1978'] = {'Mehmed the Conqueror and His Time'},
['CITEREFBabinger1992'] = {'Mehmed the Conqueror and His Time'},
['CITEREFBachAgricola1754'] = {'Bach\'s compositions (sources)'},
['CITEREFBadura-SkodaBranscombe2008'] = {'Schubert\'s compositions (references)'},
['CITEREFBagley1999'] = {'Cite Cambridge History of China'},
['CITEREFBaldwin1969'] = {'Setton-A History of the Crusades'},
['CITEREFBaldwin1985'] = {'Setton-A History of the Crusades'},
['CITEREFBaldwin1991'] = template_names['ODB'],
['CITEREFBaldwinKazhdan1991'] = template_names['ODB'],
['CITEREFBaldwinTalbot1991'] = template_names['ODB'],
['CITEREFBaltzer1916'] = {'Baltzer-Kolonialbahnen'},
['CITEREFBanach1932'] = {'Banach Théorie des Opérations Linéaires'},
['CITEREFBangFrankKowanskiVondrak2007'] = {'Forgotten Railroads Through Westchester County'},
['CITEREFBartusis1991'] = template_names['ODB'],
['CITEREFBaxter1971'] = {'Baxter-BritishLocoCat1'},
['CITEREFBaxter1977'] = {'Baxter-BritishLocoCat1', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1978'] = {'Baxter-BritishLocoCat2A', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1979'] = {'Baxter-BritishLocoCat2B', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1982'] = {'Baxter-BritishLocoCat3A', 'Baxter-BritishLocoCat3B', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1982a'] = {'Baxter-BritishLocoCat3A', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1984'] = {'Baxter-BritishLocoCat4', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1986'] = {'Baxter-BritishLocoCat5A', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter1988'] = {'Baxter-BritishLocoCat5B', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBaxter2012'] = {'Baxter-BritishLocoCat6', 'Baxter: British Locomotive Catalogue 1825–1923'},
['CITEREFBecke1935'] = {'Order of Battle of Divisions-1'},
['CITEREFBecke1936'] = {'Order of Battle of Divisions-2A'},
['CITEREFBecke1937'] = {'Order of Battle of Divisions-2B'},
['CITEREFBecke1938'] = {'Order of Battle of Divisions-3A'},
['CITEREFBecke1945'] = {'Order of Battle of Divisions-3B', 'Order of Battle of Divisions-4'},
['CITEREFBeißwenger1991'] = {'Bach\'s compositions (sources)'},
['CITEREFBek2001'] = {'Cite Grove'},
['CITEREFBelke1996'] = {'Tabula Imperii Byzantini'},
['CITEREFBelkeMersisch1990'] = {'Tabula Imperii Byzantini'},
['CITEREFBelkeRestle1984'] = {'Tabula Imperii Byzantini'},
['CITEREFBellini2008'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFBernhard_von_Poten1889'] = template_names['ADB'],
['CITEREFBernhard_von_Poten1898'] = template_names['ADB'],
['CITEREFBezilla1980'] = {'Bezilla-PRR-Electric-Traction'},
['CITEREFBianquis1998'] = {'The Cambridge History of Egypt', 'Cambridge History of Egypt'},
['CITEREFBierstedt1988'] = {'Bierstedt An Introduction to Locally Convex Inductive Limits'},
['CITEREFBirken1976'] = {'Die Provinzen des Osmanischen Reiches'},
['CITEREFBirtchnell1972'] = {'A Short History of Berkhamsted'},
['CITEREFBlake1966'] = {'DisraeliRef'},
['CITEREFBlanken2019'] = {'Bach\'s compositions (sources)'},
['CITEREFBlankinship1994'] = {'The End of the Jihâd State', 'The End of the Jihad State'},
['CITEREFBlautSchulze2008'] = {'Bach\'s compositions (sources)'},
['CITEREFBloom2007'] = {'Cite Routledge Broadway', 'Cite Broadway Routledge', 'Cite Routledge Guide to Broadway', 'Routledge Guide to Broadway'},
['CITEREFBoatner1988'] = {'Civil War Dictionary'},
['CITEREFBock1978'] = {'Audie-bock-directors'},
['CITEREFBodde1986'] = {'Cite Cambridge History of China'},
['CITEREFBoddyBrownFryHennigan1968'] = {'RCTS-LocosLNER-4', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownFryHennigan1975'] = {'RCTS-LocosLNER-2B', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownFryHennigan1977'] = {'RCTS-LocosLNER-9A', 'RCTS-LocosLNER-9B', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownFryHennigan1979'] = {'RCTS-LocosLNER-3A', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownHenniganHoole1984'] = {'RCTS-LocosLNER-6C', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownHenniganNeve1981'] = {'RCTS-LocosLNER-3B', 'RCTS-LocosLNER'},
['CITEREFBoddyBrownNeveYeadon1983'] = {'RCTS-LocosLNER-6B', 'RCTS-LocosLNER'},
['CITEREFBoddyFryHenniganHoole1988'] = {'RCTS-LocosLNER-10A', 'RCTS-LocosLNER'},
['CITEREFBoddyFryHenniganHoole1990'] = {'RCTS-LocosLNER-10B', 'RCTS-LocosLNER'},
['CITEREFBoddyFryHenniganProud1963'] = {'RCTS-LocosLNER-1', 'RCTS-LocosLNER'},
['CITEREFBoddyNeveTeeYeadon1982'] = {'RCTS-LocosLNER-6A', 'RCTS-LocosLNER'},
['CITEREFBoddyNeveYeadon1973'] = {'RCTS-LocosLNER-2A', 'RCTS-LocosLNER'},
['CITEREFBody1989'] = {'Body-Railways-Vol2'},
['CITEREFBon1969'] = {'La Morée franque'},
['CITEREFBonner2010'] = {'New Cambridge History of Islam'},
['CITEREFBonnett2005'] = {'Bonnett Practical Rail Engineering'},
['CITEREFBonporti1712'] = {'Bach\'s compositions (sources)'},
['CITEREFBooth2000'] = {'Shakespeare sonnets bibliography'},
['CITEREFBorsari1964'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFBossert1914'] = {'Schaff-Herzog'},
['CITEREFBottoMitchell2002'] = {'Cite ATT Broadway', 'Cite At This Theatre Broadway', 'Cite Broadway At This Theatre', 'Cite Broadway ATT'},
['CITEREFBourbaki1987'] = {'Bourbaki Topological Vector Spaces', 'Bourbaki Topological Vector Spaces Part 1 Chapters 1–5'},
['CITEREFBourbaki1989'] = {'Bourbaki General Topology Part I Chapters 1-4', 'Bourbaki General Topology Part II Chapters 5-10', 'Bourbaki Algebra I Chapters 1-3 Springer'},
['CITEREFBourbaki1994'] = {'Bourbaki EHM'},
['CITEREFBournoutian2018'] = {'Cite Armenia and Imperial Decline'},
['CITEREFBowen1928'] = {'The Life and Times of Ali ibn Isa'},
['CITEREFBowmanCameronGarnsey2005'] = {'Cambridge Ancient History'},
['CITEREFBoyd1970'] = {'Boyd-MidWales'},
['CITEREFBoyd1975'] = {'Boyd-FR1'},
['CITEREFBoyd1985'] = {'Boyd-NCaerns2Penrhyn'},
['CITEREFBoyd1986'] = {'Boyd-NCaerns3Dinorwic'},
['CITEREFBoyd1988'] = {'Boyd-SCaerns1'},
['CITEREFBoyd1989'] = {'Boyd-SCaerns2'},
['CITEREFBoyd1990'] = {'Boyd-NCaerns1'},
['CITEREFBradshaw1968'] = {'Bradshaw-1910April'},
['CITEREFBradshaw1985'] = {'Bradshaw-1922July'},
['CITEREFBradshaw2011'] = {'Bradshaw-1895December'},
['CITEREFBradshaw2012'] = {'Bradshaw-1850March'},
['CITEREFBrand1968'] = {'Byzantium Confronts the West'},
['CITEREFBrand1991'] = {'DBI', 'ODB', 'Oxford Dictionary of Byzantium'},
['CITEREFBray2010'] = {'Bray-SDJR'},
['CITEREFBrett2010'] = {'New Cambridge History of Islam'},
['CITEREFBrown2008'] = {'The Cambridge History of the Byzantine Empire'},
['CITEREFBrown2021'] = {'Cite Gaia EDR3'},
['CITEREFBryan1886'] = {'Bryan (3rd edition)'},
['CITEREFBryan1889'] = {'Bryan (3rd edition)'},
['CITEREFBützerJeker1980'] = {'Grosser Eisenbahn-Atlas Schweiz'},
['CITEREFBuhle1909'] = {'Bach\'s compositions (sources)'},
['CITEREFBunbury1857'] = {'DGRG'},
['CITEREFBurant1987'] = {'Cite DCB'},
['CITEREFBurch1911'] = {'Burch Electric Traction'},
['CITEREFBurke1866'] = {'O\'Donnell family tree'},
['CITEREFBurrowsWallace1999'] = {'Cite gotham'},
['CITEREFBury1911'] = {'The Imperial Administrative System of the Ninth Century'},
['CITEREFButcherNicholson2018'] = template_names['ODLA'],
['CITEREFButt1995'] = template_names['Butt_Stations'],
----------< C >----------
['CITEREFCIC1983'] = {'CIC1983bib'},
['CITEREFCalifornia1988'] = {'CA-Rail Passenger Development Plan-1988'},
['CITEREFCallwell1999'] = {'Muni Chronology'},
['CITEREFCaltrans1984'] = {'Countrystudy'},
['CITEREFCameronWard-PerkinsWhitby2000'] = {'Cambridge Ancient History'},
['CITEREFCanepa2018'] = template_names['ODLA'],
['CITEREFCanny2008'] = {'O\'Donnell family tree'},
['CITEREFCappelCutlerKazhdan1991'] = template_names['ODB'],
['CITEREFCarl_von_Prantl1879'] = {'Cite ADB'},
['CITEREFCarlson2010'] = {'Dlmf'},
['CITEREFCaro1974'] = {'Cite Power Broker'},
['CITEREFCarpenter1977'] = template_names['ME-ref'],
['CITEREFCarpenter1981'] = template_names['ME-ref'],
['CITEREFCarpenter2023'] = template_names['ME-ref'],
['CITEREFCarra_de_VauxHodgson1965'] = {'EI2'},
['CITEREFCarter2006'] = {'Carter-RailwaysMotivePowerArgentina'},
['CITEREFCasserley1968'] = {'Casserley-joint'},
['CITEREFCasserleyJohnston1966'] = {'Casserley-LocoGrouping3'},
['CITEREFCasserleyJohnston1974'] = {'Casserley-LocoGrouping3', 'Casserley-LocoGrouping2', '0-7110-0554-0'},
['CITEREFCasway1984'] = {'O\'Donnell family tree'},
['CITEREFCavanna_Ciappina2001'] = {'DBI'},
['CITEREFCaveBucklandBeardsell2002'] = {'Cave-First Fifty'},
['CITEREFCawley2001'] = {'Medieval Lands by Charles Cawley', 'MLCC'},
['CITEREFCawley2001'] = {'Medieval Lands by Charles Cawley'},
['CITEREFCawley2010'] = {'MLCC'},
['CITEREFCawley2011'] = {'MLCC'},
['CITEREFCawley2012'] = {'Medieval Lands by Charles Cawley'},
['CITEREFChaffeeTwitchett2015'] = {'Cite Cambridge History of China'},
['CITEREFChaléardChanson-JabeurBéranger2006'] = {'Chaléard-Le cdf en Afrique'},
['CITEREFChambers1728'] = {'Cyclopaedia 1728'},
['CITEREFChasiotis1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFCheyneBlack1899'] = {'Biblica', 'Cite Biblica'},
['CITEREFCheyneBlack1899–1903'] = {'Cite Biblica'},
['CITEREFCheyneBlack1901'] = {'Cite Biblica'},
['CITEREFCheyneBlack1902'] = {'Cite Biblica'},
['CITEREFCheyneBlack1903'] = {'Cite Biblica'},
['CITEREFChisholm1911'] = {'Cite EB1911','EB1911','1911EB','EB1911 cite','1911','1911s','Britannica 1911','Encyclopedia Britannica 1911','Encyclopædia Britannica 1911','Wikisource1911Enc Citation','Wikisource1911Enc citation'},
['CITEREFChisholm1922'] = {'EB1922', 'Cite EB1922'},
['CITEREFChoniates1984'] = {'O City of Byzantium'},
['CITEREFChrista_Jost1999'] = template_names['NDB'],
['CITEREFChung1994'] = {'Country study'},
['CITEREFChurchmanHurst2001'] = {'Churchman & Hurst Railways of New Zealand'},
['CITEREFChurchman_&_Hurst2001'] = {'Churchman & Hurst Railways of New Zealand'},
['CITEREFChurella2013'] = {'Churella-PRR-1'},
['CITEREFClementsMcMahon2008'] = {'ClementsMcMahon-GSR Locomotives'},
['CITEREFClinker1978'] = {'Clinker-Stations'},
['CITEREFClinker1988'] = {'Clinker-Stations'},
['CITEREFCoates1990'] = {'Coates-Reading'},
['CITEREFColbyWilliams1916'] = {'New International Encyclopedia', 'NIE'},
['CITEREFColledgeWarlow2006'] = {'Colledge', 'Cite Colledge2006'},
['CITEREFColledgeWarlow2010'] = {'Cite Colledge2010'},
['CITEREFCollins2016'] = {'Cite Collins 2016'},
['CITEREFColvin1947'] = {'Colvin1947'},
['CITEREFConolly1998'] = {'IanAllan-PreGroup-Atlas1998'},
['CITEREFConway1990'] = {'Conway A Course in Functional Analysis'},
['CITEREFCookZimmermann1992'] = {'Cook-Western Maryland'},
['CITEREFCosentino2008'] = {'DBI'},
['CITEREFCotsonis2020'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFCoulthard-Clark2002'] = {'Australian Dictionary of Biography'},
['CITEREFCousin1910'] = {'A Short Biographical Dictionary of English Literature', 'Cite SBDEL'},
['CITEREFCoverdale_&_Colpitts1946'] = {'Coverdale & Colpitts 1', 'Coverdale & Colpitts 2', 'Coverdale & Colpitts 3', 'Coverdale & Colpitts 4'},
['CITEREFCox1967'] = {'Cox-Upper Darby'},
['CITEREFCox2011'] = {'Cox-Dixie'},
['CITEREFCrevier1993'] = {'Crevier 1993'},
['CITEREFCrockett2007'] = {'Australian Dictionary of Biography'},
['CITEREFCroke2018'] = template_names['ODLA'],
['CITEREFCrone1980'] = {'Slaves on Horses'},
['CITEREFCrone2003'] = {'Slaves on Horses'},
['CITEREFCroughtonKidnerYoung1982'] = {'Croughton-PrivateStations'},
['CITEREFCruickshanks1970'] = {'HistoryofParliament'},
['CITEREFCsászár1978'] = {'Császár General Topology'},
['CITEREFCudahy2002'] = {'Cudahy-Hudson'},
['CITEREFCudahy2003'] = {'Cudahy-Subways'},
['CITEREFCurta2006'] = {'Southeastern Europe in the Middle Ages, 500–1250'},
----------< D >----------
['CITEREFDBI'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFDZS2015'] = {'Croatia Yearbook 2015'},
['CITEREFDadelsen1957'] = {'Bach\'s compositions (sources)'},
['CITEREFDaftary1990'] = {'Daftary-The Ismailis'},
['CITEREFDaftary2007'] = {'Daftary-The Ismailis'},
['CITEREFDaniel2010'] = {'New Cambridge History of Islam'},
['CITEREFDanielsDench1963'] = {'Daniels-NoMore'},
['CITEREFDanielsDench1973'] = {'Daniels-NoMore'},
['CITEREFDarleyCanepa2018'] = {'Oxford Dictionary of Late Antiquity'},
['CITEREFDaryaee2018'] = template_names['ODLA'],
['CITEREFDaryaeeCanepa2018'] = template_names['ODLA'],
['CITEREFDavid1961'] = {'Bach\'s compositions (sources)'},
['CITEREFDavidson2010'] = {'HistoryofParliament'},
['CITEREFDavidsonThrush2010'] = {'HistoryofParliament'},
['CITEREFDavies1956'] = {'RCTS-LocosGWR-11'},
['CITEREFDavies1996'] = {'Davies-PLMLocoList'},
['CITEREFDavies1997'] = {'Davies-NordLocoList'},
['CITEREFDavies2001'] = {'Davies-EstLocoList3', 'Davies-ÉtatLocoList'},
['CITEREFDavies2003'] = {'Davies-SNCFLocoList'},
['CITEREFDaviesFirthLuckingThomas1966'] = {'RCTS-LocosGWR-10'},
['CITEREFDe_Negri1997'] = {'DBI'},
['CITEREFDendy_MarshallKidner1982'] = {'Dendy Marshall-Southern Railway'},
['CITEREFDer_Matossian2020'] = {'Cite The First Republic of Armenia'},
['CITEREFDeutsch1951'] = {'Schubert\'s compositions (references)'},
['CITEREFDeutsch1978'] = {'Schubert\'s compositions (references)'},
['CITEREFDeutsche_Autos,_Band_2,2001'] = {'Deutsche Autos-2'},
['CITEREFDeutsche_Autos,_Band_3,2001'] = {'Deutsche Autos-3'},
['CITEREFDeutsche_Autos,_Band_4,2001'] = {'Deutsche Autos-4'},
['CITEREFDeutsche_Autos,_Band_5,2001'] = {'Deutsche Autos-5'},
['CITEREFDeutsche_Autos,_Band_6,2001'] = {'Deutsche Autos-6'},
['CITEREFDewick2005'] = {'Dewick-Atlas'},
['CITEREFDiamonstein-Spielvogel2011'] = {'Cite landmarks'},
['CITEREFDickens2018'] = template_names['ODLA'],
['CITEREFDienKnapp2019'] = {'Cite Cambridge History of China'},
['CITEREFDirksen1998'] = {'Bach\'s compositions (sources)'},
['CITEREFDirksen2010'] = {'Bach\'s compositions (sources)'},
['CITEREFDirksen2016'] = {'Bach\'s compositions (sources)'},
['CITEREFDixmier1984'] = {'Dixmier General Topology'},
['CITEREFDoganis1930'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFDoleckiMynard2016'] = {'Dolecki Mynard Convergence Foundations Of Topology'},
['CITEREFDolkart1998'] = {'Cite morningside'},
['CITEREFDonaghy1972'] = {'Donaghy-LMR'},
['CITEREFDonohue2003'] = {'The Buwayhid Dynasty in Iraq'},
['CITEREFDorin1972'] = {'Dorin-North Western'},
['CITEREFDow1985'] = {'Dow-GC1', 'Dow-GC2', 'Dow-GC3'},
['CITEREFDowney2007'] = {'Downey-Chicago'},
['CITEREFDrummond1964'] = {'HistoryofParliament'},
['CITEREFDrury1985'] = {'Drury Historical Guide 1985'},
['CITEREFDrury1993'] = {'Drury-North American Steam'},
['CITEREFDugundji1966'] = {'Dugundji Topology'},
['CITEREFDuke1995'] = {'Duke-Santa Fe-1'},
['CITEREFDukeKeilty1990'] = {'Duke-RDC'},
['CITEREFDumbarton_Oaks_Hagiography_Database'] = {'Dumbarton Oaks Hagiography Database'},
['CITEREFDunbar1969'] = {'Dunbar-Railroads'},
['CITEREFDuncan-Jones2010'] = {'Shakespeare sonnets bibliography'},
['CITEREFDunlop1895'] = {'O\'Donnell family tree'},
['CITEREFDunn2013'] = {'Dunn-Comeng-5'},
['CITEREFDurham1998'] = {'California\'s Geographic Names'},
['CITEREFDurrant1972'] = {'Durrant-Steam Locos Eastern Europe'},
['CITEREFDurrant1981'] = {'Durrant-Garratt-Rev'},
['CITEREFDurrantLewisJorgensen1981'] = {'Durrant-SteamAfrica'},
['CITEREFDömlingKohlhase1971'] = {'Bach\'s compositions (sources)'},
['CITEREFDürr1952'] = {'Bach\'s compositions (sources)'},
['CITEREFDürr1954'] = {'Bach\'s compositions (sources)'},
['CITEREFDürr1987'] = {'Bach\'s compositions (sources)'},
['CITEREFDürrJones2006'] = {'Bach\'s compositions (sources)'},
['CITEREFDürrKobayashi1998'] = {'Bach\'s compositions (sources)'},
----------< E >----------
['CITEREFEarle2018'] = {'Gymnosperm Database'},
['CITEREFEaston1897'] = {'Eastons', 'EBD'},
['CITEREFEbata2019'] = {'BDh'},
['CITEREFEbata2020'] = {'BDh'},
['CITEREFEdwards1995'] = {'Edwards Functional Analysis Theory and Applications'},
['CITEREFEichberg1976'] = {'Bach\'s compositions (sources)'},
['CITEREFEl-Hibri2010'] = {'New Cambridge History of Islam'},
['CITEREFEl-Hibri2021'] = {'The Abbasid Caliphate: A History'},
['CITEREFEldredgeHorenstein2014'] = {'Cite concrete'},
['CITEREFElsholz1982'] = {'Schubert\'s compositions (references)'},
['CITEREFEppstein1966'] = {'Bach\'s compositions (sources)'},
['CITEREFEppstein1982'] = {'Bach\'s compositions (sources)'},
['CITEREFEquasis'] = {'Csr', 'Cite ship register'},
['CITEREFEsposito1959'] = {'West Point Atlas of American Wars-1'},
['CITEREFEuDaly2009'] = {'Complete Book of North American Railroading'},
['CITEREFEuDalySchaferJessupBoyd2009'] = {'Complete Book of North American Railroading'},
----------< F >----------
['CITEREFFairbank1978'] = {'Cite Cambridge History of China'},
['CITEREFFairbank1983'] = {'Cite Cambridge History of China'},
['CITEREFFairbankFeuerwerker1986'] = {'Cite Cambridge History of China'},
['CITEREFFairbankLiu1980'] = {'Cite Cambridge History of China'},
['CITEREFFang1943'] = {'Cite ECCP'},
['CITEREFFarinella2001'] = {'DBI'},
['CITEREFFeder1958'] = {'Bach\'s compositions (sources)'},
['CITEREFFederal_Writers'_Project1939'] = {'Cite fednyc'},
['CITEREFFernandez1983'] = {'Fernandez1983'},
['CITEREFFerneyhough1980'] = {'Ferneyhough-LMR'},
['CITEREFFiaccadori1991'] = template_names['ODB'],
['CITEREFFine1991'] = {'The Early Medieval Balkans'},
['CITEREFFine1994'] = {'The Late Medieval Balkans'},
['CITEREFFitzpatrickLink1960'] = {'Nebraska Place-Names'},
['CITEREFFleetKrämerMatringeNawas'] = {'Encyclopaedia of Islam, THREE','EI3'},
['CITEREFFletcher,_Great_Tank_Scandal'] = {'Book-Fletcher-Great Tank Scandal'},
['CITEREFFletcher,_Universal_Tank'] = {'Book-Fletcher-Universal Tank'},
['CITEREFFlora_of_China'] = {'EFloras'},
['CITEREFFlora_of_North_America'] = {'EFloras'},
['CITEREFFlora_of_North_America2009'] = {'EFloras'},
['CITEREFFluckMarshallWilson1996'] = {'FluMarWil-LocRailCR'},
['CITEREFFonstad1991'] = template_names['ME-ref'],
['CITEREFFordCrowther1922'] = {'Ford1922'},
['CITEREFForkelTerry1920'] = {'Bach\'s compositions (sources)'},
['CITEREFFornaçon,_Siegfried1957'] = template_names['NDB'],
['CITEREFForrestal1999'] = {'Forrestal-Wineries'},
['CITEREFForster1990'] = {'Cite DCB'},
['CITEREFFoss1991'] = template_names['ODB'],
['CITEREFFoster1971'] = template_names['ME-ref'],
['CITEREFFoster1996'] = {'Foster-Field Guide'},
['CITEREFFouracre2005'] = {'New Cambridge Medieval History'},
['CITEREFFrailey2010'] = {'Frailey-Twilight'},
['CITEREFFranke1994'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFFranke1994'] = {'Cite Cambridge History of China'},
['CITEREFFrankeTwitchett1994'] = {'Cite Cambridge History of China'},
['CITEREFFranz_Schnorr_von_Carolsfeld1883'] = {'Cite ADB'},
['CITEREFFriedrich_Wilhelm_Bautz1975'] = {'BBKL'},
['CITEREFFriedrich_Wilhelm_Bautz1990'] = {'BBKL'},
['CITEREFFry1964'] = {'RCTS-LocosLNER-7', 'RCTS-LocosLNER'},
['CITEREFFry1966'] = {'RCTS-LocosLNER-5', 'RCTS-LocosLNER'},
['CITEREFFryHooleMannersNeve1981'] = {'RCTS-LocosLNER-3C', 'RCTS-LocosLNER'},
['CITEREFFubini2012'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFFudenbergTirole1991'] = {'Cite Fudenberg Tirole 1991'},
['CITEREFFultonHarris1991'] = {'Fulton-Harris'},
----------< G >----------
['CITEREFGaines2008'] = {'Cite Gaines 2008'},
['CITEREFGardner2005'] = {'MSW3 Microbiotheria'},
['CITEREFGardoni2015'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFGareyJohnson1979'] = {'Garey-Johnson'},
['CITEREFGarth2003'] = template_names['ME-ref'],
['CITEREFGeanakoplos1959'] = {'Emperor Michael Palaeologus and the West'},
['CITEREFGeorg_von_Dadelsen1953'] = template_names['NDB'],
['CITEREFGiannasi1975'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFGibb1923'] = {'The Arab Conquests in Central Asia'},
['CITEREFGibbs1964'] = {'Gibbs-Graveyard'},
['CITEREFGil1997'] = {'A History of Palestine, 634-1099', 'A History of Palestine, 634–1099'},
['CITEREFGillham1988'] = {'Gillham-Electric'},
['CITEREFGillham2001'] = {'Gillham-Waterloo-City'},
['CITEREFGilliland1969'] = {'Gilliland'},
['CITEREFGilliland1994'] = {'Pop Chronicles 40s'},
['CITEREFGilliverMarshallWeiner2006'] = template_names['ME-ref'],
['CITEREFGilmanPeckColby1905'] = {'Cite NIE', 'New International Encyclopedia', 'NIE'},
['CITEREFGilmanPeckColby1916'] = {'New International Encyclopedia', 'NIE'},
['CITEREFGleaves1921'] = {'Gleaves'},
['CITEREFGlischinski1997'] = {'Glischinski-Santa Fe'},
['CITEREFGlöckner1983'] = {'Bach\'s compositions (sources)'},
['CITEREFGoldberg1981'] = {'Goldberg-Amtrak'},
['CITEREFGordon2001'] = {'Gordon-The Breaking of a Thousand Swords'},
['CITEREFGraham1974'] = {'Cite DCB'},
['CITEREFGrant1994'] = {'Grant-Death'},
['CITEREFGrant2010'] = {'Grant-Twilight'},
['CITEREFGrant2017'] = {'Grant-RailCo'},
['CITEREFGreenlaw2007'] = {'Greenlaw-Via Rail'},
['CITEREFGreenwoodEarnshaw1997'] = {'Greenwood&Earnshaw2nd'},
['CITEREFGregory1991'] = template_names['ODB'],
['CITEREFGregoryKazhdan1991'] = template_names['ODB'],
['CITEREFGregoryŠevčenko1991'] = template_names['ODB'],
['CITEREFGrete_Schemann1957'] = template_names['NDB'],
['CITEREFGrey2002'] = {'Australian Dictionary of Biography'},
['CITEREFGrierson1903'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGrierson1908'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGrierson1919'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGrierson1967'] = {'Cite LSI', 'LSI', 'Linguistic Survey of India'},
['CITEREFGriffith1991'] = template_names['ODB'],
['CITEREFGriffithsSmith1999'] = {'Griffiths-Sheds1'},
['CITEREFGriffithsSmith2000'] = {'Griffiths-Sheds2'},
['CITEREFGrothendieck1955'] = {'Grothendieck Produits Tensoriels Topologiques et Espaces Nucléaires'},
['CITEREFGrothendieck1973'] = {'Grothendieck Topological Vector Spaces'},
['CITEREFGrothendieckDieudonné1960'] = {'EGA'},
['CITEREFGrothendieckDieudonné1961'] = {'EGA'},
['CITEREFGrothendieckDieudonné1963'] = {'EGA'},
['CITEREFGrothendieckDieudonné1964'] = {'EGA'},
['CITEREFGrothendieckDieudonné1965'] = {'EGA'},
['CITEREFGrothendieckDieudonné1966'] = {'EGA'},
['CITEREFGrothendieckDieudonné1967'] = {'EGA'},
['CITEREFGrothendieckDieudonné1971'] = {'EGA'},
['CITEREFGroves2005'] = {'MSW3 Primates', 'MSW3 Groves'},
['CITEREFGrubb2005'] = {'MSW3 Artiodactyla'},
['CITEREFGuilland1967'] = {'Recherches sur les institutions byzantines'},
['CITEREFGulino2005'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFGunzburg1984'] = {'Gunzburg-History WAGR Steam'},
['CITEREFGunzburg1989'] = {'Gunzburg-MRWA Locomotives'},
----------< H >----------
['CITEREFHaarer2018'] = template_names['ODLA'],
['CITEREFHaldon1999'] = {'Warfare, State and Society in the Byzantine World, 565–1204'},
['CITEREFHalliday1985'] = {'Halliday-AustWineCompend'},
['CITEREFHalliday2008'] = {'Halliday-JHWAtlasAust2008'},
['CITEREFHalliday2009'] = {'Halliday-AustWineEncyc'},
['CITEREFHalm1991'] = {'Das Reich des Mahdi'},
['CITEREFHalm2003'] = {'Die Kalifen von Kairo'},
['CITEREFHalm2014'] = {'Kalifen und Assassinen'},
['CITEREFHalmos1982'] = {'Halmos A Hilbert Space Problem Book 1982'},
['CITEREFHalpenny1990'] = {'Canadabio'},
['CITEREFHammondAnderson1993'] = template_names['ME-ref'],
['CITEREFHammondScull1995'] = template_names['ME-ref'],
['CITEREFHammondScull2005'] = template_names['ME-ref'],
['CITEREFHammondScull2006'] = template_names['ME-ref'],
['CITEREFHans_Heinrich_Borcherdt1955'] = template_names['NDB'],
['CITEREFHans_Knudsen1972'] = template_names['NDB'],
['CITEREFHansen1988'] = {'Book-Hansen-US Nuclear Weapons'},
['CITEREFHartshorne1977'] = {'Hartshorne AG'},
['CITEREFHasumi2003'] = {'Hasumi-shiguehiko-ozu-2003'},
['CITEREFHaswell-Smith2004'] = {'Haswell-Smith'},
['CITEREFHaugic1908'] = {'Schaff-Herzog'},
['CITEREFHawting1987'] = {'The First Dynasty of Islam'},
['CITEREFHawting2000'] = {'The First Dynasty of Islam'},
['CITEREFHaynes2011'] = {'RubberBible92nd'},
['CITEREFHeinichen1728'] = {'Bach\'s compositions (sources)'},
['CITEREFHeinrich_Welti1890'] = {'Cite ADB'},
['CITEREFHeitman1903'] = {'Historical Register and Dictionary of the United States Army-1', 'Historical Register and Dictionary of the United States Army-2'},
['CITEREFHelgen2005'] = {'MSW3 Scandentia'},
['CITEREFHellmann1965'] = {'Bach\'s compositions (sources)'},
['CITEREFHenderson2004'] = {'Cite History of New York Playhouses'},
['CITEREFHenrici1725'] = {'Bach\'s compositions (sources)'},
['CITEREFHenryOrsmond1928'] = {'Raiatea family tree'},
['CITEREFHermann_Palm1876'] = {'Cite ADB'},
['CITEREFHerr2000'] = {'Herr-LN'},
['CITEREFHeschel2007'] = {'Encyclopaedia Judaica', 'Cite EJ', 'Cite Encyclopaedia Judaica'},
['CITEREFHidyHidyScottHofsummer2004'] = {'Hidy-Great Northern'},
['CITEREFHildHellenkemper1990'] = {'Tabula Imperii Byzantini'},
['CITEREFHildHellenkemper1994'] = {'Tabula Imperii Byzantini'},
['CITEREFHildRestle1981'] = {'Tabula Imperii Byzantini'},
['CITEREFHills,_Power_from_Steam'] = {'Book-Hills-Power from Steam'},
['CITEREFHills1989'] = {'Book-Hills-Power from Steam'},
['CITEREFHilmarJestremski2004'] = {'Schubert\'s compositions (references)'},
['CITEREFHilton1980'] = {'Hilton-Amtrak'},
['CITEREFHilton1990'] = {'Hilton Narrow Gauge'},
['CITEREFHiltonDue1960'] = {'Hilton-Interurban'},
['CITEREFHinton1986'] = {'HistoryofParliament'},
['CITEREFHirsch1906'] = {'Cite JE1906'},
['CITEREFHistoric_England'] = {'NHLE', 'National Heritage List for England'},
['CITEREFHistoric_England_Benty_Grange'] = {'NHLE'},
['CITEREFHistoric_Environment_Scotland'] = {'Canmore'},
['CITEREFHistoric_Environment_Scotland1972'] = {'Historic Environment Scotland'},
['CITEREFHistoric_Environment_Scotland1976'] = {'Historic Environment Scotland'},
['CITEREFHistoric_Environment_Scotland2020'] = {'Historic Environment Scotland'},
['CITEREFHistoric_Environment_Scotland:_Rusco_Tower2020'] = {'Historic Environment Scotland'},
['CITEREFHob.'] = {'Schubert\'s compositions (references)'},
['CITEREFHoffmanSmith2005'] = {'MSW3 Lagomorpha'},
['CITEREFHoffmann1738'] = {'Bach\'s compositions (sources)'},
['CITEREFHofmann1983'] = {'Bach\'s compositions (sources)'},
['CITEREFHofmann1987'] = {'Bach\'s compositions (sources)'},
['CITEREFHofmann1999'] = {'Bach\'s compositions (sources)'},
['CITEREFHolland1972'] = {'Holland-Vol 2'},
['CITEREFHolland1988'] = {'Cite DCB'},
['CITEREFHolland1989'] = {'Holland1989'},
['CITEREFHolland2001'] = {'Holland-Classic'},
['CITEREFHollingsworth1980'] = {'Hollingsworth-Atlas-Rigby'},
['CITEREFHollingsworth1991'] = template_names['ODB'],
['CITEREFHollingsworthCutler1991'] = template_names['ODB'],
['CITEREFHolmgren2003'] = {'EFloras'},
['CITEREFHoltBiddle1986'] = {'Holt-NorthWest'},
['CITEREFHolton1989'] = {'Holton-Reading-1'},
['CITEREFHonigmann1935'] = {'Byzance et les Arabes'},
['CITEREFHopley1983'] = {'Australian Dictionary of Biography'},
['CITEREFHort1911'] = {'DCBL'},
['CITEREFHorváth1966'] = {'Horváth Topological Vector Spaces and Distributions Volume 1 1966'},
['CITEREFHounshell1984'] = {'Hounshell1984'},
['CITEREFHovannisian1967'] = {'Cite Armenia on the Road to Independence'},
['CITEREFHovannisian1971'] = {'Cite The Republic of Armenia Volume 1'},
['CITEREFHovannisian1982'] = {'Cite The Republic of Armenia Volume 2'},
['CITEREFHovannisian1996'] = {'Cite The Republic of Armenia Volume 3', 'Cite The Republic of Armenia Volume 4'},
['CITEREFHowes1995'] = {'Howes Modern Analysis and Topology 1995'},
['CITEREFHudson1997'] = {'Country study'},
['CITEREFHughes1979'] = {'Hughes-SteamLocosIndia3'},
['CITEREFHughes1990'] = {'Hughes-IndianLocos1'},
['CITEREFHughes1992'] = {'Hughes-IndianLocos2'},
['CITEREFHughes1994'] = {'Hughes-IndianLocos3'},
['CITEREFHughes1996'] = {'Hughes-IndianLocos4'},
['CITEREFHummel1943'] = {'Cite ECCP'},
['CITEREFHumphreys2018'] = template_names['ODLA'],
['CITEREFHunter-Crawley2018'] = template_names['ODLA'],
['CITEREFHunter1949'] = {'Hunter-Steamboats-1949'},
['CITEREFHunter1993'] = {'Hunter-Steamboats-1993'},
['CITEREFHunter2008'] = {'Country study'},
['CITEREFHunter2012'] = {'Cite HGOC', 'Cite Hunter'},
['CITEREFHutterer2005'] = {'MSW3 Soricomorpha'},
['CITEREFHütter2012'] = {'Hütter-50bis53'},
['CITEREFHütter2015'] = {'Hütter-54bis59'},
['CITEREFHütter2021'] = {'Hütter-60bis91'},
----------< I >----------
['CITEREFIacocca1984'] = {'Iacocca1984'},
['CITEREFIbn_Khallikan1843'] = {'Ibn Khallikan\'s Biographical Dictionary'},
['CITEREFImber2002'] = {'Imber-The Ottoman Empire, 1300–1650'},
['CITEREFInalcik1989'] = {'Setton-A History of the Crusades'},
['CITEREFIshino1998'] = {'Teishajo'},
['CITEREFIvey1919'] = {'Ivey-Marquette'},
----------< J >----------
['CITEREFJackson1908'] = {'Schaff-Herzog'},
['CITEREFJackson1995'] = {'Cite enc-nyc'},
['CITEREFJackson2010'] = {'Cite enc-nyc2'},
['CITEREFJacobs1904'] = {'Cite Jewish Encyclopedia'},
['CITEREFJarchow1981'] = {'Jarchow Locally Convex Spaces'},
['CITEREFJohn_O'Donovan1856'] = {'Cite AFM'},
['CITEREFJohnson1906'] = {'BDA1906', 'Cite BDA1906'},
['CITEREFJohnstonWelshSchafer2001'] = {'Johnston-Streamliner'},
['CITEREFJones2000'] = {'New Cambridge Medieval History'},
['CITEREFJones2011'] = {'Cite EPD'},
['CITEREFJordan2002'] = {'Jordan-WineWABest'},
['CITEREFJoshi1983'] = {'Joshi Introduction to General Topology'},
['CITEREFJoslen2003'] = {'Joslen-OOB'},
['CITEREFJowett1867'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFJowett1989'] = {'Jowett-Atlas', 'Carnarvonshire Railway'},
['CITEREFJowett2000'] = {'Jowett-Nationalised'},
['CITEREFJullien2018'] = template_names['ODLA'],
['CITEREFJupp1986'] = {'HistoryofParliament'},
----------< K >----------
['CITEREFK.'] = {'Schubert\'s compositions (references)'},
['CITEREFKadinsky2016'] = {'Cite Hidden Waters NYC'},
['CITEREFKaegi1991'] = template_names['ODB'],
['CITEREFKalla-Bishop1986'] = {'Kalla-Bishop-FS-Steam'},
['CITEREFKamp1981'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFKang2008'] = {'Country study'},
['CITEREFKarl_Frohnmeyer1953'] = template_names['NDB'],
['CITEREFKarnow1989'] = {'Cite-Karnow'},
['CITEREFKartesz2014'] = {'BONAP'},
['CITEREFKazemzadeh1951'] = {'Cite The Struggle for Transcaucasia'},
['CITEREFKazemzadeh1951'] = {'The Struggle for Transcaucasia'},
['CITEREFKazhdan1991'] = template_names['ODB'],
['CITEREFKazhdanCutler1991'] = template_names['ODB'],
['CITEREFKazhdanJeffreys1991'] = template_names['ODB'],
['CITEREFKazhdanŠevčenko1991'] = template_names['ODB'],
['CITEREFKeefe2006'] = {'Schubert\'s compositions (references)'},
['CITEREFKeightley1999'] = {'Cite Cambridge History of China'},
['CITEREFKeller1937'] = {'Bach\'s compositions (sources)'},
['CITEREFKelley1975'] = {'Kelley General Topology'},
['CITEREFKelly1988'] = {'Cite GEIL'},
['CITEREFKellyBurrage1920'] = {'Cite AMB1920'},
['CITEREFKennedy1998'] = {'The Cambridge History of Egypt', 'Cite Kennedy 1998', 'Cambridge History of Egypt'},
['CITEREFKennedy2001'] = {'Kennedy-The Armies of the Caliphs'},
['CITEREFKennedy2004'] = {'The Prophet and the Age of the Caliphates'},
['CITEREFKennedy2007'] = {'Kennedy-The Great Arab Conquests'},
['CITEREFKennedy2016'] = {'The Prophet and the Age of the Caliphates'},
['CITEREFKenyon2011'] = {'Bach\'s compositions (sources)'},
['CITEREFKerrigan1995'] = {'Shakespeare sonnets bibliography'},
['CITEREFKhaleelulla1982'] = {'Khaleelulla Counterexamples in Topological Vector Spaces'},
['CITEREFKhan2012'] = {'Cite Banglapedia'},
['CITEREFKim1994'] = {'Country study'},
['CITEREFKirnberger1774'] = {'Bach\'s compositions (sources)'},
['CITEREFKirnberger1780'] = {'Bach\'s compositions (sources)'},
['CITEREFKlein2006'] = {'Klein-UP-2'},
['CITEREFKobayashi1978'] = {'Bach\'s compositions (sources)'},
['CITEREFKoderHild1976'] = {'Tabula Imperii Byzantini'},
['CITEREFKoderSoustalKoder1998'] = {'Tabula Imperii Byzantini'},
['CITEREFKoeppel2015'] = {'Cite citygrid'},
['CITEREFKofos1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFKohler1902'] = {'Cite Jewish Encyclopedia'},
['CITEREFKolde1914'] = {'Schaff-Herzog'},
['CITEREFKoliopoulos1978'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFKolmogorovFomin1957'] = {'Kolmogorov Fomin Elements of the Theory of Functions and Functional Analysis'},
['CITEREFKonrad_Ameln1985'] = template_names['NDB'],
['CITEREFKorkotyan1932'] = {'Cite The Population of Soviet Armenia'},
['CITEREFKoska2011'] = {'Bach\'s compositions (sources)'},
['CITEREFKratville1962'] = {'Kratville-SSL'},
['CITEREFKretzschmar1910'] = {'Bach\'s compositions (sources)'},
['CITEREFKube2009'] = {'Schubert\'s compositions (references)'},
['CITEREFKubrusly2011'] = {'Kubrusly The Elements of Operator Theory 2nd Edition 2011'},
['CITEREFKulp1972'] = {'Kulp-Lehigh and New England'},
['CITEREFKuznik2008'] = {'Bach\'s compositions (sources)'},
['CITEREFKöthe1969'] = {'Köthe Topological Vector Spaces I'},
['CITEREFKöthe1979'] = {'Köthe Topological Vector Spaces II'},
['CITEREFKöthe1983'] = {'Köthe Topological Vector Spaces I'},
['CITEREFKülzer2008'] = {'Tabula Imperii Byzantini'},
----------< L >----------
['CITEREFLa_Porta2018'] = template_names['ODLA'],
['CITEREFLacourcière1974'] = {'Cite DCB'},
['CITEREFLadefogedMaddieson1996'] = {'SOWL'},
['CITEREFLandau-Tasseron2010'] = {'New Cambridge History of Islam'},
['CITEREFLandauCondit1996'] = {'Cite nysky'},
['CITEREFLandmann1907'] = {'Bach\'s compositions (sources)'},
['CITEREFLang2002'] = {'Lang Algebra'},
['CITEREFLane1973'] = {'Venice: A Maritime Republic'},
['CITEREFLaërtius1925'] = {'Cite Lives of the Eminent Philosophers', 'Cite LotEP'},
['CITEREFLe_Quien1740'] = {'Oriens Christianus'},
['CITEREFLe_Strange1900'] = {'Baghdad During the Abbasid Caliphate'},
['CITEREFLe_Strange1905'] = {'Lands of the Eastern Caliphate'},
['CITEREFLe_Strange1922'] = {'Baghdad During the Abbasid Caliphate'},
['CITEREFLeblanc1979'] = {'Cite DCB'},
['CITEREFLee1903'] = {'Cite DNBIE'},
['CITEREFLee2018'] = template_names['ODLA'],
['CITEREFLegifrance'] = {'Cite Legifrance', 'Cite Légifrance'},
['CITEREFLeisingerWollny1993'] = {'Bach\'s compositions (sources)'},
['CITEREFLev1999'] = {'Saladin in Egypt'},
['CITEREFLevitan2001'] = {'Springer'},
['CITEREFLewin1925'] = {'Lewin-EarlyRail'},
['CITEREFLewis1969'] = {'Setton-A History of the Crusades'},
['CITEREFLewis1986'] = {'Lewis-Shortline-1986'},
['CITEREFLewis1991'] = {'Lewis-Shortline-1991'},
['CITEREFLewis1996'] = {'Lewis-Shortline-1996'},
['CITEREFLi2002'] = {'Cite Cambridge History of China'},
['CITEREFLiederNet_Archive'] = {'Schubert\'s compositions (references)'},
['CITEREFLighthouses_of_Australia_Inc'] = {'Cite loa'},
['CITEREFLilieLudwigPratschZielke1998–2013'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke1999'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2000'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2001'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2002'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2009'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLilieLudwigPratschZielke2013'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFLind1986'] = {'Lind-Limiteds'},
['CITEREFLindsay1968'] = {'Lindsay-CanalScot'},
['CITEREFLittle1974'] = {'Cite DCB'},
['CITEREFLoeweShaughnessy1999'] = {'Cite Cambridge History of China'},
['CITEREFLohrThielmann1988'] = {'Lohr-EFA2.7'},
['CITEREFLongnon1969'] = {'Setton-A History of the Crusades'},
['CITEREFLoverance2018'] = template_names['ODLA'],
['CITEREFLowryMcCardle1974'] = {'A History of Mississippi'},
['CITEREFLukonin1983'] = {'Cambridge History of Iran'},
['CITEREFLurie'] = {'Lurie-HA'},
['CITEREFLuscombeRiley-Smith2004'] = {'New Cambridge Medieval History'},
['CITEREFLuttrell1975'] = {'Setton-A History of the Crusades'},
['CITEREFLuttrell1987'] = {'DBI'},
['CITEREFLynch2004'] = {'Lynch-Penn Central'},
['CITEREFLynch2005'] = {'Lynch-New Haven passenger'},
['CITEREFLynch2018'] = template_names['ODLA'],
['CITEREFLéger1990'] = {'Cite DCB'},
['CITEREFle_Fleming1953'] = {'RCTS-LocosGWR-8'},
['CITEREFle_Fleming1954'] = {'RCTS-LocosGWR-7'},
['CITEREFle_Fleming1958'] = {'RCTS-LocosGWR-5'},
['CITEREFle_Fleming1960'] = {'RCTS-LocosGWR-8'},
['CITEREFle_Fleming1962'] = {'RCTS-LocosGWR-9'},
----------< M >----------
['CITEREFMacDermot1927'] = {'Infobox GWR'},
['CITEREFMacDermot1931'] = {'Infobox GWR'},
['CITEREFMacFarquharFairbank1987'] = {'Cite Cambridge History of China'},
['CITEREFMacFarquharFairbank1991'] = {'Cite Cambridge History of China'},
['CITEREFMachinery's_Handbook1996'] = {'MachinerysHandbook25e'},
['CITEREFMacMullen1970'] = {'MacMullen-Paddle-Wheel'},
['CITEREFMadelung1978'] = {'EI2'},
['CITEREFMagdalino2002'] = {'The Empire of Manuel I Komnenos'},
['CITEREFMaiken1989'] = {'Maiken-Night Trains'},
['CITEREFMailer2004'] = {'Mailer-Omaha Road'},
['CITEREFManfred_Knedlik2007'] = {'BBKL'},
['CITEREFMarre1995'] = {'Marre-diesel-50'},
['CITEREFMarshall1823'] = {'Cite RNB1823'},
['CITEREFMarshall1824'] = {'Cite RNB1823'},
['CITEREFMarshall1825'] = {'Cite RNB1823'},
['CITEREFMarshall1827'] = {'Cite RNB1823'},
['CITEREFMarshall1828'] = {'Cite RNB1823'},
['CITEREFMarshall1829'] = {'Cite RNB1823'},
['CITEREFMarshall1830'] = {'Cite RNB1823'},
['CITEREFMarshall1831'] = {'Cite RNB1823'},
['CITEREFMarshall1832'] = {'Cite RNB1823'},
['CITEREFMarshall1833'] = {'Cite RNB1823'},
['CITEREFMarshall1835'] = {'Cite RNB1823'},
['CITEREFMarshall1969'] = {'Lancashire & Yorkshire Railway 1'},
['CITEREFMarshall1970'] = {'Lancashire & Yorkshire Railway 2'},
['CITEREFMarshall1972'] = {'Lancashire & Yorkshire Railway 3'},
['CITEREFMarshall2001'] = {'Marshall-INGSR'},
['CITEREFMartin_Persch1992'] = {'BBKL'},
['CITEREFMartin_Persch1993'] = {'BBKL'},
['CITEREFMartin_Persch1996'] = {'BBKL'},
['CITEREFMartindale1980'] = {'Prosopography of the Later Roman Empire', 'PLRE'},
['CITEREFMartindale1992'] = {'Prosopography of the Later Roman Empire', 'PLRE'},
['CITEREFMartindaleJonesMorris1971'] = {'Prosopography of the Later Roman Empire', 'PLRE'},
['CITEREFMaul2005'] = {'Bach\'s compositions (sources)'},
['CITEREFMayGray2006'] = {'MayGray-WAGRPassCar'},
['CITEREFMcArthurMcArthur2003'] = {'Cite ogn', 'Cite OGN', 'Cite Oregon Geographic Names'},
['CITEREFMcCorduck2004'] = {'McCorduck 2004'},
['CITEREFMcCurdyRogers1902'] = {'Cite Jewish Encyclopedia'},
['CITEREFMcDonnell2015'] = {'McDonnell-Locomotives-2nd'},
['CITEREFMcGeerNesbittOikonomides2001'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFMcGeerNesbittOikonomides2005'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFMcGhee2008'] = {'Cite McGhee 2008'},
['CITEREFMcKitterick1995'] = {'New Cambridge Medieval History'},
['CITEREFMeiningen1704'] = {'Bach\'s compositions (sources)'},
['CITEREFMeints1992'] = {'Meints-Companies'},
['CITEREFMeints2005'] = {'Meints-Lines'},
['CITEREFMelamed1988'] = {'Bach\'s compositions (sources)'},
['CITEREFMelamed1995'] = {'Bach\'s compositions (sources)'},
['CITEREFMennell1892'] = {'Dictionary of Australasian Biography'},
['CITEREFMetcalfe2009'] = {'The Muslims of Medieval Italy'},
['CITEREFMiddleton1961'] = {'Middleton-Interurban'},
['CITEREFMiddleton2001'] = {'Middleton-Electrified-2nd'},
['CITEREFMiddleton2002'] = {'Middleton-PRR-Under-Wire'},
['CITEREFMiddletonSmerkDiehl2007'] = {'Encyclopedia of North American Railroads'},
['CITEREFMillar2011'] = {'NZR Steam Locomotive'},
['CITEREFMiller1908'] = {'The Latins in the Levant', 'Latins in the Levant'},
['CITEREFMiller1921'] = {'Essays on the Latin Orient'},
['CITEREFMills1977'] = {'Mills-Columbia'},
['CITEREFMinnich2008'] = {'Country study'},
['CITEREFMiramar_Ship_Index'] = {'Csr', 'Cite ship register'},
['CITEREFMitchell1965'] = {'Mitchell TOC'},
['CITEREFMittermeierKonstantHawkinsLouis2006'] = {'LoM2'},
['CITEREFMittermeierLouisRichardsonSchwitzer2010'] = {'LoM3'},
['CITEREFMittermeierTattersallKonstantMeyers1994'] = {'LoM1'},
['CITEREFMoore1875'] = {'Cite CEM'},
['CITEREFMorana1993'] = {'Bach\'s compositions (sources)'},
['CITEREFMorrison1999'] = {'Cite Morrison Broadway'},
['CITEREFMoschonas1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFMoteTwitchett1988'] = {'Cite Cambridge History of China'},
['CITEREFMozartHaydnHaydn2008'] = {'Schubert\'s compositions (references)'},
['CITEREFMullié1852'] = {'Cite Mullié', 'Mullié'},
['CITEREFMunkres1974'] = {'Munkres Topology'},
['CITEREFMunkres2000'] = {'Munkres Topology'},
['CITEREFMurray2006'] = {'Murray-Illinois Central'},
['CITEREFMusserCarleton2005'] = {'MSW3 Muroidea'},
['CITEREFMyersWang2002'] = {'Cite Cambridge History of China'},
['CITEREFMyrick1992'] = {'Railroads of Nevada and Eastern California 1', 'Railroads of Nevada and Eastern California 2'},
['CITEREFMüller,_Hans-Christian1966'] = template_names['NDB'],
----------< N >----------
['CITEREFNSA_II,_15'] = {'Schubert\'s compositions (references)'},
['CITEREFNSA_scores'] = {'Schubert\'s compositions (references)'},
['CITEREFNSA_website'] = {'Schubert\'s compositions (references)'},
['CITEREFNariciBeckenstein2011'] = {'Narici Beckenstein Topological Vector Spaces'},
['CITEREFNemiroffBonnell1998'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2004'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2005'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2006'] = {'Cite APOD'},
['CITEREFNemiroffBonnell2007'] = {'Cite APOD'},
['CITEREFNersessian2018'] = template_names['ODLA'],
['CITEREFNesbittMorrisson2009'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNesbittOikonomides1991'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNesbittOikonomides1994'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNesbittOikonomides1996'] = {'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
['CITEREFNestruev2020'] = {'Nestruev Smooth Manifolds and Observables 2020'},
['CITEREFNeukirch1999'] = {'Neukirch ANT'},
['CITEREFNeukirchSchmidtWingberg2000'] = {'Neukirch et al. CNF'},
['CITEREFNew_Cambridge_Medieval_History'] = {'New Cambridge Medieval History'},
['CITEREFNew_York_City_Landmarks_Preservation_CommissionDolkartPostal2009'] = {'Cite nycland'},
['CITEREFNewbould1999'] = {'Schubert\'s compositions (references)'},
['CITEREFNicholson2018'] = template_names['ODLA'],
['CITEREFNicholsonCanepaDaryaee2018'] = template_names['ODLA'],
['CITEREFNicol1968'] = {'The Byzantine Family of Kantakouzenos'},
['CITEREFNicol1984'] = {'The Despotate of Epiros, 1267–1479'},
['CITEREFNicol1988'] = {'Byzantium and Venice: A Study in Diplomatic and Cultural Relations'},
['CITEREFNicol1992'] = {'The Immortal Emperor: The Life and Legend of Constantine Palaiologos, Last Emperor of the Romans'},
['CITEREFNicol1993'] = {'The Last Centuries of Byzantium, 1261–1453', 'The Last Centuries of Byzantium'},
['CITEREFNicol1994'] = {'The Byzantine Lady: Ten Portraits, 1250–1500'},
['CITEREFNock1974'] = {'Nock-EustonGlasgow'},
----------< O >----------
['CITEREFO'Byrne1849'] = {'Cite NBD1849'},
['CITEREFO'ConnorRobertson'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'ConnorRobertson1996'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'ConnorRobertson2000'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'ConnorRobertson2004'] = {'MacTutor Biography', 'MacTutor'},
['CITEREFO'Donoghue1897'] = {'Cite DNB'},
['CITEREFODB'] = template_names['ODB'],
['CITEREFODLA'] = template_names['ODLA'],
['CITEREFOdisheli2018'] = template_names['ODLA'],
['CITEREFOfficial_Army_Register1865'] = {'Official Army Register of the Volunteer Force of the United States Army'},
['CITEREFOfficial_Army_Register1867'] = {'Official Army Register of the Volunteer Force of the United States Army'},
['CITEREFOfficial_Guide_of_the_Railways1950'] = {'Official Guide of the Railways'},
['CITEREFOgorek2012'] = {'Ogorek-South Shore'},
['CITEREFOikonomides1991'] = template_names['ODB'],
['CITEREFOikonomou1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFOrmsby1982'] = {'Cite DCB'},
----------< P >----------
['CITEREFPLP'] = {'Prosopographisches Lexikon der Palaiologenzeit', 'PLP'},
['CITEREFPalmer1875'] = {'Cite ADB'},
['CITEREFPalmerStewart1965'] = {'Palmer & Stewart'},
['CITEREFParkhouse,_BRHIC,_Vol_1'] = {'Book-Parkhouse-BRHIC-1'},
['CITEREFPatience1996'] = {'Patience-SteamTwilight'},
['CITEREFPatton2005'] = {'MSW3 Geomyidae'},
['CITEREFPawson1979'] = {'Pawson-Delaware Valley'},
['CITEREFPaxtonBourne1985'] = {'Paxton-Bourne'},
['CITEREFPeck1898'] = {'HDCA'},
['CITEREFPerlis2001'] = {'Springer'},
['CITEREFPerreault2004'] = {'Bach\'s compositions (sources)'},
['CITEREFPeterson2002'] = {'Cite Cambridge History of China'},
['CITEREFPeterson2016'] = {'Cite Cambridge History of China'},
['CITEREFPetropoulosKoumarianou1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFPetrucci1982'] = {'DBI'},
['CITEREFPfau2008'] = {'Bach\'s compositions (sources)'},
['CITEREFPikros1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFPinkepank1973'] = {'Pinkepank diesel spotters guide 2'},
['CITEREFPlantlist2016'] = {'Plantlist'},
['CITEREFPlaten1976'] = {'Bach\'s compositions (sources)'},
['CITEREFPloumidisAlexiou1974'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFPmbZ'] = {'Prosopographie der mittelbyzantinischen Zeit', 'PMBZ'},
['CITEREFPolemis1968'] = {'Polemis-The Doukai'},
['CITEREFPope2007'] = {'Encyclopaedia Judaica', 'Cite EJ', 'Cite Encyclopaedia Judaica'},
['CITEREFPopplewell'] = {'Popplewell-Gazetteer'},
['CITEREFPopplewell1989'] = {'Popplewell-Gazetteer'},
['CITEREFPotts2018'] = template_names['ODLA'],
['CITEREFPottsCanepa2018'] = template_names['ODLA'],
['CITEREFPourshariati2017'] = {'Encyclopædia Iranica Online'},
['CITEREFPozza1992'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFPrawer1985'] = {'Setton-A History of the Crusades'},
['CITEREFPritsak1991'] = template_names['ODB'],
['CITEREFProsopographie_der_mittelbyz._Zeit'] = {'Prosopographie der mittelbyzantinischen Zeit'},
----------< Q >----------
['CITEREFQuick2009'] = {'Quick-Stations'},
['CITEREFQuick2019'] = {'Quick-stations-5'},
['CITEREFQuick2020'] = {'Quick-stations-5'},
['CITEREFQuick2022'] = {'Quick-stations-5'},
['CITEREFQuick2023'] = {'Quick-stations-5.05'},
----------< R >----------
['CITEREFRailway_Atlas2010'] = {'Eisenbahnatlas Italien'},
['CITEREFRailway_Atlas2012'] = {'Eisenbahnatlas Schweiz'},
['CITEREFRailway_Atlas2020'] = {'Eisenbahnatlas Deutschland'},
['CITEREFRailway_Atlas2021'] = {'Eisenbahnatlas Österreich'},
['CITEREFRailway_Atlas2024'] = {'Eisenbahnatlas Schweiz 2024'},
['CITEREFRamaer1974'] = {'Ramaer-SteamLocosEAR'},
['CITEREFRansome-Wallis1971'] = {'Ransome-Wallis 1'},
['CITEREFRansome-Wallis2001'] = {'Ransome-Wallis Encyclopedia'},
['CITEREFRateliff2007'] = template_names['ME-ref'],
['CITEREFRavegnano2000'] = {'DBI'},
['CITEREFReed1953'] = {'RCTS-LocosGWR-2'},
['CITEREFReed1956'] = {'RCTS-LocosGWR-3'},
['CITEREFReed1975'] = {'Reed-Streamline era'},
['CITEREFReed1997'] = {'Schubert\'s compositions (references)'},
['CITEREFReinhard_Tenberg1990'] = {'BBKL'},
['CITEREFRettinghaus2020'] = {'BDh'},
['CITEREFReuter2000'] = {'New Cambridge Medieval History'},
['CITEREFReynolds1921'] = {'Cite Collier\'s', 'Collier\'s'},
['CITEREFReynoldsOroszi2000'] = {'Reynolds-BO'},
['CITEREFRezakhani2018'] = template_names['ODLA'],
['CITEREFRichter2018'] = {'BDh'},
['CITEREFRigo2005'] = template_names['ODB'],
['CITEREFRines1920'] = {'Americana','Cite Americana'},
['CITEREFRipleyDana1863'] = {'New American Cyclopedia'},
['CITEREFRipleyDana1864'] = {'New American Cyclopedia'},
['CITEREFRipleyDana1879'] = {'Cite AmCyc'},
['CITEREFRistaino1988'] = {'Country study'},
['CITEREFRobert_Eitner1891'] = {'Cite ADB'},
['CITEREFRobertson1983'] = {'Robertson-OriginScot'},
['CITEREFRobertson1998'] = {'Robertson-Western Railroad-4'},
['CITEREFRobins2017'] = {'Cite New York Art Deco'},
['CITEREFRockafellarWets2009'] = {'Rockafellar Wets Variational Analysis 2009 Springer'},
['CITEREFRoe1916'] = {'Roe1916'},
['CITEREFRoe1937'] = {'Roe1937'},
['CITEREFRolt1965'] = {'Rolt1965'},
['CITEREFRoltKichenside1982'] = {'Rolt-Red'},
['CITEREFRose1857'] = {'Cite Newgenbio'},
['CITEREFRosenfeld1974'] = template_names['NDB'],
['CITEREFRosenzweigBlackmar1992'] = {'Cite Central Park History', 'Cite Central Park history'},
['CITEREFRowe2002'] = {'Cite Cambridge History of China'},
['CITEREFRowledge1975'] = {'Rowledge-Engines of the LMS'},
['CITEREFRowledge1993'] = {'Rowledge-Irish Steam Register'},
['CITEREFRowlett'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2007'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2012'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2013'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2016'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowlett2017'] = {'Cite rowlett', 'Cite Rowlett'},
['CITEREFRowling1997'] = {'HP1ref'},
['CITEREFRowling1998'] = {'HP2ref'},
['CITEREFRowling1999'] = {'HP3ref'},
['CITEREFRowling2000'] = {'HP4ref'},
['CITEREFRowling2003'] = {'HP5ref'},
['CITEREFRowling2005'] = {'HP6ref'},
['CITEREFRowling2007'] = {'HP7ref'},
['CITEREFRudin1973'] = {'Rudin Walter Functional Analysis'},
['CITEREFRudin1991'] = {'Rudin Walter Functional Analysis'},
['CITEREFRunciman1951'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1951–1954'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1952'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1954'] = {'Runciman-A History of the Crusades'},
['CITEREFRunciman1989'] = {'Runciman-A History of the Crusades'},
['CITEREFRussell1985'] = {'Setton-A History of the Crusades', 'Encyclopædia Iranica Online', 'Encyclopædia Iranica', 'Encyclopaedia Iranica', 'Cite Encyclopædia Iranica Online'},
['CITEREFRussellNorvig2003'] = {'Russell Norvig 2003'},
['CITEREFRybczynski2000'] = {'Rybczynski2000'},
----------< S >----------
['CITEREFSR_staff2013'] = {'Houston family tree'},
['CITEREFSalo2004'] = template_names['ME-ref'],
['CITEREFSanders1998'] = {'The Cambridge History of Egypt', 'Cambridge History of Egypt'},
['CITEREFSanders2003'] = {'Sanders-Indiana'},
['CITEREFSanders2006'] = {'Sanders-Heartland'},
['CITEREFSanders2007'] = {'Sanders-Akron'},
['CITEREFSansom1978'] = {'Sansom-History of Japan-2'},
['CITEREFSarikakis1974'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFSaunders2001'] = {'Saunders-Merging Lines'},
['CITEREFSaunders2013'] = {'Saunders-Giants of the Seas'},
['CITEREFSavadaShaw1992'] = {'Country study'},
['CITEREFSchaeferWolff1999'] = {'Schaefer Wolff Topological Vector Spaces'},
['CITEREFSchafer1991'] = {'All Aboard Amtrak'},
['CITEREFSchafer1996'] = {'Schafer-Classic-Railroads-1'},
['CITEREFSchafer1998'] = {'Schafer-Vintage Diesel'},
['CITEREFSchafer2000'] = {'Schafer-More-Classic'},
['CITEREFSchafer2003'] = {'Schafer-Classic-Railroads-3'},
['CITEREFSchaferSolomon1997'] = {'Schafer-Pennsylvania'},
['CITEREFSchaferWelsh1997'] = {'Schafer-Classic'},
['CITEREFSchaferWelsh2002'] = {'Schafer-Streamliners'},
['CITEREFSchaferWelshHolland2001'] = {'Schafer-American passenger train'},
['CITEREFSchaff-Herzog'] = {'Schaff-Herzog'},
['CITEREFScharf1996'] = {'Scharf-History'},
['CITEREFSchechter1996'] = {'Schechter Handbook of Analysis and Its Foundations'},
['CITEREFScheide1960'] = {'Bach\'s compositions (sources)'},
['CITEREFSchicht1805'] = {'Bach\'s compositions (sources)'},
['CITEREFSchilling1997'] = {'Schilling-pop-culture'},
['CITEREFShirer1960'] = {'Shirer-Third Reich'},
['CITEREFSchlitter2005'] = {'MSW3 Tubulidentata'},
['CITEREFSchmieder1950'] = {'Bach\'s compositions (sources)'},
['CITEREFSchmieder1990'] = {'Bach\'s compositions (sources)'},
['CITEREFSchmitz1870'] = {'Cite DGRBM'},
['CITEREFSchnabel1987'] = {'Schnabel-EFA2.5'},
['CITEREFSchneider1907'] = {'Bach\'s compositions (sources)'},
['CITEREFSchneider1912'] = {'Bach\'s compositions (sources)'},
['CITEREFScholze1736'] = {'Bach\'s compositions (sources)'},
['CITEREFSchroeter1961'] = {'Schroeter-Eisenbahnen'},
['CITEREFSchroeterRamaer1993'] = {'Schroeter-Ramaer-Eisenbahnen'},
['CITEREFSchubert-online'] = {'Schubert\'s compositions (references)'},
['CITEREFSchubert1968'] = {'Schubert Topology'},
['CITEREFSchulenberg2010'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulenberg2013'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulze1980'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulze1983'] = {'Bach\'s compositions (sources)'},
['CITEREFSchulze1984'] = {'Bach\'s compositions (sources)'},
['CITEREFSchwieterman2001'] = {'Schwieterman-Leaves-Eastern'},
['CITEREFSchwieterman2004'] = {'Schwieterman-Leaves-Western'},
['CITEREFScottNegus2011'] = {'Scott-Negus-Cellar Door'},
['CITEREFScribbins1970'] = {'Scribbins-Hiawatha'},
['CITEREFScribbins2007'] = {'Scribbins-Hiawatha-2007'},
['CITEREFScribbins2008'] = {'Scribbins-400-2008', 'Scribbins-Remembered'},
['CITEREFSearle'] = {'Cite sslidx'},
['CITEREFSearle1980'] = {'Searle 1980'},
['CITEREFSemmensGoldfinch2003'] = {'Book-Semmens-Goldfinch-How Steam Locomotives Really Work'},
['CITEREFSetton1975'] = {'Setton-A History of the Crusades'},
['CITEREFSetton1976'] = {'The Papacy and the Levant'},
['CITEREFSetton1978'] = {'The Papacy and the Levant'},
['CITEREFSetton1984'] = {'The Papacy and the Levant'},
['CITEREFSettonHazard1975'] = {'Setton-A History of the Crusades'},
['CITEREFSfyroeras1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFShaughnessy1997'] = {'Shaughnessy-DH'},
['CITEREFShaw1978'] = {'Shaw-RailroadAccidents'},
['CITEREFSherrod1952'] = {'Sherrod-Marine Corps'},
['CITEREFShiji'] = {'Cite Shiji'},
['CITEREFShindo2004'] = {'Kaneto-shindo-shinario-jinsei'},
['CITEREFShippey2001'] = template_names['ME-ref'],
['CITEREFShippey2005'] = template_names['ME-ref'],
['CITEREFShoshani2005'] = {'MSW3 Shoshani'},
['CITEREFShtern2001'] = {'Springer', 'SpringerEOM'},
['CITEREFSiegele1957'] = {'Bach\'s compositions (sources)'},
['CITEREFSilanos2014'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFSilke2006'] = {'O\'Donnell family tree'},
['CITEREFSima'] = {'Cite Shiji'},
['CITEREFSimaSima'] = {'Cite Shiji'},
['CITEREFSimmons2005'] = {'MSW3 Chiroptera'},
['CITEREFSimon1966'] = {'Simon-Wines Australia'},
['CITEREFSimonWarner2011'] = {'Amtrak By the Numbers'},
['CITEREFSimonWarnerEuDaly2023'] = {'Amtrak by the Numbers 2'},
['CITEREFSinclair1911'] = {'DCBL'},
['CITEREFSinger1905'] = {'Jewish Encyclopedia'},
['CITEREFSix1934'] = {'Cite Six', 'Cite six'},
['CITEREFSkjærvø2018'] = template_names['ODLA'],
['CITEREFSkoulatos1980'] = {'Les personnages byzantins de l\'Alexiade'},
['CITEREFSloan1964'] = {'Sloan1964'},
['CITEREFSmid2008'] = {'Smid2008'},
['CITEREFSmid2010'] = {'Smid2010'},
['CITEREFSmith1854'] = {'Cite DGRG', 'DGRG'},
['CITEREFSmith1870'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith1873'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith1876'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith1880'] = {'DGRBM', 'Cite DGRBM'},
['CITEREFSmith2010'] = {'Smith-Cruise Ships-2010'},
['CITEREFSmithJohnstonAlvesHackländer2018'] = {'Lagomorphs2018'},
['CITEREFSolomentsev2001'] = {'Springer', 'SpringerEOM'},
['CITEREFSolomon2000'] = {'Solomon-American Diesel', 'Solomon-UP'},
['CITEREFSolomon2003'] = {'Solomon-Masterpieces'},
['CITEREFSolomon2004'] = {'Solomon-Amtrak'},
['CITEREFSolomon2005'] = {'Solomon-CSX', 'Solomon-SP-Passenger'},
['CITEREFSolomon2006'] = {'Solomon-EMD Locomotives'},
['CITEREFSolomon2007'] = {'Solomon-SP'},
['CITEREFSolomon2011'] = {'Solomon-Modern Diesel', 'Solomon-Electro-Motive'},
['CITEREFSolomon2012'] = {'Solomon-North American Locomotives'},
['CITEREFSolomon2014'] = {'Solomon-GE and EMD'},
['CITEREFSolomonSchafer2007'] = {'Solomon-New York Central'},
['CITEREFSolopova2009'] = template_names['ME-ref'],
['CITEREFSorensen1956'] = {'Sorensen1956'},
['CITEREFSoustal1991'] = {'Tabula Imperii Byzantini'},
['CITEREFSoustalKoder1981'] = {'Tabula Imperii Byzantini'},
['CITEREFSpielhoff1991'] = {'Spielhoff-EL'},
['CITEREFSpitta1894'] = {'Bach\'s compositions (sources)'},
['CITEREFSpitta1899'] = {'Bach\'s compositions (sources)'},
['CITEREFSpringirth2016'] = {'Springirth-Philadelphia'},
['CITEREFSpyropoulos1928'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFStagner1993'] = {'Stagner-Transition'},
['CITEREFStansfield1999'] = {'Stansfield-AyrRenfrew'},
['CITEREFStatistical_Yearbook_of_the_Republic_of_Croatia_2015'] = {'Croatia Yearbook 2015'},
['CITEREFStaufer1993'] = {'Staufer-Pennsy_III'},
['CITEREFStauferPennypacker1962'] = {'Staufer-Pennsy'},
['CITEREFStauferPennypacker1968'] = {'Staufer-Pennsy Power II'},
['CITEREFStaunton1988'] = {'Australian Dictionary of Biography'},
['CITEREFSternFishmanTilove2006'] = {'Cite New York 2000', 'Cite NY2000', 'Cite ny2000', 'Cite NY 2000', 'Cite ny 2000', 'Stern: New York' },
['CITEREFSternGilmartinMassengale1983'] = {'Cite New York 1900', 'Cite NY1900', 'Cite NY1900', 'Cite ny1900', 'Cite ny 1900', 'Stern: New York'},
['CITEREFSternGilmartinMellins1987'] = {'Cite New York 1930', 'Cite NY 1930', 'Cite NY1930', 'Cite ny1930', 'Cite ny 1930', 'Stern: New York'},
['CITEREFSternMellinsFishman1995'] = {'Cite New York 1960', 'Cite NY1960', 'Cite NY 1960', 'Cite ny1960', 'Cite ny 1960', 'Stern: New York'},
['CITEREFSternMellinsFishman1999'] = {'Cite New York 1880', 'Cite NY1880', 'Cite NY 1880', 'Cite ny1880', 'Cite ny 1880', 'Stern: New York'},
['CITEREFStevens1907'] = {'Cite TCOF02'},
['CITEREFStewart1974'] = {'When Steam Was King'},
['CITEREFStrachey1981'] = template_names['ME-ref'],
['CITEREFStrickland1983'] = {'Strickland Locomotive Directory'},
['CITEREFStähelin1909'] = {'Schaff-Herzog'},
['CITEREFStorrer1993'] = {'cite Wright Companion'},
['CITEREFSuetin2001'] = {'Springer', 'SpringerEOM'},
['CITEREFSusanne_Schurr1992'] = {'BBKL'},
['CITEREFSusanne_Siebert1992'] = {'BBKL'},
['CITEREFSvolopoulos1977'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFSwartz1992'] = {'Swartz An Introduction to Functional Analysis'},
----------< T >----------
['CITEREFLondon_Gazette'] = {'London Gazette'},
['CITEREFTaber1977'] = {'Taber-DLW-19th'},
['CITEREFTaberTaber1980'] = {'Taber-DLW-20th-1'},
['CITEREFTaberTaber1981'] = {'Taber-DLW-20th-2'},
['CITEREFTabor1956'] = {'RCTS-LocosGWR-4'},
['CITEREFTabor1959'] = {'RCTS-LocosGWR-6'},
['CITEREFTalbot1991'] = template_names['ODB'],
['CITEREFTalbotKazhdan1991'] = template_names['ODB'],
['CITEREFTao2009'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFTao2009'] = {'Cite Cambridge History of China'},
['CITEREFTauranac1985'] = {'Cite Elegant New York'},
['CITEREFTer-Ghewondyan1976'] = {'The Arab Emirates in Bagratid Armenia'},
['CITEREFThe_London_Gazette1950'] = {'London Gazette'},
['CITEREFThe_London_Gazette_26_September_1919'] = {'London Gazette'},
['CITEREFThiele1983'] = {'Thiele-Hebrew Kings'},
['CITEREFThielemann2012'] = {'Bach\'s compositions (sources)'},
['CITEREFThomas1970'] = {'HistoryofParliament'},
['CITEREFThomas1971'] = {'Thomas-History-VI'},
['CITEREFThrush2010'] = {'HistoryofParliament'},
['CITEREFTikhomirov2001'] = {'Springer'},
['CITEREFTittel1966'] = {'Bach\'s compositions (sources)'},
['CITEREFTodt1996'] = {'BBKL'},
['CITEREFTodtVest2014'] = {'Tabula Imperii Byzantini'},
['CITEREFTolkien2007'] = template_names['ME-ref'],
['CITEREFTolkien2014'] = template_names['ME-ref'],
['CITEREFTolkien2015'] = template_names['ME-ref'],
['CITEREFTolkien2017'] = template_names['ME-ref'],
['CITEREFTolkien2018'] = template_names['ME-ref'],
['CITEREFTolkien2024'] = template_names['ME-ref'],
['CITEREFTolkienSwann1978'] = template_names['ME-ref'],
['CITEREFTolkienSwann2002'] = {'ME-ref'},
['CITEREFTolkienTolkien1992'] = template_names['ME-ref'],
['CITEREFTonks1988'] = {'Tonks ironstone'},
['CITEREFTonks1989'] = {'Tonks ironstone'},
['CITEREFTonks1992'] = {'Tonks ironstone'},
['CITEREFTopping1975'] = {'Setton-A History of the Crusades', 'Wisconsin History of the Crusades'},
['CITEREFTorri2013'] = {'Bach\'s compositions (sources)'},
['CITEREFTougher2018'] = template_names['ODLA'],
['CITEREFTourret1995'] = {'Tourret-Allied Military Locomotives'},
['CITEREFTrapp1991'] = template_names['ODB'],
['CITEREFTrappBeyerSturm-Schnabl1983'] = {'Prosopographisches Lexikon der Palaiologenzeit'},
['CITEREFTrappWaltherBeyer1976'] = {'Prosopographisches Lexikon der Palaiologenzeit'},
['CITEREFTrappWaltherBeyerSturm-Schnabl1978'] = {'Prosopographisches Lexikon der Palaiologenzeit'},
['CITEREFTreadgold1988'] = {'The Byzantine Revival, 780–842'},
['CITEREFTreadgold1997'] = {'A History of the Byzantine State and Society'},
['CITEREFTrèves2006'] = {'Trèves François Topological vector spaces, distributions and kernels'},
['CITEREFTsutsiev2014'] = {'Cite Atlas of the Ethno-Political History of the Caucasus'},
['CITEREFTurim1998'] = {'Turim-oshima'},
['CITEREFTuring1950'] = {'Turing 1950'},
['CITEREFTwitchett1979'] = {'Cite Cambridge History of China'},
['CITEREFTwitchettLoewe1986'] = {'Cite Cambridge History of China'},
['CITEREFTwitchettMote1988'] = {'Cite Cambridge History of China'},
['CITEREFTwitchettSmith2009'] = {'Cite Cambridge History of China'},
----------< U >----------
['CITEREFUS-NHub_Music_Deposit_31_(Klavierbüchlein_für_W._F._Bach)_at_Bach_Digital'] = {'Bach\'s compositions (sources)'},
['CITEREFUwe_Eckardt2001'] = {'BBKL'},
['CITEREFunknown_author1881'] = {'Cite ADB'},
['CITEREFunknown_author1882'] = {'Cite ADB'},
----------< V >----------
['CITEREFVakalopoulos1975'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFVan_Cleve1969'] = {'Setton-A History of the Crusades'},
['CITEREFVan_Hoorickx1971'] = {'Schubert\'s compositions (references)'},
['CITEREFVan_Hoorickx_1974–1976'] = {'Schubert\'s compositions (references)'},
['CITEREFVan_Lint2018'] = template_names['ODLA'],
['CITEREFVan_Riemsdijk,_Compound_Locomotives'] = {'Book-Van Riemsdijk-Compound Locomotives'},
['CITEREFVan_Riemsdijk1994'] = {'Book-Van Riemsdijk-Compound Locomotives'},
['CITEREFVan_Tricht2011'] = {'The Latin Renovatio of Byzantium'},
['CITEREFVandenberghen1989'] = {'Vandenberghen-SNCB12.2'},
['CITEREFVarzos1984'] = {'Η Γενεαλογία των Κομνηνών', 'Varzos-Genealogy of the Komnenoi'},
['CITEREFVasiliev1935'] = {'Byzance et les Arabes'},
['CITEREFVasiliev1968'] = {'Byzance et les Arabes'},
['CITEREFVenables1911'] = {'DCBL'},
['CITEREFVendler1997'] = {'Shakespeare sonnets bibliography'},
['CITEREFVenn1954'] = {'VennAC'},
['CITEREFVentura1963'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFVetter1713'] = {'Bach\'s compositions (sources)'},
['CITEREFVevainaCanepa2018'] = template_names['ODLA'],
['CITEREFVeysey1958'] = {'Veysey-PE-1958'},
['CITEREFVischer1912'] = {'Schaff-Herzog'},
['CITEREFVolkmer1991'] = {'Volkmer-Pennsy-Electric'},
['CITEREFvan_Leyden1956'] = {'Bach\'s compositions (sources)'},
['CITEREFvan_Lint2018'] = template_names['ODLA'],
['CITEREFvon_Prantl1879'] = {'Cite ADB'},
----------< W >----------
['CITEREFWagnerBäzoldZschechLüderitz1990'] = {'Wagner-EFA2.3.2'},
['CITEREFWallace2017'] = {'Cite greater'},
['CITEREFWalter1967'] = {'DBI', 'Dizionario Biografico degli Italiani'},
['CITEREFWalter_Asmus1966'] = template_names['NDB'],
['CITEREFWar_Office1918'] = {'German Forces in the Field'},
['CITEREFWarner1959'] = {'Generals in Gray'},
['CITEREFWarner1992'] = {'Generals in Blue'},
['CITEREFWayner1972'] = {'Wayner - Car names, numbers, consists'},
['CITEREFWayner1973'] = {'Wayner-Spotter-2nd'},
['CITEREFWebb2018'] = template_names['ODLA'],
['CITEREFWechsler1979'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFWechsler1979'] = {'Cite Cambridge History of China'},
['CITEREFWegman2008'] = {'Wegman-Illustrated'},
['CITEREFWeibel1994'] = {'Weibel IHA'},
['CITEREFWeinrebHibbertKeayKeay2008'] = {'London encyclopedia'},
['CITEREFWeisbrod1991'] = {'Weisbrod-EFA1.5'},
['CITEREFWeisbrodMüllerPetznik1978'] = {'Weisbrod-EFA1.2'},
['CITEREFWellhausen1927'] = {'The Arab Kingdom and its Fall'},
['CITEREFWells1982'] = {'Accents of English'},
['CITEREFWells1990'] = {'Cite LPD'},
['CITEREFWells2000'] = {'Cite LPD'},
['CITEREFWells2008'] = {'Cite LPD'},
['CITEREFWelsh2006'] = {'Welsh-Broadway'},
['CITEREFWelsh2008'] = {'Welsh-UP'},
['CITEREFWerner_Raupp2001'] = {'BBKL'},
['CITEREFWestcott1911'] = {'DCBL'},
['CITEREFWestermayer,_Georg1882'] = {'Cite ADB'},
['CITEREFWham1997'] = {'Wham-Ayrshire'},
['CITEREFWhishaw1842'] = {'Whishaw-RailofGB-2ndEd'},
['CITEREFWhishaw1969'] = {'Whishaw-RailofGB'},
['CITEREFWhite1985'] = {'White-Passenger-1985'},
['CITEREFWhite1993'] = {'White - American railroad freight car'},
['CITEREFWhiteWillenskyLeadon2010'] = {'Cite aia5'},
['CITEREFWhitehurst1973'] = {'Whitehurst GW Engines from 1940'},
['CITEREFWhittow1996'] = {'The Making of Byzantium, 600–1025'},
['CITEREFWickman1982'] = {'Country study'},
['CITEREFWiesehöfer2018'] = template_names['ODLA'],
['CITEREFWilansky2008'] = {'Wilansky Topology for Analysis 2008'},
['CITEREFWilansky2013'] = {'Wilansky Modern Methods in Topological Vector Spaces'},
['CITEREFWillard2004'] = {'Willard General Topology'},
['CITEREFWilliams1998'] = {'Williams-Philadelphia'},
['CITEREFWilliams2003'] = {'Bach\'s compositions (sources)'},
['CITEREFWillis1750'] = {'Cite Notitia Parliamentaria'},
['CITEREFWilson2017'] = {'Wilson-Guide'},
['CITEREFWilsonFiske1889'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonFiske1891'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonFiske1892'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonFiske1900'] = {'Appletons\'', 'Cite Appletons\'', 'Appletons'},
['CITEREFWilsonLacherMittermeier2016'] = {'HMW2016 Volume 6'},
['CITEREFWiltshire2000'] = {'Lloyd-Margaret River'},
['CITEREFWinfieldLyon2004'] = {'Winfield'},
['CITEREFWinkler1883'] = template_names['ADB'],
['CITEREFWitakowski2018'] = template_names['ODLA'],
['CITEREFWolff1969'] = {'Setton-A History of the Crusades'},
['CITEREFWollny2015'] = {'Bach\'s compositions (sources)'},
['CITEREFWood1907'] = {'Cite Nuttall', 'Nuttall'},
['CITEREFWoodsKilpatrick2005'] = {'MSW3 Hystricognathi'},
['CITEREFWorden2008'] = {'Country study'},
['CITEREFWortley2010'] = {'John Skylitzes: A Synopsis of Byzantine History, 811–1057'},
['CITEREFWozencraft2005'] = {'MSW3 Carnivora'},
['CITEREFWright1979'] = {'Cite Cambridge History of China', 'The Cambridge History of China'},
['CITEREFWright1979'] = {'Cite Cambridge History of China'},
['CITEREFWright2000'] = {'Bach\'s compositions (sources)'},
['CITEREFWrightWinter1922'] = {'1922 Locomotive Cyclopedia'},
['CITEREFWägliJacobi2010'] = {'Schienennetz Schweiz'},
----------< X >----------
----------< Y >----------
['CITEREFYenne2005'] = {'Yenne-Chiefs'},
['CITEREFYonge1990'] = {'Quail-4'},
['CITEREFYonge1994'] = {'Quail-5'},
['CITEREFYonge2002'] = {'Quail-5'},
['CITEREFYonge2008'] = {'Quail-5'},
['CITEREFYonge2016'] = {'Quail-2-2016'},
['CITEREFYongePadgettSzwenk2013'] = {'Quail-4-Paper-3rdEd'},
['CITEREFYu1986'] = {'Cite Cambridge History of China'},
----------< Z >----------
['CITEREFZahn1889–1893'] = {'Bach\'s compositions (sources)'},
['CITEREFZeiniWiesehöfer2018'] = template_names['ODLA'],
['CITEREFZekulich2000'] = {'Zekulich-WineWA'},
['CITEREFZimmermann2004'] = {'Zimmermann-Burlington'},
['CITEREFZimmermann2007'] = {'Zimmermann-GrandLuxe'},
['CITEREFZuccaric._1747'] = {'Bach\'s compositions (sources)'},
['CITEREFZălinescu2002'] = {'Zălinescu Convex Analysis in General Vector Spaces 2002'},
----------< OTHER >----------
['CITEREFΙστορία_του_Ελληνικού_Έθνους'] = {'Ιστορία του Ελληνικού Έθνους'},
['CITEREFΜεγάλη_Στρατιωτικὴ_καὶ_Ναυτικὴ_Ἐγκυκλοπαιδεία'] = {'Great Military and Naval Encyclopaedia'},
['CITEREFКавказский_календарь_на_1910_год'] = {'Cite Kavkazskiy Kalendar 1910'},
['CITEREFКавказский_календарь_на_1913_год'] = {'Cite Kavkazskiy Kalendar 1913'},
['CITEREFКавказский_календарь_на_1915_год'] = {'Cite Kavkazskiy Kalendar 1915'},
['CITEREFКавказский_календарь_на_1917_год'] = {'Cite Kavkazskiy Kalendar 1917'},
----------< UNSORTED >----------
}
-- Auto-classify templates mentioned in whitelist as wrapper templates
for _, tlist in pairs(whitelist) do
for _, t in ipairs(tlist) do
if not wrapper_templates[t] then
wrapper_templates[t] = noDefault
end
end
end
--[[--------------------------< S S T S I N T E G R A T I O N >----------------------------------------------
]]
local success, ssts_registry = pcall(require, 'Module:SST/registry')
if success and type(ssts_registry) == 'table' then
if ssts_registry.defaults then
for t_name, data in pairs(ssts_registry.defaults) do
wrapper_templates[t_name] = data
end
end
if ssts_registry.patterns then
for _, pattern_block in ipairs(ssts_registry.patterns) do
table.insert(wrapper_template_patterns, pattern_block)
end
end
end
--[[--------------------------< E X P O R T E D T A B L E S >------------------------------------------------
]]
return {
whitelist = whitelist,
wrapper_template_patterns = wrapper_template_patterns,
wrapper_templates = wrapper_templates
}
su0v3o88zeqoxkv5m70kh51bj895pxi
Tempilet:Cite report
10
2456
32953
2018-02-23T16:29:42Z
en>Primefac
0
Changed protection level for "[[Template:Cite report]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32953
wikitext
text/x-wiki
<includeonly>{{#invoke:citation/CS1|citation
|CitationClass=report
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
fs19owa9dz9vn4e3ic0cogi85vev72c
32954
32953
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cite_report]]
32953
wikitext
text/x-wiki
<includeonly>{{#invoke:citation/CS1|citation
|CitationClass=report
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
fs19owa9dz9vn4e3ic0cogi85vev72c
Tempilet:Cat
10
2457
32955
2024-07-14T16:03:39Z
en>HouseBlaster
0
merge complete
32955
wikitext
text/x-wiki
#REDIRECT [[Template:Category link]]
{{Redirect category shell|
{{R from merge}}
{{R from template shortcut}}
}}
pdnvarboglzpwmmx9vjjpz5xqrrl6vu
32956
32955
2026-11-11T21:18:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cat]]
32955
wikitext
text/x-wiki
#REDIRECT [[Template:Category link]]
{{Redirect category shell|
{{R from merge}}
{{R from template shortcut}}
}}
pdnvarboglzpwmmx9vjjpz5xqrrl6vu
Tempilet:Citation
10
2458
32957
2019-05-06T17:38:52Z
en>Trappist the monk
0
per [[Wikipedia:Templates for discussion/Log/2019 April 18#separate patent cites from Template:Citation|TfD]];
32957
wikitext
text/x-wiki
<includeonly>{{#invoke:citation/CS1|citation
|CitationClass=citation
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
c5vwsrpqyl5vzwjnrpazsisamya1wve
32958
32957
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Citation]]
32957
wikitext
text/x-wiki
<includeonly>{{#invoke:citation/CS1|citation
|CitationClass=citation
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
c5vwsrpqyl5vzwjnrpazsisamya1wve
Tempilet:Harvard citation no brackets
10
2459
32959
2020-08-10T00:21:39Z
en>Bsherr
0
as found, replacing [[Template:Tld]] with [[Template:Tlc]] or adding/updating category placement comments, plus general and typo fixes
32959
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation|template=harvnb}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
rtjyyomketoec83yixes4x8swygwqvq
32960
32959
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation_no_brackets]]
32959
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation|template=harvnb}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
rtjyyomketoec83yixes4x8swygwqvq
Tempilet:Harvnb
10
2460
32961
2017-04-07T19:22:02Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:Harvnb]]": Matching redirect target ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32961
wikitext
text/x-wiki
#REDIRECT[[Template:Harvard citation no brackets]]
3shv1t0unnkqbpog36jda0nnq7r7rca
32962
32961
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvnb]]
32961
wikitext
text/x-wiki
#REDIRECT[[Template:Harvard citation no brackets]]
3shv1t0unnkqbpog36jda0nnq7r7rca
Tempilet:For
10
2461
32963
2026-07-06T22:03:12Z
en>Jonesey95
0
Undid 3 revisions from [[Special:Diff/1362844261|1362844261]] until [[Special:Diff/1362895215|1362895215]]. Self-revert. It turns out that [[:Category:Articles with hatnote templates targeting a nonexistent page]] already existed
32963
wikitext
text/x-wiki
<includeonly>{{#invoke:For|For}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
7es2p1mk6qse8zlwn5qqya2ysrq1rcr
32964
32963
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:For]]
32963
wikitext
text/x-wiki
<includeonly>{{#invoke:For|For}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
7es2p1mk6qse8zlwn5qqya2ysrq1rcr
Module:For
828
2462
32965
2020-11-02T22:29:56Z
en>Andrybak
0
don't add talk pages and pages in the user namespace to [[:Category:Hatnote templates with errors]] – this is similar to [[Special:Diff/953627233/986768317|Module:Other uses of]] and [[Special:Diff/967664662|Module:Hatnote]]
32965
Scribunto
text/plain
local mArguments --initialize lazily
local mHatlist = require('Module:Hatnote list')
local mHatnote = require('Module:Hatnote')
local yesNo = require('Module:Yesno')
local p = {}
--Implements {{For}} from the frame
--uses capitalized "For" to avoid collision with Lua reserved word "for"
function p.For (frame)
mArguments = require('Module:Arguments')
return p._For(mArguments.getArgs(frame))
end
--Implements {{For}} but takes a manual arguments table
function p._For (args)
local use = args[1]
if (not use) then
return mHatnote.makeWikitextError(
'no context parameter provided. Use {{other uses}} for "other uses" hatnotes.',
'Template:For#Errors',
args.category
)
end
local pages = {}
function two (a, b) return a, b, 1 end --lets us run ipairs from 2
for k, v in two(ipairs(args)) do table.insert(pages, v) end
local title = mw.title.getCurrentTitle()
local skipCat = title.isTalkPage or title.namespace == 2 --don't categorise talk pages and userspace
local oddCat = skipCat and '' or '[[Category:Hatnote templates using unusual parameters]]'
local category = yesNo(args.category)
return mHatnote._hatnote(
mHatlist.forSeeTableToString({{use = use, pages = pages}}),
{selfref = args.selfref}
) .. (
(use == 'other uses') and ((category == true) or (category == nil)) and
oddCat or ''
)
end
return p
5kir3llbyjasubdg18thlz8rxsxfwtw
32966
32965
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Module:For]]
32965
Scribunto
text/plain
local mArguments --initialize lazily
local mHatlist = require('Module:Hatnote list')
local mHatnote = require('Module:Hatnote')
local yesNo = require('Module:Yesno')
local p = {}
--Implements {{For}} from the frame
--uses capitalized "For" to avoid collision with Lua reserved word "for"
function p.For (frame)
mArguments = require('Module:Arguments')
return p._For(mArguments.getArgs(frame))
end
--Implements {{For}} but takes a manual arguments table
function p._For (args)
local use = args[1]
if (not use) then
return mHatnote.makeWikitextError(
'no context parameter provided. Use {{other uses}} for "other uses" hatnotes.',
'Template:For#Errors',
args.category
)
end
local pages = {}
function two (a, b) return a, b, 1 end --lets us run ipairs from 2
for k, v in two(ipairs(args)) do table.insert(pages, v) end
local title = mw.title.getCurrentTitle()
local skipCat = title.isTalkPage or title.namespace == 2 --don't categorise talk pages and userspace
local oddCat = skipCat and '' or '[[Category:Hatnote templates using unusual parameters]]'
local category = yesNo(args.category)
return mHatnote._hatnote(
mHatlist.forSeeTableToString({{use = use, pages = pages}}),
{selfref = args.selfref}
) .. (
(use == 'other uses') and ((category == true) or (category == nil)) and
oddCat or ''
)
end
return p
5kir3llbyjasubdg18thlz8rxsxfwtw
Tempilet:Hidden
10
2463
32967
2026-10-18T09:09:58Z
en>Est. 2021
0
32967
wikitext
text/x-wiki
{{hidden begin|showhide={{{showhide|{{{toggle|}}}}}}|expand={{{expand|{{{expanded|}}}}}}|class={{{class|}}}|border={{{border|}}}|style={{{framestyle|{{{style|{{{css|}}}}}}}}}
|titlebgcolor={{{titlebgcolor|{{{background|{{{bg1|}}}}}}}}}|ta1={{{titlealign|{{{ta1|center}}}}}}|titlestyle={{safesubst<noinclude/>:#if:{{{multiline|{{{multi-line|}}}}}}|height:auto;}}{{safesubst<noinclude/>:#ifeq:{{{fw1|bold}}}|bold||font-weight:{{{fw1|bold}}};}}{{{titlestyle|{{{headerstyle|{{{headercss|}}}}}}}}}
|title={{safesubst<noinclude/>:#if:{{{multiline|{{{multi-line|}}}}}}|<div style="margin-right:4em;line-height:125%;height:auto;">{{{title|{{{header|{{{1}}}}}}}}}</div>|{{{title|{{{header|{{{1}}}}}}}}}}}
|contentbgcolor={{{contentbgcolor|{{{bg2|}}}}}}|ta2={{{ta2|}}}|contentstyle={{safesubst<noinclude/>:#ifeq:{{{fw2|normal}}}|normal||font-weight:{{{fw2|normal}}};}}{{{contentstyle|{{{contentcss|}}}}}} }}
{{{content|{{{contents|{{{text|{{{2}}}}}}}}}}}}{{hidden end}}{{safesubst<noinclude/>:#if:{{{background|}}}{{{bg1|}}}{{{bg2|}}}{{{titlealign|}}}{{{ta1|}}}{{{ta2|}}}{{{fw1|}}}{{{fw2|}}}|[[Category:Hidden templates using styles|{{NAMESPACE}}{{PAGENAME}}]]}}<noinclude>
{{documentation}}
</noinclude>
o4nk850gfi3kfwzckkzcfdkf0yzwdxo
32968
32967
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hidden]]
32967
wikitext
text/x-wiki
{{hidden begin|showhide={{{showhide|{{{toggle|}}}}}}|expand={{{expand|{{{expanded|}}}}}}|class={{{class|}}}|border={{{border|}}}|style={{{framestyle|{{{style|{{{css|}}}}}}}}}
|titlebgcolor={{{titlebgcolor|{{{background|{{{bg1|}}}}}}}}}|ta1={{{titlealign|{{{ta1|center}}}}}}|titlestyle={{safesubst<noinclude/>:#if:{{{multiline|{{{multi-line|}}}}}}|height:auto;}}{{safesubst<noinclude/>:#ifeq:{{{fw1|bold}}}|bold||font-weight:{{{fw1|bold}}};}}{{{titlestyle|{{{headerstyle|{{{headercss|}}}}}}}}}
|title={{safesubst<noinclude/>:#if:{{{multiline|{{{multi-line|}}}}}}|<div style="margin-right:4em;line-height:125%;height:auto;">{{{title|{{{header|{{{1}}}}}}}}}</div>|{{{title|{{{header|{{{1}}}}}}}}}}}
|contentbgcolor={{{contentbgcolor|{{{bg2|}}}}}}|ta2={{{ta2|}}}|contentstyle={{safesubst<noinclude/>:#ifeq:{{{fw2|normal}}}|normal||font-weight:{{{fw2|normal}}};}}{{{contentstyle|{{{contentcss|}}}}}} }}
{{{content|{{{contents|{{{text|{{{2}}}}}}}}}}}}{{hidden end}}{{safesubst<noinclude/>:#if:{{{background|}}}{{{bg1|}}}{{{bg2|}}}{{{titlealign|}}}{{{ta1|}}}{{{ta2|}}}{{{fw1|}}}{{{fw2|}}}|[[Category:Hidden templates using styles|{{NAMESPACE}}{{PAGENAME}}]]}}<noinclude>
{{documentation}}
</noinclude>
o4nk850gfi3kfwzckkzcfdkf0yzwdxo
Tempilet:Hidden begin
10
2464
32969
2026-10-18T08:28:09Z
en>Est. 2021
0
alias for expanded, as per [[Template:Hidden]]
32969
wikitext
text/x-wiki
<includeonly><templatestyles src="Template:Hidden begin/styles.css"/><div class="hidden-begin mw-collapsible {{#ifeq:{{{showhide|{{{toggle|}}}}}}|left|mw-collapsible-leftside-toggle}} {{#if:{{{expand|{{{expanded|}}}}}}||mw-collapsed}} {{{class|}}}" style="{{#if:{{{width|}}}|width:{{{width}}};}} {{#if:{{{border|}}}|border:{{{border}}};}} {{#if:{{{bgcolor|}}}|background-color:{{{bgcolor}}};color:inherit;}} {{{style|}}}"><!--
--><div class="hidden-title skin-nightmode-reset-color" style="{{#if:{{{ta1|}}}|text-align:{{{ta1}}};}} {{#if:{{{titlebgcolor|}}}|background-color:{{{titlebgcolor}}};color:inherit;}} {{{titlestyle|}}}">{{{title|{{{header|}}}}}}</div><!--
--><div class="hidden-content mw-collapsible-content" style="{{#if:{{{ta2|}}}|text-align:{{{ta2}}};}} {{#if:{{{contentbgcolor|}}}|background-color:{{{contentbgcolor}}};color:inherit;}} {{{contentstyle|{{{bodystyle|}}}}}}"><!--
Content added after the template
--></includeonly><noinclude>
{{Documentation}}
</noinclude>
tk0uh5eqfdv2vawj5m8a8u7e40vc1dy
32970
32969
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hidden_begin]]
32969
wikitext
text/x-wiki
<includeonly><templatestyles src="Template:Hidden begin/styles.css"/><div class="hidden-begin mw-collapsible {{#ifeq:{{{showhide|{{{toggle|}}}}}}|left|mw-collapsible-leftside-toggle}} {{#if:{{{expand|{{{expanded|}}}}}}||mw-collapsed}} {{{class|}}}" style="{{#if:{{{width|}}}|width:{{{width}}};}} {{#if:{{{border|}}}|border:{{{border}}};}} {{#if:{{{bgcolor|}}}|background-color:{{{bgcolor}}};color:inherit;}} {{{style|}}}"><!--
--><div class="hidden-title skin-nightmode-reset-color" style="{{#if:{{{ta1|}}}|text-align:{{{ta1}}};}} {{#if:{{{titlebgcolor|}}}|background-color:{{{titlebgcolor}}};color:inherit;}} {{{titlestyle|}}}">{{{title|{{{header|}}}}}}</div><!--
--><div class="hidden-content mw-collapsible-content" style="{{#if:{{{ta2|}}}|text-align:{{{ta2}}};}} {{#if:{{{contentbgcolor|}}}|background-color:{{{contentbgcolor}}};color:inherit;}} {{{contentstyle|{{{bodystyle|}}}}}}"><!--
Content added after the template
--></includeonly><noinclude>
{{Documentation}}
</noinclude>
tk0uh5eqfdv2vawj5m8a8u7e40vc1dy
Tempilet:Hidden end
10
2465
32971
2022-12-12T14:54:45Z
en>Terasail
0
Only noinclude once
32971
wikitext
text/x-wiki
<includeonly></div></div></includeonly><noinclude>
{{hatnote|Templates {{noredirect|Template:End hidden|End hidden}} and {{noredirect|Template:End hidden section|End hidden section}} redirect here.}}
{{Documentation|Template:Hidden begin/doc}}
</noinclude>
cpg1p4ge0ds1gb2obatbf2gvwrfngz6
32972
32971
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hidden_end]]
32971
wikitext
text/x-wiki
<includeonly></div></div></includeonly><noinclude>
{{hatnote|Templates {{noredirect|Template:End hidden|End hidden}} and {{noredirect|Template:End hidden section|End hidden section}} redirect here.}}
{{Documentation|Template:Hidden begin/doc}}
</noinclude>
cpg1p4ge0ds1gb2obatbf2gvwrfngz6
Tempilet:Harvp
10
2466
32973
2025-08-13T01:07:14Z
en>Pppery
0
Changed protection settings for "[[Template:Harvp]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32973
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation year brackets]]
{{Redirect category shell|
{{R from move}}
}}
4jnmv6kvc43sth7wtrxsr5wik03wzp9
32974
32973
2026-11-11T21:18:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvp]]
32973
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation year brackets]]
{{Redirect category shell|
{{R from move}}
}}
4jnmv6kvc43sth7wtrxsr5wik03wzp9
Tempilet:Sfnp
10
2467
32975
2025-03-02T03:30:41Z
en>Queen of Hearts
0
upd param check
32975
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfn
|bracket_year_left = (
|bracket_year_right = )
|template=sfnp
}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using sfn with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Sfnp]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | ignore-err | at | loc | p | page | pages | postscript | pp | ps | ref | Ref | group}}<noinclude>
{{documentation}}
</noinclude>
gk11i81pscd7xwivs6h5yo5jb8y08cl
32976
32975
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sfnp]]
32975
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|sfn
|bracket_year_left = (
|bracket_year_right = )
|template=sfnp
}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using sfn with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Sfnp]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | ignore-err | at | loc | p | page | pages | postscript | pp | ps | ref | Ref | group}}<noinclude>
{{documentation}}
</noinclude>
gk11i81pscd7xwivs6h5yo5jb8y08cl
Tempilet:Nobr
10
2468
32977
2015-02-01T20:33:13Z
en>Edokter
0
32977
wikitext
text/x-wiki
#REDIRECT [[Template:Nowrap]] {{R from template shortcut}}
h1jzp0ur4wqedz23vagbx5pgpbrkaw7
32978
32977
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Nobr]]
32977
wikitext
text/x-wiki
#REDIRECT [[Template:Nowrap]] {{R from template shortcut}}
h1jzp0ur4wqedz23vagbx5pgpbrkaw7
Tempilet:Citation/styles.css
10
2469
32981
2021-08-31T03:12:09Z
en>Izno
0
Protected "[[Template:Citation/styles.css]]": [[WP:High-risk templates|Highly visible template]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32981
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This page is a convenient place for the "citation" styles that are
* available in many of our citation templates. This page can be considered the
* authoritative source for those styles. [[Template:Citation]], like all CS1/2
* templates, is styled from [[Module:Citation/CS1/styles.css]], *not* here.
*/
/* Break long urls, etc., rather than overflowing box */
.citation {
word-wrap: break-word;
}
/* Highlight linked elements (such as clicked references) in blue */
.citation:target {
/* ignore the linter - all browsers of interest implement this */
background-color: rgba(0, 127, 255, 0.133);
}
ltkknak6hjx6agm6lakugrgzenjha92
32982
32981
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Citation/styles.css]]
32981
sanitized-css
text/css
/* {{pp|small=y}} */
/*
* This page is a convenient place for the "citation" styles that are
* available in many of our citation templates. This page can be considered the
* authoritative source for those styles. [[Template:Citation]], like all CS1/2
* templates, is styled from [[Module:Citation/CS1/styles.css]], *not* here.
*/
/* Break long urls, etc., rather than overflowing box */
.citation {
word-wrap: break-word;
}
/* Highlight linked elements (such as clicked references) in blue */
.citation:target {
/* ignore the linter - all browsers of interest implement this */
background-color: rgba(0, 127, 255, 0.133);
}
ltkknak6hjx6agm6lakugrgzenjha92
Tempilet:Wikicite
10
2470
32983
2025-09-06T18:11:30Z
en>Rjjiii
0
moving sandbox changes live (see talk page for details)
32983
wikitext
text/x-wiki
<templatestyles src="Citation/styles.css"/><span class="citation wikicite" id={{#if: {{{ref|}}}
|{{{ref}}}
|{{#if: {{{id|}}}
|"Reference-{{{id}}}"
|{{#invoke:Template wrapper |wrap |_include-positional=yes |_template=SfnRef}}
}}
}}>{{{reference|}}}</span><noinclude>
{{Documentation}}
</noinclude>
no0z5eaxq1vkglqpxwur1fm1pwz62bk
32984
32983
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wikicite]]
32983
wikitext
text/x-wiki
<templatestyles src="Citation/styles.css"/><span class="citation wikicite" id={{#if: {{{ref|}}}
|{{{ref}}}
|{{#if: {{{id|}}}
|"Reference-{{{id}}}"
|{{#invoke:Template wrapper |wrap |_include-positional=yes |_template=SfnRef}}
}}
}}>{{{reference|}}}</span><noinclude>
{{Documentation}}
</noinclude>
no0z5eaxq1vkglqpxwur1fm1pwz62bk
Tempilet:Harvard citation text
10
2471
32985
2024-05-14T02:50:50Z
en>Rjjiii
0
adding "at" as an alias for "loc" (similar to cite xxx templates)
32985
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}||)}}
|bracket_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}|)}}
|template=harvtxt
}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
oblo5w35i41ubnxcrrx7rcofaxowvc0
32986
32985
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation_text]]
32985
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}||)}}
|bracket_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}|)}}
|template=harvtxt
}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
oblo5w35i41ubnxcrrx7rcofaxowvc0
Tempilet:Harvtxt
10
2472
32987
2017-04-07T20:51:30Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:Harvtxt]]": Matching redirect target ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32987
wikitext
text/x-wiki
#REDIRECT[[Template:Harvard citation text]]
hbwn9ici76yofcshs6ak2hb8bucmpko
32988
32987
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvtxt]]
32987
wikitext
text/x-wiki
#REDIRECT[[Template:Harvard citation text]]
hbwn9ici76yofcshs6ak2hb8bucmpko
Tempilet:Harvcoltxt
10
2473
32989
2023-12-31T05:46:45Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Harvcoltxt]] to [[Template:Harvard citation with colon text]]: per [[WP:TPN]] and to align with [[Template:Harvard citation with colon]] (which, for transparency, I moved yesterday to its present title)
32989
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation with colon text]]
{{Redirect category shell|
{{R from move}}
}}
jknsurj1jd6iearza49cywic7xobkyt
32990
32989
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvcoltxt]]
32989
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation with colon text]]
{{Redirect category shell|
{{R from move}}
}}
jknsurj1jd6iearza49cywic7xobkyt
Tempilet:Cite comic
10
2474
32991
2026-05-16T18:49:05Z
en>Rjjiii
0
"Retrieved on" to "Retrieved" to match CS1 current language
32991
wikitext
text/x-wiki
<includeonly>{{#if:{{{ref|}}}|<templatestyles src="Citation/styles.css"/><span class="citation" id="{{anchorencode:{{{ref}}}}}">}}<!--
-->{{#if: {{{Cartoonist|{{{cartoonist|{{{creator|}}}}}}}}}|
{{{Cartoonist|{{{cartoonist|{{{creator}}}}}}}}} ([[Script (comics)|w]], [[artist|a]])
}}<!--
-->{{#if:{{{Writer|{{{writer|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|}}}}}}}}}|
, 
}}{{{Writer|{{{writer}}}}}}{{#if:{{{Cowriters|{{{cowriters|}}}}}}
|, {{{Cowriters|{{{cowriters|}}}}}}
}} ([[Script (comics)|w]])
}}<!--
-->{{#if:{{{Artist|{{{artist|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|}}}}}}}}}}}}}}}|
, 
}}{{{Artist|{{{artist}}}}}}{{#if:{{{Coartists|{{{coartists|}}}}}}
|, {{{Coartists|{{{coartists}}}}}}
}} ([[artist|a]])
}}<!--
-->{{#if:{{{Penciller|{{{penciller|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Penciller|{{{penciller}}}}}}{{#if:{{{Copencillers|{{{copencillers|}}}}}}
|, {{{Copencillers|{{{copencillers}}}}}}
}} ([[penciller|p]])
}}<!--
-->{{#if:{{{Inker|{{{inker|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Inker|{{{inker}}}}}}{{#if:{{{Coinkers|{{{coinkers|}}}}}}
|, {{{Coinkers|{{{coinkers}}}}}}
}} ([[inker|i]])
}}<!--
-->{{#if:{{{Colorist|{{{colorist|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Colorist|{{{colorist}}}}}} ([[colorist|col]])
}}<!--
-->{{#if:{{{Letterer|{{{letterer|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Letterer|{{{letterer}}}}}} ([[letterer|let]])
}}<!--
-->{{#if:{{{Editor|{{{editor|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Editor|{{{editor}}}}}} ([[Editing|ed]])
}}<!--
-->{{#if:{{{others|}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{others}}}
}}<!--
-->{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|{{{others|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
. 
}}<!--
-->{{#if:{{{Story|{{{story|}}}}}}|
{{#if:{{{url|}}}|
[{{#ifeq: {{{url-status}}}|live
|{{{url}}}
|{{if empty|{{{archive-url|}}}|{{{url|}}}
}}
}} "{{#invoke:String|replace|source={{{Story|{{{story}}}}}}|pattern="|replace=|count=2}}"]{{#if:{{{format|}}}|
 ({{{format}}})
}}|
"{{#invoke:String|replace|source={{{Story|{{{story}}}}}}|pattern="|replace=|count=2}}"{{#if:{{{format|}}}|
 ({{{format}}})
}}
}}{{#if:{{{Title|{{{title|{{{Strip|{{{strip|}}}}}}}}}}}}
| ''{{{Title|{{{title|{{{Strip|{{{strip}}}}}}}}}}}}''
|
}}|
{{#if:{{{url|}}}|
''[{{#ifeq: {{{url-status}}}|live
|{{{url}}}
|{{if empty|{{{archive-url|}}}|{{{url|}}}
}}
}} {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}]''{{#if:{{{format|}}}|
 ({{{format}}})
}}|
'' {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}''{{#if:{{{format|}}}|
 ({{{format}}})
}}
}}
}}<!--
-->{{#if:{{{Strip|{{{strip|}}}}}}|
{{#if:
{{{Paper|{{{paper|{{{newspaper|}}}}}}}}}
|. ''{{{Paper|{{{paper|{{{newspaper}}}}}}}}}''}}{{#if:
{{{Location|{{{location|}}}}}}
| ({{{Location|{{{location}}}}}})}}<!--
-->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}
|. {{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}}
}}
}}<!--
-->{{#if:{{{Volume|{{{volume|}}}}}}
|, vol. {{{Volume|{{{volume}}}}}}
}}<!--
-->{{#if:{{{Issue|{{{issue|}}}}}}|
, no. {{#invoke:String|replace|source={{{Issue|{{{issue}}}}}}|pattern=#|replace=|count=1}}
}}<!--
-->{{#if:{{{Strip|{{{strip|}}}}}}|<!--Strip=true. Else below: -->|<!--
-->{{#if:{{{Page|{{{page|}}}}}}
|, p. {{{Page|{{{page}}}}}}
|{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}}
|{{#if:{{{at|}}}|, {{{at}}}|, pp. {{#invoke:String|replace|source={{{Pages|{{{pages}}}}}}|pattern=-|replace=–}}}}
}}
}}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}}
}}<!--
-->{{#if:{{{Strip|{{{strip|}}}}}}|
{{#if:
{{{Supplement|{{{supplement|}}}}}}
| [{{{Supplement|{{{supplement}}}}}}]}}<!--
-->{{#if:{{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher|}}}}}}}}}}}}
|, {{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher}}}}}}}}}}}}}}<!--
-->{{#if:{{{Page|{{{page|}}}}}}
|, p. {{{Page|{{{page}}}}}}
|{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}}
|{{#if:{{{at|}}}|, {{{at}}}|, pp. {{#invoke:String|replace|{{{Pages|{{{pages}}}}}}|-|–}}}}
}}
}}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}}
|<!--not a strip-->
<!--
-->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}| ({{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}})}}<!--
-->{{#if:{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate|}}}}}}}}}}}}|
. {{#if:{{{Location|{{{location|}}}}}}|
{{{Location|{{{location}}}}}}: 
}}{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate}}}}}}}}}}}}
}}
}}<!--
-->{{#if:{{{ID|{{{id|}}}}}}|
, {{{ID|{{{id}}}}}}
}}<!--
-->{{#switch:{{{language|{{{Language|}}}}}}
|en
|En
|English =
|{{#if:{{{language|{{{Language|}}}}}}|
, {{in lang|{{{language|{{{Language|}}}}}}}}
}}
}}<!--
--><!--
-->{{#if:{{{url|}}}|{{#if:{{{archive-url|}}}|{{
#ifeq:{{{url-status}}}|live
|. [{{{archive-url|}}} Archived] from the original
|. Archived from [{{{url}}} the original]}}{{
#if:{{{archive-date|}}}| on {{#invoke:Auto date formatter|access_archive_format|{{{archive-date}}}}}
}}
}}<!--
-->{{#if: {{{accessdate|{{{access-date|}}}}}}|
. Retrieved {{#invoke:Auto date formatter|access_archive_format|{{{accessdate|{{{access-date|}}}}}}}}
}}}}.<!--
-->{{#if:{{{quote|}}}|
 "{{{quote}}}"}}{{#if:{{{ref|}}}|</span>}}<!--
-->{{#if:{{{Title|{{{title|{{{Strip|{{{strip|{{{Story|{{{story|}}}}}}}}}}}}}}}}}}|
|{{Preview warning|{{t|cite comic}}: Either <code>{{{|title=}}}</code> or <code>{{{|strip=}}}</code> is required. Use <code>{{{|title=}}}</code> for the title of a comic book series or graphic novel; use <code>{{{|strip=}}}</code> for a comic strip. ([[Template:cite comic#Title|help]])
}}[[Category:Pages using cite comic with no title|{{PAGENAME}}]]
}}<!--
-->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}|
|{{Preview warning|{{t|cite comic}}: <code>{{{|date=}}}</code> is required. Use the publication date, also known as the "cover date". ([[Template:cite comic#Date|help]])
}}[[Category:Pages using cite comic with no date|{{PAGENAME}}]]
}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using cite comic with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:cite comic]] with unknown parameter "_VALUE_"|ignoreblank=y| accessdate | access-date | archive-date | archive-url | artist | Artist | at | cartoonist | Cartoonist | coartists | Coartists | coinkers | Coinkers | colorist | Colorist | copencillers | Copencillers | cowriters | Cowriters | creator | date | Date | editor | Editor | format | id | ID | inker | Inker | issue | Issue | Language | language | letterer | Letterer | location | Location | newspaper | others | page | Page | pages | Pages | panel | Panel | paper | Paper | penciller | Penciller | publisher | Publisher | Quote | quote | ref | story | Story | strip | Strip | supplement | Supplement | syndicate | Syndicate | title | Title | url | url-status | volume | Volume | writer | Writer | year}}<noinclude>{{Documentation}}</noinclude>
q37vdgl3sxsedx8k520awomxkwurw67
32992
32991
2026-11-11T21:18:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cite_comic]]
32991
wikitext
text/x-wiki
<includeonly>{{#if:{{{ref|}}}|<templatestyles src="Citation/styles.css"/><span class="citation" id="{{anchorencode:{{{ref}}}}}">}}<!--
-->{{#if: {{{Cartoonist|{{{cartoonist|{{{creator|}}}}}}}}}|
{{{Cartoonist|{{{cartoonist|{{{creator}}}}}}}}} ([[Script (comics)|w]], [[artist|a]])
}}<!--
-->{{#if:{{{Writer|{{{writer|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|}}}}}}}}}|
, 
}}{{{Writer|{{{writer}}}}}}{{#if:{{{Cowriters|{{{cowriters|}}}}}}
|, {{{Cowriters|{{{cowriters|}}}}}}
}} ([[Script (comics)|w]])
}}<!--
-->{{#if:{{{Artist|{{{artist|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|}}}}}}}}}}}}}}}|
, 
}}{{{Artist|{{{artist}}}}}}{{#if:{{{Coartists|{{{coartists|}}}}}}
|, {{{Coartists|{{{coartists}}}}}}
}} ([[artist|a]])
}}<!--
-->{{#if:{{{Penciller|{{{penciller|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Penciller|{{{penciller}}}}}}{{#if:{{{Copencillers|{{{copencillers|}}}}}}
|, {{{Copencillers|{{{copencillers}}}}}}
}} ([[penciller|p]])
}}<!--
-->{{#if:{{{Inker|{{{inker|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Inker|{{{inker}}}}}}{{#if:{{{Coinkers|{{{coinkers|}}}}}}
|, {{{Coinkers|{{{coinkers}}}}}}
}} ([[inker|i]])
}}<!--
-->{{#if:{{{Colorist|{{{colorist|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Colorist|{{{colorist}}}}}} ([[colorist|col]])
}}<!--
-->{{#if:{{{Letterer|{{{letterer|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Letterer|{{{letterer}}}}}} ([[letterer|let]])
}}<!--
-->{{#if:{{{Editor|{{{editor|}}}}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{Editor|{{{editor}}}}}} ([[Editing|ed]])
}}<!--
-->{{#if:{{{others|}}}|
{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
, 
}}{{{others}}}
}}<!--
-->{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|{{{others|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|
. 
}}<!--
-->{{#if:{{{Story|{{{story|}}}}}}|
{{#if:{{{url|}}}|
[{{#ifeq: {{{url-status}}}|live
|{{{url}}}
|{{if empty|{{{archive-url|}}}|{{{url|}}}
}}
}} "{{#invoke:String|replace|source={{{Story|{{{story}}}}}}|pattern="|replace=|count=2}}"]{{#if:{{{format|}}}|
 ({{{format}}})
}}|
"{{#invoke:String|replace|source={{{Story|{{{story}}}}}}|pattern="|replace=|count=2}}"{{#if:{{{format|}}}|
 ({{{format}}})
}}
}}{{#if:{{{Title|{{{title|{{{Strip|{{{strip|}}}}}}}}}}}}
| ''{{{Title|{{{title|{{{Strip|{{{strip}}}}}}}}}}}}''
|
}}|
{{#if:{{{url|}}}|
''[{{#ifeq: {{{url-status}}}|live
|{{{url}}}
|{{if empty|{{{archive-url|}}}|{{{url|}}}
}}
}} {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}]''{{#if:{{{format|}}}|
 ({{{format}}})
}}|
'' {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}''{{#if:{{{format|}}}|
 ({{{format}}})
}}
}}
}}<!--
-->{{#if:{{{Strip|{{{strip|}}}}}}|
{{#if:
{{{Paper|{{{paper|{{{newspaper|}}}}}}}}}
|. ''{{{Paper|{{{paper|{{{newspaper}}}}}}}}}''}}{{#if:
{{{Location|{{{location|}}}}}}
| ({{{Location|{{{location}}}}}})}}<!--
-->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}
|. {{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}}
}}
}}<!--
-->{{#if:{{{Volume|{{{volume|}}}}}}
|, vol. {{{Volume|{{{volume}}}}}}
}}<!--
-->{{#if:{{{Issue|{{{issue|}}}}}}|
, no. {{#invoke:String|replace|source={{{Issue|{{{issue}}}}}}|pattern=#|replace=|count=1}}
}}<!--
-->{{#if:{{{Strip|{{{strip|}}}}}}|<!--Strip=true. Else below: -->|<!--
-->{{#if:{{{Page|{{{page|}}}}}}
|, p. {{{Page|{{{page}}}}}}
|{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}}
|{{#if:{{{at|}}}|, {{{at}}}|, pp. {{#invoke:String|replace|source={{{Pages|{{{pages}}}}}}|pattern=-|replace=–}}}}
}}
}}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}}
}}<!--
-->{{#if:{{{Strip|{{{strip|}}}}}}|
{{#if:
{{{Supplement|{{{supplement|}}}}}}
| [{{{Supplement|{{{supplement}}}}}}]}}<!--
-->{{#if:{{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher|}}}}}}}}}}}}
|, {{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher}}}}}}}}}}}}}}<!--
-->{{#if:{{{Page|{{{page|}}}}}}
|, p. {{{Page|{{{page}}}}}}
|{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}}
|{{#if:{{{at|}}}|, {{{at}}}|, pp. {{#invoke:String|replace|{{{Pages|{{{pages}}}}}}|-|–}}}}
}}
}}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}}
|<!--not a strip-->
<!--
-->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}| ({{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}})}}<!--
-->{{#if:{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate|}}}}}}}}}}}}|
. {{#if:{{{Location|{{{location|}}}}}}|
{{{Location|{{{location}}}}}}: 
}}{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate}}}}}}}}}}}}
}}
}}<!--
-->{{#if:{{{ID|{{{id|}}}}}}|
, {{{ID|{{{id}}}}}}
}}<!--
-->{{#switch:{{{language|{{{Language|}}}}}}
|en
|En
|English =
|{{#if:{{{language|{{{Language|}}}}}}|
, {{in lang|{{{language|{{{Language|}}}}}}}}
}}
}}<!--
--><!--
-->{{#if:{{{url|}}}|{{#if:{{{archive-url|}}}|{{
#ifeq:{{{url-status}}}|live
|. [{{{archive-url|}}} Archived] from the original
|. Archived from [{{{url}}} the original]}}{{
#if:{{{archive-date|}}}| on {{#invoke:Auto date formatter|access_archive_format|{{{archive-date}}}}}
}}
}}<!--
-->{{#if: {{{accessdate|{{{access-date|}}}}}}|
. Retrieved {{#invoke:Auto date formatter|access_archive_format|{{{accessdate|{{{access-date|}}}}}}}}
}}}}.<!--
-->{{#if:{{{quote|}}}|
 "{{{quote}}}"}}{{#if:{{{ref|}}}|</span>}}<!--
-->{{#if:{{{Title|{{{title|{{{Strip|{{{strip|{{{Story|{{{story|}}}}}}}}}}}}}}}}}}|
|{{Preview warning|{{t|cite comic}}: Either <code>{{{|title=}}}</code> or <code>{{{|strip=}}}</code> is required. Use <code>{{{|title=}}}</code> for the title of a comic book series or graphic novel; use <code>{{{|strip=}}}</code> for a comic strip. ([[Template:cite comic#Title|help]])
}}[[Category:Pages using cite comic with no title|{{PAGENAME}}]]
}}<!--
-->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}|
|{{Preview warning|{{t|cite comic}}: <code>{{{|date=}}}</code> is required. Use the publication date, also known as the "cover date". ([[Template:cite comic#Date|help]])
}}[[Category:Pages using cite comic with no date|{{PAGENAME}}]]
}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using cite comic with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:cite comic]] with unknown parameter "_VALUE_"|ignoreblank=y| accessdate | access-date | archive-date | archive-url | artist | Artist | at | cartoonist | Cartoonist | coartists | Coartists | coinkers | Coinkers | colorist | Colorist | copencillers | Copencillers | cowriters | Cowriters | creator | date | Date | editor | Editor | format | id | ID | inker | Inker | issue | Issue | Language | language | letterer | Letterer | location | Location | newspaper | others | page | Page | pages | Pages | panel | Panel | paper | Paper | penciller | Penciller | publisher | Publisher | Quote | quote | ref | story | Story | strip | Strip | supplement | Supplement | syndicate | Syndicate | title | Title | url | url-status | volume | Volume | writer | Writer | year}}<noinclude>{{Documentation}}</noinclude>
q37vdgl3sxsedx8k520awomxkwurw67
Tempilet:Hair space
10
2475
32993
2021-08-16T23:32:36Z
en>MusikAnimal
0
Changed protection settings for "[[Template:Hair space]]": [[WP:High-risk templates|Highly visible template]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
32993
wikitext
text/x-wiki
{{#if:{{{before|{{{after|}}}}}}
|{{nowrap|1={{{before|}}} {{#if:{{{1|}}}
|{{{1}}} 
}}{{{after|}}}}}
| {{#if:{{{1|}}}
|{{{1}}} 
}}
}}<noinclude>
{{Documentation}}
</noinclude>
hqoaz3my2pu651qjpl9flfclqqrldnh
32994
32993
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hair_space]]
32993
wikitext
text/x-wiki
{{#if:{{{before|{{{after|}}}}}}
|{{nowrap|1={{{before|}}} {{#if:{{{1|}}}
|{{{1}}} 
}}{{{after|}}}}}
| {{#if:{{{1|}}}
|{{{1}}} 
}}
}}<noinclude>
{{Documentation}}
</noinclude>
hqoaz3my2pu651qjpl9flfclqqrldnh
Tempilet:Harv
10
2476
32995
2024-02-02T02:30:53Z
en>Robertsky
0
Adding {{pp-template}}
32995
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation]]
{{pp-template|small=yes}}
itwso6tu095bv7mayew9y7aukjjp7xm
32996
32995
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harv]]
32995
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation]]
{{pp-template|small=yes}}
itwso6tu095bv7mayew9y7aukjjp7xm
Tempilet:Harvard citation
10
2477
32997
2020-08-10T00:19:45Z
en>Bsherr
0
as found, replacing [[Template:Tld]] with [[Template:Tlc]] or adding/updating category placement comments, plus general and typo fixes
32997
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_left= (
|bracket_right = )
}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
nu22p5asevjuxsevxu91z5vdnzmtbmi
32998
32997
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation]]
32997
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_left= (
|bracket_right = )
}}</includeonly><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
nu22p5asevjuxsevxu91z5vdnzmtbmi
Tempilet:Harvard citations
10
2478
32999
2024-05-14T03:06:38Z
en>Rjjiii
0
adding "at" as an alias for "loc" (similar to cite xxx templates)
32999
wikitext
text/x-wiki
<includeonly>{{Harvard citations/core
|Txt = {{{txt|{{#ifeq:{{{1|}}}|txt|yes|{{#ifeq:{{{2|}}}|txt|yes|}}}}}}}
|Nb = {{{nb|{{#ifeq:{{{1|}}}|nb|yes|{{#ifeq:{{{2|}}}|nb|yes|}}}}}}}
|Citationpage={{{citationpage|}}}
<!-- Most of the following code is copied from template:citation and should be kept the same
for compatibility -->
|Surname1 = {{{last|{{{surname|{{{last1|{{{surname1|{{{author1|{{{author|{{{authors|}}}}}}}}}}}}}}}}}}}}}
|Surname2 = {{{last2|{{{surname2|{{{author2|}}}}}}}}}
|Surname3 = {{{last3|{{{surname3|{{{author3|}}}}}}}}}
|Surname4 = {{{last4|{{{surname4|{{{author4|}}}}}}}}}
|Given1 = {{{first1|{{{given1|{{{first|{{{given|}}}}}}}}}}}}
|Given2 = {{{first2|{{{given2|}}}}}}
|Given3 = {{{first3|{{{given3|}}}}}}
|Given4 = {{{first4|{{{given4|}}}}}}
|Authorlink1 = {{{author-link|{{{author1-link|{{{authorlink|{{{authorlink1|}}}}}}}}}}}}
|Authorlink2 = {{{author2-link|{{{authorlink2|}}}}}}
|Authorlink3 = {{{author3-link|{{{authorlink3|}}}}}}
|Authorlink4 = {{{author4-link|{{{authorlink4|}}}}}}
|Year={{{year1|{{{year|{{ <!-- attempt to derive year from date, if possible -->
#if: {{{date|}}}
|{{
#switch: {{#time:Y|{{{date|}}}}}
|Error: invalid time = {{{publication-date|}}}
|{{#time:Y|{{{date|}}}}}
}}
|{{{publication-date|}}} <!-- last resort -->
}}
}}}}}}
|Year2={{{year2|}}}
|Year3={{{year3|}}}
|Year4={{{year4|}}}
|Year5={{{year5|}}}
|Year6={{{year6|}}}
|Year7={{{year7|}}}
|Year8={{{year8|}}}
|Year9={{{year9|}}}
|Year10={{{year10|}}}
|Date = {{{date|{{{year|{{{publication-date|}}}}}}}}}
|EditorSurname1 = {{{editor-last|{{{editor-surname|{{{editor1-last|{{{editor1-surname|{{{editor|{{{editors|}}}}}}}}}}}}}}}}}}
|EditorSurname2 = {{{editor2-last|{{{editor2-surname|}}}}}}
|EditorSurname3 = {{{editor3-last|{{{editor3-surname|}}}}}}
|EditorSurname4 = {{{editor4-last|{{{editor4-surname|}}}}}}
|EditorGiven1 = {{{editor-first|{{{editor-given|{{{editor1-first|{{{editor1-given|}}}}}}}}}}}}
|EditorGiven2={{{editor2-first|{{{editor2-given|}}}}}}
|EditorGiven3={{{editor3-first|{{{editor3-given|}}}}}}
|EditorGiven4={{{editor4-first|{{{editor4-given|}}}}}}
|Editorlink1={{{editor-link|{{{editor1-link|}}}}}}
|Editorlink2={{{editor2-link|}}}
|Editorlink3={{{editor3-link|}}}
|Editorlink4={{{editor4-link|}}}
|Ref1={{{ref1|{{{ref|}}}}}}
|Ref2={{{ref2|{{{ref|}}}}}}
|Ref3={{{ref3|{{{ref|}}}}}}
|Ref4={{{ref4|{{{ref|}}}}}}
|Loc1={{{loc1|{{{loc|{{{at|}}}}}}}}}
|Loc2={{{loc2|}}}
|Loc3={{{loc3|}}}
|Loc4={{{loc4|}}}
}}</includeonly><noinclude>{{Template doc}}</noinclude>
lmuontr86aprvb72clhnxu0pmleu677
33000
32999
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citations]]
32999
wikitext
text/x-wiki
<includeonly>{{Harvard citations/core
|Txt = {{{txt|{{#ifeq:{{{1|}}}|txt|yes|{{#ifeq:{{{2|}}}|txt|yes|}}}}}}}
|Nb = {{{nb|{{#ifeq:{{{1|}}}|nb|yes|{{#ifeq:{{{2|}}}|nb|yes|}}}}}}}
|Citationpage={{{citationpage|}}}
<!-- Most of the following code is copied from template:citation and should be kept the same
for compatibility -->
|Surname1 = {{{last|{{{surname|{{{last1|{{{surname1|{{{author1|{{{author|{{{authors|}}}}}}}}}}}}}}}}}}}}}
|Surname2 = {{{last2|{{{surname2|{{{author2|}}}}}}}}}
|Surname3 = {{{last3|{{{surname3|{{{author3|}}}}}}}}}
|Surname4 = {{{last4|{{{surname4|{{{author4|}}}}}}}}}
|Given1 = {{{first1|{{{given1|{{{first|{{{given|}}}}}}}}}}}}
|Given2 = {{{first2|{{{given2|}}}}}}
|Given3 = {{{first3|{{{given3|}}}}}}
|Given4 = {{{first4|{{{given4|}}}}}}
|Authorlink1 = {{{author-link|{{{author1-link|{{{authorlink|{{{authorlink1|}}}}}}}}}}}}
|Authorlink2 = {{{author2-link|{{{authorlink2|}}}}}}
|Authorlink3 = {{{author3-link|{{{authorlink3|}}}}}}
|Authorlink4 = {{{author4-link|{{{authorlink4|}}}}}}
|Year={{{year1|{{{year|{{ <!-- attempt to derive year from date, if possible -->
#if: {{{date|}}}
|{{
#switch: {{#time:Y|{{{date|}}}}}
|Error: invalid time = {{{publication-date|}}}
|{{#time:Y|{{{date|}}}}}
}}
|{{{publication-date|}}} <!-- last resort -->
}}
}}}}}}
|Year2={{{year2|}}}
|Year3={{{year3|}}}
|Year4={{{year4|}}}
|Year5={{{year5|}}}
|Year6={{{year6|}}}
|Year7={{{year7|}}}
|Year8={{{year8|}}}
|Year9={{{year9|}}}
|Year10={{{year10|}}}
|Date = {{{date|{{{year|{{{publication-date|}}}}}}}}}
|EditorSurname1 = {{{editor-last|{{{editor-surname|{{{editor1-last|{{{editor1-surname|{{{editor|{{{editors|}}}}}}}}}}}}}}}}}}
|EditorSurname2 = {{{editor2-last|{{{editor2-surname|}}}}}}
|EditorSurname3 = {{{editor3-last|{{{editor3-surname|}}}}}}
|EditorSurname4 = {{{editor4-last|{{{editor4-surname|}}}}}}
|EditorGiven1 = {{{editor-first|{{{editor-given|{{{editor1-first|{{{editor1-given|}}}}}}}}}}}}
|EditorGiven2={{{editor2-first|{{{editor2-given|}}}}}}
|EditorGiven3={{{editor3-first|{{{editor3-given|}}}}}}
|EditorGiven4={{{editor4-first|{{{editor4-given|}}}}}}
|Editorlink1={{{editor-link|{{{editor1-link|}}}}}}
|Editorlink2={{{editor2-link|}}}
|Editorlink3={{{editor3-link|}}}
|Editorlink4={{{editor4-link|}}}
|Ref1={{{ref1|{{{ref|}}}}}}
|Ref2={{{ref2|{{{ref|}}}}}}
|Ref3={{{ref3|{{{ref|}}}}}}
|Ref4={{{ref4|{{{ref|}}}}}}
|Loc1={{{loc1|{{{loc|{{{at|}}}}}}}}}
|Loc2={{{loc2|}}}
|Loc3={{{loc3|}}}
|Loc4={{{loc4|}}}
}}</includeonly><noinclude>{{Template doc}}</noinclude>
lmuontr86aprvb72clhnxu0pmleu677
Tempilet:Harvard citations/core
10
2479
33001
2021-02-04T22:12:59Z
en>Trappist the monk
0
33001
wikitext
text/x-wiki
<includeonly>{{#ifeq:{{{Nb|}}}|yes||{{#ifeq:{{{Txt|}}}|yes||(}}}}{{
<!-- Much of this code is copied from template:citation/core
and should be kept the same for compatibility-->
#if:{{{Surname1|}}}
|{{
#if: {{{Authorlink1|}}}
|[[{{{Authorlink1}}} |{{
#if: {{{Given1|}}}
|{{{Given1}}} 
}}{{{Surname1}}}]]
|{{
#if: {{{Given1|}}}
|{{{Given1}}} 
}}{{{Surname1}}}
}}{{
#if: {{{Surname2|}}}
|{{
#if: {{{Surname3|}}}
|, 
| {{#ifeq:{{{Txt|}}}|yes|and|&}} 
}}{{
#if: {{{Authorlink2|}}}
|[[{{{Authorlink2}}} |{{{Given2|}}} {{{Surname2}}}]]
|{{{Given2|}}} {{{Surname2}}}
}}{{
#if: {{{Surname3|}}}
|{{#ifeq:{{{Txt|}}}|yes|, and | & }}{{
#if: {{{Authorlink3|}}}
|[[{{{Authorlink3}}} |{{{Given3|}}} {{{Surname3}}}]]
|{{{Given3|}}} {{{Surname3}}}
}}{{
#if:{{{Surname4|}}}
| et al.
}}
}}
}}
|{{
#if: {{{EditorSurname1|}}}
|{{
#if: {{{Editorlink1|}}}
|[[{{{Editorlink1}}} |{{{EditorSurname1}}}{{
#if: {{{EditorGiven1|}}}
|, {{{EditorGiven1}}}
}}]]
|{{{EditorSurname1}}}{{
#if: {{{EditorGiven1|}}}
|, {{{EditorGiven1}}}
}}
}}{{
#if: {{{EditorSurname2|}}}
|{{
#if: {{{EditorSurname3|}}}
|<nowiki>; </nowiki>
| & 
}}{{
#if: {{{Editorlink2|}}}
|[[{{{Editorlink2}}} |{{{EditorGiven2|}}} {{{EditorSurname2}}}]]
|{{{EditorGiven2|}}} {{{EditorSurname2}}}
}}{{
#if: {{{EditorSurname3|}}}
| & {{
#if: {{{Editorlink3|}}}
|[[{{{Editorlink3}}} |{{{EditorGiven3|}}} {{{EditorSurname3}}}]]
|{{{EditorGiven3|}}} {{{EditorSurname3}}}
}}{{
#if:{{{EditorSurname4|}}}
| et al.
}}
}}
}}, ed{{#if:{{{EditorSurname2|}}}|s}}.
}}
}} {{#ifeq:{{{Nb|}}}|yes||{{#ifeq:{{{Txt|}}}|yes|(| }}}}<!--
first link:
-->[[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref1|}}}
|{{#ifeq:{{{Ref1|}}}|none||{{{Ref1|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year|{{{Date|}}}}}}
}}}}|{{{Year|{{{Date|}}}}}}]]{{#if:{{{Loc1|}}}|, {{{Loc1|}}} }}<!--
second link
-->{{#if:{{{Year2|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref2|}}}
|{{#ifeq:{{{Ref2|}}}|none||{{{Ref2|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year2|}}}
}}}}|{{{Year2|}}}]]|}}{{#if:{{{Loc2|}}}|, {{{Loc2|}}} }}<!--
3rd link
-->{{#if:{{{Year3|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref3|}}}
|{{#ifeq:{{{Ref3|}}}|none||{{{Ref3|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year3|}}}
}}}}|{{{Year3|}}}]]|}}{{#if:{{{Loc3|}}}|, {{{Loc3|}}} }}<!--
4th link
-->{{#if:{{{Year4|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref4|}}}
|{{#ifeq:{{{Ref4|}}}|none||{{{Ref4|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year4|}}}
}}}}|{{{Year4|}}}]]|}}{{#if:{{{Loc4|}}}|, {{{Loc4|}}} }}<!--
5th link
-->{{#if:{{{Year5|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref5|}}}
|{{#ifeq:{{{Ref5|}}}|none||{{{Ref5|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year5|}}}
}}}}|{{{Year5|}}}]]|}}{{#if:{{{Loc5|}}}|, {{{Loc5|}}} }}<!--
6th link
-->{{#if:{{{Year6|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref6|}}}
|{{#ifeq:{{{Ref6|}}}|none||{{{Ref6|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year6|}}}
}}}}|{{{Year6|}}}]]|}}{{#if:{{{Loc6|}}}|, {{{Loc6|}}} }}{{#ifeq:{{{Nb|}}}|yes||)}}</includeonly>
ht1wtv4bcdl4su8ztfgcpj97nehzy8b
33002
33001
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citations/core]]
33001
wikitext
text/x-wiki
<includeonly>{{#ifeq:{{{Nb|}}}|yes||{{#ifeq:{{{Txt|}}}|yes||(}}}}{{
<!-- Much of this code is copied from template:citation/core
and should be kept the same for compatibility-->
#if:{{{Surname1|}}}
|{{
#if: {{{Authorlink1|}}}
|[[{{{Authorlink1}}} |{{
#if: {{{Given1|}}}
|{{{Given1}}} 
}}{{{Surname1}}}]]
|{{
#if: {{{Given1|}}}
|{{{Given1}}} 
}}{{{Surname1}}}
}}{{
#if: {{{Surname2|}}}
|{{
#if: {{{Surname3|}}}
|, 
| {{#ifeq:{{{Txt|}}}|yes|and|&}} 
}}{{
#if: {{{Authorlink2|}}}
|[[{{{Authorlink2}}} |{{{Given2|}}} {{{Surname2}}}]]
|{{{Given2|}}} {{{Surname2}}}
}}{{
#if: {{{Surname3|}}}
|{{#ifeq:{{{Txt|}}}|yes|, and | & }}{{
#if: {{{Authorlink3|}}}
|[[{{{Authorlink3}}} |{{{Given3|}}} {{{Surname3}}}]]
|{{{Given3|}}} {{{Surname3}}}
}}{{
#if:{{{Surname4|}}}
| et al.
}}
}}
}}
|{{
#if: {{{EditorSurname1|}}}
|{{
#if: {{{Editorlink1|}}}
|[[{{{Editorlink1}}} |{{{EditorSurname1}}}{{
#if: {{{EditorGiven1|}}}
|, {{{EditorGiven1}}}
}}]]
|{{{EditorSurname1}}}{{
#if: {{{EditorGiven1|}}}
|, {{{EditorGiven1}}}
}}
}}{{
#if: {{{EditorSurname2|}}}
|{{
#if: {{{EditorSurname3|}}}
|<nowiki>; </nowiki>
| & 
}}{{
#if: {{{Editorlink2|}}}
|[[{{{Editorlink2}}} |{{{EditorGiven2|}}} {{{EditorSurname2}}}]]
|{{{EditorGiven2|}}} {{{EditorSurname2}}}
}}{{
#if: {{{EditorSurname3|}}}
| & {{
#if: {{{Editorlink3|}}}
|[[{{{Editorlink3}}} |{{{EditorGiven3|}}} {{{EditorSurname3}}}]]
|{{{EditorGiven3|}}} {{{EditorSurname3}}}
}}{{
#if:{{{EditorSurname4|}}}
| et al.
}}
}}
}}, ed{{#if:{{{EditorSurname2|}}}|s}}.
}}
}} {{#ifeq:{{{Nb|}}}|yes||{{#ifeq:{{{Txt|}}}|yes|(| }}}}<!--
first link:
-->[[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref1|}}}
|{{#ifeq:{{{Ref1|}}}|none||{{{Ref1|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year|{{{Date|}}}}}}
}}}}|{{{Year|{{{Date|}}}}}}]]{{#if:{{{Loc1|}}}|, {{{Loc1|}}} }}<!--
second link
-->{{#if:{{{Year2|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref2|}}}
|{{#ifeq:{{{Ref2|}}}|none||{{{Ref2|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year2|}}}
}}}}|{{{Year2|}}}]]|}}{{#if:{{{Loc2|}}}|, {{{Loc2|}}} }}<!--
3rd link
-->{{#if:{{{Year3|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref3|}}}
|{{#ifeq:{{{Ref3|}}}|none||{{{Ref3|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year3|}}}
}}}}|{{{Year3|}}}]]|}}{{#if:{{{Loc3|}}}|, {{{Loc3|}}} }}<!--
4th link
-->{{#if:{{{Year4|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref4|}}}
|{{#ifeq:{{{Ref4|}}}|none||{{{Ref4|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year4|}}}
}}}}|{{{Year4|}}}]]|}}{{#if:{{{Loc4|}}}|, {{{Loc4|}}} }}<!--
5th link
-->{{#if:{{{Year5|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref5|}}}
|{{#ifeq:{{{Ref5|}}}|none||{{{Ref5|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year5|}}}
}}}}|{{{Year5|}}}]]|}}{{#if:{{{Loc5|}}}|, {{{Loc5|}}} }}<!--
6th link
-->{{#if:{{{Year6|}}}
|, [[{{{Citationpage|}}}#{{anchorencode:{{
#if:{{{Ref6|}}}
|{{#ifeq:{{{Ref6|}}}|none||{{{Ref6|}}}}}
|CITEREF{{#if:{{{Surname1|}}}
|{{{Surname1}}}{{{Surname2|}}}{{{Surname3|}}}{{{Surname4|}}}
|{{{EditorSurname1|}}}{{{EditorSurname2|}}}{{{EditorSurname3|}}}{{{EditorSurname4|}}}
}}{{{Year6|}}}
}}}}|{{{Year6|}}}]]|}}{{#if:{{{Loc6|}}}|, {{{Loc6|}}} }}{{#ifeq:{{{Nb|}}}|yes||)}}</includeonly>
ht1wtv4bcdl4su8ztfgcpj97nehzy8b
Tempilet:Harvs
10
2480
33003
2012-04-23T10:12:39Z
en>Arcticocean
0
Changed protection level of Template:Harvs: [[Wikipedia:High-risk templates|Highly-visible template]] (between 700 and 1200 transclusions) ([edit=autoconfirmed] (indefinite) [move=sysop] (indefinite))
33003
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citations]]
n5i0trzy7zcvnqxs8ic41k6ypbbiqwx
33004
33003
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvs]]
33003
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citations]]
n5i0trzy7zcvnqxs8ic41k6ypbbiqwx
Tempilet:Harvc
10
2481
33005
2022-01-15T17:59:55Z
en>MusikBot II
0
Protected "[[Template:Harvc]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 250 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33005
wikitext
text/x-wiki
<includeonly>{{#invoke:Harvc|harvc}}</includeonly><noinclude>
{{documentation}}
</noinclude>
qikxdlbp1xqdhvcyr5t7j9hm135uzhi
33006
33005
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvc]]
33005
wikitext
text/x-wiki
<includeonly>{{#invoke:Harvc|harvc}}</includeonly><noinclude>
{{documentation}}
</noinclude>
qikxdlbp1xqdhvcyr5t7j9hm135uzhi
Module:Harvc
828
2482
33007
2025-01-26T16:13:50Z
en>Hike395
0
replace target_check() with call to target_check() in [[Module:Footnotes]], which has full wrapper/whitelist functionality
33007
Scribunto
text/plain
require('strict')
local code_open_tag = '<code class="cs1-code">'; -- cs1-code class defined in Module:Citation/CS1/styles.css
local lock_icons = { --icon classes are defined in Module:Citation/CS1/styles.css
['registration'] = {'id-lock-registration', 'Free registration required'},
['limited'] = {'id-lock-limited', 'Free access subject to limited trial, subscription normally required'},
['subscription'] = {'id-lock-subscription', 'Paid subscription required'},
}
--[[--------------------------< T A R G E T _ C H E C K >------------------------------------------------------
check to see if target of harvc exists in the page somewhere. Uses the target check mechanism from Module:Footnotes
setting |ignore-errors=yes in {{harvc}} will override this check
]]
local function target_check (anchor_id, ignore)
local whitelist_check = require('Module:Footnotes').target_check
local args = {ignore=ignore, template='Harvc', show=true}
return whitelist_check(anchor_id, args)
end
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Whether variable is set or not. A variable is set when it is not nil and not empty.
]]
local function is_set( var )
return not (var == nil or var == '');
end
--[[--------------------------< C H E C K _ Y E A R S >--------------------------------------------------------
evaluates params to see if they are one of these forms with or without lowercase letter disambiguator (same as in
Module:Footnotes):
YYYY
n.d.
nd
c. YYYY
YYYY–YYYY (separator is endash)
YYYY–YY (separator is endash)
when anchor_year present, year portion must be same as year param and must have disambiguator
returns empty string when params have correct form; error message else
]]
local function check_years (year, anchor_year)
local y, ay;
if not is_set (year) then -- year is required so return error message when not set
return ' missing ' .. code_open_tag .. '|year=</code>.';
end
local patterns = { -- allowed year patterns from Module:Footnotes (captures added here)
'^(%d%d%d%d?)%l?$', -- YYY or YYYY
'^(n%.d%.)%l?$', -- n.d.
'^(nd)%l?$', -- nd
'^(c%. %d%d%d%d?)%l?$', -- c. YYY or c. YYYY
'^(%d%d%d%d–%d%d%d%d)%l?$', -- YYYY–YYYY
'^(%d%d%d%d–%d%d)%l?$' -- YYYY–YY
}
for _, pattern in ipairs (patterns) do -- spin through the patterns
y = year:match (pattern); -- y is the year portion
if y then
break; -- when y is set, we found a match so done
end
end
if not y then
return ' invalid ' .. code_open_tag .. '|year=</code>.'; -- y not set, so year is malformed
end
if is_set (anchor_year) then -- anchor_year is optional
for _, pattern in ipairs (patterns) do -- spin through the patterns
ay = anchor_year:match (pattern); -- ay is the year portion
if ay then
break; -- when ay is set, we found a match so done
end
end
if not ay then
return ' invalid ' .. code_open_tag .. '|anchor-year</code>.'; -- ay not set, so anchor_year is malformed
end
-- if not anchor_year:match ('%l$') then
-- return ' ' .. code_open_tag .. '|anchor-year=</code> missing dab.'; -- anchor_year must end with a disambiguator letter
-- end
if y ~= ay then
return ' ' .. code_open_tag .. '|year=</code> / ' .. code_open_tag .. '|anchor-year=</code> mismatch.'; -- 'year' portions of year and anchor_year must be the same
end
end
return ''; -- both years are good; empty string for concatenation
end
--[[--------------------------< M A K E _ N A M E >------------------------------------------------------------
Assembles last, first, link, or mask into a displayable contributor name.
]]
local function make_name (last, first, link, mask)
local name = last;
if is_set (first) then
name = name .. ', ' .. first; -- concatenate first onto last
end
if is_set (link) then
name = '[[' .. link .. '|' .. name .. ']]'; -- form a wikilink around the name
end
if is_set (mask) then -- mask this author
if tonumber(mask) then
name = string.rep ('—', mask) -- make a string that number length of mdashes
else
name = mask; -- mask is not a number so use the mask text
end
end
return name;
end
--[[--------------------------< C O R E >----------------------------------------------------------------------
Assembles the various parts provided by the template into a properly formatted bridging citation. Adds punctuation
and text; encloses the whole within a span with id and class attributes.
This creates a CITEREF anchor from |last1= through |last4= and |year=. It also creates a CITEREF link from |in1= through
|in4= and |year=. It is presumed that the dates of contributions are the same as the date of the enclosing work.
Even though not displayed, a year parameter is still required for the CITEREF anchor
]]
local function core( args )
local span_open_tag; -- holds CITEREF and css
local contributors = ''; -- chapter or contribution authors
local source = ''; -- editor/author date list that forms a CITEREF link to a full citation
local in_text = ' In ';
-- form the CITEREF anchor
if is_set (args.id) then
args.id = mw.uri.anchorEncode (args.id)
span_open_tag = '<span id="' .. args.id .. '" class="citation">'; -- for use when contributor name is same as source name
else
local citeref = 'CITEREF' .. table.concat (args.citeref) .. (is_set (args['anchor-year']) and args['anchor-year'] or args.year);
citeref = mw.uri.anchorEncode (citeref);
span_open_tag = '<span id="' .. citeref .. '" class="citation">';
end
--[[
form the contributors display list:
if |name-list-style=harv, display is similar to {{sfn}} and {{harv}}, 1 to 4 last names;
if |display-authors= is empty or omitted, display is similar to cs1|2: display all names in last, first order
if |display-authors=etal then displays all author names in last, first order and append et al.
if value assigned to |display-authors= is less than the number of author last names, displays the specified number of author names in last, first order followed by et al.
]]
if 'harv' ~= args.name_list_style then -- default cs1|2 style contributor list
local i = 1;
local count;
local etal = false; -- when |display-authors= is same as number of authors in contributor list
if is_set (args.display_authors) then
if 'etal' == args.display_authors:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
count = #args.last; -- display all authors and ...
etal = true; -- ... append 'et al.'
else
count = tonumber (args.display_authors) or 0; -- 0 if can't be converted to a number
if 0 >= count then
args.err_msg = args.err_msg .. ' invalid ' .. code_open_tag .. '|display-authors=</code>'; -- if zero, then emit error message
end
end
if count > #args.last then
count = #args.last; -- when |display-authors= is more than the number of authors, use the number of authors
end
if count < #args.last then -- when |display-authors= is less than the number of authors
etal = true; -- append 'et al.'
end
else
count = #args.last; -- set count to display all of the authors
end
while i <= count do
if is_set (contributors) then
contributors = contributors .. '; ' .. make_name (args.last[i], args.first[i], args.link[i], args.mask[i]); -- the rest of the contributors
else
contributors = make_name (args.last[i], args.first[i], args.link[i], args.mask[i]); -- first contributor's name
end
i = i+1; -- bump the index
end
if true == etal then
contributors = contributors .. ' et al.'; -- append et al.
elseif 'amp' == args.name_list_style then
contributors = contributors:gsub('; ([^;]+)$', ' & %1') -- replace last separator with ' & '
end
else -- do default harv- or sfn-style contributor display
if 4 <= #args.last then -- four or more contributors (first followed by et al.)
contributors = args.last[1] .. ' et al.';
elseif 3 == #args.last then -- three (display them all)
contributors = args.last[1] .. ', ' .. args.last[2] .. ' & ' .. args.last[3];
elseif 2 == #args.last then -- two (first & second)
contributors = args.last[1] .. ' & ' .. args.last[2];
elseif 1 == #args.last then -- just one (first)
contributors = args.last[1];
else
args.err_msg = args.err_msg .. ' no authors in contributor list.'; -- this code used to find holes in the list; no more
end
end
--form the source author-date list
if is_set (args.in4) and is_set (args.in3) and is_set (args.in2) and is_set (args.in1) then
source = args.in1 .. ' et al.';
elseif not is_set (args.in4) and is_set (args.in3) and is_set (args.in2) and is_set (args.in1) then
source = args.in1 .. ', ' .. args.in2 .. ' & ' .. args.in3;
elseif not is_set (args.in4) and not is_set (args.in3) and is_set (args.in2) and is_set (args.in1) then
source = args.in1 .. ' & ' .. args.in2;
elseif not is_set (args.in4) and not is_set (args.in3) and not is_set (args.in2) and is_set (args.in1) then
source = args.in1;
else
args.err_msg = args.err_msg .. ' author missing from source list.'
end
source = source .. ' ' .. args.open .. args.year .. args.close; -- add the year with or without brackets
--assemble CITEREF wikilink
local anchor_id;
local target_err_msg;
if '' ~= args.ref then
anchor_id = mw.uri.anchorEncode (args.ref)
else
anchor_id = mw.uri.anchorEncode(table.concat ({'CITEREF', args.in1, args.in2, args.in3, args.in4, args.year}));
end
target_err_msg = target_check (anchor_id, args.ignore); -- see if there is a target for this anchor_id
source = '[[#' .. anchor_id .. "|" .. source .. "]]";
-- special case for afterword, foreword, introduction, preface
local no_quotes = ({['afterword']=true, ['foreword']=true, ['introduction']=true, ['preface']=true})[args.contribution:lower()];
--combine contribution with url to make external link
if args.url ~= '' then
args.contribution = '[' .. args.url .. ' ' .. args.contribution .. ']'; -- format external link
if args['url-access'] then
if lock_icons[args['url-access']] then
args.contribution = table.concat ({ -- add access icon markup to this item
'<span class="', -- open the opening span tag; icon classes are defined in Module:Citation/CS1/styles.css
lock_icons[args['url-access']][1], -- add the appropriate lock icon class
'" title="', -- and the title attribute
lock_icons[args['url-access']][2], -- for an appropriate tool tip
'">', -- close the opening span tag
args.contribution,
'</span>', -- and close the span
});
end
end
end
if is_set (args['anchor-year']) then
contributors = contributors .. ' (' .. args['anchor-year'] .. ')' .. args.sepc;
elseif args.sepc ~= contributors:sub(-1) and args.sepc .. ']]' ~= contributors:sub(-3) then
contributors = contributors .. args.sepc; -- add separator if not same as last character in name list (|first=John S. or et al.)
end
-- pages and other insource location
if args.p ~= '' then
args.p = args.page_sep .. args.p;
elseif args.pp ~= '' then
args.p = args.pages_sep .. args.pp; -- args.p not set so use it to hold common insource location info
end
if args.loc ~= '' then
args.p = args.p .. ', ' .. args.loc; -- add arg.loc to args.p
end
--wrap error messages in span and add help link
if is_set (args.err_msg) then
args.err_msg = '<span style="font-size:100%" class="error"> harvc:' .. args.err_msg .. ' ([[Template:Harvc|help]])</span>';
end
if ',' == args.sepc then
in_text = in_text:lower(); -- CS2 style use lower case
end
-- and put it all together
local result = {}; -- the assemby of the above output
table.insert (result, span_open_tag);
table.insert (result, contributors);
table.insert (result, no_quotes and ' ' or ' "'); -- foreword, afterword, introduction, preface contributions are not quoted; all other contributions are
table.insert (result, args.contribution);
table.insert (result, no_quotes and '' or '"'); -- foreword, afterword, introduction, preface contributions are not quoted; all other contributions are
table.insert (result, args.sepc);
table.insert (result, in_text);
table.insert (result, source);
table.insert (result, args.p);
table.insert (result, args.ps);
table.insert (result, args.err_msg);
if not is_set(args.err_msg) then
table.insert (result, target_err_msg)
end
table.insert (result, '</span>');
return table.concat (result); -- make a string and done
end
--[[--------------------------< H A R V C >--------------------------------------------------------------------
Entry point from {{harvc}} template. Fetches parent frame parameters, does a bit of simple error checking
]]
local function harvc (frame)
local args = {
err_msg = '',
page_sep = ", p. ",
pages_sep = ", pp. ",
sepc = '.',
ps = '.',
open = '(', -- year brackets for source year
close = ')',
last = {},
first = {},
link = {},
mask = {},
citeref = {}
}
local pframe = frame:getParent();
args.contribution = pframe.args.c or -- chapter or contribution
pframe.args.chapter or
pframe.args.contribution or '';
args.id = pframe.args.id or '';
args.in1 = pframe.args['in'] or pframe.args.in1 or ''; -- source editor surnames; 'in' is a Lua reserved keyword
args.in2 = pframe.args.in2 or '';
args.in3 = pframe.args.in3 or '';
args.in4 = pframe.args.in4 or '';
args.display_authors = pframe.args['display-authors']; -- the number of contributor names to display; cs1|2 format includes first names
args.name_list_style = pframe.args['name-list-style'] or ''; -- when set to 'harv' display contributor list in sfn or harv style
args.name_list_style = args.name_list_style:lower(); -- make it case agnostic
if is_set (pframe.args.last) or is_set (pframe.args.last1) or
is_set (pframe.args.author) or is_set (pframe.args.author1) then -- must have at least this to continue
args.last[1] = pframe.args.last or pframe.args.last1 or pframe.args.author or pframe.args.author1; -- get first contributor's last name
args.citeref[1] = args.last[1]; -- add it to the citeref
args.first[1] = pframe.args.first or pframe.args.first1; -- get first contributor's first name
args.link[1] = pframe.args['author-link'] or pframe.args['author-link1']; -- get first contributor's article link
args.mask[1] = pframe.args['author-mask'] or pframe.args['author-mask1']; -- get first contributor's article link
local i = 2; -- index for the rest of the names
while is_set (pframe.args['last'..i]) or is_set (pframe.args['author'..i]) do -- loop through pframe.args and get the rest of the names
args.last[i] = pframe.args['last'..i] or pframe.args['author'..i]; -- last names
args.first[i] = pframe.args['first'..i]; -- first names
args.link[i] = pframe.args['author-link'..i]; -- links
args.mask[i] = pframe.args['author-mask'..i]; -- masks
if 5 > i then
args.citeref[i] = args.last[i]; -- collect first four last names for CITEREF anchor
end
i = i + 1 -- bump the index
end
end
if 0 == #args.last then -- |last= is required
args.err_msg = args.err_msg .. ' no authors in contributor list.';
end
args.p = pframe.args.p or pframe.args.page or ''; -- source page number(s) or location
args.pp = pframe.args.pp or pframe.args.pages or '';
args.loc = pframe.args.loc or '';
args.ref = pframe.args.ref or pframe.args.Ref or ''; -- used to match |ref=<text> in cs1|2 source template
args.ignore = 'yes' == pframe.args['ignore-err']; -- suppress false-positive 'no target' errors
if 'cs2' == pframe.args.mode then
args.ps = ''; -- set postscript character to empty string, cs2 mode
args.sepc = ','; -- set seperator character to comma, cs2 mode
end
do -- to limit scope of local temp
local temp = pframe.args.ps or pframe.args.postscript;
if is_set (temp) then
if 'none' == temp:lower() then -- if |ps=none or |postscript=none then
args.ps = ''; -- no postscript
else
args.ps = temp; -- override default postscript
end
end
end -- end of scope limit
if 'yes' == pframe.args.nb then -- if no brackets around year in link to cs1|2 template
args.open = ''; -- unset these
args.close = '';
end
args.url = pframe.args.url or -- url for chapter or contribution
pframe.args['chapter-url'] or
pframe.args['contribution-url'] or '';
args['url-access'] = pframe.args['url-access'];
args.year = pframe.args.year or ''; -- required
args['anchor-year'] = pframe.args['anchor-year'] or '';
args.err_msg = args.err_msg .. check_years (args.year, args['anchor-year']);
if not is_set (args.contribution) then
args.err_msg = args.err_msg .. ' required contribution is missing.'; -- error message if source not provided
args.contribution = args.url; -- if set it will give us linkable text
end
if args.last[1] == args.in1 and
args.last[2] == args.in2 and
args.last[3] == args.in3 and
args.last[4] == args.in4 and
not is_set (args.id) then
args.err_msg = args.err_msg .. ' required ' .. code_open_tag .. '|id=</code> parameter missing.'; -- error message if contributor and source are the same
end
return table.concat ({frame:extensionTag ('templatestyles', '', {src='Module:Citation/CS1/styles.css'}), core (args)});
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
harvc = harvc
};
gax2zw56jpkvdwud2rx8nj8o9q366xt
33008
33007
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Harvc]]
33007
Scribunto
text/plain
require('strict')
local code_open_tag = '<code class="cs1-code">'; -- cs1-code class defined in Module:Citation/CS1/styles.css
local lock_icons = { --icon classes are defined in Module:Citation/CS1/styles.css
['registration'] = {'id-lock-registration', 'Free registration required'},
['limited'] = {'id-lock-limited', 'Free access subject to limited trial, subscription normally required'},
['subscription'] = {'id-lock-subscription', 'Paid subscription required'},
}
--[[--------------------------< T A R G E T _ C H E C K >------------------------------------------------------
check to see if target of harvc exists in the page somewhere. Uses the target check mechanism from Module:Footnotes
setting |ignore-errors=yes in {{harvc}} will override this check
]]
local function target_check (anchor_id, ignore)
local whitelist_check = require('Module:Footnotes').target_check
local args = {ignore=ignore, template='Harvc', show=true}
return whitelist_check(anchor_id, args)
end
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Whether variable is set or not. A variable is set when it is not nil and not empty.
]]
local function is_set( var )
return not (var == nil or var == '');
end
--[[--------------------------< C H E C K _ Y E A R S >--------------------------------------------------------
evaluates params to see if they are one of these forms with or without lowercase letter disambiguator (same as in
Module:Footnotes):
YYYY
n.d.
nd
c. YYYY
YYYY–YYYY (separator is endash)
YYYY–YY (separator is endash)
when anchor_year present, year portion must be same as year param and must have disambiguator
returns empty string when params have correct form; error message else
]]
local function check_years (year, anchor_year)
local y, ay;
if not is_set (year) then -- year is required so return error message when not set
return ' missing ' .. code_open_tag .. '|year=</code>.';
end
local patterns = { -- allowed year patterns from Module:Footnotes (captures added here)
'^(%d%d%d%d?)%l?$', -- YYY or YYYY
'^(n%.d%.)%l?$', -- n.d.
'^(nd)%l?$', -- nd
'^(c%. %d%d%d%d?)%l?$', -- c. YYY or c. YYYY
'^(%d%d%d%d–%d%d%d%d)%l?$', -- YYYY–YYYY
'^(%d%d%d%d–%d%d)%l?$' -- YYYY–YY
}
for _, pattern in ipairs (patterns) do -- spin through the patterns
y = year:match (pattern); -- y is the year portion
if y then
break; -- when y is set, we found a match so done
end
end
if not y then
return ' invalid ' .. code_open_tag .. '|year=</code>.'; -- y not set, so year is malformed
end
if is_set (anchor_year) then -- anchor_year is optional
for _, pattern in ipairs (patterns) do -- spin through the patterns
ay = anchor_year:match (pattern); -- ay is the year portion
if ay then
break; -- when ay is set, we found a match so done
end
end
if not ay then
return ' invalid ' .. code_open_tag .. '|anchor-year</code>.'; -- ay not set, so anchor_year is malformed
end
-- if not anchor_year:match ('%l$') then
-- return ' ' .. code_open_tag .. '|anchor-year=</code> missing dab.'; -- anchor_year must end with a disambiguator letter
-- end
if y ~= ay then
return ' ' .. code_open_tag .. '|year=</code> / ' .. code_open_tag .. '|anchor-year=</code> mismatch.'; -- 'year' portions of year and anchor_year must be the same
end
end
return ''; -- both years are good; empty string for concatenation
end
--[[--------------------------< M A K E _ N A M E >------------------------------------------------------------
Assembles last, first, link, or mask into a displayable contributor name.
]]
local function make_name (last, first, link, mask)
local name = last;
if is_set (first) then
name = name .. ', ' .. first; -- concatenate first onto last
end
if is_set (link) then
name = '[[' .. link .. '|' .. name .. ']]'; -- form a wikilink around the name
end
if is_set (mask) then -- mask this author
if tonumber(mask) then
name = string.rep ('—', mask) -- make a string that number length of mdashes
else
name = mask; -- mask is not a number so use the mask text
end
end
return name;
end
--[[--------------------------< C O R E >----------------------------------------------------------------------
Assembles the various parts provided by the template into a properly formatted bridging citation. Adds punctuation
and text; encloses the whole within a span with id and class attributes.
This creates a CITEREF anchor from |last1= through |last4= and |year=. It also creates a CITEREF link from |in1= through
|in4= and |year=. It is presumed that the dates of contributions are the same as the date of the enclosing work.
Even though not displayed, a year parameter is still required for the CITEREF anchor
]]
local function core( args )
local span_open_tag; -- holds CITEREF and css
local contributors = ''; -- chapter or contribution authors
local source = ''; -- editor/author date list that forms a CITEREF link to a full citation
local in_text = ' In ';
-- form the CITEREF anchor
if is_set (args.id) then
args.id = mw.uri.anchorEncode (args.id)
span_open_tag = '<span id="' .. args.id .. '" class="citation">'; -- for use when contributor name is same as source name
else
local citeref = 'CITEREF' .. table.concat (args.citeref) .. (is_set (args['anchor-year']) and args['anchor-year'] or args.year);
citeref = mw.uri.anchorEncode (citeref);
span_open_tag = '<span id="' .. citeref .. '" class="citation">';
end
--[[
form the contributors display list:
if |name-list-style=harv, display is similar to {{sfn}} and {{harv}}, 1 to 4 last names;
if |display-authors= is empty or omitted, display is similar to cs1|2: display all names in last, first order
if |display-authors=etal then displays all author names in last, first order and append et al.
if value assigned to |display-authors= is less than the number of author last names, displays the specified number of author names in last, first order followed by et al.
]]
if 'harv' ~= args.name_list_style then -- default cs1|2 style contributor list
local i = 1;
local count;
local etal = false; -- when |display-authors= is same as number of authors in contributor list
if is_set (args.display_authors) then
if 'etal' == args.display_authors:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings
count = #args.last; -- display all authors and ...
etal = true; -- ... append 'et al.'
else
count = tonumber (args.display_authors) or 0; -- 0 if can't be converted to a number
if 0 >= count then
args.err_msg = args.err_msg .. ' invalid ' .. code_open_tag .. '|display-authors=</code>'; -- if zero, then emit error message
end
end
if count > #args.last then
count = #args.last; -- when |display-authors= is more than the number of authors, use the number of authors
end
if count < #args.last then -- when |display-authors= is less than the number of authors
etal = true; -- append 'et al.'
end
else
count = #args.last; -- set count to display all of the authors
end
while i <= count do
if is_set (contributors) then
contributors = contributors .. '; ' .. make_name (args.last[i], args.first[i], args.link[i], args.mask[i]); -- the rest of the contributors
else
contributors = make_name (args.last[i], args.first[i], args.link[i], args.mask[i]); -- first contributor's name
end
i = i+1; -- bump the index
end
if true == etal then
contributors = contributors .. ' et al.'; -- append et al.
elseif 'amp' == args.name_list_style then
contributors = contributors:gsub('; ([^;]+)$', ' & %1') -- replace last separator with ' & '
end
else -- do default harv- or sfn-style contributor display
if 4 <= #args.last then -- four or more contributors (first followed by et al.)
contributors = args.last[1] .. ' et al.';
elseif 3 == #args.last then -- three (display them all)
contributors = args.last[1] .. ', ' .. args.last[2] .. ' & ' .. args.last[3];
elseif 2 == #args.last then -- two (first & second)
contributors = args.last[1] .. ' & ' .. args.last[2];
elseif 1 == #args.last then -- just one (first)
contributors = args.last[1];
else
args.err_msg = args.err_msg .. ' no authors in contributor list.'; -- this code used to find holes in the list; no more
end
end
--form the source author-date list
if is_set (args.in4) and is_set (args.in3) and is_set (args.in2) and is_set (args.in1) then
source = args.in1 .. ' et al.';
elseif not is_set (args.in4) and is_set (args.in3) and is_set (args.in2) and is_set (args.in1) then
source = args.in1 .. ', ' .. args.in2 .. ' & ' .. args.in3;
elseif not is_set (args.in4) and not is_set (args.in3) and is_set (args.in2) and is_set (args.in1) then
source = args.in1 .. ' & ' .. args.in2;
elseif not is_set (args.in4) and not is_set (args.in3) and not is_set (args.in2) and is_set (args.in1) then
source = args.in1;
else
args.err_msg = args.err_msg .. ' author missing from source list.'
end
source = source .. ' ' .. args.open .. args.year .. args.close; -- add the year with or without brackets
--assemble CITEREF wikilink
local anchor_id;
local target_err_msg;
if '' ~= args.ref then
anchor_id = mw.uri.anchorEncode (args.ref)
else
anchor_id = mw.uri.anchorEncode(table.concat ({'CITEREF', args.in1, args.in2, args.in3, args.in4, args.year}));
end
target_err_msg = target_check (anchor_id, args.ignore); -- see if there is a target for this anchor_id
source = '[[#' .. anchor_id .. "|" .. source .. "]]";
-- special case for afterword, foreword, introduction, preface
local no_quotes = ({['afterword']=true, ['foreword']=true, ['introduction']=true, ['preface']=true})[args.contribution:lower()];
--combine contribution with url to make external link
if args.url ~= '' then
args.contribution = '[' .. args.url .. ' ' .. args.contribution .. ']'; -- format external link
if args['url-access'] then
if lock_icons[args['url-access']] then
args.contribution = table.concat ({ -- add access icon markup to this item
'<span class="', -- open the opening span tag; icon classes are defined in Module:Citation/CS1/styles.css
lock_icons[args['url-access']][1], -- add the appropriate lock icon class
'" title="', -- and the title attribute
lock_icons[args['url-access']][2], -- for an appropriate tool tip
'">', -- close the opening span tag
args.contribution,
'</span>', -- and close the span
});
end
end
end
if is_set (args['anchor-year']) then
contributors = contributors .. ' (' .. args['anchor-year'] .. ')' .. args.sepc;
elseif args.sepc ~= contributors:sub(-1) and args.sepc .. ']]' ~= contributors:sub(-3) then
contributors = contributors .. args.sepc; -- add separator if not same as last character in name list (|first=John S. or et al.)
end
-- pages and other insource location
if args.p ~= '' then
args.p = args.page_sep .. args.p;
elseif args.pp ~= '' then
args.p = args.pages_sep .. args.pp; -- args.p not set so use it to hold common insource location info
end
if args.loc ~= '' then
args.p = args.p .. ', ' .. args.loc; -- add arg.loc to args.p
end
--wrap error messages in span and add help link
if is_set (args.err_msg) then
args.err_msg = '<span style="font-size:100%" class="error"> harvc:' .. args.err_msg .. ' ([[Template:Harvc|help]])</span>';
end
if ',' == args.sepc then
in_text = in_text:lower(); -- CS2 style use lower case
end
-- and put it all together
local result = {}; -- the assemby of the above output
table.insert (result, span_open_tag);
table.insert (result, contributors);
table.insert (result, no_quotes and ' ' or ' "'); -- foreword, afterword, introduction, preface contributions are not quoted; all other contributions are
table.insert (result, args.contribution);
table.insert (result, no_quotes and '' or '"'); -- foreword, afterword, introduction, preface contributions are not quoted; all other contributions are
table.insert (result, args.sepc);
table.insert (result, in_text);
table.insert (result, source);
table.insert (result, args.p);
table.insert (result, args.ps);
table.insert (result, args.err_msg);
if not is_set(args.err_msg) then
table.insert (result, target_err_msg)
end
table.insert (result, '</span>');
return table.concat (result); -- make a string and done
end
--[[--------------------------< H A R V C >--------------------------------------------------------------------
Entry point from {{harvc}} template. Fetches parent frame parameters, does a bit of simple error checking
]]
local function harvc (frame)
local args = {
err_msg = '',
page_sep = ", p. ",
pages_sep = ", pp. ",
sepc = '.',
ps = '.',
open = '(', -- year brackets for source year
close = ')',
last = {},
first = {},
link = {},
mask = {},
citeref = {}
}
local pframe = frame:getParent();
args.contribution = pframe.args.c or -- chapter or contribution
pframe.args.chapter or
pframe.args.contribution or '';
args.id = pframe.args.id or '';
args.in1 = pframe.args['in'] or pframe.args.in1 or ''; -- source editor surnames; 'in' is a Lua reserved keyword
args.in2 = pframe.args.in2 or '';
args.in3 = pframe.args.in3 or '';
args.in4 = pframe.args.in4 or '';
args.display_authors = pframe.args['display-authors']; -- the number of contributor names to display; cs1|2 format includes first names
args.name_list_style = pframe.args['name-list-style'] or ''; -- when set to 'harv' display contributor list in sfn or harv style
args.name_list_style = args.name_list_style:lower(); -- make it case agnostic
if is_set (pframe.args.last) or is_set (pframe.args.last1) or
is_set (pframe.args.author) or is_set (pframe.args.author1) then -- must have at least this to continue
args.last[1] = pframe.args.last or pframe.args.last1 or pframe.args.author or pframe.args.author1; -- get first contributor's last name
args.citeref[1] = args.last[1]; -- add it to the citeref
args.first[1] = pframe.args.first or pframe.args.first1; -- get first contributor's first name
args.link[1] = pframe.args['author-link'] or pframe.args['author-link1']; -- get first contributor's article link
args.mask[1] = pframe.args['author-mask'] or pframe.args['author-mask1']; -- get first contributor's article link
local i = 2; -- index for the rest of the names
while is_set (pframe.args['last'..i]) or is_set (pframe.args['author'..i]) do -- loop through pframe.args and get the rest of the names
args.last[i] = pframe.args['last'..i] or pframe.args['author'..i]; -- last names
args.first[i] = pframe.args['first'..i]; -- first names
args.link[i] = pframe.args['author-link'..i]; -- links
args.mask[i] = pframe.args['author-mask'..i]; -- masks
if 5 > i then
args.citeref[i] = args.last[i]; -- collect first four last names for CITEREF anchor
end
i = i + 1 -- bump the index
end
end
if 0 == #args.last then -- |last= is required
args.err_msg = args.err_msg .. ' no authors in contributor list.';
end
args.p = pframe.args.p or pframe.args.page or ''; -- source page number(s) or location
args.pp = pframe.args.pp or pframe.args.pages or '';
args.loc = pframe.args.loc or '';
args.ref = pframe.args.ref or pframe.args.Ref or ''; -- used to match |ref=<text> in cs1|2 source template
args.ignore = 'yes' == pframe.args['ignore-err']; -- suppress false-positive 'no target' errors
if 'cs2' == pframe.args.mode then
args.ps = ''; -- set postscript character to empty string, cs2 mode
args.sepc = ','; -- set seperator character to comma, cs2 mode
end
do -- to limit scope of local temp
local temp = pframe.args.ps or pframe.args.postscript;
if is_set (temp) then
if 'none' == temp:lower() then -- if |ps=none or |postscript=none then
args.ps = ''; -- no postscript
else
args.ps = temp; -- override default postscript
end
end
end -- end of scope limit
if 'yes' == pframe.args.nb then -- if no brackets around year in link to cs1|2 template
args.open = ''; -- unset these
args.close = '';
end
args.url = pframe.args.url or -- url for chapter or contribution
pframe.args['chapter-url'] or
pframe.args['contribution-url'] or '';
args['url-access'] = pframe.args['url-access'];
args.year = pframe.args.year or ''; -- required
args['anchor-year'] = pframe.args['anchor-year'] or '';
args.err_msg = args.err_msg .. check_years (args.year, args['anchor-year']);
if not is_set (args.contribution) then
args.err_msg = args.err_msg .. ' required contribution is missing.'; -- error message if source not provided
args.contribution = args.url; -- if set it will give us linkable text
end
if args.last[1] == args.in1 and
args.last[2] == args.in2 and
args.last[3] == args.in3 and
args.last[4] == args.in4 and
not is_set (args.id) then
args.err_msg = args.err_msg .. ' required ' .. code_open_tag .. '|id=</code> parameter missing.'; -- error message if contributor and source are the same
end
return table.concat ({frame:extensionTag ('templatestyles', '', {src='Module:Citation/CS1/styles.css'}), core (args)});
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
harvc = harvc
};
gax2zw56jpkvdwud2rx8nj8o9q366xt
Tempilet:Harvcolnb
10
2483
33009
2023-12-30T22:53:03Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Harvcolnb]] to [[Template:Harvard citation with colon no brackets]]: expand template name per [[WP:TPN]] and [[Tempate:Harvard citation with colon]] (which, for transparency, I just moved from [[Template:harvcol]])
33009
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation with colon no brackets]]
{{Redirect category shell|
{{R from move}}
}}
ptg0bxl09sux1zspxuzq0zt6bfq3iyg
33010
33009
2026-11-11T21:18:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvcolnb]]
33009
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation with colon no brackets]]
{{Redirect category shell|
{{R from move}}
}}
ptg0bxl09sux1zspxuzq0zt6bfq3iyg
Tempilet:See section
10
2484
33011
2017-01-17T01:22:48Z
en>Primefac
0
per TFD
33011
wikitext
text/x-wiki
#REDIRECT [[Template:section link]]
{{r from merge}}
7j4mstpii18l36knibn2tmw2a2gu2qu
33012
33011
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:See_section]]
33011
wikitext
text/x-wiki
#REDIRECT [[Template:section link]]
{{r from merge}}
7j4mstpii18l36knibn2tmw2a2gu2qu
Tempilet:Harvcol
10
2485
33013
2023-12-30T22:48:42Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Harvcol]] to [[Template:Harvard citation with colon]]: expand name per [[WP:TPN]] and to match [[Template:Harvard citation]]
33013
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation with colon]]
{{Redirect category shell|
{{R from move}}
}}
m9a59a6few7mm8k4ftvju1lbv663k2n
33014
33013
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvcol]]
33013
wikitext
text/x-wiki
#REDIRECT [[Template:Harvard citation with colon]]
{{Redirect category shell|
{{R from move}}
}}
m9a59a6few7mm8k4ftvju1lbv663k2n
Tempilet:Phab
10
2486
33015
2024-10-12T22:38:24Z
en>HouseBlaster
0
HouseBlaster moved page [[Draft:Move/Phab]] to [[Template:Phab]] without leaving a redirect: finish [[WP:ROBIN]] move
33015
wikitext
text/x-wiki
#REDIRECT [[Template:Phabricator]]
{{Redirect category shell|
{{R from move}}
{{R from template shortcut}}
}}
2v7b9zitfrr5ekac69clcxqz46nw1ow
33016
33015
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Phab]]
33015
wikitext
text/x-wiki
#REDIRECT [[Template:Phabricator]]
{{Redirect category shell|
{{R from move}}
{{R from template shortcut}}
}}
2v7b9zitfrr5ekac69clcxqz46nw1ow
Tempilet:Efn-lg
10
2487
33019
2023-02-17T03:04:35Z
en>RMCD bot
0
Removing notice of move discussion
33019
wikitext
text/x-wiki
<includeonly>{{efn|name={{{name|}}}|group=lower-greek|reference={{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
540b9npumd63myk8yo4tu3ejt9enzzx
33020
33019
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Efn-lg]]
33019
wikitext
text/x-wiki
<includeonly>{{efn|name={{{name|}}}|group=lower-greek|reference={{{1|{{{reference|{{{content|{{{text|}}}}}}}}}}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
540b9npumd63myk8yo4tu3ejt9enzzx
Tempilet:Notelist-lg
10
2488
33021
2019-04-17T04:28:44Z
en>Zzuuzz
0
Protected "[[Template:Notelist-lg]]": [[Wikipedia:High-risk templates|High risk template]] ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33021
wikitext
text/x-wiki
<includeonly>{{notelist|colwidth={{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group=lower-greek}}</includeonly><noinclude>
{{documentation}}
</noinclude>
pp8l3oiikiiz90xancpz486gacjwols
33022
33021
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Notelist-lg]]
33021
wikitext
text/x-wiki
<includeonly>{{notelist|colwidth={{{1|{{{colwidth|}}}}}}|refs={{{refs|{{{notes|}}}}}}|group=lower-greek}}</includeonly><noinclude>
{{documentation}}
</noinclude>
pp8l3oiikiiz90xancpz486gacjwols
Tempilet:Hairspace
10
2489
33023
2023-10-29T18:00:42Z
en>MusikBot II
0
Protected "[[Template:Hairspace]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 253 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33023
wikitext
text/x-wiki
#REDIRECT [[Template:Hair space]]
{{R from modification}}
3sscg84y5x2cebjdydolph0xzh11m4o
33024
33023
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hairspace]]
33023
wikitext
text/x-wiki
#REDIRECT [[Template:Hair space]]
{{R from modification}}
3sscg84y5x2cebjdydolph0xzh11m4o
Tempilet:Tracked
10
2490
33025
2021-02-19T16:11:39Z
en>Xaosflux
0
update from sandbox
33025
wikitext
text/x-wiki
<templatestyles src="Tracked/styles.css" /><div role="note" class="tracked plainlinks {{#if:{{{1|}}}|mw-trackedTemplate}}">Tracked in [[phabricator:|Phabricator]]<br />{{#if:{{{1|}}}|<span class="tracked-url">[[phabricator:{{ #ifeq: {{padleft: | 1 | {{ uc: {{{1}}} }} }} | T | {{ uc: {{{1}}} }} | T{{ #expr: {{{1}}} + 2000 }} }}|<span class="trakfab-{{ #ifeq: {{padleft: | 1 | {{ uc: {{{1}}} }} }} | T | {{ uc: {{{1}}} }} | T{{ #expr: {{{1}}} + 2000 }} }}"> Task {{ #ifeq: {{padleft: | 1 | {{ uc: {{{1}}} }} }} | T | {{ uc: {{{1}}} }} | T{{ #expr: {{{1}}} + 2000 }} }}</span>]]</span>}}<br>{{#switch:{{lc:{{{2|}}}}}
|resolved|fixed=<span class="tracked-closure tracked-resolved">Resolved</span>
|invalid=<span class="tracked-closure">Invalid</span>
|duplicate=<span class="tracked-closure">Duplicate</span>
|declined|wontfix=<span class="tracked-closure">Declined</span>
|stalled|later=<span class="tracked-closure">Stalled</span>
|open=<span class="tracked-closure">Open</span>
}}</div><noinclude>
{{documentation}}
</noinclude>
stnepu2u43klg2k81vusf9u6gxo5qrm
33026
33025
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tracked]]
33025
wikitext
text/x-wiki
<templatestyles src="Tracked/styles.css" /><div role="note" class="tracked plainlinks {{#if:{{{1|}}}|mw-trackedTemplate}}">Tracked in [[phabricator:|Phabricator]]<br />{{#if:{{{1|}}}|<span class="tracked-url">[[phabricator:{{ #ifeq: {{padleft: | 1 | {{ uc: {{{1}}} }} }} | T | {{ uc: {{{1}}} }} | T{{ #expr: {{{1}}} + 2000 }} }}|<span class="trakfab-{{ #ifeq: {{padleft: | 1 | {{ uc: {{{1}}} }} }} | T | {{ uc: {{{1}}} }} | T{{ #expr: {{{1}}} + 2000 }} }}"> Task {{ #ifeq: {{padleft: | 1 | {{ uc: {{{1}}} }} }} | T | {{ uc: {{{1}}} }} | T{{ #expr: {{{1}}} + 2000 }} }}</span>]]</span>}}<br>{{#switch:{{lc:{{{2|}}}}}
|resolved|fixed=<span class="tracked-closure tracked-resolved">Resolved</span>
|invalid=<span class="tracked-closure">Invalid</span>
|duplicate=<span class="tracked-closure">Duplicate</span>
|declined|wontfix=<span class="tracked-closure">Declined</span>
|stalled|later=<span class="tracked-closure">Stalled</span>
|open=<span class="tracked-closure">Open</span>
}}</div><noinclude>
{{documentation}}
</noinclude>
stnepu2u43klg2k81vusf9u6gxo5qrm
Tempilet:Tracked/styles.css
10
2491
33027
2024-12-23T13:12:52Z
en>Taavi
0
better dark mode support
33027
sanitized-css
text/css
/* {{pp|small=y}} */
.tracked {
float: right;
clear: right;
margin: 0 0 1em 1em;
width: 12em;
border: 1px solid var( --border-color-base, #a2a9b1 );
border-radius: 2px;
background-color: var( --background-color-interactive, #EAECF0 );
color: var( --color-base, #202122 );
font-size: 85%;
text-align: center;
padding: 0.5em;
}
.tracked-url {
font-weight: bold;
}
.tracked-closure {
color: var( --color-emphasized, #000 );
font-weight: bold;
text-transform: uppercase;
}
.tracked-resolved {
color: var( --color-success, #14866d );
}
nejphk45hqr2f36r3m4kwk8h09oqk9h
33028
33027
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tracked/styles.css]]
33027
sanitized-css
text/css
/* {{pp|small=y}} */
.tracked {
float: right;
clear: right;
margin: 0 0 1em 1em;
width: 12em;
border: 1px solid var( --border-color-base, #a2a9b1 );
border-radius: 2px;
background-color: var( --background-color-interactive, #EAECF0 );
color: var( --color-base, #202122 );
font-size: 85%;
text-align: center;
padding: 0.5em;
}
.tracked-url {
font-weight: bold;
}
.tracked-closure {
color: var( --color-emphasized, #000 );
font-weight: bold;
text-transform: uppercase;
}
.tracked-resolved {
color: var( --color-success, #14866d );
}
nejphk45hqr2f36r3m4kwk8h09oqk9h
Tempilet:Fake heading
10
2492
33029
2024-07-22T17:05:55Z
en>Stjn
0
update to use TemplateStyles
33029
wikitext
text/x-wiki
{{main other
|1={{error|Per [[WP:PSEUDOHEADING]] fake headings should not be used in articles.}}[[Category:Pages with templates in the wrong namespace]]
|2=<templatestyles src="Template:Fake_heading/styles.css" /><div class="fake-heading {{#switch: {{{level|{{{sub|}}}}}}
| 1 = h1
| 2 | #default = h2
| 3 = h3
| 4 | 5 | 6 = h4
}}">{{{1|Section}}}</div>}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
s9j5p2mricfni90m3malsq1hs0rvrbd
33030
33029
2026-11-11T21:18:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Fake_heading]]
33029
wikitext
text/x-wiki
{{main other
|1={{error|Per [[WP:PSEUDOHEADING]] fake headings should not be used in articles.}}[[Category:Pages with templates in the wrong namespace]]
|2=<templatestyles src="Template:Fake_heading/styles.css" /><div class="fake-heading {{#switch: {{{level|{{{sub|}}}}}}
| 1 = h1
| 2 | #default = h2
| 3 = h3
| 4 | 5 | 6 = h4
}}">{{{1|Section}}}</div>}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
s9j5p2mricfni90m3malsq1hs0rvrbd
Tempilet:Wikipedia referencing
10
2493
33031
2026-05-11T08:24:19Z
en>Ltbdl
0
+
33031
wikitext
text/x-wiki
{{navbox
| name = Wikipedia referencing
| state = {{{state<includeonly>|{{{1|autocollapse}}}</includeonly>}}}
| bodyclass = hlist
| title = [[Wikipedia:Verifiability|Wikipedia referencing]]
| group1 = Policies and guidelines
| list1 =
* [[Wikipedia:Verifiability|Verifiability]]
* [[Wikipedia:No original research|No original research]]
* [[Wikipedia:Biographies of living persons|Biographies of living persons]]
* [[Wikipedia:Reliable sources|Reliable sources]]
** [[Wikipedia:Identifying reliable sources (medicine)|Medicine]]
* [[Wikipedia:Citing sources|Citing sources]]
* [[Wikipedia:Scientific citation guidelines|Scientific citations]]
| group2 = General advice
| list2 =
* [[Wikipedia:Citation needed|Citation needed]]
* [[Wikipedia:Combining sources|Combining sources]]
* [[Wikipedia:Offline sources|Offline sources]]
* [[Help:Overview of referencing styles|Referencing styles]]
| group3 = [[Wikipedia:Citing sources|Citing sources]]
| list3 =
* [[Help:Citation Style 1|Citation Style 1]]
* [[Help:Citation Style 2|Citation Style 2]]
* [[:Category:Bluebook style citation templates|Bluebook]]
* [[:Category:Comics citation templates|Comics]]
* [[Wikipedia:Citation templates|Citation templates]]
| group4 = [[Wikipedia:Inline citation|Inline citations]]
| list4 =
* [[Help:Footnotes|Footnotes]]
* [[Wikipedia:Manual of Style#Punctuation and footnotes|Punctuation and footnotes]]
* [[Help:Shortened footnotes|Shortened footnotes]]
* [[Wikipedia:Nesting footnotes|Nesting footnotes]]
* [[Help:List-defined references|List-defined references]]
| group5 = [[Help:Referencing for beginners|Help for beginners]]
| list5 =
* [[Help:Reftags|Reference-tags]]
* [[Help:Citations quick reference|Citations quick reference]]
* [[Help:Introduction to referencing with Wiki Markup/1|Introduction to referencing]]
* [[Help:Referencing for beginners with citation templates|Referencing with citation templates]]
* [[Help:Referencing for beginners without using templates|Referencing without using templates]]
* [[Wikipedia:References dos and don'ts|Referencing dos and don'ts]]
* [[Wikipedia:Citing Wikipedia|Citing Wikipedia]]
| group6 = Advanced help
| list6 =
* [[Help:Cite link labels|Cite link labels]]
* [[Help:Cite errors|Cite errors]]
*[[Help:Citation merging|Citation merging (bundling)]]
* [[Help:Cite messages|Cite messages]]
* [[Help:Converting between references formats|Converting between references formats]]
* [[Help:Reference display customization|Reference display customization]]
* [[Help:References and page numbers|References and page numbers]]
* [[Wikipedia:Guidance on source reviewing at FAC|Guidance on source reviewing at FAC]]
* [[mw:Help:Cite|Cite extension documentation]]
| group7 = [[:Category:Footnote templates|Footnote templates]]
| list7 =
*[[Template:Citation Style documentation|Citation Style documentation]]
*[[Template:Multiple references|Multiple references]]
*{{tl|Reflist}}
*{{tl|Refbegin}}
| group8 = [[Help:Find sources|Find references ]]
| list8 =
*[[Help:Find sources|How to find sources]]
*[[Wikipedia:List of bibliographies|Bibliographies]]
* [[Wikipedia:The Wikipedia Library|Wikipedia Library]]
* [[WP:WikiProject Resource Exchange/Resource Request|Resource Exchange]]
* [[Wikipedia:Reference desk|Reference Desk]]
* [[WP:Book sources|Book Sources]]
* [[Wikipedia:Free English newspaper sources|Free newspaper sources]]
| group9 =[[Help:Citation tools|Citation tools]]<br>(External links)
| list9 =
*[https://citer.toolforge.org/ Citer]
*[https://tools.wmflabs.org/citations/ Citation bot]
*[https://tools.wmflabs.org/makeref/ MakeRef]
*[https://refill.toolforge.org/ng/ Refill]
*[https://archive.org/ WayBack]
*[https://iw.toolforge.org/oabot/ OABot]
}}<noinclude>
{{Documentation}}
</noinclude>
23gf7gi1biiayb5bm023v4svek91nn0
33032
33031
2026-11-11T21:18:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wikipedia_referencing]]
33031
wikitext
text/x-wiki
{{navbox
| name = Wikipedia referencing
| state = {{{state<includeonly>|{{{1|autocollapse}}}</includeonly>}}}
| bodyclass = hlist
| title = [[Wikipedia:Verifiability|Wikipedia referencing]]
| group1 = Policies and guidelines
| list1 =
* [[Wikipedia:Verifiability|Verifiability]]
* [[Wikipedia:No original research|No original research]]
* [[Wikipedia:Biographies of living persons|Biographies of living persons]]
* [[Wikipedia:Reliable sources|Reliable sources]]
** [[Wikipedia:Identifying reliable sources (medicine)|Medicine]]
* [[Wikipedia:Citing sources|Citing sources]]
* [[Wikipedia:Scientific citation guidelines|Scientific citations]]
| group2 = General advice
| list2 =
* [[Wikipedia:Citation needed|Citation needed]]
* [[Wikipedia:Combining sources|Combining sources]]
* [[Wikipedia:Offline sources|Offline sources]]
* [[Help:Overview of referencing styles|Referencing styles]]
| group3 = [[Wikipedia:Citing sources|Citing sources]]
| list3 =
* [[Help:Citation Style 1|Citation Style 1]]
* [[Help:Citation Style 2|Citation Style 2]]
* [[:Category:Bluebook style citation templates|Bluebook]]
* [[:Category:Comics citation templates|Comics]]
* [[Wikipedia:Citation templates|Citation templates]]
| group4 = [[Wikipedia:Inline citation|Inline citations]]
| list4 =
* [[Help:Footnotes|Footnotes]]
* [[Wikipedia:Manual of Style#Punctuation and footnotes|Punctuation and footnotes]]
* [[Help:Shortened footnotes|Shortened footnotes]]
* [[Wikipedia:Nesting footnotes|Nesting footnotes]]
* [[Help:List-defined references|List-defined references]]
| group5 = [[Help:Referencing for beginners|Help for beginners]]
| list5 =
* [[Help:Reftags|Reference-tags]]
* [[Help:Citations quick reference|Citations quick reference]]
* [[Help:Introduction to referencing with Wiki Markup/1|Introduction to referencing]]
* [[Help:Referencing for beginners with citation templates|Referencing with citation templates]]
* [[Help:Referencing for beginners without using templates|Referencing without using templates]]
* [[Wikipedia:References dos and don'ts|Referencing dos and don'ts]]
* [[Wikipedia:Citing Wikipedia|Citing Wikipedia]]
| group6 = Advanced help
| list6 =
* [[Help:Cite link labels|Cite link labels]]
* [[Help:Cite errors|Cite errors]]
*[[Help:Citation merging|Citation merging (bundling)]]
* [[Help:Cite messages|Cite messages]]
* [[Help:Converting between references formats|Converting between references formats]]
* [[Help:Reference display customization|Reference display customization]]
* [[Help:References and page numbers|References and page numbers]]
* [[Wikipedia:Guidance on source reviewing at FAC|Guidance on source reviewing at FAC]]
* [[mw:Help:Cite|Cite extension documentation]]
| group7 = [[:Category:Footnote templates|Footnote templates]]
| list7 =
*[[Template:Citation Style documentation|Citation Style documentation]]
*[[Template:Multiple references|Multiple references]]
*{{tl|Reflist}}
*{{tl|Refbegin}}
| group8 = [[Help:Find sources|Find references ]]
| list8 =
*[[Help:Find sources|How to find sources]]
*[[Wikipedia:List of bibliographies|Bibliographies]]
* [[Wikipedia:The Wikipedia Library|Wikipedia Library]]
* [[WP:WikiProject Resource Exchange/Resource Request|Resource Exchange]]
* [[Wikipedia:Reference desk|Reference Desk]]
* [[WP:Book sources|Book Sources]]
* [[Wikipedia:Free English newspaper sources|Free newspaper sources]]
| group9 =[[Help:Citation tools|Citation tools]]<br>(External links)
| list9 =
*[https://citer.toolforge.org/ Citer]
*[https://tools.wmflabs.org/citations/ Citation bot]
*[https://tools.wmflabs.org/makeref/ MakeRef]
*[https://refill.toolforge.org/ng/ Refill]
*[https://archive.org/ WayBack]
*[https://iw.toolforge.org/oabot/ OABot]
}}<noinclude>
{{Documentation}}
</noinclude>
23gf7gi1biiayb5bm023v4svek91nn0
Tempilet:Txl
10
2494
33033
2020-11-20T18:54:46Z
en>Primefac
0
avoid double redir
33033
wikitext
text/x-wiki
#REDIRECT [[Template:Template link expanded]]
2hv1wa3qv8z27p2c81v8yh9m4i4a9rt
33034
33033
2026-11-11T21:18:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Txl]]
33033
wikitext
text/x-wiki
#REDIRECT [[Template:Template link expanded]]
2hv1wa3qv8z27p2c81v8yh9m4i4a9rt
Tempilet:Cs1
10
2495
33035
2026-07-23T14:07:35Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Cs1]] to [[Template:Citation Style 1 link]]: Change to standard English spelling, spacing, and capitalization ([[WP:TPN]])
33035
wikitext
text/x-wiki
#REDIRECT [[Template:Citation Style 1 link]]
{{Redirect category shell|
{{R from move}}
}}
f35nii4kg93goxaeyrgy4g1v8mr06hj
33036
33035
2026-11-11T21:18:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cs1]]
33035
wikitext
text/x-wiki
#REDIRECT [[Template:Citation Style 1 link]]
{{Redirect category shell|
{{R from move}}
}}
f35nii4kg93goxaeyrgy4g1v8mr06hj
Tempilet:Cs2
10
2496
33037
2026-07-23T14:07:56Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Cs2]] to [[Template:Citation Style 2 link]]: Change to standard English spelling, spacing, and capitalization ([[WP:TPN]])
33037
wikitext
text/x-wiki
#REDIRECT [[Template:Citation Style 2 link]]
{{Redirect category shell|
{{R from move}}
}}
9pimhfrd2ov5bbamx0c9y9emdybmma4
33038
33037
2026-11-11T21:18:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cs2]]
33037
wikitext
text/x-wiki
#REDIRECT [[Template:Citation Style 2 link]]
{{Redirect category shell|
{{R from move}}
}}
9pimhfrd2ov5bbamx0c9y9emdybmma4
Tempilet:Phabricator
10
2497
33039
2025-10-22T15:54:44Z
en>Ahecht
0
Fix multiple issues surrounding labels and prefixes
33039
wikitext
text/x-wiki
{{#if:{{{art|}}}{{{article|}}}|[[Wikipedia:Phabricator|Phabricator]]''':''' }}<!--
-->{{#if:{{{1|}}}|{{#ifeq:{{padleft:|1|{{{1|T}}}}}|T|[[Phabricator:{{{1}}}|{{{1}}}]]|[[Phabricator:T{{{1}}}|T{{{1}}}]]}}{{#if:{{{label1|}}}| ({{{label1}}})}}|[[Phabricator:|Phabricator]]}}<!--
Extra fields
-->{{#if:{{{2|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{2|T}}}}}|T|[[Phabricator:{{{2}}}|{{{2}}}]]|[[Phabricator:T{{{2}}}|T{{{2}}}]]}}{{#if:{{{label2|}}}| ({{{label2}}})}}}}<!--
-->{{#if:{{{3|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{3|T}}}}}|T|[[Phabricator:{{{3}}}|{{{3}}}]]|[[Phabricator:T{{{3}}}|T{{{3}}}]]}}{{#if:{{{label3|}}}| ({{{label3}}})}}}}<!--
-->{{#if:{{{4|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{4|T}}}}}|T|[[Phabricator:{{{4}}}|{{{4}}}]]|[[Phabricator:T{{{4}}}|T{{{4}}}]]}}{{#if:{{{label4|}}}| ({{{label4}}})}}}}<!--
-->{{#if:{{{5|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{5|T}}}}}|T|[[Phabricator:{{{5}}}|{{{5}}}]]|[[Phabricator:T{{{5}}}|T{{{5}}}]]}}{{#if:{{{label5|}}}| ({{{label5}}})}}}}<!--
-->{{#if:{{{6|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{6|T}}}}}|T|[[Phabricator:{{{6}}}|{{{6}}}]]|[[Phabricator:T{{{6}}}|T{{{6}}}]]}}{{#if:{{{label6|}}}| ({{{label6}}})}}}}<!--
-->{{#if:{{{7|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{7|T}}}}}|T|[[Phabricator:{{{7}}}|{{{7}}}]]|[[Phabricator:T{{{7}}}|T{{{7}}}]]}}{{#if:{{{label7|}}}| ({{{label7}}})}}}}<!--
-->{{#if:{{{8|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{8|T}}}}}|T|[[Phabricator:{{{8}}}|{{{8}}}]]|[[Phabricator:T{{{8}}}|T{{{8}}}]]}}{{#if:{{{label8|}}}| ({{{label8}}})}}}}<!--
-->{{#if:{{{9|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{9|T}}}}}|T|[[Phabricator:{{{9}}}|{{{9}}}]]|[[Phabricator:T{{{9}}}|T{{{9}}}]]}}{{#if:{{{label9|}}}| ({{{label9}}})}}}}<!--
-->{{#if:{{{10|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{10|T}}}}}|T|[[Phabricator:{{{10}}}|{{{10}}}]]|[[Phabricator:T{{{10}}}|T{{{10}}}]]}}{{#if:{{{label10|}}}| ({{{label10}}})}}}}<!--
-->{{#if:{{{11|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{11|T}}}}}|T|[[Phabricator:{{{11}}}|{{{11}}}]]|[[Phabricator:T{{{11}}}|T{{{11}}}]]}}{{#if:{{{label11|}}}| ({{{label11}}})}}}}<!--
-->{{#if:{{{12|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{12|T}}}}}|T|[[Phabricator:{{{12}}}|{{{12}}}]]|[[Phabricator:T{{{12}}}|T{{{12}}}]]}}{{#if:{{{label12|}}}| ({{{label12}}})}}}}<!--
-->{{#if:{{{13|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{13|T}}}}}|T|[[Phabricator:{{{13}}}|{{{13}}}]]|[[Phabricator:T{{{13}}}|T{{{13}}}]]}}{{#if:{{{label13|}}}| ({{{label13}}})}}}}<!--
-->{{#if:{{{14|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{14|T}}}}}|T|[[Phabricator:{{{14}}}|{{{14}}}]]|[[Phabricator:T{{{14}}}|T{{{14}}}]]}}{{#if:{{{label14|}}}| ({{{label14}}})}}}}<!--
-->{{#if:{{{15|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{15|T}}}}}|T|[[Phabricator:{{{15}}}|{{{15}}}]]|[[Phabricator:T{{{15}}}|T{{{15}}}]]}}{{#if:{{{label15|}}}| ({{{label15}}})}}}}<!--
-->{{#if:{{{16|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{16|T}}}}}|T|[[Phabricator:{{{16}}}|{{{16}}}]]|[[Phabricator:T{{{16}}}|T{{{16}}}]]}}{{#if:{{{label16|}}}| ({{{label16}}})}}}}<!--
-->{{#if:{{{17|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{17|T}}}}}|T|[[Phabricator:{{{17}}}|{{{17}}}]]|[[Phabricator:T{{{17}}}|T{{{17}}}]]}}{{#if:{{{label17|}}}| ({{{label17}}})}}}}<!--
-->{{#if:{{{18|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{18|T}}}}}|T|[[Phabricator:{{{18}}}|{{{18}}}]]|[[Phabricator:T{{{18}}}|T{{{18}}}]]}}{{#if:{{{label18|}}}| ({{{label18}}})}}}}<!--
-->{{#if:{{{19|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{19|T}}}}}|T|[[Phabricator:{{{19}}}|{{{19}}}]]|[[Phabricator:T{{{19}}}|T{{{19}}}]]}}{{#if:{{{label19|}}}| ({{{label19}}})}}}}<!--
-->{{#if:{{{20|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{20|T}}}}}|T|[[Phabricator:{{{20}}}|{{{20}}}]]|[[Phabricator:T{{{20}}}|T{{{20}}}]]}}{{#if:{{{label20|}}}| ({{{label20}}})}}}}<!--
-->{{#if:{{{label|}}}| ({{{label}}})}}<noinclude>
{{documentation}}
</noinclude>
1edv3wsq13ci3oceb2vih8cczh6s1w2
33040
33039
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Phabricator]]
33039
wikitext
text/x-wiki
{{#if:{{{art|}}}{{{article|}}}|[[Wikipedia:Phabricator|Phabricator]]''':''' }}<!--
-->{{#if:{{{1|}}}|{{#ifeq:{{padleft:|1|{{{1|T}}}}}|T|[[Phabricator:{{{1}}}|{{{1}}}]]|[[Phabricator:T{{{1}}}|T{{{1}}}]]}}{{#if:{{{label1|}}}| ({{{label1}}})}}|[[Phabricator:|Phabricator]]}}<!--
Extra fields
-->{{#if:{{{2|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{2|T}}}}}|T|[[Phabricator:{{{2}}}|{{{2}}}]]|[[Phabricator:T{{{2}}}|T{{{2}}}]]}}{{#if:{{{label2|}}}| ({{{label2}}})}}}}<!--
-->{{#if:{{{3|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{3|T}}}}}|T|[[Phabricator:{{{3}}}|{{{3}}}]]|[[Phabricator:T{{{3}}}|T{{{3}}}]]}}{{#if:{{{label3|}}}| ({{{label3}}})}}}}<!--
-->{{#if:{{{4|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{4|T}}}}}|T|[[Phabricator:{{{4}}}|{{{4}}}]]|[[Phabricator:T{{{4}}}|T{{{4}}}]]}}{{#if:{{{label4|}}}| ({{{label4}}})}}}}<!--
-->{{#if:{{{5|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{5|T}}}}}|T|[[Phabricator:{{{5}}}|{{{5}}}]]|[[Phabricator:T{{{5}}}|T{{{5}}}]]}}{{#if:{{{label5|}}}| ({{{label5}}})}}}}<!--
-->{{#if:{{{6|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{6|T}}}}}|T|[[Phabricator:{{{6}}}|{{{6}}}]]|[[Phabricator:T{{{6}}}|T{{{6}}}]]}}{{#if:{{{label6|}}}| ({{{label6}}})}}}}<!--
-->{{#if:{{{7|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{7|T}}}}}|T|[[Phabricator:{{{7}}}|{{{7}}}]]|[[Phabricator:T{{{7}}}|T{{{7}}}]]}}{{#if:{{{label7|}}}| ({{{label7}}})}}}}<!--
-->{{#if:{{{8|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{8|T}}}}}|T|[[Phabricator:{{{8}}}|{{{8}}}]]|[[Phabricator:T{{{8}}}|T{{{8}}}]]}}{{#if:{{{label8|}}}| ({{{label8}}})}}}}<!--
-->{{#if:{{{9|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{9|T}}}}}|T|[[Phabricator:{{{9}}}|{{{9}}}]]|[[Phabricator:T{{{9}}}|T{{{9}}}]]}}{{#if:{{{label9|}}}| ({{{label9}}})}}}}<!--
-->{{#if:{{{10|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{10|T}}}}}|T|[[Phabricator:{{{10}}}|{{{10}}}]]|[[Phabricator:T{{{10}}}|T{{{10}}}]]}}{{#if:{{{label10|}}}| ({{{label10}}})}}}}<!--
-->{{#if:{{{11|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{11|T}}}}}|T|[[Phabricator:{{{11}}}|{{{11}}}]]|[[Phabricator:T{{{11}}}|T{{{11}}}]]}}{{#if:{{{label11|}}}| ({{{label11}}})}}}}<!--
-->{{#if:{{{12|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{12|T}}}}}|T|[[Phabricator:{{{12}}}|{{{12}}}]]|[[Phabricator:T{{{12}}}|T{{{12}}}]]}}{{#if:{{{label12|}}}| ({{{label12}}})}}}}<!--
-->{{#if:{{{13|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{13|T}}}}}|T|[[Phabricator:{{{13}}}|{{{13}}}]]|[[Phabricator:T{{{13}}}|T{{{13}}}]]}}{{#if:{{{label13|}}}| ({{{label13}}})}}}}<!--
-->{{#if:{{{14|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{14|T}}}}}|T|[[Phabricator:{{{14}}}|{{{14}}}]]|[[Phabricator:T{{{14}}}|T{{{14}}}]]}}{{#if:{{{label14|}}}| ({{{label14}}})}}}}<!--
-->{{#if:{{{15|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{15|T}}}}}|T|[[Phabricator:{{{15}}}|{{{15}}}]]|[[Phabricator:T{{{15}}}|T{{{15}}}]]}}{{#if:{{{label15|}}}| ({{{label15}}})}}}}<!--
-->{{#if:{{{16|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{16|T}}}}}|T|[[Phabricator:{{{16}}}|{{{16}}}]]|[[Phabricator:T{{{16}}}|T{{{16}}}]]}}{{#if:{{{label16|}}}| ({{{label16}}})}}}}<!--
-->{{#if:{{{17|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{17|T}}}}}|T|[[Phabricator:{{{17}}}|{{{17}}}]]|[[Phabricator:T{{{17}}}|T{{{17}}}]]}}{{#if:{{{label17|}}}| ({{{label17}}})}}}}<!--
-->{{#if:{{{18|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{18|T}}}}}|T|[[Phabricator:{{{18}}}|{{{18}}}]]|[[Phabricator:T{{{18}}}|T{{{18}}}]]}}{{#if:{{{label18|}}}| ({{{label18}}})}}}}<!--
-->{{#if:{{{19|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{19|T}}}}}|T|[[Phabricator:{{{19}}}|{{{19}}}]]|[[Phabricator:T{{{19}}}|T{{{19}}}]]}}{{#if:{{{label19|}}}| ({{{label19}}})}}}}<!--
-->{{#if:{{{20|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{20|T}}}}}|T|[[Phabricator:{{{20}}}|{{{20}}}]]|[[Phabricator:T{{{20}}}|T{{{20}}}]]}}{{#if:{{{label20|}}}| ({{{label20}}})}}}}<!--
-->{{#if:{{{label|}}}| ({{{label}}})}}<noinclude>
{{documentation}}
</noinclude>
1edv3wsq13ci3oceb2vih8cczh6s1w2
Tempilet:Fake header
10
2498
33041
2017-12-05T10:07:18Z
en>Samsara
0
Protected "[[Template:Fake header]]": template redirect under frequent abuse, 54 transclusions; via RfPP ([Edit=Require autoconfirmed or confirmed access] (indefinite) [Move=Require autoconfirmed or confirmed access] (indefinite))
33041
wikitext
text/x-wiki
#REDIRECT [[Template:Fake heading]]
mqkrvqvtb5ab78kn343l3ux4mj7itgz
33042
33041
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Fake_header]]
33041
wikitext
text/x-wiki
#REDIRECT [[Template:Fake heading]]
mqkrvqvtb5ab78kn343l3ux4mj7itgz
Tempilet:TemplateDataHeader
10
2499
33043
2018-02-23T16:30:31Z
en>Primefac
0
Changed protection level for "[[Template:TemplateDataHeader]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33043
wikitext
text/x-wiki
#REDIRECT [[Template:TemplateData header]]
{{R from move}}
bfnm7z66t4q2d8otfa0y3vtgkcwrfao
33044
33043
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:TemplateDataHeader]]
33043
wikitext
text/x-wiki
#REDIRECT [[Template:TemplateData header]]
{{R from move}}
bfnm7z66t4q2d8otfa0y3vtgkcwrfao
Tempilet:Tl1
10
2500
33047
2021-02-12T22:06:58Z
en>Xqbot
0
Bot: Fixing double redirect to [[Template:Template link]]
33047
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
te1inh9ax8xh2nrs3tami8k408z67tj
33048
33047
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tl1]]
33047
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
te1inh9ax8xh2nrs3tami8k408z67tj
Tempilet:Sfnote
10
2501
33049
2024-10-14T13:42:11Z
en>Voidxor
0
Simplify the syntax a little.
33049
wikitext
text/x-wiki
[[Help:Shortened footnotes|{{#ifeq:{{{lc}}}|{{{lc|}}}|shortened|Shortened}} footnotes]]<noinclude>
{{Documentation}}
</noinclude>
dzouw0qj76493df0skwky0t69lss7dt
33050
33049
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sfnote]]
33049
wikitext
text/x-wiki
[[Help:Shortened footnotes|{{#ifeq:{{{lc}}}|{{{lc|}}}|shortened|Shortened}} footnotes]]<noinclude>
{{Documentation}}
</noinclude>
dzouw0qj76493df0skwky0t69lss7dt
Tempilet:Cite *
10
2502
33053
2021-12-20T21:00:33Z
en>Trappist the monk
0
{{citation/core}} no longer used;
33053
wikitext
text/x-wiki
<code><nowiki>{{</nowiki>[[Template:Citation/core|cite *]]<nowiki>}}</nowiki></code><noinclude>
{{doc|content=
This template can be used on documentation pages to describe the set of templates supported by [[Module:Citation/CS1]]. [[Category:Documentation assistance templates]]
}}
</noinclude>
djv914oq1v4lg25w5dvxcfrnwu7jt25
33054
33053
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cite_*]]
33053
wikitext
text/x-wiki
<code><nowiki>{{</nowiki>[[Template:Citation/core|cite *]]<nowiki>}}</nowiki></code><noinclude>
{{doc|content=
This template can be used on documentation pages to describe the set of templates supported by [[Module:Citation/CS1]]. [[Category:Documentation assistance templates]]
}}
</noinclude>
djv914oq1v4lg25w5dvxcfrnwu7jt25
Tempilet:Fake notes and references
10
2503
33055
2024-08-06T17:20:39Z
en>Annh07
0
Reverted edit by [[Special:Contribs/2409:40F3:14:9BEF:5B5A:2AF7:487E:E412|2409:40F3:14:9BEF:5B5A:2AF7:487E:E412]] ([[User talk:2409:40F3:14:9BEF:5B5A:2AF7:487E:E412|talk]]) to last version by Discospinster
33055
wikitext
text/x-wiki
{{{1|}}}
{{fake heading|sub=3|Notes}}
<references/>
{{fake heading|sub=3|References}}
{{{2|}}}<noinclude>
{{Documentation}}
</noinclude>
djuv9uffgdihtmlk25dc44ru5ky0bmu
33056
33055
2026-11-11T21:18:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Fake_notes_and_references]]
33055
wikitext
text/x-wiki
{{{1|}}}
{{fake heading|sub=3|Notes}}
<references/>
{{fake heading|sub=3|References}}
{{{2|}}}<noinclude>
{{Documentation}}
</noinclude>
djuv9uffgdihtmlk25dc44ru5ky0bmu
Tempilet:Refname rules
10
2504
33057
2026-08-22T19:13:57Z
en>Anomie
0
Allow for omitting the "You may optionally provide reference names" note on [[Help:List-defined references]] where names are not optional.
33057
wikitext
text/x-wiki
{{{1|Names for footnotes and groups must follow these rules:}}}
* Names are case-sensitive. Please do not use raNdOM capitalization.
* Names {{strong|must not}} be purely numeric; the software will accept something like <code>":31337"</code> (which is punctuation plus a number), but it will ignore <code>"31337"</code> (purely numeric).
* Names should have semantic value, so that they can be more easily distinguished from each other by human editors who are looking at the wikitext. This means that ref names like <code>"Nguyen 2010"</code> are preferred to names like <code>":31337"</code>.
* Names must be unique. You may not use the same name to define different groups or footnotes. Try to avoid picking a name that someone else is likely to choose for a new citation, such as <code>":0"</code> or <code>"NYT"</code>.
* Please consider keeping reference names short, simple, and restricted to the standard [[English alphabet]] and numerals. If spaces are used, the following technical restrictions become relevant:
** Quotation marks are preferred but optional if the only characters used are letters <code>A–Z</code>, <code>a–z</code>, digits <code>0–9</code>, and the symbols <code style="word-break: break-all;">!$%&()*,-.:;<@[]^_`{|}~</code>. That is, all printable ASCII characters except <code style="word-break: break-all;">#"'/=>?\</code> and space.
** Inclusion of any other characters, {{em|including spaces}}, requires that the reference name be enclosed in quotes; for example, <code>name="John Smith"</code>. But quote-enclosed reference names may not include a less-than sign (<code><</code>) or a double straight quote symbol (<code>"</code>), which may, however, be included by [[Escape sequence|escaping]] as <code>&lt;</code> and <code>&quot;</code> respectively.{{#if: {{{2|}}}|
{{{2}}}}}
** The quote marks must be the standard, straight, double quotation marks (<code>"</code>); curly or other quotes will be parsed as part of the reference name.
{{#if:{{yesno|{{{name-required|no}}}}}||
* You may optionally provide reference names even when the reference name is not required. This makes later re-use of the sourced reference easier.
}}<noinclude>
{{documentation}}
</noinclude>
o7tb7yx3hy6vx0z80ediz92k5uk974f
33058
33057
2026-11-11T21:18:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Refname_rules]]
33057
wikitext
text/x-wiki
{{{1|Names for footnotes and groups must follow these rules:}}}
* Names are case-sensitive. Please do not use raNdOM capitalization.
* Names {{strong|must not}} be purely numeric; the software will accept something like <code>":31337"</code> (which is punctuation plus a number), but it will ignore <code>"31337"</code> (purely numeric).
* Names should have semantic value, so that they can be more easily distinguished from each other by human editors who are looking at the wikitext. This means that ref names like <code>"Nguyen 2010"</code> are preferred to names like <code>":31337"</code>.
* Names must be unique. You may not use the same name to define different groups or footnotes. Try to avoid picking a name that someone else is likely to choose for a new citation, such as <code>":0"</code> or <code>"NYT"</code>.
* Please consider keeping reference names short, simple, and restricted to the standard [[English alphabet]] and numerals. If spaces are used, the following technical restrictions become relevant:
** Quotation marks are preferred but optional if the only characters used are letters <code>A–Z</code>, <code>a–z</code>, digits <code>0–9</code>, and the symbols <code style="word-break: break-all;">!$%&()*,-.:;<@[]^_`{|}~</code>. That is, all printable ASCII characters except <code style="word-break: break-all;">#"'/=>?\</code> and space.
** Inclusion of any other characters, {{em|including spaces}}, requires that the reference name be enclosed in quotes; for example, <code>name="John Smith"</code>. But quote-enclosed reference names may not include a less-than sign (<code><</code>) or a double straight quote symbol (<code>"</code>), which may, however, be included by [[Escape sequence|escaping]] as <code>&lt;</code> and <code>&quot;</code> respectively.{{#if: {{{2|}}}|
{{{2}}}}}
** The quote marks must be the standard, straight, double quotation marks (<code>"</code>); curly or other quotes will be parsed as part of the reference name.
{{#if:{{yesno|{{{name-required|no}}}}}||
* You may optionally provide reference names even when the reference name is not required. This makes later re-use of the sourced reference easier.
}}<noinclude>
{{documentation}}
</noinclude>
o7tb7yx3hy6vx0z80ediz92k5uk974f
Tempilet:Sfn/doc
10
2505
33059
2026-08-28T05:43:01Z
en>Neils51
0
/* Large number of authors */ align with example (and desired usage)
33059
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{High-use|risk}}
{{Template redirect|sfnnb}}
{{Lua|Module:Footnotes|Module:Check for unknown parameters}}
The '''shortened footnote template''' {{tl|sfn}} creates a short [[WP:Citing sources#Short citations|author–date citation]] in a [[Wikipedia:Citing sources|footnote]], with a one-directional link to the first matching [[Wikipedia:Citation templates|citation template]] on the same page. It will combine identical footnotes automatically.
It is used to create {{sfnote|lc=y}}, a [[WP:CITESTYLE|citation style]] which pairs a short, author-date citation in a footnote with a [[WP:HOWCITE|complete citation]] in the references section at the end of the article (see example [[#Example|below]]). This citation style is used to simplify multiple citations to the same source and to reduce clutter in the edit window.
Common problems and known workarounds are given in the sections below. Use the table of contents to find what you need.
Note that the use (or even non-use) of these templates is an element of citation "style", and adding or removing them in articles with an established style should be consistent with that style. See [[WP:CITEVAR]].
==Usage==
'''Sfn''' generates an "author-date" style short-cite from the following parameters:
<div style="margin-left: 2em"><code>{{<nowiki>sfn</nowiki>| <{{var|last1}}*> | <{{var|last2}}> | <{{var|last3}}> | <{{var|last4}}> | <{{var|year}}*> | p= <{{var|page}}> | loc= <{{var|location}}> }}</code></div>
with
* <{{var|last1}}> – required; surname of first author or corporate author
* <{{var|last2}}>–<{{var|last4}}> – positional parameters; surnames of next three authors; required if available in the full citation
* <{{var|year}}> – required; four-digit year; may have a lowercase disambiguation letter, like {{pval|2012a}}
* {{para|p}} – specific page referenced in the source (alias: {{para|page}}{{hairspace}})
* {{para|pp}} – comma-separated list of [[Template:Csdoc#pages|individual pages and / or range(s) of pages]] referenced in the source (alias: {{para|pages}}{{hairspace}})
* {{para|loc}} – in-source location when {{para|p}} and {{para|pp}} are inappropriate; may be used to supplement {{para|p}} and {{para|pp}}; information such as a section or figure number. (alias: {{para|at}}{{hairspace}})
=== Example ===
Typical usage is shown in the example below. The text and the footnote are connected by a bi-directional link – clicking on the superscript takes the reader to the footnote, clicking on the footnote number takes them back to the superscript. The clicking on the short citation takes them to the full citation in the references section.
'''Sfn''' will also automatically combine identical footnotes.
{{markup|tag=syntaxhighlight|<nowiki>
Article text.{{sfn|Smith|2020|p=25}}
More article text.{{sfn|Smith|2020|p=25}}
Still more article text.{{sfn|Smith|2020|p=26}}
==Notes==
{{reflist}}
==References==
* {{cite book
| last = Smith | first = John
| date = 2020
| title = Smith's Book
}}
</nowiki>|
Article text.{{sfn|Smith|2020|p=25}}
More article text.{{sfn|Smith|2020|p=25}}
Still more article text.{{sfn|Smith|2020|p=26}}
{{fake notes and references||}}
{{cite book
| last = Smith | first = John
| date = 2020
| title = Smith's Book
}}}}
Template '''sfn''' is not placed inside {{tag|ref}} tags and generates the footnote internally. (To place '''sfn''' in a footnote, see [[#A citation inside an explanatory footnote|putting a citation inside a footnote]], below.)
===Parameters===
====Author(s) and year====
The first four author surnames (or all authors if fewer than four; use the values from {{para|last''N''}} or {{para|author''N''}}{{hairspace}}) are required, followed by the year of publication (from {{para|year}} or {{para|date}}). Authors past the fourth must be omitted or an error will result.
The [[#Possible issues with author-date link|possible issues]] section below describes workarounds for various common problems, such as [[#Large number of authors|large number of authors]], [[#Citation template has no author name|no author name]], [[#More than one work in a year|multiple works in the same year]], [[#Two sources with same last names and years|Two sources with same last names and years]] and others.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|1994|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|Jones|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|Jones|1994|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|Jones|Brown|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|Jones|Brown|1994|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}<br />
{{reflist}}
}}
====Location in the source text====
Use {{para|p}} for single pages; use {{para|pp}} for multiple pages (such as ranges). Use of {{para|p}} for multiple pages or {{para|pp}} for single pages can cause [[Help:Cite errors/Cite error references duplicate key|cite errors]].
{{para|loc}} can be used to specify a location in the source in another way, such as section numbers or chapters. It can also be combined with {{para|p}} or {{para|pp}}.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|2020|p=25}}</nowiki>
|Article text.{{sfn|Smith|2020|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|2020|pp=25–26}}</nowiki>
|Article text.{{sfn|Smith|2020|pp=25–26}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|2020|loc=ch. 3}}</nowiki>
|Article text.{{sfn|Smith|2020|loc=ch. 3}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|2020|p=25|loc=n. 14}}</nowiki>
|Article text.{{sfn|Smith|2020|p=25|loc=n. 14}}<br />
{{reflist}}
}}
==Possible issues with author-date link==
{{for|information on how to turn on error messages for broken links|:Category:Harv and Sfn template errors}}
These are techniques that address various unusual difficulties with the link between the short citation and the full citation.
Templates that have broken [[wikilink]]s using these templates are added to the category {{cat|All articles with broken links to citations}}.
===Wikilink to citation does not work===
If an article is using this template and nothing happens when you click on the highlighted [[wikilink]] from the [[WP:SHORTCITE|short citation]] to the [[WP:SHORTCITE|full citation]] at the bottom of the page, there are several possible solutions. If:
# Templates like this one are rarely used in this article. '''Solution''': Remove this template and format the citation in the style used most often in the article.
# The correct full citation does ''not'' appear at the bottom of the article. '''Solution''': Find the source (it may be copied from an article on a similar subject), and check that it verifies the text. If the source can't be found, replace this template with {{tl2|citation not found}}.
# The correct full citation appears at the bottom of the article, and
## The full citation uses a template from the list at [[Help:Citation Style 1|Citation Style 1]]:
### The citation template has only {{para|author}} and this template uses the last name. '''Solution''': Either (a) split the author name in to {{para|last}} and {{para|first}} in the full citation or (b) use the full name in the short citation. Be careful in either case to be consistent with the other citations in the article.
### The name in the short citation is spelled or capitalized differently than in the full citation. '''Solution''': Check the source for the correct spelling, and use the same spelling, spacing, and capitalization in both the short and full citations.
### There is more than one full citation with the same last name and year. '''Solution''': See [[#More than one work in a year|§More than one work in a year]] or [[#Two sources with same last names and years|§Two sources with same last names and years]].
### The year is different here than the full citation. '''Solution''': Check the source for the correct year, and use the same year in both the short and full citations.
### The template has a {{para|date}} field and no {{para|year}} field, but the format of the {{para|date}} field is unusual. '''Solution''': Try to fix the date. If the link still does not work, add {{para|year}} to the citation template. (It's okay if it has both.)
### The template does not have a year, or the date is set to "n.d." (no date). '''Solution''': Set the year field of this template to "n.d.".
### The template does not have an author's or an editor's, last name (authors take precedence over editors). '''Solution''': See [[#Citation template has no author name|§Citation template has no author name]], below.
### The template has no author, date or title. '''Solution''': See [[#Citation template has no author, date or title|§Citation template has no author, date or title]]
##Find the citation template in [[Wikipedia:Citation templates and reference anchors#Citation templates that create anchors|WP:Citation templates and anchors]] and find out if it has support for an anchor.
### The citation template doesn't automatically create the anchor, but has {{para|ref}}. '''Solution''': See [[#Citation template doesn't create a compatible anchor but has %7Cref=|§Citation template doesn't create a compatible anchor but has {{para|ref}}]], below.
### The citation template doesn't support anchors at all. '''Solution''': See [[#Citation template does not support any kind of anchor|§Citation format does not support any kind of anchor]], below.
##The full citation is handwritten.
### There are no other citation templates in the article. This is probably because local editors prefer it that way. '''Solution''': You should adapt to the style of the article. This would probably entail removing this template and formatting the short citation in plain text or replacing it with a full citation in {{tag|ref}} tags.
### There are citation templates used liberally throughout the article. '''Solution''': Reformat the source with the appropriate {{cite *}} template (and set the {{para|ref}} appropriately, if necessary).
### No appropriate template can be found. '''Solution''': See [[#No citation template|§No citation template]], below.
===Custom anchors===
A custom anchor using {{tl|sfnref}} can, at least temporarily, always make the shortened footnote look exactly the way you would like and still have a link that works. Many of the problems and workarounds below require a custom anchor.
All CS1 citation templates and several other templates allow you to set a custom anchor with parameter {{para|ref}}. The template {{tl|sfnRef}} creates an anchor that will match {{tl|sfn}}'s if it has the same parameters as {{tl|sfn}}. To use this technique, choose the name and year you would like to appear in {{tl|sfn}}, copy these parameters into {{tl|sfnRef}} and set {{tl|ref}} to the {{tl|sfnRef}}.
In other words, if you want this:
* {{tl2|sfn|<*''name you want''>|<''year''>|<''page / location''>}}
then set this:
* {{para|ref|{{tl2|sfnRef|<''name you want''>|<''year''>}}}}
in the template, and the link should work correctly.
The parameters must be <em>identical</em> in every respect. If the year is unusual (i.e. not a number), then include the year in the name and don't use the year position.
===Large number of authors===
If there are more than four authors, the first four authors' surnames (the value in {{para|last}} or {{para|author}}) are required by the template. Listing more authors is not supported. It is also possible to use a [[#Custom anchors|custom anchor]] that sets the name field to "Smith et al.".
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1994
| title = Scientific paper written by
many scientists
| journal = Important Journal
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}
|
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1994
| title = Scientific paper written by many scientists
| journal = Important Journal}}
}}
|<nowiki>Article text.{{sfn|Smith et al.|1995|p=25}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1995
| title = Another paper by many scientists
| journal = Important Journal
| ref = {{sfnref|Smith et al.|1995}}
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn|Smith et al.|1995|p=25}}
|
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1995
| title = Another paper by many scientists
| journal = Important Journal
| ref = {{sfnref|Smith et al.|1995}}
}}
}}}}
===More than one work in a year===
Where there is a need to cite more than one work ''by the same author published in the same year'', the standard way to disambiguate such works is to add a letter suffix after the year, e.g. "Smith 2006a" and "Smith 2006b".
Set the year element of the {{tlc|sfn}} templates (e.g. {{tlc|sfn|Smith|2006a}} and {{tlc|sfn|Smith|2006a}}), and add the disambiguation letter to the matching full citation, (e.g. <code><nowiki>{{cite book|...|last=Smith|date=2006b}}</nowiki></code>).
When {{tlc|sfn}} is used with {{tlx|citation}} or {{cs1}} templates, a year-suffix letter may be added to {{para|date}} for all accepted date formats except year-initial numeric ({{small|YYYY-MM-DD}}). It is not necessary to include both {{para|date}} and {{para|year}} (see exception [[#NB_YEAR|below]]). If both are included, {{para|year}} is used for the <code>CITEREF</code> anchor to be compliant with legacy citations.
:{{para|date|2013a}}: simple year only dates
:{{para|date|Jan 2013b}} or {{para|date|Winter 2013b}}: month or season and year dates
:{{para|date|9 November 2013b}} or {{para|date|November 9, 2013b}}: full dates
:{{para|date|June–July 2013c}} or {{para|date|Winter–Spring 2013c}}: month or season ranges and year dates
:{{para|date|c. 2013d}}: circa year dates
:{{para|date|{{#time:Y}}–{{#time:Y|now +1 year}}e}} or {{para|date|Summer {{#time:Y}}–{{#time:y|now +1 year}}e}}: year ranges
:{{para|date|n.d.f}}: no date (n.d.)
:{{anchor|NB_YEAR}}<s>{{para|date|2013g-11-09}}</s>: not supported, the template must use {{para|year|2013g}}. If month and day should be part of the citation as well, both parameters need to be given: {{para|date|2013-11-09}} {{para|year|2013x}}. In this case, {{para|date}} is used for citation display and metadata purposes, and {{para|year}} for link disambiguation.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|1993a|p=25}}
More text.{{sfn|Smith|1993b|p=32}}
==Notes==
{{reflist}}
==References==
* {{cite journal
|last=Smith
|first=Karen
|date=January 1993a
|title=Smith's first paper
|journal=Important Journal
}}
* {{cite journal
|last=Smith
|first=Karen
|date=Spring–Summer 1993b
|title=Smith's second paper
|journal=Another Important Journal
}}</nowiki>
|Article text.{{sfn|Smith|1993a|p=25}}
More text.{{sfn|Smith|1993b|p=32}}
{{fake notes and references}}
* {{cite journal|last=Smith|first=Karen|date=January 1993a|title=Smith's first paper|journal=Important Journal}}
* {{cite journal|last=Smith|first=Karen|date=Spring–Summer 1993b|title=Smith's second paper|journal=Another Important Journal}}
}}
===Two sources with same last names and years ===
An article might cite works from the same year by two different authors with the same last name. For example, an article might cite psychoanalysts [[Anna Freud]] and [[Sigmund Freud]], who both wrote books in the same year.
There are two solutions: it's possible to use the same technique described in the previous section. To differentiate between the two books, the first one can be given the year "1928a" and the second one "1928b".
Or, you can create a [[#Custom anchors|custom anchor]] that adds an initial to the name fields, e.g. "A. Freud" and "S. Freud". The links will no longer conflict.
{{markup|tag=syntaxhighlight
|<nowiki>
In 1928, [[Sigmund Freud]] wrote that "religious influence" was one of the primary goals of education.{{sfn|S. Freud|1928|pp=47-48}} In her first published book, [[Anna Freud]] proposed that the education of a child is never independent of the adults they depend upon.{{sfn|A. Freud|1928}}
===Notes===
{{reflist}}
===References===
{{refbegin}}
* {{cite book |last=Freud |first=Anna |date=1928 |title=Introduction to the Technique of Child Analysis |ref={{sfnref|A. Freud|1928}}}}
* {{cite book |last=Freud |first=Sigmund |date=1928 |title=The Future of an Illusion |ref={{sfnref|S. Freud|1928}}}}
{{refend}}
</nowiki>
|In 1928, [[Sigmund Freud]] wrote that "religious influence" was one of the primary goals of education.{{sfn|S. Freud|1928|pp=47-48}} In her first published book, [[Anna Freud]] proposed that the education of a child is never independent of the adults they depend upon.{{sfn|A. Freud|1928}}
{{fake heading|sub=3|Notes}}
{{reflist}}
{{fake heading|sub=3|References}}
{{refbegin}}
* {{cite book |last=Freud |first=Anna |date=1928 |title=Introduction to the Technique of Child Analysis |ref={{sfnref|A. Freud|1928}}}}
* {{cite book |last=Freud |first=Sigmund |date=1928 |title=The Future of an Illusion |ref={{sfnref|S. Freud|1928}}}}
{{refend}}
}}
===Citation template has no year but has a date===
Either the {{para|date}} or {{para|year}} of a citation template can be matched—the template logic can extract the year from a full date. If the date parameter is not a full date, then the extraction will fail. If the link does not seem to work, it also possible to set both {{para|date}} and {{para|year}} parameters. The template will display the date and use the year for the anchor. These two examples show a year being successfully extracted from full date.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|1997|p=101}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith | first = Karen
| date = 11 May 1997
| title = Smith's 1997 paper
| journal= Important Journal
}}</nowiki>
|{{fake notes and references
| Article text.{{sfn|Smith|1997|p=101}}
|* {{cite journal
| last = Smith | first = Karen
| date = 11 May 1997
| title = Smith's 1997 paper
| journal= Important Journal
}}}}
|<nowiki>Article text.{{sfn|Smith|1998|p=101}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith | first = Karen
| date = May 1998
| title = Smith's 1998 paper
| journal= Important Journal
}}</nowiki>
|{{fake notes and references
| Article text.{{sfn|Smith|1998|p=101}}
|* {{cite journal
| last = Smith | first = Karen
| date = May 1998
| title = Smith's 1998 paper
| journal= Important Journal
}}}}}}
===Citation template has no date===
If the cited source does not have a date, you can use {{para|date|n.d.}} for the full citation and "n.d." in place of the date for the short citation:
{{markup
|<nowiki>This is a fact.{{sfn|Smith|n.d.}}
==Notes==
{{reflist}}
==References==
* {{Citation |last=Smith |title=Title |date=n.d. |publisher=Publisher |mode=cs1}}</nowiki>
|This is a fact.{{sfn|Smith|n.d.}}
{{fake heading|sub=3|Notes}}
{{reflist}}
{{fake heading|sub=3|References}}
* {{Citation |last=Smith |title=Title |date=n.d. |publisher=Publisher |mode=cs1}}
}}
===Citation template has no author name===
Some sources do not have a single author with a last name, such as a magazine article or a report from a government institution. There is no consensus (in Wikipedia or among citation styles) about how to format author–date citations for works that do not have a specific author. Several choices are:
# The title of the article, or a shortened form of the title, is recommended by some style guides.
# For a newspaper or periodical, you may use the name of the paper and the date.
# For a publication by an institution, use either:
## The initials of the institution
## The name of the institution
# Other style guides recommend using "Anonymous" or "Anon."
An article should adopt one of these styles consistently.
Use a [[#Custom anchors|custom anchor]] to replace set the author name to one of these other choices, as shown in these examples below.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|BGI|1996|p=429}}
==Notes==
{{reflist}}
==References==
* {{cite book
| title = Important Book
| date = 1996
| publisher = Big Government Institution
| ref = {{sfnref|BGI|1996}}
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn |BGI|1996|p=429}}
|* {{cite book
| title = Important Book
| date = 1996
| publisher = Big Government Institution
| ref = {{sfnref|BGI|1996}}
}}}}
|<nowiki>Article text.{{sfn |''Popular Magazine''|1996|p=29}}
==Notes==
{{reflist}}
==References==
* {{cite magazine
| magazine = Popular Magazine
| title = An Article by an Anonymous Author
| date = 1996
| ref = {{sfnref|Popular Magazine|1996}}
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn |''Popular Magazine''|1996|p=29}}
|* {{cite magazine
| magazine = Popular Magazine
| title = An Article by an Anonymous Author
| date = 1996
| ref = {{sfnref|Popular Magazine|1996}}
}}}}}}
=== Citation template has no author, date or title ===
If the cited source does not have a date, author, or title, place a description of the source within brackets for the {{para|title}} parameter, use {{para|date|n.d.}} and create [[#Custom anchors|custom anchor]] with the description in the name position and "n.d." in the year.
{{markup
|<nowiki>This is a fact.{{sfn|[Description]|n.d.}}
==Notes==
{{reflist}}
==References==
* {{Citation |title=[Description] |date=n.d. |publisher=Publisher |mode=cs1 |ref={{sfnref|[Description]|n.d.}} }}</nowiki>
|This is a fact.{{sfn|[Description]|n.d.}}
{{fake heading|sub=3|Notes}}
{{reflist}}
{{fake heading|sub=3|References}}
* {{Citation |title=[Description] |date=n.d. |publisher=Publisher |mode=cs1 |ref={{sfnref|[Description]|n.d.}} }}
}}
===Citation template doesn't create a compatible anchor but has {{para|ref}} ===
{{See section|Wikipedia:Citation templates and reference anchors|Citation templates that create anchors}}
Some templates, such as {{tl|cite comic}}, {{tl|cite thesis}} and {{tl|cite map}} use the parameter {{para|ref}} to create an anchor for the short citation. This can be used to set a [[#Custom anchors|custom anchor]] for {{tl|sfn}}
{{markup
|<nowiki>Article text.{{sfn|Morrison|1987}}
==Notes==
{{reflist}}
==References==
* {{cite comic
|writer=Morrison, Grant
|artist=Yeowell, Steve
|title=2000 AD
|date=August 15, 1987
|publisher=[[Fleetway]]
|ref={{sfnref|Morrison|1987}}
}}</nowiki>
|{{fake notes and references
| Article text.{{sfn|Morrison|1987}}
|* {{cite comic
|writer=Morrison, Grant
|artist=Yeowell, Steve
|title=2000 AD
|date=August 15, 1987
|publisher=[[Fleetway]]
|ref={{sfnref|Morrison|1987}}
}}}}}}
You could also use CITEREF directly with a concatenation of <code>#CITEREF</code> plus the parameters passed to the Harvard citation template.
===Citation template does not support any kind of anchor===
{{See section|Wikipedia:Citation templates and reference anchors|Citation templates that create anchors}}
There are a few templates that do not support any kind of anchor, including {{tl|cite report}}, {{tl|cite music release notes}}, {{tl|cite DVD-notes}}, {{tl|cite episode}} and others.
It is possible to use {{tl|wikicite}} to create an anchor. It has a {{para|ref}} parameter which can be set to a [[#Custom anchors|custom anchor]]. In this example, the publisher is considered the editor.
{{markup
|<nowiki>
Article text.{{sfn|Big Government Agency|1999}}
==Notes==
{{reflist}}
==References==
* {{wikicite
| reference = {{cite report
| title=Important Government Report
| publisher=Big Government Agency
| date=1999
}}
| ref = {{sfnref|Big Government Agency|1999}}
}}
</nowiki>|
Article text.{{sfn|Big Government Agency|1999}}
{{fake heading|Notes}}
{{reflist}}
{{fake heading|References}}
* {{wikicite
| reference = {{cite report
| title=Important Government Report
| publisher=Big Government Agency
| date=1999
}}
| ref = {{sfnref|Big Government Agency|1999}}
}}
}}
===No citation template ===
If the citation is handwritten you should consider the citation format of the article. If citation templates are used often in this article, then check [[WP:Citation templates]] and try to find one that works for this source. If no template can be found, then this may be a source which can't be represented in our citation templates.
Use {{tl2|wikicite}} to make an anchor, setting Wikicite's {{para|ref}} to a [[#Custom anchors|custom anchor]].
{{markup
|<nowiki>Article text.{{sfn |A particularly unusual citation}}
==Notes==
{{reflist}}
==References==
* {{wikicite
| reference = A source that can't be described
using our citation templates at all.
| ref = {{sfnref|A particularly unusual citation}}
}}
</nowiki>|
{{fake notes and references
| Article text.{{sfn |A particularly unusual citation}}
|* {{wikicite
| reference = A source that can't be described using our citation templates at all.
| ref = {{sfnref|A particularly unusual citation}}
}}
}}
}}
== Techniques and variations ==
=== Changing the appearance of the short citation ===
==== With a custom anchor ====
With a [[#custom anchors|custom anchor]], {{tl|sfn}} can have any appearance you want. Here are two examples that editors have asked about in the past.
* MLA style author-title short citations. Put name and title in {{para|1}}, don't set the year.
{{markup|tag=syntaxhighlight|<nowiki>Article text.{{sfn|Ellison ''Ellison's Book''|p=13}}
{{reflist}}
* {{cite book
| last = Ellison | first = Larry
| title = Ellison's Book"
| year = 2011
| ref = {{sfnref|Ellison ''Ellison's Book''}}
}}
</nowiki>|
Article text.{{sfn|Ellison ''Ellison's Book''|p=13}}
{{reflist}}
* {{cite book
| last = Ellison | first = Larry
| title = Ellison's Book"
| year = 2011
| ref = {{sfnref|Ellison ''Ellison's Book''}}
}}
}}
* Adding the original date to a later edition of a book. Put the name, year and original date in {{para|1}}, don't set the year.
{{markup|tag=syntaxhighlight|<nowiki>Article text.{{sfn|Voltaire 2030 [1752]|p=13}}
{{reflist}}
* {{cite book
| title = Le Micromégas
| author = [[Voltaire]]
| year = 2020
| orig-date = 1752
| ref = {{sfnref|Voltaire 2030 [1752]}}
}}
</nowiki>|
Article text.{{sfn|Voltaire 2030 [1752]|p=13}}
{{reflist}}
* {{cite book
| title = Le Micromégas
| author = [[Voltaire]]
| year = 2020
| orig-date = 1752
| ref = {{sfnref|Voltaire 2030 [1752]}}
}}
}}
====With templates====
<!--- This is excerpted in WP:Shortened footnotes, Template:harv/doc/shared and Template:sfnp/doc --->
These alternative templates change the appearance of the author-date citation
{{anchor|No closing period}}
{| class="wikitable"
! style="width: 30%" | Purpose !! style="width: 40%;" | Markup !! style="width: 30%" | Renders as
|-
| The most common format,<br/>used 200,000+ articles<br/>Has a final period
|| <code><nowiki>{{</nowiki>'''[[Template:sfn|sfn]]'''<nowiki>|Smith|2020|p=25}}</nowiki></code>
|| Article text.{{sfn|Smith|2020|p=25}} <br /> {{Reflist}}
|-
| No final period
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvnb|harvnb]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvnb|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| No final period
|| <code><nowiki>{{</nowiki>'''[[Template:sfn|sfn]]'''<nowiki>|Smith|2020|p=25|ps=none}}</nowiki></code>
|| Article text.{{sfn|Smith|2020|p=25|ps=none}} <br /> {{Reflist}}
|-
| Parenthesis around year and page
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvtxt|harvtxt]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvtxt|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Parenthesis around citation
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harv|harv]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harv|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Parenthesis around year
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvp|harvp]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvp|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Parenthesis around year
|| <code><nowiki>{{</nowiki>'''[[Template:sfnp|sfnp]]'''<nowiki>|Smith|2020|p=25|ps=none}}</nowiki></code>
|| Article text.{{sfnp|Smith|2020|p=25|ps=none}} <br /> {{Reflist}}
|-
| Parenthesis around year<br />With final period
|| <code><nowiki>{{</nowiki>'''[[Template:sfnp|sfnp]]'''<nowiki>|Smith|2020|p=25}}</nowiki></code>
|| Article text.{{sfnp|Smith|2020|p=25}} <br /> {{Reflist}}
|-
| Colon for page number
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvcolnb|harvcolnb]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvcolnb|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Colon for page number,<br/>parenthesis around year and page
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvcoltxt|harvcoltxt]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvcoltxt|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Colon for page number,<br />parenthesis around citation
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvcol|harvcol]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvcol|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|}
{{anchor|Additional comments or quotes}}
=== Adding additional comments or quotes ===
The templates {{tl2|harvnb}} or {{tl2|harvtxt}} can be used to add quotes or additional comments into the footnote, in the form of in-text attributions.
{{markup|tag=syntaxhighlight|<nowiki>Some information.<ref>{{harvnb|Smith|2011|p=2}}: "A quote verifying the information."</ref>
== Notes ==
{{reflist}}
</nowiki>|
Some information.<ref>{{harvnb|Smith|2011|p=2}}: "A quote verifying the information."</ref>
{{Fake heading|sub=3|Notes}}
{{reflist}}
}}
{{markup|tag=syntaxhighlight|<nowiki>
"A quote in a secondary source."<ref>{{harvtxt|Smith|2011|p=2}} quoted in {{harvtxt|Jones|2010|p=343}}</ref>
== Notes ==
{{reflist}}
</nowiki>|
"A quote in a secondary source."<ref>{{harvtxt|Smith|2011|p=2}} quoted in {{harvtxt|Jones|2010|p=343}}</ref>
{{Fake heading|sub=3|Notes}}
{{reflist}}
}}
===Adding a URL for the page or location===
If a specific link to the page or section is available, a [[Uniform Resource Locator|URL]] can be added to the location or page number.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|2011|p=[https://en.wikipedia.org 3]}}
Other article text.{{sfn|Smith|2011|loc=[https://en.wikipedia.org §7]}}
==Notes==
{{reflist}}
==References==
* {{cite book | last = Smith | date = 2011 | title = Smith's
other book }}</nowiki>
|{{Fake notes and references
|Article text.{{sfn|Smith|2011|p=[https://en.wikipedia.org 3]}}
Other article text.{{sfn|Smith|2011|loc=[https://en.wikipedia.org §7]}}
|* {{cite book | last = Smith | date = 2011 | title = Smith's book }}
}}}}
(See [[#url weirdness|below]] for a potential issue with this technique.)
===Citations inside explanatory footnotes===
Sometimes an explanatory footnote requires a citation. There are several acceptable solutions.
Citations using {{tl1|sfn}} can't be directly embedded between {{tag|ref}} tags, because the following message will be produced: {{small|{{error|Cite error references missing group||nocat=true}}}}. But {{tl1|sfn}} can be used with templates {{tl1|efn}} and {{tl1|notelist}}, which separates the explanatory footnotes from the short citations, as shown in this example. (See also [[Chinese Room]], which is an article that makes extensive use of this technique.)
{{markup|tag=syntaxhighlight
|<nowiki>Interesting fact.{{efn|Clarification of interesting fact.{{sfn|Smith|2018}}}}
==Notes==
{{notelist}}
==Citations==
{{reflist}}
==References==
* {{cite book
| last = Smith
| date = 2018
| title = Smith's other book }}
</nowiki>|
Interesting fact.{{efn|Clarification of interesting fact.{{sfn|Smith|2018}}}}
{{fake heading|Notes}}
{{notelist}}
{{fake heading|Citations}}
{{reflist}}
{{fake heading|References}}
* {{cite book
| last = Smith
| date = 2018
| title = Smith's other book }}
}}
===Bundled citations===
{{see also|Help:Citation merging |Wikipedia:Citing sources#Bundling citations}}
Template {{tl2|harvnb}} (with <syntaxhighlight lang="wikitext"><ref></syntaxhighlight> tags) or {{tl2|sfnm}} can be used to [[WP:CITE#Bundling citations|bundle citations]].
{{markup|tag=syntaxhighlight
|<nowiki>Article text.<ref>{{harvnb|Smith|2010|p=25}}; {{harvnb|Jones|2010}}</ref>
</nowiki>
|Article text.<ref>{{harvnb|Smith|2010|p=25}}; {{harvnb|Jones|2010}}</ref>
{{Fake heading|sub=3|Notes}}
<references />
|<nowiki>
Article text.{{sfnm|1a1=Smith|1y=2010|1p=25|2a1=Jones|2y=2010}}
</nowiki>
|Article text.{{sfnm|1a1=Smith|1y=2010|1p=25|2a1=Jones|2y=2010}}
{{Fake heading|sub=3|Notes}}
<references />
|<nowiki>
==References==
* {{cite book |last = Smith |first = John |date = 2010 |title = Smith's book}}
* {{cite book |last = Jones |first = Mary |date = 2010 |title = Jones' book}}
</nowiki>
|{{Fake heading|sub=3|References}}
* {{cite book |last = Smith |first = John |date = 2010 |title = Smith's book }}
* {{cite book |last = Jones |first = Mary |date = 2010 |title = Jones' book }}
}}
===Multiple lists of inline citations===
Sometimes there is a need to create two or more separate lists of inline footnotes. For example some family trees are contained in templates, they are transluded into several biographies, and they have their own self contained citations (see [[Template:Houston family tree]] and the article [[Margaret Lea Houston]]).
To facilitate this, while the main page uses the standard 1,2,3 footnote counting, it is common for family trees to use the efn template with a group parameter set—for example {{tlx|efn-lg}} (lower-greek). The efn templates are text templates, to link some or all of the content of the efn template to a long citation template such as {{tlx|cite book}} place {{tlx|harvnb}} or {{tlx|harv}} within the efn template.
{{markup|tag=syntaxhighlight
|<nowiki>
...by the fact itself.<ref>{{harvnb|Smith|2022|p=1}}</ref>
==Family Tree==
He's his own grandpa.{{efn-lg|{{harvnb|Latham|1947|p=9}} }}
===FT notes===
{{notelist-lg}}
===FT references===
*{{citation
|last=Latham
|first=Dwight
|date=1947
|title=The Adams family}}
==See also==
[[Ipso facto]]<ref>{{harvnb|Smith|2022|p=2}}</ref>
==Notes==
{{Reflist}}
==References==
* {{citation
|last=Smith
|date=2018
|title=Smith's other book}}
</nowiki>|
...by the fact itself.<ref>{{harvnb|Smith|2022|p=1}}</ref>
{{fake heading|Family Tree}}
He's his own grandpa.{{efn-lg|{{harvnb|Latham|1947|p=9}} }}
<small>{{fake heading|FT notes}}</small>
{{notelist-lg}}
<small>{{fake heading|FT references}}</small>
*{{citation
|last=Latham
|first=Dwight
|date=1947
|title=The Adams family}}
{{fake heading|See also}}
[[Ipso facto]]<ref>{{harvnb|Smith|2022|p=2}}</ref>
{{fake heading|Notes}}
{{Reflist}}
{{fake heading|References}}
* {{citation
|last=Smith
|date=2022
|title=Smith's other book }}
}}
===Cite several contributions/chapters in a larger work===
{{tl|harvc}} can be used as a target for {{tl|sfn}} and other shortened footnote templates.
{{markup|tag=syntaxhighlight
|<nowiki>
Article text.{{sfn|Stout|Johnson|1957}}
More article text.{{sfn|Wadleigh|1957}}
Even more article text.<ref>[[#Stefferud preface|Stefferud 1957]].</ref>
== Notes ==
{{realist}}
== References ==
* {{cite book
| title=Soil: The Yearbook of Agriculture 1957
| editor-last=Stefferud | editor-first=Alfred
| date=1957
| publisher= ...
}}
** {{harvc
| last=Stefferud | first=A.
| year=1957
| id=Stefferud preface
| c=Preface
| url=...
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last1 = Stout
| first1=P. R.
| last2=Johnson | first2=C. M.
| year=1957
| c=Trace Elements
| url=...
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last=Wadleigh | first=C. H.
| year=1957
| c=Growth of Plants
| url=...
| in=Stefferud
| ignore-err=yes}}
</nowiki>
|
Article text.{{sfn|Stout|Johnson|1957}}
More article text.{{sfn|Wadleigh|1957}}
Even more article text.<ref>[[#Stefferud preface|Stefferud 1957]]</ref>
{{fake notes and references}}
* {{cite book
| title=Soil: The Yearbook of Agriculture 1957
| editor-last=Stefferud | editor-first=Alfred
| date=1957
| publisher=United States Department of Agriculture
| url=https://archive.org/stream/yoa1957#page/n2/mode/1up|oclc=704186906
}}
** {{harvc
| last=Stefferud | first=A.
| year=1957
| id=Stefferud preface
| c=Preface
| url=https://archive.org/stream/yoa1957#page/n7/mode/1up
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last1 = Stout
| first1=P. R.
| last2=Johnson | first2=C. M.
| year=1957
| c=Trace Elements
| url=https://archive.org/stream/yoa1957#page/n167/mode/1up
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last=Wadleigh | first=C. H.
| year=1957
| c=Growth of Plants |url=https://archive.org/stream/yoa1957#page/n57/mode/1up
| in=Stefferud
| ignore-err=yes}}
}}
===More exotic Harvard citations===
{{Main|Template:Harvard citations}}
More exotic Harvard citations can be constructed using the {{tl2|harvs}} template, such as multiple papers by the same author, using both the first and last names, links to articles about the author, and others.
{{markup|tag=syntaxhighlight|<nowiki>
The theory was developed by {{harvs|txt
| first=F. J. |last=Murray |author1-link=F. J. Murray
| first2=J.|last2=von Neumann |author2-link=John von Neumann
| year=1936
| year2=1937
| year3=1943
}}.
</nowiki>|
The theory was developed by {{harvs|txt|first=F. J.|last=Murray|author1-link=F. J. Murray|first2=J.|last2=von Neumann|author2-link=John von Neumann|year=1936|year2=1937|year3=1943}}.
|<nowiki>
== References ==
* {{citation | last1 = Murray | first1 = F. J. | date = 1936 | ...}}
* {{citation | last1 = Murray | first1 = F. J. | date = 1937 | ...}}
* {{citation | last1 = Murray | first1 = F. J. | date = 1943 | ...}}
</nowiki>|
{{fake header|sub=3|References}}
* {{citation | last=Murray | first=F. J.| last2=von Neumann | first2=John | date=1936 | title=Mathematics Paper }}
* {{citation | last=Murray | first=F. J.| last2=von Neumann | first2=John | date=1937 | title=Another Mathematics Paper }}
* {{citation | last=Murray | first=F. J.| last2=von Neumann | first2=John | date=1943 | title=Yet Another Mathematics Paper }}
}}
The same effect can be achieved with {{tl|sfnref}} and local links.
{{markup|tag=syntaxhighlight|<nowiki>
The theory was developed by [[F. J. Murray]] and [[John von Neumann|J. von Neumann]] ([[#{{sfnref|Murray|von Neumann|1936}}|1936]],[[#{{sfnref|Murray|von Neumann|1937}}|1937]],[[#{{sfnref|Murray|von Neumann|1943}}|1943]]).
</nowiki>|
The theory was developed by [[F. J. Murray]] and [[John von Neumann|J. von Neumann]] ([[#{{sfnref|Murray|von Neumann|1936}}|1936]], [[#{{sfnref|Murray|von Neumann|1937}}|1937]], [[#{{sfnref|Murray|von Neumann|1943}}|1943]]).
}}
{{anchor|Ps problems}}
== Open problems ==
=== Discouraged parameters ===
These parameters were designed to handle special cases that are better handled by other techniques.
====Parameter {{para|ps}}====
These templates have a parameter {{para|ps}}, designed to hold quotes and explanations.
Two or more {{tlc|sfn}} templates with the same authors, same year, and same page, but different {{para|ps}} will result in a {{small|{{error|Cite error: The named reference ... was defined multiple times with different content}}}} message. This message happens because the reference names that {{tlc|sfn}} creates will be the same, but the content between the {{tag|ref|params=name="FOOTNOTE..."|o}} tag and the {{tag|ref|c}} tag will be different.
A workaround is to convert the offending {{tlc|sfn}} templates to {{tlx|harvnb}} wrapped in {{tag|ref}} tags, as recommended in [[#Additional comments or quotes|§ Adding additional comments or quotes]]. This method is more versatile and robust.
Template {{para|ps}} also has a second (rare) use, when setting {{para|ps|none}}, which suppressed the final period. See [[#Variations in the format of the author-date citation|§ Variations in the format of the author-date citation]].
====Parameter {{para|ref}}====
The optional parameter {{para|ref}} was used to create an unusually named link from the short citation to the full citation. This typically would require setting the hand coded link on the full citation as well. It's easier to only set the link of the full citation to {{para|ref|{{tl2|sfnref}}}}.
If you specify {{para|ref|none}}, no hyperlink is created. However, if one does not want the link, it is always possible to simply use plain text instead of the template.
The parameter only appears in <nowiki>{{harv*}}</nowiki> templates, and may still appear in a few articles.
===Link works but displays a no target error===
When a short-cite template links to a full citation that is rendered by a template that wraps a CS1 template, like {{txl|cite DNB}} (which wraps {{txl|cite encyclopedia}}), a {{error-small|no target}} error may be displayed even when the short-cite template is valid and the link works. That is a "false positive" error. The error message can be suppressed by adding {{para|ignore-err|yes}} to the template, or by adding the template {{t|Sfn whitelist}} with the anchor ID(s) to the article. If you are testing changes in [[Special:ExpandTemplates]] and the error message cannot be suppressed, try testing in a sandbox or user subpage instead.
==={{ucfirst:sfn}} embedded in list-defined ref does not work===
If you [[Help:Footnotes#embedding references|embed]] an {{ucfirst:sfn}} template in a [[Help:List-defined references|list-defined reference]], you may get a false-positive "[[Help:Cite errors/Cite error references missing key|missing key" error]] which looks like this:
: <span style="color:#d73333; font-weight:bold; font-size:115%">A [[Help:Footnotes#WP:LDR|list-defined reference]] named "{{nobr|. . .}}" is not used in the content (see the [[Help:Cite errors/Cite error references missing key|help page]]).</span>
{{tracked|T22707}}
This is a false-positive: list-defined references [[Wikipedia:Nesting footnotes#5. List-defined references|do not work correctly when references are nested]]. It is due to a long-standing bug in mediawiki software (see [[phab:T22707]]).
A [[Template:Sfnlink#example-3|workaround]] is possible using {{tl|sfnlink}}.
[[Help:Cite errors/Cite error references missing key#Bugs|Additional bugs]] associated with embedding footnotes in list-defined references are known. One of them is that the [[WP:REFNAME|reference name]] given in the error message will identify the wrong list-defined reference in the first false-positive error message on the page; this is tracked in {{phab|T26600}}.
==Implementation notes==
These templates use two elements: a [[wikilink]] in the body of the article, and an [[WP:ANCHOR DEF|anchor]] in the reference section of the article. Clicking on the wikilink repositions the page at the anchor.
===Citation template anchor===
{{See also|Wikipedia:Citation templates and reference anchors}}
The most common citation templates,{{cs1}} or {{cs2}}, create a [[HTML element#Links and anchors|anchor]] {{tag|a|o|params=name="CITEREF"}} followed by the concatenation of the following parameters:
* '''last''' or '''last1''' or '''surname''' or '''surname1''' or '''author-last''' or '''author-last1''' or '''author1-last''' or '''author-surname''' or '''author-surname1''' or '''author1-surname''' or '''author''' or '''author1''' or '''authors''',
* '''last2''' or '''surname2''' or '''author-last2''' or '''author2-last''' or '''author-surname2''' or '''author2-surname''' or '''author2''',
* '''last3''' or '''surname3''' or '''author-last3''' or '''author3-last''' or '''author-surname3''' or '''author3-surname''' or '''author3''',
* '''last4''' or '''surname4''' or '''author-last4''' or '''author4-last''' or '''author-surname4''' or '''author4-surname''' or '''author4''',
* '''editor-last''' or '''editor-last1''' or '''editor1-last''' or '''editor-surname''' or '''editor-surname1''' or '''editor1-surname''' or '''editor1''' or '''editor''',
* '''editor-last2''' or '''editor2-last''' or '''editor-surname2''' or '''editor2-surname''' or '''editor2''',
* '''editor-last3''' or '''editor3-last''' or '''editor-surname3''' or '''editor3-surname''' or '''editor3''',
* '''editor-last4''' or '''editor4-last''' or '''editor-surname4''' or '''editor4-surname''' or '''editor4''',
* '''date''', '''year'''
This covers the most common templates. Information about all of the templates is available at [[Wikipedia:Citation templates and reference anchors]].
Use of the '''date''' parameter in place of the '''year''' parameter in citation templates is preferred.
===Harvard citation wikilink===
The Harvard citation templates create a [[wikilink]] to the anchor. For example {{tlx|Harv|Smith|2006|4=p=25}} produces the link {{code|#CITEREFSmith2006}} and {{tlx|Citation|2=last=Smith|3=first=John|4=date=27 January 2006|5=title=My Life}} produces the anchor {{code|CITEREFSmith2006}}.
===Using CITEREF directly===
{{Shortcut|WP:CITEREF}}
A few articles create a custom ID using {{code|CITEREF}}, either in place of the Harvard citation template (e.g. <code><nowiki>[[#CITEREFSmith2006|(2006)]]</nowiki></code>) or as a value for {{para|ref}} in the citation template.
{{Refname rules|A custom ID must follow these rules:|
* If CITEREF is used, then spaces in the {{para|ref}} field must be replaced with underscores}}
Examples:
* {{tlx|sfn|{{var|cite name}}|{{var|year}}}}
* {{tlx|cite book|2=ref=CITEREF{{var|cite_nameyear}}}}
* {{tlx|cite book|2=ref={{tl|sfnref|{{var|cite_name}}|{{var|year}}}}}}
Where {{var|cite_name}} is a name such as the publisher.
To avoid the sometimes difficult to remember syntax for links to CITEREF anchors, {{tl|citeref}} can be used to create internal wikilinks with either small superscript-style labels (like this<sup>[n]</sup>) or plain free-text labels to such anchors. It can be used inside of other citations.
Note that the {{code|CITEREF}} prefix is necessary for the [[mw:Reference Tooltips|reference tooltips gadget]] ([[MediaWiki:Gadget-ReferenceTooltips.js]]) to detect that a link goes to a citation.
===[[Template:sfn|<code><nowiki>{{sfn}}</nowiki></code>]]'s [[WP:REFNAME|ref name]]===
Template {{tl2|sfn}} creates a [[WP:REFNAME|named footnote]], so that identical footnotes are combined automatically. The footnote name begins with {{code|FOOTNOTE}} followed by a concatenation of the arguments to {{tl2|sfn}}. E.g.: this template call:
* {{tlx|sfn|Smith|2006|4=p=26}}
should have exactly the same functionality as
* {{tag|ref|params=name="FOOTNOTESmith200626"|content={{tl2|Harvnb|Smith|2006|4=p=26}}.}}
which, in turn, has the same functionality as
* {{tag|ref|params=name="FOOTNOTESmith200626"|content=<nowiki>[[#CITEREFSmith2006|Smith (2006)]], p.&nbsp;26.</nowiki>}}.
{{anchor|url weirdness}}
The ref name becomes more complicated when the page (p) parameter includes a URL, e.g. {{tlg|sfn|Joyce|1903|p{{=}}[https://archive.org/details/aconcisehistory00joycgoog/page/n226 213]|code=on}}, which, once defined, can be called by {{tag|ref|empty|params=name="FOOTNOTEJoyce1903[httpsarchiveorgdetailsaconcisehistory00joycgoogpagen226 213]"}}. The "p=" and the characters |,:,.,/,?,=; are therefore stripped out of the URL. The content of the loc parameter is similarly appended after this.
The call to {{tl2|harvnb}} has been [[subst]]'ed for quicker load times.
==Tracking categories==
{{clc|Pages using sfn with unknown parameters}}
== TemplateData ==
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"1": {
"description": "Last name of first (or only) author",
"required": true,
"example": "Smith",
"type": "line",
"suggested": true,
"label": "Author last name"
},
"2": {
"description": "Year for citations with one author, or last name of second author for citations with two or more authors",
"required": true,
"example": "2006",
"type": "string",
"suggested": true,
"label": "Second author or year"
},
"3": {
"description": "Year for citations with two authors, or last name of third author for citations with three or more authors",
"type": "string",
"label": "Third author or year"
},
"4": {
"description": "Year for citations with three authors, or last name of fourth author for citations with four authors",
"type": "string",
"label": "Fourth author or year"
},
"5": {
"description": "Year for citations with four authors",
"type": "number",
"label": "Year (if four authors included)"
},
"p": {
"description": "Page number in source, if the relevant information is on one page (use the «pp» parameter for multiple pages, and the «loc» parameter for other location data)",
"suggested": true,
"aliases": [
"page"
],
"example": "42",
"type": "line",
"label": "Page"
},
"pp": {
"description": "Page numbers in source",
"aliases": [
"pages"
],
"example": "23–24",
"type": "line",
"label": "Pages"
},
"ps": {
"description": "Trailing text to replace period",
"example": "none",
"type": "string",
"label": "Postscript"
},
"loc": {
"description": "Location in source",
"example": "section 7",
"type": "line",
"label": "Location",
"aliases": [
"at"
]
},
"group": {
"label": "Group",
"description": "The reference group for the footnote",
"type": "string"
}
},
"description": "This template creates a short author–date citation in a footnote. It allows you to link inline citation using Harvard citations (a form of short citations using parenthetical references) to their corresponding full bibliographic citations.",
"format": "inline"
}
</templatedata>
== See also ==
* {{tl|p.}} – citing a page number
* {{tl|r}} – define and reference page(s)
* {{tl|rp}} – reference page(s)
* {{tl|Sfnm}} – for ''m''ultiple sources
* {{tl|SfnRef}} – for the ref anchor
* {{tl|Sfnlink}} – for unidirectional links, especially from [[WP:LDR|LDRs]]
* {{tl|efn}} – for explanatory foot notes
{{Wikipedia referencing}}
{{Hidden|Anchors for examples|
*{{cite book|last1=Smith|date=1994|title=Book by Smith}}
*{{cite book|last1=Smith|last2=Jones|date=1994|title=Book by Smith and Jones}}
*{{cite book|last1=Smith|last2=Jones|last3=Brown|date=1994|title=Book by Smith, Jones and Brown}}
}}<includeonly>{{sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Author–date citation templates]]
[[Category:Footnote templates]]
[[Category:Templates that generate named references]]
}}</includeonly>
futehzjp9wcbem0mms2wyhj4rmypoet
33060
33059
2026-11-11T21:18:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sfn/doc]]
33059
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{High-use|risk}}
{{Template redirect|sfnnb}}
{{Lua|Module:Footnotes|Module:Check for unknown parameters}}
The '''shortened footnote template''' {{tl|sfn}} creates a short [[WP:Citing sources#Short citations|author–date citation]] in a [[Wikipedia:Citing sources|footnote]], with a one-directional link to the first matching [[Wikipedia:Citation templates|citation template]] on the same page. It will combine identical footnotes automatically.
It is used to create {{sfnote|lc=y}}, a [[WP:CITESTYLE|citation style]] which pairs a short, author-date citation in a footnote with a [[WP:HOWCITE|complete citation]] in the references section at the end of the article (see example [[#Example|below]]). This citation style is used to simplify multiple citations to the same source and to reduce clutter in the edit window.
Common problems and known workarounds are given in the sections below. Use the table of contents to find what you need.
Note that the use (or even non-use) of these templates is an element of citation "style", and adding or removing them in articles with an established style should be consistent with that style. See [[WP:CITEVAR]].
==Usage==
'''Sfn''' generates an "author-date" style short-cite from the following parameters:
<div style="margin-left: 2em"><code>{{<nowiki>sfn</nowiki>| <{{var|last1}}*> | <{{var|last2}}> | <{{var|last3}}> | <{{var|last4}}> | <{{var|year}}*> | p= <{{var|page}}> | loc= <{{var|location}}> }}</code></div>
with
* <{{var|last1}}> – required; surname of first author or corporate author
* <{{var|last2}}>–<{{var|last4}}> – positional parameters; surnames of next three authors; required if available in the full citation
* <{{var|year}}> – required; four-digit year; may have a lowercase disambiguation letter, like {{pval|2012a}}
* {{para|p}} – specific page referenced in the source (alias: {{para|page}}{{hairspace}})
* {{para|pp}} – comma-separated list of [[Template:Csdoc#pages|individual pages and / or range(s) of pages]] referenced in the source (alias: {{para|pages}}{{hairspace}})
* {{para|loc}} – in-source location when {{para|p}} and {{para|pp}} are inappropriate; may be used to supplement {{para|p}} and {{para|pp}}; information such as a section or figure number. (alias: {{para|at}}{{hairspace}})
=== Example ===
Typical usage is shown in the example below. The text and the footnote are connected by a bi-directional link – clicking on the superscript takes the reader to the footnote, clicking on the footnote number takes them back to the superscript. The clicking on the short citation takes them to the full citation in the references section.
'''Sfn''' will also automatically combine identical footnotes.
{{markup|tag=syntaxhighlight|<nowiki>
Article text.{{sfn|Smith|2020|p=25}}
More article text.{{sfn|Smith|2020|p=25}}
Still more article text.{{sfn|Smith|2020|p=26}}
==Notes==
{{reflist}}
==References==
* {{cite book
| last = Smith | first = John
| date = 2020
| title = Smith's Book
}}
</nowiki>|
Article text.{{sfn|Smith|2020|p=25}}
More article text.{{sfn|Smith|2020|p=25}}
Still more article text.{{sfn|Smith|2020|p=26}}
{{fake notes and references||}}
{{cite book
| last = Smith | first = John
| date = 2020
| title = Smith's Book
}}}}
Template '''sfn''' is not placed inside {{tag|ref}} tags and generates the footnote internally. (To place '''sfn''' in a footnote, see [[#A citation inside an explanatory footnote|putting a citation inside a footnote]], below.)
===Parameters===
====Author(s) and year====
The first four author surnames (or all authors if fewer than four; use the values from {{para|last''N''}} or {{para|author''N''}}{{hairspace}}) are required, followed by the year of publication (from {{para|year}} or {{para|date}}). Authors past the fourth must be omitted or an error will result.
The [[#Possible issues with author-date link|possible issues]] section below describes workarounds for various common problems, such as [[#Large number of authors|large number of authors]], [[#Citation template has no author name|no author name]], [[#More than one work in a year|multiple works in the same year]], [[#Two sources with same last names and years|Two sources with same last names and years]] and others.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|1994|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|Jones|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|Jones|1994|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|Jones|Brown|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|Jones|Brown|1994|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}</nowiki>
|Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}<br />
{{reflist}}
}}
====Location in the source text====
Use {{para|p}} for single pages; use {{para|pp}} for multiple pages (such as ranges). Use of {{para|p}} for multiple pages or {{para|pp}} for single pages can cause [[Help:Cite errors/Cite error references duplicate key|cite errors]].
{{para|loc}} can be used to specify a location in the source in another way, such as section numbers or chapters. It can also be combined with {{para|p}} or {{para|pp}}.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|2020|p=25}}</nowiki>
|Article text.{{sfn|Smith|2020|p=25}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|2020|pp=25–26}}</nowiki>
|Article text.{{sfn|Smith|2020|pp=25–26}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|2020|loc=ch. 3}}</nowiki>
|Article text.{{sfn|Smith|2020|loc=ch. 3}}<br />
{{reflist}}
|<nowiki>Article text.{{sfn|Smith|2020|p=25|loc=n. 14}}</nowiki>
|Article text.{{sfn|Smith|2020|p=25|loc=n. 14}}<br />
{{reflist}}
}}
==Possible issues with author-date link==
{{for|information on how to turn on error messages for broken links|:Category:Harv and Sfn template errors}}
These are techniques that address various unusual difficulties with the link between the short citation and the full citation.
Templates that have broken [[wikilink]]s using these templates are added to the category {{cat|All articles with broken links to citations}}.
===Wikilink to citation does not work===
If an article is using this template and nothing happens when you click on the highlighted [[wikilink]] from the [[WP:SHORTCITE|short citation]] to the [[WP:SHORTCITE|full citation]] at the bottom of the page, there are several possible solutions. If:
# Templates like this one are rarely used in this article. '''Solution''': Remove this template and format the citation in the style used most often in the article.
# The correct full citation does ''not'' appear at the bottom of the article. '''Solution''': Find the source (it may be copied from an article on a similar subject), and check that it verifies the text. If the source can't be found, replace this template with {{tl2|citation not found}}.
# The correct full citation appears at the bottom of the article, and
## The full citation uses a template from the list at [[Help:Citation Style 1|Citation Style 1]]:
### The citation template has only {{para|author}} and this template uses the last name. '''Solution''': Either (a) split the author name in to {{para|last}} and {{para|first}} in the full citation or (b) use the full name in the short citation. Be careful in either case to be consistent with the other citations in the article.
### The name in the short citation is spelled or capitalized differently than in the full citation. '''Solution''': Check the source for the correct spelling, and use the same spelling, spacing, and capitalization in both the short and full citations.
### There is more than one full citation with the same last name and year. '''Solution''': See [[#More than one work in a year|§More than one work in a year]] or [[#Two sources with same last names and years|§Two sources with same last names and years]].
### The year is different here than the full citation. '''Solution''': Check the source for the correct year, and use the same year in both the short and full citations.
### The template has a {{para|date}} field and no {{para|year}} field, but the format of the {{para|date}} field is unusual. '''Solution''': Try to fix the date. If the link still does not work, add {{para|year}} to the citation template. (It's okay if it has both.)
### The template does not have a year, or the date is set to "n.d." (no date). '''Solution''': Set the year field of this template to "n.d.".
### The template does not have an author's or an editor's, last name (authors take precedence over editors). '''Solution''': See [[#Citation template has no author name|§Citation template has no author name]], below.
### The template has no author, date or title. '''Solution''': See [[#Citation template has no author, date or title|§Citation template has no author, date or title]]
##Find the citation template in [[Wikipedia:Citation templates and reference anchors#Citation templates that create anchors|WP:Citation templates and anchors]] and find out if it has support for an anchor.
### The citation template doesn't automatically create the anchor, but has {{para|ref}}. '''Solution''': See [[#Citation template doesn't create a compatible anchor but has %7Cref=|§Citation template doesn't create a compatible anchor but has {{para|ref}}]], below.
### The citation template doesn't support anchors at all. '''Solution''': See [[#Citation template does not support any kind of anchor|§Citation format does not support any kind of anchor]], below.
##The full citation is handwritten.
### There are no other citation templates in the article. This is probably because local editors prefer it that way. '''Solution''': You should adapt to the style of the article. This would probably entail removing this template and formatting the short citation in plain text or replacing it with a full citation in {{tag|ref}} tags.
### There are citation templates used liberally throughout the article. '''Solution''': Reformat the source with the appropriate {{cite *}} template (and set the {{para|ref}} appropriately, if necessary).
### No appropriate template can be found. '''Solution''': See [[#No citation template|§No citation template]], below.
===Custom anchors===
A custom anchor using {{tl|sfnref}} can, at least temporarily, always make the shortened footnote look exactly the way you would like and still have a link that works. Many of the problems and workarounds below require a custom anchor.
All CS1 citation templates and several other templates allow you to set a custom anchor with parameter {{para|ref}}. The template {{tl|sfnRef}} creates an anchor that will match {{tl|sfn}}'s if it has the same parameters as {{tl|sfn}}. To use this technique, choose the name and year you would like to appear in {{tl|sfn}}, copy these parameters into {{tl|sfnRef}} and set {{tl|ref}} to the {{tl|sfnRef}}.
In other words, if you want this:
* {{tl2|sfn|<*''name you want''>|<''year''>|<''page / location''>}}
then set this:
* {{para|ref|{{tl2|sfnRef|<''name you want''>|<''year''>}}}}
in the template, and the link should work correctly.
The parameters must be <em>identical</em> in every respect. If the year is unusual (i.e. not a number), then include the year in the name and don't use the year position.
===Large number of authors===
If there are more than four authors, the first four authors' surnames (the value in {{para|last}} or {{para|author}}) are required by the template. Listing more authors is not supported. It is also possible to use a [[#Custom anchors|custom anchor]] that sets the name field to "Smith et al.".
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1994
| title = Scientific paper written by
many scientists
| journal = Important Journal
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn|Smith|Jones|Brown|Black|1994|p=25}}
|
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1994
| title = Scientific paper written by many scientists
| journal = Important Journal}}
}}
|<nowiki>Article text.{{sfn|Smith et al.|1995|p=25}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1995
| title = Another paper by many scientists
| journal = Important Journal
| ref = {{sfnref|Smith et al.|1995}}
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn|Smith et al.|1995|p=25}}
|
* {{cite journal
| last = Smith
| last2 = Jones
| last3 = Brown
| last4 = Black
| last5 = Davis
| last6 = Martinez
| last7 = Hsu
| date = 1995
| title = Another paper by many scientists
| journal = Important Journal
| ref = {{sfnref|Smith et al.|1995}}
}}
}}}}
===More than one work in a year===
Where there is a need to cite more than one work ''by the same author published in the same year'', the standard way to disambiguate such works is to add a letter suffix after the year, e.g. "Smith 2006a" and "Smith 2006b".
Set the year element of the {{tlc|sfn}} templates (e.g. {{tlc|sfn|Smith|2006a}} and {{tlc|sfn|Smith|2006a}}), and add the disambiguation letter to the matching full citation, (e.g. <code><nowiki>{{cite book|...|last=Smith|date=2006b}}</nowiki></code>).
When {{tlc|sfn}} is used with {{tlx|citation}} or {{cs1}} templates, a year-suffix letter may be added to {{para|date}} for all accepted date formats except year-initial numeric ({{small|YYYY-MM-DD}}). It is not necessary to include both {{para|date}} and {{para|year}} (see exception [[#NB_YEAR|below]]). If both are included, {{para|year}} is used for the <code>CITEREF</code> anchor to be compliant with legacy citations.
:{{para|date|2013a}}: simple year only dates
:{{para|date|Jan 2013b}} or {{para|date|Winter 2013b}}: month or season and year dates
:{{para|date|9 November 2013b}} or {{para|date|November 9, 2013b}}: full dates
:{{para|date|June–July 2013c}} or {{para|date|Winter–Spring 2013c}}: month or season ranges and year dates
:{{para|date|c. 2013d}}: circa year dates
:{{para|date|{{#time:Y}}–{{#time:Y|now +1 year}}e}} or {{para|date|Summer {{#time:Y}}–{{#time:y|now +1 year}}e}}: year ranges
:{{para|date|n.d.f}}: no date (n.d.)
:{{anchor|NB_YEAR}}<s>{{para|date|2013g-11-09}}</s>: not supported, the template must use {{para|year|2013g}}. If month and day should be part of the citation as well, both parameters need to be given: {{para|date|2013-11-09}} {{para|year|2013x}}. In this case, {{para|date}} is used for citation display and metadata purposes, and {{para|year}} for link disambiguation.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|1993a|p=25}}
More text.{{sfn|Smith|1993b|p=32}}
==Notes==
{{reflist}}
==References==
* {{cite journal
|last=Smith
|first=Karen
|date=January 1993a
|title=Smith's first paper
|journal=Important Journal
}}
* {{cite journal
|last=Smith
|first=Karen
|date=Spring–Summer 1993b
|title=Smith's second paper
|journal=Another Important Journal
}}</nowiki>
|Article text.{{sfn|Smith|1993a|p=25}}
More text.{{sfn|Smith|1993b|p=32}}
{{fake notes and references}}
* {{cite journal|last=Smith|first=Karen|date=January 1993a|title=Smith's first paper|journal=Important Journal}}
* {{cite journal|last=Smith|first=Karen|date=Spring–Summer 1993b|title=Smith's second paper|journal=Another Important Journal}}
}}
===Two sources with same last names and years ===
An article might cite works from the same year by two different authors with the same last name. For example, an article might cite psychoanalysts [[Anna Freud]] and [[Sigmund Freud]], who both wrote books in the same year.
There are two solutions: it's possible to use the same technique described in the previous section. To differentiate between the two books, the first one can be given the year "1928a" and the second one "1928b".
Or, you can create a [[#Custom anchors|custom anchor]] that adds an initial to the name fields, e.g. "A. Freud" and "S. Freud". The links will no longer conflict.
{{markup|tag=syntaxhighlight
|<nowiki>
In 1928, [[Sigmund Freud]] wrote that "religious influence" was one of the primary goals of education.{{sfn|S. Freud|1928|pp=47-48}} In her first published book, [[Anna Freud]] proposed that the education of a child is never independent of the adults they depend upon.{{sfn|A. Freud|1928}}
===Notes===
{{reflist}}
===References===
{{refbegin}}
* {{cite book |last=Freud |first=Anna |date=1928 |title=Introduction to the Technique of Child Analysis |ref={{sfnref|A. Freud|1928}}}}
* {{cite book |last=Freud |first=Sigmund |date=1928 |title=The Future of an Illusion |ref={{sfnref|S. Freud|1928}}}}
{{refend}}
</nowiki>
|In 1928, [[Sigmund Freud]] wrote that "religious influence" was one of the primary goals of education.{{sfn|S. Freud|1928|pp=47-48}} In her first published book, [[Anna Freud]] proposed that the education of a child is never independent of the adults they depend upon.{{sfn|A. Freud|1928}}
{{fake heading|sub=3|Notes}}
{{reflist}}
{{fake heading|sub=3|References}}
{{refbegin}}
* {{cite book |last=Freud |first=Anna |date=1928 |title=Introduction to the Technique of Child Analysis |ref={{sfnref|A. Freud|1928}}}}
* {{cite book |last=Freud |first=Sigmund |date=1928 |title=The Future of an Illusion |ref={{sfnref|S. Freud|1928}}}}
{{refend}}
}}
===Citation template has no year but has a date===
Either the {{para|date}} or {{para|year}} of a citation template can be matched—the template logic can extract the year from a full date. If the date parameter is not a full date, then the extraction will fail. If the link does not seem to work, it also possible to set both {{para|date}} and {{para|year}} parameters. The template will display the date and use the year for the anchor. These two examples show a year being successfully extracted from full date.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|1997|p=101}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith | first = Karen
| date = 11 May 1997
| title = Smith's 1997 paper
| journal= Important Journal
}}</nowiki>
|{{fake notes and references
| Article text.{{sfn|Smith|1997|p=101}}
|* {{cite journal
| last = Smith | first = Karen
| date = 11 May 1997
| title = Smith's 1997 paper
| journal= Important Journal
}}}}
|<nowiki>Article text.{{sfn|Smith|1998|p=101}}
==Notes==
{{reflist}}
==References==
* {{cite journal
| last = Smith | first = Karen
| date = May 1998
| title = Smith's 1998 paper
| journal= Important Journal
}}</nowiki>
|{{fake notes and references
| Article text.{{sfn|Smith|1998|p=101}}
|* {{cite journal
| last = Smith | first = Karen
| date = May 1998
| title = Smith's 1998 paper
| journal= Important Journal
}}}}}}
===Citation template has no date===
If the cited source does not have a date, you can use {{para|date|n.d.}} for the full citation and "n.d." in place of the date for the short citation:
{{markup
|<nowiki>This is a fact.{{sfn|Smith|n.d.}}
==Notes==
{{reflist}}
==References==
* {{Citation |last=Smith |title=Title |date=n.d. |publisher=Publisher |mode=cs1}}</nowiki>
|This is a fact.{{sfn|Smith|n.d.}}
{{fake heading|sub=3|Notes}}
{{reflist}}
{{fake heading|sub=3|References}}
* {{Citation |last=Smith |title=Title |date=n.d. |publisher=Publisher |mode=cs1}}
}}
===Citation template has no author name===
Some sources do not have a single author with a last name, such as a magazine article or a report from a government institution. There is no consensus (in Wikipedia or among citation styles) about how to format author–date citations for works that do not have a specific author. Several choices are:
# The title of the article, or a shortened form of the title, is recommended by some style guides.
# For a newspaper or periodical, you may use the name of the paper and the date.
# For a publication by an institution, use either:
## The initials of the institution
## The name of the institution
# Other style guides recommend using "Anonymous" or "Anon."
An article should adopt one of these styles consistently.
Use a [[#Custom anchors|custom anchor]] to replace set the author name to one of these other choices, as shown in these examples below.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|BGI|1996|p=429}}
==Notes==
{{reflist}}
==References==
* {{cite book
| title = Important Book
| date = 1996
| publisher = Big Government Institution
| ref = {{sfnref|BGI|1996}}
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn |BGI|1996|p=429}}
|* {{cite book
| title = Important Book
| date = 1996
| publisher = Big Government Institution
| ref = {{sfnref|BGI|1996}}
}}}}
|<nowiki>Article text.{{sfn |''Popular Magazine''|1996|p=29}}
==Notes==
{{reflist}}
==References==
* {{cite magazine
| magazine = Popular Magazine
| title = An Article by an Anonymous Author
| date = 1996
| ref = {{sfnref|Popular Magazine|1996}}
}}</nowiki>
|{{fake notes and references
|Article text.{{sfn |''Popular Magazine''|1996|p=29}}
|* {{cite magazine
| magazine = Popular Magazine
| title = An Article by an Anonymous Author
| date = 1996
| ref = {{sfnref|Popular Magazine|1996}}
}}}}}}
=== Citation template has no author, date or title ===
If the cited source does not have a date, author, or title, place a description of the source within brackets for the {{para|title}} parameter, use {{para|date|n.d.}} and create [[#Custom anchors|custom anchor]] with the description in the name position and "n.d." in the year.
{{markup
|<nowiki>This is a fact.{{sfn|[Description]|n.d.}}
==Notes==
{{reflist}}
==References==
* {{Citation |title=[Description] |date=n.d. |publisher=Publisher |mode=cs1 |ref={{sfnref|[Description]|n.d.}} }}</nowiki>
|This is a fact.{{sfn|[Description]|n.d.}}
{{fake heading|sub=3|Notes}}
{{reflist}}
{{fake heading|sub=3|References}}
* {{Citation |title=[Description] |date=n.d. |publisher=Publisher |mode=cs1 |ref={{sfnref|[Description]|n.d.}} }}
}}
===Citation template doesn't create a compatible anchor but has {{para|ref}} ===
{{See section|Wikipedia:Citation templates and reference anchors|Citation templates that create anchors}}
Some templates, such as {{tl|cite comic}}, {{tl|cite thesis}} and {{tl|cite map}} use the parameter {{para|ref}} to create an anchor for the short citation. This can be used to set a [[#Custom anchors|custom anchor]] for {{tl|sfn}}
{{markup
|<nowiki>Article text.{{sfn|Morrison|1987}}
==Notes==
{{reflist}}
==References==
* {{cite comic
|writer=Morrison, Grant
|artist=Yeowell, Steve
|title=2000 AD
|date=August 15, 1987
|publisher=[[Fleetway]]
|ref={{sfnref|Morrison|1987}}
}}</nowiki>
|{{fake notes and references
| Article text.{{sfn|Morrison|1987}}
|* {{cite comic
|writer=Morrison, Grant
|artist=Yeowell, Steve
|title=2000 AD
|date=August 15, 1987
|publisher=[[Fleetway]]
|ref={{sfnref|Morrison|1987}}
}}}}}}
You could also use CITEREF directly with a concatenation of <code>#CITEREF</code> plus the parameters passed to the Harvard citation template.
===Citation template does not support any kind of anchor===
{{See section|Wikipedia:Citation templates and reference anchors|Citation templates that create anchors}}
There are a few templates that do not support any kind of anchor, including {{tl|cite report}}, {{tl|cite music release notes}}, {{tl|cite DVD-notes}}, {{tl|cite episode}} and others.
It is possible to use {{tl|wikicite}} to create an anchor. It has a {{para|ref}} parameter which can be set to a [[#Custom anchors|custom anchor]]. In this example, the publisher is considered the editor.
{{markup
|<nowiki>
Article text.{{sfn|Big Government Agency|1999}}
==Notes==
{{reflist}}
==References==
* {{wikicite
| reference = {{cite report
| title=Important Government Report
| publisher=Big Government Agency
| date=1999
}}
| ref = {{sfnref|Big Government Agency|1999}}
}}
</nowiki>|
Article text.{{sfn|Big Government Agency|1999}}
{{fake heading|Notes}}
{{reflist}}
{{fake heading|References}}
* {{wikicite
| reference = {{cite report
| title=Important Government Report
| publisher=Big Government Agency
| date=1999
}}
| ref = {{sfnref|Big Government Agency|1999}}
}}
}}
===No citation template ===
If the citation is handwritten you should consider the citation format of the article. If citation templates are used often in this article, then check [[WP:Citation templates]] and try to find one that works for this source. If no template can be found, then this may be a source which can't be represented in our citation templates.
Use {{tl2|wikicite}} to make an anchor, setting Wikicite's {{para|ref}} to a [[#Custom anchors|custom anchor]].
{{markup
|<nowiki>Article text.{{sfn |A particularly unusual citation}}
==Notes==
{{reflist}}
==References==
* {{wikicite
| reference = A source that can't be described
using our citation templates at all.
| ref = {{sfnref|A particularly unusual citation}}
}}
</nowiki>|
{{fake notes and references
| Article text.{{sfn |A particularly unusual citation}}
|* {{wikicite
| reference = A source that can't be described using our citation templates at all.
| ref = {{sfnref|A particularly unusual citation}}
}}
}}
}}
== Techniques and variations ==
=== Changing the appearance of the short citation ===
==== With a custom anchor ====
With a [[#custom anchors|custom anchor]], {{tl|sfn}} can have any appearance you want. Here are two examples that editors have asked about in the past.
* MLA style author-title short citations. Put name and title in {{para|1}}, don't set the year.
{{markup|tag=syntaxhighlight|<nowiki>Article text.{{sfn|Ellison ''Ellison's Book''|p=13}}
{{reflist}}
* {{cite book
| last = Ellison | first = Larry
| title = Ellison's Book"
| year = 2011
| ref = {{sfnref|Ellison ''Ellison's Book''}}
}}
</nowiki>|
Article text.{{sfn|Ellison ''Ellison's Book''|p=13}}
{{reflist}}
* {{cite book
| last = Ellison | first = Larry
| title = Ellison's Book"
| year = 2011
| ref = {{sfnref|Ellison ''Ellison's Book''}}
}}
}}
* Adding the original date to a later edition of a book. Put the name, year and original date in {{para|1}}, don't set the year.
{{markup|tag=syntaxhighlight|<nowiki>Article text.{{sfn|Voltaire 2030 [1752]|p=13}}
{{reflist}}
* {{cite book
| title = Le Micromégas
| author = [[Voltaire]]
| year = 2020
| orig-date = 1752
| ref = {{sfnref|Voltaire 2030 [1752]}}
}}
</nowiki>|
Article text.{{sfn|Voltaire 2030 [1752]|p=13}}
{{reflist}}
* {{cite book
| title = Le Micromégas
| author = [[Voltaire]]
| year = 2020
| orig-date = 1752
| ref = {{sfnref|Voltaire 2030 [1752]}}
}}
}}
====With templates====
<!--- This is excerpted in WP:Shortened footnotes, Template:harv/doc/shared and Template:sfnp/doc --->
These alternative templates change the appearance of the author-date citation
{{anchor|No closing period}}
{| class="wikitable"
! style="width: 30%" | Purpose !! style="width: 40%;" | Markup !! style="width: 30%" | Renders as
|-
| The most common format,<br/>used 200,000+ articles<br/>Has a final period
|| <code><nowiki>{{</nowiki>'''[[Template:sfn|sfn]]'''<nowiki>|Smith|2020|p=25}}</nowiki></code>
|| Article text.{{sfn|Smith|2020|p=25}} <br /> {{Reflist}}
|-
| No final period
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvnb|harvnb]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvnb|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| No final period
|| <code><nowiki>{{</nowiki>'''[[Template:sfn|sfn]]'''<nowiki>|Smith|2020|p=25|ps=none}}</nowiki></code>
|| Article text.{{sfn|Smith|2020|p=25|ps=none}} <br /> {{Reflist}}
|-
| Parenthesis around year and page
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvtxt|harvtxt]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvtxt|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Parenthesis around citation
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harv|harv]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harv|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Parenthesis around year
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvp|harvp]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvp|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Parenthesis around year
|| <code><nowiki>{{</nowiki>'''[[Template:sfnp|sfnp]]'''<nowiki>|Smith|2020|p=25|ps=none}}</nowiki></code>
|| Article text.{{sfnp|Smith|2020|p=25|ps=none}} <br /> {{Reflist}}
|-
| Parenthesis around year<br />With final period
|| <code><nowiki>{{</nowiki>'''[[Template:sfnp|sfnp]]'''<nowiki>|Smith|2020|p=25}}</nowiki></code>
|| Article text.{{sfnp|Smith|2020|p=25}} <br /> {{Reflist}}
|-
| Colon for page number
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvcolnb|harvcolnb]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvcolnb|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Colon for page number,<br/>parenthesis around year and page
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvcoltxt|harvcoltxt]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvcoltxt|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|-
| Colon for page number,<br />parenthesis around citation
|| <code><nowiki><ref>{{</nowiki>'''[[Template:harvcol|harvcol]]'''<nowiki>|Smith|2020|p=25}}</ref></nowiki></code>
|| Article text.<ref>{{harvcol|Smith|2020|p=25}}</ref> <br /> {{Reflist}}
|}
{{anchor|Additional comments or quotes}}
=== Adding additional comments or quotes ===
The templates {{tl2|harvnb}} or {{tl2|harvtxt}} can be used to add quotes or additional comments into the footnote, in the form of in-text attributions.
{{markup|tag=syntaxhighlight|<nowiki>Some information.<ref>{{harvnb|Smith|2011|p=2}}: "A quote verifying the information."</ref>
== Notes ==
{{reflist}}
</nowiki>|
Some information.<ref>{{harvnb|Smith|2011|p=2}}: "A quote verifying the information."</ref>
{{Fake heading|sub=3|Notes}}
{{reflist}}
}}
{{markup|tag=syntaxhighlight|<nowiki>
"A quote in a secondary source."<ref>{{harvtxt|Smith|2011|p=2}} quoted in {{harvtxt|Jones|2010|p=343}}</ref>
== Notes ==
{{reflist}}
</nowiki>|
"A quote in a secondary source."<ref>{{harvtxt|Smith|2011|p=2}} quoted in {{harvtxt|Jones|2010|p=343}}</ref>
{{Fake heading|sub=3|Notes}}
{{reflist}}
}}
===Adding a URL for the page or location===
If a specific link to the page or section is available, a [[Uniform Resource Locator|URL]] can be added to the location or page number.
{{markup|tag=syntaxhighlight
|<nowiki>Article text.{{sfn|Smith|2011|p=[https://en.wikipedia.org 3]}}
Other article text.{{sfn|Smith|2011|loc=[https://en.wikipedia.org §7]}}
==Notes==
{{reflist}}
==References==
* {{cite book | last = Smith | date = 2011 | title = Smith's
other book }}</nowiki>
|{{Fake notes and references
|Article text.{{sfn|Smith|2011|p=[https://en.wikipedia.org 3]}}
Other article text.{{sfn|Smith|2011|loc=[https://en.wikipedia.org §7]}}
|* {{cite book | last = Smith | date = 2011 | title = Smith's book }}
}}}}
(See [[#url weirdness|below]] for a potential issue with this technique.)
===Citations inside explanatory footnotes===
Sometimes an explanatory footnote requires a citation. There are several acceptable solutions.
Citations using {{tl1|sfn}} can't be directly embedded between {{tag|ref}} tags, because the following message will be produced: {{small|{{error|Cite error references missing group||nocat=true}}}}. But {{tl1|sfn}} can be used with templates {{tl1|efn}} and {{tl1|notelist}}, which separates the explanatory footnotes from the short citations, as shown in this example. (See also [[Chinese Room]], which is an article that makes extensive use of this technique.)
{{markup|tag=syntaxhighlight
|<nowiki>Interesting fact.{{efn|Clarification of interesting fact.{{sfn|Smith|2018}}}}
==Notes==
{{notelist}}
==Citations==
{{reflist}}
==References==
* {{cite book
| last = Smith
| date = 2018
| title = Smith's other book }}
</nowiki>|
Interesting fact.{{efn|Clarification of interesting fact.{{sfn|Smith|2018}}}}
{{fake heading|Notes}}
{{notelist}}
{{fake heading|Citations}}
{{reflist}}
{{fake heading|References}}
* {{cite book
| last = Smith
| date = 2018
| title = Smith's other book }}
}}
===Bundled citations===
{{see also|Help:Citation merging |Wikipedia:Citing sources#Bundling citations}}
Template {{tl2|harvnb}} (with <syntaxhighlight lang="wikitext"><ref></syntaxhighlight> tags) or {{tl2|sfnm}} can be used to [[WP:CITE#Bundling citations|bundle citations]].
{{markup|tag=syntaxhighlight
|<nowiki>Article text.<ref>{{harvnb|Smith|2010|p=25}}; {{harvnb|Jones|2010}}</ref>
</nowiki>
|Article text.<ref>{{harvnb|Smith|2010|p=25}}; {{harvnb|Jones|2010}}</ref>
{{Fake heading|sub=3|Notes}}
<references />
|<nowiki>
Article text.{{sfnm|1a1=Smith|1y=2010|1p=25|2a1=Jones|2y=2010}}
</nowiki>
|Article text.{{sfnm|1a1=Smith|1y=2010|1p=25|2a1=Jones|2y=2010}}
{{Fake heading|sub=3|Notes}}
<references />
|<nowiki>
==References==
* {{cite book |last = Smith |first = John |date = 2010 |title = Smith's book}}
* {{cite book |last = Jones |first = Mary |date = 2010 |title = Jones' book}}
</nowiki>
|{{Fake heading|sub=3|References}}
* {{cite book |last = Smith |first = John |date = 2010 |title = Smith's book }}
* {{cite book |last = Jones |first = Mary |date = 2010 |title = Jones' book }}
}}
===Multiple lists of inline citations===
Sometimes there is a need to create two or more separate lists of inline footnotes. For example some family trees are contained in templates, they are transluded into several biographies, and they have their own self contained citations (see [[Template:Houston family tree]] and the article [[Margaret Lea Houston]]).
To facilitate this, while the main page uses the standard 1,2,3 footnote counting, it is common for family trees to use the efn template with a group parameter set—for example {{tlx|efn-lg}} (lower-greek). The efn templates are text templates, to link some or all of the content of the efn template to a long citation template such as {{tlx|cite book}} place {{tlx|harvnb}} or {{tlx|harv}} within the efn template.
{{markup|tag=syntaxhighlight
|<nowiki>
...by the fact itself.<ref>{{harvnb|Smith|2022|p=1}}</ref>
==Family Tree==
He's his own grandpa.{{efn-lg|{{harvnb|Latham|1947|p=9}} }}
===FT notes===
{{notelist-lg}}
===FT references===
*{{citation
|last=Latham
|first=Dwight
|date=1947
|title=The Adams family}}
==See also==
[[Ipso facto]]<ref>{{harvnb|Smith|2022|p=2}}</ref>
==Notes==
{{Reflist}}
==References==
* {{citation
|last=Smith
|date=2018
|title=Smith's other book}}
</nowiki>|
...by the fact itself.<ref>{{harvnb|Smith|2022|p=1}}</ref>
{{fake heading|Family Tree}}
He's his own grandpa.{{efn-lg|{{harvnb|Latham|1947|p=9}} }}
<small>{{fake heading|FT notes}}</small>
{{notelist-lg}}
<small>{{fake heading|FT references}}</small>
*{{citation
|last=Latham
|first=Dwight
|date=1947
|title=The Adams family}}
{{fake heading|See also}}
[[Ipso facto]]<ref>{{harvnb|Smith|2022|p=2}}</ref>
{{fake heading|Notes}}
{{Reflist}}
{{fake heading|References}}
* {{citation
|last=Smith
|date=2022
|title=Smith's other book }}
}}
===Cite several contributions/chapters in a larger work===
{{tl|harvc}} can be used as a target for {{tl|sfn}} and other shortened footnote templates.
{{markup|tag=syntaxhighlight
|<nowiki>
Article text.{{sfn|Stout|Johnson|1957}}
More article text.{{sfn|Wadleigh|1957}}
Even more article text.<ref>[[#Stefferud preface|Stefferud 1957]].</ref>
== Notes ==
{{realist}}
== References ==
* {{cite book
| title=Soil: The Yearbook of Agriculture 1957
| editor-last=Stefferud | editor-first=Alfred
| date=1957
| publisher= ...
}}
** {{harvc
| last=Stefferud | first=A.
| year=1957
| id=Stefferud preface
| c=Preface
| url=...
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last1 = Stout
| first1=P. R.
| last2=Johnson | first2=C. M.
| year=1957
| c=Trace Elements
| url=...
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last=Wadleigh | first=C. H.
| year=1957
| c=Growth of Plants
| url=...
| in=Stefferud
| ignore-err=yes}}
</nowiki>
|
Article text.{{sfn|Stout|Johnson|1957}}
More article text.{{sfn|Wadleigh|1957}}
Even more article text.<ref>[[#Stefferud preface|Stefferud 1957]]</ref>
{{fake notes and references}}
* {{cite book
| title=Soil: The Yearbook of Agriculture 1957
| editor-last=Stefferud | editor-first=Alfred
| date=1957
| publisher=United States Department of Agriculture
| url=https://archive.org/stream/yoa1957#page/n2/mode/1up|oclc=704186906
}}
** {{harvc
| last=Stefferud | first=A.
| year=1957
| id=Stefferud preface
| c=Preface
| url=https://archive.org/stream/yoa1957#page/n7/mode/1up
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last1 = Stout
| first1=P. R.
| last2=Johnson | first2=C. M.
| year=1957
| c=Trace Elements
| url=https://archive.org/stream/yoa1957#page/n167/mode/1up
| in=Stefferud
| ignore-err=yes}}
** {{harvc
| last=Wadleigh | first=C. H.
| year=1957
| c=Growth of Plants |url=https://archive.org/stream/yoa1957#page/n57/mode/1up
| in=Stefferud
| ignore-err=yes}}
}}
===More exotic Harvard citations===
{{Main|Template:Harvard citations}}
More exotic Harvard citations can be constructed using the {{tl2|harvs}} template, such as multiple papers by the same author, using both the first and last names, links to articles about the author, and others.
{{markup|tag=syntaxhighlight|<nowiki>
The theory was developed by {{harvs|txt
| first=F. J. |last=Murray |author1-link=F. J. Murray
| first2=J.|last2=von Neumann |author2-link=John von Neumann
| year=1936
| year2=1937
| year3=1943
}}.
</nowiki>|
The theory was developed by {{harvs|txt|first=F. J.|last=Murray|author1-link=F. J. Murray|first2=J.|last2=von Neumann|author2-link=John von Neumann|year=1936|year2=1937|year3=1943}}.
|<nowiki>
== References ==
* {{citation | last1 = Murray | first1 = F. J. | date = 1936 | ...}}
* {{citation | last1 = Murray | first1 = F. J. | date = 1937 | ...}}
* {{citation | last1 = Murray | first1 = F. J. | date = 1943 | ...}}
</nowiki>|
{{fake header|sub=3|References}}
* {{citation | last=Murray | first=F. J.| last2=von Neumann | first2=John | date=1936 | title=Mathematics Paper }}
* {{citation | last=Murray | first=F. J.| last2=von Neumann | first2=John | date=1937 | title=Another Mathematics Paper }}
* {{citation | last=Murray | first=F. J.| last2=von Neumann | first2=John | date=1943 | title=Yet Another Mathematics Paper }}
}}
The same effect can be achieved with {{tl|sfnref}} and local links.
{{markup|tag=syntaxhighlight|<nowiki>
The theory was developed by [[F. J. Murray]] and [[John von Neumann|J. von Neumann]] ([[#{{sfnref|Murray|von Neumann|1936}}|1936]],[[#{{sfnref|Murray|von Neumann|1937}}|1937]],[[#{{sfnref|Murray|von Neumann|1943}}|1943]]).
</nowiki>|
The theory was developed by [[F. J. Murray]] and [[John von Neumann|J. von Neumann]] ([[#{{sfnref|Murray|von Neumann|1936}}|1936]], [[#{{sfnref|Murray|von Neumann|1937}}|1937]], [[#{{sfnref|Murray|von Neumann|1943}}|1943]]).
}}
{{anchor|Ps problems}}
== Open problems ==
=== Discouraged parameters ===
These parameters were designed to handle special cases that are better handled by other techniques.
====Parameter {{para|ps}}====
These templates have a parameter {{para|ps}}, designed to hold quotes and explanations.
Two or more {{tlc|sfn}} templates with the same authors, same year, and same page, but different {{para|ps}} will result in a {{small|{{error|Cite error: The named reference ... was defined multiple times with different content}}}} message. This message happens because the reference names that {{tlc|sfn}} creates will be the same, but the content between the {{tag|ref|params=name="FOOTNOTE..."|o}} tag and the {{tag|ref|c}} tag will be different.
A workaround is to convert the offending {{tlc|sfn}} templates to {{tlx|harvnb}} wrapped in {{tag|ref}} tags, as recommended in [[#Additional comments or quotes|§ Adding additional comments or quotes]]. This method is more versatile and robust.
Template {{para|ps}} also has a second (rare) use, when setting {{para|ps|none}}, which suppressed the final period. See [[#Variations in the format of the author-date citation|§ Variations in the format of the author-date citation]].
====Parameter {{para|ref}}====
The optional parameter {{para|ref}} was used to create an unusually named link from the short citation to the full citation. This typically would require setting the hand coded link on the full citation as well. It's easier to only set the link of the full citation to {{para|ref|{{tl2|sfnref}}}}.
If you specify {{para|ref|none}}, no hyperlink is created. However, if one does not want the link, it is always possible to simply use plain text instead of the template.
The parameter only appears in <nowiki>{{harv*}}</nowiki> templates, and may still appear in a few articles.
===Link works but displays a no target error===
When a short-cite template links to a full citation that is rendered by a template that wraps a CS1 template, like {{txl|cite DNB}} (which wraps {{txl|cite encyclopedia}}), a {{error-small|no target}} error may be displayed even when the short-cite template is valid and the link works. That is a "false positive" error. The error message can be suppressed by adding {{para|ignore-err|yes}} to the template, or by adding the template {{t|Sfn whitelist}} with the anchor ID(s) to the article. If you are testing changes in [[Special:ExpandTemplates]] and the error message cannot be suppressed, try testing in a sandbox or user subpage instead.
==={{ucfirst:sfn}} embedded in list-defined ref does not work===
If you [[Help:Footnotes#embedding references|embed]] an {{ucfirst:sfn}} template in a [[Help:List-defined references|list-defined reference]], you may get a false-positive "[[Help:Cite errors/Cite error references missing key|missing key" error]] which looks like this:
: <span style="color:#d73333; font-weight:bold; font-size:115%">A [[Help:Footnotes#WP:LDR|list-defined reference]] named "{{nobr|. . .}}" is not used in the content (see the [[Help:Cite errors/Cite error references missing key|help page]]).</span>
{{tracked|T22707}}
This is a false-positive: list-defined references [[Wikipedia:Nesting footnotes#5. List-defined references|do not work correctly when references are nested]]. It is due to a long-standing bug in mediawiki software (see [[phab:T22707]]).
A [[Template:Sfnlink#example-3|workaround]] is possible using {{tl|sfnlink}}.
[[Help:Cite errors/Cite error references missing key#Bugs|Additional bugs]] associated with embedding footnotes in list-defined references are known. One of them is that the [[WP:REFNAME|reference name]] given in the error message will identify the wrong list-defined reference in the first false-positive error message on the page; this is tracked in {{phab|T26600}}.
==Implementation notes==
These templates use two elements: a [[wikilink]] in the body of the article, and an [[WP:ANCHOR DEF|anchor]] in the reference section of the article. Clicking on the wikilink repositions the page at the anchor.
===Citation template anchor===
{{See also|Wikipedia:Citation templates and reference anchors}}
The most common citation templates,{{cs1}} or {{cs2}}, create a [[HTML element#Links and anchors|anchor]] {{tag|a|o|params=name="CITEREF"}} followed by the concatenation of the following parameters:
* '''last''' or '''last1''' or '''surname''' or '''surname1''' or '''author-last''' or '''author-last1''' or '''author1-last''' or '''author-surname''' or '''author-surname1''' or '''author1-surname''' or '''author''' or '''author1''' or '''authors''',
* '''last2''' or '''surname2''' or '''author-last2''' or '''author2-last''' or '''author-surname2''' or '''author2-surname''' or '''author2''',
* '''last3''' or '''surname3''' or '''author-last3''' or '''author3-last''' or '''author-surname3''' or '''author3-surname''' or '''author3''',
* '''last4''' or '''surname4''' or '''author-last4''' or '''author4-last''' or '''author-surname4''' or '''author4-surname''' or '''author4''',
* '''editor-last''' or '''editor-last1''' or '''editor1-last''' or '''editor-surname''' or '''editor-surname1''' or '''editor1-surname''' or '''editor1''' or '''editor''',
* '''editor-last2''' or '''editor2-last''' or '''editor-surname2''' or '''editor2-surname''' or '''editor2''',
* '''editor-last3''' or '''editor3-last''' or '''editor-surname3''' or '''editor3-surname''' or '''editor3''',
* '''editor-last4''' or '''editor4-last''' or '''editor-surname4''' or '''editor4-surname''' or '''editor4''',
* '''date''', '''year'''
This covers the most common templates. Information about all of the templates is available at [[Wikipedia:Citation templates and reference anchors]].
Use of the '''date''' parameter in place of the '''year''' parameter in citation templates is preferred.
===Harvard citation wikilink===
The Harvard citation templates create a [[wikilink]] to the anchor. For example {{tlx|Harv|Smith|2006|4=p=25}} produces the link {{code|#CITEREFSmith2006}} and {{tlx|Citation|2=last=Smith|3=first=John|4=date=27 January 2006|5=title=My Life}} produces the anchor {{code|CITEREFSmith2006}}.
===Using CITEREF directly===
{{Shortcut|WP:CITEREF}}
A few articles create a custom ID using {{code|CITEREF}}, either in place of the Harvard citation template (e.g. <code><nowiki>[[#CITEREFSmith2006|(2006)]]</nowiki></code>) or as a value for {{para|ref}} in the citation template.
{{Refname rules|A custom ID must follow these rules:|
* If CITEREF is used, then spaces in the {{para|ref}} field must be replaced with underscores}}
Examples:
* {{tlx|sfn|{{var|cite name}}|{{var|year}}}}
* {{tlx|cite book|2=ref=CITEREF{{var|cite_nameyear}}}}
* {{tlx|cite book|2=ref={{tl|sfnref|{{var|cite_name}}|{{var|year}}}}}}
Where {{var|cite_name}} is a name such as the publisher.
To avoid the sometimes difficult to remember syntax for links to CITEREF anchors, {{tl|citeref}} can be used to create internal wikilinks with either small superscript-style labels (like this<sup>[n]</sup>) or plain free-text labels to such anchors. It can be used inside of other citations.
Note that the {{code|CITEREF}} prefix is necessary for the [[mw:Reference Tooltips|reference tooltips gadget]] ([[MediaWiki:Gadget-ReferenceTooltips.js]]) to detect that a link goes to a citation.
===[[Template:sfn|<code><nowiki>{{sfn}}</nowiki></code>]]'s [[WP:REFNAME|ref name]]===
Template {{tl2|sfn}} creates a [[WP:REFNAME|named footnote]], so that identical footnotes are combined automatically. The footnote name begins with {{code|FOOTNOTE}} followed by a concatenation of the arguments to {{tl2|sfn}}. E.g.: this template call:
* {{tlx|sfn|Smith|2006|4=p=26}}
should have exactly the same functionality as
* {{tag|ref|params=name="FOOTNOTESmith200626"|content={{tl2|Harvnb|Smith|2006|4=p=26}}.}}
which, in turn, has the same functionality as
* {{tag|ref|params=name="FOOTNOTESmith200626"|content=<nowiki>[[#CITEREFSmith2006|Smith (2006)]], p.&nbsp;26.</nowiki>}}.
{{anchor|url weirdness}}
The ref name becomes more complicated when the page (p) parameter includes a URL, e.g. {{tlg|sfn|Joyce|1903|p{{=}}[https://archive.org/details/aconcisehistory00joycgoog/page/n226 213]|code=on}}, which, once defined, can be called by {{tag|ref|empty|params=name="FOOTNOTEJoyce1903[httpsarchiveorgdetailsaconcisehistory00joycgoogpagen226 213]"}}. The "p=" and the characters |,:,.,/,?,=; are therefore stripped out of the URL. The content of the loc parameter is similarly appended after this.
The call to {{tl2|harvnb}} has been [[subst]]'ed for quicker load times.
==Tracking categories==
{{clc|Pages using sfn with unknown parameters}}
== TemplateData ==
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"1": {
"description": "Last name of first (or only) author",
"required": true,
"example": "Smith",
"type": "line",
"suggested": true,
"label": "Author last name"
},
"2": {
"description": "Year for citations with one author, or last name of second author for citations with two or more authors",
"required": true,
"example": "2006",
"type": "string",
"suggested": true,
"label": "Second author or year"
},
"3": {
"description": "Year for citations with two authors, or last name of third author for citations with three or more authors",
"type": "string",
"label": "Third author or year"
},
"4": {
"description": "Year for citations with three authors, or last name of fourth author for citations with four authors",
"type": "string",
"label": "Fourth author or year"
},
"5": {
"description": "Year for citations with four authors",
"type": "number",
"label": "Year (if four authors included)"
},
"p": {
"description": "Page number in source, if the relevant information is on one page (use the «pp» parameter for multiple pages, and the «loc» parameter for other location data)",
"suggested": true,
"aliases": [
"page"
],
"example": "42",
"type": "line",
"label": "Page"
},
"pp": {
"description": "Page numbers in source",
"aliases": [
"pages"
],
"example": "23–24",
"type": "line",
"label": "Pages"
},
"ps": {
"description": "Trailing text to replace period",
"example": "none",
"type": "string",
"label": "Postscript"
},
"loc": {
"description": "Location in source",
"example": "section 7",
"type": "line",
"label": "Location",
"aliases": [
"at"
]
},
"group": {
"label": "Group",
"description": "The reference group for the footnote",
"type": "string"
}
},
"description": "This template creates a short author–date citation in a footnote. It allows you to link inline citation using Harvard citations (a form of short citations using parenthetical references) to their corresponding full bibliographic citations.",
"format": "inline"
}
</templatedata>
== See also ==
* {{tl|p.}} – citing a page number
* {{tl|r}} – define and reference page(s)
* {{tl|rp}} – reference page(s)
* {{tl|Sfnm}} – for ''m''ultiple sources
* {{tl|SfnRef}} – for the ref anchor
* {{tl|Sfnlink}} – for unidirectional links, especially from [[WP:LDR|LDRs]]
* {{tl|efn}} – for explanatory foot notes
{{Wikipedia referencing}}
{{Hidden|Anchors for examples|
*{{cite book|last1=Smith|date=1994|title=Book by Smith}}
*{{cite book|last1=Smith|last2=Jones|date=1994|title=Book by Smith and Jones}}
*{{cite book|last1=Smith|last2=Jones|last3=Brown|date=1994|title=Book by Smith, Jones and Brown}}
}}<includeonly>{{sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Author–date citation templates]]
[[Category:Footnote templates]]
[[Category:Templates that generate named references]]
}}</includeonly>
futehzjp9wcbem0mms2wyhj4rmypoet
Tempilet:Fake heading/styles.css
10
2506
33061
2024-07-23T23:19:58Z
en>Pppery
0
Protected
33061
sanitized-css
text/css
/* {{pp-template}} */
.fake-heading {
color: var(--color-emphasized, #000000);
background: none;
margin: 0;
overflow: hidden;
padding-bottom: 0.17em;
page-break-after: avoid;
padding-top: 0.5em;
}
.fake-heading.h1,
.fake-heading.h2 {
border-bottom: 1px solid var(--border-color-base, #a2a9b1);
margin-bottom: 0.25em;
margin-top: 1em;
padding: 0;
font-family: 'Linux Libertine','Georgia','Times','Source Serif Pro',serif;
line-height: 1.375;
}
body.skin-monobook .fake-heading.h1,
body.skin-monobook .fake-heading.h2 {
font-family: inherit;
line-height: inherit;
}
body.skin-timeless .fake-heading.h1,
body.skin-timeless .fake-heading.h2 {
border-bottom: 3px solid #c8ccd1;
}
.fake-heading.h1 {
font-size: 1.8em;
}
body.skin-timeless .fake-heading.h1 {
font-size: 2em;
}
.fake-heading.h2 {
font-size: 1.5em;
}
body.skin-timeless .fake-heading.h2 {
font-size: 1.8em;
}
.fake-heading.h3,
.fake-heading.h4,
.fake-heading.h5,
.fake-heading.h6 {
font-weight: bold;
margin-top: 0.3em;
margin-bottom: 0;
padding-bottom: 0;
line-height: 1.6;
}
.fake-heading.h3 {
font-size: 1.2em;
}
.fake-heading.h4 {
font-size: 100%;
}
3nbqogdhwtbf6jj76snvv3k6wknfvjq
33062
33061
2026-11-11T21:18:53Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Fake_heading/styles.css]]
33061
sanitized-css
text/css
/* {{pp-template}} */
.fake-heading {
color: var(--color-emphasized, #000000);
background: none;
margin: 0;
overflow: hidden;
padding-bottom: 0.17em;
page-break-after: avoid;
padding-top: 0.5em;
}
.fake-heading.h1,
.fake-heading.h2 {
border-bottom: 1px solid var(--border-color-base, #a2a9b1);
margin-bottom: 0.25em;
margin-top: 1em;
padding: 0;
font-family: 'Linux Libertine','Georgia','Times','Source Serif Pro',serif;
line-height: 1.375;
}
body.skin-monobook .fake-heading.h1,
body.skin-monobook .fake-heading.h2 {
font-family: inherit;
line-height: inherit;
}
body.skin-timeless .fake-heading.h1,
body.skin-timeless .fake-heading.h2 {
border-bottom: 3px solid #c8ccd1;
}
.fake-heading.h1 {
font-size: 1.8em;
}
body.skin-timeless .fake-heading.h1 {
font-size: 2em;
}
.fake-heading.h2 {
font-size: 1.5em;
}
body.skin-timeless .fake-heading.h2 {
font-size: 1.8em;
}
.fake-heading.h3,
.fake-heading.h4,
.fake-heading.h5,
.fake-heading.h6 {
font-weight: bold;
margin-top: 0.3em;
margin-bottom: 0;
padding-bottom: 0;
line-height: 1.6;
}
.fake-heading.h3 {
font-size: 1.2em;
}
.fake-heading.h4 {
font-size: 100%;
}
3nbqogdhwtbf6jj76snvv3k6wknfvjq
Tempilet:Hidden begin/styles.css
10
2507
33063
2024-03-21T15:54:44Z
en>Jdlrobson
0
[[phab:T360582]]
33063
sanitized-css
text/css
/* {{pp-template}} */
.hidden-begin {
box-sizing: border-box;
width: 100%;
padding: 5px;
border: none;
font-size: 95%;
}
.hidden-title {
font-weight: bold;
line-height: 1.6;
text-align: left;
}
.hidden-content {
text-align: left;
}
/* [[phab:T360582]] */
@media all and ( max-width: 500px ) {
.hidden-begin {
width: auto !important;
clear: none !important;
float: none !important;
}
}
b1nhedn00o082mlrogut2z7909uozkh
33064
33063
2026-11-11T21:18:53Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Hidden_begin/styles.css]]
33063
sanitized-css
text/css
/* {{pp-template}} */
.hidden-begin {
box-sizing: border-box;
width: 100%;
padding: 5px;
border: none;
font-size: 95%;
}
.hidden-title {
font-weight: bold;
line-height: 1.6;
text-align: left;
}
.hidden-content {
text-align: left;
}
/* [[phab:T360582]] */
@media all and ( max-width: 500px ) {
.hidden-begin {
width: auto !important;
clear: none !important;
float: none !important;
}
}
b1nhedn00o082mlrogut2z7909uozkh
Tempilet:Harvard citation with colon
10
2508
33065
2023-12-30T22:48:42Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Harvcol]] to [[Template:Harvard citation with colon]]: expand name per [[WP:TPN]] and to match [[Template:Harvard citation]]
33065
wikitext
text/x-wiki
{{#invoke:Footnotes|harvard_citation
|bracket_left = (
|bracket_right = )
|page_sep = :
|pages_sep = :
|template=harvcol
}}<noinclude>
{{documentation}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
</noinclude>
qqx0713d1smlkurel4s3x8nd7xyfige
33066
33065
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation_with_colon]]
33065
wikitext
text/x-wiki
{{#invoke:Footnotes|harvard_citation
|bracket_left = (
|bracket_right = )
|page_sep = :
|pages_sep = :
|template=harvcol
}}<noinclude>
{{documentation}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
</noinclude>
qqx0713d1smlkurel4s3x8nd7xyfige
Tempilet:Harvard citation with colon no brackets
10
2509
33067
2023-12-30T22:53:02Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Harvcolnb]] to [[Template:Harvard citation with colon no brackets]]: expand template name per [[WP:TPN]] and [[Tempate:Harvard citation with colon]] (which, for transparency, I just moved from [[Template:harvcol]])
33067
wikitext
text/x-wiki
{{#invoke:Footnotes|harvard_citation
|page_sep = :
|pages_sep = :
|template=harvcolnb
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
0yp0q3iutyqvpot3dryqu0g96vhwug3
33068
33067
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation_with_colon_no_brackets]]
33067
wikitext
text/x-wiki
{{#invoke:Footnotes|harvard_citation
|page_sep = :
|pages_sep = :
|template=harvcolnb
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
0yp0q3iutyqvpot3dryqu0g96vhwug3
Tempilet:Harvard citation with colon text
10
2510
33069
2024-05-14T03:10:44Z
en>Rjjiii
0
adding "at" as an alias for "loc" (similar to cite xxx templates)
33069
wikitext
text/x-wiki
<noinclude>{{pp-vandalism|small=yes}}</noinclude>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}||)}}
|bracket_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}|)}}
|page_sep = :
|pages_sep = :
|template=harvcoltxt
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
5ulqtepmgy5hmanx0eqfv6ymenwakk7
33070
33069
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation_with_colon_text]]
33069
wikitext
text/x-wiki
<noinclude>{{pp-vandalism|small=yes}}</noinclude>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}||)}}
|bracket_right = {{#if:{{{p|}}}{{{page|}}}{{{pp|}}}{{{pages|}}}{{{loc|}}}{{{at|}}}|)}}
|page_sep = :
|pages_sep = :
|template=harvcoltxt
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
5ulqtepmgy5hmanx0eqfv6ymenwakk7
Tempilet:Harvard citation year brackets
10
2511
33071
2026-04-18T03:54:54Z
en>Pppery
0
Changed protection settings for "[[Template:Harvard citation year brackets]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33071
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = )
|template=harvp
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
9j9weque3f0at49hq06dqz8jy2nwx9u
33072
33071
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Harvard_citation_year_brackets]]
33071
wikitext
text/x-wiki
<includeonly>{{#invoke:Footnotes|harvard_citation
|bracket_year_left = (
|bracket_year_right = )
|template=harvp
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
9j9weque3f0at49hq06dqz8jy2nwx9u
Module:Auto date formatter
828
2512
33075
2025-10-24T02:39:45Z
en>Rjjiii
0
There is probably a more robust way to fix this. I'll post on the talk page in moment.
33075
Scribunto
text/plain
require ('strict');
local lang_obj = mw.language.getContentLanguage(); -- needed for the function to reformat dates
local global_df = mw.loadData ('Module:Citation/CS1/Configuration').global_df; -- fetch global date format specified by {{use xxx dates}} template
local base_format = global_df and global_df:match ('^(%a%a%a)'); -- get {{use xxx dates}} base date format: 'dmy' or 'mdy'
local date_style = global_df and global_df:match ('^%a%a%a%-(.+)'); -- get |cs1-dates= style modifiers
--[[--------------------------< F O R M A T T E R >------------------------------------------------------------
local function to format <date> according to <format> (dmy or mdy) and <style> (long, short, year initial) as
specified by the |cs1-dates= parameter of the {{use xxx dates}} template.
valid |cs1-dates= format character strings are:
l, ll, all – default; long-form publication and access- / archive-dates; 'all' when |cs1-dates= omitted or empty
ls – long-form publication dates; abbreviated access- / archive-dates
ly – long-form publication dates; year-initial numeric access- / archive-dates (ymd)
s, ss – abbreviated publication and access- / archive-dates
sy – abbreviated publication dates; year-initial numeric access- / archive-dates (ymd)
y, yy – year-initial numeric publication, access- and archive-dates (ymd); overrides base format
note: 'all' is added by get_date_format() in Module:Citation/CS1/Configuration when |cs1-dates= is omitted or empty;
cs1|2 and this module then assume long-form date style for all dates
]]
local function formatter (date, format, style)
--[[
First check for year-only in the date field.
Next check for a year and month only.
In either case, just return the date as provided.
]]
if date:match('^%d%d%d%d$') then -- YYYY
return date
end
if date:match('^%a+%s+%d%d%d%d$') or -- "Month YYYY"
date:match('^%d%d%d%d%-%d%d$') then -- "YYYY-MM"
return date
end
local format_strings_t = { -- map <style> to formatDate() format strings (same as #time parser function)
['dmy'] = {
['l'] = 'j F Y', -- long month name
['s'] = 'j M Y', -- abbreviated month name
['y'] = 'Y-m-d' -- year initial numeric; overrides <format> (dmy/mdy)
},
['mdy'] = {
['l'] = 'F j, Y', -- long month name
['s'] = 'M j, Y', -- abbreviated month name
['y'] = 'Y-m-d' -- year initial numeric; overrides <format> (dmy/mdy)
}
}
local good, new_date = pcall (lang_obj.formatDate, lang_obj, format_strings_t[format][style], date); -- attempt to reformat; on success, <good> is boolean true
return (good and new_date) or date; -- returns <new_date> when <good> is boolean true; <date> else
end
--[[--------------------------< _ P U B _ D A T E _ F O R M A T >----------------------------------------------
Module entry point
For publication dates |date=, |publication-date=, etc
]]
local function _pub_date_format (date)
if not global_df then
return date; -- when article does not have {{use xxx dates}}, abandon
end
local styles_t = {all = 'l', ll = 'l', l = 'l', ls = 'l', ly = 'l', s = 's', ss = 's', sy = 's', yy = 'y', y = 'y'}; -- map known styles for publication dates
return formatter (date, base_format, styles_t[date_style] or 'l'); -- not a known style default to 'l' (long form)
end
--[[--------------------------< P U B _ D A T E _ F O R M A T >------------------------------------------------
#invoke entry point
For publication dates |date=, |publication-date=, etc
{{#invoke:auto date formatter|pub_date_format|16 March 2025}}
]]
local function pub_date_format (frame)
return _pub_date_format (frame.args[1]); -- <args[1]> is date to be formatted
end
--[[--------------------------< _ A C C E S S _ A R C H I V E _ F O R M A T >----------------------------------
module entry point
For access and archive dates |access-date=, |accessdate=, archive-date=, archivedate=
]]
local function _access_archive_format (date)
if not global_df then
return date; -- when article does not have {{use xxx dates}}, abandon
end
local styles_t = {all = 'l', ll = 'l', l = 'l', ls = 's', ly = 'y', s = 's', ss = 's', sy = 'y', yy = 'y', y = 'y'}; -- map known styles for access/archive dates
return formatter (date, base_format, styles_t[date_style] or 'l'); -- not a known style default to 'l' (long form)
end
--[[--------------------------< A C C E S S _ A R C H I V E _ F O R M A T >------------------------------------
#invoke entry point
For access and archive dates |access-date=, |accessdate=, archive-date=, archivedate=
{{#invoke:auto date formatter|access_archive_format|16 March 2025}}
]]
local function access_archive_format (frame)
return _access_archive_format (frame.args[1]); -- <args[1]> is date to be formatted
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return {
pub_date_format = pub_date_format, -- #invoke entry points
access_archive_format = access_archive_format,
_pub_date_format = _pub_date_format, -- module entry points
_access_archive_format = _access_archive_format,
}
anrrkki5ypoi6dfl2vagbfm7fg8axpb
33076
33075
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Auto_date_formatter]]
33075
Scribunto
text/plain
require ('strict');
local lang_obj = mw.language.getContentLanguage(); -- needed for the function to reformat dates
local global_df = mw.loadData ('Module:Citation/CS1/Configuration').global_df; -- fetch global date format specified by {{use xxx dates}} template
local base_format = global_df and global_df:match ('^(%a%a%a)'); -- get {{use xxx dates}} base date format: 'dmy' or 'mdy'
local date_style = global_df and global_df:match ('^%a%a%a%-(.+)'); -- get |cs1-dates= style modifiers
--[[--------------------------< F O R M A T T E R >------------------------------------------------------------
local function to format <date> according to <format> (dmy or mdy) and <style> (long, short, year initial) as
specified by the |cs1-dates= parameter of the {{use xxx dates}} template.
valid |cs1-dates= format character strings are:
l, ll, all – default; long-form publication and access- / archive-dates; 'all' when |cs1-dates= omitted or empty
ls – long-form publication dates; abbreviated access- / archive-dates
ly – long-form publication dates; year-initial numeric access- / archive-dates (ymd)
s, ss – abbreviated publication and access- / archive-dates
sy – abbreviated publication dates; year-initial numeric access- / archive-dates (ymd)
y, yy – year-initial numeric publication, access- and archive-dates (ymd); overrides base format
note: 'all' is added by get_date_format() in Module:Citation/CS1/Configuration when |cs1-dates= is omitted or empty;
cs1|2 and this module then assume long-form date style for all dates
]]
local function formatter (date, format, style)
--[[
First check for year-only in the date field.
Next check for a year and month only.
In either case, just return the date as provided.
]]
if date:match('^%d%d%d%d$') then -- YYYY
return date
end
if date:match('^%a+%s+%d%d%d%d$') or -- "Month YYYY"
date:match('^%d%d%d%d%-%d%d$') then -- "YYYY-MM"
return date
end
local format_strings_t = { -- map <style> to formatDate() format strings (same as #time parser function)
['dmy'] = {
['l'] = 'j F Y', -- long month name
['s'] = 'j M Y', -- abbreviated month name
['y'] = 'Y-m-d' -- year initial numeric; overrides <format> (dmy/mdy)
},
['mdy'] = {
['l'] = 'F j, Y', -- long month name
['s'] = 'M j, Y', -- abbreviated month name
['y'] = 'Y-m-d' -- year initial numeric; overrides <format> (dmy/mdy)
}
}
local good, new_date = pcall (lang_obj.formatDate, lang_obj, format_strings_t[format][style], date); -- attempt to reformat; on success, <good> is boolean true
return (good and new_date) or date; -- returns <new_date> when <good> is boolean true; <date> else
end
--[[--------------------------< _ P U B _ D A T E _ F O R M A T >----------------------------------------------
Module entry point
For publication dates |date=, |publication-date=, etc
]]
local function _pub_date_format (date)
if not global_df then
return date; -- when article does not have {{use xxx dates}}, abandon
end
local styles_t = {all = 'l', ll = 'l', l = 'l', ls = 'l', ly = 'l', s = 's', ss = 's', sy = 's', yy = 'y', y = 'y'}; -- map known styles for publication dates
return formatter (date, base_format, styles_t[date_style] or 'l'); -- not a known style default to 'l' (long form)
end
--[[--------------------------< P U B _ D A T E _ F O R M A T >------------------------------------------------
#invoke entry point
For publication dates |date=, |publication-date=, etc
{{#invoke:auto date formatter|pub_date_format|16 March 2025}}
]]
local function pub_date_format (frame)
return _pub_date_format (frame.args[1]); -- <args[1]> is date to be formatted
end
--[[--------------------------< _ A C C E S S _ A R C H I V E _ F O R M A T >----------------------------------
module entry point
For access and archive dates |access-date=, |accessdate=, archive-date=, archivedate=
]]
local function _access_archive_format (date)
if not global_df then
return date; -- when article does not have {{use xxx dates}}, abandon
end
local styles_t = {all = 'l', ll = 'l', l = 'l', ls = 's', ly = 'y', s = 's', ss = 's', sy = 'y', yy = 'y', y = 'y'}; -- map known styles for access/archive dates
return formatter (date, base_format, styles_t[date_style] or 'l'); -- not a known style default to 'l' (long form)
end
--[[--------------------------< A C C E S S _ A R C H I V E _ F O R M A T >------------------------------------
#invoke entry point
For access and archive dates |access-date=, |accessdate=, archive-date=, archivedate=
{{#invoke:auto date formatter|access_archive_format|16 March 2025}}
]]
local function access_archive_format (frame)
return _access_archive_format (frame.args[1]); -- <args[1]> is date to be formatted
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return {
pub_date_format = pub_date_format, -- #invoke entry points
access_archive_format = access_archive_format,
_pub_date_format = _pub_date_format, -- module entry points
_access_archive_format = _access_archive_format,
}
anrrkki5ypoi6dfl2vagbfm7fg8axpb
Module:SST/registry
828
2513
33077
2026-07-12T06:01:34Z
en>GreenC bot
0
Auto-updating SSTS registry via compiler
33077
Scribunto
text/plain
--[[--------------------------< S S T S _ R E G I S T R Y >----------------------------------------------
Specific-Source Template System registry (WP:SSTS)
WARNING: DO NOT EDIT THIS MODULE
This is an auto-generated compiled registry for the Specific-Source Template System (WP:SSTS).
Any manual edits made to this page WILL BE OVERWRITTEN by a bot.
If you need to correct an author, year, or citation pattern, you must edit the
specific Lua shard (module) associated with that template (e.g., Module:SST/shards/...).
This registry will automatically update at least once daily to reflect those changes.
]]
local registry = {
defaults = {
['Hovannisian: Armenian Van-Vaspurakan'] = {'Hovannisian', '2000'},
['Armenian Van-Vaspurakan 2000'] = {'Hovannisian', '2000'},
['Kittler: Mercedes-Benz Personenwagen seit 1886'] = {'Kittler', '2008'},
['Brooklands: On Mercedes Sports & GT Cars 1970-1980'] = {'Clarke', '1980'},
['Brooklands-MBRTS>C70'] = {'Clarke', '1980'},
['Nixon: Racing the Silver Arrows'] = {'Nixon', '2003'},
['Cite Wright Companion'] = {'Storrer', '1993'},
['The World\'s Writing Systems'] = {'', '1996'},
['Anoar Ali: 150th Anniversary Memorial Book 1869-2019'] = {'Ali', ''},
['150th Anniversary Memorial Book 1869-2019'] = {'Ali', ''},
['Baaden: Das neue grosse Mercedes SL'] = {'BaadenRöcke', '2002'},
['Brooklands: Mercedes-Benz 190SL 300SL 300SLR'] = {'Clarke', '2011'},
['Weber: Porsche: The Essence of Performance'] = {'Weber', '2000'},
['Sugahara: Mercedes-Benz Grand Prix Race Cars 1934–1955'] = {'Sugahara', '2004'},
['Zekulich-SpiritSwan'] = {'Zekulich', '2014'},
['O City of Byzantium'] = {'Choniates', '1984'},
['Cranswick: Porsche 928, 924, 944 and 968'] = {'Cranswick', '2008'},
['Schneider: NSU: Automobile 1905–1977'] = {'Schneider', '2008'},
['John Skylitzes: A Synopsis of Byzantine History, 811–1057'] = {'Wortley', '2010'},
['Arth: NSU-Automobile'] = {'Arth', '2015'},
['Mellon: Mercedes: Coupes 1974-84 Repair Manual'] = {'', '2001'},
['Chilton-MCSW 1974-84'] = {'', '2001'},
['Nitskey: Mercedes-Benz Production Models Book 1946-1995'] = {'Nitske', '1995'},
['Shindo: 100 sai no ryugi'] = {'Shindo', '2012'},
['100sainoryugi'] = {'Shindo', '2012'},
['Malin 1976'] = {'Malin', '1976'},
['Wirth: Mercedes-Benz Supercars'] = {'Wirth', '2012'},
['Eckert-Buildings of Michigan'] = {'Eckert', '1993'},
['Meredith: Original Mercedes SL'] = {'Meredith', '1996'},
['Clarke-AustWineCompan'] = {'Clarke', '2004'},
['AIA Guide to Boston'] = {'SouthworthSouthworth', '2008'},
['Cite aiaboston'] = {'SouthworthSouthworth', '2008'},
['Henshaw: The Ultimate Guide to SUVs and Off-Road Vehicles'] = {'Henshaw', '2005'},
['Kennedy-The Armies of the Caliphs'] = {'Kennedy', '2001'},
['Hofner: Die S-Klasse von Mercedes-Benz'] = {'Hofner', '1997'},
['Walker: NSU: The Complete Story'] = {'Walker', '2009'},
['Fletcher: The Great Tank Scandal'] = {'Fletcher', '1989a'},
['Cite AIA4'] = {'WhiteWillensky', '2000'},
['Laban: Mercedes SL Series'] = {'Laban', '1992'},
['Cite OCSC'] = {'WondrichRothbaum', '2021'},
['Cite IPH'] = {'', '2017'},
['State and Society in Fatimid Egypt'] = {'Lev', '1991'},
['The Byzantine Lady: Ten Portraits, 1250–1500'] = {'Nicol', '1994'},
['Staud: Mercedes-Benz: The Grand Cabrios & Coupes'] = {'StaudLewandowski', '2016'},
['The Governors and Judges of Egypt'] = {'Al-Kindi', '1912'},
['Holmes: Ultimate Convertibles'] = {'Holmes', '2007'},
['Häußermann: Mercedes-Benz S-Class'] = {'Häußermann', '2006b'},
['Saunders: Giants of the Seas'] = {'Saunders', '2013'},
['Saunders-Giants of the Seas'] = {'Saunders', '2013'},
['Scott-Negus-Cellar Door'] = {'ScottNegus', '2011'},
['Sessler: Mercedes-Benz SL Series'] = {'Sessler', '2011'},
['Morgan: Original Porsche 924 944 968'] = {'Morgan', '1998'},
['Byzantium and Venice: A Study in Diplomatic and Cultural Relations'] = {'Nicol', '1988'},
['Das Reich des Mahdi'] = {'Halm', '1991'},
['The Buwayhid Dynasty in Iraq'] = {'Donohue', '2003'},
['The Oxford Guide to the Uralic Languages'] = {'Bakró-NagyLaaksoSkribnik', '2022'},
['Plowman: Australian Cruise Ships'] = {'Plowman', '2007'},
['Plowman-Aust Cruise Ships'] = {'Plowman', '2007'},
['Cárdenas: 66 petites histoires du Pays Catalan'] = {'Cárdenas', '2014'},
['66 PHPC'] = {'Cárdenas', '2014'},
['The Byzantine Revival, 780–842'] = {'Treadgold', '1988'},
['Brooklands: Mercedes AMG Gold Portfolio 1983-1999'] = {'Clarke', '2007'},
['Brooklands: On Audi & Auto Union 1980'] = {'Clarke', '1986'},
['Brooklands-AAURT80'] = {'Clarke', '1986'},
['The Arab Emirates in Bagratid Armenia'] = {'Ter-Ghewondyan', '1976'},
['Botto: At This Theatre'] = {'BottoMitchell', '2002'},
['Cite ATT Broadway'] = {'BottoMitchell', '2002'},
['Taylor: Mercedes-Benz S-Class 1972-2013'] = {'Taylor', '2014'},
['Smith: Cruise Ships 2014'] = {'Smith', '2014'},
['Smith-Cruise Ships-2014'] = {'Smith', '2014'},
['Bols: Mercedes-Benz Personenwagen'] = {'Bols', '2007'},
['The Despotate of Epiros, 1267–1479'] = {'Nicol', '1984'},
['Wood: Great Marques of Germany'] = {'Wood', '1985'},
['Wilhelms 1976'] = {'Wilhelms', '1976'},
['The End of the Jihâd State'] = {'Blankinship', '1994'},
['Austen: Porsche 924 944 968'] = {'Austen', '2013'},
['Thierry: Armenian Art'] = {'Thierry', '1989'},
['Armenian Art 1989'] = {'Thierry', '1989'},
['Staud: Faszination und Mythos'] = {'StaudKittler', '2001'},
['Vivian: Porsche 924 928 944 968'] = {'Vivian', '1993'},
['Kennedy-The Great Arab Conquests'] = {'Kennedy', '2007'},
['Simon-Wines Australia'] = {'Simon', '1966'},
['Wieder: The Great American Convertible'] = {'WiederHall', '1977'},
['Leffingwell: Porsche 70 Years'] = {'Leffingwell', '2017'},
['Pitt: Porsche 924 944 968'] = {'Pitt', '2006'},
['The Byzantine Family of Kantakouzenos'] = {'Nicol', '1968'},
['Zekulich-WineWA'] = {'Zekulich', '2000'},
['Schrader: Porsche 924 944 968'] = {'Schrader', '2018'},
['Cite AIA5'] = {'WhiteWillenskyLeadon', '2010'},
['Brooklands: On Mercedes 1952-1962'] = {'Clarke', '1987'},
['Brooklands-MBRT52'] = {'Clarke', '1987'},
['Smith: Cruise Ships 2010'] = {'Smith', '2010'},
['Smith-Cruise Ships-2010'] = {'Smith', '2010'},
['The Latin Renovatio of Byzantium'] = {'Tricht', '2011'},
['Schneider: NSU Autos und Motorräder 1900–1977'] = {'Schneider', '2011'},
['Bond-Pemberton'] = {'Bond', '2008'},
['Neate-High Asia'] = {'Neate', '1989'},
['Günther: Das grosse Mercedes-SL-Buch'] = {'GüntherHübner', '1990'},
['Lederer: Mercedes-Benz Ponton & Heckflosse'] = {'Lederer', '1997'},
['Bongers: Porsche Data Book'] = {'Bongers', '2006'},
['Taylor: Mercedes-Benz: Cars of the 1990s'] = {'Taylor', '2009'},
['Geiling: NSU: Fahrzeuge'] = {'Geiling', '2009'},
['Saladin in Egypt'] = {'Lev', '1999'},
['Bosworth-The New Islamic Dynasties'] = {'Bosworth', '1996'},
['Wood: Porsche: The Legend'] = {'Wood', '1997'},
['Lintelmann: Mercedes-Benz SL'] = {'Lintelmann', '2010'},
['Book-Ahrons-British Steam Railway Locomotive'] = {'Ahrons', '1927'},
['MacLaren-Mapper of Mountains'] = {'MacLaren', '2005'},
['MacMullen: Paddle-Wheel Days in California'] = {'MacMullen', '1970'},
['MacMullen-Paddle-Wheel'] = {'MacMullen', '1970'},
['Slade: Original Mercedes-Benz Coupes'] = {'Slade', '2004'},
['A History of the Byzantine State and Society'] = {'Treadgold', '1997'},
['Églises romanes oubliées du Roussillon'] = {'Mallet', '2003'},
['Chilton: Mercedes-Benz: 1968-73'] = {'Staff', '1974'},
['Chilton-MB 1968-73'] = {'Staff', '1974'},
['Bentley: Mercedes-Benz Technical Companion'] = {'America', '2005'},
['Bentley-MB Technical'] = {'America', '2005'},
['Brooklands: Mercedes-Benz SL SLK CLK Portfolio 1990-2003'] = {'Clarke', '2004'},
['A Short History of Berkhamsted'] = {'Birtchnell', '1972'},
['Strom Trask Guest 1975'] = {'StromTraskGuest', '1975'},
['Jordan-WineWABest'] = {'Jordan', '2002'},
['Brooklands: Mercedes 230SL'] = {'Clarke', '2010'},
['Halliday-AustWineEncyc'] = {'Halliday', '2009'},
['Emperor Michael Palaeologus and the West'] = {'Geanakoplos', '1959'},
['Bass: Mercedes-Benz Pagoda 230, 250 & 280 SL'] = {'Bass', '2007'},
['Noakes: Mercedes SL Series: The Complete Story'] = {'Noakes', '2004'},
['Noakes-MSL'] = {'Noakes', '2004'},
['Schneider: NSU 1873-1984'] = {'Schneider', '1988'},
['Engelen: Mercedes-Benz C-Klasse: 201-205'] = {'Engelen', '2020'},
['McComb: Mercedes-Benz V8s'] = {'McComb', '1980'},
['The Arab Conquests in Central Asia'] = {'Gibb', '1923'},
['Ghost Towns of California'] = {'Miller', '1978'},
['Meredith: Mercedes-Benz Saloons'] = {'Meredith', '2003'},
['Mills: Stern-wheelers up Columbia'] = {'Mills', '1977'},
['Mills-Columbia'] = {'Mills', '1977'},
['Blake: Disraeli'] = {'Blake', '1966'},
['DisraeliRef'] = {'Blake', '1966'},
['Larimer: Mercedes-Benz Buyer\'s Guide'] = {'Larimer', '2004'},
['Die Provinzen des Osmanischen Reiches'] = {'Birken', '1976'},
['Davies Dwornik Gault Strom 1978'] = {'DaviesDwornikGaultStrom', '1978'},
['Brooklands: Mercedes-Benz SLs & SLCs Ultimate Portfolio 1971-1989'] = {'Clarke', '2004'},
['The Abbasid Caliphate: A History'] = {'El-Hibri', '2021'},
['Les personnages byzantins de l\'Alexiade'] = {'Skoulatos', '1980'},
['Polemis-The Doukai'] = {'Polemis', '1968'},
['Ludvigsen: German Racing Silver'] = {'Ludvigsen', '2009'},
['Ghost Towns of Northern California'] = {'VarneySusan', '2001'},
['Meredith: Mercedes-Benz SL Sports Cars'] = {'Meredith', '1999'},
['Freeman: Mercedes-Benz: 1959-70'] = {'FreemanRiveleHallinger', '1983'},
['Gordon-The Breaking of a Thousand Swords'] = {'Gordon', '2001'},
['Halliday-AustWineCompend'] = {'Halliday', '1985'},
['Strom 1979'] = {'Strom', '1979'},
['Plowman: The SITMAR Liners'] = {'Plowman', '2004'},
['Plowman-Sitmar'] = {'Plowman', '2004'},
['Book-Semmens-Goldfinch-How Steam Locomotives Really Work'] = {'SemmensGoldfinch', '2000'},
['Brooklands: Mercedes SLs & SLCs Gold Portfolio 1971-1989'] = {'Clarke', '1990'},
['Forrestal-Wineries'] = {'Forrestal', '1999'},
['Parkhouse: West Gloucester & Wye Valley Lines'] = {'Parkhouse', '2013a'},
['Book-Parkhouse-BRHIC-1'] = {'Parkhouse', '2013a'},
['Koehling: Mercedes-Benz, The Modern SL Cars'] = {'Koehling', '2013'},
['Schlegelmilch: Mercedes'] = {'SchlegelmilchLehbrinkOsterroth', '2013'},
['Schlegelmilch-M-2013'] = {'SchlegelmilchLehbrinkOsterroth', '2013'},
['Venice: A Maritime Republic'] = {'Lane', '1973'},
['Lehbrink: Faszination Mercedes'] = {'Lehbrink', '2012'},
['Bock: Japanese Film Directors'] = {'Bock', '1978'},
['Audie-bock-directors'] = {'Bock', '1978'},
['Hirsch: The Last American Convertibles'] = {'HirschWeith', '1979'},
['Nebraska Place-Names'] = {'FitzpatrickLink', '1960'},
['Book-Hansen-US Nuclear Weapons'] = {'Hansen', '1988'},
['The Muslims of Medieval Italy'] = {'Metcalfe', '2009'},
['Chapman: SUV'] = {'Chapman', '2005'},
['Byzantium Confronts the West'] = {'Brand', '1968'},
['History of Yolo County'] = {'Gregory', '1913'},
['Brooklands: On Audi & Auto Union 1952-1980'] = {'Clarke', '1986'},
['Brooklands-AAURT52'] = {'Clarke', '1986'},
['Trask and Strom 1976'] = {'TraskStrom', '1976'},
['The Imperial Administrative System of the Ninth Century'] = {'BuryPhilotheus', '1911'},
['Nicholls-The Establishment Boys'] = {'Nicholls', '2021'},
['Brooklands: On Mercedes 1963-1970'] = {'Clarke', '1987'},
['Brooklands-MBRT63'] = {'Clarke', '1987'},
['Cotton: Porsche 924, 944 & 968'] = {'Cotton', '2000'},
['Gibbs: Pacific Graveyard'] = {'Gibbs', '1992'},
['Gibbs-Graveyard'] = {'Gibbs', '1992'},
['Jackson: Japanese Super Cars'] = {'Jackson', '1992'},
['Die Kalifen von Kairo'] = {'Halm', '2003'},
['Bradsher: High and Mighty'] = {'Bradsher', '2002'},
['Vieweg: Alles über die Mercedes'] = {'Vieweg', '2000'},
['Essays on the Latin Orient'] = {'Miller', '1921'},
['Trask and Guest 1975'] = {'TraskGuest', '1975'},
['Brooklands: Mercedes SLs Performance Portfolio 1989-1994'] = {'Clarke', '1996'},
['Book-Van Riemsdijk-Compound Locomotives'] = {'Riemsdijk', '1994'},
['Fletcher: Universal Tank'] = {'Fletcher', '1989b'},
['Book-Fletcher-Universal Tank'] = {'Fletcher', '1989b'},
['Naval Wars in the Levant 1559–1853'] = {'Anderson', '1952'},
['La Morée franque'] = {'Bon', '1969'},
['The Latins in the Levant'] = {'Miller', '1908'},
['A History of Palestine, 634–1099'] = {'Gil', '1997'},
['Caro: The Power Broker'] = {'Caro', '1974'},
['Cite Power Broker'] = {'Caro', '1974'},
['Smale: Porsche 924 928 944 968'] = {'Smale', '2015'},
['Hardy-AustWinePictAtlas'] = {'Hardy', '1997'},
['The Immortal Emperor: The Life and Legend of Constantine Palaiologos, Last Emperor of the Romans'] = {'Nicol', '1992'},
['Oswald: Mercedes-Benz Personenwagen 1886-1986'] = {'Oswald', '2018'},
['Arizona SHS Interactive Map'] = {'Division', ''},
['ADOT SHS'] = {'Division', ''},
['Rybczynski2000'] = {'Rybczynski', '2000'},
['Alexander-Four Bishops'] = {'Alexander', '1957'},
['Hansen: Swords of Armageddon'] = {'Hansen', '2007'},
['Book-Hansen-Swords of Armageddon'] = {'Hansen', '2007'},
['The Late Medieval Balkans'] = {'Fine', '1994'},
['Bruno: Mercedes Benz Personenwagen 1886–1980'] = {'Bruno', '2014'},
['The Arab Kingdom and its Fall'] = {'Wellhausen', '1927'},
['Niemann: Personenwagen von Mercedes-Benz'] = {'Niemann', '2006'},
['Bass: Mercedes-Benz 280-560SL & SLC: W107 series'] = {'Bass', '2017'},
['Cole: The Classic Car Adventure'] = {'Cole', '2017'},
['Langworth: The Great American Convertible'] = {'Langworth', '1988'},
['Rocke: Das große Mercedes-S-Klasse-Buch'] = {'Röcke', '1991'},
['Schneider: Die NSU-Story'] = {'Schneider', '2012'},
['Sloniger: Porsche 924 928 944'] = {'Sloniger', '1987'},
['The Life and Times of Ali ibn Isa'] = {'Bowen', '1928'},
['Warfare, State and Society in the Byzantine World, 565–1204'] = {'Haldon', '1999'},
['Häußermann: Mercedes-Benz: The Large Coupes'] = {'Häußermann', '2006a'},
['Leffingwell: Porsche Legends'] = {'Leffingwell', '1993'},
['The Visual History of Type'] = {'McNeil', '2017'},
['Pitt: Mercedes-Benz SL & SLR'] = {'Pitt', '2009'},
['Hartmann: Das große Mercedes-Cabrio-Buch'] = {'Hartmann', '2017'},
['Cite The Age of the Galley'] = {'MorrisonGardiner', '1995'},
['Rocke: Das neue große Mercedes-S-Klasse-Buch'] = {'Röcke', '2003'},
['Genoa and the Genoese'] = {'Epstein', '1996'},
['Brooklands: Mercedes AMG Ultimate Portfolio 2000'] = {'Clarke', '2007'},
['Fuths: Porsche 924 944 968 928'] = {'Fuths', '2020'},
['Koehling: Mercedes-Benz the Early SL Cars'] = {'Koehling', '2014'},
['Steidl: NSU Personenwagen'] = {'Steidl', '2009'},
['Taylor: Factory-Original Mercedes SL'] = {'Taylor', '2013'},
['Bruse: NSU Fotoalbum 1906–1977'] = {'BruseStorz', '2010'},
['Brooklands: On Mercedes 1971-1979'] = {'Clarke', '1987'},
['Brooklands-MBRT71'] = {'Clarke', '1987'},
['The Geometrical Foundation of Natural Structure (book)'] = {'Williams', '1979'},
['Alfieri: Mercedes-Benz SL'] = {'Alfieri', '2016'},
['Kalifen und Assassinen'] = {'Halm', '2014'},
['Gault et al 1975'] = {'GaultGuestMurrayDzurisin', '1975'},
['Gault et al. 1975'] = {'GaultGuestMurrayDzurisin', '1975'},
['Brooklands: Mercedes 190 & 300'] = {'Clarke', '1989'},
['Lloyd-Margaret River'] = {'Wiltshire', '2000'},
['Venice, Austria, and the Turks in the Seventeenth Century'] = {'Setton', '1991'},
['Lands of the Eastern Caliphate'] = {'Strange', '1905'},
['Brooklands: On Mercedes 1980-1987'] = {'Clarke', '1987'},
['Brooklands-MBRT80'] = {'Clarke', '1987'},
['Book-Hills-Power from Steam'] = {'Hills', '1989'},
['Arth: NSU: Alle Automobile von 1905 bis 1977'] = {'Arth', '2016'},
['Lintelmann: NSU Personenwagen: Eine Chronik'] = {'Lintelmann', '1987'},
['The Making of Byzantium, 600–1025'] = {'Whittow', '1996'},
},
patterns = {
{
{'Stern: New York', 'Cite New York 1930', 'Cite NY 1930', 'Cite NY1930', 'Cite ny1930', 'Cite ny 1930', 'Cite New York 1900', 'Cite NY 1900', 'Cite NY1900', 'Cite ny 1900', 'Cite ny1900', 'Cite New York 1960', 'Cite NY 1960', 'Cite NY1960', 'Cite ny1960', 'Cite ny 1960', 'Cite NY 1880', 'Cite NY1880', 'Cite ny 1880', 'Cite ny1880', 'Cite New York 2000', 'Cite NY 2000', 'Cite NY2000', 'Cite ny2000', 'Cite ny 2000', 'Cite New York 1880', 'Cite New York'},
{'CITEREFSternFishmanTilove2006', 'CITEREFSternFishmanTilove2025', 'CITEREFSternGilmartinMassengale1983', 'CITEREFSternGilmartinMellins1987', 'CITEREFSternMellinsFishman1995', 'CITEREFSternMellinsFishman1999'}
},
{
{'The Cambridge History of Egypt'},
{'CITEREFDaly1998', 'CITEREFPetry1998'}
},
{
{'Cite AWH'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Byzance et les Arabes'},
{'CITEREFCanard1950', 'CITEREFHonigmann1935', 'CITEREFVasiliev1935', 'CITEREFVasiliev1968'}
},
{
{'Standard Catalog of American Cars 1805-1942'},
{'CITEREFKimesJr1985', 'CITEREFKimesJr1989', 'CITEREFKimesJr1996'}
},
{
{'The Byzantine Empire, 1025–1204: A Political History'},
{'CITEREFAngold1984', 'CITEREFAngold1997'}
},
{
{'Hovannisian: The Republic of Armenia', 'Cite The Republic of Armenia Volume 1'},
{'CITEREFHovannisian1971', 'CITEREFHovannisian1982', 'CITEREFHovannisian1996a', 'CITEREFHovannisian1996b'}
},
{
{'Harry Potter reference'},
{'CITEREFRowling1997', 'CITEREFRowling1998', 'CITEREFRowling1999', 'CITEREFRowling2000', 'CITEREFRowling2001', 'CITEREFRowling2001a', 'CITEREFRowling2003', 'CITEREFRowling2005', 'CITEREFRowling2007'}
},
{
{'Census UK CoB', '2011CensusScotlandCoB', '2011CensusNICoB', '2021CensusEngWalCoB', '2021CensusNICoB', '2022CensusScotlandCoB', '2011CensusEngWalCoB'},
{'CITEREFNISRACOB2011', 'CITEREFNISRACOB2021', 'CITEREFNRSCOB2011', 'CITEREFNRSCOB2022', 'CITEREFONSCOB2011', 'CITEREFONSCOB2021'}
},
{
{'James Halliday\'s Wine Atlas of Australia'},
{'CITEREFHalliday2006', 'CITEREFHalliday2008', 'CITEREFHalliday2014'}
},
{
{'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
{'CITEREFCotsonis2020', 'CITEREFMcGeerNesbittOikonomides2001', 'CITEREFMcGeerNesbittOikonomides2005', 'CITEREFNesbittMorrisson2009', 'CITEREFNesbittOikonomides1991', 'CITEREFNesbittOikonomides1994', 'CITEREFNesbittOikonomides1996'}
},
{
{'Cite Roman Missal'},
{'CITEREFSodiTriacca2012'}
},
{
{'Hunter: Steamboats on the Western Rivers', 'Hunter-Steamboats-1993', 'Hunter-Steamboats-1949'},
{'CITEREFHunter1949', 'CITEREFHunter1993'}
},
{
{'Scharf: History of the Confederate States Navy', 'Scharf-History'},
{'CITEREFScharf1887', 'CITEREFScharf1996'}
},
{
{'Magdalino-The Empire of Manuel I Komnenos'},
{'CITEREFMagdalino1993', 'CITEREFMagdalino2002'}
},
{
{'Amacad Book of Members'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Slaves on Horses'},
{'CITEREFCrone1980', 'CITEREFCrone2003'}
},
{
{'The Cambridge History of Iran'},
{'CITEREFAveryHamblyMelville1991', 'CITEREFBoyle1968', 'CITEREFFischer1968', 'CITEREFFrye1975', 'CITEREFGershevitch1985', 'CITEREFLockhartJackson1986', 'CITEREFYarshater1983'}
},
{
{'Runciman-A History of the Crusades'},
{'CITEREFRunciman1951', 'CITEREFRunciman1952', 'CITEREFRunciman1954'}
},
{
{'Black and Bolton Biographical Register', 'Black and Bolton 2001'},
{'CITEREFBlackBolton2001a', 'CITEREFBlackBolton2001b'}
},
{
{'AF Cite Book'},
{'CITEREFColfer2001', 'CITEREFColfer2002', 'CITEREFColfer2003', 'CITEREFColfer2004', 'CITEREFColfer2005', 'CITEREFColfer2006', 'CITEREFColfer2007', 'CITEREFColfer2008', 'CITEREFColfer2010'}
},
{
{'The Breweries of Australia'},
{'CITEREFDeutsher1999', 'CITEREFDeutsher2012'}
},
{
{'Mehmed the Conqueror and His Time'},
{'CITEREFBabinger1978', 'CITEREFBabinger1992'}
},
{
{'London encyclopedia'},
{'CITEREFWeinrebHibbertKeayKeay1983', 'CITEREFWeinrebHibbertKeayKeay1993', 'CITEREFWeinrebHibbertKeayKeay2008'}
},
{
{'Canadian census corrections', '2021 Canadian census corrections', '2021CDNcc'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Oswald: Mercedes-Benz Personenwagen', 'Mercedes-Benz Personenwagen'},
{'CITEREFEngelen2002', 'CITEREFEngelen2003', 'CITEREFOswald2001d', 'CITEREFOswald2001e'}
},
{
{'Bauer: Die Straßenbahnen in Ostdeutschland'},
{'CITEREFBauerKuschinski1993', 'CITEREFBauerKuschinski1994', 'CITEREFBauerKuschinski1995'}
},
{
{'The Prophet and the Age of the Caliphates'},
{'CITEREFKennedy1986', 'CITEREFKennedy2004', 'CITEREFKennedy2016', 'CITEREFKennedy2023'}
},
{
{'Barrett: Illustrated Buyer\'s Guide Mercedes-Benz', 'Barrett: llustrated Buyer\'s Guide Mercedes-Benz'},
{'CITEREFBarrett1994', 'CITEREFBarrett1998'}
},
{
{'Porsche: Excellence Was Expected'},
{'CITEREFExcellence_was_Expected,_Book_1,2019', 'CITEREFExcellence_was_Expected,_Book_2,2019', 'CITEREFExcellence_was_Expected,_Book_3,2019', 'CITEREFExcellence_was_Expected,_Book_4,2019', 'CITEREFExcellence_was_Expected,_Vol_1,2003', 'CITEREFExcellence_was_Expected,_Vol_2,2003', 'CITEREFExcellence_was_Expected,_Vol_3,2003'}
},
{
{'British Red Data Books'},
{'CITEREFBratton1991', 'CITEREFShirt1987', 'CITEREFWigginton1999'}
},
{
{'Parliamentary manuals', 'Cite parl'},
{'CITEREFDemeter1969', 'CITEREFMason2000', 'CITEREFRiddickButcher1985', 'CITEREFRobert1876', 'CITEREFRobert1893', 'CITEREFRobert1915', 'CITEREFRobert1943', 'CITEREFRobert1951', 'CITEREFRobert1970', 'CITEREFRobert1981', 'CITEREFRobert1990', 'CITEREFRobert2000', 'CITEREFSturgis1950', 'CITEREFSturgis1965', 'CITEREFSturgis1988', 'CITEREFSturgis2001'}
},
{
{'The Last Centuries of Byzantium, 1261–1453'},
{'CITEREFNicol1972', 'CITEREFNicol1993'}
},
{
{'Ιστορία του Ελληνικού Έθνους'},
{'CITEREFChristopoulosBastias1970', 'CITEREFChristopoulosBastias1971', 'CITEREFChristopoulosBastias1972', 'CITEREFChristopoulosBastias1973', 'CITEREFChristopoulosBastias1974', 'CITEREFChristopoulosBastias1975', 'CITEREFChristopoulosBastias1976', 'CITEREFChristopoulosBastias1977', 'CITEREFChristopoulosBastias1978', 'CITEREFChristopoulosBastias1979', 'CITEREFChristopoulosBastias1980', 'CITEREFChristopoulosBastias2000'}
},
{
{'Mercedes-Benz since 1945'},
{'CITEREFTaylor1985', 'CITEREFTaylor1986', 'CITEREFTaylor1994'}
},
{
{'Mercedes-Benz The 1960s'},
{'CITEREFKoehling2021'}
},
{
{'Beaulieu Encyclopedia of the Automobile'},
{'CITEREFGeorgano2001'}
},
{
{'Imber-The Ottoman Empire, 1300–1650'},
{'CITEREFImber2002', 'CITEREFImber2009', 'CITEREFImber2019'}
},
{
{'Wisconsin History of the Crusades'},
{'CITEREFSettonBaldwin1969', 'CITEREFSettonHazard1975', 'CITEREFSettonHazard1977', 'CITEREFSettonHazardZacour1989', 'CITEREFSettonWolffHazard1969', 'CITEREFSettonZacourHazard1985'}
},
{
{'Baghdad During the Abbasid Caliphate'},
{'CITEREFStrange1900', 'CITEREFStrange1922'}
},
{
{'Höltge: Straßen und Stadtbahnen in Deutschland'},
{'CITEREFHöltge1992', 'CITEREFHöltge1994', 'CITEREFHöltge1999', 'CITEREFHöltgeKochems2006', 'CITEREFHöltgeKöhler1992', 'CITEREFKochemsHöltge2011'}
},
{
{'Varzos-Genealogy of the Komnenoi', 'Η Γενεαλογία των Κομνηνών'},
{'CITEREFVarzos,_Vol._A1,1984', 'CITEREFVarzos,_Vol._A2,1984', 'CITEREFVarzos,_Vol._B,1984'}
},
{
{'Colledge: Ships RN', 'Cite Colledge2006', 'Cite Colledge2010', 'Colledge', 'Cite Colledge2020'},
{'CITEREFColledge1969', 'CITEREFColledge1970', 'CITEREFColledge1987', 'CITEREFColledge1989', 'CITEREFColledgeWarlow2003', 'CITEREFColledgeWarlow2006', 'CITEREFColledgeWarlow2010', 'CITEREFColledgeWarlowBush2020'}
},
{
{'Hofner: Mercedes-Benz Typenkunde', 'Mercedes-Benz Typenkunde'},
{'CITEREFHofner2010a', 'CITEREFHofner2010b', 'CITEREFHofner2011'}
},
{
{'The Papacy and the Levant', 'The Papacy and the Levant, 1204–1571', 'The Papacy and the Levant, 1204-1571'},
{'CITEREFSetton1976', 'CITEREFSetton1978', 'CITEREFSetton1984', 'CITEREFSetton1984a'}
},
{
{'Azerbaijani Soviet Encyclopedia'},
{'CITEREFАСЕ1976', 'CITEREFАСЕ1978', 'CITEREFАСЕ1979', 'CITEREFАСЕ1980', 'CITEREFАСЕ1981', 'CITEREFАСЕ1982', 'CITEREFАСЕ1983', 'CITEREFАСЕ1984', 'CITEREFАСЕ1986', 'CITEREFАСЕ1987'}
},
{
{'Unbegaun: Russian Surnames', 'Unbegaun'},
{'CITEREFUnbegaun1989', 'CITEREFUnbegaun1995'}
},
{
{'The First Dynasty of Islam'},
{'CITEREFHawting1987', 'CITEREFHawting2000'}
},
{
{'Canadian census designated place results', '1996 Canadian census designated place results', '1996CDNcdplr'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Deutsche Autos', 'Oswald: Deutsche Autos'},
{'CITEREFKittler2001a', 'CITEREFKittler2001b', 'CITEREFKittler2005', 'CITEREFOswald2001a', 'CITEREFOswald2001b', 'CITEREFOswald2001c', 'CITEREFSchrader2002'}
},
{
{'Mercedes-Benz (Koch)'},
{'CITEREFKittler2002', 'CITEREFRohdeKoch2000'}
},
{
{'Biographical Dictionary of Women in Science', 'BDWS'},
{'CITEREFOgilvieHarvey2000'}
},
{
{'Barrington Atlas', 'Barrington', 'Cite Barrington'},
{'CITEREFTalbert,_Vol_12000', 'CITEREFTalbert,_Vol_22000', 'CITEREFTalbert2000'}
},
{
{'Canadian census unincorporated place results', '1951 Canadian census unincorporated place results', '2021CDNcuipr', '1956 Canadian census unincorporated place results', '1951CDNcuipr', '1956CDNcuipr', '1961 Canadian census unincorporated place results', '1966 Canadian census unincorporated place results', '1961CDNcuipr', '1966CDNcuipr', '1971 Canadian census unincorporated place results', '1971CDNcuipr', '1976 Canadian census unincorporated place results', '1976CDNcuipr', '1981 Canadian census unincorporated place results', '1981CDNcuipr', '1986 Canadian census unincorporated place results', '1986CDNcuipr', '1991 Canadian census unincorporated place results', '1991CDNcuipr', 'CDNcuipr'},
{'CITEREF.*%d%d%d%d'}
},
{
{'The Early Medieval Balkans'},
{'CITEREFFine1983', 'CITEREFFine1991'}
},
{
{'Daftary-The Ismailis'},
{'CITEREFDaftary1990', 'CITEREFDaftary2007'}
},
{
{'Baxter: British Locomotive Catalogue 1825–1923', 'Baxter-BritishLocoCat5A', 'Baxter-BritishLocoCat6', 'Baxter-BritishLocoCat3B', 'Baxter-BritishLocoCat3A', 'Baxter-BritishLocoCat4', 'Baxter-BritishLocoCat5B', 'Baxter-BritishLocoCat2B', 'Baxter-BritishLocoCat2A', 'Baxter-BritishLocoCat1', 'Baxter: British Locomotive Catalogue 1825-1923'},
{'CITEREFBaxter1977', 'CITEREFBaxter1978', 'CITEREFBaxter1979', 'CITEREFBaxter1982', 'CITEREFBaxter1982a', 'CITEREFBaxter1984', 'CITEREFBaxter1986', 'CITEREFBaxter1988', 'CITEREFBaxter2012'}
},
{
{'Standard Catalog of American Cars 1946–1975'},
{'CITEREFGunnell1982', 'CITEREFGunnell1987', 'CITEREFGunnell1992', 'CITEREFGunnell1997'}
},
{
{'Hofner: Mercedes-Benz Automobile'},
{'CITEREFHofnerSchrader2005'}
},
{
{'Eminent Scotsmen'},
{'CITEREFChambersThomson1857'}
},
{
{'Cite PHAK'},
{'CITEREF.*%d%d%d%d'}
},
}
}
return registry
0bpjvmi89k3ydtxn93vogy1zczluuf1
33078
33077
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Module:SST/registry]]
33077
Scribunto
text/plain
--[[--------------------------< S S T S _ R E G I S T R Y >----------------------------------------------
Specific-Source Template System registry (WP:SSTS)
WARNING: DO NOT EDIT THIS MODULE
This is an auto-generated compiled registry for the Specific-Source Template System (WP:SSTS).
Any manual edits made to this page WILL BE OVERWRITTEN by a bot.
If you need to correct an author, year, or citation pattern, you must edit the
specific Lua shard (module) associated with that template (e.g., Module:SST/shards/...).
This registry will automatically update at least once daily to reflect those changes.
]]
local registry = {
defaults = {
['Hovannisian: Armenian Van-Vaspurakan'] = {'Hovannisian', '2000'},
['Armenian Van-Vaspurakan 2000'] = {'Hovannisian', '2000'},
['Kittler: Mercedes-Benz Personenwagen seit 1886'] = {'Kittler', '2008'},
['Brooklands: On Mercedes Sports & GT Cars 1970-1980'] = {'Clarke', '1980'},
['Brooklands-MBRTS>C70'] = {'Clarke', '1980'},
['Nixon: Racing the Silver Arrows'] = {'Nixon', '2003'},
['Cite Wright Companion'] = {'Storrer', '1993'},
['The World\'s Writing Systems'] = {'', '1996'},
['Anoar Ali: 150th Anniversary Memorial Book 1869-2019'] = {'Ali', ''},
['150th Anniversary Memorial Book 1869-2019'] = {'Ali', ''},
['Baaden: Das neue grosse Mercedes SL'] = {'BaadenRöcke', '2002'},
['Brooklands: Mercedes-Benz 190SL 300SL 300SLR'] = {'Clarke', '2011'},
['Weber: Porsche: The Essence of Performance'] = {'Weber', '2000'},
['Sugahara: Mercedes-Benz Grand Prix Race Cars 1934–1955'] = {'Sugahara', '2004'},
['Zekulich-SpiritSwan'] = {'Zekulich', '2014'},
['O City of Byzantium'] = {'Choniates', '1984'},
['Cranswick: Porsche 928, 924, 944 and 968'] = {'Cranswick', '2008'},
['Schneider: NSU: Automobile 1905–1977'] = {'Schneider', '2008'},
['John Skylitzes: A Synopsis of Byzantine History, 811–1057'] = {'Wortley', '2010'},
['Arth: NSU-Automobile'] = {'Arth', '2015'},
['Mellon: Mercedes: Coupes 1974-84 Repair Manual'] = {'', '2001'},
['Chilton-MCSW 1974-84'] = {'', '2001'},
['Nitskey: Mercedes-Benz Production Models Book 1946-1995'] = {'Nitske', '1995'},
['Shindo: 100 sai no ryugi'] = {'Shindo', '2012'},
['100sainoryugi'] = {'Shindo', '2012'},
['Malin 1976'] = {'Malin', '1976'},
['Wirth: Mercedes-Benz Supercars'] = {'Wirth', '2012'},
['Eckert-Buildings of Michigan'] = {'Eckert', '1993'},
['Meredith: Original Mercedes SL'] = {'Meredith', '1996'},
['Clarke-AustWineCompan'] = {'Clarke', '2004'},
['AIA Guide to Boston'] = {'SouthworthSouthworth', '2008'},
['Cite aiaboston'] = {'SouthworthSouthworth', '2008'},
['Henshaw: The Ultimate Guide to SUVs and Off-Road Vehicles'] = {'Henshaw', '2005'},
['Kennedy-The Armies of the Caliphs'] = {'Kennedy', '2001'},
['Hofner: Die S-Klasse von Mercedes-Benz'] = {'Hofner', '1997'},
['Walker: NSU: The Complete Story'] = {'Walker', '2009'},
['Fletcher: The Great Tank Scandal'] = {'Fletcher', '1989a'},
['Cite AIA4'] = {'WhiteWillensky', '2000'},
['Laban: Mercedes SL Series'] = {'Laban', '1992'},
['Cite OCSC'] = {'WondrichRothbaum', '2021'},
['Cite IPH'] = {'', '2017'},
['State and Society in Fatimid Egypt'] = {'Lev', '1991'},
['The Byzantine Lady: Ten Portraits, 1250–1500'] = {'Nicol', '1994'},
['Staud: Mercedes-Benz: The Grand Cabrios & Coupes'] = {'StaudLewandowski', '2016'},
['The Governors and Judges of Egypt'] = {'Al-Kindi', '1912'},
['Holmes: Ultimate Convertibles'] = {'Holmes', '2007'},
['Häußermann: Mercedes-Benz S-Class'] = {'Häußermann', '2006b'},
['Saunders: Giants of the Seas'] = {'Saunders', '2013'},
['Saunders-Giants of the Seas'] = {'Saunders', '2013'},
['Scott-Negus-Cellar Door'] = {'ScottNegus', '2011'},
['Sessler: Mercedes-Benz SL Series'] = {'Sessler', '2011'},
['Morgan: Original Porsche 924 944 968'] = {'Morgan', '1998'},
['Byzantium and Venice: A Study in Diplomatic and Cultural Relations'] = {'Nicol', '1988'},
['Das Reich des Mahdi'] = {'Halm', '1991'},
['The Buwayhid Dynasty in Iraq'] = {'Donohue', '2003'},
['The Oxford Guide to the Uralic Languages'] = {'Bakró-NagyLaaksoSkribnik', '2022'},
['Plowman: Australian Cruise Ships'] = {'Plowman', '2007'},
['Plowman-Aust Cruise Ships'] = {'Plowman', '2007'},
['Cárdenas: 66 petites histoires du Pays Catalan'] = {'Cárdenas', '2014'},
['66 PHPC'] = {'Cárdenas', '2014'},
['The Byzantine Revival, 780–842'] = {'Treadgold', '1988'},
['Brooklands: Mercedes AMG Gold Portfolio 1983-1999'] = {'Clarke', '2007'},
['Brooklands: On Audi & Auto Union 1980'] = {'Clarke', '1986'},
['Brooklands-AAURT80'] = {'Clarke', '1986'},
['The Arab Emirates in Bagratid Armenia'] = {'Ter-Ghewondyan', '1976'},
['Botto: At This Theatre'] = {'BottoMitchell', '2002'},
['Cite ATT Broadway'] = {'BottoMitchell', '2002'},
['Taylor: Mercedes-Benz S-Class 1972-2013'] = {'Taylor', '2014'},
['Smith: Cruise Ships 2014'] = {'Smith', '2014'},
['Smith-Cruise Ships-2014'] = {'Smith', '2014'},
['Bols: Mercedes-Benz Personenwagen'] = {'Bols', '2007'},
['The Despotate of Epiros, 1267–1479'] = {'Nicol', '1984'},
['Wood: Great Marques of Germany'] = {'Wood', '1985'},
['Wilhelms 1976'] = {'Wilhelms', '1976'},
['The End of the Jihâd State'] = {'Blankinship', '1994'},
['Austen: Porsche 924 944 968'] = {'Austen', '2013'},
['Thierry: Armenian Art'] = {'Thierry', '1989'},
['Armenian Art 1989'] = {'Thierry', '1989'},
['Staud: Faszination und Mythos'] = {'StaudKittler', '2001'},
['Vivian: Porsche 924 928 944 968'] = {'Vivian', '1993'},
['Kennedy-The Great Arab Conquests'] = {'Kennedy', '2007'},
['Simon-Wines Australia'] = {'Simon', '1966'},
['Wieder: The Great American Convertible'] = {'WiederHall', '1977'},
['Leffingwell: Porsche 70 Years'] = {'Leffingwell', '2017'},
['Pitt: Porsche 924 944 968'] = {'Pitt', '2006'},
['The Byzantine Family of Kantakouzenos'] = {'Nicol', '1968'},
['Zekulich-WineWA'] = {'Zekulich', '2000'},
['Schrader: Porsche 924 944 968'] = {'Schrader', '2018'},
['Cite AIA5'] = {'WhiteWillenskyLeadon', '2010'},
['Brooklands: On Mercedes 1952-1962'] = {'Clarke', '1987'},
['Brooklands-MBRT52'] = {'Clarke', '1987'},
['Smith: Cruise Ships 2010'] = {'Smith', '2010'},
['Smith-Cruise Ships-2010'] = {'Smith', '2010'},
['The Latin Renovatio of Byzantium'] = {'Tricht', '2011'},
['Schneider: NSU Autos und Motorräder 1900–1977'] = {'Schneider', '2011'},
['Bond-Pemberton'] = {'Bond', '2008'},
['Neate-High Asia'] = {'Neate', '1989'},
['Günther: Das grosse Mercedes-SL-Buch'] = {'GüntherHübner', '1990'},
['Lederer: Mercedes-Benz Ponton & Heckflosse'] = {'Lederer', '1997'},
['Bongers: Porsche Data Book'] = {'Bongers', '2006'},
['Taylor: Mercedes-Benz: Cars of the 1990s'] = {'Taylor', '2009'},
['Geiling: NSU: Fahrzeuge'] = {'Geiling', '2009'},
['Saladin in Egypt'] = {'Lev', '1999'},
['Bosworth-The New Islamic Dynasties'] = {'Bosworth', '1996'},
['Wood: Porsche: The Legend'] = {'Wood', '1997'},
['Lintelmann: Mercedes-Benz SL'] = {'Lintelmann', '2010'},
['Book-Ahrons-British Steam Railway Locomotive'] = {'Ahrons', '1927'},
['MacLaren-Mapper of Mountains'] = {'MacLaren', '2005'},
['MacMullen: Paddle-Wheel Days in California'] = {'MacMullen', '1970'},
['MacMullen-Paddle-Wheel'] = {'MacMullen', '1970'},
['Slade: Original Mercedes-Benz Coupes'] = {'Slade', '2004'},
['A History of the Byzantine State and Society'] = {'Treadgold', '1997'},
['Églises romanes oubliées du Roussillon'] = {'Mallet', '2003'},
['Chilton: Mercedes-Benz: 1968-73'] = {'Staff', '1974'},
['Chilton-MB 1968-73'] = {'Staff', '1974'},
['Bentley: Mercedes-Benz Technical Companion'] = {'America', '2005'},
['Bentley-MB Technical'] = {'America', '2005'},
['Brooklands: Mercedes-Benz SL SLK CLK Portfolio 1990-2003'] = {'Clarke', '2004'},
['A Short History of Berkhamsted'] = {'Birtchnell', '1972'},
['Strom Trask Guest 1975'] = {'StromTraskGuest', '1975'},
['Jordan-WineWABest'] = {'Jordan', '2002'},
['Brooklands: Mercedes 230SL'] = {'Clarke', '2010'},
['Halliday-AustWineEncyc'] = {'Halliday', '2009'},
['Emperor Michael Palaeologus and the West'] = {'Geanakoplos', '1959'},
['Bass: Mercedes-Benz Pagoda 230, 250 & 280 SL'] = {'Bass', '2007'},
['Noakes: Mercedes SL Series: The Complete Story'] = {'Noakes', '2004'},
['Noakes-MSL'] = {'Noakes', '2004'},
['Schneider: NSU 1873-1984'] = {'Schneider', '1988'},
['Engelen: Mercedes-Benz C-Klasse: 201-205'] = {'Engelen', '2020'},
['McComb: Mercedes-Benz V8s'] = {'McComb', '1980'},
['The Arab Conquests in Central Asia'] = {'Gibb', '1923'},
['Ghost Towns of California'] = {'Miller', '1978'},
['Meredith: Mercedes-Benz Saloons'] = {'Meredith', '2003'},
['Mills: Stern-wheelers up Columbia'] = {'Mills', '1977'},
['Mills-Columbia'] = {'Mills', '1977'},
['Blake: Disraeli'] = {'Blake', '1966'},
['DisraeliRef'] = {'Blake', '1966'},
['Larimer: Mercedes-Benz Buyer\'s Guide'] = {'Larimer', '2004'},
['Die Provinzen des Osmanischen Reiches'] = {'Birken', '1976'},
['Davies Dwornik Gault Strom 1978'] = {'DaviesDwornikGaultStrom', '1978'},
['Brooklands: Mercedes-Benz SLs & SLCs Ultimate Portfolio 1971-1989'] = {'Clarke', '2004'},
['The Abbasid Caliphate: A History'] = {'El-Hibri', '2021'},
['Les personnages byzantins de l\'Alexiade'] = {'Skoulatos', '1980'},
['Polemis-The Doukai'] = {'Polemis', '1968'},
['Ludvigsen: German Racing Silver'] = {'Ludvigsen', '2009'},
['Ghost Towns of Northern California'] = {'VarneySusan', '2001'},
['Meredith: Mercedes-Benz SL Sports Cars'] = {'Meredith', '1999'},
['Freeman: Mercedes-Benz: 1959-70'] = {'FreemanRiveleHallinger', '1983'},
['Gordon-The Breaking of a Thousand Swords'] = {'Gordon', '2001'},
['Halliday-AustWineCompend'] = {'Halliday', '1985'},
['Strom 1979'] = {'Strom', '1979'},
['Plowman: The SITMAR Liners'] = {'Plowman', '2004'},
['Plowman-Sitmar'] = {'Plowman', '2004'},
['Book-Semmens-Goldfinch-How Steam Locomotives Really Work'] = {'SemmensGoldfinch', '2000'},
['Brooklands: Mercedes SLs & SLCs Gold Portfolio 1971-1989'] = {'Clarke', '1990'},
['Forrestal-Wineries'] = {'Forrestal', '1999'},
['Parkhouse: West Gloucester & Wye Valley Lines'] = {'Parkhouse', '2013a'},
['Book-Parkhouse-BRHIC-1'] = {'Parkhouse', '2013a'},
['Koehling: Mercedes-Benz, The Modern SL Cars'] = {'Koehling', '2013'},
['Schlegelmilch: Mercedes'] = {'SchlegelmilchLehbrinkOsterroth', '2013'},
['Schlegelmilch-M-2013'] = {'SchlegelmilchLehbrinkOsterroth', '2013'},
['Venice: A Maritime Republic'] = {'Lane', '1973'},
['Lehbrink: Faszination Mercedes'] = {'Lehbrink', '2012'},
['Bock: Japanese Film Directors'] = {'Bock', '1978'},
['Audie-bock-directors'] = {'Bock', '1978'},
['Hirsch: The Last American Convertibles'] = {'HirschWeith', '1979'},
['Nebraska Place-Names'] = {'FitzpatrickLink', '1960'},
['Book-Hansen-US Nuclear Weapons'] = {'Hansen', '1988'},
['The Muslims of Medieval Italy'] = {'Metcalfe', '2009'},
['Chapman: SUV'] = {'Chapman', '2005'},
['Byzantium Confronts the West'] = {'Brand', '1968'},
['History of Yolo County'] = {'Gregory', '1913'},
['Brooklands: On Audi & Auto Union 1952-1980'] = {'Clarke', '1986'},
['Brooklands-AAURT52'] = {'Clarke', '1986'},
['Trask and Strom 1976'] = {'TraskStrom', '1976'},
['The Imperial Administrative System of the Ninth Century'] = {'BuryPhilotheus', '1911'},
['Nicholls-The Establishment Boys'] = {'Nicholls', '2021'},
['Brooklands: On Mercedes 1963-1970'] = {'Clarke', '1987'},
['Brooklands-MBRT63'] = {'Clarke', '1987'},
['Cotton: Porsche 924, 944 & 968'] = {'Cotton', '2000'},
['Gibbs: Pacific Graveyard'] = {'Gibbs', '1992'},
['Gibbs-Graveyard'] = {'Gibbs', '1992'},
['Jackson: Japanese Super Cars'] = {'Jackson', '1992'},
['Die Kalifen von Kairo'] = {'Halm', '2003'},
['Bradsher: High and Mighty'] = {'Bradsher', '2002'},
['Vieweg: Alles über die Mercedes'] = {'Vieweg', '2000'},
['Essays on the Latin Orient'] = {'Miller', '1921'},
['Trask and Guest 1975'] = {'TraskGuest', '1975'},
['Brooklands: Mercedes SLs Performance Portfolio 1989-1994'] = {'Clarke', '1996'},
['Book-Van Riemsdijk-Compound Locomotives'] = {'Riemsdijk', '1994'},
['Fletcher: Universal Tank'] = {'Fletcher', '1989b'},
['Book-Fletcher-Universal Tank'] = {'Fletcher', '1989b'},
['Naval Wars in the Levant 1559–1853'] = {'Anderson', '1952'},
['La Morée franque'] = {'Bon', '1969'},
['The Latins in the Levant'] = {'Miller', '1908'},
['A History of Palestine, 634–1099'] = {'Gil', '1997'},
['Caro: The Power Broker'] = {'Caro', '1974'},
['Cite Power Broker'] = {'Caro', '1974'},
['Smale: Porsche 924 928 944 968'] = {'Smale', '2015'},
['Hardy-AustWinePictAtlas'] = {'Hardy', '1997'},
['The Immortal Emperor: The Life and Legend of Constantine Palaiologos, Last Emperor of the Romans'] = {'Nicol', '1992'},
['Oswald: Mercedes-Benz Personenwagen 1886-1986'] = {'Oswald', '2018'},
['Arizona SHS Interactive Map'] = {'Division', ''},
['ADOT SHS'] = {'Division', ''},
['Rybczynski2000'] = {'Rybczynski', '2000'},
['Alexander-Four Bishops'] = {'Alexander', '1957'},
['Hansen: Swords of Armageddon'] = {'Hansen', '2007'},
['Book-Hansen-Swords of Armageddon'] = {'Hansen', '2007'},
['The Late Medieval Balkans'] = {'Fine', '1994'},
['Bruno: Mercedes Benz Personenwagen 1886–1980'] = {'Bruno', '2014'},
['The Arab Kingdom and its Fall'] = {'Wellhausen', '1927'},
['Niemann: Personenwagen von Mercedes-Benz'] = {'Niemann', '2006'},
['Bass: Mercedes-Benz 280-560SL & SLC: W107 series'] = {'Bass', '2017'},
['Cole: The Classic Car Adventure'] = {'Cole', '2017'},
['Langworth: The Great American Convertible'] = {'Langworth', '1988'},
['Rocke: Das große Mercedes-S-Klasse-Buch'] = {'Röcke', '1991'},
['Schneider: Die NSU-Story'] = {'Schneider', '2012'},
['Sloniger: Porsche 924 928 944'] = {'Sloniger', '1987'},
['The Life and Times of Ali ibn Isa'] = {'Bowen', '1928'},
['Warfare, State and Society in the Byzantine World, 565–1204'] = {'Haldon', '1999'},
['Häußermann: Mercedes-Benz: The Large Coupes'] = {'Häußermann', '2006a'},
['Leffingwell: Porsche Legends'] = {'Leffingwell', '1993'},
['The Visual History of Type'] = {'McNeil', '2017'},
['Pitt: Mercedes-Benz SL & SLR'] = {'Pitt', '2009'},
['Hartmann: Das große Mercedes-Cabrio-Buch'] = {'Hartmann', '2017'},
['Cite The Age of the Galley'] = {'MorrisonGardiner', '1995'},
['Rocke: Das neue große Mercedes-S-Klasse-Buch'] = {'Röcke', '2003'},
['Genoa and the Genoese'] = {'Epstein', '1996'},
['Brooklands: Mercedes AMG Ultimate Portfolio 2000'] = {'Clarke', '2007'},
['Fuths: Porsche 924 944 968 928'] = {'Fuths', '2020'},
['Koehling: Mercedes-Benz the Early SL Cars'] = {'Koehling', '2014'},
['Steidl: NSU Personenwagen'] = {'Steidl', '2009'},
['Taylor: Factory-Original Mercedes SL'] = {'Taylor', '2013'},
['Bruse: NSU Fotoalbum 1906–1977'] = {'BruseStorz', '2010'},
['Brooklands: On Mercedes 1971-1979'] = {'Clarke', '1987'},
['Brooklands-MBRT71'] = {'Clarke', '1987'},
['The Geometrical Foundation of Natural Structure (book)'] = {'Williams', '1979'},
['Alfieri: Mercedes-Benz SL'] = {'Alfieri', '2016'},
['Kalifen und Assassinen'] = {'Halm', '2014'},
['Gault et al 1975'] = {'GaultGuestMurrayDzurisin', '1975'},
['Gault et al. 1975'] = {'GaultGuestMurrayDzurisin', '1975'},
['Brooklands: Mercedes 190 & 300'] = {'Clarke', '1989'},
['Lloyd-Margaret River'] = {'Wiltshire', '2000'},
['Venice, Austria, and the Turks in the Seventeenth Century'] = {'Setton', '1991'},
['Lands of the Eastern Caliphate'] = {'Strange', '1905'},
['Brooklands: On Mercedes 1980-1987'] = {'Clarke', '1987'},
['Brooklands-MBRT80'] = {'Clarke', '1987'},
['Book-Hills-Power from Steam'] = {'Hills', '1989'},
['Arth: NSU: Alle Automobile von 1905 bis 1977'] = {'Arth', '2016'},
['Lintelmann: NSU Personenwagen: Eine Chronik'] = {'Lintelmann', '1987'},
['The Making of Byzantium, 600–1025'] = {'Whittow', '1996'},
},
patterns = {
{
{'Stern: New York', 'Cite New York 1930', 'Cite NY 1930', 'Cite NY1930', 'Cite ny1930', 'Cite ny 1930', 'Cite New York 1900', 'Cite NY 1900', 'Cite NY1900', 'Cite ny 1900', 'Cite ny1900', 'Cite New York 1960', 'Cite NY 1960', 'Cite NY1960', 'Cite ny1960', 'Cite ny 1960', 'Cite NY 1880', 'Cite NY1880', 'Cite ny 1880', 'Cite ny1880', 'Cite New York 2000', 'Cite NY 2000', 'Cite NY2000', 'Cite ny2000', 'Cite ny 2000', 'Cite New York 1880', 'Cite New York'},
{'CITEREFSternFishmanTilove2006', 'CITEREFSternFishmanTilove2025', 'CITEREFSternGilmartinMassengale1983', 'CITEREFSternGilmartinMellins1987', 'CITEREFSternMellinsFishman1995', 'CITEREFSternMellinsFishman1999'}
},
{
{'The Cambridge History of Egypt'},
{'CITEREFDaly1998', 'CITEREFPetry1998'}
},
{
{'Cite AWH'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Byzance et les Arabes'},
{'CITEREFCanard1950', 'CITEREFHonigmann1935', 'CITEREFVasiliev1935', 'CITEREFVasiliev1968'}
},
{
{'Standard Catalog of American Cars 1805-1942'},
{'CITEREFKimesJr1985', 'CITEREFKimesJr1989', 'CITEREFKimesJr1996'}
},
{
{'The Byzantine Empire, 1025–1204: A Political History'},
{'CITEREFAngold1984', 'CITEREFAngold1997'}
},
{
{'Hovannisian: The Republic of Armenia', 'Cite The Republic of Armenia Volume 1'},
{'CITEREFHovannisian1971', 'CITEREFHovannisian1982', 'CITEREFHovannisian1996a', 'CITEREFHovannisian1996b'}
},
{
{'Harry Potter reference'},
{'CITEREFRowling1997', 'CITEREFRowling1998', 'CITEREFRowling1999', 'CITEREFRowling2000', 'CITEREFRowling2001', 'CITEREFRowling2001a', 'CITEREFRowling2003', 'CITEREFRowling2005', 'CITEREFRowling2007'}
},
{
{'Census UK CoB', '2011CensusScotlandCoB', '2011CensusNICoB', '2021CensusEngWalCoB', '2021CensusNICoB', '2022CensusScotlandCoB', '2011CensusEngWalCoB'},
{'CITEREFNISRACOB2011', 'CITEREFNISRACOB2021', 'CITEREFNRSCOB2011', 'CITEREFNRSCOB2022', 'CITEREFONSCOB2011', 'CITEREFONSCOB2021'}
},
{
{'James Halliday\'s Wine Atlas of Australia'},
{'CITEREFHalliday2006', 'CITEREFHalliday2008', 'CITEREFHalliday2014'}
},
{
{'Catalogue of Byzantine Seals at Dumbarton Oaks and in the Fogg Museum of Art'},
{'CITEREFCotsonis2020', 'CITEREFMcGeerNesbittOikonomides2001', 'CITEREFMcGeerNesbittOikonomides2005', 'CITEREFNesbittMorrisson2009', 'CITEREFNesbittOikonomides1991', 'CITEREFNesbittOikonomides1994', 'CITEREFNesbittOikonomides1996'}
},
{
{'Cite Roman Missal'},
{'CITEREFSodiTriacca2012'}
},
{
{'Hunter: Steamboats on the Western Rivers', 'Hunter-Steamboats-1993', 'Hunter-Steamboats-1949'},
{'CITEREFHunter1949', 'CITEREFHunter1993'}
},
{
{'Scharf: History of the Confederate States Navy', 'Scharf-History'},
{'CITEREFScharf1887', 'CITEREFScharf1996'}
},
{
{'Magdalino-The Empire of Manuel I Komnenos'},
{'CITEREFMagdalino1993', 'CITEREFMagdalino2002'}
},
{
{'Amacad Book of Members'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Slaves on Horses'},
{'CITEREFCrone1980', 'CITEREFCrone2003'}
},
{
{'The Cambridge History of Iran'},
{'CITEREFAveryHamblyMelville1991', 'CITEREFBoyle1968', 'CITEREFFischer1968', 'CITEREFFrye1975', 'CITEREFGershevitch1985', 'CITEREFLockhartJackson1986', 'CITEREFYarshater1983'}
},
{
{'Runciman-A History of the Crusades'},
{'CITEREFRunciman1951', 'CITEREFRunciman1952', 'CITEREFRunciman1954'}
},
{
{'Black and Bolton Biographical Register', 'Black and Bolton 2001'},
{'CITEREFBlackBolton2001a', 'CITEREFBlackBolton2001b'}
},
{
{'AF Cite Book'},
{'CITEREFColfer2001', 'CITEREFColfer2002', 'CITEREFColfer2003', 'CITEREFColfer2004', 'CITEREFColfer2005', 'CITEREFColfer2006', 'CITEREFColfer2007', 'CITEREFColfer2008', 'CITEREFColfer2010'}
},
{
{'The Breweries of Australia'},
{'CITEREFDeutsher1999', 'CITEREFDeutsher2012'}
},
{
{'Mehmed the Conqueror and His Time'},
{'CITEREFBabinger1978', 'CITEREFBabinger1992'}
},
{
{'London encyclopedia'},
{'CITEREFWeinrebHibbertKeayKeay1983', 'CITEREFWeinrebHibbertKeayKeay1993', 'CITEREFWeinrebHibbertKeayKeay2008'}
},
{
{'Canadian census corrections', '2021 Canadian census corrections', '2021CDNcc'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Oswald: Mercedes-Benz Personenwagen', 'Mercedes-Benz Personenwagen'},
{'CITEREFEngelen2002', 'CITEREFEngelen2003', 'CITEREFOswald2001d', 'CITEREFOswald2001e'}
},
{
{'Bauer: Die Straßenbahnen in Ostdeutschland'},
{'CITEREFBauerKuschinski1993', 'CITEREFBauerKuschinski1994', 'CITEREFBauerKuschinski1995'}
},
{
{'The Prophet and the Age of the Caliphates'},
{'CITEREFKennedy1986', 'CITEREFKennedy2004', 'CITEREFKennedy2016', 'CITEREFKennedy2023'}
},
{
{'Barrett: Illustrated Buyer\'s Guide Mercedes-Benz', 'Barrett: llustrated Buyer\'s Guide Mercedes-Benz'},
{'CITEREFBarrett1994', 'CITEREFBarrett1998'}
},
{
{'Porsche: Excellence Was Expected'},
{'CITEREFExcellence_was_Expected,_Book_1,2019', 'CITEREFExcellence_was_Expected,_Book_2,2019', 'CITEREFExcellence_was_Expected,_Book_3,2019', 'CITEREFExcellence_was_Expected,_Book_4,2019', 'CITEREFExcellence_was_Expected,_Vol_1,2003', 'CITEREFExcellence_was_Expected,_Vol_2,2003', 'CITEREFExcellence_was_Expected,_Vol_3,2003'}
},
{
{'British Red Data Books'},
{'CITEREFBratton1991', 'CITEREFShirt1987', 'CITEREFWigginton1999'}
},
{
{'Parliamentary manuals', 'Cite parl'},
{'CITEREFDemeter1969', 'CITEREFMason2000', 'CITEREFRiddickButcher1985', 'CITEREFRobert1876', 'CITEREFRobert1893', 'CITEREFRobert1915', 'CITEREFRobert1943', 'CITEREFRobert1951', 'CITEREFRobert1970', 'CITEREFRobert1981', 'CITEREFRobert1990', 'CITEREFRobert2000', 'CITEREFSturgis1950', 'CITEREFSturgis1965', 'CITEREFSturgis1988', 'CITEREFSturgis2001'}
},
{
{'The Last Centuries of Byzantium, 1261–1453'},
{'CITEREFNicol1972', 'CITEREFNicol1993'}
},
{
{'Ιστορία του Ελληνικού Έθνους'},
{'CITEREFChristopoulosBastias1970', 'CITEREFChristopoulosBastias1971', 'CITEREFChristopoulosBastias1972', 'CITEREFChristopoulosBastias1973', 'CITEREFChristopoulosBastias1974', 'CITEREFChristopoulosBastias1975', 'CITEREFChristopoulosBastias1976', 'CITEREFChristopoulosBastias1977', 'CITEREFChristopoulosBastias1978', 'CITEREFChristopoulosBastias1979', 'CITEREFChristopoulosBastias1980', 'CITEREFChristopoulosBastias2000'}
},
{
{'Mercedes-Benz since 1945'},
{'CITEREFTaylor1985', 'CITEREFTaylor1986', 'CITEREFTaylor1994'}
},
{
{'Mercedes-Benz The 1960s'},
{'CITEREFKoehling2021'}
},
{
{'Beaulieu Encyclopedia of the Automobile'},
{'CITEREFGeorgano2001'}
},
{
{'Imber-The Ottoman Empire, 1300–1650'},
{'CITEREFImber2002', 'CITEREFImber2009', 'CITEREFImber2019'}
},
{
{'Wisconsin History of the Crusades'},
{'CITEREFSettonBaldwin1969', 'CITEREFSettonHazard1975', 'CITEREFSettonHazard1977', 'CITEREFSettonHazardZacour1989', 'CITEREFSettonWolffHazard1969', 'CITEREFSettonZacourHazard1985'}
},
{
{'Baghdad During the Abbasid Caliphate'},
{'CITEREFStrange1900', 'CITEREFStrange1922'}
},
{
{'Höltge: Straßen und Stadtbahnen in Deutschland'},
{'CITEREFHöltge1992', 'CITEREFHöltge1994', 'CITEREFHöltge1999', 'CITEREFHöltgeKochems2006', 'CITEREFHöltgeKöhler1992', 'CITEREFKochemsHöltge2011'}
},
{
{'Varzos-Genealogy of the Komnenoi', 'Η Γενεαλογία των Κομνηνών'},
{'CITEREFVarzos,_Vol._A1,1984', 'CITEREFVarzos,_Vol._A2,1984', 'CITEREFVarzos,_Vol._B,1984'}
},
{
{'Colledge: Ships RN', 'Cite Colledge2006', 'Cite Colledge2010', 'Colledge', 'Cite Colledge2020'},
{'CITEREFColledge1969', 'CITEREFColledge1970', 'CITEREFColledge1987', 'CITEREFColledge1989', 'CITEREFColledgeWarlow2003', 'CITEREFColledgeWarlow2006', 'CITEREFColledgeWarlow2010', 'CITEREFColledgeWarlowBush2020'}
},
{
{'Hofner: Mercedes-Benz Typenkunde', 'Mercedes-Benz Typenkunde'},
{'CITEREFHofner2010a', 'CITEREFHofner2010b', 'CITEREFHofner2011'}
},
{
{'The Papacy and the Levant', 'The Papacy and the Levant, 1204–1571', 'The Papacy and the Levant, 1204-1571'},
{'CITEREFSetton1976', 'CITEREFSetton1978', 'CITEREFSetton1984', 'CITEREFSetton1984a'}
},
{
{'Azerbaijani Soviet Encyclopedia'},
{'CITEREFАСЕ1976', 'CITEREFАСЕ1978', 'CITEREFАСЕ1979', 'CITEREFАСЕ1980', 'CITEREFАСЕ1981', 'CITEREFАСЕ1982', 'CITEREFАСЕ1983', 'CITEREFАСЕ1984', 'CITEREFАСЕ1986', 'CITEREFАСЕ1987'}
},
{
{'Unbegaun: Russian Surnames', 'Unbegaun'},
{'CITEREFUnbegaun1989', 'CITEREFUnbegaun1995'}
},
{
{'The First Dynasty of Islam'},
{'CITEREFHawting1987', 'CITEREFHawting2000'}
},
{
{'Canadian census designated place results', '1996 Canadian census designated place results', '1996CDNcdplr'},
{'CITEREF.*%d%d%d%d'}
},
{
{'Deutsche Autos', 'Oswald: Deutsche Autos'},
{'CITEREFKittler2001a', 'CITEREFKittler2001b', 'CITEREFKittler2005', 'CITEREFOswald2001a', 'CITEREFOswald2001b', 'CITEREFOswald2001c', 'CITEREFSchrader2002'}
},
{
{'Mercedes-Benz (Koch)'},
{'CITEREFKittler2002', 'CITEREFRohdeKoch2000'}
},
{
{'Biographical Dictionary of Women in Science', 'BDWS'},
{'CITEREFOgilvieHarvey2000'}
},
{
{'Barrington Atlas', 'Barrington', 'Cite Barrington'},
{'CITEREFTalbert,_Vol_12000', 'CITEREFTalbert,_Vol_22000', 'CITEREFTalbert2000'}
},
{
{'Canadian census unincorporated place results', '1951 Canadian census unincorporated place results', '2021CDNcuipr', '1956 Canadian census unincorporated place results', '1951CDNcuipr', '1956CDNcuipr', '1961 Canadian census unincorporated place results', '1966 Canadian census unincorporated place results', '1961CDNcuipr', '1966CDNcuipr', '1971 Canadian census unincorporated place results', '1971CDNcuipr', '1976 Canadian census unincorporated place results', '1976CDNcuipr', '1981 Canadian census unincorporated place results', '1981CDNcuipr', '1986 Canadian census unincorporated place results', '1986CDNcuipr', '1991 Canadian census unincorporated place results', '1991CDNcuipr', 'CDNcuipr'},
{'CITEREF.*%d%d%d%d'}
},
{
{'The Early Medieval Balkans'},
{'CITEREFFine1983', 'CITEREFFine1991'}
},
{
{'Daftary-The Ismailis'},
{'CITEREFDaftary1990', 'CITEREFDaftary2007'}
},
{
{'Baxter: British Locomotive Catalogue 1825–1923', 'Baxter-BritishLocoCat5A', 'Baxter-BritishLocoCat6', 'Baxter-BritishLocoCat3B', 'Baxter-BritishLocoCat3A', 'Baxter-BritishLocoCat4', 'Baxter-BritishLocoCat5B', 'Baxter-BritishLocoCat2B', 'Baxter-BritishLocoCat2A', 'Baxter-BritishLocoCat1', 'Baxter: British Locomotive Catalogue 1825-1923'},
{'CITEREFBaxter1977', 'CITEREFBaxter1978', 'CITEREFBaxter1979', 'CITEREFBaxter1982', 'CITEREFBaxter1982a', 'CITEREFBaxter1984', 'CITEREFBaxter1986', 'CITEREFBaxter1988', 'CITEREFBaxter2012'}
},
{
{'Standard Catalog of American Cars 1946–1975'},
{'CITEREFGunnell1982', 'CITEREFGunnell1987', 'CITEREFGunnell1992', 'CITEREFGunnell1997'}
},
{
{'Hofner: Mercedes-Benz Automobile'},
{'CITEREFHofnerSchrader2005'}
},
{
{'Eminent Scotsmen'},
{'CITEREFChambersThomson1857'}
},
{
{'Cite PHAK'},
{'CITEREF.*%d%d%d%d'}
},
}
}
return registry
0bpjvmi89k3ydtxn93vogy1zczluuf1
Tempilet:Citation Style 1 link
10
2514
33079
2026-07-23T14:08:42Z
en>HouseBlaster
0
tsh
33079
wikitext
text/x-wiki
[[Help:Citation Style 1|Citation Style 1]]<noinclude>{{tsh|Cs1}}
[[Category:Documentation assistance templates]]
</noinclude>
6awezyz3mkfz82bnsllyewpxu6zn6cc
33080
33079
2026-11-11T21:18:54Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Citation_Style_1_link]]
33079
wikitext
text/x-wiki
[[Help:Citation Style 1|Citation Style 1]]<noinclude>{{tsh|Cs1}}
[[Category:Documentation assistance templates]]
</noinclude>
6awezyz3mkfz82bnsllyewpxu6zn6cc
Tempilet:Citation Style 2 link
10
2515
33081
2026-07-23T14:08:19Z
en>HouseBlaster
0
tsh
33081
wikitext
text/x-wiki
[[Help:Citation Style 2|Citation Style 2]]<noinclude>{{tsh|Cs2}}
[[Category:Documentation assistance templates]]
</noinclude>
newt7gxb92w6fp9lyd0b9gidisd48z5
33082
33081
2026-11-11T21:18:55Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Citation_Style_2_link]]
33081
wikitext
text/x-wiki
[[Help:Citation Style 2|Citation Style 2]]<noinclude>{{tsh|Cs2}}
[[Category:Documentation assistance templates]]
</noinclude>
newt7gxb92w6fp9lyd0b9gidisd48z5
Tempilet:Parameter value
10
2516
33083
2026-10-06T03:46:17Z
en>Axolitl
0
33083
wikitext
text/x-wiki
<templatestyles src="Template:Parameter value/styles.css"/><span class="tpl-pval__wrapper"><code class="tpl-pval__code" style="{{#if:{{{border|{{{b|}}}}}}|border:{{{border|{{{b|}}}}}};}} {{#if:{{{bg-color|{{{bg|}}}}}}|background-color: {{{bg-color|{{{bg|}}}}}}; color: {{Greater color contrast ratio|{{{bg-color|{{{bg|}}}}}}}};}} {{#if:{{{bg-color|{{{bg|}}}}}}|color: {{Greater color contrast ratio|{{{bg-color|{{{bg|}}}}}}}};}} {{#ifexpr:{{str len|{{{1|}}}}} > 25|white-space: wrap;|}} {{{style|}}}">{{replace|{{replace|{{replace|{{replace|{{replace|<includeonly>⊗ϑ{{{1|}}}⊗ϑ</includeonly><noinclude>value</noinclude>| |{{{space|{{{sp| }}}}}}}}|#|#}}|*|*}}|:|:}}|⊗ϑ|}}</code></span><noinclude>
{{Documentation}}
</noinclude>
49dzp9bq4lnyaqpyu50u01tawt2kdei
33084
33083
2026-11-11T21:18:55Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Parameter_value]]
33083
wikitext
text/x-wiki
<templatestyles src="Template:Parameter value/styles.css"/><span class="tpl-pval__wrapper"><code class="tpl-pval__code" style="{{#if:{{{border|{{{b|}}}}}}|border:{{{border|{{{b|}}}}}};}} {{#if:{{{bg-color|{{{bg|}}}}}}|background-color: {{{bg-color|{{{bg|}}}}}}; color: {{Greater color contrast ratio|{{{bg-color|{{{bg|}}}}}}}};}} {{#if:{{{bg-color|{{{bg|}}}}}}|color: {{Greater color contrast ratio|{{{bg-color|{{{bg|}}}}}}}};}} {{#ifexpr:{{str len|{{{1|}}}}} > 25|white-space: wrap;|}} {{{style|}}}">{{replace|{{replace|{{replace|{{replace|{{replace|<includeonly>⊗ϑ{{{1|}}}⊗ϑ</includeonly><noinclude>value</noinclude>| |{{{space|{{{sp| }}}}}}}}|#|#}}|*|*}}|:|:}}|⊗ϑ|}}</code></span><noinclude>
{{Documentation}}
</noinclude>
49dzp9bq4lnyaqpyu50u01tawt2kdei
Tempilet:Parameter value/styles.css
10
2517
33085
2026-10-06T03:45:24Z
en>Axolitl
0
Axolitl moved page [[Template:Param value/styles.css]] to [[Template:Parameter value/styles.css]] without leaving a redirect: Change to standard English spelling, spacing, and capitalization ([[WP:TPN]]): Consistent with {{[[tm:Param|Param]]}} being moved, should be the full word. If there are any objections, feel free to let me know and I will revert.
33085
sanitized-css
text/css
/* {{pp-template}} */
.tpl-pval__code {
border: thin solid var(--border-color-base, #a2a9b1);
background-color: var(--background-color-base, #fff);
color: inherit;
white-space: nowrap;
}
rkp70m4sjqnwnwnhampotk9rwsck5w7
33086
33085
2026-11-11T21:18:55Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Parameter_value/styles.css]]
33085
sanitized-css
text/css
/* {{pp-template}} */
.tpl-pval__code {
border: thin solid var(--border-color-base, #a2a9b1);
background-color: var(--background-color-base, #fff);
color: inherit;
white-space: nowrap;
}
rkp70m4sjqnwnwnhampotk9rwsck5w7
Tempilet:Respell
10
2518
33087
2017-06-22T21:11:34Z
en>Nardog
0
<includeonly>
33087
wikitext
text/x-wiki
<includeonly>{{#invoke:Respell|main}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
10gg5a0ckpnnxl2bu05fvyimn0kc69u
33088
33087
2026-11-11T21:19:42Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Respell]]
33087
wikitext
text/x-wiki
<includeonly>{{#invoke:Respell|main}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
10gg5a0ckpnnxl2bu05fvyimn0kc69u
Module:Respell
828
2519
33089
2019-08-14T17:08:51Z
en>Nardog
0
simpler
33089
Scribunto
text/plain
local p = {}
function p._main(args)
local ret = {}
for i, v in ipairs(args) do
v = mw.text.trim(v)
-- Compatibility: Ignore arguments that only contain an apostrophe
if v ~= '' and v ~= "'" then
if ret[#ret]
and not (ret[#ret]:find('_') or ret[#ret]:find('%-%)?$'))
and not (v:find('_') or v:find('^%(?%-'))
then
table.insert(ret, '-')
end
if v:find('^[%u%(%)]+$') then
v = '<span style="font-size:90%">' .. v .. '</span>'
end
table.insert(ret, v)
end
end
ret = '<i title="English pronunciation respelling">' ..
table.concat(ret):gsub('_', ' ')
-- Avoid dangling hyphens
:gsub(' %-', ' -⁠')
:gsub('^%-', '-⁠')
.. '</i>'
if args.link ~= 'no' then
ret = '[[Help:Pronunciation respelling key|' .. ret .. ']]'
end
return ret
end
function p.main(frame)
return p._main(frame:getParent().args)
end
return p
htpmgpv11yz1k327zvrcx0cmq7gk1mz
33090
33089
2026-11-11T21:19:42Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Respell]]
33089
Scribunto
text/plain
local p = {}
function p._main(args)
local ret = {}
for i, v in ipairs(args) do
v = mw.text.trim(v)
-- Compatibility: Ignore arguments that only contain an apostrophe
if v ~= '' and v ~= "'" then
if ret[#ret]
and not (ret[#ret]:find('_') or ret[#ret]:find('%-%)?$'))
and not (v:find('_') or v:find('^%(?%-'))
then
table.insert(ret, '-')
end
if v:find('^[%u%(%)]+$') then
v = '<span style="font-size:90%">' .. v .. '</span>'
end
table.insert(ret, v)
end
end
ret = '<i title="English pronunciation respelling">' ..
table.concat(ret):gsub('_', ' ')
-- Avoid dangling hyphens
:gsub(' %-', ' -⁠')
:gsub('^%-', '-⁠')
.. '</i>'
if args.link ~= 'no' then
ret = '[[Help:Pronunciation respelling key|' .. ret .. ']]'
end
return ret
end
function p.main(frame)
return p._main(frame:getParent().args)
end
return p
htpmgpv11yz1k327zvrcx0cmq7gk1mz
Tempilet:Cob
10
2520
33093
2022-10-07T15:01:20Z
en>DatGuy
0
+r from template shortcut
33093
wikitext
text/x-wiki
#REDIRECT [[Template:Collapse bottom]]
{{Redirect category shell|
{{R from template shortcut}}
}}
3d6oqacw9gyw0g19gkxpme68i2qnh2o
33094
33093
2026-11-11T21:19:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Cob]]
33093
wikitext
text/x-wiki
#REDIRECT [[Template:Collapse bottom]]
{{Redirect category shell|
{{R from template shortcut}}
}}
3d6oqacw9gyw0g19gkxpme68i2qnh2o
Module:Transclusion count/data/R
828
2521
33095
2026-10-18T05:11:26Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33095
Scribunto
text/plain
return {
["R"] = 37000,
["R/superscript"] = 81000,
["R/where"] = 81000,
["RA"] = 11000,
["RCS"] = 5900,
["REVISIONUSER2"] = 59000,
["RMS"] = 6400,
["RMnac"] = 3200,
["ROM"] = 2700,
["ROU"] = 7500,
["RSA"] = 5200,
["RSS-Atom_feed_notice"] = 222000,
["RTGS"] = 2900,
["RT_data"] = 4200,
["RUS"] = 15000,
["R_Wikidata"] = 2300,
["R_alt"] = 3100,
["R_ambig"] = 16000,
["R_avoided_double_redirect"] = 205000,
["R_cat_shell"] = 12000,
["R_category_shell"] = 15000,
["R_from_ASCII-only"] = 246000,
["R_from_ATC_code"] = 4700,
["R_from_ATCvet_code"] = 5400,
["R_from_British_English"] = 3200,
["R_from_DOI_prefix"] = 7800,
["R_from_IMO_number"] = 4500,
["R_from_ISO_4"] = 42000,
["R_from_ISO_4_abbreviation"] = 47000,
["R_from_ISO_639"] = 8600,
["R_from_ISO_639_code"] = 8800,
["R_from_NLM"] = 4600,
["R_from_NLM_abbreviation"] = 4700,
["R_from_UK_road"] = 3000,
["R_from_UN/LOCODE"] = 7100,
["R_from_US_postal_abbreviation"] = 44000,
["R_from_Unicode"] = 28000,
["R_from_Unicode_character"] = 32000,
["R_from_abbreviation"] = 28000,
["R_from_acronym"] = 3000,
["R_from_adjective"] = 7900,
["R_from_airport_code"] = 7000,
["R_from_album"] = 18000,
["R_from_alt_name"] = 5800,
["R_from_alternate_name"] = 20000,
["R_from_alternate_spelling"] = 7200,
["R_from_alternative_capitalisation"] = 9100,
["R_from_alternative_capitalization"] = 4600,
["R_from_alternative_disambiguation"] = 6300,
["R_from_alternative_hyphenation"] = 328000,
["R_from_alternative_language"] = 91000,
["R_from_alternative_name"] = 303000,
["R_from_alternative_punctuation"] = 34000,
["R_from_alternative_scientific_name"] = 161000,
["R_from_alternative_spacing"] = 16000,
["R_from_alternative_spelling"] = 80000,
["R_from_alternative_title"] = 10000,
["R_from_alternative_transliteration"] = 7600,
["R_from_ambiguous"] = 3000,
["R_from_ambiguous_page"] = 7800,
["R_from_ambiguous_sort_name"] = 40000,
["R_from_ambiguous_term"] = 55000,
["R_from_avoided_double_redirect"] = 7700,
["R_from_birth_name"] = 14000,
["R_from_book"] = 5600,
["R_from_case_citation"] = 3300,
["R_from_category_navigation"] = 4400,
["R_from_chemical_formula"] = 9200,
["R_from_comment_subpage"] = 22000,
["R_from_diacritic"] = 11000,
["R_from_diacritics"] = 2100,
["R_from_disambiguation"] = 2000,
["R_from_domain_name"] = 17000,
["R_from_draft"] = 4000,
["R_from_draft_namespace"] = 6100,
["R_from_drug_trade_name"] = 23000,
["R_from_emoji"] = 3400,
["R_from_fictional_character"] = 57000,
["R_from_fictional_element"] = 5700,
["R_from_fictional_location"] = 2300,
["R_from_film"] = 2100,
["R_from_former_name"] = 33000,
["R_from_full_name"] = 13000,
["R_from_gene_symbol"] = 11000,
["R_from_given_name"] = 3400,
["R_from_incomplete_disambiguation"] = 62000,
["R_from_incomplete_name"] = 2600,
["R_from_incorrect_disambiguation"] = 5700,
["R_from_incorrect_name"] = 14000,
["R_from_initialism"] = 29000,
["R_from_initials"] = 5700,
["R_from_legislation"] = 3300,
["R_from_less_specific_name"] = 5200,
["R_from_list_topic"] = 21000,
["R_from_long"] = 7100,
["R_from_long_name"] = 111000,
["R_from_longer_name"] = 17000,
["R_from_member"] = 6800,
["R_from_merge"] = 79000,
["R_from_miscapitalisation"] = 43000,
["R_from_miscapitalization"] = 5900,
["R_from_misspelling"] = 69000,
["R_from_mod"] = 2300,
["R_from_modification"] = 466000,
["R_from_molecular_formula"] = 6800,
["R_from_monotypic_taxon"] = 8100,
["R_from_more_specific_geographic_name"] = 2900,
["R_from_more_specific_name"] = 6500,
["R_from_move"] = 3080000,
["R_from_move/except"] = 3080000,
["R_from_name_with_title"] = 6700,
["R_from_nickname"] = 3200,
["R_from_old_AfC_draft"] = 29000,
["R_from_other_capitalisation"] = 418000,
["R_from_other_capitalization"] = 6500,
["R_from_other_disambiguation"] = 21000,
["R_from_other_language"] = 2900,
["R_from_other_name"] = 8100,
["R_from_other_punctuation"] = 2000,
["R_from_other_spelling"] = 2800,
["R_from_person"] = 14000,
["R_from_personal_name"] = 3200,
["R_from_plural"] = 39000,
["R_from_product_name"] = 2600,
["R_from_pseudonym"] = 3000,
["R_from_railroad_name_with_ampersand"] = 2300,
["R_from_related_term"] = 2200,
["R_from_related_topic"] = 7200,
["R_from_related_word"] = 18000,
["R_from_remote_page"] = 12000,
["R_from_remote_talk_page"] = 33000,
["R_from_school"] = 3600,
["R_from_scientific_name"] = 36000,
["R_from_short"] = 6600,
["R_from_short_name"] = 119000,
["R_from_shortcut"] = 48000,
["R_from_shorter_name"] = 2500,
["R_from_shorter_title"] = 5200,
["R_from_song"] = 60000,
["R_from_sort_name"] = 189000,
["R_from_species_to_genus"] = 4900,
["R_from_stylization"] = 2000,
["R_from_subpage"] = 41000,
["R_from_subtopic"] = 84000,
["R_from_surname"] = 34000,
["R_from_symbol"] = 3100,
["R_from_synonym"] = 6600,
["R_from_taxonomic_synonym"] = 2500,
["R_from_television_episode"] = 64000,
["R_from_template_shortcut"] = 4700,
["R_from_title_with_diacritics"] = 5800,
["R_from_title_without_diacritics"] = 391000,
["R_from_trade_name"] = 23000,
["R_from_typo"] = 4200,
["R_from_unnecessary_disambiguation"] = 49000,
["R_from_work"] = 3000,
["R_from_year"] = 4100,
["R_hatnote"] = 3000,
["R_list_topic"] = 11000,
["R_mentioned_in_hatnote"] = 13000,
["R_miscap"] = 3000,
["R_move"] = 2300,
["R_printworthy"] = 95000,
["R_protected"] = 11000,
["R_protected/excon"] = 2600,
["R_protected/semi"] = 6400,
["R_sect"] = 3500,
["R_section"] = 24000,
["R_shell"] = 22000,
["R_to_Swiss_municipality_(,_Switzerland)"] = 2300,
["R_to_Swiss_municipality_(canton)"] = 3500,
["R_to_Swiss_municipality_2L"] = 2600,
["R_to_TV_episode_list_entry"] = 9100,
["R_to_alternative_scientific_name"] = 3200,
["R_to_anchor"] = 115000,
["R_to_category_namespace"] = 25000,
["R_to_century"] = 2700,
["R_to_diacritic"] = 422000,
["R_to_diacritics"] = 4000,
["R_to_disambiguation"] = 4000,
["R_to_disambiguation_page"] = 290000,
["R_to_help_namespace"] = 3100,
["R_to_list"] = 39000,
["R_to_list_entry"] = 95000,
["R_to_main_namespace"] = 4800,
["R_to_monotypic_taxon"] = 17000,
["R_to_plural"] = 5000,
["R_to_project"] = 2600,
["R_to_project_namespace"] = 28000,
["R_to_redirect_template"] = 3400,
["R_to_related_topic"] = 97000,
["R_to_scientific_name"] = 105000,
["R_to_section"] = 432000,
["R_to_short_name"] = 4400,
["R_to_stub_template"] = 5000,
["R_to_subpage"] = 8000,
["R_to_subtopic"] = 4200,
["R_to_talk_page"] = 2200,
["R_to_template_namespace"] = 2200,
["R_to_transliteration"] = 15000,
["R_to_user_namespace"] = 3400,
["R_unprintworthy"] = 100000,
["R_with_Wikidata_item"] = 52000,
["R_with_history"] = 22000,
["R_with_possibilities"] = 128000,
["Racing-Reference_driver"] = 2900,
["Radio_Relay"] = 3600,
["Radio_formats"] = 11000,
["Rail-interchange"] = 42000,
["RailGauge"] = 10000,
["Rail_color"] = 38000,
["Rail_color_box"] = 15000,
["Rail_icon"] = 23000,
["Rail_line"] = 9700,
["Rail_navbox_titlestyle"] = 14000,
["Rail_pass_box"] = 18000,
["Rail_start"] = 2100,
["Rail_template_doc"] = 2300,
["Railway-routemap"] = 4700,
["Railway_division_link"] = 5000,
["Railway_stations_in_countryname_opened_in_YYYY_category_header"] = 3100,
["Railway_stations_in_countryname_opened_or_closed_in_YYYY_category_header"] = 5400,
["Railway_stations_in_countryname_opened_or_closed_in_YYYY_category_header/core"] = 5400,
["Rand"] = 5400,
["Random_number"] = 5700,
["Random_page_in_category"] = 5700,
["Random_subpage"] = 7800,
["Ranking_movements"] = 4800,
["Rating"] = 102000,
["Rating-Christgau"] = 2700,
["Rayment"] = 2000,
["Rayment-hc"] = 6400,
["Razavi_Khorasan_Province"] = 2400,
["Rbox"] = 2200,
["Rcat"] = 6300,
["Rcat_shell"] = 272000,
["Rcatsh"] = 9800,
["Rcatshell"] = 6500,
["Rcb"] = 10000,
["Rcr"] = 30000,
["Rcs"] = 5000,
["Re"] = 89000,
["Recent_AfDs"] = 5500,
["Recent_AfDs/core"] = 5500,
["Red"] = 53000,
["Redacted"] = 3300,
["Redirect"] = 62000,
["Redirect-Class"] = 13000,
["Redirect-distinguish"] = 5300,
["Redirect_category"] = 5100,
["Redirect_category_shell"] = 4250000,
["Redirect_from_modification"] = 3200,
["Redirect_from_move"] = 3700,
["Redirect_italic_title"] = 2100,
["Redirect_shell"] = 327000,
["Redirect_template"] = 7950000,
["Redirect_to_section"] = 3600,
["Redr"] = 9300,
["Ref"] = 24000,
["Ref."] = 2400,
["Ref_heading"] = 2700,
["Ref_improve"] = 2500,
["Ref_label"] = 13000,
["Refbegin"] = 226000,
["Refbegin/styles.css"] = 226000,
["Refend"] = 226000,
["Reference_column_heading"] = 12000,
["Reference_page"] = 81000,
["Refh"] = 5000,
["Refideas"] = 31000,
["Refimprove"] = 76000,
["Reflist"] = 6590000,
["Reflist-talk"] = 119000,
["Reflist-talk/styles.css"] = 120000,
["Reflist/styles.css"] = 6590000,
["Reflist_talk"] = 7900,
["Refn"] = 43000,
["Reftalk"] = 9600,
["Region_history_sidebar_title"] = 5900,
["Registration_required"] = 7800,
["Reign"] = 6000,
["Related_molecular_formulas"] = 2400,
["ReleaseVersionParameters"] = 2100,
["Release_version_parameters"] = 2100,
["Reliable_sources_for_medical_articles"] = 14000,
["Remove_accents"] = 9000,
["Remove_file_prefix"] = 2200,
["Remove_first_word"] = 191000,
["Remove_last_word"] = 21000,
["Repeat_vandal"] = 2700,
["Repeated_IP_abuse"] = 5200,
["Repeatvandal"] = 2200,
["Replace"] = 1080000,
["Reply"] = 24000,
["Reply_to"] = 375000,
["Replyto"] = 20000,
["Republican_Party_(US)/meta/shading"] = 19000,
["Reqmapin"] = 2500,
["Reqphoto"] = 70000,
["Request_and_endorse"] = 2500,
["Request_edit_button"] = 13000,
["Request_edit_button/styles.css"] = 13000,
["Requestandendorse"] = 2500,
["Resbox"] = 3400,
["Resize"] = 154000,
["Resizediv"] = 14000,
["Resolve_category_redirect"] = 1390000,
["Resolved"] = 18000,
["Respell"] = 25000,
["Respond"] = 77000,
["Resume-like"] = 4300,
["Retired"] = 11000,
["Retrieved"] = 3200,
["Reverse_date"] = 58000,
["Reviewer_topicon"] = 2700,
["RfA_watchlist_notice"] = 7300,
["Rfc_top"] = 2900,
["Rfd_log_header"] = 7400,
["Ribbon_devices"] = 5300,
["Ribbon_devices/alt"] = 5200,
["Ribbon_devices/device"] = 4100,
["Ribbon_devices/device_layout"] = 4100,
["Ric"] = 17000,
["Right"] = 6600,
["Right-pointing_double_angles"] = 2500,
["Right_angles"] = 2500,
["Right_ascension"] = 11000,
["Rint"] = 31000,
["Rlp"] = 11000,
["Rlp/Positions"] = 11000,
["Rmri"] = 4000,
["Rnd"] = 8400,
["Rollback_topicon"] = 3300,
["Roman"] = 3600,
["Romania_metadata_Wikidata"] = 3200,
["RomanianSoccer"] = 2400,
["Rotten-tomatoes"] = 9100,
["Rotten_Tomatoes"] = 26000,
["Rotten_Tomatoes_data"] = 6700,
["Rotten_Tomatoes_prose"] = 6800,
["Round"] = 61000,
["Round4-with_third"] = 3500,
["Round_corners"] = 9600,
["Rounddown"] = 4000,
["RouteBox"] = 9600,
["Routemap"] = 30000,
["Routemap/embeded_text"] = 9500,
["Routemap/if_empty_codes"] = 5100,
["Routemap/styles.css"] = 31000,
["RoutemapRouteIcon"] = 4100,
["Row_hover_highlight"] = 2900,
["Row_hover_highlight/styles.css"] = 2900,
["Royal_Australian_Navy_ship"] = 6700,
["Royal_Canadian_Navy_ship"] = 5300,
["Royal_Mail_ship"] = 6400,
["Royal_Netherlands_Navy_ship"] = 3300,
["Rp"] = 78000,
["Rshell"] = 10000,
["Rtl-para"] = 2100,
["Rto"] = 3600,
["Ru"] = 3700,
["Ru-census"] = 7500,
["Ru-census2002"] = 5700,
["Ru-census2010"] = 7500,
["Ru-pop-ref"] = 9900,
["Rugby_box"] = 3600,
["Rugby_league_positions"] = 11000,
["Rugby_league_positions/Positions"] = 11000,
["Rugby_league_records"] = 2000,
["Rugby_league_squad2_coach"] = 2900,
["Rugby_league_squad2_player"] = 2100,
["Rugby_union"] = 3700,
["Rugby_union_team"] = 5300,
["Rugby_union_team/link"] = 5300,
["Rugbybox"] = 3600,
["Runner-up"] = 2000,
["RussiaAdmMunRef"] = 5800,
["Russia_Time_Zone_Wikidata"] = 6700,
["Russia_Time_Zone_Wikidata/getQID"] = 6500,
["Russia_by_federal_subject_category_navigation"] = 3000,
["Rut"] = 5300,
["Rwd"] = 5000,
["Rws"] = 27000,
["Module:R"] = 93000,
["Module:R_avoided_double_redirect"] = 205000,
["Module:Rail-interchange_multi"] = 15000,
["Module:Random"] = 13000,
["Module:Ranking_movements"] = 4800,
["Module:Ranking_movements/styles.css"] = 4800,
["Module:Redirect"] = 5100000,
["Module:Redirect-distinguish"] = 5300,
["Module:RedirectData"] = 48000,
["Module:Redirect_hatnote"] = 65000,
["Module:Redirect_template"] = 7950000,
["Module:Redirect_template_handler"] = 30000,
["Module:Reply_to"] = 375000,
["Module:ResolveEntityId"] = 506000,
["Module:Resolve_category_redirect"] = 1790000,
["Module:Respell"] = 25000,
["Module:Rivals.com_recruit_url"] = 2500,
["Module:Road_data"] = 18000,
["Module:Road_data/RJL_types"] = 17000,
["Module:Road_data/banners/USA"] = 9500,
["Module:Road_data/browse"] = 18000,
["Module:Road_data/browsetable"] = 18000,
["Module:Road_data/browsetable/styles.css"] = 18000,
["Module:Road_data/countrymask"] = 36000,
["Module:Road_data/extra"] = 33000,
["Module:Road_data/locations"] = 12000,
["Module:Road_data/parser"] = 43000,
["Module:Road_data/parser/hooks"] = 20000,
["Module:Road_data/parser/namespace"] = 4300,
["Module:Road_data/size"] = 18000,
["Module:Road_data/strings/ASIA"] = 9100,
["Module:Road_data/strings/CAN"] = 5000,
["Module:Road_data/strings/EUR"] = 5800,
["Module:Road_data/strings/IND"] = 2300,
["Module:Road_data/strings/JPN"] = 3500,
["Module:Road_data/strings/USA"] = 21000,
["Module:Road_data/strings/USA/regional/GRR"] = 21000,
["Module:Road_data/strings/USA/regional/NER"] = 21000,
["Module:Road_data/strings/USA/regional/Tour"] = 21000,
["Module:Road_data/strings/USA/regional/Trails"] = 21000,
["Module:Road_data/util"] = 44000,
["Module:Roman"] = 6400,
["Module:Rotten_Tomatoes_data"] = 6700,
["Module:RoundN"] = 14000,
["Module:Routemap"] = 31000,
["Module:Rugby_box"] = 3600,
["Module:Russia_by_federal_subject_category_navigation"] = 3000,
}
7907x278lpo5gsgxwgru7gt6aw1lb34
33096
33095
2026-11-11T21:19:43Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/R]]
33095
Scribunto
text/plain
return {
["R"] = 37000,
["R/superscript"] = 81000,
["R/where"] = 81000,
["RA"] = 11000,
["RCS"] = 5900,
["REVISIONUSER2"] = 59000,
["RMS"] = 6400,
["RMnac"] = 3200,
["ROM"] = 2700,
["ROU"] = 7500,
["RSA"] = 5200,
["RSS-Atom_feed_notice"] = 222000,
["RTGS"] = 2900,
["RT_data"] = 4200,
["RUS"] = 15000,
["R_Wikidata"] = 2300,
["R_alt"] = 3100,
["R_ambig"] = 16000,
["R_avoided_double_redirect"] = 205000,
["R_cat_shell"] = 12000,
["R_category_shell"] = 15000,
["R_from_ASCII-only"] = 246000,
["R_from_ATC_code"] = 4700,
["R_from_ATCvet_code"] = 5400,
["R_from_British_English"] = 3200,
["R_from_DOI_prefix"] = 7800,
["R_from_IMO_number"] = 4500,
["R_from_ISO_4"] = 42000,
["R_from_ISO_4_abbreviation"] = 47000,
["R_from_ISO_639"] = 8600,
["R_from_ISO_639_code"] = 8800,
["R_from_NLM"] = 4600,
["R_from_NLM_abbreviation"] = 4700,
["R_from_UK_road"] = 3000,
["R_from_UN/LOCODE"] = 7100,
["R_from_US_postal_abbreviation"] = 44000,
["R_from_Unicode"] = 28000,
["R_from_Unicode_character"] = 32000,
["R_from_abbreviation"] = 28000,
["R_from_acronym"] = 3000,
["R_from_adjective"] = 7900,
["R_from_airport_code"] = 7000,
["R_from_album"] = 18000,
["R_from_alt_name"] = 5800,
["R_from_alternate_name"] = 20000,
["R_from_alternate_spelling"] = 7200,
["R_from_alternative_capitalisation"] = 9100,
["R_from_alternative_capitalization"] = 4600,
["R_from_alternative_disambiguation"] = 6300,
["R_from_alternative_hyphenation"] = 328000,
["R_from_alternative_language"] = 91000,
["R_from_alternative_name"] = 303000,
["R_from_alternative_punctuation"] = 34000,
["R_from_alternative_scientific_name"] = 161000,
["R_from_alternative_spacing"] = 16000,
["R_from_alternative_spelling"] = 80000,
["R_from_alternative_title"] = 10000,
["R_from_alternative_transliteration"] = 7600,
["R_from_ambiguous"] = 3000,
["R_from_ambiguous_page"] = 7800,
["R_from_ambiguous_sort_name"] = 40000,
["R_from_ambiguous_term"] = 55000,
["R_from_avoided_double_redirect"] = 7700,
["R_from_birth_name"] = 14000,
["R_from_book"] = 5600,
["R_from_case_citation"] = 3300,
["R_from_category_navigation"] = 4400,
["R_from_chemical_formula"] = 9200,
["R_from_comment_subpage"] = 22000,
["R_from_diacritic"] = 11000,
["R_from_diacritics"] = 2100,
["R_from_disambiguation"] = 2000,
["R_from_domain_name"] = 17000,
["R_from_draft"] = 4000,
["R_from_draft_namespace"] = 6100,
["R_from_drug_trade_name"] = 23000,
["R_from_emoji"] = 3400,
["R_from_fictional_character"] = 57000,
["R_from_fictional_element"] = 5700,
["R_from_fictional_location"] = 2300,
["R_from_film"] = 2100,
["R_from_former_name"] = 33000,
["R_from_full_name"] = 13000,
["R_from_gene_symbol"] = 11000,
["R_from_given_name"] = 3400,
["R_from_incomplete_disambiguation"] = 62000,
["R_from_incomplete_name"] = 2600,
["R_from_incorrect_disambiguation"] = 5700,
["R_from_incorrect_name"] = 14000,
["R_from_initialism"] = 29000,
["R_from_initials"] = 5700,
["R_from_legislation"] = 3300,
["R_from_less_specific_name"] = 5200,
["R_from_list_topic"] = 21000,
["R_from_long"] = 7100,
["R_from_long_name"] = 111000,
["R_from_longer_name"] = 17000,
["R_from_member"] = 6800,
["R_from_merge"] = 79000,
["R_from_miscapitalisation"] = 43000,
["R_from_miscapitalization"] = 5900,
["R_from_misspelling"] = 69000,
["R_from_mod"] = 2300,
["R_from_modification"] = 466000,
["R_from_molecular_formula"] = 6800,
["R_from_monotypic_taxon"] = 8100,
["R_from_more_specific_geographic_name"] = 2900,
["R_from_more_specific_name"] = 6500,
["R_from_move"] = 3080000,
["R_from_move/except"] = 3080000,
["R_from_name_with_title"] = 6700,
["R_from_nickname"] = 3200,
["R_from_old_AfC_draft"] = 29000,
["R_from_other_capitalisation"] = 418000,
["R_from_other_capitalization"] = 6500,
["R_from_other_disambiguation"] = 21000,
["R_from_other_language"] = 2900,
["R_from_other_name"] = 8100,
["R_from_other_punctuation"] = 2000,
["R_from_other_spelling"] = 2800,
["R_from_person"] = 14000,
["R_from_personal_name"] = 3200,
["R_from_plural"] = 39000,
["R_from_product_name"] = 2600,
["R_from_pseudonym"] = 3000,
["R_from_railroad_name_with_ampersand"] = 2300,
["R_from_related_term"] = 2200,
["R_from_related_topic"] = 7200,
["R_from_related_word"] = 18000,
["R_from_remote_page"] = 12000,
["R_from_remote_talk_page"] = 33000,
["R_from_school"] = 3600,
["R_from_scientific_name"] = 36000,
["R_from_short"] = 6600,
["R_from_short_name"] = 119000,
["R_from_shortcut"] = 48000,
["R_from_shorter_name"] = 2500,
["R_from_shorter_title"] = 5200,
["R_from_song"] = 60000,
["R_from_sort_name"] = 189000,
["R_from_species_to_genus"] = 4900,
["R_from_stylization"] = 2000,
["R_from_subpage"] = 41000,
["R_from_subtopic"] = 84000,
["R_from_surname"] = 34000,
["R_from_symbol"] = 3100,
["R_from_synonym"] = 6600,
["R_from_taxonomic_synonym"] = 2500,
["R_from_television_episode"] = 64000,
["R_from_template_shortcut"] = 4700,
["R_from_title_with_diacritics"] = 5800,
["R_from_title_without_diacritics"] = 391000,
["R_from_trade_name"] = 23000,
["R_from_typo"] = 4200,
["R_from_unnecessary_disambiguation"] = 49000,
["R_from_work"] = 3000,
["R_from_year"] = 4100,
["R_hatnote"] = 3000,
["R_list_topic"] = 11000,
["R_mentioned_in_hatnote"] = 13000,
["R_miscap"] = 3000,
["R_move"] = 2300,
["R_printworthy"] = 95000,
["R_protected"] = 11000,
["R_protected/excon"] = 2600,
["R_protected/semi"] = 6400,
["R_sect"] = 3500,
["R_section"] = 24000,
["R_shell"] = 22000,
["R_to_Swiss_municipality_(,_Switzerland)"] = 2300,
["R_to_Swiss_municipality_(canton)"] = 3500,
["R_to_Swiss_municipality_2L"] = 2600,
["R_to_TV_episode_list_entry"] = 9100,
["R_to_alternative_scientific_name"] = 3200,
["R_to_anchor"] = 115000,
["R_to_category_namespace"] = 25000,
["R_to_century"] = 2700,
["R_to_diacritic"] = 422000,
["R_to_diacritics"] = 4000,
["R_to_disambiguation"] = 4000,
["R_to_disambiguation_page"] = 290000,
["R_to_help_namespace"] = 3100,
["R_to_list"] = 39000,
["R_to_list_entry"] = 95000,
["R_to_main_namespace"] = 4800,
["R_to_monotypic_taxon"] = 17000,
["R_to_plural"] = 5000,
["R_to_project"] = 2600,
["R_to_project_namespace"] = 28000,
["R_to_redirect_template"] = 3400,
["R_to_related_topic"] = 97000,
["R_to_scientific_name"] = 105000,
["R_to_section"] = 432000,
["R_to_short_name"] = 4400,
["R_to_stub_template"] = 5000,
["R_to_subpage"] = 8000,
["R_to_subtopic"] = 4200,
["R_to_talk_page"] = 2200,
["R_to_template_namespace"] = 2200,
["R_to_transliteration"] = 15000,
["R_to_user_namespace"] = 3400,
["R_unprintworthy"] = 100000,
["R_with_Wikidata_item"] = 52000,
["R_with_history"] = 22000,
["R_with_possibilities"] = 128000,
["Racing-Reference_driver"] = 2900,
["Radio_Relay"] = 3600,
["Radio_formats"] = 11000,
["Rail-interchange"] = 42000,
["RailGauge"] = 10000,
["Rail_color"] = 38000,
["Rail_color_box"] = 15000,
["Rail_icon"] = 23000,
["Rail_line"] = 9700,
["Rail_navbox_titlestyle"] = 14000,
["Rail_pass_box"] = 18000,
["Rail_start"] = 2100,
["Rail_template_doc"] = 2300,
["Railway-routemap"] = 4700,
["Railway_division_link"] = 5000,
["Railway_stations_in_countryname_opened_in_YYYY_category_header"] = 3100,
["Railway_stations_in_countryname_opened_or_closed_in_YYYY_category_header"] = 5400,
["Railway_stations_in_countryname_opened_or_closed_in_YYYY_category_header/core"] = 5400,
["Rand"] = 5400,
["Random_number"] = 5700,
["Random_page_in_category"] = 5700,
["Random_subpage"] = 7800,
["Ranking_movements"] = 4800,
["Rating"] = 102000,
["Rating-Christgau"] = 2700,
["Rayment"] = 2000,
["Rayment-hc"] = 6400,
["Razavi_Khorasan_Province"] = 2400,
["Rbox"] = 2200,
["Rcat"] = 6300,
["Rcat_shell"] = 272000,
["Rcatsh"] = 9800,
["Rcatshell"] = 6500,
["Rcb"] = 10000,
["Rcr"] = 30000,
["Rcs"] = 5000,
["Re"] = 89000,
["Recent_AfDs"] = 5500,
["Recent_AfDs/core"] = 5500,
["Red"] = 53000,
["Redacted"] = 3300,
["Redirect"] = 62000,
["Redirect-Class"] = 13000,
["Redirect-distinguish"] = 5300,
["Redirect_category"] = 5100,
["Redirect_category_shell"] = 4250000,
["Redirect_from_modification"] = 3200,
["Redirect_from_move"] = 3700,
["Redirect_italic_title"] = 2100,
["Redirect_shell"] = 327000,
["Redirect_template"] = 7950000,
["Redirect_to_section"] = 3600,
["Redr"] = 9300,
["Ref"] = 24000,
["Ref."] = 2400,
["Ref_heading"] = 2700,
["Ref_improve"] = 2500,
["Ref_label"] = 13000,
["Refbegin"] = 226000,
["Refbegin/styles.css"] = 226000,
["Refend"] = 226000,
["Reference_column_heading"] = 12000,
["Reference_page"] = 81000,
["Refh"] = 5000,
["Refideas"] = 31000,
["Refimprove"] = 76000,
["Reflist"] = 6590000,
["Reflist-talk"] = 119000,
["Reflist-talk/styles.css"] = 120000,
["Reflist/styles.css"] = 6590000,
["Reflist_talk"] = 7900,
["Refn"] = 43000,
["Reftalk"] = 9600,
["Region_history_sidebar_title"] = 5900,
["Registration_required"] = 7800,
["Reign"] = 6000,
["Related_molecular_formulas"] = 2400,
["ReleaseVersionParameters"] = 2100,
["Release_version_parameters"] = 2100,
["Reliable_sources_for_medical_articles"] = 14000,
["Remove_accents"] = 9000,
["Remove_file_prefix"] = 2200,
["Remove_first_word"] = 191000,
["Remove_last_word"] = 21000,
["Repeat_vandal"] = 2700,
["Repeated_IP_abuse"] = 5200,
["Repeatvandal"] = 2200,
["Replace"] = 1080000,
["Reply"] = 24000,
["Reply_to"] = 375000,
["Replyto"] = 20000,
["Republican_Party_(US)/meta/shading"] = 19000,
["Reqmapin"] = 2500,
["Reqphoto"] = 70000,
["Request_and_endorse"] = 2500,
["Request_edit_button"] = 13000,
["Request_edit_button/styles.css"] = 13000,
["Requestandendorse"] = 2500,
["Resbox"] = 3400,
["Resize"] = 154000,
["Resizediv"] = 14000,
["Resolve_category_redirect"] = 1390000,
["Resolved"] = 18000,
["Respell"] = 25000,
["Respond"] = 77000,
["Resume-like"] = 4300,
["Retired"] = 11000,
["Retrieved"] = 3200,
["Reverse_date"] = 58000,
["Reviewer_topicon"] = 2700,
["RfA_watchlist_notice"] = 7300,
["Rfc_top"] = 2900,
["Rfd_log_header"] = 7400,
["Ribbon_devices"] = 5300,
["Ribbon_devices/alt"] = 5200,
["Ribbon_devices/device"] = 4100,
["Ribbon_devices/device_layout"] = 4100,
["Ric"] = 17000,
["Right"] = 6600,
["Right-pointing_double_angles"] = 2500,
["Right_angles"] = 2500,
["Right_ascension"] = 11000,
["Rint"] = 31000,
["Rlp"] = 11000,
["Rlp/Positions"] = 11000,
["Rmri"] = 4000,
["Rnd"] = 8400,
["Rollback_topicon"] = 3300,
["Roman"] = 3600,
["Romania_metadata_Wikidata"] = 3200,
["RomanianSoccer"] = 2400,
["Rotten-tomatoes"] = 9100,
["Rotten_Tomatoes"] = 26000,
["Rotten_Tomatoes_data"] = 6700,
["Rotten_Tomatoes_prose"] = 6800,
["Round"] = 61000,
["Round4-with_third"] = 3500,
["Round_corners"] = 9600,
["Rounddown"] = 4000,
["RouteBox"] = 9600,
["Routemap"] = 30000,
["Routemap/embeded_text"] = 9500,
["Routemap/if_empty_codes"] = 5100,
["Routemap/styles.css"] = 31000,
["RoutemapRouteIcon"] = 4100,
["Row_hover_highlight"] = 2900,
["Row_hover_highlight/styles.css"] = 2900,
["Royal_Australian_Navy_ship"] = 6700,
["Royal_Canadian_Navy_ship"] = 5300,
["Royal_Mail_ship"] = 6400,
["Royal_Netherlands_Navy_ship"] = 3300,
["Rp"] = 78000,
["Rshell"] = 10000,
["Rtl-para"] = 2100,
["Rto"] = 3600,
["Ru"] = 3700,
["Ru-census"] = 7500,
["Ru-census2002"] = 5700,
["Ru-census2010"] = 7500,
["Ru-pop-ref"] = 9900,
["Rugby_box"] = 3600,
["Rugby_league_positions"] = 11000,
["Rugby_league_positions/Positions"] = 11000,
["Rugby_league_records"] = 2000,
["Rugby_league_squad2_coach"] = 2900,
["Rugby_league_squad2_player"] = 2100,
["Rugby_union"] = 3700,
["Rugby_union_team"] = 5300,
["Rugby_union_team/link"] = 5300,
["Rugbybox"] = 3600,
["Runner-up"] = 2000,
["RussiaAdmMunRef"] = 5800,
["Russia_Time_Zone_Wikidata"] = 6700,
["Russia_Time_Zone_Wikidata/getQID"] = 6500,
["Russia_by_federal_subject_category_navigation"] = 3000,
["Rut"] = 5300,
["Rwd"] = 5000,
["Rws"] = 27000,
["Module:R"] = 93000,
["Module:R_avoided_double_redirect"] = 205000,
["Module:Rail-interchange_multi"] = 15000,
["Module:Random"] = 13000,
["Module:Ranking_movements"] = 4800,
["Module:Ranking_movements/styles.css"] = 4800,
["Module:Redirect"] = 5100000,
["Module:Redirect-distinguish"] = 5300,
["Module:RedirectData"] = 48000,
["Module:Redirect_hatnote"] = 65000,
["Module:Redirect_template"] = 7950000,
["Module:Redirect_template_handler"] = 30000,
["Module:Reply_to"] = 375000,
["Module:ResolveEntityId"] = 506000,
["Module:Resolve_category_redirect"] = 1790000,
["Module:Respell"] = 25000,
["Module:Rivals.com_recruit_url"] = 2500,
["Module:Road_data"] = 18000,
["Module:Road_data/RJL_types"] = 17000,
["Module:Road_data/banners/USA"] = 9500,
["Module:Road_data/browse"] = 18000,
["Module:Road_data/browsetable"] = 18000,
["Module:Road_data/browsetable/styles.css"] = 18000,
["Module:Road_data/countrymask"] = 36000,
["Module:Road_data/extra"] = 33000,
["Module:Road_data/locations"] = 12000,
["Module:Road_data/parser"] = 43000,
["Module:Road_data/parser/hooks"] = 20000,
["Module:Road_data/parser/namespace"] = 4300,
["Module:Road_data/size"] = 18000,
["Module:Road_data/strings/ASIA"] = 9100,
["Module:Road_data/strings/CAN"] = 5000,
["Module:Road_data/strings/EUR"] = 5800,
["Module:Road_data/strings/IND"] = 2300,
["Module:Road_data/strings/JPN"] = 3500,
["Module:Road_data/strings/USA"] = 21000,
["Module:Road_data/strings/USA/regional/GRR"] = 21000,
["Module:Road_data/strings/USA/regional/NER"] = 21000,
["Module:Road_data/strings/USA/regional/Tour"] = 21000,
["Module:Road_data/strings/USA/regional/Trails"] = 21000,
["Module:Road_data/util"] = 44000,
["Module:Roman"] = 6400,
["Module:Rotten_Tomatoes_data"] = 6700,
["Module:RoundN"] = 14000,
["Module:Routemap"] = 31000,
["Module:Rugby_box"] = 3600,
["Module:Russia_by_federal_subject_category_navigation"] = 3000,
}
7907x278lpo5gsgxwgru7gt6aw1lb34
Tempilet:Respell/doc
10
2522
33097
2025-08-18T20:46:03Z
en>Femke
0
/* How to use */ Avoid examples that go against [[MOS:LEADCLUTTER]]; pronunciation shouldn't be in the first sentence usually
33097
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-use}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{ombox
| type = content
| text = '''This template is for English words only'''. For notating pronunciation of non-English words that have not been assimilated into English, use the IPA template for the respective language. In addition, the template is merely to augment the IPA but never to replace it, and therefore '''should not be used alone without an IPA notation preceding it'''. See [[Wikipedia:Manual of Style/Pronunciation]] for more on showing pronunciation on Wikipedia. If you need help transcribing the pronunciation into the IPA, please ask at [[Wikipedia:Reference desk/Language]].
}}
{{lua|Module:Respell}}
This template formats pronunciation respellings of English words. It puts the input in italics, hyphenates each value so it will represent a syllable, and links to [[Help:Pronunciation respelling key]]. Stressed syllables are input in uppercase and will appear slightly smaller than usual uppercase letters.
Notation must be spelled accordingly to the respelling key at [[Help:Pronunciation respelling key]]. For example, the word ''pronunciation'' ({{IPAc-en|IPA|p|r|ə|ˌ|n|ʌ|n|s|i|ˈ|eɪ|ʃ|ən}}) is respelled {{respell|prə|NUN|see|AY|shən|link=no}}; using this template, the formatting is:
*<code><nowiki>{{respell|prə|NUN|see|AY|shən}}</nowiki></code> → {{respell|prə|NUN|see|AY|shən}}
==How to use==
On Wikipedia, respelling is used to help clarify the pronunciation of a name or topic, for instance an explanatory footnote in the lead, an infobox or in a naming section. Per the [[Wikipedia:Manual of Style/Pronunciation|Manual of Style]], respelling may only follow and augment a corresponding [[International Phonetic Alphabet]] template (e.g., {{tl|IPAc-en}}) and may never be used in place of one. The template provides a link to a key so that readers may easily discover how to pronounce an easily mispronounced or difficult-to-pronounce word. For example:
*[[Worcestershire]] ({{IPAc-en|ˈ|w|ʊ|s|t|ər|ʃ|ər}} {{respell|WUUS|tər|shər}}) is a county located in central [[England]].
*:<syntaxhighlight lang="wikitext" inline>Worcestershire ({{IPAc-en|ˈ|w|ʊ|s|t|ər|ʃ|ər}} {{respell|WUUS|tər|shər}}) is a county located in central [[England]].</syntaxhighlight>
Common practice is to put a single space (and no punctuation, like a comma) between the IPA and the respelling for clarity, as in:
*[[Massachusetts]] ({{IPAc-en|ˌ|m|æ|s|ə|ˈ|tʃ|uː|s|ɪ|t|s}} {{respell|MASS|ə|CHOO|sits}}, {{IPAc-en|-|z|ɪ|t|s}} {{respell|-zits}}) is the most populous state in [[New England]].
*:<syntaxhighlight lang="wikitext" inline>Massachusetts ({{IPAc-en|ˌ|m|æ|s|ə|ˈ|tʃ|uː|s|ɪ|t|s}} {{respell|MASS|ə|CHOO|sits}}, {{IPAc-en|-|z|ɪ|t|s}} {{respell|-zits}}) is the most populous state in [[New England]].</syntaxhighlight>
Any argument containing an underscore <code>_</code> or beginning or ending with a hyphen <code>-</code> will not generate adjoining hyphens and will instead turn the underscore into a space, allowing for denoting word boundaries, alternate pronunciations, and affix ellipses. For example:
*[[Avram Noam Chomsky]]: <syntaxhighlight lang="wikitext" inline>{{respell|av|RAHM|_|NOHM|_|CHOM|skee}}</syntaxhighlight> → {{respell|av|RAHM|_|NOHM|_|CHOM|skee}}
*[[Copenhagen]]: <syntaxhighlight lang="wikitext" inline>{{respell|KOH|pən|HAY|gən|,_-|HAH|-}}</syntaxhighlight> → {{respell|KOH|pən|HAY|gən|,_-|HAH|-}}
An argument beginning in <code>(-</code> or ending in <code>-)</code> will also suppress the extra hyphen, so that optional syllables can be indicated.
*[[coupe]]: <syntaxhighlight lang="wikitext" inline>{{respell|KOOP|(-ay)}}</syntaxhighlight> → {{respell|KOOP|(-ay)}}
==Examples==
*'''[[Ceres (mythology)|Ceres]]''' {{IPAc-en|ˈ|s|ɪər|iː|z}} {{respell|SEER|eez}}
*:<code><nowiki>{{respell|SEER|eez}}</nowiki></code>
*'''[[Haumea]]''' {{IPAc-en|h|aʊ|ˈ|m|eɪ|ə}} {{respell|how|MAY|ə}}
*:<code><nowiki>{{respell|how|MAY|ə}}</nowiki></code>
*'''[[algorithm]]''' {{IPAc-en|ˈ|æ|l|ɡ|ə|r|ɪ|ð|əm}} {{respell|AL|gə|ridh|əm}}
*:<code><nowiki>{{respell|AL|gə|ridh|əm}}</nowiki></code>
*'''[[Makemake]]''' {{IPAc-en|ˌ|m|ɑː|k|eɪ|ˈ|m|ɑː|k|eɪ}} {{respell|MAH|kay|MAH|kay}}
*:<code><nowiki>{{respell|MAH|kay|MAH|kay}}</nowiki></code>
*'''[[disestablishmentarianism]]''' {{IPAc-en|d|ɪ|s|ə|ˌ|s|t|æ|b|l|ɪ|ʃ|m|ə|n|ˈ|t|ɛər|i|ə|n|ɪ|z|əm}} {{respell|dis|ə|STAB|lish|mən|TAIR|ee|ə|niz|əm}}
*:<code><nowiki>{{respell|dis|ə|STAB|lish|mən|TAIR|ee|ə|niz|əm}}</nowiki></code>
*'''[[Pan (god)|Pan]]''' {{IPAc-en|p|æ|n}} {{respell|PAN}}
*:<code><nowiki>{{respell|PAN}}</nowiki></code>
*'''[[machine]]''' {{IPAc-en|m|ə|ˈ|ʃ|iː|n}} {{respell|mə|SHEEN}}
*:<code><nowiki>{{respell|mə|SHEEN}}</nowiki></code>
*'''[[Overconsumption|overconsume]]''' {{IPAc-en|ˌ|oʊ|v|ər|k|ən|ˈ|sj|uː|m}} {{respell|OH|vər|kən|SEWM}}
*:<code><nowiki>{{respell|OH|vər|kən|SEWM}}</nowiki></code>
*'''[[Azerbaijan]]''' {{IPAc-en|ˌ|æ|z|ər|b|aɪ|ˈ|dʒ|ɑː|n}} {{respell|AZ|ər|by|JAHN}}
*:<code><nowiki>{{respell|AZ|ər|by|JAHN}}</nowiki></code>
*'''[[When You Wish Upon a Star|if you wish upon a star]]''' {{IPAc-en|ˌ|ɪ|f|_|j|uː|_|ˈ|w|ɪ|ʃ|_|ə|ˌ|p|ɒ|n|_|ə|_|ˈ|s|t|ɑːr}} {{respell|IF|_|yoo|_|WISH|_|ə|PON|_|ə|_|STAR}}
*:<code><nowiki>{{respell|IF|_|yoo|_|WISH|_|ə|PON|_|ə|_|STAR}}</nowiki></code>
*'''[[betting odds]]''' {{IPAc-en|ˈ|b|ɛ|t|ɪ|ŋ|_|ɒ|d|z}} {{respell|BET|ing|_|odz}}
*:<code><nowiki>{{respell|BET|ing|_|odz}}</nowiki></code>
*'''[[Jazze Pha]]''' {{IPAc-en|ˈ|dʒ|æ|z|i|_|ˈ|f|eɪ}} {{respell|JAZ|ee|_|FAY}}
*:<code><nowiki>{{respell|JAZ|ee|_|FAY}}</nowiki></code>
==Documentation==
{{para|link|no}} cancels the link to [[Help:Pronunciation respelling key]]. This is for documentation outside the main namespace only.
*<code><nowiki>{{respell|prə|NUN|see|AY|shən|link=no}}</nowiki></code> → {{respell|prə|NUN|see|AY|shən|link=no}}
==Template Data==
{{TemplateData header}}
{{collapse top|title=Template Data|bg=#ccc}}
<templatedata>
{
"params": {
"1": {},
"2": {},
"3": {},
"4": {},
"5": {},
"6": {},
"7": {}
}
}
</templatedata>
{{cob}}
==See also==
*[[Help:IPA/English]]
{{IPA templates}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Pronunciation templates]]
}}</includeonly>
qk7h1tuh8kq9k1w3tup55a0tdzw6yse
33098
33097
2026-11-11T21:19:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Respell/doc]]
33097
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-use}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{ombox
| type = content
| text = '''This template is for English words only'''. For notating pronunciation of non-English words that have not been assimilated into English, use the IPA template for the respective language. In addition, the template is merely to augment the IPA but never to replace it, and therefore '''should not be used alone without an IPA notation preceding it'''. See [[Wikipedia:Manual of Style/Pronunciation]] for more on showing pronunciation on Wikipedia. If you need help transcribing the pronunciation into the IPA, please ask at [[Wikipedia:Reference desk/Language]].
}}
{{lua|Module:Respell}}
This template formats pronunciation respellings of English words. It puts the input in italics, hyphenates each value so it will represent a syllable, and links to [[Help:Pronunciation respelling key]]. Stressed syllables are input in uppercase and will appear slightly smaller than usual uppercase letters.
Notation must be spelled accordingly to the respelling key at [[Help:Pronunciation respelling key]]. For example, the word ''pronunciation'' ({{IPAc-en|IPA|p|r|ə|ˌ|n|ʌ|n|s|i|ˈ|eɪ|ʃ|ən}}) is respelled {{respell|prə|NUN|see|AY|shən|link=no}}; using this template, the formatting is:
*<code><nowiki>{{respell|prə|NUN|see|AY|shən}}</nowiki></code> → {{respell|prə|NUN|see|AY|shən}}
==How to use==
On Wikipedia, respelling is used to help clarify the pronunciation of a name or topic, for instance an explanatory footnote in the lead, an infobox or in a naming section. Per the [[Wikipedia:Manual of Style/Pronunciation|Manual of Style]], respelling may only follow and augment a corresponding [[International Phonetic Alphabet]] template (e.g., {{tl|IPAc-en}}) and may never be used in place of one. The template provides a link to a key so that readers may easily discover how to pronounce an easily mispronounced or difficult-to-pronounce word. For example:
*[[Worcestershire]] ({{IPAc-en|ˈ|w|ʊ|s|t|ər|ʃ|ər}} {{respell|WUUS|tər|shər}}) is a county located in central [[England]].
*:<syntaxhighlight lang="wikitext" inline>Worcestershire ({{IPAc-en|ˈ|w|ʊ|s|t|ər|ʃ|ər}} {{respell|WUUS|tər|shər}}) is a county located in central [[England]].</syntaxhighlight>
Common practice is to put a single space (and no punctuation, like a comma) between the IPA and the respelling for clarity, as in:
*[[Massachusetts]] ({{IPAc-en|ˌ|m|æ|s|ə|ˈ|tʃ|uː|s|ɪ|t|s}} {{respell|MASS|ə|CHOO|sits}}, {{IPAc-en|-|z|ɪ|t|s}} {{respell|-zits}}) is the most populous state in [[New England]].
*:<syntaxhighlight lang="wikitext" inline>Massachusetts ({{IPAc-en|ˌ|m|æ|s|ə|ˈ|tʃ|uː|s|ɪ|t|s}} {{respell|MASS|ə|CHOO|sits}}, {{IPAc-en|-|z|ɪ|t|s}} {{respell|-zits}}) is the most populous state in [[New England]].</syntaxhighlight>
Any argument containing an underscore <code>_</code> or beginning or ending with a hyphen <code>-</code> will not generate adjoining hyphens and will instead turn the underscore into a space, allowing for denoting word boundaries, alternate pronunciations, and affix ellipses. For example:
*[[Avram Noam Chomsky]]: <syntaxhighlight lang="wikitext" inline>{{respell|av|RAHM|_|NOHM|_|CHOM|skee}}</syntaxhighlight> → {{respell|av|RAHM|_|NOHM|_|CHOM|skee}}
*[[Copenhagen]]: <syntaxhighlight lang="wikitext" inline>{{respell|KOH|pən|HAY|gən|,_-|HAH|-}}</syntaxhighlight> → {{respell|KOH|pən|HAY|gən|,_-|HAH|-}}
An argument beginning in <code>(-</code> or ending in <code>-)</code> will also suppress the extra hyphen, so that optional syllables can be indicated.
*[[coupe]]: <syntaxhighlight lang="wikitext" inline>{{respell|KOOP|(-ay)}}</syntaxhighlight> → {{respell|KOOP|(-ay)}}
==Examples==
*'''[[Ceres (mythology)|Ceres]]''' {{IPAc-en|ˈ|s|ɪər|iː|z}} {{respell|SEER|eez}}
*:<code><nowiki>{{respell|SEER|eez}}</nowiki></code>
*'''[[Haumea]]''' {{IPAc-en|h|aʊ|ˈ|m|eɪ|ə}} {{respell|how|MAY|ə}}
*:<code><nowiki>{{respell|how|MAY|ə}}</nowiki></code>
*'''[[algorithm]]''' {{IPAc-en|ˈ|æ|l|ɡ|ə|r|ɪ|ð|əm}} {{respell|AL|gə|ridh|əm}}
*:<code><nowiki>{{respell|AL|gə|ridh|əm}}</nowiki></code>
*'''[[Makemake]]''' {{IPAc-en|ˌ|m|ɑː|k|eɪ|ˈ|m|ɑː|k|eɪ}} {{respell|MAH|kay|MAH|kay}}
*:<code><nowiki>{{respell|MAH|kay|MAH|kay}}</nowiki></code>
*'''[[disestablishmentarianism]]''' {{IPAc-en|d|ɪ|s|ə|ˌ|s|t|æ|b|l|ɪ|ʃ|m|ə|n|ˈ|t|ɛər|i|ə|n|ɪ|z|əm}} {{respell|dis|ə|STAB|lish|mən|TAIR|ee|ə|niz|əm}}
*:<code><nowiki>{{respell|dis|ə|STAB|lish|mən|TAIR|ee|ə|niz|əm}}</nowiki></code>
*'''[[Pan (god)|Pan]]''' {{IPAc-en|p|æ|n}} {{respell|PAN}}
*:<code><nowiki>{{respell|PAN}}</nowiki></code>
*'''[[machine]]''' {{IPAc-en|m|ə|ˈ|ʃ|iː|n}} {{respell|mə|SHEEN}}
*:<code><nowiki>{{respell|mə|SHEEN}}</nowiki></code>
*'''[[Overconsumption|overconsume]]''' {{IPAc-en|ˌ|oʊ|v|ər|k|ən|ˈ|sj|uː|m}} {{respell|OH|vər|kən|SEWM}}
*:<code><nowiki>{{respell|OH|vər|kən|SEWM}}</nowiki></code>
*'''[[Azerbaijan]]''' {{IPAc-en|ˌ|æ|z|ər|b|aɪ|ˈ|dʒ|ɑː|n}} {{respell|AZ|ər|by|JAHN}}
*:<code><nowiki>{{respell|AZ|ər|by|JAHN}}</nowiki></code>
*'''[[When You Wish Upon a Star|if you wish upon a star]]''' {{IPAc-en|ˌ|ɪ|f|_|j|uː|_|ˈ|w|ɪ|ʃ|_|ə|ˌ|p|ɒ|n|_|ə|_|ˈ|s|t|ɑːr}} {{respell|IF|_|yoo|_|WISH|_|ə|PON|_|ə|_|STAR}}
*:<code><nowiki>{{respell|IF|_|yoo|_|WISH|_|ə|PON|_|ə|_|STAR}}</nowiki></code>
*'''[[betting odds]]''' {{IPAc-en|ˈ|b|ɛ|t|ɪ|ŋ|_|ɒ|d|z}} {{respell|BET|ing|_|odz}}
*:<code><nowiki>{{respell|BET|ing|_|odz}}</nowiki></code>
*'''[[Jazze Pha]]''' {{IPAc-en|ˈ|dʒ|æ|z|i|_|ˈ|f|eɪ}} {{respell|JAZ|ee|_|FAY}}
*:<code><nowiki>{{respell|JAZ|ee|_|FAY}}</nowiki></code>
==Documentation==
{{para|link|no}} cancels the link to [[Help:Pronunciation respelling key]]. This is for documentation outside the main namespace only.
*<code><nowiki>{{respell|prə|NUN|see|AY|shən|link=no}}</nowiki></code> → {{respell|prə|NUN|see|AY|shən|link=no}}
==Template Data==
{{TemplateData header}}
{{collapse top|title=Template Data|bg=#ccc}}
<templatedata>
{
"params": {
"1": {},
"2": {},
"3": {},
"4": {},
"5": {},
"6": {},
"7": {}
}
}
</templatedata>
{{cob}}
==See also==
*[[Help:IPA/English]]
{{IPA templates}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Pronunciation templates]]
}}</includeonly>
qk7h1tuh8kq9k1w3tup55a0tdzw6yse
Tempilet:Enum
10
2523
33099
2026-10-17T14:47:24Z
en>Primefac
0
[[Wikipedia:Templates for discussion/Log/2026 September 26#Template:Comma-separated list]] closed as no consensus ([[WP:XFDC#4.0.16|XFDcloser]])
33099
wikitext
text/x-wiki
<includeonly>{{safesubst<noinclude/>:#invoke:Separated entries|main|dataPlural=1|separator={{safesubst<noinclude/>:#if:{{{comma|}}}|{{{comma}}}|, }}|conjunction={{safesubst<noinclude/>:#if:{{{and|}}}|{{{and}}}| and }}}}{{safesubst<noinclude/>:#if:{{{1|}}}|{{{after|}}}}}</includeonly><noinclude>
{{Documentation}}</noinclude>
0zf6c18jqn3t98c2ze0ymlhqwn8dvbf
33100
33099
2026-11-11T21:21:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Enum]]
33099
wikitext
text/x-wiki
<includeonly>{{safesubst<noinclude/>:#invoke:Separated entries|main|dataPlural=1|separator={{safesubst<noinclude/>:#if:{{{comma|}}}|{{{comma}}}|, }}|conjunction={{safesubst<noinclude/>:#if:{{{and|}}}|{{{and}}}| and }}}}{{safesubst<noinclude/>:#if:{{{1|}}}|{{{after|}}}}}</includeonly><noinclude>
{{Documentation}}</noinclude>
0zf6c18jqn3t98c2ze0ymlhqwn8dvbf
Tempilet:Spaces
10
2524
33101
2015-10-25T11:38:26Z
en>Edokter
0
use class
33101
wikitext
text/x-wiki
<span class="nowrap">{{#iferror:{{#expr:{{{1|1}}}}}
|{{#switch:{{{1}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}
|{{#invoke:String|rep|{{#switch:{{{2}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}|{{{1|1}}}}}
}}</span><noinclude>
{{documentation}}
</noinclude>
jukvcl40dksi5vvimpqq0n6czue0473
33102
33101
2026-11-11T21:21:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Spaces]]
33101
wikitext
text/x-wiki
<span class="nowrap">{{#iferror:{{#expr:{{{1|1}}}}}
|{{#switch:{{{1}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}
|{{#invoke:String|rep|{{#switch:{{{2}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}|{{{1|1}}}}}
}}</span><noinclude>
{{documentation}}
</noinclude>
jukvcl40dksi5vvimpqq0n6czue0473
Tempilet:Space
10
2525
33103
2023-02-14T01:26:39Z
en>Xaosflux
0
shell params
33103
wikitext
text/x-wiki
#REDIRECT [[Template:Spaces]]
{{Rcat shell|
{{R from modification}}
{{R with history}}
{{R from template shortcut}}
}}
d521813tbyim2j2dsy9kxikkaoo0jnt
33104
33103
2026-11-11T21:21:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Space]]
33103
wikitext
text/x-wiki
#REDIRECT [[Template:Spaces]]
{{Rcat shell|
{{R from modification}}
{{R with history}}
{{R from template shortcut}}
}}
d521813tbyim2j2dsy9kxikkaoo0jnt
Tempilet:FULLBASEPAGENAME
10
2526
33105
2019-01-07T15:38:13Z
en>Bsherr
0
bypassing redirect, removing excess white space
33105
wikitext
text/x-wiki
{{#if: {{Ns has subpages | {{#if:{{{1|}}}|{{NAMESPACE:{{{1}}}}}|{{NAMESPACE}}}} }}
| {{#if: {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}<noinclude>
{{documentation}}
</noinclude>
ixr6ocr5zopgbfiuog5gfof9h5qt70j
33106
33105
2026-11-11T21:21:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:FULLBASEPAGENAME]]
33105
wikitext
text/x-wiki
{{#if: {{Ns has subpages | {{#if:{{{1|}}}|{{NAMESPACE:{{{1}}}}}|{{NAMESPACE}}}} }}
| {{#if: {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}<noinclude>
{{documentation}}
</noinclude>
ixr6ocr5zopgbfiuog5gfof9h5qt70j
Module:Transclusion count/data/E
828
2527
33107
2026-10-18T05:09:16Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33107
Scribunto
text/plain
return {
["EB1911"] = 13000,
["EB1911_poster"] = 3500,
["ECU"] = 2700,
["EC_number"] = 4100,
["EGY"] = 3700,
["EHAK"] = 3300,
["ENFA"] = 3700,
["ENG"] = 8400,
["ENGLs"] = 5600,
["ER_to_list_entry"] = 5400,
["ESP"] = 17000,
["ESPNcricinfo"] = 3400,
["ESPNscrum"] = 3900,
["EST"] = 4800,
["ETH"] = 2200,
["Earthquake_magnitude"] = 2400,
["Eastern_name_order"] = 3100,
["Ebicite"] = 7100,
["Ec"] = 30000,
["Ed_right"] = 3100,
["Edit"] = 774000,
["EditAtWikidata"] = 231000,
["Edit_COI"] = 16000,
["Edit_COI/answered"] = 9500,
["Edit_COI/declined"] = 5700,
["Edit_a_taxon"] = 151000,
["Edit_at_Wikidata"] = 878000,
["Edit_conflict"] = 34000,
["Edit_count_link"] = 8400,
["Edit_extended-protected"] = 8300,
["Edit_fully-protected"] = 4800,
["Edit_on_Wikidata"] = 44000,
["Edit_protected"] = 4200,
["Edit_semi-protected"] = 42000,
["Edit_summary_field"] = 8900,
["Edit_summary_field/OOUI"] = 17000,
["Edit_summary_field/OOUI/styles.css"] = 17000,
["Edit_summary_field/VisualEditor"] = 4000,
["Edit_summary_field/VisualEditor/styles.css"] = 4000,
["Edit_taxonomy"] = 506000,
["Edit_template-protected"] = 5100,
["Editcount"] = 3100,
["Editnotice"] = 22000,
["Editnotice/notice"] = 19000,
["Editnotice/styles.css"] = 22000,
["Editnotice_EXPECTUNUSEDTEMPLATE"] = 474000,
["Editnotice_for_lists_of_people"] = 2600,
["EduBase"] = 4500,
["Educational_assignment"] = 4500,
["Efn"] = 327000,
["Efn-lr"] = 4300,
["Efn-ua"] = 6400,
["Efs_player"] = 6800,
["Efs_start"] = 6600,
["Election_box_2-party-preferred"] = 2400,
["Election_box_2pp"] = 2400,
["Election_box_begin"] = 38000,
["Election_box_begin_no_change"] = 21000,
["Election_box_candidate"] = 8200,
["Election_box_candidate_AU_party"] = 4000,
["Election_box_candidate_no_change"] = 3300,
["Election_box_candidate_with_party_link"] = 33000,
["Election_box_candidate_with_party_link_no_change"] = 21000,
["Election_box_end"] = 56000,
["Election_box_formal"] = 3900,
["Election_box_gain_with_party_link"] = 14000,
["Election_box_gain_with_party_link_no_change"] = 2900,
["Election_box_gain_with_party_link_no_swing"] = 3400,
["Election_box_hold_AU_party"] = 3000,
["Election_box_hold_with_party_link"] = 19000,
["Election_box_hold_with_party_link_no_change"] = 7600,
["Election_box_hold_with_party_link_no_swing"] = 7100,
["Election_box_hold_with_party_link_without_swing"] = 3000,
["Election_box_informal"] = 4400,
["Election_box_majority"] = 22000,
["Election_box_margin_of_victory"] = 3400,
["Election_box_new_seat_win"] = 8300,
["Election_box_registered_electors"] = 11000,
["Election_box_rejected"] = 3500,
["Election_box_total"] = 4700,
["Election_box_total_no_change"] = 19000,
["Election_box_total_valid"] = 2200,
["Election_box_turnout"] = 30000,
["Election_box_turnout_no_change"] = 3100,
["Election_box_winning_candidate_with_party_link"] = 27000,
["Election_box_winning_candidate_with_party_link_no_change"] = 21000,
["Election_box_write-in_with_party_link_no_change"] = 3300,
["Election_results"] = 12000,
["Election_summary_begin"] = 4100,
["Election_summary_party"] = 4100,
["Election_table"] = 2700,
["Election_table/category"] = 2700,
["Elo_ranking"] = 4700,
["Elo_rating"] = 4800,
["Em"] = 1560000,
["Em_dash"] = 19000,
["Emblem_table"] = 4800,
["Emdash"] = 4700,
["Emmy_Awards/color"] = 4900,
["Emoji"] = 2500,
["Emoji/auto"] = 2500,
["Emphasis_underline"] = 6600,
["Empty_category"] = 3700,
["Empty_section"] = 15000,
["Emu"] = 6600,
["En"] = 3600,
["En_dash"] = 47000,
["En_dash_range"] = 233000,
["Encodefirst"] = 1630000,
["Encyclopedia_of_Life_link"] = 2400,
["End"] = 136000,
["End_box"] = 11000,
["End_date"] = 99000,
["End_date_and_age"] = 11000,
["End_flat_list"] = 139000,
["End_of_course_week"] = 6000,
["End_of_students_table"] = 7300,
["End_plain_list"] = 32000,
["Endangered_Languages_Project"] = 12000,
["Endash"] = 13000,
["Endflatlist"] = 295000,
["Endorse"] = 5500,
["Endorsements_box"] = 2700,
["Endorsements_box/styles.css"] = 2700,
["Endplainlist"] = 44000,
["English_anime_licensee"] = 5000,
["English_football_updater"] = 5600,
["English_manga_publisher"] = 3200,
["Engvar"] = 16000,
["EngvarB"] = 49000,
["Ensure_AAA_contrast_ratio"] = 16000,
["Ensure_AA_contrast_ratio"] = 5700,
["Enum"] = 17000,
["Enzymes"] = 6200,
["Episode_list"] = 23000,
["Episode_list/sublist"] = 5800,
["Episode_table"] = 29000,
["Eponymous_categories"] = 2300,
["Eponymous_category"] = 2300,
["Error"] = 43000,
["ErrorBar2"] = 5000,
["Esc"] = 2900,
["Esccnty"] = 4000,
["Esoteric_file"] = 4300,
["Essay"] = 5800,
["Essay-like"] = 4600,
["Establishment_category_in_continent"] = 3200,
["Establishment_category_in_continent/core"] = 3200,
["Establishment_category_in_country"] = 27000,
["Establishment_category_in_country/core"] = 27000,
["Establishment_category_in_country_by_decade"] = 5100,
["Establishment_category_in_country_by_decade/core"] = 5100,
["EstcatContinent"] = 3200,
["EstcatCountry"] = 27000,
["EstcatCountryDecade"] = 5100,
["EstcatUSstate"] = 10000,
["Estonia_To-do"] = 24000,
["Ethnologue18"] = 3500,
["Europe_topic"] = 11000,
["Eurovision_Song_Contest_year"] = 2000,
["Example_text"] = 41000,
["Example_text_bad"] = 11000,
["Excerpt"] = 15000,
["Excessive_citations_inline"] = 2100,
["ExistNotRedirect"] = 45000,
["Exist_not_redirect"] = 82000,
["Expand_Chinese"] = 2100,
["Expand_French"] = 19000,
["Expand_German"] = 18000,
["Expand_Italian"] = 5200,
["Expand_Japanese"] = 5800,
["Expand_Polish"] = 2600,
["Expand_Portuguese"] = 2600,
["Expand_Russian"] = 5500,
["Expand_Spanish"] = 9400,
["Expand_Turkish"] = 2000,
["Expand_language"] = 97000,
["Expand_list"] = 6700,
["Expand_section"] = 38000,
["Expand_wikitext"] = 120000,
["Explain"] = 3000,
["Extended_confirmed_topicon"] = 2200,
["Extended_confirmed–protected"] = 11000,
["Extended_football_squad_player"] = 8000,
["Extended_football_squad_start"] = 8100,
["External_links"] = 3000,
["External_media"] = 13000,
["External_music_video"] = 34000,
["Extinct"] = 16000,
["Extra_album_cover"] = 8500,
["Extra_chronology"] = 18000,
["Extract"] = 10000,
["Module:EFloras"] = 2100,
["Module:EditAtWikidata"] = 2200000,
["Module:Effective_protection_expiry"] = 75000,
["Module:Effective_protection_level"] = 80000,
["Module:Election_results"] = 12000,
["Module:Endangered_Languages_Project"] = 12000,
["Module:English_variant_notice"] = 81000,
["Module:Engvar"] = 18000,
["Module:Engvar/detect"] = 3600,
["Module:Episode_list"] = 30000,
["Module:Episode_table"] = 29000,
["Module:Episode_table/styles.css"] = 29000,
["Module:Error"] = 53000,
["Module:Escape"] = 14000,
["Module:Excerpt"] = 15000,
["Module:Excerpt/config"] = 15000,
["Module:Excerpt/portals"] = 5000,
["Module:Excerpt/styles.css"] = 14000,
["Module:Exist_not_redirect"] = 82000,
["Module:Expand_wikitext"] = 120000,
["Module:Exponential_search"] = 749000,
["Module:External_links"] = 82000,
["Module:External_links/conf"] = 82000,
["Module:External_links/conf/Sports"] = 82000,
}
qnlu0zp6kepqlo87hzi4hjvxxu7o4tf
33108
33107
2026-11-11T21:21:11Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/E]]
33107
Scribunto
text/plain
return {
["EB1911"] = 13000,
["EB1911_poster"] = 3500,
["ECU"] = 2700,
["EC_number"] = 4100,
["EGY"] = 3700,
["EHAK"] = 3300,
["ENFA"] = 3700,
["ENG"] = 8400,
["ENGLs"] = 5600,
["ER_to_list_entry"] = 5400,
["ESP"] = 17000,
["ESPNcricinfo"] = 3400,
["ESPNscrum"] = 3900,
["EST"] = 4800,
["ETH"] = 2200,
["Earthquake_magnitude"] = 2400,
["Eastern_name_order"] = 3100,
["Ebicite"] = 7100,
["Ec"] = 30000,
["Ed_right"] = 3100,
["Edit"] = 774000,
["EditAtWikidata"] = 231000,
["Edit_COI"] = 16000,
["Edit_COI/answered"] = 9500,
["Edit_COI/declined"] = 5700,
["Edit_a_taxon"] = 151000,
["Edit_at_Wikidata"] = 878000,
["Edit_conflict"] = 34000,
["Edit_count_link"] = 8400,
["Edit_extended-protected"] = 8300,
["Edit_fully-protected"] = 4800,
["Edit_on_Wikidata"] = 44000,
["Edit_protected"] = 4200,
["Edit_semi-protected"] = 42000,
["Edit_summary_field"] = 8900,
["Edit_summary_field/OOUI"] = 17000,
["Edit_summary_field/OOUI/styles.css"] = 17000,
["Edit_summary_field/VisualEditor"] = 4000,
["Edit_summary_field/VisualEditor/styles.css"] = 4000,
["Edit_taxonomy"] = 506000,
["Edit_template-protected"] = 5100,
["Editcount"] = 3100,
["Editnotice"] = 22000,
["Editnotice/notice"] = 19000,
["Editnotice/styles.css"] = 22000,
["Editnotice_EXPECTUNUSEDTEMPLATE"] = 474000,
["Editnotice_for_lists_of_people"] = 2600,
["EduBase"] = 4500,
["Educational_assignment"] = 4500,
["Efn"] = 327000,
["Efn-lr"] = 4300,
["Efn-ua"] = 6400,
["Efs_player"] = 6800,
["Efs_start"] = 6600,
["Election_box_2-party-preferred"] = 2400,
["Election_box_2pp"] = 2400,
["Election_box_begin"] = 38000,
["Election_box_begin_no_change"] = 21000,
["Election_box_candidate"] = 8200,
["Election_box_candidate_AU_party"] = 4000,
["Election_box_candidate_no_change"] = 3300,
["Election_box_candidate_with_party_link"] = 33000,
["Election_box_candidate_with_party_link_no_change"] = 21000,
["Election_box_end"] = 56000,
["Election_box_formal"] = 3900,
["Election_box_gain_with_party_link"] = 14000,
["Election_box_gain_with_party_link_no_change"] = 2900,
["Election_box_gain_with_party_link_no_swing"] = 3400,
["Election_box_hold_AU_party"] = 3000,
["Election_box_hold_with_party_link"] = 19000,
["Election_box_hold_with_party_link_no_change"] = 7600,
["Election_box_hold_with_party_link_no_swing"] = 7100,
["Election_box_hold_with_party_link_without_swing"] = 3000,
["Election_box_informal"] = 4400,
["Election_box_majority"] = 22000,
["Election_box_margin_of_victory"] = 3400,
["Election_box_new_seat_win"] = 8300,
["Election_box_registered_electors"] = 11000,
["Election_box_rejected"] = 3500,
["Election_box_total"] = 4700,
["Election_box_total_no_change"] = 19000,
["Election_box_total_valid"] = 2200,
["Election_box_turnout"] = 30000,
["Election_box_turnout_no_change"] = 3100,
["Election_box_winning_candidate_with_party_link"] = 27000,
["Election_box_winning_candidate_with_party_link_no_change"] = 21000,
["Election_box_write-in_with_party_link_no_change"] = 3300,
["Election_results"] = 12000,
["Election_summary_begin"] = 4100,
["Election_summary_party"] = 4100,
["Election_table"] = 2700,
["Election_table/category"] = 2700,
["Elo_ranking"] = 4700,
["Elo_rating"] = 4800,
["Em"] = 1560000,
["Em_dash"] = 19000,
["Emblem_table"] = 4800,
["Emdash"] = 4700,
["Emmy_Awards/color"] = 4900,
["Emoji"] = 2500,
["Emoji/auto"] = 2500,
["Emphasis_underline"] = 6600,
["Empty_category"] = 3700,
["Empty_section"] = 15000,
["Emu"] = 6600,
["En"] = 3600,
["En_dash"] = 47000,
["En_dash_range"] = 233000,
["Encodefirst"] = 1630000,
["Encyclopedia_of_Life_link"] = 2400,
["End"] = 136000,
["End_box"] = 11000,
["End_date"] = 99000,
["End_date_and_age"] = 11000,
["End_flat_list"] = 139000,
["End_of_course_week"] = 6000,
["End_of_students_table"] = 7300,
["End_plain_list"] = 32000,
["Endangered_Languages_Project"] = 12000,
["Endash"] = 13000,
["Endflatlist"] = 295000,
["Endorse"] = 5500,
["Endorsements_box"] = 2700,
["Endorsements_box/styles.css"] = 2700,
["Endplainlist"] = 44000,
["English_anime_licensee"] = 5000,
["English_football_updater"] = 5600,
["English_manga_publisher"] = 3200,
["Engvar"] = 16000,
["EngvarB"] = 49000,
["Ensure_AAA_contrast_ratio"] = 16000,
["Ensure_AA_contrast_ratio"] = 5700,
["Enum"] = 17000,
["Enzymes"] = 6200,
["Episode_list"] = 23000,
["Episode_list/sublist"] = 5800,
["Episode_table"] = 29000,
["Eponymous_categories"] = 2300,
["Eponymous_category"] = 2300,
["Error"] = 43000,
["ErrorBar2"] = 5000,
["Esc"] = 2900,
["Esccnty"] = 4000,
["Esoteric_file"] = 4300,
["Essay"] = 5800,
["Essay-like"] = 4600,
["Establishment_category_in_continent"] = 3200,
["Establishment_category_in_continent/core"] = 3200,
["Establishment_category_in_country"] = 27000,
["Establishment_category_in_country/core"] = 27000,
["Establishment_category_in_country_by_decade"] = 5100,
["Establishment_category_in_country_by_decade/core"] = 5100,
["EstcatContinent"] = 3200,
["EstcatCountry"] = 27000,
["EstcatCountryDecade"] = 5100,
["EstcatUSstate"] = 10000,
["Estonia_To-do"] = 24000,
["Ethnologue18"] = 3500,
["Europe_topic"] = 11000,
["Eurovision_Song_Contest_year"] = 2000,
["Example_text"] = 41000,
["Example_text_bad"] = 11000,
["Excerpt"] = 15000,
["Excessive_citations_inline"] = 2100,
["ExistNotRedirect"] = 45000,
["Exist_not_redirect"] = 82000,
["Expand_Chinese"] = 2100,
["Expand_French"] = 19000,
["Expand_German"] = 18000,
["Expand_Italian"] = 5200,
["Expand_Japanese"] = 5800,
["Expand_Polish"] = 2600,
["Expand_Portuguese"] = 2600,
["Expand_Russian"] = 5500,
["Expand_Spanish"] = 9400,
["Expand_Turkish"] = 2000,
["Expand_language"] = 97000,
["Expand_list"] = 6700,
["Expand_section"] = 38000,
["Expand_wikitext"] = 120000,
["Explain"] = 3000,
["Extended_confirmed_topicon"] = 2200,
["Extended_confirmed–protected"] = 11000,
["Extended_football_squad_player"] = 8000,
["Extended_football_squad_start"] = 8100,
["External_links"] = 3000,
["External_media"] = 13000,
["External_music_video"] = 34000,
["Extinct"] = 16000,
["Extra_album_cover"] = 8500,
["Extra_chronology"] = 18000,
["Extract"] = 10000,
["Module:EFloras"] = 2100,
["Module:EditAtWikidata"] = 2200000,
["Module:Effective_protection_expiry"] = 75000,
["Module:Effective_protection_level"] = 80000,
["Module:Election_results"] = 12000,
["Module:Endangered_Languages_Project"] = 12000,
["Module:English_variant_notice"] = 81000,
["Module:Engvar"] = 18000,
["Module:Engvar/detect"] = 3600,
["Module:Episode_list"] = 30000,
["Module:Episode_table"] = 29000,
["Module:Episode_table/styles.css"] = 29000,
["Module:Error"] = 53000,
["Module:Escape"] = 14000,
["Module:Excerpt"] = 15000,
["Module:Excerpt/config"] = 15000,
["Module:Excerpt/portals"] = 5000,
["Module:Excerpt/styles.css"] = 14000,
["Module:Exist_not_redirect"] = 82000,
["Module:Expand_wikitext"] = 120000,
["Module:Exponential_search"] = 749000,
["Module:External_links"] = 82000,
["Module:External_links/conf"] = 82000,
["Module:External_links/conf/Sports"] = 82000,
}
qnlu0zp6kepqlo87hzi4hjvxxu7o4tf
Tempilet:Enum/doc
10
2528
33109
2026-09-26T13:51:48Z
en>Paine Ellsworth
0
update /doc
33109
wikitext
text/x-wiki
{{Documentation subpage}}
{{Lua|Module:Separated entries}}
{{used in system}}
Outputs each of the parameters separated by commas and, between the second last and last, the word " and " (this can be changed with the {{para|and}} parameter). Any number of parameters may be specified.
It is intended for use by other templates to output a suitably formatted list when the number of parameters varies. Named parameters, except for those specified below, are discarded.
White space in parameters is discarded. To include white space, use a [[character entity reference]] or [[numeric character reference]].
== Usage ==
{{tlx|Enum|{{var|first}}|{{var|second}}|{{var|third}}|{{var|...}}}}
==Parameters==
* {{para|after}}: The text to follow the final item. This might be a semicolon, for example. The default is to have no following text. This is not used if the list is empty (has no items).
* {{para|and}}: The text to use where by default " and " is written. This may be overridden if there is a preference for a comma before the "and", or where it makes sense to write it in a language other than English, for example.
* {{para|comma}}: The text to use between items except the last and one-before-last. If not specified, the default is ", ".
Any of the named parameters can be set empty; this differs from them not being present (i.e. use the default).
== Examples ==
More examples are given in the [[{{FULLBASEPAGENAME}}/testcases|test cases]].
{| class="wikitable"
! Input !! Output
|-
| {{tlc|{{BASEPAGENAME}}}} || {{{{BASEPAGENAME}}|}}
|-
| {{tlc|{{BASEPAGENAME}}|A}} || {{{{BASEPAGENAME}}|A}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B}} || {{{{BASEPAGENAME}}|A|B}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B|C}} || {{{{BASEPAGENAME}}|A|B|C}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B|C|D}} || {{{{BASEPAGENAME}}|A|B|C|D}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B|C|D|and{{=}}, and{{tl|space}}}} || {{{{BASEPAGENAME}}|A|B|C|D|and=, and{{space}}}}
|}
== See also ==
* {{tl|Separated entries}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Inline list formatting templates]]
}}</includeonly>
bgfnanhk0m6qa3qihwsnw6tnyizlo3n
33110
33109
2026-11-11T21:21:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Enum/doc]]
33109
wikitext
text/x-wiki
{{Documentation subpage}}
{{Lua|Module:Separated entries}}
{{used in system}}
Outputs each of the parameters separated by commas and, between the second last and last, the word " and " (this can be changed with the {{para|and}} parameter). Any number of parameters may be specified.
It is intended for use by other templates to output a suitably formatted list when the number of parameters varies. Named parameters, except for those specified below, are discarded.
White space in parameters is discarded. To include white space, use a [[character entity reference]] or [[numeric character reference]].
== Usage ==
{{tlx|Enum|{{var|first}}|{{var|second}}|{{var|third}}|{{var|...}}}}
==Parameters==
* {{para|after}}: The text to follow the final item. This might be a semicolon, for example. The default is to have no following text. This is not used if the list is empty (has no items).
* {{para|and}}: The text to use where by default " and " is written. This may be overridden if there is a preference for a comma before the "and", or where it makes sense to write it in a language other than English, for example.
* {{para|comma}}: The text to use between items except the last and one-before-last. If not specified, the default is ", ".
Any of the named parameters can be set empty; this differs from them not being present (i.e. use the default).
== Examples ==
More examples are given in the [[{{FULLBASEPAGENAME}}/testcases|test cases]].
{| class="wikitable"
! Input !! Output
|-
| {{tlc|{{BASEPAGENAME}}}} || {{{{BASEPAGENAME}}|}}
|-
| {{tlc|{{BASEPAGENAME}}|A}} || {{{{BASEPAGENAME}}|A}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B}} || {{{{BASEPAGENAME}}|A|B}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B|C}} || {{{{BASEPAGENAME}}|A|B|C}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B|C|D}} || {{{{BASEPAGENAME}}|A|B|C|D}}
|-
| {{tlc|{{BASEPAGENAME}}|A|B|C|D|and{{=}}, and{{tl|space}}}} || {{{{BASEPAGENAME}}|A|B|C|D|and=, and{{space}}}}
|}
== See also ==
* {{tl|Separated entries}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Inline list formatting templates]]
}}</includeonly>
bgfnanhk0m6qa3qihwsnw6tnyizlo3n
Tempilet:Sigfig
10
2529
33112
2018-02-23T16:30:23Z
en>Primefac
0
Changed protection level for "[[Template:Sigfig]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33112
wikitext
text/x-wiki
#REDIRECT [[Template:Significant figures]]
{{Redirect category shell|
{{R from move}}
{{R from template shortcut}}
}}
6liq0tocaomv3w5pnzdg0n7d2hqs805
33113
33112
2026-11-11T21:29:19Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Sigfig]]
33112
wikitext
text/x-wiki
#REDIRECT [[Template:Significant figures]]
{{Redirect category shell|
{{R from move}}
{{R from template shortcut}}
}}
6liq0tocaomv3w5pnzdg0n7d2hqs805
Tempilet:Protected template
10
2530
33118
2026-11-05T08:41:02Z
en>RMCD bot
0
Removing notice of move discussion
33118
wikitext
text/x-wiki
<includeonly>{{#invoke:Protected page|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
be35s04n7ulj8q1ihft9660mipq8pnb
33119
33118
2026-11-11T21:29:20Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Protected_template]]
33118
wikitext
text/x-wiki
<includeonly>{{#invoke:Protected page|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
be35s04n7ulj8q1ihft9660mipq8pnb
Tempilet:Ethnologue27
10
2531
33120
2024-05-19T18:00:40Z
en>MusikBot II
0
Protected "[[Template:Ethnologue27]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 250 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33120
wikitext
text/x-wiki
{{#if: {{{1|}}}
|[https://www.ethnologue.com/language/{{{1|}}} {{{2|{{PAGENAME}}}}}] at ''[[Ethnologue]]'' (27th ed., 2024) {{closed access}}
|{{cite book|editor-last1 = Eberhard| editor-first1 = David M.| editor-last2 = Simons| editor-first2 = Gary F.| editor-last3 = Fennig| editor-first3 = Charles D.| year=2024|title=Ethnologue: Languages of the World|edition=27th|location=Dallas, Texas|publisher=SIL International|url=https://www.ethnologue.com}}
}}<includeonly>[[Category:Language articles citing Ethnologue 27]]</includeonly><noinclude>{{documentation}}</noinclude>
pahnj70hyo2d51h1yp6uv3vojlpi9jy
33121
33120
2026-11-11T21:30:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Ethnologue27]]
33120
wikitext
text/x-wiki
{{#if: {{{1|}}}
|[https://www.ethnologue.com/language/{{{1|}}} {{{2|{{PAGENAME}}}}}] at ''[[Ethnologue]]'' (27th ed., 2024) {{closed access}}
|{{cite book|editor-last1 = Eberhard| editor-first1 = David M.| editor-last2 = Simons| editor-first2 = Gary F.| editor-last3 = Fennig| editor-first3 = Charles D.| year=2024|title=Ethnologue: Languages of the World|edition=27th|location=Dallas, Texas|publisher=SIL International|url=https://www.ethnologue.com}}
}}<includeonly>[[Category:Language articles citing Ethnologue 27]]</includeonly><noinclude>{{documentation}}</noinclude>
pahnj70hyo2d51h1yp6uv3vojlpi9jy
Tempilet:Ordinal
10
2532
33122
2018-02-24T21:30:49Z
en>JJMC89
0
allow subst
33122
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Ordinal|ordinal}}<noinclude>
{{documentation}}
</noinclude>
658r10ag7rv4b2nxz38rgs2wn4gljqn
33123
33122
2026-11-11T21:30:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Ordinal]]
33122
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#invoke:Ordinal|ordinal}}<noinclude>
{{documentation}}
</noinclude>
658r10ag7rv4b2nxz38rgs2wn4gljqn
Module:Ordinal
828
2533
33124
2019-03-17T19:44:32Z
en>Pppery
0
[[Module:Ordinal/testcases]] doesn't exist; no prejudice against reverting when the testcases are created
33124
Scribunto
text/plain
--[[
This template will add the appropriate ordinal suffix to a given integer.
Please do not modify this code without applying the changes first at
Module:Ordinal/sandbox and testing.
]]
local p = {}
local yesno = require('Module:Yesno') -- boolean value interpretation
--[[
This function converts an integer value into a numeral followed by ordinal indicator.
The output string might contain HTML tags.
Usage:
{{#invoke:Ordinal|ordinal|1=|2=|sup=}}
{{#invoke:Ordinal|ordinal}} - uses the caller's parameters
Parameters
1: Any number or string.
2: Set to "d" if the module should display "d" instead of "nd" and "rd".
sup: Set to yes/no to toggle superscript ordinal suffix.
]]
function p.ordinal(frame)
local args = frame.args
if args[1] == nil then
args = frame:getParent().args
end
if args[1] == nil then
args[1] = "{{{1}}}"
end
return p._ordinal(args[1], (args[2] == 'd'), yesno(args.sup))
end
function p._ordinal(n, d, sup)
local x = tonumber(mw.ustring.match(n, "(%d*)%W*$"))
local suffix = "th"
-- If tonumber(n) worked:
if x then
local mod10 = math.abs(x) % 10
local mod100 = math.abs(x) % 100
if mod10 == 1 and mod100 ~= 11 then
suffix = "st"
elseif mod10 == 2 and mod100 ~= 12 then
if d then suffix = "d" else suffix = "nd" end
elseif mod10 == 3 and mod100 ~= 13 then
if d then suffix = "d" else suffix = "rd" end
end
end
if sup then
suffix = "<sup>" .. suffix .. "</sup>"
end
return n .. suffix
end
return p
azbrsdhoe8ec6qvwgy7myjj7iz9onjy
33125
33124
2026-11-11T21:30:00Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Ordinal]]
33124
Scribunto
text/plain
--[[
This template will add the appropriate ordinal suffix to a given integer.
Please do not modify this code without applying the changes first at
Module:Ordinal/sandbox and testing.
]]
local p = {}
local yesno = require('Module:Yesno') -- boolean value interpretation
--[[
This function converts an integer value into a numeral followed by ordinal indicator.
The output string might contain HTML tags.
Usage:
{{#invoke:Ordinal|ordinal|1=|2=|sup=}}
{{#invoke:Ordinal|ordinal}} - uses the caller's parameters
Parameters
1: Any number or string.
2: Set to "d" if the module should display "d" instead of "nd" and "rd".
sup: Set to yes/no to toggle superscript ordinal suffix.
]]
function p.ordinal(frame)
local args = frame.args
if args[1] == nil then
args = frame:getParent().args
end
if args[1] == nil then
args[1] = "{{{1}}}"
end
return p._ordinal(args[1], (args[2] == 'd'), yesno(args.sup))
end
function p._ordinal(n, d, sup)
local x = tonumber(mw.ustring.match(n, "(%d*)%W*$"))
local suffix = "th"
-- If tonumber(n) worked:
if x then
local mod10 = math.abs(x) % 10
local mod100 = math.abs(x) % 100
if mod10 == 1 and mod100 ~= 11 then
suffix = "st"
elseif mod10 == 2 and mod100 ~= 12 then
if d then suffix = "d" else suffix = "nd" end
elseif mod10 == 3 and mod100 ~= 13 then
if d then suffix = "d" else suffix = "rd" end
end
end
if sup then
suffix = "<sup>" .. suffix .. "</sup>"
end
return n .. suffix
end
return p
azbrsdhoe8ec6qvwgy7myjj7iz9onjy
Tempilet:Closed access
10
2534
33126
2025-08-13T01:08:33Z
en>Pppery
0
Changed protection settings for "[[Template:Closed access]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33126
wikitext
text/x-wiki
<span style="position:relative; top: -2px;">[[File:Closed Access logo transparent.svg|9px|link=Paywall|closed access publication – behind paywall|alt=Closed access icon]]</span><noinclude>{{access level documentation}}</noinclude>
gb1gm1ieixlg81svhg4e2sdcx3mc7oy
33127
33126
2026-11-11T21:30:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Closed_access]]
33126
wikitext
text/x-wiki
<span style="position:relative; top: -2px;">[[File:Closed Access logo transparent.svg|9px|link=Paywall|closed access publication – behind paywall|alt=Closed access icon]]</span><noinclude>{{access level documentation}}</noinclude>
gb1gm1ieixlg81svhg4e2sdcx3mc7oy
Tempilet:Ethnologue27/doc
10
2535
33128
2024-12-22T06:42:26Z
en>HungKhanh0106
0
/* Examples */ change for header One parameter
33128
wikitext
text/x-wiki
{{Documentation subpage<noinclude>|override={{lc:{{SUBPAGENAME}}}}</noinclude>}}
<!-- Place categories where indicated at the bottom of this page and interwikis at Wikidata -->
<includeonly>
{{Template shortcut|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}}}</includeonly>
'''{{NAMESPACE}}:<includeonly>{{BASEPAGENAME}}</includeonly><noinclude>Ethnologue''N''</noinclude>''' is designed for use in the reference section of a language article. It links to the appropriate article at ''[[Ethnologue]]'', <includeonly>{{ordinal|{{#invoke:string|sub|{{BASEPAGENAME}}|11}}}}</includeonly><noinclude>''N''th</noinclude> edition.
== Usage ==
<noinclude>{{memo|Examples are omitted when viewed on the shared doc page for technical reasons; see them at e.g. [[Template:Ethnologue14]].}}</noinclude>
; One parameter
: Replace <code>XYZ</code> with the [[ISO 639-3]] code for the language. The page name will be used as the [[link text]]
<includeonly>: {{tld|{{BASEPAGENAME}}|XYZ}}
: {{tld|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}|XYZ}}</includeonly>
; Two parameters
: Replace <code>ABC</code> with the link text to be displayed. This may be useful if the ''Ethnologue'' name differs from the page name of the Wikipedia article.
<includeonly>: {{tld|{{BASEPAGENAME}}|XYZ|ABC}}
: {{tld|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}|XYZ|ABC}}</includeonly>
; No parameters
: The template will revert to a generic citation and link to ''Ethnologue''
<includeonly>: {{tld|{{BASEPAGENAME}}}}
: {{tld|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}}}</includeonly>
== Examples ==
; One parameter
<includeonly>: {{tld|{{BASEPAGENAME}}|eng}}
: {{ {{BASEPAGENAME}}|eng}}</includeonly>
; Two parameters
<includeonly>: {{tld|{{BASEPAGENAME}}|eng|English}}
: {{ {{BASEPAGENAME}}|eng|English}}</includeonly>
; No parameters
<includeonly>: {{tld|{{BASEPAGENAME}}}}
: {{ {{BASEPAGENAME}} }}</includeonly>
==Note==
For a reference to the ''Ethnologue'' population figures, enter "e<includeonly>{{#invoke:string|sub|{{BASEPAGENAME}}|11}}</includeonly><noinclude>(number)</noinclude>" in the <code>ref</code> parameter of {{tl|Infobox language}}. This will automatically generate a reference based on this template, and is easier for other editors to update.
==See also==
* {{tl|Ethnolink}}, for inline links when the data is not date-dependent<!--
-->{{#ifexist:Template:Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-1}}|2}}|
* {{tl|Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-1}}|2}}}}, <!--
-->{{#ifexist:Template:Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-2}}|2}}|{{tl|Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-2}}|2}}}}, }} etc., for references to the previous editions
}}
* Newer and older versions of this template can be found at [[:Category:Language external link templates]]
* The link format <code><nowiki>[[Ethnologue:xxx]]</nowiki></code> can also be used, e.g. [[Ethnologue:ENG]]
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "Language code",
"type": "string",
"suggested": true,
"description": "The ISO 639-3 code for the language."
},
"2": {
"label": "Link text",
"type": "string",
"description": "The link text to be displayed. This may be useful if the Ethnologue name differs from the page name of the Wikipedia article. If you omit it, the page title will be displayed as the link text."
}
},
"description": "This template is designed for use in the reference section of a language article. It links to the appropriate article at the relevant edition of the Ethnologue. "
}
</templatedata>
<includeonly>{{sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Language external link templates|Ethnologue]]
}}</includeonly>
hrtkz8gdktavrn6c860mk1xeqswefjv
33129
33128
2026-11-11T21:30:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Ethnologue27/doc]]
33128
wikitext
text/x-wiki
{{Documentation subpage<noinclude>|override={{lc:{{SUBPAGENAME}}}}</noinclude>}}
<!-- Place categories where indicated at the bottom of this page and interwikis at Wikidata -->
<includeonly>
{{Template shortcut|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}}}</includeonly>
'''{{NAMESPACE}}:<includeonly>{{BASEPAGENAME}}</includeonly><noinclude>Ethnologue''N''</noinclude>''' is designed for use in the reference section of a language article. It links to the appropriate article at ''[[Ethnologue]]'', <includeonly>{{ordinal|{{#invoke:string|sub|{{BASEPAGENAME}}|11}}}}</includeonly><noinclude>''N''th</noinclude> edition.
== Usage ==
<noinclude>{{memo|Examples are omitted when viewed on the shared doc page for technical reasons; see them at e.g. [[Template:Ethnologue14]].}}</noinclude>
; One parameter
: Replace <code>XYZ</code> with the [[ISO 639-3]] code for the language. The page name will be used as the [[link text]]
<includeonly>: {{tld|{{BASEPAGENAME}}|XYZ}}
: {{tld|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}|XYZ}}</includeonly>
; Two parameters
: Replace <code>ABC</code> with the link text to be displayed. This may be useful if the ''Ethnologue'' name differs from the page name of the Wikipedia article.
<includeonly>: {{tld|{{BASEPAGENAME}}|XYZ|ABC}}
: {{tld|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}|XYZ|ABC}}</includeonly>
; No parameters
: The template will revert to a generic citation and link to ''Ethnologue''
<includeonly>: {{tld|{{BASEPAGENAME}}}}
: {{tld|E{{#invoke:string|sub|{{BASEPAGENAME}}|11}}}}</includeonly>
== Examples ==
; One parameter
<includeonly>: {{tld|{{BASEPAGENAME}}|eng}}
: {{ {{BASEPAGENAME}}|eng}}</includeonly>
; Two parameters
<includeonly>: {{tld|{{BASEPAGENAME}}|eng|English}}
: {{ {{BASEPAGENAME}}|eng|English}}</includeonly>
; No parameters
<includeonly>: {{tld|{{BASEPAGENAME}}}}
: {{ {{BASEPAGENAME}} }}</includeonly>
==Note==
For a reference to the ''Ethnologue'' population figures, enter "e<includeonly>{{#invoke:string|sub|{{BASEPAGENAME}}|11}}</includeonly><noinclude>(number)</noinclude>" in the <code>ref</code> parameter of {{tl|Infobox language}}. This will automatically generate a reference based on this template, and is easier for other editors to update.
==See also==
* {{tl|Ethnolink}}, for inline links when the data is not date-dependent<!--
-->{{#ifexist:Template:Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-1}}|2}}|
* {{tl|Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-1}}|2}}}}, <!--
-->{{#ifexist:Template:Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-2}}|2}}|{{tl|Ethnologue{{padleft:{{#expr:{{#invoke:string|sub|{{BASEPAGENAME}}|11}}-2}}|2}}}}, }} etc., for references to the previous editions
}}
* Newer and older versions of this template can be found at [[:Category:Language external link templates]]
* The link format <code><nowiki>[[Ethnologue:xxx]]</nowiki></code> can also be used, e.g. [[Ethnologue:ENG]]
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "Language code",
"type": "string",
"suggested": true,
"description": "The ISO 639-3 code for the language."
},
"2": {
"label": "Link text",
"type": "string",
"description": "The link text to be displayed. This may be useful if the Ethnologue name differs from the page name of the Wikipedia article. If you omit it, the page title will be displayed as the link text."
}
},
"description": "This template is designed for use in the reference section of a language article. It links to the appropriate article at the relevant edition of the Ethnologue. "
}
</templatedata>
<includeonly>{{sandbox other||
<!-- Categories below this line; interwikis at Wikidata -->
[[Category:Language external link templates|Ethnologue]]
}}</includeonly>
hrtkz8gdktavrn6c860mk1xeqswefjv
Tempilet:Significant figures
10
2536
33130
2026-09-04T15:53:32Z
en>Frietjes
0
add safesubst:
33130
wikitext
text/x-wiki
{{safesubst:<noinclude />#ifeq:{{{1<noinclude>|0</noinclude>}}}|0
|0
|{{safesubst:<noinclude />significant figures/{{safesubst:<noinclude />#if:{{{2|}}}
|rnd
|sum
}}
|1={{safesubst:<noinclude />formatnum:{{{1}}}|R}}
|2={{{2}}}
|3={{safesubst:<noinclude />Order of magnitude|{{safesubst:<noinclude />formatnum:{{{1}}}|R}}}}
}}
}}<noinclude>
{{documentation}}
</noinclude>
0vlashq5zfxlv757t54zuw7jqy8d8ec
33131
33130
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Significant_figures]]
33130
wikitext
text/x-wiki
{{safesubst:<noinclude />#ifeq:{{{1<noinclude>|0</noinclude>}}}|0
|0
|{{safesubst:<noinclude />significant figures/{{safesubst:<noinclude />#if:{{{2|}}}
|rnd
|sum
}}
|1={{safesubst:<noinclude />formatnum:{{{1}}}|R}}
|2={{{2}}}
|3={{safesubst:<noinclude />Order of magnitude|{{safesubst:<noinclude />formatnum:{{{1}}}|R}}}}
}}
}}<noinclude>
{{documentation}}
</noinclude>
0vlashq5zfxlv757t54zuw7jqy8d8ec
Tempilet:Round
10
2538
33132
2022-07-09T01:53:46Z
en>Neveselbert
0
safesubst
33132
wikitext
text/x-wiki
<includeonly>{{safesubst<noinclude/>:#iferror:{{#expr:{{{2|0}}}}} |
{{main other|[[Category:Pages with bad rounding precision]]}}{{hid|Bad rounding here}}<!--
-->{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | 1-{{order of magnitude|{{{1}}}}} }}|
{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | {{{2|0}}}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
i8oc299m624152gpa7ay2vy2yqe4e6m
33133
33132
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Round]]
33132
wikitext
text/x-wiki
<includeonly>{{safesubst<noinclude/>:#iferror:{{#expr:{{{2|0}}}}} |
{{main other|[[Category:Pages with bad rounding precision]]}}{{hid|Bad rounding here}}<!--
-->{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | 1-{{order of magnitude|{{{1}}}}} }}|
{{safesubst<noinclude/>:#invoke:Math|precision_format| {{{1}}} | {{{2|0}}}}}}}</includeonly><noinclude>
{{documentation}}
</noinclude>
i8oc299m624152gpa7ay2vy2yqe4e6m
Tempilet:Precision
10
2539
33134
2017-03-25T12:38:46Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:Precision]]": Allowing template editors on some templates with full protection dating back to pre-[[WP:TPROT|TPROT]] times which aren't too often or too sensitively used. ([Edit=Require template editor access] (...
33134
wikitext
text/x-wiki
<includeonly>{{#invoke:Math|precision|{{{1|0}}}|check_fraction=true}}</includeonly><noinclude>
{{documentation}}
</noinclude>
hbl3vf33a239ici6o7feo2ici90hboa
33135
33134
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Precision]]
33134
wikitext
text/x-wiki
<includeonly>{{#invoke:Math|precision|{{{1|0}}}|check_fraction=true}}</includeonly><noinclude>
{{documentation}}
</noinclude>
hbl3vf33a239ici6o7feo2ici90hboa
Tempilet:Order of magnitude
10
2540
33136
2025-03-12T08:53:01Z
en>Johnuniq
0
Undid revision [[Special:Diff/1279884239|1279884239]] by [[Special:Contributions/Dinoguy1000|Dinoguy1000]] ([[User talk:Dinoguy1000|talk]]) please STOP breaking articles; test changes in a sandbox and ask for help at [[WP:VPT]]
33136
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#ifexpr:{{{1|0}}}=0
|{{safesubst:<noinclude/>#ifexpr:abs{{{1|0}}}1=1
|0
|{{safesubst:<noinclude/>#expr:floor((ln(abs{{{1}}}1)/ln10)+1)}}
}}
|{{safesubst:<noinclude/>#expr:floor((ln(abs({{{1|0}}}) )/ln 10)+1E((abs{{{1|0}}}>1E100 or abs{{{1|0}}}<1E-100)-14))}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
o5x97tr9z1fixe14ip2xcqhbr1akroo
33137
33136
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Order_of_magnitude]]
33136
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#ifexpr:{{{1|0}}}=0
|{{safesubst:<noinclude/>#ifexpr:abs{{{1|0}}}1=1
|0
|{{safesubst:<noinclude/>#expr:floor((ln(abs{{{1}}}1)/ln10)+1)}}
}}
|{{safesubst:<noinclude/>#expr:floor((ln(abs({{{1|0}}}) )/ln 10)+1E((abs{{{1|0}}}>1E100 or abs{{{1|0}}}<1E-100)-14))}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
o5x97tr9z1fixe14ip2xcqhbr1akroo
Tempilet:Significant figures/rnd
10
2541
33138
2026-09-04T15:54:21Z
en>Frietjes
0
add safesubst:
33138
wikitext
text/x-wiki
<includeonly>{{safesubst:Round|{{{1}}}|{{{2}}}-{{{3}}}-1}}</includeonly><noinclude>
{{documentation}}
</noinclude>
5qd0lntv7gd38nq04fydceyqzugqx0k
33139
33138
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Significant_figures/rnd]]
33138
wikitext
text/x-wiki
<includeonly>{{safesubst:Round|{{{1}}}|{{{2}}}-{{{3}}}-1}}</includeonly><noinclude>
{{documentation}}
</noinclude>
5qd0lntv7gd38nq04fydceyqzugqx0k
Tempilet:Significant figures/sum
10
2542
33140
2026-09-04T15:54:45Z
en>Frietjes
0
add safesubst:
33140
wikitext
text/x-wiki
<includeonly>{{safesubst:#expr:{{{3}}}+{{safesubst:precision|{{{1}}}}}+1}}</includeonly><noinclude>
{{documentation|content=
This subtemplate counts significant figures in a number.
[[Category:Subtemplates of mathematical function templates|sum]]
}}
</noinclude>
8s0618o0le5dd656nava77s5fc5wwrz
33141
33140
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Significant_figures/sum]]
33140
wikitext
text/x-wiki
<includeonly>{{safesubst:#expr:{{{3}}}+{{safesubst:precision|{{{1}}}}}+1}}</includeonly><noinclude>
{{documentation|content=
This subtemplate counts significant figures in a number.
[[Category:Subtemplates of mathematical function templates|sum]]
}}
</noinclude>
8s0618o0le5dd656nava77s5fc5wwrz
Tempilet:Significant figures/doc
10
2543
33142
2026-08-31T10:14:12Z
en>Suðurhafsljósæta
0
Fix hr
33142
wikitext
text/x-wiki
{{documentation subpage}}
{{High-use}}
{{template shortcut|sigfig}}
This template has two different functions dependent on input.
#If only one parameter is given the template counts the number of [[significant figures]] of the given number within the ranges 10<sup>12</sup> to 10<sup>{{formatnum:-12}}</sup> and {{formatnum:-10}}<sup>{{formatnum:-12}} </sup> to {{formatnum:-10}}<sup>12</sup>. It ignores any digits outside this range<!--... maybe -->.
#If two parameters are given the template rounds the first number to the number of significant figures given by the second. If the given number has 10 or more digits, the result is returned in [[scientific notation]].
== Examples ==
=== Two parameters ===
*{{tld|significant figures|123.456|7|_show_result=y}}
*{{tld|significant figures|123.456|6|_show_result=y}}
*{{tld|significant figures|123.456|5|_show_result=y}}
*{{tld|significant figures|123.456|4|_show_result=y}}
----
*{{tld|significant figures|123,456|3|_show_result=y}}
*{{tld|significant figures|12345.6|3|_show_result=y}}
*{{tld|significant figures|1234.56|3|_show_result=y}}
*{{tld|significant figures|12.3456|3|_show_result=y}}
*{{tld|significant figures|1.23456|3|_show_result=y}}
----
*{{tld|significant figures|.123456|3|_show_result=y}}
*{{tld|significant figures|.0123456|3|_show_result=y}}
*{{tld|significant figures|.00123456|3|_show_result=y}}
*{{tld|significant figures|0.123456|3|_show_result=y}}
*{{tld|significant figures|0.0123456|3|_show_result=y}}
*{{tld|significant figures|0.00123456|3|_show_result=y}}
----
*{{tld|significant figures|123.456|2|_show_result=y}}
*{{tld|significant figures|123.456|1|_show_result=y}}
*{{tld|significant figures|123.456|0|_show_result=y}}
----
*{{tld|significant figures|987654321|9|_show_result=y}}
*{{tld|significant figures|987654321|8|_show_result=y}}
*{{tld|significant figures|987654321|7|_show_result=y}}
*{{tld|significant figures|987654321|6|_show_result=y}}
*{{tld|significant figures|987654321|5|_show_result=y}}
*{{tld|significant figures|987654321|4|_show_result=y}}
*{{tld|significant figures|987654321|3|_show_result=y}}
*{{tld|significant figures|987654321|2|_show_result=y}}
*{{tld|significant figures|987654321|1|_show_result=y}}
----
*{{tld|significant figures|9876543210|3|_show_result=y}}
*{{tld|significant figures|98765432100|3|_show_result=y}}
*{{tld|significant figures|987654321000|3|_show_result=y}}
*{{tld|significant figures|9876543210000|3|_show_result=y}}
=== One parameter ===
*{{tld|significant figures|123400|_show_result=y}}
*{{tld|significant figures|12340|_show_result=y}}
*{{tld|significant figures|1234|_show_result=y}}
*{{tld|significant figures|123.4|_show_result=y}}
*{{tld|significant figures|12.34|_show_result=y}}
*{{tld|significant figures|1.234|_show_result=y}}
----
*{{tld|significant figures|0.1234|_show_result=y}}
*{{tld|significant figures|0.01234|_show_result=y}}
*{{tld|significant figures|0.001234|_show_result=y}}
*{{tld|significant figures|.1234|_show_result=y}}
*{{tld|significant figures|.01234|_show_result=y}}
*{{tld|significant figures|.001234|_show_result=y}}
----
*{{tld|significant figures|-123.4|_show_result=y}}
*{{tld|significant figures|-12.34|_show_result=y}}
*{{tld|significant figures|-1.234|_show_result=y}}
== Supporting templates and modules ==
* {{tl|Significant figures/rnd}}, which uses {{tl|Rnd}}, which uses {{module link|Math|precision_format}}
* {{tl|Significant figures/sum}}, which uses {{tl|Precision}}, which uses {{module link|Math|precision}}
* {{tl|Order of magnitude}}
<includeonly>{{Sandbox other||
[[Category:Mathematical function templates]]
}}</includeonly>
otjtxuh16zkfnvoo7qvv35p3sq6b6v4
33143
33142
2026-11-11T21:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Significant_figures/doc]]
33142
wikitext
text/x-wiki
{{documentation subpage}}
{{High-use}}
{{template shortcut|sigfig}}
This template has two different functions dependent on input.
#If only one parameter is given the template counts the number of [[significant figures]] of the given number within the ranges 10<sup>12</sup> to 10<sup>{{formatnum:-12}}</sup> and {{formatnum:-10}}<sup>{{formatnum:-12}} </sup> to {{formatnum:-10}}<sup>12</sup>. It ignores any digits outside this range<!--... maybe -->.
#If two parameters are given the template rounds the first number to the number of significant figures given by the second. If the given number has 10 or more digits, the result is returned in [[scientific notation]].
== Examples ==
=== Two parameters ===
*{{tld|significant figures|123.456|7|_show_result=y}}
*{{tld|significant figures|123.456|6|_show_result=y}}
*{{tld|significant figures|123.456|5|_show_result=y}}
*{{tld|significant figures|123.456|4|_show_result=y}}
----
*{{tld|significant figures|123,456|3|_show_result=y}}
*{{tld|significant figures|12345.6|3|_show_result=y}}
*{{tld|significant figures|1234.56|3|_show_result=y}}
*{{tld|significant figures|12.3456|3|_show_result=y}}
*{{tld|significant figures|1.23456|3|_show_result=y}}
----
*{{tld|significant figures|.123456|3|_show_result=y}}
*{{tld|significant figures|.0123456|3|_show_result=y}}
*{{tld|significant figures|.00123456|3|_show_result=y}}
*{{tld|significant figures|0.123456|3|_show_result=y}}
*{{tld|significant figures|0.0123456|3|_show_result=y}}
*{{tld|significant figures|0.00123456|3|_show_result=y}}
----
*{{tld|significant figures|123.456|2|_show_result=y}}
*{{tld|significant figures|123.456|1|_show_result=y}}
*{{tld|significant figures|123.456|0|_show_result=y}}
----
*{{tld|significant figures|987654321|9|_show_result=y}}
*{{tld|significant figures|987654321|8|_show_result=y}}
*{{tld|significant figures|987654321|7|_show_result=y}}
*{{tld|significant figures|987654321|6|_show_result=y}}
*{{tld|significant figures|987654321|5|_show_result=y}}
*{{tld|significant figures|987654321|4|_show_result=y}}
*{{tld|significant figures|987654321|3|_show_result=y}}
*{{tld|significant figures|987654321|2|_show_result=y}}
*{{tld|significant figures|987654321|1|_show_result=y}}
----
*{{tld|significant figures|9876543210|3|_show_result=y}}
*{{tld|significant figures|98765432100|3|_show_result=y}}
*{{tld|significant figures|987654321000|3|_show_result=y}}
*{{tld|significant figures|9876543210000|3|_show_result=y}}
=== One parameter ===
*{{tld|significant figures|123400|_show_result=y}}
*{{tld|significant figures|12340|_show_result=y}}
*{{tld|significant figures|1234|_show_result=y}}
*{{tld|significant figures|123.4|_show_result=y}}
*{{tld|significant figures|12.34|_show_result=y}}
*{{tld|significant figures|1.234|_show_result=y}}
----
*{{tld|significant figures|0.1234|_show_result=y}}
*{{tld|significant figures|0.01234|_show_result=y}}
*{{tld|significant figures|0.001234|_show_result=y}}
*{{tld|significant figures|.1234|_show_result=y}}
*{{tld|significant figures|.01234|_show_result=y}}
*{{tld|significant figures|.001234|_show_result=y}}
----
*{{tld|significant figures|-123.4|_show_result=y}}
*{{tld|significant figures|-12.34|_show_result=y}}
*{{tld|significant figures|-1.234|_show_result=y}}
== Supporting templates and modules ==
* {{tl|Significant figures/rnd}}, which uses {{tl|Rnd}}, which uses {{module link|Math|precision_format}}
* {{tl|Significant figures/sum}}, which uses {{tl|Precision}}, which uses {{module link|Math|precision}}
* {{tl|Order of magnitude}}
<includeonly>{{Sandbox other||
[[Category:Mathematical function templates]]
}}</includeonly>
otjtxuh16zkfnvoo7qvv35p3sq6b6v4
Tempilet:Script/Hausawi
10
2550
33145
2024-03-21T06:49:24Z
en>BasilLeaf
0
33145
wikitext
text/x-wiki
{{{{{|safesubst:}}}ifsubst|1=|2=<templatestyles src="Script/alkalami-regular.css" />}}<span class="alkalami-regular script-hausawi" {{#if:{{{lang|}}}|lang="{{{lang}}}"}} {{#ifeq: {{{no_rtl_mark|+}}} | {{{no_rtl_mark|-}}}||dir="rtl"}} style="font-size: {{{size|125%}}}; {{{style|}}}" {{{attributes|}}}>{{{1}}}</span>{{#ifeq: {{{no_rtl_mark|+}}} | {{{no_rtl_mark|-}}}||‎}}<noinclude>{{documentation}}</noinclude>
2hvo8i6rvs38t4nyam8r3991lkv1d59
33146
33145
2026-11-11T21:40:34Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Script/Hausawi]]
33145
wikitext
text/x-wiki
{{{{{|safesubst:}}}ifsubst|1=|2=<templatestyles src="Script/alkalami-regular.css" />}}<span class="alkalami-regular script-hausawi" {{#if:{{{lang|}}}|lang="{{{lang}}}"}} {{#ifeq: {{{no_rtl_mark|+}}} | {{{no_rtl_mark|-}}}||dir="rtl"}} style="font-size: {{{size|125%}}}; {{{style|}}}" {{{attributes|}}}>{{{1}}}</span>{{#ifeq: {{{no_rtl_mark|+}}} | {{{no_rtl_mark|-}}}||‎}}<noinclude>{{documentation}}</noinclude>
2hvo8i6rvs38t4nyam8r3991lkv1d59
Tempilet:Script/Hausawi/doc
10
2551
33147
2026-01-15T17:26:47Z
en>John of Reading
0
/* Fonts information */ Typo fixing, replaced: espeically → especially
33147
wikitext
text/x-wiki
{{Documentation subpage}}
== Usage ==
Template intended to force [[Maghrebi_script#West African_Maghrebi_scripts|Hausawi]] and other West African Arabic calligraphic fonts if installed.
: <nowiki>{{Script/Hausawi|مُتَنٜىٰنْ هَوْسَا}}</nowiki> to give you {{Script/Hausawi|مُتَنٜىٰنْ هَوْسَا}}
* The 1st parameter is mandatory and contains the text written in the Arabic script.
* The optional <code>style</code> parameter can be used to override the generated style (for example another font size) or to specify additional CSS formattings (e.g. color).
* The optional <code>attributes</code> parameter can be used for specifying additional HTML attributes (for example a descriptive <code>title="..."</code>).
== Implementation ==
The template contains this phrase:
<syntaxhighlight lang="wikitext"><span class="Hausawi" dir="rtl" {{#switch:{{lc:{{{2|ha}}}}}
| ha = title="{{#ifeq:{{{2|}}}|ha|Urdu |}}Hausawi" style="font-family: 'Alkalami';
}} font-size: {{{size|110%}}}; font-style: normal; {{{style|}}}">{{{1|}}}</span></syntaxhighlight>
* The font size was fixed at 125% for better readability.
* There is an option to add other languages and their specific fonts if they are in the same calligraphic family but require a different font, either due to stylistic preferences or due to having unique characters not found in "Alkalami".
=== Fonts information ===
;Free fonts:
Template intended to force following fonts if installed:
*[https://fonts.google.com/specimen/Alkalami Alkalami]
This font contain most Arabic character defined in Unicode (see [[Arabic script in Unicode]]), especially letters that are uniquely used either as alternatives to write [[Arabic language|Arabic]], or letters created for use in writing any of the Western African languages for whom this calligraphic style has been part of their literary tradition.
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Script–font templates|H]]
}}</includeonly>
g3m4sw7n5odbhaih4n947i1r8g8ba8m
33148
33147
2026-11-11T21:40:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Script/Hausawi/doc]]
33147
wikitext
text/x-wiki
{{Documentation subpage}}
== Usage ==
Template intended to force [[Maghrebi_script#West African_Maghrebi_scripts|Hausawi]] and other West African Arabic calligraphic fonts if installed.
: <nowiki>{{Script/Hausawi|مُتَنٜىٰنْ هَوْسَا}}</nowiki> to give you {{Script/Hausawi|مُتَنٜىٰنْ هَوْسَا}}
* The 1st parameter is mandatory and contains the text written in the Arabic script.
* The optional <code>style</code> parameter can be used to override the generated style (for example another font size) or to specify additional CSS formattings (e.g. color).
* The optional <code>attributes</code> parameter can be used for specifying additional HTML attributes (for example a descriptive <code>title="..."</code>).
== Implementation ==
The template contains this phrase:
<syntaxhighlight lang="wikitext"><span class="Hausawi" dir="rtl" {{#switch:{{lc:{{{2|ha}}}}}
| ha = title="{{#ifeq:{{{2|}}}|ha|Urdu |}}Hausawi" style="font-family: 'Alkalami';
}} font-size: {{{size|110%}}}; font-style: normal; {{{style|}}}">{{{1|}}}</span></syntaxhighlight>
* The font size was fixed at 125% for better readability.
* There is an option to add other languages and their specific fonts if they are in the same calligraphic family but require a different font, either due to stylistic preferences or due to having unique characters not found in "Alkalami".
=== Fonts information ===
;Free fonts:
Template intended to force following fonts if installed:
*[https://fonts.google.com/specimen/Alkalami Alkalami]
This font contain most Arabic character defined in Unicode (see [[Arabic script in Unicode]]), especially letters that are uniquely used either as alternatives to write [[Arabic language|Arabic]], or letters created for use in writing any of the Western African languages for whom this calligraphic style has been part of their literary tradition.
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Script–font templates|H]]
}}</includeonly>
g3m4sw7n5odbhaih4n947i1r8g8ba8m
Tempilet:Script/alkalami-regular.css
10
2552
33149
2024-04-28T23:23:42Z
en>Andrybak
0
remove {{pp-template}} from unprotected page
33149
sanitized-css
text/css
.alkalami-regular {
font-size: 1.25em;
font-weight: 400;
font-family: 'Alkalami', sans-serif;
font-weight: normal;
}
chth8vvbk1036zygyg29o995ad23jnb
33150
33149
2026-11-11T21:40:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Script/alkalami-regular.css]]
33149
sanitized-css
text/css
.alkalami-regular {
font-size: 1.25em;
font-weight: 400;
font-family: 'Alkalami', sans-serif;
font-weight: normal;
}
chth8vvbk1036zygyg29o995ad23jnb
Tempilet:Pronunciation
10
2553
33151
2026-04-10T01:48:29Z
en>Andrybak
0
move categories to [[/doc]] per [[WP:CAT#T|template categorization guidelines]]
33151
wikitext
text/x-wiki
<includeonly>{{small|{{#switch:{{{3}}}|(|)=(}}{{Audio<!--PLEASE DO NOT SUBST-->|{{{1}}}|{{{2|pronunciation}}}}}{{#switch:{{{3}}}|(|)=)}}}}{{category handler|[[Category:Pages including recorded pronunciations]]}}</includeonly><noinclude>
{{documentation}}
</noinclude>
1w7ujrxsan0u7tfivpdqutriz8bgahi
33152
33151
2026-11-11T21:41:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Pronunciation]]
33151
wikitext
text/x-wiki
<includeonly>{{small|{{#switch:{{{3}}}|(|)=(}}{{Audio<!--PLEASE DO NOT SUBST-->|{{{1}}}|{{{2|pronunciation}}}}}{{#switch:{{{3}}}|(|)=)}}}}{{category handler|[[Category:Pages including recorded pronunciations]]}}</includeonly><noinclude>
{{documentation}}
</noinclude>
1w7ujrxsan0u7tfivpdqutriz8bgahi
Tempilet:Audio templates
10
2554
33153
2023-12-25T01:28:35Z
en>Gonnym
0
33153
wikitext
text/x-wiki
{{navbar|Audio templates|plain=1|style=float:right}}
* {{tl|Listen}} – sets an audio clip off from the main text
** {{tl|Listen image}} – sets an audio clip and an associated image off from the main text
* {{tl|Audio}} – for inline sounds like pronunciations
** {{tl|Audio-IPA}} – a variant of this template to be used with [[International Phonetic Alphabet|IPA]] notation
** {{tl|Pronunciation}} – a shortcut for <code><nowiki>{{small|{{Audio|soundfile.ogg|pronunciation}}}}</nowiki></code>
* {{tl|Spoken Wikipedia}} – for linking [[Wikipedia:WikiProject Spoken Wikipedia|spoken Wikipedia]] article versions
* {{tl|Audio icon}} – adds only the small icon with no links
* {{tl|Inline audio}} – adds a notice with link to [[Wikipedia:Media help]]<noinclude>
<!-- add new list items _before_ the noinclude tag -->{{Documentation}}
</noinclude>
64hxcrdklk7z3l6vucl0nfpg3dmlukd
33154
33153
2026-11-11T21:41:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Audio_templates]]
33153
wikitext
text/x-wiki
{{navbar|Audio templates|plain=1|style=float:right}}
* {{tl|Listen}} – sets an audio clip off from the main text
** {{tl|Listen image}} – sets an audio clip and an associated image off from the main text
* {{tl|Audio}} – for inline sounds like pronunciations
** {{tl|Audio-IPA}} – a variant of this template to be used with [[International Phonetic Alphabet|IPA]] notation
** {{tl|Pronunciation}} – a shortcut for <code><nowiki>{{small|{{Audio|soundfile.ogg|pronunciation}}}}</nowiki></code>
* {{tl|Spoken Wikipedia}} – for linking [[Wikipedia:WikiProject Spoken Wikipedia|spoken Wikipedia]] article versions
* {{tl|Audio icon}} – adds only the small icon with no links
* {{tl|Inline audio}} – adds a notice with link to [[Wikipedia:Media help]]<noinclude>
<!-- add new list items _before_ the noinclude tag -->{{Documentation}}
</noinclude>
64hxcrdklk7z3l6vucl0nfpg3dmlukd
Tempilet:Pronunciation/doc
10
2555
33155
2026-04-10T01:48:23Z
en>Andrybak
0
[[Category:Pronunciation templates]]
33155
wikitext
text/x-wiki
{{Documentation subpage}}
<!--
PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE
-->
==Usage==
This is equivalent of {{tl|Audio}}, except scaled smaller and with the label predefined to "pronunciation".
These codes are equivalent:
: <code><nowiki>Guy Verhofstadt ({{pronunciation|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}) is ...</nowiki></code>
: <code><nowiki>Guy Verhofstadt ({{small|{{Audio|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}}}) is ...</nowiki></code>
which produce:
: Guy Verhofstadt ({{pronunciation|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}) is ...
: Guy Verhofstadt ({{small|{{Audio|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}}}) is ...
If only the first parameter (the file name) is specified:
: <code><nowiki>{{pronunciation|En-us-eye.ogg}}</nowiki></code> → {{pronunciation|En-us-eye.ogg}}
The second parameter can be used to override the label that links to the audio:
: <code><nowiki>{{pronunciation|En-us-eye.ogg|listen}}</nowiki></code> → {{pronunciation|En-us-eye.ogg|listen}}
Set the third parameter to either <code>(</code> or <code>)</code> to enclose the template in parentheses. Compare:
: <code><nowiki>{{</nowiki>[[Template:IPA|IPA]]<nowiki>|[aɪ]}} {{pronunciation|En-us-eye.ogg|listen|(}}</nowiki></code> → {{IPA|[aɪ]}} {{pronunciation|En-us-eye.ogg|listen|(}}
: <code><nowiki>{{IPA|[aɪ]}} {{pronunciation|En-us-eye.ogg|(listen)}}</nowiki></code> → {{IPA|[aɪ]}} {{pronunciation|En-us-eye.ogg|(listen)}}
: <code><nowiki>{{IPA|[aɪ]}} ({{pronunciation|En-us-eye.ogg|listen}})</nowiki></code> → {{IPA|[aɪ]}} ({{pronunciation|En-us-eye.ogg|listen}})
==Tracking category==
This template adds pages in the namespaces main, file, help, category, portal and book to the [[:Category:Pages including recorded pronunciations]] ([[Template:Category handler#Basic usage]]).
== See also ==
* {{tl|Pronunciation needed}}
* {{tl|IPA}}
* {{tl|Respell}} (for [[pronunciation respelling]])
{{Audio templates}}
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "sound file",
"description": "a sound file to link for the term's pronunciation",
"example": "En-us-further.ogg",
"type": "wiki-file-name",
"required": true
},
"2": {
"type": "string",
"label": "label",
"description": "The text to display for the template inline, linked to play the sound file.",
"example": "listen",
"suggested": true,
"default": "pronunciation"
},
"3": {
"label": "surround with parentheses?",
"description": "if \"(\" or \")\", encloses the template in parentheses",
"example": "(",
"type": "string",
"suggested": true
}
},
"description": "provides inline audio for the pronunciation of a term",
"format": "inline"
}
</templatedata>
<includeonly>{{Sandbox other||<!-- CATEGORIES HERE, THANKS -->
[[Category:Audio templates]]
[[Category:Pronunciation templates]]
}}</includeonly>
75qvvy56kj91f2i7iv1maloonvnh2xz
33156
33155
2026-11-11T21:41:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Pronunciation/doc]]
33155
wikitext
text/x-wiki
{{Documentation subpage}}
<!--
PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE
-->
==Usage==
This is equivalent of {{tl|Audio}}, except scaled smaller and with the label predefined to "pronunciation".
These codes are equivalent:
: <code><nowiki>Guy Verhofstadt ({{pronunciation|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}) is ...</nowiki></code>
: <code><nowiki>Guy Verhofstadt ({{small|{{Audio|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}}}) is ...</nowiki></code>
which produce:
: Guy Verhofstadt ({{pronunciation|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}) is ...
: Guy Verhofstadt ({{small|{{Audio|Nl-be guy verhofstadt.ogg|Dutch pronunciation}}}}) is ...
If only the first parameter (the file name) is specified:
: <code><nowiki>{{pronunciation|En-us-eye.ogg}}</nowiki></code> → {{pronunciation|En-us-eye.ogg}}
The second parameter can be used to override the label that links to the audio:
: <code><nowiki>{{pronunciation|En-us-eye.ogg|listen}}</nowiki></code> → {{pronunciation|En-us-eye.ogg|listen}}
Set the third parameter to either <code>(</code> or <code>)</code> to enclose the template in parentheses. Compare:
: <code><nowiki>{{</nowiki>[[Template:IPA|IPA]]<nowiki>|[aɪ]}} {{pronunciation|En-us-eye.ogg|listen|(}}</nowiki></code> → {{IPA|[aɪ]}} {{pronunciation|En-us-eye.ogg|listen|(}}
: <code><nowiki>{{IPA|[aɪ]}} {{pronunciation|En-us-eye.ogg|(listen)}}</nowiki></code> → {{IPA|[aɪ]}} {{pronunciation|En-us-eye.ogg|(listen)}}
: <code><nowiki>{{IPA|[aɪ]}} ({{pronunciation|En-us-eye.ogg|listen}})</nowiki></code> → {{IPA|[aɪ]}} ({{pronunciation|En-us-eye.ogg|listen}})
==Tracking category==
This template adds pages in the namespaces main, file, help, category, portal and book to the [[:Category:Pages including recorded pronunciations]] ([[Template:Category handler#Basic usage]]).
== See also ==
* {{tl|Pronunciation needed}}
* {{tl|IPA}}
* {{tl|Respell}} (for [[pronunciation respelling]])
{{Audio templates}}
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "sound file",
"description": "a sound file to link for the term's pronunciation",
"example": "En-us-further.ogg",
"type": "wiki-file-name",
"required": true
},
"2": {
"type": "string",
"label": "label",
"description": "The text to display for the template inline, linked to play the sound file.",
"example": "listen",
"suggested": true,
"default": "pronunciation"
},
"3": {
"label": "surround with parentheses?",
"description": "if \"(\" or \")\", encloses the template in parentheses",
"example": "(",
"type": "string",
"suggested": true
}
},
"description": "provides inline audio for the pronunciation of a term",
"format": "inline"
}
</templatedata>
<includeonly>{{Sandbox other||<!-- CATEGORIES HERE, THANKS -->
[[Category:Audio templates]]
[[Category:Pronunciation templates]]
}}</includeonly>
75qvvy56kj91f2i7iv1maloonvnh2xz
Tempilet:Ubl
10
2556
33157
2019-09-11T19:30:27Z
en>Paine Ellsworth
0
convert to shell template
33157
wikitext
text/x-wiki
#REDIRECT [[Template:Unbulleted list]]
{{Rcat shell|
{{R from template shortcut}}
}}
cikcgi5hgp5p92i41ss3ow0gq1wyssd
33158
33157
2026-11-11T21:42:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Ubl]]
33157
wikitext
text/x-wiki
#REDIRECT [[Template:Unbulleted list]]
{{Rcat shell|
{{R from template shortcut}}
}}
cikcgi5hgp5p92i41ss3ow0gq1wyssd
Tempilet:NIG
10
2557
33159
2007-03-12T17:30:47Z
en>Andrwsc
0
change to redirect (identical)
33159
wikitext
text/x-wiki
#REDIRECT [[Template:NER]]
6k6za3q4r60iepsrt1zhzrumo3n8z5d
33160
33159
2026-11-11T21:43:39Z
RAPTOR7762
18
1 revision imported from [[:en:Template:NIG]]
33159
wikitext
text/x-wiki
#REDIRECT [[Template:NER]]
6k6za3q4r60iepsrt1zhzrumo3n8z5d
Tempilet:NER
10
2558
33161
2024-02-01T01:54:54Z
en>Ahecht
0
Reduce [[WP:PEIS|post-expand include size]] (via [[WP:JWB]])
33161
wikitext
text/x-wiki
{{#invoke:flag||Niger}}<noinclude>
{{flag template documentation|Niger|NER|NIG|NIG}}
</noinclude>
j0rjumg68nh5vnfqj25529t8lmbmrs9
33162
33161
2026-11-11T21:43:55Z
RAPTOR7762
18
1 revision imported from [[:en:Template:NER]]
33161
wikitext
text/x-wiki
{{#invoke:flag||Niger}}<noinclude>
{{flag template documentation|Niger|NER|NIG|NIG}}
</noinclude>
j0rjumg68nh5vnfqj25529t8lmbmrs9
Tempilet:Preview warning
10
2559
33163
2025-08-05T05:34:31Z
en>Theknightwho
0
Make substable.
33163
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:If preview|pwarning}}</includeonly><noinclude>
{{documentation}}
</noinclude>
c6997f5zp58bnd9g47cgo51gl3zmsu2
33164
33163
2026-11-11T21:43:55Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Preview_warning]]
33163
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:If preview|pwarning}}</includeonly><noinclude>
{{documentation}}
</noinclude>
c6997f5zp58bnd9g47cgo51gl3zmsu2
Tempilet:Getalias
10
2560
33165
2018-12-18T17:22:20Z
en>Frietjes
0
Undid revision 874341463 by [[Special:Contributions/Frietjes|Frietjes]] ([[User talk:Frietjes|talk]])
33165
wikitext
text/x-wiki
{{country data {{{1}}}|getalias/core|name={{{2|}}}|variant={{{variant|{{{3|}}}}}}}}<noinclude>
{{documentation}}
</noinclude>
anrk3h1ng0trq4l9xqx1we1umkopk3n
33166
33165
2026-11-11T21:43:55Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Getalias]]
33165
wikitext
text/x-wiki
{{country data {{{1}}}|getalias/core|name={{{2|}}}|variant={{{variant|{{{3|}}}}}}}}<noinclude>
{{documentation}}
</noinclude>
anrk3h1ng0trq4l9xqx1we1umkopk3n
Tempilet:Getalias/core
10
2561
33167
2024-10-07T20:48:32Z
en>S.A. Julio
0
Removing from [[Category:Flag template system]] using [[c:Help:Cat-a-lot|Cat-a-lot]]
33167
wikitext
text/x-wiki
{{{{{{name|}}} alias-{{{variant}}}|{{{{{{name|}}} alias|{{{alias}}}}}}}}}<noinclude>
{{Documentation|content=This template is used internally by [[Template:getalias]]. It is not intended to be transcluded directly.}}
[[Category:Flag template system cores]]
</noinclude>
4e3aw8q2gzkst0zs5pgdj3mfpnvpckz
33168
33167
2026-11-11T21:43:56Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Getalias/core]]
33167
wikitext
text/x-wiki
{{{{{{name|}}} alias-{{{variant}}}|{{{{{{name|}}} alias|{{{alias}}}}}}}}}<noinclude>
{{Documentation|content=This template is used internally by [[Template:getalias]]. It is not intended to be transcluded directly.}}
[[Category:Flag template system cores]]
</noinclude>
4e3aw8q2gzkst0zs5pgdj3mfpnvpckz
Tempilet:Country data Nijar
10
2562
33169
2024-03-14T22:30:07Z
en>SpinnerLaserzthe2nd
0
33169
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Niger
| flag alias = Flag of Niger.svg
| flag alias-military = Flag of niger armed forces obv.jpg
| link alias-military = Niger Armed Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| redir1 = NER
| redir2 = NIG
</noinclude>
}}
9y8h4yo1wvgfdm9mgpkpvmlgljpcgax
33170
33169
2026-11-11T21:43:56Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Niger]]
33169
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Niger
| flag alias = Flag of Niger.svg
| flag alias-military = Flag of niger armed forces obv.jpg
| link alias-military = Niger Armed Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| redir1 = NER
| redir2 = NIG
</noinclude>
}}
9y8h4yo1wvgfdm9mgpkpvmlgljpcgax
33203
33170
2026-11-11T21:46:25Z
RAPTOR7762
18
RAPTOR7762 moved page [[Tempilet:Country data Niger]] to [[Tempilet:Country data Nijar]]
33169
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Niger
| flag alias = Flag of Niger.svg
| flag alias-military = Flag of niger armed forces obv.jpg
| link alias-military = Niger Armed Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| redir1 = NER
| redir2 = NIG
</noinclude>
}}
9y8h4yo1wvgfdm9mgpkpvmlgljpcgax
33205
33203
2026-11-11T21:46:46Z
RAPTOR7762
18
/* */
33205
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Nijar
| flag alias = Flag of Niger.svg
| flag alias-military = Flag of niger armed forces obv.jpg
| link alias-military = Niger Armed Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| redir1 = NER
| redir2 = NIG
| redir3 = Niger
</noinclude>
}}
t2t3rmyvclzk7vnizf5qv75w1rn2kqb
Module:Flag
828
2563
33171
2026-09-30T22:51:49Z
en>Ahecht
0
make +link tolerant of using pref instead of args[1]
33171
Scribunto
text/plain
local margs = require('Module:Arguments')
local notblank = function (v) return (v or '') ~= '' end
local function _main(frame, name, mode, key)
local categories = {
['Flag icon'] = '[[Category:Flag icons missing country data templates]]' ..
frame:expandTemplate{title = 'Preview warning', args = {'Unrecognized country in Template:flag icon'}},
['Flag decoration'] = '[[Category:Flag decoration missing country data templates]]',
}
local yesno = require('Module:Yesno')
--Get input arguments
local args = margs.getArgs(frame, {
frameOnly = notblank(frame.args.frameonly), valueFunc =
function(argkey,value)
if value then
value = mw.text.trim(value)
--Change empty string to nil for all args except 'image' and 'border'
if argkey=="image" or argkey=="border" or value~="" then
return value
end
end
return nil
end
} )
local preftext, sufftext = "", ""
if string.sub(name, -5) == '+link' then
if args[2] then
args.pref = args.pref or args[1]
else
args[2] = args[1] or ""
end
elseif name == 'Flag athlete' then
args.preftext = args[1]
args[2] = args.code or args[2] or ""
args.variant = args.variant or args[3]
elseif name == 'Flag medalist' then
preftext = (args[1] or "") .. "<br/>"
args[2] = args.code or args[2] or ""
args.variant = args.variant or args[3]
elseif name == 'Flag link' then
args.suff = args[2]
args[2] = args[1] or ""
args.variant = args.variant or args[3]
elseif key ~= nil then
args.variant = args.variant or args[1]
args[2] = key
else
local sports = {
['3x3'] = '3x3',
bb = 'bb',
bd = 'bd',
fb = 'fb',
fbicon = 'fb',
ru = 'ru',
fba = 'fba',
fbw = 'fbw',
fbaicon = 'fba',
futsal = 'futsal'
}
if sports[name]then
args.avar = args[1] and sports[name] or nil
if name == 'fb' and yesno(args.align) == true then
args.align='c'
elseif sports[name] == 'fba' then
if args[1] then
local list = require("Module:Fba/list")
local old = notblank(args.old) and "_old" or ""
local country = args[1]
local fba = list.fbas[country .. old]
if not fba then -- look for aliases
local countryTable = require('Module:CountryData').getcachedtable(frame, country)
if countryTable and countryTable.alias then
country = countryTable.alias
fba = list.fbas[country .. old]
end
end
if args.name == "code" then
args.name = list.codes[country] or country
elseif args.name == "full" then
args.name = fba
end
if fba then
mode = string.gsub(mode, "p", "c")
args.link = fba
end
args.altlink = args.old
elseif args.name == "code" or args.name == "full" then
args.name = ""
end
end
elseif name == "Flag team" and (args.code or args[1]) then
sufftext = ' <span style="font-size:90%;">('..(args.code or args[1])..')</span>'
end
args.variant = args.variant or args[2]
args[2] = args[1] or ""
end
args[1] = mode .. (args.opts or '')
args.missingcategory = notblank(args[2]) and categories[name] or nil
args.noredlink = args.noredlink or 'notext'
if args.placeholder and yesno(args.placeholder) ~= true then
args[1] = args[1] .. 'o'
end
local check = ''
if name == 'Flag icon' and mw.title.getCurrentTitle().namespace == 0 then
local unknown = '[[Category:Pages using ' .. mw.ustring.lower(name) ..
' template with unknown parameters|_VALUE_' .. frame:getParent():getTitle() .. ']]'
local opts = {
unknown=unknown,
preview='Page using [[Template:' .. name .. ']] with unknown parameter "_VALUE_"',
ignoreblank='y',
'1','2','variant','image','size','sz','border','align','al','width',
'w','alt','ilink','noredlink','missingcategory','name','clink','link',
'pref','suff','plink','the','section','altvar','avar','age','nalign',
'nal','text','nodata','opts','placeholder','getParent','frameonly'
}
check = require('Module:Check for unknown parameters')._check(opts,args)
end
return preftext .. require('Module:Flagg').luaMain(frame,args) .. sufftext .. check
end
local p = {
[''] = function (frame) return _main(frame, 'Flag', 'unc' ) end,
decoration = function (frame) return _main(frame, 'Flag decoration', 'uxx' ) end,
icon = function (frame) return _main(frame, 'Flag icon', 'cxxl' ) end,
link = function (frame) return _main(frame, 'Flag link', 'unpe' ) end,
['+link'] = function (frame) return _main(frame, 'Flag+link', 'unpefo') end,
u = function (frame) return _main(frame, 'Flag', 'unu' ) end,
country = function (frame) return _main(frame, 'Flag country', 'unce' ) end,
list = function (frame) return _main(frame, 'Flag list', 'usc' ) end,
['list+link']=function (frame) return _main(frame, 'Flaglist+link', 'us*eft') end,
team = function (frame) return _main(frame, 'Flag team', 'unce' ) end,
athlete = function (frame) return _main(frame, 'Flag athlete', 'unape' ) end,
medalist = function (frame) return _main(frame, 'Flag medalist', 'unce' ) end,
['3x3'] = function (frame) return _main(frame, '3x3', 'unpe' ) end,
bb = function (frame) return _main(frame, 'bb', 'unpe' ) end,
bd = function (frame) return _main(frame, 'bd', 'unpe' ) end,
fb = function (frame) return _main(frame, 'fb', 'unpe' ) end,
fba = function (frame) return _main(frame, 'fba', 'unpe' ) end,
['fb-rt'] = function (frame) return _main(frame, 'fb', 'unpre' ) end,
fbw = function (frame) return _main(frame, 'fbw', 'unpe' ) end,
['fbw-rt'] = function (frame) return _main(frame, 'fbw', 'unpre' ) end,
fbicon = function (frame) return _main(frame, 'fbicon', 'pxxl' ) end,
fbaicon = function (frame) return _main(frame, 'fbaicon', 'pxxl' ) end,
futsal = function (frame) return _main(frame, 'futsal', 'unpe' ) end,
['futsal-rt'] = function (frame) return _main(frame, 'futsal', 'unpre' ) end,
ru = function (frame) return _main(frame, 'ru', 'unpe' ) end,
IOC = function (frame) return require('Module:Country_alias').flagIOC(frame:newChild{ title = 'Template:Flag IOC' }) end,
IOC2 = function (frame) return require('Module:Country_alias').flagXYZ(frame:newChild{ title = 'Template:Flag IOC 2', args = {name = margs.getArgs(frame).name or '', type = 'name'} }) end,
IOCathlete = function (frame) return require('Module:Country_alias').flagXYZ(frame:newChild{ title = 'Template:Flag IOC athlete', args = {type = 'athlete-O'} }) end,
}
p['deco'] = p.decoration
p['IOC 2'] = p.IOC2
p['IOC athlete'] = p.IOCathlete
return setmetatable (p, {['__index'] = -- returns table p with the metatable __index set so that, if the table KEY isn't recognized, it returns
function (_, key) -- this anonymous function called as function(p, KEY)
return function (frame) return _main(frame, 'Flag', 'unc', key) end -- which interprets the module call as {{flag|KEY}} and passes it to _main()
end
})
n8ngdx9t6994mnmi7849gzt9a0gim4a
33172
33171
2026-11-11T21:43:56Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Flag]]
33171
Scribunto
text/plain
local margs = require('Module:Arguments')
local notblank = function (v) return (v or '') ~= '' end
local function _main(frame, name, mode, key)
local categories = {
['Flag icon'] = '[[Category:Flag icons missing country data templates]]' ..
frame:expandTemplate{title = 'Preview warning', args = {'Unrecognized country in Template:flag icon'}},
['Flag decoration'] = '[[Category:Flag decoration missing country data templates]]',
}
local yesno = require('Module:Yesno')
--Get input arguments
local args = margs.getArgs(frame, {
frameOnly = notblank(frame.args.frameonly), valueFunc =
function(argkey,value)
if value then
value = mw.text.trim(value)
--Change empty string to nil for all args except 'image' and 'border'
if argkey=="image" or argkey=="border" or value~="" then
return value
end
end
return nil
end
} )
local preftext, sufftext = "", ""
if string.sub(name, -5) == '+link' then
if args[2] then
args.pref = args.pref or args[1]
else
args[2] = args[1] or ""
end
elseif name == 'Flag athlete' then
args.preftext = args[1]
args[2] = args.code or args[2] or ""
args.variant = args.variant or args[3]
elseif name == 'Flag medalist' then
preftext = (args[1] or "") .. "<br/>"
args[2] = args.code or args[2] or ""
args.variant = args.variant or args[3]
elseif name == 'Flag link' then
args.suff = args[2]
args[2] = args[1] or ""
args.variant = args.variant or args[3]
elseif key ~= nil then
args.variant = args.variant or args[1]
args[2] = key
else
local sports = {
['3x3'] = '3x3',
bb = 'bb',
bd = 'bd',
fb = 'fb',
fbicon = 'fb',
ru = 'ru',
fba = 'fba',
fbw = 'fbw',
fbaicon = 'fba',
futsal = 'futsal'
}
if sports[name]then
args.avar = args[1] and sports[name] or nil
if name == 'fb' and yesno(args.align) == true then
args.align='c'
elseif sports[name] == 'fba' then
if args[1] then
local list = require("Module:Fba/list")
local old = notblank(args.old) and "_old" or ""
local country = args[1]
local fba = list.fbas[country .. old]
if not fba then -- look for aliases
local countryTable = require('Module:CountryData').getcachedtable(frame, country)
if countryTable and countryTable.alias then
country = countryTable.alias
fba = list.fbas[country .. old]
end
end
if args.name == "code" then
args.name = list.codes[country] or country
elseif args.name == "full" then
args.name = fba
end
if fba then
mode = string.gsub(mode, "p", "c")
args.link = fba
end
args.altlink = args.old
elseif args.name == "code" or args.name == "full" then
args.name = ""
end
end
elseif name == "Flag team" and (args.code or args[1]) then
sufftext = ' <span style="font-size:90%;">('..(args.code or args[1])..')</span>'
end
args.variant = args.variant or args[2]
args[2] = args[1] or ""
end
args[1] = mode .. (args.opts or '')
args.missingcategory = notblank(args[2]) and categories[name] or nil
args.noredlink = args.noredlink or 'notext'
if args.placeholder and yesno(args.placeholder) ~= true then
args[1] = args[1] .. 'o'
end
local check = ''
if name == 'Flag icon' and mw.title.getCurrentTitle().namespace == 0 then
local unknown = '[[Category:Pages using ' .. mw.ustring.lower(name) ..
' template with unknown parameters|_VALUE_' .. frame:getParent():getTitle() .. ']]'
local opts = {
unknown=unknown,
preview='Page using [[Template:' .. name .. ']] with unknown parameter "_VALUE_"',
ignoreblank='y',
'1','2','variant','image','size','sz','border','align','al','width',
'w','alt','ilink','noredlink','missingcategory','name','clink','link',
'pref','suff','plink','the','section','altvar','avar','age','nalign',
'nal','text','nodata','opts','placeholder','getParent','frameonly'
}
check = require('Module:Check for unknown parameters')._check(opts,args)
end
return preftext .. require('Module:Flagg').luaMain(frame,args) .. sufftext .. check
end
local p = {
[''] = function (frame) return _main(frame, 'Flag', 'unc' ) end,
decoration = function (frame) return _main(frame, 'Flag decoration', 'uxx' ) end,
icon = function (frame) return _main(frame, 'Flag icon', 'cxxl' ) end,
link = function (frame) return _main(frame, 'Flag link', 'unpe' ) end,
['+link'] = function (frame) return _main(frame, 'Flag+link', 'unpefo') end,
u = function (frame) return _main(frame, 'Flag', 'unu' ) end,
country = function (frame) return _main(frame, 'Flag country', 'unce' ) end,
list = function (frame) return _main(frame, 'Flag list', 'usc' ) end,
['list+link']=function (frame) return _main(frame, 'Flaglist+link', 'us*eft') end,
team = function (frame) return _main(frame, 'Flag team', 'unce' ) end,
athlete = function (frame) return _main(frame, 'Flag athlete', 'unape' ) end,
medalist = function (frame) return _main(frame, 'Flag medalist', 'unce' ) end,
['3x3'] = function (frame) return _main(frame, '3x3', 'unpe' ) end,
bb = function (frame) return _main(frame, 'bb', 'unpe' ) end,
bd = function (frame) return _main(frame, 'bd', 'unpe' ) end,
fb = function (frame) return _main(frame, 'fb', 'unpe' ) end,
fba = function (frame) return _main(frame, 'fba', 'unpe' ) end,
['fb-rt'] = function (frame) return _main(frame, 'fb', 'unpre' ) end,
fbw = function (frame) return _main(frame, 'fbw', 'unpe' ) end,
['fbw-rt'] = function (frame) return _main(frame, 'fbw', 'unpre' ) end,
fbicon = function (frame) return _main(frame, 'fbicon', 'pxxl' ) end,
fbaicon = function (frame) return _main(frame, 'fbaicon', 'pxxl' ) end,
futsal = function (frame) return _main(frame, 'futsal', 'unpe' ) end,
['futsal-rt'] = function (frame) return _main(frame, 'futsal', 'unpre' ) end,
ru = function (frame) return _main(frame, 'ru', 'unpe' ) end,
IOC = function (frame) return require('Module:Country_alias').flagIOC(frame:newChild{ title = 'Template:Flag IOC' }) end,
IOC2 = function (frame) return require('Module:Country_alias').flagXYZ(frame:newChild{ title = 'Template:Flag IOC 2', args = {name = margs.getArgs(frame).name or '', type = 'name'} }) end,
IOCathlete = function (frame) return require('Module:Country_alias').flagXYZ(frame:newChild{ title = 'Template:Flag IOC athlete', args = {type = 'athlete-O'} }) end,
}
p['deco'] = p.decoration
p['IOC 2'] = p.IOC2
p['IOC athlete'] = p.IOCathlete
return setmetatable (p, {['__index'] = -- returns table p with the metatable __index set so that, if the table KEY isn't recognized, it returns
function (_, key) -- this anonymous function called as function(p, KEY)
return function (frame) return _main(frame, 'Flag', 'unc', key) end -- which interprets the module call as {{flag|KEY}} and passes it to _main()
end
})
n8ngdx9t6994mnmi7849gzt9a0gim4a
Tempilet:Flag template documentation
10
2564
33175
2026-04-27T21:55:50Z
en>SuperMarioMan
0
Reverted edits by [[Special:Contribs/Intisar Ali|Intisar Ali]] ([[User talk:Intisar Ali|talk]]) to last version by Vcvfou698069
33175
wikitext
text/x-wiki
<includeonly>{{documentation
| content =
{{#ifeq:{{#invoke:High-use|num|x}}|many||{{High-use}}}}
{{{header|}}}
==Description==
:<code><nowiki>{{</nowiki>{{#if:{{{2|}}}
|{{{2}}}
|{{#if:{{{3|}}}
|{{{3}}}
|{{#if:{{{4|}}}
|{{{4}}}
|?
}}
}}
}}<nowiki>}}</nowiki></code>
Renders a flag icon and wikilink to [[{{getalias|{{{1}}}}}|{{getalias|{{{1}}}}}]]. This template is equivalent to {{tlx|flag|{{{1}}}}}, but is named after the standard three letter {{#if:{{{2|}}}
|{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{3}}}
|{{#ifeq:{{{3}}}|{{{4}}}
|[[ISO 3166-1 alpha-3]] country code, [[List of IOC country codes|IOC code]], and [[List of FIFA country codes|FIFA code]]
|[[ISO 3166-1 alpha-3]] country code and [[List of IOC country codes|IOC code]]
}}
|{{#ifeq:{{{2}}}|{{{4}}}
|[[ISO 3166-1 alpha-3]] country code and [[List of FIFA country codes|FIFA code]]
|[[ISO 3166-1 alpha-3]] country code
}}
}}
|{{#ifeq:{{{2}}}|{{{3}}}
|[[ISO 3166-1 alpha-3]] country code and [[List of IOC country codes|IOC code]]
|[[ISO 3166-1 alpha-3]] country code
}}
}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{4}}}
|[[ISO 3166-1 alpha-3]] country code and [[List of FIFA country codes|FIFA code]]
|[[ISO 3166-1 alpha-3]] country code
}}
|[[ISO 3166-1 alpha-3]] country code
}}
}}
|{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{3}}}|{{{4}}}
|[[List of IOC country codes|IOC country code]] and [[List of FIFA country codes|FIFA code]]
|[[List of IOC country codes|IOC country code]]
}}
|[[List of IOC country codes|IOC country code]]
}}
|{{#if:{{{4|}}}
|[[List of FIFA country codes|FIFA country code]]
|country code
}}
}}
}} for {{{1}}} as a shorthand editing convenience.
{{#if:{{{2|}}}
|<br/>{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{3}}}
|{{#ifeq:{{{3}}}|{{{4}}}|
|You can also use {{tlx|{{{4}}}}} (which is a redirect to this template) because "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
|{{#ifeq:{{{3}}}|{{{4}}}
|You can also use {{tlx|{{{3}}}}} (which is a redirect to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] and [[List of FIFA country codes|FIFA code]] for {{{1}}}.
|{{#ifeq:{{{2}}}|{{{4}}}
|You can also use {{tlx|{{{3}}}}} (which is a redirect to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] for {{{1}}}.
|You can also use {{tlx|{{{3}}}}} or {{tlx|{{{4}}}}} (which are redirects to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] and "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
}}
}}
|{{#ifeq:{{{2}}}|{{{3}}}|
|You can also use {{tlx|{{{3}}}}} (which is a redirect to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] for {{{1}}}.
}}
}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{4}}}|
|You can also use {{tlx|{{{4}}}}} (which is a redirect to this template) because "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
}}
}}
|{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{3}}}|{{{4}}}|
|You can also use {{tlx|{{{4}}}}} (which is a redirect to this template) because "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
}}
}}
}}
{{#ifexist:{{SUBJECTPAGENAME}}/doc
|{{ {{SUBJECTPAGENAME}}/doc}} <!-- category and other documentation for the flag template -->
}}
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {},
"description": "Renders a flag icon and wikilink. Takes no parameters."
}
</templatedata>
==See also==
*[[Template:Country data {{{1}}}]]—for more options, such as historical flag variations where applicable
*[[Wikipedia:WikiProject Flag Template]]—for a complete discussion of the flag template system
*[[Wikipedia:Inline templates linking country articles]]—for a complete list of these "shorthand" flag templates
{{Sandbox other||[[Category:Flag template shorthands]]}}
| link box =
This documentation is generated by [[Template:Flag template documentation]]. <br/> Documentation specific to this template may be placed in this template's [[{{FULLPAGENAME}}/doc|/doc]] subpage and will be automatically transcluded. <br/> Any [[Wikipedia:Categorization|categories]] should also be added to the [[{{FULLPAGENAME}}/doc|/doc]] subpage.
}}</includeonly><noinclude>
{{documentation}}<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
hkzzq2axj1p02qr37zbnxlcp9sucu3p
33176
33175
2026-11-11T21:43:56Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Flag_template_documentation]]
33175
wikitext
text/x-wiki
<includeonly>{{documentation
| content =
{{#ifeq:{{#invoke:High-use|num|x}}|many||{{High-use}}}}
{{{header|}}}
==Description==
:<code><nowiki>{{</nowiki>{{#if:{{{2|}}}
|{{{2}}}
|{{#if:{{{3|}}}
|{{{3}}}
|{{#if:{{{4|}}}
|{{{4}}}
|?
}}
}}
}}<nowiki>}}</nowiki></code>
Renders a flag icon and wikilink to [[{{getalias|{{{1}}}}}|{{getalias|{{{1}}}}}]]. This template is equivalent to {{tlx|flag|{{{1}}}}}, but is named after the standard three letter {{#if:{{{2|}}}
|{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{3}}}
|{{#ifeq:{{{3}}}|{{{4}}}
|[[ISO 3166-1 alpha-3]] country code, [[List of IOC country codes|IOC code]], and [[List of FIFA country codes|FIFA code]]
|[[ISO 3166-1 alpha-3]] country code and [[List of IOC country codes|IOC code]]
}}
|{{#ifeq:{{{2}}}|{{{4}}}
|[[ISO 3166-1 alpha-3]] country code and [[List of FIFA country codes|FIFA code]]
|[[ISO 3166-1 alpha-3]] country code
}}
}}
|{{#ifeq:{{{2}}}|{{{3}}}
|[[ISO 3166-1 alpha-3]] country code and [[List of IOC country codes|IOC code]]
|[[ISO 3166-1 alpha-3]] country code
}}
}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{4}}}
|[[ISO 3166-1 alpha-3]] country code and [[List of FIFA country codes|FIFA code]]
|[[ISO 3166-1 alpha-3]] country code
}}
|[[ISO 3166-1 alpha-3]] country code
}}
}}
|{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{3}}}|{{{4}}}
|[[List of IOC country codes|IOC country code]] and [[List of FIFA country codes|FIFA code]]
|[[List of IOC country codes|IOC country code]]
}}
|[[List of IOC country codes|IOC country code]]
}}
|{{#if:{{{4|}}}
|[[List of FIFA country codes|FIFA country code]]
|country code
}}
}}
}} for {{{1}}} as a shorthand editing convenience.
{{#if:{{{2|}}}
|<br/>{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{3}}}
|{{#ifeq:{{{3}}}|{{{4}}}|
|You can also use {{tlx|{{{4}}}}} (which is a redirect to this template) because "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
|{{#ifeq:{{{3}}}|{{{4}}}
|You can also use {{tlx|{{{3}}}}} (which is a redirect to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] and [[List of FIFA country codes|FIFA code]] for {{{1}}}.
|{{#ifeq:{{{2}}}|{{{4}}}
|You can also use {{tlx|{{{3}}}}} (which is a redirect to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] for {{{1}}}.
|You can also use {{tlx|{{{3}}}}} or {{tlx|{{{4}}}}} (which are redirects to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] and "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
}}
}}
|{{#ifeq:{{{2}}}|{{{3}}}|
|You can also use {{tlx|{{{3}}}}} (which is a redirect to this template) because "{{{3}}}" is the [[List of IOC country codes|IOC code]] for {{{1}}}.
}}
}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{2}}}|{{{4}}}|
|You can also use {{tlx|{{{4}}}}} (which is a redirect to this template) because "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
}}
}}
|{{#if:{{{3|}}}
|{{#if:{{{4|}}}
|{{#ifeq:{{{3}}}|{{{4}}}|
|You can also use {{tlx|{{{4}}}}} (which is a redirect to this template) because "{{{4}}}" is the [[List of FIFA country codes|FIFA code]] for {{{1}}}.
}}
}}
}}
}}
{{#ifexist:{{SUBJECTPAGENAME}}/doc
|{{ {{SUBJECTPAGENAME}}/doc}} <!-- category and other documentation for the flag template -->
}}
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {},
"description": "Renders a flag icon and wikilink. Takes no parameters."
}
</templatedata>
==See also==
*[[Template:Country data {{{1}}}]]—for more options, such as historical flag variations where applicable
*[[Wikipedia:WikiProject Flag Template]]—for a complete discussion of the flag template system
*[[Wikipedia:Inline templates linking country articles]]—for a complete list of these "shorthand" flag templates
{{Sandbox other||[[Category:Flag template shorthands]]}}
| link box =
This documentation is generated by [[Template:Flag template documentation]]. <br/> Documentation specific to this template may be placed in this template's [[{{FULLPAGENAME}}/doc|/doc]] subpage and will be automatically transcluded. <br/> Any [[Wikipedia:Categorization|categories]] should also be added to the [[{{FULLPAGENAME}}/doc|/doc]] subpage.
}}</includeonly><noinclude>
{{documentation}}<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
hkzzq2axj1p02qr37zbnxlcp9sucu3p
Tempilet:NER/doc
10
2565
33177
2020-05-01T00:35:44Z
en>Vanisaac
0
/* top */clean up per [[WP:CAT#T]] and [[WP:AWBREQ]] add template:Sandbox other
33177
wikitext
text/x-wiki
{{documentation subpage}}
<includeonly>{{Sandbox other||
<!-- CATEGORIES AND INTERWIKIS HERE, THANKS -->
[[als:Vorlage:NER]]
[[ar:قالب:NER]]
[[bn:টেমপ্লেট:NER]]
[[ca:Plantilla:NER]]
[[de:Vorlage:NER]]
[[el:Πρότυπο:NER]]
[[es:Plantilla:NER]]
[[eo:Ŝablono:NER]]
[[eu:Txantiloi:NER]]
[[fr:Modèle:Niger]]
[[hy:Կաղապար:NER]]
[[ko:틀:NER]]
[[id:Templat:NER]]
[[is:Snið:NER]]
[[it:Template:NER]]
[[lb:Template:NER]]
[[ja:Template:NER]]
[[uz:Andoza:NER]]
[[pt:Predefinição:NER]]
[[qu:Plantilla:NER]]
[[ru:Шаблон:NER]]
[[sl:Predloga:NER]]
[[th:แม่แบบ:NER]]
[[vi:Tiêu bản:NER]]
[[tr:Şablon:NE]]
[[uk:Шаблон:NER]]
[[zh-yue:Template:NER]]
[[zh:Template:NER]]
}}</includeonly>
j4j3leqei25nu5wvyinmagc7k8qywac
33178
33177
2026-11-11T21:43:56Z
RAPTOR7762
18
1 revision imported from [[:en:Template:NER/doc]]
33177
wikitext
text/x-wiki
{{documentation subpage}}
<includeonly>{{Sandbox other||
<!-- CATEGORIES AND INTERWIKIS HERE, THANKS -->
[[als:Vorlage:NER]]
[[ar:قالب:NER]]
[[bn:টেমপ্লেট:NER]]
[[ca:Plantilla:NER]]
[[de:Vorlage:NER]]
[[el:Πρότυπο:NER]]
[[es:Plantilla:NER]]
[[eo:Ŝablono:NER]]
[[eu:Txantiloi:NER]]
[[fr:Modèle:Niger]]
[[hy:Կաղապար:NER]]
[[ko:틀:NER]]
[[id:Templat:NER]]
[[is:Snið:NER]]
[[it:Template:NER]]
[[lb:Template:NER]]
[[ja:Template:NER]]
[[uz:Andoza:NER]]
[[pt:Predefinição:NER]]
[[qu:Plantilla:NER]]
[[ru:Шаблон:NER]]
[[sl:Predloga:NER]]
[[th:แม่แบบ:NER]]
[[vi:Tiêu bản:NER]]
[[tr:Şablon:NE]]
[[uk:Шаблон:NER]]
[[zh-yue:Template:NER]]
[[zh:Template:NER]]
}}</includeonly>
j4j3leqei25nu5wvyinmagc7k8qywac
Tempilet:NGA
10
2566
33179
2024-02-01T01:54:58Z
en>Ahecht
0
Reduce [[WP:PEIS|post-expand include size]] (via [[WP:JWB]])
33179
wikitext
text/x-wiki
{{#invoke:flag||Nigeria}}<noinclude>
{{flag template documentation|Nigeria|NGA|NGR|NGA}}
</noinclude>
i6oh2bmb0wr0e3uybyucgmgjyv4jwz8
33180
33179
2026-11-11T21:44:10Z
RAPTOR7762
18
1 revision imported from [[:en:Template:NGA]]
33179
wikitext
text/x-wiki
{{#invoke:flag||Nigeria}}<noinclude>
{{flag template documentation|Nigeria|NGA|NGR|NGA}}
</noinclude>
i6oh2bmb0wr0e3uybyucgmgjyv4jwz8
Tempilet:Country data Indonesia
10
2567
33181
2024-01-08T02:50:12Z
en>Paine Ellsworth
0
Undid revision 1194104432 by [[Special:Contributions/Paine Ellsworth|Paine Ellsworth]] ([[User talk:Paine Ellsworth|talk]]) srv per edit request on talk page that challenges previous edit request
33181
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Indonesia
| flag alias = Flag of Indonesia.svg
| link alias-naval = Indonesian Navy
| flag alias-naval = Flag of Indonesia.svg
| link alias-navy = Indonesian Navy
| flag alias-navy = Flag of the Indonesian Navy.svg
| link alias-marines= Indonesian Marine Corps
| flag alias-marines = Flag of the Indonesian Marine Corps.png
| link alias-air force = Indonesian Air Force
| flag alias-air force = Flag of the Indonesian Air Force.svg
| link alias-army = Indonesian Army
| flag alias-army = Flag of the Indonesian Army.svg
| flag alias-military = Flag of the Indonesian National Armed Forces.svg
| link alias-military = Indonesian National Armed Forces
| flag alias-sanctionedFB = Indonesia coat of arms with name.svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = sanctionedFB
| redir1 = IDN
| redir2 = INA
</noinclude>
}}
6oyxjfkf8t9yng2vnzgokg9ibh2trta
33182
33181
2026-11-11T21:44:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Indonesia]]
33181
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Indonesia
| flag alias = Flag of Indonesia.svg
| link alias-naval = Indonesian Navy
| flag alias-naval = Flag of Indonesia.svg
| link alias-navy = Indonesian Navy
| flag alias-navy = Flag of the Indonesian Navy.svg
| link alias-marines= Indonesian Marine Corps
| flag alias-marines = Flag of the Indonesian Marine Corps.png
| link alias-air force = Indonesian Air Force
| flag alias-air force = Flag of the Indonesian Air Force.svg
| link alias-army = Indonesian Army
| flag alias-army = Flag of the Indonesian Army.svg
| flag alias-military = Flag of the Indonesian National Armed Forces.svg
| link alias-military = Indonesian National Armed Forces
| flag alias-sanctionedFB = Indonesia coat of arms with name.svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = sanctionedFB
| redir1 = IDN
| redir2 = INA
</noinclude>
}}
6oyxjfkf8t9yng2vnzgokg9ibh2trta
Tempilet:Country data Kazakhstan
10
2568
33185
2022-01-24T06:47:46Z
en>Paine Ellsworth
0
use AWB to add navy variant
33185
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Kazakhstan
| flag alias = Flag of Kazakhstan.svg
| flag alias-1991 = Flag of the Kazakh SSR.svg
| flag alias-1992 = Flag of Kazakhstan (1992).svg
| flag alias-naval = Naval Ensign of Kazakhstan.svg
| link alias-naval = Kazakh Naval Forces
| flag alias-air force = Ensign of Kazakhstan Air Force.svg
| link alias-air force = Kazakh Air Defense Forces
| flag alias-army = Kazakhstan Armed Forces Flag.svg
| link alias-army = Kazakh Ground Forces
| flag alias-navy = Naval Ensign of Kazakhstan.svg
| link alias-navy = Kazakh Naval Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
| var1 = 1991
| var2 = 1992
<noinclude>
| redir1 = KAZ
| related1 = Kazakh SSR
</noinclude>
}}
dwm4bfpjtcnegqdhvco1pp09yc4sv6v
33186
33185
2026-11-11T21:44:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Kazakhstan]]
33185
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Kazakhstan
| flag alias = Flag of Kazakhstan.svg
| flag alias-1991 = Flag of the Kazakh SSR.svg
| flag alias-1992 = Flag of Kazakhstan (1992).svg
| flag alias-naval = Naval Ensign of Kazakhstan.svg
| link alias-naval = Kazakh Naval Forces
| flag alias-air force = Ensign of Kazakhstan Air Force.svg
| link alias-air force = Kazakh Air Defense Forces
| flag alias-army = Kazakhstan Armed Forces Flag.svg
| link alias-army = Kazakh Ground Forces
| flag alias-navy = Naval Ensign of Kazakhstan.svg
| link alias-navy = Kazakh Naval Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
| var1 = 1991
| var2 = 1992
<noinclude>
| redir1 = KAZ
| related1 = Kazakh SSR
</noinclude>
}}
dwm4bfpjtcnegqdhvco1pp09yc4sv6v
Tempilet:Country data Malaysia
10
2569
33187
2024-09-25T21:22:19Z
en>CommonsDelinker
0
Replacing Flag_of_Malaya.svg with [[File:Flag_of_Malaya_(1950–1963).svg]] (by [[commons:User:CommonsDelinker|CommonsDelinker]] because: [[:c:COM:FR|File renamed]]: [[:c:COM:FR#FR4|Criterion 4]] (harmonizing names of file set) · Similar to the [[:c::File:F
33187
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Malaysia
| flag alias = Flag of Malaysia.svg
| flag alias-1895 = Flag of the Federated Malay States (1895 - 1946).svg
| flag alias-1948 = Flag of Malaya (1950–1963).svg
| flag alias-naval = Naval Ensign of Malaysia.svg
| link alias-naval = Royal Malaysian Navy
| flag alias-air force = Royal Malaysian Air Force Flag.svg
| link alias-air force = Royal Malaysian Air Force
| flag alias-civil = Civil Ensign of Malaysia.svg
| link alias-civil = Malaysia
| flag alias-army = Flag of the Malaysian Army.svg
| link alias-army = Malaysian Army
| flag alias-navy = Naval Ensign of Malaysia.svg
| link alias-navy = Royal Malaysian Navy
| flag alias-military = Flag of the Malaysian Armed Forces.svg
| link alias-military = Malaysian Armed Forces
| flag alias-coast guard = Flag of the Malaysian Maritime Enforcement Agency.svg
| link alias-coast guard = Malaysian Maritime Enforcement Agency
| flag alias-23px = Flag of Malaysia 23px.svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1895
| var2 = 1948
| var3 = civil
| redir1 = MYS
| redir2 = MAS
| related1 = Malaya
| related2 = Malayan Union
| related3 = Kingdom of Sarawak
| related4 = North Borneo
</noinclude>
}}
gx6rhbspxapzvla5govnuwmyw3pza2j
33188
33187
2026-11-11T21:44:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Malaysia]]
33187
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Malaysia
| flag alias = Flag of Malaysia.svg
| flag alias-1895 = Flag of the Federated Malay States (1895 - 1946).svg
| flag alias-1948 = Flag of Malaya (1950–1963).svg
| flag alias-naval = Naval Ensign of Malaysia.svg
| link alias-naval = Royal Malaysian Navy
| flag alias-air force = Royal Malaysian Air Force Flag.svg
| link alias-air force = Royal Malaysian Air Force
| flag alias-civil = Civil Ensign of Malaysia.svg
| link alias-civil = Malaysia
| flag alias-army = Flag of the Malaysian Army.svg
| link alias-army = Malaysian Army
| flag alias-navy = Naval Ensign of Malaysia.svg
| link alias-navy = Royal Malaysian Navy
| flag alias-military = Flag of the Malaysian Armed Forces.svg
| link alias-military = Malaysian Armed Forces
| flag alias-coast guard = Flag of the Malaysian Maritime Enforcement Agency.svg
| link alias-coast guard = Malaysian Maritime Enforcement Agency
| flag alias-23px = Flag of Malaysia 23px.svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1895
| var2 = 1948
| var3 = civil
| redir1 = MYS
| redir2 = MAS
| related1 = Malaya
| related2 = Malayan Union
| related3 = Kingdom of Sarawak
| related4 = North Borneo
</noinclude>
}}
gx6rhbspxapzvla5govnuwmyw3pza2j
Tempilet:Country data Philippines
10
2570
33189
2026-07-21T13:22:51Z
en>CommonsDelinker
0
Replacing Flag_of_the_First_Spanish_Republic.svg with [[File:Flag_of_Spain_(1873–1874).svg]] (by [[commons:User:CommonsDelinker|CommonsDelinker]] because: [[:c:COM:FR|File renamed]]: [[:c:COM:FR#FR4|Criterion 4]]).
33189
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Philippines
| flag alias = Flag of the Philippines.svg
| flag alias-1535 = Flag_of_Cross_of_Burgundy.svg
| flag alias-1821 = Flag of Spain (1785-1873 and 1875-1931).svg
| flag alias-1873 = Flag of Spain (1873–1874).svg
| flag alias-1875 = Flag of Spain (1785-1873 and 1875-1931).svg
| flag alias-aguinaldo = Flag of the Philippines (1898–1901).svg
| flag alias-1898 = Flag of the United States (1896-1908).svg
| flag alias-1908 = US flag 46 stars.svg
| flag alias-1912 = US flag 48 stars.svg
| flag alias-1919 = Flag of the Philippines (1919-1936).svg
| flag alias-1936 = Flag of the Philippines (navy blue).svg
| flag alias-1985 = Flag of the Philippines (light blue).svg
| flag alias-1986 = Flag of the Philippines (navy blue).svg
| flag alias-coastwise = Philippine Coastwise emblem.svg
| flag alias-air force = Flag of the Philippine Air Force.svg
| link alias-air force = Philippine Air Force
| flag alias-army=Flag of the Philippine Army.svg
| flag alias-marines=Flag of the Philippine Marine Corps.svg
| link alias-marines=Philippine Marine Corps
| flag alias-military=Flag of the Armed Forces of the Philippines.svg
| link alias-military=Philippine Armed Forces
| flag alias-navy=Flag of the Philippine Navy.svg
| link alias-navy=Philippine Navy
| link alias-army = Philippine Army
| link alias-naval = Philippine Navy
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1535
| var2 = 1821
| var3 = 1873
| var4 = 1875
| var5 = aguinaldo
| var6 = 1898
| var7 = 1908
| var8 = 1912
| var9 = 1919
| var10 = 1936
| var11 = 1985
| var12 = 1986
| var13 = coastwise
| cat = Philippines
| redir1 = PHL
| redir2 = PHI
| related1 = First Philippine Republic
| related2 = Philippine Commonwealth
| related3 = Second Philippine Republic
</noinclude>
}}
l2pajuelwj3157tfpqdggwz3zjry6zg
33190
33189
2026-11-11T21:44:11Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Philippines]]
33189
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Philippines
| flag alias = Flag of the Philippines.svg
| flag alias-1535 = Flag_of_Cross_of_Burgundy.svg
| flag alias-1821 = Flag of Spain (1785-1873 and 1875-1931).svg
| flag alias-1873 = Flag of Spain (1873–1874).svg
| flag alias-1875 = Flag of Spain (1785-1873 and 1875-1931).svg
| flag alias-aguinaldo = Flag of the Philippines (1898–1901).svg
| flag alias-1898 = Flag of the United States (1896-1908).svg
| flag alias-1908 = US flag 46 stars.svg
| flag alias-1912 = US flag 48 stars.svg
| flag alias-1919 = Flag of the Philippines (1919-1936).svg
| flag alias-1936 = Flag of the Philippines (navy blue).svg
| flag alias-1985 = Flag of the Philippines (light blue).svg
| flag alias-1986 = Flag of the Philippines (navy blue).svg
| flag alias-coastwise = Philippine Coastwise emblem.svg
| flag alias-air force = Flag of the Philippine Air Force.svg
| link alias-air force = Philippine Air Force
| flag alias-army=Flag of the Philippine Army.svg
| flag alias-marines=Flag of the Philippine Marine Corps.svg
| link alias-marines=Philippine Marine Corps
| flag alias-military=Flag of the Armed Forces of the Philippines.svg
| link alias-military=Philippine Armed Forces
| flag alias-navy=Flag of the Philippine Navy.svg
| link alias-navy=Philippine Navy
| link alias-army = Philippine Army
| link alias-naval = Philippine Navy
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1535
| var2 = 1821
| var3 = 1873
| var4 = 1875
| var5 = aguinaldo
| var6 = 1898
| var7 = 1908
| var8 = 1912
| var9 = 1919
| var10 = 1936
| var11 = 1985
| var12 = 1986
| var13 = coastwise
| cat = Philippines
| redir1 = PHL
| redir2 = PHI
| related1 = First Philippine Republic
| related2 = Philippine Commonwealth
| related3 = Second Philippine Republic
</noinclude>
}}
l2pajuelwj3157tfpqdggwz3zjry6zg
Tempilet:Country data Venezuela
10
2571
33191
2024-07-15T01:23:41Z
en>Paine Ellsworth
0
bypass Air Force redirect per [[WP:NOTBROKEN]] + per edit request on talk page - update army and navy flags
33191
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Venezuela
| flag alias = Flag of Venezuela.svg
| flag alias-1810 = Flag of the First Republic of Venezuela.svg
| flag alias-1813 = Bandera de la Guerra a Muerte.svg
| flag alias-1817 = Bandera de Angostura (20 de noviembre de 1817).svg
| flag alias-1830 = Flag of Venezuela (1830-1836).svg
| flag alias-1836 = Flag of Venezuela (1836–1859).svg
| flag alias-1859 = Flag of Venezuela (1859–1863).svg
| flag alias-1863 = Flag of Venezuela (1863–1905).svg
| flag alias-1905 = Flag of Venezuela (1905–1930).svg
| flag alias-1930 = Flag of Venezuela (1930–1954).svg
| flag alias-1954 = Flag of Venezuela (1954–2006).svg
| flag alias-army=Flag of the Bolivarian Army (Venezuela).svg
| link alias-army= Venezuelan Army
| flag alias-air force = Flag of the Venezuelan Air Force.svg
| link alias-air force = Venezuelan Air Force
| flag alias-naval = Flag of Venezuela (state).svg
| link alias-naval = Bolivarian Navy of Venezuela
| flag alias-navy = Flag of the Bolivarian Navy of Venezuela.svg
| link alias-navy = Bolivarian Navy of Venezuela
| flag alias-football = Flag of Venezuela (state).svg
| flag alias-beach soccer = Flag of Venezuela (state).svg
| flag alias-futsal = Flag of Venezuela (state).svg
| flag alias-state = Flag of Venezuela (state).svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1810
| var2 = 1813
| var3 = 1817
| var4 = 1830
| var5 = 1836
| var6 = 1859
| var7 = 1863
| var8 = 1905
| var9 = 1930
| var10 = 1954
| var11 = state
| redir1 = VEN
</noinclude>
}}
c1qvaaavg0zi7u1n7q2hntfy8vcqoe2
33192
33191
2026-11-11T21:44:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Venezuela]]
33191
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Venezuela
| flag alias = Flag of Venezuela.svg
| flag alias-1810 = Flag of the First Republic of Venezuela.svg
| flag alias-1813 = Bandera de la Guerra a Muerte.svg
| flag alias-1817 = Bandera de Angostura (20 de noviembre de 1817).svg
| flag alias-1830 = Flag of Venezuela (1830-1836).svg
| flag alias-1836 = Flag of Venezuela (1836–1859).svg
| flag alias-1859 = Flag of Venezuela (1859–1863).svg
| flag alias-1863 = Flag of Venezuela (1863–1905).svg
| flag alias-1905 = Flag of Venezuela (1905–1930).svg
| flag alias-1930 = Flag of Venezuela (1930–1954).svg
| flag alias-1954 = Flag of Venezuela (1954–2006).svg
| flag alias-army=Flag of the Bolivarian Army (Venezuela).svg
| link alias-army= Venezuelan Army
| flag alias-air force = Flag of the Venezuelan Air Force.svg
| link alias-air force = Venezuelan Air Force
| flag alias-naval = Flag of Venezuela (state).svg
| link alias-naval = Bolivarian Navy of Venezuela
| flag alias-navy = Flag of the Bolivarian Navy of Venezuela.svg
| link alias-navy = Bolivarian Navy of Venezuela
| flag alias-football = Flag of Venezuela (state).svg
| flag alias-beach soccer = Flag of Venezuela (state).svg
| flag alias-futsal = Flag of Venezuela (state).svg
| flag alias-state = Flag of Venezuela (state).svg
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1810
| var2 = 1813
| var3 = 1817
| var4 = 1830
| var5 = 1836
| var6 = 1859
| var7 = 1863
| var8 = 1905
| var9 = 1930
| var10 = 1954
| var11 = state
| redir1 = VEN
</noinclude>
}}
c1qvaaavg0zi7u1n7q2hntfy8vcqoe2
Tempilet:Country data Estonia
10
2572
33193
2026-03-16T10:02:32Z
en>Ziv
0
([[c:GR|GR]]) [[File:Flag of the Estonian Air Force (obverse).png]] → [[File:Flag of the Estonian Air Force.svg]] → File replacement: jpg/png/gif to svg vector image ([[c::c:GR]])
33193
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Estonia
| flag alias = Flag of Estonia.svg
| flag alias-naval = Naval Jack of Estonia.svg
| link alias-naval = Estonian Navy
| flag alias-army=Flag of Estonian Land Forces.svg
| link alias-army=Estonian Land Forces
| flag alias-air force =Flag of the Estonian Air Force.svg
| link alias-air force = Estonian Air Force
| flag alias-navy = Naval Ensign of Estonia.svg
| link alias-navy = Estonian Navy
| border-naval =
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| redir1 = EST
| related1 = Estonian SSR
</noinclude>
}}
r2jd8n480hx1fgdeaivfr2rf5jodgwm
33194
33193
2026-11-11T21:44:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Estonia]]
33193
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Estonia
| flag alias = Flag of Estonia.svg
| flag alias-naval = Naval Jack of Estonia.svg
| link alias-naval = Estonian Navy
| flag alias-army=Flag of Estonian Land Forces.svg
| link alias-army=Estonian Land Forces
| flag alias-air force =Flag of the Estonian Air Force.svg
| link alias-air force = Estonian Air Force
| flag alias-navy = Naval Ensign of Estonia.svg
| link alias-navy = Estonian Navy
| border-naval =
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| redir1 = EST
| related1 = Estonian SSR
</noinclude>
}}
r2jd8n480hx1fgdeaivfr2rf5jodgwm
Tempilet:Country data Ireland
10
2573
33195
2026-08-25T17:00:28Z
en>S.A. Julio
0
/* top */ use safesubst
33195
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = {{<includeonly>safesubst:</includeonly>#if:{{{altvar|}}}|Ireland|{{<includeonly>safesubst:</includeonly>#if:{{{variant|}}}|Ireland|Republic of Ireland}}}}
| shortname alias = Ireland
| flag alias = Flag of Ireland.svg
| flag alias-1783 = Saint Patrick's Saltire.svg
| flag alias-4prov = Four Provinces Flag.svg
| flag alias-green = Green harp flag of Ireland.svg
| flag alias-football = Saint Patrick's Saltire.svg
| link alias-football = Ireland national football team (1882–1950)
| flag alias-hockey = Flag of Ireland hockey team.svg
| flag alias-field hockey = Flag of Ireland hockey team.svg
| {{<includeonly>safesubst:</includeonly>#ifeq:{{{altlink}}}|A national rugby union team|link alias-rugby union|empty}} = Ireland Wolfhounds
| flag alias-indoor hockey = Flag of Ireland hockey team.svg
| flag alias-rugby union = IRFU flag.svg
| flag alias-rugby sevens = IRFU flag.svg
| flag alias-rugby league = Four Provinces Flag.svg
| flag alias-cricket = Flag of Cricket Ireland.svg
| link alias-cricket = Ireland {{{mw|}}} {{{age|}}} cricket team
| flag alias-quidditch = Flag of Quidditch Ireland.svg
| flag alias-air force=Flag of the Irish Air Corps.svg
| link alias-air force=Irish Air Corps
| link alias-naval=Irish Naval Service
| flag alias-military=Flag_of_the_Irish_Defence_Forces.svg
| link alias-military=Irish Defence Forces
| flag alias-army=Flag of the Irish Defence Forces.svg
| link alias-army=Irish Army
| flag alias-navy=Irish Naval Service Colour.svg
| link alias-navy=Irish Naval Service
| flag alias-coast guard=Coast Guard Flag (Ireland).svg
| link alias-coast guard=Irish Coast Guard
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
| variant = {{{variant|}}}
<noinclude>
| hatnote = {{Hatnote|This template contains data that applies to the island of [[Ireland]]. For the [[Republic of Ireland|sovereign state]], see [[Template:Country data Republic of Ireland]].}}
| var1 = 1783
| var2 = green
| var3 = 4prov
| var4 = football
| var5 = rugby union
| var6 = hockey
| var7 = indoor hockey
| var8 = cricket
| var9 = quidditch
| redir1 = IRE
| redir2 = EIR
| related1 = Republic of Ireland
| related2 = Southern Ireland
| related3 = Kingdom of Ireland
| related4 = Lordship of Ireland
| related5 = Irish Free State
</noinclude>
}}
ixstltx5aeeuijydndz668qlmjpvg68
33196
33195
2026-11-11T21:44:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Ireland]]
33195
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = {{<includeonly>safesubst:</includeonly>#if:{{{altvar|}}}|Ireland|{{<includeonly>safesubst:</includeonly>#if:{{{variant|}}}|Ireland|Republic of Ireland}}}}
| shortname alias = Ireland
| flag alias = Flag of Ireland.svg
| flag alias-1783 = Saint Patrick's Saltire.svg
| flag alias-4prov = Four Provinces Flag.svg
| flag alias-green = Green harp flag of Ireland.svg
| flag alias-football = Saint Patrick's Saltire.svg
| link alias-football = Ireland national football team (1882–1950)
| flag alias-hockey = Flag of Ireland hockey team.svg
| flag alias-field hockey = Flag of Ireland hockey team.svg
| {{<includeonly>safesubst:</includeonly>#ifeq:{{{altlink}}}|A national rugby union team|link alias-rugby union|empty}} = Ireland Wolfhounds
| flag alias-indoor hockey = Flag of Ireland hockey team.svg
| flag alias-rugby union = IRFU flag.svg
| flag alias-rugby sevens = IRFU flag.svg
| flag alias-rugby league = Four Provinces Flag.svg
| flag alias-cricket = Flag of Cricket Ireland.svg
| link alias-cricket = Ireland {{{mw|}}} {{{age|}}} cricket team
| flag alias-quidditch = Flag of Quidditch Ireland.svg
| flag alias-air force=Flag of the Irish Air Corps.svg
| link alias-air force=Irish Air Corps
| link alias-naval=Irish Naval Service
| flag alias-military=Flag_of_the_Irish_Defence_Forces.svg
| link alias-military=Irish Defence Forces
| flag alias-army=Flag of the Irish Defence Forces.svg
| link alias-army=Irish Army
| flag alias-navy=Irish Naval Service Colour.svg
| link alias-navy=Irish Naval Service
| flag alias-coast guard=Coast Guard Flag (Ireland).svg
| link alias-coast guard=Irish Coast Guard
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
| variant = {{{variant|}}}
<noinclude>
| hatnote = {{Hatnote|This template contains data that applies to the island of [[Ireland]]. For the [[Republic of Ireland|sovereign state]], see [[Template:Country data Republic of Ireland]].}}
| var1 = 1783
| var2 = green
| var3 = 4prov
| var4 = football
| var5 = rugby union
| var6 = hockey
| var7 = indoor hockey
| var8 = cricket
| var9 = quidditch
| redir1 = IRE
| redir2 = EIR
| related1 = Republic of Ireland
| related2 = Southern Ireland
| related3 = Kingdom of Ireland
| related4 = Lordship of Ireland
| related5 = Irish Free State
</noinclude>
}}
ixstltx5aeeuijydndz668qlmjpvg68
Tempilet:Country data Peru
10
2574
33197
2026-07-23T06:44:44Z
en>S.A. Julio
0
alias
33197
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Peru
| flag alias = Flag of Peru.svg
| flag alias-spain = Flag of Cross of Burgundy.svg
| flag alias-1820 = Flag of Tacna Regiment (1820 proposal).svg
| flag alias-1821 = Flag of Peru (1821-1822).svg
| flag alias-1822 = Flag of Peru (1822).svg
| flag alias-1822a = Flag of Peru (1822–1825).svg
| flag alias-1825 = Flag of Peru (1825–1884).svg
| flag alias-confederation = Flag of the Peru-Bolivian Confederation.svg
| flag alias-north = Flag of Peru (1825–1884).svg
| link alias-north = North Peru
| flag alias-south = Flag of South Peru.svg
| link alias-south = South Peru
| flag alias-1884 = Flag of Peru (1884–1950).svg
| flag alias-state = War flag of Peru.svg
| flag alias-football = War flag of Peru.svg
| flag alias-beach soccer = War flag of Peru.svg
| flag alias-futsal = War flag of Peru.svg
| flag alias-army = Flag of the Peruvian Army.svg
| link alias-army = Peruvian Army
| flag alias-naval= Flag of the Peruvian Navy.svg
| link alias-naval = Peruvian Navy
| flag alias-air force= Flag of the Peruvian Air Force.svg
| link alias-air force = Peruvian Air Force
| flag alias-military=State flag of Peru.svg
| link alias-military=Peruvian Armed Forces
| flag alias-marines = Flag of the Peruvian Navy.svg
| link alias-marines = Peruvian Naval Infantry
| flag alias-navy = War flag of Peru.svg
| link alias-navy = Peruvian Navy
| size = {{{size|}}}
| name = {{{name|}}}
| altvar = {{{altvar|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = spain
| var2 = 1820
| var3 = 1821
| var4 = 1822
| var5 = 1822a
| var6 = 1825
| var7 = confederation
| var8 = north
| var9 = south
| var10 = 1884
| var11 = state
| var12 = football
| redir1 = PER
</noinclude>
}}
5ui5a2b6z1k2kfozlxzq62jkqnnxk4n
33198
33197
2026-11-11T21:44:13Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Peru]]
33197
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Peru
| flag alias = Flag of Peru.svg
| flag alias-spain = Flag of Cross of Burgundy.svg
| flag alias-1820 = Flag of Tacna Regiment (1820 proposal).svg
| flag alias-1821 = Flag of Peru (1821-1822).svg
| flag alias-1822 = Flag of Peru (1822).svg
| flag alias-1822a = Flag of Peru (1822–1825).svg
| flag alias-1825 = Flag of Peru (1825–1884).svg
| flag alias-confederation = Flag of the Peru-Bolivian Confederation.svg
| flag alias-north = Flag of Peru (1825–1884).svg
| link alias-north = North Peru
| flag alias-south = Flag of South Peru.svg
| link alias-south = South Peru
| flag alias-1884 = Flag of Peru (1884–1950).svg
| flag alias-state = War flag of Peru.svg
| flag alias-football = War flag of Peru.svg
| flag alias-beach soccer = War flag of Peru.svg
| flag alias-futsal = War flag of Peru.svg
| flag alias-army = Flag of the Peruvian Army.svg
| link alias-army = Peruvian Army
| flag alias-naval= Flag of the Peruvian Navy.svg
| link alias-naval = Peruvian Navy
| flag alias-air force= Flag of the Peruvian Air Force.svg
| link alias-air force = Peruvian Air Force
| flag alias-military=State flag of Peru.svg
| link alias-military=Peruvian Armed Forces
| flag alias-marines = Flag of the Peruvian Navy.svg
| link alias-marines = Peruvian Naval Infantry
| flag alias-navy = War flag of Peru.svg
| link alias-navy = Peruvian Navy
| size = {{{size|}}}
| name = {{{name|}}}
| altvar = {{{altvar|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = spain
| var2 = 1820
| var3 = 1821
| var4 = 1822
| var5 = 1822a
| var6 = 1825
| var7 = confederation
| var8 = north
| var9 = south
| var10 = 1884
| var11 = state
| var12 = football
| redir1 = PER
</noinclude>
}}
5ui5a2b6z1k2kfozlxzq62jkqnnxk4n
Module:CountryData/cacheE
828
2575
33199
2026-04-18T03:15:45Z
en>Pppery
0
Changed protection settings for "[[Module:CountryData/cacheE]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33199
Scribunto
text/plain
local CountryData = require('Module:CountryData')
local pages = {'Egypt', 'Estonia', 'Indonesia', 'Ireland', 'Kazakhstan', 'Malaysia', 'Nigeria', 'Peru', 'Philippines', 'Soviet_Union', 'Venezuela', 'Wales'}
local p = {
data = {}
}
local frame = mw.getCurrentFrame()
for _,v in ipairs(pages) do
p.data[v] = CountryData.gettable(frame, v, {})
end
return p
0u0yyvac44f12s3idgoed97tro6bmip
33200
33199
2026-11-11T21:44:13Z
RAPTOR7762
18
1 revision imported from [[:en:Module:CountryData/cacheE]]
33199
Scribunto
text/plain
local CountryData = require('Module:CountryData')
local pages = {'Egypt', 'Estonia', 'Indonesia', 'Ireland', 'Kazakhstan', 'Malaysia', 'Nigeria', 'Peru', 'Philippines', 'Soviet_Union', 'Venezuela', 'Wales'}
local p = {
data = {}
}
local frame = mw.getCurrentFrame()
for _,v in ipairs(pages) do
p.data[v] = CountryData.gettable(frame, v, {})
end
return p
0u0yyvac44f12s3idgoed97tro6bmip
Tempilet:NGA/doc
10
2576
33201
2020-05-01T00:38:36Z
en>Vanisaac
0
/* top */clean up per [[WP:CAT#T]] and [[WP:AWBREQ]] add template:Sandbox other
33201
wikitext
text/x-wiki
{{documentation subpage}}
<includeonly>{{Sandbox other||
<!-- CATEGORIES AND INTERWIKIS HERE, THANKS -->
[[als:Vorlage:NGA]]
[[ar:قالب:NGA]]
[[bn:Template:NGA]]
[[ca:Plantilla:NGA]]
[[de:Vorlage:NGA]]
[[el:Πρότυπο:NGA]]
[[es:Plantilla:NGA]]
[[eo:Ŝablono:NGA]]
[[eu:Txantiloi:NGA]]
[[fr:Modèle:Nigeria]]
[[gl:Template:NGA]]
[[ko:틀:NGA]]
[[hy:Կաղապար:NGA]]
[[id:Templat:NGA]]
[[is:Snið:NGA]]
[[it:Template:NGA]]
[[lv:Veidne:NGA]]
[[lb:Template:NGA]]
[[mn:Template:NGA]]
[[ja:Template:NGA]]
[[pt:Predefinição:NGA]]
[[ro:Format:NGA]]
[[qu:Plantilla:NGA]]
[[ru:Шаблон:NGA]]
[[simple:Template:NGA]]
[[sk:Šablóna:NGA]]
[[sl:Predloga:NGA]]
[[sv:Mall:NGA]]
[[ta:வார்ப்புரு:NGA]]
[[th:แม่แบบ:NGA]]
[[vi:Tiêu bản:NGA]]
[[tr:Şablon:NG]]
[[uk:Шаблон:NGA]]
[[zh-yue:Template:NGA]]
[[zh:Template:NGA]]
}}</includeonly>
bknrmaulqfv63qxiiwj0zg9badkv14h
33202
33201
2026-11-11T21:44:13Z
RAPTOR7762
18
1 revision imported from [[:en:Template:NGA/doc]]
33201
wikitext
text/x-wiki
{{documentation subpage}}
<includeonly>{{Sandbox other||
<!-- CATEGORIES AND INTERWIKIS HERE, THANKS -->
[[als:Vorlage:NGA]]
[[ar:قالب:NGA]]
[[bn:Template:NGA]]
[[ca:Plantilla:NGA]]
[[de:Vorlage:NGA]]
[[el:Πρότυπο:NGA]]
[[es:Plantilla:NGA]]
[[eo:Ŝablono:NGA]]
[[eu:Txantiloi:NGA]]
[[fr:Modèle:Nigeria]]
[[gl:Template:NGA]]
[[ko:틀:NGA]]
[[hy:Կաղապար:NGA]]
[[id:Templat:NGA]]
[[is:Snið:NGA]]
[[it:Template:NGA]]
[[lv:Veidne:NGA]]
[[lb:Template:NGA]]
[[mn:Template:NGA]]
[[ja:Template:NGA]]
[[pt:Predefinição:NGA]]
[[ro:Format:NGA]]
[[qu:Plantilla:NGA]]
[[ru:Шаблон:NGA]]
[[simple:Template:NGA]]
[[sk:Šablóna:NGA]]
[[sl:Predloga:NGA]]
[[sv:Mall:NGA]]
[[ta:வார்ப்புரு:NGA]]
[[th:แม่แบบ:NGA]]
[[vi:Tiêu bản:NGA]]
[[tr:Şablon:NG]]
[[uk:Шаблон:NGA]]
[[zh-yue:Template:NGA]]
[[zh:Template:NGA]]
}}</includeonly>
bknrmaulqfv63qxiiwj0zg9badkv14h
Tempilet:Country data Niger
10
2577
33204
2026-11-11T21:46:25Z
RAPTOR7762
18
RAPTOR7762 moved page [[Tempilet:Country data Niger]] to [[Tempilet:Country data Nijar]]
33204
wikitext
text/x-wiki
#REDIRECT [[Tempilet:Country data Nijar]]
l7j40ui1ou4elaba514pwf8p7e3tra9
Tempilet:Country data Benin
10
2578
33206
2025-12-09T05:05:28Z
en>Sundostund
0
33206
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Benin
| flag alias = Flag of Benin.svg
| flag alias-1975 = Flag of Benin (1975-1990).svg
| link alias-air force = Benin Air Force
| flag alias-military = Flag of Benin Armed Forces (obverse).svg
| link alias-military = Benin Armed Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1975
| redir1 = BEN
| related1 = Dahomey
</noinclude>
}}
8cofky8fd18f2nnfkz08iybzkdo9pwb
33207
33206
2026-11-11T21:48:17Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Benin]]
33206
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Benin
| flag alias = Flag of Benin.svg
| flag alias-1975 = Flag of Benin (1975-1990).svg
| link alias-air force = Benin Air Force
| flag alias-military = Flag of Benin Armed Forces (obverse).svg
| link alias-military = Benin Armed Forces
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| variant = {{{variant|}}}
<noinclude>
| var1 = 1975
| redir1 = BEN
| related1 = Dahomey
</noinclude>
}}
8cofky8fd18f2nnfkz08iybzkdo9pwb
Tempilet:Country data Dahomey
10
2579
33208
2022-07-22T16:22:09Z
en>Russian Rocky
0
+ related2 = Kingdom of Dahomey
33208
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Republic of Dahomey
| shortname alias = Dahomey
| flag alias = Flag of Benin.svg
| link alias-football = Benin national football team
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
<noinclude>
| related1 = Benin
| related2 = Kingdom of Dahomey
</noinclude>
}}
e69pa1xbv0tr7g68u6d8tflrzqho6iv
33209
33208
2026-11-11T21:48:17Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Dahomey]]
33208
wikitext
text/x-wiki
{{ {{{1<noinclude>|country showdata</noinclude>}}}
| alias = Republic of Dahomey
| shortname alias = Dahomey
| flag alias = Flag of Benin.svg
| link alias-football = Benin national football team
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = {{{altlink|}}}
| altvar = {{{altvar|}}}
<noinclude>
| related1 = Benin
| related2 = Kingdom of Dahomey
</noinclude>
}}
e69pa1xbv0tr7g68u6d8tflrzqho6iv
Tempilet:Country data BEN
10
2580
33210
2017-04-07T19:43:38Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:Country data BEN]]": Matching redirect target ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33210
wikitext
text/x-wiki
#REDIRECT [[Template:Country data Benin]]
[[category:country data redirects|BEN]]
86jwmw1iwgyn4cmvr7v37ipjjrqybnh
33211
33210
2026-11-11T21:48:17Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_BEN]]
33210
wikitext
text/x-wiki
#REDIRECT [[Template:Country data Benin]]
[[category:country data redirects|BEN]]
86jwmw1iwgyn4cmvr7v37ipjjrqybnh
Tempilet:Country data Benin/doc
10
2581
33214
2026-09-11T21:32:00Z
en>JJMC89 bot III
0
Moving [[:Category:Country data templates of countries]] to [[:Category:Country data templates of sovereign states]] per [[Wikipedia:Categories for discussion/Log/2026 September 1#Category:Country data templates of countries]]
33214
wikitext
text/x-wiki
{{Documentation subpage}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Country data templates of sovereign states|Benin]]
[[Category:Country data templates of Benin| ]]
}}</includeonly>
jhchit8yqcv78z4vx4z32xvacylncdu
33215
33214
2026-11-11T21:48:18Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_data_Benin/doc]]
33214
wikitext
text/x-wiki
{{Documentation subpage}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Country data templates of sovereign states|Benin]]
[[Category:Country data templates of Benin| ]]
}}</includeonly>
jhchit8yqcv78z4vx4z32xvacylncdu
Tempilet:Infobox officeholder
10
2582
33216
2026-09-20T03:33:49Z
en>Zackmann08
0
not actually a valid parameter
33216
wikitext
text/x-wiki
{{#invoke:infobox|infoboxTemplate
| bodyclass = vcard {{{bodyclass|}}}
| bodystyle = {{#if:{{{main_width|}}}|width: {{{main_width|}}}}}
| child = {{lc:{{{embed}}}}}
| abovestyle = font-size: 100%;
| above = {{#if:{{{honorific_prefix|}}}|<div class="honorific-prefix" style="font-weight: normal;">{{{honorific_prefix|}}}</div>}}<!--
--><div class="fn" style="font-size:125%;">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</div><!--
-->{{#if:{{{honorific_suffix|}}}|<div class="honorific-suffix" style="font-weight: normal;">{{{honorific_suffix|}}}</div>}}
| subheaderstyle = font-size:125%; font-weight:bold;
| subheader = {{#ifeq:{{lc:{{{embed}}}}}|yes||{{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}}}}}}
| imagestyle = {{#if:{{{caption|}}}||padding-bottom:0.2em;}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|upright={{if empty|{{{image_upright|}}}|1}}|alt={{{alt|}}}|suppressplaceholder=yes}}
| captionstyle = line-height:normal; padding:0.2em;
| caption = {{{caption|}}}
| headerstyle = color: #202122; {{#ifeq:{{lc:{{{embed}}}}}|yes|background:#eee|background:lavender}}
| data1 =
{{#if:{{{speaker|}}}|
{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname2|}}}
| 1namedata = {{{1namedata2|}}}
| 2blankname = {{{2blankname2|}}}
| 2namedata = {{{2namedata2|}}}
| 3blankname = {{{3blankname2|}}}
| 3namedata = {{{3namedata2|}}}
| 4blankname = {{{4blankname2|}}}
| 4namedata = {{{4namedata2|}}}
| 5blankname = {{{5blankname2|}}}
| 5namedata = {{{5namedata2|}}}
| alongside = {{{alongside2|}}}
| ambassador_from = {{{ambassador_from2|}}}
| appointer = {{{appointer2|}}}
| assembly = {{{assembly2|}}}
| assuming = {{{assuming2|}}}
| chancellor = {{{chancellor2|}}}
| co-leader = {{{co-leader2|}}}
| constituency_{{#if:{{{constituency_AM2|}}}|AM|MP}} = {{if empty|{{{constituency_AM2|}}}|{{{constituency_MP2|}}}}}
| constituency = {{{constituency2|}}}
| convocation = {{{convocation2|}}}
| country = {{{country2|}}}
| deputy = {{{deputy2|}}}
| district = {{{district2|}}}
| firstminister = {{{first_minister2|}}}
| governor-general = {{{governor-general2|}}}
| governor_general = {{{governor_general2|}}}
| governor = {{{governor2|}}}
| jr/sr = {{{jr/sr2|}}}
| leader = {{{leader2|}}}
| legislature = {{{legislature2|}}}
| lieutenant_governor = {{{lieutenant_governor2|}}}
| lieutenant = {{{lieutenant2|}}}
| majority_leader = {{{majority_leader2|}}}
| minister_from = {{{minister_from2|}}}
| minority_floor_leader = {{{minority_floor_leader2|}}}
| majority_floor_leader = {{{majority_floor_leader2|}}}
| majority = {{{majority2|}}}
| minister = {{{minister2|}}}
| minority_leader = {{{minority_leader2|}}}
| monarch = {{{monarch2|}}}
| nominator = {{{nominator2|}}}
| office = {{{office2|}}}
| order = {{{order2|}}}
| parliament = {{{parliament2|}}}
| parliamentarygroup = {{{parliamentary_group2|}}}
| predecessor = {{{predecessor2|}}}
| preceding = {{{preceding2|}}}
| preceded = {{{preceded2|}}}
| premier = {{{premier2|}}}
| president = {{{president2|}}}
| primeminister = {{{prime_minister2|}}}
| riding = {{{riding2|}}}
| speaker = {{{speaker|}}}
| speaker_office = {{{speaker_office|}}}
| state_assembly = {{{state_assembly|}}}
| state_delegate = {{{state_delegate|}}}
| state_house = {{{state_house|}}}
| state_legislature = {{{state_legislature|}}}
| state_senate = {{{state_senate|}}}
| state = {{{state|}}}
| subterm = {{nobold|{{{subterm|}}}}}
| suboffice = {{{suboffice|}}}
| succeeded = {{{succeeded2|}}}
| succeeding = {{{succeeding2|}}}
| successor = {{{successor2|}}}
| taoiseach = {{{taoiseach2|}}}
| termlabel = {{if empty|{{{term_label2|}}}|In office}}
| termend = {{{term_end2|}}}
| termstart = {{{term_start2|}}}
| term = {{{term2|}}}
| title = {{{title2|}}}
| vicegovernor = {{{vice_governor2|}}}
| vicepresident = {{{vice_president2|}}}
| vicepremier = {{{vice_premier2|}}}
| viceprimeminister = {{{vice_prime_minister2|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term|}}}
}}}}}}<!--
-->{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname|}}}
| 1namedata = {{{1namedata|}}}
| 2blankname = {{{2blankname|}}}
| 2namedata = {{{2namedata|}}}
| 3blankname = {{{3blankname|}}}
| 3namedata = {{{3namedata|}}}
| 4blankname = {{{4blankname|}}}
| 4namedata = {{{4namedata|}}}
| 5blankname = {{{5blankname|}}}
| 5namedata = {{{5namedata|}}}
| alongside = {{{alongside|}}}
| ambassador_from = {{{ambassador_from|}}}
| appointer = {{{appointer|}}}
| assembly = {{{assembly|}}}
| assuming = {{{assuming|}}}
| candidate = {{{candidate|}}}
| chancellor = {{{chancellor|}}}
| co-leader = {{{co-leader|}}}
| constituency_{{#if:{{{constituency_AM|}}}|AM|MP}} = {{if empty|{{{constituency_AM|}}}|{{{constituency_MP|}}}}}
| constituency = {{{constituency|}}}
| convocation = {{{convocation|}}}
| country = {{{country|}}}
| deputy = {{{deputy|}}}
| district = {{{district|}}}
| election_date = {{{election_date|}}}
| firstminister = {{{first_minister|}}}
| governor-general = {{{governor-general|}}}
| governor_general = {{{governor_general|}}}
| governor = {{{governor|}}}
| incumbent = {{{incumbent|}}}
| jr/sr = {{{jr/sr|}}}
| leader = {{{leader|}}}
| legislature = {{{legislature|}}}
| lieutenant_governor = {{{lieutenant_governor|}}}
| lieutenant = {{{lieutenant|}}}
| majority_leader = {{{majority_leader|}}}
| majority = {{{majority|}}}
| minister = {{{minister|}}}
| minister_from = {{{minister_from|}}}
| minority_floor_leader = {{{minority_floor_leader|}}}
| majority_floor_leader = {{{majority_floor_leader|}}}
| minority_leader = {{{minority_leader|}}}
| monarch = {{{monarch|}}}
| nominator = {{{nominator|}}}
| nominee = {{{nominee|}}}
| office = {{{office|}}}
| opponent = {{{opponent|}}}
| order = {{{order|}}}
| parliament = {{{parliament|}}}
| parliamentarygroup = {{{parliamentary_group|}}}
| party_election = {{{party_election|}}}
| predecessor = {{{predecessor|}}}
| preceding = {{{preceding|}}}
| preceded = {{{preceded|}}}
| premier = {{{premier|}}}
| president = {{{president|}}}
| primeminister = {{{prime_minister|}}}
| riding = {{{riding|}}}
| runningmate = {{{running_mate|}}}
| state_assembly = {{{state_assembly|}}}
| state_delegate = {{{state_delegate|}}}
| state_house = {{{state_house|}}}
| state_legislature = {{{state_legislature|}}}
| state_senate = {{{state_senate|}}}
| state = {{{state|}}}
| status = {{{status|}}}
| suboffice = {{{suboffice|}}}
| subterm = {{nobold|{{{subterm|}}}}}
| succeeded = {{{succeeded|}}}
| succeeding = {{{succeeding|}}}
| successor = {{{successor|}}}
| taoiseach = {{{taoiseach|}}}
| termlabel = {{if empty|{{{term_label|}}}|In office}}
| termend = {{{term_end|}}}
| termstart = {{{term_start|}}}
| term = {{{term|}}}
| title = {{{title|}}}
| vicegovernor = {{{vice_governor|}}}
| vicepresident = {{{vice_president|}}}
| vicepremier = {{{vice_premier|}}}
| viceprimeminister = {{{vice_prime_minister|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term|}}}
}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname1|}}}
| 1namedata = {{{1namedata1|}}}
| 2blankname = {{{2blankname1|}}}
| 2namedata = {{{2namedata1|}}}
| 3blankname = {{{3blankname1|}}}
| 3namedata = {{{3namedata1|}}}
| 4blankname = {{{4blankname1|}}}
| 4namedata = {{{4namedata1|}}}
| 5blankname = {{{5blankname1|}}}
| 5namedata = {{{5namedata1|}}}
| alongside = {{{alongside1|}}}
| ambassador_from = {{{ambassador_from1|}}}
| appointer = {{{appointer1|}}}
| assembly = {{{assembly1|}}}
| assuming = {{{assuming1|}}}
| chancellor = {{{chancellor1|}}}
| co-leader = {{{co-leader1|}}}
| constituency_{{#if:{{{constituency_AM1|}}}|AM|MP}} = {{if empty|{{{constituency_AM1|}}}|{{{constituency_MP1|}}}}}
| constituency = {{{constituency1|}}}
| convocation = {{{convocation1|}}}
| country = {{{country1|}}}
| deputy = {{{deputy1|}}}
| district = {{{district1|}}}
| firstminister = {{{first_minister1|}}}
| governor-general = {{{governor-general1|}}}
| governor_general = {{{governor_general1|}}}
| governor = {{{governor1|}}}
| jr/sr = {{{jr/sr1|}}}
| leader = {{{leader1|}}}
| legislature = {{{legislature1|}}}
| lieutenant_governor = {{{lieutenant_governor1|}}}
| lieutenant = {{{lieutenant1|}}}
| minority_floor_leader = {{{minority_floor_leader1|}}}
| minister_from = {{{minister_from1|}}}
| majority_floor_leader = {{{majority_floor_leader1|}}}
| majority_leader = {{{majority_leader1|}}}
| majority = {{{majority1|}}}
| minister = {{{minister1|}}}
| minority_leader = {{{minority_leader1|}}}
| monarch = {{{monarch1|}}}
| nominator = {{{nominator1|}}}
| office = {{{office1|}}}
| order = {{{order1|}}}
| parliament = {{{parliament1|}}}
| parliamentarygroup = {{{parliamentary_group1|}}}
| predecessor = {{{predecessor1|}}}
| preceding = {{{preceding1|}}}
| preceded = {{{preceded1|}}}
| premier = {{{premier1|}}}
| president = {{{president1|}}}
| primeminister = {{{prime_minister1|}}}
| riding = {{{riding1|}}}
| state_assembly = {{{state_assembly1|}}}
| state_delegate = {{{state_delegate1|}}}
| state_house = {{{state_house1|}}}
| state_legislature = {{{state_legislature1|}}}
| state_senate = {{{state_senate1|}}}
| state = {{{state1|}}}
| status = {{{status1|}}}
| subterm = {{nobold|{{{subterm1|}}}}}
| suboffice = {{{suboffice1|}}}
| succeeded = {{{succeeded1|}}}
| succeeding = {{{succeeding1|}}}
| successor = {{{successor1|}}}
| taoiseach = {{{taoiseach1|}}}
| termlabel = {{if empty|{{{term_label1|}}}|In office}}
| termend = {{{term_end1|}}}
| termstart = {{{term_start1|}}}
| term = {{{term1|}}}
| title = {{{title1|}}}
| vicegovernor = {{{vice_governor1|}}}
| vicepresident = {{{vice_president1|}}}
| vicepremier = {{{vice_premier1|}}}
| viceprimeminister = {{{vice_prime_minister1|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term1|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{speaker|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname2|}}}
| 1namedata = {{{1namedata2|}}}
| 2blankname = {{{2blankname2|}}}
| 2namedata = {{{2namedata2|}}}
| 3blankname = {{{3blankname2|}}}
| 3namedata = {{{3namedata2|}}}
| 4blankname = {{{4blankname2|}}}
| 4namedata = {{{4namedata2|}}}
| 5blankname = {{{5blankname2|}}}
| 5namedata = {{{5namedata2|}}}
| alongside = {{{alongside2|}}}
| ambassador_from = {{{ambassador_from2|}}}
| appointer = {{{appointer2|}}}
| assembly = {{{assembly2|}}}
| assuming = {{{assuming2|}}}
| chancellor = {{{chancellor2|}}}
| co-leader = {{{co-leader2|}}}
| constituency_{{#if:{{{constituency_AM2|}}}|AM|MP}} = {{if empty|{{{constituency_AM2|}}}|{{{constituency_MP2|}}}}}
| constituency = {{{constituency2|}}}
| convocation = {{{convocation2|}}}
| country = {{{country2|}}}
| deputy = {{{deputy2|}}}
| district = {{{district2|}}}
| firstminister = {{{first_minister2|}}}
| governor-general = {{{governor-general2|}}}
| governor_general = {{{governor_general2|}}}
| governor = {{{governor2|}}}
| jr/sr = {{{jr/sr2|}}}
| leader = {{{leader2|}}}
| legislature = {{{legislature2|}}}
| lieutenant_governor = {{{lieutenant_governor2|}}}
| lieutenant = {{{lieutenant2|}}}
| majority_leader = {{{majority_leader2|}}}
| minister_from = {{{minister_from2|}}}
| minority_floor_leader = {{{minority_floor_leader2|}}}
| majority_floor_leader = {{{majority_floor_leader2|}}}
| majority = {{{majority2|}}}
| minister = {{{minister2|}}}
| minority_leader = {{{minority_leader2|}}}
| monarch = {{{monarch2|}}}
| nominator = {{{nominator2|}}}
| office = {{{office2|}}}
| order = {{{order2|}}}
| parliament = {{{parliament2|}}}
| parliamentarygroup = {{{parliamentary_group2|}}}
| predecessor = {{{predecessor2|}}}
| preceding = {{{preceding2|}}}
| preceded = {{{preceded2|}}}
| premier = {{{premier2|}}}
| president = {{{president2|}}}
| primeminister = {{{prime_minister2|}}}
| riding = {{{riding2|}}}
| state_assembly = {{{state_assembly2|}}}
| state_delegate = {{{state_delegate2|}}}
| state_house = {{{state_house2|}}}
| state_legislature = {{{state_legislature2|}}}
| state_senate = {{{state_senate2|}}}
| state = {{{state2|}}}
| status = {{{status2|}}}
| subterm = {{nobold|{{{subterm2|}}}}}
| suboffice = {{{suboffice2|}}}
| succeeded = {{{succeeded2|}}}
| succeeding = {{{succeeding2|}}}
| successor = {{{successor2|}}}
| taoiseach = {{{taoiseach2|}}}
| termlabel = {{if empty|{{{term_label2|}}}|In office}}
| termend = {{{term_end2|}}}
| termstart = {{{term_start2|}}}
| term = {{{term2|}}}
| title = {{{title2|}}}
| vicegovernor = {{{vice_governor2|}}}
| vicepresident = {{{vice_president2|}}}
| vicepremier = {{{vice_premier2|}}}
| viceprimeminister = {{{vice_prime_minister2|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term2|}}}
}}}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname3|}}}
| 1namedata = {{{1namedata3|}}}
| 2blankname = {{{2blankname3|}}}
| 2namedata = {{{2namedata3|}}}
| 3blankname = {{{3blankname3|}}}
| 3namedata = {{{3namedata3|}}}
| 4blankname = {{{4blankname3|}}}
| 4namedata = {{{4namedata3|}}}
| 5blankname = {{{5blankname3|}}}
| 5namedata = {{{5namedata3|}}}
| alongside = {{{alongside3|}}}
| ambassador_from = {{{ambassador_from3|}}}
| appointer = {{{appointer3|}}}
| assembly = {{{assembly3|}}}
| assuming = {{{assuming3|}}}
| chancellor = {{{chancellor3|}}}
| co-leader = {{{co-leader3|}}}
| constituency_{{#if:{{{constituency_AM3|}}}|AM|MP}} = {{if empty|{{{constituency_AM3|}}}|{{{constituency_MP3|}}}}}
| constituency = {{{constituency3|}}}
| convocation = {{{convocation3|}}}
| country = {{{country3|}}}
| deputy = {{{deputy3|}}}
| district = {{{district3|}}}
| firstminister = {{{first_minister3|}}}
| governor-general = {{{governor-general3|}}}
| governor_general = {{{governor_general3|}}}
| governor = {{{governor3|}}}
| jr/sr = {{{jr/sr3|}}}
| leader = {{{leader3|}}}
| legislature = {{{legislature3|}}}
| lieutenant_governor = {{{lieutenant_governor3|}}}
| lieutenant = {{{lieutenant3|}}}
| minority_floor_leader = {{{minority_floor_leader3|}}}
| minister_from = {{{minister_from3|}}}
| majority_floor_leader = {{{majority_floor_leader3|}}}
| majority_leader = {{{majority_leader3|}}}
| majority = {{{majority3|}}}
| minister = {{{minister3|}}}
| minority_leader = {{{minority_leader3|}}}
| monarch = {{{monarch3|}}}
| nominator = {{{nominator3|}}}
| office = {{{office3|}}}
| order = {{{order3|}}}
| parliament = {{{parliament3|}}}
| parliamentarygroup = {{{parliamentary_group3|}}}
| predecessor = {{{predecessor3|}}}
| preceding = {{{preceding3|}}}
| preceded = {{{preceded3|}}}
| premier = {{{premier3|}}}
| president = {{{president3|}}}
| primeminister = {{{prime_minister3|}}}
| riding = {{{riding3|}}}
| state_assembly = {{{state_assembly3|}}}
| state_delegate = {{{state_delegate3|}}}
| state_house = {{{state_house3|}}}
| state_legislature = {{{state_legislature3|}}}
| state_senate = {{{state_senate3|}}}
| state = {{{state3|}}}
| status = {{{status3|}}}
| subterm = {{nobold|{{{subterm3|}}}}}
| suboffice = {{{suboffice3|}}}
| succeeded = {{{succeeded3|}}}
| succeeding = {{{succeeding3|}}}
| successor = {{{successor3|}}}
| taoiseach = {{{taoiseach3|}}}
| termlabel = {{if empty|{{{term_label3|}}}|In office}}
| termend = {{{term_end3|}}}
| termstart = {{{term_start3|}}}
| term = {{{term3|}}}
| title = {{{title3|}}}
| vicegovernor = {{{vice_governor3|}}}
| vicepresident = {{{vice_president3|}}}
| vicepremier = {{{vice_premier3|}}}
| viceprimeminister = {{{vice_prime_minister3|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term3|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname4|}}}
| 1namedata = {{{1namedata4|}}}
| 2blankname = {{{2blankname4|}}}
| 2namedata = {{{2namedata4|}}}
| 3blankname = {{{3blankname4|}}}
| 3namedata = {{{3namedata4|}}}
| 4blankname = {{{4blankname4|}}}
| 4namedata = {{{4namedata4|}}}
| 5blankname = {{{5blankname4|}}}
| 5namedata = {{{5namedata4|}}}
| alongside = {{{alongside4|}}}
| ambassador_from = {{{ambassador_from4|}}}
| appointer = {{{appointer4|}}}
| assembly = {{{assembly4|}}}
| assuming = {{{assuming4|}}}
| chancellor = {{{chancellor4|}}}
| co-leader = {{{co-leader4|}}}
| constituency_{{#if:{{{constituency_AM4|}}}|AM|MP}} = {{if empty|{{{constituency_AM4|}}}|{{{constituency_MP4|}}}}}
| constituency = {{{constituency4|}}}
| convocation = {{{convocation4|}}}
| country = {{{country4|}}}
| deputy = {{{deputy4|}}}
| district = {{{district4|}}}
| firstminister = {{{first_minister4|}}}
| governor-general = {{{governor-general4|}}}
| governor_general = {{{governor_general4|}}}
| governor = {{{governor4|}}}
| jr/sr = {{{jr/sr4|}}}
| leader = {{{leader4|}}}
| legislature = {{{legislature4|}}}
| lieutenant_governor = {{{lieutenant_governor4|}}}
| lieutenant = {{{lieutenant4|}}}
| minister_from = {{{minister_from4|}}}
| minority_floor_leader = {{{minority_floor_leader4|}}}
| majority_floor_leader = {{{majority_floor_leader4|}}}
| majority_leader = {{{majority_leader4|}}}
| majority = {{{majority4|}}}
| minister = {{{minister4|}}}
| minority_leader = {{{minority_leader4|}}}
| monarch = {{{monarch4|}}}
| nominator = {{{nominator4|}}}
| office = {{{office4|}}}
| order = {{{order4|}}}
| parliament = {{{parliament4|}}}
| parliamentarygroup = {{{parliamentary_group4|}}}
| predecessor = {{{predecessor4|}}}
| preceding = {{{preceding4|}}}
| preceded = {{{preceded4|}}}
| premier = {{{premier4|}}}
| president = {{{president4|}}}
| primeminister = {{{prime_minister4|}}}
| riding = {{{riding4|}}}
| state_assembly = {{{state_assembly4|}}}
| state_delegate = {{{state_delegate4|}}}
| state_house = {{{state_house4|}}}
| state_legislature = {{{state_legislature4|}}}
| state_senate = {{{state_senate4|}}}
| state = {{{state4|}}}
| status = {{{status4|}}}
| subterm = {{nobold|{{{subterm4|}}}}}
| suboffice = {{{suboffice4|}}}
| succeeded = {{{succeeded4|}}}
| succeeding = {{{succeeding4|}}}
| successor = {{{successor4|}}}
| taoiseach = {{{taoiseach4|}}}
| termlabel = {{if empty|{{{term_label4|}}}|In office}}
| termend = {{{term_end4|}}}
| termstart = {{{term_start4|}}}
| term = {{{term4|}}}
| title = {{{title4|}}}
| vicegovernor = {{{vice_governor4|}}}
| vicepresident = {{{vice_president4|}}}
| vicepremier = {{{vice_premier4|}}}
| viceprimeminister = {{{vice_prime_minister4|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term4|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname5|}}}
| 1namedata = {{{1namedata5|}}}
| 2blankname = {{{2blankname5|}}}
| 2namedata = {{{2namedata5|}}}
| 3blankname = {{{3blankname5|}}}
| 3namedata = {{{3namedata5|}}}
| 4blankname = {{{4blankname5|}}}
| 4namedata = {{{4namedata5|}}}
| 5blankname = {{{5blankname5|}}}
| 5namedata = {{{5namedata5|}}}
| alongside = {{{alongside5|}}}
| ambassador_from = {{{ambassador_from5|}}}
| appointer = {{{appointer5|}}}
| assembly = {{{assembly5|}}}
| assuming = {{{assuming5|}}}
| chancellor = {{{chancellor5|}}}
| co-leader = {{{co-leader5|}}}
| constituency_{{#if:{{{constituency_AM5|}}}|AM|MP}} = {{if empty|{{{constituency_AM5|}}}|{{{constituency_MP5|}}}}}
| constituency = {{{constituency5|}}}
| convocation = {{{convocation5|}}}
| country = {{{country5|}}}
| deputy = {{{deputy5|}}}
| district = {{{district5|}}}
| firstminister = {{{first_minister5|}}}
| governor-general = {{{governor-general5|}}}
| governor_general = {{{governor_general5|}}}
| governor = {{{governor5|}}}
| jr/sr = {{{jr/sr5|}}}
| leader = {{{leader5|}}}
| legislature = {{{legislature5|}}}
| lieutenant_governor = {{{lieutenant_governor5|}}}
| lieutenant = {{{lieutenant5|}}}
| minister_from = {{{minister_from5|}}}
| minority_floor_leader = {{{minority_floor_leader5|}}}
| majority_floor_leader = {{{majority_floor_leader5|}}}
| majority_leader = {{{majority_leader5|}}}
| majority = {{{majority5|}}}
| minister = {{{minister5|}}}
| minority_leader = {{{minority_leader5|}}}
| monarch = {{{monarch5|}}}
| nominator = {{{nominator5|}}}
| office = {{{office5|}}}
| order = {{{order5|}}}
| parliament = {{{parliament5|}}}
| parliamentarygroup = {{{parliamentary_group5|}}}
| predecessor = {{{predecessor5|}}}
| preceding = {{{preceding5|}}}
| preceded = {{{preceded5|}}}
| premier = {{{premier5|}}}
| president = {{{president5|}}}
| primeminister = {{{prime_minister5|}}}
| riding = {{{riding5|}}}
| state_assembly = {{{state_assembly5|}}}
| state_delegate = {{{state_delegate5|}}}
| state_house = {{{state_house5|}}}
| state_legislature = {{{state_legislature5|}}}
| state_senate = {{{state_senate5|}}}
| state = {{{state5|}}}
| status = {{{status5|}}}
| subterm = {{nobold|{{{subterm5|}}}}}
| suboffice = {{{suboffice5|}}}
| succeeded = {{{succeeded5|}}}
| succeeding = {{{succeeding5|}}}
| successor = {{{successor5|}}}
| taoiseach = {{{taoiseach5|}}}
| termlabel = {{if empty|{{{term_label5|}}}|In office}}
| termend = {{{term_end5|}}}
| termstart = {{{term_start5|}}}
| term = {{{term5|}}}
| title = {{{title5|}}}
| vicegovernor = {{{vice_governor5|}}}
| vicepresident = {{{vice_president5|}}}
| vicepremier = {{{vice_premier5|}}}
| viceprimeminister = {{{vice_prime_minister5|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term5|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname6|}}}
| 1namedata = {{{1namedata6|}}}
| 2blankname = {{{2blankname6|}}}
| 2namedata = {{{2namedata6|}}}
| 3blankname = {{{3blankname6|}}}
| 3namedata = {{{3namedata6|}}}
| 4blankname = {{{4blankname6|}}}
| 4namedata = {{{4namedata6|}}}
| 5blankname = {{{5blankname6|}}}
| 5namedata = {{{5namedata6|}}}
| alongside = {{{alongside6|}}}
| ambassador_from = {{{ambassador_from6|}}}
| appointer = {{{appointer6|}}}
| assembly = {{{assembly6|}}}
| assuming = {{{assuming6|}}}
| chancellor = {{{chancellor6|}}}
| co-leader = {{{co-leader6|}}}
| constituency_{{#if:{{{constituency_AM6|}}}|AM|MP}} = {{if empty|{{{constituency_AM6|}}}|{{{constituency_MP6|}}}}}
| constituency = {{{constituency6|}}}
| convocation = {{{convocation6|}}}
| country = {{{country6|}}}
| deputy = {{{deputy6|}}}
| district = {{{district6|}}}
| firstminister = {{{first_minister6|}}}
| governor-general = {{{governor-general6|}}}
| governor_general = {{{governor_general6|}}}
| governor = {{{governor6|}}}
| jr/sr = {{{jr/sr6|}}}
| leader = {{{leader6|}}}
| legislature = {{{legislature6|}}}
| lieutenant_governor = {{{lieutenant_governor6|}}}
| lieutenant = {{{lieutenant6|}}}
| minority_floor_leader = {{{minority_floor_leader6|}}}
| minister_from = {{{minister_from6|}}}
| majority_floor_leader = {{{majority_floor_leader6|}}}
| majority_leader = {{{majority_leader6|}}}
| majority = {{{majority6|}}}
| minister = {{{minister6|}}}
| minority_leader = {{{minority_leader6|}}}
| monarch = {{{monarch6|}}}
| nominator = {{{nominator6|}}}
| office = {{{office6|}}}
| order = {{{order6|}}}
| parliament = {{{parliament6|}}}
| parliamentarygroup = {{{parliamentary_group6|}}}
| predecessor = {{{predecessor6|}}}
| preceding = {{{preceding6|}}}
| preceded = {{{preceded6|}}}
| premier = {{{premier6|}}}
| president = {{{president6|}}}
| primeminister = {{{prime_minister6|}}}
| riding = {{{riding6|}}}
| state_assembly = {{{state_assembly6|}}}
| state_delegate = {{{state_delegate6|}}}
| state_house = {{{state_house6|}}}
| state_legislature = {{{state_legislature6|}}}
| state_senate = {{{state_senate6|}}}
| state = {{{state6|}}}
| status = {{{status6|}}}
| subterm = {{nobold|{{{subterm6|}}}}}
| suboffice = {{{suboffice6|}}}
| succeeded = {{{succeeded6|}}}
| succeeding = {{{succeeding6|}}}
| successor = {{{successor6|}}}
| taoiseach = {{{taoiseach6|}}}
| termlabel = {{if empty|{{{term_label6|}}}|In office}}
| termend = {{{term_end6|}}}
| termstart = {{{term_start6|}}}
| term = {{{term6|}}}
| title = {{{title6|}}}
| vicegovernor = {{{vice_governor6|}}}
| vicepresident = {{{vice_president6|}}}
| vicepremier = {{{vice_premier6|}}}
| viceprimeminister = {{{vice_prime_minister6|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term6|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname7|}}}
| 1namedata = {{{1namedata7|}}}
| 2blankname = {{{2blankname7|}}}
| 2namedata = {{{2namedata7|}}}
| 3blankname = {{{3blankname7|}}}
| 3namedata = {{{3namedata7|}}}
| 4blankname = {{{4blankname7|}}}
| 4namedata = {{{4namedata7|}}}
| 5blankname = {{{5blankname7|}}}
| 5namedata = {{{5namedata7|}}}
| alongside = {{{alongside7|}}}
| ambassador_from = {{{ambassador_from7|}}}
| appointer = {{{appointer7|}}}
| assembly = {{{assembly7|}}}
| assuming = {{{assuming7|}}}
| chancellor = {{{chancellor7|}}}
| co-leader = {{{co-leader7|}}}
| constituency_{{#if:{{{constituency_AM7|}}}|AM|MP}} = {{if empty|{{{constituency_AM7|}}}|{{{constituency_MP7|}}}}}
| constituency = {{{constituency7|}}}
| convocation = {{{convocation7|}}}
| country = {{{country7|}}}
| deputy = {{{deputy7|}}}
| district = {{{district7|}}}
| firstminister = {{{first_minister7|}}}
| governor-general = {{{governor-general7|}}}
| governor_general = {{{governor_general7|}}}
| governor = {{{governor7|}}}
| jr/sr = {{{jr/sr7|}}}
| leader = {{{leader7|}}}
| legislature = {{{legislature7|}}}
| lieutenant_governor = {{{lieutenant_governor7|}}}
| lieutenant = {{{lieutenant7|}}}
| minister_from = {{{minister_from7|}}}
| minority_floor_leader = {{{minority_floor_leader7|}}}
| majority_floor_leader = {{{majority_floor_leader7|}}}
| majority_leader = {{{majority_leader7|}}}
| majority = {{{majority7|}}}
| minister = {{{minister7|}}}
| minority_leader = {{{minority_leader7|}}}
| monarch = {{{monarch7|}}}
| nominator = {{{nominator7|}}}
| office = {{{office7|}}}
| order = {{{order7|}}}
| parliament = {{{parliament7|}}}
| parliamentarygroup = {{{parliamentary_group7|}}}
| predecessor = {{{predecessor7|}}}
| preceding = {{{preceding7|}}}
| preceded = {{{preceded7|}}}
| premier = {{{premier7|}}}
| president = {{{president7|}}}
| primeminister = {{{prime_minister7|}}}
| riding = {{{riding7|}}}
| state_assembly = {{{state_assembly7|}}}
| state_delegate = {{{state_delegate7|}}}
| state_house = {{{state_house7|}}}
| state_legislature = {{{state_legislature7|}}}
| state_senate = {{{state_senate7|}}}
| state = {{{state7|}}}
| status = {{{status7|}}}
| subterm = {{nobold|{{{subterm7|}}}}}
| suboffice = {{{suboffice7|}}}
| succeeded = {{{succeeded7|}}}
| succeeding = {{{succeeding7|}}}
| successor = {{{successor7|}}}
| taoiseach = {{{taoiseach7|}}}
| termlabel = {{if empty|{{{term_label7|}}}|In office}}
| termend = {{{term_end7|}}}
| termstart = {{{term_start7|}}}
| term = {{{term7|}}}
| title = {{{title7|}}}
| vicegovernor = {{{vice_governor7|}}}
| vicepresident = {{{vice_president7|}}}
| vicepremier = {{{vice_premier7|}}}
| viceprimeminister = {{{vice_prime_minister7|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term7|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname8|}}}
| 1namedata = {{{1namedata8|}}}
| 2blankname = {{{2blankname8|}}}
| 2namedata = {{{2namedata8|}}}
| 3blankname = {{{3blankname8|}}}
| 3namedata = {{{3namedata8|}}}
| 4blankname = {{{4blankname8|}}}
| 4namedata = {{{4namedata8|}}}
| 5blankname = {{{5blankname8|}}}
| 5namedata = {{{5namedata8|}}}
| alongside = {{{alongside8|}}}
| ambassador_from = {{{ambassador_from8|}}}
| appointer = {{{appointer8|}}}
| assembly = {{{assembly8|}}}
| assuming = {{{assuming8|}}}
| chancellor = {{{chancellor8|}}}
| co-leader = {{{co-leader8|}}}
| constituency_{{#if:{{{constituency_AM8|}}}|AM|MP}} = {{if empty|{{{constituency_AM8|}}}|{{{constituency_MP8|}}}}}
| constituency = {{{constituency8|}}}
| convocation = {{{convocation8|}}}
| country = {{{country8|}}}
| deputy = {{{deputy8|}}}
| district = {{{district8|}}}
| firstminister = {{{first_minister8|}}}
| governor-general = {{{governor-general8|}}}
| governor_general = {{{governor_general8|}}}
| governor = {{{governor8|}}}
| jr/sr = {{{jr/sr8|}}}
| leader = {{{leader8|}}}
| legislature = {{{legislature8|}}}
| lieutenant_governor = {{{lieutenant_governor8|}}}
| lieutenant = {{{lieutenant8|}}}
| minister_from = {{{minister_from8|}}}
| minority_floor_leader = {{{minority_floor_leader8|}}}
| majority_floor_leader = {{{majority_floor_leader8|}}}
| majority_leader = {{{majority_leader8|}}}
| majority = {{{majority8|}}}
| minister = {{{minister8|}}}
| minority_leader = {{{minority_leader8|}}}
| monarch = {{{monarch8|}}}
| nominator = {{{nominator8|}}}
| office = {{{office8|}}}
| order = {{{order8|}}}
| parliament = {{{parliament8|}}}
| parliamentarygroup = {{{parliamentary_group8|}}}
| predecessor = {{{predecessor8|}}}
| preceding = {{{preceding8|}}}
| preceded = {{{preceded8|}}}
| premier = {{{premier8|}}}
| president = {{{president8|}}}
| primeminister = {{{prime_minister8|}}}
| riding = {{{riding8|}}}
| state_assembly = {{{state_assembly8|}}}
| state_delegate = {{{state_delegate8|}}}
| state_house = {{{state_house8|}}}
| state_legislature = {{{state_legislature8|}}}
| state_senate = {{{state_senate8|}}}
| state = {{{state8|}}}
| status = {{{status8|}}}
| subterm = {{nobold|{{{subterm8|}}}}}
| suboffice = {{{suboffice8|}}}
| succeeded = {{{succeeded8|}}}
| succeeding = {{{succeeding8|}}}
| successor = {{{successor8|}}}
| taoiseach = {{{taoiseach8|}}}
| termlabel = {{if empty|{{{term_label8|}}}|In office}}
| termend = {{{term_end8|}}}
| termstart = {{{term_start8|}}}
| term = {{{term8|}}}
| title = {{{title8|}}}
| vicegovernor = {{{vice_governor8|}}}
| vicepresident = {{{vice_president8|}}}
| vicepremier = {{{vice_premier8|}}}
| viceprimeminister = {{{vice_prime_minister8|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term8|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname9|}}}
| 1namedata = {{{1namedata9|}}}
| 2blankname = {{{2blankname9|}}}
| 2namedata = {{{2namedata9|}}}
| 3blankname = {{{3blankname9|}}}
| 3namedata = {{{3namedata9|}}}
| 4blankname = {{{4blankname9|}}}
| 4namedata = {{{4namedata9|}}}
| 5blankname = {{{5blankname9|}}}
| 5namedata = {{{5namedata9|}}}
| alongside = {{{alongside9|}}}
| ambassador_from = {{{ambassador_from9|}}}
| appointer = {{{appointer9|}}}
| assembly = {{{assembly9|}}}
| assuming = {{{assuming9|}}}
| chancellor = {{{chancellor9|}}}
| co-leader = {{{co-leader9|}}}
| constituency_{{#if:{{{constituency_AM9|}}}|AM|MP}} = {{if empty|{{{constituency_AM9|}}}|{{{constituency_MP9|}}}}}
| constituency = {{{constituency9|}}}
| convocation = {{{convocation9|}}}
| country = {{{country9|}}}
| deputy = {{{deputy9|}}}
| district = {{{district9|}}}
| firstminister = {{{first_minister9|}}}
| governor-general = {{{governor-general9|}}}
| governor_general = {{{governor_general9|}}}
| governor = {{{governor9|}}}
| jr/sr = {{{jr/sr9|}}}
| leader = {{{leader9|}}}
| legislature = {{{legislature9|}}}
| lieutenant_governor = {{{lieutenant_governor9|}}}
| lieutenant = {{{lieutenant9|}}}
| minister_from = {{{minister_from9|}}}
| minority_floor_leader = {{{minority_floor_leader9|}}}
| majority_floor_leader = {{{majority_floor_leader9|}}}
| majority_leader = {{{majority_leader9|}}}
| majority = {{{majority9|}}}
| minister = {{{minister9|}}}
| minority_leader = {{{minority_leader9|}}}
| monarch = {{{monarch9|}}}
| nominator = {{{nominator9|}}}
| office = {{{office9|}}}
| order = {{{order9|}}}
| parliament = {{{parliament9|}}}
| parliamentarygroup = {{{parliamentary_group9|}}}
| predecessor = {{{predecessor9|}}}
| preceding = {{{preceding9|}}}
| preceded = {{{preceded9|}}}
| premier = {{{premier9|}}}
| president = {{{president9|}}}
| primeminister = {{{prime_minister9|}}}
| riding = {{{riding9|}}}
| state_assembly = {{{state_assembly9|}}}
| state_delegate = {{{state_delegate9|}}}
| state_house = {{{state_house9|}}}
| state_legislature = {{{state_legislature9|}}}
| state_senate = {{{state_senate9|}}}
| state = {{{state9|}}}
| status = {{{status9|}}}
| subterm = {{nobold|{{{subterm9|}}}}}
| suboffice = {{{suboffice9|}}}
| succeeded = {{{succeeded9|}}}
| succeeding = {{{succeeding9|}}}
| successor = {{{successor9|}}}
| taoiseach = {{{taoiseach9|}}}
| termlabel = {{if empty|{{{term_label9|}}}|In office}}
| termend = {{{term_end9|}}}
| termstart = {{{term_start9|}}}
| term = {{{term9|}}}
| title = {{{title9|}}}
| vicegovernor = {{{vice_governor9|}}}
| vicepresident = {{{vice_president9|}}}
| vicepremier = {{{vice_premier9|}}}
| viceprimeminister = {{{vice_prime_minister9|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term9|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname10|}}}
| 1namedata = {{{1namedata10|}}}
| 2blankname = {{{2blankname10|}}}
| 2namedata = {{{2namedata10|}}}
| 3blankname = {{{3blankname10|}}}
| 3namedata = {{{3namedata10|}}}
| 4blankname = {{{4blankname10|}}}
| 4namedata = {{{4namedata10|}}}
| 5blankname = {{{5blankname10|}}}
| 5namedata = {{{5namedata10|}}}
| alongside = {{{alongside10|}}}
| ambassador_from = {{{ambassador_from10|}}}
| appointer = {{{appointer10|}}}
| assembly = {{{assembly10|}}}
| assuming = {{{assuming10|}}}
| chancellor = {{{chancellor10|}}}
| co-leader = {{{co-leader10|}}}
| constituency_{{#if:{{{constituency_AM10|}}}|AM|MP}} = {{if empty|{{{constituency_AM10|}}}|{{{constituency_MP10|}}}}}
| constituency = {{{constituency10|}}}
| convocation = {{{convocation10|}}}
| country = {{{country10|}}}
| deputy = {{{deputy10|}}}
| district = {{{district10|}}}
| firstminister = {{{first_minister10|}}}
| governor-general = {{{governor-general10|}}}
| governor_general = {{{governor_general10|}}}
| governor = {{{governor10|}}}
| jr/sr = {{{jr/sr10|}}}
| leader = {{{leader10|}}}
| legislature = {{{legislature10|}}}
| lieutenant_governor = {{{lieutenant_governor10|}}}
| lieutenant = {{{lieutenant10|}}}
| minister_from = {{{minister_from10|}}}
| minority_floor_leader = {{{minority_floor_leader10|}}}
| majority_floor_leader = {{{majority_floor_leader10|}}}
| majority_leader = {{{majority_leader10|}}}
| majority = {{{majority10|}}}
| minister = {{{minister10|}}}
| minority_leader = {{{minority_leader10|}}}
| monarch = {{{monarch10|}}}
| nominator = {{{nominator10|}}}
| office = {{{office10|}}}
| order = {{{order10|}}}
| parliament = {{{parliament10|}}}
| parliamentarygroup = {{{parliamentary_group10|}}}
| predecessor = {{{predecessor10|}}}
| preceding = {{{preceding10|}}}
| preceded = {{{preceded10|}}}
| premier = {{{premier10|}}}
| president = {{{president10|}}}
| primeminister = {{{prime_minister10|}}}
| riding = {{{riding10|}}}
| state_assembly = {{{state_assembly10|}}}
| state_delegate = {{{state_delegate10|}}}
| state_house = {{{state_house10|}}}
| state_legislature = {{{state_legislature10|}}}
| state_senate = {{{state_senate10|}}}
| state = {{{state10|}}}
| status = {{{status10|}}}
| subterm = {{nobold|{{{subterm10|}}}}}
| suboffice = {{{suboffice10|}}}
| succeeded = {{{succeeded10|}}}
| succeeding = {{{succeeding10|}}}
| successor = {{{successor10|}}}
| taoiseach = {{{taoiseach10|}}}
| termlabel = {{if empty|{{{term_label10|}}}|In office}}
| termend = {{{term_end10|}}}
| termstart = {{{term_start10|}}}
| term = {{{term10|}}}
| title = {{{title10|}}}
| vicegovernor = {{{vice_governor10|}}}
| vicepresident = {{{vice_president10|}}}
| vicepremier = {{{vice_premier10|}}}
| viceprimeminister = {{{vice_prime_minister10|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term10|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname11|}}}
| 1namedata = {{{1namedata11|}}}
| 2blankname = {{{2blankname11|}}}
| 2namedata = {{{2namedata11|}}}
| 3blankname = {{{3blankname11|}}}
| 3namedata = {{{3namedata11|}}}
| 4blankname = {{{4blankname11|}}}
| 4namedata = {{{4namedata11|}}}
| 5blankname = {{{5blankname11|}}}
| 5namedata = {{{5namedata11|}}}
| alongside = {{{alongside11|}}}
| ambassador_from = {{{ambassador_from11|}}}
| appointer = {{{appointer11|}}}
| assembly = {{{assembly11|}}}
| assuming = {{{assuming11|}}}
| chancellor = {{{chancellor11|}}}
| co-leader = {{{co-leader11|}}}
| constituency_{{#if:{{{constituency_AM11|}}}|AM|MP}} = {{if empty|{{{constituency_AM11|}}}|{{{constituency_MP11|}}}}}
| constituency = {{{constituency11|}}}
| convocation = {{{convocation11|}}}
| country = {{{country11|}}}
| deputy = {{{deputy11|}}}
| district = {{{district11|}}}
| firstminister = {{{first_minister11|}}}
| governor-general = {{{governor-general11|}}}
| governor_general = {{{governor_general11|}}}
| governor = {{{governor11|}}}
| jr/sr = {{{jr/sr11|}}}
| leader = {{{leader11|}}}
| legislature = {{{legislature11|}}}
| lieutenant_governor = {{{lieutenant_governor11|}}}
| lieutenant = {{{lieutenant11|}}}
| minister_from = {{{minister_from11|}}}
| minority_floor_leader = {{{minority_floor_leader11|}}}
| majority_floor_leader = {{{majority_floor_leader11|}}}
| majority_leader = {{{majority_leader11|}}}
| majority = {{{majority11|}}}
| minister = {{{minister11|}}}
| minority_leader = {{{minority_leader11|}}}
| monarch = {{{monarch11|}}}
| nominator = {{{nominator11|}}}
| office = {{{office11|}}}
| order = {{{order11|}}}
| parliament = {{{parliament11|}}}
| parliamentarygroup = {{{parliamentary_group11|}}}
| predecessor = {{{predecessor11|}}}
| preceding = {{{preceding11|}}}
| preceded = {{{preceded11|}}}
| premier = {{{premier11|}}}
| president = {{{president11|}}}
| primeminister = {{{prime_minister11|}}}
| riding = {{{riding11|}}}
| state_assembly = {{{state_assembly11|}}}
| state_delegate = {{{state_delegate11|}}}
| state_house = {{{state_house11|}}}
| state_legislature = {{{state_legislature11|}}}
| state_senate = {{{state_senate11|}}}
| state = {{{state11|}}}
| status = {{{status11|}}}
| subterm = {{nobold|{{{subterm11|}}}}}
| suboffice = {{{suboffice11|}}}
| succeeded = {{{succeeded11|}}}
| succeeding = {{{succeeding11|}}}
| successor = {{{successor11|}}}
| taoiseach = {{{taoiseach11|}}}
| termlabel = {{if empty|{{{term_label11|}}}|In office}}
| termend = {{{term_end11|}}}
| termstart = {{{term_start11|}}}
| term = {{{term11|}}}
| title = {{{title11|}}}
| vicegovernor = {{{vice_governor11|}}}
| vicepresident = {{{vice_president11|}}}
| vicepremier = {{{vice_premier11|}}}
| viceprimeminister = {{{vice_prime_minister11|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term11|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname12|}}}
| 1namedata = {{{1namedata12|}}}
| 2blankname = {{{2blankname12|}}}
| 2namedata = {{{2namedata12|}}}
| 3blankname = {{{3blankname12|}}}
| 3namedata = {{{3namedata12|}}}
| 4blankname = {{{4blankname12|}}}
| 4namedata = {{{4namedata12|}}}
| 5blankname = {{{5blankname12|}}}
| 5namedata = {{{5namedata12|}}}
| alongside = {{{alongside12|}}}
| ambassador_from = {{{ambassador_from12|}}}
| appointer = {{{appointer12|}}}
| assembly = {{{assembly12|}}}
| assuming = {{{assuming12|}}}
| chancellor = {{{chancellor12|}}}
| co-leader = {{{co-leader12|}}}
| constituency_{{#if:{{{constituency_AM12|}}}|AM|MP}} = {{if empty|{{{constituency_AM12|}}}|{{{constituency_MP12|}}}}}
| constituency = {{{constituency12|}}}
| convocation = {{{convocation12|}}}
| country = {{{country12|}}}
| deputy = {{{deputy12|}}}
| district = {{{district12|}}}
| firstminister = {{{first_minister12|}}}
| governor-general = {{{governor-general12|}}}
| governor_general = {{{governor_general12|}}}
| governor = {{{governor12|}}}
| jr/sr = {{{jr/sr12|}}}
| leader = {{{leader12|}}}
| legislature = {{{legislature12|}}}
| lieutenant_governor = {{{lieutenant_governor12|}}}
| lieutenant = {{{lieutenant12|}}}
| minister_from = {{{minister_from12|}}}
| minority_floor_leader = {{{minority_floor_leader12|}}}
| majority_floor_leader = {{{majority_floor_leader12|}}}
| majority_leader = {{{majority_leader12|}}}
| majority = {{{majority12|}}}
| minister = {{{minister12|}}}
| minority_leader = {{{minority_leader12|}}}
| monarch = {{{monarch12|}}}
| nominator = {{{nominator12|}}}
| office = {{{office12|}}}
| order = {{{order12|}}}
| parliament = {{{parliament12|}}}
| parliamentarygroup = {{{parliamentary_group12|}}}
| predecessor = {{{predecessor12|}}}
| preceding = {{{preceding12|}}}
| preceded = {{{preceded12|}}}
| premier = {{{premier12|}}}
| president = {{{president12|}}}
| primeminister = {{{prime_minister12|}}}
| riding = {{{riding12|}}}
| state_assembly = {{{state_assembly12|}}}
| state_delegate = {{{state_delegate12|}}}
| state_house = {{{state_house12|}}}
| state_legislature = {{{state_legislature12|}}}
| state_senate = {{{state_senate12|}}}
| state = {{{state12|}}}
| status = {{{status12|}}}
| subterm = {{nobold|{{{subterm12|}}}}}
| suboffice = {{{suboffice12|}}}
| succeeded = {{{succeeded12|}}}
| succeeding = {{{succeeding12|}}}
| successor = {{{successor12|}}}
| taoiseach = {{{taoiseach12|}}}
| termlabel = {{if empty|{{{term_label12|}}}|In office}}
| termend = {{{term_end12|}}}
| termstart = {{{term_start12|}}}
| term = {{{term12|}}}
| title = {{{title12|}}}
| vicegovernor = {{{vice_governor12|}}}
| vicepresident = {{{vice_president12|}}}
| vicepremier = {{{vice_premier12|}}}
| viceprimeminister = {{{vice_prime_minister12|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term12|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname13|}}}
| 1namedata = {{{1namedata13|}}}
| 2blankname = {{{2blankname13|}}}
| 2namedata = {{{2namedata13|}}}
| 3blankname = {{{3blankname13|}}}
| 3namedata = {{{3namedata13|}}}
| 4blankname = {{{4blankname13|}}}
| 4namedata = {{{4namedata13|}}}
| 5blankname = {{{5blankname13|}}}
| 5namedata = {{{5namedata13|}}}
| alongside = {{{alongside13|}}}
| ambassador_from = {{{ambassador_from13|}}}
| appointer = {{{appointer13|}}}
| assembly = {{{assembly13|}}}
| assuming = {{{assuming13|}}}
| chancellor = {{{chancellor13|}}}
| co-leader = {{{co-leader13|}}}
| constituency_{{#if:{{{constituency_AM13|}}}|AM|MP}} = {{if empty|{{{constituency_AM13|}}}|{{{constituency_MP13|}}}}}
| constituency = {{{constituency13|}}}
| convocation = {{{convocation13|}}}
| country = {{{country13|}}}
| deputy = {{{deputy13|}}}
| district = {{{district13|}}}
| firstminister = {{{first_minister13|}}}
| governor-general = {{{governor-general13|}}}
| governor_general = {{{governor_general13|}}}
| governor = {{{governor13|}}}
| jr/sr = {{{jr/sr13|}}}
| leader = {{{leader13|}}}
| legislature = {{{legislature13|}}}
| lieutenant_governor = {{{lieutenant_governor13|}}}
| lieutenant = {{{lieutenant13|}}}
| minister_from = {{{minister_from13|}}}
| minority_floor_leader = {{{minority_floor_leader13|}}}
| majority_floor_leader = {{{majority_floor_leader13|}}}
| majority_leader = {{{majority_leader13|}}}
| majority = {{{majority13|}}}
| minister = {{{minister13|}}}
| minority_leader = {{{minority_leader13|}}}
| monarch = {{{monarch13|}}}
| nominator = {{{nominator13|}}}
| office = {{{office13|}}}
| order = {{{order13|}}}
| parliament = {{{parliament13|}}}
| parliamentarygroup = {{{parliamentary_group13|}}}
| predecessor = {{{predecessor13|}}}
| preceding = {{{preceding13|}}}
| preceded = {{{preceded13|}}}
| premier = {{{premier13|}}}
| president = {{{president13|}}}
| primeminister = {{{prime_minister13|}}}
| riding = {{{riding13|}}}
| state_assembly = {{{state_assembly13|}}}
| state_delegate = {{{state_delegate13|}}}
| state_house = {{{state_house13|}}}
| state_legislature = {{{state_legislature13|}}}
| state_senate = {{{state_senate13|}}}
| state = {{{state13|}}}
| status = {{{status13|}}}
| subterm = {{nobold|{{{subterm13|}}}}}
| suboffice = {{{suboffice13|}}}
| succeeded = {{{succeeded13|}}}
| succeeding = {{{succeeding13|}}}
| successor = {{{successor13|}}}
| taoiseach = {{{taoiseach13|}}}
| termlabel = {{if empty|{{{term_label13|}}}|In office}}
| termend = {{{term_end13|}}}
| termstart = {{{term_start13|}}}
| term = {{{term13|}}}
| title = {{{title13|}}}
| vicegovernor = {{{vice_governor13|}}}
| vicepresident = {{{vice_president13|}}}
| vicepremier = {{{vice_premier13|}}}
| viceprimeminister = {{{vice_prime_minister13|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term13|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname14|}}}
| 1namedata = {{{1namedata14|}}}
| 2blankname = {{{2blankname14|}}}
| 2namedata = {{{2namedata14|}}}
| 3blankname = {{{3blankname14|}}}
| 3namedata = {{{3namedata14|}}}
| 4blankname = {{{4blankname14|}}}
| 4namedata = {{{4namedata14|}}}
| 5blankname = {{{5blankname14|}}}
| 5namedata = {{{5namedata14|}}}
| alongside = {{{alongside14|}}}
| ambassador_from = {{{ambassador_from14|}}}
| appointer = {{{appointer14|}}}
| assembly = {{{assembly14|}}}
| assuming = {{{assuming14|}}}
| chancellor = {{{chancellor14|}}}
| co-leader = {{{co-leader14|}}}
| constituency_{{#if:{{{constituency_AM14|}}}|AM|MP}} = {{if empty|{{{constituency_AM14|}}}|{{{constituency_MP14|}}}}}
| constituency = {{{constituency14|}}}
| convocation = {{{convocation14|}}}
| country = {{{country14|}}}
| deputy = {{{deputy14|}}}
| district = {{{district14|}}}
| firstminister = {{{first_minister14|}}}
| governor-general = {{{governor-general14|}}}
| governor_general = {{{governor_general14|}}}
| governor = {{{governor14|}}}
| jr/sr = {{{jr/sr14|}}}
| leader = {{{leader14|}}}
| legislature = {{{legislature14|}}}
| lieutenant_governor = {{{lieutenant_governor14|}}}
| lieutenant = {{{lieutenant14|}}}
| minister_from = {{{minister_from14|}}}
| minority_floor_leader = {{{minority_floor_leader14|}}}
| majority_floor_leader = {{{majority_floor_leader14|}}}
| majority_leader = {{{majority_leader14|}}}
| majority = {{{majority14|}}}
| minister = {{{minister14|}}}
| minority_leader = {{{minority_leader14|}}}
| monarch = {{{monarch14|}}}
| nominator = {{{nominator14|}}}
| office = {{{office14|}}}
| order = {{{order14|}}}
| parliament = {{{parliament14|}}}
| parliamentarygroup = {{{parliamentary_group14|}}}
| predecessor = {{{predecessor14|}}}
| preceding = {{{preceding14|}}}
| preceded = {{{preceded14|}}}
| premier = {{{premier14|}}}
| president = {{{president14|}}}
| primeminister = {{{prime_minister14|}}}
| riding = {{{riding14|}}}
| state_assembly = {{{state_assembly14|}}}
| state_delegate = {{{state_delegate14|}}}
| state_house = {{{state_house14|}}}
| state_legislature = {{{state_legislature14|}}}
| state_senate = {{{state_senate14|}}}
| state = {{{state14|}}}
| status = {{{status14|}}}
| subterm = {{nobold|{{{subterm14|}}}}}
| suboffice = {{{suboffice14|}}}
| succeeded = {{{succeeded14|}}}
| succeeding = {{{succeeding14|}}}
| successor = {{{successor14|}}}
| taoiseach = {{{taoiseach14|}}}
| termlabel = {{if empty|{{{term_label14|}}}|In office}}
| termend = {{{term_end14|}}}
| termstart = {{{term_start14|}}}
| term = {{{term14|}}}
| title = {{{title14|}}}
| vicegovernor = {{{vice_governor14|}}}
| vicepresident = {{{vice_president14|}}}
| vicepremier = {{{vice_premier14|}}}
| viceprimeminister = {{{vice_prime_minister14|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term14|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname15|}}}
| 1namedata = {{{1namedata15|}}}
| 2blankname = {{{2blankname15|}}}
| 2namedata = {{{2namedata15|}}}
| 3blankname = {{{3blankname15|}}}
| 3namedata = {{{3namedata15|}}}
| 4blankname = {{{4blankname15|}}}
| 4namedata = {{{4namedata15|}}}
| 5blankname = {{{5blankname15|}}}
| 5namedata = {{{5namedata15|}}}
| alongside = {{{alongside15|}}}
| ambassador_from = {{{ambassador_from15|}}}
| appointer = {{{appointer15|}}}
| assembly = {{{assembly15|}}}
| assuming = {{{assuming15|}}}
| chancellor = {{{chancellor15|}}}
| co-leader = {{{co-leader15|}}}
| constituency_{{#if:{{{constituency_AM15|}}}|AM|MP}} = {{if empty|{{{constituency_AM15|}}}|{{{constituency_MP15|}}}}}
| constituency = {{{constituency15|}}}
| convocation = {{{convocation15|}}}
| country = {{{country15|}}}
| deputy = {{{deputy15|}}}
| district = {{{district15|}}}
| firstminister = {{{first_minister15|}}}
| governor-general = {{{governor-general15|}}}
| governor_general = {{{governor_general15|}}}
| governor = {{{governor15|}}}
| jr/sr = {{{jr/sr15|}}}
| leader = {{{leader15|}}}
| legislature = {{{legislature15|}}}
| lieutenant_governor = {{{lieutenant_governor15|}}}
| lieutenant = {{{lieutenant15|}}}
| minister_from = {{{minister_from15|}}}
| minority_floor_leader = {{{minority_floor_leader15|}}}
| majority_floor_leader = {{{majority_floor_leader15|}}}
| majority_leader = {{{majority_leader15|}}}
| majority = {{{majority15|}}}
| minister = {{{minister15|}}}
| minority_leader = {{{minority_leader15|}}}
| monarch = {{{monarch15|}}}
| nominator = {{{nominator15|}}}
| office = {{{office15|}}}
| order = {{{order15|}}}
| parliament = {{{parliament15|}}}
| parliamentarygroup = {{{parliamentary_group15|}}}
| predecessor = {{{predecessor15|}}}
| preceding = {{{preceding15|}}}
| preceded = {{{preceded15|}}}
| premier = {{{premier15|}}}
| president = {{{president15|}}}
| primeminister = {{{prime_minister15|}}}
| riding = {{{riding15|}}}
| state_assembly = {{{state_assembly15|}}}
| state_delegate = {{{state_delegate15|}}}
| state_house = {{{state_house15|}}}
| state_legislature = {{{state_legislature15|}}}
| state_senate = {{{state_senate15|}}}
| state = {{{state15|}}}
| status = {{{status15|}}}
| subterm = {{nobold|{{{subterm15|}}}}}
| suboffice = {{{suboffice15|}}}
| succeeded = {{{succeeded15|}}}
| succeeding = {{{succeeding15|}}}
| successor = {{{successor15|}}}
| taoiseach = {{{taoiseach15|}}}
| termlabel = {{if empty|{{{term_label15|}}}|In office}}
| termend = {{{term_end15|}}}
| termstart = {{{term_start15|}}}
| term = {{{term15|}}}
| title = {{{title15|}}}
| vicegovernor = {{{vice_governor15|}}}
| vicepresident = {{{vice_president15|}}}
| vicepremier = {{{vice_premier15|}}}
| viceprimeminister = {{{vice_prime_minister15|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term15|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname16|}}}
| 1namedata = {{{1namedata16|}}}
| 2blankname = {{{2blankname16|}}}
| 2namedata = {{{2namedata16|}}}
| 3blankname = {{{3blankname16|}}}
| 3namedata = {{{3namedata16|}}}
| 4blankname = {{{4blankname16|}}}
| 4namedata = {{{4namedata16|}}}
| 5blankname = {{{5blankname16|}}}
| 5namedata = {{{5namedata16|}}}
| alongside = {{{alongside16|}}}
| ambassador_from = {{{ambassador_from16|}}}
| appointer = {{{appointer16|}}}
| assembly = {{{assembly16|}}}
| assuming = {{{assuming16|}}}
| chancellor = {{{chancellor16|}}}
| co-leader = {{{co-leader16|}}}
| constituency_{{#if:{{{constituency_AM16|}}}|AM|MP}} = {{if empty|{{{constituency_AM16|}}}|{{{constituency_MP16|}}}}}
| constituency = {{{constituency16|}}}
| convocation = {{{convocation16|}}}
| country = {{{country16|}}}
| deputy = {{{deputy16|}}}
| district = {{{district16|}}}
| firstminister = {{{first_minister16|}}}
| governor-general = {{{governor-general16|}}}
| governor_general = {{{governor_general16|}}}
| governor = {{{governor16|}}}
| jr/sr = {{{jr/sr16|}}}
| leader = {{{leader16|}}}
| legislature = {{{legislature16|}}}
| lieutenant_governor = {{{lieutenant_governor16|}}}
| lieutenant = {{{lieutenant16|}}}
| minister_from = {{{minister_from16|}}}
| minority_floor_leader = {{{minority_floor_leader16|}}}
| majority_floor_leader = {{{majority_floor_leader16|}}}
| majority_leader = {{{majority_leader16|}}}
| majority = {{{majority16|}}}
| minister = {{{minister16|}}}
| minority_leader = {{{minority_leader16|}}}
| monarch = {{{monarch16|}}}
| nominator = {{{nominator16|}}}
| office = {{{office16|}}}
| order = {{{order16|}}}
| parliament = {{{parliament16|}}}
| parliamentarygroup = {{{parliamentary_group16|}}}
| predecessor = {{{predecessor16|}}}
| preceding = {{{preceding16|}}}
| preceded = {{{preceded16|}}}
| premier = {{{premier16|}}}
| president = {{{president16|}}}
| primeminister = {{{prime_minister16|}}}
| riding = {{{riding16|}}}
| state_assembly = {{{state_assembly16|}}}
| state_delegate = {{{state_delegate16|}}}
| state_house = {{{state_house16|}}}
| state_legislature = {{{state_legislature16|}}}
| state_senate = {{{state_senate16|}}}
| state = {{{state16|}}}
| status = {{{status16|}}}
| subterm = {{nobold|{{{subterm16|}}}}}
| suboffice = {{{suboffice16|}}}
| succeeded = {{{succeeded16|}}}
| succeeding = {{{succeeding16|}}}
| successor = {{{successor16|}}}
| taoiseach = {{{taoiseach16|}}}
| termlabel = {{if empty|{{{term_label16|}}}|In office}}
| termend = {{{term_end16|}}}
| termstart = {{{term_start16|}}}
| term = {{{term16|}}}
| title = {{{title16|}}}
| vicegovernor = {{{vice_governor16|}}}
| vicepresident = {{{vice_president16|}}}
| vicepremier = {{{vice_premier16|}}}
| viceprimeminister = {{{vice_prime_minister16|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term16|}}}
}}}}
| data2 = {{{module0|}}}
<!----------Personal data---------->
| header3 = {{#if:{{{pronunciation|}}}{{{birth_name|}}}{{{birth_date|}}}{{{birth_place|}}}{{{death_date|}}}{{{death_place|}}}{{{resting_place|}}}{{{resting_place_coordinates|}}}{{{citizenship|}}}{{{party|}}}{{{other_party|}}}{{{spouse|}}}{{{partner|}}}{{{relations|}}}{{{children|}}}{{{parents|}}}{{{mother|}}}{{{father|}}}{{{relatives|}}}{{{education|}}}{{{alma_mater|}}}{{{occupation|}}}{{{profession|}}}{{{known_for|}}}{{{salary|}}}{{{cabinet|}}}{{{committees|}}}{{{portfolio|}}}{{{awards|}}}{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}|Personal details}}
| label4 = Pronunciation
| data4 = {{{pronunciation|}}}
| label5 = Born
| data5 = {{#invoke:Separated entries|br
|1={{#if:{{{birth_name|}}}|<span class="nickname">{{{birth_name|}}}</span>}}
|2={{#invoke:person date|birth}}
|3={{#if:{{{birth_place|}}}|<div class="birthplace">{{{birth_place|}}}</div>}}
}}
| label6 = Died
| data6 = {{#invoke:Separated entries|br
|1={{#invoke:person date|death}}
|2={{#if:{{{death_place|}}}|<div class="deathplace">{{{death_place|}}}</div>}}
}}
| label7 = Cause of death
| data7 = {{{death_cause|}}}
| label8 = Resting place
| class8 = label
| data8 = {{#invoke:Separated entries|br
|1={{{resting_place|}}}
|2={{{resting_place_coordinates|}}}
}}
| label9 = Citizenship
| data9 = {{{citizenship|}}}
| label11 = [[Political party|Party]]
| data11 = {{#switch:{{{party|}}}
| =
| [[United States Democratic Party|Democrat]]
| [[Democratic Party (United States)|Democratic]]
| [[Democratic Party (United States)|Democrat]] = [[Democratic Party (United States)|Democratic]]
| [[Republican Party (United States)|Republican]]
| [[United States Republican Party]]
| [[United States Republican Party|Republican]]
| [[Republican Party (United States)|Republican Party]] = [[Republican Party (United States)|Republican]]
| [[Conservative Party (UK)|Conservative Party]]
| [[Conservative Party (UK)|Conservative]] = [[Conservative Party (UK)|Conservative]]
| [[Labour Party (UK)|Labour Party]]
| [[Labour Party (UK)|Labour]] = [[Labour Party (UK)|Labour]]
| [[Conservative Party of Canada|Conservative Party]]
| [[Conservative Party of Canada|Conservative]] = [[Conservative Party of Canada|Conservative]]
| [[Liberal Party of Canada|Liberal Party]]
| [[Liberal Party of Canada|Liberal]] = [[Liberal Party of Canada|Liberal]]
| KMT
| Kuomintang
| [[KMT]]
| [[Kuomintang|KMT]]
| [[Kuomintang]]
| Kuomintang (KMT)
| [[Kuomintang]] (KMT) = [[Kuomintang]]
| DPP
| [[Democratic Progressive Party|DPP]]
| [[Democratic Progressive Party]] = [[Democratic Progressive Party]]
| #default = {{{party|}}} }}
| label12 = {{longitem|Other political<br />affiliations}}
| data12 = {{{other_party|}}}
| label13 = Height
| data13 = {{#if:{{{height|}}}|{{Infobox person/height|{{{height|}}}}}}}
| label14 = Spouse{{#invoke:Detect singular|pluralize|{{{spouse|}}}|likely=(s)|plural=s}}
| data14 = {{{spouse|}}}
| label15 = {{longitem|Domestic partner{{#invoke:Detect singular|pluralize|{{{partner|}}}|likely=(s)|plural=s}}}}
| data15 = {{{partner|}}}
| label16 = Relations
| data16 = {{{relations|}}}
| label17 = Children
| data17 = {{{children|}}}
| label18 = Parent{{#if:{{{parents|}}}|{{#invoke:Detect singular|pluralize|{{{parents|}}}|likely=(s)|plural=s}}|<!--
-->{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|s}}}}
| data18 = {{#if:{{{parents|}}}|{{{parents}}}|{{#invoke:list|unbulleted|{{#if:{{{father|}}}|{{{father}}} (father)}}|{{#if:{{{mother|}}}|{{{mother}}} (mother)}}}}}}
| label19 = Relatives
| data19 = {{{relatives|}}}
| label21 = Education
| data21 = {{{education|}}}
| label22 = [[Alma mater]]
| data22 = {{{alma_mater|}}}
| label23 = Occupation
| data23 = {{{occupation|}}}
| label24 = Profession
| data24 = {{{profession|}}}
| label25 = {{longitem|Known for}}
| data25 = {{{known_for|}}}
| label26 = Salary
| data26 = {{{salary|}}}
| label27 = Cabinet
| data27 = {{{cabinet|}}}
| label28 = Committees
| data28 = {{{committees|}}}
| label29 = Portfolio
| data29 = {{{portfolio|}}}
| label30 = {{longitem|{{#if:{{{mawards|}}}|Civilian awards|Awards}}}}
| data30 = {{{awards|}}}
| label31 = {{longitem|{{{blank1}}}}}
| data31 = {{{data1|}}}
| label32 = {{longitem|{{{blank2}}}}}
| data32 = {{{data2|}}}
| label33 = {{longitem|{{{blank3}}}}}
| data33 = {{{data3|}}}
| label34 = {{longitem|{{{blank4}}}}}
| data34 = {{{data4|}}}
| label35 = {{longitem|{{{blank5}}}}}
| data35 = {{{data5|}}}
| label36 = Signature
| data36 = {{#if:{{{signature|}}}|[[File:{{{signature}}}|{{if empty|{{{signature_size|}}}|128x80px}}|class=skin-invert notpageimage|alt={{{signature_alt|}}}|{{PAGENAME}}'s signature]]}}
| label37 = Website
| data37 = {{{website|}}}
| label38 = Nickname{{#invoke:Detect singular|pluralize|{{{nickname|}}}|likely=(s)|plural=s}}
| data38 = {{{nickname|}}}
| header39 = {{#if:{{{allegiance|}}}{{{branch|}}}{{{service_years|}}}{{{rank|}}}{{{unit|}}}{{{commands|}}}{{{battles|}}}{{{military_blank1|}}}|Military service}}
| label40 = Allegiance
| data40 = {{{allegiance|}}}
| label41 = {{if empty|{{{branch_label|}}}|Branch/service}}
| data41 = {{{branch|}}}
| label42 = {{longitem|{{if empty|{{{service_years_label|}}}|Years of service}}}}
| data42 = {{{service_years|}}}
| label43 = {{if empty|{{{rank_label|}}}|Rank}}
| data43 = {{{rank|}}}
| label44 = {{if empty|{{{unit_label|}}}|Unit}}
| data44 = {{{unit|}}}
| label45 = Commands
| data45 = {{{commands|}}}
| label46 = {{if empty|{{{battles_label|}}}|Battles/wars}}
| data46 = {{{battles|}}}
| label47 = {{#if:{{{awards|}}}|Military awards|Awards}}
| data47 = {{{mawards|}}}
| label48 = {{{military_blank1}}}
| data48 = {{{military_data1|}}}
| label49 = {{{military_blank2}}}
| data49 = {{{military_data2|}}}
| label50 = {{{military_blank3}}}
| data50 = {{{military_data3|}}}
| label51 = {{{military_blank4}}}
| data51 = {{{military_data4|}}}
| label52 = {{{military_blank5}}}
| data52 = {{{military_data5|}}}
| data53 = {{{module|}}}
| data54 = {{{module2|}}}
| data55 = {{{module3|}}}
| data56 = {{{module4|}}}
| data57 = {{{module5|}}}
| data58 = {{{footnotes|}}}
| belowstyle = border-top: 1px solid right;
| below = <div>{{#if:{{{date|}}}| As of {{{date}}}{{#if:{{{year|}}}|, {{{year}}}}}}}</div>{{#if:{{{source|}}}|Source: [{{{source}}}]}}
}}{{#if:{{{pronunciation|}}}|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Biography template using pronunciation]]}}
}}{{#if:{{{1blankname0|}}}{{{1namedata0|}}}{{{2blankname0|}}}{{{2namedata0|}}}{{{3blankname0|}}}{{{3namedata0|}}}{{{4blankname0|}}}{{{4namedata0|}}}{{{5blankname0|}}}{{{5namedata0|}}}{{{alongside0|}}}{{{ambassador_from0|}}}{{{appointer0|}}}{{{assembly0|}}}{{{assuming0|}}}{{{chancellor0|}}}{{{co-leader0|}}}{{{constituency_AM0|}}}{{{constituency0|}}}{{{country0|}}}{{{deputy0|}}}{{{district0|}}}{{{firstminister0|}}}{{{governor-general0|}}}{{{governor0|}}}{{{jr/sr0|}}}{{{leader0|}}}{{{legislature0|}}}{{{lieutenant_governor0|}}}{{{lieutenant0|}}}{{{minister_from0|}}}{{{minority_floor_leader0|}}}{{{majority_floor_leader0|}}}{{{majority_leader0|}}}{{{majority0|}}}{{{minister0|}}}{{{minorityleader0|}}}{{{monarch0|}}}{{{nominator0|}}}{{{office0|}}}{{{order0|}}}{{{parliament0|}}}{{{predecessor0|}}}{{{preceding0|}}}{{{preceded0|}}}{{{premier0|}}}{{{president0|}}}{{{prime_minister0|}}}{{{riding0|}}}{{{state_assembly0|}}}{{{state_delegate0|}}}{{{state_house0|}}}{{{state_legislature0|}}}{{{state_senate0|}}}{{{state0|}}}{{{suboffice0|}}}{{{subterm0|}}}{{{succeeded0|}}}{{{succeeding0|}}}{{{successor0|}}}{{{taoiseach0|}}}{{{term_end0|}}}{{{term_start0|}}}{{{term0|}}}{{{title0|}}}{{{vice_governor0|}}}{{{vice_president0|}}}{{{vice_premier0|}}}{{{vice_primeminister0|}}}{{{prior_term0|}}}{{{constituency_0|}}}|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with office0]]}}
}}{{#if:{{{speaker|}}}|{{#if:{{{nominee|}}}{{{candidate|}}}||{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with speaker]]}}}}
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with unknown parameters|_VALUE_{{PAGENAME}}]]}}}}|preview=Page using [[Template:Infobox officeholder]] with unknown parameter "_VALUE_"|ignoreblank=y| regexp1 = 1blankname[%d]* | regexp2 = 1namedata[%d]* | regexp3 = 2blankname[%d]* | regexp4 = 2namedata[%d]* | regexp5 = 3blankname[%d]* | regexp6 = 3namedata[%d]* | regexp7 = 4blankname[%d]* | regexp8 = 4namedata[%d]* | regexp9 = 5blankname[%d]* | regexp10 = 5namedata[%d]* | allegiance | alma_mater | regexp11 = alongside[%d]* | alt | regexp12 = ambassador_from[%d]* | regexp14 = appointer[%d]* | regexp15 = assembly[%d]* | awards | battles | battles_label | birth_date | birth_name | birth_place | regexp16 = blank[%d]* | bodyclass | branch | branch_label | cabinet | candidate | caption | categories | regexp17 = chancellor[%d]* | children | citizenship | regexp18 = co%-leader[%d]* | commands | committees | regexp19 = constituency[%d]* | regexp20 = constituency_AM[%d]* | regexp21 = constituency_MP[%d]* | regexp22 = convocation[%d]* | regexp23 = country[%d]* | regexp24 = data[%d]* | date | death_cause | death_date | death_place | demo | regexp25 = deputy[%d]* | regexp26 = district[%d]* | education | election_date | embed | father | regexp28 = first_minister[%d]* | footnotes | regexp29 = governor[%d]* | regexp30 = governor_general[%d]* | regexp31 = governor%-general[%d]* | height | honorific_prefix | honorific_suffix | image | image_size | image_upright | incumbent | regexp32 = jr/sr[%d]* | known_for | regexp34 = leader[%d]* | regexp35 = legislature[%d]* | regexp36 = lieutenant[%d]* | regexp37 = lieutenant_governor[%d]* | main_width | regexp38 = majority[%d]* | regexp39 = majority_floor_leader[%d]* | regexp40 = majority_leader[%d]* | mawards | regexp42 = military_blank[%d]* | regexp43 = military_data[%d]* | regexp44 = minister[%d]* | regexp45 = minister_from[%d]* | regexp46 = minority_floor_leader[%d]* | regexp47 = minority_leader[%d]* | regexp49 = module[%d]* | regexp50 = monarch[%d]* | mother | name | native_name | native_name_lang | nickname | nocat | regexp51 = nominator[%d]* | nominee | occupation | regexp52 = office[%d]* | opponent | regexp53 = order[%d]* | other_party | parents | regexp54 = parliament[%d]* | regexp55 = parliamentary_group[%d]* | partner | party | party_election | portfolio | regexp56 = preceded[%d]* | regexp57 = preceding[%d]* | regexp58 = predecessor[%d]* | regexp59 = premier[%d]* | regexp60 = president[%d]* | regexp61 = prime_minister[%d]* | regexp62 = prior_term[%d]* | profession | pronunciation | rank | rank_label | relations | relatives | resting_place | resting_place_coordinates | regexp63 = riding[%d]* | running_mate | salary | service_years | service_years_label | signature | signature_alt | signature_size | source | speaker | speaker_office | spouse | regexp64 = state[%d]* | regexp65 = state_assembly[%d]* | regexp66 = state_delegate[%d]* | regexp67 = state_house[%d]* | regexp68 = state_legislature[%d]* | regexp69 = state_senate[%d]* | regexp70 = status[%d]* | regexp71 = suboffice[%d]* | regexp72 = subterm[%d]* | regexp73 = succeeded[%d]* | regexp74 = succeeding[%d]* | regexp75 = successor[%d]* | regexp76 = taoiseach[%d]* | regexp77 = term[%d]* | regexp78 = term_end[%d]* | regexp79 = term_label[%d]* | regexp80 = term_start[%d]* | regexp84 = title[%d]* | unit | unit_label | regexp85 = vice_governor[%d]* | regexp86 = vice_premier[%d]* | regexp87 = vice_president[%d]* | regexp88 = vice_prime_minister[%d]* | regexp89 = assuming[%d]* | website | year }}{{#invoke:Check for conflicting parameters|check
| template = [[Template:Infobox officeholder]]
| cat = {{main other|Category:Pages using infobox officeholder with conflicting parameters}}
| constituency_AM; constituency_MP
| constituency_AM2; constituency_MP2
| constituency_AM1; constituency_MP1
| constituency_AM3; constituency_MP3
| constituency_AM4; constituency_MP4
| constituency_AM5; constituency_MP5
| constituency_AM6; constituency_MP6
| constituency_AM7; constituency_MP7
| constituency_AM8; constituency_MP8
| constituency_AM9; constituency_MP9
| constituency_AM10; constituency_MP10
| constituency_AM11; constituency_MP11
| constituency_AM12; constituency_MP12
| constituency_AM13; constituency_MP13
| constituency_AM14; constituency_MP14
| constituency_AM15; constituency_MP15
| constituency_AM16; constituency_MP16
}}{{#if:{{{alma_mater|}}}|{{preview warning|Page using [[Template:Infobox officeholder]] with deprecated parameter {{code|alma_mater}} which should be merged with/replaced by {{code|education}}.}}{{main other|[[Category:Pages using infobox officeholder with deprecated parameters]]}}}}<noinclude>
{{Documentation}}
</noinclude>
9hoa6tnil0ndaxwhu1zqd3f14m3u6ii
33217
33216
2026-11-11T21:49:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_officeholder]]
33216
wikitext
text/x-wiki
{{#invoke:infobox|infoboxTemplate
| bodyclass = vcard {{{bodyclass|}}}
| bodystyle = {{#if:{{{main_width|}}}|width: {{{main_width|}}}}}
| child = {{lc:{{{embed}}}}}
| abovestyle = font-size: 100%;
| above = {{#if:{{{honorific_prefix|}}}|<div class="honorific-prefix" style="font-weight: normal;">{{{honorific_prefix|}}}</div>}}<!--
--><div class="fn" style="font-size:125%;">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</div><!--
-->{{#if:{{{honorific_suffix|}}}|<div class="honorific-suffix" style="font-weight: normal;">{{{honorific_suffix|}}}</div>}}
| subheaderstyle = font-size:125%; font-weight:bold;
| subheader = {{#ifeq:{{lc:{{{embed}}}}}|yes||{{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}}}}}}
| imagestyle = {{#if:{{{caption|}}}||padding-bottom:0.2em;}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|upright={{if empty|{{{image_upright|}}}|1}}|alt={{{alt|}}}|suppressplaceholder=yes}}
| captionstyle = line-height:normal; padding:0.2em;
| caption = {{{caption|}}}
| headerstyle = color: #202122; {{#ifeq:{{lc:{{{embed}}}}}|yes|background:#eee|background:lavender}}
| data1 =
{{#if:{{{speaker|}}}|
{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname2|}}}
| 1namedata = {{{1namedata2|}}}
| 2blankname = {{{2blankname2|}}}
| 2namedata = {{{2namedata2|}}}
| 3blankname = {{{3blankname2|}}}
| 3namedata = {{{3namedata2|}}}
| 4blankname = {{{4blankname2|}}}
| 4namedata = {{{4namedata2|}}}
| 5blankname = {{{5blankname2|}}}
| 5namedata = {{{5namedata2|}}}
| alongside = {{{alongside2|}}}
| ambassador_from = {{{ambassador_from2|}}}
| appointer = {{{appointer2|}}}
| assembly = {{{assembly2|}}}
| assuming = {{{assuming2|}}}
| chancellor = {{{chancellor2|}}}
| co-leader = {{{co-leader2|}}}
| constituency_{{#if:{{{constituency_AM2|}}}|AM|MP}} = {{if empty|{{{constituency_AM2|}}}|{{{constituency_MP2|}}}}}
| constituency = {{{constituency2|}}}
| convocation = {{{convocation2|}}}
| country = {{{country2|}}}
| deputy = {{{deputy2|}}}
| district = {{{district2|}}}
| firstminister = {{{first_minister2|}}}
| governor-general = {{{governor-general2|}}}
| governor_general = {{{governor_general2|}}}
| governor = {{{governor2|}}}
| jr/sr = {{{jr/sr2|}}}
| leader = {{{leader2|}}}
| legislature = {{{legislature2|}}}
| lieutenant_governor = {{{lieutenant_governor2|}}}
| lieutenant = {{{lieutenant2|}}}
| majority_leader = {{{majority_leader2|}}}
| minister_from = {{{minister_from2|}}}
| minority_floor_leader = {{{minority_floor_leader2|}}}
| majority_floor_leader = {{{majority_floor_leader2|}}}
| majority = {{{majority2|}}}
| minister = {{{minister2|}}}
| minority_leader = {{{minority_leader2|}}}
| monarch = {{{monarch2|}}}
| nominator = {{{nominator2|}}}
| office = {{{office2|}}}
| order = {{{order2|}}}
| parliament = {{{parliament2|}}}
| parliamentarygroup = {{{parliamentary_group2|}}}
| predecessor = {{{predecessor2|}}}
| preceding = {{{preceding2|}}}
| preceded = {{{preceded2|}}}
| premier = {{{premier2|}}}
| president = {{{president2|}}}
| primeminister = {{{prime_minister2|}}}
| riding = {{{riding2|}}}
| speaker = {{{speaker|}}}
| speaker_office = {{{speaker_office|}}}
| state_assembly = {{{state_assembly|}}}
| state_delegate = {{{state_delegate|}}}
| state_house = {{{state_house|}}}
| state_legislature = {{{state_legislature|}}}
| state_senate = {{{state_senate|}}}
| state = {{{state|}}}
| subterm = {{nobold|{{{subterm|}}}}}
| suboffice = {{{suboffice|}}}
| succeeded = {{{succeeded2|}}}
| succeeding = {{{succeeding2|}}}
| successor = {{{successor2|}}}
| taoiseach = {{{taoiseach2|}}}
| termlabel = {{if empty|{{{term_label2|}}}|In office}}
| termend = {{{term_end2|}}}
| termstart = {{{term_start2|}}}
| term = {{{term2|}}}
| title = {{{title2|}}}
| vicegovernor = {{{vice_governor2|}}}
| vicepresident = {{{vice_president2|}}}
| vicepremier = {{{vice_premier2|}}}
| viceprimeminister = {{{vice_prime_minister2|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term|}}}
}}}}}}<!--
-->{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname|}}}
| 1namedata = {{{1namedata|}}}
| 2blankname = {{{2blankname|}}}
| 2namedata = {{{2namedata|}}}
| 3blankname = {{{3blankname|}}}
| 3namedata = {{{3namedata|}}}
| 4blankname = {{{4blankname|}}}
| 4namedata = {{{4namedata|}}}
| 5blankname = {{{5blankname|}}}
| 5namedata = {{{5namedata|}}}
| alongside = {{{alongside|}}}
| ambassador_from = {{{ambassador_from|}}}
| appointer = {{{appointer|}}}
| assembly = {{{assembly|}}}
| assuming = {{{assuming|}}}
| candidate = {{{candidate|}}}
| chancellor = {{{chancellor|}}}
| co-leader = {{{co-leader|}}}
| constituency_{{#if:{{{constituency_AM|}}}|AM|MP}} = {{if empty|{{{constituency_AM|}}}|{{{constituency_MP|}}}}}
| constituency = {{{constituency|}}}
| convocation = {{{convocation|}}}
| country = {{{country|}}}
| deputy = {{{deputy|}}}
| district = {{{district|}}}
| election_date = {{{election_date|}}}
| firstminister = {{{first_minister|}}}
| governor-general = {{{governor-general|}}}
| governor_general = {{{governor_general|}}}
| governor = {{{governor|}}}
| incumbent = {{{incumbent|}}}
| jr/sr = {{{jr/sr|}}}
| leader = {{{leader|}}}
| legislature = {{{legislature|}}}
| lieutenant_governor = {{{lieutenant_governor|}}}
| lieutenant = {{{lieutenant|}}}
| majority_leader = {{{majority_leader|}}}
| majority = {{{majority|}}}
| minister = {{{minister|}}}
| minister_from = {{{minister_from|}}}
| minority_floor_leader = {{{minority_floor_leader|}}}
| majority_floor_leader = {{{majority_floor_leader|}}}
| minority_leader = {{{minority_leader|}}}
| monarch = {{{monarch|}}}
| nominator = {{{nominator|}}}
| nominee = {{{nominee|}}}
| office = {{{office|}}}
| opponent = {{{opponent|}}}
| order = {{{order|}}}
| parliament = {{{parliament|}}}
| parliamentarygroup = {{{parliamentary_group|}}}
| party_election = {{{party_election|}}}
| predecessor = {{{predecessor|}}}
| preceding = {{{preceding|}}}
| preceded = {{{preceded|}}}
| premier = {{{premier|}}}
| president = {{{president|}}}
| primeminister = {{{prime_minister|}}}
| riding = {{{riding|}}}
| runningmate = {{{running_mate|}}}
| state_assembly = {{{state_assembly|}}}
| state_delegate = {{{state_delegate|}}}
| state_house = {{{state_house|}}}
| state_legislature = {{{state_legislature|}}}
| state_senate = {{{state_senate|}}}
| state = {{{state|}}}
| status = {{{status|}}}
| suboffice = {{{suboffice|}}}
| subterm = {{nobold|{{{subterm|}}}}}
| succeeded = {{{succeeded|}}}
| succeeding = {{{succeeding|}}}
| successor = {{{successor|}}}
| taoiseach = {{{taoiseach|}}}
| termlabel = {{if empty|{{{term_label|}}}|In office}}
| termend = {{{term_end|}}}
| termstart = {{{term_start|}}}
| term = {{{term|}}}
| title = {{{title|}}}
| vicegovernor = {{{vice_governor|}}}
| vicepresident = {{{vice_president|}}}
| vicepremier = {{{vice_premier|}}}
| viceprimeminister = {{{vice_prime_minister|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term|}}}
}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname1|}}}
| 1namedata = {{{1namedata1|}}}
| 2blankname = {{{2blankname1|}}}
| 2namedata = {{{2namedata1|}}}
| 3blankname = {{{3blankname1|}}}
| 3namedata = {{{3namedata1|}}}
| 4blankname = {{{4blankname1|}}}
| 4namedata = {{{4namedata1|}}}
| 5blankname = {{{5blankname1|}}}
| 5namedata = {{{5namedata1|}}}
| alongside = {{{alongside1|}}}
| ambassador_from = {{{ambassador_from1|}}}
| appointer = {{{appointer1|}}}
| assembly = {{{assembly1|}}}
| assuming = {{{assuming1|}}}
| chancellor = {{{chancellor1|}}}
| co-leader = {{{co-leader1|}}}
| constituency_{{#if:{{{constituency_AM1|}}}|AM|MP}} = {{if empty|{{{constituency_AM1|}}}|{{{constituency_MP1|}}}}}
| constituency = {{{constituency1|}}}
| convocation = {{{convocation1|}}}
| country = {{{country1|}}}
| deputy = {{{deputy1|}}}
| district = {{{district1|}}}
| firstminister = {{{first_minister1|}}}
| governor-general = {{{governor-general1|}}}
| governor_general = {{{governor_general1|}}}
| governor = {{{governor1|}}}
| jr/sr = {{{jr/sr1|}}}
| leader = {{{leader1|}}}
| legislature = {{{legislature1|}}}
| lieutenant_governor = {{{lieutenant_governor1|}}}
| lieutenant = {{{lieutenant1|}}}
| minority_floor_leader = {{{minority_floor_leader1|}}}
| minister_from = {{{minister_from1|}}}
| majority_floor_leader = {{{majority_floor_leader1|}}}
| majority_leader = {{{majority_leader1|}}}
| majority = {{{majority1|}}}
| minister = {{{minister1|}}}
| minority_leader = {{{minority_leader1|}}}
| monarch = {{{monarch1|}}}
| nominator = {{{nominator1|}}}
| office = {{{office1|}}}
| order = {{{order1|}}}
| parliament = {{{parliament1|}}}
| parliamentarygroup = {{{parliamentary_group1|}}}
| predecessor = {{{predecessor1|}}}
| preceding = {{{preceding1|}}}
| preceded = {{{preceded1|}}}
| premier = {{{premier1|}}}
| president = {{{president1|}}}
| primeminister = {{{prime_minister1|}}}
| riding = {{{riding1|}}}
| state_assembly = {{{state_assembly1|}}}
| state_delegate = {{{state_delegate1|}}}
| state_house = {{{state_house1|}}}
| state_legislature = {{{state_legislature1|}}}
| state_senate = {{{state_senate1|}}}
| state = {{{state1|}}}
| status = {{{status1|}}}
| subterm = {{nobold|{{{subterm1|}}}}}
| suboffice = {{{suboffice1|}}}
| succeeded = {{{succeeded1|}}}
| succeeding = {{{succeeding1|}}}
| successor = {{{successor1|}}}
| taoiseach = {{{taoiseach1|}}}
| termlabel = {{if empty|{{{term_label1|}}}|In office}}
| termend = {{{term_end1|}}}
| termstart = {{{term_start1|}}}
| term = {{{term1|}}}
| title = {{{title1|}}}
| vicegovernor = {{{vice_governor1|}}}
| vicepresident = {{{vice_president1|}}}
| vicepremier = {{{vice_premier1|}}}
| viceprimeminister = {{{vice_prime_minister1|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term1|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{speaker|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname2|}}}
| 1namedata = {{{1namedata2|}}}
| 2blankname = {{{2blankname2|}}}
| 2namedata = {{{2namedata2|}}}
| 3blankname = {{{3blankname2|}}}
| 3namedata = {{{3namedata2|}}}
| 4blankname = {{{4blankname2|}}}
| 4namedata = {{{4namedata2|}}}
| 5blankname = {{{5blankname2|}}}
| 5namedata = {{{5namedata2|}}}
| alongside = {{{alongside2|}}}
| ambassador_from = {{{ambassador_from2|}}}
| appointer = {{{appointer2|}}}
| assembly = {{{assembly2|}}}
| assuming = {{{assuming2|}}}
| chancellor = {{{chancellor2|}}}
| co-leader = {{{co-leader2|}}}
| constituency_{{#if:{{{constituency_AM2|}}}|AM|MP}} = {{if empty|{{{constituency_AM2|}}}|{{{constituency_MP2|}}}}}
| constituency = {{{constituency2|}}}
| convocation = {{{convocation2|}}}
| country = {{{country2|}}}
| deputy = {{{deputy2|}}}
| district = {{{district2|}}}
| firstminister = {{{first_minister2|}}}
| governor-general = {{{governor-general2|}}}
| governor_general = {{{governor_general2|}}}
| governor = {{{governor2|}}}
| jr/sr = {{{jr/sr2|}}}
| leader = {{{leader2|}}}
| legislature = {{{legislature2|}}}
| lieutenant_governor = {{{lieutenant_governor2|}}}
| lieutenant = {{{lieutenant2|}}}
| majority_leader = {{{majority_leader2|}}}
| minister_from = {{{minister_from2|}}}
| minority_floor_leader = {{{minority_floor_leader2|}}}
| majority_floor_leader = {{{majority_floor_leader2|}}}
| majority = {{{majority2|}}}
| minister = {{{minister2|}}}
| minority_leader = {{{minority_leader2|}}}
| monarch = {{{monarch2|}}}
| nominator = {{{nominator2|}}}
| office = {{{office2|}}}
| order = {{{order2|}}}
| parliament = {{{parliament2|}}}
| parliamentarygroup = {{{parliamentary_group2|}}}
| predecessor = {{{predecessor2|}}}
| preceding = {{{preceding2|}}}
| preceded = {{{preceded2|}}}
| premier = {{{premier2|}}}
| president = {{{president2|}}}
| primeminister = {{{prime_minister2|}}}
| riding = {{{riding2|}}}
| state_assembly = {{{state_assembly2|}}}
| state_delegate = {{{state_delegate2|}}}
| state_house = {{{state_house2|}}}
| state_legislature = {{{state_legislature2|}}}
| state_senate = {{{state_senate2|}}}
| state = {{{state2|}}}
| status = {{{status2|}}}
| subterm = {{nobold|{{{subterm2|}}}}}
| suboffice = {{{suboffice2|}}}
| succeeded = {{{succeeded2|}}}
| succeeding = {{{succeeding2|}}}
| successor = {{{successor2|}}}
| taoiseach = {{{taoiseach2|}}}
| termlabel = {{if empty|{{{term_label2|}}}|In office}}
| termend = {{{term_end2|}}}
| termstart = {{{term_start2|}}}
| term = {{{term2|}}}
| title = {{{title2|}}}
| vicegovernor = {{{vice_governor2|}}}
| vicepresident = {{{vice_president2|}}}
| vicepremier = {{{vice_premier2|}}}
| viceprimeminister = {{{vice_prime_minister2|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term2|}}}
}}}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname3|}}}
| 1namedata = {{{1namedata3|}}}
| 2blankname = {{{2blankname3|}}}
| 2namedata = {{{2namedata3|}}}
| 3blankname = {{{3blankname3|}}}
| 3namedata = {{{3namedata3|}}}
| 4blankname = {{{4blankname3|}}}
| 4namedata = {{{4namedata3|}}}
| 5blankname = {{{5blankname3|}}}
| 5namedata = {{{5namedata3|}}}
| alongside = {{{alongside3|}}}
| ambassador_from = {{{ambassador_from3|}}}
| appointer = {{{appointer3|}}}
| assembly = {{{assembly3|}}}
| assuming = {{{assuming3|}}}
| chancellor = {{{chancellor3|}}}
| co-leader = {{{co-leader3|}}}
| constituency_{{#if:{{{constituency_AM3|}}}|AM|MP}} = {{if empty|{{{constituency_AM3|}}}|{{{constituency_MP3|}}}}}
| constituency = {{{constituency3|}}}
| convocation = {{{convocation3|}}}
| country = {{{country3|}}}
| deputy = {{{deputy3|}}}
| district = {{{district3|}}}
| firstminister = {{{first_minister3|}}}
| governor-general = {{{governor-general3|}}}
| governor_general = {{{governor_general3|}}}
| governor = {{{governor3|}}}
| jr/sr = {{{jr/sr3|}}}
| leader = {{{leader3|}}}
| legislature = {{{legislature3|}}}
| lieutenant_governor = {{{lieutenant_governor3|}}}
| lieutenant = {{{lieutenant3|}}}
| minority_floor_leader = {{{minority_floor_leader3|}}}
| minister_from = {{{minister_from3|}}}
| majority_floor_leader = {{{majority_floor_leader3|}}}
| majority_leader = {{{majority_leader3|}}}
| majority = {{{majority3|}}}
| minister = {{{minister3|}}}
| minority_leader = {{{minority_leader3|}}}
| monarch = {{{monarch3|}}}
| nominator = {{{nominator3|}}}
| office = {{{office3|}}}
| order = {{{order3|}}}
| parliament = {{{parliament3|}}}
| parliamentarygroup = {{{parliamentary_group3|}}}
| predecessor = {{{predecessor3|}}}
| preceding = {{{preceding3|}}}
| preceded = {{{preceded3|}}}
| premier = {{{premier3|}}}
| president = {{{president3|}}}
| primeminister = {{{prime_minister3|}}}
| riding = {{{riding3|}}}
| state_assembly = {{{state_assembly3|}}}
| state_delegate = {{{state_delegate3|}}}
| state_house = {{{state_house3|}}}
| state_legislature = {{{state_legislature3|}}}
| state_senate = {{{state_senate3|}}}
| state = {{{state3|}}}
| status = {{{status3|}}}
| subterm = {{nobold|{{{subterm3|}}}}}
| suboffice = {{{suboffice3|}}}
| succeeded = {{{succeeded3|}}}
| succeeding = {{{succeeding3|}}}
| successor = {{{successor3|}}}
| taoiseach = {{{taoiseach3|}}}
| termlabel = {{if empty|{{{term_label3|}}}|In office}}
| termend = {{{term_end3|}}}
| termstart = {{{term_start3|}}}
| term = {{{term3|}}}
| title = {{{title3|}}}
| vicegovernor = {{{vice_governor3|}}}
| vicepresident = {{{vice_president3|}}}
| vicepremier = {{{vice_premier3|}}}
| viceprimeminister = {{{vice_prime_minister3|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term3|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname4|}}}
| 1namedata = {{{1namedata4|}}}
| 2blankname = {{{2blankname4|}}}
| 2namedata = {{{2namedata4|}}}
| 3blankname = {{{3blankname4|}}}
| 3namedata = {{{3namedata4|}}}
| 4blankname = {{{4blankname4|}}}
| 4namedata = {{{4namedata4|}}}
| 5blankname = {{{5blankname4|}}}
| 5namedata = {{{5namedata4|}}}
| alongside = {{{alongside4|}}}
| ambassador_from = {{{ambassador_from4|}}}
| appointer = {{{appointer4|}}}
| assembly = {{{assembly4|}}}
| assuming = {{{assuming4|}}}
| chancellor = {{{chancellor4|}}}
| co-leader = {{{co-leader4|}}}
| constituency_{{#if:{{{constituency_AM4|}}}|AM|MP}} = {{if empty|{{{constituency_AM4|}}}|{{{constituency_MP4|}}}}}
| constituency = {{{constituency4|}}}
| convocation = {{{convocation4|}}}
| country = {{{country4|}}}
| deputy = {{{deputy4|}}}
| district = {{{district4|}}}
| firstminister = {{{first_minister4|}}}
| governor-general = {{{governor-general4|}}}
| governor_general = {{{governor_general4|}}}
| governor = {{{governor4|}}}
| jr/sr = {{{jr/sr4|}}}
| leader = {{{leader4|}}}
| legislature = {{{legislature4|}}}
| lieutenant_governor = {{{lieutenant_governor4|}}}
| lieutenant = {{{lieutenant4|}}}
| minister_from = {{{minister_from4|}}}
| minority_floor_leader = {{{minority_floor_leader4|}}}
| majority_floor_leader = {{{majority_floor_leader4|}}}
| majority_leader = {{{majority_leader4|}}}
| majority = {{{majority4|}}}
| minister = {{{minister4|}}}
| minority_leader = {{{minority_leader4|}}}
| monarch = {{{monarch4|}}}
| nominator = {{{nominator4|}}}
| office = {{{office4|}}}
| order = {{{order4|}}}
| parliament = {{{parliament4|}}}
| parliamentarygroup = {{{parliamentary_group4|}}}
| predecessor = {{{predecessor4|}}}
| preceding = {{{preceding4|}}}
| preceded = {{{preceded4|}}}
| premier = {{{premier4|}}}
| president = {{{president4|}}}
| primeminister = {{{prime_minister4|}}}
| riding = {{{riding4|}}}
| state_assembly = {{{state_assembly4|}}}
| state_delegate = {{{state_delegate4|}}}
| state_house = {{{state_house4|}}}
| state_legislature = {{{state_legislature4|}}}
| state_senate = {{{state_senate4|}}}
| state = {{{state4|}}}
| status = {{{status4|}}}
| subterm = {{nobold|{{{subterm4|}}}}}
| suboffice = {{{suboffice4|}}}
| succeeded = {{{succeeded4|}}}
| succeeding = {{{succeeding4|}}}
| successor = {{{successor4|}}}
| taoiseach = {{{taoiseach4|}}}
| termlabel = {{if empty|{{{term_label4|}}}|In office}}
| termend = {{{term_end4|}}}
| termstart = {{{term_start4|}}}
| term = {{{term4|}}}
| title = {{{title4|}}}
| vicegovernor = {{{vice_governor4|}}}
| vicepresident = {{{vice_president4|}}}
| vicepremier = {{{vice_premier4|}}}
| viceprimeminister = {{{vice_prime_minister4|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term4|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname5|}}}
| 1namedata = {{{1namedata5|}}}
| 2blankname = {{{2blankname5|}}}
| 2namedata = {{{2namedata5|}}}
| 3blankname = {{{3blankname5|}}}
| 3namedata = {{{3namedata5|}}}
| 4blankname = {{{4blankname5|}}}
| 4namedata = {{{4namedata5|}}}
| 5blankname = {{{5blankname5|}}}
| 5namedata = {{{5namedata5|}}}
| alongside = {{{alongside5|}}}
| ambassador_from = {{{ambassador_from5|}}}
| appointer = {{{appointer5|}}}
| assembly = {{{assembly5|}}}
| assuming = {{{assuming5|}}}
| chancellor = {{{chancellor5|}}}
| co-leader = {{{co-leader5|}}}
| constituency_{{#if:{{{constituency_AM5|}}}|AM|MP}} = {{if empty|{{{constituency_AM5|}}}|{{{constituency_MP5|}}}}}
| constituency = {{{constituency5|}}}
| convocation = {{{convocation5|}}}
| country = {{{country5|}}}
| deputy = {{{deputy5|}}}
| district = {{{district5|}}}
| firstminister = {{{first_minister5|}}}
| governor-general = {{{governor-general5|}}}
| governor_general = {{{governor_general5|}}}
| governor = {{{governor5|}}}
| jr/sr = {{{jr/sr5|}}}
| leader = {{{leader5|}}}
| legislature = {{{legislature5|}}}
| lieutenant_governor = {{{lieutenant_governor5|}}}
| lieutenant = {{{lieutenant5|}}}
| minister_from = {{{minister_from5|}}}
| minority_floor_leader = {{{minority_floor_leader5|}}}
| majority_floor_leader = {{{majority_floor_leader5|}}}
| majority_leader = {{{majority_leader5|}}}
| majority = {{{majority5|}}}
| minister = {{{minister5|}}}
| minority_leader = {{{minority_leader5|}}}
| monarch = {{{monarch5|}}}
| nominator = {{{nominator5|}}}
| office = {{{office5|}}}
| order = {{{order5|}}}
| parliament = {{{parliament5|}}}
| parliamentarygroup = {{{parliamentary_group5|}}}
| predecessor = {{{predecessor5|}}}
| preceding = {{{preceding5|}}}
| preceded = {{{preceded5|}}}
| premier = {{{premier5|}}}
| president = {{{president5|}}}
| primeminister = {{{prime_minister5|}}}
| riding = {{{riding5|}}}
| state_assembly = {{{state_assembly5|}}}
| state_delegate = {{{state_delegate5|}}}
| state_house = {{{state_house5|}}}
| state_legislature = {{{state_legislature5|}}}
| state_senate = {{{state_senate5|}}}
| state = {{{state5|}}}
| status = {{{status5|}}}
| subterm = {{nobold|{{{subterm5|}}}}}
| suboffice = {{{suboffice5|}}}
| succeeded = {{{succeeded5|}}}
| succeeding = {{{succeeding5|}}}
| successor = {{{successor5|}}}
| taoiseach = {{{taoiseach5|}}}
| termlabel = {{if empty|{{{term_label5|}}}|In office}}
| termend = {{{term_end5|}}}
| termstart = {{{term_start5|}}}
| term = {{{term5|}}}
| title = {{{title5|}}}
| vicegovernor = {{{vice_governor5|}}}
| vicepresident = {{{vice_president5|}}}
| vicepremier = {{{vice_premier5|}}}
| viceprimeminister = {{{vice_prime_minister5|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term5|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname6|}}}
| 1namedata = {{{1namedata6|}}}
| 2blankname = {{{2blankname6|}}}
| 2namedata = {{{2namedata6|}}}
| 3blankname = {{{3blankname6|}}}
| 3namedata = {{{3namedata6|}}}
| 4blankname = {{{4blankname6|}}}
| 4namedata = {{{4namedata6|}}}
| 5blankname = {{{5blankname6|}}}
| 5namedata = {{{5namedata6|}}}
| alongside = {{{alongside6|}}}
| ambassador_from = {{{ambassador_from6|}}}
| appointer = {{{appointer6|}}}
| assembly = {{{assembly6|}}}
| assuming = {{{assuming6|}}}
| chancellor = {{{chancellor6|}}}
| co-leader = {{{co-leader6|}}}
| constituency_{{#if:{{{constituency_AM6|}}}|AM|MP}} = {{if empty|{{{constituency_AM6|}}}|{{{constituency_MP6|}}}}}
| constituency = {{{constituency6|}}}
| convocation = {{{convocation6|}}}
| country = {{{country6|}}}
| deputy = {{{deputy6|}}}
| district = {{{district6|}}}
| firstminister = {{{first_minister6|}}}
| governor-general = {{{governor-general6|}}}
| governor_general = {{{governor_general6|}}}
| governor = {{{governor6|}}}
| jr/sr = {{{jr/sr6|}}}
| leader = {{{leader6|}}}
| legislature = {{{legislature6|}}}
| lieutenant_governor = {{{lieutenant_governor6|}}}
| lieutenant = {{{lieutenant6|}}}
| minority_floor_leader = {{{minority_floor_leader6|}}}
| minister_from = {{{minister_from6|}}}
| majority_floor_leader = {{{majority_floor_leader6|}}}
| majority_leader = {{{majority_leader6|}}}
| majority = {{{majority6|}}}
| minister = {{{minister6|}}}
| minority_leader = {{{minority_leader6|}}}
| monarch = {{{monarch6|}}}
| nominator = {{{nominator6|}}}
| office = {{{office6|}}}
| order = {{{order6|}}}
| parliament = {{{parliament6|}}}
| parliamentarygroup = {{{parliamentary_group6|}}}
| predecessor = {{{predecessor6|}}}
| preceding = {{{preceding6|}}}
| preceded = {{{preceded6|}}}
| premier = {{{premier6|}}}
| president = {{{president6|}}}
| primeminister = {{{prime_minister6|}}}
| riding = {{{riding6|}}}
| state_assembly = {{{state_assembly6|}}}
| state_delegate = {{{state_delegate6|}}}
| state_house = {{{state_house6|}}}
| state_legislature = {{{state_legislature6|}}}
| state_senate = {{{state_senate6|}}}
| state = {{{state6|}}}
| status = {{{status6|}}}
| subterm = {{nobold|{{{subterm6|}}}}}
| suboffice = {{{suboffice6|}}}
| succeeded = {{{succeeded6|}}}
| succeeding = {{{succeeding6|}}}
| successor = {{{successor6|}}}
| taoiseach = {{{taoiseach6|}}}
| termlabel = {{if empty|{{{term_label6|}}}|In office}}
| termend = {{{term_end6|}}}
| termstart = {{{term_start6|}}}
| term = {{{term6|}}}
| title = {{{title6|}}}
| vicegovernor = {{{vice_governor6|}}}
| vicepresident = {{{vice_president6|}}}
| vicepremier = {{{vice_premier6|}}}
| viceprimeminister = {{{vice_prime_minister6|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term6|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname7|}}}
| 1namedata = {{{1namedata7|}}}
| 2blankname = {{{2blankname7|}}}
| 2namedata = {{{2namedata7|}}}
| 3blankname = {{{3blankname7|}}}
| 3namedata = {{{3namedata7|}}}
| 4blankname = {{{4blankname7|}}}
| 4namedata = {{{4namedata7|}}}
| 5blankname = {{{5blankname7|}}}
| 5namedata = {{{5namedata7|}}}
| alongside = {{{alongside7|}}}
| ambassador_from = {{{ambassador_from7|}}}
| appointer = {{{appointer7|}}}
| assembly = {{{assembly7|}}}
| assuming = {{{assuming7|}}}
| chancellor = {{{chancellor7|}}}
| co-leader = {{{co-leader7|}}}
| constituency_{{#if:{{{constituency_AM7|}}}|AM|MP}} = {{if empty|{{{constituency_AM7|}}}|{{{constituency_MP7|}}}}}
| constituency = {{{constituency7|}}}
| convocation = {{{convocation7|}}}
| country = {{{country7|}}}
| deputy = {{{deputy7|}}}
| district = {{{district7|}}}
| firstminister = {{{first_minister7|}}}
| governor-general = {{{governor-general7|}}}
| governor_general = {{{governor_general7|}}}
| governor = {{{governor7|}}}
| jr/sr = {{{jr/sr7|}}}
| leader = {{{leader7|}}}
| legislature = {{{legislature7|}}}
| lieutenant_governor = {{{lieutenant_governor7|}}}
| lieutenant = {{{lieutenant7|}}}
| minister_from = {{{minister_from7|}}}
| minority_floor_leader = {{{minority_floor_leader7|}}}
| majority_floor_leader = {{{majority_floor_leader7|}}}
| majority_leader = {{{majority_leader7|}}}
| majority = {{{majority7|}}}
| minister = {{{minister7|}}}
| minority_leader = {{{minority_leader7|}}}
| monarch = {{{monarch7|}}}
| nominator = {{{nominator7|}}}
| office = {{{office7|}}}
| order = {{{order7|}}}
| parliament = {{{parliament7|}}}
| parliamentarygroup = {{{parliamentary_group7|}}}
| predecessor = {{{predecessor7|}}}
| preceding = {{{preceding7|}}}
| preceded = {{{preceded7|}}}
| premier = {{{premier7|}}}
| president = {{{president7|}}}
| primeminister = {{{prime_minister7|}}}
| riding = {{{riding7|}}}
| state_assembly = {{{state_assembly7|}}}
| state_delegate = {{{state_delegate7|}}}
| state_house = {{{state_house7|}}}
| state_legislature = {{{state_legislature7|}}}
| state_senate = {{{state_senate7|}}}
| state = {{{state7|}}}
| status = {{{status7|}}}
| subterm = {{nobold|{{{subterm7|}}}}}
| suboffice = {{{suboffice7|}}}
| succeeded = {{{succeeded7|}}}
| succeeding = {{{succeeding7|}}}
| successor = {{{successor7|}}}
| taoiseach = {{{taoiseach7|}}}
| termlabel = {{if empty|{{{term_label7|}}}|In office}}
| termend = {{{term_end7|}}}
| termstart = {{{term_start7|}}}
| term = {{{term7|}}}
| title = {{{title7|}}}
| vicegovernor = {{{vice_governor7|}}}
| vicepresident = {{{vice_president7|}}}
| vicepremier = {{{vice_premier7|}}}
| viceprimeminister = {{{vice_prime_minister7|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term7|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname8|}}}
| 1namedata = {{{1namedata8|}}}
| 2blankname = {{{2blankname8|}}}
| 2namedata = {{{2namedata8|}}}
| 3blankname = {{{3blankname8|}}}
| 3namedata = {{{3namedata8|}}}
| 4blankname = {{{4blankname8|}}}
| 4namedata = {{{4namedata8|}}}
| 5blankname = {{{5blankname8|}}}
| 5namedata = {{{5namedata8|}}}
| alongside = {{{alongside8|}}}
| ambassador_from = {{{ambassador_from8|}}}
| appointer = {{{appointer8|}}}
| assembly = {{{assembly8|}}}
| assuming = {{{assuming8|}}}
| chancellor = {{{chancellor8|}}}
| co-leader = {{{co-leader8|}}}
| constituency_{{#if:{{{constituency_AM8|}}}|AM|MP}} = {{if empty|{{{constituency_AM8|}}}|{{{constituency_MP8|}}}}}
| constituency = {{{constituency8|}}}
| convocation = {{{convocation8|}}}
| country = {{{country8|}}}
| deputy = {{{deputy8|}}}
| district = {{{district8|}}}
| firstminister = {{{first_minister8|}}}
| governor-general = {{{governor-general8|}}}
| governor_general = {{{governor_general8|}}}
| governor = {{{governor8|}}}
| jr/sr = {{{jr/sr8|}}}
| leader = {{{leader8|}}}
| legislature = {{{legislature8|}}}
| lieutenant_governor = {{{lieutenant_governor8|}}}
| lieutenant = {{{lieutenant8|}}}
| minister_from = {{{minister_from8|}}}
| minority_floor_leader = {{{minority_floor_leader8|}}}
| majority_floor_leader = {{{majority_floor_leader8|}}}
| majority_leader = {{{majority_leader8|}}}
| majority = {{{majority8|}}}
| minister = {{{minister8|}}}
| minority_leader = {{{minority_leader8|}}}
| monarch = {{{monarch8|}}}
| nominator = {{{nominator8|}}}
| office = {{{office8|}}}
| order = {{{order8|}}}
| parliament = {{{parliament8|}}}
| parliamentarygroup = {{{parliamentary_group8|}}}
| predecessor = {{{predecessor8|}}}
| preceding = {{{preceding8|}}}
| preceded = {{{preceded8|}}}
| premier = {{{premier8|}}}
| president = {{{president8|}}}
| primeminister = {{{prime_minister8|}}}
| riding = {{{riding8|}}}
| state_assembly = {{{state_assembly8|}}}
| state_delegate = {{{state_delegate8|}}}
| state_house = {{{state_house8|}}}
| state_legislature = {{{state_legislature8|}}}
| state_senate = {{{state_senate8|}}}
| state = {{{state8|}}}
| status = {{{status8|}}}
| subterm = {{nobold|{{{subterm8|}}}}}
| suboffice = {{{suboffice8|}}}
| succeeded = {{{succeeded8|}}}
| succeeding = {{{succeeding8|}}}
| successor = {{{successor8|}}}
| taoiseach = {{{taoiseach8|}}}
| termlabel = {{if empty|{{{term_label8|}}}|In office}}
| termend = {{{term_end8|}}}
| termstart = {{{term_start8|}}}
| term = {{{term8|}}}
| title = {{{title8|}}}
| vicegovernor = {{{vice_governor8|}}}
| vicepresident = {{{vice_president8|}}}
| vicepremier = {{{vice_premier8|}}}
| viceprimeminister = {{{vice_prime_minister8|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term8|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname9|}}}
| 1namedata = {{{1namedata9|}}}
| 2blankname = {{{2blankname9|}}}
| 2namedata = {{{2namedata9|}}}
| 3blankname = {{{3blankname9|}}}
| 3namedata = {{{3namedata9|}}}
| 4blankname = {{{4blankname9|}}}
| 4namedata = {{{4namedata9|}}}
| 5blankname = {{{5blankname9|}}}
| 5namedata = {{{5namedata9|}}}
| alongside = {{{alongside9|}}}
| ambassador_from = {{{ambassador_from9|}}}
| appointer = {{{appointer9|}}}
| assembly = {{{assembly9|}}}
| assuming = {{{assuming9|}}}
| chancellor = {{{chancellor9|}}}
| co-leader = {{{co-leader9|}}}
| constituency_{{#if:{{{constituency_AM9|}}}|AM|MP}} = {{if empty|{{{constituency_AM9|}}}|{{{constituency_MP9|}}}}}
| constituency = {{{constituency9|}}}
| convocation = {{{convocation9|}}}
| country = {{{country9|}}}
| deputy = {{{deputy9|}}}
| district = {{{district9|}}}
| firstminister = {{{first_minister9|}}}
| governor-general = {{{governor-general9|}}}
| governor_general = {{{governor_general9|}}}
| governor = {{{governor9|}}}
| jr/sr = {{{jr/sr9|}}}
| leader = {{{leader9|}}}
| legislature = {{{legislature9|}}}
| lieutenant_governor = {{{lieutenant_governor9|}}}
| lieutenant = {{{lieutenant9|}}}
| minister_from = {{{minister_from9|}}}
| minority_floor_leader = {{{minority_floor_leader9|}}}
| majority_floor_leader = {{{majority_floor_leader9|}}}
| majority_leader = {{{majority_leader9|}}}
| majority = {{{majority9|}}}
| minister = {{{minister9|}}}
| minority_leader = {{{minority_leader9|}}}
| monarch = {{{monarch9|}}}
| nominator = {{{nominator9|}}}
| office = {{{office9|}}}
| order = {{{order9|}}}
| parliament = {{{parliament9|}}}
| parliamentarygroup = {{{parliamentary_group9|}}}
| predecessor = {{{predecessor9|}}}
| preceding = {{{preceding9|}}}
| preceded = {{{preceded9|}}}
| premier = {{{premier9|}}}
| president = {{{president9|}}}
| primeminister = {{{prime_minister9|}}}
| riding = {{{riding9|}}}
| state_assembly = {{{state_assembly9|}}}
| state_delegate = {{{state_delegate9|}}}
| state_house = {{{state_house9|}}}
| state_legislature = {{{state_legislature9|}}}
| state_senate = {{{state_senate9|}}}
| state = {{{state9|}}}
| status = {{{status9|}}}
| subterm = {{nobold|{{{subterm9|}}}}}
| suboffice = {{{suboffice9|}}}
| succeeded = {{{succeeded9|}}}
| succeeding = {{{succeeding9|}}}
| successor = {{{successor9|}}}
| taoiseach = {{{taoiseach9|}}}
| termlabel = {{if empty|{{{term_label9|}}}|In office}}
| termend = {{{term_end9|}}}
| termstart = {{{term_start9|}}}
| term = {{{term9|}}}
| title = {{{title9|}}}
| vicegovernor = {{{vice_governor9|}}}
| vicepresident = {{{vice_president9|}}}
| vicepremier = {{{vice_premier9|}}}
| viceprimeminister = {{{vice_prime_minister9|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term9|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname10|}}}
| 1namedata = {{{1namedata10|}}}
| 2blankname = {{{2blankname10|}}}
| 2namedata = {{{2namedata10|}}}
| 3blankname = {{{3blankname10|}}}
| 3namedata = {{{3namedata10|}}}
| 4blankname = {{{4blankname10|}}}
| 4namedata = {{{4namedata10|}}}
| 5blankname = {{{5blankname10|}}}
| 5namedata = {{{5namedata10|}}}
| alongside = {{{alongside10|}}}
| ambassador_from = {{{ambassador_from10|}}}
| appointer = {{{appointer10|}}}
| assembly = {{{assembly10|}}}
| assuming = {{{assuming10|}}}
| chancellor = {{{chancellor10|}}}
| co-leader = {{{co-leader10|}}}
| constituency_{{#if:{{{constituency_AM10|}}}|AM|MP}} = {{if empty|{{{constituency_AM10|}}}|{{{constituency_MP10|}}}}}
| constituency = {{{constituency10|}}}
| convocation = {{{convocation10|}}}
| country = {{{country10|}}}
| deputy = {{{deputy10|}}}
| district = {{{district10|}}}
| firstminister = {{{first_minister10|}}}
| governor-general = {{{governor-general10|}}}
| governor_general = {{{governor_general10|}}}
| governor = {{{governor10|}}}
| jr/sr = {{{jr/sr10|}}}
| leader = {{{leader10|}}}
| legislature = {{{legislature10|}}}
| lieutenant_governor = {{{lieutenant_governor10|}}}
| lieutenant = {{{lieutenant10|}}}
| minister_from = {{{minister_from10|}}}
| minority_floor_leader = {{{minority_floor_leader10|}}}
| majority_floor_leader = {{{majority_floor_leader10|}}}
| majority_leader = {{{majority_leader10|}}}
| majority = {{{majority10|}}}
| minister = {{{minister10|}}}
| minority_leader = {{{minority_leader10|}}}
| monarch = {{{monarch10|}}}
| nominator = {{{nominator10|}}}
| office = {{{office10|}}}
| order = {{{order10|}}}
| parliament = {{{parliament10|}}}
| parliamentarygroup = {{{parliamentary_group10|}}}
| predecessor = {{{predecessor10|}}}
| preceding = {{{preceding10|}}}
| preceded = {{{preceded10|}}}
| premier = {{{premier10|}}}
| president = {{{president10|}}}
| primeminister = {{{prime_minister10|}}}
| riding = {{{riding10|}}}
| state_assembly = {{{state_assembly10|}}}
| state_delegate = {{{state_delegate10|}}}
| state_house = {{{state_house10|}}}
| state_legislature = {{{state_legislature10|}}}
| state_senate = {{{state_senate10|}}}
| state = {{{state10|}}}
| status = {{{status10|}}}
| subterm = {{nobold|{{{subterm10|}}}}}
| suboffice = {{{suboffice10|}}}
| succeeded = {{{succeeded10|}}}
| succeeding = {{{succeeding10|}}}
| successor = {{{successor10|}}}
| taoiseach = {{{taoiseach10|}}}
| termlabel = {{if empty|{{{term_label10|}}}|In office}}
| termend = {{{term_end10|}}}
| termstart = {{{term_start10|}}}
| term = {{{term10|}}}
| title = {{{title10|}}}
| vicegovernor = {{{vice_governor10|}}}
| vicepresident = {{{vice_president10|}}}
| vicepremier = {{{vice_premier10|}}}
| viceprimeminister = {{{vice_prime_minister10|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term10|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname11|}}}
| 1namedata = {{{1namedata11|}}}
| 2blankname = {{{2blankname11|}}}
| 2namedata = {{{2namedata11|}}}
| 3blankname = {{{3blankname11|}}}
| 3namedata = {{{3namedata11|}}}
| 4blankname = {{{4blankname11|}}}
| 4namedata = {{{4namedata11|}}}
| 5blankname = {{{5blankname11|}}}
| 5namedata = {{{5namedata11|}}}
| alongside = {{{alongside11|}}}
| ambassador_from = {{{ambassador_from11|}}}
| appointer = {{{appointer11|}}}
| assembly = {{{assembly11|}}}
| assuming = {{{assuming11|}}}
| chancellor = {{{chancellor11|}}}
| co-leader = {{{co-leader11|}}}
| constituency_{{#if:{{{constituency_AM11|}}}|AM|MP}} = {{if empty|{{{constituency_AM11|}}}|{{{constituency_MP11|}}}}}
| constituency = {{{constituency11|}}}
| convocation = {{{convocation11|}}}
| country = {{{country11|}}}
| deputy = {{{deputy11|}}}
| district = {{{district11|}}}
| firstminister = {{{first_minister11|}}}
| governor-general = {{{governor-general11|}}}
| governor_general = {{{governor_general11|}}}
| governor = {{{governor11|}}}
| jr/sr = {{{jr/sr11|}}}
| leader = {{{leader11|}}}
| legislature = {{{legislature11|}}}
| lieutenant_governor = {{{lieutenant_governor11|}}}
| lieutenant = {{{lieutenant11|}}}
| minister_from = {{{minister_from11|}}}
| minority_floor_leader = {{{minority_floor_leader11|}}}
| majority_floor_leader = {{{majority_floor_leader11|}}}
| majority_leader = {{{majority_leader11|}}}
| majority = {{{majority11|}}}
| minister = {{{minister11|}}}
| minority_leader = {{{minority_leader11|}}}
| monarch = {{{monarch11|}}}
| nominator = {{{nominator11|}}}
| office = {{{office11|}}}
| order = {{{order11|}}}
| parliament = {{{parliament11|}}}
| parliamentarygroup = {{{parliamentary_group11|}}}
| predecessor = {{{predecessor11|}}}
| preceding = {{{preceding11|}}}
| preceded = {{{preceded11|}}}
| premier = {{{premier11|}}}
| president = {{{president11|}}}
| primeminister = {{{prime_minister11|}}}
| riding = {{{riding11|}}}
| state_assembly = {{{state_assembly11|}}}
| state_delegate = {{{state_delegate11|}}}
| state_house = {{{state_house11|}}}
| state_legislature = {{{state_legislature11|}}}
| state_senate = {{{state_senate11|}}}
| state = {{{state11|}}}
| status = {{{status11|}}}
| subterm = {{nobold|{{{subterm11|}}}}}
| suboffice = {{{suboffice11|}}}
| succeeded = {{{succeeded11|}}}
| succeeding = {{{succeeding11|}}}
| successor = {{{successor11|}}}
| taoiseach = {{{taoiseach11|}}}
| termlabel = {{if empty|{{{term_label11|}}}|In office}}
| termend = {{{term_end11|}}}
| termstart = {{{term_start11|}}}
| term = {{{term11|}}}
| title = {{{title11|}}}
| vicegovernor = {{{vice_governor11|}}}
| vicepresident = {{{vice_president11|}}}
| vicepremier = {{{vice_premier11|}}}
| viceprimeminister = {{{vice_prime_minister11|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term11|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname12|}}}
| 1namedata = {{{1namedata12|}}}
| 2blankname = {{{2blankname12|}}}
| 2namedata = {{{2namedata12|}}}
| 3blankname = {{{3blankname12|}}}
| 3namedata = {{{3namedata12|}}}
| 4blankname = {{{4blankname12|}}}
| 4namedata = {{{4namedata12|}}}
| 5blankname = {{{5blankname12|}}}
| 5namedata = {{{5namedata12|}}}
| alongside = {{{alongside12|}}}
| ambassador_from = {{{ambassador_from12|}}}
| appointer = {{{appointer12|}}}
| assembly = {{{assembly12|}}}
| assuming = {{{assuming12|}}}
| chancellor = {{{chancellor12|}}}
| co-leader = {{{co-leader12|}}}
| constituency_{{#if:{{{constituency_AM12|}}}|AM|MP}} = {{if empty|{{{constituency_AM12|}}}|{{{constituency_MP12|}}}}}
| constituency = {{{constituency12|}}}
| convocation = {{{convocation12|}}}
| country = {{{country12|}}}
| deputy = {{{deputy12|}}}
| district = {{{district12|}}}
| firstminister = {{{first_minister12|}}}
| governor-general = {{{governor-general12|}}}
| governor_general = {{{governor_general12|}}}
| governor = {{{governor12|}}}
| jr/sr = {{{jr/sr12|}}}
| leader = {{{leader12|}}}
| legislature = {{{legislature12|}}}
| lieutenant_governor = {{{lieutenant_governor12|}}}
| lieutenant = {{{lieutenant12|}}}
| minister_from = {{{minister_from12|}}}
| minority_floor_leader = {{{minority_floor_leader12|}}}
| majority_floor_leader = {{{majority_floor_leader12|}}}
| majority_leader = {{{majority_leader12|}}}
| majority = {{{majority12|}}}
| minister = {{{minister12|}}}
| minority_leader = {{{minority_leader12|}}}
| monarch = {{{monarch12|}}}
| nominator = {{{nominator12|}}}
| office = {{{office12|}}}
| order = {{{order12|}}}
| parliament = {{{parliament12|}}}
| parliamentarygroup = {{{parliamentary_group12|}}}
| predecessor = {{{predecessor12|}}}
| preceding = {{{preceding12|}}}
| preceded = {{{preceded12|}}}
| premier = {{{premier12|}}}
| president = {{{president12|}}}
| primeminister = {{{prime_minister12|}}}
| riding = {{{riding12|}}}
| state_assembly = {{{state_assembly12|}}}
| state_delegate = {{{state_delegate12|}}}
| state_house = {{{state_house12|}}}
| state_legislature = {{{state_legislature12|}}}
| state_senate = {{{state_senate12|}}}
| state = {{{state12|}}}
| status = {{{status12|}}}
| subterm = {{nobold|{{{subterm12|}}}}}
| suboffice = {{{suboffice12|}}}
| succeeded = {{{succeeded12|}}}
| succeeding = {{{succeeding12|}}}
| successor = {{{successor12|}}}
| taoiseach = {{{taoiseach12|}}}
| termlabel = {{if empty|{{{term_label12|}}}|In office}}
| termend = {{{term_end12|}}}
| termstart = {{{term_start12|}}}
| term = {{{term12|}}}
| title = {{{title12|}}}
| vicegovernor = {{{vice_governor12|}}}
| vicepresident = {{{vice_president12|}}}
| vicepremier = {{{vice_premier12|}}}
| viceprimeminister = {{{vice_prime_minister12|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term12|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname13|}}}
| 1namedata = {{{1namedata13|}}}
| 2blankname = {{{2blankname13|}}}
| 2namedata = {{{2namedata13|}}}
| 3blankname = {{{3blankname13|}}}
| 3namedata = {{{3namedata13|}}}
| 4blankname = {{{4blankname13|}}}
| 4namedata = {{{4namedata13|}}}
| 5blankname = {{{5blankname13|}}}
| 5namedata = {{{5namedata13|}}}
| alongside = {{{alongside13|}}}
| ambassador_from = {{{ambassador_from13|}}}
| appointer = {{{appointer13|}}}
| assembly = {{{assembly13|}}}
| assuming = {{{assuming13|}}}
| chancellor = {{{chancellor13|}}}
| co-leader = {{{co-leader13|}}}
| constituency_{{#if:{{{constituency_AM13|}}}|AM|MP}} = {{if empty|{{{constituency_AM13|}}}|{{{constituency_MP13|}}}}}
| constituency = {{{constituency13|}}}
| convocation = {{{convocation13|}}}
| country = {{{country13|}}}
| deputy = {{{deputy13|}}}
| district = {{{district13|}}}
| firstminister = {{{first_minister13|}}}
| governor-general = {{{governor-general13|}}}
| governor_general = {{{governor_general13|}}}
| governor = {{{governor13|}}}
| jr/sr = {{{jr/sr13|}}}
| leader = {{{leader13|}}}
| legislature = {{{legislature13|}}}
| lieutenant_governor = {{{lieutenant_governor13|}}}
| lieutenant = {{{lieutenant13|}}}
| minister_from = {{{minister_from13|}}}
| minority_floor_leader = {{{minority_floor_leader13|}}}
| majority_floor_leader = {{{majority_floor_leader13|}}}
| majority_leader = {{{majority_leader13|}}}
| majority = {{{majority13|}}}
| minister = {{{minister13|}}}
| minority_leader = {{{minority_leader13|}}}
| monarch = {{{monarch13|}}}
| nominator = {{{nominator13|}}}
| office = {{{office13|}}}
| order = {{{order13|}}}
| parliament = {{{parliament13|}}}
| parliamentarygroup = {{{parliamentary_group13|}}}
| predecessor = {{{predecessor13|}}}
| preceding = {{{preceding13|}}}
| preceded = {{{preceded13|}}}
| premier = {{{premier13|}}}
| president = {{{president13|}}}
| primeminister = {{{prime_minister13|}}}
| riding = {{{riding13|}}}
| state_assembly = {{{state_assembly13|}}}
| state_delegate = {{{state_delegate13|}}}
| state_house = {{{state_house13|}}}
| state_legislature = {{{state_legislature13|}}}
| state_senate = {{{state_senate13|}}}
| state = {{{state13|}}}
| status = {{{status13|}}}
| subterm = {{nobold|{{{subterm13|}}}}}
| suboffice = {{{suboffice13|}}}
| succeeded = {{{succeeded13|}}}
| succeeding = {{{succeeding13|}}}
| successor = {{{successor13|}}}
| taoiseach = {{{taoiseach13|}}}
| termlabel = {{if empty|{{{term_label13|}}}|In office}}
| termend = {{{term_end13|}}}
| termstart = {{{term_start13|}}}
| term = {{{term13|}}}
| title = {{{title13|}}}
| vicegovernor = {{{vice_governor13|}}}
| vicepresident = {{{vice_president13|}}}
| vicepremier = {{{vice_premier13|}}}
| viceprimeminister = {{{vice_prime_minister13|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term13|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname14|}}}
| 1namedata = {{{1namedata14|}}}
| 2blankname = {{{2blankname14|}}}
| 2namedata = {{{2namedata14|}}}
| 3blankname = {{{3blankname14|}}}
| 3namedata = {{{3namedata14|}}}
| 4blankname = {{{4blankname14|}}}
| 4namedata = {{{4namedata14|}}}
| 5blankname = {{{5blankname14|}}}
| 5namedata = {{{5namedata14|}}}
| alongside = {{{alongside14|}}}
| ambassador_from = {{{ambassador_from14|}}}
| appointer = {{{appointer14|}}}
| assembly = {{{assembly14|}}}
| assuming = {{{assuming14|}}}
| chancellor = {{{chancellor14|}}}
| co-leader = {{{co-leader14|}}}
| constituency_{{#if:{{{constituency_AM14|}}}|AM|MP}} = {{if empty|{{{constituency_AM14|}}}|{{{constituency_MP14|}}}}}
| constituency = {{{constituency14|}}}
| convocation = {{{convocation14|}}}
| country = {{{country14|}}}
| deputy = {{{deputy14|}}}
| district = {{{district14|}}}
| firstminister = {{{first_minister14|}}}
| governor-general = {{{governor-general14|}}}
| governor_general = {{{governor_general14|}}}
| governor = {{{governor14|}}}
| jr/sr = {{{jr/sr14|}}}
| leader = {{{leader14|}}}
| legislature = {{{legislature14|}}}
| lieutenant_governor = {{{lieutenant_governor14|}}}
| lieutenant = {{{lieutenant14|}}}
| minister_from = {{{minister_from14|}}}
| minority_floor_leader = {{{minority_floor_leader14|}}}
| majority_floor_leader = {{{majority_floor_leader14|}}}
| majority_leader = {{{majority_leader14|}}}
| majority = {{{majority14|}}}
| minister = {{{minister14|}}}
| minority_leader = {{{minority_leader14|}}}
| monarch = {{{monarch14|}}}
| nominator = {{{nominator14|}}}
| office = {{{office14|}}}
| order = {{{order14|}}}
| parliament = {{{parliament14|}}}
| parliamentarygroup = {{{parliamentary_group14|}}}
| predecessor = {{{predecessor14|}}}
| preceding = {{{preceding14|}}}
| preceded = {{{preceded14|}}}
| premier = {{{premier14|}}}
| president = {{{president14|}}}
| primeminister = {{{prime_minister14|}}}
| riding = {{{riding14|}}}
| state_assembly = {{{state_assembly14|}}}
| state_delegate = {{{state_delegate14|}}}
| state_house = {{{state_house14|}}}
| state_legislature = {{{state_legislature14|}}}
| state_senate = {{{state_senate14|}}}
| state = {{{state14|}}}
| status = {{{status14|}}}
| subterm = {{nobold|{{{subterm14|}}}}}
| suboffice = {{{suboffice14|}}}
| succeeded = {{{succeeded14|}}}
| succeeding = {{{succeeding14|}}}
| successor = {{{successor14|}}}
| taoiseach = {{{taoiseach14|}}}
| termlabel = {{if empty|{{{term_label14|}}}|In office}}
| termend = {{{term_end14|}}}
| termstart = {{{term_start14|}}}
| term = {{{term14|}}}
| title = {{{title14|}}}
| vicegovernor = {{{vice_governor14|}}}
| vicepresident = {{{vice_president14|}}}
| vicepremier = {{{vice_premier14|}}}
| viceprimeminister = {{{vice_prime_minister14|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term14|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname15|}}}
| 1namedata = {{{1namedata15|}}}
| 2blankname = {{{2blankname15|}}}
| 2namedata = {{{2namedata15|}}}
| 3blankname = {{{3blankname15|}}}
| 3namedata = {{{3namedata15|}}}
| 4blankname = {{{4blankname15|}}}
| 4namedata = {{{4namedata15|}}}
| 5blankname = {{{5blankname15|}}}
| 5namedata = {{{5namedata15|}}}
| alongside = {{{alongside15|}}}
| ambassador_from = {{{ambassador_from15|}}}
| appointer = {{{appointer15|}}}
| assembly = {{{assembly15|}}}
| assuming = {{{assuming15|}}}
| chancellor = {{{chancellor15|}}}
| co-leader = {{{co-leader15|}}}
| constituency_{{#if:{{{constituency_AM15|}}}|AM|MP}} = {{if empty|{{{constituency_AM15|}}}|{{{constituency_MP15|}}}}}
| constituency = {{{constituency15|}}}
| convocation = {{{convocation15|}}}
| country = {{{country15|}}}
| deputy = {{{deputy15|}}}
| district = {{{district15|}}}
| firstminister = {{{first_minister15|}}}
| governor-general = {{{governor-general15|}}}
| governor_general = {{{governor_general15|}}}
| governor = {{{governor15|}}}
| jr/sr = {{{jr/sr15|}}}
| leader = {{{leader15|}}}
| legislature = {{{legislature15|}}}
| lieutenant_governor = {{{lieutenant_governor15|}}}
| lieutenant = {{{lieutenant15|}}}
| minister_from = {{{minister_from15|}}}
| minority_floor_leader = {{{minority_floor_leader15|}}}
| majority_floor_leader = {{{majority_floor_leader15|}}}
| majority_leader = {{{majority_leader15|}}}
| majority = {{{majority15|}}}
| minister = {{{minister15|}}}
| minority_leader = {{{minority_leader15|}}}
| monarch = {{{monarch15|}}}
| nominator = {{{nominator15|}}}
| office = {{{office15|}}}
| order = {{{order15|}}}
| parliament = {{{parliament15|}}}
| parliamentarygroup = {{{parliamentary_group15|}}}
| predecessor = {{{predecessor15|}}}
| preceding = {{{preceding15|}}}
| preceded = {{{preceded15|}}}
| premier = {{{premier15|}}}
| president = {{{president15|}}}
| primeminister = {{{prime_minister15|}}}
| riding = {{{riding15|}}}
| state_assembly = {{{state_assembly15|}}}
| state_delegate = {{{state_delegate15|}}}
| state_house = {{{state_house15|}}}
| state_legislature = {{{state_legislature15|}}}
| state_senate = {{{state_senate15|}}}
| state = {{{state15|}}}
| status = {{{status15|}}}
| subterm = {{nobold|{{{subterm15|}}}}}
| suboffice = {{{suboffice15|}}}
| succeeded = {{{succeeded15|}}}
| succeeding = {{{succeeding15|}}}
| successor = {{{successor15|}}}
| taoiseach = {{{taoiseach15|}}}
| termlabel = {{if empty|{{{term_label15|}}}|In office}}
| termend = {{{term_end15|}}}
| termstart = {{{term_start15|}}}
| term = {{{term15|}}}
| title = {{{title15|}}}
| vicegovernor = {{{vice_governor15|}}}
| vicepresident = {{{vice_president15|}}}
| vicepremier = {{{vice_premier15|}}}
| viceprimeminister = {{{vice_prime_minister15|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term15|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname16|}}}
| 1namedata = {{{1namedata16|}}}
| 2blankname = {{{2blankname16|}}}
| 2namedata = {{{2namedata16|}}}
| 3blankname = {{{3blankname16|}}}
| 3namedata = {{{3namedata16|}}}
| 4blankname = {{{4blankname16|}}}
| 4namedata = {{{4namedata16|}}}
| 5blankname = {{{5blankname16|}}}
| 5namedata = {{{5namedata16|}}}
| alongside = {{{alongside16|}}}
| ambassador_from = {{{ambassador_from16|}}}
| appointer = {{{appointer16|}}}
| assembly = {{{assembly16|}}}
| assuming = {{{assuming16|}}}
| chancellor = {{{chancellor16|}}}
| co-leader = {{{co-leader16|}}}
| constituency_{{#if:{{{constituency_AM16|}}}|AM|MP}} = {{if empty|{{{constituency_AM16|}}}|{{{constituency_MP16|}}}}}
| constituency = {{{constituency16|}}}
| convocation = {{{convocation16|}}}
| country = {{{country16|}}}
| deputy = {{{deputy16|}}}
| district = {{{district16|}}}
| firstminister = {{{first_minister16|}}}
| governor-general = {{{governor-general16|}}}
| governor_general = {{{governor_general16|}}}
| governor = {{{governor16|}}}
| jr/sr = {{{jr/sr16|}}}
| leader = {{{leader16|}}}
| legislature = {{{legislature16|}}}
| lieutenant_governor = {{{lieutenant_governor16|}}}
| lieutenant = {{{lieutenant16|}}}
| minister_from = {{{minister_from16|}}}
| minority_floor_leader = {{{minority_floor_leader16|}}}
| majority_floor_leader = {{{majority_floor_leader16|}}}
| majority_leader = {{{majority_leader16|}}}
| majority = {{{majority16|}}}
| minister = {{{minister16|}}}
| minority_leader = {{{minority_leader16|}}}
| monarch = {{{monarch16|}}}
| nominator = {{{nominator16|}}}
| office = {{{office16|}}}
| order = {{{order16|}}}
| parliament = {{{parliament16|}}}
| parliamentarygroup = {{{parliamentary_group16|}}}
| predecessor = {{{predecessor16|}}}
| preceding = {{{preceding16|}}}
| preceded = {{{preceded16|}}}
| premier = {{{premier16|}}}
| president = {{{president16|}}}
| primeminister = {{{prime_minister16|}}}
| riding = {{{riding16|}}}
| state_assembly = {{{state_assembly16|}}}
| state_delegate = {{{state_delegate16|}}}
| state_house = {{{state_house16|}}}
| state_legislature = {{{state_legislature16|}}}
| state_senate = {{{state_senate16|}}}
| state = {{{state16|}}}
| status = {{{status16|}}}
| subterm = {{nobold|{{{subterm16|}}}}}
| suboffice = {{{suboffice16|}}}
| succeeded = {{{succeeded16|}}}
| succeeding = {{{succeeding16|}}}
| successor = {{{successor16|}}}
| taoiseach = {{{taoiseach16|}}}
| termlabel = {{if empty|{{{term_label16|}}}|In office}}
| termend = {{{term_end16|}}}
| termstart = {{{term_start16|}}}
| term = {{{term16|}}}
| title = {{{title16|}}}
| vicegovernor = {{{vice_governor16|}}}
| vicepresident = {{{vice_president16|}}}
| vicepremier = {{{vice_premier16|}}}
| viceprimeminister = {{{vice_prime_minister16|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term16|}}}
}}}}
| data2 = {{{module0|}}}
<!----------Personal data---------->
| header3 = {{#if:{{{pronunciation|}}}{{{birth_name|}}}{{{birth_date|}}}{{{birth_place|}}}{{{death_date|}}}{{{death_place|}}}{{{resting_place|}}}{{{resting_place_coordinates|}}}{{{citizenship|}}}{{{party|}}}{{{other_party|}}}{{{spouse|}}}{{{partner|}}}{{{relations|}}}{{{children|}}}{{{parents|}}}{{{mother|}}}{{{father|}}}{{{relatives|}}}{{{education|}}}{{{alma_mater|}}}{{{occupation|}}}{{{profession|}}}{{{known_for|}}}{{{salary|}}}{{{cabinet|}}}{{{committees|}}}{{{portfolio|}}}{{{awards|}}}{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}|Personal details}}
| label4 = Pronunciation
| data4 = {{{pronunciation|}}}
| label5 = Born
| data5 = {{#invoke:Separated entries|br
|1={{#if:{{{birth_name|}}}|<span class="nickname">{{{birth_name|}}}</span>}}
|2={{#invoke:person date|birth}}
|3={{#if:{{{birth_place|}}}|<div class="birthplace">{{{birth_place|}}}</div>}}
}}
| label6 = Died
| data6 = {{#invoke:Separated entries|br
|1={{#invoke:person date|death}}
|2={{#if:{{{death_place|}}}|<div class="deathplace">{{{death_place|}}}</div>}}
}}
| label7 = Cause of death
| data7 = {{{death_cause|}}}
| label8 = Resting place
| class8 = label
| data8 = {{#invoke:Separated entries|br
|1={{{resting_place|}}}
|2={{{resting_place_coordinates|}}}
}}
| label9 = Citizenship
| data9 = {{{citizenship|}}}
| label11 = [[Political party|Party]]
| data11 = {{#switch:{{{party|}}}
| =
| [[United States Democratic Party|Democrat]]
| [[Democratic Party (United States)|Democratic]]
| [[Democratic Party (United States)|Democrat]] = [[Democratic Party (United States)|Democratic]]
| [[Republican Party (United States)|Republican]]
| [[United States Republican Party]]
| [[United States Republican Party|Republican]]
| [[Republican Party (United States)|Republican Party]] = [[Republican Party (United States)|Republican]]
| [[Conservative Party (UK)|Conservative Party]]
| [[Conservative Party (UK)|Conservative]] = [[Conservative Party (UK)|Conservative]]
| [[Labour Party (UK)|Labour Party]]
| [[Labour Party (UK)|Labour]] = [[Labour Party (UK)|Labour]]
| [[Conservative Party of Canada|Conservative Party]]
| [[Conservative Party of Canada|Conservative]] = [[Conservative Party of Canada|Conservative]]
| [[Liberal Party of Canada|Liberal Party]]
| [[Liberal Party of Canada|Liberal]] = [[Liberal Party of Canada|Liberal]]
| KMT
| Kuomintang
| [[KMT]]
| [[Kuomintang|KMT]]
| [[Kuomintang]]
| Kuomintang (KMT)
| [[Kuomintang]] (KMT) = [[Kuomintang]]
| DPP
| [[Democratic Progressive Party|DPP]]
| [[Democratic Progressive Party]] = [[Democratic Progressive Party]]
| #default = {{{party|}}} }}
| label12 = {{longitem|Other political<br />affiliations}}
| data12 = {{{other_party|}}}
| label13 = Height
| data13 = {{#if:{{{height|}}}|{{Infobox person/height|{{{height|}}}}}}}
| label14 = Spouse{{#invoke:Detect singular|pluralize|{{{spouse|}}}|likely=(s)|plural=s}}
| data14 = {{{spouse|}}}
| label15 = {{longitem|Domestic partner{{#invoke:Detect singular|pluralize|{{{partner|}}}|likely=(s)|plural=s}}}}
| data15 = {{{partner|}}}
| label16 = Relations
| data16 = {{{relations|}}}
| label17 = Children
| data17 = {{{children|}}}
| label18 = Parent{{#if:{{{parents|}}}|{{#invoke:Detect singular|pluralize|{{{parents|}}}|likely=(s)|plural=s}}|<!--
-->{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|s}}}}
| data18 = {{#if:{{{parents|}}}|{{{parents}}}|{{#invoke:list|unbulleted|{{#if:{{{father|}}}|{{{father}}} (father)}}|{{#if:{{{mother|}}}|{{{mother}}} (mother)}}}}}}
| label19 = Relatives
| data19 = {{{relatives|}}}
| label21 = Education
| data21 = {{{education|}}}
| label22 = [[Alma mater]]
| data22 = {{{alma_mater|}}}
| label23 = Occupation
| data23 = {{{occupation|}}}
| label24 = Profession
| data24 = {{{profession|}}}
| label25 = {{longitem|Known for}}
| data25 = {{{known_for|}}}
| label26 = Salary
| data26 = {{{salary|}}}
| label27 = Cabinet
| data27 = {{{cabinet|}}}
| label28 = Committees
| data28 = {{{committees|}}}
| label29 = Portfolio
| data29 = {{{portfolio|}}}
| label30 = {{longitem|{{#if:{{{mawards|}}}|Civilian awards|Awards}}}}
| data30 = {{{awards|}}}
| label31 = {{longitem|{{{blank1}}}}}
| data31 = {{{data1|}}}
| label32 = {{longitem|{{{blank2}}}}}
| data32 = {{{data2|}}}
| label33 = {{longitem|{{{blank3}}}}}
| data33 = {{{data3|}}}
| label34 = {{longitem|{{{blank4}}}}}
| data34 = {{{data4|}}}
| label35 = {{longitem|{{{blank5}}}}}
| data35 = {{{data5|}}}
| label36 = Signature
| data36 = {{#if:{{{signature|}}}|[[File:{{{signature}}}|{{if empty|{{{signature_size|}}}|128x80px}}|class=skin-invert notpageimage|alt={{{signature_alt|}}}|{{PAGENAME}}'s signature]]}}
| label37 = Website
| data37 = {{{website|}}}
| label38 = Nickname{{#invoke:Detect singular|pluralize|{{{nickname|}}}|likely=(s)|plural=s}}
| data38 = {{{nickname|}}}
| header39 = {{#if:{{{allegiance|}}}{{{branch|}}}{{{service_years|}}}{{{rank|}}}{{{unit|}}}{{{commands|}}}{{{battles|}}}{{{military_blank1|}}}|Military service}}
| label40 = Allegiance
| data40 = {{{allegiance|}}}
| label41 = {{if empty|{{{branch_label|}}}|Branch/service}}
| data41 = {{{branch|}}}
| label42 = {{longitem|{{if empty|{{{service_years_label|}}}|Years of service}}}}
| data42 = {{{service_years|}}}
| label43 = {{if empty|{{{rank_label|}}}|Rank}}
| data43 = {{{rank|}}}
| label44 = {{if empty|{{{unit_label|}}}|Unit}}
| data44 = {{{unit|}}}
| label45 = Commands
| data45 = {{{commands|}}}
| label46 = {{if empty|{{{battles_label|}}}|Battles/wars}}
| data46 = {{{battles|}}}
| label47 = {{#if:{{{awards|}}}|Military awards|Awards}}
| data47 = {{{mawards|}}}
| label48 = {{{military_blank1}}}
| data48 = {{{military_data1|}}}
| label49 = {{{military_blank2}}}
| data49 = {{{military_data2|}}}
| label50 = {{{military_blank3}}}
| data50 = {{{military_data3|}}}
| label51 = {{{military_blank4}}}
| data51 = {{{military_data4|}}}
| label52 = {{{military_blank5}}}
| data52 = {{{military_data5|}}}
| data53 = {{{module|}}}
| data54 = {{{module2|}}}
| data55 = {{{module3|}}}
| data56 = {{{module4|}}}
| data57 = {{{module5|}}}
| data58 = {{{footnotes|}}}
| belowstyle = border-top: 1px solid right;
| below = <div>{{#if:{{{date|}}}| As of {{{date}}}{{#if:{{{year|}}}|, {{{year}}}}}}}</div>{{#if:{{{source|}}}|Source: [{{{source}}}]}}
}}{{#if:{{{pronunciation|}}}|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Biography template using pronunciation]]}}
}}{{#if:{{{1blankname0|}}}{{{1namedata0|}}}{{{2blankname0|}}}{{{2namedata0|}}}{{{3blankname0|}}}{{{3namedata0|}}}{{{4blankname0|}}}{{{4namedata0|}}}{{{5blankname0|}}}{{{5namedata0|}}}{{{alongside0|}}}{{{ambassador_from0|}}}{{{appointer0|}}}{{{assembly0|}}}{{{assuming0|}}}{{{chancellor0|}}}{{{co-leader0|}}}{{{constituency_AM0|}}}{{{constituency0|}}}{{{country0|}}}{{{deputy0|}}}{{{district0|}}}{{{firstminister0|}}}{{{governor-general0|}}}{{{governor0|}}}{{{jr/sr0|}}}{{{leader0|}}}{{{legislature0|}}}{{{lieutenant_governor0|}}}{{{lieutenant0|}}}{{{minister_from0|}}}{{{minority_floor_leader0|}}}{{{majority_floor_leader0|}}}{{{majority_leader0|}}}{{{majority0|}}}{{{minister0|}}}{{{minorityleader0|}}}{{{monarch0|}}}{{{nominator0|}}}{{{office0|}}}{{{order0|}}}{{{parliament0|}}}{{{predecessor0|}}}{{{preceding0|}}}{{{preceded0|}}}{{{premier0|}}}{{{president0|}}}{{{prime_minister0|}}}{{{riding0|}}}{{{state_assembly0|}}}{{{state_delegate0|}}}{{{state_house0|}}}{{{state_legislature0|}}}{{{state_senate0|}}}{{{state0|}}}{{{suboffice0|}}}{{{subterm0|}}}{{{succeeded0|}}}{{{succeeding0|}}}{{{successor0|}}}{{{taoiseach0|}}}{{{term_end0|}}}{{{term_start0|}}}{{{term0|}}}{{{title0|}}}{{{vice_governor0|}}}{{{vice_president0|}}}{{{vice_premier0|}}}{{{vice_primeminister0|}}}{{{prior_term0|}}}{{{constituency_0|}}}|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with office0]]}}
}}{{#if:{{{speaker|}}}|{{#if:{{{nominee|}}}{{{candidate|}}}||{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with speaker]]}}}}
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with unknown parameters|_VALUE_{{PAGENAME}}]]}}}}|preview=Page using [[Template:Infobox officeholder]] with unknown parameter "_VALUE_"|ignoreblank=y| regexp1 = 1blankname[%d]* | regexp2 = 1namedata[%d]* | regexp3 = 2blankname[%d]* | regexp4 = 2namedata[%d]* | regexp5 = 3blankname[%d]* | regexp6 = 3namedata[%d]* | regexp7 = 4blankname[%d]* | regexp8 = 4namedata[%d]* | regexp9 = 5blankname[%d]* | regexp10 = 5namedata[%d]* | allegiance | alma_mater | regexp11 = alongside[%d]* | alt | regexp12 = ambassador_from[%d]* | regexp14 = appointer[%d]* | regexp15 = assembly[%d]* | awards | battles | battles_label | birth_date | birth_name | birth_place | regexp16 = blank[%d]* | bodyclass | branch | branch_label | cabinet | candidate | caption | categories | regexp17 = chancellor[%d]* | children | citizenship | regexp18 = co%-leader[%d]* | commands | committees | regexp19 = constituency[%d]* | regexp20 = constituency_AM[%d]* | regexp21 = constituency_MP[%d]* | regexp22 = convocation[%d]* | regexp23 = country[%d]* | regexp24 = data[%d]* | date | death_cause | death_date | death_place | demo | regexp25 = deputy[%d]* | regexp26 = district[%d]* | education | election_date | embed | father | regexp28 = first_minister[%d]* | footnotes | regexp29 = governor[%d]* | regexp30 = governor_general[%d]* | regexp31 = governor%-general[%d]* | height | honorific_prefix | honorific_suffix | image | image_size | image_upright | incumbent | regexp32 = jr/sr[%d]* | known_for | regexp34 = leader[%d]* | regexp35 = legislature[%d]* | regexp36 = lieutenant[%d]* | regexp37 = lieutenant_governor[%d]* | main_width | regexp38 = majority[%d]* | regexp39 = majority_floor_leader[%d]* | regexp40 = majority_leader[%d]* | mawards | regexp42 = military_blank[%d]* | regexp43 = military_data[%d]* | regexp44 = minister[%d]* | regexp45 = minister_from[%d]* | regexp46 = minority_floor_leader[%d]* | regexp47 = minority_leader[%d]* | regexp49 = module[%d]* | regexp50 = monarch[%d]* | mother | name | native_name | native_name_lang | nickname | nocat | regexp51 = nominator[%d]* | nominee | occupation | regexp52 = office[%d]* | opponent | regexp53 = order[%d]* | other_party | parents | regexp54 = parliament[%d]* | regexp55 = parliamentary_group[%d]* | partner | party | party_election | portfolio | regexp56 = preceded[%d]* | regexp57 = preceding[%d]* | regexp58 = predecessor[%d]* | regexp59 = premier[%d]* | regexp60 = president[%d]* | regexp61 = prime_minister[%d]* | regexp62 = prior_term[%d]* | profession | pronunciation | rank | rank_label | relations | relatives | resting_place | resting_place_coordinates | regexp63 = riding[%d]* | running_mate | salary | service_years | service_years_label | signature | signature_alt | signature_size | source | speaker | speaker_office | spouse | regexp64 = state[%d]* | regexp65 = state_assembly[%d]* | regexp66 = state_delegate[%d]* | regexp67 = state_house[%d]* | regexp68 = state_legislature[%d]* | regexp69 = state_senate[%d]* | regexp70 = status[%d]* | regexp71 = suboffice[%d]* | regexp72 = subterm[%d]* | regexp73 = succeeded[%d]* | regexp74 = succeeding[%d]* | regexp75 = successor[%d]* | regexp76 = taoiseach[%d]* | regexp77 = term[%d]* | regexp78 = term_end[%d]* | regexp79 = term_label[%d]* | regexp80 = term_start[%d]* | regexp84 = title[%d]* | unit | unit_label | regexp85 = vice_governor[%d]* | regexp86 = vice_premier[%d]* | regexp87 = vice_president[%d]* | regexp88 = vice_prime_minister[%d]* | regexp89 = assuming[%d]* | website | year }}{{#invoke:Check for conflicting parameters|check
| template = [[Template:Infobox officeholder]]
| cat = {{main other|Category:Pages using infobox officeholder with conflicting parameters}}
| constituency_AM; constituency_MP
| constituency_AM2; constituency_MP2
| constituency_AM1; constituency_MP1
| constituency_AM3; constituency_MP3
| constituency_AM4; constituency_MP4
| constituency_AM5; constituency_MP5
| constituency_AM6; constituency_MP6
| constituency_AM7; constituency_MP7
| constituency_AM8; constituency_MP8
| constituency_AM9; constituency_MP9
| constituency_AM10; constituency_MP10
| constituency_AM11; constituency_MP11
| constituency_AM12; constituency_MP12
| constituency_AM13; constituency_MP13
| constituency_AM14; constituency_MP14
| constituency_AM15; constituency_MP15
| constituency_AM16; constituency_MP16
}}{{#if:{{{alma_mater|}}}|{{preview warning|Page using [[Template:Infobox officeholder]] with deprecated parameter {{code|alma_mater}} which should be merged with/replaced by {{code|education}}.}}{{main other|[[Category:Pages using infobox officeholder with deprecated parameters]]}}}}<noinclude>
{{Documentation}}
</noinclude>
9hoa6tnil0ndaxwhu1zqd3f14m3u6ii
33266
33217
2026-11-11T21:50:29Z
RAPTOR7762
18
/* */
33266
wikitext
text/x-wiki
{{Infobox/sandbox|infoboxTemplate
| bodyclass = vcard {{{bodyclass|}}}
| bodystyle = {{#if:{{{main_width|}}}|width: {{{main_width|}}}}}
| child = {{lc:{{{embed}}}}}
| abovestyle = font-size: 100%;
| above = {{#if:{{{honorific_prefix|}}}|<div class="honorific-prefix" style="font-weight: normal;">{{{honorific_prefix|}}}</div>}}<!--
--><div class="fn" style="font-size:125%;">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</div><!--
-->{{#if:{{{honorific_suffix|}}}|<div class="honorific-suffix" style="font-weight: normal;">{{{honorific_suffix|}}}</div>}}
| subheaderstyle = font-size:125%; font-weight:bold;
| subheader = {{#ifeq:{{lc:{{{embed}}}}}|yes||{{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}}}}}}
| imagestyle = {{#if:{{{caption|}}}||padding-bottom:0.2em;}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|upright={{if empty|{{{image_upright|}}}|1}}|alt={{{alt|}}}|suppressplaceholder=yes}}
| captionstyle = line-height:normal; padding:0.2em;
| caption = {{{caption|}}}
| headerstyle = color: #202122; {{#ifeq:{{lc:{{{embed}}}}}|yes|background:#eee|background:lavender}}
| data1 =
{{#if:{{{speaker|}}}|
{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname2|}}}
| 1namedata = {{{1namedata2|}}}
| 2blankname = {{{2blankname2|}}}
| 2namedata = {{{2namedata2|}}}
| 3blankname = {{{3blankname2|}}}
| 3namedata = {{{3namedata2|}}}
| 4blankname = {{{4blankname2|}}}
| 4namedata = {{{4namedata2|}}}
| 5blankname = {{{5blankname2|}}}
| 5namedata = {{{5namedata2|}}}
| alongside = {{{alongside2|}}}
| ambassador_from = {{{ambassador_from2|}}}
| appointer = {{{appointer2|}}}
| assembly = {{{assembly2|}}}
| assuming = {{{assuming2|}}}
| chancellor = {{{chancellor2|}}}
| co-leader = {{{co-leader2|}}}
| constituency_{{#if:{{{constituency_AM2|}}}|AM|MP}} = {{if empty|{{{constituency_AM2|}}}|{{{constituency_MP2|}}}}}
| constituency = {{{constituency2|}}}
| convocation = {{{convocation2|}}}
| country = {{{country2|}}}
| deputy = {{{deputy2|}}}
| district = {{{district2|}}}
| firstminister = {{{first_minister2|}}}
| governor-general = {{{governor-general2|}}}
| governor_general = {{{governor_general2|}}}
| governor = {{{governor2|}}}
| jr/sr = {{{jr/sr2|}}}
| leader = {{{leader2|}}}
| legislature = {{{legislature2|}}}
| lieutenant_governor = {{{lieutenant_governor2|}}}
| lieutenant = {{{lieutenant2|}}}
| majority_leader = {{{majority_leader2|}}}
| minister_from = {{{minister_from2|}}}
| minority_floor_leader = {{{minority_floor_leader2|}}}
| majority_floor_leader = {{{majority_floor_leader2|}}}
| majority = {{{majority2|}}}
| minister = {{{minister2|}}}
| minority_leader = {{{minority_leader2|}}}
| monarch = {{{monarch2|}}}
| nominator = {{{nominator2|}}}
| office = {{{office2|}}}
| order = {{{order2|}}}
| parliament = {{{parliament2|}}}
| parliamentarygroup = {{{parliamentary_group2|}}}
| predecessor = {{{predecessor2|}}}
| preceding = {{{preceding2|}}}
| preceded = {{{preceded2|}}}
| premier = {{{premier2|}}}
| president = {{{president2|}}}
| primeminister = {{{prime_minister2|}}}
| riding = {{{riding2|}}}
| speaker = {{{speaker|}}}
| speaker_office = {{{speaker_office|}}}
| state_assembly = {{{state_assembly|}}}
| state_delegate = {{{state_delegate|}}}
| state_house = {{{state_house|}}}
| state_legislature = {{{state_legislature|}}}
| state_senate = {{{state_senate|}}}
| state = {{{state|}}}
| subterm = {{nobold|{{{subterm|}}}}}
| suboffice = {{{suboffice|}}}
| succeeded = {{{succeeded2|}}}
| succeeding = {{{succeeding2|}}}
| successor = {{{successor2|}}}
| taoiseach = {{{taoiseach2|}}}
| termlabel = {{if empty|{{{term_label2|}}}|In office}}
| termend = {{{term_end2|}}}
| termstart = {{{term_start2|}}}
| term = {{{term2|}}}
| title = {{{title2|}}}
| vicegovernor = {{{vice_governor2|}}}
| vicepresident = {{{vice_president2|}}}
| vicepremier = {{{vice_premier2|}}}
| viceprimeminister = {{{vice_prime_minister2|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term|}}}
}}}}}}<!--
-->{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname|}}}
| 1namedata = {{{1namedata|}}}
| 2blankname = {{{2blankname|}}}
| 2namedata = {{{2namedata|}}}
| 3blankname = {{{3blankname|}}}
| 3namedata = {{{3namedata|}}}
| 4blankname = {{{4blankname|}}}
| 4namedata = {{{4namedata|}}}
| 5blankname = {{{5blankname|}}}
| 5namedata = {{{5namedata|}}}
| alongside = {{{alongside|}}}
| ambassador_from = {{{ambassador_from|}}}
| appointer = {{{appointer|}}}
| assembly = {{{assembly|}}}
| assuming = {{{assuming|}}}
| candidate = {{{candidate|}}}
| chancellor = {{{chancellor|}}}
| co-leader = {{{co-leader|}}}
| constituency_{{#if:{{{constituency_AM|}}}|AM|MP}} = {{if empty|{{{constituency_AM|}}}|{{{constituency_MP|}}}}}
| constituency = {{{constituency|}}}
| convocation = {{{convocation|}}}
| country = {{{country|}}}
| deputy = {{{deputy|}}}
| district = {{{district|}}}
| election_date = {{{election_date|}}}
| firstminister = {{{first_minister|}}}
| governor-general = {{{governor-general|}}}
| governor_general = {{{governor_general|}}}
| governor = {{{governor|}}}
| incumbent = {{{incumbent|}}}
| jr/sr = {{{jr/sr|}}}
| leader = {{{leader|}}}
| legislature = {{{legislature|}}}
| lieutenant_governor = {{{lieutenant_governor|}}}
| lieutenant = {{{lieutenant|}}}
| majority_leader = {{{majority_leader|}}}
| majority = {{{majority|}}}
| minister = {{{minister|}}}
| minister_from = {{{minister_from|}}}
| minority_floor_leader = {{{minority_floor_leader|}}}
| majority_floor_leader = {{{majority_floor_leader|}}}
| minority_leader = {{{minority_leader|}}}
| monarch = {{{monarch|}}}
| nominator = {{{nominator|}}}
| nominee = {{{nominee|}}}
| office = {{{office|}}}
| opponent = {{{opponent|}}}
| order = {{{order|}}}
| parliament = {{{parliament|}}}
| parliamentarygroup = {{{parliamentary_group|}}}
| party_election = {{{party_election|}}}
| predecessor = {{{predecessor|}}}
| preceding = {{{preceding|}}}
| preceded = {{{preceded|}}}
| premier = {{{premier|}}}
| president = {{{president|}}}
| primeminister = {{{prime_minister|}}}
| riding = {{{riding|}}}
| runningmate = {{{running_mate|}}}
| state_assembly = {{{state_assembly|}}}
| state_delegate = {{{state_delegate|}}}
| state_house = {{{state_house|}}}
| state_legislature = {{{state_legislature|}}}
| state_senate = {{{state_senate|}}}
| state = {{{state|}}}
| status = {{{status|}}}
| suboffice = {{{suboffice|}}}
| subterm = {{nobold|{{{subterm|}}}}}
| succeeded = {{{succeeded|}}}
| succeeding = {{{succeeding|}}}
| successor = {{{successor|}}}
| taoiseach = {{{taoiseach|}}}
| termlabel = {{if empty|{{{term_label|}}}|In office}}
| termend = {{{term_end|}}}
| termstart = {{{term_start|}}}
| term = {{{term|}}}
| title = {{{title|}}}
| vicegovernor = {{{vice_governor|}}}
| vicepresident = {{{vice_president|}}}
| vicepremier = {{{vice_premier|}}}
| viceprimeminister = {{{vice_prime_minister|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term|}}}
}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname1|}}}
| 1namedata = {{{1namedata1|}}}
| 2blankname = {{{2blankname1|}}}
| 2namedata = {{{2namedata1|}}}
| 3blankname = {{{3blankname1|}}}
| 3namedata = {{{3namedata1|}}}
| 4blankname = {{{4blankname1|}}}
| 4namedata = {{{4namedata1|}}}
| 5blankname = {{{5blankname1|}}}
| 5namedata = {{{5namedata1|}}}
| alongside = {{{alongside1|}}}
| ambassador_from = {{{ambassador_from1|}}}
| appointer = {{{appointer1|}}}
| assembly = {{{assembly1|}}}
| assuming = {{{assuming1|}}}
| chancellor = {{{chancellor1|}}}
| co-leader = {{{co-leader1|}}}
| constituency_{{#if:{{{constituency_AM1|}}}|AM|MP}} = {{if empty|{{{constituency_AM1|}}}|{{{constituency_MP1|}}}}}
| constituency = {{{constituency1|}}}
| convocation = {{{convocation1|}}}
| country = {{{country1|}}}
| deputy = {{{deputy1|}}}
| district = {{{district1|}}}
| firstminister = {{{first_minister1|}}}
| governor-general = {{{governor-general1|}}}
| governor_general = {{{governor_general1|}}}
| governor = {{{governor1|}}}
| jr/sr = {{{jr/sr1|}}}
| leader = {{{leader1|}}}
| legislature = {{{legislature1|}}}
| lieutenant_governor = {{{lieutenant_governor1|}}}
| lieutenant = {{{lieutenant1|}}}
| minority_floor_leader = {{{minority_floor_leader1|}}}
| minister_from = {{{minister_from1|}}}
| majority_floor_leader = {{{majority_floor_leader1|}}}
| majority_leader = {{{majority_leader1|}}}
| majority = {{{majority1|}}}
| minister = {{{minister1|}}}
| minority_leader = {{{minority_leader1|}}}
| monarch = {{{monarch1|}}}
| nominator = {{{nominator1|}}}
| office = {{{office1|}}}
| order = {{{order1|}}}
| parliament = {{{parliament1|}}}
| parliamentarygroup = {{{parliamentary_group1|}}}
| predecessor = {{{predecessor1|}}}
| preceding = {{{preceding1|}}}
| preceded = {{{preceded1|}}}
| premier = {{{premier1|}}}
| president = {{{president1|}}}
| primeminister = {{{prime_minister1|}}}
| riding = {{{riding1|}}}
| state_assembly = {{{state_assembly1|}}}
| state_delegate = {{{state_delegate1|}}}
| state_house = {{{state_house1|}}}
| state_legislature = {{{state_legislature1|}}}
| state_senate = {{{state_senate1|}}}
| state = {{{state1|}}}
| status = {{{status1|}}}
| subterm = {{nobold|{{{subterm1|}}}}}
| suboffice = {{{suboffice1|}}}
| succeeded = {{{succeeded1|}}}
| succeeding = {{{succeeding1|}}}
| successor = {{{successor1|}}}
| taoiseach = {{{taoiseach1|}}}
| termlabel = {{if empty|{{{term_label1|}}}|In office}}
| termend = {{{term_end1|}}}
| termstart = {{{term_start1|}}}
| term = {{{term1|}}}
| title = {{{title1|}}}
| vicegovernor = {{{vice_governor1|}}}
| vicepresident = {{{vice_president1|}}}
| vicepremier = {{{vice_premier1|}}}
| viceprimeminister = {{{vice_prime_minister1|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term1|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{speaker|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname2|}}}
| 1namedata = {{{1namedata2|}}}
| 2blankname = {{{2blankname2|}}}
| 2namedata = {{{2namedata2|}}}
| 3blankname = {{{3blankname2|}}}
| 3namedata = {{{3namedata2|}}}
| 4blankname = {{{4blankname2|}}}
| 4namedata = {{{4namedata2|}}}
| 5blankname = {{{5blankname2|}}}
| 5namedata = {{{5namedata2|}}}
| alongside = {{{alongside2|}}}
| ambassador_from = {{{ambassador_from2|}}}
| appointer = {{{appointer2|}}}
| assembly = {{{assembly2|}}}
| assuming = {{{assuming2|}}}
| chancellor = {{{chancellor2|}}}
| co-leader = {{{co-leader2|}}}
| constituency_{{#if:{{{constituency_AM2|}}}|AM|MP}} = {{if empty|{{{constituency_AM2|}}}|{{{constituency_MP2|}}}}}
| constituency = {{{constituency2|}}}
| convocation = {{{convocation2|}}}
| country = {{{country2|}}}
| deputy = {{{deputy2|}}}
| district = {{{district2|}}}
| firstminister = {{{first_minister2|}}}
| governor-general = {{{governor-general2|}}}
| governor_general = {{{governor_general2|}}}
| governor = {{{governor2|}}}
| jr/sr = {{{jr/sr2|}}}
| leader = {{{leader2|}}}
| legislature = {{{legislature2|}}}
| lieutenant_governor = {{{lieutenant_governor2|}}}
| lieutenant = {{{lieutenant2|}}}
| majority_leader = {{{majority_leader2|}}}
| minister_from = {{{minister_from2|}}}
| minority_floor_leader = {{{minority_floor_leader2|}}}
| majority_floor_leader = {{{majority_floor_leader2|}}}
| majority = {{{majority2|}}}
| minister = {{{minister2|}}}
| minority_leader = {{{minority_leader2|}}}
| monarch = {{{monarch2|}}}
| nominator = {{{nominator2|}}}
| office = {{{office2|}}}
| order = {{{order2|}}}
| parliament = {{{parliament2|}}}
| parliamentarygroup = {{{parliamentary_group2|}}}
| predecessor = {{{predecessor2|}}}
| preceding = {{{preceding2|}}}
| preceded = {{{preceded2|}}}
| premier = {{{premier2|}}}
| president = {{{president2|}}}
| primeminister = {{{prime_minister2|}}}
| riding = {{{riding2|}}}
| state_assembly = {{{state_assembly2|}}}
| state_delegate = {{{state_delegate2|}}}
| state_house = {{{state_house2|}}}
| state_legislature = {{{state_legislature2|}}}
| state_senate = {{{state_senate2|}}}
| state = {{{state2|}}}
| status = {{{status2|}}}
| subterm = {{nobold|{{{subterm2|}}}}}
| suboffice = {{{suboffice2|}}}
| succeeded = {{{succeeded2|}}}
| succeeding = {{{succeeding2|}}}
| successor = {{{successor2|}}}
| taoiseach = {{{taoiseach2|}}}
| termlabel = {{if empty|{{{term_label2|}}}|In office}}
| termend = {{{term_end2|}}}
| termstart = {{{term_start2|}}}
| term = {{{term2|}}}
| title = {{{title2|}}}
| vicegovernor = {{{vice_governor2|}}}
| vicepresident = {{{vice_president2|}}}
| vicepremier = {{{vice_premier2|}}}
| viceprimeminister = {{{vice_prime_minister2|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term2|}}}
}}}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname3|}}}
| 1namedata = {{{1namedata3|}}}
| 2blankname = {{{2blankname3|}}}
| 2namedata = {{{2namedata3|}}}
| 3blankname = {{{3blankname3|}}}
| 3namedata = {{{3namedata3|}}}
| 4blankname = {{{4blankname3|}}}
| 4namedata = {{{4namedata3|}}}
| 5blankname = {{{5blankname3|}}}
| 5namedata = {{{5namedata3|}}}
| alongside = {{{alongside3|}}}
| ambassador_from = {{{ambassador_from3|}}}
| appointer = {{{appointer3|}}}
| assembly = {{{assembly3|}}}
| assuming = {{{assuming3|}}}
| chancellor = {{{chancellor3|}}}
| co-leader = {{{co-leader3|}}}
| constituency_{{#if:{{{constituency_AM3|}}}|AM|MP}} = {{if empty|{{{constituency_AM3|}}}|{{{constituency_MP3|}}}}}
| constituency = {{{constituency3|}}}
| convocation = {{{convocation3|}}}
| country = {{{country3|}}}
| deputy = {{{deputy3|}}}
| district = {{{district3|}}}
| firstminister = {{{first_minister3|}}}
| governor-general = {{{governor-general3|}}}
| governor_general = {{{governor_general3|}}}
| governor = {{{governor3|}}}
| jr/sr = {{{jr/sr3|}}}
| leader = {{{leader3|}}}
| legislature = {{{legislature3|}}}
| lieutenant_governor = {{{lieutenant_governor3|}}}
| lieutenant = {{{lieutenant3|}}}
| minority_floor_leader = {{{minority_floor_leader3|}}}
| minister_from = {{{minister_from3|}}}
| majority_floor_leader = {{{majority_floor_leader3|}}}
| majority_leader = {{{majority_leader3|}}}
| majority = {{{majority3|}}}
| minister = {{{minister3|}}}
| minority_leader = {{{minority_leader3|}}}
| monarch = {{{monarch3|}}}
| nominator = {{{nominator3|}}}
| office = {{{office3|}}}
| order = {{{order3|}}}
| parliament = {{{parliament3|}}}
| parliamentarygroup = {{{parliamentary_group3|}}}
| predecessor = {{{predecessor3|}}}
| preceding = {{{preceding3|}}}
| preceded = {{{preceded3|}}}
| premier = {{{premier3|}}}
| president = {{{president3|}}}
| primeminister = {{{prime_minister3|}}}
| riding = {{{riding3|}}}
| state_assembly = {{{state_assembly3|}}}
| state_delegate = {{{state_delegate3|}}}
| state_house = {{{state_house3|}}}
| state_legislature = {{{state_legislature3|}}}
| state_senate = {{{state_senate3|}}}
| state = {{{state3|}}}
| status = {{{status3|}}}
| subterm = {{nobold|{{{subterm3|}}}}}
| suboffice = {{{suboffice3|}}}
| succeeded = {{{succeeded3|}}}
| succeeding = {{{succeeding3|}}}
| successor = {{{successor3|}}}
| taoiseach = {{{taoiseach3|}}}
| termlabel = {{if empty|{{{term_label3|}}}|In office}}
| termend = {{{term_end3|}}}
| termstart = {{{term_start3|}}}
| term = {{{term3|}}}
| title = {{{title3|}}}
| vicegovernor = {{{vice_governor3|}}}
| vicepresident = {{{vice_president3|}}}
| vicepremier = {{{vice_premier3|}}}
| viceprimeminister = {{{vice_prime_minister3|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term3|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname4|}}}
| 1namedata = {{{1namedata4|}}}
| 2blankname = {{{2blankname4|}}}
| 2namedata = {{{2namedata4|}}}
| 3blankname = {{{3blankname4|}}}
| 3namedata = {{{3namedata4|}}}
| 4blankname = {{{4blankname4|}}}
| 4namedata = {{{4namedata4|}}}
| 5blankname = {{{5blankname4|}}}
| 5namedata = {{{5namedata4|}}}
| alongside = {{{alongside4|}}}
| ambassador_from = {{{ambassador_from4|}}}
| appointer = {{{appointer4|}}}
| assembly = {{{assembly4|}}}
| assuming = {{{assuming4|}}}
| chancellor = {{{chancellor4|}}}
| co-leader = {{{co-leader4|}}}
| constituency_{{#if:{{{constituency_AM4|}}}|AM|MP}} = {{if empty|{{{constituency_AM4|}}}|{{{constituency_MP4|}}}}}
| constituency = {{{constituency4|}}}
| convocation = {{{convocation4|}}}
| country = {{{country4|}}}
| deputy = {{{deputy4|}}}
| district = {{{district4|}}}
| firstminister = {{{first_minister4|}}}
| governor-general = {{{governor-general4|}}}
| governor_general = {{{governor_general4|}}}
| governor = {{{governor4|}}}
| jr/sr = {{{jr/sr4|}}}
| leader = {{{leader4|}}}
| legislature = {{{legislature4|}}}
| lieutenant_governor = {{{lieutenant_governor4|}}}
| lieutenant = {{{lieutenant4|}}}
| minister_from = {{{minister_from4|}}}
| minority_floor_leader = {{{minority_floor_leader4|}}}
| majority_floor_leader = {{{majority_floor_leader4|}}}
| majority_leader = {{{majority_leader4|}}}
| majority = {{{majority4|}}}
| minister = {{{minister4|}}}
| minority_leader = {{{minority_leader4|}}}
| monarch = {{{monarch4|}}}
| nominator = {{{nominator4|}}}
| office = {{{office4|}}}
| order = {{{order4|}}}
| parliament = {{{parliament4|}}}
| parliamentarygroup = {{{parliamentary_group4|}}}
| predecessor = {{{predecessor4|}}}
| preceding = {{{preceding4|}}}
| preceded = {{{preceded4|}}}
| premier = {{{premier4|}}}
| president = {{{president4|}}}
| primeminister = {{{prime_minister4|}}}
| riding = {{{riding4|}}}
| state_assembly = {{{state_assembly4|}}}
| state_delegate = {{{state_delegate4|}}}
| state_house = {{{state_house4|}}}
| state_legislature = {{{state_legislature4|}}}
| state_senate = {{{state_senate4|}}}
| state = {{{state4|}}}
| status = {{{status4|}}}
| subterm = {{nobold|{{{subterm4|}}}}}
| suboffice = {{{suboffice4|}}}
| succeeded = {{{succeeded4|}}}
| succeeding = {{{succeeding4|}}}
| successor = {{{successor4|}}}
| taoiseach = {{{taoiseach4|}}}
| termlabel = {{if empty|{{{term_label4|}}}|In office}}
| termend = {{{term_end4|}}}
| termstart = {{{term_start4|}}}
| term = {{{term4|}}}
| title = {{{title4|}}}
| vicegovernor = {{{vice_governor4|}}}
| vicepresident = {{{vice_president4|}}}
| vicepremier = {{{vice_premier4|}}}
| viceprimeminister = {{{vice_prime_minister4|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term4|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname5|}}}
| 1namedata = {{{1namedata5|}}}
| 2blankname = {{{2blankname5|}}}
| 2namedata = {{{2namedata5|}}}
| 3blankname = {{{3blankname5|}}}
| 3namedata = {{{3namedata5|}}}
| 4blankname = {{{4blankname5|}}}
| 4namedata = {{{4namedata5|}}}
| 5blankname = {{{5blankname5|}}}
| 5namedata = {{{5namedata5|}}}
| alongside = {{{alongside5|}}}
| ambassador_from = {{{ambassador_from5|}}}
| appointer = {{{appointer5|}}}
| assembly = {{{assembly5|}}}
| assuming = {{{assuming5|}}}
| chancellor = {{{chancellor5|}}}
| co-leader = {{{co-leader5|}}}
| constituency_{{#if:{{{constituency_AM5|}}}|AM|MP}} = {{if empty|{{{constituency_AM5|}}}|{{{constituency_MP5|}}}}}
| constituency = {{{constituency5|}}}
| convocation = {{{convocation5|}}}
| country = {{{country5|}}}
| deputy = {{{deputy5|}}}
| district = {{{district5|}}}
| firstminister = {{{first_minister5|}}}
| governor-general = {{{governor-general5|}}}
| governor_general = {{{governor_general5|}}}
| governor = {{{governor5|}}}
| jr/sr = {{{jr/sr5|}}}
| leader = {{{leader5|}}}
| legislature = {{{legislature5|}}}
| lieutenant_governor = {{{lieutenant_governor5|}}}
| lieutenant = {{{lieutenant5|}}}
| minister_from = {{{minister_from5|}}}
| minority_floor_leader = {{{minority_floor_leader5|}}}
| majority_floor_leader = {{{majority_floor_leader5|}}}
| majority_leader = {{{majority_leader5|}}}
| majority = {{{majority5|}}}
| minister = {{{minister5|}}}
| minority_leader = {{{minority_leader5|}}}
| monarch = {{{monarch5|}}}
| nominator = {{{nominator5|}}}
| office = {{{office5|}}}
| order = {{{order5|}}}
| parliament = {{{parliament5|}}}
| parliamentarygroup = {{{parliamentary_group5|}}}
| predecessor = {{{predecessor5|}}}
| preceding = {{{preceding5|}}}
| preceded = {{{preceded5|}}}
| premier = {{{premier5|}}}
| president = {{{president5|}}}
| primeminister = {{{prime_minister5|}}}
| riding = {{{riding5|}}}
| state_assembly = {{{state_assembly5|}}}
| state_delegate = {{{state_delegate5|}}}
| state_house = {{{state_house5|}}}
| state_legislature = {{{state_legislature5|}}}
| state_senate = {{{state_senate5|}}}
| state = {{{state5|}}}
| status = {{{status5|}}}
| subterm = {{nobold|{{{subterm5|}}}}}
| suboffice = {{{suboffice5|}}}
| succeeded = {{{succeeded5|}}}
| succeeding = {{{succeeding5|}}}
| successor = {{{successor5|}}}
| taoiseach = {{{taoiseach5|}}}
| termlabel = {{if empty|{{{term_label5|}}}|In office}}
| termend = {{{term_end5|}}}
| termstart = {{{term_start5|}}}
| term = {{{term5|}}}
| title = {{{title5|}}}
| vicegovernor = {{{vice_governor5|}}}
| vicepresident = {{{vice_president5|}}}
| vicepremier = {{{vice_premier5|}}}
| viceprimeminister = {{{vice_prime_minister5|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term5|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname6|}}}
| 1namedata = {{{1namedata6|}}}
| 2blankname = {{{2blankname6|}}}
| 2namedata = {{{2namedata6|}}}
| 3blankname = {{{3blankname6|}}}
| 3namedata = {{{3namedata6|}}}
| 4blankname = {{{4blankname6|}}}
| 4namedata = {{{4namedata6|}}}
| 5blankname = {{{5blankname6|}}}
| 5namedata = {{{5namedata6|}}}
| alongside = {{{alongside6|}}}
| ambassador_from = {{{ambassador_from6|}}}
| appointer = {{{appointer6|}}}
| assembly = {{{assembly6|}}}
| assuming = {{{assuming6|}}}
| chancellor = {{{chancellor6|}}}
| co-leader = {{{co-leader6|}}}
| constituency_{{#if:{{{constituency_AM6|}}}|AM|MP}} = {{if empty|{{{constituency_AM6|}}}|{{{constituency_MP6|}}}}}
| constituency = {{{constituency6|}}}
| convocation = {{{convocation6|}}}
| country = {{{country6|}}}
| deputy = {{{deputy6|}}}
| district = {{{district6|}}}
| firstminister = {{{first_minister6|}}}
| governor-general = {{{governor-general6|}}}
| governor_general = {{{governor_general6|}}}
| governor = {{{governor6|}}}
| jr/sr = {{{jr/sr6|}}}
| leader = {{{leader6|}}}
| legislature = {{{legislature6|}}}
| lieutenant_governor = {{{lieutenant_governor6|}}}
| lieutenant = {{{lieutenant6|}}}
| minority_floor_leader = {{{minority_floor_leader6|}}}
| minister_from = {{{minister_from6|}}}
| majority_floor_leader = {{{majority_floor_leader6|}}}
| majority_leader = {{{majority_leader6|}}}
| majority = {{{majority6|}}}
| minister = {{{minister6|}}}
| minority_leader = {{{minority_leader6|}}}
| monarch = {{{monarch6|}}}
| nominator = {{{nominator6|}}}
| office = {{{office6|}}}
| order = {{{order6|}}}
| parliament = {{{parliament6|}}}
| parliamentarygroup = {{{parliamentary_group6|}}}
| predecessor = {{{predecessor6|}}}
| preceding = {{{preceding6|}}}
| preceded = {{{preceded6|}}}
| premier = {{{premier6|}}}
| president = {{{president6|}}}
| primeminister = {{{prime_minister6|}}}
| riding = {{{riding6|}}}
| state_assembly = {{{state_assembly6|}}}
| state_delegate = {{{state_delegate6|}}}
| state_house = {{{state_house6|}}}
| state_legislature = {{{state_legislature6|}}}
| state_senate = {{{state_senate6|}}}
| state = {{{state6|}}}
| status = {{{status6|}}}
| subterm = {{nobold|{{{subterm6|}}}}}
| suboffice = {{{suboffice6|}}}
| succeeded = {{{succeeded6|}}}
| succeeding = {{{succeeding6|}}}
| successor = {{{successor6|}}}
| taoiseach = {{{taoiseach6|}}}
| termlabel = {{if empty|{{{term_label6|}}}|In office}}
| termend = {{{term_end6|}}}
| termstart = {{{term_start6|}}}
| term = {{{term6|}}}
| title = {{{title6|}}}
| vicegovernor = {{{vice_governor6|}}}
| vicepresident = {{{vice_president6|}}}
| vicepremier = {{{vice_premier6|}}}
| viceprimeminister = {{{vice_prime_minister6|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term6|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname7|}}}
| 1namedata = {{{1namedata7|}}}
| 2blankname = {{{2blankname7|}}}
| 2namedata = {{{2namedata7|}}}
| 3blankname = {{{3blankname7|}}}
| 3namedata = {{{3namedata7|}}}
| 4blankname = {{{4blankname7|}}}
| 4namedata = {{{4namedata7|}}}
| 5blankname = {{{5blankname7|}}}
| 5namedata = {{{5namedata7|}}}
| alongside = {{{alongside7|}}}
| ambassador_from = {{{ambassador_from7|}}}
| appointer = {{{appointer7|}}}
| assembly = {{{assembly7|}}}
| assuming = {{{assuming7|}}}
| chancellor = {{{chancellor7|}}}
| co-leader = {{{co-leader7|}}}
| constituency_{{#if:{{{constituency_AM7|}}}|AM|MP}} = {{if empty|{{{constituency_AM7|}}}|{{{constituency_MP7|}}}}}
| constituency = {{{constituency7|}}}
| convocation = {{{convocation7|}}}
| country = {{{country7|}}}
| deputy = {{{deputy7|}}}
| district = {{{district7|}}}
| firstminister = {{{first_minister7|}}}
| governor-general = {{{governor-general7|}}}
| governor_general = {{{governor_general7|}}}
| governor = {{{governor7|}}}
| jr/sr = {{{jr/sr7|}}}
| leader = {{{leader7|}}}
| legislature = {{{legislature7|}}}
| lieutenant_governor = {{{lieutenant_governor7|}}}
| lieutenant = {{{lieutenant7|}}}
| minister_from = {{{minister_from7|}}}
| minority_floor_leader = {{{minority_floor_leader7|}}}
| majority_floor_leader = {{{majority_floor_leader7|}}}
| majority_leader = {{{majority_leader7|}}}
| majority = {{{majority7|}}}
| minister = {{{minister7|}}}
| minority_leader = {{{minority_leader7|}}}
| monarch = {{{monarch7|}}}
| nominator = {{{nominator7|}}}
| office = {{{office7|}}}
| order = {{{order7|}}}
| parliament = {{{parliament7|}}}
| parliamentarygroup = {{{parliamentary_group7|}}}
| predecessor = {{{predecessor7|}}}
| preceding = {{{preceding7|}}}
| preceded = {{{preceded7|}}}
| premier = {{{premier7|}}}
| president = {{{president7|}}}
| primeminister = {{{prime_minister7|}}}
| riding = {{{riding7|}}}
| state_assembly = {{{state_assembly7|}}}
| state_delegate = {{{state_delegate7|}}}
| state_house = {{{state_house7|}}}
| state_legislature = {{{state_legislature7|}}}
| state_senate = {{{state_senate7|}}}
| state = {{{state7|}}}
| status = {{{status7|}}}
| subterm = {{nobold|{{{subterm7|}}}}}
| suboffice = {{{suboffice7|}}}
| succeeded = {{{succeeded7|}}}
| succeeding = {{{succeeding7|}}}
| successor = {{{successor7|}}}
| taoiseach = {{{taoiseach7|}}}
| termlabel = {{if empty|{{{term_label7|}}}|In office}}
| termend = {{{term_end7|}}}
| termstart = {{{term_start7|}}}
| term = {{{term7|}}}
| title = {{{title7|}}}
| vicegovernor = {{{vice_governor7|}}}
| vicepresident = {{{vice_president7|}}}
| vicepremier = {{{vice_premier7|}}}
| viceprimeminister = {{{vice_prime_minister7|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term7|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname8|}}}
| 1namedata = {{{1namedata8|}}}
| 2blankname = {{{2blankname8|}}}
| 2namedata = {{{2namedata8|}}}
| 3blankname = {{{3blankname8|}}}
| 3namedata = {{{3namedata8|}}}
| 4blankname = {{{4blankname8|}}}
| 4namedata = {{{4namedata8|}}}
| 5blankname = {{{5blankname8|}}}
| 5namedata = {{{5namedata8|}}}
| alongside = {{{alongside8|}}}
| ambassador_from = {{{ambassador_from8|}}}
| appointer = {{{appointer8|}}}
| assembly = {{{assembly8|}}}
| assuming = {{{assuming8|}}}
| chancellor = {{{chancellor8|}}}
| co-leader = {{{co-leader8|}}}
| constituency_{{#if:{{{constituency_AM8|}}}|AM|MP}} = {{if empty|{{{constituency_AM8|}}}|{{{constituency_MP8|}}}}}
| constituency = {{{constituency8|}}}
| convocation = {{{convocation8|}}}
| country = {{{country8|}}}
| deputy = {{{deputy8|}}}
| district = {{{district8|}}}
| firstminister = {{{first_minister8|}}}
| governor-general = {{{governor-general8|}}}
| governor_general = {{{governor_general8|}}}
| governor = {{{governor8|}}}
| jr/sr = {{{jr/sr8|}}}
| leader = {{{leader8|}}}
| legislature = {{{legislature8|}}}
| lieutenant_governor = {{{lieutenant_governor8|}}}
| lieutenant = {{{lieutenant8|}}}
| minister_from = {{{minister_from8|}}}
| minority_floor_leader = {{{minority_floor_leader8|}}}
| majority_floor_leader = {{{majority_floor_leader8|}}}
| majority_leader = {{{majority_leader8|}}}
| majority = {{{majority8|}}}
| minister = {{{minister8|}}}
| minority_leader = {{{minority_leader8|}}}
| monarch = {{{monarch8|}}}
| nominator = {{{nominator8|}}}
| office = {{{office8|}}}
| order = {{{order8|}}}
| parliament = {{{parliament8|}}}
| parliamentarygroup = {{{parliamentary_group8|}}}
| predecessor = {{{predecessor8|}}}
| preceding = {{{preceding8|}}}
| preceded = {{{preceded8|}}}
| premier = {{{premier8|}}}
| president = {{{president8|}}}
| primeminister = {{{prime_minister8|}}}
| riding = {{{riding8|}}}
| state_assembly = {{{state_assembly8|}}}
| state_delegate = {{{state_delegate8|}}}
| state_house = {{{state_house8|}}}
| state_legislature = {{{state_legislature8|}}}
| state_senate = {{{state_senate8|}}}
| state = {{{state8|}}}
| status = {{{status8|}}}
| subterm = {{nobold|{{{subterm8|}}}}}
| suboffice = {{{suboffice8|}}}
| succeeded = {{{succeeded8|}}}
| succeeding = {{{succeeding8|}}}
| successor = {{{successor8|}}}
| taoiseach = {{{taoiseach8|}}}
| termlabel = {{if empty|{{{term_label8|}}}|In office}}
| termend = {{{term_end8|}}}
| termstart = {{{term_start8|}}}
| term = {{{term8|}}}
| title = {{{title8|}}}
| vicegovernor = {{{vice_governor8|}}}
| vicepresident = {{{vice_president8|}}}
| vicepremier = {{{vice_premier8|}}}
| viceprimeminister = {{{vice_prime_minister8|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term8|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname9|}}}
| 1namedata = {{{1namedata9|}}}
| 2blankname = {{{2blankname9|}}}
| 2namedata = {{{2namedata9|}}}
| 3blankname = {{{3blankname9|}}}
| 3namedata = {{{3namedata9|}}}
| 4blankname = {{{4blankname9|}}}
| 4namedata = {{{4namedata9|}}}
| 5blankname = {{{5blankname9|}}}
| 5namedata = {{{5namedata9|}}}
| alongside = {{{alongside9|}}}
| ambassador_from = {{{ambassador_from9|}}}
| appointer = {{{appointer9|}}}
| assembly = {{{assembly9|}}}
| assuming = {{{assuming9|}}}
| chancellor = {{{chancellor9|}}}
| co-leader = {{{co-leader9|}}}
| constituency_{{#if:{{{constituency_AM9|}}}|AM|MP}} = {{if empty|{{{constituency_AM9|}}}|{{{constituency_MP9|}}}}}
| constituency = {{{constituency9|}}}
| convocation = {{{convocation9|}}}
| country = {{{country9|}}}
| deputy = {{{deputy9|}}}
| district = {{{district9|}}}
| firstminister = {{{first_minister9|}}}
| governor-general = {{{governor-general9|}}}
| governor_general = {{{governor_general9|}}}
| governor = {{{governor9|}}}
| jr/sr = {{{jr/sr9|}}}
| leader = {{{leader9|}}}
| legislature = {{{legislature9|}}}
| lieutenant_governor = {{{lieutenant_governor9|}}}
| lieutenant = {{{lieutenant9|}}}
| minister_from = {{{minister_from9|}}}
| minority_floor_leader = {{{minority_floor_leader9|}}}
| majority_floor_leader = {{{majority_floor_leader9|}}}
| majority_leader = {{{majority_leader9|}}}
| majority = {{{majority9|}}}
| minister = {{{minister9|}}}
| minority_leader = {{{minority_leader9|}}}
| monarch = {{{monarch9|}}}
| nominator = {{{nominator9|}}}
| office = {{{office9|}}}
| order = {{{order9|}}}
| parliament = {{{parliament9|}}}
| parliamentarygroup = {{{parliamentary_group9|}}}
| predecessor = {{{predecessor9|}}}
| preceding = {{{preceding9|}}}
| preceded = {{{preceded9|}}}
| premier = {{{premier9|}}}
| president = {{{president9|}}}
| primeminister = {{{prime_minister9|}}}
| riding = {{{riding9|}}}
| state_assembly = {{{state_assembly9|}}}
| state_delegate = {{{state_delegate9|}}}
| state_house = {{{state_house9|}}}
| state_legislature = {{{state_legislature9|}}}
| state_senate = {{{state_senate9|}}}
| state = {{{state9|}}}
| status = {{{status9|}}}
| subterm = {{nobold|{{{subterm9|}}}}}
| suboffice = {{{suboffice9|}}}
| succeeded = {{{succeeded9|}}}
| succeeding = {{{succeeding9|}}}
| successor = {{{successor9|}}}
| taoiseach = {{{taoiseach9|}}}
| termlabel = {{if empty|{{{term_label9|}}}|In office}}
| termend = {{{term_end9|}}}
| termstart = {{{term_start9|}}}
| term = {{{term9|}}}
| title = {{{title9|}}}
| vicegovernor = {{{vice_governor9|}}}
| vicepresident = {{{vice_president9|}}}
| vicepremier = {{{vice_premier9|}}}
| viceprimeminister = {{{vice_prime_minister9|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term9|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname10|}}}
| 1namedata = {{{1namedata10|}}}
| 2blankname = {{{2blankname10|}}}
| 2namedata = {{{2namedata10|}}}
| 3blankname = {{{3blankname10|}}}
| 3namedata = {{{3namedata10|}}}
| 4blankname = {{{4blankname10|}}}
| 4namedata = {{{4namedata10|}}}
| 5blankname = {{{5blankname10|}}}
| 5namedata = {{{5namedata10|}}}
| alongside = {{{alongside10|}}}
| ambassador_from = {{{ambassador_from10|}}}
| appointer = {{{appointer10|}}}
| assembly = {{{assembly10|}}}
| assuming = {{{assuming10|}}}
| chancellor = {{{chancellor10|}}}
| co-leader = {{{co-leader10|}}}
| constituency_{{#if:{{{constituency_AM10|}}}|AM|MP}} = {{if empty|{{{constituency_AM10|}}}|{{{constituency_MP10|}}}}}
| constituency = {{{constituency10|}}}
| convocation = {{{convocation10|}}}
| country = {{{country10|}}}
| deputy = {{{deputy10|}}}
| district = {{{district10|}}}
| firstminister = {{{first_minister10|}}}
| governor-general = {{{governor-general10|}}}
| governor_general = {{{governor_general10|}}}
| governor = {{{governor10|}}}
| jr/sr = {{{jr/sr10|}}}
| leader = {{{leader10|}}}
| legislature = {{{legislature10|}}}
| lieutenant_governor = {{{lieutenant_governor10|}}}
| lieutenant = {{{lieutenant10|}}}
| minister_from = {{{minister_from10|}}}
| minority_floor_leader = {{{minority_floor_leader10|}}}
| majority_floor_leader = {{{majority_floor_leader10|}}}
| majority_leader = {{{majority_leader10|}}}
| majority = {{{majority10|}}}
| minister = {{{minister10|}}}
| minority_leader = {{{minority_leader10|}}}
| monarch = {{{monarch10|}}}
| nominator = {{{nominator10|}}}
| office = {{{office10|}}}
| order = {{{order10|}}}
| parliament = {{{parliament10|}}}
| parliamentarygroup = {{{parliamentary_group10|}}}
| predecessor = {{{predecessor10|}}}
| preceding = {{{preceding10|}}}
| preceded = {{{preceded10|}}}
| premier = {{{premier10|}}}
| president = {{{president10|}}}
| primeminister = {{{prime_minister10|}}}
| riding = {{{riding10|}}}
| state_assembly = {{{state_assembly10|}}}
| state_delegate = {{{state_delegate10|}}}
| state_house = {{{state_house10|}}}
| state_legislature = {{{state_legislature10|}}}
| state_senate = {{{state_senate10|}}}
| state = {{{state10|}}}
| status = {{{status10|}}}
| subterm = {{nobold|{{{subterm10|}}}}}
| suboffice = {{{suboffice10|}}}
| succeeded = {{{succeeded10|}}}
| succeeding = {{{succeeding10|}}}
| successor = {{{successor10|}}}
| taoiseach = {{{taoiseach10|}}}
| termlabel = {{if empty|{{{term_label10|}}}|In office}}
| termend = {{{term_end10|}}}
| termstart = {{{term_start10|}}}
| term = {{{term10|}}}
| title = {{{title10|}}}
| vicegovernor = {{{vice_governor10|}}}
| vicepresident = {{{vice_president10|}}}
| vicepremier = {{{vice_premier10|}}}
| viceprimeminister = {{{vice_prime_minister10|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term10|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname11|}}}
| 1namedata = {{{1namedata11|}}}
| 2blankname = {{{2blankname11|}}}
| 2namedata = {{{2namedata11|}}}
| 3blankname = {{{3blankname11|}}}
| 3namedata = {{{3namedata11|}}}
| 4blankname = {{{4blankname11|}}}
| 4namedata = {{{4namedata11|}}}
| 5blankname = {{{5blankname11|}}}
| 5namedata = {{{5namedata11|}}}
| alongside = {{{alongside11|}}}
| ambassador_from = {{{ambassador_from11|}}}
| appointer = {{{appointer11|}}}
| assembly = {{{assembly11|}}}
| assuming = {{{assuming11|}}}
| chancellor = {{{chancellor11|}}}
| co-leader = {{{co-leader11|}}}
| constituency_{{#if:{{{constituency_AM11|}}}|AM|MP}} = {{if empty|{{{constituency_AM11|}}}|{{{constituency_MP11|}}}}}
| constituency = {{{constituency11|}}}
| convocation = {{{convocation11|}}}
| country = {{{country11|}}}
| deputy = {{{deputy11|}}}
| district = {{{district11|}}}
| firstminister = {{{first_minister11|}}}
| governor-general = {{{governor-general11|}}}
| governor_general = {{{governor_general11|}}}
| governor = {{{governor11|}}}
| jr/sr = {{{jr/sr11|}}}
| leader = {{{leader11|}}}
| legislature = {{{legislature11|}}}
| lieutenant_governor = {{{lieutenant_governor11|}}}
| lieutenant = {{{lieutenant11|}}}
| minister_from = {{{minister_from11|}}}
| minority_floor_leader = {{{minority_floor_leader11|}}}
| majority_floor_leader = {{{majority_floor_leader11|}}}
| majority_leader = {{{majority_leader11|}}}
| majority = {{{majority11|}}}
| minister = {{{minister11|}}}
| minority_leader = {{{minority_leader11|}}}
| monarch = {{{monarch11|}}}
| nominator = {{{nominator11|}}}
| office = {{{office11|}}}
| order = {{{order11|}}}
| parliament = {{{parliament11|}}}
| parliamentarygroup = {{{parliamentary_group11|}}}
| predecessor = {{{predecessor11|}}}
| preceding = {{{preceding11|}}}
| preceded = {{{preceded11|}}}
| premier = {{{premier11|}}}
| president = {{{president11|}}}
| primeminister = {{{prime_minister11|}}}
| riding = {{{riding11|}}}
| state_assembly = {{{state_assembly11|}}}
| state_delegate = {{{state_delegate11|}}}
| state_house = {{{state_house11|}}}
| state_legislature = {{{state_legislature11|}}}
| state_senate = {{{state_senate11|}}}
| state = {{{state11|}}}
| status = {{{status11|}}}
| subterm = {{nobold|{{{subterm11|}}}}}
| suboffice = {{{suboffice11|}}}
| succeeded = {{{succeeded11|}}}
| succeeding = {{{succeeding11|}}}
| successor = {{{successor11|}}}
| taoiseach = {{{taoiseach11|}}}
| termlabel = {{if empty|{{{term_label11|}}}|In office}}
| termend = {{{term_end11|}}}
| termstart = {{{term_start11|}}}
| term = {{{term11|}}}
| title = {{{title11|}}}
| vicegovernor = {{{vice_governor11|}}}
| vicepresident = {{{vice_president11|}}}
| vicepremier = {{{vice_premier11|}}}
| viceprimeminister = {{{vice_prime_minister11|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term11|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname12|}}}
| 1namedata = {{{1namedata12|}}}
| 2blankname = {{{2blankname12|}}}
| 2namedata = {{{2namedata12|}}}
| 3blankname = {{{3blankname12|}}}
| 3namedata = {{{3namedata12|}}}
| 4blankname = {{{4blankname12|}}}
| 4namedata = {{{4namedata12|}}}
| 5blankname = {{{5blankname12|}}}
| 5namedata = {{{5namedata12|}}}
| alongside = {{{alongside12|}}}
| ambassador_from = {{{ambassador_from12|}}}
| appointer = {{{appointer12|}}}
| assembly = {{{assembly12|}}}
| assuming = {{{assuming12|}}}
| chancellor = {{{chancellor12|}}}
| co-leader = {{{co-leader12|}}}
| constituency_{{#if:{{{constituency_AM12|}}}|AM|MP}} = {{if empty|{{{constituency_AM12|}}}|{{{constituency_MP12|}}}}}
| constituency = {{{constituency12|}}}
| convocation = {{{convocation12|}}}
| country = {{{country12|}}}
| deputy = {{{deputy12|}}}
| district = {{{district12|}}}
| firstminister = {{{first_minister12|}}}
| governor-general = {{{governor-general12|}}}
| governor_general = {{{governor_general12|}}}
| governor = {{{governor12|}}}
| jr/sr = {{{jr/sr12|}}}
| leader = {{{leader12|}}}
| legislature = {{{legislature12|}}}
| lieutenant_governor = {{{lieutenant_governor12|}}}
| lieutenant = {{{lieutenant12|}}}
| minister_from = {{{minister_from12|}}}
| minority_floor_leader = {{{minority_floor_leader12|}}}
| majority_floor_leader = {{{majority_floor_leader12|}}}
| majority_leader = {{{majority_leader12|}}}
| majority = {{{majority12|}}}
| minister = {{{minister12|}}}
| minority_leader = {{{minority_leader12|}}}
| monarch = {{{monarch12|}}}
| nominator = {{{nominator12|}}}
| office = {{{office12|}}}
| order = {{{order12|}}}
| parliament = {{{parliament12|}}}
| parliamentarygroup = {{{parliamentary_group12|}}}
| predecessor = {{{predecessor12|}}}
| preceding = {{{preceding12|}}}
| preceded = {{{preceded12|}}}
| premier = {{{premier12|}}}
| president = {{{president12|}}}
| primeminister = {{{prime_minister12|}}}
| riding = {{{riding12|}}}
| state_assembly = {{{state_assembly12|}}}
| state_delegate = {{{state_delegate12|}}}
| state_house = {{{state_house12|}}}
| state_legislature = {{{state_legislature12|}}}
| state_senate = {{{state_senate12|}}}
| state = {{{state12|}}}
| status = {{{status12|}}}
| subterm = {{nobold|{{{subterm12|}}}}}
| suboffice = {{{suboffice12|}}}
| succeeded = {{{succeeded12|}}}
| succeeding = {{{succeeding12|}}}
| successor = {{{successor12|}}}
| taoiseach = {{{taoiseach12|}}}
| termlabel = {{if empty|{{{term_label12|}}}|In office}}
| termend = {{{term_end12|}}}
| termstart = {{{term_start12|}}}
| term = {{{term12|}}}
| title = {{{title12|}}}
| vicegovernor = {{{vice_governor12|}}}
| vicepresident = {{{vice_president12|}}}
| vicepremier = {{{vice_premier12|}}}
| viceprimeminister = {{{vice_prime_minister12|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term12|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname13|}}}
| 1namedata = {{{1namedata13|}}}
| 2blankname = {{{2blankname13|}}}
| 2namedata = {{{2namedata13|}}}
| 3blankname = {{{3blankname13|}}}
| 3namedata = {{{3namedata13|}}}
| 4blankname = {{{4blankname13|}}}
| 4namedata = {{{4namedata13|}}}
| 5blankname = {{{5blankname13|}}}
| 5namedata = {{{5namedata13|}}}
| alongside = {{{alongside13|}}}
| ambassador_from = {{{ambassador_from13|}}}
| appointer = {{{appointer13|}}}
| assembly = {{{assembly13|}}}
| assuming = {{{assuming13|}}}
| chancellor = {{{chancellor13|}}}
| co-leader = {{{co-leader13|}}}
| constituency_{{#if:{{{constituency_AM13|}}}|AM|MP}} = {{if empty|{{{constituency_AM13|}}}|{{{constituency_MP13|}}}}}
| constituency = {{{constituency13|}}}
| convocation = {{{convocation13|}}}
| country = {{{country13|}}}
| deputy = {{{deputy13|}}}
| district = {{{district13|}}}
| firstminister = {{{first_minister13|}}}
| governor-general = {{{governor-general13|}}}
| governor_general = {{{governor_general13|}}}
| governor = {{{governor13|}}}
| jr/sr = {{{jr/sr13|}}}
| leader = {{{leader13|}}}
| legislature = {{{legislature13|}}}
| lieutenant_governor = {{{lieutenant_governor13|}}}
| lieutenant = {{{lieutenant13|}}}
| minister_from = {{{minister_from13|}}}
| minority_floor_leader = {{{minority_floor_leader13|}}}
| majority_floor_leader = {{{majority_floor_leader13|}}}
| majority_leader = {{{majority_leader13|}}}
| majority = {{{majority13|}}}
| minister = {{{minister13|}}}
| minority_leader = {{{minority_leader13|}}}
| monarch = {{{monarch13|}}}
| nominator = {{{nominator13|}}}
| office = {{{office13|}}}
| order = {{{order13|}}}
| parliament = {{{parliament13|}}}
| parliamentarygroup = {{{parliamentary_group13|}}}
| predecessor = {{{predecessor13|}}}
| preceding = {{{preceding13|}}}
| preceded = {{{preceded13|}}}
| premier = {{{premier13|}}}
| president = {{{president13|}}}
| primeminister = {{{prime_minister13|}}}
| riding = {{{riding13|}}}
| state_assembly = {{{state_assembly13|}}}
| state_delegate = {{{state_delegate13|}}}
| state_house = {{{state_house13|}}}
| state_legislature = {{{state_legislature13|}}}
| state_senate = {{{state_senate13|}}}
| state = {{{state13|}}}
| status = {{{status13|}}}
| subterm = {{nobold|{{{subterm13|}}}}}
| suboffice = {{{suboffice13|}}}
| succeeded = {{{succeeded13|}}}
| succeeding = {{{succeeding13|}}}
| successor = {{{successor13|}}}
| taoiseach = {{{taoiseach13|}}}
| termlabel = {{if empty|{{{term_label13|}}}|In office}}
| termend = {{{term_end13|}}}
| termstart = {{{term_start13|}}}
| term = {{{term13|}}}
| title = {{{title13|}}}
| vicegovernor = {{{vice_governor13|}}}
| vicepresident = {{{vice_president13|}}}
| vicepremier = {{{vice_premier13|}}}
| viceprimeminister = {{{vice_prime_minister13|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term13|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname14|}}}
| 1namedata = {{{1namedata14|}}}
| 2blankname = {{{2blankname14|}}}
| 2namedata = {{{2namedata14|}}}
| 3blankname = {{{3blankname14|}}}
| 3namedata = {{{3namedata14|}}}
| 4blankname = {{{4blankname14|}}}
| 4namedata = {{{4namedata14|}}}
| 5blankname = {{{5blankname14|}}}
| 5namedata = {{{5namedata14|}}}
| alongside = {{{alongside14|}}}
| ambassador_from = {{{ambassador_from14|}}}
| appointer = {{{appointer14|}}}
| assembly = {{{assembly14|}}}
| assuming = {{{assuming14|}}}
| chancellor = {{{chancellor14|}}}
| co-leader = {{{co-leader14|}}}
| constituency_{{#if:{{{constituency_AM14|}}}|AM|MP}} = {{if empty|{{{constituency_AM14|}}}|{{{constituency_MP14|}}}}}
| constituency = {{{constituency14|}}}
| convocation = {{{convocation14|}}}
| country = {{{country14|}}}
| deputy = {{{deputy14|}}}
| district = {{{district14|}}}
| firstminister = {{{first_minister14|}}}
| governor-general = {{{governor-general14|}}}
| governor_general = {{{governor_general14|}}}
| governor = {{{governor14|}}}
| jr/sr = {{{jr/sr14|}}}
| leader = {{{leader14|}}}
| legislature = {{{legislature14|}}}
| lieutenant_governor = {{{lieutenant_governor14|}}}
| lieutenant = {{{lieutenant14|}}}
| minister_from = {{{minister_from14|}}}
| minority_floor_leader = {{{minority_floor_leader14|}}}
| majority_floor_leader = {{{majority_floor_leader14|}}}
| majority_leader = {{{majority_leader14|}}}
| majority = {{{majority14|}}}
| minister = {{{minister14|}}}
| minority_leader = {{{minority_leader14|}}}
| monarch = {{{monarch14|}}}
| nominator = {{{nominator14|}}}
| office = {{{office14|}}}
| order = {{{order14|}}}
| parliament = {{{parliament14|}}}
| parliamentarygroup = {{{parliamentary_group14|}}}
| predecessor = {{{predecessor14|}}}
| preceding = {{{preceding14|}}}
| preceded = {{{preceded14|}}}
| premier = {{{premier14|}}}
| president = {{{president14|}}}
| primeminister = {{{prime_minister14|}}}
| riding = {{{riding14|}}}
| state_assembly = {{{state_assembly14|}}}
| state_delegate = {{{state_delegate14|}}}
| state_house = {{{state_house14|}}}
| state_legislature = {{{state_legislature14|}}}
| state_senate = {{{state_senate14|}}}
| state = {{{state14|}}}
| status = {{{status14|}}}
| subterm = {{nobold|{{{subterm14|}}}}}
| suboffice = {{{suboffice14|}}}
| succeeded = {{{succeeded14|}}}
| succeeding = {{{succeeding14|}}}
| successor = {{{successor14|}}}
| taoiseach = {{{taoiseach14|}}}
| termlabel = {{if empty|{{{term_label14|}}}|In office}}
| termend = {{{term_end14|}}}
| termstart = {{{term_start14|}}}
| term = {{{term14|}}}
| title = {{{title14|}}}
| vicegovernor = {{{vice_governor14|}}}
| vicepresident = {{{vice_president14|}}}
| vicepremier = {{{vice_premier14|}}}
| viceprimeminister = {{{vice_prime_minister14|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term14|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname15|}}}
| 1namedata = {{{1namedata15|}}}
| 2blankname = {{{2blankname15|}}}
| 2namedata = {{{2namedata15|}}}
| 3blankname = {{{3blankname15|}}}
| 3namedata = {{{3namedata15|}}}
| 4blankname = {{{4blankname15|}}}
| 4namedata = {{{4namedata15|}}}
| 5blankname = {{{5blankname15|}}}
| 5namedata = {{{5namedata15|}}}
| alongside = {{{alongside15|}}}
| ambassador_from = {{{ambassador_from15|}}}
| appointer = {{{appointer15|}}}
| assembly = {{{assembly15|}}}
| assuming = {{{assuming15|}}}
| chancellor = {{{chancellor15|}}}
| co-leader = {{{co-leader15|}}}
| constituency_{{#if:{{{constituency_AM15|}}}|AM|MP}} = {{if empty|{{{constituency_AM15|}}}|{{{constituency_MP15|}}}}}
| constituency = {{{constituency15|}}}
| convocation = {{{convocation15|}}}
| country = {{{country15|}}}
| deputy = {{{deputy15|}}}
| district = {{{district15|}}}
| firstminister = {{{first_minister15|}}}
| governor-general = {{{governor-general15|}}}
| governor_general = {{{governor_general15|}}}
| governor = {{{governor15|}}}
| jr/sr = {{{jr/sr15|}}}
| leader = {{{leader15|}}}
| legislature = {{{legislature15|}}}
| lieutenant_governor = {{{lieutenant_governor15|}}}
| lieutenant = {{{lieutenant15|}}}
| minister_from = {{{minister_from15|}}}
| minority_floor_leader = {{{minority_floor_leader15|}}}
| majority_floor_leader = {{{majority_floor_leader15|}}}
| majority_leader = {{{majority_leader15|}}}
| majority = {{{majority15|}}}
| minister = {{{minister15|}}}
| minority_leader = {{{minority_leader15|}}}
| monarch = {{{monarch15|}}}
| nominator = {{{nominator15|}}}
| office = {{{office15|}}}
| order = {{{order15|}}}
| parliament = {{{parliament15|}}}
| parliamentarygroup = {{{parliamentary_group15|}}}
| predecessor = {{{predecessor15|}}}
| preceding = {{{preceding15|}}}
| preceded = {{{preceded15|}}}
| premier = {{{premier15|}}}
| president = {{{president15|}}}
| primeminister = {{{prime_minister15|}}}
| riding = {{{riding15|}}}
| state_assembly = {{{state_assembly15|}}}
| state_delegate = {{{state_delegate15|}}}
| state_house = {{{state_house15|}}}
| state_legislature = {{{state_legislature15|}}}
| state_senate = {{{state_senate15|}}}
| state = {{{state15|}}}
| status = {{{status15|}}}
| subterm = {{nobold|{{{subterm15|}}}}}
| suboffice = {{{suboffice15|}}}
| succeeded = {{{succeeded15|}}}
| succeeding = {{{succeeding15|}}}
| successor = {{{successor15|}}}
| taoiseach = {{{taoiseach15|}}}
| termlabel = {{if empty|{{{term_label15|}}}|In office}}
| termend = {{{term_end15|}}}
| termstart = {{{term_start15|}}}
| term = {{{term15|}}}
| title = {{{title15|}}}
| vicegovernor = {{{vice_governor15|}}}
| vicepresident = {{{vice_president15|}}}
| vicepremier = {{{vice_premier15|}}}
| viceprimeminister = {{{vice_prime_minister15|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term15|}}}
}}}}<!--
-->{{#if:{{{nominee|}}}{{{candidate|}}}||
{{Infobox officeholder/office|color={{#ifeq:{{lc:{{{embed}}}}}|yes|#eee|lavender}}
| 1blankname = {{{1blankname16|}}}
| 1namedata = {{{1namedata16|}}}
| 2blankname = {{{2blankname16|}}}
| 2namedata = {{{2namedata16|}}}
| 3blankname = {{{3blankname16|}}}
| 3namedata = {{{3namedata16|}}}
| 4blankname = {{{4blankname16|}}}
| 4namedata = {{{4namedata16|}}}
| 5blankname = {{{5blankname16|}}}
| 5namedata = {{{5namedata16|}}}
| alongside = {{{alongside16|}}}
| ambassador_from = {{{ambassador_from16|}}}
| appointer = {{{appointer16|}}}
| assembly = {{{assembly16|}}}
| assuming = {{{assuming16|}}}
| chancellor = {{{chancellor16|}}}
| co-leader = {{{co-leader16|}}}
| constituency_{{#if:{{{constituency_AM16|}}}|AM|MP}} = {{if empty|{{{constituency_AM16|}}}|{{{constituency_MP16|}}}}}
| constituency = {{{constituency16|}}}
| convocation = {{{convocation16|}}}
| country = {{{country16|}}}
| deputy = {{{deputy16|}}}
| district = {{{district16|}}}
| firstminister = {{{first_minister16|}}}
| governor-general = {{{governor-general16|}}}
| governor_general = {{{governor_general16|}}}
| governor = {{{governor16|}}}
| jr/sr = {{{jr/sr16|}}}
| leader = {{{leader16|}}}
| legislature = {{{legislature16|}}}
| lieutenant_governor = {{{lieutenant_governor16|}}}
| lieutenant = {{{lieutenant16|}}}
| minister_from = {{{minister_from16|}}}
| minority_floor_leader = {{{minority_floor_leader16|}}}
| majority_floor_leader = {{{majority_floor_leader16|}}}
| majority_leader = {{{majority_leader16|}}}
| majority = {{{majority16|}}}
| minister = {{{minister16|}}}
| minority_leader = {{{minority_leader16|}}}
| monarch = {{{monarch16|}}}
| nominator = {{{nominator16|}}}
| office = {{{office16|}}}
| order = {{{order16|}}}
| parliament = {{{parliament16|}}}
| parliamentarygroup = {{{parliamentary_group16|}}}
| predecessor = {{{predecessor16|}}}
| preceding = {{{preceding16|}}}
| preceded = {{{preceded16|}}}
| premier = {{{premier16|}}}
| president = {{{president16|}}}
| primeminister = {{{prime_minister16|}}}
| riding = {{{riding16|}}}
| state_assembly = {{{state_assembly16|}}}
| state_delegate = {{{state_delegate16|}}}
| state_house = {{{state_house16|}}}
| state_legislature = {{{state_legislature16|}}}
| state_senate = {{{state_senate16|}}}
| state = {{{state16|}}}
| status = {{{status16|}}}
| subterm = {{nobold|{{{subterm16|}}}}}
| suboffice = {{{suboffice16|}}}
| succeeded = {{{succeeded16|}}}
| succeeding = {{{succeeding16|}}}
| successor = {{{successor16|}}}
| taoiseach = {{{taoiseach16|}}}
| termlabel = {{if empty|{{{term_label16|}}}|In office}}
| termend = {{{term_end16|}}}
| termstart = {{{term_start16|}}}
| term = {{{term16|}}}
| title = {{{title16|}}}
| vicegovernor = {{{vice_governor16|}}}
| vicepresident = {{{vice_president16|}}}
| vicepremier = {{{vice_premier16|}}}
| viceprimeminister = {{{vice_prime_minister16|}}}
| party = {{{party|}}}
| prior_term = {{{prior_term16|}}}
}}}}
| data2 = {{{module0|}}}
<!----------Personal data---------->
| header3 = {{#if:{{{pronunciation|}}}{{{birth_name|}}}{{{birth_date|}}}{{{birth_place|}}}{{{death_date|}}}{{{death_place|}}}{{{resting_place|}}}{{{resting_place_coordinates|}}}{{{citizenship|}}}{{{party|}}}{{{other_party|}}}{{{spouse|}}}{{{partner|}}}{{{relations|}}}{{{children|}}}{{{parents|}}}{{{mother|}}}{{{father|}}}{{{relatives|}}}{{{education|}}}{{{alma_mater|}}}{{{occupation|}}}{{{profession|}}}{{{known_for|}}}{{{salary|}}}{{{cabinet|}}}{{{committees|}}}{{{portfolio|}}}{{{awards|}}}{{{data1|}}}{{{data2|}}}{{{data3|}}}{{{data4|}}}{{{data5|}}}|Personal details}}
| label4 = Pronunciation
| data4 = {{{pronunciation|}}}
| label5 = Born
| data5 = {{#invoke:Separated entries|br
|1={{#if:{{{birth_name|}}}|<span class="nickname">{{{birth_name|}}}</span>}}
|2={{#invoke:person date|birth}}
|3={{#if:{{{birth_place|}}}|<div class="birthplace">{{{birth_place|}}}</div>}}
}}
| label6 = Died
| data6 = {{#invoke:Separated entries|br
|1={{#invoke:person date|death}}
|2={{#if:{{{death_place|}}}|<div class="deathplace">{{{death_place|}}}</div>}}
}}
| label7 = Cause of death
| data7 = {{{death_cause|}}}
| label8 = Resting place
| class8 = label
| data8 = {{#invoke:Separated entries|br
|1={{{resting_place|}}}
|2={{{resting_place_coordinates|}}}
}}
| label9 = Citizenship
| data9 = {{{citizenship|}}}
| label11 = [[Political party|Party]]
| data11 = {{#switch:{{{party|}}}
| =
| [[United States Democratic Party|Democrat]]
| [[Democratic Party (United States)|Democratic]]
| [[Democratic Party (United States)|Democrat]] = [[Democratic Party (United States)|Democratic]]
| [[Republican Party (United States)|Republican]]
| [[United States Republican Party]]
| [[United States Republican Party|Republican]]
| [[Republican Party (United States)|Republican Party]] = [[Republican Party (United States)|Republican]]
| [[Conservative Party (UK)|Conservative Party]]
| [[Conservative Party (UK)|Conservative]] = [[Conservative Party (UK)|Conservative]]
| [[Labour Party (UK)|Labour Party]]
| [[Labour Party (UK)|Labour]] = [[Labour Party (UK)|Labour]]
| [[Conservative Party of Canada|Conservative Party]]
| [[Conservative Party of Canada|Conservative]] = [[Conservative Party of Canada|Conservative]]
| [[Liberal Party of Canada|Liberal Party]]
| [[Liberal Party of Canada|Liberal]] = [[Liberal Party of Canada|Liberal]]
| KMT
| Kuomintang
| [[KMT]]
| [[Kuomintang|KMT]]
| [[Kuomintang]]
| Kuomintang (KMT)
| [[Kuomintang]] (KMT) = [[Kuomintang]]
| DPP
| [[Democratic Progressive Party|DPP]]
| [[Democratic Progressive Party]] = [[Democratic Progressive Party]]
| #default = {{{party|}}} }}
| label12 = {{longitem|Other political<br />affiliations}}
| data12 = {{{other_party|}}}
| label13 = Height
| data13 = {{#if:{{{height|}}}|{{Infobox person/height|{{{height|}}}}}}}
| label14 = Spouse{{#invoke:Detect singular|pluralize|{{{spouse|}}}|likely=(s)|plural=s}}
| data14 = {{{spouse|}}}
| label15 = {{longitem|Domestic partner{{#invoke:Detect singular|pluralize|{{{partner|}}}|likely=(s)|plural=s}}}}
| data15 = {{{partner|}}}
| label16 = Relations
| data16 = {{{relations|}}}
| label17 = Children
| data17 = {{{children|}}}
| label18 = Parent{{#if:{{{parents|}}}|{{#invoke:Detect singular|pluralize|{{{parents|}}}|likely=(s)|plural=s}}|<!--
-->{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|s}}}}
| data18 = {{#if:{{{parents|}}}|{{{parents}}}|{{#invoke:list|unbulleted|{{#if:{{{father|}}}|{{{father}}} (father)}}|{{#if:{{{mother|}}}|{{{mother}}} (mother)}}}}}}
| label19 = Relatives
| data19 = {{{relatives|}}}
| label21 = Education
| data21 = {{{education|}}}
| label22 = [[Alma mater]]
| data22 = {{{alma_mater|}}}
| label23 = Occupation
| data23 = {{{occupation|}}}
| label24 = Profession
| data24 = {{{profession|}}}
| label25 = {{longitem|Known for}}
| data25 = {{{known_for|}}}
| label26 = Salary
| data26 = {{{salary|}}}
| label27 = Cabinet
| data27 = {{{cabinet|}}}
| label28 = Committees
| data28 = {{{committees|}}}
| label29 = Portfolio
| data29 = {{{portfolio|}}}
| label30 = {{longitem|{{#if:{{{mawards|}}}|Civilian awards|Awards}}}}
| data30 = {{{awards|}}}
| label31 = {{longitem|{{{blank1}}}}}
| data31 = {{{data1|}}}
| label32 = {{longitem|{{{blank2}}}}}
| data32 = {{{data2|}}}
| label33 = {{longitem|{{{blank3}}}}}
| data33 = {{{data3|}}}
| label34 = {{longitem|{{{blank4}}}}}
| data34 = {{{data4|}}}
| label35 = {{longitem|{{{blank5}}}}}
| data35 = {{{data5|}}}
| label36 = Signature
| data36 = {{#if:{{{signature|}}}|[[File:{{{signature}}}|{{if empty|{{{signature_size|}}}|128x80px}}|class=skin-invert notpageimage|alt={{{signature_alt|}}}|{{PAGENAME}}'s signature]]}}
| label37 = Website
| data37 = {{{website|}}}
| label38 = Nickname{{#invoke:Detect singular|pluralize|{{{nickname|}}}|likely=(s)|plural=s}}
| data38 = {{{nickname|}}}
| header39 = {{#if:{{{allegiance|}}}{{{branch|}}}{{{service_years|}}}{{{rank|}}}{{{unit|}}}{{{commands|}}}{{{battles|}}}{{{military_blank1|}}}|Military service}}
| label40 = Allegiance
| data40 = {{{allegiance|}}}
| label41 = {{if empty|{{{branch_label|}}}|Branch/service}}
| data41 = {{{branch|}}}
| label42 = {{longitem|{{if empty|{{{service_years_label|}}}|Years of service}}}}
| data42 = {{{service_years|}}}
| label43 = {{if empty|{{{rank_label|}}}|Rank}}
| data43 = {{{rank|}}}
| label44 = {{if empty|{{{unit_label|}}}|Unit}}
| data44 = {{{unit|}}}
| label45 = Commands
| data45 = {{{commands|}}}
| label46 = {{if empty|{{{battles_label|}}}|Battles/wars}}
| data46 = {{{battles|}}}
| label47 = {{#if:{{{awards|}}}|Military awards|Awards}}
| data47 = {{{mawards|}}}
| label48 = {{{military_blank1}}}
| data48 = {{{military_data1|}}}
| label49 = {{{military_blank2}}}
| data49 = {{{military_data2|}}}
| label50 = {{{military_blank3}}}
| data50 = {{{military_data3|}}}
| label51 = {{{military_blank4}}}
| data51 = {{{military_data4|}}}
| label52 = {{{military_blank5}}}
| data52 = {{{military_data5|}}}
| data53 = {{{module|}}}
| data54 = {{{module2|}}}
| data55 = {{{module3|}}}
| data56 = {{{module4|}}}
| data57 = {{{module5|}}}
| data58 = {{{footnotes|}}}
| belowstyle = border-top: 1px solid right;
| below = <div>{{#if:{{{date|}}}| As of {{{date}}}{{#if:{{{year|}}}|, {{{year}}}}}}}</div>{{#if:{{{source|}}}|Source: [{{{source}}}]}}
}}{{#if:{{{pronunciation|}}}|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Biography template using pronunciation]]}}
}}{{#if:{{{1blankname0|}}}{{{1namedata0|}}}{{{2blankname0|}}}{{{2namedata0|}}}{{{3blankname0|}}}{{{3namedata0|}}}{{{4blankname0|}}}{{{4namedata0|}}}{{{5blankname0|}}}{{{5namedata0|}}}{{{alongside0|}}}{{{ambassador_from0|}}}{{{appointer0|}}}{{{assembly0|}}}{{{assuming0|}}}{{{chancellor0|}}}{{{co-leader0|}}}{{{constituency_AM0|}}}{{{constituency0|}}}{{{country0|}}}{{{deputy0|}}}{{{district0|}}}{{{firstminister0|}}}{{{governor-general0|}}}{{{governor0|}}}{{{jr/sr0|}}}{{{leader0|}}}{{{legislature0|}}}{{{lieutenant_governor0|}}}{{{lieutenant0|}}}{{{minister_from0|}}}{{{minority_floor_leader0|}}}{{{majority_floor_leader0|}}}{{{majority_leader0|}}}{{{majority0|}}}{{{minister0|}}}{{{minorityleader0|}}}{{{monarch0|}}}{{{nominator0|}}}{{{office0|}}}{{{order0|}}}{{{parliament0|}}}{{{predecessor0|}}}{{{preceding0|}}}{{{preceded0|}}}{{{premier0|}}}{{{president0|}}}{{{prime_minister0|}}}{{{riding0|}}}{{{state_assembly0|}}}{{{state_delegate0|}}}{{{state_house0|}}}{{{state_legislature0|}}}{{{state_senate0|}}}{{{state0|}}}{{{suboffice0|}}}{{{subterm0|}}}{{{succeeded0|}}}{{{succeeding0|}}}{{{successor0|}}}{{{taoiseach0|}}}{{{term_end0|}}}{{{term_start0|}}}{{{term0|}}}{{{title0|}}}{{{vice_governor0|}}}{{{vice_president0|}}}{{{vice_premier0|}}}{{{vice_primeminister0|}}}{{{prior_term0|}}}{{{constituency_0|}}}|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with office0]]}}
}}{{#if:{{{speaker|}}}|{{#if:{{{nominee|}}}{{{candidate|}}}||{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with speaker]]}}}}
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|{{#ifeq:{{{nocat|{{{demo|{{#ifeq:{{{categories|}}}|no|yes}}}}}}}}|yes||[[Category:Pages using infobox officeholder with unknown parameters|_VALUE_{{PAGENAME}}]]}}}}|preview=Page using [[Template:Infobox officeholder]] with unknown parameter "_VALUE_"|ignoreblank=y| regexp1 = 1blankname[%d]* | regexp2 = 1namedata[%d]* | regexp3 = 2blankname[%d]* | regexp4 = 2namedata[%d]* | regexp5 = 3blankname[%d]* | regexp6 = 3namedata[%d]* | regexp7 = 4blankname[%d]* | regexp8 = 4namedata[%d]* | regexp9 = 5blankname[%d]* | regexp10 = 5namedata[%d]* | allegiance | alma_mater | regexp11 = alongside[%d]* | alt | regexp12 = ambassador_from[%d]* | regexp14 = appointer[%d]* | regexp15 = assembly[%d]* | awards | battles | battles_label | birth_date | birth_name | birth_place | regexp16 = blank[%d]* | bodyclass | branch | branch_label | cabinet | candidate | caption | categories | regexp17 = chancellor[%d]* | children | citizenship | regexp18 = co%-leader[%d]* | commands | committees | regexp19 = constituency[%d]* | regexp20 = constituency_AM[%d]* | regexp21 = constituency_MP[%d]* | regexp22 = convocation[%d]* | regexp23 = country[%d]* | regexp24 = data[%d]* | date | death_cause | death_date | death_place | demo | regexp25 = deputy[%d]* | regexp26 = district[%d]* | education | election_date | embed | father | regexp28 = first_minister[%d]* | footnotes | regexp29 = governor[%d]* | regexp30 = governor_general[%d]* | regexp31 = governor%-general[%d]* | height | honorific_prefix | honorific_suffix | image | image_size | image_upright | incumbent | regexp32 = jr/sr[%d]* | known_for | regexp34 = leader[%d]* | regexp35 = legislature[%d]* | regexp36 = lieutenant[%d]* | regexp37 = lieutenant_governor[%d]* | main_width | regexp38 = majority[%d]* | regexp39 = majority_floor_leader[%d]* | regexp40 = majority_leader[%d]* | mawards | regexp42 = military_blank[%d]* | regexp43 = military_data[%d]* | regexp44 = minister[%d]* | regexp45 = minister_from[%d]* | regexp46 = minority_floor_leader[%d]* | regexp47 = minority_leader[%d]* | regexp49 = module[%d]* | regexp50 = monarch[%d]* | mother | name | native_name | native_name_lang | nickname | nocat | regexp51 = nominator[%d]* | nominee | occupation | regexp52 = office[%d]* | opponent | regexp53 = order[%d]* | other_party | parents | regexp54 = parliament[%d]* | regexp55 = parliamentary_group[%d]* | partner | party | party_election | portfolio | regexp56 = preceded[%d]* | regexp57 = preceding[%d]* | regexp58 = predecessor[%d]* | regexp59 = premier[%d]* | regexp60 = president[%d]* | regexp61 = prime_minister[%d]* | regexp62 = prior_term[%d]* | profession | pronunciation | rank | rank_label | relations | relatives | resting_place | resting_place_coordinates | regexp63 = riding[%d]* | running_mate | salary | service_years | service_years_label | signature | signature_alt | signature_size | source | speaker | speaker_office | spouse | regexp64 = state[%d]* | regexp65 = state_assembly[%d]* | regexp66 = state_delegate[%d]* | regexp67 = state_house[%d]* | regexp68 = state_legislature[%d]* | regexp69 = state_senate[%d]* | regexp70 = status[%d]* | regexp71 = suboffice[%d]* | regexp72 = subterm[%d]* | regexp73 = succeeded[%d]* | regexp74 = succeeding[%d]* | regexp75 = successor[%d]* | regexp76 = taoiseach[%d]* | regexp77 = term[%d]* | regexp78 = term_end[%d]* | regexp79 = term_label[%d]* | regexp80 = term_start[%d]* | regexp84 = title[%d]* | unit | unit_label | regexp85 = vice_governor[%d]* | regexp86 = vice_premier[%d]* | regexp87 = vice_president[%d]* | regexp88 = vice_prime_minister[%d]* | regexp89 = assuming[%d]* | website | year }}{{#invoke:Check for conflicting parameters|check
| template = [[Template:Infobox officeholder]]
| cat = {{main other|Category:Pages using infobox officeholder with conflicting parameters}}
| constituency_AM; constituency_MP
| constituency_AM2; constituency_MP2
| constituency_AM1; constituency_MP1
| constituency_AM3; constituency_MP3
| constituency_AM4; constituency_MP4
| constituency_AM5; constituency_MP5
| constituency_AM6; constituency_MP6
| constituency_AM7; constituency_MP7
| constituency_AM8; constituency_MP8
| constituency_AM9; constituency_MP9
| constituency_AM10; constituency_MP10
| constituency_AM11; constituency_MP11
| constituency_AM12; constituency_MP12
| constituency_AM13; constituency_MP13
| constituency_AM14; constituency_MP14
| constituency_AM15; constituency_MP15
| constituency_AM16; constituency_MP16
}}{{#if:{{{alma_mater|}}}|{{preview warning|Page using [[Template:Infobox officeholder]] with deprecated parameter {{code|alma_mater}} which should be merged with/replaced by {{code|education}}.}}{{main other|[[Category:Pages using infobox officeholder with deprecated parameters]]}}}}<noinclude>
{{Documentation}}
</noinclude>
gtndibepn3y4szzs6nbbwn49mvlfgce
Tempilet:Infobox officeholder/office
10
2583
33218
2026-07-09T01:57:53Z
en>Zackmann08
0
Restored revision 1351066124 by [[Special:Contributions/Zackmann08|Zackmann08]] ([[User talk:Zackmann08|talk]]): More self-reverts
33218
wikitext
text/x-wiki
{{#if:{{{speaker|}}}{{{state_legislature|}}}{{{state_assembly|}}}{{{speaker_office|}}}{{{state_delegate|}}}{{{state_house|}}}{{{prior_term|}}}{{{nominee|}}}{{{candidate|}}}{{{termstart|}}}{{{election_date|}}}{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}{{{jr/sr|}}}{{{succeeding|}}}{{{assuming|}}}{{{state|}}}{{{state_senate|}}}{{{district|}}}{{{ambassador_from|}}}{{{minister_from|}}}{{{order|}}}{{{office|}}}{{{title|}}}{{{country|}}}{{{constituency_AM|}}}{{{constituency_MP|}}}{{{parliament|}}}{{{assembly|}}}{{{constituency_|}}}{{{riding|}}}{{{term|}}}{{{termend|}}}{{{alongside|}}}{{{co-leader|}}}
|{{#invoke:infobox|infoboxTemplate|child=yes|decat=yes
| headerstyle = color: #202122; background:{{{color|lavender}}};line-height:normal;padding:0.2em;
| datastyle = border-bottom:none
<!--------Speaker of the House--------->
| header1 = {{#if:{{{speaker|}}}|
{{{speaker}}} {{#if:{{{state_legislature|}}}
|[[Speaker of the {{{state_legislature}}} Legislature]]
|{{#if:{{{state_assembly|}}}
|[[Speaker of the {{{state_assembly|}}} {{#ifeq:{{{state_assembly|}}}|Nevada||{{#ifeq:{{{state_assembly|}}}|New Jersey|General|State}}}} Assembly]]
|{{#if:{{{speaker_office|}}}|{{{speaker_office}}}|[[Speaker of the {{#if:{{{state_delegate|}}} |{{{state_delegate}}}|{{#if:{{{state_house|}}} |{{{state_house}}}|United States}}}} House of {{#if:{{{state_delegate|}}}|Delegates|Representatives}}|Speaker of the {{#if:{{{state_delegate|}}} |{{{state_delegate}}}|{{#if:{{{state_house|}}} |{{{state_house}}}|U.S.}}}} House of {{#if:{{{state_delegate|}}}|Delegates|Representatives}}]]}}
}}
}}{{#if:{{{prior_term|}}}|
<br />{{{prior_term}}}}}
}}
<!--------Office--------->
| header2 = {{#if:{{{nominee|}}}{{{candidate|}}}|
{{#if:{{{party_election|}}}{{{party|}}}
|{{#if:{{{party_election|}}}|{{{party_election}}}|{{{party}}}}} {{#if:{{{nominee|}}}|nominee for<br />{{{nominee}}}|candidate for<br />{{{candidate}}}}}
|{{#if:{{{nominee|}}}|Nominee for<br />{{{nominee}}}|Candidate for<br />{{{candidate}}}}}
}} }}
| data3 = {{#if:{{{nominee|}}}{{{candidate|}}}|
{{#if:{{{termstart|}}}{{{election_date|}}} | <span class="nowrap">'''Election date'''</span><br />{{#if:{{{election_date|}}}|{{{election_date}}}|{{{termstart}}}}}
}} }}
| header4 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
{{#if:{{{jr/sr|}}}|[[United States Senate|<!--Changed code to eliminate "Junior/Senior" distinction for U.S. Senators per [[Template talk:Infobox Officeholder/Archive 9#Senior/Junior U.S. Senators]]{{{jr/sr}}}-->United States Senator{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}}]]<br />from {{{state}}}
}} }}
| header5 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
}}
| header6 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
{{#if:{{{state_senate|}}}|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{{state_senate}}} Senate]]</span>{{#if:{{{district|}}}|<br />from the {{{district}}} district}}{{#if:{{{prior_term|}}}|
<br />{{{prior_term}}}}}
}} }}
| header7 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
{{#if:{{{state_legislature|}}}|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{{state_legislature}}} Legislature]]</span><br />from the {{{district}}} district
}} }}
| header8 = {{#if:{{{ambassador_from|}}}{{{minister_from|}}}||
{{#if:{{{order|}}}
|{{{order}}}{{#if:{{{office|}}} | [[{{{office}}}]]}}{{#if:{{{state|}}} | [[{{{state}}}]]}}{{#if:{{{title|}}} | {{{title}}}}}
|{{{office|}}}
}} }}
| header9 = {{#if:{{{ambassador_from|}}}{{{minister_from|}}}||
{{#if:{{{order|}}}
||{{{title|}}}
}} }}
<!--------Ambassador--------->
| header10 = {{#if:{{both|{{{ambassador_from|}}}{{{minister_from|}}}|{{{country|}}}}}
|{{#if:{{{order|}}}|{{{order}}}}} {{#if:{{{minister_from|}}}
|[[{{{minister_from}}} Ambassador to {{CountryPrefixThe|{{{country}}}}}|{{{minister_from}}} Minister to <span class="nowrap">{{CountryPrefixThe|{{{country}}}}}</span>]]
|[[{{{ambassador_from}}} Ambassador to {{CountryPrefixThe|{{{country}}}}}|{{{ambassador_from}}} Ambassador to <span class="nowrap">{{CountryPrefixThe|{{{country}}}}}</span>]]
}} [[Category:Pages using infobox officeholder with ambassador from or minister from]]
}}
<!--------MP--------->
| header11 = {{#if:{{{constituency_AM|}}}{{{constituency_MP|}}}|
{{#switch:{{{parliament|}}}
|Australian = Member of the <span style="display: inline-block;">[[Australian House of Representatives|Australian Parliament]]</span>
|European = [[Member of the European Parliament]]
|Scottish = [[Member of the Scottish Parliament]]
|Sri Lanka|Sri Lankan = [[Member of Parliament (Sri Lanka)|Member of Parliament]]
|United Kingdom|UK = [[Member of Parliament (United Kingdom)|Member of Parliament]]
|#default = {{#if:{{{constituency_AM|}}}|{{#if:{{{assembly|}}}|Member of the <span style="display: inline-block;">[[{{{assembly}}} Assembly]]</span>|Assembly Member}}|Member of {{#if:{{{parliament|}}}|the <span style="display: inline-block;">[[{{{parliament}}} Parliament]]</span>|Parliament}}}}}}<br />for {{#ifeq:{{Title disambig text|{{{constituency_MP|}}}}}|UK Parliament constituency
|{{{constituency_MP|}}}
|{{#if:{{#switch:{{{parliament|}}} |United Kingdom|UK| = {{Linkless exists|{{#invoke:delink|delink|{{{constituency_MP|}}}}} (UK Parliament constituency)}} }}
|{{#ifeq:{{#invoke:delink|delink|{{{constituency_MP|}}}}}|{{#invoke:delink|delink|{{{constituency_MP|}}}|wikilinks=target}}
|{{Constlk|{{#invoke:delink|delink|{{{constituency_MP|}}}}}}}
|{{{constituency_{{#if:{{{constituency_AM|}}}|AM|MP}}}}}}}
|{{{constituency_{{#if:{{{constituency_AM|}}}|AM|MP}}}}}}}
}}{{#if:{{{prior_term|}}}|
<div style="font-weight:normal;">{{{prior_term}}}</div>}}
}}
| header12 = {{#if:{{{riding|}}}|{{#if:{{{constituency_AM|}}}|{{#if:{{{assembly|}}}|Member of the <span style="display: inline-block;">[[{{{assembly}}} Assembly]]</span>|Assembly Member}}|
{{#switch:{{{parliament|}}}
|Canadian = [[Member of Parliament (Canada)|Member of Parliament]]
|Ontario = [[Member of Provincial Parliament (Canada)|Member of Provincial Parliament]]
|Quebec = [[Member of the National Assembly (Quebec)|Member of the National Assembly]]
|#default = Member of {{#if:{{{parliament|}}}|the <span style="display: inline-block;">[[{{{parliament}}} Parliament]]</span>|Parliament}}}}}}<br />for {{{riding}}}
}}
<!--------Majority Leader (State Senate)--------->
| header13 = {{#if:{{{majority_leader|}}}|{{{majority_leader}}} {{#if:{{{state_senate|}}}|[[Majority Leader of the {{{state_senate}}} Senate]]|[[United States Senate Majority Leader]]}}
}}
<!--------Majority Floor Leader (State Senate)--------->
| header14 = {{#if:{{{majority_floor_leader|}}}|{{{majority_floor_leader}}} [[Majority Floor Leader of the {{{state_senate}}} Senate]]
}}
<!--------Minority Leader (State Senate)--------->
| header15 = {{#if:{{{minority_leader|}}}|{{{minority_leader}}} [[Minority Leader of the {{{state_senate}}} Senate]]
}}
<!--------Minority Floor Leader (State Senate)--------->
| header16 = {{#if:{{{minority_floor_leader|}}}|{{{minority_floor_leader}}} [[Minority Floor Leader of the {{{state_senate}}} Senate]]
}}
<!--------Congressman--------->
| header17 = {{#if:{{{state_legislature|}}}{{{state_senate|}}}{{{jr/sr|}}}||
{{#if:{{#if:{{{state|}}}|{{{constituency|}}}}}{{{district|}}}{{{state_house|}}}|{{#if:{{{state_assembly|}}}
|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{{state_assembly|}}} {{#ifeq:{{{state_assembly|}}}|Nevada||{{#ifeq:{{{state_assembly|}}}|New Jersey|General|State}}}} Assembly]]</span><br />from the
|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{#if:{{{state_house|}}} |{{{state_house}}}|{{#if:{{{state_delegate|}}}|{{{state_delegate}}}|United States }}}} {{#if:{{{state_delegate|}}}|House of Delegates|House of Representatives}}|{{#if:{{{state_house|}}} |{{{state_house}}}|{{#if:{{{state_delegate|}}}|{{{state_delegate}}}|U.S.}}}} {{#if:{{{state_delegate|}}}|House of Delegates|{{#if:{{{state_house|}}}| }}House of Representatives}}]]</span>{{#if:{{{district|}}}{{{state|}}}{{{state_delegate|}}}|<br />from {{#if:{{{state_delegate|}}}|the |{{#if:{{{state_house|}}}|{{#if:{{{district|}}}|the|{{{state|}}}}}|{{{state|}}}{{#if:{{{district|}}}|'s}}}}}}
}}}} {{#if:{{{district|}}}|{{{district}}} district|{{#if:{{{state_house|}}}|{{{constituency|}}}}}}}{{#if:{{{prior_term|}}}|
<br />{{{prior_term}}}}}
}}
}}
<!--------Convocation--------->
| header18 = {{#if:{{{convocation|}}}|{{{convocation}}}}}
<!--------Term--------->
| data19 = {{#if:{{{termend|}}}{{{succeeding|}}}{{{assuming|}}}|
{{#if:{{{status|}}}
| <div class="skin-nightmode-reset-color" style="width:100%; margin:0; color: black; background-color: {{{color|lavender}}}">'''{{{status}}}'''</div>|}}|
}}
| data20 = {{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{succeeding|}}}{{{assuming|}}}
| <span class="nowrap">'''Assuming office'''</span><br />{{{termstart}}}{{#if:{{{term|}}}{{{termend|}}}|[[Category:Pages using infobox officeholder with succeeding and term or termend]]}}
| {{#if: {{{term|}}} | <span class="nowrap">'''{{{termlabel|In office}}}'''</span><br />{{{term}}} {{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leading}} with {{#if:{{{alongside|}}}|{{{alongside}}}|{{{co-leader}}}}}</div>}} }}
}} }}
| data21 = {{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{succeeding|}}}{{{assuming|}}}
|
|{{#if:{{{termstart|}}}
| {{#if:{{{termend|}}}
|<!--then: term has start and end:--><span class="nowrap">'''{{{termlabel|In office}}}'''</span><br />{{en dash range|{{{termstart}}}|{{{termend}}}}}{{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leading}} with {{#if:{{{alongside|}}}|{{{alongside}}}|{{{co-leader}}}}}</div>}}
|{{#if:{{{status|}}}|<div class="skin-nightmode-reset-color" style="width:100%; margin:0; color: black; background-color: {{{color|lavender}}}">'''{{{status}}}'''</div>|<!--else: term is ongoing--><div class="skin-nightmode-reset-color" style="width:100%; margin:0; color: black; background-color: {{{color|lavender}}}">'''[[Incumbent]]'''</div>}}
}}
}}
}} }}
| data22 = {{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{succeeding|}}}{{{assuming|}}}
|
|{{#if:{{{termstart|}}}
|{{#if:{{{termend|}}}
|<!--then nothing else; term has ended-->
|<!--else term is ongoing:--><span class="nowrap">'''{{#if:{{{termlabel|}}}|{{#invoke:String|replace|source={{{termlabel}}}|In office|Assumed office}}|Assumed office}}'''</span> <br />{{{termstart}}}{{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leader}} with {{#if:{{{alongside|}}}|{{{alongside}}}|{{{co-leader}}}}}</div>}}
}}
}}
}} }}
}} }}<!--
end infobox1 / start infobox2
-->{{#if:{{{monarch|}}}{{{president|}}}{{{governor-general|}}}{{{governor_general|}}}{{{primeminister|}}}{{{chancellor|}}}{{{minister|}}}{{{taoiseach|}}}{{{firstminister|}}}{{{chiefminister|}}}{{{premier|}}}{{{governor|}}}{{{lieutenant_governor|}}}{{{vicepresident|}}}{{{vicegovernor|}}}{{{viceprimeminister|}}}{{{vicepremier|}}}{{{deputy|}}}{{{leader|}}}{{{lieutenant|}}}{{{nominator|}}}{{{appointer|}}}{{{opponent|}}}{{{incumbent|}}}{{{succeeding|}}}{{{assuming|}}}{{{preceding|}}}{{{predecessor|}}}{{{preceded|}}}{{{successor|}}}{{{succeeded|}}}{{{parliamentarygroup|}}}{{{constituency|}}}{{{majority|}}}{{{suboffice|}}}{{{1namedata|}}}{{{2namedata|}}}{{{3namedata|}}}{{{4namedata|}}}{{{5namedata|}}}{{{runningmate|}}}|
{{#invoke:infobox|infoboxTemplate|child=yes
| labelstyle = text-align:left
| label1 = <span class="nowrap">Nominated by</span>
| data1 = {{{nominator|}}}
| label2 = <span class="nowrap">Appointed by</span>
| data2 = {{{appointer|}}}
<!--------President, Prime Minister, Governor--------->
| label3 = Monarch{{#if:{{detect singular|{{{monarch|}}}}}||s}}
| data3 = {{{monarch|}}}
| label4 = President
| data4 = {{{president|}}}
| label5 = {{#if:{{{governor_general|}}}|Governor{{#if:{{detect singular|{{{governor_general}}}}}||s}} General|Governor{{#if:{{detect singular|{{{governor-general}}}}}||s}}-General}}
| data5 = {{#if:{{{governor_general|}}}|{{{governor_general}}}|{{{governor-general|}}}}}
| label6 = <span class="nowrap">Prime Minister</span>
| data6 = {{{primeminister|}}}
| label7 = Chancellor
| data7 = {{{chancellor|}}}
| label8 = Minister
| data8 = {{{minister|}}}
| label9 = Taoiseach
| data9 = {{{taoiseach|}}}
| label10 = <span class="nowrap">First Minister</span>
| data10 = {{{firstminister|}}}
| label11 = <span class="nowrap">Chief Minister</span>
| data11 = {{{chiefminister|}}}
| label12 = Premier
| data12 = {{{premier|}}}
| label13 = Governor
| data13 = {{{governor|}}}
| label14 = Lieutenant Governor
| data14 = {{{lieutenant_governor|}}}
<!--------Vice president/s, Vice Prime Minister/s, Deputy/ies, Lieutenant/s--------->
| label15 = <span class="nowrap">{{#if:{{{vicepresident|}}}|{{#ifeq:{{Linkless exists|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Vice|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice President]]|Vice President}}|Vice President}}</span>
| data15 = {{{vicepresident|}}}
| label16 = <span class="nowrap">{{#if:{{{vicegovernor|}}}|{{#ifeq:{{Linkless exists|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Vice|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice Governor]]|Vice Governor}}|Vice Governor}}</span>
| data16 = {{{vicegovernor|}}}
| label17 = <span class="nowrap">{{#if:{{{viceprimeminister|}}}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice PM]]|Vice [[Prime Minister|PM]]}}</span>
| data17 = {{{viceprimeminister|}}}
| label18 = <span class="nowrap">{{#if:{{{vicepremier|}}}|{{#ifeq:{{Linkless exists|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Vice|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice Premier]]|Vice Premier}}|Vice Premier}}</span>
| data18 = {{{vicepremier|}}}
| label19 = {{#if:{{{deputy|}}}|{{#ifeq:{{Linkless exists|Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Deputy|Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Deputy]]|Deputy}}|Deputy}}
| data19 = {{{deputy|}}}
| label20 = Leader
| data20 = {{{leader|}}}
| label21 = {{#if:{{{office|}}}|[[Lieutenant {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Lieutenant]]|Lieutenant}}
| data21 = {{{lieutenant|}}}
| label22 = {{nowrap|{{{subterm|}}}}}
| data22 = {{{suboffice|}}}
<!--------Blank fields--------->
| label23 = {{{1blankname|}}}
| data23 = {{{1namedata|}}}
| label24 = {{{2blankname|}}}
| data24 = {{{2namedata|}}}
| label25 = {{{3blankname|}}}
| data25 = {{{3namedata|}}}
| label26 = {{{4blankname|}}}
| data26 = {{{4namedata|}}}
| label27 = {{{5blankname|}}}
| data27 = {{{5namedata|}}}
<!--------Predecessor/successor--------->
| label28 = <span class="nowrap">Running mate</span>
| data28 = {{{runningmate|}}}
| label29 = Opponent{{#invoke:Detect singular|pluralize|{{{opponent|}}}|likely=(s)|plural=s}}
| data29 = {{{opponent|}}}
| label30 = Incumbent
| data30 = {{{incumbent|}}}
| label31 = {{#if:{{{succeeding|}}}|Succeeding|Preceding}}
| data31 = {{#if:{{{succeeding|}}}|{{{succeeding|}}}|{{{preceding|}}}}}
| label32 = <span class="nowrap">Preceded by</span>
| data32 = {{#if:{{{succeeding|}}}||{{#if:{{{predecessor|}}}|{{{predecessor}}}|{{{preceded|}}}}}}}
| label33 = <span class="nowrap">Succeeded by</span>
| data33 = {{#if:{{{succeeding|}}}||{{#switch:{{#if:{{{successor|}}}|{{{successor}}}|{{{succeeded|}}}}}
| Incumbent
| '''Incumbent'''
| ''Incumbent''
| [[Incumbent]]
| incumbent
| '''incumbent'''
| ''incumbent''
| [[incumbent]] =
| #default = {{#if:{{{successor|}}}|{{{successor}}}|{{{succeeded|}}}}}
}}}}
<!--------Constituency/Majority--------->
| label34 = [[Parliamentary group]]
| data34 = {{{parliamentarygroup|}}}
| label35 = Constituency
| data35 = {{#if:{{{state_house|}}}||{{{constituency|}}}}}
| label36 = Majority
| data36 = {{{majority|}}}
}} }}<noinclude>{{documentation}}</noinclude>
f40hzfv7nd35naztshh69vudaa6gpee
33219
33218
2026-11-11T21:49:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_officeholder/office]]
33218
wikitext
text/x-wiki
{{#if:{{{speaker|}}}{{{state_legislature|}}}{{{state_assembly|}}}{{{speaker_office|}}}{{{state_delegate|}}}{{{state_house|}}}{{{prior_term|}}}{{{nominee|}}}{{{candidate|}}}{{{termstart|}}}{{{election_date|}}}{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}{{{jr/sr|}}}{{{succeeding|}}}{{{assuming|}}}{{{state|}}}{{{state_senate|}}}{{{district|}}}{{{ambassador_from|}}}{{{minister_from|}}}{{{order|}}}{{{office|}}}{{{title|}}}{{{country|}}}{{{constituency_AM|}}}{{{constituency_MP|}}}{{{parliament|}}}{{{assembly|}}}{{{constituency_|}}}{{{riding|}}}{{{term|}}}{{{termend|}}}{{{alongside|}}}{{{co-leader|}}}
|{{#invoke:infobox|infoboxTemplate|child=yes|decat=yes
| headerstyle = color: #202122; background:{{{color|lavender}}};line-height:normal;padding:0.2em;
| datastyle = border-bottom:none
<!--------Speaker of the House--------->
| header1 = {{#if:{{{speaker|}}}|
{{{speaker}}} {{#if:{{{state_legislature|}}}
|[[Speaker of the {{{state_legislature}}} Legislature]]
|{{#if:{{{state_assembly|}}}
|[[Speaker of the {{{state_assembly|}}} {{#ifeq:{{{state_assembly|}}}|Nevada||{{#ifeq:{{{state_assembly|}}}|New Jersey|General|State}}}} Assembly]]
|{{#if:{{{speaker_office|}}}|{{{speaker_office}}}|[[Speaker of the {{#if:{{{state_delegate|}}} |{{{state_delegate}}}|{{#if:{{{state_house|}}} |{{{state_house}}}|United States}}}} House of {{#if:{{{state_delegate|}}}|Delegates|Representatives}}|Speaker of the {{#if:{{{state_delegate|}}} |{{{state_delegate}}}|{{#if:{{{state_house|}}} |{{{state_house}}}|U.S.}}}} House of {{#if:{{{state_delegate|}}}|Delegates|Representatives}}]]}}
}}
}}{{#if:{{{prior_term|}}}|
<br />{{{prior_term}}}}}
}}
<!--------Office--------->
| header2 = {{#if:{{{nominee|}}}{{{candidate|}}}|
{{#if:{{{party_election|}}}{{{party|}}}
|{{#if:{{{party_election|}}}|{{{party_election}}}|{{{party}}}}} {{#if:{{{nominee|}}}|nominee for<br />{{{nominee}}}|candidate for<br />{{{candidate}}}}}
|{{#if:{{{nominee|}}}|Nominee for<br />{{{nominee}}}|Candidate for<br />{{{candidate}}}}}
}} }}
| data3 = {{#if:{{{nominee|}}}{{{candidate|}}}|
{{#if:{{{termstart|}}}{{{election_date|}}} | <span class="nowrap">'''Election date'''</span><br />{{#if:{{{election_date|}}}|{{{election_date}}}|{{{termstart}}}}}
}} }}
| header4 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
{{#if:{{{jr/sr|}}}|[[United States Senate|<!--Changed code to eliminate "Junior/Senior" distinction for U.S. Senators per [[Template talk:Infobox Officeholder/Archive 9#Senior/Junior U.S. Senators]]{{{jr/sr}}}-->United States Senator{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}}]]<br />from {{{state}}}
}} }}
| header5 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
}}
| header6 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
{{#if:{{{state_senate|}}}|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{{state_senate}}} Senate]]</span>{{#if:{{{district|}}}|<br />from the {{{district}}} district}}{{#if:{{{prior_term|}}}|
<br />{{{prior_term}}}}}
}} }}
| header7 = {{#if:{{{majority_leader|}}}{{{minority_floor_leader|}}}{{{minority_leader|}}}{{{majority_floor_leader|}}}||
{{#if:{{{state_legislature|}}}|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{{state_legislature}}} Legislature]]</span><br />from the {{{district}}} district
}} }}
| header8 = {{#if:{{{ambassador_from|}}}{{{minister_from|}}}||
{{#if:{{{order|}}}
|{{{order}}}{{#if:{{{office|}}} | [[{{{office}}}]]}}{{#if:{{{state|}}} | [[{{{state}}}]]}}{{#if:{{{title|}}} | {{{title}}}}}
|{{{office|}}}
}} }}
| header9 = {{#if:{{{ambassador_from|}}}{{{minister_from|}}}||
{{#if:{{{order|}}}
||{{{title|}}}
}} }}
<!--------Ambassador--------->
| header10 = {{#if:{{both|{{{ambassador_from|}}}{{{minister_from|}}}|{{{country|}}}}}
|{{#if:{{{order|}}}|{{{order}}}}} {{#if:{{{minister_from|}}}
|[[{{{minister_from}}} Ambassador to {{CountryPrefixThe|{{{country}}}}}|{{{minister_from}}} Minister to <span class="nowrap">{{CountryPrefixThe|{{{country}}}}}</span>]]
|[[{{{ambassador_from}}} Ambassador to {{CountryPrefixThe|{{{country}}}}}|{{{ambassador_from}}} Ambassador to <span class="nowrap">{{CountryPrefixThe|{{{country}}}}}</span>]]
}} [[Category:Pages using infobox officeholder with ambassador from or minister from]]
}}
<!--------MP--------->
| header11 = {{#if:{{{constituency_AM|}}}{{{constituency_MP|}}}|
{{#switch:{{{parliament|}}}
|Australian = Member of the <span style="display: inline-block;">[[Australian House of Representatives|Australian Parliament]]</span>
|European = [[Member of the European Parliament]]
|Scottish = [[Member of the Scottish Parliament]]
|Sri Lanka|Sri Lankan = [[Member of Parliament (Sri Lanka)|Member of Parliament]]
|United Kingdom|UK = [[Member of Parliament (United Kingdom)|Member of Parliament]]
|#default = {{#if:{{{constituency_AM|}}}|{{#if:{{{assembly|}}}|Member of the <span style="display: inline-block;">[[{{{assembly}}} Assembly]]</span>|Assembly Member}}|Member of {{#if:{{{parliament|}}}|the <span style="display: inline-block;">[[{{{parliament}}} Parliament]]</span>|Parliament}}}}}}<br />for {{#ifeq:{{Title disambig text|{{{constituency_MP|}}}}}|UK Parliament constituency
|{{{constituency_MP|}}}
|{{#if:{{#switch:{{{parliament|}}} |United Kingdom|UK| = {{Linkless exists|{{#invoke:delink|delink|{{{constituency_MP|}}}}} (UK Parliament constituency)}} }}
|{{#ifeq:{{#invoke:delink|delink|{{{constituency_MP|}}}}}|{{#invoke:delink|delink|{{{constituency_MP|}}}|wikilinks=target}}
|{{Constlk|{{#invoke:delink|delink|{{{constituency_MP|}}}}}}}
|{{{constituency_{{#if:{{{constituency_AM|}}}|AM|MP}}}}}}}
|{{{constituency_{{#if:{{{constituency_AM|}}}|AM|MP}}}}}}}
}}{{#if:{{{prior_term|}}}|
<div style="font-weight:normal;">{{{prior_term}}}</div>}}
}}
| header12 = {{#if:{{{riding|}}}|{{#if:{{{constituency_AM|}}}|{{#if:{{{assembly|}}}|Member of the <span style="display: inline-block;">[[{{{assembly}}} Assembly]]</span>|Assembly Member}}|
{{#switch:{{{parliament|}}}
|Canadian = [[Member of Parliament (Canada)|Member of Parliament]]
|Ontario = [[Member of Provincial Parliament (Canada)|Member of Provincial Parliament]]
|Quebec = [[Member of the National Assembly (Quebec)|Member of the National Assembly]]
|#default = Member of {{#if:{{{parliament|}}}|the <span style="display: inline-block;">[[{{{parliament}}} Parliament]]</span>|Parliament}}}}}}<br />for {{{riding}}}
}}
<!--------Majority Leader (State Senate)--------->
| header13 = {{#if:{{{majority_leader|}}}|{{{majority_leader}}} {{#if:{{{state_senate|}}}|[[Majority Leader of the {{{state_senate}}} Senate]]|[[United States Senate Majority Leader]]}}
}}
<!--------Majority Floor Leader (State Senate)--------->
| header14 = {{#if:{{{majority_floor_leader|}}}|{{{majority_floor_leader}}} [[Majority Floor Leader of the {{{state_senate}}} Senate]]
}}
<!--------Minority Leader (State Senate)--------->
| header15 = {{#if:{{{minority_leader|}}}|{{{minority_leader}}} [[Minority Leader of the {{{state_senate}}} Senate]]
}}
<!--------Minority Floor Leader (State Senate)--------->
| header16 = {{#if:{{{minority_floor_leader|}}}|{{{minority_floor_leader}}} [[Minority Floor Leader of the {{{state_senate}}} Senate]]
}}
<!--------Congressman--------->
| header17 = {{#if:{{{state_legislature|}}}{{{state_senate|}}}{{{jr/sr|}}}||
{{#if:{{#if:{{{state|}}}|{{{constituency|}}}}}{{{district|}}}{{{state_house|}}}|{{#if:{{{state_assembly|}}}
|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{{state_assembly|}}} {{#ifeq:{{{state_assembly|}}}|Nevada||{{#ifeq:{{{state_assembly|}}}|New Jersey|General|State}}}} Assembly]]</span><br />from the
|Member{{#if:{{{succeeding|}}}{{{assuming|}}}|-elect}} of the <span style="display: inline-block;">[[{{#if:{{{state_house|}}} |{{{state_house}}}|{{#if:{{{state_delegate|}}}|{{{state_delegate}}}|United States }}}} {{#if:{{{state_delegate|}}}|House of Delegates|House of Representatives}}|{{#if:{{{state_house|}}} |{{{state_house}}}|{{#if:{{{state_delegate|}}}|{{{state_delegate}}}|U.S.}}}} {{#if:{{{state_delegate|}}}|House of Delegates|{{#if:{{{state_house|}}}| }}House of Representatives}}]]</span>{{#if:{{{district|}}}{{{state|}}}{{{state_delegate|}}}|<br />from {{#if:{{{state_delegate|}}}|the |{{#if:{{{state_house|}}}|{{#if:{{{district|}}}|the|{{{state|}}}}}|{{{state|}}}{{#if:{{{district|}}}|'s}}}}}}
}}}} {{#if:{{{district|}}}|{{{district}}} district|{{#if:{{{state_house|}}}|{{{constituency|}}}}}}}{{#if:{{{prior_term|}}}|
<br />{{{prior_term}}}}}
}}
}}
<!--------Convocation--------->
| header18 = {{#if:{{{convocation|}}}|{{{convocation}}}}}
<!--------Term--------->
| data19 = {{#if:{{{termend|}}}{{{succeeding|}}}{{{assuming|}}}|
{{#if:{{{status|}}}
| <div class="skin-nightmode-reset-color" style="width:100%; margin:0; color: black; background-color: {{{color|lavender}}}">'''{{{status}}}'''</div>|}}|
}}
| data20 = {{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{succeeding|}}}{{{assuming|}}}
| <span class="nowrap">'''Assuming office'''</span><br />{{{termstart}}}{{#if:{{{term|}}}{{{termend|}}}|[[Category:Pages using infobox officeholder with succeeding and term or termend]]}}
| {{#if: {{{term|}}} | <span class="nowrap">'''{{{termlabel|In office}}}'''</span><br />{{{term}}} {{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leading}} with {{#if:{{{alongside|}}}|{{{alongside}}}|{{{co-leader}}}}}</div>}} }}
}} }}
| data21 = {{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{succeeding|}}}{{{assuming|}}}
|
|{{#if:{{{termstart|}}}
| {{#if:{{{termend|}}}
|<!--then: term has start and end:--><span class="nowrap">'''{{{termlabel|In office}}}'''</span><br />{{en dash range|{{{termstart}}}|{{{termend}}}}}{{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leading}} with {{#if:{{{alongside|}}}|{{{alongside}}}|{{{co-leader}}}}}</div>}}
|{{#if:{{{status|}}}|<div class="skin-nightmode-reset-color" style="width:100%; margin:0; color: black; background-color: {{{color|lavender}}}">'''{{{status}}}'''</div>|<!--else: term is ongoing--><div class="skin-nightmode-reset-color" style="width:100%; margin:0; color: black; background-color: {{{color|lavender}}}">'''[[Incumbent]]'''</div>}}
}}
}}
}} }}
| data22 = {{#if:{{{nominee|}}}{{{candidate|}}}||
{{#if:{{{succeeding|}}}{{{assuming|}}}
|
|{{#if:{{{termstart|}}}
|{{#if:{{{termend|}}}
|<!--then nothing else; term has ended-->
|<!--else term is ongoing:--><span class="nowrap">'''{{#if:{{{termlabel|}}}|{{#invoke:String|replace|source={{{termlabel}}}|In office|Assumed office}}|Assumed office}}'''</span> <br />{{{termstart}}}{{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leader}} with {{#if:{{{alongside|}}}|{{{alongside}}}|{{{co-leader}}}}}</div>}}
}}
}}
}} }}
}} }}<!--
end infobox1 / start infobox2
-->{{#if:{{{monarch|}}}{{{president|}}}{{{governor-general|}}}{{{governor_general|}}}{{{primeminister|}}}{{{chancellor|}}}{{{minister|}}}{{{taoiseach|}}}{{{firstminister|}}}{{{chiefminister|}}}{{{premier|}}}{{{governor|}}}{{{lieutenant_governor|}}}{{{vicepresident|}}}{{{vicegovernor|}}}{{{viceprimeminister|}}}{{{vicepremier|}}}{{{deputy|}}}{{{leader|}}}{{{lieutenant|}}}{{{nominator|}}}{{{appointer|}}}{{{opponent|}}}{{{incumbent|}}}{{{succeeding|}}}{{{assuming|}}}{{{preceding|}}}{{{predecessor|}}}{{{preceded|}}}{{{successor|}}}{{{succeeded|}}}{{{parliamentarygroup|}}}{{{constituency|}}}{{{majority|}}}{{{suboffice|}}}{{{1namedata|}}}{{{2namedata|}}}{{{3namedata|}}}{{{4namedata|}}}{{{5namedata|}}}{{{runningmate|}}}|
{{#invoke:infobox|infoboxTemplate|child=yes
| labelstyle = text-align:left
| label1 = <span class="nowrap">Nominated by</span>
| data1 = {{{nominator|}}}
| label2 = <span class="nowrap">Appointed by</span>
| data2 = {{{appointer|}}}
<!--------President, Prime Minister, Governor--------->
| label3 = Monarch{{#if:{{detect singular|{{{monarch|}}}}}||s}}
| data3 = {{{monarch|}}}
| label4 = President
| data4 = {{{president|}}}
| label5 = {{#if:{{{governor_general|}}}|Governor{{#if:{{detect singular|{{{governor_general}}}}}||s}} General|Governor{{#if:{{detect singular|{{{governor-general}}}}}||s}}-General}}
| data5 = {{#if:{{{governor_general|}}}|{{{governor_general}}}|{{{governor-general|}}}}}
| label6 = <span class="nowrap">Prime Minister</span>
| data6 = {{{primeminister|}}}
| label7 = Chancellor
| data7 = {{{chancellor|}}}
| label8 = Minister
| data8 = {{{minister|}}}
| label9 = Taoiseach
| data9 = {{{taoiseach|}}}
| label10 = <span class="nowrap">First Minister</span>
| data10 = {{{firstminister|}}}
| label11 = <span class="nowrap">Chief Minister</span>
| data11 = {{{chiefminister|}}}
| label12 = Premier
| data12 = {{{premier|}}}
| label13 = Governor
| data13 = {{{governor|}}}
| label14 = Lieutenant Governor
| data14 = {{{lieutenant_governor|}}}
<!--------Vice president/s, Vice Prime Minister/s, Deputy/ies, Lieutenant/s--------->
| label15 = <span class="nowrap">{{#if:{{{vicepresident|}}}|{{#ifeq:{{Linkless exists|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Vice|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice President]]|Vice President}}|Vice President}}</span>
| data15 = {{{vicepresident|}}}
| label16 = <span class="nowrap">{{#if:{{{vicegovernor|}}}|{{#ifeq:{{Linkless exists|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Vice|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice Governor]]|Vice Governor}}|Vice Governor}}</span>
| data16 = {{{vicegovernor|}}}
| label17 = <span class="nowrap">{{#if:{{{viceprimeminister|}}}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice PM]]|Vice [[Prime Minister|PM]]}}</span>
| data17 = {{{viceprimeminister|}}}
| label18 = <span class="nowrap">{{#if:{{{vicepremier|}}}|{{#ifeq:{{Linkless exists|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Vice|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Vice {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Vice Premier]]|Vice Premier}}|Vice Premier}}</span>
| data18 = {{{vicepremier|}}}
| label19 = {{#if:{{{deputy|}}}|{{#ifeq:{{Linkless exists|Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}|{{#ifeq:{{#invoke:Redirect|main|fulltext=1|{{#ifeq:Deputy|Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}||Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}}}|{{#invoke:Redirect|main|fulltext=1|{{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||{{#if:{{#invoke:Disambiguation|isDisambiguationPage|Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}}}||true}} }}|[[Deputy {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Deputy]]|Deputy}}|Deputy}}
| data19 = {{{deputy|}}}
| label20 = Leader
| data20 = {{{leader|}}}
| label21 = {{#if:{{{office|}}}|[[Lieutenant {{#invoke:delink|delink|{{{office}}}|wikilinks=target}}|Lieutenant]]|Lieutenant}}
| data21 = {{{lieutenant|}}}
| label22 = {{nowrap|{{{subterm|}}}}}
| data22 = {{{suboffice|}}}
<!--------Blank fields--------->
| label23 = {{{1blankname|}}}
| data23 = {{{1namedata|}}}
| label24 = {{{2blankname|}}}
| data24 = {{{2namedata|}}}
| label25 = {{{3blankname|}}}
| data25 = {{{3namedata|}}}
| label26 = {{{4blankname|}}}
| data26 = {{{4namedata|}}}
| label27 = {{{5blankname|}}}
| data27 = {{{5namedata|}}}
<!--------Predecessor/successor--------->
| label28 = <span class="nowrap">Running mate</span>
| data28 = {{{runningmate|}}}
| label29 = Opponent{{#invoke:Detect singular|pluralize|{{{opponent|}}}|likely=(s)|plural=s}}
| data29 = {{{opponent|}}}
| label30 = Incumbent
| data30 = {{{incumbent|}}}
| label31 = {{#if:{{{succeeding|}}}|Succeeding|Preceding}}
| data31 = {{#if:{{{succeeding|}}}|{{{succeeding|}}}|{{{preceding|}}}}}
| label32 = <span class="nowrap">Preceded by</span>
| data32 = {{#if:{{{succeeding|}}}||{{#if:{{{predecessor|}}}|{{{predecessor}}}|{{{preceded|}}}}}}}
| label33 = <span class="nowrap">Succeeded by</span>
| data33 = {{#if:{{{succeeding|}}}||{{#switch:{{#if:{{{successor|}}}|{{{successor}}}|{{{succeeded|}}}}}
| Incumbent
| '''Incumbent'''
| ''Incumbent''
| [[Incumbent]]
| incumbent
| '''incumbent'''
| ''incumbent''
| [[incumbent]] =
| #default = {{#if:{{{successor|}}}|{{{successor}}}|{{{succeeded|}}}}}
}}}}
<!--------Constituency/Majority--------->
| label34 = [[Parliamentary group]]
| data34 = {{{parliamentarygroup|}}}
| label35 = Constituency
| data35 = {{#if:{{{state_house|}}}||{{{constituency|}}}}}
| label36 = Majority
| data36 = {{{majority|}}}
}} }}<noinclude>{{documentation}}</noinclude>
f40hzfv7nd35naztshh69vudaa6gpee
Tempilet:Both
10
2584
33220
2024-06-15T14:15:23Z
en>Explicit
0
[[Wikipedia:Templates for discussion/Log/2024 June 8#Template:Both]] closed as keep ([[WP:XFDC#4.0.15|XFDcloser]])
33220
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{SAFESUBST:<noinclude />#if:{{{2|}}}|1}}}}<noinclude>
{{documentation}}
</noinclude>
a92g9dgn74wuyygsul02g6cnq29em4t
33221
33220
2026-11-11T21:49:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Both]]
33220
wikitext
text/x-wiki
{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{SAFESUBST:<noinclude />#if:{{{2|}}}|1}}}}<noinclude>
{{documentation}}
</noinclude>
a92g9dgn74wuyygsul02g6cnq29em4t
Tempilet:Title disambig text
10
2585
33222
2022-03-08T02:00:55Z
en>Neveselbert
0
safesubst
33222
wikitext
text/x-wiki
{{safesubst<noinclude/>:#invoke:String|match|{{{1|{{PAGENAME}}}}}|%s%((.-%)?)%)||-1|ignore_errors=true}}<noinclude>
{{Documentation}}
</noinclude>
14z0r6ucrqpdpocl3gu9b10htz9mv4a
33223
33222
2026-11-11T21:49:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Title_disambig_text]]
33222
wikitext
text/x-wiki
{{safesubst<noinclude/>:#invoke:String|match|{{{1|{{PAGENAME}}}}}|%s%((.-%)?)%)||-1|ignore_errors=true}}<noinclude>
{{Documentation}}
</noinclude>
14z0r6ucrqpdpocl3gu9b10htz9mv4a
Tempilet:Nobold/styles.css
10
2586
33226
2019-03-03T23:43:41Z
en>Pppery
0
Adding protection template
33226
sanitized-css
text/css
/* {{pp-template}} */
/* Styling for Template:Nobold */
.nobold {
font-weight: normal;
}
fenpgkszzubv5v79v09z2871g8mgdmr
33227
33226
2026-11-11T21:49:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Nobold/styles.css]]
33226
sanitized-css
text/css
/* {{pp-template}} */
/* Styling for Template:Nobold */
.nobold {
font-weight: normal;
}
fenpgkszzubv5v79v09z2871g8mgdmr
Tempilet:En dash range
10
2587
33228
2023-11-27T07:16:16Z
en>Neveselbert
0
Undid revision 1187066278 by [[Special:Contributions/Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]]) - ref issue
33228
wikitext
text/x-wiki
{{{1}}}{{#ifeq:{{#invoke:String|find|source={{#invoke:Plain text|main|{{{1}}}{{{2}}}}}|target=[%s–—-]|plain=false}}|0|–| – }}{{{2}}}<noinclude>
{{Documentation}}
</noinclude>
98em1kvd7xkqe6sagrl2kj31kdmyeiw
33229
33228
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:En_dash_range]]
33228
wikitext
text/x-wiki
{{{1}}}{{#ifeq:{{#invoke:String|find|source={{#invoke:Plain text|main|{{{1}}}{{{2}}}}}|target=[%s–—-]|plain=false}}|0|–| – }}{{{2}}}<noinclude>
{{Documentation}}
</noinclude>
98em1kvd7xkqe6sagrl2kj31kdmyeiw
Module:Detect singular
828
2588
33232
2025-10-16T06:01:56Z
en>Hike395
0
handle ampersand the same as "and"
33232
Scribunto
text/plain
local p = {}
local getArgs = require('Module:Arguments').getArgs
local yesNo = require('Module:Yesno')
-- function to determine whether "sub" occurs in "s"
local function plainFind(s, sub)
return mw.ustring.find(s, sub, 1, true)
end
-- function to count the number of times "pattern" (a regex) occurs in "s"
local function countMatches(s, pattern)
local _, count = mw.ustring.gsub(s, pattern, '')
return count
end
local singular = 1
local likelyPlural = 2
local plural = 3
-- Determine whether a string is singular or plural (i.e., it represents one
-- item or many)
-- Arguments:
-- origArgs[1]: string to process
-- origArgs.no_comma: if false, use commas to detect plural (default false)
-- origArgs.parse_links: if false, treat wikilinks as opaque singular objects (default false)
-- origArgs.any_comma: if true, allow any comma to cause likely plural, including ones between digits (default false)
-- origArgs.no_and: if false, use existence of "and" to detect plural (default false)
-- origArgs.parse_number: if true, parse number in argument: if 1, singular; if >1, plural (default false)
-- Returns:
-- singular, likelyPlural, or plural (see constants above), or nil for completely unknown
function p._main(origArgs)
origArgs = type(origArgs) == 'table' and origArgs or {}
local args = {}
-- canonicalize boolean arguments
for key, default in pairs({no_comma=false,parse_links=false,any_comma=false,
no_and=false,parse_number=false}) do
if origArgs[key] == nil then
args[key] = default
else
args[key] = yesNo(origArgs[key],default)
end
end
local checkComma = not args.no_comma
local checkAnd = not args.no_and
local rewriteLinks = not args.parse_links
local anyComma = args.any_comma
local parseNumber = args.parse_number
local s = origArgs[1] -- the input string
if not s then
return nil -- empty input returns nil
end
s = tostring(s)
s = mw.text.decode(s,true) --- replace HTML entities (to avoid spurious semicolons)
if plainFind(s,'data-plural="0"') then -- magic data string to return true
return singular
end
if plainFind(s,'data-plural="1"') then -- magic data string to return false
return plural
end
-- count number of list items
local numListItems = countMatches(s,'<%s*li')
-- if exactly one, then singular, if more than one, then plural
if numListItems == 1 then
return singular
end
if numListItems > 1 then
return plural
end
-- if "list of" occurs inside of wlink, then it's plural
if mw.ustring.find(s:lower(), '%[%[[^%]]*list of[^%]]+%]%]') then
return plural
end
if parseNumber then
local m = tonumber(mw.ustring.match(s,"^%s*(%d+)"))
if m then
return m > 1 and plural or singular
end
end
-- fix for trailing br tags passed through [[template:marriage]]
s = mw.ustring.gsub(s, '<%s*br[^>]*>%s*(</div>)', '%1')
-- replace all wikilinks with fixed string
if rewriteLinks then
s = mw.ustring.gsub(s,'%b[]','WIKILINK')
end
-- Five conditions: any one of them can make the string a likely plural or plural
local hasBreak = mw.ustring.find(s,'<%s*br')
-- For the last 4, evaluate on string stripped of wikimarkup
local getPlain = require('Module:Text').Text().getPlain
s = getPlain(s)
local hasBullets = countMatches(s,'%*+') > 1
local multipleQids = mw.ustring.find(s,'Q%d+[%p%s]+Q%d+') -- has multiple QIDs in a row
if hasBullets or multipleQids then
return plural
end
local commaPattern = anyComma and '[,;]' or '%D[,;]%D' -- semi-colon similar to comma
local hasComma = checkComma and mw.ustring.find(s, commaPattern)
local hasAnd = checkAnd and (mw.ustring.find(s,'[,%s]and%s') or mw.ustring.find(s,'&',1,true))
if hasBreak or hasComma or hasAnd then
return likelyPlural
end
return singular
end
function p._pluralize(args)
args = type(args) == 'table' and args or {}
local singularForm = args[3] or args.singular or ""
local pluralForm = args[4] or args.plural or ""
local likelyForm = args.likely or pluralForm
local link = args[5] or args.link
if link then
link = tostring(link)
singularForm = '[['..link..'|'..singularForm..']]'
pluralForm = '[['..link..'|'..pluralForm..']]'
likelyForm = '[['..link..'|'..likelyForm..']]'
end
if args[2] then
return pluralForm
end
local detect = p._main(args)
if detect == nil then
return "" -- return blank on complete failure
end
if detect == singular then
return singularForm
elseif detect == likelyPlural then
return likelyForm
else
return pluralForm
end
end
function p.main(frame)
local args = getArgs(frame)
-- For template, return 1 if singular, blank if plural or empty
local result = p._main(args)
if result == nil then
return 1
end
return result == singular and 1 or ""
end
function p.pluralize(frame)
local args = getArgs(frame)
return p._pluralize(args)
end
return p
ks2mlneszbgw2vr1nl2rhac5ypdp5y2
33233
33232
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Detect_singular]]
33232
Scribunto
text/plain
local p = {}
local getArgs = require('Module:Arguments').getArgs
local yesNo = require('Module:Yesno')
-- function to determine whether "sub" occurs in "s"
local function plainFind(s, sub)
return mw.ustring.find(s, sub, 1, true)
end
-- function to count the number of times "pattern" (a regex) occurs in "s"
local function countMatches(s, pattern)
local _, count = mw.ustring.gsub(s, pattern, '')
return count
end
local singular = 1
local likelyPlural = 2
local plural = 3
-- Determine whether a string is singular or plural (i.e., it represents one
-- item or many)
-- Arguments:
-- origArgs[1]: string to process
-- origArgs.no_comma: if false, use commas to detect plural (default false)
-- origArgs.parse_links: if false, treat wikilinks as opaque singular objects (default false)
-- origArgs.any_comma: if true, allow any comma to cause likely plural, including ones between digits (default false)
-- origArgs.no_and: if false, use existence of "and" to detect plural (default false)
-- origArgs.parse_number: if true, parse number in argument: if 1, singular; if >1, plural (default false)
-- Returns:
-- singular, likelyPlural, or plural (see constants above), or nil for completely unknown
function p._main(origArgs)
origArgs = type(origArgs) == 'table' and origArgs or {}
local args = {}
-- canonicalize boolean arguments
for key, default in pairs({no_comma=false,parse_links=false,any_comma=false,
no_and=false,parse_number=false}) do
if origArgs[key] == nil then
args[key] = default
else
args[key] = yesNo(origArgs[key],default)
end
end
local checkComma = not args.no_comma
local checkAnd = not args.no_and
local rewriteLinks = not args.parse_links
local anyComma = args.any_comma
local parseNumber = args.parse_number
local s = origArgs[1] -- the input string
if not s then
return nil -- empty input returns nil
end
s = tostring(s)
s = mw.text.decode(s,true) --- replace HTML entities (to avoid spurious semicolons)
if plainFind(s,'data-plural="0"') then -- magic data string to return true
return singular
end
if plainFind(s,'data-plural="1"') then -- magic data string to return false
return plural
end
-- count number of list items
local numListItems = countMatches(s,'<%s*li')
-- if exactly one, then singular, if more than one, then plural
if numListItems == 1 then
return singular
end
if numListItems > 1 then
return plural
end
-- if "list of" occurs inside of wlink, then it's plural
if mw.ustring.find(s:lower(), '%[%[[^%]]*list of[^%]]+%]%]') then
return plural
end
if parseNumber then
local m = tonumber(mw.ustring.match(s,"^%s*(%d+)"))
if m then
return m > 1 and plural or singular
end
end
-- fix for trailing br tags passed through [[template:marriage]]
s = mw.ustring.gsub(s, '<%s*br[^>]*>%s*(</div>)', '%1')
-- replace all wikilinks with fixed string
if rewriteLinks then
s = mw.ustring.gsub(s,'%b[]','WIKILINK')
end
-- Five conditions: any one of them can make the string a likely plural or plural
local hasBreak = mw.ustring.find(s,'<%s*br')
-- For the last 4, evaluate on string stripped of wikimarkup
local getPlain = require('Module:Text').Text().getPlain
s = getPlain(s)
local hasBullets = countMatches(s,'%*+') > 1
local multipleQids = mw.ustring.find(s,'Q%d+[%p%s]+Q%d+') -- has multiple QIDs in a row
if hasBullets or multipleQids then
return plural
end
local commaPattern = anyComma and '[,;]' or '%D[,;]%D' -- semi-colon similar to comma
local hasComma = checkComma and mw.ustring.find(s, commaPattern)
local hasAnd = checkAnd and (mw.ustring.find(s,'[,%s]and%s') or mw.ustring.find(s,'&',1,true))
if hasBreak or hasComma or hasAnd then
return likelyPlural
end
return singular
end
function p._pluralize(args)
args = type(args) == 'table' and args or {}
local singularForm = args[3] or args.singular or ""
local pluralForm = args[4] or args.plural or ""
local likelyForm = args.likely or pluralForm
local link = args[5] or args.link
if link then
link = tostring(link)
singularForm = '[['..link..'|'..singularForm..']]'
pluralForm = '[['..link..'|'..pluralForm..']]'
likelyForm = '[['..link..'|'..likelyForm..']]'
end
if args[2] then
return pluralForm
end
local detect = p._main(args)
if detect == nil then
return "" -- return blank on complete failure
end
if detect == singular then
return singularForm
elseif detect == likelyPlural then
return likelyForm
else
return pluralForm
end
end
function p.main(frame)
local args = getArgs(frame)
-- For template, return 1 if singular, blank if plural or empty
local result = p._main(args)
if result == nil then
return 1
end
return result == singular and 1 or ""
end
function p.pluralize(frame)
local args = getArgs(frame)
return p._pluralize(args)
end
return p
ks2mlneszbgw2vr1nl2rhac5ypdp5y2
Tempilet:Infobox person/height
10
2589
33234
2019-09-26T15:11:11Z
en>Frietjes
0
use lua version for efficiency and readability, passes all tests in the testscases so seems fine
33234
wikitext
text/x-wiki
{{#invoke:person height|main}}<noinclude>
{{Documentation}}
</noinclude>
er0y8xmwd91jl83h0g23bm3e8psjplm
33235
33234
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_person/height]]
33234
wikitext
text/x-wiki
{{#invoke:person height|main}}<noinclude>
{{Documentation}}
</noinclude>
er0y8xmwd91jl83h0g23bm3e8psjplm
Module:Person height
828
2590
33236
2025-12-10T11:10:59Z
en>S.A. Julio
0
allow conversion for heights improperly formatted with a comma, such as 1,82 m
33236
Scribunto
text/plain
-- This module implements [[Template:Infobox person/height]]
local p = {}
local function splitsuffix(s)
local suffix = ''
if mw.ustring.match(s,'^(.-)(<sup.*)$') then
local a = mw.ustring.gsub(s, '^(.-)(<sup.*)$', '%1')
local b = mw.ustring.gsub(s, '^(.-)(<sup.*)$', '%2')
s = a
suffix = b .. suffix
end
if mw.ustring.match(s,'^(.-)(%[%[[Cc]ategory:.*)$') then
local a = mw.ustring.gsub(s, '^(.-)(%[%[[Cc]ategory:.*)$', '%1')
local b = mw.ustring.gsub(s, '^(.-)(%[%[[Cc]ategory:.*)$', '%2')
s = a
suffix = b .. suffix
end
return s, suffix
end
local function clean(s)
s = mw.ustring.gsub(s, '(%d),(%d)', '%1.%2')
s = mw.ustring.gsub(s, '[Mm]etre', 'm')
s = mw.ustring.gsub(s, '([^a])meter', '%1m') -- prevents "parameter" from being changed to "param"
s = mw.ustring.gsub(s, '[Cc]enti', 'c') -- changes "centim" to "cm"
s = mw.ustring.gsub(s, 'ms', 'm')
s = mw.ustring.gsub(s, 'm[%.,]', 'm')
s = mw.ustring.gsub(s, '[Ff]eet', 'ft')
s = mw.ustring.gsub(s, 'foot', 'ft')
s = mw.ustring.gsub(s, 'ft[%.,]', 'ft')
s = mw.ustring.gsub(s, '[Ii]nches', 'in')
s = mw.ustring.gsub(s, '[Ii]nch', 'in')
s = mw.ustring.gsub(s, 'ins', 'in')
s = mw.ustring.gsub(s, 'in[%.,]', 'in')
s = mw.ustring.gsub(s, '%[%[[Mm]%]%]s', '[[Metre|m]]')
s = mw.ustring.gsub(s, '%[%[[Mm]|[Mm]%]%]', '[[Metre|m]]')
s = mw.ustring.gsub(s, '%[%[[Cc]m%]%]s', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[[Cc]m|[Cc]m%]%]', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[[Cc]entim|cm%]%]', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[[Ii]n|in%]%]', '[[inch|in]]')
s = mw.ustring.gsub(s, '(%d)%s+[Cc][Mm]', '%1 cm')
s = mw.ustring.gsub(s, '(%d)%s+[Mm]', '%1 m')
s = mw.ustring.gsub(s, '(%d)%s+[Ff][Tt]', '%1 ft')
s = mw.ustring.gsub(s, '(%d)%s+[Ii][Nn]', '%1 in')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Cc][Mm]', '%1cm')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Mm]', '%1m')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Ff][Tt]', '%1ft')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Ii][Nn]', '%1in')
s = mw.ustring.gsub(s, '(%d)%s*[′\']%s*([%d]%d*)%s*[\"″]', '%1 ft %2 in')
return s
end
local function isnumber(s)
if s then
s = mw.ustring.gsub(s, '%+%s*%d+%s*/%s*%d+%s*$', '')
s = mw.ustring.gsub(s, '%s*1%s*/%s*2%s*$', '0.5')
return tonumber(s)
end
return nil
end
local function trimspace(s)
if s then
s = mw.ustring.gsub(s, '^%s*(.-)%s*$', '%1')
end
return s
end
local function force_unit(s, t)
s = mw.ustring.gsub(s, '&[Nn][Bb][Ss][Pp];', '★')
if (t == 'cm') then
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)(%d+[★%s]+)m', '%1%2.%3cm')
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)(%d+[★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%1%2.%3[[centimetre|cm]]')
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)([★%s]+)m', '%1%2%3cm')
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%1%2%3[[centimetre|cm]]')
s = mw.ustring.gsub(s, '(%d*)%.(%d)([★%s]+)m', '%1%20%3cm')
s = mw.ustring.gsub(s, '(%d*)%.(%d)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%1%20%3[[centimetre|cm]]')
s = mw.ustring.gsub(s, '(%d*)%.([★%s]+)m', '%100.%2cm')
s = mw.ustring.gsub(s, '(%d*)%.([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%100.%2[[centimetre|cm]]')
s = mw.ustring.gsub(s, '^(%s*%d+)([★%s]+)m', '%100%2cm')
s = mw.ustring.gsub(s, '([%(★%s]%d+)([★%s]+)m', '%100%2cm')
s = mw.ustring.gsub(s, '^(%s*%d+)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%100%2[[centimetre|cm]]')
s = mw.ustring.gsub(s, '([%(★%s]%d+)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%100%2[[centimetre|cm]]')
s = mw.ustring.gsub(s, '0(%d+%.?%d*[★%s]+cm)', '%1')
s = mw.ustring.gsub(s, '0(%d+%.?%d*[★%s]+%[%[[Cc]entimet[re][re]|cm%]%])', '%1')
else
s = mw.ustring.gsub(s, '(%d)(%d%d)%.(%d*[★%s]+)cm', '%1.%2%3m')
s = mw.ustring.gsub(s, '(%d)(%d%d)%.(%d*[★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '%1.%2%3[[metre|m]]')
s = mw.ustring.gsub(s, '(%d)(%d%d)([★%s]+)cm', '%1.%2%3m')
s = mw.ustring.gsub(s, '(%d)(%d%d)([★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '%1.%2%3[[metre|m]]')
s = mw.ustring.gsub(s, '(%d%d)%.(%d*[★%s]+)cm', '0.%1%2m')
s = mw.ustring.gsub(s, '(%d%d)%.(%d*[★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '0.%1%2[[metre|m]]')
s = mw.ustring.gsub(s, '(%d%d)([★%s]+)cm', '0.%1%2m')
s = mw.ustring.gsub(s, '(%d%d)([★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '0.%1%2[[metre|m]]')
end
s = mw.ustring.gsub(s, '★', ' ')
return s
end
local function get_convert_args(s, prefer, enforce, ri)
local prefer_m = (prefer or '') == 'm'
local force_m = (enforce or '') == 'm'
local prefer_cm = (prefer or '') == 'cm'
local force_cm = (enforce or '') == 'cm'
ri = (ri or '') == 'cmin' and 'cmin' or ''
unconverted = clean(s or '') -- basic unit cleaning
s = mw.ustring.gsub(unconverted, '&[Nn][Bb][Ss][Pp];', ' ')
local m = mw.ustring.find(s, 'm')
local c = mw.ustring.find(s, 'cm')
local f = mw.ustring.find(s, 'ft')
local i = mw.ustring.find(s, 'in')
if m == nil and f == nil and i == nil then
return '', unconverted
end
local adj = nil
if c ~= nil and f == nil and i == nil then
local n = mw.ustring.sub(s, 1, c - 1)
if isnumber(n) then
if force_m then
local prec = require("Module:Math")._precision(trimspace(n))
adj = (prec == 1) and 'ri3' or 'ri2'
end
if ri ~= '' then
adj = force_m and 'ri2' or 'ri0'
end
return force_m
and {n/100,'m','ftin',0,['abbr']='on', ['adj']=adj}
or {n,'cm','ftin',0,['abbr']='on', ['adj']=adj}, mw.ustring.sub(s, c+2)
end
return '', unconverted
end
if m ~= nil and c == nil and f == nil and i == nil then
local n = mw.ustring.sub(s, 1, m - 1)
if ri ~= '' then
adj = force_cm and 'ri0' or 'ri2'
end
if isnumber(n) then
return force_cm
and {n*100,'cm','ftin',0,['abbr']='on',['adj']=adj}
or {n,'m','ftin',0,['abbr']='on',['adj']=adj}, mw.ustring.sub(s, m+1)
end
return '', unconverted
end
if f ~= nil and i ~=nil and m == nil then
local n1 = mw.ustring.sub(s, 1, f - 1)
local n2 = mw.ustring.sub(s, f+2, i - 1)
if isnumber(n1) and isnumber(n2) then
if ri ~= '' then
adj = 'ri0'
end
return (force_m or prefer_m)
and {n1,'ft',n2,'in', 'm',2,['abbr']='on',['adj']=adj}
or {n1,'ft',n2,'in', 'cm',0,['abbr']='on',['adj']=adj}, mw.ustring.sub(s, i+2)
end
return '', unconverted
end
if f ~= nil and i == nil and m == nil then
local n = mw.ustring.sub(s, 1, f - 1)
if isnumber(n) then
if ri ~= '' then
local n2 = 12*(n - math.floor(n))
adj = 'ri0'
return (force_m or prefer_m)
and {math.floor(n),'ft',n2, 'in','m',2,['abbr']='on',['adj']=adj}
or {math.floor(n),'ft',n2,'in','cm',0,['abbr']='on',['adj']=adj}, mw.ustring.sub(s, f+2)
end
return (force_m or prefer_m)
and {n,'ft','m',2,['abbr']='on'}
or {n,'ft','cm',0,['abbr']='on'}, mw.ustring.sub(s, f+2)
end
return '', unconverted
end
if i ~= nil and f == nil and m == nil then
local n = mw.ustring.sub(s, 1, i - 1)
if isnumber(n) then
if ri ~= '' then
adj = 'ri0'
end
return (force_m or prefer_m)
and {n,'in','m',2,['abbr']='on'}
or {n,'in','cm',0,['abbr']='on'}, mw.ustring.sub(s, i+2)
end
return '', unconverted
end
if force_cm and c == nil then
return '', force_unit(unconverted, 'cm')
end
if force_m and c ~= nil then
return '', force_unit(unconverted, 'm')
end
return '', unconverted
end
function convert(frame, args)
local str, suffix = splitsuffix(args[1] or '')
local targs, str = get_convert_args(str, args['prefer'] or '', args['enforce'] or '', args['ri'] or '')
str = str .. suffix
if type(targs) == 'table' then
return frame:expandTemplate{ title = 'convert', args = targs} .. str
else
return str
end
end
function p.main(frame)
return convert(frame, frame.args[1] and frame.args or frame:getParent().args)
end
return p
qnnushq2vmu70yabmkyqw9wjixj1a0z
33237
33236
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Person_height]]
33236
Scribunto
text/plain
-- This module implements [[Template:Infobox person/height]]
local p = {}
local function splitsuffix(s)
local suffix = ''
if mw.ustring.match(s,'^(.-)(<sup.*)$') then
local a = mw.ustring.gsub(s, '^(.-)(<sup.*)$', '%1')
local b = mw.ustring.gsub(s, '^(.-)(<sup.*)$', '%2')
s = a
suffix = b .. suffix
end
if mw.ustring.match(s,'^(.-)(%[%[[Cc]ategory:.*)$') then
local a = mw.ustring.gsub(s, '^(.-)(%[%[[Cc]ategory:.*)$', '%1')
local b = mw.ustring.gsub(s, '^(.-)(%[%[[Cc]ategory:.*)$', '%2')
s = a
suffix = b .. suffix
end
return s, suffix
end
local function clean(s)
s = mw.ustring.gsub(s, '(%d),(%d)', '%1.%2')
s = mw.ustring.gsub(s, '[Mm]etre', 'm')
s = mw.ustring.gsub(s, '([^a])meter', '%1m') -- prevents "parameter" from being changed to "param"
s = mw.ustring.gsub(s, '[Cc]enti', 'c') -- changes "centim" to "cm"
s = mw.ustring.gsub(s, 'ms', 'm')
s = mw.ustring.gsub(s, 'm[%.,]', 'm')
s = mw.ustring.gsub(s, '[Ff]eet', 'ft')
s = mw.ustring.gsub(s, 'foot', 'ft')
s = mw.ustring.gsub(s, 'ft[%.,]', 'ft')
s = mw.ustring.gsub(s, '[Ii]nches', 'in')
s = mw.ustring.gsub(s, '[Ii]nch', 'in')
s = mw.ustring.gsub(s, 'ins', 'in')
s = mw.ustring.gsub(s, 'in[%.,]', 'in')
s = mw.ustring.gsub(s, '%[%[[Mm]%]%]s', '[[Metre|m]]')
s = mw.ustring.gsub(s, '%[%[[Mm]|[Mm]%]%]', '[[Metre|m]]')
s = mw.ustring.gsub(s, '%[%[[Cc]m%]%]s', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[[Cc]m|[Cc]m%]%]', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[[Cc]entim|cm%]%]', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[[Ii]n|in%]%]', '[[inch|in]]')
s = mw.ustring.gsub(s, '(%d)%s+[Cc][Mm]', '%1 cm')
s = mw.ustring.gsub(s, '(%d)%s+[Mm]', '%1 m')
s = mw.ustring.gsub(s, '(%d)%s+[Ff][Tt]', '%1 ft')
s = mw.ustring.gsub(s, '(%d)%s+[Ii][Nn]', '%1 in')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Cc][Mm]', '%1cm')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Mm]', '%1m')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Ff][Tt]', '%1ft')
s = mw.ustring.gsub(s, '(%d&[Nn][Bb][Ss][Pp];)[Ii][Nn]', '%1in')
s = mw.ustring.gsub(s, '(%d)%s*[′\']%s*([%d]%d*)%s*[\"″]', '%1 ft %2 in')
return s
end
local function isnumber(s)
if s then
s = mw.ustring.gsub(s, '%+%s*%d+%s*/%s*%d+%s*$', '')
s = mw.ustring.gsub(s, '%s*1%s*/%s*2%s*$', '0.5')
return tonumber(s)
end
return nil
end
local function trimspace(s)
if s then
s = mw.ustring.gsub(s, '^%s*(.-)%s*$', '%1')
end
return s
end
local function force_unit(s, t)
s = mw.ustring.gsub(s, '&[Nn][Bb][Ss][Pp];', '★')
if (t == 'cm') then
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)(%d+[★%s]+)m', '%1%2.%3cm')
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)(%d+[★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%1%2.%3[[centimetre|cm]]')
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)([★%s]+)m', '%1%2%3cm')
s = mw.ustring.gsub(s, '(%d*)%.(%d%d)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%1%2%3[[centimetre|cm]]')
s = mw.ustring.gsub(s, '(%d*)%.(%d)([★%s]+)m', '%1%20%3cm')
s = mw.ustring.gsub(s, '(%d*)%.(%d)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%1%20%3[[centimetre|cm]]')
s = mw.ustring.gsub(s, '(%d*)%.([★%s]+)m', '%100.%2cm')
s = mw.ustring.gsub(s, '(%d*)%.([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%100.%2[[centimetre|cm]]')
s = mw.ustring.gsub(s, '^(%s*%d+)([★%s]+)m', '%100%2cm')
s = mw.ustring.gsub(s, '([%(★%s]%d+)([★%s]+)m', '%100%2cm')
s = mw.ustring.gsub(s, '^(%s*%d+)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%100%2[[centimetre|cm]]')
s = mw.ustring.gsub(s, '([%(★%s]%d+)([★%s]+)%[%[[Mm]et[re][re]|m%]%]', '%100%2[[centimetre|cm]]')
s = mw.ustring.gsub(s, '0(%d+%.?%d*[★%s]+cm)', '%1')
s = mw.ustring.gsub(s, '0(%d+%.?%d*[★%s]+%[%[[Cc]entimet[re][re]|cm%]%])', '%1')
else
s = mw.ustring.gsub(s, '(%d)(%d%d)%.(%d*[★%s]+)cm', '%1.%2%3m')
s = mw.ustring.gsub(s, '(%d)(%d%d)%.(%d*[★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '%1.%2%3[[metre|m]]')
s = mw.ustring.gsub(s, '(%d)(%d%d)([★%s]+)cm', '%1.%2%3m')
s = mw.ustring.gsub(s, '(%d)(%d%d)([★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '%1.%2%3[[metre|m]]')
s = mw.ustring.gsub(s, '(%d%d)%.(%d*[★%s]+)cm', '0.%1%2m')
s = mw.ustring.gsub(s, '(%d%d)%.(%d*[★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '0.%1%2[[metre|m]]')
s = mw.ustring.gsub(s, '(%d%d)([★%s]+)cm', '0.%1%2m')
s = mw.ustring.gsub(s, '(%d%d)([★%s]+)%[%[[Cc]entimet[re][re]|cm%]%]', '0.%1%2[[metre|m]]')
end
s = mw.ustring.gsub(s, '★', ' ')
return s
end
local function get_convert_args(s, prefer, enforce, ri)
local prefer_m = (prefer or '') == 'm'
local force_m = (enforce or '') == 'm'
local prefer_cm = (prefer or '') == 'cm'
local force_cm = (enforce or '') == 'cm'
ri = (ri or '') == 'cmin' and 'cmin' or ''
unconverted = clean(s or '') -- basic unit cleaning
s = mw.ustring.gsub(unconverted, '&[Nn][Bb][Ss][Pp];', ' ')
local m = mw.ustring.find(s, 'm')
local c = mw.ustring.find(s, 'cm')
local f = mw.ustring.find(s, 'ft')
local i = mw.ustring.find(s, 'in')
if m == nil and f == nil and i == nil then
return '', unconverted
end
local adj = nil
if c ~= nil and f == nil and i == nil then
local n = mw.ustring.sub(s, 1, c - 1)
if isnumber(n) then
if force_m then
local prec = require("Module:Math")._precision(trimspace(n))
adj = (prec == 1) and 'ri3' or 'ri2'
end
if ri ~= '' then
adj = force_m and 'ri2' or 'ri0'
end
return force_m
and {n/100,'m','ftin',0,['abbr']='on', ['adj']=adj}
or {n,'cm','ftin',0,['abbr']='on', ['adj']=adj}, mw.ustring.sub(s, c+2)
end
return '', unconverted
end
if m ~= nil and c == nil and f == nil and i == nil then
local n = mw.ustring.sub(s, 1, m - 1)
if ri ~= '' then
adj = force_cm and 'ri0' or 'ri2'
end
if isnumber(n) then
return force_cm
and {n*100,'cm','ftin',0,['abbr']='on',['adj']=adj}
or {n,'m','ftin',0,['abbr']='on',['adj']=adj}, mw.ustring.sub(s, m+1)
end
return '', unconverted
end
if f ~= nil and i ~=nil and m == nil then
local n1 = mw.ustring.sub(s, 1, f - 1)
local n2 = mw.ustring.sub(s, f+2, i - 1)
if isnumber(n1) and isnumber(n2) then
if ri ~= '' then
adj = 'ri0'
end
return (force_m or prefer_m)
and {n1,'ft',n2,'in', 'm',2,['abbr']='on',['adj']=adj}
or {n1,'ft',n2,'in', 'cm',0,['abbr']='on',['adj']=adj}, mw.ustring.sub(s, i+2)
end
return '', unconverted
end
if f ~= nil and i == nil and m == nil then
local n = mw.ustring.sub(s, 1, f - 1)
if isnumber(n) then
if ri ~= '' then
local n2 = 12*(n - math.floor(n))
adj = 'ri0'
return (force_m or prefer_m)
and {math.floor(n),'ft',n2, 'in','m',2,['abbr']='on',['adj']=adj}
or {math.floor(n),'ft',n2,'in','cm',0,['abbr']='on',['adj']=adj}, mw.ustring.sub(s, f+2)
end
return (force_m or prefer_m)
and {n,'ft','m',2,['abbr']='on'}
or {n,'ft','cm',0,['abbr']='on'}, mw.ustring.sub(s, f+2)
end
return '', unconverted
end
if i ~= nil and f == nil and m == nil then
local n = mw.ustring.sub(s, 1, i - 1)
if isnumber(n) then
if ri ~= '' then
adj = 'ri0'
end
return (force_m or prefer_m)
and {n,'in','m',2,['abbr']='on'}
or {n,'in','cm',0,['abbr']='on'}, mw.ustring.sub(s, i+2)
end
return '', unconverted
end
if force_cm and c == nil then
return '', force_unit(unconverted, 'cm')
end
if force_m and c ~= nil then
return '', force_unit(unconverted, 'm')
end
return '', unconverted
end
function convert(frame, args)
local str, suffix = splitsuffix(args[1] or '')
local targs, str = get_convert_args(str, args['prefer'] or '', args['enforce'] or '', args['ri'] or '')
str = str .. suffix
if type(targs) == 'table' then
return frame:expandTemplate{ title = 'convert', args = targs} .. str
else
return str
end
end
function p.main(frame)
return convert(frame, frame.args[1] and frame.args or frame:getParent().args)
end
return p
qnnushq2vmu70yabmkyqw9wjixj1a0z
Tempilet:Linkless exists
10
2591
33238
2025-08-05T05:32:56Z
en>Theknightwho
0
Make substable.
33238
wikitext
text/x-wiki
{{safesubst:<noinclude/>#if:{{safesubst:<noinclude/>PROTECTIONEXPIRY:edit|{{{1|}}}}}|{{{2|true}}}|{{{3|}}}}}<noinclude>{{documentation}}</noinclude>
7zwd53pkzojmdk969m0b41cvyxmlea5
33239
33238
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Linkless_exists]]
33238
wikitext
text/x-wiki
{{safesubst:<noinclude/>#if:{{safesubst:<noinclude/>PROTECTIONEXPIRY:edit|{{{1|}}}}}|{{{2|true}}}|{{{3|}}}}}<noinclude>{{documentation}}</noinclude>
7zwd53pkzojmdk969m0b41cvyxmlea5
Module:ParameterCount
828
2592
33240
2017-02-11T14:32:57Z
en>Mr. Stradivarius
0
Protected "[[Module:ParameterCount]]": [[WP:High-risk templates|High-risk Lua module]]: 20,000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33240
Scribunto
text/plain
-- This module produces a count of all the arguments passed to it.
local yesno = require('Module:Yesno')
-- Trim a string
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
-- Test whether a string is blank
local function isBlank(s)
return not s:find('%S')
end
-- Tests whether a string is a valid positional key, and if so, returns it. If
-- the key is invalid, this returns nil.
local function isPositionalKey(s)
s = trim(s)
if s:find('^[1-9][0-9]*$') then
return tonumber(s)
end
end
-- Return the count of all arguments for which testFunc returns a truthy value.
local function count(args, testFunc)
local ret = 0
for key, val in pairs(args) do
if testFunc(key, val) then
ret = ret + 1
end
end
return ret
end
-- Check shared arguments and get the parent argument count.
local function main(frame, testFunc)
local blankifiedTestFunc
if yesno(frame.args.checkblanks) ~= false then
-- Extend the test function to check for blanks as well.
blankifiedTestFunc = function (key, val)
if not isBlank(val) then
return testFunc(key, val)
end
end
else
blankifiedTestFunc = testFunc
end
return count(frame:getParent().args, blankifiedTestFunc)
end
return {
-- Called with {{#invoke:ParameterCount|all}}
-- All specified parameters are counted, even those not supported by the
-- template.
all = function (frame)
return main(frame, function () return true end)
end,
-- Called with {{#invoke:ParameterCount|main}}
-- Users can specify a list of parameters to check, and a list of Lua
-- Ustring patterns to check each parameter against.
main = function (frame)
local args = frame.args
local keys, patterns = {}, {}
-- Get key list
for i, key in ipairs(args) do
local positionalKey = isPositionalKey(key)
if positionalKey then
keys[positionalKey] = true
else
keys[trim(key)] = true
end
end
-- Get patterns
do
local function getPattern(i)
local pattern = args['pattern' .. tostring(i)]
if pattern and pattern ~= '' then
return pattern
end
end
local i = 1
local pattern = getPattern(i)
while pattern do
patterns[i] = pattern
i = i + 1
pattern = getPattern(i)
end
end
-- Construct the test function
local testFunc = function (key, val)
if keys[key] then
return true
end
for i, pattern in ipairs(patterns) do
if mw.ustring.find(tostring(key), pattern) then
return true
end
end
return false
end
return main(frame, testFunc)
end
}
bo1vhgb6r7zni8qgcvzfnnphlmq92ml
33241
33240
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:ParameterCount]]
33240
Scribunto
text/plain
-- This module produces a count of all the arguments passed to it.
local yesno = require('Module:Yesno')
-- Trim a string
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
-- Test whether a string is blank
local function isBlank(s)
return not s:find('%S')
end
-- Tests whether a string is a valid positional key, and if so, returns it. If
-- the key is invalid, this returns nil.
local function isPositionalKey(s)
s = trim(s)
if s:find('^[1-9][0-9]*$') then
return tonumber(s)
end
end
-- Return the count of all arguments for which testFunc returns a truthy value.
local function count(args, testFunc)
local ret = 0
for key, val in pairs(args) do
if testFunc(key, val) then
ret = ret + 1
end
end
return ret
end
-- Check shared arguments and get the parent argument count.
local function main(frame, testFunc)
local blankifiedTestFunc
if yesno(frame.args.checkblanks) ~= false then
-- Extend the test function to check for blanks as well.
blankifiedTestFunc = function (key, val)
if not isBlank(val) then
return testFunc(key, val)
end
end
else
blankifiedTestFunc = testFunc
end
return count(frame:getParent().args, blankifiedTestFunc)
end
return {
-- Called with {{#invoke:ParameterCount|all}}
-- All specified parameters are counted, even those not supported by the
-- template.
all = function (frame)
return main(frame, function () return true end)
end,
-- Called with {{#invoke:ParameterCount|main}}
-- Users can specify a list of parameters to check, and a list of Lua
-- Ustring patterns to check each parameter against.
main = function (frame)
local args = frame.args
local keys, patterns = {}, {}
-- Get key list
for i, key in ipairs(args) do
local positionalKey = isPositionalKey(key)
if positionalKey then
keys[positionalKey] = true
else
keys[trim(key)] = true
end
end
-- Get patterns
do
local function getPattern(i)
local pattern = args['pattern' .. tostring(i)]
if pattern and pattern ~= '' then
return pattern
end
end
local i = 1
local pattern = getPattern(i)
while pattern do
patterns[i] = pattern
i = i + 1
pattern = getPattern(i)
end
end
-- Construct the test function
local testFunc = function (key, val)
if keys[key] then
return true
end
for i, pattern in ipairs(patterns) do
if mw.ustring.find(tostring(key), pattern) then
return true
end
end
return false
end
return main(frame, testFunc)
end
}
bo1vhgb6r7zni8qgcvzfnnphlmq92ml
Tempilet:Count
10
2593
33242
2022-08-11T14:32:42Z
en>Neveselbert
0
cr.
33242
wikitext
text/x-wiki
{{safesubst<noinclude/>:#ifexpr:{{safesubst<noinclude/>:#invoke:ParameterCount|main|pattern1=^[%d]+$}}>0|{{safesubst<noinclude/>:#invoke:ParameterCount|main|pattern1=^[%d]+$}}|{{{base|0}}}}}<noinclude>{{documentation}}</noinclude>
nxgj5k0v7d0slmbxwqstpth3pxp36v7
33243
33242
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Count]]
33242
wikitext
text/x-wiki
{{safesubst<noinclude/>:#ifexpr:{{safesubst<noinclude/>:#invoke:ParameterCount|main|pattern1=^[%d]+$}}>0|{{safesubst<noinclude/>:#invoke:ParameterCount|main|pattern1=^[%d]+$}}|{{{base|0}}}}}<noinclude>{{documentation}}</noinclude>
nxgj5k0v7d0slmbxwqstpth3pxp36v7
Tempilet:Flat list
10
2594
33244
2026-10-06T18:43:30Z
en>Xaosflux
0
update cat and note for new page name, requested on talk
33244
wikitext
text/x-wiki
<templatestyles src="Hlist/styles.css"/><div class="hlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}|
{{{1}}}
</div>}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using flat list with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Flat list]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | class | indent | style }}<noinclude></div><!-- Needed to prevent Linter errors here; when Flat list without parameters is used to start a list, End flat list provides the closing /div tag. -->
{{documentation}}
</noinclude>
ff7nhs3zgdrs1kad4gswl83mw2oshst
33245
33244
2026-11-11T21:49:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Flat_list]]
33244
wikitext
text/x-wiki
<templatestyles src="Hlist/styles.css"/><div class="hlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}|
{{{1}}}
</div>}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using flat list with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Flat list]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | class | indent | style }}<noinclude></div><!-- Needed to prevent Linter errors here; when Flat list without parameters is used to start a list, End flat list provides the closing /div tag. -->
{{documentation}}
</noinclude>
ff7nhs3zgdrs1kad4gswl83mw2oshst
Tempilet:CountryPrefixThe
10
2595
33246
2024-07-11T02:46:48Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:CountryPrefixThe]] to [[Template:Country prefix the]]: expand template name per [[WP:TPN]]
33246
wikitext
text/x-wiki
#REDIRECT [[Template:Country prefix the]]
{{Redirect category shell|
{{R from move}}
}}
kb39ebpmwk8otnglmn7cfj372wgyej0
33247
33246
2026-11-11T21:49:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:CountryPrefixThe]]
33246
wikitext
text/x-wiki
#REDIRECT [[Template:Country prefix the]]
{{Redirect category shell|
{{R from move}}
}}
kb39ebpmwk8otnglmn7cfj372wgyej0
Tempilet:Detect singular
10
2596
33248
2022-01-19T08:38:01Z
en>MSGJ
0
Changed protection settings for "[[Template:Detect singular]]": template protection should be adaquate ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33248
wikitext
text/x-wiki
{{#invoke:Detect singular|main}}<noinclude>
{{documentation}}
</noinclude>
1m3tane3jctch6sxq6slm654yiblfzf
33249
33248
2026-11-11T21:49:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Detect_singular]]
33248
wikitext
text/x-wiki
{{#invoke:Detect singular|main}}<noinclude>
{{documentation}}
</noinclude>
1m3tane3jctch6sxq6slm654yiblfzf
Tempilet:Generic template demo
10
2597
33250
2025-01-05T14:06:22Z
en>PrimeBOT
0
/* top */ [[User:PrimeBOT/24|Task 24]]: template replacement following [[Wikipedia:Templates_for_discussion/Log/2024_September_17#Template:R_fully_protected|a TFD]]
33250
wikitext
text/x-wiki
#REDIRECT [[Template:Parameter names example]]
{{R protected}}
[[Category:Wikipedia formatting templates]]
[[Category:Template namespace templates]]
[[Category:Documentation assistance templates]]
pi9a9f1dcnvzzyzzi90v5mp1zxra8sm
33251
33250
2026-11-11T21:49:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Generic_template_demo]]
33250
wikitext
text/x-wiki
#REDIRECT [[Template:Parameter names example]]
{{R protected}}
[[Category:Wikipedia formatting templates]]
[[Category:Template namespace templates]]
[[Category:Documentation assistance templates]]
pi9a9f1dcnvzzyzzi90v5mp1zxra8sm
Tempilet:UF-hcard-person
10
2598
33252
2026-10-19T14:39:27Z
en>Danny 1994
0
/* Classes */
33252
wikitext
text/x-wiki
The HTML markup produced by this template includes an [[HCard|hCard microformat]], which makes the person's details [[Parsing|parsable]] by computers, either acting automatically to catalogue articles across Wikipedia or via a browser tool operated by a reader, to (for example) add the subject to an address book or database. For more information about the use of [[microformat]]s on Wikipedia, please see [[Wikipedia:WikiProject Microformats|the microformat project]].
=== Sub-templates ===
Date-of-birth ("bday") information will only be included in the microformat if {{tl|birth date}}, or {{tl|birth date and age}} are used in the infobox. ([[Wikipedia:WikiProject Microformats/dates|Do not use these if the date is before 1583]]). Be cautious about using these if the person is still living, per [[WP:DOB]].
To include a URL, use [[Template:URL]], specifying the url as the value of unnamed param 1; example:
: <code><nowiki>{{URL|1=https://www.somedomain.com/foo/bar?q=weird_stuff&xyz=more_stuff}}</nowiki></code>.
'''Please do not remove instances of these sub-templates.'''
=== Classes ===
hCard uses HTML classes including:
{{Flat list|
*adr
*agent
*bday
*birthplace
*category
*country-name
*deathdate
*deathplace
*extended-address
*family-name
*fn (required)
*given-name
*honorific-prefix
*honorific-suffix
*label
*locality
*n
*nickname
*note
*org
*role
*url
*vcard
}}
'''Please do not rename or remove these classes nor collapse nested elements which use them.'''<includeonly>{{#ifeq:{{SUBPAGENAME}}|doc | |{{#ifeq:{{SUBPAGENAME}}|sandbox | |[[Category:Templates generating hCards]]}} }}</includeonly><noinclude>
[[Category:Templates generating hCards]]
[[Category:Microformat message templates]]
</noinclude>
9hd3pfz8274a83lng0ulx2ehsenq5pr
33253
33252
2026-11-11T21:49:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:UF-hcard-person]]
33252
wikitext
text/x-wiki
The HTML markup produced by this template includes an [[HCard|hCard microformat]], which makes the person's details [[Parsing|parsable]] by computers, either acting automatically to catalogue articles across Wikipedia or via a browser tool operated by a reader, to (for example) add the subject to an address book or database. For more information about the use of [[microformat]]s on Wikipedia, please see [[Wikipedia:WikiProject Microformats|the microformat project]].
=== Sub-templates ===
Date-of-birth ("bday") information will only be included in the microformat if {{tl|birth date}}, or {{tl|birth date and age}} are used in the infobox. ([[Wikipedia:WikiProject Microformats/dates|Do not use these if the date is before 1583]]). Be cautious about using these if the person is still living, per [[WP:DOB]].
To include a URL, use [[Template:URL]], specifying the url as the value of unnamed param 1; example:
: <code><nowiki>{{URL|1=https://www.somedomain.com/foo/bar?q=weird_stuff&xyz=more_stuff}}</nowiki></code>.
'''Please do not remove instances of these sub-templates.'''
=== Classes ===
hCard uses HTML classes including:
{{Flat list|
*adr
*agent
*bday
*birthplace
*category
*country-name
*deathdate
*deathplace
*extended-address
*family-name
*fn (required)
*given-name
*honorific-prefix
*honorific-suffix
*label
*locality
*n
*nickname
*note
*org
*role
*url
*vcard
}}
'''Please do not rename or remove these classes nor collapse nested elements which use them.'''<includeonly>{{#ifeq:{{SUBPAGENAME}}|doc | |{{#ifeq:{{SUBPAGENAME}}|sandbox | |[[Category:Templates generating hCards]]}} }}</includeonly><noinclude>
[[Category:Templates generating hCards]]
[[Category:Microformat message templates]]
</noinclude>
9hd3pfz8274a83lng0ulx2ehsenq5pr
Tempilet:Infobox officeholder/doc
10
2599
33254
2026-10-13T02:25:20Z
en>PARAKANYAA
0
33254
wikitext
text/x-wiki
{{Documentation subpage}}
{{Person infobox header}}
{{High-use}}
{{Notice|Please note that in June 2017, the {{para|religion}} parameter was removed from Infobox officeholder as a result of [[Template talk:Infobox officeholder/Archive 21#Religion in officeholder infoboxes|this discussion]].}}
{{template link|Infobox officeholder}} is incorporated into the templates listed <span class="plainlinks">[{{fullurl:Special:WhatLinksHere/Template:Infobox officeholder|namespace=10&limit=1000&hidetrans=1&hidelinks=1}} here]</span>. You are welcome to use the appropriate redirect when placing this template on a page, but it '''will not change in any way''' the displayed Infobox.
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
==Usage==
{{hatnote|Note: This template is for use on articles about '''individual people'''. For the infobox for use on articles about offices/positions, see [[Template:Infobox official post]].}}
Paste the code for the relevant office and then add the [[#Personal data|personal data]] to the bottom. There are no required fields and some fields will not appear when others are in use. For instructions on how to implement multiple terms, see [[Template:Infobox officeholder/example#Multiple terms|this page]]. For advice on alt text, see ''[[Wikipedia:Alternative text for images]]''.
The parameter {{para|order}} is used in conjunction with {{para|office}} to state that the officeholder is the ''n''th holder of the office, for example "42nd President of the United States". This should only be used when there is a well-established use of such numbering in reliable sources. Do not add numbers simply based on a Wikipedia list of holders of the office, because (1) the list may not be accurate and (2) even with a definite list, different numbering systems could be applied (as to how various categories of "irregular" officeholders should be counted, and as to the counting of those serving for multiple non-consecutive periods) making the numbers arbitrary; and even where such issues are not yet present, they are bound to be in the future, making this unsustainable. Per [[WP:SEAOFBLUE]], it is not recommended to wikilink {{para|order}} to a list of officeholders, even if such a list exists.
If {{para|order}} is not specified, the value of {{para|office}} can be [[Help:Link#Wikilinks|wikilinked]] in the usual way, for example, "<code><nowiki>[[Ministry of Defence (Singapore)|Minister for Defence]]</nowiki></code>". However, if {{para|order}} is specified together with {{para|office}}, the value of {{para|office}} is automatically linked to a Wikipedia article of the same name, whether such an article exists or not. Wikilinking cannot be used to redirect the link elsewhere, but a [[Wikipedia:Piped link|piped link]] can be created like this: "<code><nowiki>Ministry of Defence (Singapore){{!}}Minister for Defence</nowiki></code>" (note that the double square brackets have been omitted).
When both a start and an end term are given, you can instead specify the complete term using the parameters {{para|term}}, {{para|term2}}, etc. This can be helpful for complicated terms that cannot be given as simple starting or ending dates, or if you prefer something other than the default term separator (an en dash, with spaces around it if the start or end is not a simple integer date).
Where a politician was redistricted into a new district, you can use {{para|prior_term}} to indicate which district(s) they were in before. This saves space in the infobox by not generating a completely new office each time redistricting happens. If you do this, it is recommended that you list the person who preceded the subject when the subject first took office and the person who succeeded the subject when the subject last left office. Where the use of "same district number" is used for determining "predecessor" and "successor" in any office, but where the area is so altered as to make such a "predecessor" or "successor" of little or no biographical value, the word "redistricted" should be used rather than using names of officeholders whose connection is accidental by virtue of district number, but unrelated to any election contests between officeholders.
Please do not re-purpose any fields to add decorative images, icons or flags. Template:Infobox viceroy styles or the like can be used for this. [[WP:INFOBOXFLAG]] applies here.
Per consensus in [[Wikipedia:Village pump (proposals)/Archive 175#RfC: Interim use of successor in Infobox officeholder|this RfC]], the infobox for an incumbent officeholder should not mention an [[-elect|elected or designated]] successor, or the end date of the term, until the successor takes office.
===General office===
{{For|examples of this code in use|Template:Infobox officeholder/example#General office}}
{{Generic template demo
| honorific_prefix
| name<!-- defaults to article title when left blank -->
| native_name
| native_name_lang
| honorific_suffix
| image
| image_size
| image_upright
| alt
| caption
| order
| office
| status<!--If this is specified, overrides Incumbent.-->
| term_start
| term_end<!-- Add data only when the actual term has ended, not for terms which will end in the future. (Per usage guideline.) -->
| subterm
| suboffice
| alongside
| monarch
| president
| governor_general
| prime_minister
| chancellor
| taoiseach
| governor
| co-leader
| vice_president
| vice_prime_minister
| deputy
| lieutenant
| parliamentary_group
| constituency
| majority
| predecessor
| successor
| prior_term
| order2
| office2
| term_start2
| term_end2
| subterm2
| suboffice2
| alongside2
| monarch2
| president2
| governor_general2
| prime_minister2
| chancellor2
| taoiseach2
| governor2
| co-leader2
| vice_president2
| vice_prime_minister2
| deputy2
| lieutenant2
| parliamentary_group2
| constituency2
| predecessor2
| successor2
| majority2
| prior_term2
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox officeholder
| honorific_prefix =
| name = <!-- defaults to article title when left blank -->
| native_name = <!--The person's name in their own language, if different.-->
| native_name_lang = <!--ISO 639-1 code, e.g., "fr" for French. If more than one, use {{lang}} in |native_name= instead.-->
| honorific_suffix =
| image =
| image_size =
| image_upright =
| alt =
| caption =
| order =
| office =
| status = <!--If this is specified, overrides Incumbent.-->
| term_start =
| term_end = <!-- Add data only when the actual term has ended, not for terms which will end in the future. (Per usage guideline.) -->
| subterm =
| suboffice =
| alongside = <!--For two or more people serving in the same position from the same district. (e.g. United States senators.)-->
| monarch =
| president =
| governor_general =
| prime_minister =
| taoiseach =
| chancellor =
| governor =
| co-leader =
| vice_president =
| vice_primeminister =
| deputy =
| lieutenant =
| succeeding = <!--For President-elect or equivalent-->
| parliamentary_group =
| constituency =
| majority =
| predecessor =
| successor = <!-- should not be filled until the successor takes office-->
| prior_term =
| order2 = <!--Can be repeated up to 16 times by changing the number-->
| office2 = <!--Can be repeated up to 16 times by changing the number-->
| term_start2 = <!--Can be repeated up to 16 times by changing the number-->
| term_end2 = <!--Can be repeated up to 16 times by changing the number-->
| subterm2 = <!--Can be repeated up to 16 times by changing the number-->
| suboffice2 = <!--Can be repeated up to 16 times by changing the number-->
| alongside2 = <!--Can be repeated up to 16 times by changing the number-->
| monarch2 = <!--Can be repeated up to 16 times by changing the number-->
| president2 = <!--Can be repeated up to 16 times by changing the number-->
| governor_general2 = <!--Can be repeated up to 16 times by changing the number-->
| prime_minister2 = <!--Can be repeated up to 16 times by changing the number-->
| chancellor2 = <!--Can be repeated up to 16 times by changing the number-->
| taoiseach2 = <!--Can be repeated up to 16 times by changing the number-->
| governor2 = <!--Can be repeated up to 16 times by changing the number-->
| co-leader2 = <!--Can be repeated up to 16 times by changing the number-->
| vice_president2 = <!--Can be repeated up to 16 times by changing the number-->
| vice_prime_minister2 = <!--Can be repeated up to 16 times by changing the number-->
| deputy2 = <!--Can be repeated up to 16 times by changing the number-->
| lieutenant2 = <!--Can be repeated up to 16 times by changing the number-->
| succeeding2 = <!--Can be repeated up to 16 times by changing the number-->
| predecessor2 = <!--Can be repeated up to 16 times by changing the number-->
| successor2 = <!--Can be repeated up to 16 times by changing the number-->
| parliamentary_group2 = <!--Can be repeated up to 16 times by changing the number-->
| constituency2 = <!--Can be repeated up to 16 times by changing the number-->
| majority2 = <!--Can be repeated up to 16 times by changing the number-->
| prior_term2 = <!--Can be repeated up to 16 times by changing the number-->
}}
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Ambassador===
{{For|examples of this code in use|Template:Infobox officeholder/example#Ambassador}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| order
| ambassador_from
| country
| term_start
| term_end
| predecessor
| successor
| president
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox ambassador
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| order = <!--Can be repeated up to 16 times by adding a number-->
| ambassador_from = <!--Can be repeated up to 16 times by adding a number-->
| country = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
| president = <!--Can be repeated up to 16 times by adding a number-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Assembly member===
{{For|examples of this code in use|Template:Infobox officeholder/example#Assembly Member}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| constituency_AM
| assembly
| majority
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox AM
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| constituency_AM = <!--Can be repeated up to eight times by adding a number-->
| assembly = <!--Can be repeated up to 16 times by adding a number-->
| majority = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Governor===
{{For|examples of this code in use|Template:Infobox officeholder/example#Governor}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| order
| office
| term_start
| term_end
| lieutenant
| predecessor
| successor
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox governor
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| order = <!--Can be repeated up to 16 times by adding a number-->
| office = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| lieutenant = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
If Governor was appointed by a President, add:
{{Generic template demo
| president
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| president = <!--name of president-->
</syntaxhighlight>
{{clear}}
If Governor appointed by other, add:
{{Generic template demo
| appointer
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| appointer = <!--name of appointer-->
</syntaxhighlight>
{{clear}}
===Judge===
{{For|examples of this code in use|Template:Infobox officeholder/example#Judge}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| office
| term_start
| term_end
| nominator
| appointer
| predecessor
| successor
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox judge
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| office = <!--Can be repeated up to 16 times by changing the number-->
| term_start = <!--Can be repeated up to 16 times by changing the number-->
| term_end = <!--Can be repeated up to 16 times by changing the number-->
| nominator = <!--Can be repeated up to 16 times by changing the number-->
| appointer = <!--Can be repeated up to 16 times by changing the number-->
| predecessor = <!--Can be repeated up to 16 times by changing the number-->
| successor = <!--Can be repeated up to 16 times by changing the number-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Member of Parliament===
{{For|examples of this code in use|Template:Infobox officeholder/example#Member of Parliament}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| constituency_MP
| parliament
| majority
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox MP
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| constituency_MP = <!--Can be repeated up to eight times by adding a number-->
| parliament = <!--Can be repeated up to 16 times by adding a number-->
| majority = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===U.S. Representatives===
====U.S. Congressperson====
{{For|examples of this code in use|Template:Infobox officeholder/example#US Congressperson}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| state
| district
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox Congressman
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| state = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_start = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_end = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| predecessor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| successor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
If Congressperson served as Speaker of the House add:
{{Generic template demo
| speaker
| term_start2
| term_end2
| predecessor2
| successor2
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| speaker = <!--number of office holder-->
| term_start2 =
| term_end2 =
| predecessor2 =
| successor2 =
</syntaxhighlight>
{{clear}}
If Congressman has been elected but not sworn in:
{{Generic template demo
| succeeding
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| succeeding = <!--the name of the incumbent congressman-->
</syntaxhighlight>
{{clear}}
====State Representative====
{{For|examples of this code in use|Template:Infobox officeholder/example#State Representative}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| state_house
| district
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox state representative
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| state_house = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_start = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_end = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| predecessor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| successor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
For Representative from states that have an Assembly, instead of state_house use:
{{Generic template demo
| state_assembly
| district
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state_assembly = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
For Representative from states that have a House of Delegates, instead of state_house use:
{{Generic template demo
| state_delegate
| district
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state_delegate = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
For Representative from states that have a Legislature, instead of state_house use:
{{Generic template demo
| state_legislature
| district
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state_legislature = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If Representative served as Speaker of the State House add:
{{Generic template demo
| speaker
| state_house
| term_start2
| term_end2
| predecessor2
| successor2
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| speaker = <!--number of office holder-->
| state_house =
| term_start2 =
| term_end2 =
| predecessor2 =
| successor2 =
</syntaxhighlight>
{{clear}}
===U.S. Senators===
====U.S. Senator====
{{For|examples of this code in use|Template:Infobox officeholder/example#US Senator}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| image_size
| image_upright
| alt
| caption
| jr/sr
| state
| term_start
| term_end
| predecessor
| successor
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox senator
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| image_size =
| image_upright =
| alt =
| caption =
| jr/sr = <!--Can be repeated up to eight times by appending 2, 3, etc--> Set to any value to display the "United States Senator from" header. If this parameter is missing or empty, "United States Senator from" will not be displayed.
| state = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_start = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_end = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| predecessor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| successor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
{{Generic template demo
| term_start
| alongside
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| term_start =
| alongside = <!--the name of fellow senator-->
</syntaxhighlight>
{{clear}}
If Senator has just been elected and is a Senator-Elect:
{{Generic template demo
| succeeding
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| succeeding = <!--the name of the incumbent senator-->
</syntaxhighlight>
{{clear}}
If Senator served as Senate Majority Leader add:
{{Generic template demo
| majority_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| majority_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If Senator served as Congressman add:
{{Generic template demo
| state3
| district3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| district3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
====State Senator====
{{For|examples of this code in use|Template:Infobox officeholder/example#State Senator}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| state_senate
| district
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox state senator
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| state_senate = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| district = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_start = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_end = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| predecessor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| successor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
If State Senator served as Majority Leader of the State Senate add:
{{Generic template demo
| majority_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| majority_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If State Senator served as Minority Leader of the State Senate add:
{{Generic template demo
| minority_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| minority_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If State Senator served as Majority Floor Leader of the State Senate add:
{{Generic template demo
| majority_floor_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| majority_floor_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If State Senator served as Minority Floor Leader of the State Senate add:
{{Generic template demo
| minority_floor_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| minority_floor_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
===Ukrainian legislative office===
{{For|examples of this code in use|Template:Infobox officeholder/example#Ukrainian legislative office}}
{{Generic template demo
| name
| native_name
| native_name_lang
| image
| caption
| office1
| convocation1
| constituency1
| term_start1
| term_end1
| convocation2
| constituency2
| term_start2
| term_end2
| office3
| convocation3
| constituency3
| term_start3
| term_end3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox Ukrainian legislative office
| name =
| native_name =
| native_name_lang =
| image =
| caption =
| office1 =
| convocation1 =
| constituency1 =
| term_start1 =
| term_end1 =
| convocation2 =
| constituency2 =
| term_start2 =
| term_end2 =
| office3 = <!--Can be repeated up to 16 times by adding a number-->
| convocation3 = <!--Can be repeated up to 16 times by adding a number-->
| constituency3 = <!--Can be repeated up to 16 times by adding a number-->
| term_start3 = <!--Can be repeated up to 16 times by adding a number-->
| term_end3 = <!--Can be repeated up to 16 times by adding a number-->
</syntaxhighlight>
==Personal data==
Place this underneath the template
{{Generic template demo
| pronunciation
| birth_name <!-- only use if different from name -->
| birth_date
| birth_place
| death_date
| death_place
| death_cause <!-- should only be included when the cause of death has significance for the subject's notability -->
| resting_place
| resting_place_coordinates
| citizenship <!-- use only when necessary per [[WP:INFONAT]] -->
| party
| other_party
| height
| spouse <!--Fill only if notable (reference required) or there is a WP article on this person-->
| partner <!--Fill only if notable (reference required) or there is a WP article on this person-->
| relations <!--Fill only if notable (reference required) or there is a WP article on this person-->
| children <!--Fill only if notable (reference required) or there is a WP article on this person-->
| parents <!--Fill only if notable (reference required) or there is a WP article on this person-->
| mother <!--Fill only if notable (reference required) or there is a WP article on this person-->
| father <!--Fill only if notable (reference required) or there is a WP article on this person-->
| relatives <!--Fill only if notable (reference required) or there is a WP article on this person-->
| education
| occupation
| profession
| salary
| known_for
| cabinet
| committees
| portfolio
| awards
| blank1
| data1
| blank2
| data2
| blank3
| data3
| blank4
| data4
| blank5
| data5
| signature
| signature_alt
| website
| nickname
| allegiance
| branch
| service_years
| rank
| unit
| commands
| battles
| mawards
| military_blank1
| military_data1
| military_blank2
| military_data2
| military_blank3
| military_data3
| military_blank4
| military_data4
| military_blank5
| military_data5
| module
| module2
| module3
| module4
| module5
| footnotes
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| pronunciation =
| birth_name = <!-- only use if different from name -->
| birth_date = <!-- {{Birth date and age|YYYY|MM|DD}} -->
| birth_place =
| death_date = <!-- {{Death date and age|YYYY|MM|DD|YYYY|MM|DD}} -->
| death_place =
| death_cause = <!-- should only be included when the cause of death has significance for the subject's notability -->
| resting_place =
| resting_place_coordinates =
| citizenship = <!-- use only when necessary per [[WP:INFONAT]] -->
| party =
| other_party = <!--For additional political affiliations-->
| height = <!-- "X cm", "X m" or "X ft Y in" plus optional reference (conversions are automatic) -->
| spouse =
| partner = <!--For those with a domestic partner and not married-->
| relations =
| children =
| parents = <!-- overrides mother and father parameters -->
| mother = <!-- may be used (optionally with father parameter) in place of parents parameter (displays "Parent(s)" as label) -->
| father = <!-- may be used (optionally with mother parameter) in place of parents parameter (displays "Parent(s)" as label) -->
| relatives =
| education =
| occupation =
| profession =
| known_for =
| salary =
| cabinet =
| committees =
| portfolio =
| awards = <!-- For civilian awards - appears as "Awards" if |mawards= is not set -->
| blank1 =
| data1 =
| blank2 =
| data2 =
| blank3 =
| data3 =
| blank4 =
| data4 =
| blank5 =
| data5 =
| signature =
| signature_alt =
| signature_size =
| website =
| nickname =
<!--Military service-->
| allegiance =
| branch =
| service_years =
| rank =
| unit =
| commands =
| battles =
| mawards = <!-- for military awards - appears as "Awards" if |awards= is not set -->
| military_blank1 =
| military_data1 =
| military_blank2 =
| military_data2 =
| military_blank3 =
| military_data3 =
| military_blank4 =
| military_data4 =
| military_blank5 =
| military_data5 =
<!--Embedded templates / Footnotes-->
| module =
| module2 =
| module3 =
| module4 =
| module5 =
| footnotes =
}}
</syntaxhighlight>
{{clear}}
<code>nationality</code> is [[Wikipedia:Manual of Style/Infoboxes#Nationality and citizenship in infoboxes|not displayed]] if the corresponding country is mentioned in <code>birth_place</code>, for example <code>|birth_place = Tokyo, Japan |nationality = Japanese</code>.
== Embedding other templates ==
The ''module'' parameters (module, module2, ... module5) may used to embed other templates into this infobox (see [[Wikipedia:Infobox modules]]).
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Infobox officeholder
| name =
| <!-- etc. -->
| module =
{{Infobox football biography | embed = yes
| <!-- etc. -->
}}
}}
</syntaxhighlight>
== Embedding within a different infobox ==
Many officeholders are known for more than just their appointments (e.g., [[Clint Eastwood]]), and hence it may be desirable to merge this infobox with another one, like {{tl|Infobox person}}. By adding {{para|embed|yes}} to the first line of the infobox code, one can embed this infobox into another, creating the illusion of one continuous infobox. Though the process is a little complicated, it is possible to insert this infobox into most if not all other infoboxes. For {{tl|Infobox person}}, this infobox is passed as a "module" using the {{para|module}} syntax.
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{Infobox person
| name = John Infobox
| image = Example.jpg
| caption = John Infobox in 2005
| birth_name = John Officeholder Person Infobox
| birth_date = {{Birth date|1950|5|25}}
| birth_place = Template City
| death_date = {{Death date and age|2010|10|22|1950|5|25}}
| occupation = Actor
| years_active = 1970–1990
| module =
{{Infobox officeholder | embed = yes
| office = Mayor of Wikipedia
| term_start = 1994
| term_end = 1998
}}
| website = {{URL|example.com}}
}}
</syntaxhighlight>
==Microformat==
{{UF-hcard-person}}
==TemplateData==
{{Collapse top|title=[[Wikipedia:TemplateData|TemplateData]] for this template used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>
{
"description": "An infobox for office holders",
"format": "{{_\n| __________________ = _\n}}\n",
"params": {
"name": {
"label": "Name",
"description": "Commonly known name of person (defaults to article name, without disambiguation)",
"type": "line",
"default": "PAGENAME"
},
"bodyclass": {
"label": "bodyclass",
"type": "string"
},
"native_name": {
"label": "Native name",
"type": "string",
"description": "Name in the person's native language",
"example": "Melquíades Rafael Martínez Ruiz"
},
"native_name_lang": {
"label": "Native name language",
"type": "string",
"description": "Language in which the person's native name is",
"example": "ca"
},
"image": {
"label": "Image",
"description": "Filename for the image (e.g. 'Example.jpg').",
"type": "wiki-file-name",
"required": false
},
"alt": {
"label": "Alternative text",
"description": "Alternative text for the image.",
"type": "line"
},
"caption": {
"label": "Image caption",
"description": "Caption for the image.",
"type": "string",
"required": false
},
"alongside": {
"label": "alongside",
"description": "For two or more people serving in the same position from the same district. (e.g. United States senators.)",
"type": "string"
},
"ambassador_from": {
"label": "ambassador from",
"type": "string"
},
"appointer": {
"label": "appointer",
"type": "string"
},
"assembly": {
"label": "assembly",
"type": "string"
},
"chancellor": {
"label": "chancellor",
"type": "string"
},
"co-leader": {
"label": "co-leader",
"type": "string"
},
"constituency_AM": {
"label": "constituency AM",
"type": "string"
},
"constituency": {
"label": "constituency",
"type": "string"
},
"country": {
"label": "country",
"type": "string",
"example": "Israel"
},
"deputy": {
"label": "deputy",
"type": "string"
},
"district": {
"label": "district",
"type": "string"
},
"governor-general": {
"label": "governor-general",
"type": "string"
},
"leader": {
"label": "leader",
"type": "string"
},
"legislature": {
"label": "legislature",
"type": "wiki-page-name",
"example": "[[United States House of Representatives]]"
},
"lieutenant_governor": {
"label": "lieutenant governor",
"type": "string"
},
"lieutenant": {
"label": "lieutenant",
"type": "string"
},
"minister": {
"label": "minister",
"type": "string"
},
"minister_from": {
"label": "minister from",
"type": "string"
},
"minority_floor_leader": {
"label": "minority floor leader",
"type": "string"
},
"majority_floor_leader": {
"label": "majority floor leader",
"type": "string"
},
"monarch": {
"label": "monarch",
"type": "string"
},
"nominator": {
"label": "nominator",
"type": "string"
},
"parliament": {
"label": "parliament",
"type": "string"
},
"predecessor": {
"label": "predecessor",
"type": "string"
},
"preceding": {
"label": "preceding",
"type": "string"
},
"preceded": {
"label": "preceded",
"type": "string"
},
"premier": {
"label": "premier",
"type": "string"
},
"president": {
"label": "president",
"type": "string"
},
"riding": {
"label": "riding",
"type": "string"
},
"status": {
"label": "status",
"description": "If this is specified, overrides Incumbent.",
"type": "string"
},
"succeeded": {
"label": "succeeded",
"type": "string"
},
"succeeding": {
"label": "succeeding",
"description": "For President-elect or equivalent.",
"type": "string"
},
"successor": {
"label": "successor",
"type": "string"
},
"taoiseach": {
"label": "taoiseach",
"type": "string"
},
"term_start": {
"label": "term start",
"type": "string",
"description": "Date of the beginning of the person's term"
},
"term_end": {
"label": "term end",
"type": "string",
"description": "Date for the end of the person's term"
},
"title": {
"label": "title",
"type": "string"
},
"speaker": {
"label": "speaker",
"type": "string"
},
"footnotes": {
"label": "footnotes",
"type": "string"
},
"date": {
"label": "date",
"type": "string"
},
"year": {
"label": "year",
"type": "string"
},
"source": {
"label": "source",
"type": "string"
},
"signature": {
"label": "signature",
"type": "wiki-file-name"
},
"signature_alt": {
"label": "signature alt text",
"type": "string"
},
"alongside2": {
"label": "alongside 2",
"type": "string"
},
"peerage2": {
"label": "peerage 2",
"type": "string"
},
"ambassador_from2": {
"label": "ambassador from 2",
"type": "string"
},
"appointer2": {
"label": "appointer 2",
"type": "string"
},
"assembly2": {
"label": "assembly 2",
"type": "string"
},
"chancellor2": {
"label": "chancellor 2",
"type": "string"
},
"co-leader2": {
"label": "co-leader 2",
"type": "string"
},
"constituency_AM2": {
"label": "constituency AM 2",
"type": "string"
},
"country2": {
"label": "country 2",
"type": "string",
"example": "Malaya"
},
"deputy2": {
"label": "deputy 2",
"type": "string"
},
"district2": {
"label": "district 2",
"type": "string"
},
"governor": {
"label": "governor",
"type": "string"
},
"governor-general2": {
"label": "governor-general 2",
"type": "string"
},
"governor2": {
"label": "governor 2",
"type": "string"
},
"leader2": {
"label": "leader 2",
"type": "string",
"example": "Donald Trump"
},
"legislature2": {
"label": "legislature 2",
"type": "wiki-page-name",
"example": "[[United States Senate]]"
},
"lieutenant_governor2": {
"label": "lieutenant governor 2",
"type": "string"
},
"lieutenant2": {
"label": "lieutenant2",
"type": "string"
},
"majority": {
"label": "majority",
"type": "string"
},
"minister_from2": {
"label": "minister from 2",
"type": "string"
},
"minority_floor_leader2": {
"label": "minority floor leader 2",
"type": "string"
},
"majority_floor_leader2": {
"label": "majority floor leader 2",
"type": "string"
},
"majority2": {
"label": "majority 2",
"type": "string"
},
"minister2": {
"label": "minister 2",
"type": "string"
},
"minority": {
"label": "minority",
"type": "string"
},
"monarch2": {
"label": "monarch 2",
"type": "string"
},
"nominator2": {
"label": "nominator 2",
"type": "string"
},
"order2": {
"label": "order 2",
"type": "string"
},
"parliament2": {
"label": "parliament2",
"type": "string"
},
"predecessor2": {
"label": "predecessor 2",
"type": "string"
},
"preceding2": {
"label": "preceding 2",
"type": "string"
},
"preceded2": {
"label": "preceded 2",
"type": "string"
},
"premier2": {
"label": "premier 2",
"type": "string"
},
"president2": {
"label": "president 2",
"type": "string"
},
"riding2": {
"label": "riding 2",
"type": "string"
},
"speaker_office": {
"label": "speaker office",
"type": "string"
},
"state_assembly": {
"label": "state assembly",
"type": "string"
},
"state_delegate": {
"label": "state delegate",
"type": "string"
},
"state_legislature": {
"label": "state legislature",
"type": "string"
},
"state_senate": {
"label": "state senate",
"type": "string"
},
"state": {
"label": "state",
"type": "string",
"description": "The state this officeholder represents or represented",
"example": "[[Alabama]]"
},
"term": {
"label": "term",
"type": "string"
},
"party": {
"label": "party",
"type": "string"
},
"prior_term": {
"label": "prior_term",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1blankname": {
"label": "1blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1namedata": {
"label": "1namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2blankname": {
"label": "2blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2namedata": {
"label": "2namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3blankname": {
"label": "3blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3namedata": {
"label": "3namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4blankname": {
"label": "4blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4namedata": {
"label": "4namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5blankname": {
"label": "5blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5namedata": {
"label": "5namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1blankname1": {
"label": "1blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1namedata1": {
"label": "1namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2blankname1": {
"label": "2blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2namedata1": {
"label": "2namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3blankname1": {
"label": "3blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3namedata1": {
"label": "3namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4blankname1": {
"label": "4blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4namedata1": {
"label": "4namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5blankname1": {
"label": "5blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5namedata1": {
"label": "5namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"alongside1": {
"label": "alongside1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"ambassador_from1": {
"label": "ambassador_from1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"appointer1": {
"label": "appointer1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"assembly1": {
"label": "assembly1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"chair1": {
"label": "chair1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"chancellor1": {
"label": "chancellor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"co-leader1": {
"label": "co-leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"constituency_AM1": {
"label": "constituency_AM1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"constituency1": {
"label": "constituency1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"country1": {
"label": "country1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"deputy1": {
"label": "deputy1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"district1": {
"label": "district1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"first_minister1": {
"label": "first_minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"governor-general1": {
"label": "governor-general1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"governor1": {
"label": "governor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"leader1": {
"label": "leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"legislature1": {
"label": "legislature1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"lieutenant_governor1": {
"label": "lieutenant governor 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"lieutenant1": {
"label": "lieutenant 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minority_floor_leader1": {
"label": "minority floor leader 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minister_from1": {
"label": "minister from 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"majority_floor_leader1": {
"label": "majority_floor_leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"majority1": {
"label": "majority1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minister1": {
"label": "minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"monarch1": {
"label": "monarch1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"nominator1": {
"label": "nominator1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"office1": {
"label": "office1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"order1": {
"label": "order1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"parliament1": {
"label": "parliament1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"predecessor1": {
"label": "predecessor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"preceding1": {
"label": "preceding1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"preceded1": {
"label": "preceded1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"premier1": {
"label": "premier1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"president1": {
"label": "president1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"riding1": {
"label": "riding 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_assembly1": {
"label": "state_assembly1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_delegate1": {
"label": "state_delegate1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_house1": {
"label": "state_house1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_legislature1": {
"label": "state_legislature1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_senate1": {
"label": "state_senate1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state1": {
"label": "state1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"succeeded1": {
"label": "succeeded1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"succeeding1": {
"label": "succeeding1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"successor1": {
"label": "successor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"taoiseach1": {
"label": "taoiseach1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term1": {
"label": "term1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"title1": {
"label": "title1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vicechair1": {
"label": "vicechair1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_governor1": {
"label": "vice_governor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_president1": {
"label": "vice_president1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_premier1": {
"label": "vice_premier1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_prime_minister1": {
"label": "vice_prime_minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"prior_term1": {
"label": "prior term 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term2": {
"label": "term 2",
"type": "string"
},
"title2": {
"label": "title 2",
"type": "string"
},
"vice_governor2": {
"label": "vice governor 2",
"type": "string"
},
"vice_president2": {
"label": "vice president 2",
"type": "string"
},
"vice_premier2": {
"label": "vice premier 2",
"type": "string"
},
"vice_prime_minister2": {
"label": "vice prime minister 2",
"type": "string"
},
"succeeded2": {
"label": "succeeded 2",
"type": "string"
},
"succeeding2": {
"label": "succeeding 2",
"type": "string"
},
"successor2": {
"label": "successor 2",
"type": "string"
},
"taoiseach2": {
"label": "taoiseach 2",
"type": "string"
},
"state_assembly2": {
"label": "state assembly2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_delegate2": {
"label": "state delegate2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_legislature2": {
"label": "state legislature 2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_senate2": {
"label": "state senate2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state 2": {
"label": "state 2",
"description": "Additional fields numbered up to 14",
"type": "string",
"example": "[[Georgia (U.S. State)|Georgia]]"
},
"prior_term2": {
"label": "prior term 2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"birth_name": {
"label": "Birth name",
"description": "Name at birth, if different from 'name'.",
"type": "string",
"required": false,
"aliases": [
"birthname"
]
},
"birth_date": {
"label": "Birth date",
"description": "Date of birth. Use {{birth date and age}} (for living people) or {{birth date}} for the deceased.",
"type": "line",
"required": false
},
"birth_place": {
"label": "Birth place",
"description": "Place of birth.",
"type": "line"
},
"death_date": {
"label": "Death date",
"description": "Date of death. Use {{death date and age}}. Use {{death date}} if birth date unknown or incomplete.",
"type": "content"
},
"death_place": {
"label": "Death place",
"description": "The person's place of death, if deceased",
"type": "line",
"required": false,
"example": "[[Crown Heights]]"
},
"resting_place": {
"label": "Resting place",
"description": "Person's grave, etc.",
"type": "line",
"required": false
},
"resting_place_coordinates": {
"label": "Resting place",
"description": "Coordinates of grave, etc. Use {{Coord|LAT|LONG|type:landmark|display=inline}}",
"type": "line"
},
"citizenship": {
"label": "citizenship",
"type": "string",
"description": "The person's country of citizenship",
"example": "[[Germany]]"
},
"spouse": {
"label": "Spouse(s)",
"description": "Name of spouse(s), followed by years of marriage.",
"type": "string",
"required": false
},
"partner": {
"label": "Partner(s)",
"description": "Domestic partner(s), if notable",
"type": "string"
},
"relations": {
"label": "relations",
"type": "string"
},
"children": {
"label": "children",
"type": "string"
},
"parents": {
"label": "parents",
"type": "string"
},
"occupation": {
"label": "Occupation",
"description": " Please observe sentence case and capitalise only the first letter of the first item: (i.e. Politician, entrepreneur, businessman)",
"type": "string"
},
"profession": {
"label": "Profession",
"description": " Please observe sentence case and capitalise only the first letter of the first item: (i.e. Attorney, accountant)",
"type": "string"
},
"cabinet": {
"label": "cabinet",
"type": "string"
},
"committees": {
"label": "committees",
"type": "string"
},
"portfolio": {
"label": "portfolio",
"type": "string"
},
"blank1": {
"label": "blank1",
"description": "Also blank2 ... blank5",
"type": "string"
},
"data1": {
"label": "data1",
"description": "Also data2 ... data5",
"type": "string"
},
"website": {
"label": "Official website",
"description": "Office holder's official website, using {{URL}}.",
"type": "line"
},
"nickname": {
"label": "nickname",
"type": "string"
},
"allegiance": {
"label": "allegiance",
"type": "string"
},
"branch": {
"label": "branch",
"type": "string"
},
"rank": {
"label": "rank",
"type": "string"
},
"unit": {
"label": "unit",
"type": "string"
},
"commands": {
"label": "commands",
"type": "string"
},
"battles": {
"label": "battles fought",
"type": "string"
},
"military_blank1": {
"label": "military blank 1",
"description": "Also military_blank2 ... military_blank5",
"type": "string"
},
"military_data1": {
"label": "military data 1",
"description": "Also military_data2 ... military_data5",
"type": "string"
},
"1blankname2": {
"label": "1blankname2",
"type": "string"
},
"1namedata2": {
"label": "1namedata2",
"type": "string"
},
"2blankname2": {
"label": "2blankname2",
"type": "string"
},
"2namedata2": {
"label": "2namedata2",
"type": "string"
},
"3blankname2": {
"label": "3blankname2",
"type": "string"
},
"3namedata2": {
"label": "3namedata2",
"type": "string"
},
"4blankname2": {
"label": "4blankname2",
"type": "string"
},
"4namedata2": {
"label": "4namedata2",
"type": "string"
},
"5blankname2": {
"label": "5blankname2",
"type": "string"
},
"5namedata2": {
"label": "5namedata2",
"type": "string"
},
"pronunciation": {
"label": "Name pronunciation",
"type": "string"
},
"honorific_prefix": {
"label": "honorific prefix",
"description": "Title such as 'The Honourable', 'His/Her Excellency'",
"type": "wiki-page-name",
"required": false
},
"image_size": {
"label": "Image size",
"description": "Size of the image (e.g. '220px').",
"type": "line",
"default": "varies",
"required": false
},
"education": {
"label": "Education",
"description": "Where or with whom the officeholder trained. If university degrees, list the full article title of each degree-granting parent institution, followed by degree(s) earned in parentheses, e.g. an alumnus of [[Harvard College]], [[Harvard Law School]], and the [[Kellogg School of Management]] would be listed as: [[Harvard University]] (BA, JD) [[Northwestern University]] (MBA).",
"type": "string",
"required": false
},
"awards": {
"label": "Awards",
"description": "Awards won by the officeholder. Consider using {{awd}}.",
"type": "line",
"required": false
},
"vicemayor": {
"label": "vice mayor",
"type": "string"
},
"viceregent": {
"label": "vice regent",
"type": "string"
},
"main_width": {
"label": "Main width ",
"type": "string",
"default": "22em"
},
"first_minister": {
"label": "first minister",
"type": "string"
},
"majority_leader": {
"label": "majority leader",
"type": "string"
},
"minority_leader": {
"label": "minority leader",
"example": "[[Chuck Shumer]]",
"type": "string"
},
"parliamentary_group": {
"label": "parliamentary group",
"type": "string"
},
"prime_minister": {
"label": "prime_minister",
"type": "string"
},
"vice_governor": {
"label": "vice governor",
"type": "string"
},
"vice_president": {
"label": "vice president",
"type": "string"
},
"vice_premier": {
"label": "vice premier",
"type": "string"
},
"vice_prime_minister": {
"label": "vice prime minister",
"type": "string"
},
"first_minister2": {
"label": "first minister 2",
"type": "string"
},
"majority_leader2": {
"label": "majority leader 2",
"example": "Mitch McConnell",
"type": "string"
},
"minority_leader2": {
"label": "minority leader 2",
"example": "[[Chuck Shumer]]",
"type": "string"
},
"parliamentary_group2": {
"label": "parliamentary group 2",
"type": "string"
},
"prime_minister2": {
"label": "prime minister 2",
"type": "string"
},
"majority_leader1": {
"label": "majority_leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minority_leader1": {
"label": "minority_leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"parliamentary_group1": {
"label": "parliamentary group 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"prime_minister1": {
"label": "prime_minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term_start1": {
"label": "termstart1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term_end1": {
"label": "termend1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"other_party": {
"label": "other political party",
"type": "string"
},
"service_years": {
"label": "Service Years",
"type": "string",
"description": "The years during which the person served. Use the format 1939–1945, or 2001–present if still active (note the use of an en dash, not hyphen)"
},
"term_start2": {
"label": "term start 2",
"type": "string"
},
"term_end2": {
"label": "term end 2",
"type": "string"
},
"honorific_suffix": {
"label": "honorific suffix",
"type": "wiki-page-name",
"description": "Initials such as 'OBE', 'FRSA'"
},
"office": {
"label": "office",
"description": "Office held",
"type": "string"
},
"office2": {
"label": "office2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"order": {
"label": "order",
"description": "Used in conjunction with 'office' to state that the officeholder is the nth holder of the office",
"type": "string"
},
"image_upright": {}
},
"paramOrder": [
"name",
"office",
"bodyclass",
"order",
"main_width",
"native_name",
"native_name_lang",
"image",
"image_size",
"image_upright",
"alt",
"caption",
"alongside",
"ambassador_from",
"appointer",
"assembly",
"chancellor",
"co-leader",
"constituency_AM",
"constituency",
"country",
"deputy",
"district",
"first_minister",
"governor-general",
"leader",
"legislature",
"lieutenant_governor",
"lieutenant",
"majority_leader",
"minister",
"minister_from",
"minority_floor_leader",
"majority_floor_leader",
"minority_leader",
"monarch",
"nominator",
"parliament",
"parliamentary_group",
"predecessor",
"preceding",
"preceded",
"premier",
"president",
"prime_minister",
"riding",
"status",
"succeeded",
"succeeding",
"successor",
"taoiseach",
"term_start",
"term_end",
"title",
"vice_governor",
"vice_president",
"vice_premier",
"vice_prime_minister",
"speaker",
"footnotes",
"date",
"year",
"source",
"signature",
"signature_alt",
"alongside2",
"peerage2",
"ambassador_from2",
"appointer2",
"assembly2",
"chancellor2",
"co-leader2",
"constituency_AM2",
"country2",
"deputy2",
"district2",
"first_minister2",
"governor",
"governor-general2",
"governor2",
"leader2",
"legislature2",
"lieutenant_governor2",
"lieutenant2",
"majority",
"majority_leader2",
"minister_from2",
"minority_floor_leader2",
"majority_floor_leader2",
"majority2",
"minister2",
"minority",
"minority_leader2",
"monarch2",
"nominator2",
"office2",
"order2",
"parliament2",
"parliamentary_group2",
"predecessor2",
"preceding2",
"preceded2",
"premier2",
"president2",
"prime_minister2",
"riding2",
"speaker_office",
"state_assembly",
"state_delegate",
"state_legislature",
"state_senate",
"state",
"term",
"party",
"prior_term",
"1blankname",
"1namedata",
"2blankname",
"2namedata",
"3blankname",
"3namedata",
"4blankname",
"4namedata",
"5blankname",
"5namedata",
"1blankname1",
"1namedata1",
"2blankname1",
"2namedata1",
"3blankname1",
"3namedata1",
"4blankname1",
"4namedata1",
"5blankname1",
"5namedata1",
"alongside1",
"ambassador_from1",
"appointer1",
"assembly1",
"chair1",
"chancellor1",
"co-leader1",
"constituency_AM1",
"constituency1",
"country1",
"deputy1",
"district1",
"first_minister1",
"governor-general1",
"governor1",
"leader1",
"legislature1",
"lieutenant_governor1",
"lieutenant1",
"minority_floor_leader1",
"minister_from1",
"majority_floor_leader1",
"majority_leader1",
"majority1",
"minister1",
"minority_leader1",
"monarch1",
"nominator1",
"office1",
"order1",
"parliament1",
"parliamentary_group1",
"predecessor1",
"preceding1",
"preceded1",
"premier1",
"president1",
"prime_minister1",
"riding1",
"state_assembly1",
"state_delegate1",
"state_house1",
"state_legislature1",
"state_senate1",
"state1",
"succeeded1",
"succeeding1",
"successor1",
"taoiseach1",
"term_start1",
"term_end1",
"term1",
"title1",
"vicechair1",
"vice_governor1",
"vice_president1",
"vice_premier1",
"vice_prime_minister1",
"prior_term1",
"term_start2",
"term_end2",
"term2",
"title2",
"vice_governor2",
"vice_president2",
"vice_premier2",
"vice_prime_minister2",
"succeeded2",
"succeeding2",
"successor2",
"taoiseach2",
"state_assembly2",
"state_delegate2",
"state_legislature2",
"state_senate2",
"state 2",
"prior_term2",
"birth_name",
"birth_date",
"birth_place",
"death_date",
"death_place",
"resting_place",
"resting_place_coordinates",
"citizenship",
"other_party",
"spouse",
"partner",
"relations",
"children",
"parents",
"education",
"occupation",
"profession",
"cabinet",
"committees",
"portfolio",
"blank1",
"data1",
"website",
"nickname",
"allegiance",
"branch",
"service_years",
"rank",
"unit",
"commands",
"battles",
"military_blank1",
"military_data1",
"1blankname2",
"1namedata2",
"2blankname2",
"2namedata2",
"3blankname2",
"3namedata2",
"4blankname2",
"4namedata2",
"5blankname2",
"5namedata2",
"pronunciation",
"awards",
"honorific_prefix",
"honorific_suffix",
"vicemayor",
"viceregent"
]
}
</templatedata>
{{Collapse bottom}}
== Tracking categories ==
'''Hidden tracking/maintenance categories (in main and supporting templates)'''
{{Infobox tracking cats}}
* {{clc|Biography template using pronunciation}}
* {{clc|Pages using infobox officeholder with ambassador from or minister from}}
* {{clc|Pages using infobox officeholder with both term and term_start or term_end}}
* {{clc|Pages using infobox officeholder with office0}}
* {{clc|Pages using infobox officeholder with speaker}}
* {{clc|Pages using infobox officeholder with succeeding and term or termend}}
== See also ==
* [[Template:S-start]] ([[Wikipedia:WikiProject Succession Box Standardization|succession box standardization]])
'''Supporting templates'''
* [[Template:Infobox officeholder/office]]
* <!-- [[Template:Infobox officeholder/Personal data]] -->
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Infobox templates|Officeholder]]
[[Category:Politics and government infobox templates|Officeholder]]
[[Category:People and person infobox templates|Officeholder]]
[[Category:Infobox templates with module parameter|Officeholder]]
[[Category:Biographical templates usable as a module|Officeholder]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
p0u643gvtorli09ocicvehbtp8evcn6
33255
33254
2026-11-11T21:49:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_officeholder/doc]]
33254
wikitext
text/x-wiki
{{Documentation subpage}}
{{Person infobox header}}
{{High-use}}
{{Notice|Please note that in June 2017, the {{para|religion}} parameter was removed from Infobox officeholder as a result of [[Template talk:Infobox officeholder/Archive 21#Religion in officeholder infoboxes|this discussion]].}}
{{template link|Infobox officeholder}} is incorporated into the templates listed <span class="plainlinks">[{{fullurl:Special:WhatLinksHere/Template:Infobox officeholder|namespace=10&limit=1000&hidetrans=1&hidelinks=1}} here]</span>. You are welcome to use the appropriate redirect when placing this template on a page, but it '''will not change in any way''' the displayed Infobox.
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
==Usage==
{{hatnote|Note: This template is for use on articles about '''individual people'''. For the infobox for use on articles about offices/positions, see [[Template:Infobox official post]].}}
Paste the code for the relevant office and then add the [[#Personal data|personal data]] to the bottom. There are no required fields and some fields will not appear when others are in use. For instructions on how to implement multiple terms, see [[Template:Infobox officeholder/example#Multiple terms|this page]]. For advice on alt text, see ''[[Wikipedia:Alternative text for images]]''.
The parameter {{para|order}} is used in conjunction with {{para|office}} to state that the officeholder is the ''n''th holder of the office, for example "42nd President of the United States". This should only be used when there is a well-established use of such numbering in reliable sources. Do not add numbers simply based on a Wikipedia list of holders of the office, because (1) the list may not be accurate and (2) even with a definite list, different numbering systems could be applied (as to how various categories of "irregular" officeholders should be counted, and as to the counting of those serving for multiple non-consecutive periods) making the numbers arbitrary; and even where such issues are not yet present, they are bound to be in the future, making this unsustainable. Per [[WP:SEAOFBLUE]], it is not recommended to wikilink {{para|order}} to a list of officeholders, even if such a list exists.
If {{para|order}} is not specified, the value of {{para|office}} can be [[Help:Link#Wikilinks|wikilinked]] in the usual way, for example, "<code><nowiki>[[Ministry of Defence (Singapore)|Minister for Defence]]</nowiki></code>". However, if {{para|order}} is specified together with {{para|office}}, the value of {{para|office}} is automatically linked to a Wikipedia article of the same name, whether such an article exists or not. Wikilinking cannot be used to redirect the link elsewhere, but a [[Wikipedia:Piped link|piped link]] can be created like this: "<code><nowiki>Ministry of Defence (Singapore){{!}}Minister for Defence</nowiki></code>" (note that the double square brackets have been omitted).
When both a start and an end term are given, you can instead specify the complete term using the parameters {{para|term}}, {{para|term2}}, etc. This can be helpful for complicated terms that cannot be given as simple starting or ending dates, or if you prefer something other than the default term separator (an en dash, with spaces around it if the start or end is not a simple integer date).
Where a politician was redistricted into a new district, you can use {{para|prior_term}} to indicate which district(s) they were in before. This saves space in the infobox by not generating a completely new office each time redistricting happens. If you do this, it is recommended that you list the person who preceded the subject when the subject first took office and the person who succeeded the subject when the subject last left office. Where the use of "same district number" is used for determining "predecessor" and "successor" in any office, but where the area is so altered as to make such a "predecessor" or "successor" of little or no biographical value, the word "redistricted" should be used rather than using names of officeholders whose connection is accidental by virtue of district number, but unrelated to any election contests between officeholders.
Please do not re-purpose any fields to add decorative images, icons or flags. Template:Infobox viceroy styles or the like can be used for this. [[WP:INFOBOXFLAG]] applies here.
Per consensus in [[Wikipedia:Village pump (proposals)/Archive 175#RfC: Interim use of successor in Infobox officeholder|this RfC]], the infobox for an incumbent officeholder should not mention an [[-elect|elected or designated]] successor, or the end date of the term, until the successor takes office.
===General office===
{{For|examples of this code in use|Template:Infobox officeholder/example#General office}}
{{Generic template demo
| honorific_prefix
| name<!-- defaults to article title when left blank -->
| native_name
| native_name_lang
| honorific_suffix
| image
| image_size
| image_upright
| alt
| caption
| order
| office
| status<!--If this is specified, overrides Incumbent.-->
| term_start
| term_end<!-- Add data only when the actual term has ended, not for terms which will end in the future. (Per usage guideline.) -->
| subterm
| suboffice
| alongside
| monarch
| president
| governor_general
| prime_minister
| chancellor
| taoiseach
| governor
| co-leader
| vice_president
| vice_prime_minister
| deputy
| lieutenant
| parliamentary_group
| constituency
| majority
| predecessor
| successor
| prior_term
| order2
| office2
| term_start2
| term_end2
| subterm2
| suboffice2
| alongside2
| monarch2
| president2
| governor_general2
| prime_minister2
| chancellor2
| taoiseach2
| governor2
| co-leader2
| vice_president2
| vice_prime_minister2
| deputy2
| lieutenant2
| parliamentary_group2
| constituency2
| predecessor2
| successor2
| majority2
| prior_term2
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox officeholder
| honorific_prefix =
| name = <!-- defaults to article title when left blank -->
| native_name = <!--The person's name in their own language, if different.-->
| native_name_lang = <!--ISO 639-1 code, e.g., "fr" for French. If more than one, use {{lang}} in |native_name= instead.-->
| honorific_suffix =
| image =
| image_size =
| image_upright =
| alt =
| caption =
| order =
| office =
| status = <!--If this is specified, overrides Incumbent.-->
| term_start =
| term_end = <!-- Add data only when the actual term has ended, not for terms which will end in the future. (Per usage guideline.) -->
| subterm =
| suboffice =
| alongside = <!--For two or more people serving in the same position from the same district. (e.g. United States senators.)-->
| monarch =
| president =
| governor_general =
| prime_minister =
| taoiseach =
| chancellor =
| governor =
| co-leader =
| vice_president =
| vice_primeminister =
| deputy =
| lieutenant =
| succeeding = <!--For President-elect or equivalent-->
| parliamentary_group =
| constituency =
| majority =
| predecessor =
| successor = <!-- should not be filled until the successor takes office-->
| prior_term =
| order2 = <!--Can be repeated up to 16 times by changing the number-->
| office2 = <!--Can be repeated up to 16 times by changing the number-->
| term_start2 = <!--Can be repeated up to 16 times by changing the number-->
| term_end2 = <!--Can be repeated up to 16 times by changing the number-->
| subterm2 = <!--Can be repeated up to 16 times by changing the number-->
| suboffice2 = <!--Can be repeated up to 16 times by changing the number-->
| alongside2 = <!--Can be repeated up to 16 times by changing the number-->
| monarch2 = <!--Can be repeated up to 16 times by changing the number-->
| president2 = <!--Can be repeated up to 16 times by changing the number-->
| governor_general2 = <!--Can be repeated up to 16 times by changing the number-->
| prime_minister2 = <!--Can be repeated up to 16 times by changing the number-->
| chancellor2 = <!--Can be repeated up to 16 times by changing the number-->
| taoiseach2 = <!--Can be repeated up to 16 times by changing the number-->
| governor2 = <!--Can be repeated up to 16 times by changing the number-->
| co-leader2 = <!--Can be repeated up to 16 times by changing the number-->
| vice_president2 = <!--Can be repeated up to 16 times by changing the number-->
| vice_prime_minister2 = <!--Can be repeated up to 16 times by changing the number-->
| deputy2 = <!--Can be repeated up to 16 times by changing the number-->
| lieutenant2 = <!--Can be repeated up to 16 times by changing the number-->
| succeeding2 = <!--Can be repeated up to 16 times by changing the number-->
| predecessor2 = <!--Can be repeated up to 16 times by changing the number-->
| successor2 = <!--Can be repeated up to 16 times by changing the number-->
| parliamentary_group2 = <!--Can be repeated up to 16 times by changing the number-->
| constituency2 = <!--Can be repeated up to 16 times by changing the number-->
| majority2 = <!--Can be repeated up to 16 times by changing the number-->
| prior_term2 = <!--Can be repeated up to 16 times by changing the number-->
}}
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Ambassador===
{{For|examples of this code in use|Template:Infobox officeholder/example#Ambassador}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| order
| ambassador_from
| country
| term_start
| term_end
| predecessor
| successor
| president
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox ambassador
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| order = <!--Can be repeated up to 16 times by adding a number-->
| ambassador_from = <!--Can be repeated up to 16 times by adding a number-->
| country = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
| president = <!--Can be repeated up to 16 times by adding a number-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Assembly member===
{{For|examples of this code in use|Template:Infobox officeholder/example#Assembly Member}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| constituency_AM
| assembly
| majority
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox AM
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| constituency_AM = <!--Can be repeated up to eight times by adding a number-->
| assembly = <!--Can be repeated up to 16 times by adding a number-->
| majority = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Governor===
{{For|examples of this code in use|Template:Infobox officeholder/example#Governor}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| order
| office
| term_start
| term_end
| lieutenant
| predecessor
| successor
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox governor
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| order = <!--Can be repeated up to 16 times by adding a number-->
| office = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| lieutenant = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
If Governor was appointed by a President, add:
{{Generic template demo
| president
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| president = <!--name of president-->
</syntaxhighlight>
{{clear}}
If Governor appointed by other, add:
{{Generic template demo
| appointer
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| appointer = <!--name of appointer-->
</syntaxhighlight>
{{clear}}
===Judge===
{{For|examples of this code in use|Template:Infobox officeholder/example#Judge}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| office
| term_start
| term_end
| nominator
| appointer
| predecessor
| successor
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox judge
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| office = <!--Can be repeated up to 16 times by changing the number-->
| term_start = <!--Can be repeated up to 16 times by changing the number-->
| term_end = <!--Can be repeated up to 16 times by changing the number-->
| nominator = <!--Can be repeated up to 16 times by changing the number-->
| appointer = <!--Can be repeated up to 16 times by changing the number-->
| predecessor = <!--Can be repeated up to 16 times by changing the number-->
| successor = <!--Can be repeated up to 16 times by changing the number-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===Member of Parliament===
{{For|examples of this code in use|Template:Infobox officeholder/example#Member of Parliament}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| constituency_MP
| parliament
| majority
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox MP
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| constituency_MP = <!--Can be repeated up to eight times by adding a number-->
| parliament = <!--Can be repeated up to 16 times by adding a number-->
| majority = <!--Can be repeated up to 16 times by adding a number-->
| term_start = <!--Can be repeated up to 16 times by adding a number-->
| term_end = <!--Can be repeated up to 16 times by adding a number-->
| predecessor = <!--Can be repeated up to 16 times by adding a number-->
| successor = <!--Can be repeated up to 16 times by adding a number-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
===U.S. Representatives===
====U.S. Congressperson====
{{For|examples of this code in use|Template:Infobox officeholder/example#US Congressperson}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| state
| district
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox Congressman
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| state = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_start = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_end = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| predecessor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| successor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
If Congressperson served as Speaker of the House add:
{{Generic template demo
| speaker
| term_start2
| term_end2
| predecessor2
| successor2
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| speaker = <!--number of office holder-->
| term_start2 =
| term_end2 =
| predecessor2 =
| successor2 =
</syntaxhighlight>
{{clear}}
If Congressman has been elected but not sworn in:
{{Generic template demo
| succeeding
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| succeeding = <!--the name of the incumbent congressman-->
</syntaxhighlight>
{{clear}}
====State Representative====
{{For|examples of this code in use|Template:Infobox officeholder/example#State Representative}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| state_house
| district
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox state representative
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| state_house = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_start = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| term_end = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| predecessor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| successor = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
For Representative from states that have an Assembly, instead of state_house use:
{{Generic template demo
| state_assembly
| district
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state_assembly = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
For Representative from states that have a House of Delegates, instead of state_house use:
{{Generic template demo
| state_delegate
| district
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state_delegate = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
For Representative from states that have a Legislature, instead of state_house use:
{{Generic template demo
| state_legislature
| district
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state_legislature = <!--Can be repeated up to 16 times by adding a number, start at 3-->
| district = <!--Can be repeated up to 16 times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If Representative served as Speaker of the State House add:
{{Generic template demo
| speaker
| state_house
| term_start2
| term_end2
| predecessor2
| successor2
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| speaker = <!--number of office holder-->
| state_house =
| term_start2 =
| term_end2 =
| predecessor2 =
| successor2 =
</syntaxhighlight>
{{clear}}
===U.S. Senators===
====U.S. Senator====
{{For|examples of this code in use|Template:Infobox officeholder/example#US Senator}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| image_size
| image_upright
| alt
| caption
| jr/sr
| state
| term_start
| term_end
| predecessor
| successor
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox senator
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| image_size =
| image_upright =
| alt =
| caption =
| jr/sr = <!--Can be repeated up to eight times by appending 2, 3, etc--> Set to any value to display the "United States Senator from" header. If this parameter is missing or empty, "United States Senator from" will not be displayed.
| state = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_start = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_end = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| predecessor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| successor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
{{Generic template demo
| term_start
| alongside
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| term_start =
| alongside = <!--the name of fellow senator-->
</syntaxhighlight>
{{clear}}
If Senator has just been elected and is a Senator-Elect:
{{Generic template demo
| succeeding
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| succeeding = <!--the name of the incumbent senator-->
</syntaxhighlight>
{{clear}}
If Senator served as Senate Majority Leader add:
{{Generic template demo
| majority_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| majority_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If Senator served as Congressman add:
{{Generic template demo
| state3
| district3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| state3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| district3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
====State Senator====
{{For|examples of this code in use|Template:Infobox officeholder/example#State Senator}}
{{Generic template demo
| honorific_prefix
| name
| honorific_suffix
| image
| alt
| caption
| state_senate
| district
| term_start
| term_end
| predecessor
| successor
| prior_term
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox state senator
| honorific_prefix =
| name =
| honorific_suffix =
| image =
| alt =
| caption =
| state_senate = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| district = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_start = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| term_end = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| predecessor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| successor = <!--Can be repeated up to eight times by appending 2, 3, etc-->
| prior_term =
</syntaxhighlight>
''add [[#Personal data|personal data]]''
{{clear}}
If State Senator served as Majority Leader of the State Senate add:
{{Generic template demo
| majority_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| majority_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If State Senator served as Minority Leader of the State Senate add:
{{Generic template demo
| minority_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| minority_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If State Senator served as Majority Floor Leader of the State Senate add:
{{Generic template demo
| majority_floor_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| majority_floor_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
If State Senator served as Minority Floor Leader of the State Senate add:
{{Generic template demo
| minority_floor_leader3
| term_start3
| term_end3
| predecessor3
| successor3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| minority_floor_leader3 = <!--number of office holder-->
| term_start3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| term_end3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| predecessor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
| successor3 = <!--Can be repeated up to seven times by adding a number, start at 3-->
</syntaxhighlight>
{{clear}}
===Ukrainian legislative office===
{{For|examples of this code in use|Template:Infobox officeholder/example#Ukrainian legislative office}}
{{Generic template demo
| name
| native_name
| native_name_lang
| image
| caption
| office1
| convocation1
| constituency1
| term_start1
| term_end1
| convocation2
| constituency2
| term_start2
| term_end2
| office3
| convocation3
| constituency3
| term_start3
| term_end3
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox Ukrainian legislative office
| name =
| native_name =
| native_name_lang =
| image =
| caption =
| office1 =
| convocation1 =
| constituency1 =
| term_start1 =
| term_end1 =
| convocation2 =
| constituency2 =
| term_start2 =
| term_end2 =
| office3 = <!--Can be repeated up to 16 times by adding a number-->
| convocation3 = <!--Can be repeated up to 16 times by adding a number-->
| constituency3 = <!--Can be repeated up to 16 times by adding a number-->
| term_start3 = <!--Can be repeated up to 16 times by adding a number-->
| term_end3 = <!--Can be repeated up to 16 times by adding a number-->
</syntaxhighlight>
==Personal data==
Place this underneath the template
{{Generic template demo
| pronunciation
| birth_name <!-- only use if different from name -->
| birth_date
| birth_place
| death_date
| death_place
| death_cause <!-- should only be included when the cause of death has significance for the subject's notability -->
| resting_place
| resting_place_coordinates
| citizenship <!-- use only when necessary per [[WP:INFONAT]] -->
| party
| other_party
| height
| spouse <!--Fill only if notable (reference required) or there is a WP article on this person-->
| partner <!--Fill only if notable (reference required) or there is a WP article on this person-->
| relations <!--Fill only if notable (reference required) or there is a WP article on this person-->
| children <!--Fill only if notable (reference required) or there is a WP article on this person-->
| parents <!--Fill only if notable (reference required) or there is a WP article on this person-->
| mother <!--Fill only if notable (reference required) or there is a WP article on this person-->
| father <!--Fill only if notable (reference required) or there is a WP article on this person-->
| relatives <!--Fill only if notable (reference required) or there is a WP article on this person-->
| education
| occupation
| profession
| salary
| known_for
| cabinet
| committees
| portfolio
| awards
| blank1
| data1
| blank2
| data2
| blank3
| data3
| blank4
| data4
| blank5
| data5
| signature
| signature_alt
| website
| nickname
| allegiance
| branch
| service_years
| rank
| unit
| commands
| battles
| mawards
| military_blank1
| military_data1
| military_blank2
| military_data2
| military_blank3
| military_data3
| military_blank4
| military_data4
| military_blank5
| military_data5
| module
| module2
| module3
| module4
| module5
| footnotes
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
| pronunciation =
| birth_name = <!-- only use if different from name -->
| birth_date = <!-- {{Birth date and age|YYYY|MM|DD}} -->
| birth_place =
| death_date = <!-- {{Death date and age|YYYY|MM|DD|YYYY|MM|DD}} -->
| death_place =
| death_cause = <!-- should only be included when the cause of death has significance for the subject's notability -->
| resting_place =
| resting_place_coordinates =
| citizenship = <!-- use only when necessary per [[WP:INFONAT]] -->
| party =
| other_party = <!--For additional political affiliations-->
| height = <!-- "X cm", "X m" or "X ft Y in" plus optional reference (conversions are automatic) -->
| spouse =
| partner = <!--For those with a domestic partner and not married-->
| relations =
| children =
| parents = <!-- overrides mother and father parameters -->
| mother = <!-- may be used (optionally with father parameter) in place of parents parameter (displays "Parent(s)" as label) -->
| father = <!-- may be used (optionally with mother parameter) in place of parents parameter (displays "Parent(s)" as label) -->
| relatives =
| education =
| occupation =
| profession =
| known_for =
| salary =
| cabinet =
| committees =
| portfolio =
| awards = <!-- For civilian awards - appears as "Awards" if |mawards= is not set -->
| blank1 =
| data1 =
| blank2 =
| data2 =
| blank3 =
| data3 =
| blank4 =
| data4 =
| blank5 =
| data5 =
| signature =
| signature_alt =
| signature_size =
| website =
| nickname =
<!--Military service-->
| allegiance =
| branch =
| service_years =
| rank =
| unit =
| commands =
| battles =
| mawards = <!-- for military awards - appears as "Awards" if |awards= is not set -->
| military_blank1 =
| military_data1 =
| military_blank2 =
| military_data2 =
| military_blank3 =
| military_data3 =
| military_blank4 =
| military_data4 =
| military_blank5 =
| military_data5 =
<!--Embedded templates / Footnotes-->
| module =
| module2 =
| module3 =
| module4 =
| module5 =
| footnotes =
}}
</syntaxhighlight>
{{clear}}
<code>nationality</code> is [[Wikipedia:Manual of Style/Infoboxes#Nationality and citizenship in infoboxes|not displayed]] if the corresponding country is mentioned in <code>birth_place</code>, for example <code>|birth_place = Tokyo, Japan |nationality = Japanese</code>.
== Embedding other templates ==
The ''module'' parameters (module, module2, ... module5) may used to embed other templates into this infobox (see [[Wikipedia:Infobox modules]]).
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Infobox officeholder
| name =
| <!-- etc. -->
| module =
{{Infobox football biography | embed = yes
| <!-- etc. -->
}}
}}
</syntaxhighlight>
== Embedding within a different infobox ==
Many officeholders are known for more than just their appointments (e.g., [[Clint Eastwood]]), and hence it may be desirable to merge this infobox with another one, like {{tl|Infobox person}}. By adding {{para|embed|yes}} to the first line of the infobox code, one can embed this infobox into another, creating the illusion of one continuous infobox. Though the process is a little complicated, it is possible to insert this infobox into most if not all other infoboxes. For {{tl|Infobox person}}, this infobox is passed as a "module" using the {{para|module}} syntax.
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{Infobox person
| name = John Infobox
| image = Example.jpg
| caption = John Infobox in 2005
| birth_name = John Officeholder Person Infobox
| birth_date = {{Birth date|1950|5|25}}
| birth_place = Template City
| death_date = {{Death date and age|2010|10|22|1950|5|25}}
| occupation = Actor
| years_active = 1970–1990
| module =
{{Infobox officeholder | embed = yes
| office = Mayor of Wikipedia
| term_start = 1994
| term_end = 1998
}}
| website = {{URL|example.com}}
}}
</syntaxhighlight>
==Microformat==
{{UF-hcard-person}}
==TemplateData==
{{Collapse top|title=[[Wikipedia:TemplateData|TemplateData]] for this template used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>
{
"description": "An infobox for office holders",
"format": "{{_\n| __________________ = _\n}}\n",
"params": {
"name": {
"label": "Name",
"description": "Commonly known name of person (defaults to article name, without disambiguation)",
"type": "line",
"default": "PAGENAME"
},
"bodyclass": {
"label": "bodyclass",
"type": "string"
},
"native_name": {
"label": "Native name",
"type": "string",
"description": "Name in the person's native language",
"example": "Melquíades Rafael Martínez Ruiz"
},
"native_name_lang": {
"label": "Native name language",
"type": "string",
"description": "Language in which the person's native name is",
"example": "ca"
},
"image": {
"label": "Image",
"description": "Filename for the image (e.g. 'Example.jpg').",
"type": "wiki-file-name",
"required": false
},
"alt": {
"label": "Alternative text",
"description": "Alternative text for the image.",
"type": "line"
},
"caption": {
"label": "Image caption",
"description": "Caption for the image.",
"type": "string",
"required": false
},
"alongside": {
"label": "alongside",
"description": "For two or more people serving in the same position from the same district. (e.g. United States senators.)",
"type": "string"
},
"ambassador_from": {
"label": "ambassador from",
"type": "string"
},
"appointer": {
"label": "appointer",
"type": "string"
},
"assembly": {
"label": "assembly",
"type": "string"
},
"chancellor": {
"label": "chancellor",
"type": "string"
},
"co-leader": {
"label": "co-leader",
"type": "string"
},
"constituency_AM": {
"label": "constituency AM",
"type": "string"
},
"constituency": {
"label": "constituency",
"type": "string"
},
"country": {
"label": "country",
"type": "string",
"example": "Israel"
},
"deputy": {
"label": "deputy",
"type": "string"
},
"district": {
"label": "district",
"type": "string"
},
"governor-general": {
"label": "governor-general",
"type": "string"
},
"leader": {
"label": "leader",
"type": "string"
},
"legislature": {
"label": "legislature",
"type": "wiki-page-name",
"example": "[[United States House of Representatives]]"
},
"lieutenant_governor": {
"label": "lieutenant governor",
"type": "string"
},
"lieutenant": {
"label": "lieutenant",
"type": "string"
},
"minister": {
"label": "minister",
"type": "string"
},
"minister_from": {
"label": "minister from",
"type": "string"
},
"minority_floor_leader": {
"label": "minority floor leader",
"type": "string"
},
"majority_floor_leader": {
"label": "majority floor leader",
"type": "string"
},
"monarch": {
"label": "monarch",
"type": "string"
},
"nominator": {
"label": "nominator",
"type": "string"
},
"parliament": {
"label": "parliament",
"type": "string"
},
"predecessor": {
"label": "predecessor",
"type": "string"
},
"preceding": {
"label": "preceding",
"type": "string"
},
"preceded": {
"label": "preceded",
"type": "string"
},
"premier": {
"label": "premier",
"type": "string"
},
"president": {
"label": "president",
"type": "string"
},
"riding": {
"label": "riding",
"type": "string"
},
"status": {
"label": "status",
"description": "If this is specified, overrides Incumbent.",
"type": "string"
},
"succeeded": {
"label": "succeeded",
"type": "string"
},
"succeeding": {
"label": "succeeding",
"description": "For President-elect or equivalent.",
"type": "string"
},
"successor": {
"label": "successor",
"type": "string"
},
"taoiseach": {
"label": "taoiseach",
"type": "string"
},
"term_start": {
"label": "term start",
"type": "string",
"description": "Date of the beginning of the person's term"
},
"term_end": {
"label": "term end",
"type": "string",
"description": "Date for the end of the person's term"
},
"title": {
"label": "title",
"type": "string"
},
"speaker": {
"label": "speaker",
"type": "string"
},
"footnotes": {
"label": "footnotes",
"type": "string"
},
"date": {
"label": "date",
"type": "string"
},
"year": {
"label": "year",
"type": "string"
},
"source": {
"label": "source",
"type": "string"
},
"signature": {
"label": "signature",
"type": "wiki-file-name"
},
"signature_alt": {
"label": "signature alt text",
"type": "string"
},
"alongside2": {
"label": "alongside 2",
"type": "string"
},
"peerage2": {
"label": "peerage 2",
"type": "string"
},
"ambassador_from2": {
"label": "ambassador from 2",
"type": "string"
},
"appointer2": {
"label": "appointer 2",
"type": "string"
},
"assembly2": {
"label": "assembly 2",
"type": "string"
},
"chancellor2": {
"label": "chancellor 2",
"type": "string"
},
"co-leader2": {
"label": "co-leader 2",
"type": "string"
},
"constituency_AM2": {
"label": "constituency AM 2",
"type": "string"
},
"country2": {
"label": "country 2",
"type": "string",
"example": "Malaya"
},
"deputy2": {
"label": "deputy 2",
"type": "string"
},
"district2": {
"label": "district 2",
"type": "string"
},
"governor": {
"label": "governor",
"type": "string"
},
"governor-general2": {
"label": "governor-general 2",
"type": "string"
},
"governor2": {
"label": "governor 2",
"type": "string"
},
"leader2": {
"label": "leader 2",
"type": "string",
"example": "Donald Trump"
},
"legislature2": {
"label": "legislature 2",
"type": "wiki-page-name",
"example": "[[United States Senate]]"
},
"lieutenant_governor2": {
"label": "lieutenant governor 2",
"type": "string"
},
"lieutenant2": {
"label": "lieutenant2",
"type": "string"
},
"majority": {
"label": "majority",
"type": "string"
},
"minister_from2": {
"label": "minister from 2",
"type": "string"
},
"minority_floor_leader2": {
"label": "minority floor leader 2",
"type": "string"
},
"majority_floor_leader2": {
"label": "majority floor leader 2",
"type": "string"
},
"majority2": {
"label": "majority 2",
"type": "string"
},
"minister2": {
"label": "minister 2",
"type": "string"
},
"minority": {
"label": "minority",
"type": "string"
},
"monarch2": {
"label": "monarch 2",
"type": "string"
},
"nominator2": {
"label": "nominator 2",
"type": "string"
},
"order2": {
"label": "order 2",
"type": "string"
},
"parliament2": {
"label": "parliament2",
"type": "string"
},
"predecessor2": {
"label": "predecessor 2",
"type": "string"
},
"preceding2": {
"label": "preceding 2",
"type": "string"
},
"preceded2": {
"label": "preceded 2",
"type": "string"
},
"premier2": {
"label": "premier 2",
"type": "string"
},
"president2": {
"label": "president 2",
"type": "string"
},
"riding2": {
"label": "riding 2",
"type": "string"
},
"speaker_office": {
"label": "speaker office",
"type": "string"
},
"state_assembly": {
"label": "state assembly",
"type": "string"
},
"state_delegate": {
"label": "state delegate",
"type": "string"
},
"state_legislature": {
"label": "state legislature",
"type": "string"
},
"state_senate": {
"label": "state senate",
"type": "string"
},
"state": {
"label": "state",
"type": "string",
"description": "The state this officeholder represents or represented",
"example": "[[Alabama]]"
},
"term": {
"label": "term",
"type": "string"
},
"party": {
"label": "party",
"type": "string"
},
"prior_term": {
"label": "prior_term",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1blankname": {
"label": "1blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1namedata": {
"label": "1namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2blankname": {
"label": "2blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2namedata": {
"label": "2namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3blankname": {
"label": "3blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3namedata": {
"label": "3namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4blankname": {
"label": "4blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4namedata": {
"label": "4namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5blankname": {
"label": "5blankname",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5namedata": {
"label": "5namedata",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1blankname1": {
"label": "1blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"1namedata1": {
"label": "1namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2blankname1": {
"label": "2blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"2namedata1": {
"label": "2namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3blankname1": {
"label": "3blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"3namedata1": {
"label": "3namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4blankname1": {
"label": "4blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"4namedata1": {
"label": "4namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5blankname1": {
"label": "5blankname1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"5namedata1": {
"label": "5namedata1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"alongside1": {
"label": "alongside1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"ambassador_from1": {
"label": "ambassador_from1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"appointer1": {
"label": "appointer1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"assembly1": {
"label": "assembly1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"chair1": {
"label": "chair1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"chancellor1": {
"label": "chancellor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"co-leader1": {
"label": "co-leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"constituency_AM1": {
"label": "constituency_AM1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"constituency1": {
"label": "constituency1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"country1": {
"label": "country1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"deputy1": {
"label": "deputy1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"district1": {
"label": "district1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"first_minister1": {
"label": "first_minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"governor-general1": {
"label": "governor-general1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"governor1": {
"label": "governor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"leader1": {
"label": "leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"legislature1": {
"label": "legislature1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"lieutenant_governor1": {
"label": "lieutenant governor 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"lieutenant1": {
"label": "lieutenant 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minority_floor_leader1": {
"label": "minority floor leader 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minister_from1": {
"label": "minister from 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"majority_floor_leader1": {
"label": "majority_floor_leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"majority1": {
"label": "majority1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minister1": {
"label": "minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"monarch1": {
"label": "monarch1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"nominator1": {
"label": "nominator1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"office1": {
"label": "office1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"order1": {
"label": "order1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"parliament1": {
"label": "parliament1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"predecessor1": {
"label": "predecessor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"preceding1": {
"label": "preceding1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"preceded1": {
"label": "preceded1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"premier1": {
"label": "premier1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"president1": {
"label": "president1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"riding1": {
"label": "riding 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_assembly1": {
"label": "state_assembly1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_delegate1": {
"label": "state_delegate1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_house1": {
"label": "state_house1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_legislature1": {
"label": "state_legislature1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_senate1": {
"label": "state_senate1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state1": {
"label": "state1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"succeeded1": {
"label": "succeeded1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"succeeding1": {
"label": "succeeding1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"successor1": {
"label": "successor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"taoiseach1": {
"label": "taoiseach1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term1": {
"label": "term1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"title1": {
"label": "title1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vicechair1": {
"label": "vicechair1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_governor1": {
"label": "vice_governor1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_president1": {
"label": "vice_president1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_premier1": {
"label": "vice_premier1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"vice_prime_minister1": {
"label": "vice_prime_minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"prior_term1": {
"label": "prior term 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term2": {
"label": "term 2",
"type": "string"
},
"title2": {
"label": "title 2",
"type": "string"
},
"vice_governor2": {
"label": "vice governor 2",
"type": "string"
},
"vice_president2": {
"label": "vice president 2",
"type": "string"
},
"vice_premier2": {
"label": "vice premier 2",
"type": "string"
},
"vice_prime_minister2": {
"label": "vice prime minister 2",
"type": "string"
},
"succeeded2": {
"label": "succeeded 2",
"type": "string"
},
"succeeding2": {
"label": "succeeding 2",
"type": "string"
},
"successor2": {
"label": "successor 2",
"type": "string"
},
"taoiseach2": {
"label": "taoiseach 2",
"type": "string"
},
"state_assembly2": {
"label": "state assembly2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_delegate2": {
"label": "state delegate2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_legislature2": {
"label": "state legislature 2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state_senate2": {
"label": "state senate2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"state 2": {
"label": "state 2",
"description": "Additional fields numbered up to 14",
"type": "string",
"example": "[[Georgia (U.S. State)|Georgia]]"
},
"prior_term2": {
"label": "prior term 2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"birth_name": {
"label": "Birth name",
"description": "Name at birth, if different from 'name'.",
"type": "string",
"required": false,
"aliases": [
"birthname"
]
},
"birth_date": {
"label": "Birth date",
"description": "Date of birth. Use {{birth date and age}} (for living people) or {{birth date}} for the deceased.",
"type": "line",
"required": false
},
"birth_place": {
"label": "Birth place",
"description": "Place of birth.",
"type": "line"
},
"death_date": {
"label": "Death date",
"description": "Date of death. Use {{death date and age}}. Use {{death date}} if birth date unknown or incomplete.",
"type": "content"
},
"death_place": {
"label": "Death place",
"description": "The person's place of death, if deceased",
"type": "line",
"required": false,
"example": "[[Crown Heights]]"
},
"resting_place": {
"label": "Resting place",
"description": "Person's grave, etc.",
"type": "line",
"required": false
},
"resting_place_coordinates": {
"label": "Resting place",
"description": "Coordinates of grave, etc. Use {{Coord|LAT|LONG|type:landmark|display=inline}}",
"type": "line"
},
"citizenship": {
"label": "citizenship",
"type": "string",
"description": "The person's country of citizenship",
"example": "[[Germany]]"
},
"spouse": {
"label": "Spouse(s)",
"description": "Name of spouse(s), followed by years of marriage.",
"type": "string",
"required": false
},
"partner": {
"label": "Partner(s)",
"description": "Domestic partner(s), if notable",
"type": "string"
},
"relations": {
"label": "relations",
"type": "string"
},
"children": {
"label": "children",
"type": "string"
},
"parents": {
"label": "parents",
"type": "string"
},
"occupation": {
"label": "Occupation",
"description": " Please observe sentence case and capitalise only the first letter of the first item: (i.e. Politician, entrepreneur, businessman)",
"type": "string"
},
"profession": {
"label": "Profession",
"description": " Please observe sentence case and capitalise only the first letter of the first item: (i.e. Attorney, accountant)",
"type": "string"
},
"cabinet": {
"label": "cabinet",
"type": "string"
},
"committees": {
"label": "committees",
"type": "string"
},
"portfolio": {
"label": "portfolio",
"type": "string"
},
"blank1": {
"label": "blank1",
"description": "Also blank2 ... blank5",
"type": "string"
},
"data1": {
"label": "data1",
"description": "Also data2 ... data5",
"type": "string"
},
"website": {
"label": "Official website",
"description": "Office holder's official website, using {{URL}}.",
"type": "line"
},
"nickname": {
"label": "nickname",
"type": "string"
},
"allegiance": {
"label": "allegiance",
"type": "string"
},
"branch": {
"label": "branch",
"type": "string"
},
"rank": {
"label": "rank",
"type": "string"
},
"unit": {
"label": "unit",
"type": "string"
},
"commands": {
"label": "commands",
"type": "string"
},
"battles": {
"label": "battles fought",
"type": "string"
},
"military_blank1": {
"label": "military blank 1",
"description": "Also military_blank2 ... military_blank5",
"type": "string"
},
"military_data1": {
"label": "military data 1",
"description": "Also military_data2 ... military_data5",
"type": "string"
},
"1blankname2": {
"label": "1blankname2",
"type": "string"
},
"1namedata2": {
"label": "1namedata2",
"type": "string"
},
"2blankname2": {
"label": "2blankname2",
"type": "string"
},
"2namedata2": {
"label": "2namedata2",
"type": "string"
},
"3blankname2": {
"label": "3blankname2",
"type": "string"
},
"3namedata2": {
"label": "3namedata2",
"type": "string"
},
"4blankname2": {
"label": "4blankname2",
"type": "string"
},
"4namedata2": {
"label": "4namedata2",
"type": "string"
},
"5blankname2": {
"label": "5blankname2",
"type": "string"
},
"5namedata2": {
"label": "5namedata2",
"type": "string"
},
"pronunciation": {
"label": "Name pronunciation",
"type": "string"
},
"honorific_prefix": {
"label": "honorific prefix",
"description": "Title such as 'The Honourable', 'His/Her Excellency'",
"type": "wiki-page-name",
"required": false
},
"image_size": {
"label": "Image size",
"description": "Size of the image (e.g. '220px').",
"type": "line",
"default": "varies",
"required": false
},
"education": {
"label": "Education",
"description": "Where or with whom the officeholder trained. If university degrees, list the full article title of each degree-granting parent institution, followed by degree(s) earned in parentheses, e.g. an alumnus of [[Harvard College]], [[Harvard Law School]], and the [[Kellogg School of Management]] would be listed as: [[Harvard University]] (BA, JD) [[Northwestern University]] (MBA).",
"type": "string",
"required": false
},
"awards": {
"label": "Awards",
"description": "Awards won by the officeholder. Consider using {{awd}}.",
"type": "line",
"required": false
},
"vicemayor": {
"label": "vice mayor",
"type": "string"
},
"viceregent": {
"label": "vice regent",
"type": "string"
},
"main_width": {
"label": "Main width ",
"type": "string",
"default": "22em"
},
"first_minister": {
"label": "first minister",
"type": "string"
},
"majority_leader": {
"label": "majority leader",
"type": "string"
},
"minority_leader": {
"label": "minority leader",
"example": "[[Chuck Shumer]]",
"type": "string"
},
"parliamentary_group": {
"label": "parliamentary group",
"type": "string"
},
"prime_minister": {
"label": "prime_minister",
"type": "string"
},
"vice_governor": {
"label": "vice governor",
"type": "string"
},
"vice_president": {
"label": "vice president",
"type": "string"
},
"vice_premier": {
"label": "vice premier",
"type": "string"
},
"vice_prime_minister": {
"label": "vice prime minister",
"type": "string"
},
"first_minister2": {
"label": "first minister 2",
"type": "string"
},
"majority_leader2": {
"label": "majority leader 2",
"example": "Mitch McConnell",
"type": "string"
},
"minority_leader2": {
"label": "minority leader 2",
"example": "[[Chuck Shumer]]",
"type": "string"
},
"parliamentary_group2": {
"label": "parliamentary group 2",
"type": "string"
},
"prime_minister2": {
"label": "prime minister 2",
"type": "string"
},
"majority_leader1": {
"label": "majority_leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"minority_leader1": {
"label": "minority_leader1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"parliamentary_group1": {
"label": "parliamentary group 1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"prime_minister1": {
"label": "prime_minister1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term_start1": {
"label": "termstart1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"term_end1": {
"label": "termend1",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"other_party": {
"label": "other political party",
"type": "string"
},
"service_years": {
"label": "Service Years",
"type": "string",
"description": "The years during which the person served. Use the format 1939–1945, or 2001–present if still active (note the use of an en dash, not hyphen)"
},
"term_start2": {
"label": "term start 2",
"type": "string"
},
"term_end2": {
"label": "term end 2",
"type": "string"
},
"honorific_suffix": {
"label": "honorific suffix",
"type": "wiki-page-name",
"description": "Initials such as 'OBE', 'FRSA'"
},
"office": {
"label": "office",
"description": "Office held",
"type": "string"
},
"office2": {
"label": "office2",
"description": "Additional fields numbered up to 14",
"type": "string"
},
"order": {
"label": "order",
"description": "Used in conjunction with 'office' to state that the officeholder is the nth holder of the office",
"type": "string"
},
"image_upright": {}
},
"paramOrder": [
"name",
"office",
"bodyclass",
"order",
"main_width",
"native_name",
"native_name_lang",
"image",
"image_size",
"image_upright",
"alt",
"caption",
"alongside",
"ambassador_from",
"appointer",
"assembly",
"chancellor",
"co-leader",
"constituency_AM",
"constituency",
"country",
"deputy",
"district",
"first_minister",
"governor-general",
"leader",
"legislature",
"lieutenant_governor",
"lieutenant",
"majority_leader",
"minister",
"minister_from",
"minority_floor_leader",
"majority_floor_leader",
"minority_leader",
"monarch",
"nominator",
"parliament",
"parliamentary_group",
"predecessor",
"preceding",
"preceded",
"premier",
"president",
"prime_minister",
"riding",
"status",
"succeeded",
"succeeding",
"successor",
"taoiseach",
"term_start",
"term_end",
"title",
"vice_governor",
"vice_president",
"vice_premier",
"vice_prime_minister",
"speaker",
"footnotes",
"date",
"year",
"source",
"signature",
"signature_alt",
"alongside2",
"peerage2",
"ambassador_from2",
"appointer2",
"assembly2",
"chancellor2",
"co-leader2",
"constituency_AM2",
"country2",
"deputy2",
"district2",
"first_minister2",
"governor",
"governor-general2",
"governor2",
"leader2",
"legislature2",
"lieutenant_governor2",
"lieutenant2",
"majority",
"majority_leader2",
"minister_from2",
"minority_floor_leader2",
"majority_floor_leader2",
"majority2",
"minister2",
"minority",
"minority_leader2",
"monarch2",
"nominator2",
"office2",
"order2",
"parliament2",
"parliamentary_group2",
"predecessor2",
"preceding2",
"preceded2",
"premier2",
"president2",
"prime_minister2",
"riding2",
"speaker_office",
"state_assembly",
"state_delegate",
"state_legislature",
"state_senate",
"state",
"term",
"party",
"prior_term",
"1blankname",
"1namedata",
"2blankname",
"2namedata",
"3blankname",
"3namedata",
"4blankname",
"4namedata",
"5blankname",
"5namedata",
"1blankname1",
"1namedata1",
"2blankname1",
"2namedata1",
"3blankname1",
"3namedata1",
"4blankname1",
"4namedata1",
"5blankname1",
"5namedata1",
"alongside1",
"ambassador_from1",
"appointer1",
"assembly1",
"chair1",
"chancellor1",
"co-leader1",
"constituency_AM1",
"constituency1",
"country1",
"deputy1",
"district1",
"first_minister1",
"governor-general1",
"governor1",
"leader1",
"legislature1",
"lieutenant_governor1",
"lieutenant1",
"minority_floor_leader1",
"minister_from1",
"majority_floor_leader1",
"majority_leader1",
"majority1",
"minister1",
"minority_leader1",
"monarch1",
"nominator1",
"office1",
"order1",
"parliament1",
"parliamentary_group1",
"predecessor1",
"preceding1",
"preceded1",
"premier1",
"president1",
"prime_minister1",
"riding1",
"state_assembly1",
"state_delegate1",
"state_house1",
"state_legislature1",
"state_senate1",
"state1",
"succeeded1",
"succeeding1",
"successor1",
"taoiseach1",
"term_start1",
"term_end1",
"term1",
"title1",
"vicechair1",
"vice_governor1",
"vice_president1",
"vice_premier1",
"vice_prime_minister1",
"prior_term1",
"term_start2",
"term_end2",
"term2",
"title2",
"vice_governor2",
"vice_president2",
"vice_premier2",
"vice_prime_minister2",
"succeeded2",
"succeeding2",
"successor2",
"taoiseach2",
"state_assembly2",
"state_delegate2",
"state_legislature2",
"state_senate2",
"state 2",
"prior_term2",
"birth_name",
"birth_date",
"birth_place",
"death_date",
"death_place",
"resting_place",
"resting_place_coordinates",
"citizenship",
"other_party",
"spouse",
"partner",
"relations",
"children",
"parents",
"education",
"occupation",
"profession",
"cabinet",
"committees",
"portfolio",
"blank1",
"data1",
"website",
"nickname",
"allegiance",
"branch",
"service_years",
"rank",
"unit",
"commands",
"battles",
"military_blank1",
"military_data1",
"1blankname2",
"1namedata2",
"2blankname2",
"2namedata2",
"3blankname2",
"3namedata2",
"4blankname2",
"4namedata2",
"5blankname2",
"5namedata2",
"pronunciation",
"awards",
"honorific_prefix",
"honorific_suffix",
"vicemayor",
"viceregent"
]
}
</templatedata>
{{Collapse bottom}}
== Tracking categories ==
'''Hidden tracking/maintenance categories (in main and supporting templates)'''
{{Infobox tracking cats}}
* {{clc|Biography template using pronunciation}}
* {{clc|Pages using infobox officeholder with ambassador from or minister from}}
* {{clc|Pages using infobox officeholder with both term and term_start or term_end}}
* {{clc|Pages using infobox officeholder with office0}}
* {{clc|Pages using infobox officeholder with speaker}}
* {{clc|Pages using infobox officeholder with succeeding and term or termend}}
== See also ==
* [[Template:S-start]] ([[Wikipedia:WikiProject Succession Box Standardization|succession box standardization]])
'''Supporting templates'''
* [[Template:Infobox officeholder/office]]
* <!-- [[Template:Infobox officeholder/Personal data]] -->
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Infobox templates|Officeholder]]
[[Category:Politics and government infobox templates|Officeholder]]
[[Category:People and person infobox templates|Officeholder]]
[[Category:Infobox templates with module parameter|Officeholder]]
[[Category:Biographical templates usable as a module|Officeholder]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
p0u643gvtorli09ocicvehbtp8evcn6
Tempilet:Person infobox header
10
2600
33256
2026-10-18T22:05:36Z
en>Colonies Chris
0
33256
wikitext
text/x-wiki
{{ombox|type=content|text=The design and content of [[:Category:People and person infobox templates|biographical infoboxes]] must comply with Wikipedia's [[Wikipedia:Verifiability|verifiability policy]], as well as the [[Wikipedia:Manual of Style/Infoboxes|infobox]] and [[Wikipedia:Manual of Style/Biography|biographical style guidelines]]. All content displayed by this template must adhere to the '''[[Wikipedia:Biographies of living persons|biographies of living persons policy]]''' when applicable. [[Wikipedia:Citing sources|Unsourced or poorly sourced]] [[Wikipedia:Contentious|contentious]] material '''must be removed''', especially if it is potentially [[Wikipedia:Libel|libelous]].}}<noinclude>
{{documentation
|content=
{{improve documentation}}
[[Category:People and person infobox templates]]
}}
</noinclude>
rxqv6j4gt8jqgawqtoo7bapuqujd7bc
33257
33256
2026-11-11T21:49:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Person_infobox_header]]
33256
wikitext
text/x-wiki
{{ombox|type=content|text=The design and content of [[:Category:People and person infobox templates|biographical infoboxes]] must comply with Wikipedia's [[Wikipedia:Verifiability|verifiability policy]], as well as the [[Wikipedia:Manual of Style/Infoboxes|infobox]] and [[Wikipedia:Manual of Style/Biography|biographical style guidelines]]. All content displayed by this template must adhere to the '''[[Wikipedia:Biographies of living persons|biographies of living persons policy]]''' when applicable. [[Wikipedia:Citing sources|Unsourced or poorly sourced]] [[Wikipedia:Contentious|contentious]] material '''must be removed''', especially if it is potentially [[Wikipedia:Libel|libelous]].}}<noinclude>
{{documentation
|content=
{{improve documentation}}
[[Category:People and person infobox templates]]
}}
</noinclude>
rxqv6j4gt8jqgawqtoo7bapuqujd7bc
Tempilet:Country prefix the
10
2601
33258
2026-09-04T17:13:28Z
en>HouseBlaster
0
remove mostly broken subst-ability; add four more states
33258
wikitext
text/x-wiki
<includeonly>{{#switch: {{{1|}}}
| Australian Capital Territory | Austrian Empire | Bahamas | Batavian Republic | Belgian Congo | British Antarctic Territory | British Empire | British Virgin Islands | Bukharan People's Soviet Republic | Cape Colony | Captaincy General of Chile | Caribbean | Cayman Islands | Central African Republic | Channel Islands | Collectivity of Saint Martin | Colony of Natal | Colony of Santiago | Comoros | Confederation of the Rhine | Congo Free State | Cook Islands | Cossack Hetmanate | Crown Dependencies | Czech Republic | Danish colonial empire | Democratic Republic of the Congo | Dominican Republic | Dominion of Newfoundland | Donetsk People's Republic | Duchy of Nassau | Duchy of Modena and Reggio | Dutch Caribbean | Dutch East Indies | Dutch Empire | Dutch Republic | Empire of Brazil | European Union | Falkland Islands | Falkland Islands Dependencies | Faroe Islands | Federal District (Brazil) | Federal Republic of Central America | Federal Republic of Yugoslavia | Federated States of Micronesia | Federation of Rhodesia and Nyasaland | First French Empire | French Union | French colonial empire | Gambia | German Empire | German colonial empire | German Confederation | Greater Republic of Central America | Gilbert and Ellice Islands | Gilbert Islands | Gold Coast (British colony) | Granadine Confederation | Grand Duchy of Hesse | Grand Duchy of Tuscany | Habsburg monarchy | Habsburg Netherlands | Hawaiian Kingdom | Holy Roman Empire | Holy See | Inca civilization | Ionian Islands (region) | Irish Free State | Isle of Man | Italian Empire | Japanese colonial empire | Kazakh Autonomous Socialist Soviet Republic | Kazakh Soviet Socialist Republic | Kingdom of Dahomey | Kingdom of England | Kingdom of Great Britain | Kingdom of Hanover | Kingdom of Hawaii | Kingdom of Jerusalem | Kingdom of Naples | Kingdom of Sardinia | Kingdom of Saxony | Kingdom of Scotland | Kingdom of Sicily | Kingdom of the Two Sicilies | Kirghiz Soviet Socialist Republic | Kurdistan Region (Iraq) | Luhansk People's Republic | Maldives | Mamluk Sultanate | Maratha Empire | Marshall Islands | Moldavian Autonomous Soviet Socialist Republic | Moldavian Soviet Socialist Republic | Mongol Empire | Mughal Empire | Nagorno-Karabakh Republic | Natalia Republic | Netherlands | Netherlands Antilles | New Hebrides | New Kingdom of Granada | North Aegean | North German Confederation | Northern Mariana Islands | Northern Territory | Orange Free State | Ottoman Empire | Palestinian territories | Papal States | Philippines | Pitcairn Islands | Polish–Lithuanian Commonwealth | Portuguese Empire | Province of Quebec (1763–1791) | Republic of Artsakh | Republic of Dahomey | Republic of Florence | Republic of Genoa | Republic of Ireland | Republic of Macedonia | Republic of New Granada | Republic of Texas | Republic of the Congo | Republic of the Congo (Léopoldville) | Republic of Venice | Russian Empire | Sahrawi Arab Democratic Republic | Socialist Republic of Macedonia | Solomon Islands | South Aegean | South African Republic | Southern Nigeria Protectorate | Southwest Territory | Soviet Union | Spanish East Indies | Spanish Empire | Spanish West Indies | State of Mexico | State of Palestine | Straits Settlements | Swedish colonial empire | Territory of New Guinea | Territory of Papua | Thirteen Colonies | Trucial States | Trust Territory of the Pacific Islands | Turkmen Soviet Socialist Republic | Turks and Caicos Islands | United Arab Emirates | United Kingdom | United States | United States Virgin Islands | Vermont Republic | Viceroyalty of New Granada | Viceroyalty of Peru | Viceroyalty of the Río de la Plata | Zulu Kingdom =<!--
-->{{#ifeq: {{Yesno-no|{{{capitalised|{{{capitalized|}}}}}}}}|yes|The|the}} {{#ifeq: {{Yesno-no|{{{onlythe|}}}}}|yes||{{{1|}}}}}<!--
-->|#default={{#ifeq: {{Yesno-no|{{{onlythe|}}}}}|yes||{{{1|}}}}}<!--
-->}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
e6dy17uyql1xeud7qgvold9jrnqs5gh
33259
33258
2026-11-11T21:49:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Country_prefix_the]]
33258
wikitext
text/x-wiki
<includeonly>{{#switch: {{{1|}}}
| Australian Capital Territory | Austrian Empire | Bahamas | Batavian Republic | Belgian Congo | British Antarctic Territory | British Empire | British Virgin Islands | Bukharan People's Soviet Republic | Cape Colony | Captaincy General of Chile | Caribbean | Cayman Islands | Central African Republic | Channel Islands | Collectivity of Saint Martin | Colony of Natal | Colony of Santiago | Comoros | Confederation of the Rhine | Congo Free State | Cook Islands | Cossack Hetmanate | Crown Dependencies | Czech Republic | Danish colonial empire | Democratic Republic of the Congo | Dominican Republic | Dominion of Newfoundland | Donetsk People's Republic | Duchy of Nassau | Duchy of Modena and Reggio | Dutch Caribbean | Dutch East Indies | Dutch Empire | Dutch Republic | Empire of Brazil | European Union | Falkland Islands | Falkland Islands Dependencies | Faroe Islands | Federal District (Brazil) | Federal Republic of Central America | Federal Republic of Yugoslavia | Federated States of Micronesia | Federation of Rhodesia and Nyasaland | First French Empire | French Union | French colonial empire | Gambia | German Empire | German colonial empire | German Confederation | Greater Republic of Central America | Gilbert and Ellice Islands | Gilbert Islands | Gold Coast (British colony) | Granadine Confederation | Grand Duchy of Hesse | Grand Duchy of Tuscany | Habsburg monarchy | Habsburg Netherlands | Hawaiian Kingdom | Holy Roman Empire | Holy See | Inca civilization | Ionian Islands (region) | Irish Free State | Isle of Man | Italian Empire | Japanese colonial empire | Kazakh Autonomous Socialist Soviet Republic | Kazakh Soviet Socialist Republic | Kingdom of Dahomey | Kingdom of England | Kingdom of Great Britain | Kingdom of Hanover | Kingdom of Hawaii | Kingdom of Jerusalem | Kingdom of Naples | Kingdom of Sardinia | Kingdom of Saxony | Kingdom of Scotland | Kingdom of Sicily | Kingdom of the Two Sicilies | Kirghiz Soviet Socialist Republic | Kurdistan Region (Iraq) | Luhansk People's Republic | Maldives | Mamluk Sultanate | Maratha Empire | Marshall Islands | Moldavian Autonomous Soviet Socialist Republic | Moldavian Soviet Socialist Republic | Mongol Empire | Mughal Empire | Nagorno-Karabakh Republic | Natalia Republic | Netherlands | Netherlands Antilles | New Hebrides | New Kingdom of Granada | North Aegean | North German Confederation | Northern Mariana Islands | Northern Territory | Orange Free State | Ottoman Empire | Palestinian territories | Papal States | Philippines | Pitcairn Islands | Polish–Lithuanian Commonwealth | Portuguese Empire | Province of Quebec (1763–1791) | Republic of Artsakh | Republic of Dahomey | Republic of Florence | Republic of Genoa | Republic of Ireland | Republic of Macedonia | Republic of New Granada | Republic of Texas | Republic of the Congo | Republic of the Congo (Léopoldville) | Republic of Venice | Russian Empire | Sahrawi Arab Democratic Republic | Socialist Republic of Macedonia | Solomon Islands | South Aegean | South African Republic | Southern Nigeria Protectorate | Southwest Territory | Soviet Union | Spanish East Indies | Spanish Empire | Spanish West Indies | State of Mexico | State of Palestine | Straits Settlements | Swedish colonial empire | Territory of New Guinea | Territory of Papua | Thirteen Colonies | Trucial States | Trust Territory of the Pacific Islands | Turkmen Soviet Socialist Republic | Turks and Caicos Islands | United Arab Emirates | United Kingdom | United States | United States Virgin Islands | Vermont Republic | Viceroyalty of New Granada | Viceroyalty of Peru | Viceroyalty of the Río de la Plata | Zulu Kingdom =<!--
-->{{#ifeq: {{Yesno-no|{{{capitalised|{{{capitalized|}}}}}}}}|yes|The|the}} {{#ifeq: {{Yesno-no|{{{onlythe|}}}}}|yes||{{{1|}}}}}<!--
-->|#default={{#ifeq: {{Yesno-no|{{{onlythe|}}}}}|yes||{{{1|}}}}}<!--
-->}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
e6dy17uyql1xeud7qgvold9jrnqs5gh
Tempilet:Infobox tracking categories
10
2602
33262
2026-09-03T23:33:43Z
en>Zackmann08
0
Reverted 1 edit by [[Special:Contributions/Shkuru Afshar|Shkuru Afshar]] ([[User talk:Shkuru Afshar|talk]]): Unnecessary html comments.
33262
wikitext
text/x-wiki
<includeonly>{{#ifexist: Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with conflicting parameters|
* {{Category link with count|Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with conflicting parameters}}}}{{#ifexist: Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with deprecated parameters|
* {{Category link with count|Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with deprecated parameters}}}}{{#ifexist: Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with unknown parameters|
* {{Category link with count|Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with unknown parameters}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
bh542nwsz96fraf5o4w0gwcb8evjt92
33263
33262
2026-11-11T21:49:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_tracking_categories]]
33262
wikitext
text/x-wiki
<includeonly>{{#ifexist: Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with conflicting parameters|
* {{Category link with count|Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with conflicting parameters}}}}{{#ifexist: Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with deprecated parameters|
* {{Category link with count|Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with deprecated parameters}}}}{{#ifexist: Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with unknown parameters|
* {{Category link with count|Category:Pages using {{lcfirst:{{If empty|{{{1|}}}|{{BASEPAGENAME}}}}}} with unknown parameters}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
bh542nwsz96fraf5o4w0gwcb8evjt92
Tempilet:Infobox tracking cats
10
2603
33264
2026-07-10T18:00:01Z
en>MusikBot II
0
Protected "[[Template:Infobox tracking cats]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 253 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33264
wikitext
text/x-wiki
#redirect [[Template:Infobox tracking categories]]
{{R for convenience}}
k924lohln0pw2huxuo2k0k7gyahe3m3
33265
33264
2026-11-11T21:49:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_tracking_cats]]
33264
wikitext
text/x-wiki
#redirect [[Template:Infobox tracking categories]]
{{R for convenience}}
k924lohln0pw2huxuo2k0k7gyahe3m3
Tempilet:Stack begin
10
2604
33267
2024-06-06T17:39:09Z
en>SilverLocust
0
re-add mw-stack per edit request in line with [[Tenplate:Stack]]
33267
wikitext
text/x-wiki
<templatestyles src="Stack/styles.css"/><div class="stack mw-stack {{#switch:{{{float|right}}}|left=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|left|true=clear-}}left|right=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|right|true=clear-}}right}}"><!--
--><div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}><!--
-->{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using stack with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Stack begin]] with unknown parameter "_VALUE_"|ignoreblank=y| cellspacing | clear | float | margin }}<noinclude>
{{stack end}}
{{documentation}}
</noinclude>
fk08z8f1fbxa0f5lixlz7knsqh4kucn
33268
33267
2026-11-11T21:51:59Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Stack_begin]]
33267
wikitext
text/x-wiki
<templatestyles src="Stack/styles.css"/><div class="stack mw-stack {{#switch:{{{float|right}}}|left=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|left|true=clear-}}left|right=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|right|true=clear-}}right}}"><!--
--><div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}><!--
-->{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using stack with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Stack begin]] with unknown parameter "_VALUE_"|ignoreblank=y| cellspacing | clear | float | margin }}<noinclude>
{{stack end}}
{{documentation}}
</noinclude>
fk08z8f1fbxa0f5lixlz7knsqh4kucn
Tempilet:Portal
10
2605
33269
2024-11-25T21:42:43Z
en>Pppery
0
Changed protection settings for "[[Template:Portal]]": [[WP:High-risk templates|High-risk template or module]]: Up to full due to 9 million transclusions - the image modules are split by letter and can stay TPE ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
33269
wikitext
text/x-wiki
<includeonly>{{#invoke:Portal|portal}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata -->
</noinclude>
eu0a2ons0y70cfblniy3kcxuib58bvt
33270
33269
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Portal]]
33269
wikitext
text/x-wiki
<includeonly>{{#invoke:Portal|portal}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata -->
</noinclude>
eu0a2ons0y70cfblniy3kcxuib58bvt
Module:Portal
828
2606
33271
2025-05-24T18:07:03Z
en>Pppery
0
Reapply fixed version
33271
Scribunto
text/plain
--[==[ This module is a Lua implementation of the old {{Portal}} template. As of February 2019 it is used on nearly 7,900,000 articles.
-- Please take care when updating it! It outputs two functions: p.portal, which generates a list of portals, and p.image, which
-- produces the image name for an individual portal.
-- The portal image data is kept in submodules of [[Module:Portal/images]], listed below:
-- [[Module:Portal/images/a]] - for portal names beginning with "A".
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/c]] - for portal names beginning with "C".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
--
-- The images data pages are separated by the first letter to reduce server load when images are added, changed, or removed.
-- Previously all the images were on one data page at [[Module:Portal/images]], but this had the disadvantage that all
-- 5,000,000 pages using this module needed to be refreshed every time an image was added or removed.
]==]
local p = {}
-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''
local function sandboxVersion(s)
return isSandbox and s..'-sand' or s
end
local templatestyles = 'Module:Portal'..sandbox..'/styles.css'
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
-- List of non-talk namespaces which should not be tracked (Talk pages are never tracked)
local badNamespaces = {'user','template','draft','wikipedia'}
-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTracking(title)
local thisPage = title or mw.title.getCurrentTitle()
if thisPage.isTalkPage then
return false
end
local ns = thisPage.nsText:lower()
for _, v in ipairs(badNamespaces) do
if ns == v then
return false
end
end
return true
end
local function matchImagePage(s)
-- Finds the appropriate image subpage given a lower-case
-- portal name plus the first letter of that portal name.
if type(s) ~= 'string' or #s < 1 then return end
local firstLetter = mw.ustring.sub(s, 1, 1)
local imagePage
if mw.ustring.find(firstLetter, '^[a-z]') then
imagePage = 'Module:Portal/images/' .. firstLetter .. sandbox
else
imagePage = 'Module:Portal/images/other' .. sandbox
end
return mw.loadData(imagePage)[s]
end
local function getAlias(s)
-- Gets an alias from the image alias data page.
local aliasData = mw.loadData('Module:Portal/images/aliases'..sandbox)
for portal, aliases in pairs(aliasData) do
for _, alias in ipairs(aliases) do
if alias == s then
return portal
end
end
end
end
local defaultImage = 'Portal-puzzle.svg|link=|alt='
local function getImageName(s)
-- Gets the image name for a given string.
if type(s) ~= 'string' or #s < 1 then
return defaultImage
end
s = mw.ustring.lower(s)
local image = matchImagePage(s) or matchImagePage(getAlias(s)) or defaultImage
image = mw.ustring.gsub(image,'^File:','') --- strip mistaken leading File: or Image:
image = mw.ustring.gsub(image,'^Image:','')
return image
end
local function exists(title)
local success, exists = pcall(function() return title.exists end)
-- If success = false, then we're out of expensive parser function calls and can't check whether it exists
-- in that case, don't throw a Lua error
return not success or exists
end
-- Function to check argument portals for errors, generate tracking categories if needed
-- Function first checks for too few/many portals provided
-- Then checks the portal list to purge any portals that don't exist
-- Arguments:
-- portals: raw list of portals
-- args.tracking: is tracking requested? (will not track on bad titles or namespaces)
-- args.redlinks: should redlinks be displayed?
-- args.minPortals: minimum number of portal arguments
-- args.maxPortals: maximum number of portal arguments
-- Returns:
-- portals = list of portals, with redlinks purged (if args.redlinks=false)
-- trackingCat = possible tracking category
-- errorMsg = error message
function p._checkPortals(portals, args)
local trackingCat = ''
local errMsg = nil
-- Tracking is on by default.
-- It is disabled if any of the following is true
-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
-- 2/ the current page fails the namespace or pagename tests
local trackingEnabled = args.tracking and checkTracking()
args.minPortals = args.minPortals or 1
args.maxPortals = args.maxPortals or -1
-- check for too few portals
if #portals < args.minPortals then
errMsg = 'please specify at least '..args.minPortals..' portal'..(args.minPortals > 1 and 's' or '')
trackingCat = (trackingEnabled and '[[Category:Portal templates with too few portals]]' or '')
return portals, trackingCat, errMsg
end
-- check for too many portals
if args.maxPortals >= 0 and #portals > args.maxPortals then
errMsg = 'too many portals (maximum = '..args.maxPortals..')'
trackingCat = (trackingEnabled and '[[Category:Portal templates with too many portals]]' or '')
return portals, trackingCat, errMsg
end
if not args.redlinks or trackingEnabled then
-- make new list of portals that exist
local existingPortals = {}
for _, portal in ipairs(portals) do
local portalTitle = mw.title.new(portal,"Portal")
-- if portal exists, put it into list
if portalTitle and exists(portalTitle) then
table.insert(existingPortals,portal)
-- otherwise set tracking cat
elseif trackingEnabled then
trackingCat = "[[Category:Portal templates with redlinked portals]]"
end
end
-- If redlinks is off, use portal list purged of redlinks
portals = args.redlinks and portals or existingPortals
-- if nothing left after purge, set tracking cat
if #portals == 0 and trackingEnabled then
trackingCat = trackingCat.."[[Category:Pages with empty portal template]]"
end
end
return portals, trackingCat, errMsg
end
local function portalBox(args)
return mw.html.create('ul')
:attr('role', 'navigation')
:attr('aria-label', 'Portals')
:addClass('noprint')
:addClass(args.error and '' or sandboxVersion('portalbox'))
:addClass(args.border and sandboxVersion('portalborder') or '')
:addClass(sandboxVersion(args.left and 'portalleft' or 'portalright'))
:css('margin', args.margin or nil)
:newline()
end
local function fillBox(root, contents)
for _, item in ipairs(contents) do
local entry = root:tag('li')
entry:addClass(sandboxVersion('portalbox-entry'))
local image = entry:tag('span')
image:addClass(sandboxVersion('portalbox-image'))
image:wikitext(item[1])
local link = entry:tag('span')
link:addClass(sandboxVersion('portalbox-link'))
link:wikitext(item[2])
end
return root
end
local function noviewer(portalImage)
-- Function to add noviewer class to filespec for portalImage
local portalImage, hasClass = mw.ustring.gsub(portalImage, "class%s*=[^%|]+", "%0 noviewer")
if hasClass == 0 then
portalImage = portalImage.."|class=noviewer"
end
return portalImage
end
function p._portal(portals, args)
-- This function builds the portal box used by the {{portal}} template.
-- Normalize all arguments
if args.redlinks == 'include' then args.redlinks = true end
args.addBreak = args['break']
for key, default in pairs({left=false,tracking=true,nominimum=false,
redlinks=false,addBreak=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local trackingCat = ''
local errMsg = nil
args.minPortals = args.nominimum and 0 or 1
args.maxPortals = -1
portals, trackingCat, errMsg = p._checkPortals(portals, args)
root:wikitext(trackingCat)
-- if error message, put it in the box and return
if errMsg then
if args.border then -- suppress error message when border=no
args.error = true -- recreate box without fancy formatting
root = portalBox(args)
root:wikitext(trackingCat)
local errTag = root:tag('strong')
errTag:addClass('error')
errTag:css('padding','0.2em')
errTag:wikitext('Error: '..errMsg)
end
return tostring(root)
end
-- if no portals (and no error), just return tracking category
if #portals == 0 then
return trackingCat
end
local contents = {}
-- Display the portals specified in the positional arguments.
local defaultUsed = nil
for _, portal in ipairs(portals) do
local portalImage = getImageName(portal)
if portalImage == defaultImage then
defaultUsed = portal
else
portalImage = noviewer(portalImage)
end
local image = string.format('[[File:%s|32x28px]]',
portalImage)
local link = string.format('[[Portal:%s|%s%sportal]]',
portal, portal, args.addBreak and '<br />' or ' ')
table.insert(contents, {image, link})
end
if defaultUsed and args.tracking and checkTracking() then
local cat = string.format('[[Category:Portal templates with default image|%s]]',
defaultUsed)
root:wikitext(cat)
end
return tostring(fillBox(root, contents))
end
function p._demo(imageList, args)
for key, default in pairs({left=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local contents = {}
-- Display the portals specified in the positional arguments.
for _, fn in ipairs(imageList) do
local image = string.format('[[File:%s|32x28px]]',noviewer(fn))
local link = string.format('[[:File:%s|%s]]',fn,fn)
table.insert(contents,{image,link})
end
return tostring(fillBox(root,contents))
end
function p._image(portal,keep)
-- Wrapper function to allow getImageName() to be accessed through #invoke.
-- backward compatibility: if table passed, take first element
if type(portal) == 'table' then
portal = portal[1]
end
local name = getImageName(portal)
-- If keep is yes (or equivalent), then allow all metadata (like image borders) to be returned
-- also, add "noviewer" class to metadata
local keepargs = yesno(keep)
if keepargs then
return noviewer(name)
end
-- otherwise, just keep filename, plus optional category
local args = mw.text.split(name, "|", true)
local result = {args[1]} -- the filename always comes first
local category = ''
-- parse name, looking for category arguments
for i = 2,#args do
local m = mw.ustring.match(args[i], "^%s*category%s*=")
if m then
table.insert(result, args[i])
end
end
-- reassemble arguments
return table.concat(result,"|")
end
local function getAllImageTable()
-- Returns an array containing all image subpages (minus aliases) as loaded by mw.loadData.
local images = {}
for i, subpage in ipairs{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'other'} do
local imageTable = mw.loadData('Module:Portal/images/' .. subpage .. sandbox)
for portal, image in pairs(imageTable) do
local args = mw.text.split(image,"|")
images[portal] = args[1] -- just use image filename
end
end
return images
end
function p._displayAll(portals, args)
-- This function displays all portals that have portal images. This function is for maintenance purposes and should not be used in
-- articles, for two reasons: 1) there are over 1500 portals with portal images, and 2) the module doesn't record how the portal
-- names are capitalized, so the portal links may be broken.
local lang = mw.language.getContentLanguage()
portals = portals or {}
for portal in pairs(getAllImageTable()) do
table.insert(portals,lang:ucfirst(portal))
end
table.sort(portals)
args.redlinks = args.redlinks or "yes"
return p._portal(portals, args)
end
function p._imageDupes()
-- This function searches the image subpages to find duplicate images. If duplicate images exist, it is not necessarily a bad thing,
-- as different portals might just happen to choose the same image. However, this function is helpful in identifying images that
-- should be moved to a portal alias for ease of maintenance.
local exists, dupes = {}, {}
for portal, image in pairs(getAllImageTable()) do
if not exists[image] then
exists[image] = portal
else
table.insert(dupes, string.format('The image "[[:File:%s|%s]]" is used for both portals "%s" and "%s".', image, image, exists[image], portal))
end
end
if #dupes < 1 then
return 'No duplicate images found.'
else
return 'The following duplicate images were found:\n* ' .. table.concat(dupes, '\n* ')
end
end
local function processPortalArgs(args)
-- This function processes a table of arguments and returns two tables: an array of portal names for processing by ipairs, and a table of
-- the named arguments that specify style options, etc. We need to use ipairs because we want to list all the portals in the order
-- they were passed to the template, but we also want to be able to deal with positional arguments passed explicitly, for example
-- {{portal|2=Politics}}. The behaviour of ipairs is undefined if nil values are present, so we need to make sure they are all removed.
args = type(args) == 'table' and args or {}
local portals = {}
local namedArgs = {}
for k, v in pairs(args) do
if type(k) == 'number' and type(v) == 'string' then -- Make sure we have no non-string portal names.
table.insert(portals, k)
elseif type(k) ~= 'number' then
namedArgs[k] = v
end
end
table.sort(portals)
for i, v in ipairs(portals) do
portals[i] = args[v]
end
return portals, namedArgs
end
-- Entry point for sorting portals from other named arguments
function p._processPortalArgs(args)
return processPortalArgs(args)
end
function p.image(frame)
local origArgs = getArgs(frame)
local portals, args = processPortalArgs(origArgs)
return p._image(portals[1],args.border)
end
function p.demo(frame)
local args = getArgs(frame)
local styles = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
return styles..p._demo(args,args)
end
local function makeWrapper(funcName)
-- Processes external arguments and sends them to the other functions.
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
-- Also: trim whitespace and remove blank arguments
local origArgs = getArgs(frame)
-- create two tables to pass to func: an array of portal names, and a table of named arguments.
local portals, args = processPortalArgs(origArgs)
local results = ''
if funcName == '_portal' or funcName == '_displayAll' then
results = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
end
return results .. p[funcName](portals, args)
end
end
for _, funcName in ipairs{'portal', 'imageDupes', 'displayAll'} do
p[funcName] = makeWrapper('_' .. funcName)
end
return p
17la7cpkbw894t9i08xfqc16pd5ncik
33272
33271
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Portal]]
33271
Scribunto
text/plain
--[==[ This module is a Lua implementation of the old {{Portal}} template. As of February 2019 it is used on nearly 7,900,000 articles.
-- Please take care when updating it! It outputs two functions: p.portal, which generates a list of portals, and p.image, which
-- produces the image name for an individual portal.
-- The portal image data is kept in submodules of [[Module:Portal/images]], listed below:
-- [[Module:Portal/images/a]] - for portal names beginning with "A".
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/c]] - for portal names beginning with "C".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
--
-- The images data pages are separated by the first letter to reduce server load when images are added, changed, or removed.
-- Previously all the images were on one data page at [[Module:Portal/images]], but this had the disadvantage that all
-- 5,000,000 pages using this module needed to be refreshed every time an image was added or removed.
]==]
local p = {}
-- determine whether we're being called from a sandbox
local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true)
local sandbox = isSandbox and '/sandbox' or ''
local function sandboxVersion(s)
return isSandbox and s..'-sand' or s
end
local templatestyles = 'Module:Portal'..sandbox..'/styles.css'
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
-- List of non-talk namespaces which should not be tracked (Talk pages are never tracked)
local badNamespaces = {'user','template','draft','wikipedia'}
-- Check whether to do tracking in this namespace
-- Returns true unless the page is one of the banned namespaces
local function checkTracking(title)
local thisPage = title or mw.title.getCurrentTitle()
if thisPage.isTalkPage then
return false
end
local ns = thisPage.nsText:lower()
for _, v in ipairs(badNamespaces) do
if ns == v then
return false
end
end
return true
end
local function matchImagePage(s)
-- Finds the appropriate image subpage given a lower-case
-- portal name plus the first letter of that portal name.
if type(s) ~= 'string' or #s < 1 then return end
local firstLetter = mw.ustring.sub(s, 1, 1)
local imagePage
if mw.ustring.find(firstLetter, '^[a-z]') then
imagePage = 'Module:Portal/images/' .. firstLetter .. sandbox
else
imagePage = 'Module:Portal/images/other' .. sandbox
end
return mw.loadData(imagePage)[s]
end
local function getAlias(s)
-- Gets an alias from the image alias data page.
local aliasData = mw.loadData('Module:Portal/images/aliases'..sandbox)
for portal, aliases in pairs(aliasData) do
for _, alias in ipairs(aliases) do
if alias == s then
return portal
end
end
end
end
local defaultImage = 'Portal-puzzle.svg|link=|alt='
local function getImageName(s)
-- Gets the image name for a given string.
if type(s) ~= 'string' or #s < 1 then
return defaultImage
end
s = mw.ustring.lower(s)
local image = matchImagePage(s) or matchImagePage(getAlias(s)) or defaultImage
image = mw.ustring.gsub(image,'^File:','') --- strip mistaken leading File: or Image:
image = mw.ustring.gsub(image,'^Image:','')
return image
end
local function exists(title)
local success, exists = pcall(function() return title.exists end)
-- If success = false, then we're out of expensive parser function calls and can't check whether it exists
-- in that case, don't throw a Lua error
return not success or exists
end
-- Function to check argument portals for errors, generate tracking categories if needed
-- Function first checks for too few/many portals provided
-- Then checks the portal list to purge any portals that don't exist
-- Arguments:
-- portals: raw list of portals
-- args.tracking: is tracking requested? (will not track on bad titles or namespaces)
-- args.redlinks: should redlinks be displayed?
-- args.minPortals: minimum number of portal arguments
-- args.maxPortals: maximum number of portal arguments
-- Returns:
-- portals = list of portals, with redlinks purged (if args.redlinks=false)
-- trackingCat = possible tracking category
-- errorMsg = error message
function p._checkPortals(portals, args)
local trackingCat = ''
local errMsg = nil
-- Tracking is on by default.
-- It is disabled if any of the following is true
-- 1/ the parameter "tracking" is set to 'no, 'n', or 'false'
-- 2/ the current page fails the namespace or pagename tests
local trackingEnabled = args.tracking and checkTracking()
args.minPortals = args.minPortals or 1
args.maxPortals = args.maxPortals or -1
-- check for too few portals
if #portals < args.minPortals then
errMsg = 'please specify at least '..args.minPortals..' portal'..(args.minPortals > 1 and 's' or '')
trackingCat = (trackingEnabled and '[[Category:Portal templates with too few portals]]' or '')
return portals, trackingCat, errMsg
end
-- check for too many portals
if args.maxPortals >= 0 and #portals > args.maxPortals then
errMsg = 'too many portals (maximum = '..args.maxPortals..')'
trackingCat = (trackingEnabled and '[[Category:Portal templates with too many portals]]' or '')
return portals, trackingCat, errMsg
end
if not args.redlinks or trackingEnabled then
-- make new list of portals that exist
local existingPortals = {}
for _, portal in ipairs(portals) do
local portalTitle = mw.title.new(portal,"Portal")
-- if portal exists, put it into list
if portalTitle and exists(portalTitle) then
table.insert(existingPortals,portal)
-- otherwise set tracking cat
elseif trackingEnabled then
trackingCat = "[[Category:Portal templates with redlinked portals]]"
end
end
-- If redlinks is off, use portal list purged of redlinks
portals = args.redlinks and portals or existingPortals
-- if nothing left after purge, set tracking cat
if #portals == 0 and trackingEnabled then
trackingCat = trackingCat.."[[Category:Pages with empty portal template]]"
end
end
return portals, trackingCat, errMsg
end
local function portalBox(args)
return mw.html.create('ul')
:attr('role', 'navigation')
:attr('aria-label', 'Portals')
:addClass('noprint')
:addClass(args.error and '' or sandboxVersion('portalbox'))
:addClass(args.border and sandboxVersion('portalborder') or '')
:addClass(sandboxVersion(args.left and 'portalleft' or 'portalright'))
:css('margin', args.margin or nil)
:newline()
end
local function fillBox(root, contents)
for _, item in ipairs(contents) do
local entry = root:tag('li')
entry:addClass(sandboxVersion('portalbox-entry'))
local image = entry:tag('span')
image:addClass(sandboxVersion('portalbox-image'))
image:wikitext(item[1])
local link = entry:tag('span')
link:addClass(sandboxVersion('portalbox-link'))
link:wikitext(item[2])
end
return root
end
local function noviewer(portalImage)
-- Function to add noviewer class to filespec for portalImage
local portalImage, hasClass = mw.ustring.gsub(portalImage, "class%s*=[^%|]+", "%0 noviewer")
if hasClass == 0 then
portalImage = portalImage.."|class=noviewer"
end
return portalImage
end
function p._portal(portals, args)
-- This function builds the portal box used by the {{portal}} template.
-- Normalize all arguments
if args.redlinks == 'include' then args.redlinks = true end
args.addBreak = args['break']
for key, default in pairs({left=false,tracking=true,nominimum=false,
redlinks=false,addBreak=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local trackingCat = ''
local errMsg = nil
args.minPortals = args.nominimum and 0 or 1
args.maxPortals = -1
portals, trackingCat, errMsg = p._checkPortals(portals, args)
root:wikitext(trackingCat)
-- if error message, put it in the box and return
if errMsg then
if args.border then -- suppress error message when border=no
args.error = true -- recreate box without fancy formatting
root = portalBox(args)
root:wikitext(trackingCat)
local errTag = root:tag('strong')
errTag:addClass('error')
errTag:css('padding','0.2em')
errTag:wikitext('Error: '..errMsg)
end
return tostring(root)
end
-- if no portals (and no error), just return tracking category
if #portals == 0 then
return trackingCat
end
local contents = {}
-- Display the portals specified in the positional arguments.
local defaultUsed = nil
for _, portal in ipairs(portals) do
local portalImage = getImageName(portal)
if portalImage == defaultImage then
defaultUsed = portal
else
portalImage = noviewer(portalImage)
end
local image = string.format('[[File:%s|32x28px]]',
portalImage)
local link = string.format('[[Portal:%s|%s%sportal]]',
portal, portal, args.addBreak and '<br />' or ' ')
table.insert(contents, {image, link})
end
if defaultUsed and args.tracking and checkTracking() then
local cat = string.format('[[Category:Portal templates with default image|%s]]',
defaultUsed)
root:wikitext(cat)
end
return tostring(fillBox(root, contents))
end
function p._demo(imageList, args)
for key, default in pairs({left=false,border=true}) do
if args[key] == nil then args[key] = default end
args[key] = yesno(args[key], default)
end
local root = portalBox(args)
local contents = {}
-- Display the portals specified in the positional arguments.
for _, fn in ipairs(imageList) do
local image = string.format('[[File:%s|32x28px]]',noviewer(fn))
local link = string.format('[[:File:%s|%s]]',fn,fn)
table.insert(contents,{image,link})
end
return tostring(fillBox(root,contents))
end
function p._image(portal,keep)
-- Wrapper function to allow getImageName() to be accessed through #invoke.
-- backward compatibility: if table passed, take first element
if type(portal) == 'table' then
portal = portal[1]
end
local name = getImageName(portal)
-- If keep is yes (or equivalent), then allow all metadata (like image borders) to be returned
-- also, add "noviewer" class to metadata
local keepargs = yesno(keep)
if keepargs then
return noviewer(name)
end
-- otherwise, just keep filename, plus optional category
local args = mw.text.split(name, "|", true)
local result = {args[1]} -- the filename always comes first
local category = ''
-- parse name, looking for category arguments
for i = 2,#args do
local m = mw.ustring.match(args[i], "^%s*category%s*=")
if m then
table.insert(result, args[i])
end
end
-- reassemble arguments
return table.concat(result,"|")
end
local function getAllImageTable()
-- Returns an array containing all image subpages (minus aliases) as loaded by mw.loadData.
local images = {}
for i, subpage in ipairs{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'other'} do
local imageTable = mw.loadData('Module:Portal/images/' .. subpage .. sandbox)
for portal, image in pairs(imageTable) do
local args = mw.text.split(image,"|")
images[portal] = args[1] -- just use image filename
end
end
return images
end
function p._displayAll(portals, args)
-- This function displays all portals that have portal images. This function is for maintenance purposes and should not be used in
-- articles, for two reasons: 1) there are over 1500 portals with portal images, and 2) the module doesn't record how the portal
-- names are capitalized, so the portal links may be broken.
local lang = mw.language.getContentLanguage()
portals = portals or {}
for portal in pairs(getAllImageTable()) do
table.insert(portals,lang:ucfirst(portal))
end
table.sort(portals)
args.redlinks = args.redlinks or "yes"
return p._portal(portals, args)
end
function p._imageDupes()
-- This function searches the image subpages to find duplicate images. If duplicate images exist, it is not necessarily a bad thing,
-- as different portals might just happen to choose the same image. However, this function is helpful in identifying images that
-- should be moved to a portal alias for ease of maintenance.
local exists, dupes = {}, {}
for portal, image in pairs(getAllImageTable()) do
if not exists[image] then
exists[image] = portal
else
table.insert(dupes, string.format('The image "[[:File:%s|%s]]" is used for both portals "%s" and "%s".', image, image, exists[image], portal))
end
end
if #dupes < 1 then
return 'No duplicate images found.'
else
return 'The following duplicate images were found:\n* ' .. table.concat(dupes, '\n* ')
end
end
local function processPortalArgs(args)
-- This function processes a table of arguments and returns two tables: an array of portal names for processing by ipairs, and a table of
-- the named arguments that specify style options, etc. We need to use ipairs because we want to list all the portals in the order
-- they were passed to the template, but we also want to be able to deal with positional arguments passed explicitly, for example
-- {{portal|2=Politics}}. The behaviour of ipairs is undefined if nil values are present, so we need to make sure they are all removed.
args = type(args) == 'table' and args or {}
local portals = {}
local namedArgs = {}
for k, v in pairs(args) do
if type(k) == 'number' and type(v) == 'string' then -- Make sure we have no non-string portal names.
table.insert(portals, k)
elseif type(k) ~= 'number' then
namedArgs[k] = v
end
end
table.sort(portals)
for i, v in ipairs(portals) do
portals[i] = args[v]
end
return portals, namedArgs
end
-- Entry point for sorting portals from other named arguments
function p._processPortalArgs(args)
return processPortalArgs(args)
end
function p.image(frame)
local origArgs = getArgs(frame)
local portals, args = processPortalArgs(origArgs)
return p._image(portals[1],args.border)
end
function p.demo(frame)
local args = getArgs(frame)
local styles = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
return styles..p._demo(args,args)
end
local function makeWrapper(funcName)
-- Processes external arguments and sends them to the other functions.
return function (frame)
-- If called via #invoke, use the args passed into the invoking
-- template, or the args passed to #invoke if any exist. Otherwise
-- assume args are being passed directly in from the debug console
-- or from another Lua module.
-- Also: trim whitespace and remove blank arguments
local origArgs = getArgs(frame)
-- create two tables to pass to func: an array of portal names, and a table of named arguments.
local portals, args = processPortalArgs(origArgs)
local results = ''
if funcName == '_portal' or funcName == '_displayAll' then
results = frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} }
end
return results .. p[funcName](portals, args)
end
end
for _, funcName in ipairs{'portal', 'imageDupes', 'displayAll'} do
p[funcName] = makeWrapper('_' .. funcName)
end
return p
17la7cpkbw894t9i08xfqc16pd5ncik
Module:Portal/styles.css
828
2607
33273
2026-09-04T04:03:21Z
en>Pppery
0
Use std size
33273
sanitized-css
text/css
/* {{pp-template}} */
.portalbox {
padding: 0; /* Timeless adds padding */
margin: 0.5em 0;
display: table;
box-sizing: border-box;
max-width: 175px;
list-style: none;
}
.portalborder {
border: 1px solid var(--border-color-base, #a2a9b1);
padding: 0.1em;
background: var(--background-color-neutral-subtle, #f8f9fa);
}
.portalbox-entry {
display: table-row;
font-size: 85%;
line-height: 110%;
height: 1.9em; /* sets min height */
font-style: italic;
font-weight: bold;
}
.portalbox-image {
display: table-cell;
padding: 0.2em;
vertical-align: middle;
text-align: center;
}
.portalbox-link {
display: table-cell;
padding: 0.2em 0.2em 0.2em 0.3em;
vertical-align: middle;
}
@media (min-width: 640px) {
.portalleft {
margin: 0.5em 1em 0.5em 0
}
.portalright {
clear: right;
float: right;
margin: 0.5em 0 0.5em 1em
}
}
gszg9brt292ix6gkcvtgo2wxtp88w4f
33274
33273
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Portal/styles.css]]
33273
sanitized-css
text/css
/* {{pp-template}} */
.portalbox {
padding: 0; /* Timeless adds padding */
margin: 0.5em 0;
display: table;
box-sizing: border-box;
max-width: 175px;
list-style: none;
}
.portalborder {
border: 1px solid var(--border-color-base, #a2a9b1);
padding: 0.1em;
background: var(--background-color-neutral-subtle, #f8f9fa);
}
.portalbox-entry {
display: table-row;
font-size: 85%;
line-height: 110%;
height: 1.9em; /* sets min height */
font-style: italic;
font-weight: bold;
}
.portalbox-image {
display: table-cell;
padding: 0.2em;
vertical-align: middle;
text-align: center;
}
.portalbox-link {
display: table-cell;
padding: 0.2em 0.2em 0.2em 0.3em;
vertical-align: middle;
}
@media (min-width: 640px) {
.portalleft {
margin: 0.5em 1em 0.5em 0
}
.portalright {
clear: right;
float: right;
margin: 0.5em 0 0.5em 1em
}
}
gszg9brt292ix6gkcvtgo2wxtp88w4f
Tempilet:TOC limit
10
2608
33275
2018-12-07T07:36:09Z
en>TheDJ
0
Use template styles
33275
wikitext
text/x-wiki
<templatestyles src="Template:TOC limit/styles.css" /><div class="toclimit-{{{1|{{{limit|3}}}}}}">__TOC__</div><noinclude>
{{documentation}}
</noinclude>
dwdn99dxyfhkqqw4i3lmafbzsxd31mr
33276
33275
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:TOC_limit]]
33275
wikitext
text/x-wiki
<templatestyles src="Template:TOC limit/styles.css" /><div class="toclimit-{{{1|{{{limit|3}}}}}}">__TOC__</div><noinclude>
{{documentation}}
</noinclude>
dwdn99dxyfhkqqw4i3lmafbzsxd31mr
Tempilet:TOC limit/styles.css
10
2609
33277
2019-03-03T23:36:55Z
en>Pppery
0
Adding protection template
33277
sanitized-css
text/css
/* {{pp-template}}
Allow limiting of which header levels are shown in a TOC;
<div class="toclimit-3">, for instance, will limit to
showing ==headings== and ===headings=== but no further
(as long as there are no =headings= on the page, which
there shouldn't be according to the MoS). */
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
clkz25e6xu067l6ec31e9unokrhkflm
33278
33277
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:TOC_limit/styles.css]]
33277
sanitized-css
text/css
/* {{pp-template}}
Allow limiting of which header levels are shown in a TOC;
<div class="toclimit-3">, for instance, will limit to
showing ==headings== and ===headings=== but no further
(as long as there are no =headings= on the page, which
there shouldn't be according to the MoS). */
.toclimit-2 .toclevel-1 ul,
.toclimit-3 .toclevel-2 ul,
.toclimit-4 .toclevel-3 ul,
.toclimit-5 .toclevel-4 ul,
.toclimit-6 .toclevel-5 ul,
.toclimit-7 .toclevel-6 ul {
display: none;
}
clkz25e6xu067l6ec31e9unokrhkflm
Module:Portal/images/a
828
2610
33279
2026-10-05T10:36:34Z
en>Paine Ellsworth
0
per edit request on talk page - include image for animal rights and welfare portal
33279
Scribunto
text/plain
--[==[ This is the "A" list of portal image names. It contains a list of portal images for use with [[Module:Portal]]
-- for portal names that start with the letter "A". For aliases to existing portal names, and for portal names that
-- start with other letters, please use the appropriate page from the following list:
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/c]] - for portal names beginning with "C".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
-- When adding entries, please use alphabetical order. The format of the images table entries is as follows:
-- ["portal name"] = "image.svg",
-- The portal name should be the name of your portal, in lower case. For example, the portal name for
-- "Portal:United Kingdom" would be "united kingdom". The image name should be capitalised normally, and the "File:"
-- namespace prefix should be
-- omitted.
]==]
return {
["abkhazia"] = "Flag of Abkhazia.svg|border|link=|alt=flag",
["abu dhabi"] = "Flag of Abu Dhabi.svg|border|link=|alt=flag",
["aerospace biography"] = "Armstrong-Spencom01.jpg|link=|alt=photo",
["afghanistan"] = "Flag of the Taliban.svg|border|link=|alt=flag",
["africa"] = "Africa (orthographic projection).svg|alt=map",
["african cinema"] = "Africa-map-TAN.svg|alt=map",
["african diaspora"] = "Moromi.png|alt=map",
["agriculture"] = "Noto Emoji Oreo 1f33e.svg|alt=grain",
["agropedia"] = "Farmer plowing in Fahrenwalde, Mecklenburg-Vorpommern, Germany.jpg|alt=icon",
["ajman"] = "Flag of Ajman.svg|link=|alt=flag",
["alabama"] = "Flag of Alabama.svg|border|link=|alt=flag",
["alaska"] = "Flag of Alaska.svg|border|link=|alt=flag",
["albania"] = "Flag of Albania.svg|border|link=|alt=flag",
["albemarle county"] = "Monticello 2010-10-29.jpg|alt=photo",
["alberta"] = "Flag of Alberta.svg|border|link=|alt=flag",
["algae"] = "Algae Graphic.svg|link=|alt=icon",
["algeria"] = "Flag of Algeria.svg|border|link=|alt=flag",
["alpine rhine"] = "Geobox Mountain Range.svg|link=|alt=icon|class=skin-invert-image",
["alps"] = "Palü en Diavolezza.jpg|alt=icon",
["amateur radio"] = "Amateur radio compact icon.png|link=|alt=icon",
["american animation"] = "Animation disc US.svg|alt=icon",
["american cinema"] = "Cinema of the United States.svg|alt=icon",
["american civil war"] = "United states confederate flag hybrid.svg|border|link=|alt=",
["american football"] = "American football.svg|link=|alt=icon",
["american football league"] = "AFL Trophy alt.png|alt=trophy",
["american music"] = "Musical Notes USA.svg|link=|alt=icon",
["american old west"] = "Frederic Remington Dismounted Moving Led Horses.jpg|link=|alt=painting",
["american open wheel racing"] = "JuanMontoya2015Indy500.JPG|alt=photo",
["american revolutionary war"] = "Washington Crossing the Delaware by Emanuel Leutze, MMA-NYC, 1851.jpg|border|link=|alt=",
["american samoa"] = "Flag of American Samoa.svg|border|link=|alt=flag",
["american television"] = "USA flag on television.svg|alt=icon",
["americas"] = "Americas (orthographic projection).svg|alt=map",
["amiga"] = "Boingball.png|link=|alt=",
["amphibians"] = "Frog (2546) - The Noun Project.svg|link=|alt=|class=skin-invert-image",
["amusement parks"] = "Roller Coaster Icon.svg|link=|alt=",
["anarchism"] = "BlackFlagSymbol.svg|border|alt=flag|class=skin-invert-image",
["andes"] = "Ausangate-hillside-MT.jpg|alt=",
["andorra la vella"] = "Flag of Andorra la Vella.svg|alt=flag",
["anatomy"] = "Anatomy posture and body mechanics 08.web.jpg|alt=icon",
["ancient egypt"] = "Pyramidi aavikolla.png|link=|alt=",
["ancient greece"] = "Parthenon from west.jpg|link=|alt=",
["ancient japan"] = "Shiki no Fuji, Ōmuro fukin by Takahashi Shōtei.jpg|link=|alt=",
["ancient near east"] = "Babylonlion.JPG|link=|alt=",
["ancient rome"] = "SPQRomani.svg|link=|alt=",
["andaman and nicobar islands"] = "India Andaman and Nicobar Islands locator map.svg|border|alt=map",
["andhra pradesh"] = "Archbridgegodavari.JPG|alt=icon",
["andorra"] = "Flag of Andorra.svg|border|link=|alt=flag",
["anglo-saxon england"] = "Peterborough Chronicle cropped.jpg|link=|alt=",
["angola"] = "Flag of Angola.svg|border|link=|alt=flag",
["anguilla"] = "Flag of Anguilla.svg|border|link=|alt=flag",
["animal rights and welfare"] = "Paw Print (2317) - The Noun Project.svg|alt=icon",
["animals"] = "Caribou from Wagon Trails.jpg|alt=icon",
["animation"] = "Animation disc.svg|alt=icon|class=skin-invert-image",
["anime and manga"] = "Wikipe-tan face.svg|alt=icon",
["antarctica"] = "Antarctica (orthographic projection).svg|alt=map",
["antigua and barbuda"] = "Flag of Antigua and Barbuda.svg|border|link=|alt=flag",
["appalachia"] = "Appalachian region of United States.png|border|link=|alt=map",
["applied science"] = "Metallurgy stub icon.svg|link=|alt=icon",
["arab world"] = "Flag of the Arab League.svg|border|link=|alt=flag",
["arabic language"] = "Arabic-dad-letter.svg|alt=icon",
["archaeology"] = "Stonehenge Closeup.jpg|link=|alt=",
["architecture"] = "P parthenon.svg|alt=icon",
["arctic"] = "Arctic (orthographic projection).svg|alt=map",
["argentina"] = "Flag of Argentina.svg|border|link=|alt=flag",
["arithmetic"] = "Arithmetic symbols.svg|link=|alt=",
["arizona"] = "Flag of Arizona.svg|border|link=|alt=flag",
["arkansas"] = "Flag of Arkansas.svg|border|link=|alt=flag",
["armenia"] = "Flag of Armenia.svg|border|link=|alt=flag",
["arunachal pradesh"] = "India Arunachal Pradesh locator map.svg|alt=map",
["art"] = "Ballerina-icon.jpg|alt=icon",
["arthropods"] = "Cercophonius squama.jpg|alt=icon",
["artsakh"] = "Flag of Artsakh.svg|border|link=|alt=flag",
["aruba"] = "Flag of Aruba.svg|border|link=|alt=flag",
["asia"] = "Asia (orthographic projection).svg|alt=icon",
["assam"] = "Seal of Assam.png|link=|alt=|class=skin-invert",
["association football"] = "Soccer ball.svg|alt=icon",
["assyrians"] = "Flag of Assyria.svg|border|link=|alt=flag",
["astronomy"] = "Crab Nebula.jpg|link=|alt=",
["athletics"] = "Athletics pictogram.svg|link=|alt=|class=skin-invert-image",
["atlanta"] = "Atlflag.svg|link=|alt=flag",
["atlas"] = "World map green.png|alt=icon",
["australia"] = "Flag of Australia.svg|border|link=|alt=flag",
["australian capital territory"] = "Flag of Australia.svg|border|link=|alt=flag",
["australian roads"] = "Australia road sign W5-29.svg|alt=icon",
["australian rules football"] = "Sherrin-transparent.png|link=|alt=",
["austria"] = "Flag of Austria.svg|border|link=|alt=flag",
["austria-hungary"] = "Wappen Österreich-Ungarn 1916 (Klein).png|link=|alt=",
["aviation"] = "Aviacionavion.png|link=|alt=",
["azad kashmir"] = "Flag of Azad Kashmir.svg|border|link=|alt=flag",
["azerbaijan"] = "Flag of Azerbaijan.svg|border|link=|alt=flag",
}
8y4n1499h25fwaujcag17uhu3208dxa
33280
33279
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Portal/images/a]]
33279
Scribunto
text/plain
--[==[ This is the "A" list of portal image names. It contains a list of portal images for use with [[Module:Portal]]
-- for portal names that start with the letter "A". For aliases to existing portal names, and for portal names that
-- start with other letters, please use the appropriate page from the following list:
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/c]] - for portal names beginning with "C".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
-- When adding entries, please use alphabetical order. The format of the images table entries is as follows:
-- ["portal name"] = "image.svg",
-- The portal name should be the name of your portal, in lower case. For example, the portal name for
-- "Portal:United Kingdom" would be "united kingdom". The image name should be capitalised normally, and the "File:"
-- namespace prefix should be
-- omitted.
]==]
return {
["abkhazia"] = "Flag of Abkhazia.svg|border|link=|alt=flag",
["abu dhabi"] = "Flag of Abu Dhabi.svg|border|link=|alt=flag",
["aerospace biography"] = "Armstrong-Spencom01.jpg|link=|alt=photo",
["afghanistan"] = "Flag of the Taliban.svg|border|link=|alt=flag",
["africa"] = "Africa (orthographic projection).svg|alt=map",
["african cinema"] = "Africa-map-TAN.svg|alt=map",
["african diaspora"] = "Moromi.png|alt=map",
["agriculture"] = "Noto Emoji Oreo 1f33e.svg|alt=grain",
["agropedia"] = "Farmer plowing in Fahrenwalde, Mecklenburg-Vorpommern, Germany.jpg|alt=icon",
["ajman"] = "Flag of Ajman.svg|link=|alt=flag",
["alabama"] = "Flag of Alabama.svg|border|link=|alt=flag",
["alaska"] = "Flag of Alaska.svg|border|link=|alt=flag",
["albania"] = "Flag of Albania.svg|border|link=|alt=flag",
["albemarle county"] = "Monticello 2010-10-29.jpg|alt=photo",
["alberta"] = "Flag of Alberta.svg|border|link=|alt=flag",
["algae"] = "Algae Graphic.svg|link=|alt=icon",
["algeria"] = "Flag of Algeria.svg|border|link=|alt=flag",
["alpine rhine"] = "Geobox Mountain Range.svg|link=|alt=icon|class=skin-invert-image",
["alps"] = "Palü en Diavolezza.jpg|alt=icon",
["amateur radio"] = "Amateur radio compact icon.png|link=|alt=icon",
["american animation"] = "Animation disc US.svg|alt=icon",
["american cinema"] = "Cinema of the United States.svg|alt=icon",
["american civil war"] = "United states confederate flag hybrid.svg|border|link=|alt=",
["american football"] = "American football.svg|link=|alt=icon",
["american football league"] = "AFL Trophy alt.png|alt=trophy",
["american music"] = "Musical Notes USA.svg|link=|alt=icon",
["american old west"] = "Frederic Remington Dismounted Moving Led Horses.jpg|link=|alt=painting",
["american open wheel racing"] = "JuanMontoya2015Indy500.JPG|alt=photo",
["american revolutionary war"] = "Washington Crossing the Delaware by Emanuel Leutze, MMA-NYC, 1851.jpg|border|link=|alt=",
["american samoa"] = "Flag of American Samoa.svg|border|link=|alt=flag",
["american television"] = "USA flag on television.svg|alt=icon",
["americas"] = "Americas (orthographic projection).svg|alt=map",
["amiga"] = "Boingball.png|link=|alt=",
["amphibians"] = "Frog (2546) - The Noun Project.svg|link=|alt=|class=skin-invert-image",
["amusement parks"] = "Roller Coaster Icon.svg|link=|alt=",
["anarchism"] = "BlackFlagSymbol.svg|border|alt=flag|class=skin-invert-image",
["andes"] = "Ausangate-hillside-MT.jpg|alt=",
["andorra la vella"] = "Flag of Andorra la Vella.svg|alt=flag",
["anatomy"] = "Anatomy posture and body mechanics 08.web.jpg|alt=icon",
["ancient egypt"] = "Pyramidi aavikolla.png|link=|alt=",
["ancient greece"] = "Parthenon from west.jpg|link=|alt=",
["ancient japan"] = "Shiki no Fuji, Ōmuro fukin by Takahashi Shōtei.jpg|link=|alt=",
["ancient near east"] = "Babylonlion.JPG|link=|alt=",
["ancient rome"] = "SPQRomani.svg|link=|alt=",
["andaman and nicobar islands"] = "India Andaman and Nicobar Islands locator map.svg|border|alt=map",
["andhra pradesh"] = "Archbridgegodavari.JPG|alt=icon",
["andorra"] = "Flag of Andorra.svg|border|link=|alt=flag",
["anglo-saxon england"] = "Peterborough Chronicle cropped.jpg|link=|alt=",
["angola"] = "Flag of Angola.svg|border|link=|alt=flag",
["anguilla"] = "Flag of Anguilla.svg|border|link=|alt=flag",
["animal rights and welfare"] = "Paw Print (2317) - The Noun Project.svg|alt=icon",
["animals"] = "Caribou from Wagon Trails.jpg|alt=icon",
["animation"] = "Animation disc.svg|alt=icon|class=skin-invert-image",
["anime and manga"] = "Wikipe-tan face.svg|alt=icon",
["antarctica"] = "Antarctica (orthographic projection).svg|alt=map",
["antigua and barbuda"] = "Flag of Antigua and Barbuda.svg|border|link=|alt=flag",
["appalachia"] = "Appalachian region of United States.png|border|link=|alt=map",
["applied science"] = "Metallurgy stub icon.svg|link=|alt=icon",
["arab world"] = "Flag of the Arab League.svg|border|link=|alt=flag",
["arabic language"] = "Arabic-dad-letter.svg|alt=icon",
["archaeology"] = "Stonehenge Closeup.jpg|link=|alt=",
["architecture"] = "P parthenon.svg|alt=icon",
["arctic"] = "Arctic (orthographic projection).svg|alt=map",
["argentina"] = "Flag of Argentina.svg|border|link=|alt=flag",
["arithmetic"] = "Arithmetic symbols.svg|link=|alt=",
["arizona"] = "Flag of Arizona.svg|border|link=|alt=flag",
["arkansas"] = "Flag of Arkansas.svg|border|link=|alt=flag",
["armenia"] = "Flag of Armenia.svg|border|link=|alt=flag",
["arunachal pradesh"] = "India Arunachal Pradesh locator map.svg|alt=map",
["art"] = "Ballerina-icon.jpg|alt=icon",
["arthropods"] = "Cercophonius squama.jpg|alt=icon",
["artsakh"] = "Flag of Artsakh.svg|border|link=|alt=flag",
["aruba"] = "Flag of Aruba.svg|border|link=|alt=flag",
["asia"] = "Asia (orthographic projection).svg|alt=icon",
["assam"] = "Seal of Assam.png|link=|alt=|class=skin-invert",
["association football"] = "Soccer ball.svg|alt=icon",
["assyrians"] = "Flag of Assyria.svg|border|link=|alt=flag",
["astronomy"] = "Crab Nebula.jpg|link=|alt=",
["athletics"] = "Athletics pictogram.svg|link=|alt=|class=skin-invert-image",
["atlanta"] = "Atlflag.svg|link=|alt=flag",
["atlas"] = "World map green.png|alt=icon",
["australia"] = "Flag of Australia.svg|border|link=|alt=flag",
["australian capital territory"] = "Flag of Australia.svg|border|link=|alt=flag",
["australian roads"] = "Australia road sign W5-29.svg|alt=icon",
["australian rules football"] = "Sherrin-transparent.png|link=|alt=",
["austria"] = "Flag of Austria.svg|border|link=|alt=flag",
["austria-hungary"] = "Wappen Österreich-Ungarn 1916 (Klein).png|link=|alt=",
["aviation"] = "Aviacionavion.png|link=|alt=",
["azad kashmir"] = "Flag of Azad Kashmir.svg|border|link=|alt=flag",
["azerbaijan"] = "Flag of Azerbaijan.svg|border|link=|alt=flag",
}
8y4n1499h25fwaujcag17uhu3208dxa
Module:Portal/images/c
828
2611
33281
2026-07-13T04:25:47Z
en>Newbzy
0
dark mode fixes
33281
Scribunto
text/plain
--[==[ This is the "C" list of portal image names. It contains a list of portal images for use with [[Module:Portal]]
-- for portal names that start with the letter "C". For aliases to existing portal names, and for portal names that
-- start with other letters, please use the appropriate page from the following list:
-- [[Module:Portal/images/a]] - for portal names beginning with "A".
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
-- When adding entries, please use alphabetical order. The format of the images table entries is as follows:
-- ["portal name"] = "image.svg",
-- The portal name should be the name of your portal, in lower case. For example, the portal name for
-- "Portal:United Kingdom" would be "united kingdom". The image name should be capitalised normally, and the "File:"
-- namespace prefix should be
-- omitted.
]==]
local ambox_globe = "Ambox globe.svg"
local hour=tonumber(os.date("%k"))
if hour >= 22 or hour < 6 then
ambox_globe = "Ambox globe Asia Australia.svg"
else
if hour >= 14 and hour < 22 then
ambox_globe = "Ambox globe Americas.svg"
end
end
return {
["california"] = "Flag of California.svg|border|link=|alt=flag",
["california delta"] = "California SD-03 (2011).svg|alt=map",
["california roads"] = "California 1.svg|link=|alt=sign",
["california state university"] = "Flag of California.svg|border|link=|alt=flag",
["cambodia"] = "Flag of Cambodia.svg|border|link=|alt=flag",
["cameroon"] = "Flag of Cameroon.svg|border|link=|alt=flag",
["canada"] = "Maple Leaf (from roundel).svg|alt=flag",
["canadian communities"] = "Map Canada political-geo.png|link=|alt=",
["canadian football"] = "Canadian football.png|alt=icon",
["canadian law"] = "Supreme Court of Canada.jpg|link=|alt=",
["canadian territories"] = "Northern Canada.svg|alt=icon",
["canary islands"] = "Flag of the Canary Islands.svg|border|link=|alt=flag",
["cannabis"] = "Cannabis leaf.svg|alt=icon",
["cape cod and the islands"] = "Nobska Lighthouse 1.jpg|alt=icon",
["cape verde"] = "Flag of Cape Verde.svg|border|link=|alt=flag",
["capital district"] = "Empire State Plaza symbol 2.svg|link=|alt=|class=skin-invert-image",
["capitalism"] = "Capitalismlogo.svg|alt=icon",
["caribbean"] = "Relief Map of Caribbean.png|alt=map",
["caribbean community"] = "Flag of CARICOM.svg|border|link=|alt=flag",
["cars"] = "Sportcar sergio luiz ara 01.svg|link=|alt=",
["cartoon network"] = "Cartoon Network.svg|border|link=|alt=",
["cartoon"] = "Mad scientist.svg|alt=icon",
["catalan-speaking countries"] = "Siñal d'Aragón.svg|border|alt=icon",
["categories"] = "Gnome-fs-directory yellow.svg|alt=icon",
["catholic church"] = "046CupolaSPietro.jpg|border|alt=icon",
["cats"] = "Cat03.jpg|alt=icon",
["cayman islands"] = "Flag of the Cayman Islands.svg|border|link=|alt=flag",
["celts"] = "Triple-Spiral-4turns green transparent.svg|link=|alt=icon",
["central african republic"] = "Flag of the Central African Republic.svg|border|link=|alt=flag",
["central america"] = "Age of Consent - Central America.svg|alt=icon",
["central asia"] = "Central Asian Games participating countries.PNG|alt=icon",
["cetaceans"] = "Sperm whale fluke.jpg|link=|alt=",
["chad"] = "Flag of Chad.svg|border|link=|alt=flag",
["chandigarh"] = "Gandhi Bhawan at Punjab University.jpg|alt=icon",
["channel islands"] = "Flag of Sark.svg|border|link=|alt=flag",
["chemistry"] = "Papapishu-Lab-icon-6.svg|link=|alt=|class=skin-invert",
["chennai"] = "Chennai High Court 1200x800.jpg|alt=icon",
["cheshire"] = "Cheshire Flag.svg|border|alt=icon",
["chess"] = "Chess.svg|alt=icon",
["chhattisgarh"] = "India Chhattisgarh locator map.svg|border|alt=map",
["chicago"] = "Flag of Chicago, Illinois.svg|link=|alt=",
["children's literature"] = "Tom Sawyer 1876 frontispiece.jpg|link=|alt=",
["chile"] = "Flag of Chile.svg|border|link=|alt=flag",
["china"] = "Flag of the People's Republic of China.svg|border|link=|alt=flag",
["christianity"] = "P christianity.svg|alt=icon|class=skin-invert",
["christianity in india"] = "India with cross.svg|alt=icon",
["christmas"] = "Xmas tree.svg|link=|alt=",
["christmas island"] = "Flag of Christmas Island.svg|link=|alt=flag",
["civilizations"] = "Lascar Avenue of the Dead and the Pyramid of the Sun in the background (4566574277).jpg|border|alt=icon",
["civil rights movement"] = "Logo SNCC.svg|link=WP:ACRM|alt=|class=skin-invert",
["cities"] = "Ciudad.svg|alt=icon",
["clans of scotland"] = "Scottish clan map.png|link=|alt=map",
["classical music"] = "Audio a.svg|link=|alt=|class=skin-invert-image",
["classical tamil"] = "Word_Tamil.svg|link=|alt=word|class=skin-invert-image",
["climate change"] = "Climate change icon.png|link=|alt=icon",
["climbing"] = "Pictograms-nps-land-technical_rock_climbing.svg|link=|alt=icon|class=skin-invert-image",
["clothing"] = "Emojione 1F458.svg|alt=icon",
["cocos (keeling) islands"] = "Flag of Australia.svg|border|link=|alt=flag",
["coffee"] = "Emblem-relax.svg|alt=icon",
["college basketball"] = "Basketball.png|link=|alt=",
["college football"] = "NCAAFootball transparent.png|alt=icon",
["colombia"] = "Flag of Colombia.svg|border|link=|alt=flag",
["colorado"] = "Flag of Colorado.svg|border|link=|alt=flag",
["comedy"] = "SMirC-laugh.svg|alt=icon",
["comics"] = "Wikipetan-manga.png|alt=icon",
["communism"] = "Symbol-hammer-and-sickle.svg|link=|alt=",
["community"] = "P globe blue.png|alt=icon",
["comoros"] = "Flag of the Comoros.svg|border|link=|alt=flag",
["companies"] = "Industry5.svg|link=|alt=|class=skin-invert-image",
["computer programming"] = "Octicons-terminal.svg|alt=icon|class=skin-invert-image",
["computer science"] = "Internet map 1024 - transparent, inverted.png|alt=icon|class=skin-invert",
["connecticut"] = "Flag of Connecticut.svg|border|link=|alt=flag",
["conservatism"] = "DodgerBlue flag waving.svg|link=|alt=",
["constructed languages"] = "Design conlang.png|alt=icon",
["contents"] = "Wikipedia's W.svg|link=|alt=|class=skin-invert-image",
["contents/indexes"] = "Pointing-right.svg|link=|alt=icon|class=skin-invert-image",
["contents/lists"] = "Liste.svg|alt=icon|class=skin-invert-image",
["contents/outlines"] = "Pointing-left.svg|link=|alt=icon|class=skin-invert-image",
["cooking"] = "One chef's hat.png|alt=icon|class=skin-invert-image",
["cook islands"] = "Flag of the Cook Islands.svg|border|link=|alt=flag",
["cornwall"] = "Flag of Cornwall.svg|border|link=|alt=flag",
["cosmology"] = "Ilc 9yr moll4096.png|link=|alt=",
["costa rica"] = "Flag of Costa Rica.svg|border|link=|alt=flag",
["côte d'ivoire"] = "Flag of Côte d'Ivoire.svg|border|link=|alt=flag",
["countries"] = "P countries-vector.svg|alt=icon|class=skin-invert",
["county kilkenny"] = "County Kilkenny arms.svg|alt=coat of arms",
["covid-19"] = "SARS-CoV-2 (Wikimedia colors).svg|alt=virus icon",
["cretaceous"] = "Shantungosaurus-v4.jpg|alt=",
["cricket"] = "Cricketball.png|link=|alt=",
["criminal justice"] = "Scale of justice 2.svg|link=|alt=",
["croatia"] = "Flag of Croatia.svg|border|link=|alt=flag",
["crustaceans"] = "Charybdis japonica.jpg|alt=icon",
["cuba"] = "Flag of Cuba.svg|border|link=|alt=flag",
["culture"] = "Taos Pueblo 1992.jpg|alt=icon",
["cumbria"] = "Herdwick sheep crop.jpg|alt=icon",
["curaçao"] = "Flag of Curaçao.svg|border|link=|alt=flag",
["cue sports"] = "Eight Ball Rack 2005 SeanMcClean.jpg|alt=icon",
["current events"] = ambox_globe .. "|link=|alt=",
["current events/turkey"] = "Wikinews-logo.png|alt=icon",
["cycling"] = "Cycling (road) pictogram.svg|link=|alt=icon|class=skin-invert-image",
["cyprus"] = "Flag of Cyprus.svg|border|link=|alt=flag",
["czech republic"] = "Flag of the Czech Republic.svg|border|link=|alt=flag",
}
jsycvd3mn5dk9dong8lnzbhe8u55300
33282
33281
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Portal/images/c]]
33281
Scribunto
text/plain
--[==[ This is the "C" list of portal image names. It contains a list of portal images for use with [[Module:Portal]]
-- for portal names that start with the letter "C". For aliases to existing portal names, and for portal names that
-- start with other letters, please use the appropriate page from the following list:
-- [[Module:Portal/images/a]] - for portal names beginning with "A".
-- [[Module:Portal/images/b]] - for portal names beginning with "B".
-- [[Module:Portal/images/d]] - for portal names beginning with "D".
-- [[Module:Portal/images/e]] - for portal names beginning with "E".
-- [[Module:Portal/images/f]] - for portal names beginning with "F".
-- [[Module:Portal/images/g]] - for portal names beginning with "G".
-- [[Module:Portal/images/h]] - for portal names beginning with "H".
-- [[Module:Portal/images/i]] - for portal names beginning with "I".
-- [[Module:Portal/images/j]] - for portal names beginning with "J".
-- [[Module:Portal/images/k]] - for portal names beginning with "K".
-- [[Module:Portal/images/l]] - for portal names beginning with "L".
-- [[Module:Portal/images/m]] - for portal names beginning with "M".
-- [[Module:Portal/images/n]] - for portal names beginning with "N".
-- [[Module:Portal/images/o]] - for portal names beginning with "O".
-- [[Module:Portal/images/p]] - for portal names beginning with "P".
-- [[Module:Portal/images/q]] - for portal names beginning with "Q".
-- [[Module:Portal/images/r]] - for portal names beginning with "R".
-- [[Module:Portal/images/s]] - for portal names beginning with "S".
-- [[Module:Portal/images/t]] - for portal names beginning with "T".
-- [[Module:Portal/images/u]] - for portal names beginning with "U".
-- [[Module:Portal/images/v]] - for portal names beginning with "V".
-- [[Module:Portal/images/w]] - for portal names beginning with "W".
-- [[Module:Portal/images/x]] - for portal names beginning with "X".
-- [[Module:Portal/images/y]] - for portal names beginning with "Y".
-- [[Module:Portal/images/z]] - for portal names beginning with "Z".
-- [[Module:Portal/images/other]] - for portal names beginning with any other letters. This includes numbers,
-- letters with diacritics, and letters in non-Latin alphabets.
-- [[Module:Portal/images/aliases]] - for adding aliases for existing portal names. Use this page for variations
-- in spelling and diacritics, etc., no matter what letter the portal begins with.
-- When adding entries, please use alphabetical order. The format of the images table entries is as follows:
-- ["portal name"] = "image.svg",
-- The portal name should be the name of your portal, in lower case. For example, the portal name for
-- "Portal:United Kingdom" would be "united kingdom". The image name should be capitalised normally, and the "File:"
-- namespace prefix should be
-- omitted.
]==]
local ambox_globe = "Ambox globe.svg"
local hour=tonumber(os.date("%k"))
if hour >= 22 or hour < 6 then
ambox_globe = "Ambox globe Asia Australia.svg"
else
if hour >= 14 and hour < 22 then
ambox_globe = "Ambox globe Americas.svg"
end
end
return {
["california"] = "Flag of California.svg|border|link=|alt=flag",
["california delta"] = "California SD-03 (2011).svg|alt=map",
["california roads"] = "California 1.svg|link=|alt=sign",
["california state university"] = "Flag of California.svg|border|link=|alt=flag",
["cambodia"] = "Flag of Cambodia.svg|border|link=|alt=flag",
["cameroon"] = "Flag of Cameroon.svg|border|link=|alt=flag",
["canada"] = "Maple Leaf (from roundel).svg|alt=flag",
["canadian communities"] = "Map Canada political-geo.png|link=|alt=",
["canadian football"] = "Canadian football.png|alt=icon",
["canadian law"] = "Supreme Court of Canada.jpg|link=|alt=",
["canadian territories"] = "Northern Canada.svg|alt=icon",
["canary islands"] = "Flag of the Canary Islands.svg|border|link=|alt=flag",
["cannabis"] = "Cannabis leaf.svg|alt=icon",
["cape cod and the islands"] = "Nobska Lighthouse 1.jpg|alt=icon",
["cape verde"] = "Flag of Cape Verde.svg|border|link=|alt=flag",
["capital district"] = "Empire State Plaza symbol 2.svg|link=|alt=|class=skin-invert-image",
["capitalism"] = "Capitalismlogo.svg|alt=icon",
["caribbean"] = "Relief Map of Caribbean.png|alt=map",
["caribbean community"] = "Flag of CARICOM.svg|border|link=|alt=flag",
["cars"] = "Sportcar sergio luiz ara 01.svg|link=|alt=",
["cartoon network"] = "Cartoon Network.svg|border|link=|alt=",
["cartoon"] = "Mad scientist.svg|alt=icon",
["catalan-speaking countries"] = "Siñal d'Aragón.svg|border|alt=icon",
["categories"] = "Gnome-fs-directory yellow.svg|alt=icon",
["catholic church"] = "046CupolaSPietro.jpg|border|alt=icon",
["cats"] = "Cat03.jpg|alt=icon",
["cayman islands"] = "Flag of the Cayman Islands.svg|border|link=|alt=flag",
["celts"] = "Triple-Spiral-4turns green transparent.svg|link=|alt=icon",
["central african republic"] = "Flag of the Central African Republic.svg|border|link=|alt=flag",
["central america"] = "Age of Consent - Central America.svg|alt=icon",
["central asia"] = "Central Asian Games participating countries.PNG|alt=icon",
["cetaceans"] = "Sperm whale fluke.jpg|link=|alt=",
["chad"] = "Flag of Chad.svg|border|link=|alt=flag",
["chandigarh"] = "Gandhi Bhawan at Punjab University.jpg|alt=icon",
["channel islands"] = "Flag of Sark.svg|border|link=|alt=flag",
["chemistry"] = "Papapishu-Lab-icon-6.svg|link=|alt=|class=skin-invert",
["chennai"] = "Chennai High Court 1200x800.jpg|alt=icon",
["cheshire"] = "Cheshire Flag.svg|border|alt=icon",
["chess"] = "Chess.svg|alt=icon",
["chhattisgarh"] = "India Chhattisgarh locator map.svg|border|alt=map",
["chicago"] = "Flag of Chicago, Illinois.svg|link=|alt=",
["children's literature"] = "Tom Sawyer 1876 frontispiece.jpg|link=|alt=",
["chile"] = "Flag of Chile.svg|border|link=|alt=flag",
["china"] = "Flag of the People's Republic of China.svg|border|link=|alt=flag",
["christianity"] = "P christianity.svg|alt=icon|class=skin-invert",
["christianity in india"] = "India with cross.svg|alt=icon",
["christmas"] = "Xmas tree.svg|link=|alt=",
["christmas island"] = "Flag of Christmas Island.svg|link=|alt=flag",
["civilizations"] = "Lascar Avenue of the Dead and the Pyramid of the Sun in the background (4566574277).jpg|border|alt=icon",
["civil rights movement"] = "Logo SNCC.svg|link=WP:ACRM|alt=|class=skin-invert",
["cities"] = "Ciudad.svg|alt=icon",
["clans of scotland"] = "Scottish clan map.png|link=|alt=map",
["classical music"] = "Audio a.svg|link=|alt=|class=skin-invert-image",
["classical tamil"] = "Word_Tamil.svg|link=|alt=word|class=skin-invert-image",
["climate change"] = "Climate change icon.png|link=|alt=icon",
["climbing"] = "Pictograms-nps-land-technical_rock_climbing.svg|link=|alt=icon|class=skin-invert-image",
["clothing"] = "Emojione 1F458.svg|alt=icon",
["cocos (keeling) islands"] = "Flag of Australia.svg|border|link=|alt=flag",
["coffee"] = "Emblem-relax.svg|alt=icon",
["college basketball"] = "Basketball.png|link=|alt=",
["college football"] = "NCAAFootball transparent.png|alt=icon",
["colombia"] = "Flag of Colombia.svg|border|link=|alt=flag",
["colorado"] = "Flag of Colorado.svg|border|link=|alt=flag",
["comedy"] = "SMirC-laugh.svg|alt=icon",
["comics"] = "Wikipetan-manga.png|alt=icon",
["communism"] = "Symbol-hammer-and-sickle.svg|link=|alt=",
["community"] = "P globe blue.png|alt=icon",
["comoros"] = "Flag of the Comoros.svg|border|link=|alt=flag",
["companies"] = "Industry5.svg|link=|alt=|class=skin-invert-image",
["computer programming"] = "Octicons-terminal.svg|alt=icon|class=skin-invert-image",
["computer science"] = "Internet map 1024 - transparent, inverted.png|alt=icon|class=skin-invert",
["connecticut"] = "Flag of Connecticut.svg|border|link=|alt=flag",
["conservatism"] = "DodgerBlue flag waving.svg|link=|alt=",
["constructed languages"] = "Design conlang.png|alt=icon",
["contents"] = "Wikipedia's W.svg|link=|alt=|class=skin-invert-image",
["contents/indexes"] = "Pointing-right.svg|link=|alt=icon|class=skin-invert-image",
["contents/lists"] = "Liste.svg|alt=icon|class=skin-invert-image",
["contents/outlines"] = "Pointing-left.svg|link=|alt=icon|class=skin-invert-image",
["cooking"] = "One chef's hat.png|alt=icon|class=skin-invert-image",
["cook islands"] = "Flag of the Cook Islands.svg|border|link=|alt=flag",
["cornwall"] = "Flag of Cornwall.svg|border|link=|alt=flag",
["cosmology"] = "Ilc 9yr moll4096.png|link=|alt=",
["costa rica"] = "Flag of Costa Rica.svg|border|link=|alt=flag",
["côte d'ivoire"] = "Flag of Côte d'Ivoire.svg|border|link=|alt=flag",
["countries"] = "P countries-vector.svg|alt=icon|class=skin-invert",
["county kilkenny"] = "County Kilkenny arms.svg|alt=coat of arms",
["covid-19"] = "SARS-CoV-2 (Wikimedia colors).svg|alt=virus icon",
["cretaceous"] = "Shantungosaurus-v4.jpg|alt=",
["cricket"] = "Cricketball.png|link=|alt=",
["criminal justice"] = "Scale of justice 2.svg|link=|alt=",
["croatia"] = "Flag of Croatia.svg|border|link=|alt=flag",
["crustaceans"] = "Charybdis japonica.jpg|alt=icon",
["cuba"] = "Flag of Cuba.svg|border|link=|alt=flag",
["culture"] = "Taos Pueblo 1992.jpg|alt=icon",
["cumbria"] = "Herdwick sheep crop.jpg|alt=icon",
["curaçao"] = "Flag of Curaçao.svg|border|link=|alt=flag",
["cue sports"] = "Eight Ball Rack 2005 SeanMcClean.jpg|alt=icon",
["current events"] = ambox_globe .. "|link=|alt=",
["current events/turkey"] = "Wikinews-logo.png|alt=icon",
["cycling"] = "Cycling (road) pictogram.svg|link=|alt=icon|class=skin-invert-image",
["cyprus"] = "Flag of Cyprus.svg|border|link=|alt=flag",
["czech republic"] = "Flag of the Czech Republic.svg|border|link=|alt=flag",
}
jsycvd3mn5dk9dong8lnzbhe8u55300
Tempilet:Stack
10
2612
33283
2023-07-15T15:55:11Z
en>Izno
0
re-add mw-stack 2 years down the road, used by MobileFrontend to find infoboxes inside stacks
33283
wikitext
text/x-wiki
<templatestyles src="Stack/styles.css"/><div class="stack mw-stack {{#switch:{{{float|right}}}|left=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|left|true=clear-}}left|right=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|right|true=clear-}}right}}"><!--
-->{{#if:{{{1|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{1}}}</div>}}<!--
-->{{#if:{{{2|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{2}}}</div>}}<!--
-->{{#if:{{{3|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{3}}}</div>}}<!--
-->{{#if:{{{4|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{4}}}</div>}}<!--
-->{{#if:{{{5|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{5}}}</div>}}<!--
-->{{#if:{{{6|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{6}}}</div>}}<!--
-->{{#if:{{{7|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{7}}}</div>}}<!--
-->{{#if:{{{8|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{8}}}</div>}}<!--
-->{{#if:{{{9|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{9}}}</div>}}<!--
--></div>{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using stack with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Stack]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cellspacing | clear | float | margin
}}<noinclude>
{{documentation}}
</noinclude>
s3ljh1ncef581x8xqpi2ky3vktdbdr6
33284
33283
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Stack]]
33283
wikitext
text/x-wiki
<templatestyles src="Stack/styles.css"/><div class="stack mw-stack {{#switch:{{{float|right}}}|left=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|left|true=clear-}}left|right=stack-{{#switch:{{{margin|}}}|1|true|y|yes=margin-}}{{#switch:{{{clear|}}}|right|true=clear-}}right}}"><!--
-->{{#if:{{{1|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{1}}}</div>}}<!--
-->{{#if:{{{2|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{2}}}</div>}}<!--
-->{{#if:{{{3|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{3}}}</div>}}<!--
-->{{#if:{{{4|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{4}}}</div>}}<!--
-->{{#if:{{{5|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{5}}}</div>}}<!--
-->{{#if:{{{6|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{6}}}</div>}}<!--
-->{{#if:{{{7|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{7}}}</div>}}<!--
-->{{#if:{{{8|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{8}}}</div>}}<!--
-->{{#if:{{{9|}}}|<div {{#if:{{{cellspacing|}}}|style="margin: {{{cellspacing}}}px"}}>{{{9}}}</div>}}<!--
--></div>{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using stack with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Stack]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | cellspacing | clear | float | margin
}}<noinclude>
{{documentation}}
</noinclude>
s3ljh1ncef581x8xqpi2ky3vktdbdr6
Tempilet:Stack/styles.css
10
2613
33285
2026-10-31T20:39:29Z
en>Izno
0
reduce
33285
sanitized-css
text/css
/* {{pp-template}} */
.stack {
box-sizing: border-box;
}
.stack > div {
margin: 1px;
overflow: hidden;
}
@media all and (min-width: 640px) {
.stack-clear-left {
float: left;
clear: left;
}
.stack-clear-right {
float: right;
clear: right;
}
.stack-left {
float: left;
}
.stack-right {
float: right;
}
.stack-margin-clear-left {
float: left;
clear: left;
margin-right: 1em;
}
.stack-margin-clear-right {
float: right;
clear: right;
margin-left: 1em;
}
.stack-margin-left {
float: left;
margin-right: 1em;
}
.stack-margin-right {
float: right;
margin-left: 1em;
}
}
bfevypwp07215mbyoujbhyuzyr2v2q1
33286
33285
2026-11-11T21:52:00Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Stack/styles.css]]
33285
sanitized-css
text/css
/* {{pp-template}} */
.stack {
box-sizing: border-box;
}
.stack > div {
margin: 1px;
overflow: hidden;
}
@media all and (min-width: 640px) {
.stack-clear-left {
float: left;
clear: left;
}
.stack-clear-right {
float: right;
clear: right;
}
.stack-left {
float: left;
}
.stack-right {
float: right;
}
.stack-margin-clear-left {
float: left;
clear: left;
margin-right: 1em;
}
.stack-margin-clear-right {
float: right;
clear: right;
margin-left: 1em;
}
.stack-margin-left {
float: left;
margin-right: 1em;
}
.stack-margin-right {
float: right;
margin-left: 1em;
}
}
bfevypwp07215mbyoujbhyuzyr2v2q1
Tempilet:Stack end
10
2614
33287
2021-08-17T01:16:22Z
en>MusikBot II
0
Changed protection settings for "[[Template:Stack end]]": [[Wikipedia:High-risk templates|High-risk template or module]] 7710 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require administrator access] (indefinite))
33287
wikitext
text/x-wiki
<includeonly></div></div>{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using stack with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Stack end]] with unknown parameter "_VALUE_"|ignoreblank=y}}</includeonly><noinclude>
{{documentation}}
</noinclude>
hllcfbmaf8flfaqinyi30zjc1ao6wtu
33288
33287
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Stack_end]]
33287
wikitext
text/x-wiki
<includeonly></div></div>{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using stack with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Stack end]] with unknown parameter "_VALUE_"|ignoreblank=y}}</includeonly><noinclude>
{{documentation}}
</noinclude>
hllcfbmaf8flfaqinyi30zjc1ao6wtu
Tempilet:TOClimit
10
2615
33289
2017-04-16T10:10:25Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:TOClimit]]": Matching redirect target ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33289
wikitext
text/x-wiki
#REDIRECT [[Template:TOC limit]]
o97j00s3agzdf5unnxyzdh3xr3egrhw
33290
33289
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:TOClimit]]
33289
wikitext
text/x-wiki
#REDIRECT [[Template:TOC limit]]
o97j00s3agzdf5unnxyzdh3xr3egrhw
Tempilet:Lorem ipsum
10
2616
33291
2024-07-12T09:05:20Z
en>JWBTH
0
let users see what it actually prints by default
33291
wikitext
text/x-wiki
{{{{{|safesubst:}}}#invoke:lorem ipsum|main}}<noinclude>
{{Documentation}}
</noinclude>
1u4bp7uwhc1wy1jszrzt9jlcqnr5zd7
33292
33291
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Lorem_ipsum]]
33291
wikitext
text/x-wiki
{{{{{|safesubst:}}}#invoke:lorem ipsum|main}}<noinclude>
{{Documentation}}
</noinclude>
1u4bp7uwhc1wy1jszrzt9jlcqnr5zd7
Tempilet:Lipsum
10
2617
33299
2022-12-20T12:50:41Z
en>Queen of Hearts
0
Modifying [[WP:RCAT|redirect categories]] using [[User:Wugapodes/Capricorn|Capricorn ♑]]
33299
wikitext
text/x-wiki
#REDIRECT [[Template:Lorem ipsum]]
{{Redirect category shell|
{{R from template shortcut}}
}}
kshxzrp4aqvwnnmkuav7zu9hdywipvc
33300
33299
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Lipsum]]
33299
wikitext
text/x-wiki
#REDIRECT [[Template:Lorem ipsum]]
{{Redirect category shell|
{{R from template shortcut}}
}}
kshxzrp4aqvwnnmkuav7zu9hdywipvc
Tempilet:Lorem ipsum span
10
2618
33301
2024-05-24T16:58:53Z
en>Awesome Aasim
0
33301
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:Lorem ipsum|oneParagraph}}</includeonly><noinclude>{{Documentation}}
</noinclude>
gk1uit0581fxzu3togsojwwq08w1k63
33302
33301
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Lorem_ipsum_span]]
33301
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:Lorem ipsum|oneParagraph}}</includeonly><noinclude>{{Documentation}}
</noinclude>
gk1uit0581fxzu3togsojwwq08w1k63
Tempilet:Stack documentation
10
2619
33303
2025-10-29T09:06:34Z
en>DocWatson42
0
/* See also */ Added a link and performed minor cleanup.
33303
wikitext
text/x-wiki
<noinclude>
{{ombox |text=This template serves as the shared documentation for {{tl|Stack}}, {{tl|Stack begin}}, and {{tl|Stack end}}.}}
</noinclude>
This template can be used to stack images and other floating content such as infobox templates without causing problems with spacing and floating. Enter a string of images/templates as the first parameter to have them stack without generating floating errors or spacing errors. You can stack many objects from the top of a section and not force further subsections to space out.
{{TOClimit|3}}
== Usage ==
At its simplest:
<syntaxhighlight lang="wikitext">
{{stack|<objects>}}
</syntaxhighlight>
Alternatively, using {{tld|stack begin}} and {{tld|stack end}}:
<syntaxhighlight lang="wikitext">
{{stack begin}}
<objects>
{{stack end}}
</syntaxhighlight>
The <code><object></code> may simply be a string of wikicode for many images/templates.
===Optional parameters===
<syntaxhighlight lang="wikitext">
{{stack| <object(s)> | float=left or right | clear=true or false | margin=true or false}}
</syntaxhighlight>
or
<syntaxhighlight lang="wikitext">
{{stack begin | float=left or right | clear=true or false | margin=true or false}}
</syntaxhighlight>
where
*float= ''left'' or ''right'' (default is '''right''')
*: This option can be used to float the stack to the left or right of the page
*clear= ''true'' or ''false'' (default is '''false''')
*: This option can be used to force the stack to the far left or right (e.g., near an infobox).
*margin= ''true'' or ''false'' (default is '''false''')
*: This option can be used to add a 1em margin to the left (for float right) or right (for float left).
You can also explicitly list multiple arguments:
<syntaxhighlight lang="wikitext">
{{stack| float=left or right | clear=true or false | margin=true or false
|1=<object(s)>
|2=<object(s)>, etc. up to 9 parameters in the current version
}}
</syntaxhighlight>
* This multiple argument version does include extra vertical whitespace between each (set of) <code><object(s)></code>.
== Examples ==
<!--
-->To illustrate the utility of the stack templates, consider the following situation. We would like to have two right floating images at the top of the first section of our article (here, the ''Lipsum'' section), and one left floating image at the top of the second section (here, the ''Lorem'' section). To achieve this layout, without using a stack template, we could try the following code:<!--
--><syntaxhighlight lang="wikitext">
=====''Lipsum''=====
[[File:Simple shapes example.png|thumb|right|Example 1a]]
[[File:Simple shapes example.png|thumb|right|Example 1b]]
... text ...
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left|Example 1c]]
... text ...
=====''Ipsum''=====
... text ...
</syntaxhighlight><!--
-->The result of this is shown in the ''[[#Without stack|without stack]]'' section below. Notice how the left floating image (Example 1c) is prevented from floating above the last right floating image (Example 1b). You may need to resize the width of your browser to fully appreciate the issue. To fix this problem, we can stack the two right floating images together, using the following code:<!--
--><syntaxhighlight lang="wikitext">
=====''Lipsum''=====
{{stack |[[File:Simple shapes example.png|thumb|right|Example 2a]] [[File:Simple shapes example.png|thumb|right|Example 2b]]}}
... text ...
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left|Example 2c]]
... text ...
=====''Ipsum''=====
... text ...
</syntaxhighlight><!--
-->The result of this is shown in the ''[[#With stack|with stack]]'' section below. Notice how by adding this stack template, the left floating image (Example 2c) can now float higher and is not blocked from floating higher than the top of the last right floating image (Example 2b).
{{clear}}
{{anchor|Without stack}}
====Without {{tlf|stack}}====
=====''Lipsum''=====
[[File:Simple shapes example.png|thumb|right|Example 1a]]
[[File:Simple shapes example.png|thumb|right|Example 1b]]
{{Str left|{{Lorem ipsum span}}|124}}
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left|Example 1c]]
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
{{anchor|With stack}}
====With {{tlf|stack}}====
----
=====''Lipsum''=====
{{stack|[[File:Simple shapes example.png|thumb|right|Example 2a]] [[File:Simple shapes example.png|thumb|right|Example 2b]]}}
{{Str left|{{Lorem ipsum span}}|124}}
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left |Example 2c]]
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
====With {{tlf|stack begin}} and {{tlf|stack end}}====
=====''Lipsum'' with second table wider=====
{{stack begin}}
{| class="wikitable"
! Sample table 1
|-
| Example 1a
|-
| Example 1b
|-
|}
{| class="wikitable"
! Sample wider table 2
|-
|Example 2a
|-
|Example 2b
|-
|}
{{stack end}}
{{lipsum}}
=====''Lorem''=====
{| style="background:whitesmoke;"
! Sample table 3
|-
| Example 3a
|-
|}
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
=====''Lipsum'' with first table wider=====
{{stack begin}}
{| class="wikitable"
! Sample wider table 1
|-
| Example 1a
|-
| Example 1b
|-
|}
{| class="wikitable"
! Sample table 2
|-
| Example 2a
|-
| Example 2b
|-
|}
{{stack end}}
{{lipsum}}
=====''Lorem''=====
{| style="background:whitesmoke;"
! Sample table 3
|-
| Example 3a
|-
|}
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
===More examples===
{{tlf|Stack}} can also be used to float one or more images across a page.
{{stack |[[File:Simple shapes example.png|80px]]}}
{{stack |[[File:Simple shapes example.png|120px]]}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{stack|[[File:Simple shapes example.png|80px]]}}
{{stack|[[File:Simple shapes example.png|120px]]}}
</syntaxhighlight>
It might take some experience to learn how the box area floats, in combination with various images or [[WP:Wikitables|wikitables]] on a page. {{tlf|Stack}}'s operation is very quick, as it uses an [[HTML]] <table> to achieve its effects.
===Floating portal boxes===
{{tlf|Stack}} can be used to float a portal box beside an infobox (or other right-aligned item) when other methods might not work as anticipated.
{{infobox
|label1=Infobox
|data1=line 1 <br />line 2 <br />line 3 <br />line 4 <br />line 5 <br />line 6 <br />line 7 <br />line 8 <br />line 9
}}
[[File:Mona Lisa, by Leonardo da Vinci, from C2RMF retouched.jpg|thumb|right|60px|Test image]]
{| class="wikitable"
|style="width:33.0em<!--(was 420px)-->;"|
This is a wikitable serving as a typical left-aligned table. The overlap on left-aligned tables had been a frequent problem when other boxes nearby were set to "float:right". So this is a test of how well a floating portal-box would avoid overlapping onto a left-side table.
|}
{{stack |{{portal|Animals}}{{portal|Cats}}}}
The example here uses {{tld|stack}} to float two portal boxes (Animals, Cats) as follows:
{{clear}}<syntaxhighlight lang="wikitext">
{{stack |{{portal|Animals}}{{portal|Cats}} }}
</syntaxhighlight>
The two portal-boxes are stacked and floated together by both being listed as {{tld|stack}}'s (first) parameter. Because the infobox and image were also stacked together, {{tld|stack}} moved the two portal-boxes alongside the infobox despite being after the image.
Normally, a portal-box would be stuck below the Mona Lisa image, causing this entire text section to format further below, and causing a large text-gap of empty whitespace to appear near the infobox. There is no limit to the number of portalboxes (or Commonscat boxes) which can be listed within a {{tld|stack}} call, such as in a stub or an article with many stacked images near the bottom. Using {{tld|stack}} is extremely efficient, due to being a short template which uses builtin tag <table> to float the boxes.
== Stack template family ==
* {{tl|Stack}}
* {{tl|Stack begin}}
* {{tl|Stack end}}
== Tracking category ==
* {{clc|Pages using stack with unknown parameters}}
== See also ==
* {{Tl|Gallery}}, providing both vertical and horizontal layouts for multiple images; the images will be rearranged (flow) according to the other elements on the page and the width of the browser window.
* {{Tl|Multiple image}}, providing both vertical and horizontal layouts for multiple images.
* {{Tl|Superimpose}}, which places one image over another.
* {{Tl|Superimpose2}}, which can place up to fifty image layers over one another.
* [[Wikipedia:Extended image syntax#The many-floating-objects problem]]
<noinclude>
[[Category:Documentation shared content templates]]
</noinclude>
4aa5nw8nefaxn9mljpqwk0ktomtuxyl
33304
33303
2026-11-11T21:52:01Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Stack_documentation]]
33303
wikitext
text/x-wiki
<noinclude>
{{ombox |text=This template serves as the shared documentation for {{tl|Stack}}, {{tl|Stack begin}}, and {{tl|Stack end}}.}}
</noinclude>
This template can be used to stack images and other floating content such as infobox templates without causing problems with spacing and floating. Enter a string of images/templates as the first parameter to have them stack without generating floating errors or spacing errors. You can stack many objects from the top of a section and not force further subsections to space out.
{{TOClimit|3}}
== Usage ==
At its simplest:
<syntaxhighlight lang="wikitext">
{{stack|<objects>}}
</syntaxhighlight>
Alternatively, using {{tld|stack begin}} and {{tld|stack end}}:
<syntaxhighlight lang="wikitext">
{{stack begin}}
<objects>
{{stack end}}
</syntaxhighlight>
The <code><object></code> may simply be a string of wikicode for many images/templates.
===Optional parameters===
<syntaxhighlight lang="wikitext">
{{stack| <object(s)> | float=left or right | clear=true or false | margin=true or false}}
</syntaxhighlight>
or
<syntaxhighlight lang="wikitext">
{{stack begin | float=left or right | clear=true or false | margin=true or false}}
</syntaxhighlight>
where
*float= ''left'' or ''right'' (default is '''right''')
*: This option can be used to float the stack to the left or right of the page
*clear= ''true'' or ''false'' (default is '''false''')
*: This option can be used to force the stack to the far left or right (e.g., near an infobox).
*margin= ''true'' or ''false'' (default is '''false''')
*: This option can be used to add a 1em margin to the left (for float right) or right (for float left).
You can also explicitly list multiple arguments:
<syntaxhighlight lang="wikitext">
{{stack| float=left or right | clear=true or false | margin=true or false
|1=<object(s)>
|2=<object(s)>, etc. up to 9 parameters in the current version
}}
</syntaxhighlight>
* This multiple argument version does include extra vertical whitespace between each (set of) <code><object(s)></code>.
== Examples ==
<!--
-->To illustrate the utility of the stack templates, consider the following situation. We would like to have two right floating images at the top of the first section of our article (here, the ''Lipsum'' section), and one left floating image at the top of the second section (here, the ''Lorem'' section). To achieve this layout, without using a stack template, we could try the following code:<!--
--><syntaxhighlight lang="wikitext">
=====''Lipsum''=====
[[File:Simple shapes example.png|thumb|right|Example 1a]]
[[File:Simple shapes example.png|thumb|right|Example 1b]]
... text ...
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left|Example 1c]]
... text ...
=====''Ipsum''=====
... text ...
</syntaxhighlight><!--
-->The result of this is shown in the ''[[#Without stack|without stack]]'' section below. Notice how the left floating image (Example 1c) is prevented from floating above the last right floating image (Example 1b). You may need to resize the width of your browser to fully appreciate the issue. To fix this problem, we can stack the two right floating images together, using the following code:<!--
--><syntaxhighlight lang="wikitext">
=====''Lipsum''=====
{{stack |[[File:Simple shapes example.png|thumb|right|Example 2a]] [[File:Simple shapes example.png|thumb|right|Example 2b]]}}
... text ...
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left|Example 2c]]
... text ...
=====''Ipsum''=====
... text ...
</syntaxhighlight><!--
-->The result of this is shown in the ''[[#With stack|with stack]]'' section below. Notice how by adding this stack template, the left floating image (Example 2c) can now float higher and is not blocked from floating higher than the top of the last right floating image (Example 2b).
{{clear}}
{{anchor|Without stack}}
====Without {{tlf|stack}}====
=====''Lipsum''=====
[[File:Simple shapes example.png|thumb|right|Example 1a]]
[[File:Simple shapes example.png|thumb|right|Example 1b]]
{{Str left|{{Lorem ipsum span}}|124}}
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left|Example 1c]]
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
{{anchor|With stack}}
====With {{tlf|stack}}====
----
=====''Lipsum''=====
{{stack|[[File:Simple shapes example.png|thumb|right|Example 2a]] [[File:Simple shapes example.png|thumb|right|Example 2b]]}}
{{Str left|{{Lorem ipsum span}}|124}}
=====''Lorem''=====
[[File:Simple shapes example.png|thumb|left |Example 2c]]
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
====With {{tlf|stack begin}} and {{tlf|stack end}}====
=====''Lipsum'' with second table wider=====
{{stack begin}}
{| class="wikitable"
! Sample table 1
|-
| Example 1a
|-
| Example 1b
|-
|}
{| class="wikitable"
! Sample wider table 2
|-
|Example 2a
|-
|Example 2b
|-
|}
{{stack end}}
{{lipsum}}
=====''Lorem''=====
{| style="background:whitesmoke;"
! Sample table 3
|-
| Example 3a
|-
|}
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
=====''Lipsum'' with first table wider=====
{{stack begin}}
{| class="wikitable"
! Sample wider table 1
|-
| Example 1a
|-
| Example 1b
|-
|}
{| class="wikitable"
! Sample table 2
|-
| Example 2a
|-
| Example 2b
|-
|}
{{stack end}}
{{lipsum}}
=====''Lorem''=====
{| style="background:whitesmoke;"
! Sample table 3
|-
| Example 3a
|-
|}
{{lipsum}}
=====''Ipsum''=====
{{lipsum}}
{{lipsum}}
{{clear}}
===More examples===
{{tlf|Stack}} can also be used to float one or more images across a page.
{{stack |[[File:Simple shapes example.png|80px]]}}
{{stack |[[File:Simple shapes example.png|120px]]}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{stack|[[File:Simple shapes example.png|80px]]}}
{{stack|[[File:Simple shapes example.png|120px]]}}
</syntaxhighlight>
It might take some experience to learn how the box area floats, in combination with various images or [[WP:Wikitables|wikitables]] on a page. {{tlf|Stack}}'s operation is very quick, as it uses an [[HTML]] <table> to achieve its effects.
===Floating portal boxes===
{{tlf|Stack}} can be used to float a portal box beside an infobox (or other right-aligned item) when other methods might not work as anticipated.
{{infobox
|label1=Infobox
|data1=line 1 <br />line 2 <br />line 3 <br />line 4 <br />line 5 <br />line 6 <br />line 7 <br />line 8 <br />line 9
}}
[[File:Mona Lisa, by Leonardo da Vinci, from C2RMF retouched.jpg|thumb|right|60px|Test image]]
{| class="wikitable"
|style="width:33.0em<!--(was 420px)-->;"|
This is a wikitable serving as a typical left-aligned table. The overlap on left-aligned tables had been a frequent problem when other boxes nearby were set to "float:right". So this is a test of how well a floating portal-box would avoid overlapping onto a left-side table.
|}
{{stack |{{portal|Animals}}{{portal|Cats}}}}
The example here uses {{tld|stack}} to float two portal boxes (Animals, Cats) as follows:
{{clear}}<syntaxhighlight lang="wikitext">
{{stack |{{portal|Animals}}{{portal|Cats}} }}
</syntaxhighlight>
The two portal-boxes are stacked and floated together by both being listed as {{tld|stack}}'s (first) parameter. Because the infobox and image were also stacked together, {{tld|stack}} moved the two portal-boxes alongside the infobox despite being after the image.
Normally, a portal-box would be stuck below the Mona Lisa image, causing this entire text section to format further below, and causing a large text-gap of empty whitespace to appear near the infobox. There is no limit to the number of portalboxes (or Commonscat boxes) which can be listed within a {{tld|stack}} call, such as in a stub or an article with many stacked images near the bottom. Using {{tld|stack}} is extremely efficient, due to being a short template which uses builtin tag <table> to float the boxes.
== Stack template family ==
* {{tl|Stack}}
* {{tl|Stack begin}}
* {{tl|Stack end}}
== Tracking category ==
* {{clc|Pages using stack with unknown parameters}}
== See also ==
* {{Tl|Gallery}}, providing both vertical and horizontal layouts for multiple images; the images will be rearranged (flow) according to the other elements on the page and the width of the browser window.
* {{Tl|Multiple image}}, providing both vertical and horizontal layouts for multiple images.
* {{Tl|Superimpose}}, which places one image over another.
* {{Tl|Superimpose2}}, which can place up to fifty image layers over one another.
* [[Wikipedia:Extended image syntax#The many-floating-objects problem]]
<noinclude>
[[Category:Documentation shared content templates]]
</noinclude>
4aa5nw8nefaxn9mljpqwk0ktomtuxyl
Tempilet:Stack begin/doc
10
2620
33305
2023-02-19T23:16:48Z
en>Paine Ellsworth
0
High-use template
33305
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-use}}
{{Uses TemplateStyles|Template:Stack/styles.css}}
{{Stack documentation}}
<includeonly>{{Sandbox other|
| <!-- Categories below this line, please: -->
[[Category:Graphics templates]]
[[Category:Positioning templates]]
}}</includeonly>
2iv2dds4hmchryesc91jl0zzx5h6nze
33306
33305
2026-11-11T21:52:02Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Stack_begin/doc]]
33305
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-use}}
{{Uses TemplateStyles|Template:Stack/styles.css}}
{{Stack documentation}}
<includeonly>{{Sandbox other|
| <!-- Categories below this line, please: -->
[[Category:Graphics templates]]
[[Category:Positioning templates]]
}}</includeonly>
2iv2dds4hmchryesc91jl0zzx5h6nze
Module:Lorem ipsum/data
828
2621
33307
2026-10-05T21:35:58Z
en>Scyrme
0
Undid revision [[Special:Diff/1378718805|1378718805]] by [[Special:Contributions/Scyrme|Scyrme]] ([[User talk:Scyrme|talk]])
33307
Scribunto
text/plain
--<nowiki>
return {
"{{safesubst:#if:%s|[[Lorem ipsum]]|Lorem ipsum}} dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.",
"Fusce convallis, mauris imperdiet gravida bibendum, nisl turpis suscipit mauris, sed placerat ipsum urna sed risus. In convallis tellus a mauris. Curabitur non elit ut libero tristique sodales. Mauris a lacus. Donec mattis semper leo. In hac habitasse platea dictumst. Vivamus facilisis diam at odio. Mauris dictum, nisi eget consequat elementum, lacus ligula molestie metus, non feugiat orci magna ac sem. Donec turpis. Donec vitae metus. Morbi tristique neque eu mauris. Quisque gravida ipsum non sapien. Proin turpis lacus, scelerisque vitae, elementum at, lobortis ac, quam. Aliquam dictum eleifend risus. In hac habitasse platea dictumst. Etiam sit amet diam. Suspendisse odio. Suspendisse nunc. In semper bibendum libero.",
"Proin nonummy, lacus eget pulvinar lacinia, pede felis dignissim leo, vitae tristique magna lacus sit amet eros. Nullam ornare. Praesent odio ligula, dapibus sed, tincidunt eget, dictum ac, nibh. Nam quis lacus. Nunc eleifend molestie velit. Morbi lobortis quam eu velit. Donec euismod vestibulum massa. Donec non lectus. Aliquam commodo lacus sit amet nulla. Cras dignissim elit et augue. Nullam non diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea dictumst. Aenean vestibulum. Sed lobortis elit quis lectus. Nunc sed lacus at augue bibendum dapibus.",
"Aliquam vehicula sem ut pede. Cras purus lectus, egestas eu, vehicula at, imperdiet sed, nibh. Morbi consectetuer luctus felis. Donec vitae nisi. Aliquam tincidunt feugiat elit. Duis sed elit ut turpis ullamcorper feugiat. Praesent pretium, mauris sed fermentum hendrerit, nulla lorem iaculis magna, pulvinar scelerisque urna tellus a justo. Suspendisse pulvinar massa in metus. Duis quis quam. Proin justo. Curabitur ac sapien. Nam erat. Praesent ut quam.",
"Vivamus commodo, augue et laoreet euismod, sem sapien tempor dolor, ac egestas sem ligula quis lacus. Donec vestibulum tortor ac lacus. Sed posuere vestibulum nisl. Curabitur eleifend fermentum justo. Nullam imperdiet. Integer sit amet mauris imperdiet risus sollicitudin rutrum. Ut vitae turpis. Nulla facilisi. Quisque tortor velit, scelerisque et, facilisis vel, tempor sed, urna. Vivamus nulla elit, vestibulum eget, semper et, scelerisque eget, lacus. Pellentesque viverra purus. Quisque elit. Donec ut dolor.",
"Duis volutpat elit et erat. In at nulla at nisl condimentum aliquet. Quisque elementum pharetra lacus. Nunc gravida arcu eget nunc. Nulla iaculis egestas magna. Aliquam erat volutpat. Sed pellentesque orci. Etiam lacus lorem, iaculis sit amet, pharetra quis, imperdiet sit amet, lectus. Integer quis elit ac mi aliquam pretium. Nullam mauris orci, porttitor eget, sollicitudin non, vulputate id, risus. Donec varius enim nec sem. Nam aliquam lacinia enim. Quisque eget lorem eu purus dignissim ultricies. Fusce porttitor hendrerit ante. Mauris urna diam, cursus id, mattis eget, tempus sit amet, risus. Curabitur eu felis. Sed eu mi. Nullam lectus mauris, luctus a, mattis ac, tempus non, leo. Cras mi nulla, rhoncus id, laoreet ut, ultricies id, odio.",
"Donec imperdiet. Vestibulum auctor tortor at orci. Integer semper, nisi eget suscipit eleifend, erat nisl hendrerit justo, eget vestibulum lorem justo ac leo. Integer sem velit, pharetra in, fringilla eu, fermentum id, felis. Vestibulum sed felis. In elit. Praesent et pede vel ante dapibus condimentum. Donec magna. Quisque id risus. Mauris vulputate pellentesque leo. Duis vulputate, ligula at venenatis tincidunt, orci nunc interdum leo, ac egestas elit sem ut lacus. Etiam non diam quis arcu egestas commodo. Curabitur nec massa ac massa gravida condimentum. Aenean id libero. Pellentesque vitae tellus. Fusce lectus est, accumsan ac, bibendum sed, porta eget, augue. Etiam faucibus. Quisque tempus purus eu ante.",
"Vestibulum sapien nisl, ornare auctor, consectetuer quis, posuere tristique, odio. Fusce ultrices ullamcorper odio. Ut augue nulla, interdum at, adipiscing non, tristique eget, neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut pede est, condimentum id, scelerisque ac, malesuada non, quam. Proin eu ligula ac sapien suscipit blandit. Suspendisse euismod. Ut accumsan, neque id gravida luctus, arcu pede sodales felis, vel blandit massa arcu eget ligula. Aenean sed turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sem eros, ornare ut, commodo eu, tempor nec, risus. Donec laoreet dapibus ligula. Praesent orci leo, bibendum nec, ornare et, nonummy in, elit. Donec interdum feugiat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque feugiat ullamcorper ipsum. Donec convallis tincidunt urna.",
"Suspendisse et orci et arcu porttitor pellentesque. Sed lacus nunc, fermentum vel, vehicula in, imperdiet eget, urna. Nam consectetuer euismod nunc. Nulla dignissim posuere nulla. Integer iaculis lacinia massa. Nullam sapien augue, condimentum vel, venenatis id, rhoncus pellentesque, sapien. Donec sed ipsum ultrices turpis consectetuer imperdiet. Duis et ipsum ac nisl laoreet commodo. Mauris eu est. Suspendisse id turpis quis orci euismod consequat. Donec tellus mi, luctus sit amet, ultrices a, convallis eu, lorem. Proin faucibus convallis elit. Maecenas rhoncus arcu at arcu. Proin libero. Proin adipiscing. In quis lorem vitae elit consectetuer pretium. Nullam ligula urna, adipiscing nec, iaculis ut, elementum non, turpis. Fusce pulvinar.",
}
--</nowiki>
byjgx57wqk698ayn134dpkwawy4zpww
33308
33307
2026-11-11T21:52:02Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lorem_ipsum/data]]
33307
Scribunto
text/plain
--<nowiki>
return {
"{{safesubst:#if:%s|[[Lorem ipsum]]|Lorem ipsum}} dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.",
"Fusce convallis, mauris imperdiet gravida bibendum, nisl turpis suscipit mauris, sed placerat ipsum urna sed risus. In convallis tellus a mauris. Curabitur non elit ut libero tristique sodales. Mauris a lacus. Donec mattis semper leo. In hac habitasse platea dictumst. Vivamus facilisis diam at odio. Mauris dictum, nisi eget consequat elementum, lacus ligula molestie metus, non feugiat orci magna ac sem. Donec turpis. Donec vitae metus. Morbi tristique neque eu mauris. Quisque gravida ipsum non sapien. Proin turpis lacus, scelerisque vitae, elementum at, lobortis ac, quam. Aliquam dictum eleifend risus. In hac habitasse platea dictumst. Etiam sit amet diam. Suspendisse odio. Suspendisse nunc. In semper bibendum libero.",
"Proin nonummy, lacus eget pulvinar lacinia, pede felis dignissim leo, vitae tristique magna lacus sit amet eros. Nullam ornare. Praesent odio ligula, dapibus sed, tincidunt eget, dictum ac, nibh. Nam quis lacus. Nunc eleifend molestie velit. Morbi lobortis quam eu velit. Donec euismod vestibulum massa. Donec non lectus. Aliquam commodo lacus sit amet nulla. Cras dignissim elit et augue. Nullam non diam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea dictumst. Aenean vestibulum. Sed lobortis elit quis lectus. Nunc sed lacus at augue bibendum dapibus.",
"Aliquam vehicula sem ut pede. Cras purus lectus, egestas eu, vehicula at, imperdiet sed, nibh. Morbi consectetuer luctus felis. Donec vitae nisi. Aliquam tincidunt feugiat elit. Duis sed elit ut turpis ullamcorper feugiat. Praesent pretium, mauris sed fermentum hendrerit, nulla lorem iaculis magna, pulvinar scelerisque urna tellus a justo. Suspendisse pulvinar massa in metus. Duis quis quam. Proin justo. Curabitur ac sapien. Nam erat. Praesent ut quam.",
"Vivamus commodo, augue et laoreet euismod, sem sapien tempor dolor, ac egestas sem ligula quis lacus. Donec vestibulum tortor ac lacus. Sed posuere vestibulum nisl. Curabitur eleifend fermentum justo. Nullam imperdiet. Integer sit amet mauris imperdiet risus sollicitudin rutrum. Ut vitae turpis. Nulla facilisi. Quisque tortor velit, scelerisque et, facilisis vel, tempor sed, urna. Vivamus nulla elit, vestibulum eget, semper et, scelerisque eget, lacus. Pellentesque viverra purus. Quisque elit. Donec ut dolor.",
"Duis volutpat elit et erat. In at nulla at nisl condimentum aliquet. Quisque elementum pharetra lacus. Nunc gravida arcu eget nunc. Nulla iaculis egestas magna. Aliquam erat volutpat. Sed pellentesque orci. Etiam lacus lorem, iaculis sit amet, pharetra quis, imperdiet sit amet, lectus. Integer quis elit ac mi aliquam pretium. Nullam mauris orci, porttitor eget, sollicitudin non, vulputate id, risus. Donec varius enim nec sem. Nam aliquam lacinia enim. Quisque eget lorem eu purus dignissim ultricies. Fusce porttitor hendrerit ante. Mauris urna diam, cursus id, mattis eget, tempus sit amet, risus. Curabitur eu felis. Sed eu mi. Nullam lectus mauris, luctus a, mattis ac, tempus non, leo. Cras mi nulla, rhoncus id, laoreet ut, ultricies id, odio.",
"Donec imperdiet. Vestibulum auctor tortor at orci. Integer semper, nisi eget suscipit eleifend, erat nisl hendrerit justo, eget vestibulum lorem justo ac leo. Integer sem velit, pharetra in, fringilla eu, fermentum id, felis. Vestibulum sed felis. In elit. Praesent et pede vel ante dapibus condimentum. Donec magna. Quisque id risus. Mauris vulputate pellentesque leo. Duis vulputate, ligula at venenatis tincidunt, orci nunc interdum leo, ac egestas elit sem ut lacus. Etiam non diam quis arcu egestas commodo. Curabitur nec massa ac massa gravida condimentum. Aenean id libero. Pellentesque vitae tellus. Fusce lectus est, accumsan ac, bibendum sed, porta eget, augue. Etiam faucibus. Quisque tempus purus eu ante.",
"Vestibulum sapien nisl, ornare auctor, consectetuer quis, posuere tristique, odio. Fusce ultrices ullamcorper odio. Ut augue nulla, interdum at, adipiscing non, tristique eget, neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut pede est, condimentum id, scelerisque ac, malesuada non, quam. Proin eu ligula ac sapien suscipit blandit. Suspendisse euismod. Ut accumsan, neque id gravida luctus, arcu pede sodales felis, vel blandit massa arcu eget ligula. Aenean sed turpis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec sem eros, ornare ut, commodo eu, tempor nec, risus. Donec laoreet dapibus ligula. Praesent orci leo, bibendum nec, ornare et, nonummy in, elit. Donec interdum feugiat leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque feugiat ullamcorper ipsum. Donec convallis tincidunt urna.",
"Suspendisse et orci et arcu porttitor pellentesque. Sed lacus nunc, fermentum vel, vehicula in, imperdiet eget, urna. Nam consectetuer euismod nunc. Nulla dignissim posuere nulla. Integer iaculis lacinia massa. Nullam sapien augue, condimentum vel, venenatis id, rhoncus pellentesque, sapien. Donec sed ipsum ultrices turpis consectetuer imperdiet. Duis et ipsum ac nisl laoreet commodo. Mauris eu est. Suspendisse id turpis quis orci euismod consequat. Donec tellus mi, luctus sit amet, ultrices a, convallis eu, lorem. Proin faucibus convallis elit. Maecenas rhoncus arcu at arcu. Proin libero. Proin adipiscing. In quis lorem vitae elit consectetuer pretium. Nullam ligula urna, adipiscing nec, iaculis ut, elementum non, turpis. Fusce pulvinar.",
}
--</nowiki>
byjgx57wqk698ayn134dpkwawy4zpww
Module:Lorem ipsum
828
2622
33309
2026-04-22T18:15:33Z
en>Ahecht
0
Consolidate redundant code
33309
Scribunto
text/plain
local yn = require("Module:Yesno")
local p = {}
function p._main(args)
local paragraphs = {}
local outTbl = setmetatable({}, {__call = function (t, v) t[#t+1] = v end})
local link = yn(args["link"]) or yn(args[4]) or false
local join = yn(args["join"]) or false
local joinprefixsuffix = yn(args["joinprefixsuffix"]) or false
local cat = yn(args["cat"]) or true
local count = tonumber(args[1]) or 1
local i = tonumber(args["start"]) or 1
local data = mw.loadData(args["data"] or "Module:Lorem_ipsum/data")
local maxLen = tonumber(args["max len"])
for k,v in ipairs(data) do
table.insert(paragraphs, v)
end
if join and (not joinprefixsuffix) then
outTbl(args["prefix"] or args[2] or "")
end
while i > 0 and i <= count do
if (not join) or joinprefixsuffix then
outTbl(args["prefix"] or args[2] or "\n")
end
mw.log(count, i, data)
outTbl(mw.ustring.format(paragraphs[math.mod(i - 1, #paragraphs) + 1], (link and "link" or "")))
if not join then
outTbl((args["suffix"] or args[3] or "") .. "\n")
else
if joinprefixsuffix then
outTbl(args["suffix"] or args[3] or "")
end
outTbl(i == count and "" or " ")
end
link = false
i = i + 1
end
if join and (not joinprefixsuffix) then
outTbl(args["suffix"] or args[3] or "")
end
if cat and mw.title.getCurrentTitle().namespace == 0 and not mw.isSubsting() then
outTbl("[[Category:Wikipedia articles containing placeholders]]")
end
local outStr = mw.getCurrentFrame():preprocess(table.concat(outTbl))
return maxLen and mw.ustring.sub(outStr, 1, maxLen) or outStr
end
function p.main(frame)
local args = require("Module:Arguments").getArgs(frame)
return p._main(args, false)
end
function p.oneParagraph(frame)
local args = require("Module:Arguments").getArgs(frame)
args["join"] = true
args["start"] = tonumber(args[1]) or 1
return p._main(args)
end
return p
ticslja3ndit4cegu819uq3opezvms0
33310
33309
2026-11-11T21:52:02Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lorem_ipsum]]
33309
Scribunto
text/plain
local yn = require("Module:Yesno")
local p = {}
function p._main(args)
local paragraphs = {}
local outTbl = setmetatable({}, {__call = function (t, v) t[#t+1] = v end})
local link = yn(args["link"]) or yn(args[4]) or false
local join = yn(args["join"]) or false
local joinprefixsuffix = yn(args["joinprefixsuffix"]) or false
local cat = yn(args["cat"]) or true
local count = tonumber(args[1]) or 1
local i = tonumber(args["start"]) or 1
local data = mw.loadData(args["data"] or "Module:Lorem_ipsum/data")
local maxLen = tonumber(args["max len"])
for k,v in ipairs(data) do
table.insert(paragraphs, v)
end
if join and (not joinprefixsuffix) then
outTbl(args["prefix"] or args[2] or "")
end
while i > 0 and i <= count do
if (not join) or joinprefixsuffix then
outTbl(args["prefix"] or args[2] or "\n")
end
mw.log(count, i, data)
outTbl(mw.ustring.format(paragraphs[math.mod(i - 1, #paragraphs) + 1], (link and "link" or "")))
if not join then
outTbl((args["suffix"] or args[3] or "") .. "\n")
else
if joinprefixsuffix then
outTbl(args["suffix"] or args[3] or "")
end
outTbl(i == count and "" or " ")
end
link = false
i = i + 1
end
if join and (not joinprefixsuffix) then
outTbl(args["suffix"] or args[3] or "")
end
if cat and mw.title.getCurrentTitle().namespace == 0 and not mw.isSubsting() then
outTbl("[[Category:Wikipedia articles containing placeholders]]")
end
local outStr = mw.getCurrentFrame():preprocess(table.concat(outTbl))
return maxLen and mw.ustring.sub(outStr, 1, maxLen) or outStr
end
function p.main(frame)
local args = require("Module:Arguments").getArgs(frame)
return p._main(args, false)
end
function p.oneParagraph(frame)
local args = require("Module:Arguments").getArgs(frame)
args["join"] = true
args["start"] = tonumber(args[1]) or 1
return p._main(args)
end
return p
ticslja3ndit4cegu819uq3opezvms0
Tempilet:Marriage
10
2623
33313
2026-10-06T10:44:30Z
en>Danny 1994
0
Used full template name to avoid redirects.
33313
wikitext
text/x-wiki
<templatestyles src="Template:Marriage/styles.css"/>
{{#if:{{{1|}}}||{{#if:{{{2|}}}{{{3|}}}{{{end|{{{reason|}}}}}}
|{{#ifeq:{{{1|+}}}|{{{1|-}}}|<div class="marriage-line-margin3px">​</div>|{{main other|[[Category:Marriage template errors|Z{{PAGENAME}}]]}}}}}}}}
<div class="marriage-display-inline">{{#if:{{{1|}}}
|{{trim|{{#if:{{{end|{{{reason|}}}}}}
|<div style="display:inline-block;line-height:normal;{{#if:{{{2|}}}{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}|margin-top:1px;white-space:normal;|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2=20|3=margin-top:1px;white-space:normal;}}}}">{{{1|}}}</div>
{{#if:{{{2|}}}
|{{#if:{{{end|{{{reason|}}}}}}|<div class="marriage-line-margin2px">​</div>}}
|{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}
|<div class="marriage-line-margin2px">​</div>
|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2=20
|3=<div class="marriage-line-margin2px">​</div>}}
}}}}
|<div style="display:inline-block;line-height:normal;{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}|margin-top:1px;white-space:normal;|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}}|3=margin-top:1px;white-space:normal;}}}}">{{{1|}}}</div>
{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}
|<div class="marriage-line-margin2px">​</div>
|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}}
|3=<div class="marriage-line-margin2px">​</div>}}}}
}}}}}} <div style="display:inline-block;{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}|margin-bottom:1px;|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}}|3=margin-bottom:1px;|4={{#if:{{{end|{{{reason|}}}}}}|{{#if:{{{2|}}}|margin-bottom:1px;}}}}}}}}">​</div>(<!--
-->{{#if:{{{2|}}}
|{{#ifeq:{{{end|{{{reason|+}}}}}}|
|{{#switch:{{{3|}}} | = after }}
|{{abbreviation|m.|married}} }}{{#ifeq:{{{2|}}}|{{YEAR|{{{2|}}}}}
|{{{2|}}}
|{{tooltip|dotted=no|1={{#iferror: {{YEAR|{{{2|}}}}} | {{main other|[[Category:Marriage template errors|I{{PAGENAME}}]]}}{{error-small|invalid year}}|{{YEAR|{{{2|}}}}}}}|2={{{2|}}}}}
}}
|{{#if:{{{3|}}}{{{end|{{{reason|}}}}}}||{{#if:{{#property:P570}}||{{main other|[[Category:Marriage template errors|N{{PAGENAME}}]]}}}}<!--
-->{{#if:{{{end|{{{reason|}}}}}}||{{#if:{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}} | {{main other|[[Category:Marriage template errors|B{{PAGENAME}}]]}}before {{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}} |{{error-small|date missing}}}}}}<!--
-->{{#if:{{{end|{{{reason|}}}}}}|{{#if:{{{2|}}}{{{3|}}}|, }}}}}}
}}{{#if:{{{3|}}}
|{{#ifeq:{{{end|{{{reason|}}}}}}|
|{{#if:{{{2|}}}|⁠–⁠|{{#ifeq:{{{end|+}}}|{{{end|-}}}
|{{#ifeq:{{{end|+}}}|{{{end|-}}} | until | before }}
|{{#ifeq:{{{reason|+}}}|{{{reason|-}}} | until | before }}}} }}
|{{#if:{{{2|}}}
|; 
}}{{#switch:{{lc:{{{end|{{{reason|}}}}}}}}
| d | d. | died = died <!-- this used to be {{abbreviation|d.|died}} but caused confusion with "divorced" -->
| div | div. | divorce | divorced = {{abbreviation|div.|divorced}}
| sep | sep. | separated = {{abbreviation|sep.|separated}} <!-- commonly used reason for end -->
| ann | ann. | annulled | annulment = {{abbreviation|ann.|annulled}} <!-- commonly used reason for end -->
| she d. | her d. | she died | her death = {{#ifeq:{{#property:P21}}|male|died |{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}} }}
| he d. | his d. | he died | his death = {{#ifeq:{{#property:P21}}|female|died |{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}} }}
| w | w. | wid | wid. | widow | widowed = {{main other|[[Category:Marriage template errors|W{{PAGENAME}}]]}}{{error-small|invalid reason}}
| = <!--(reason marriage ended not supplied)-->
| #default = {{{end|{{{reason|}}}}}}
}}
}}{{#ifeq:{{{3|}}}
|{{Str ≠ len|{{{3}}}|4
|{{#ifexpr:{{#iferror:{{#time:Ymd|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}} }}|{{#time:Ymd}} }} >= {{#time:Ymd|{{{3|}}}}}
|{{#ifexpr:{{#time:Ymd|{{if empty|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}}|{{tomorrow}} }}}} = {{#time:Ymd|{{{3|}}}}}
|{{#if:{{{end|{{{reason|}}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|D{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{First word|{{PAGENAMEBASE}}|sep=,}}'s date of death}}</var>|{{YEAR|{{{3|}}}}} }}}}
|{{YEAR|{{{3|}}}}}
}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Ymd}} >= {{#time:Ymd|{{{3|}}}}}|posthumous|future}} date}}</var>|{{YEAR|{{{3|}}}}}
}}}}
|{{#ifexpr:{{#iferror:{{YEAR|{{#ifeq:{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}|Unknown||{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}}} }}|{{#time:Y}} }} >= {{YEAR|{{{3|}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Y}} >= {{{3|}}}|posthumous|future}} year}}</var>|{{YEAR|{{{3|}}}}}
}}}}
}}
|{{{3|}}}
|{{tooltip|dotted=no|1={{#iferror: {{YEAR|{{{3|}}}}} | {{main other|[[Category:Marriage template errors|I{{PAGENAME}}]]}}{{error-small|invalid year}}
|{{Str ≠ len|{{{3}}}|4
|{{#ifexpr:{{#iferror:{{#time:Ymd|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}} }}|{{#time:Ymd}} }} >= {{#time:Ymd|{{{3|}}}}}
|{{#ifexpr:{{#time:Ymd|{{if empty|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}}|{{tomorrow}} }}}} = {{#time:Ymd|{{{3|}}}}}
|{{#if:{{{end|{{{reason|}}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|D{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{First word|{{PAGENAMEBASE}}|sep=,}}'s date of death}}</var>|{{YEAR|{{{3|}}}}} }}}}
|{{YEAR|{{{3|}}}}}
}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Ymd}} >= {{#time:Ymd|{{{3|}}}}}|posthumous|future}} date}}</var>|{{YEAR|{{{3|}}}}}
}}}}
|{{#ifexpr:{{#iferror:{{YEAR|{{#ifeq:{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}|Unknown||{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}}} }}|{{#time:Y}} }} >= {{YEAR|{{{3|}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Y}} >= {{{3|}}}|posthumous|future}} year}}</var>|{{YEAR|{{{3|}}}}}
}}}}
}}}}|2={{{3|}}}}}
}}
|{{#if:{{{2|}}}
|{{#if:{{{end|{{{reason|}}}}}}|, |}}
}}{{#switch:{{lc:{{{end|{{{reason|}}}}}}}}
| d | d. | died = died
| div | div. | divorce | divorced = divorced
| sep | sep. | separated = separated
| ann | ann. | annulled | annulment = annulled
| she d. | her d. | she died | her death = {{#ifeq:{{#property:P21}}|male|died|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead}}}}
| he d. | his d. | he died | his death = {{#ifeq:{{#property:P21}}|female|died|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead}}}}
| w | w. | wid | wid. | widow | widowed = {{main other|[[Category:Marriage template errors|W{{PAGENAME}}]]}}{{error-small|invalid reason }}
| = <!--(reason marriage ended not supplied)-->
| #default = {{{end|{{{reason|}}}}}}
}}
}})<wbr />​</div><!--
-->{{#invoke:Parameter validation|validateparams|module_options = Module:Parameter validation/default config}}<noinclude>
{{documentation}}
</noinclude>
s9jd4xbg4olt7g0prjdw2guvay3yd83
33314
33313
2026-11-11T21:54:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Marriage]]
33313
wikitext
text/x-wiki
<templatestyles src="Template:Marriage/styles.css"/>
{{#if:{{{1|}}}||{{#if:{{{2|}}}{{{3|}}}{{{end|{{{reason|}}}}}}
|{{#ifeq:{{{1|+}}}|{{{1|-}}}|<div class="marriage-line-margin3px">​</div>|{{main other|[[Category:Marriage template errors|Z{{PAGENAME}}]]}}}}}}}}
<div class="marriage-display-inline">{{#if:{{{1|}}}
|{{trim|{{#if:{{{end|{{{reason|}}}}}}
|<div style="display:inline-block;line-height:normal;{{#if:{{{2|}}}{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}|margin-top:1px;white-space:normal;|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2=20|3=margin-top:1px;white-space:normal;}}}}">{{{1|}}}</div>
{{#if:{{{2|}}}
|{{#if:{{{end|{{{reason|}}}}}}|<div class="marriage-line-margin2px">​</div>}}
|{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}
|<div class="marriage-line-margin2px">​</div>
|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2=20
|3=<div class="marriage-line-margin2px">​</div>}}
}}}}
|<div style="display:inline-block;line-height:normal;{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}|margin-top:1px;white-space:normal;|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}}|3=margin-top:1px;white-space:normal;}}}}">{{{1|}}}</div>
{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}
|<div class="marriage-line-margin2px">​</div>
|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}}
|3=<div class="marriage-line-margin2px">​</div>}}}}
}}}}}} <div style="display:inline-block;{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}}|margin-bottom:1px;|{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}}|3=margin-bottom:1px;|4={{#if:{{{end|{{{reason|}}}}}}|{{#if:{{{2|}}}|margin-bottom:1px;}}}}}}}}">​</div>(<!--
-->{{#if:{{{2|}}}
|{{#ifeq:{{{end|{{{reason|+}}}}}}|
|{{#switch:{{{3|}}} | = after }}
|{{abbreviation|m.|married}} }}{{#ifeq:{{{2|}}}|{{YEAR|{{{2|}}}}}
|{{{2|}}}
|{{tooltip|dotted=no|1={{#iferror: {{YEAR|{{{2|}}}}} | {{main other|[[Category:Marriage template errors|I{{PAGENAME}}]]}}{{error-small|invalid year}}|{{YEAR|{{{2|}}}}}}}|2={{{2|}}}}}
}}
|{{#if:{{{3|}}}{{{end|{{{reason|}}}}}}||{{#if:{{#property:P570}}||{{main other|[[Category:Marriage template errors|N{{PAGENAME}}]]}}}}<!--
-->{{#if:{{{end|{{{reason|}}}}}}||{{#if:{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}} | {{main other|[[Category:Marriage template errors|B{{PAGENAME}}]]}}before {{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}} |{{error-small|date missing}}}}}}<!--
-->{{#if:{{{end|{{{reason|}}}}}}|{{#if:{{{2|}}}{{{3|}}}|, }}}}}}
}}{{#if:{{{3|}}}
|{{#ifeq:{{{end|{{{reason|}}}}}}|
|{{#if:{{{2|}}}|⁠–⁠|{{#ifeq:{{{end|+}}}|{{{end|-}}}
|{{#ifeq:{{{end|+}}}|{{{end|-}}} | until | before }}
|{{#ifeq:{{{reason|+}}}|{{{reason|-}}} | until | before }}}} }}
|{{#if:{{{2|}}}
|; 
}}{{#switch:{{lc:{{{end|{{{reason|}}}}}}}}
| d | d. | died = died <!-- this used to be {{abbreviation|d.|died}} but caused confusion with "divorced" -->
| div | div. | divorce | divorced = {{abbreviation|div.|divorced}}
| sep | sep. | separated = {{abbreviation|sep.|separated}} <!-- commonly used reason for end -->
| ann | ann. | annulled | annulment = {{abbreviation|ann.|annulled}} <!-- commonly used reason for end -->
| she d. | her d. | she died | her death = {{#ifeq:{{#property:P21}}|male|died |{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}} }}
| he d. | his d. | he died | his death = {{#ifeq:{{#property:P21}}|female|died |{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}} }}
| w | w. | wid | wid. | widow | widowed = {{main other|[[Category:Marriage template errors|W{{PAGENAME}}]]}}{{error-small|invalid reason}}
| = <!--(reason marriage ended not supplied)-->
| #default = {{{end|{{{reason|}}}}}}
}}
}}{{#ifeq:{{{3|}}}
|{{Str ≠ len|{{{3}}}|4
|{{#ifexpr:{{#iferror:{{#time:Ymd|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}} }}|{{#time:Ymd}} }} >= {{#time:Ymd|{{{3|}}}}}
|{{#ifexpr:{{#time:Ymd|{{if empty|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}}|{{tomorrow}} }}}} = {{#time:Ymd|{{{3|}}}}}
|{{#if:{{{end|{{{reason|}}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|D{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{First word|{{PAGENAMEBASE}}|sep=,}}'s date of death}}</var>|{{YEAR|{{{3|}}}}} }}}}
|{{YEAR|{{{3|}}}}}
}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Ymd}} >= {{#time:Ymd|{{{3|}}}}}|posthumous|future}} date}}</var>|{{YEAR|{{{3|}}}}}
}}}}
|{{#ifexpr:{{#iferror:{{YEAR|{{#ifeq:{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}|Unknown||{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}}} }}|{{#time:Y}} }} >= {{YEAR|{{{3|}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Y}} >= {{{3|}}}|posthumous|future}} year}}</var>|{{YEAR|{{{3|}}}}}
}}}}
}}
|{{{3|}}}
|{{tooltip|dotted=no|1={{#iferror: {{YEAR|{{{3|}}}}} | {{main other|[[Category:Marriage template errors|I{{PAGENAME}}]]}}{{error-small|invalid year}}
|{{Str ≠ len|{{{3}}}|4
|{{#ifexpr:{{#iferror:{{#time:Ymd|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}} }}|{{#time:Ymd}} }} >= {{#time:Ymd|{{{3|}}}}}
|{{#ifexpr:{{#time:Ymd|{{if empty|{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=ymd}}|{{tomorrow}} }}}} = {{#time:Ymd|{{{3|}}}}}
|{{#if:{{{end|{{{reason|}}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|D{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{First word|{{PAGENAMEBASE}}|sep=,}}'s date of death}}</var>|{{YEAR|{{{3|}}}}} }}}}
|{{YEAR|{{{3|}}}}}
}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Ymd}} >= {{#time:Ymd|{{{3|}}}}}|posthumous|future}} date}}</var>|{{YEAR|{{{3|}}}}}
}}}}
|{{#ifexpr:{{#iferror:{{YEAR|{{#ifeq:{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}|Unknown||{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}}}} }}|{{#time:Y}} }} >= {{YEAR|{{{3|}}}}}
|{{YEAR|{{{3|}}}}}
|{{main other|[[Category:Marriage template errors|P{{PAGENAME}}]]}}{{if preview|<var>{{colored link|red|Category:Marriage template errors|{{#ifexpr:{{#time:Y}} >= {{{3|}}}|posthumous|future}} year}}</var>|{{YEAR|{{{3|}}}}}
}}}}
}}}}|2={{{3|}}}}}
}}
|{{#if:{{{2|}}}
|{{#if:{{{end|{{{reason|}}}}}}|, |}}
}}{{#switch:{{lc:{{{end|{{{reason|}}}}}}}}
| d | d. | died = died
| div | div. | divorce | divorced = divorced
| sep | sep. | separated = separated
| ann | ann. | annulled | annulment = annulled
| she d. | her d. | she died | her death = {{#ifeq:{{#property:P21}}|male|died|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead}}}}
| he d. | his d. | he died | his death = {{#ifeq:{{#property:P21}}|female|died|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead}}}}
| w | w. | wid | wid. | widow | widowed = {{main other|[[Category:Marriage template errors|W{{PAGENAME}}]]}}{{error-small|invalid reason }}
| = <!--(reason marriage ended not supplied)-->
| #default = {{{end|{{{reason|}}}}}}
}}
}})<wbr />​</div><!--
-->{{#invoke:Parameter validation|validateparams|module_options = Module:Parameter validation/default config}}<noinclude>
{{documentation}}
</noinclude>
s9jd4xbg4olt7g0prjdw2guvay3yd83
Tempilet:If both
10
2624
33315
2025-08-05T05:07:39Z
en>Theknightwho
0
Avoid issues with the empty string parameter.
33315
wikitext
text/x-wiki
{{safesubst:<noinclude/>#if:{{{1|}}}| {{safesubst:<noinclude/>#if:{{{2|}}}|{{{3|}}}|{{{4|}}}}} |{{{4|}}} }}<noinclude>
{{Documentation}}
<!--
PLEASE ADD CATEGORIES
TO THE /doc SUBPAGE, THANKS
-->
</noinclude>
nuwl84dtikaj4rfmr0nwvxnatlew8ks
33316
33315
2026-11-11T21:54:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:If_both]]
33315
wikitext
text/x-wiki
{{safesubst:<noinclude/>#if:{{{1|}}}| {{safesubst:<noinclude/>#if:{{{2|}}}|{{{3|}}}|{{{4|}}}}} |{{{4|}}} }}<noinclude>
{{Documentation}}
<!--
PLEASE ADD CATEGORIES
TO THE /doc SUBPAGE, THANKS
-->
</noinclude>
nuwl84dtikaj4rfmr0nwvxnatlew8ks
Tempilet:Encodefirst
10
2625
33317
2021-10-04T18:26:06Z
en>GKFX
0
Swap out nested string functions for [[Module:MultiReplace]], which is quicker. Maintains the behaviour of trimming the input string.
33317
wikitext
text/x-wiki
{{#invoke:MultiReplace|main|1={{{1}}}|2=^:|3=:|4=^;|5=;|6=^*|7=*|8=^#|9=#}}<noinclude>
{{Documentation}}
</noinclude>
fgsuijq1qbeeru97jz4uaebxs5w3y9x
33318
33317
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Encodefirst]]
33317
wikitext
text/x-wiki
{{#invoke:MultiReplace|main|1={{{1}}}|2=^:|3=:|4=^;|5=;|6=^*|7=*|8=^#|9=#}}<noinclude>
{{Documentation}}
</noinclude>
fgsuijq1qbeeru97jz4uaebxs5w3y9x
Module:MultiReplace
828
2626
33319
2022-11-15T20:58:00Z
en>Pppery
0
Per edit request
33319
Scribunto
text/plain
local p = {}
local function MultiReplace(args)
local input = args[1] or "{{{1}}}"
local plain = args.plain == "yes"
local i = 1
local changeList = {}
while args[i * 2] do
local change = {pattern = args[i * 2], repl = args[i * 2 + 1]}
if not change.repl then
return require('Module:Error').error{
'MultiReplace: Unpaired argument: <code>' .. (i * 2) .. ' = ' .. mw.text.nowiki(change.pattern) .. '</code>'
}
end
changeList[i] = change
i = i + 1
end
local matchList = {}
local pos = 1
local len = mw.ustring.len(input)
local result = ""
while pos <= len do
local bestStart = len + 1
local bestStop = len
local bestChange
for _, change in ipairs(changeList) do
local start, stop = mw.ustring.find(input, change.pattern, pos, plain)
if start and (start < bestStart) then
bestStart = start
bestStop = stop
bestChange = change
end
end
result = result .. mw.ustring.sub(input, pos, bestStart - 1)
if bestChange then
local fragment = mw.ustring.sub(input, bestStart, bestStop)
result = result .. (plain and bestChange.repl or
mw.ustring.gsub(fragment, bestChange.pattern, bestChange.repl, 1))
end
pos = bestStop + 1
end
return result
end
function p.main(frame, ...)
local args =
type(frame) ~= 'table' and {frame, ...} or
type(frame.args) ~= 'table' and frame or
frame.args[1] and frame.args or
frame:getParent().args
return MultiReplace(args)
end
return p
6zo47ee57vf0m5j8jpjxogh6942fd2q
33320
33319
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Module:MultiReplace]]
33319
Scribunto
text/plain
local p = {}
local function MultiReplace(args)
local input = args[1] or "{{{1}}}"
local plain = args.plain == "yes"
local i = 1
local changeList = {}
while args[i * 2] do
local change = {pattern = args[i * 2], repl = args[i * 2 + 1]}
if not change.repl then
return require('Module:Error').error{
'MultiReplace: Unpaired argument: <code>' .. (i * 2) .. ' = ' .. mw.text.nowiki(change.pattern) .. '</code>'
}
end
changeList[i] = change
i = i + 1
end
local matchList = {}
local pos = 1
local len = mw.ustring.len(input)
local result = ""
while pos <= len do
local bestStart = len + 1
local bestStop = len
local bestChange
for _, change in ipairs(changeList) do
local start, stop = mw.ustring.find(input, change.pattern, pos, plain)
if start and (start < bestStart) then
bestStart = start
bestStop = stop
bestChange = change
end
end
result = result .. mw.ustring.sub(input, pos, bestStart - 1)
if bestChange then
local fragment = mw.ustring.sub(input, bestStart, bestStop)
result = result .. (plain and bestChange.repl or
mw.ustring.gsub(fragment, bestChange.pattern, bestChange.repl, 1))
end
pos = bestStop + 1
end
return result
end
function p.main(frame, ...)
local args =
type(frame) ~= 'table' and {frame, ...} or
type(frame.args) ~= 'table' and frame or
frame.args[1] and frame.args or
frame:getParent().args
return MultiReplace(args)
end
return p
6zo47ee57vf0m5j8jpjxogh6942fd2q
Tempilet:Trim
10
2627
33321
2022-10-26T14:01:15Z
en>MSGJ
0
x parameter not needed
33321
wikitext
text/x-wiki
<includeonly>{{safesubst:#if:1|{{{1|}}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
757g7pokoq514f9oi2nwaddkdp2ohtn
33322
33321
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Trim]]
33321
wikitext
text/x-wiki
<includeonly>{{safesubst:#if:1|{{{1|}}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
757g7pokoq514f9oi2nwaddkdp2ohtn
Module:WikidataIB
828
2628
33323
2025-12-27T11:46:46Z
en>Taavi
0
implement Lucas's edit request from talk page for multilingual label support
33323
Scribunto
text/plain
-- Version: 2023-07-10
-- Module to implement use of a blacklist and whitelist for infobox fields
-- Can take a named parameter |qid which is the Wikidata ID for the article
-- if not supplied, it will use the Wikidata ID associated with the current page.
-- Fields in blacklist are never to be displayed, i.e. module must return nil in all circumstances
-- Fields in whitelist return local value if it exists or the Wikidata value otherwise
-- The name of the field that this function is called from is passed in named parameter |name
-- The name is compulsory when blacklist or whitelist is used,
-- so the module returns nil if it is not supplied.
-- blacklist is passed in named parameter |suppressfields (or |spf)
-- whitelist is passed in named parameter |fetchwikidata (or |fwd)
require("strict")
local p = {}
local cdate -- initialise as nil and only load _complex_date function if needed
-- Module:Complex date is loaded lazily and has the following dependencies:
-- Module:Calendar
-- Module:ISOdate
-- Module:DateI18n
-- Module:I18n/complex date
-- Module:Ordinal
-- Module:I18n/ordinal
-- Module:Yesno
-- Module:Formatnum
-- Module:Linguistic
--
-- The following, taken from https://www.mediawiki.org/wiki/Wikibase/DataModel#Dates_and_times,
-- is needed to use Module:Complex date which seemingly requires date precision as a string.
-- It would work better if only the authors of the mediawiki page could spell 'millennium'.
local dp = {
[6] = "millennium",
[7] = "century",
[8] = "decade",
[9] = "year",
[10] = "month",
[11] = "day",
}
local i18n =
{
["errors"] =
{
["property-not-found"] = "Property not found.",
["No property supplied"] = "No property supplied",
["entity-not-found"] = "Wikidata entity not found.",
["unknown-claim-type"] = "Unknown claim type.",
["unknown-entity-type"] = "Unknown entity type.",
["qualifier-not-found"] = "Qualifier not found.",
["site-not-found"] = "Wikimedia project not found.",
["labels-not-found"] = "No labels found.",
["descriptions-not-found"] = "No descriptions found.",
["aliases-not-found"] = "No aliases found.",
["unknown-datetime-format"] = "Unknown datetime format.",
["local-article-not-found"] = "Article is available on Wikidata, but not on Wikipedia",
["dab-page"] = " (dab)",
},
["months"] =
{
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
},
["century"] = "century",
["BC"] = "BC",
["BCE"] = "BCE",
["ordinal"] =
{
[1] = "st",
[2] = "nd",
[3] = "rd",
["default"] = "th"
},
["filespace"] = "File",
["Unknown"] = "Unknown",
["NaN"] = "Not a number",
-- set the following to the name of a tracking category,
-- e.g. "[[Category:Articles with missing Wikidata information]]", or "" to disable:
["missinginfocat"] = "[[Category:Articles with missing Wikidata information]]",
["editonwikidata"] = "Edit this on Wikidata",
["latestdatequalifier"] = function (date) return "before " .. date end,
-- some languages, e.g. Bosnian use a period as a suffix after each number in a date
["datenumbersuffix"] = "",
["list separator"] = ", ",
["multipliers"] = {
[0] = "",
[3] = " thousand",
[6] = " million",
[9] = " billion",
[12] = " trillion",
}
}
-- This allows an internationisation module to override the above table
if 'en' ~= mw.getContentLanguage():getCode() then
require("Module:i18n").loadI18n("Module:WikidataIB/i18n", i18n)
end
-- This piece of html implements a collapsible container. Check the classes exist on your wiki.
local collapsediv = '<div class="mw-collapsible mw-collapsed" style="width:100%; overflow:auto;" data-expandtext="{{int:show}}" data-collapsetext="{{int:hide}}">'
-- Some items should not be linked.
-- Each wiki can create a list of those in Module:WikidataIB/nolinks
-- It should return a table called itemsindex, containing true for each item not to be linked
local donotlink = {}
local nolinks_exists, nolinks = pcall(mw.loadData, "Module:WikidataIB/nolinks")
if nolinks_exists then
donotlink = nolinks.itemsindex
end
-- To satisfy Wikipedia:Manual of Style/Titles, certain types of items are italicised, and others are quoted.
-- The submodule [[Module:WikidataIB/titleformats]] lists the entity-ids used in 'instance of' (P31),
-- which allows this module to identify the values that should be formatted.
-- WikidataIB/titleformats exports a table p.formats, which is indexed by entity-id, and contains the value " or ''
local formats = {}
local titleformats_exists, titleformats = pcall(mw.loadData, "Module:WikidataIB/titleformats")
if titleformats_exists then
formats = titleformats.formats
end
-------------------------------------------------------------------------------
-- Private functions
-------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------
-- makeOrdinal needs to be internationalised along with the above:
-- takes cardinal number as a numeric and returns the ordinal as a string
-- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local makeOrdinal = function(cardinal)
local ordsuffix = i18n.ordinal.default
if cardinal % 10 == 1 then
ordsuffix = i18n.ordinal[1]
elseif cardinal % 10 == 2 then
ordsuffix = i18n.ordinal[2]
elseif cardinal % 10 == 3 then
ordsuffix = i18n.ordinal[3]
end
-- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th'
-- similarly for 12 and 13, etc.
if (cardinal % 100 == 11) or (cardinal % 100 == 12) or (cardinal % 100 == 13) then
ordsuffix = i18n.ordinal.default
end
return tostring(cardinal) .. ordsuffix
end
-------------------------------------------------------------------------------
-- findLang takes a "langcode" parameter if supplied and valid
-- otherwise it tries to create it from the user's set language ({{int:lang}})
-- failing that it uses the wiki's content language.
-- It returns a language object
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local findLang = function(langcode)
local langobj
langcode = mw.text.trim(langcode or "")
if mw.language.isKnownLanguageTag(langcode) then
langobj = mw.language.new( langcode )
else
langcode = mw.getCurrentFrame():callParserFunction('int', {'lang'})
if mw.language.isKnownLanguageTag(langcode) then
langobj = mw.language.new( langcode )
else
langobj = mw.language.getContentLanguage()
end
end
return langobj
end
-------------------------------------------------------------------------------
-- _getItemLangCode takes a qid parameter (using the current page's qid if blank)
-- If the item for that qid has property country (P17) it looks at the first preferred value
-- If the country has an official language (P37), it looks at the first preferred value
-- If that official language has a language code (P424), it returns the first preferred value
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local _getItemLangCode = function(qid)
qid = mw.text.trim(qid or ""):upper()
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return end
local prop17 = mw.wikibase.getBestStatements(qid, "P17")[1]
if not prop17 or prop17.mainsnak.snaktype ~= "value" then return end
local qid17 = prop17.mainsnak.datavalue.value.id
local prop37 = mw.wikibase.getBestStatements(qid17, "P37")[1]
if not prop37 or prop37.mainsnak.snaktype ~= "value" then return end
local qid37 = prop37.mainsnak.datavalue.value.id
local prop424 = mw.wikibase.getBestStatements(qid37, "P424")[1]
if not prop424 or prop424.mainsnak.snaktype ~= "value" then return end
return prop424.mainsnak.datavalue.value
end
-------------------------------------------------------------------------------
-- roundto takes a number (x)
-- and returns it rounded to (sf) significant figures
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local roundto = function(x, sf)
if x == 0 then return 0 end
local s = 1
if x < 0 then
x = -x
s = -1
end
if sf < 1 then sf = 1 end
local p = 10 ^ (math.floor(math.log10(x)) - sf + 1)
x = math.floor(x / p + 0.5) * p * s
-- if it's integral, cast to an integer:
if x == math.floor(x) then x = math.floor(x) end
return x
end
-------------------------------------------------------------------------------
-- decimalToDMS takes a decimal degrees (x) with precision (p)
-- and returns degrees/minutes/seconds according to the precision
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local decimalToDMS = function(x, p)
-- if p is not supplied, use a precision around 0.1 seconds
if not tonumber(p) then p = 1e-4 end
local d = math.floor(x)
local ms = (x - d) * 60
if p > 0.5 then -- precision is > 1/2 a degree
if ms > 30 then d = d + 1 end
ms = 0
end
local m = math.floor(ms)
local s = (ms - m) * 60
if p > 0.008 then -- precision is > 1/2 a minute
if s > 30 then m = m +1 end
s = 0
elseif p > 0.00014 then -- precision is > 1/2 a second
s = math.floor(s + 0.5)
elseif p > 0.000014 then -- precision is > 1/20 second
s = math.floor(10 * s + 0.5) / 10
elseif p > 0.0000014 then -- precision is > 1/200 second
s = math.floor(100 * s + 0.5) / 100
else -- cap it at 3 dec places for now
s = math.floor(1000 * s + 0.5) / 1000
end
return d, m, s
end
-------------------------------------------------------------------------------
-- decimalPrecision takes a decimal (x) with precision (p)
-- and returns x rounded approximately to the given precision
-- precision should be between 1 and 1e-6, preferably a power of 10.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local decimalPrecision = function(x, p)
local s = 1
if x < 0 then
x = -x
s = -1
end
-- if p is not supplied, pick an arbitrary precision
if not tonumber(p) then p = 1e-4
elseif p > 1 then p = 1
elseif p < 1e-6 then p = 1e-6
else p = 10 ^ math.floor(math.log10(p))
end
x = math.floor(x / p + 0.5) * p * s
-- if it's integral, cast to an integer:
if x == math.floor(x) then x = math.floor(x) end
-- if it's less than 1e-4, it will be in exponent form, so return a string with 6dp
-- 9e-5 becomes 0.000090
if math.abs(x) < 1e-4 then x = string.format("%f", x) end
return x
end
-------------------------------------------------------------------------------
-- formatDate takes a datetime of the usual format from mw.wikibase.entity:formatPropertyValues
-- like "1 August 30 BCE" as parameter 1
-- and formats it according to the df (date format) and bc parameters
-- df = ["dmy" / "mdy" / "y"] default will be "dmy"
-- bc = ["BC" / "BCE"] default will be "BCE"
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local format_Date = function(datetime, dateformat, bc)
local datetime = datetime or "1 August 30 BCE" -- in case of nil value
-- chop off multiple vales and/or any hours, mins, etc.
-- keep anything before punctuation - we just want a single date:
local dateval = string.match( datetime, "[%w ]+")
local dateformat = string.lower(dateformat or "dmy") -- default to dmy
local bc = string.upper(bc or "") -- can't use nil for bc
-- we only want to accept two possibilities: BC or default to BCE
if bc == "BC" then
bc = " " .. i18n["BC"] -- prepend a non-breaking space.
else
bc = " " .. i18n["BCE"]
end
local postchrist = true -- start by assuming no BCE
local dateparts = {}
for word in string.gmatch(dateval, "%w+") do
if word == "BCE" or word == "BC" then -- *** internationalise later ***
postchrist = false
else
-- we'll keep the parts that are not 'BCE' in a table
dateparts[#dateparts + 1] = word
end
end
if postchrist then bc = "" end -- set AD dates to no suffix *** internationalise later ***
local sep = " " -- separator is nbsp
local fdate = table.concat(dateparts, sep) -- set formatted date to same order as input
-- if we have day month year, check dateformat
if #dateparts == 3 then
if dateformat == "y" then
fdate = dateparts[3]
elseif dateformat == "mdy" then
fdate = dateparts[2] .. sep .. dateparts[1] .. "," .. sep .. dateparts[3]
end
elseif #dateparts == 2 and dateformat == "y" then
fdate = dateparts[2]
end
return fdate .. bc
end
-------------------------------------------------------------------------------
-- dateFormat is the handler for properties that are of type "time"
-- It takes timestamp, precision (6 to 11 per mediawiki), dateformat (y/dmy/mdy), BC format (BC/BCE),
-- a plaindate switch (yes/no/adj) to en/disable "sourcing circumstances"/use adjectival form,
-- any qualifiers for the property, the language, and any adjective to use like 'before'.
-- It passes the date through the "complex date" function
-- and returns a string with the internatonalised date formatted according to preferences.
-------------------------------------------------------------------------------
-- Dependencies: findLang(); cdate(); dp[]
-------------------------------------------------------------------------------
local dateFormat = function(timestamp, dprec, df, bcf, pd, qualifiers, lang, adj, model)
-- output formatting according to preferences (y/dmy/mdy/ymd)
df = (df or ""):lower()
-- if ymd is required, return the part of the timestamp in YYYY-MM-DD form
-- but apply Year zero#Astronomers fix: 1 BC = 0000; 2 BC = -0001; etc.
if df == "ymd" then
if timestamp:sub(1,1) == "+" then
return timestamp:sub(2,11)
else
local yr = tonumber(timestamp:sub(2,5)) - 1
yr = ("000" .. yr):sub(-4)
if yr ~= "0000" then yr = "-" .. yr end
return yr .. timestamp:sub(6,11)
end
end
-- A year can be stored like this: "+1872-00-00T00:00:00Z",
-- which is processed here as if it were the day before "+1872-01-01T00:00:00Z",
-- and that's the last day of 1871, so the year is wrong.
-- So fix the month 0, day 0 timestamp to become 1 January instead:
timestamp = timestamp:gsub("%-00%-00T", "-01-01T")
-- just in case date precision is missing
dprec = dprec or 11
-- override more precise dates if required dateformat is year alone:
if df == "y" and dprec > 9 then dprec = 9 end
-- complex date only deals with precisions from 6 to 11, so clip range
dprec = dprec>11 and 11 or dprec
dprec = dprec<6 and 6 or dprec
-- BC format is "BC" or "BCE"
bcf = (bcf or ""):upper()
-- plaindate only needs the first letter (y/n/a)
pd = (pd or ""):sub(1,1):lower()
if pd == "" or pd == "n" or pd == "f" or pd == "0" then pd = false end
-- in case language isn't passed
lang = lang or findLang().code
-- set adj as empty if nil
adj = adj or ""
-- extract the day, month, year from the timestamp
local bc = timestamp:sub(1, 1)=="-" and "BC" or ""
local year, month, day = timestamp:match("[+-](%d*)-(%d*)-(%d*)T")
local iso = tonumber(year) -- if year is missing, let it throw an error
-- this will adjust the date format to be compatible with cdate
-- possible formats are Y, YY, YYY0, YYYY, YYYY-MM, YYYY-MM-DD
if dprec == 6 then iso = math.floor( (iso - 1) / 1000 ) + 1 end
if dprec == 7 then iso = math.floor( (iso - 1) / 100 ) + 1 end
if dprec == 8 then iso = math.floor( iso / 10 ) .. "0" end
if dprec == 10 then iso = year .. "-" .. month end
if dprec == 11 then iso = year .. "-" .. month .. "-" .. day end
-- add "circa" (Q5727902) from "sourcing circumstances" (P1480)
local sc = not pd and qualifiers and qualifiers.P1480
if sc then
for k1, v1 in pairs(sc) do
if v1.datavalue and v1.datavalue.value.id == "Q5727902" then
adj = "circa"
break
end
end
end
-- deal with Julian dates:
-- no point in saying that dates before 1582 are Julian - they are by default
-- doesn't make sense for dates less precise than year
-- we can suppress it by setting |plaindate, e.g. for use in constructing categories.
local calendarmodel = ""
if tonumber(year) > 1582
and dprec > 8
and not pd
and model == "http://www.wikidata.org/entity/Q1985786" then
calendarmodel = "julian"
end
if not cdate then
cdate = require("Module:Complex date")._complex_date
end
local fdate = cdate(calendarmodel, adj, tostring(iso), dp[dprec], bc, "", "", "", "", lang, 1)
-- this may have QuickStatements info appended to it in a div, so remove that
fdate = fdate:gsub(' <div style="display: none;">[^<]*</div>', '')
-- it may also be returned wrapped in a microformat, so remove that
fdate = fdate:gsub("<[^>]*>", "")
-- there may be leading zeros that we should remove
fdate = fdate:gsub("^0*", "")
-- if a plain date is required, then remove any links (like BC linked)
if pd then
fdate = fdate:gsub("%[%[.*|", ""):gsub("]]", "")
end
-- if 'circa', use the abbreviated form *** internationalise later ***
fdate = fdate:gsub('circa ', '<abbr title="circa">c.</abbr> ')
-- deal with BC/BCE
if bcf == "BCE" then
fdate = fdate:gsub('BC', 'BCE')
end
-- deal with mdy format
if df == "mdy" then
fdate = fdate:gsub("(%d+) (%w+) (%d+)", "%2 %1, %3")
end
-- deal with adjectival form *** internationalise later ***
if pd == "a" then
fdate = fdate:gsub(' century', '-century')
end
return fdate
end
-------------------------------------------------------------------------------
-- parseParam takes a (string) parameter, e.g. from the list of frame arguments,
-- and makes "false", "no", and "0" into the (boolean) false
-- it makes the empty string and nil into the (boolean) value passed as default
-- allowing the parameter to be true or false by default.
-- It returns a boolean.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local parseParam = function(param, default)
if type(param) == "boolean" then param = tostring(param) end
if param and param ~= "" then
param = param:lower()
if (param == "false") or (param:sub(1,1) == "n") or (param == "0") then
return false
else
return true
end
else
return default
end
end
-------------------------------------------------------------------------------
-- _getSitelink takes the qid of a Wikidata entity passed as |qid=
-- It takes an optional parameter |wiki= to determine which wiki is to be checked for a sitelink
-- If the parameter is blank, then it uses the local wiki.
-- If there is a sitelink to an article available, it returns the plain text link to the article
-- If there is no sitelink, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local _getSitelink = function(qid, wiki)
qid = (qid or ""):upper()
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
wiki = wiki or ""
local sitelink
if wiki == "" then
sitelink = mw.wikibase.getSitelink(qid)
else
sitelink = mw.wikibase.getSitelink(qid, wiki)
end
return sitelink
end
-------------------------------------------------------------------------------
-- _getCommonslink takes an optional qid of a Wikidata entity passed as |qid=
-- It returns one of the following in order of preference:
-- the Commons sitelink of the Wikidata entity - but not if onlycat=true and it's not a category;
-- the Commons sitelink of the topic's main category of the Wikidata entity;
-- the Commons category of the Wikidata entity - unless fallback=false.
-------------------------------------------------------------------------------
-- Dependencies: _getSitelink(); parseParam()
-------------------------------------------------------------------------------
local _getCommonslink = function(qid, onlycat, fallback)
qid = (qid or ""):upper()
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
onlycat = parseParam(onlycat, false)
if fallback == "" then fallback = nil end
local sitelink = _getSitelink(qid, "commonswiki")
if onlycat and sitelink and sitelink:sub(1,9) ~= "Category:" then sitelink = nil end
if not sitelink then
-- check for topic's main category
local prop910 = mw.wikibase.getBestStatements(qid, "P910")[1]
if prop910 then
local tmcid = prop910.mainsnak.datavalue and prop910.mainsnak.datavalue.value.id
sitelink = _getSitelink(tmcid, "commonswiki")
end
if not sitelink then
-- check for list's main category
local prop1754 = mw.wikibase.getBestStatements(qid, "P1754")[1]
if prop1754 then
local tmcid = prop1754.mainsnak.datavalue and prop1754.mainsnak.datavalue.value.id
sitelink = _getSitelink(tmcid, "commonswiki")
end
end
end
if not sitelink and fallback then
-- check for Commons category (string value)
local prop373 = mw.wikibase.getBestStatements(qid, "P373")[1]
if prop373 then
sitelink = prop373.mainsnak.datavalue and prop373.mainsnak.datavalue.value
if sitelink then sitelink = "Category:" .. sitelink end
end
end
return sitelink
end
-------------------------------------------------------------------------------
-- The label in a Wikidata item is subject to vulnerabilities
-- that an attacker might try to exploit.
-- It needs to be 'sanitised' by removing any wikitext before use.
-- If it doesn't exist, return the id for the item
-- a second (boolean) value is also returned, value is true when the label exists
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local labelOrId = function(id, lang)
if lang == "default" then lang = findLang().code end
local label
if lang then
label = mw.wikibase.getLabelByLang(id, lang)
else
label = mw.wikibase.getLabel(id)
end
if label then
return mw.text.nowiki(label), true
else
return id, false
end
end
-------------------------------------------------------------------------------
-- linkedItem takes an entity-id and returns a string, linked if possible.
-- This is the handler for "wikibase-item". Preferences:
-- 1. Display linked disambiguated sitelink if it exists
-- 2. Display linked label if it is a redirect
-- 3. TBA: Display an inter-language link for the label if it exists other than in default language
-- 4. Display unlinked label if it exists
-- 5. Display entity-id for now to indicate a label could be provided
-- dtxt is text to be used instead of label, or nil.
-- shortname is boolean switch to use P1813 (short name) instead of label if true.
-- lang is the current language code.
-- uselbl is boolean switch to force display of the label instead of the sitelink (default: false)
-- linkredir is boolean switch to allow linking to a redirect (default: false)
-- formatvalue is boolean switch to allow formatting as italics or quoted (default: false)
-------------------------------------------------------------------------------
-- Dependencies: labelOrId(); donotlink[]
-------------------------------------------------------------------------------
local linkedItem = function(id, args)
local lprefix = (args.lp or args.lprefix or args.linkprefix or ""):gsub('"', '') -- toughen against nil values passed
local lpostfix = (args.lpostfix or ""):gsub('"', '')
local prefix = (args.prefix or ""):gsub('"', '')
local postfix = (args.postfix or ""):gsub('"', '')
local dtxt = args.dtxt
local shortname = args.shortname or args.sn
local lang = args.lang or "en" -- fallback to default if missing
local uselbl = args.uselabel or args.uselbl
uselbl = parseParam(uselbl, false)
local linkredir = args.linkredir
linkredir = parseParam(linkredir, false)
local formatvalue = args.formatvalue or args.fv
formatvalue = parseParam(formatvalue, false)
-- see if item might need italics or quotes
local fmt = ""
if next(formats) and formatvalue then
for k, v in ipairs( mw.wikibase.getBestStatements(id, "P31") ) do
if v.mainsnak.datavalue and formats[v.mainsnak.datavalue.value.id] then
fmt = formats[v.mainsnak.datavalue.value.id]
break -- pick the first match
end
end
end
local disp
local sitelink = mw.wikibase.getSitelink(id)
local label, islabel
if dtxt then
label, islabel = dtxt, true
elseif shortname then
-- see if there is a shortname in our language, and set label to it
for k, v in ipairs( mw.wikibase.getBestStatements(id, "P1813") ) do
if v.mainsnak.datavalue.value.language == lang then
label, islabel = v.mainsnak.datavalue.value.text, true
break
end -- test for language match
end -- loop through values of short name
-- if we have no label set, then there was no shortname available
if not islabel then
label, islabel = labelOrId(id)
shortname = false
end
else
label, islabel = labelOrId(id)
end
if mw.site.siteName ~= "Wikimedia Commons" then
if sitelink then
if not (dtxt or shortname) then
-- if sitelink and label are the same except for case, no need to process further
if sitelink:lower() ~= label:lower() then
-- strip any namespace or dab from the sitelink
local pos = sitelink:find(":") or 0
local slink = sitelink
if pos > 0 then
local pfx = sitelink:sub(1,pos-1)
if mw.site.namespaces[pfx] then -- that prefix is a valid namespace, so remove it
slink = sitelink:sub(pos+1)
end
end
-- remove stuff after commas or inside parentheses - ie. dabs
slink = slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")
-- if uselbl is false, use sitelink instead of label
if not uselbl then
-- use slink as display, preserving label case - find("^%u") is true for 1st char uppercase
if label:find("^%u") then
label = slink:gsub("^(%l)", string.upper)
else
label = slink:gsub("^(%u)", string.lower)
end
end
end
end
if donotlink[label] then
disp = prefix .. fmt .. label .. fmt .. postfix
else
disp = "[[" .. lprefix .. sitelink .. lpostfix .. "|" .. prefix .. fmt .. label .. fmt .. postfix .. "]]"
end
elseif islabel then
-- no sitelink, label exists, so check if a redirect with that title exists, if linkredir is true
-- display plain label by default
disp = prefix .. fmt .. label .. fmt .. postfix
if linkredir then
local artitle = mw.title.new(label, 0) -- only nil if label has invalid chars
if not donotlink[label] and artitle and artitle.redirectTarget then
-- there's a redirect with the same title as the label, so let's link to that
disp = "[[".. lprefix .. label .. lpostfix .. "|" .. prefix .. fmt .. label .. fmt .. postfix .. "]]"
end
end -- test if article title exists as redirect on current Wiki
else
-- no sitelink and no label, so return whatever was returned from labelOrId for now
-- add tracking category [[Category:Articles with missing Wikidata information]]
-- for enwiki, just return the tracking category
if mw.wikibase.getGlobalSiteId() == "enwiki" then
disp = i18n.missinginfocat
else
disp = prefix .. label .. postfix .. i18n.missinginfocat
end
end
else
local ccat = mw.wikibase.getBestStatements(id, "P373")[1]
if ccat and ccat.mainsnak.datavalue then
ccat = ccat.mainsnak.datavalue.value
disp = "[[" .. lprefix .. "Category:" .. ccat .. lpostfix .. "|" .. prefix .. label .. postfix .. "]]"
elseif sitelink then
-- this asumes that if a sitelink exists, then a label also exists
disp = "[[" .. lprefix .. sitelink .. lpostfix .. "|" .. prefix .. label .. postfix .. "]]"
else
-- no sitelink and no Commons cat, so return label from labelOrId for now
disp = prefix .. label .. postfix
end
end
return disp
end
-------------------------------------------------------------------------------
-- sourced takes a table representing a statement that may or may not have references
-- it looks for a reference sourced to something not containing the word "wikipedia"
-- it returns a boolean = true if it finds a sourced reference.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local sourced = function(claim)
if claim.references then
for kr, vr in pairs(claim.references) do
local ref = mw.wikibase.renderSnaks(vr.snaks)
if not ref:find("Wiki") then
return true
end
end
end
end
-------------------------------------------------------------------------------
-- setRanks takes a flag (parameter passed) that requests the values to return
-- "b[est]" returns preferred if available, otherwise normal
-- "p[referred]" returns preferred
-- "n[ormal]" returns normal
-- "d[eprecated]" returns deprecated
-- multiple values are allowed, e.g. "preferred normal" (which is the default)
-- "best" will override the other flags, and set p and n
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local setRanks = function(rank)
rank = (rank or ""):lower()
-- if nothing passed, return preferred and normal
-- if rank == "" then rank = "p n" end
local ranks = {}
for w in string.gmatch(rank, "%a+") do
w = w:sub(1,1)
if w == "b" or w == "p" or w == "n" or w == "d" then
ranks[w] = true
end
end
-- check if "best" is requested or no ranks requested; and if so, set preferred and normal
if ranks.b or not next(ranks) then
ranks.p = true
ranks.n = true
end
return ranks
end
-------------------------------------------------------------------------------
-- parseInput processes the Q-id , the blacklist and the whitelist
-- if an input parameter is supplied, it returns that and ends the call.
-- it returns (1) either the qid or nil indicating whether or not the call should continue
-- and (2) a table containing all of the statements for the propertyID and relevant Qid
-- if "best" ranks are requested, it returns those instead of all non-deprecated ranks
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local parseInput = function(frame, input_parm, property_id)
-- There may be a local parameter supplied, if it's blank, set it to nil
input_parm = mw.text.trim(input_parm or "")
if input_parm == "" then input_parm = nil end
-- return nil if Wikidata is not available
if not mw.wikibase then return false, input_parm end
local args = frame.args
-- can take a named parameter |qid which is the Wikidata ID for the article.
-- if it's not supplied, use the id for the current page
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
-- if there's no Wikidata item for the current page return nil
if not qid then return false, input_parm end
-- The blacklist is passed in named parameter |suppressfields
local blacklist = args.suppressfields or args.spf or ""
-- The whitelist is passed in named parameter |fetchwikidata
local whitelist = args.fetchwikidata or args.fwd or ""
if whitelist == "" then whitelist = "NONE" end
-- The name of the field that this function is called from is passed in named parameter |name
local fieldname = args.name or ""
if blacklist ~= "" then
-- The name is compulsory when blacklist is used, so return nil if it is not supplied
if fieldname == "" then return false, nil end
-- If this field is on the blacklist, then return nil
if blacklist:find(fieldname) then return false, nil end
end
-- If we got this far then we're not on the blacklist
-- The blacklist overrides any locally supplied parameter as well
-- If a non-blank input parameter was supplied return it
if input_parm then return false, input_parm end
-- We can filter out non-valid properties
if property_id:sub(1,1):upper() ~="P" or property_id == "P0" then return false, nil end
-- Otherwise see if this field is on the whitelist:
-- needs a bit more logic because find will return its second value = 0 if fieldname is ""
-- but nil if fieldname not found on whitelist
local _, found = whitelist:find(fieldname)
found = ((found or 0) > 0)
if whitelist ~= 'ALL' and (whitelist:upper() == "NONE" or not found) then
return false, nil
end
-- See what's on Wikidata (the call always returns a table, but it may be empty):
local props = {}
if args.reqranks.b then
props = mw.wikibase.getBestStatements(qid, property_id)
else
props = mw.wikibase.getAllStatements(qid, property_id)
end
if props[1] then
return qid, props
end
-- no property on Wikidata
return false, nil
end
-------------------------------------------------------------------------------
-- createicon assembles the "Edit at Wikidata" pen icon.
-- It returns a wikitext string inside a span class="penicon"
-- if entityID is nil or empty, the ID associated with current page is used
-- langcode and propertyID may be nil or empty
-------------------------------------------------------------------------------
-- Dependencies: i18n[];
-------------------------------------------------------------------------------
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
if not entityID or entityID == "" then entityID= mw.wikibase.getEntityIdForCurrentPage() end
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. i18n["filespace"]
.. ":OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n["editonwikidata"]
.. "|link=https://www.wikidata.org/wiki/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n["editonwikidata"] .. "]]</span>"
return icon
end
-------------------------------------------------------------------------------
-- assembleoutput takes the sequence table containing the property values
-- and formats it according to switches given. It returns a string or nil.
-- It uses the entityID (and optionally propertyID) to create a link in the pen icon.
-------------------------------------------------------------------------------
-- Dependencies: parseParam();
-------------------------------------------------------------------------------
local assembleoutput = function(out, args, entityID, propertyID)
-- sorted is a boolean passed to enable sorting of the values returned
-- if nothing or an empty string is passed set it false
-- if "false" or "no" or "0" is passed set it false
local sorted = parseParam(args.sorted, false)
-- noicon is a boolean passed to suppress the trailing "edit at Wikidata" icon
-- for use when the value is processed further by the infobox
-- if nothing or an empty string is passed set it false
-- if "false" or "no" or "0" is passed set it false
local noic = parseParam(args.noicon, false)
-- list is the name of a template that a list of multiple values is passed through
-- examples include "hlist" and "ubl"
-- setting it to "prose" produces something like "1, 2, 3, and 4"
local list = args.list or ""
-- sep is a string that is used to separate multiple returned values
-- if nothing or an empty string is passed set it to the default
-- any double-quotes " are stripped out, so that spaces may be passed
-- e.g. |sep=" - "
local sepdefault = i18n["list separator"]
local separator = args.sep or ""
separator = string.gsub(separator, '"', '')
if separator == "" then
separator = sepdefault
end
-- collapse is a number that determines the maximum number of returned values
-- before the output is collapsed.
-- Zero or not a number result in no collapsing (default becomes 0).
local collapse = tonumber(args.collapse) or 0
-- replacetext (rt) is a string that is returned instead of any non-empty Wikidata value
-- this is useful for tracking and debugging
local replacetext = mw.text.trim(args.rt or args.replacetext or "")
-- if there's anything to return, then return a list
-- comma-separated by default, but may be specified by the sep parameter
-- optionally specify a hlist or ubl or a prose list, etc.
local strout
if #out > 0 then
if sorted then table.sort(out) end
-- if there's something to display and a pen icon is wanted, add it the end of the last value
local hasdisplay = false
for i, v in ipairs(out) do
if v ~= i18n.missinginfocat then
hasdisplay = true
break
end
end
if not noic and hasdisplay then
out[#out] = out[#out] .. createicon(args.langobj.code, entityID, propertyID)
end
if list == "" then
strout = table.concat(out, separator)
elseif list:lower() == "prose" then
strout = mw.text.listToText( out )
else
strout = mw.getCurrentFrame():expandTemplate{title = list, args = out}
end
if collapse >0 and #out > collapse then
strout = collapsediv .. strout .. "</div>"
end
else
strout = nil -- no items had valid reference
end
if replacetext ~= "" and strout then strout = replacetext end
return strout
end
-------------------------------------------------------------------------------
-- rendersnak takes a table (propval) containing the information stored on one property value
-- and returns the value as a string and its language if monolingual text.
-- It handles data of type:
-- wikibase-item
-- time
-- string, url, commonsMedia, external-id
-- quantity
-- globe-coordinate
-- monolingualtext
-- It also requires linked, the link/pre/postfixes, uabbr, and the arguments passed from frame.
-- The optional filter parameter allows quantities to be be filtered by unit Qid.
-------------------------------------------------------------------------------
-- Dependencies: parseParam(); labelOrId(); i18n[]; dateFormat();
-- roundto(); decimalPrecision(); decimalToDMS(); linkedItem();
-------------------------------------------------------------------------------
local rendersnak = function(propval, args, linked, lpre, lpost, pre, post, uabbr, filter)
lpre = lpre or ""
lpost = lpost or ""
pre = pre or ""
post = post or ""
args.lang = args.lang or findLang().code
-- allow values to display a fixed text instead of label
local dtxt = args.displaytext or args.dt
if dtxt == "" then dtxt = nil end
-- switch to use display of short name (P1813) instead of label
local shortname = args.shortname or args.sn
shortname = parseParam(shortname, false)
local snak = propval.mainsnak or propval
local dtype = snak.datatype
local dv = snak.datavalue
dv = dv and dv.value
-- value and monolingual text language code returned
local val, mlt
if propval.rank and not args.reqranks[propval.rank:sub(1, 1)] then
-- val is nil: value has a rank that isn't requested
------------------------------------
elseif snak.snaktype == "somevalue" then -- value is unknown
val = i18n["Unknown"]
------------------------------------
elseif snak.snaktype == "novalue" then -- value is none
-- val = "No value" -- don't return anything
------------------------------------
elseif dtype == "wikibase-item" then -- data type is a wikibase item:
-- it's wiki-linked value, so output as link if enabled and possible
local qnumber = dv.id
if linked then
val = linkedItem(qnumber, args)
else -- no link wanted so check for display-text, otherwise test for lang code
local label, islabel
if dtxt then
label = dtxt
else
label, islabel = labelOrId(qnumber)
local langlabel = mw.wikibase.getLabelByLang(qnumber, args.lang)
if langlabel then
label = mw.text.nowiki( langlabel )
end
end
val = pre .. label .. post
end -- test for link required
------------------------------------
elseif dtype == "time" then -- data type is time:
-- time is in timestamp format
-- date precision is integer per mediawiki
-- output formatting according to preferences (y/dmy/mdy)
-- BC format as BC or BCE
-- plaindate is passed to disable looking for "sourcing cirumstances"
-- or to set the adjectival form
-- qualifiers (if any) is a nested table or nil
-- lang is given, or user language, or site language
--
-- Here we can check whether args.df has a value
-- If not, use code from Module:Sandbox/RexxS/Getdateformat to set it from templates like {{Use mdy dates}}
val = dateFormat(dv.time, dv.precision, args.df, args.bc, args.pd, propval.qualifiers, args.lang, "", dv.calendarmodel)
------------------------------------
-- data types which are strings:
elseif dtype == "commonsMedia" or dtype == "external-id" or dtype == "string" or dtype == "url" then
-- commonsMedia or external-id or string or url
-- all have mainsnak.datavalue.value as string
if (lpre == "" or lpre == ":") and lpost == "" then
-- don't link if no linkpre/postfix or linkprefix is just ":"
val = pre .. dv .. post
elseif dtype == "external-id" then
val = "[" .. lpre .. dv .. lpost .. " " .. pre .. dv .. post .. "]"
else
val = "[[" .. lpre .. dv .. lpost .. "|" .. pre .. dv .. post .. "]]"
end -- check for link requested (i.e. either linkprefix or linkpostfix exists)
------------------------------------
-- data types which are quantities:
elseif dtype == "quantity" then
-- quantities have mainsnak.datavalue.value.amount and mainsnak.datavalue.value.unit
-- the unit is of the form http://www.wikidata.org/entity/Q829073
--
-- implement a switch to turn on/off numerical formatting later
local fnum = true
--
-- a switch to turn on/off conversions - only for en-wiki
local conv = parseParam(args.conv or args.convert, false)
-- if we have conversions, we won't have formatted numbers or scales
if conv then
uabbr = true
fnum = false
args.scale = "0"
end
--
-- a switch to turn on/off showing units, default is true
local showunits = parseParam(args.su or args.showunits, true)
--
-- convert amount to a number
local amount = tonumber(dv.amount) or i18n["NaN"]
--
-- scale factor for millions, billions, etc.
local sc = tostring(args.scale or ""):sub(1,1):lower()
local scale
if sc == "a" then
-- automatic scaling
if amount > 1e15 then
scale = 12
elseif amount > 1e12 then
scale = 9
elseif amount > 1e9 then
scale = 6
elseif amount > 1e6 then
scale = 3
else
scale = 0
end
else
scale = tonumber(args.scale) or 0
if scale < 0 or scale > 12 then scale = 0 end
scale = math.floor(scale/3) * 3
end
local factor = 10^scale
amount = amount / factor
-- ranges:
local range = ""
-- check if upper and/or lower bounds are given and significant
local upb = tonumber(dv.upperBound)
local lowb = tonumber(dv.lowerBound)
if upb and lowb then
-- differences rounded to 2 sig fig:
local posdif = roundto(upb - amount, 2) / factor
local negdif = roundto(amount - lowb, 2) / factor
upb, lowb = amount + posdif, amount - negdif
-- round scaled numbers to integers or 4 sig fig
if (scale > 0 or sc == "a") then
if amount < 1e4 then
amount = roundto(amount, 4)
else
amount = math.floor(amount + 0.5)
end
end
if fnum then amount = args.langobj:formatNum( amount ) end
if posdif ~= negdif then
-- non-symmetrical
range = " +" .. posdif .. " -" .. negdif
elseif posdif ~= 0 then
-- symmetrical and non-zero
range = " ±" .. posdif
else
-- otherwise range is zero, so leave it as ""
end
else
-- round scaled numbers to integers or 4 sig fig
if (scale > 0 or sc == "a") then
if amount < 1e4 then
amount = roundto(amount, 4)
else
amount = math.floor(amount + 0.5)
end
end
if fnum then amount = args.langobj:formatNum( amount ) end
end
-- unit names and symbols:
-- extract the qid in the form 'Qnnn' from the value.unit url
-- and then fetch the label from that - or symbol if unitabbr is true
local unit = ""
local usep = ""
local usym = ""
local unitqid = string.match( dv.unit, "(Q%d+)" )
if filter and unitqid ~= filter then return nil end
if unitqid and showunits then
local uname = mw.wikibase.getLabelByLang(unitqid, args.lang) or ""
if uname ~= "" then usep, unit = " ", uname end
if uabbr then
-- see if there's a unit symbol (P5061)
local unitsymbols = mw.wikibase.getBestStatements(unitqid, "P5061")
-- construct fallback table, add local lang and multiple languages
local fbtbl = mw.language.getFallbacksFor( args.lang, mw.language.FALLBACK_STRICT )
table.insert( fbtbl, 1, args.lang )
table.insert( fbtbl, "mul" )
table.insert( fbtbl, "en" )
local found = false
for idx1, us in ipairs(unitsymbols) do
for idx2, fblang in ipairs(fbtbl) do
if us.mainsnak.datavalue.value.language == fblang then
usym = us.mainsnak.datavalue.value.text
found = true
break
end
end -- loop through fallback table
if found then break end
end -- loop through values of P5061
if found then usep, unit = " ", usym end
end
end
-- format display:
if conv then
if range == "" then
val = mw.getCurrentFrame():expandTemplate{title = "cvt", args = {amount, unit}}
else
val = mw.getCurrentFrame():expandTemplate{title = "cvt", args = {lowb, "to", upb, unit}}
end
elseif unit == "$" or unit == "£" then
val = unit .. amount .. range .. i18n.multipliers[scale]
else
val = amount .. range .. i18n.multipliers[scale] .. usep .. unit
end
------------------------------------
-- datatypes which are global coordinates:
elseif dtype == "globe-coordinate" then
-- 'display' parameter defaults to "inline, title" *** unused for now ***
-- local disp = args.display or ""
-- if disp == "" then disp = "inline, title" end
--
-- format parameter switches from deg/min/sec to decimal degrees
-- default is deg/min/sec -- decimal degrees needs |format = dec
local form = (args.format or ""):lower():sub(1,3)
if form ~= "dec" then form = "dms" end -- not needed for now
--
-- show parameter allows just the latitude, or just the longitude, or both
-- to be returned as a signed decimal, ignoring the format parameter.
local show = (args.show or ""):lower()
if show ~= "longlat" then show = show:sub(1,3) end
--
local lat, long, prec = dv.latitude, dv.longitude, dv.precision
if show == "lat" then
val = decimalPrecision(lat, prec)
elseif show == "lon" then
val = decimalPrecision(long, prec)
elseif show == "longlat" then
val = decimalPrecision(long, prec) .. ", " .. decimalPrecision(lat, prec)
else
local ns = "N"
local ew = "E"
if lat < 0 then
ns = "S"
lat = - lat
end
if long < 0 then
ew = "W"
long = - long
end
if form == "dec" then
lat = decimalPrecision(lat, prec)
long = decimalPrecision(long, prec)
val = lat .. "°" .. ns .. " " .. long .. "°" .. ew
else
local latdeg, latmin, latsec = decimalToDMS(lat, prec)
local longdeg, longmin, longsec = decimalToDMS(long, prec)
if latsec == 0 and longsec == 0 then
if latmin == 0 and longmin == 0 then
val = latdeg .. "°" .. ns .. " " .. longdeg .. "°" .. ew
else
val = latdeg .. "°" .. latmin .. "′" .. ns .. " "
val = val .. longdeg .. "°".. longmin .. "′" .. ew
end
else
val = latdeg .. "°" .. latmin .. "′" .. latsec .. "″" .. ns .. " "
val = val .. longdeg .. "°" .. longmin .. "′" .. longsec .. "″" .. ew
end
end
end
------------------------------------
elseif dtype == "monolingualtext" then -- data type is Monolingual text:
-- has mainsnak.datavalue.value as a table containing language/text pairs
-- collect all the values in 'out' and languages in 'mlt' and process them later
val = pre .. dv.text .. post
mlt = dv.language
------------------------------------
else
-- some other data type so write a specific handler
val = "unknown data type: " .. dtype
end -- of datatype/unknown value/sourced check
return val, mlt
end
-------------------------------------------------------------------------------
-- propertyvalueandquals takes a property object, the arguments passed from frame,
-- and a qualifier propertyID.
-- It returns a sequence (table) of values representing the values of that property
-- and qualifiers that match the qualifierID if supplied.
-------------------------------------------------------------------------------
-- Dependencies: parseParam(); sourced(); labelOrId(); i18n.latestdatequalifier(); format_Date();
-- makeOrdinal(); roundto(); decimalPrecision(); decimalToDMS(); assembleoutput();
-------------------------------------------------------------------------------
local function propertyvalueandquals(objproperty, args, qualID)
-- needs this style of declaration because it's re-entrant
-- onlysourced is a boolean passed to return only values sourced to other than Wikipedia
-- if nothing or an empty string is passed set it true
local onlysrc = parseParam(args.onlysourced or args.osd, true)
-- linked is a a boolean that enables the link to a local page via sitelink
-- if nothing or an empty string is passed set it true
local linked = parseParam(args.linked, true)
-- prefix is a string that may be nil, empty (""), or a string of characters
-- this is prefixed to each value
-- useful when when multiple values are returned
-- any double-quotes " are stripped out, so that spaces may be passed
local prefix = (args.prefix or ""):gsub('"', '')
-- postfix is a string that may be nil, empty (""), or a string of characters
-- this is postfixed to each value
-- useful when when multiple values are returned
-- any double-quotes " are stripped out, so that spaces may be passed
local postfix = (args.postfix or ""):gsub('"', '')
-- linkprefix is a string that may be nil, empty (""), or a string of characters
-- this creates a link and is then prefixed to each value
-- useful when when multiple values are returned and indirect links are needed
-- any double-quotes " are stripped out, so that spaces may be passed
local lprefix = (args.linkprefix or args.lp or ""):gsub('"', '')
-- linkpostfix is a string that may be nil, empty (""), or a string of characters
-- this is postfixed to each value when linking is enabled with lprefix
-- useful when when multiple values are returned
-- any double-quotes " are stripped out, so that spaces may be passed
local lpostfix = (args.linkpostfix or ""):gsub('"', '')
-- wdlinks is a boolean passed to enable links to Wikidata when no article exists
-- if nothing or an empty string is passed set it false
local wdl = parseParam(args.wdlinks or args.wdl, false)
-- unitabbr is a boolean passed to enable unit abbreviations for common units
-- if nothing or an empty string is passed set it false
local uabbr = parseParam(args.unitabbr or args.uabbr, false)
-- qualsonly is a boolean passed to return just the qualifiers
-- if nothing or an empty string is passed set it false
local qualsonly = parseParam(args.qualsonly or args.qo, false)
-- maxvals is a string that may be nil, empty (""), or a number
-- this determines how many items may be returned when multiple values are available
-- setting it = 1 is useful where the returned string is used within another call, e.g. image
local maxvals = tonumber(args.maxvals) or 0
-- pd (plain date) is a string: yes/true/1 | no/false/0 | adj
-- to disable/enable "sourcing cirumstances" or use adjectival form for the plain date
local pd = args.plaindate or args.pd or "no"
args.pd = pd
-- allow qualifiers to have a different date format; default to year unless qualsonly is set
args.qdf = args.qdf or args.qualifierdateformat or args.df or (not qualsonly and "y")
local lang = args.lang or findLang().code
-- qualID is a string list of wanted qualifiers or "ALL"
qualID = qualID or ""
-- capitalise list of wanted qualifiers and substitute "DATES"
qualID = qualID:upper():gsub("DATES", "P580, P582")
local allflag = (qualID == "ALL")
-- create table of wanted qualifiers as key
local qwanted = {}
-- create sequence of wanted qualifiers
local qorder = {}
for q in mw.text.gsplit(qualID, "%p") do -- split at punctuation and iterate
local qtrim = mw.text.trim(q)
if qtrim ~= "" then
qwanted[mw.text.trim(q)] = true
qorder[#qorder+1] = qtrim
end
end
-- qsep is the output separator for rendering qualifier list
local qsep = (args.qsep or ""):gsub('"', '')
-- qargs are the arguments to supply to assembleoutput()
local qargs = {
["osd"] = "false",
["linked"] = tostring(linked),
["prefix"] = args.qprefix,
["postfix"] = args.qpostfix,
["linkprefix"] = args.qlinkprefix or args.qlp,
["linkpostfix"] = args.qlinkpostfix,
["wdl"] = "false",
["unitabbr"] = tostring(uabbr),
["maxvals"] = 0,
["sorted"] = tostring(args.qsorted),
["noicon"] = "true",
["list"] = args.qlist,
["sep"] = qsep,
["langobj"] = args.langobj,
["lang"] = args.langobj.code,
["df"] = args.qdf,
["sn"] = parseParam(args.qsn or args.qshortname, false),
}
-- all proper values of a Wikidata property will be the same type as the first
-- qualifiers don't have a mainsnak, properties do
local datatype = objproperty[1].datatype or objproperty[1].mainsnak.datatype
-- out[] holds the a list of returned values for this property
-- mlt[] holds the language code if the datatype is monolingual text
local out = {}
local mlt = {}
for k, v in ipairs(objproperty) do
local hasvalue = true
if (onlysrc and not sourced(v)) then
-- no value: it isn't sourced when onlysourced=true
hasvalue = false
else
local val, lcode = rendersnak(v, args, linked, lprefix, lpostfix, prefix, postfix, uabbr)
if not val then
hasvalue = false -- rank doesn't match
elseif qualsonly and qualID then
-- suppress value returned: only qualifiers are requested
else
out[#out+1], mlt[#out+1] = val, lcode
end
end
-- See if qualifiers are to be returned:
local snak = v.mainsnak or v
if hasvalue and v.qualifiers and qualID ~= "" and snak.snaktype~="novalue" then
-- collect all wanted qualifier values returned in qlist, indexed by propertyID
local qlist = {}
local timestart, timeend = "", ""
-- loop through qualifiers
for k1, v1 in pairs(v.qualifiers) do
if allflag or qwanted[k1] then
if k1 == "P1326" then
local ts = v1[1].datavalue.value.time
local dp = v1[1].datavalue.value.precision
qlist[k1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "before")
elseif k1 == "P1319" then
local ts = v1[1].datavalue.value.time
local dp = v1[1].datavalue.value.precision
qlist[k1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "after")
elseif k1 == "P580" then
timestart = propertyvalueandquals(v1, qargs)[1] or "" -- treat only one start time as valid
elseif k1 == "P582" then
timeend = propertyvalueandquals(v1, qargs)[1] or "" -- treat only one end time as valid
else
local q = assembleoutput(propertyvalueandquals(v1, qargs), qargs)
-- we already deal with circa via 'sourcing circumstances' if the datatype was time
-- circa may be either linked or unlinked *** internationalise later ***
if datatype ~= "time" or q ~= "circa" and not (type(q) == "string" and q:find("circa]]")) then
qlist[k1] = q
end
end
end -- of test for wanted
end -- of loop through qualifiers
-- set date separator
local t = timestart .. timeend
-- *** internationalise date separators later ***
local dsep = "–"
if t:find("%s") or t:find(" ") then dsep = " – " end
-- set the order for the list of qualifiers returned; start time and end time go last
if next(qlist) then
local qlistout = {}
if allflag then
for k2, v2 in pairs(qlist) do
qlistout[#qlistout+1] = v2
end
else
for i2, v2 in ipairs(qorder) do
qlistout[#qlistout+1] = qlist[v2]
end
end
if t ~= "" then
qlistout[#qlistout+1] = timestart .. dsep .. timeend
end
local qstr = assembleoutput(qlistout, qargs)
if qualsonly then
out[#out+1] = qstr
else
out[#out] = out[#out] .. " (" .. qstr .. ")"
end
elseif t ~= "" then
if qualsonly then
if timestart == "" then
out[#out+1] = timeend
elseif timeend == "" then
out[#out+1] = timestart
else
out[#out+1] = timestart .. dsep .. timeend
end
else
out[#out] = out[#out] .. " (" .. timestart .. dsep .. timeend .. ")"
end
end
end -- of test for qualifiers wanted
if maxvals > 0 and #out >= maxvals then break end
end -- of for each value loop
-- we need to pick one value to return if the datatype was "monolingualtext"
-- if there's only one value, use that
-- otherwise look through the fallback languages for a match
if datatype == "monolingualtext" and #out >1 then
lang = mw.text.split( lang, '-', true )[1]
local fbtbl = mw.language.getFallbacksFor( lang )
table.insert( fbtbl, 1, lang )
local bestval = ""
local found = false
for idx1, lang1 in ipairs(fbtbl) do
for idx2, lang2 in ipairs(mlt) do
if (lang1 == lang2) and not found then
bestval = out[idx2]
found = true
break
end
end -- loop through values of property
end -- loop through fallback languages
if found then
-- replace output table with a table containing the best value
out = { bestval }
else
-- more than one value and none of them on the list of fallback languages
-- sod it, just give them the first one
out = { out[1] }
end
end
return out
end
-------------------------------------------------------------------------------
-- Common code for p.getValueByQual and p.getValueByLang
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; assembleoutput;
-------------------------------------------------------------------------------
local _getvaluebyqual = function(frame, qualID, checkvalue)
-- The property ID that will have a qualifier is the first unnamed parameter
local propertyID = mw.text.trim(frame.args[1] or "")
if propertyID == "" then return "no property supplied" end
if qualID == "" then return "no qualifier supplied" end
-- onlysourced is a boolean passed to return property values
-- only when property values are sourced to something other than Wikipedia
-- if nothing or an empty string is passed set it true
-- if "false" or "no" or 0 is passed set it false
local onlysrc = parseParam(frame.args.onlysourced or frame.args.osd, true)
-- set the requested ranks flags
frame.args.reqranks = setRanks(frame.args.rank)
-- set a language object and code in the frame.args table
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local args = frame.args
-- check for locally supplied parameter in second unnamed parameter
-- success means no local parameter and the property exists
local qid, props = parseInput(frame, args[2], propertyID)
local linked = parseParam(args.linked, true)
local lpre = (args.linkprefix or args.lp or ""):gsub('"', '')
local lpost = (args.linkpostfix or ""):gsub('"', '')
local pre = (args.prefix or ""):gsub('"', '')
local post = (args.postfix or ""):gsub('"', '')
local uabbr = parseParam(args.unitabbr or args.uabbr, false)
local filter = (args.unit or ""):upper()
local maxvals = tonumber(args.maxvals) or 0
if filter == "" then filter = nil end
if qid then
local out = {}
-- Scan through the values of the property
-- we want something like property is "pronunciation audio (P443)" in propertyID
-- with a qualifier like "language of work or name (P407)" in qualID
-- whose value has the required ID, like "British English (Q7979)", in qval
for k1, v1 in ipairs(props) do
if v1.mainsnak.snaktype == "value" then
-- check if it has the right qualifier
local v1q = v1.qualifiers
if v1q and v1q[qualID] then
if onlysrc == false or sourced(v1) then
-- if we've got this far, we have a (sourced) claim with qualifiers
-- so see if matches the required value
-- We'll only deal with wikibase-items and strings for now
if v1q[qualID][1].datatype == "wikibase-item" then
if checkvalue(v1q[qualID][1].datavalue.value.id) then
out[#out + 1] = rendersnak(v1, args, linked, lpre, lpost, pre, post, uabbr, filter)
end
elseif v1q[qualID][1].datatype == "string" then
if checkvalue(v1q[qualID][1].datavalue.value) then
out[#out + 1] = rendersnak(v1, args, linked, lpre, lpost, pre, post, uabbr, filter)
end
end
end -- of check for sourced
end -- of check for matching required value and has qualifiers
else
return nil
end -- of check for string
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through values of propertyID
return assembleoutput(out, frame.args, qid, propertyID)
else
return props -- either local parameter or nothing
end -- of test for success
return nil
end
-------------------------------------------------------------------------------
-- _location takes Q-id and follows P276 (location)
-- or P131 (located in the administrative territorial entity) or P706 (located on terrain feature)
-- from the initial item to higher level territories/locations until it reaches the highest.
-- An optional boolean, 'first', determines whether the first item is returned (default: false).
-- An optional boolean 'skip' toggles the display to skip to the last item (default: false).
-- It returns a table containing the locations - linked where possible, except for the highest.
-------------------------------------------------------------------------------
-- Dependencies: findLang(); labelOrId(); linkedItem
-------------------------------------------------------------------------------
local _location = function(qid, first, skip)
first = parseParam(first, false)
skip = parseParam(skip, false)
local locs = {"P276", "P131", "P706"}
local out = {}
local langcode = findLang():getCode()
local finished = false
local count = 0
local prevqid = "Q0"
repeat
local prop
for i1, v1 in ipairs(locs) do
local proptbl = mw.wikibase.getBestStatements(qid, v1)
if #proptbl > 1 then
-- there is more than one higher location
local prevP131, prevP131id
if prevqid ~= "Q0" then
prevP131 = mw.wikibase.getBestStatements(prevqid, "P131")[1]
prevP131id = prevP131
and prevP131.mainsnak.datavalue
and prevP131.mainsnak.datavalue.value.id
end
for i2, v2 in ipairs(proptbl) do
local parttbl = v2.qualifiers and v2.qualifiers.P518
if parttbl then
-- this higher location has qualifier 'applies to part' (P518)
for i3, v3 in ipairs(parttbl) do
if v3.snaktype == "value" and v3.datavalue.value.id == prevqid then
-- it has a value equal to the previous location
prop = proptbl[i2]
break
end -- of test for matching last location
end -- of loop through values of 'applies to part'
else
-- there's no qualifier 'applies to part' (P518)
-- so check if the previous location had a P131 that matches this alternate
if qid == prevP131id then
prop = proptbl[i2]
break
end -- of test for matching previous P131
end
end -- of loop through parent locations
-- fallback to second value if match not found
prop = prop or proptbl[2]
elseif #proptbl > 0 then
prop = proptbl[1]
end
if prop then break end
end
-- check if it's an instance of (P31) a country (Q6256) or sovereign state (Q3624078)
-- and terminate the chain if it is
local inst = mw.wikibase.getAllStatements(qid, "P31")
if #inst > 0 then
for k, v in ipairs(inst) do
local instid = v.mainsnak.datavalue and v.mainsnak.datavalue.value.id
-- stop if it's a country (or a country within the United Kingdom if skip is true)
if instid == "Q6256" or instid == "Q3624078" or (skip and instid == "Q3336843") then
prop = nil -- this will ensure this is treated as top-level location
break
end
end
end
-- get the name of this location and update qid to point to the parent location
if prop and prop.mainsnak.datavalue then
if not skip or count == 0 then
local args = { lprefix = ":" }
out[#out+1] = linkedItem(qid, args) -- get a linked value if we can
end
qid, prevqid = prop.mainsnak.datavalue.value.id, qid
else
-- This is top-level location, so get short name except when this is the first item
-- Use full label if there's no short name or this is the first item
local prop1813 = mw.wikibase.getAllStatements(qid, "P1813")
-- if there's a short name and this isn't the only item
if prop1813[1] and (#out > 0)then
local shortname
-- short name is monolingual text, so look for match to the local language
-- choose the shortest 'short name' in that language
for k, v in pairs(prop1813) do
if v.mainsnak.datavalue.value.language == langcode then
local name = v.mainsnak.datavalue.value.text
if (not shortname) or (#name < #shortname) then
shortname = name
end
end
end
-- add the shortname if one is found, fallback to the label
-- but skip it if it's "USA"
if shortname ~= "USA" then
out[#out+1] = shortname or labelOrId(qid)
else
if skip then out[#out+1] = "US" end
end
else
-- no shortname, so just add the label
local loc = labelOrId(qid)
-- exceptions go here:
if loc == "United States of America" then
out[#out+1] = "United States"
else
out[#out+1] = loc
end
end
finished = true
end
count = count + 1
until finished or count >= 10 -- limit to 10 levels to avoid infinite loops
-- remove the first location if not required
if not first then table.remove(out, 1) end
-- we might have duplicate text for consecutive locations, so remove them
if #out > 2 then
local plain = {}
for i, v in ipairs(out) do
-- strip any links
plain[i] = v:gsub("^%[%[[^|]*|", ""):gsub("]]$", "")
end
local idx = 2
repeat
if plain[idx] == plain[idx-1] then
-- duplicate found
local removeidx = 0
if (plain[idx] ~= out[idx]) and (plain[idx-1] == out[idx-1]) then
-- only second one is linked, so drop the first
removeidx = idx - 1
elseif (plain[idx] == out[idx]) and (plain[idx-1] ~= out[idx-1]) then
-- only first one is linked, so drop the second
removeidx = idx
else
-- pick one
removeidx = idx - (os.time()%2)
end
table.remove(out, removeidx)
table.remove(plain, removeidx)
else
idx = idx +1
end
until idx >= #out
end
return out
end
-------------------------------------------------------------------------------
-- _getsumofparts scans the property 'has part' (P527) for values matching a list.
-- The list (args.vlist) consists of a string of Qids separated by spaces or any usual punctuation.
-- If the matched values have a qualifer 'quantity' (P1114), those quantites are summed.
-- The sum is returned as a number (i.e. 0 if none)
-- a table of arguments is supplied implementing the usual parameters.
-------------------------------------------------------------------------------
-- Dependencies: setRanks; parseParam; parseInput; sourced; assembleoutput;
-------------------------------------------------------------------------------
local _getsumofparts = function(args)
local vallist = (args.vlist or ""):upper()
if vallist == "" then return end
args.reqranks = setRanks(args.rank)
local f = {}
f.args = args
local qid, props = parseInput(f, "", "P527")
if not qid then return 0 end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local sum = 0
for k1, v1 in ipairs(props) do
if (onlysrc == false or sourced(v1))
and v1.mainsnak.snaktype == "value"
and v1.mainsnak.datavalue.type == "wikibase-entityid"
and vallist:match( v1.mainsnak.datavalue.value.id )
and v1.qualifiers
then
local quals = v1.qualifiers["P1114"]
if quals then
for k2, v2 in ipairs(quals) do
sum = sum + v2.datavalue.value.amount
end
end
end
end
return sum
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Public functions
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- _getValue makes the functionality of getValue available to other modules
-------------------------------------------------------------------------------
-- Dependencies: setRanks; parseInput; propertyvalueandquals; assembleoutput; parseParam; sourced;
-- labelOrId; i18n.latestdatequalifier; format_Date; makeOrdinal; roundto; decimalPrecision; decimalToDMS;
-------------------------------------------------------------------------------
p._getValue = function(args)
-- parameter sets for commonly used groups of parameters
local paraset = tonumber(args.ps or args.parameterset or 0)
if paraset == 1 then
-- a common setting, not usable in infoboxes because the 2018 RFC requires sources
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
elseif paraset == 2 then
-- equivalent to raw, not usable in infoboxes because the 2018 RFC requires sources
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
args.linked = "no"
args.pd = "true"
elseif paraset == 3 then
-- parameterset 1, but usable in infoboxes because the 2018 RFC requires sources
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "yes"
args.noicon = "true"
end
-- implement eid parameter
local eid = args.eid
if eid == "" then
return nil
elseif eid then
args.qid = eid
end
local propertyID = mw.text.trim(args[1] or "")
args.reqranks = setRanks(args.rank)
-- replacetext (rt) is a string that is returned instead of any non-empty Wikidata value
-- this is useful for tracking and debugging, so we set fetchwikidata=ALL to fill the whitelist
local replacetext = mw.text.trim(args.rt or args.replacetext or "")
if replacetext ~= "" then
args.fetchwikidata = "ALL"
end
local f = {}
f.args = args
local entityid, props = parseInput(f, f.args[2], propertyID)
if not entityid then
return props -- either the input parameter or nothing
end
-- qual is a string containing the property ID of the qualifier(s) to be returned
-- if qual == "ALL" then all qualifiers returned
-- if qual == "DATES" then qualifiers P580 (start time) and P582 (end time) returned
-- if nothing or an empty string is passed set it nil -> no qualifiers returned
local qualID = mw.text.trim(args.qual or ""):upper()
if qualID == "" then qualID = nil end
-- set a language object and code in the args table
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- table 'out' stores the return value(s):
local out = propertyvalueandquals(props, args, qualID)
-- format the table of values and return it as a string:
return assembleoutput(out, args, entityid, propertyID)
end
-------------------------------------------------------------------------------
-- getValue is used to get the value(s) of a property
-- The property ID is passed as the first unnamed parameter and is required.
-- A locally supplied parameter may optionaly be supplied as the second unnamed parameter.
-- The function will now also return qualifiers if parameter qual is supplied
-------------------------------------------------------------------------------
-- Dependencies: _getValue; setRanks; parseInput; propertyvalueandquals; assembleoutput; parseParam; sourced;
-- labelOrId; i18n.latestdatequalifier; format_Date; makeOrdinal; roundto; decimalPrecision; decimalToDMS;
-------------------------------------------------------------------------------
p.getValue = function(frame)
local args= frame.args
if not args[1] then
args = frame:getParent().args
if not args[1] then return i18n.errors["No property supplied"] end
end
return p._getValue(args)
end
-------------------------------------------------------------------------------
-- getPreferredValue is used to get a value,
-- (or a comma separated list of them if multiple values exist).
-- If preferred ranks are set, it will return those values, otherwise values with normal ranks
-- now redundant to getValue with |rank=best
-------------------------------------------------------------------------------
-- Dependencies: p.getValue; setRanks; parseInput; propertyvalueandquals; assembleoutput;
-- parseParam; sourced; labelOrId; i18n.latestdatequalifier; format_Date;
-- makeOrdinal; roundto; decimalPrecision; decimalToDMS;
-------------------------------------------------------------------------------
p.getPreferredValue = function(frame)
frame.args.rank = "best"
return p.getValue(frame)
end
-------------------------------------------------------------------------------
-- getCoords is used to get coordinates for display in an infobox
-- whitelist and blacklist are implemented
-- optional 'display' parameter is allowed, defaults to nil - was "inline, title"
-------------------------------------------------------------------------------
-- Dependencies: setRanks(); parseInput(); decimalPrecision();
-------------------------------------------------------------------------------
p.getCoords = function(frame)
local propertyID = "P625"
-- if there is a 'display' parameter supplied, use it
-- otherwise default to nothing
local disp = frame.args.display or ""
if disp == "" then
disp = nil -- default to not supplying display parameter, was "inline, title"
end
-- there may be a format parameter to switch from deg/min/sec to decimal degrees
-- default is deg/min/sec
-- decimal degrees needs |format = dec
local form = (frame.args.format or ""):lower():sub(1,3)
if form ~= "dec" then
form = "dms"
end
-- just deal with best values
frame.args.reqranks = setRanks("best")
local qid, props = parseInput(frame, frame.args[1], propertyID)
if not qid then
return props -- either local parameter or nothing
else
local dv = props[1].mainsnak.datavalue.value
local lat, long, prec = dv.latitude, dv.longitude, dv.precision
lat = decimalPrecision(lat, prec)
long = decimalPrecision(long, prec)
local lat_long = { lat, long }
lat_long["display"] = disp
lat_long["format"] = form
-- invoke template Coord with the values stored in the table
return frame:expandTemplate{title = 'coord', args = lat_long}
end
end
-------------------------------------------------------------------------------
-- getQualifierValue is used to get a formatted value of a qualifier
--
-- The call needs: a property (the unnamed parameter or 1=)
-- a target value for that property (pval=)
-- a qualifier for that target value (qual=)
-- The usual whitelisting and blacklisting of the property is implemented
-- The boolean onlysourced= parameter can be set to return nothing
-- when the property is unsourced (or only sourced to Wikipedia)
-------------------------------------------------------------------------------
-- Dependencies: parseParam(); setRanks(); parseInput(); sourced();
-- propertyvalueandquals(); assembleoutput();
-- labelOrId(); i18n.latestdatequalifier(); format_Date();
-- findLang(); makeOrdinal(); roundto(); decimalPrecision(); decimalToDMS();
-------------------------------------------------------------------------------
p.getQualifierValue = function(frame)
-- The property ID that will have a qualifier is the first unnamed parameter
local propertyID = mw.text.trim(frame.args[1] or "")
-- The value of the property we want to match whose qualifier value is to be returned
-- is passed in named parameter |pval=
local propvalue = frame.args.pval
-- The property ID of the qualifier
-- whose value is to be returned is passed in named parameter |qual=
local qualifierID = frame.args.qual
-- A filter can be set like this: filter=P642==Q22674854
local filter, fprop, fval
local ftable = mw.text.split(frame.args.filter or "", "==")
if ftable[2] then
fprop = mw.text.trim(ftable[1])
fval = mw.text.trim(ftable[2])
filter = true
end
-- onlysourced is a boolean passed to return qualifiers
-- only when property values are sourced to something other than Wikipedia
-- if nothing or an empty string is passed set it true
-- if "false" or "no" or 0 is passed set it false
local onlysrc = parseParam(frame.args.onlysourced or frame.args.osd, true)
-- set a language object and language code in the frame.args table
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
-- set the requested ranks flags
frame.args.reqranks = setRanks(frame.args.rank)
-- check for locally supplied parameter in second unnamed parameter
-- success means no local parameter and the property exists
local qid, props = parseInput(frame, frame.args[2], propertyID)
if qid then
local out = {}
-- Scan through the values of the property
-- we want something like property is P793, significant event (in propertyID)
-- whose value is something like Q385378, construction (in propvalue)
-- then we can return the value(s) of a qualifier such as P580, start time (in qualifierID)
for k1, v1 in pairs(props) do
if v1.mainsnak.snaktype == "value" and v1.mainsnak.datavalue.type == "wikibase-entityid" then
-- It's a wiki-linked value, so check if it's the target (in propvalue) and if it has qualifiers
if v1.mainsnak.datavalue.value.id == propvalue and v1.qualifiers then
if onlysrc == false or sourced(v1) then
-- if we've got this far, we have a (sourced) claim with qualifiers
-- which matches the target, so apply the filter and find the value(s) of the qualifier we want
if not filter or (v1.qualifiers[fprop] and v1.qualifiers[fprop][1].datavalue.value.id == fval) then
local quals = v1.qualifiers[qualifierID]
if quals then
-- can't reference qualifer, so set onlysourced = "no" (args are strings, not boolean)
local qargs = frame.args
qargs.onlysourced = "no"
local vals = propertyvalueandquals(quals, qargs, qid)
for k, v in ipairs(vals) do
out[#out + 1] = v
end
end
end
end -- of check for sourced
end -- of check for matching required value and has qualifiers
end -- of check for wikibase entity
end -- of loop through values of propertyID
return assembleoutput(out, frame.args, qid, propertyID)
else
return props -- either local parameter or nothing
end -- of test for success
return nil
end
-------------------------------------------------------------------------------
-- getSumOfParts scans the property 'has part' (P527) for values matching a list.
-- The list is passed in parameter vlist.
-- It consists of a string of Qids separated by spaces or any usual punctuation.
-- If the matched values have a qualifier 'quantity' (P1114), those quantities are summed.
-- The sum is returned as a number or nothing if zero.
-------------------------------------------------------------------------------
-- Dependencies: _getsumofparts;
-------------------------------------------------------------------------------
p.getSumOfParts = function(frame)
local sum = _getsumofparts(frame.args)
if sum == 0 then return end
return sum
end
-------------------------------------------------------------------------------
-- getValueByQual gets the value of a property which has a qualifier with a given entity value
-- The call needs:
-- a property ID (the unnamed parameter or 1=Pxxx)
-- the ID of a qualifier for that property (qualID=Pyyy)
-- either the Wikibase-entity ID of a value for that qualifier (qvalue=Qzzz)
-- or a string value for that qualifier (qvalue=abc123)
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: _getvaluebyqual; parseParam; setRanks; parseInput; sourced;
-- assembleoutput;
-------------------------------------------------------------------------------
p.getValueByQual = function(frame)
local qualID = frame.args.qualID
-- The Q-id of the value for the qualifier we want to match is in named parameter |qvalue=
local qval = frame.args.qvalue or ""
if qval == "" then return "no qualifier value supplied" end
local function checkQID(id)
return id == qval
end
return _getvaluebyqual(frame, qualID, checkQID)
end
-------------------------------------------------------------------------------
-- getValueByLang gets the value of a property which has a qualifier P407
-- ("language of work or name") whose value has the given language code
-- The call needs:
-- a property ID (the unnamed parameter or 1=Pxxx)
-- the MediaWiki language code to match the language (lang=xx[-yy])
-- (if no code is supplied, it uses the default language)
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: _getvaluebyqual; parseParam; setRanks; parseInput; sourced; assembleoutput;
-------------------------------------------------------------------------------
p.getValueByLang = function(frame)
-- The language code for the qualifier we want to match is in named parameter |lang=
local langcode = findLang(frame.args.lang).code
local function checkLanguage(id)
-- id should represent a language like "British English (Q7979)"
-- it should have string property "Wikimedia language code (P424)"
-- qlcode will be a table:
local qlcode = mw.wikibase.getBestStatements(id, "P424")
if (#qlcode > 0) and (qlcode[1].mainsnak.datavalue.value == langcode) then
return true
end
end
return _getvaluebyqual(frame, "P407", checkLanguage)
end
-------------------------------------------------------------------------------
-- getValueByRefSource gets the value of a property which has a reference "stated in" (P248)
-- whose value has the given entity-ID.
-- The call needs:
-- a property ID (the unnamed parameter or 1=Pxxx)
-- the entity ID of a value to match where the reference is stated in (match=Qzzz)
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getValueByRefSource = function(frame)
-- The property ID that we want to check is the first unnamed parameter
local propertyID = mw.text.trim(frame.args[1] or ""):upper()
if propertyID == "" then return "no property supplied" end
-- The Q-id of the value we want to match is in named parameter |qvalue=
local qval = (frame.args.match or ""):upper()
if qval == "" then qval = "Q21540096" end
local unit = (frame.args.unit or ""):upper()
if unit == "" then unit = "Q4917" end
local onlysrc = parseParam(frame.args.onlysourced or frame.args.osd, true)
-- set the requested ranks flags
frame.args.reqranks = setRanks(frame.args.rank)
-- set a language object and code in the frame.args table
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local linked = parseParam(frame.args.linked, true)
local uabbr = parseParam(frame.args.uabbr or frame.args.unitabbr, false)
-- qid not nil means no local parameter and the property exists
local qid, props = parseInput(frame, frame.args[2], propertyID)
if qid then
local out = {}
local mlt= {}
for k1, v1 in ipairs(props) do
if onlysrc == false or sourced(v1) then
if v1.references then
for k2, v2 in ipairs(v1.references) do
if v2.snaks.P248 then
for k3, v3 in ipairs(v2.snaks.P248) do
if v3.datavalue.value.id == qval then
out[#out+1], mlt[#out+1] = rendersnak(v1, frame.args, linked, "", "", "", "", uabbr, unit)
if not mlt[#out] then
-- we only need one match per property value
-- unless datatype was monolingual text
break
end
end -- of test for match
end -- of loop through values "stated in"
end -- of test that "stated in" exists
end -- of loop through references
end -- of test that references exist
end -- of test for sourced
end -- of loop through values of propertyID
if #mlt > 0 then
local langcode = frame.args.lang
langcode = mw.text.split( langcode, '-', true )[1]
local fbtbl = mw.language.getFallbacksFor( langcode )
table.insert( fbtbl, 1, langcode )
local bestval = ""
local found = false
for idx1, lang1 in ipairs(fbtbl) do
for idx2, lang2 in ipairs(mlt) do
if (lang1 == lang2) and not found then
bestval = out[idx2]
found = true
break
end
end -- loop through values of property
end -- loop through fallback languages
if found then
-- replace output table with a table containing the best value
out = { bestval }
else
-- more than one value and none of them on the list of fallback languages
-- sod it, just give them the first one
out = { out[1] }
end
end
return assembleoutput(out, frame.args, qid, propertyID)
else
return props -- no property or local parameter supplied
end -- of test for success
end
-------------------------------------------------------------------------------
-- getPropertyIDs takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- It returns the Entity-IDs (Qids) of the values of a property if it is a Wikibase-Entity.
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p._getPropertyIDs = function(args)
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- change default for noicon to true
args.noicon = tostring(parseParam(args.noicon or "", true))
local f = {}
f.args = args
local pid = mw.text.trim(args[1] or ""):upper()
-- get the qid and table of claims for the property, or nothing and the local value passed
local qid, props = parseInput(f, args[2], pid)
if not qid then return props end
if not props[1] then return nil end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local out = {}
for i, v in ipairs(props) do
local snak = v.mainsnak
if ( snak.datatype == "wikibase-item" )
and ( v.rank and args.reqranks[v.rank:sub(1, 1)] )
and ( snak.snaktype == "value" )
and ( sourced(v) or not onlysrc )
then
out[#out+1] = snak.datavalue.value.id
end
if maxvals > 0 and #out >= maxvals then break end
end
return assembleoutput(out, args, qid, pid)
end
p.getPropertyIDs = function(frame)
local args = frame.args
return p._getPropertyIDs(args)
end
-------------------------------------------------------------------------------
-- getQualifierIDs takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- It takes a property-id as the first unnamed parameter, and an optional parameter qlist
-- which is a list of qualifier property-ids to search for (default is "ALL")
-- It returns the Entity-IDs (Qids) of the values of a property if it is a Wikibase-Entity.
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getQualifierIDs = function(frame)
local args = frame.args
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- change default for noicon to true
args.noicon = tostring(parseParam(args.noicon or "", true))
local f = {}
f.args = args
local pid = mw.text.trim(args[1] or ""):upper()
-- get the qid and table of claims for the property, or nothing and the local value passed
local qid, props = parseInput(f, args[2], pid)
if not qid then return props end
if not props[1] then return nil end
-- get the other parameters
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qlist = args.qlist or ""
if qlist == "" then qlist = "ALL" end
qlist = qlist:gsub("[%p%s]+", " ") .. " "
local out = {}
for i, v in ipairs(props) do
local snak = v.mainsnak
if ( v.rank and args.reqranks[v.rank:sub(1, 1)] )
and ( snak.snaktype == "value" )
and ( sourced(v) or not onlysrc )
then
if v.qualifiers then
for k1, v1 in pairs(v.qualifiers) do
if qlist == "ALL " or qlist:match(k1 .. " ") then
for i2, v2 in ipairs(v1) do
if v2.datatype == "wikibase-item" and v2.snaktype == "value" then
out[#out+1] = v2.datavalue.value.id
end -- of test that id exists
end -- of loop through qualifier values
end -- of test for kq in qlist
end -- of loop through qualifiers
end -- of test for qualifiers
end -- of test for rank value, sourced, and value exists
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through property values
return assembleoutput(out, args, qid, pid)
end
-------------------------------------------------------------------------------
-- getPropOfProp takes two propertyIDs: prop1 and prop2 (as well as the usual parameters)
-- If the value(s) of prop1 are of type "wikibase-item" then it returns the value(s) of prop2
-- of each of those wikibase-items.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p._getPropOfProp = function(args)
-- parameter sets for commonly used groups of parameters
local paraset = tonumber(args.ps or args.parameterset or 0)
if paraset == 1 then
-- a common setting
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
elseif paraset == 2 then
-- equivalent to raw
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
args.linked = "no"
args.pd = "true"
elseif paraset == 3 then
-- third set goes here
end
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
local pid1 = args.prop1 or args.pid1 or ""
local pid2 = args.prop2 or args.pid2 or ""
if pid1 == "" or pid2 == "" then return nil end
local f = {}
f.args = args
local qid1, statements1 = parseInput(f, args[1], pid1)
-- parseInput nulls empty args[1] and returns args[1] if nothing on Wikidata
if not qid1 then return statements1 end
-- otherwise it returns the qid and a table for the statement
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qualID = mw.text.trim(args.qual or ""):upper()
if qualID == "" then qualID = nil end
local out = {}
for k, v in ipairs(statements1) do
if not onlysrc or sourced(v) then
local snak = v.mainsnak
if snak.datatype == "wikibase-item" and snak.snaktype == "value" then
local qid2 = snak.datavalue.value.id
local statements2 = {}
if args.reqranks.b then
statements2 = mw.wikibase.getBestStatements(qid2, pid2)
else
statements2 = mw.wikibase.getAllStatements(qid2, pid2)
end
if statements2[1] then
local out2 = propertyvalueandquals(statements2, args, qualID)
out[#out+1] = assembleoutput(out2, args, qid2, pid2)
end
end -- of test for valid property1 value
end -- of test for sourced
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through values of property1
return assembleoutput(out, args, qid1, pid1)
end
p.getPropOfProp = function(frame)
local args= frame.args
if not args.prop1 and not args.pid1 then
args = frame:getParent().args
if not args.prop1 and not args.pid1 then return i18n.errors["No property supplied"] end
end
return p._getPropOfProp(args)
end
-------------------------------------------------------------------------------
-- getAwardCat takes most of the usual parameters. If the item has values of P166 (award received),
-- then it examines each of those awards for P2517 (category for recipients of this award).
-- If it exists, it returns the corresponding category,
-- with the item's P734 (family name) as sort key, or no sort key if there is no family name.
-- The sort key may be overridden by the parameter |sortkey (alias |sk).
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getAwardCat = function(frame)
frame.args.reqranks = setRanks(frame.args.rank)
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local args = frame.args
args.sep = " "
local pid1 = args.prop1 or "P166"
local pid2 = args.prop2 or "P2517"
if pid1 == "" or pid2 == "" then return nil end
-- locally supplied value:
local localval = mw.text.trim(args[1] or "")
local qid1, statements1 = parseInput(frame, localval, pid1)
if not qid1 then return localval end
-- linkprefix (strip quotes)
local lp = (args.linkprefix or args.lp or ""):gsub('"', '')
-- sort key (strip quotes, hyphens and periods):
local sk = (args.sortkey or args.sk or ""):gsub('["-.]', '')
-- family name:
local famname = ""
if sk == "" then
local p734 = mw.wikibase.getBestStatements(qid1, "P734")[1]
local p734id = p734 and p734.mainsnak.snaktype == "value" and p734.mainsnak.datavalue.value.id or ""
famname = mw.wikibase.getSitelink(p734id) or ""
-- strip namespace and disambigation
local pos = famname:find(":") or 0
famname = famname:sub(pos+1):gsub("%s%(.+%)$", "")
if famname == "" then
local lbl = mw.wikibase.getLabel(p734id)
famname = lbl and mw.text.nowiki(lbl) or ""
end
end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qualID = mw.text.trim(args.qual or ""):upper()
if qualID == "" then qualID = nil end
local out = {}
for k, v in ipairs(statements1) do
if not onlysrc or sourced(v) then
local snak = v.mainsnak
if snak.datatype == "wikibase-item" and snak.snaktype == "value" then
local qid2 = snak.datavalue.value.id
local statements2 = {}
if args.reqranks.b then
statements2 = mw.wikibase.getBestStatements(qid2, pid2)
else
statements2 = mw.wikibase.getAllStatements(qid2, pid2)
end
if statements2[1] and statements2[1].mainsnak.snaktype == "value" then
local qid3 = statements2[1].mainsnak.datavalue.value.id
local sitelink = mw.wikibase.getSitelink(qid3)
-- if there's no local sitelink, create the sitelink from English label
if not sitelink then
local lbl = mw.wikibase.getLabelByLang(qid3, "en")
if lbl then
if lbl:sub(1,9) == "Category:" then
sitelink = mw.text.nowiki(lbl)
else
sitelink = "Category:" .. mw.text.nowiki(lbl)
end
end
end
if sitelink then
if sk ~= "" then
out[#out+1] = "[[" .. lp .. sitelink .. "|" .. sk .. "]]"
elseif famname ~= "" then
out[#out+1] = "[[" .. lp .. sitelink .. "|" .. famname .. "]]"
else
out[#out+1] = "[[" .. lp .. sitelink .. "]]"
end -- of check for sort keys
end -- of test for sitelink
end -- of test for category
end -- of test for wikibase item has a value
end -- of test for sourced
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through values of property1
return assembleoutput(out, args, qid1, pid1)
end
-------------------------------------------------------------------------------
-- getIntersectCat takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-- It takes two properties, |prop1 and |prop2 (e.g. occupation and country of citizenship)
-- Each property's value is a wiki-base entity
-- For each value of the first parameter (ranks implemented) it fetches the value's main category
-- and then each value of the second parameter (possibly substituting a simpler description)
-- then it returns all of the categories representing the intersection of those properties,
-- (e.g. Category:Actors from Canada). A joining term may be supplied (e.g. |join=from).
-- The item's P734 (family name) is the sort key, or no sort key if there is no family name.
-- The sort key may be overridden by the parameter |sortkey (alias |sk).
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getIntersectCat = function(frame)
frame.args.reqranks = setRanks(frame.args.rank)
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local args = frame.args
args.sep = " "
args.linked = "no"
local pid1 = args.prop1 or "P106"
local pid2 = args.prop2 or "P27"
if pid1 == "" or pid2 == "" then return nil end
local qid, statements1 = parseInput(frame, "", pid1)
if not qid then return nil end
local qid, statements2 = parseInput(frame, "", pid2)
if not qid then return nil end
-- topics like countries may have different names in categories from their label in Wikidata
local subs_exists, subs = pcall(mw.loadData, "Module:WikidataIB/subs")
local join = args.join or ""
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
-- linkprefix (strip quotes)
local lp = (args.linkprefix or args.lp or ""):gsub('"', '')
-- sort key (strip quotes, hyphens and periods):
local sk = (args.sortkey or args.sk or ""):gsub('["-.]', '')
-- family name:
local famname = ""
if sk == "" then
local p734 = mw.wikibase.getBestStatements(qid, "P734")[1]
local p734id = p734 and p734.mainsnak.snaktype == "value" and p734.mainsnak.datavalue.value.id or ""
famname = mw.wikibase.getSitelink(p734id) or ""
-- strip namespace and disambigation
local pos = famname:find(":") or 0
famname = famname:sub(pos+1):gsub("%s%(.+%)$", "")
if famname == "" then
local lbl = mw.wikibase.getLabel(p734id)
famname = lbl and mw.text.nowiki(lbl) or ""
end
end
local cat1 = {}
for k, v in ipairs(statements1) do
if not onlysrc or sourced(v) then
-- get the ID representing the value of the property
local pvalID = (v.mainsnak.snaktype == "value") and v.mainsnak.datavalue.value.id
if pvalID then
-- get the topic's main category (P910) for that entity
local p910 = mw.wikibase.getBestStatements(pvalID, "P910")[1]
if p910 and p910.mainsnak.snaktype == "value" then
local tmcID = p910.mainsnak.datavalue.value.id
-- use sitelink or the English label for the cat
local cat = mw.wikibase.getSitelink(tmcID)
if not cat then
local lbl = mw.wikibase.getLabelByLang(tmcID, "en")
if lbl then
if lbl:sub(1,9) == "Category:" then
cat = mw.text.nowiki(lbl)
else
cat = "Category:" .. mw.text.nowiki(lbl)
end
end
end
cat1[#cat1+1] = cat
end -- of test for topic's main category exists
end -- of test for property has vaild value
end -- of test for sourced
if maxvals > 0 and #cat1 >= maxvals then break end
end
local cat2 = {}
for k, v in ipairs(statements2) do
if not onlysrc or sourced(v) then
local cat = rendersnak(v, args)
if subs[cat] then cat = subs[cat] end
cat2[#cat2+1] = cat
end
if maxvals > 0 and #cat2 >= maxvals then break end
end
local out = {}
for k1, v1 in ipairs(cat1) do
for k2, v2 in ipairs(cat2) do
if sk ~= "" then
out[#out+1] = "[[" .. lp .. v1 .. " " .. join .. " " .. v2 .. "|" .. sk .. "]]"
elseif famname ~= "" then
out[#out+1] = "[[" .. lp .. v1 .. " " .. join .. " " .. v2 .. "|" .. famname .. "]]"
else
out[#out+1] = "[[" .. lp .. v1 .. " " .. join .. " " .. v2 .. "]]"
end -- of check for sort keys
end
end
args.noicon = "true"
return assembleoutput(out, args, qid, pid1)
end
-------------------------------------------------------------------------------
-- qualsToTable takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- A qid may be given, and the first unnamed parameter is the property ID, which is of type wikibase item.
-- It takes a list of qualifier property IDs as |quals=
-- For a given qid and property, it creates the rows of an html table,
-- each row being a value of the property (optionally only if the property matches the value in |pval= )
-- each cell being the first value of the qualifier corresponding to the list in |quals
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced;
-------------------------------------------------------------------------------
p.qualsToTable = function(frame)
local args = frame.args
local quals = args.quals or ""
if quals == "" then return "" end
args.reqranks = setRanks(args.rank)
local propertyID = mw.text.trim(args[1] or "")
local f = {}
f.args = args
local entityid, props = parseInput(f, "", propertyID)
if not entityid then return "" end
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
local pval = args.pval or ""
local qplist = mw.text.split(quals, "%p") -- split at punctuation and make a sequential table
for i, v in ipairs(qplist) do
qplist[i] = mw.text.trim(v):upper() -- remove whitespace and capitalise
end
local col1 = args.firstcol or ""
if col1 ~= "" then
col1 = col1 .. "</td><td>"
end
local emptycell = args.emptycell or " "
-- construct a 2-D array of qualifier values in qvals
local qvals = {}
for i, v in ipairs(props) do
local skip = false
if pval ~= "" then
local pid = v.mainsnak.datavalue and v.mainsnak.datavalue.value.id
if pid ~= pval then skip = true end
end
if not skip then
local qval = {}
local vqualifiers = v.qualifiers or {}
-- go through list of wanted qualifier properties
for i1, v1 in ipairs(qplist) do
-- check for that property ID in the statement's qualifiers
local qv, qtype
if vqualifiers[v1] then
qtype = vqualifiers[v1][1].datatype
if qtype == "time" then
if vqualifiers[v1][1].snaktype == "value" then
qv = mw.wikibase.renderSnak(vqualifiers[v1][1])
qv = frame:expandTemplate{title="dts", args={qv}}
else
qv = "?"
end
elseif qtype == "url" then
if vqualifiers[v1][1].snaktype == "value" then
qv = mw.wikibase.renderSnak(vqualifiers[v1][1])
local display = mw.ustring.match( mw.uri.decode(qv, "WIKI"), "([%w ]+)$" )
if display then
qv = "[" .. qv .. " " .. display .. "]"
end
end
else
qv = mw.wikibase.formatValue(vqualifiers[v1][1])
end
end
-- record either the value or a placeholder
qval[i1] = qv or emptycell
end -- of loop through list of qualifiers
-- add the list of qualifier values as a "row" in the main list
qvals[#qvals+1] = qval
end
end -- of for each value loop
local out = {}
for i, v in ipairs(qvals) do
out[i] = "<tr><td>" .. col1 .. table.concat(qvals[i], "</td><td>") .. "</td></tr>"
end
return table.concat(out, "\n")
end
-------------------------------------------------------------------------------
-- getGlobe takes an optional qid of a Wikidata entity passed as |qid=
-- otherwise it uses the linked item for the current page.
-- If returns the Qid of the globe used in P625 (coordinate location),
-- or nil if there isn't one.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getGlobe = function(frame)
local qid = frame.args.qid or frame.args[1] or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
local coords = mw.wikibase.getBestStatements(qid, "P625")[1]
local globeid
if coords and coords.mainsnak.snaktype == "value" then
globeid = coords.mainsnak.datavalue.value.globe:match("(Q%d+)")
end
return globeid
end
-------------------------------------------------------------------------------
-- getCommonsLink takes an optional qid of a Wikidata entity passed as |qid=
-- It returns one of the following in order of preference:
-- the Commons sitelink of the linked Wikidata item;
-- the Commons sitelink of the topic's main category of the linked Wikidata item;
-------------------------------------------------------------------------------
-- Dependencies: _getCommonslink(); _getSitelink(); parseParam()
-------------------------------------------------------------------------------
p.getCommonsLink = function(frame)
local oc = frame.args.onlycat or frame.args.onlycategories
local fb = parseParam(frame.args.fallback or frame.args.fb, true)
return _getCommonslink(frame.args.qid, oc, fb)
end
-------------------------------------------------------------------------------
-- getSitelink takes the qid of a Wikidata entity passed as |qid=
-- It takes an optional parameter |wiki= to determine which wiki is to be checked for a sitelink
-- If the parameter is blank, then it uses the local wiki.
-- If there is a sitelink to an article available, it returns the plain text link to the article
-- If there is no sitelink, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getSiteLink = function(frame)
return _getSitelink(frame.args.qid, frame.args.wiki or mw.text.trim(frame.args[1] or ""))
end
-------------------------------------------------------------------------------
-- getLink has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- If there is a sitelink to an article on the local Wiki, it returns a link to the article
-- with the Wikidata label as the displayed text.
-- If there is no sitelink, it returns the label as plain text.
-- If there is no label in the local language, it displays the qid instead.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getLink = function(frame)
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
local sitelink = mw.wikibase.getSitelink(itemID)
local label = labelOrId(itemID)
if sitelink then
return "[[:" .. sitelink .. "|" .. label .. "]]"
else
return label
end
end
-------------------------------------------------------------------------------
-- getLabel has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- It returns the Wikidata label for the local language as plain text.
-- If there is no label in the local language, it displays the qid instead.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getLabel = function(frame)
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
local lang = frame.args.lang or ""
if lang == "" then lang = nil end
local label = labelOrId(itemID, lang)
return label
end
-------------------------------------------------------------------------------
-- label has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- if no qid is supplied, it uses the qid associated with the current page.
-- It returns the Wikidata label for the local language as plain text.
-- If there is no label in the local language, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.label = function(frame)
local qid = mw.text.trim(frame.args[1] or frame.args.qid or "")
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return end
local lang = frame.args.lang or ""
if lang == "" then lang = nil end
local label, success = labelOrId(qid, lang)
if success then return label end
end
-------------------------------------------------------------------------------
-- getAT (Article Title)
-- has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- If there is a sitelink to an article on the local Wiki, it returns the sitelink as plain text.
-- If there is no sitelink or qid supplied, it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAT = function(frame)
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
return mw.wikibase.getSitelink(itemID)
end
-------------------------------------------------------------------------------
-- getDescription has the qid of a Wikidata entity passed as |qid=
-- (it defaults to the associated qid of the current article if omitted)
-- and a local parameter passed as the first unnamed parameter.
-- Any local parameter passed (other than "Wikidata" or "none") becomes the return value.
-- It returns the article description for the Wikidata entity if the local parameter is "Wikidata".
-- Nothing is returned if the description doesn't exist or "none" is passed as the local parameter.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getDescription = function(frame)
local desc = mw.text.trim(frame.args[1] or "")
local itemID = mw.text.trim(frame.args.qid or "")
if itemID == "" then itemID = nil end
if desc:lower() == 'wikidata' then
return mw.wikibase.getDescription(itemID)
elseif desc:lower() == 'none' then
return nil
else
return desc
end
end
-------------------------------------------------------------------------------
-- getAliases has the qid of a Wikidata entity passed as |qid=
-- (it defaults to the associated qid of the current article if omitted)
-- and a local parameter passed as the first unnamed parameter.
-- It implements blacklisting and whitelisting with a field name of "alias" by default.
-- Any local parameter passed becomes the return value.
-- Otherwise it returns the aliases for the Wikidata entity with the usual list options.
-- Nothing is returned if the aliases do not exist.
-------------------------------------------------------------------------------
-- Dependencies: findLang(); assembleoutput()
-------------------------------------------------------------------------------
p.getAliases = function(frame)
local args = frame.args
local fieldname = args.name or ""
if fieldname == "" then fieldname = "alias" end
local blacklist = args.suppressfields or args.spf or ""
if blacklist:find(fieldname) then return nil end
local localval = mw.text.trim(args[1] or "")
if localval ~= "" then return localval end
local whitelist = args.fetchwikidata or args.fwd or ""
if whitelist == "" then whitelist = "NONE" end
if not (whitelist == 'ALL' or whitelist:find(fieldname)) then return nil end
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return nil end
local aliases = mw.wikibase.getEntity(qid).aliases
if not aliases then return nil end
args.langobj = findLang(args.lang)
local langcode = args.langobj.code
args.lang = langcode
local out = {}
for k1, v1 in pairs(aliases) do
if v1[1].language == langcode then
for k1, v2 in ipairs(v1) do
out[#out+1] = v2.value
end
break
end
end
return assembleoutput(out, args, qid)
end
-------------------------------------------------------------------------------
-- pageId returns the page id (entity ID, Qnnn) of the current page
-- returns nothing if the page is not connected to Wikidata
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.pageId = function(frame)
return mw.wikibase.getEntityIdForCurrentPage()
end
-------------------------------------------------------------------------------
-- formatDate is a wrapper to export the private function format_Date
-------------------------------------------------------------------------------
-- Dependencies: format_Date();
-------------------------------------------------------------------------------
p.formatDate = function(frame)
return format_Date(frame.args[1], frame.args.df, frame.args.bc)
end
-------------------------------------------------------------------------------
-- location is a wrapper to export the private function _location
-- it takes the entity-id as qid or the first unnamed parameter
-- optional boolean parameter first toggles the display of the first item
-- optional boolean parameter skip toggles the display to skip to the last item
-- parameter debug=<y/n> (default 'n') adds error msg if not a location
-------------------------------------------------------------------------------
-- Dependencies: _location();
-------------------------------------------------------------------------------
p.location = function(frame)
local debug = (frame.args.debug or ""):sub(1, 1):lower()
if debug == "" then debug = "n" end
local qid = mw.text.trim(frame.args.qid or frame.args[1] or ""):upper()
if qid == "" then qid=mw.wikibase.getEntityIdForCurrentPage() end
if not qid then
if debug ~= "n" then
return i18n.errors["entity-not-found"]
else
return nil
end
end
local first = mw.text.trim(frame.args.first or "")
local skip = mw.text.trim(frame.args.skip or "")
return table.concat( _location(qid, first, skip), ", " )
end
-------------------------------------------------------------------------------
-- checkBlacklist implements a test to check whether a named field is allowed
-- returns true if the field is not blacklisted (i.e. allowed)
-- returns false if the field is blacklisted (i.e. disallowed)
-- {{#if:{{#invoke:WikidataIB |checkBlacklist |name=Joe |suppressfields=Dave; Joe; Fred}} | not blacklisted | blacklisted}}
-- displays "blacklisted"
-- {{#if:{{#invoke:WikidataIB |checkBlacklist |name=Jim |suppressfields=Dave; Joe; Fred}} | not blacklisted | blacklisted}}
-- displays "not blacklisted"
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.checkBlacklist = function(frame)
local blacklist = frame.args.suppressfields or frame.args.spf or ""
local fieldname = frame.args.name or ""
if blacklist ~= "" and fieldname ~= "" then
if blacklist:find(fieldname) then
return false
else
return true
end
else
-- one of the fields is missing: let's call that "not on the list"
return true
end
end
-------------------------------------------------------------------------------
-- emptyor returns nil if its first unnamed argument is just punctuation, whitespace or html tags
-- otherwise it returns the argument unchanged (including leading/trailing space).
-- If the argument may contain "=", then it must be called explicitly:
-- |1=arg
-- (In that case, leading and trailing spaces are trimmed)
-- It finds use in infoboxes where it can replace tests like:
-- {{#if: {{#invoke:WikidatIB |getvalue |P99 |fwd=ALL}} | <span class="xxx">{{#invoke:WikidatIB |getvalue |P99 |fwd=ALL}}</span> | }}
-- with a form that uses just a single call to Wikidata:
-- {{#invoke |WikidataIB |emptyor |1= <span class="xxx">{{#invoke:WikidataIB |getvalue |P99 |fwd=ALL}}</span> }}
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.emptyor = function(frame)
local s = frame.args[1] or ""
if s == "" then return nil end
local sx = s:gsub("%s", ""):gsub("<[^>]*>", ""):gsub("%p", "")
if sx == "" then
return nil
else
return s
end
end
-------------------------------------------------------------------------------
-- labelorid is a public function to expose the output of labelOrId()
-- Pass the Q-number as |qid= or as an unnamed parameter.
-- It returns the Wikidata label for that entity or the qid if no label exists.
-------------------------------------------------------------------------------
-- Dependencies: labelOrId
-------------------------------------------------------------------------------
p.labelorid = function(frame)
return (labelOrId(frame.args.qid or frame.args[1]))
end
-------------------------------------------------------------------------------
-- getLang returns the MediaWiki language code of the current content.
-- If optional parameter |style=full, it returns the language name.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getLang = function(frame)
local style = (frame.args.style or ""):lower()
local langcode = mw.language.getContentLanguage().code
if style == "full" then
return mw.language.fetchLanguageName( langcode )
end
return langcode
end
-------------------------------------------------------------------------------
-- getItemLangCode takes a qid parameter (using the current page's qid if blank)
-- If the item for that qid has property country (P17) it looks at the first preferred value
-- If the country has an official language (P37), it looks at the first preferred value
-- If that official language has a language code (P424), it returns the first preferred value
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: _getItemLangCode()
-------------------------------------------------------------------------------
p.getItemLangCode = function(frame)
return _getItemLangCode(frame.args.qid or frame.args[1])
end
-------------------------------------------------------------------------------
-- findLanguage exports the local findLang() function
-- It takes an optional language code and returns, in order of preference:
-- the code if a known language;
-- the user's language, if set;
-- the server's content language.
-------------------------------------------------------------------------------
-- Dependencies: findLang
-------------------------------------------------------------------------------
p.findLanguage = function(frame)
return findLang(frame.args.lang or frame.args[1]).code
end
-------------------------------------------------------------------------------
-- getQid returns the qid, if supplied
-- failing that, the Wikidata entity ID of the "category's main topic (P301)", if it exists
-- failing that, the Wikidata entity ID associated with the current page, if it exists
-- otherwise, nothing
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getQid = function(frame)
local qid = (frame.args.qid or ""):upper()
-- check if a qid was passed; if so, return it:
if qid ~= "" then return qid end
-- check if there's a "category's main topic (P301)":
qid = mw.wikibase.getEntityIdForCurrentPage()
if qid then
local prop301 = mw.wikibase.getBestStatements(qid, "P301")
if prop301[1] then
local mctid = prop301[1].mainsnak.datavalue.value.id
if mctid then return mctid end
end
end
-- otherwise return the page qid (if any)
return qid
end
-------------------------------------------------------------------------------
-- followQid takes four optional parameters: qid, props, list and all.
-- If qid is not given, it uses the qid for the connected page
-- or returns nil if there isn't one.
-- props is a list of properties, separated by punctuation.
-- If props is given, the Wikidata item for the qid is examined for each property in turn.
-- If that property contains a value that is another Wikibase-item, that item's qid is returned,
-- and the search terminates, unless |all=y when all of the qids are returned, separated by spaces.
-- If |list= is set to a template, the qids are passed as arguments to the template.
-- If props is not given, the qid is returned.
-------------------------------------------------------------------------------
-- Dependencies: parseParam()
-------------------------------------------------------------------------------
p._followQid = function(args)
local qid = (args.qid or ""):upper()
local all = parseParam(args.all, false)
local list = args.list or ""
if list == "" then list = nil end
if qid == "" then
qid = mw.wikibase.getEntityIdForCurrentPage()
end
if not qid then return nil end
local out = {}
local props = (args.props or ""):upper()
if props ~= "" then
for p in mw.text.gsplit(props, "%p") do -- split at punctuation and iterate
p = mw.text.trim(p)
for i, v in ipairs( mw.wikibase.getBestStatements(qid, p) ) do
local linkedid = v.mainsnak.datavalue and v.mainsnak.datavalue.value.id
if linkedid then
if all then
out[#out+1] = linkedid
else
return linkedid
end -- test for all or just the first one found
end -- test for value exists for that property
end -- loop through values of property to follow
end -- loop through list of properties to follow
end
if #out > 0 then
local ret = ""
if list then
ret = mw.getCurrentFrame():expandTemplate{title = list, args = out}
else
ret = table.concat(out, " ")
end
return ret
else
return qid
end
end
p.followQid = function(frame)
return p._followQid(frame.args)
end
-------------------------------------------------------------------------------
-- globalSiteID returns the globalSiteID for the current wiki
-- e.g. returns "enwiki" for the English Wikipedia, "enwikisource" for English Wikisource, etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.globalSiteID = function(frame)
return mw.wikibase.getGlobalSiteId()
end
-------------------------------------------------------------------------------
-- siteID returns the root of the globalSiteID
-- e.g. "en" for "enwiki", "enwikisource", etc.
-- treats "en-gb" as "en", etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.siteID = function(frame)
local txtlang = frame:callParserFunction('int', {'lang'}) or ""
-- This deals with specific exceptions: be-tarask -> be-x-old
if txtlang == "be-tarask" then
return "be_x_old"
end
local pos = txtlang:find("-")
local ret = ""
if pos then
ret = txtlang:sub(1, pos-1)
else
ret = txtlang
end
return ret
end
-------------------------------------------------------------------------------
-- projID returns the code used to link to the reader's language's project
-- e.g "en" for [[:en:WikidataIB]]
-- treats "en-gb" as "en", etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.projID = function(frame)
local txtlang = frame:callParserFunction('int', {'lang'}) or ""
-- This deals with specific exceptions: be-tarask -> be-x-old
if txtlang == "be-tarask" then
return "be-x-old"
end
local pos = txtlang:find("-")
local ret = ""
if pos then
ret = txtlang:sub(1, pos-1)
else
ret = txtlang
end
return ret
end
-------------------------------------------------------------------------------
-- formatNumber formats a number according to the the supplied language code ("|lang=")
-- or the default language if not supplied.
-- The number is the first unnamed parameter or "|num="
-------------------------------------------------------------------------------
-- Dependencies: findLang()
-------------------------------------------------------------------------------
p.formatNumber = function(frame)
local lang
local num = tonumber(frame.args[1] or frame.args.num) or 0
lang = findLang(frame.args.lang)
return lang:formatNum( num )
end
-------------------------------------------------------------------------------
-- examine dumps the property (the unnamed parameter or pid)
-- from the item given by the parameter 'qid' (or the other unnamed parameter)
-- or from the item corresponding to the current page if qid is not supplied.
-- e.g. {{#invoke:WikidataIB |examine |pid=P26 |qid=Q42}}
-- or {{#invoke:WikidataIB |examine |P26 |Q42}} or any combination of these
-- or {{#invoke:WikidataIB |examine |P26}} for the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.examine = function( frame )
local args
if frame.args[1] or frame.args.pid or frame.args.qid then
args = frame.args
else
args = frame:getParent().args
end
local par = {}
local pid = (args.pid or ""):upper()
local qid = (args.qid or ""):upper()
par[1] = mw.text.trim( args[1] or "" ):upper()
par[2] = mw.text.trim( args[2] or "" ):upper()
table.sort(par)
if par[2]:sub(1,1) == "P" then par[1], par[2] = par[2], par[1] end
if pid == "" then pid = par[1] end
if qid == "" then qid = par[2] end
local q1 = qid:sub(1,1)
if pid:sub(1,1) ~= "P" then return "No property supplied" end
if q1 ~= "Q" and q1 ~= "M" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return "No item for this page" end
return "<pre>" .. mw.dumpObject( mw.wikibase.getAllStatements( qid, pid ) ) .. "</pre>"
end
-------------------------------------------------------------------------------
-- checkvalue looks for 'val' as a wikibase-item value of a property (the unnamed parameter or pid)
-- from the item given by the parameter 'qid'
-- or from the Wikidata item associated with the current page if qid is not supplied.
-- It only checks ranks that are requested (preferred and normal by default)
-- If property is not supplied, then P31 (instance of) is assumed.
-- It returns val if found or nothing if not found.
-- e.g. {{#invoke:WikidataIB |checkvalue |val=Q5 |pid=P31 |qid=Q42}}
-- or {{#invoke:WikidataIB |checkvalue |val=Q5 |P31 |qid=Q42}}
-- or {{#invoke:WikidataIB |checkvalue |val=Q5 |qid=Q42}}
-- or {{#invoke:WikidataIB |checkvalue |val=Q5 |P31}} for the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.checkvalue = function( frame )
local args
if frame.args.val then
args = frame.args
else
args = frame:getParent().args
end
local val = args.val
if not val then return nil end
local pid = mw.text.trim(args.pid or args[1] or "P31"):upper()
local qid = (args.qid or ""):upper()
if pid:sub(1,1) ~= "P" then return nil end
if qid:sub(1,1) ~= "Q" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
local ranks = setRanks(args.rank)
local stats = {}
if ranks.b then
stats = mw.wikibase.getBestStatements(qid, pid)
else
stats = mw.wikibase.getAllStatements( qid, pid )
end
if not stats[1] then return nil end
if stats[1].mainsnak.datatype == "wikibase-item" then
for k, v in pairs( stats ) do
local ms = v.mainsnak
if ranks[v.rank:sub(1,1)] and ms.snaktype == "value" and ms.datavalue.value.id == val then
return val
end
end
end
return nil
end
-------------------------------------------------------------------------------
-- url2 takes a parameter url= that is a proper url and formats it for use in an infobox.
-- If no parameter is supplied, it returns nothing.
-- This is the equivalent of Template:URL
-- but it keeps the "edit at Wikidata" pen icon out of the microformat.
-- Usually it will take its url parameter directly from a Wikidata call:
-- e.g. {{#invoke:WikidataIB |url2 |url={{wdib |P856 |qid=Q23317 |fwd=ALL |osd=no}} }}
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.url2 = function(frame)
local txt = frame.args.url or ""
if txt == "" then return nil end
-- extract any icon
local url, icon = txt:match("(.+) (.+)")
-- make sure there's at least a space at the end
url = (url or txt) .. " "
icon = icon or ""
-- extract any protocol like https://
local prot = url:match("(https*://).+[ \"\']")
-- extract address
local addr = ""
if prot then
addr = url:match("https*://(.+)[ \"\']") or " "
else
prot = "//"
addr = url:match("[^%p%s]+%.(.+)[ \"\']") or " "
end
-- strip trailing / from end of domain-only url and add <wbr/> before . and /
local disp, n = addr:gsub( "^([^/]+)/$", "%1" ):gsub("%/", "<wbr/>/"):gsub("%.", "<wbr/>.")
return '<span class="url">[' .. prot .. addr .. " " .. disp .. "]</span> " .. icon
end
-------------------------------------------------------------------------------
-- getWebsite fetches the Official website (P856) and formats it for use in an infobox.
-- This is similar to Template:Official website but with a url displayed,
-- and it adds the "edit at Wikidata" pen icon beyond the microformat if enabled.
-- A local value will override the Wikidata value. "NONE" returns nothing.
-- e.g. {{#invoke:WikidataIB |getWebsite |qid= |noicon= |lang= |url= }}
-------------------------------------------------------------------------------
-- Dependencies: findLang(); parseParam();
-------------------------------------------------------------------------------
p.getWebsite = function(frame)
local url = frame.args.url or ""
if url:upper() == "NONE" then return nil end
local urls = {}
local quals = {}
local qid = frame.args.qid or ""
if url and url ~= "" then
urls[1] = url
else
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
local prop856 = mw.wikibase.getBestStatements(qid, "P856")
for k, v in pairs(prop856) do
if v.mainsnak.snaktype == "value" then
urls[#urls+1] = v.mainsnak.datavalue.value
if v.qualifiers and v.qualifiers["P1065"] then
-- just take the first archive url (P1065)
local au = v.qualifiers["P1065"][1]
if au.snaktype == "value" then
quals[#urls] = au.datavalue.value
end -- test for archive url having a value
end -- test for qualifers
end -- test for website having a value
end -- loop through website(s)
end
if #urls == 0 then return nil end
local out = {}
for i, u in ipairs(urls) do
local link = quals[i] or u
local prot, addr = u:match("(http[s]*://)(.+)")
addr = addr or u
local disp, n = addr:gsub("%.", "<wbr/>%.")
out[#out+1] = '<span class="url">[' .. link .. " " .. disp .. "]</span>"
end
local langcode = findLang(frame.args.lang).code
local noicon = parseParam(frame.args.noicon, false)
if url == "" and not noicon then
out[#out] = out[#out] .. createicon(langcode, qid, "P856")
end
local ret = ""
if #out > 1 then
ret = mw.getCurrentFrame():expandTemplate{title = "ubl", args = out}
else
ret = out[1]
end
return ret
end
-------------------------------------------------------------------------------
-- getAllLabels fetches the set of labels and formats it for display as wikitext.
-- It takes a parameter 'qid' for arbitrary access, otherwise it uses the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAllLabels = function(frame)
local args = frame.args or frame:getParent().args or {}
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return i18n["entity-not-found"] end
local labels = mw.wikibase.getEntity(qid).labels
if not labels then return i18n["labels-not-found"] end
local out = {}
for k, v in pairs(labels) do
out[#out+1] = v.value .. " (" .. v.language .. ")"
end
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- getAllDescriptions fetches the set of descriptions and formats it for display as wikitext.
-- It takes a parameter 'qid' for arbitrary access, otherwise it uses the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAllDescriptions = function(frame)
local args = frame.args or frame:getParent().args or {}
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return i18n["entity-not-found"] end
local descriptions = mw.wikibase.getEntity(qid).descriptions
if not descriptions then return i18n["descriptions-not-found"] end
local out = {}
for k, v in pairs(descriptions) do
out[#out+1] = v.value .. " (" .. v.language .. ")"
end
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- getAllAliases fetches the set of aliases and formats it for display as wikitext.
-- It takes a parameter 'qid' for arbitrary access, otherwise it uses the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAllAliases = function(frame)
local args = frame.args or frame:getParent().args or {}
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return i18n["entity-not-found"] end
local aliases = mw.wikibase.getEntity(qid).aliases
if not aliases then return i18n["aliases-not-found"] end
local out = {}
for k1, v1 in pairs(aliases) do
local lang = v1[1].language
local val = {}
for k1, v2 in ipairs(v1) do
val[#val+1] = v2.value
end
out[#out+1] = table.concat(val, ", ") .. " (" .. lang .. ")"
end
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- showNoLinks displays the article titles that should not be linked.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.showNoLinks = function(frame)
local out = {}
for k, v in pairs(donotlink) do
out[#out+1] = k
end
table.sort( out )
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- checkValidity checks whether the first unnamed parameter represents a valid entity-id,
-- that is, something like Q1235 or P123.
-- It returns the strings "true" or "false".
-- Change false to nil to return "true" or "" (easier to test with #if:).
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
function p.checkValidity(frame)
local id = mw.text.trim(frame.args[1] or "")
if mw.wikibase.isValidEntityId(id) then
return true
else
return false
end
end
-------------------------------------------------------------------------------
-- getEntityFromTitle returns the Entity-ID (Q-number) for a given title.
-- Modification of Module:ResolveEntityId
-- The title is the first unnamed parameter.
-- The site parameter determines the site/language for the title. Defaults to current wiki.
-- The showdab parameter determines whether dab pages should return the Q-number or nil. Defaults to true.
-- Returns the Q-number or nil if it does not exist.
-------------------------------------------------------------------------------
-- Dependencies: parseParam
-------------------------------------------------------------------------------
function p.getEntityFromTitle(frame)
local args=frame.args
if not args[1] then args=frame:getParent().args end
if not args[1] then return nil end
local title = mw.text.trim(args[1])
local site = args.site or ""
local showdab = parseParam(args.showdab, true)
local qid = mw.wikibase.getEntityIdForTitle(title, site)
if qid then
local prop31 = mw.wikibase.getBestStatements(qid, "P31")[1]
if not showdab and prop31 and prop31.mainsnak.datavalue.value.id == "Q4167410" then
return nil
else
return qid
end
end
end
-------------------------------------------------------------------------------
-- getDatePrecision returns the number representing the precision of the first best date value
-- for the given property.
-- It takes the qid and property ID
-- The meanings are given at https://www.mediawiki.org/wiki/Wikibase/DataModel#Dates_and_times
-- 0 = 1 billion years .. 6 = millennium, 7 = century, 8 = decade, 9 = year, 10 = month, 11 = day
-- Returns 0 (or the second unnamed parameter) if the Wikidata does not exist.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; sourced;
-------------------------------------------------------------------------------
function p.getDatePrecision(frame)
local args=frame.args
if not args[1] then args=frame:getParent().args end
local default = tonumber(args[2] or args.default) or 0
local prop = mw.text.trim(args[1] or "")
if prop == "" then return default end
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return default end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local stat = mw.wikibase.getBestStatements(qid, prop)
for i, v in ipairs(stat) do
local prec = (onlysrc == false or sourced(v))
and v.mainsnak.datavalue
and v.mainsnak.datavalue.value
and v.mainsnak.datavalue.value.precision
if prec then return prec end
end
return default
end
return p
-------------------------------------------------------------------------------
-- List of exported functions
-------------------------------------------------------------------------------
--[[
_getValue
getValue
getPreferredValue
getCoords
getQualifierValue
getSumOfParts
getValueByQual
getValueByLang
getValueByRefSource
getPropertyIDs
getQualifierIDs
getPropOfProp
getAwardCat
getIntersectCat
getGlobe
getCommonsLink
getSiteLink
getLink
getLabel
label
getAT
getDescription
getAliases
pageId
formatDate
location
checkBlacklist
emptyor
labelorid
getLang
getItemLangCode
findLanguage
getQID
followQid
globalSiteID
siteID
projID
formatNumber
examine
checkvalue
url2
getWebsite
getAllLabels
getAllDescriptions
getAllAliases
showNoLinks
checkValidity
getEntityFromTitle
getDatePrecision
--]]
-------------------------------------------------------------------------------
ql7i3j6aywa93pfslfr0svyicj7ctkn
33324
33323
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Module:WikidataIB]]
33323
Scribunto
text/plain
-- Version: 2023-07-10
-- Module to implement use of a blacklist and whitelist for infobox fields
-- Can take a named parameter |qid which is the Wikidata ID for the article
-- if not supplied, it will use the Wikidata ID associated with the current page.
-- Fields in blacklist are never to be displayed, i.e. module must return nil in all circumstances
-- Fields in whitelist return local value if it exists or the Wikidata value otherwise
-- The name of the field that this function is called from is passed in named parameter |name
-- The name is compulsory when blacklist or whitelist is used,
-- so the module returns nil if it is not supplied.
-- blacklist is passed in named parameter |suppressfields (or |spf)
-- whitelist is passed in named parameter |fetchwikidata (or |fwd)
require("strict")
local p = {}
local cdate -- initialise as nil and only load _complex_date function if needed
-- Module:Complex date is loaded lazily and has the following dependencies:
-- Module:Calendar
-- Module:ISOdate
-- Module:DateI18n
-- Module:I18n/complex date
-- Module:Ordinal
-- Module:I18n/ordinal
-- Module:Yesno
-- Module:Formatnum
-- Module:Linguistic
--
-- The following, taken from https://www.mediawiki.org/wiki/Wikibase/DataModel#Dates_and_times,
-- is needed to use Module:Complex date which seemingly requires date precision as a string.
-- It would work better if only the authors of the mediawiki page could spell 'millennium'.
local dp = {
[6] = "millennium",
[7] = "century",
[8] = "decade",
[9] = "year",
[10] = "month",
[11] = "day",
}
local i18n =
{
["errors"] =
{
["property-not-found"] = "Property not found.",
["No property supplied"] = "No property supplied",
["entity-not-found"] = "Wikidata entity not found.",
["unknown-claim-type"] = "Unknown claim type.",
["unknown-entity-type"] = "Unknown entity type.",
["qualifier-not-found"] = "Qualifier not found.",
["site-not-found"] = "Wikimedia project not found.",
["labels-not-found"] = "No labels found.",
["descriptions-not-found"] = "No descriptions found.",
["aliases-not-found"] = "No aliases found.",
["unknown-datetime-format"] = "Unknown datetime format.",
["local-article-not-found"] = "Article is available on Wikidata, but not on Wikipedia",
["dab-page"] = " (dab)",
},
["months"] =
{
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
},
["century"] = "century",
["BC"] = "BC",
["BCE"] = "BCE",
["ordinal"] =
{
[1] = "st",
[2] = "nd",
[3] = "rd",
["default"] = "th"
},
["filespace"] = "File",
["Unknown"] = "Unknown",
["NaN"] = "Not a number",
-- set the following to the name of a tracking category,
-- e.g. "[[Category:Articles with missing Wikidata information]]", or "" to disable:
["missinginfocat"] = "[[Category:Articles with missing Wikidata information]]",
["editonwikidata"] = "Edit this on Wikidata",
["latestdatequalifier"] = function (date) return "before " .. date end,
-- some languages, e.g. Bosnian use a period as a suffix after each number in a date
["datenumbersuffix"] = "",
["list separator"] = ", ",
["multipliers"] = {
[0] = "",
[3] = " thousand",
[6] = " million",
[9] = " billion",
[12] = " trillion",
}
}
-- This allows an internationisation module to override the above table
if 'en' ~= mw.getContentLanguage():getCode() then
require("Module:i18n").loadI18n("Module:WikidataIB/i18n", i18n)
end
-- This piece of html implements a collapsible container. Check the classes exist on your wiki.
local collapsediv = '<div class="mw-collapsible mw-collapsed" style="width:100%; overflow:auto;" data-expandtext="{{int:show}}" data-collapsetext="{{int:hide}}">'
-- Some items should not be linked.
-- Each wiki can create a list of those in Module:WikidataIB/nolinks
-- It should return a table called itemsindex, containing true for each item not to be linked
local donotlink = {}
local nolinks_exists, nolinks = pcall(mw.loadData, "Module:WikidataIB/nolinks")
if nolinks_exists then
donotlink = nolinks.itemsindex
end
-- To satisfy Wikipedia:Manual of Style/Titles, certain types of items are italicised, and others are quoted.
-- The submodule [[Module:WikidataIB/titleformats]] lists the entity-ids used in 'instance of' (P31),
-- which allows this module to identify the values that should be formatted.
-- WikidataIB/titleformats exports a table p.formats, which is indexed by entity-id, and contains the value " or ''
local formats = {}
local titleformats_exists, titleformats = pcall(mw.loadData, "Module:WikidataIB/titleformats")
if titleformats_exists then
formats = titleformats.formats
end
-------------------------------------------------------------------------------
-- Private functions
-------------------------------------------------------------------------------
--
-------------------------------------------------------------------------------
-- makeOrdinal needs to be internationalised along with the above:
-- takes cardinal number as a numeric and returns the ordinal as a string
-- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local makeOrdinal = function(cardinal)
local ordsuffix = i18n.ordinal.default
if cardinal % 10 == 1 then
ordsuffix = i18n.ordinal[1]
elseif cardinal % 10 == 2 then
ordsuffix = i18n.ordinal[2]
elseif cardinal % 10 == 3 then
ordsuffix = i18n.ordinal[3]
end
-- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th'
-- similarly for 12 and 13, etc.
if (cardinal % 100 == 11) or (cardinal % 100 == 12) or (cardinal % 100 == 13) then
ordsuffix = i18n.ordinal.default
end
return tostring(cardinal) .. ordsuffix
end
-------------------------------------------------------------------------------
-- findLang takes a "langcode" parameter if supplied and valid
-- otherwise it tries to create it from the user's set language ({{int:lang}})
-- failing that it uses the wiki's content language.
-- It returns a language object
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local findLang = function(langcode)
local langobj
langcode = mw.text.trim(langcode or "")
if mw.language.isKnownLanguageTag(langcode) then
langobj = mw.language.new( langcode )
else
langcode = mw.getCurrentFrame():callParserFunction('int', {'lang'})
if mw.language.isKnownLanguageTag(langcode) then
langobj = mw.language.new( langcode )
else
langobj = mw.language.getContentLanguage()
end
end
return langobj
end
-------------------------------------------------------------------------------
-- _getItemLangCode takes a qid parameter (using the current page's qid if blank)
-- If the item for that qid has property country (P17) it looks at the first preferred value
-- If the country has an official language (P37), it looks at the first preferred value
-- If that official language has a language code (P424), it returns the first preferred value
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local _getItemLangCode = function(qid)
qid = mw.text.trim(qid or ""):upper()
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return end
local prop17 = mw.wikibase.getBestStatements(qid, "P17")[1]
if not prop17 or prop17.mainsnak.snaktype ~= "value" then return end
local qid17 = prop17.mainsnak.datavalue.value.id
local prop37 = mw.wikibase.getBestStatements(qid17, "P37")[1]
if not prop37 or prop37.mainsnak.snaktype ~= "value" then return end
local qid37 = prop37.mainsnak.datavalue.value.id
local prop424 = mw.wikibase.getBestStatements(qid37, "P424")[1]
if not prop424 or prop424.mainsnak.snaktype ~= "value" then return end
return prop424.mainsnak.datavalue.value
end
-------------------------------------------------------------------------------
-- roundto takes a number (x)
-- and returns it rounded to (sf) significant figures
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local roundto = function(x, sf)
if x == 0 then return 0 end
local s = 1
if x < 0 then
x = -x
s = -1
end
if sf < 1 then sf = 1 end
local p = 10 ^ (math.floor(math.log10(x)) - sf + 1)
x = math.floor(x / p + 0.5) * p * s
-- if it's integral, cast to an integer:
if x == math.floor(x) then x = math.floor(x) end
return x
end
-------------------------------------------------------------------------------
-- decimalToDMS takes a decimal degrees (x) with precision (p)
-- and returns degrees/minutes/seconds according to the precision
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local decimalToDMS = function(x, p)
-- if p is not supplied, use a precision around 0.1 seconds
if not tonumber(p) then p = 1e-4 end
local d = math.floor(x)
local ms = (x - d) * 60
if p > 0.5 then -- precision is > 1/2 a degree
if ms > 30 then d = d + 1 end
ms = 0
end
local m = math.floor(ms)
local s = (ms - m) * 60
if p > 0.008 then -- precision is > 1/2 a minute
if s > 30 then m = m +1 end
s = 0
elseif p > 0.00014 then -- precision is > 1/2 a second
s = math.floor(s + 0.5)
elseif p > 0.000014 then -- precision is > 1/20 second
s = math.floor(10 * s + 0.5) / 10
elseif p > 0.0000014 then -- precision is > 1/200 second
s = math.floor(100 * s + 0.5) / 100
else -- cap it at 3 dec places for now
s = math.floor(1000 * s + 0.5) / 1000
end
return d, m, s
end
-------------------------------------------------------------------------------
-- decimalPrecision takes a decimal (x) with precision (p)
-- and returns x rounded approximately to the given precision
-- precision should be between 1 and 1e-6, preferably a power of 10.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local decimalPrecision = function(x, p)
local s = 1
if x < 0 then
x = -x
s = -1
end
-- if p is not supplied, pick an arbitrary precision
if not tonumber(p) then p = 1e-4
elseif p > 1 then p = 1
elseif p < 1e-6 then p = 1e-6
else p = 10 ^ math.floor(math.log10(p))
end
x = math.floor(x / p + 0.5) * p * s
-- if it's integral, cast to an integer:
if x == math.floor(x) then x = math.floor(x) end
-- if it's less than 1e-4, it will be in exponent form, so return a string with 6dp
-- 9e-5 becomes 0.000090
if math.abs(x) < 1e-4 then x = string.format("%f", x) end
return x
end
-------------------------------------------------------------------------------
-- formatDate takes a datetime of the usual format from mw.wikibase.entity:formatPropertyValues
-- like "1 August 30 BCE" as parameter 1
-- and formats it according to the df (date format) and bc parameters
-- df = ["dmy" / "mdy" / "y"] default will be "dmy"
-- bc = ["BC" / "BCE"] default will be "BCE"
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local format_Date = function(datetime, dateformat, bc)
local datetime = datetime or "1 August 30 BCE" -- in case of nil value
-- chop off multiple vales and/or any hours, mins, etc.
-- keep anything before punctuation - we just want a single date:
local dateval = string.match( datetime, "[%w ]+")
local dateformat = string.lower(dateformat or "dmy") -- default to dmy
local bc = string.upper(bc or "") -- can't use nil for bc
-- we only want to accept two possibilities: BC or default to BCE
if bc == "BC" then
bc = " " .. i18n["BC"] -- prepend a non-breaking space.
else
bc = " " .. i18n["BCE"]
end
local postchrist = true -- start by assuming no BCE
local dateparts = {}
for word in string.gmatch(dateval, "%w+") do
if word == "BCE" or word == "BC" then -- *** internationalise later ***
postchrist = false
else
-- we'll keep the parts that are not 'BCE' in a table
dateparts[#dateparts + 1] = word
end
end
if postchrist then bc = "" end -- set AD dates to no suffix *** internationalise later ***
local sep = " " -- separator is nbsp
local fdate = table.concat(dateparts, sep) -- set formatted date to same order as input
-- if we have day month year, check dateformat
if #dateparts == 3 then
if dateformat == "y" then
fdate = dateparts[3]
elseif dateformat == "mdy" then
fdate = dateparts[2] .. sep .. dateparts[1] .. "," .. sep .. dateparts[3]
end
elseif #dateparts == 2 and dateformat == "y" then
fdate = dateparts[2]
end
return fdate .. bc
end
-------------------------------------------------------------------------------
-- dateFormat is the handler for properties that are of type "time"
-- It takes timestamp, precision (6 to 11 per mediawiki), dateformat (y/dmy/mdy), BC format (BC/BCE),
-- a plaindate switch (yes/no/adj) to en/disable "sourcing circumstances"/use adjectival form,
-- any qualifiers for the property, the language, and any adjective to use like 'before'.
-- It passes the date through the "complex date" function
-- and returns a string with the internatonalised date formatted according to preferences.
-------------------------------------------------------------------------------
-- Dependencies: findLang(); cdate(); dp[]
-------------------------------------------------------------------------------
local dateFormat = function(timestamp, dprec, df, bcf, pd, qualifiers, lang, adj, model)
-- output formatting according to preferences (y/dmy/mdy/ymd)
df = (df or ""):lower()
-- if ymd is required, return the part of the timestamp in YYYY-MM-DD form
-- but apply Year zero#Astronomers fix: 1 BC = 0000; 2 BC = -0001; etc.
if df == "ymd" then
if timestamp:sub(1,1) == "+" then
return timestamp:sub(2,11)
else
local yr = tonumber(timestamp:sub(2,5)) - 1
yr = ("000" .. yr):sub(-4)
if yr ~= "0000" then yr = "-" .. yr end
return yr .. timestamp:sub(6,11)
end
end
-- A year can be stored like this: "+1872-00-00T00:00:00Z",
-- which is processed here as if it were the day before "+1872-01-01T00:00:00Z",
-- and that's the last day of 1871, so the year is wrong.
-- So fix the month 0, day 0 timestamp to become 1 January instead:
timestamp = timestamp:gsub("%-00%-00T", "-01-01T")
-- just in case date precision is missing
dprec = dprec or 11
-- override more precise dates if required dateformat is year alone:
if df == "y" and dprec > 9 then dprec = 9 end
-- complex date only deals with precisions from 6 to 11, so clip range
dprec = dprec>11 and 11 or dprec
dprec = dprec<6 and 6 or dprec
-- BC format is "BC" or "BCE"
bcf = (bcf or ""):upper()
-- plaindate only needs the first letter (y/n/a)
pd = (pd or ""):sub(1,1):lower()
if pd == "" or pd == "n" or pd == "f" or pd == "0" then pd = false end
-- in case language isn't passed
lang = lang or findLang().code
-- set adj as empty if nil
adj = adj or ""
-- extract the day, month, year from the timestamp
local bc = timestamp:sub(1, 1)=="-" and "BC" or ""
local year, month, day = timestamp:match("[+-](%d*)-(%d*)-(%d*)T")
local iso = tonumber(year) -- if year is missing, let it throw an error
-- this will adjust the date format to be compatible with cdate
-- possible formats are Y, YY, YYY0, YYYY, YYYY-MM, YYYY-MM-DD
if dprec == 6 then iso = math.floor( (iso - 1) / 1000 ) + 1 end
if dprec == 7 then iso = math.floor( (iso - 1) / 100 ) + 1 end
if dprec == 8 then iso = math.floor( iso / 10 ) .. "0" end
if dprec == 10 then iso = year .. "-" .. month end
if dprec == 11 then iso = year .. "-" .. month .. "-" .. day end
-- add "circa" (Q5727902) from "sourcing circumstances" (P1480)
local sc = not pd and qualifiers and qualifiers.P1480
if sc then
for k1, v1 in pairs(sc) do
if v1.datavalue and v1.datavalue.value.id == "Q5727902" then
adj = "circa"
break
end
end
end
-- deal with Julian dates:
-- no point in saying that dates before 1582 are Julian - they are by default
-- doesn't make sense for dates less precise than year
-- we can suppress it by setting |plaindate, e.g. for use in constructing categories.
local calendarmodel = ""
if tonumber(year) > 1582
and dprec > 8
and not pd
and model == "http://www.wikidata.org/entity/Q1985786" then
calendarmodel = "julian"
end
if not cdate then
cdate = require("Module:Complex date")._complex_date
end
local fdate = cdate(calendarmodel, adj, tostring(iso), dp[dprec], bc, "", "", "", "", lang, 1)
-- this may have QuickStatements info appended to it in a div, so remove that
fdate = fdate:gsub(' <div style="display: none;">[^<]*</div>', '')
-- it may also be returned wrapped in a microformat, so remove that
fdate = fdate:gsub("<[^>]*>", "")
-- there may be leading zeros that we should remove
fdate = fdate:gsub("^0*", "")
-- if a plain date is required, then remove any links (like BC linked)
if pd then
fdate = fdate:gsub("%[%[.*|", ""):gsub("]]", "")
end
-- if 'circa', use the abbreviated form *** internationalise later ***
fdate = fdate:gsub('circa ', '<abbr title="circa">c.</abbr> ')
-- deal with BC/BCE
if bcf == "BCE" then
fdate = fdate:gsub('BC', 'BCE')
end
-- deal with mdy format
if df == "mdy" then
fdate = fdate:gsub("(%d+) (%w+) (%d+)", "%2 %1, %3")
end
-- deal with adjectival form *** internationalise later ***
if pd == "a" then
fdate = fdate:gsub(' century', '-century')
end
return fdate
end
-------------------------------------------------------------------------------
-- parseParam takes a (string) parameter, e.g. from the list of frame arguments,
-- and makes "false", "no", and "0" into the (boolean) false
-- it makes the empty string and nil into the (boolean) value passed as default
-- allowing the parameter to be true or false by default.
-- It returns a boolean.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local parseParam = function(param, default)
if type(param) == "boolean" then param = tostring(param) end
if param and param ~= "" then
param = param:lower()
if (param == "false") or (param:sub(1,1) == "n") or (param == "0") then
return false
else
return true
end
else
return default
end
end
-------------------------------------------------------------------------------
-- _getSitelink takes the qid of a Wikidata entity passed as |qid=
-- It takes an optional parameter |wiki= to determine which wiki is to be checked for a sitelink
-- If the parameter is blank, then it uses the local wiki.
-- If there is a sitelink to an article available, it returns the plain text link to the article
-- If there is no sitelink, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local _getSitelink = function(qid, wiki)
qid = (qid or ""):upper()
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
wiki = wiki or ""
local sitelink
if wiki == "" then
sitelink = mw.wikibase.getSitelink(qid)
else
sitelink = mw.wikibase.getSitelink(qid, wiki)
end
return sitelink
end
-------------------------------------------------------------------------------
-- _getCommonslink takes an optional qid of a Wikidata entity passed as |qid=
-- It returns one of the following in order of preference:
-- the Commons sitelink of the Wikidata entity - but not if onlycat=true and it's not a category;
-- the Commons sitelink of the topic's main category of the Wikidata entity;
-- the Commons category of the Wikidata entity - unless fallback=false.
-------------------------------------------------------------------------------
-- Dependencies: _getSitelink(); parseParam()
-------------------------------------------------------------------------------
local _getCommonslink = function(qid, onlycat, fallback)
qid = (qid or ""):upper()
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
onlycat = parseParam(onlycat, false)
if fallback == "" then fallback = nil end
local sitelink = _getSitelink(qid, "commonswiki")
if onlycat and sitelink and sitelink:sub(1,9) ~= "Category:" then sitelink = nil end
if not sitelink then
-- check for topic's main category
local prop910 = mw.wikibase.getBestStatements(qid, "P910")[1]
if prop910 then
local tmcid = prop910.mainsnak.datavalue and prop910.mainsnak.datavalue.value.id
sitelink = _getSitelink(tmcid, "commonswiki")
end
if not sitelink then
-- check for list's main category
local prop1754 = mw.wikibase.getBestStatements(qid, "P1754")[1]
if prop1754 then
local tmcid = prop1754.mainsnak.datavalue and prop1754.mainsnak.datavalue.value.id
sitelink = _getSitelink(tmcid, "commonswiki")
end
end
end
if not sitelink and fallback then
-- check for Commons category (string value)
local prop373 = mw.wikibase.getBestStatements(qid, "P373")[1]
if prop373 then
sitelink = prop373.mainsnak.datavalue and prop373.mainsnak.datavalue.value
if sitelink then sitelink = "Category:" .. sitelink end
end
end
return sitelink
end
-------------------------------------------------------------------------------
-- The label in a Wikidata item is subject to vulnerabilities
-- that an attacker might try to exploit.
-- It needs to be 'sanitised' by removing any wikitext before use.
-- If it doesn't exist, return the id for the item
-- a second (boolean) value is also returned, value is true when the label exists
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local labelOrId = function(id, lang)
if lang == "default" then lang = findLang().code end
local label
if lang then
label = mw.wikibase.getLabelByLang(id, lang)
else
label = mw.wikibase.getLabel(id)
end
if label then
return mw.text.nowiki(label), true
else
return id, false
end
end
-------------------------------------------------------------------------------
-- linkedItem takes an entity-id and returns a string, linked if possible.
-- This is the handler for "wikibase-item". Preferences:
-- 1. Display linked disambiguated sitelink if it exists
-- 2. Display linked label if it is a redirect
-- 3. TBA: Display an inter-language link for the label if it exists other than in default language
-- 4. Display unlinked label if it exists
-- 5. Display entity-id for now to indicate a label could be provided
-- dtxt is text to be used instead of label, or nil.
-- shortname is boolean switch to use P1813 (short name) instead of label if true.
-- lang is the current language code.
-- uselbl is boolean switch to force display of the label instead of the sitelink (default: false)
-- linkredir is boolean switch to allow linking to a redirect (default: false)
-- formatvalue is boolean switch to allow formatting as italics or quoted (default: false)
-------------------------------------------------------------------------------
-- Dependencies: labelOrId(); donotlink[]
-------------------------------------------------------------------------------
local linkedItem = function(id, args)
local lprefix = (args.lp or args.lprefix or args.linkprefix or ""):gsub('"', '') -- toughen against nil values passed
local lpostfix = (args.lpostfix or ""):gsub('"', '')
local prefix = (args.prefix or ""):gsub('"', '')
local postfix = (args.postfix or ""):gsub('"', '')
local dtxt = args.dtxt
local shortname = args.shortname or args.sn
local lang = args.lang or "en" -- fallback to default if missing
local uselbl = args.uselabel or args.uselbl
uselbl = parseParam(uselbl, false)
local linkredir = args.linkredir
linkredir = parseParam(linkredir, false)
local formatvalue = args.formatvalue or args.fv
formatvalue = parseParam(formatvalue, false)
-- see if item might need italics or quotes
local fmt = ""
if next(formats) and formatvalue then
for k, v in ipairs( mw.wikibase.getBestStatements(id, "P31") ) do
if v.mainsnak.datavalue and formats[v.mainsnak.datavalue.value.id] then
fmt = formats[v.mainsnak.datavalue.value.id]
break -- pick the first match
end
end
end
local disp
local sitelink = mw.wikibase.getSitelink(id)
local label, islabel
if dtxt then
label, islabel = dtxt, true
elseif shortname then
-- see if there is a shortname in our language, and set label to it
for k, v in ipairs( mw.wikibase.getBestStatements(id, "P1813") ) do
if v.mainsnak.datavalue.value.language == lang then
label, islabel = v.mainsnak.datavalue.value.text, true
break
end -- test for language match
end -- loop through values of short name
-- if we have no label set, then there was no shortname available
if not islabel then
label, islabel = labelOrId(id)
shortname = false
end
else
label, islabel = labelOrId(id)
end
if mw.site.siteName ~= "Wikimedia Commons" then
if sitelink then
if not (dtxt or shortname) then
-- if sitelink and label are the same except for case, no need to process further
if sitelink:lower() ~= label:lower() then
-- strip any namespace or dab from the sitelink
local pos = sitelink:find(":") or 0
local slink = sitelink
if pos > 0 then
local pfx = sitelink:sub(1,pos-1)
if mw.site.namespaces[pfx] then -- that prefix is a valid namespace, so remove it
slink = sitelink:sub(pos+1)
end
end
-- remove stuff after commas or inside parentheses - ie. dabs
slink = slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")
-- if uselbl is false, use sitelink instead of label
if not uselbl then
-- use slink as display, preserving label case - find("^%u") is true for 1st char uppercase
if label:find("^%u") then
label = slink:gsub("^(%l)", string.upper)
else
label = slink:gsub("^(%u)", string.lower)
end
end
end
end
if donotlink[label] then
disp = prefix .. fmt .. label .. fmt .. postfix
else
disp = "[[" .. lprefix .. sitelink .. lpostfix .. "|" .. prefix .. fmt .. label .. fmt .. postfix .. "]]"
end
elseif islabel then
-- no sitelink, label exists, so check if a redirect with that title exists, if linkredir is true
-- display plain label by default
disp = prefix .. fmt .. label .. fmt .. postfix
if linkredir then
local artitle = mw.title.new(label, 0) -- only nil if label has invalid chars
if not donotlink[label] and artitle and artitle.redirectTarget then
-- there's a redirect with the same title as the label, so let's link to that
disp = "[[".. lprefix .. label .. lpostfix .. "|" .. prefix .. fmt .. label .. fmt .. postfix .. "]]"
end
end -- test if article title exists as redirect on current Wiki
else
-- no sitelink and no label, so return whatever was returned from labelOrId for now
-- add tracking category [[Category:Articles with missing Wikidata information]]
-- for enwiki, just return the tracking category
if mw.wikibase.getGlobalSiteId() == "enwiki" then
disp = i18n.missinginfocat
else
disp = prefix .. label .. postfix .. i18n.missinginfocat
end
end
else
local ccat = mw.wikibase.getBestStatements(id, "P373")[1]
if ccat and ccat.mainsnak.datavalue then
ccat = ccat.mainsnak.datavalue.value
disp = "[[" .. lprefix .. "Category:" .. ccat .. lpostfix .. "|" .. prefix .. label .. postfix .. "]]"
elseif sitelink then
-- this asumes that if a sitelink exists, then a label also exists
disp = "[[" .. lprefix .. sitelink .. lpostfix .. "|" .. prefix .. label .. postfix .. "]]"
else
-- no sitelink and no Commons cat, so return label from labelOrId for now
disp = prefix .. label .. postfix
end
end
return disp
end
-------------------------------------------------------------------------------
-- sourced takes a table representing a statement that may or may not have references
-- it looks for a reference sourced to something not containing the word "wikipedia"
-- it returns a boolean = true if it finds a sourced reference.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local sourced = function(claim)
if claim.references then
for kr, vr in pairs(claim.references) do
local ref = mw.wikibase.renderSnaks(vr.snaks)
if not ref:find("Wiki") then
return true
end
end
end
end
-------------------------------------------------------------------------------
-- setRanks takes a flag (parameter passed) that requests the values to return
-- "b[est]" returns preferred if available, otherwise normal
-- "p[referred]" returns preferred
-- "n[ormal]" returns normal
-- "d[eprecated]" returns deprecated
-- multiple values are allowed, e.g. "preferred normal" (which is the default)
-- "best" will override the other flags, and set p and n
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local setRanks = function(rank)
rank = (rank or ""):lower()
-- if nothing passed, return preferred and normal
-- if rank == "" then rank = "p n" end
local ranks = {}
for w in string.gmatch(rank, "%a+") do
w = w:sub(1,1)
if w == "b" or w == "p" or w == "n" or w == "d" then
ranks[w] = true
end
end
-- check if "best" is requested or no ranks requested; and if so, set preferred and normal
if ranks.b or not next(ranks) then
ranks.p = true
ranks.n = true
end
return ranks
end
-------------------------------------------------------------------------------
-- parseInput processes the Q-id , the blacklist and the whitelist
-- if an input parameter is supplied, it returns that and ends the call.
-- it returns (1) either the qid or nil indicating whether or not the call should continue
-- and (2) a table containing all of the statements for the propertyID and relevant Qid
-- if "best" ranks are requested, it returns those instead of all non-deprecated ranks
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
local parseInput = function(frame, input_parm, property_id)
-- There may be a local parameter supplied, if it's blank, set it to nil
input_parm = mw.text.trim(input_parm or "")
if input_parm == "" then input_parm = nil end
-- return nil if Wikidata is not available
if not mw.wikibase then return false, input_parm end
local args = frame.args
-- can take a named parameter |qid which is the Wikidata ID for the article.
-- if it's not supplied, use the id for the current page
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
-- if there's no Wikidata item for the current page return nil
if not qid then return false, input_parm end
-- The blacklist is passed in named parameter |suppressfields
local blacklist = args.suppressfields or args.spf or ""
-- The whitelist is passed in named parameter |fetchwikidata
local whitelist = args.fetchwikidata or args.fwd or ""
if whitelist == "" then whitelist = "NONE" end
-- The name of the field that this function is called from is passed in named parameter |name
local fieldname = args.name or ""
if blacklist ~= "" then
-- The name is compulsory when blacklist is used, so return nil if it is not supplied
if fieldname == "" then return false, nil end
-- If this field is on the blacklist, then return nil
if blacklist:find(fieldname) then return false, nil end
end
-- If we got this far then we're not on the blacklist
-- The blacklist overrides any locally supplied parameter as well
-- If a non-blank input parameter was supplied return it
if input_parm then return false, input_parm end
-- We can filter out non-valid properties
if property_id:sub(1,1):upper() ~="P" or property_id == "P0" then return false, nil end
-- Otherwise see if this field is on the whitelist:
-- needs a bit more logic because find will return its second value = 0 if fieldname is ""
-- but nil if fieldname not found on whitelist
local _, found = whitelist:find(fieldname)
found = ((found or 0) > 0)
if whitelist ~= 'ALL' and (whitelist:upper() == "NONE" or not found) then
return false, nil
end
-- See what's on Wikidata (the call always returns a table, but it may be empty):
local props = {}
if args.reqranks.b then
props = mw.wikibase.getBestStatements(qid, property_id)
else
props = mw.wikibase.getAllStatements(qid, property_id)
end
if props[1] then
return qid, props
end
-- no property on Wikidata
return false, nil
end
-------------------------------------------------------------------------------
-- createicon assembles the "Edit at Wikidata" pen icon.
-- It returns a wikitext string inside a span class="penicon"
-- if entityID is nil or empty, the ID associated with current page is used
-- langcode and propertyID may be nil or empty
-------------------------------------------------------------------------------
-- Dependencies: i18n[];
-------------------------------------------------------------------------------
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
if not entityID or entityID == "" then entityID= mw.wikibase.getEntityIdForCurrentPage() end
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. i18n["filespace"]
.. ":OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n["editonwikidata"]
.. "|link=https://www.wikidata.org/wiki/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n["editonwikidata"] .. "]]</span>"
return icon
end
-------------------------------------------------------------------------------
-- assembleoutput takes the sequence table containing the property values
-- and formats it according to switches given. It returns a string or nil.
-- It uses the entityID (and optionally propertyID) to create a link in the pen icon.
-------------------------------------------------------------------------------
-- Dependencies: parseParam();
-------------------------------------------------------------------------------
local assembleoutput = function(out, args, entityID, propertyID)
-- sorted is a boolean passed to enable sorting of the values returned
-- if nothing or an empty string is passed set it false
-- if "false" or "no" or "0" is passed set it false
local sorted = parseParam(args.sorted, false)
-- noicon is a boolean passed to suppress the trailing "edit at Wikidata" icon
-- for use when the value is processed further by the infobox
-- if nothing or an empty string is passed set it false
-- if "false" or "no" or "0" is passed set it false
local noic = parseParam(args.noicon, false)
-- list is the name of a template that a list of multiple values is passed through
-- examples include "hlist" and "ubl"
-- setting it to "prose" produces something like "1, 2, 3, and 4"
local list = args.list or ""
-- sep is a string that is used to separate multiple returned values
-- if nothing or an empty string is passed set it to the default
-- any double-quotes " are stripped out, so that spaces may be passed
-- e.g. |sep=" - "
local sepdefault = i18n["list separator"]
local separator = args.sep or ""
separator = string.gsub(separator, '"', '')
if separator == "" then
separator = sepdefault
end
-- collapse is a number that determines the maximum number of returned values
-- before the output is collapsed.
-- Zero or not a number result in no collapsing (default becomes 0).
local collapse = tonumber(args.collapse) or 0
-- replacetext (rt) is a string that is returned instead of any non-empty Wikidata value
-- this is useful for tracking and debugging
local replacetext = mw.text.trim(args.rt or args.replacetext or "")
-- if there's anything to return, then return a list
-- comma-separated by default, but may be specified by the sep parameter
-- optionally specify a hlist or ubl or a prose list, etc.
local strout
if #out > 0 then
if sorted then table.sort(out) end
-- if there's something to display and a pen icon is wanted, add it the end of the last value
local hasdisplay = false
for i, v in ipairs(out) do
if v ~= i18n.missinginfocat then
hasdisplay = true
break
end
end
if not noic and hasdisplay then
out[#out] = out[#out] .. createicon(args.langobj.code, entityID, propertyID)
end
if list == "" then
strout = table.concat(out, separator)
elseif list:lower() == "prose" then
strout = mw.text.listToText( out )
else
strout = mw.getCurrentFrame():expandTemplate{title = list, args = out}
end
if collapse >0 and #out > collapse then
strout = collapsediv .. strout .. "</div>"
end
else
strout = nil -- no items had valid reference
end
if replacetext ~= "" and strout then strout = replacetext end
return strout
end
-------------------------------------------------------------------------------
-- rendersnak takes a table (propval) containing the information stored on one property value
-- and returns the value as a string and its language if monolingual text.
-- It handles data of type:
-- wikibase-item
-- time
-- string, url, commonsMedia, external-id
-- quantity
-- globe-coordinate
-- monolingualtext
-- It also requires linked, the link/pre/postfixes, uabbr, and the arguments passed from frame.
-- The optional filter parameter allows quantities to be be filtered by unit Qid.
-------------------------------------------------------------------------------
-- Dependencies: parseParam(); labelOrId(); i18n[]; dateFormat();
-- roundto(); decimalPrecision(); decimalToDMS(); linkedItem();
-------------------------------------------------------------------------------
local rendersnak = function(propval, args, linked, lpre, lpost, pre, post, uabbr, filter)
lpre = lpre or ""
lpost = lpost or ""
pre = pre or ""
post = post or ""
args.lang = args.lang or findLang().code
-- allow values to display a fixed text instead of label
local dtxt = args.displaytext or args.dt
if dtxt == "" then dtxt = nil end
-- switch to use display of short name (P1813) instead of label
local shortname = args.shortname or args.sn
shortname = parseParam(shortname, false)
local snak = propval.mainsnak or propval
local dtype = snak.datatype
local dv = snak.datavalue
dv = dv and dv.value
-- value and monolingual text language code returned
local val, mlt
if propval.rank and not args.reqranks[propval.rank:sub(1, 1)] then
-- val is nil: value has a rank that isn't requested
------------------------------------
elseif snak.snaktype == "somevalue" then -- value is unknown
val = i18n["Unknown"]
------------------------------------
elseif snak.snaktype == "novalue" then -- value is none
-- val = "No value" -- don't return anything
------------------------------------
elseif dtype == "wikibase-item" then -- data type is a wikibase item:
-- it's wiki-linked value, so output as link if enabled and possible
local qnumber = dv.id
if linked then
val = linkedItem(qnumber, args)
else -- no link wanted so check for display-text, otherwise test for lang code
local label, islabel
if dtxt then
label = dtxt
else
label, islabel = labelOrId(qnumber)
local langlabel = mw.wikibase.getLabelByLang(qnumber, args.lang)
if langlabel then
label = mw.text.nowiki( langlabel )
end
end
val = pre .. label .. post
end -- test for link required
------------------------------------
elseif dtype == "time" then -- data type is time:
-- time is in timestamp format
-- date precision is integer per mediawiki
-- output formatting according to preferences (y/dmy/mdy)
-- BC format as BC or BCE
-- plaindate is passed to disable looking for "sourcing cirumstances"
-- or to set the adjectival form
-- qualifiers (if any) is a nested table or nil
-- lang is given, or user language, or site language
--
-- Here we can check whether args.df has a value
-- If not, use code from Module:Sandbox/RexxS/Getdateformat to set it from templates like {{Use mdy dates}}
val = dateFormat(dv.time, dv.precision, args.df, args.bc, args.pd, propval.qualifiers, args.lang, "", dv.calendarmodel)
------------------------------------
-- data types which are strings:
elseif dtype == "commonsMedia" or dtype == "external-id" or dtype == "string" or dtype == "url" then
-- commonsMedia or external-id or string or url
-- all have mainsnak.datavalue.value as string
if (lpre == "" or lpre == ":") and lpost == "" then
-- don't link if no linkpre/postfix or linkprefix is just ":"
val = pre .. dv .. post
elseif dtype == "external-id" then
val = "[" .. lpre .. dv .. lpost .. " " .. pre .. dv .. post .. "]"
else
val = "[[" .. lpre .. dv .. lpost .. "|" .. pre .. dv .. post .. "]]"
end -- check for link requested (i.e. either linkprefix or linkpostfix exists)
------------------------------------
-- data types which are quantities:
elseif dtype == "quantity" then
-- quantities have mainsnak.datavalue.value.amount and mainsnak.datavalue.value.unit
-- the unit is of the form http://www.wikidata.org/entity/Q829073
--
-- implement a switch to turn on/off numerical formatting later
local fnum = true
--
-- a switch to turn on/off conversions - only for en-wiki
local conv = parseParam(args.conv or args.convert, false)
-- if we have conversions, we won't have formatted numbers or scales
if conv then
uabbr = true
fnum = false
args.scale = "0"
end
--
-- a switch to turn on/off showing units, default is true
local showunits = parseParam(args.su or args.showunits, true)
--
-- convert amount to a number
local amount = tonumber(dv.amount) or i18n["NaN"]
--
-- scale factor for millions, billions, etc.
local sc = tostring(args.scale or ""):sub(1,1):lower()
local scale
if sc == "a" then
-- automatic scaling
if amount > 1e15 then
scale = 12
elseif amount > 1e12 then
scale = 9
elseif amount > 1e9 then
scale = 6
elseif amount > 1e6 then
scale = 3
else
scale = 0
end
else
scale = tonumber(args.scale) or 0
if scale < 0 or scale > 12 then scale = 0 end
scale = math.floor(scale/3) * 3
end
local factor = 10^scale
amount = amount / factor
-- ranges:
local range = ""
-- check if upper and/or lower bounds are given and significant
local upb = tonumber(dv.upperBound)
local lowb = tonumber(dv.lowerBound)
if upb and lowb then
-- differences rounded to 2 sig fig:
local posdif = roundto(upb - amount, 2) / factor
local negdif = roundto(amount - lowb, 2) / factor
upb, lowb = amount + posdif, amount - negdif
-- round scaled numbers to integers or 4 sig fig
if (scale > 0 or sc == "a") then
if amount < 1e4 then
amount = roundto(amount, 4)
else
amount = math.floor(amount + 0.5)
end
end
if fnum then amount = args.langobj:formatNum( amount ) end
if posdif ~= negdif then
-- non-symmetrical
range = " +" .. posdif .. " -" .. negdif
elseif posdif ~= 0 then
-- symmetrical and non-zero
range = " ±" .. posdif
else
-- otherwise range is zero, so leave it as ""
end
else
-- round scaled numbers to integers or 4 sig fig
if (scale > 0 or sc == "a") then
if amount < 1e4 then
amount = roundto(amount, 4)
else
amount = math.floor(amount + 0.5)
end
end
if fnum then amount = args.langobj:formatNum( amount ) end
end
-- unit names and symbols:
-- extract the qid in the form 'Qnnn' from the value.unit url
-- and then fetch the label from that - or symbol if unitabbr is true
local unit = ""
local usep = ""
local usym = ""
local unitqid = string.match( dv.unit, "(Q%d+)" )
if filter and unitqid ~= filter then return nil end
if unitqid and showunits then
local uname = mw.wikibase.getLabelByLang(unitqid, args.lang) or ""
if uname ~= "" then usep, unit = " ", uname end
if uabbr then
-- see if there's a unit symbol (P5061)
local unitsymbols = mw.wikibase.getBestStatements(unitqid, "P5061")
-- construct fallback table, add local lang and multiple languages
local fbtbl = mw.language.getFallbacksFor( args.lang, mw.language.FALLBACK_STRICT )
table.insert( fbtbl, 1, args.lang )
table.insert( fbtbl, "mul" )
table.insert( fbtbl, "en" )
local found = false
for idx1, us in ipairs(unitsymbols) do
for idx2, fblang in ipairs(fbtbl) do
if us.mainsnak.datavalue.value.language == fblang then
usym = us.mainsnak.datavalue.value.text
found = true
break
end
end -- loop through fallback table
if found then break end
end -- loop through values of P5061
if found then usep, unit = " ", usym end
end
end
-- format display:
if conv then
if range == "" then
val = mw.getCurrentFrame():expandTemplate{title = "cvt", args = {amount, unit}}
else
val = mw.getCurrentFrame():expandTemplate{title = "cvt", args = {lowb, "to", upb, unit}}
end
elseif unit == "$" or unit == "£" then
val = unit .. amount .. range .. i18n.multipliers[scale]
else
val = amount .. range .. i18n.multipliers[scale] .. usep .. unit
end
------------------------------------
-- datatypes which are global coordinates:
elseif dtype == "globe-coordinate" then
-- 'display' parameter defaults to "inline, title" *** unused for now ***
-- local disp = args.display or ""
-- if disp == "" then disp = "inline, title" end
--
-- format parameter switches from deg/min/sec to decimal degrees
-- default is deg/min/sec -- decimal degrees needs |format = dec
local form = (args.format or ""):lower():sub(1,3)
if form ~= "dec" then form = "dms" end -- not needed for now
--
-- show parameter allows just the latitude, or just the longitude, or both
-- to be returned as a signed decimal, ignoring the format parameter.
local show = (args.show or ""):lower()
if show ~= "longlat" then show = show:sub(1,3) end
--
local lat, long, prec = dv.latitude, dv.longitude, dv.precision
if show == "lat" then
val = decimalPrecision(lat, prec)
elseif show == "lon" then
val = decimalPrecision(long, prec)
elseif show == "longlat" then
val = decimalPrecision(long, prec) .. ", " .. decimalPrecision(lat, prec)
else
local ns = "N"
local ew = "E"
if lat < 0 then
ns = "S"
lat = - lat
end
if long < 0 then
ew = "W"
long = - long
end
if form == "dec" then
lat = decimalPrecision(lat, prec)
long = decimalPrecision(long, prec)
val = lat .. "°" .. ns .. " " .. long .. "°" .. ew
else
local latdeg, latmin, latsec = decimalToDMS(lat, prec)
local longdeg, longmin, longsec = decimalToDMS(long, prec)
if latsec == 0 and longsec == 0 then
if latmin == 0 and longmin == 0 then
val = latdeg .. "°" .. ns .. " " .. longdeg .. "°" .. ew
else
val = latdeg .. "°" .. latmin .. "′" .. ns .. " "
val = val .. longdeg .. "°".. longmin .. "′" .. ew
end
else
val = latdeg .. "°" .. latmin .. "′" .. latsec .. "″" .. ns .. " "
val = val .. longdeg .. "°" .. longmin .. "′" .. longsec .. "″" .. ew
end
end
end
------------------------------------
elseif dtype == "monolingualtext" then -- data type is Monolingual text:
-- has mainsnak.datavalue.value as a table containing language/text pairs
-- collect all the values in 'out' and languages in 'mlt' and process them later
val = pre .. dv.text .. post
mlt = dv.language
------------------------------------
else
-- some other data type so write a specific handler
val = "unknown data type: " .. dtype
end -- of datatype/unknown value/sourced check
return val, mlt
end
-------------------------------------------------------------------------------
-- propertyvalueandquals takes a property object, the arguments passed from frame,
-- and a qualifier propertyID.
-- It returns a sequence (table) of values representing the values of that property
-- and qualifiers that match the qualifierID if supplied.
-------------------------------------------------------------------------------
-- Dependencies: parseParam(); sourced(); labelOrId(); i18n.latestdatequalifier(); format_Date();
-- makeOrdinal(); roundto(); decimalPrecision(); decimalToDMS(); assembleoutput();
-------------------------------------------------------------------------------
local function propertyvalueandquals(objproperty, args, qualID)
-- needs this style of declaration because it's re-entrant
-- onlysourced is a boolean passed to return only values sourced to other than Wikipedia
-- if nothing or an empty string is passed set it true
local onlysrc = parseParam(args.onlysourced or args.osd, true)
-- linked is a a boolean that enables the link to a local page via sitelink
-- if nothing or an empty string is passed set it true
local linked = parseParam(args.linked, true)
-- prefix is a string that may be nil, empty (""), or a string of characters
-- this is prefixed to each value
-- useful when when multiple values are returned
-- any double-quotes " are stripped out, so that spaces may be passed
local prefix = (args.prefix or ""):gsub('"', '')
-- postfix is a string that may be nil, empty (""), or a string of characters
-- this is postfixed to each value
-- useful when when multiple values are returned
-- any double-quotes " are stripped out, so that spaces may be passed
local postfix = (args.postfix or ""):gsub('"', '')
-- linkprefix is a string that may be nil, empty (""), or a string of characters
-- this creates a link and is then prefixed to each value
-- useful when when multiple values are returned and indirect links are needed
-- any double-quotes " are stripped out, so that spaces may be passed
local lprefix = (args.linkprefix or args.lp or ""):gsub('"', '')
-- linkpostfix is a string that may be nil, empty (""), or a string of characters
-- this is postfixed to each value when linking is enabled with lprefix
-- useful when when multiple values are returned
-- any double-quotes " are stripped out, so that spaces may be passed
local lpostfix = (args.linkpostfix or ""):gsub('"', '')
-- wdlinks is a boolean passed to enable links to Wikidata when no article exists
-- if nothing or an empty string is passed set it false
local wdl = parseParam(args.wdlinks or args.wdl, false)
-- unitabbr is a boolean passed to enable unit abbreviations for common units
-- if nothing or an empty string is passed set it false
local uabbr = parseParam(args.unitabbr or args.uabbr, false)
-- qualsonly is a boolean passed to return just the qualifiers
-- if nothing or an empty string is passed set it false
local qualsonly = parseParam(args.qualsonly or args.qo, false)
-- maxvals is a string that may be nil, empty (""), or a number
-- this determines how many items may be returned when multiple values are available
-- setting it = 1 is useful where the returned string is used within another call, e.g. image
local maxvals = tonumber(args.maxvals) or 0
-- pd (plain date) is a string: yes/true/1 | no/false/0 | adj
-- to disable/enable "sourcing cirumstances" or use adjectival form for the plain date
local pd = args.plaindate or args.pd or "no"
args.pd = pd
-- allow qualifiers to have a different date format; default to year unless qualsonly is set
args.qdf = args.qdf or args.qualifierdateformat or args.df or (not qualsonly and "y")
local lang = args.lang or findLang().code
-- qualID is a string list of wanted qualifiers or "ALL"
qualID = qualID or ""
-- capitalise list of wanted qualifiers and substitute "DATES"
qualID = qualID:upper():gsub("DATES", "P580, P582")
local allflag = (qualID == "ALL")
-- create table of wanted qualifiers as key
local qwanted = {}
-- create sequence of wanted qualifiers
local qorder = {}
for q in mw.text.gsplit(qualID, "%p") do -- split at punctuation and iterate
local qtrim = mw.text.trim(q)
if qtrim ~= "" then
qwanted[mw.text.trim(q)] = true
qorder[#qorder+1] = qtrim
end
end
-- qsep is the output separator for rendering qualifier list
local qsep = (args.qsep or ""):gsub('"', '')
-- qargs are the arguments to supply to assembleoutput()
local qargs = {
["osd"] = "false",
["linked"] = tostring(linked),
["prefix"] = args.qprefix,
["postfix"] = args.qpostfix,
["linkprefix"] = args.qlinkprefix or args.qlp,
["linkpostfix"] = args.qlinkpostfix,
["wdl"] = "false",
["unitabbr"] = tostring(uabbr),
["maxvals"] = 0,
["sorted"] = tostring(args.qsorted),
["noicon"] = "true",
["list"] = args.qlist,
["sep"] = qsep,
["langobj"] = args.langobj,
["lang"] = args.langobj.code,
["df"] = args.qdf,
["sn"] = parseParam(args.qsn or args.qshortname, false),
}
-- all proper values of a Wikidata property will be the same type as the first
-- qualifiers don't have a mainsnak, properties do
local datatype = objproperty[1].datatype or objproperty[1].mainsnak.datatype
-- out[] holds the a list of returned values for this property
-- mlt[] holds the language code if the datatype is monolingual text
local out = {}
local mlt = {}
for k, v in ipairs(objproperty) do
local hasvalue = true
if (onlysrc and not sourced(v)) then
-- no value: it isn't sourced when onlysourced=true
hasvalue = false
else
local val, lcode = rendersnak(v, args, linked, lprefix, lpostfix, prefix, postfix, uabbr)
if not val then
hasvalue = false -- rank doesn't match
elseif qualsonly and qualID then
-- suppress value returned: only qualifiers are requested
else
out[#out+1], mlt[#out+1] = val, lcode
end
end
-- See if qualifiers are to be returned:
local snak = v.mainsnak or v
if hasvalue and v.qualifiers and qualID ~= "" and snak.snaktype~="novalue" then
-- collect all wanted qualifier values returned in qlist, indexed by propertyID
local qlist = {}
local timestart, timeend = "", ""
-- loop through qualifiers
for k1, v1 in pairs(v.qualifiers) do
if allflag or qwanted[k1] then
if k1 == "P1326" then
local ts = v1[1].datavalue.value.time
local dp = v1[1].datavalue.value.precision
qlist[k1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "before")
elseif k1 == "P1319" then
local ts = v1[1].datavalue.value.time
local dp = v1[1].datavalue.value.precision
qlist[k1] = dateFormat(ts, dp, args.qdf, args.bc, pd, "", lang, "after")
elseif k1 == "P580" then
timestart = propertyvalueandquals(v1, qargs)[1] or "" -- treat only one start time as valid
elseif k1 == "P582" then
timeend = propertyvalueandquals(v1, qargs)[1] or "" -- treat only one end time as valid
else
local q = assembleoutput(propertyvalueandquals(v1, qargs), qargs)
-- we already deal with circa via 'sourcing circumstances' if the datatype was time
-- circa may be either linked or unlinked *** internationalise later ***
if datatype ~= "time" or q ~= "circa" and not (type(q) == "string" and q:find("circa]]")) then
qlist[k1] = q
end
end
end -- of test for wanted
end -- of loop through qualifiers
-- set date separator
local t = timestart .. timeend
-- *** internationalise date separators later ***
local dsep = "–"
if t:find("%s") or t:find(" ") then dsep = " – " end
-- set the order for the list of qualifiers returned; start time and end time go last
if next(qlist) then
local qlistout = {}
if allflag then
for k2, v2 in pairs(qlist) do
qlistout[#qlistout+1] = v2
end
else
for i2, v2 in ipairs(qorder) do
qlistout[#qlistout+1] = qlist[v2]
end
end
if t ~= "" then
qlistout[#qlistout+1] = timestart .. dsep .. timeend
end
local qstr = assembleoutput(qlistout, qargs)
if qualsonly then
out[#out+1] = qstr
else
out[#out] = out[#out] .. " (" .. qstr .. ")"
end
elseif t ~= "" then
if qualsonly then
if timestart == "" then
out[#out+1] = timeend
elseif timeend == "" then
out[#out+1] = timestart
else
out[#out+1] = timestart .. dsep .. timeend
end
else
out[#out] = out[#out] .. " (" .. timestart .. dsep .. timeend .. ")"
end
end
end -- of test for qualifiers wanted
if maxvals > 0 and #out >= maxvals then break end
end -- of for each value loop
-- we need to pick one value to return if the datatype was "monolingualtext"
-- if there's only one value, use that
-- otherwise look through the fallback languages for a match
if datatype == "monolingualtext" and #out >1 then
lang = mw.text.split( lang, '-', true )[1]
local fbtbl = mw.language.getFallbacksFor( lang )
table.insert( fbtbl, 1, lang )
local bestval = ""
local found = false
for idx1, lang1 in ipairs(fbtbl) do
for idx2, lang2 in ipairs(mlt) do
if (lang1 == lang2) and not found then
bestval = out[idx2]
found = true
break
end
end -- loop through values of property
end -- loop through fallback languages
if found then
-- replace output table with a table containing the best value
out = { bestval }
else
-- more than one value and none of them on the list of fallback languages
-- sod it, just give them the first one
out = { out[1] }
end
end
return out
end
-------------------------------------------------------------------------------
-- Common code for p.getValueByQual and p.getValueByLang
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; assembleoutput;
-------------------------------------------------------------------------------
local _getvaluebyqual = function(frame, qualID, checkvalue)
-- The property ID that will have a qualifier is the first unnamed parameter
local propertyID = mw.text.trim(frame.args[1] or "")
if propertyID == "" then return "no property supplied" end
if qualID == "" then return "no qualifier supplied" end
-- onlysourced is a boolean passed to return property values
-- only when property values are sourced to something other than Wikipedia
-- if nothing or an empty string is passed set it true
-- if "false" or "no" or 0 is passed set it false
local onlysrc = parseParam(frame.args.onlysourced or frame.args.osd, true)
-- set the requested ranks flags
frame.args.reqranks = setRanks(frame.args.rank)
-- set a language object and code in the frame.args table
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local args = frame.args
-- check for locally supplied parameter in second unnamed parameter
-- success means no local parameter and the property exists
local qid, props = parseInput(frame, args[2], propertyID)
local linked = parseParam(args.linked, true)
local lpre = (args.linkprefix or args.lp or ""):gsub('"', '')
local lpost = (args.linkpostfix or ""):gsub('"', '')
local pre = (args.prefix or ""):gsub('"', '')
local post = (args.postfix or ""):gsub('"', '')
local uabbr = parseParam(args.unitabbr or args.uabbr, false)
local filter = (args.unit or ""):upper()
local maxvals = tonumber(args.maxvals) or 0
if filter == "" then filter = nil end
if qid then
local out = {}
-- Scan through the values of the property
-- we want something like property is "pronunciation audio (P443)" in propertyID
-- with a qualifier like "language of work or name (P407)" in qualID
-- whose value has the required ID, like "British English (Q7979)", in qval
for k1, v1 in ipairs(props) do
if v1.mainsnak.snaktype == "value" then
-- check if it has the right qualifier
local v1q = v1.qualifiers
if v1q and v1q[qualID] then
if onlysrc == false or sourced(v1) then
-- if we've got this far, we have a (sourced) claim with qualifiers
-- so see if matches the required value
-- We'll only deal with wikibase-items and strings for now
if v1q[qualID][1].datatype == "wikibase-item" then
if checkvalue(v1q[qualID][1].datavalue.value.id) then
out[#out + 1] = rendersnak(v1, args, linked, lpre, lpost, pre, post, uabbr, filter)
end
elseif v1q[qualID][1].datatype == "string" then
if checkvalue(v1q[qualID][1].datavalue.value) then
out[#out + 1] = rendersnak(v1, args, linked, lpre, lpost, pre, post, uabbr, filter)
end
end
end -- of check for sourced
end -- of check for matching required value and has qualifiers
else
return nil
end -- of check for string
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through values of propertyID
return assembleoutput(out, frame.args, qid, propertyID)
else
return props -- either local parameter or nothing
end -- of test for success
return nil
end
-------------------------------------------------------------------------------
-- _location takes Q-id and follows P276 (location)
-- or P131 (located in the administrative territorial entity) or P706 (located on terrain feature)
-- from the initial item to higher level territories/locations until it reaches the highest.
-- An optional boolean, 'first', determines whether the first item is returned (default: false).
-- An optional boolean 'skip' toggles the display to skip to the last item (default: false).
-- It returns a table containing the locations - linked where possible, except for the highest.
-------------------------------------------------------------------------------
-- Dependencies: findLang(); labelOrId(); linkedItem
-------------------------------------------------------------------------------
local _location = function(qid, first, skip)
first = parseParam(first, false)
skip = parseParam(skip, false)
local locs = {"P276", "P131", "P706"}
local out = {}
local langcode = findLang():getCode()
local finished = false
local count = 0
local prevqid = "Q0"
repeat
local prop
for i1, v1 in ipairs(locs) do
local proptbl = mw.wikibase.getBestStatements(qid, v1)
if #proptbl > 1 then
-- there is more than one higher location
local prevP131, prevP131id
if prevqid ~= "Q0" then
prevP131 = mw.wikibase.getBestStatements(prevqid, "P131")[1]
prevP131id = prevP131
and prevP131.mainsnak.datavalue
and prevP131.mainsnak.datavalue.value.id
end
for i2, v2 in ipairs(proptbl) do
local parttbl = v2.qualifiers and v2.qualifiers.P518
if parttbl then
-- this higher location has qualifier 'applies to part' (P518)
for i3, v3 in ipairs(parttbl) do
if v3.snaktype == "value" and v3.datavalue.value.id == prevqid then
-- it has a value equal to the previous location
prop = proptbl[i2]
break
end -- of test for matching last location
end -- of loop through values of 'applies to part'
else
-- there's no qualifier 'applies to part' (P518)
-- so check if the previous location had a P131 that matches this alternate
if qid == prevP131id then
prop = proptbl[i2]
break
end -- of test for matching previous P131
end
end -- of loop through parent locations
-- fallback to second value if match not found
prop = prop or proptbl[2]
elseif #proptbl > 0 then
prop = proptbl[1]
end
if prop then break end
end
-- check if it's an instance of (P31) a country (Q6256) or sovereign state (Q3624078)
-- and terminate the chain if it is
local inst = mw.wikibase.getAllStatements(qid, "P31")
if #inst > 0 then
for k, v in ipairs(inst) do
local instid = v.mainsnak.datavalue and v.mainsnak.datavalue.value.id
-- stop if it's a country (or a country within the United Kingdom if skip is true)
if instid == "Q6256" or instid == "Q3624078" or (skip and instid == "Q3336843") then
prop = nil -- this will ensure this is treated as top-level location
break
end
end
end
-- get the name of this location and update qid to point to the parent location
if prop and prop.mainsnak.datavalue then
if not skip or count == 0 then
local args = { lprefix = ":" }
out[#out+1] = linkedItem(qid, args) -- get a linked value if we can
end
qid, prevqid = prop.mainsnak.datavalue.value.id, qid
else
-- This is top-level location, so get short name except when this is the first item
-- Use full label if there's no short name or this is the first item
local prop1813 = mw.wikibase.getAllStatements(qid, "P1813")
-- if there's a short name and this isn't the only item
if prop1813[1] and (#out > 0)then
local shortname
-- short name is monolingual text, so look for match to the local language
-- choose the shortest 'short name' in that language
for k, v in pairs(prop1813) do
if v.mainsnak.datavalue.value.language == langcode then
local name = v.mainsnak.datavalue.value.text
if (not shortname) or (#name < #shortname) then
shortname = name
end
end
end
-- add the shortname if one is found, fallback to the label
-- but skip it if it's "USA"
if shortname ~= "USA" then
out[#out+1] = shortname or labelOrId(qid)
else
if skip then out[#out+1] = "US" end
end
else
-- no shortname, so just add the label
local loc = labelOrId(qid)
-- exceptions go here:
if loc == "United States of America" then
out[#out+1] = "United States"
else
out[#out+1] = loc
end
end
finished = true
end
count = count + 1
until finished or count >= 10 -- limit to 10 levels to avoid infinite loops
-- remove the first location if not required
if not first then table.remove(out, 1) end
-- we might have duplicate text for consecutive locations, so remove them
if #out > 2 then
local plain = {}
for i, v in ipairs(out) do
-- strip any links
plain[i] = v:gsub("^%[%[[^|]*|", ""):gsub("]]$", "")
end
local idx = 2
repeat
if plain[idx] == plain[idx-1] then
-- duplicate found
local removeidx = 0
if (plain[idx] ~= out[idx]) and (plain[idx-1] == out[idx-1]) then
-- only second one is linked, so drop the first
removeidx = idx - 1
elseif (plain[idx] == out[idx]) and (plain[idx-1] ~= out[idx-1]) then
-- only first one is linked, so drop the second
removeidx = idx
else
-- pick one
removeidx = idx - (os.time()%2)
end
table.remove(out, removeidx)
table.remove(plain, removeidx)
else
idx = idx +1
end
until idx >= #out
end
return out
end
-------------------------------------------------------------------------------
-- _getsumofparts scans the property 'has part' (P527) for values matching a list.
-- The list (args.vlist) consists of a string of Qids separated by spaces or any usual punctuation.
-- If the matched values have a qualifer 'quantity' (P1114), those quantites are summed.
-- The sum is returned as a number (i.e. 0 if none)
-- a table of arguments is supplied implementing the usual parameters.
-------------------------------------------------------------------------------
-- Dependencies: setRanks; parseParam; parseInput; sourced; assembleoutput;
-------------------------------------------------------------------------------
local _getsumofparts = function(args)
local vallist = (args.vlist or ""):upper()
if vallist == "" then return end
args.reqranks = setRanks(args.rank)
local f = {}
f.args = args
local qid, props = parseInput(f, "", "P527")
if not qid then return 0 end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local sum = 0
for k1, v1 in ipairs(props) do
if (onlysrc == false or sourced(v1))
and v1.mainsnak.snaktype == "value"
and v1.mainsnak.datavalue.type == "wikibase-entityid"
and vallist:match( v1.mainsnak.datavalue.value.id )
and v1.qualifiers
then
local quals = v1.qualifiers["P1114"]
if quals then
for k2, v2 in ipairs(quals) do
sum = sum + v2.datavalue.value.amount
end
end
end
end
return sum
end
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Public functions
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- _getValue makes the functionality of getValue available to other modules
-------------------------------------------------------------------------------
-- Dependencies: setRanks; parseInput; propertyvalueandquals; assembleoutput; parseParam; sourced;
-- labelOrId; i18n.latestdatequalifier; format_Date; makeOrdinal; roundto; decimalPrecision; decimalToDMS;
-------------------------------------------------------------------------------
p._getValue = function(args)
-- parameter sets for commonly used groups of parameters
local paraset = tonumber(args.ps or args.parameterset or 0)
if paraset == 1 then
-- a common setting, not usable in infoboxes because the 2018 RFC requires sources
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
elseif paraset == 2 then
-- equivalent to raw, not usable in infoboxes because the 2018 RFC requires sources
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
args.linked = "no"
args.pd = "true"
elseif paraset == 3 then
-- parameterset 1, but usable in infoboxes because the 2018 RFC requires sources
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "yes"
args.noicon = "true"
end
-- implement eid parameter
local eid = args.eid
if eid == "" then
return nil
elseif eid then
args.qid = eid
end
local propertyID = mw.text.trim(args[1] or "")
args.reqranks = setRanks(args.rank)
-- replacetext (rt) is a string that is returned instead of any non-empty Wikidata value
-- this is useful for tracking and debugging, so we set fetchwikidata=ALL to fill the whitelist
local replacetext = mw.text.trim(args.rt or args.replacetext or "")
if replacetext ~= "" then
args.fetchwikidata = "ALL"
end
local f = {}
f.args = args
local entityid, props = parseInput(f, f.args[2], propertyID)
if not entityid then
return props -- either the input parameter or nothing
end
-- qual is a string containing the property ID of the qualifier(s) to be returned
-- if qual == "ALL" then all qualifiers returned
-- if qual == "DATES" then qualifiers P580 (start time) and P582 (end time) returned
-- if nothing or an empty string is passed set it nil -> no qualifiers returned
local qualID = mw.text.trim(args.qual or ""):upper()
if qualID == "" then qualID = nil end
-- set a language object and code in the args table
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- table 'out' stores the return value(s):
local out = propertyvalueandquals(props, args, qualID)
-- format the table of values and return it as a string:
return assembleoutput(out, args, entityid, propertyID)
end
-------------------------------------------------------------------------------
-- getValue is used to get the value(s) of a property
-- The property ID is passed as the first unnamed parameter and is required.
-- A locally supplied parameter may optionaly be supplied as the second unnamed parameter.
-- The function will now also return qualifiers if parameter qual is supplied
-------------------------------------------------------------------------------
-- Dependencies: _getValue; setRanks; parseInput; propertyvalueandquals; assembleoutput; parseParam; sourced;
-- labelOrId; i18n.latestdatequalifier; format_Date; makeOrdinal; roundto; decimalPrecision; decimalToDMS;
-------------------------------------------------------------------------------
p.getValue = function(frame)
local args= frame.args
if not args[1] then
args = frame:getParent().args
if not args[1] then return i18n.errors["No property supplied"] end
end
return p._getValue(args)
end
-------------------------------------------------------------------------------
-- getPreferredValue is used to get a value,
-- (or a comma separated list of them if multiple values exist).
-- If preferred ranks are set, it will return those values, otherwise values with normal ranks
-- now redundant to getValue with |rank=best
-------------------------------------------------------------------------------
-- Dependencies: p.getValue; setRanks; parseInput; propertyvalueandquals; assembleoutput;
-- parseParam; sourced; labelOrId; i18n.latestdatequalifier; format_Date;
-- makeOrdinal; roundto; decimalPrecision; decimalToDMS;
-------------------------------------------------------------------------------
p.getPreferredValue = function(frame)
frame.args.rank = "best"
return p.getValue(frame)
end
-------------------------------------------------------------------------------
-- getCoords is used to get coordinates for display in an infobox
-- whitelist and blacklist are implemented
-- optional 'display' parameter is allowed, defaults to nil - was "inline, title"
-------------------------------------------------------------------------------
-- Dependencies: setRanks(); parseInput(); decimalPrecision();
-------------------------------------------------------------------------------
p.getCoords = function(frame)
local propertyID = "P625"
-- if there is a 'display' parameter supplied, use it
-- otherwise default to nothing
local disp = frame.args.display or ""
if disp == "" then
disp = nil -- default to not supplying display parameter, was "inline, title"
end
-- there may be a format parameter to switch from deg/min/sec to decimal degrees
-- default is deg/min/sec
-- decimal degrees needs |format = dec
local form = (frame.args.format or ""):lower():sub(1,3)
if form ~= "dec" then
form = "dms"
end
-- just deal with best values
frame.args.reqranks = setRanks("best")
local qid, props = parseInput(frame, frame.args[1], propertyID)
if not qid then
return props -- either local parameter or nothing
else
local dv = props[1].mainsnak.datavalue.value
local lat, long, prec = dv.latitude, dv.longitude, dv.precision
lat = decimalPrecision(lat, prec)
long = decimalPrecision(long, prec)
local lat_long = { lat, long }
lat_long["display"] = disp
lat_long["format"] = form
-- invoke template Coord with the values stored in the table
return frame:expandTemplate{title = 'coord', args = lat_long}
end
end
-------------------------------------------------------------------------------
-- getQualifierValue is used to get a formatted value of a qualifier
--
-- The call needs: a property (the unnamed parameter or 1=)
-- a target value for that property (pval=)
-- a qualifier for that target value (qual=)
-- The usual whitelisting and blacklisting of the property is implemented
-- The boolean onlysourced= parameter can be set to return nothing
-- when the property is unsourced (or only sourced to Wikipedia)
-------------------------------------------------------------------------------
-- Dependencies: parseParam(); setRanks(); parseInput(); sourced();
-- propertyvalueandquals(); assembleoutput();
-- labelOrId(); i18n.latestdatequalifier(); format_Date();
-- findLang(); makeOrdinal(); roundto(); decimalPrecision(); decimalToDMS();
-------------------------------------------------------------------------------
p.getQualifierValue = function(frame)
-- The property ID that will have a qualifier is the first unnamed parameter
local propertyID = mw.text.trim(frame.args[1] or "")
-- The value of the property we want to match whose qualifier value is to be returned
-- is passed in named parameter |pval=
local propvalue = frame.args.pval
-- The property ID of the qualifier
-- whose value is to be returned is passed in named parameter |qual=
local qualifierID = frame.args.qual
-- A filter can be set like this: filter=P642==Q22674854
local filter, fprop, fval
local ftable = mw.text.split(frame.args.filter or "", "==")
if ftable[2] then
fprop = mw.text.trim(ftable[1])
fval = mw.text.trim(ftable[2])
filter = true
end
-- onlysourced is a boolean passed to return qualifiers
-- only when property values are sourced to something other than Wikipedia
-- if nothing or an empty string is passed set it true
-- if "false" or "no" or 0 is passed set it false
local onlysrc = parseParam(frame.args.onlysourced or frame.args.osd, true)
-- set a language object and language code in the frame.args table
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
-- set the requested ranks flags
frame.args.reqranks = setRanks(frame.args.rank)
-- check for locally supplied parameter in second unnamed parameter
-- success means no local parameter and the property exists
local qid, props = parseInput(frame, frame.args[2], propertyID)
if qid then
local out = {}
-- Scan through the values of the property
-- we want something like property is P793, significant event (in propertyID)
-- whose value is something like Q385378, construction (in propvalue)
-- then we can return the value(s) of a qualifier such as P580, start time (in qualifierID)
for k1, v1 in pairs(props) do
if v1.mainsnak.snaktype == "value" and v1.mainsnak.datavalue.type == "wikibase-entityid" then
-- It's a wiki-linked value, so check if it's the target (in propvalue) and if it has qualifiers
if v1.mainsnak.datavalue.value.id == propvalue and v1.qualifiers then
if onlysrc == false or sourced(v1) then
-- if we've got this far, we have a (sourced) claim with qualifiers
-- which matches the target, so apply the filter and find the value(s) of the qualifier we want
if not filter or (v1.qualifiers[fprop] and v1.qualifiers[fprop][1].datavalue.value.id == fval) then
local quals = v1.qualifiers[qualifierID]
if quals then
-- can't reference qualifer, so set onlysourced = "no" (args are strings, not boolean)
local qargs = frame.args
qargs.onlysourced = "no"
local vals = propertyvalueandquals(quals, qargs, qid)
for k, v in ipairs(vals) do
out[#out + 1] = v
end
end
end
end -- of check for sourced
end -- of check for matching required value and has qualifiers
end -- of check for wikibase entity
end -- of loop through values of propertyID
return assembleoutput(out, frame.args, qid, propertyID)
else
return props -- either local parameter or nothing
end -- of test for success
return nil
end
-------------------------------------------------------------------------------
-- getSumOfParts scans the property 'has part' (P527) for values matching a list.
-- The list is passed in parameter vlist.
-- It consists of a string of Qids separated by spaces or any usual punctuation.
-- If the matched values have a qualifier 'quantity' (P1114), those quantities are summed.
-- The sum is returned as a number or nothing if zero.
-------------------------------------------------------------------------------
-- Dependencies: _getsumofparts;
-------------------------------------------------------------------------------
p.getSumOfParts = function(frame)
local sum = _getsumofparts(frame.args)
if sum == 0 then return end
return sum
end
-------------------------------------------------------------------------------
-- getValueByQual gets the value of a property which has a qualifier with a given entity value
-- The call needs:
-- a property ID (the unnamed parameter or 1=Pxxx)
-- the ID of a qualifier for that property (qualID=Pyyy)
-- either the Wikibase-entity ID of a value for that qualifier (qvalue=Qzzz)
-- or a string value for that qualifier (qvalue=abc123)
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: _getvaluebyqual; parseParam; setRanks; parseInput; sourced;
-- assembleoutput;
-------------------------------------------------------------------------------
p.getValueByQual = function(frame)
local qualID = frame.args.qualID
-- The Q-id of the value for the qualifier we want to match is in named parameter |qvalue=
local qval = frame.args.qvalue or ""
if qval == "" then return "no qualifier value supplied" end
local function checkQID(id)
return id == qval
end
return _getvaluebyqual(frame, qualID, checkQID)
end
-------------------------------------------------------------------------------
-- getValueByLang gets the value of a property which has a qualifier P407
-- ("language of work or name") whose value has the given language code
-- The call needs:
-- a property ID (the unnamed parameter or 1=Pxxx)
-- the MediaWiki language code to match the language (lang=xx[-yy])
-- (if no code is supplied, it uses the default language)
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: _getvaluebyqual; parseParam; setRanks; parseInput; sourced; assembleoutput;
-------------------------------------------------------------------------------
p.getValueByLang = function(frame)
-- The language code for the qualifier we want to match is in named parameter |lang=
local langcode = findLang(frame.args.lang).code
local function checkLanguage(id)
-- id should represent a language like "British English (Q7979)"
-- it should have string property "Wikimedia language code (P424)"
-- qlcode will be a table:
local qlcode = mw.wikibase.getBestStatements(id, "P424")
if (#qlcode > 0) and (qlcode[1].mainsnak.datavalue.value == langcode) then
return true
end
end
return _getvaluebyqual(frame, "P407", checkLanguage)
end
-------------------------------------------------------------------------------
-- getValueByRefSource gets the value of a property which has a reference "stated in" (P248)
-- whose value has the given entity-ID.
-- The call needs:
-- a property ID (the unnamed parameter or 1=Pxxx)
-- the entity ID of a value to match where the reference is stated in (match=Qzzz)
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getValueByRefSource = function(frame)
-- The property ID that we want to check is the first unnamed parameter
local propertyID = mw.text.trim(frame.args[1] or ""):upper()
if propertyID == "" then return "no property supplied" end
-- The Q-id of the value we want to match is in named parameter |qvalue=
local qval = (frame.args.match or ""):upper()
if qval == "" then qval = "Q21540096" end
local unit = (frame.args.unit or ""):upper()
if unit == "" then unit = "Q4917" end
local onlysrc = parseParam(frame.args.onlysourced or frame.args.osd, true)
-- set the requested ranks flags
frame.args.reqranks = setRanks(frame.args.rank)
-- set a language object and code in the frame.args table
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local linked = parseParam(frame.args.linked, true)
local uabbr = parseParam(frame.args.uabbr or frame.args.unitabbr, false)
-- qid not nil means no local parameter and the property exists
local qid, props = parseInput(frame, frame.args[2], propertyID)
if qid then
local out = {}
local mlt= {}
for k1, v1 in ipairs(props) do
if onlysrc == false or sourced(v1) then
if v1.references then
for k2, v2 in ipairs(v1.references) do
if v2.snaks.P248 then
for k3, v3 in ipairs(v2.snaks.P248) do
if v3.datavalue.value.id == qval then
out[#out+1], mlt[#out+1] = rendersnak(v1, frame.args, linked, "", "", "", "", uabbr, unit)
if not mlt[#out] then
-- we only need one match per property value
-- unless datatype was monolingual text
break
end
end -- of test for match
end -- of loop through values "stated in"
end -- of test that "stated in" exists
end -- of loop through references
end -- of test that references exist
end -- of test for sourced
end -- of loop through values of propertyID
if #mlt > 0 then
local langcode = frame.args.lang
langcode = mw.text.split( langcode, '-', true )[1]
local fbtbl = mw.language.getFallbacksFor( langcode )
table.insert( fbtbl, 1, langcode )
local bestval = ""
local found = false
for idx1, lang1 in ipairs(fbtbl) do
for idx2, lang2 in ipairs(mlt) do
if (lang1 == lang2) and not found then
bestval = out[idx2]
found = true
break
end
end -- loop through values of property
end -- loop through fallback languages
if found then
-- replace output table with a table containing the best value
out = { bestval }
else
-- more than one value and none of them on the list of fallback languages
-- sod it, just give them the first one
out = { out[1] }
end
end
return assembleoutput(out, frame.args, qid, propertyID)
else
return props -- no property or local parameter supplied
end -- of test for success
end
-------------------------------------------------------------------------------
-- getPropertyIDs takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- It returns the Entity-IDs (Qids) of the values of a property if it is a Wikibase-Entity.
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p._getPropertyIDs = function(args)
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- change default for noicon to true
args.noicon = tostring(parseParam(args.noicon or "", true))
local f = {}
f.args = args
local pid = mw.text.trim(args[1] or ""):upper()
-- get the qid and table of claims for the property, or nothing and the local value passed
local qid, props = parseInput(f, args[2], pid)
if not qid then return props end
if not props[1] then return nil end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local out = {}
for i, v in ipairs(props) do
local snak = v.mainsnak
if ( snak.datatype == "wikibase-item" )
and ( v.rank and args.reqranks[v.rank:sub(1, 1)] )
and ( snak.snaktype == "value" )
and ( sourced(v) or not onlysrc )
then
out[#out+1] = snak.datavalue.value.id
end
if maxvals > 0 and #out >= maxvals then break end
end
return assembleoutput(out, args, qid, pid)
end
p.getPropertyIDs = function(frame)
local args = frame.args
return p._getPropertyIDs(args)
end
-------------------------------------------------------------------------------
-- getQualifierIDs takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- It takes a property-id as the first unnamed parameter, and an optional parameter qlist
-- which is a list of qualifier property-ids to search for (default is "ALL")
-- It returns the Entity-IDs (Qids) of the values of a property if it is a Wikibase-Entity.
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getQualifierIDs = function(frame)
local args = frame.args
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
-- change default for noicon to true
args.noicon = tostring(parseParam(args.noicon or "", true))
local f = {}
f.args = args
local pid = mw.text.trim(args[1] or ""):upper()
-- get the qid and table of claims for the property, or nothing and the local value passed
local qid, props = parseInput(f, args[2], pid)
if not qid then return props end
if not props[1] then return nil end
-- get the other parameters
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qlist = args.qlist or ""
if qlist == "" then qlist = "ALL" end
qlist = qlist:gsub("[%p%s]+", " ") .. " "
local out = {}
for i, v in ipairs(props) do
local snak = v.mainsnak
if ( v.rank and args.reqranks[v.rank:sub(1, 1)] )
and ( snak.snaktype == "value" )
and ( sourced(v) or not onlysrc )
then
if v.qualifiers then
for k1, v1 in pairs(v.qualifiers) do
if qlist == "ALL " or qlist:match(k1 .. " ") then
for i2, v2 in ipairs(v1) do
if v2.datatype == "wikibase-item" and v2.snaktype == "value" then
out[#out+1] = v2.datavalue.value.id
end -- of test that id exists
end -- of loop through qualifier values
end -- of test for kq in qlist
end -- of loop through qualifiers
end -- of test for qualifiers
end -- of test for rank value, sourced, and value exists
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through property values
return assembleoutput(out, args, qid, pid)
end
-------------------------------------------------------------------------------
-- getPropOfProp takes two propertyIDs: prop1 and prop2 (as well as the usual parameters)
-- If the value(s) of prop1 are of type "wikibase-item" then it returns the value(s) of prop2
-- of each of those wikibase-items.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p._getPropOfProp = function(args)
-- parameter sets for commonly used groups of parameters
local paraset = tonumber(args.ps or args.parameterset or 0)
if paraset == 1 then
-- a common setting
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
elseif paraset == 2 then
-- equivalent to raw
args.rank = "best"
args.fetchwikidata = "ALL"
args.onlysourced = "no"
args.noicon = "true"
args.linked = "no"
args.pd = "true"
elseif paraset == 3 then
-- third set goes here
end
args.reqranks = setRanks(args.rank)
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
local pid1 = args.prop1 or args.pid1 or ""
local pid2 = args.prop2 or args.pid2 or ""
if pid1 == "" or pid2 == "" then return nil end
local f = {}
f.args = args
local qid1, statements1 = parseInput(f, args[1], pid1)
-- parseInput nulls empty args[1] and returns args[1] if nothing on Wikidata
if not qid1 then return statements1 end
-- otherwise it returns the qid and a table for the statement
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qualID = mw.text.trim(args.qual or ""):upper()
if qualID == "" then qualID = nil end
local out = {}
for k, v in ipairs(statements1) do
if not onlysrc or sourced(v) then
local snak = v.mainsnak
if snak.datatype == "wikibase-item" and snak.snaktype == "value" then
local qid2 = snak.datavalue.value.id
local statements2 = {}
if args.reqranks.b then
statements2 = mw.wikibase.getBestStatements(qid2, pid2)
else
statements2 = mw.wikibase.getAllStatements(qid2, pid2)
end
if statements2[1] then
local out2 = propertyvalueandquals(statements2, args, qualID)
out[#out+1] = assembleoutput(out2, args, qid2, pid2)
end
end -- of test for valid property1 value
end -- of test for sourced
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through values of property1
return assembleoutput(out, args, qid1, pid1)
end
p.getPropOfProp = function(frame)
local args= frame.args
if not args.prop1 and not args.pid1 then
args = frame:getParent().args
if not args.prop1 and not args.pid1 then return i18n.errors["No property supplied"] end
end
return p._getPropOfProp(args)
end
-------------------------------------------------------------------------------
-- getAwardCat takes most of the usual parameters. If the item has values of P166 (award received),
-- then it examines each of those awards for P2517 (category for recipients of this award).
-- If it exists, it returns the corresponding category,
-- with the item's P734 (family name) as sort key, or no sort key if there is no family name.
-- The sort key may be overridden by the parameter |sortkey (alias |sk).
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getAwardCat = function(frame)
frame.args.reqranks = setRanks(frame.args.rank)
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local args = frame.args
args.sep = " "
local pid1 = args.prop1 or "P166"
local pid2 = args.prop2 or "P2517"
if pid1 == "" or pid2 == "" then return nil end
-- locally supplied value:
local localval = mw.text.trim(args[1] or "")
local qid1, statements1 = parseInput(frame, localval, pid1)
if not qid1 then return localval end
-- linkprefix (strip quotes)
local lp = (args.linkprefix or args.lp or ""):gsub('"', '')
-- sort key (strip quotes, hyphens and periods):
local sk = (args.sortkey or args.sk or ""):gsub('["-.]', '')
-- family name:
local famname = ""
if sk == "" then
local p734 = mw.wikibase.getBestStatements(qid1, "P734")[1]
local p734id = p734 and p734.mainsnak.snaktype == "value" and p734.mainsnak.datavalue.value.id or ""
famname = mw.wikibase.getSitelink(p734id) or ""
-- strip namespace and disambigation
local pos = famname:find(":") or 0
famname = famname:sub(pos+1):gsub("%s%(.+%)$", "")
if famname == "" then
local lbl = mw.wikibase.getLabel(p734id)
famname = lbl and mw.text.nowiki(lbl) or ""
end
end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
local qualID = mw.text.trim(args.qual or ""):upper()
if qualID == "" then qualID = nil end
local out = {}
for k, v in ipairs(statements1) do
if not onlysrc or sourced(v) then
local snak = v.mainsnak
if snak.datatype == "wikibase-item" and snak.snaktype == "value" then
local qid2 = snak.datavalue.value.id
local statements2 = {}
if args.reqranks.b then
statements2 = mw.wikibase.getBestStatements(qid2, pid2)
else
statements2 = mw.wikibase.getAllStatements(qid2, pid2)
end
if statements2[1] and statements2[1].mainsnak.snaktype == "value" then
local qid3 = statements2[1].mainsnak.datavalue.value.id
local sitelink = mw.wikibase.getSitelink(qid3)
-- if there's no local sitelink, create the sitelink from English label
if not sitelink then
local lbl = mw.wikibase.getLabelByLang(qid3, "en")
if lbl then
if lbl:sub(1,9) == "Category:" then
sitelink = mw.text.nowiki(lbl)
else
sitelink = "Category:" .. mw.text.nowiki(lbl)
end
end
end
if sitelink then
if sk ~= "" then
out[#out+1] = "[[" .. lp .. sitelink .. "|" .. sk .. "]]"
elseif famname ~= "" then
out[#out+1] = "[[" .. lp .. sitelink .. "|" .. famname .. "]]"
else
out[#out+1] = "[[" .. lp .. sitelink .. "]]"
end -- of check for sort keys
end -- of test for sitelink
end -- of test for category
end -- of test for wikibase item has a value
end -- of test for sourced
if maxvals > 0 and #out >= maxvals then break end
end -- of loop through values of property1
return assembleoutput(out, args, qid1, pid1)
end
-------------------------------------------------------------------------------
-- getIntersectCat takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented
-- It takes two properties, |prop1 and |prop2 (e.g. occupation and country of citizenship)
-- Each property's value is a wiki-base entity
-- For each value of the first parameter (ranks implemented) it fetches the value's main category
-- and then each value of the second parameter (possibly substituting a simpler description)
-- then it returns all of the categories representing the intersection of those properties,
-- (e.g. Category:Actors from Canada). A joining term may be supplied (e.g. |join=from).
-- The item's P734 (family name) is the sort key, or no sort key if there is no family name.
-- The sort key may be overridden by the parameter |sortkey (alias |sk).
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced; propertyvalueandquals assembleoutput;
-------------------------------------------------------------------------------
p.getIntersectCat = function(frame)
frame.args.reqranks = setRanks(frame.args.rank)
frame.args.langobj = findLang(frame.args.lang)
frame.args.lang = frame.args.langobj.code
local args = frame.args
args.sep = " "
args.linked = "no"
local pid1 = args.prop1 or "P106"
local pid2 = args.prop2 or "P27"
if pid1 == "" or pid2 == "" then return nil end
local qid, statements1 = parseInput(frame, "", pid1)
if not qid then return nil end
local qid, statements2 = parseInput(frame, "", pid2)
if not qid then return nil end
-- topics like countries may have different names in categories from their label in Wikidata
local subs_exists, subs = pcall(mw.loadData, "Module:WikidataIB/subs")
local join = args.join or ""
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local maxvals = tonumber(args.maxvals) or 0
-- linkprefix (strip quotes)
local lp = (args.linkprefix or args.lp or ""):gsub('"', '')
-- sort key (strip quotes, hyphens and periods):
local sk = (args.sortkey or args.sk or ""):gsub('["-.]', '')
-- family name:
local famname = ""
if sk == "" then
local p734 = mw.wikibase.getBestStatements(qid, "P734")[1]
local p734id = p734 and p734.mainsnak.snaktype == "value" and p734.mainsnak.datavalue.value.id or ""
famname = mw.wikibase.getSitelink(p734id) or ""
-- strip namespace and disambigation
local pos = famname:find(":") or 0
famname = famname:sub(pos+1):gsub("%s%(.+%)$", "")
if famname == "" then
local lbl = mw.wikibase.getLabel(p734id)
famname = lbl and mw.text.nowiki(lbl) or ""
end
end
local cat1 = {}
for k, v in ipairs(statements1) do
if not onlysrc or sourced(v) then
-- get the ID representing the value of the property
local pvalID = (v.mainsnak.snaktype == "value") and v.mainsnak.datavalue.value.id
if pvalID then
-- get the topic's main category (P910) for that entity
local p910 = mw.wikibase.getBestStatements(pvalID, "P910")[1]
if p910 and p910.mainsnak.snaktype == "value" then
local tmcID = p910.mainsnak.datavalue.value.id
-- use sitelink or the English label for the cat
local cat = mw.wikibase.getSitelink(tmcID)
if not cat then
local lbl = mw.wikibase.getLabelByLang(tmcID, "en")
if lbl then
if lbl:sub(1,9) == "Category:" then
cat = mw.text.nowiki(lbl)
else
cat = "Category:" .. mw.text.nowiki(lbl)
end
end
end
cat1[#cat1+1] = cat
end -- of test for topic's main category exists
end -- of test for property has vaild value
end -- of test for sourced
if maxvals > 0 and #cat1 >= maxvals then break end
end
local cat2 = {}
for k, v in ipairs(statements2) do
if not onlysrc or sourced(v) then
local cat = rendersnak(v, args)
if subs[cat] then cat = subs[cat] end
cat2[#cat2+1] = cat
end
if maxvals > 0 and #cat2 >= maxvals then break end
end
local out = {}
for k1, v1 in ipairs(cat1) do
for k2, v2 in ipairs(cat2) do
if sk ~= "" then
out[#out+1] = "[[" .. lp .. v1 .. " " .. join .. " " .. v2 .. "|" .. sk .. "]]"
elseif famname ~= "" then
out[#out+1] = "[[" .. lp .. v1 .. " " .. join .. " " .. v2 .. "|" .. famname .. "]]"
else
out[#out+1] = "[[" .. lp .. v1 .. " " .. join .. " " .. v2 .. "]]"
end -- of check for sort keys
end
end
args.noicon = "true"
return assembleoutput(out, args, qid, pid1)
end
-------------------------------------------------------------------------------
-- qualsToTable takes most of the usual parameters.
-- The usual whitelisting, blacklisting, onlysourced, etc. are implemented.
-- A qid may be given, and the first unnamed parameter is the property ID, which is of type wikibase item.
-- It takes a list of qualifier property IDs as |quals=
-- For a given qid and property, it creates the rows of an html table,
-- each row being a value of the property (optionally only if the property matches the value in |pval= )
-- each cell being the first value of the qualifier corresponding to the list in |quals
-------------------------------------------------------------------------------
-- Dependencies: parseParam; setRanks; parseInput; sourced;
-------------------------------------------------------------------------------
p.qualsToTable = function(frame)
local args = frame.args
local quals = args.quals or ""
if quals == "" then return "" end
args.reqranks = setRanks(args.rank)
local propertyID = mw.text.trim(args[1] or "")
local f = {}
f.args = args
local entityid, props = parseInput(f, "", propertyID)
if not entityid then return "" end
args.langobj = findLang(args.lang)
args.lang = args.langobj.code
local pval = args.pval or ""
local qplist = mw.text.split(quals, "%p") -- split at punctuation and make a sequential table
for i, v in ipairs(qplist) do
qplist[i] = mw.text.trim(v):upper() -- remove whitespace and capitalise
end
local col1 = args.firstcol or ""
if col1 ~= "" then
col1 = col1 .. "</td><td>"
end
local emptycell = args.emptycell or " "
-- construct a 2-D array of qualifier values in qvals
local qvals = {}
for i, v in ipairs(props) do
local skip = false
if pval ~= "" then
local pid = v.mainsnak.datavalue and v.mainsnak.datavalue.value.id
if pid ~= pval then skip = true end
end
if not skip then
local qval = {}
local vqualifiers = v.qualifiers or {}
-- go through list of wanted qualifier properties
for i1, v1 in ipairs(qplist) do
-- check for that property ID in the statement's qualifiers
local qv, qtype
if vqualifiers[v1] then
qtype = vqualifiers[v1][1].datatype
if qtype == "time" then
if vqualifiers[v1][1].snaktype == "value" then
qv = mw.wikibase.renderSnak(vqualifiers[v1][1])
qv = frame:expandTemplate{title="dts", args={qv}}
else
qv = "?"
end
elseif qtype == "url" then
if vqualifiers[v1][1].snaktype == "value" then
qv = mw.wikibase.renderSnak(vqualifiers[v1][1])
local display = mw.ustring.match( mw.uri.decode(qv, "WIKI"), "([%w ]+)$" )
if display then
qv = "[" .. qv .. " " .. display .. "]"
end
end
else
qv = mw.wikibase.formatValue(vqualifiers[v1][1])
end
end
-- record either the value or a placeholder
qval[i1] = qv or emptycell
end -- of loop through list of qualifiers
-- add the list of qualifier values as a "row" in the main list
qvals[#qvals+1] = qval
end
end -- of for each value loop
local out = {}
for i, v in ipairs(qvals) do
out[i] = "<tr><td>" .. col1 .. table.concat(qvals[i], "</td><td>") .. "</td></tr>"
end
return table.concat(out, "\n")
end
-------------------------------------------------------------------------------
-- getGlobe takes an optional qid of a Wikidata entity passed as |qid=
-- otherwise it uses the linked item for the current page.
-- If returns the Qid of the globe used in P625 (coordinate location),
-- or nil if there isn't one.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getGlobe = function(frame)
local qid = frame.args.qid or frame.args[1] or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
local coords = mw.wikibase.getBestStatements(qid, "P625")[1]
local globeid
if coords and coords.mainsnak.snaktype == "value" then
globeid = coords.mainsnak.datavalue.value.globe:match("(Q%d+)")
end
return globeid
end
-------------------------------------------------------------------------------
-- getCommonsLink takes an optional qid of a Wikidata entity passed as |qid=
-- It returns one of the following in order of preference:
-- the Commons sitelink of the linked Wikidata item;
-- the Commons sitelink of the topic's main category of the linked Wikidata item;
-------------------------------------------------------------------------------
-- Dependencies: _getCommonslink(); _getSitelink(); parseParam()
-------------------------------------------------------------------------------
p.getCommonsLink = function(frame)
local oc = frame.args.onlycat or frame.args.onlycategories
local fb = parseParam(frame.args.fallback or frame.args.fb, true)
return _getCommonslink(frame.args.qid, oc, fb)
end
-------------------------------------------------------------------------------
-- getSitelink takes the qid of a Wikidata entity passed as |qid=
-- It takes an optional parameter |wiki= to determine which wiki is to be checked for a sitelink
-- If the parameter is blank, then it uses the local wiki.
-- If there is a sitelink to an article available, it returns the plain text link to the article
-- If there is no sitelink, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getSiteLink = function(frame)
return _getSitelink(frame.args.qid, frame.args.wiki or mw.text.trim(frame.args[1] or ""))
end
-------------------------------------------------------------------------------
-- getLink has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- If there is a sitelink to an article on the local Wiki, it returns a link to the article
-- with the Wikidata label as the displayed text.
-- If there is no sitelink, it returns the label as plain text.
-- If there is no label in the local language, it displays the qid instead.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getLink = function(frame)
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
local sitelink = mw.wikibase.getSitelink(itemID)
local label = labelOrId(itemID)
if sitelink then
return "[[:" .. sitelink .. "|" .. label .. "]]"
else
return label
end
end
-------------------------------------------------------------------------------
-- getLabel has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- It returns the Wikidata label for the local language as plain text.
-- If there is no label in the local language, it displays the qid instead.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getLabel = function(frame)
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
local lang = frame.args.lang or ""
if lang == "" then lang = nil end
local label = labelOrId(itemID, lang)
return label
end
-------------------------------------------------------------------------------
-- label has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- if no qid is supplied, it uses the qid associated with the current page.
-- It returns the Wikidata label for the local language as plain text.
-- If there is no label in the local language, it returns nil.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.label = function(frame)
local qid = mw.text.trim(frame.args[1] or frame.args.qid or "")
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return end
local lang = frame.args.lang or ""
if lang == "" then lang = nil end
local label, success = labelOrId(qid, lang)
if success then return label end
end
-------------------------------------------------------------------------------
-- getAT (Article Title)
-- has the qid of a Wikidata entity passed as the first unnamed parameter or as |qid=
-- If there is a sitelink to an article on the local Wiki, it returns the sitelink as plain text.
-- If there is no sitelink or qid supplied, it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAT = function(frame)
local itemID = mw.text.trim(frame.args[1] or frame.args.qid or "")
if itemID == "" then return end
return mw.wikibase.getSitelink(itemID)
end
-------------------------------------------------------------------------------
-- getDescription has the qid of a Wikidata entity passed as |qid=
-- (it defaults to the associated qid of the current article if omitted)
-- and a local parameter passed as the first unnamed parameter.
-- Any local parameter passed (other than "Wikidata" or "none") becomes the return value.
-- It returns the article description for the Wikidata entity if the local parameter is "Wikidata".
-- Nothing is returned if the description doesn't exist or "none" is passed as the local parameter.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getDescription = function(frame)
local desc = mw.text.trim(frame.args[1] or "")
local itemID = mw.text.trim(frame.args.qid or "")
if itemID == "" then itemID = nil end
if desc:lower() == 'wikidata' then
return mw.wikibase.getDescription(itemID)
elseif desc:lower() == 'none' then
return nil
else
return desc
end
end
-------------------------------------------------------------------------------
-- getAliases has the qid of a Wikidata entity passed as |qid=
-- (it defaults to the associated qid of the current article if omitted)
-- and a local parameter passed as the first unnamed parameter.
-- It implements blacklisting and whitelisting with a field name of "alias" by default.
-- Any local parameter passed becomes the return value.
-- Otherwise it returns the aliases for the Wikidata entity with the usual list options.
-- Nothing is returned if the aliases do not exist.
-------------------------------------------------------------------------------
-- Dependencies: findLang(); assembleoutput()
-------------------------------------------------------------------------------
p.getAliases = function(frame)
local args = frame.args
local fieldname = args.name or ""
if fieldname == "" then fieldname = "alias" end
local blacklist = args.suppressfields or args.spf or ""
if blacklist:find(fieldname) then return nil end
local localval = mw.text.trim(args[1] or "")
if localval ~= "" then return localval end
local whitelist = args.fetchwikidata or args.fwd or ""
if whitelist == "" then whitelist = "NONE" end
if not (whitelist == 'ALL' or whitelist:find(fieldname)) then return nil end
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return nil end
local aliases = mw.wikibase.getEntity(qid).aliases
if not aliases then return nil end
args.langobj = findLang(args.lang)
local langcode = args.langobj.code
args.lang = langcode
local out = {}
for k1, v1 in pairs(aliases) do
if v1[1].language == langcode then
for k1, v2 in ipairs(v1) do
out[#out+1] = v2.value
end
break
end
end
return assembleoutput(out, args, qid)
end
-------------------------------------------------------------------------------
-- pageId returns the page id (entity ID, Qnnn) of the current page
-- returns nothing if the page is not connected to Wikidata
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.pageId = function(frame)
return mw.wikibase.getEntityIdForCurrentPage()
end
-------------------------------------------------------------------------------
-- formatDate is a wrapper to export the private function format_Date
-------------------------------------------------------------------------------
-- Dependencies: format_Date();
-------------------------------------------------------------------------------
p.formatDate = function(frame)
return format_Date(frame.args[1], frame.args.df, frame.args.bc)
end
-------------------------------------------------------------------------------
-- location is a wrapper to export the private function _location
-- it takes the entity-id as qid or the first unnamed parameter
-- optional boolean parameter first toggles the display of the first item
-- optional boolean parameter skip toggles the display to skip to the last item
-- parameter debug=<y/n> (default 'n') adds error msg if not a location
-------------------------------------------------------------------------------
-- Dependencies: _location();
-------------------------------------------------------------------------------
p.location = function(frame)
local debug = (frame.args.debug or ""):sub(1, 1):lower()
if debug == "" then debug = "n" end
local qid = mw.text.trim(frame.args.qid or frame.args[1] or ""):upper()
if qid == "" then qid=mw.wikibase.getEntityIdForCurrentPage() end
if not qid then
if debug ~= "n" then
return i18n.errors["entity-not-found"]
else
return nil
end
end
local first = mw.text.trim(frame.args.first or "")
local skip = mw.text.trim(frame.args.skip or "")
return table.concat( _location(qid, first, skip), ", " )
end
-------------------------------------------------------------------------------
-- checkBlacklist implements a test to check whether a named field is allowed
-- returns true if the field is not blacklisted (i.e. allowed)
-- returns false if the field is blacklisted (i.e. disallowed)
-- {{#if:{{#invoke:WikidataIB |checkBlacklist |name=Joe |suppressfields=Dave; Joe; Fred}} | not blacklisted | blacklisted}}
-- displays "blacklisted"
-- {{#if:{{#invoke:WikidataIB |checkBlacklist |name=Jim |suppressfields=Dave; Joe; Fred}} | not blacklisted | blacklisted}}
-- displays "not blacklisted"
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.checkBlacklist = function(frame)
local blacklist = frame.args.suppressfields or frame.args.spf or ""
local fieldname = frame.args.name or ""
if blacklist ~= "" and fieldname ~= "" then
if blacklist:find(fieldname) then
return false
else
return true
end
else
-- one of the fields is missing: let's call that "not on the list"
return true
end
end
-------------------------------------------------------------------------------
-- emptyor returns nil if its first unnamed argument is just punctuation, whitespace or html tags
-- otherwise it returns the argument unchanged (including leading/trailing space).
-- If the argument may contain "=", then it must be called explicitly:
-- |1=arg
-- (In that case, leading and trailing spaces are trimmed)
-- It finds use in infoboxes where it can replace tests like:
-- {{#if: {{#invoke:WikidatIB |getvalue |P99 |fwd=ALL}} | <span class="xxx">{{#invoke:WikidatIB |getvalue |P99 |fwd=ALL}}</span> | }}
-- with a form that uses just a single call to Wikidata:
-- {{#invoke |WikidataIB |emptyor |1= <span class="xxx">{{#invoke:WikidataIB |getvalue |P99 |fwd=ALL}}</span> }}
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.emptyor = function(frame)
local s = frame.args[1] or ""
if s == "" then return nil end
local sx = s:gsub("%s", ""):gsub("<[^>]*>", ""):gsub("%p", "")
if sx == "" then
return nil
else
return s
end
end
-------------------------------------------------------------------------------
-- labelorid is a public function to expose the output of labelOrId()
-- Pass the Q-number as |qid= or as an unnamed parameter.
-- It returns the Wikidata label for that entity or the qid if no label exists.
-------------------------------------------------------------------------------
-- Dependencies: labelOrId
-------------------------------------------------------------------------------
p.labelorid = function(frame)
return (labelOrId(frame.args.qid or frame.args[1]))
end
-------------------------------------------------------------------------------
-- getLang returns the MediaWiki language code of the current content.
-- If optional parameter |style=full, it returns the language name.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getLang = function(frame)
local style = (frame.args.style or ""):lower()
local langcode = mw.language.getContentLanguage().code
if style == "full" then
return mw.language.fetchLanguageName( langcode )
end
return langcode
end
-------------------------------------------------------------------------------
-- getItemLangCode takes a qid parameter (using the current page's qid if blank)
-- If the item for that qid has property country (P17) it looks at the first preferred value
-- If the country has an official language (P37), it looks at the first preferred value
-- If that official language has a language code (P424), it returns the first preferred value
-- Otherwise it returns nothing.
-------------------------------------------------------------------------------
-- Dependencies: _getItemLangCode()
-------------------------------------------------------------------------------
p.getItemLangCode = function(frame)
return _getItemLangCode(frame.args.qid or frame.args[1])
end
-------------------------------------------------------------------------------
-- findLanguage exports the local findLang() function
-- It takes an optional language code and returns, in order of preference:
-- the code if a known language;
-- the user's language, if set;
-- the server's content language.
-------------------------------------------------------------------------------
-- Dependencies: findLang
-------------------------------------------------------------------------------
p.findLanguage = function(frame)
return findLang(frame.args.lang or frame.args[1]).code
end
-------------------------------------------------------------------------------
-- getQid returns the qid, if supplied
-- failing that, the Wikidata entity ID of the "category's main topic (P301)", if it exists
-- failing that, the Wikidata entity ID associated with the current page, if it exists
-- otherwise, nothing
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getQid = function(frame)
local qid = (frame.args.qid or ""):upper()
-- check if a qid was passed; if so, return it:
if qid ~= "" then return qid end
-- check if there's a "category's main topic (P301)":
qid = mw.wikibase.getEntityIdForCurrentPage()
if qid then
local prop301 = mw.wikibase.getBestStatements(qid, "P301")
if prop301[1] then
local mctid = prop301[1].mainsnak.datavalue.value.id
if mctid then return mctid end
end
end
-- otherwise return the page qid (if any)
return qid
end
-------------------------------------------------------------------------------
-- followQid takes four optional parameters: qid, props, list and all.
-- If qid is not given, it uses the qid for the connected page
-- or returns nil if there isn't one.
-- props is a list of properties, separated by punctuation.
-- If props is given, the Wikidata item for the qid is examined for each property in turn.
-- If that property contains a value that is another Wikibase-item, that item's qid is returned,
-- and the search terminates, unless |all=y when all of the qids are returned, separated by spaces.
-- If |list= is set to a template, the qids are passed as arguments to the template.
-- If props is not given, the qid is returned.
-------------------------------------------------------------------------------
-- Dependencies: parseParam()
-------------------------------------------------------------------------------
p._followQid = function(args)
local qid = (args.qid or ""):upper()
local all = parseParam(args.all, false)
local list = args.list or ""
if list == "" then list = nil end
if qid == "" then
qid = mw.wikibase.getEntityIdForCurrentPage()
end
if not qid then return nil end
local out = {}
local props = (args.props or ""):upper()
if props ~= "" then
for p in mw.text.gsplit(props, "%p") do -- split at punctuation and iterate
p = mw.text.trim(p)
for i, v in ipairs( mw.wikibase.getBestStatements(qid, p) ) do
local linkedid = v.mainsnak.datavalue and v.mainsnak.datavalue.value.id
if linkedid then
if all then
out[#out+1] = linkedid
else
return linkedid
end -- test for all or just the first one found
end -- test for value exists for that property
end -- loop through values of property to follow
end -- loop through list of properties to follow
end
if #out > 0 then
local ret = ""
if list then
ret = mw.getCurrentFrame():expandTemplate{title = list, args = out}
else
ret = table.concat(out, " ")
end
return ret
else
return qid
end
end
p.followQid = function(frame)
return p._followQid(frame.args)
end
-------------------------------------------------------------------------------
-- globalSiteID returns the globalSiteID for the current wiki
-- e.g. returns "enwiki" for the English Wikipedia, "enwikisource" for English Wikisource, etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.globalSiteID = function(frame)
return mw.wikibase.getGlobalSiteId()
end
-------------------------------------------------------------------------------
-- siteID returns the root of the globalSiteID
-- e.g. "en" for "enwiki", "enwikisource", etc.
-- treats "en-gb" as "en", etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.siteID = function(frame)
local txtlang = frame:callParserFunction('int', {'lang'}) or ""
-- This deals with specific exceptions: be-tarask -> be-x-old
if txtlang == "be-tarask" then
return "be_x_old"
end
local pos = txtlang:find("-")
local ret = ""
if pos then
ret = txtlang:sub(1, pos-1)
else
ret = txtlang
end
return ret
end
-------------------------------------------------------------------------------
-- projID returns the code used to link to the reader's language's project
-- e.g "en" for [[:en:WikidataIB]]
-- treats "en-gb" as "en", etc.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.projID = function(frame)
local txtlang = frame:callParserFunction('int', {'lang'}) or ""
-- This deals with specific exceptions: be-tarask -> be-x-old
if txtlang == "be-tarask" then
return "be-x-old"
end
local pos = txtlang:find("-")
local ret = ""
if pos then
ret = txtlang:sub(1, pos-1)
else
ret = txtlang
end
return ret
end
-------------------------------------------------------------------------------
-- formatNumber formats a number according to the the supplied language code ("|lang=")
-- or the default language if not supplied.
-- The number is the first unnamed parameter or "|num="
-------------------------------------------------------------------------------
-- Dependencies: findLang()
-------------------------------------------------------------------------------
p.formatNumber = function(frame)
local lang
local num = tonumber(frame.args[1] or frame.args.num) or 0
lang = findLang(frame.args.lang)
return lang:formatNum( num )
end
-------------------------------------------------------------------------------
-- examine dumps the property (the unnamed parameter or pid)
-- from the item given by the parameter 'qid' (or the other unnamed parameter)
-- or from the item corresponding to the current page if qid is not supplied.
-- e.g. {{#invoke:WikidataIB |examine |pid=P26 |qid=Q42}}
-- or {{#invoke:WikidataIB |examine |P26 |Q42}} or any combination of these
-- or {{#invoke:WikidataIB |examine |P26}} for the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.examine = function( frame )
local args
if frame.args[1] or frame.args.pid or frame.args.qid then
args = frame.args
else
args = frame:getParent().args
end
local par = {}
local pid = (args.pid or ""):upper()
local qid = (args.qid or ""):upper()
par[1] = mw.text.trim( args[1] or "" ):upper()
par[2] = mw.text.trim( args[2] or "" ):upper()
table.sort(par)
if par[2]:sub(1,1) == "P" then par[1], par[2] = par[2], par[1] end
if pid == "" then pid = par[1] end
if qid == "" then qid = par[2] end
local q1 = qid:sub(1,1)
if pid:sub(1,1) ~= "P" then return "No property supplied" end
if q1 ~= "Q" and q1 ~= "M" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return "No item for this page" end
return "<pre>" .. mw.dumpObject( mw.wikibase.getAllStatements( qid, pid ) ) .. "</pre>"
end
-------------------------------------------------------------------------------
-- checkvalue looks for 'val' as a wikibase-item value of a property (the unnamed parameter or pid)
-- from the item given by the parameter 'qid'
-- or from the Wikidata item associated with the current page if qid is not supplied.
-- It only checks ranks that are requested (preferred and normal by default)
-- If property is not supplied, then P31 (instance of) is assumed.
-- It returns val if found or nothing if not found.
-- e.g. {{#invoke:WikidataIB |checkvalue |val=Q5 |pid=P31 |qid=Q42}}
-- or {{#invoke:WikidataIB |checkvalue |val=Q5 |P31 |qid=Q42}}
-- or {{#invoke:WikidataIB |checkvalue |val=Q5 |qid=Q42}}
-- or {{#invoke:WikidataIB |checkvalue |val=Q5 |P31}} for the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.checkvalue = function( frame )
local args
if frame.args.val then
args = frame.args
else
args = frame:getParent().args
end
local val = args.val
if not val then return nil end
local pid = mw.text.trim(args.pid or args[1] or "P31"):upper()
local qid = (args.qid or ""):upper()
if pid:sub(1,1) ~= "P" then return nil end
if qid:sub(1,1) ~= "Q" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
local ranks = setRanks(args.rank)
local stats = {}
if ranks.b then
stats = mw.wikibase.getBestStatements(qid, pid)
else
stats = mw.wikibase.getAllStatements( qid, pid )
end
if not stats[1] then return nil end
if stats[1].mainsnak.datatype == "wikibase-item" then
for k, v in pairs( stats ) do
local ms = v.mainsnak
if ranks[v.rank:sub(1,1)] and ms.snaktype == "value" and ms.datavalue.value.id == val then
return val
end
end
end
return nil
end
-------------------------------------------------------------------------------
-- url2 takes a parameter url= that is a proper url and formats it for use in an infobox.
-- If no parameter is supplied, it returns nothing.
-- This is the equivalent of Template:URL
-- but it keeps the "edit at Wikidata" pen icon out of the microformat.
-- Usually it will take its url parameter directly from a Wikidata call:
-- e.g. {{#invoke:WikidataIB |url2 |url={{wdib |P856 |qid=Q23317 |fwd=ALL |osd=no}} }}
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.url2 = function(frame)
local txt = frame.args.url or ""
if txt == "" then return nil end
-- extract any icon
local url, icon = txt:match("(.+) (.+)")
-- make sure there's at least a space at the end
url = (url or txt) .. " "
icon = icon or ""
-- extract any protocol like https://
local prot = url:match("(https*://).+[ \"\']")
-- extract address
local addr = ""
if prot then
addr = url:match("https*://(.+)[ \"\']") or " "
else
prot = "//"
addr = url:match("[^%p%s]+%.(.+)[ \"\']") or " "
end
-- strip trailing / from end of domain-only url and add <wbr/> before . and /
local disp, n = addr:gsub( "^([^/]+)/$", "%1" ):gsub("%/", "<wbr/>/"):gsub("%.", "<wbr/>.")
return '<span class="url">[' .. prot .. addr .. " " .. disp .. "]</span> " .. icon
end
-------------------------------------------------------------------------------
-- getWebsite fetches the Official website (P856) and formats it for use in an infobox.
-- This is similar to Template:Official website but with a url displayed,
-- and it adds the "edit at Wikidata" pen icon beyond the microformat if enabled.
-- A local value will override the Wikidata value. "NONE" returns nothing.
-- e.g. {{#invoke:WikidataIB |getWebsite |qid= |noicon= |lang= |url= }}
-------------------------------------------------------------------------------
-- Dependencies: findLang(); parseParam();
-------------------------------------------------------------------------------
p.getWebsite = function(frame)
local url = frame.args.url or ""
if url:upper() == "NONE" then return nil end
local urls = {}
local quals = {}
local qid = frame.args.qid or ""
if url and url ~= "" then
urls[1] = url
else
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return nil end
local prop856 = mw.wikibase.getBestStatements(qid, "P856")
for k, v in pairs(prop856) do
if v.mainsnak.snaktype == "value" then
urls[#urls+1] = v.mainsnak.datavalue.value
if v.qualifiers and v.qualifiers["P1065"] then
-- just take the first archive url (P1065)
local au = v.qualifiers["P1065"][1]
if au.snaktype == "value" then
quals[#urls] = au.datavalue.value
end -- test for archive url having a value
end -- test for qualifers
end -- test for website having a value
end -- loop through website(s)
end
if #urls == 0 then return nil end
local out = {}
for i, u in ipairs(urls) do
local link = quals[i] or u
local prot, addr = u:match("(http[s]*://)(.+)")
addr = addr or u
local disp, n = addr:gsub("%.", "<wbr/>%.")
out[#out+1] = '<span class="url">[' .. link .. " " .. disp .. "]</span>"
end
local langcode = findLang(frame.args.lang).code
local noicon = parseParam(frame.args.noicon, false)
if url == "" and not noicon then
out[#out] = out[#out] .. createicon(langcode, qid, "P856")
end
local ret = ""
if #out > 1 then
ret = mw.getCurrentFrame():expandTemplate{title = "ubl", args = out}
else
ret = out[1]
end
return ret
end
-------------------------------------------------------------------------------
-- getAllLabels fetches the set of labels and formats it for display as wikitext.
-- It takes a parameter 'qid' for arbitrary access, otherwise it uses the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAllLabels = function(frame)
local args = frame.args or frame:getParent().args or {}
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return i18n["entity-not-found"] end
local labels = mw.wikibase.getEntity(qid).labels
if not labels then return i18n["labels-not-found"] end
local out = {}
for k, v in pairs(labels) do
out[#out+1] = v.value .. " (" .. v.language .. ")"
end
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- getAllDescriptions fetches the set of descriptions and formats it for display as wikitext.
-- It takes a parameter 'qid' for arbitrary access, otherwise it uses the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAllDescriptions = function(frame)
local args = frame.args or frame:getParent().args or {}
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return i18n["entity-not-found"] end
local descriptions = mw.wikibase.getEntity(qid).descriptions
if not descriptions then return i18n["descriptions-not-found"] end
local out = {}
for k, v in pairs(descriptions) do
out[#out+1] = v.value .. " (" .. v.language .. ")"
end
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- getAllAliases fetches the set of aliases and formats it for display as wikitext.
-- It takes a parameter 'qid' for arbitrary access, otherwise it uses the current page.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.getAllAliases = function(frame)
local args = frame.args or frame:getParent().args or {}
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid or not mw.wikibase.entityExists(qid) then return i18n["entity-not-found"] end
local aliases = mw.wikibase.getEntity(qid).aliases
if not aliases then return i18n["aliases-not-found"] end
local out = {}
for k1, v1 in pairs(aliases) do
local lang = v1[1].language
local val = {}
for k1, v2 in ipairs(v1) do
val[#val+1] = v2.value
end
out[#out+1] = table.concat(val, ", ") .. " (" .. lang .. ")"
end
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- showNoLinks displays the article titles that should not be linked.
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
p.showNoLinks = function(frame)
local out = {}
for k, v in pairs(donotlink) do
out[#out+1] = k
end
table.sort( out )
return table.concat(out, "; ")
end
-------------------------------------------------------------------------------
-- checkValidity checks whether the first unnamed parameter represents a valid entity-id,
-- that is, something like Q1235 or P123.
-- It returns the strings "true" or "false".
-- Change false to nil to return "true" or "" (easier to test with #if:).
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
function p.checkValidity(frame)
local id = mw.text.trim(frame.args[1] or "")
if mw.wikibase.isValidEntityId(id) then
return true
else
return false
end
end
-------------------------------------------------------------------------------
-- getEntityFromTitle returns the Entity-ID (Q-number) for a given title.
-- Modification of Module:ResolveEntityId
-- The title is the first unnamed parameter.
-- The site parameter determines the site/language for the title. Defaults to current wiki.
-- The showdab parameter determines whether dab pages should return the Q-number or nil. Defaults to true.
-- Returns the Q-number or nil if it does not exist.
-------------------------------------------------------------------------------
-- Dependencies: parseParam
-------------------------------------------------------------------------------
function p.getEntityFromTitle(frame)
local args=frame.args
if not args[1] then args=frame:getParent().args end
if not args[1] then return nil end
local title = mw.text.trim(args[1])
local site = args.site or ""
local showdab = parseParam(args.showdab, true)
local qid = mw.wikibase.getEntityIdForTitle(title, site)
if qid then
local prop31 = mw.wikibase.getBestStatements(qid, "P31")[1]
if not showdab and prop31 and prop31.mainsnak.datavalue.value.id == "Q4167410" then
return nil
else
return qid
end
end
end
-------------------------------------------------------------------------------
-- getDatePrecision returns the number representing the precision of the first best date value
-- for the given property.
-- It takes the qid and property ID
-- The meanings are given at https://www.mediawiki.org/wiki/Wikibase/DataModel#Dates_and_times
-- 0 = 1 billion years .. 6 = millennium, 7 = century, 8 = decade, 9 = year, 10 = month, 11 = day
-- Returns 0 (or the second unnamed parameter) if the Wikidata does not exist.
-------------------------------------------------------------------------------
-- Dependencies: parseParam; sourced;
-------------------------------------------------------------------------------
function p.getDatePrecision(frame)
local args=frame.args
if not args[1] then args=frame:getParent().args end
local default = tonumber(args[2] or args.default) or 0
local prop = mw.text.trim(args[1] or "")
if prop == "" then return default end
local qid = args.qid or ""
if qid == "" then qid = mw.wikibase.getEntityIdForCurrentPage() end
if not qid then return default end
local onlysrc = parseParam(args.onlysourced or args.osd, true)
local stat = mw.wikibase.getBestStatements(qid, prop)
for i, v in ipairs(stat) do
local prec = (onlysrc == false or sourced(v))
and v.mainsnak.datavalue
and v.mainsnak.datavalue.value
and v.mainsnak.datavalue.value.precision
if prec then return prec end
end
return default
end
return p
-------------------------------------------------------------------------------
-- List of exported functions
-------------------------------------------------------------------------------
--[[
_getValue
getValue
getPreferredValue
getCoords
getQualifierValue
getSumOfParts
getValueByQual
getValueByLang
getValueByRefSource
getPropertyIDs
getQualifierIDs
getPropOfProp
getAwardCat
getIntersectCat
getGlobe
getCommonsLink
getSiteLink
getLink
getLabel
label
getAT
getDescription
getAliases
pageId
formatDate
location
checkBlacklist
emptyor
labelorid
getLang
getItemLangCode
findLanguage
getQID
followQid
globalSiteID
siteID
projID
formatNumber
examine
checkvalue
url2
getWebsite
getAllLabels
getAllDescriptions
getAllAliases
showNoLinks
checkValidity
getEntityFromTitle
getDatePrecision
--]]
-------------------------------------------------------------------------------
ql7i3j6aywa93pfslfr0svyicj7ctkn
Module:WikidataIB/nolinks
828
2629
33325
2019-01-31T16:27:33Z
en>RexxS
0
add abbreviations UK and USA
33325
Scribunto
text/plain
local p ={}
--[[
The values here are the English sitelinks for items that should not be linked.
These 36 are not definitive and may be altered to suit.
--]]
p.items = {
"Australia",
"Austria",
"Belgium",
"Canada",
"China",
"Denmark",
"England",
"France",
"Germany",
"Greece",
"Hungary",
"Iceland",
"India",
"Republic of Ireland",
"Israel",
"Italy",
"Jamaica",
"Japan",
"Luxembourg",
"Mexico",
"Netherlands",
"New Zealand",
"Northern Ireland",
"Norway",
"Poland",
"Portugal",
"Russia",
"Scotland",
"South Africa",
"Spain",
"Sweden",
"Switzerland",
"Turkey",
"United Kingdom",
"UK",
"United States",
"USA",
"Wales",
}
--[[
This provides a convenient way to create a test whether an item is on the list.
--]]
p.itemsindex = {}
for i, v in ipairs(p.items) do
p.itemsindex[v] = true
end
return p
os706fxg7ivfr0wq2o2z1afni11n93q
33326
33325
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Module:WikidataIB/nolinks]]
33325
Scribunto
text/plain
local p ={}
--[[
The values here are the English sitelinks for items that should not be linked.
These 36 are not definitive and may be altered to suit.
--]]
p.items = {
"Australia",
"Austria",
"Belgium",
"Canada",
"China",
"Denmark",
"England",
"France",
"Germany",
"Greece",
"Hungary",
"Iceland",
"India",
"Republic of Ireland",
"Israel",
"Italy",
"Jamaica",
"Japan",
"Luxembourg",
"Mexico",
"Netherlands",
"New Zealand",
"Northern Ireland",
"Norway",
"Poland",
"Portugal",
"Russia",
"Scotland",
"South Africa",
"Spain",
"Sweden",
"Switzerland",
"Turkey",
"United Kingdom",
"UK",
"United States",
"USA",
"Wales",
}
--[[
This provides a convenient way to create a test whether an item is on the list.
--]]
p.itemsindex = {}
for i, v in ipairs(p.items) do
p.itemsindex[v] = true
end
return p
os706fxg7ivfr0wq2o2z1afni11n93q
Module:WikidataIB/titleformats
828
2630
33327
2020-04-30T16:11:19Z
en>RexxS
0
add magazine
33327
Scribunto
text/plain
--[[
To satisfy Wikipedia:Manual of Style/Titles, certain types of items are italicised,
and others are quoted.
This submodule lists the entity-ids used in 'instance of' (P31),
which allows a module to identify the values that should be formatted.
The table p.formats is indexed by entity-id, and contains the value " or ''
--]]
local p = {}
p.italics = {
"Q571", -- book
"Q13593966", -- literary trilogy
"Q277759", -- book series
"Q2188189", -- musical work
"Q11424", -- film
"Q13593818", -- film trilogy
"Q24856", -- film series
"Q5398426", -- television series
"Q482994", -- album
"Q169930", -- extended play
"Q1760610", -- comic book
"Q7889", -- video game
"Q7058673", -- video game series
"Q25379", -- play
"Q2743", -- musical
"Q37484", -- epic poem
"Q41298", -- magazine
}
p.quotes = {
"Q207628", -- musical composition
}
p.size = 0
p.formats = {}
for i, v in ipairs(p.italics) do
p.formats[v] = "''"
p.size = p.size + 1
end
for i, v in ipairs(p.quotes) do
p.formats[v] = '"'
p.size = p.size + 1
end
return p
kf27lmax414v7k61jzza3jomkstxn1m
33328
33327
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Module:WikidataIB/titleformats]]
33327
Scribunto
text/plain
--[[
To satisfy Wikipedia:Manual of Style/Titles, certain types of items are italicised,
and others are quoted.
This submodule lists the entity-ids used in 'instance of' (P31),
which allows a module to identify the values that should be formatted.
The table p.formats is indexed by entity-id, and contains the value " or ''
--]]
local p = {}
p.italics = {
"Q571", -- book
"Q13593966", -- literary trilogy
"Q277759", -- book series
"Q2188189", -- musical work
"Q11424", -- film
"Q13593818", -- film trilogy
"Q24856", -- film series
"Q5398426", -- television series
"Q482994", -- album
"Q169930", -- extended play
"Q1760610", -- comic book
"Q7889", -- video game
"Q7058673", -- video game series
"Q25379", -- play
"Q2743", -- musical
"Q37484", -- epic poem
"Q41298", -- magazine
}
p.quotes = {
"Q207628", -- musical composition
}
p.size = 0
p.formats = {}
for i, v in ipairs(p.italics) do
p.formats[v] = "''"
p.size = p.size + 1
end
for i, v in ipairs(p.quotes) do
p.formats[v] = '"'
p.size = p.size + 1
end
return p
kf27lmax414v7k61jzza3jomkstxn1m
Tempilet:Tooltip
10
2631
33329
2025-11-06T05:29:22Z
en>Jonesey95
0
fix issue when * is the first character
33329
wikitext
text/x-wiki
<templatestyles src="Template:Tooltip/styles.css" />{{#ifeq:{{yesno-no|{{{link}}}}}|yes
|[[{{{1}}}|<span class="rt-commentedText tooltip {{#ifeq:{{yesno-yes|{{{dotted}}}}}|no||tooltip-dotted}} {{{class|}}}" {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:String|replace|{{{2|}}}|"|"}}}}">{{{1|}}}</span>]]
|<span class="rt-commentedText tooltip {{#ifeq:{{yesno-yes|{{{dotted}}}}}|no||tooltip-dotted}} {{{class|}}}" {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:String|replace|{{{2|}}}|"|"}}}}">{{Encodefirst|{{trim|1={{{1|}}}}}}}</span>
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using tooltip with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Tooltip]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | class | dotted | id | link | style }}<noinclude>
{{Documentation}}
</noinclude>
4ivp1x5p3c09xnp99igup53f5x07y2q
33330
33329
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tooltip]]
33329
wikitext
text/x-wiki
<templatestyles src="Template:Tooltip/styles.css" />{{#ifeq:{{yesno-no|{{{link}}}}}|yes
|[[{{{1}}}|<span class="rt-commentedText tooltip {{#ifeq:{{yesno-yes|{{{dotted}}}}}|no||tooltip-dotted}} {{{class|}}}" {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:String|replace|{{{2|}}}|"|"}}}}">{{{1|}}}</span>]]
|<span class="rt-commentedText tooltip {{#ifeq:{{yesno-yes|{{{dotted}}}}}|no||tooltip-dotted}} {{{class|}}}" {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:String|replace|{{{2|}}}|"|"}}}}">{{Encodefirst|{{trim|1={{{1|}}}}}}}</span>
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using tooltip with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Tooltip]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | class | dotted | id | link | style }}<noinclude>
{{Documentation}}
</noinclude>
4ivp1x5p3c09xnp99igup53f5x07y2q
Tempilet:Tooltip/styles.css
10
2632
33331
2021-08-15T03:04:59Z
en>Pppery
0
Adding protection template
33331
sanitized-css
text/css
/* {{pp-template}} */
.tooltip-dotted {
border-bottom: 1px dotted;
cursor: help;
}
a3nuuy8e07xkoz1hiw7pmpuv4gixony
33332
33331
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tooltip/styles.css]]
33331
sanitized-css
text/css
/* {{pp-template}} */
.tooltip-dotted {
border-bottom: 1px dotted;
cursor: help;
}
a3nuuy8e07xkoz1hiw7pmpuv4gixony
Tempilet:Pluralize from text
10
2633
33333
2022-01-09T17:59:39Z
en>MusikBot II
0
Protected "[[Template:Pluralize from text]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 18336 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33333
wikitext
text/x-wiki
{{#invoke:Detect singular|pluralize}}<noinclude>{{documentation}}</noinclude>
5nexvs5r4t8tuu02q5qosvc3kb0b4n9
33334
33333
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Pluralize_from_text]]
33333
wikitext
text/x-wiki
{{#invoke:Detect singular|pluralize}}<noinclude>{{documentation}}</noinclude>
5nexvs5r4t8tuu02q5qosvc3kb0b4n9
Tempilet:In string
10
2634
33335
2024-11-09T16:12:51Z
en>Pppery
0
Set plain to true by default explicitly per request
33335
wikitext
text/x-wiki
{{#invoke:String|replace
|source={{#invoke:String|find|source={{{source|{{{1|}}}}}}|target={{{target|{{{2|}}}}}}|start={{{start|{{{3|}}}}}}|plain={{#if:{{{plain|{{{4|}}}}}}|{{{plain|{{{4}}}}}}|true}}}}
|pattern=^0$
|replace={{#if:{{{nomatch|}}}|{{{nomatch|}}}|{{#if:{{{nomatch}}}|0<!-- no replacement -->|<!--return blank-->}}}}
|plain=false}}<!--
--><noinclude>{{documentation}}</noinclude>
tr7klwr761m703pzx5qat4xi4rrtjw1
33336
33335
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:In_string]]
33335
wikitext
text/x-wiki
{{#invoke:String|replace
|source={{#invoke:String|find|source={{{source|{{{1|}}}}}}|target={{{target|{{{2|}}}}}}|start={{{start|{{{3|}}}}}}|plain={{#if:{{{plain|{{{4|}}}}}}|{{{plain|{{{4}}}}}}|true}}}}
|pattern=^0$
|replace={{#if:{{{nomatch|}}}|{{{nomatch|}}}|{{#if:{{{nomatch}}}|0<!-- no replacement -->|<!--return blank-->}}}}
|plain=false}}<!--
--><noinclude>{{documentation}}</noinclude>
tr7klwr761m703pzx5qat4xi4rrtjw1
Tempilet:Str ≥ len
10
2635
33337
2021-04-06T11:38:38Z
en>Elli
0
Undid revision 1016291968 by [[Special:Contributions/Elli|Elli]] ([[User talk:Elli|talk]]) wrong template, damn it!
33337
wikitext
text/x-wiki
{{{{{|safesubst:}}}#ifexpr: {{{{{|safesubst:}}}#invoke:String|len|s={{{1|}}}}} >= {{{2|0}}} <noinclude><!-- str >= len --></noinclude>
| {{{3|}}}
| {{{4|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5n8ijb7krko6nhwqukd6gap519qlr6k
33338
33337
2026-11-11T21:54:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Str_≥_len]]
33337
wikitext
text/x-wiki
{{{{{|safesubst:}}}#ifexpr: {{{{{|safesubst:}}}#invoke:String|len|s={{{1|}}}}} >= {{{2|0}}} <noinclude><!-- str >= len --></noinclude>
| {{{3|}}}
| {{{4|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
5n8ijb7krko6nhwqukd6gap519qlr6k
Tempilet:Infobox person
10
2636
33339
2026-09-30T01:24:42Z
en>Zackmann08
0
no longer valid parameters
33339
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|infoboxTemplate|child={{if empty|{{{child|}}}|{{{embed|}}}}}
| bodyclass = biography vcard
| above = {{#if:{{{honorific_prefix|}}}|<div class="honorific-prefix" style="font-size: 80%; font-weight: normal;">{{{honorific_prefix|}}}</div>}}<div class="fn">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</div>{{#if:{{{honorific_suffix|}}}|<div class="honorific-suffix" style="font-size: 80%; font-weight: normal;">{{{honorific_suffix|}}}</div>}}
| subheader = {{#ifeq:{{lc: {{if empty|{{{child|}}}|{{{embed|}}}}}}}|yes|{{#if:{{{embed_title|}}}|'''{{{embed_title|}}}'''}}}}
| subheader2 = {{#switch:{{if empty|{{{child|}}}|{{{embed|}}}}}|yes=<!--empty when this infobox is embedded-->|#default={{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}} }} }}
| subheaderstyle2 = font-size: 125%
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{#ifeq:{{lc:{{{landscape|}}}}}|yes|{{min|300|{{#if:{{#ifexpr:{{{image_size|}}}}}|300|{{{image_size|}}}}}}}x200px|{{{image_size|}}}}}|sizedefault=frameless|upright={{if empty|{{{image_upright|}}}|1}}|alt={{if empty|{{{alt|}}}|{{{image_alt|}}}}}|class={{{image_class|}}}|suppressplaceholder=yes}}
| caption = {{if empty|{{{caption|}}}|{{{image_caption|}}}}}
| label2 = Pronunciation
| data2 = {{{pronunciation|}}}
| label10 = Born
| data10 = {{br-separated entries
|1={{#if:{{{birth_name|}}}|<div style="display:inline" class="nickname">{{{birth_name|}}}</div>}}
|2={{#invoke:person date|birth}}
|3={{#if:{{{birth_place|}}}|<div style="display:inline" class="birthplace">{{{birth_place|}}}</div>}}
}}
| label11 = Bapti{{#if:{{{baptized|}}}|z|s}}ed
| data11 = {{#if:{{{birth_date|}}}||{{if empty|{{{baptized|}}}|{{{baptised|}}}}}}}
| label12 = Disappeared
| data12 = {{br-separated entries|1={{{disappeared_date|}}}|2={{{disappeared_place|}}}}}
| label13 = Status
| data13 = {{{disappeared_status|}}}
| label14 = Died
| data14 = {{br-separated entries
|1={{#invoke:person date|death}}
|2={{#if:{{{death_place|}}}|<div style="display:inline" class="deathplace">{{{death_place|}}}</div>}}
}}
| label15 = {{longitem|Cause of death}}
| data15 = {{{death_cause|}}}
| label16 = {{longitem|Body discovered}}
| data16 = {{{body_discovered|}}}
| label17 = {{longitem|{{#if:{{{burial_place|}}}|Burial place|Resting place}}}}
| data17 = {{#if:{{{burial_place|}}}|{{br-separated entries|1={{{burial_place|}}}|2={{{burial_coordinates|}}}}}|{{br-separated entries|1={{{resting_place|}}}|2={{{resting_place_coordinates|}}}}}}}
| class17 = label
| label18 = Monuments
| data18 = {{{monuments|}}}
| label21 = Other name{{pluralize from text|{{{other_names|}}}|plural=s}}
| data21 = {{{other_names|}}}
| class21 = nickname
| label22 = Siglum
| data22 = {{{siglum|}}}
| label23 = Citizenship
| data23 = {{{citizenship|}}}
| class23 = category
| label24 = Education
| data24 = {{{education|}}}
| label25 = Alma mater
| data25 = {{{alma_mater|}}}
| label26 = Occupation{{Pluralize from text|{{{occupation|}}}|plural=s}}
| data26 = {{{occupation|}}}
| class26 = role
| label27 = Years active
| data27 = {{{years_active|}}}
| label28 = Era
| data28 = {{{era|}}}
| class28 = category
| label29 = Employer{{Pluralize from text|{{{employer|}}}|likely=(s)|plural=s}}
| data29 = {{{employer|}}}{{main other|{{Pluralize from text| {{{employer|}}}|likely=[[Category:Pages using infobox person with multiple employers]]}}}}
| class29 = org
| label30 = {{#if:{{{organisation|}}}|Organisation|Organization}}{{#if:{{{organizations|}}}|s|{{pluralize from text|{{if empty|{{{organization|}}}|{{{organisation|}}}}}|likely=(s)|plural=s}}}}
| data30 = {{if empty|{{{organisation|}}}|{{{organization|}}}|{{{organizations|}}}}}{{main other|{{Pluralize from text|{{if empty|{{{organization|}}}|{{{organisation|}}}}}|likely=[[Category:Pages using infobox person with multiple organizations]]}}}}
| class30 = org
| label31 = Agent{{Pluralize from text|{{{agent|}}}|likely=(s)|plural=s}}
| data31 = {{{agent|}}}{{main other|{{Pluralize from text|{{{agent|}}}|likely=[[Category:Pages using infobox person with multiple agents]]}}}}
| class31 = agent
| label32 = Known for
| data32 = {{{known_for|}}}
| label33 = Works
| data33 = {{{works|}}}
| label34 = Notable credit{{Pluralize from text|{{{credits|}}}|likely=(s)|plural=s}}
| data34 = {{#if:{{{works|}}}|{{#if:{{{credits|}}}|{{preview warning|Note that if {{para|works}} is supplied, {{para|credits}} will not display.}}}}|<!--
-->{{{credits|}}}{{main other|{{Pluralize from text|{{{credits|}}}|likely=[[Category:Pages using infobox person with multiple credits]]}}}}}}
| label35 = Label{{Pluralize from text|{{{label_name|}}}|likely=(s)|plural=s}}
| data35 = {{#if:{{{works|}}}{{{credits|}}}|{{#if:{{{label_name|}}}|{{preview warning|Note that if {{para|works}} or {{para|credits}} is supplied, {{para|label_name}} will not display.}}}}|<!--
-->{{{label_name|}}}{{main other|{{Pluralize from text|{{{label_name|}}}|likely=[[Category:Pages using infobox person with multiple labels]]}}}}}}
| label36 = Notable work
| data36 = {{#if:{{{works|}}}{{{credits|}}}{{{label_name|}}}|{{#if:{{{notable_works|}}}|{{preview warning|Note that if {{para|works}}, {{para|credits}} or {{para|label_name}} is supplied, {{para|notable_works}} will not display.}}}}|{{{notable_works|}}}}}
| label37 = Style
| data37 = {{{style|}}}
| class37 = category
| label40 = Television
| data40 = {{{television|}}}
| label41 = Height
| data41 = {{#if:{{{height_m|}}}{{{height_cm|}}}{{{height_ft|}}}{{{height_in|}}} | {{convinfobox|{{if empty|{{{height_m|}}}|{{{height_cm|}}}}}|{{#if:{{{height_m|}}}|m|cm}}|{{{height_ft|}}}|ft|{{{height_in|}}}|in}}}}{{#if:{{{height|}}} | {{infobox person/height|{{{height|}}}}}}}
| label42 = {{#if:{{{office|}}}|Office|Title}}
| data42 = {{if empty|{{{office|}}}|{{{title|}}}}}
| class42 = title
| label43 = Term
| data43 = {{{term|}}}
| label44 = Predecessor
| data44 = {{{predecessor|}}}
| label45 = Successor
| data45 = {{{successor|}}}
| label46 = {{longitem|Political party}}
| data46 = {{{political_party|}}}
| class46 = org
| label47 = {{longitem|Other political<br />affiliations}}
| data47 = {{{other_party|}}}
| class47 = org
| label48 = Movement
| data48 = {{{movement|}}}
| class48 = category
| label49 = Opponent{{Pluralize from text|{{{opponents|}}}|likely=(s)|plural=s}}
| data49 = {{{opponents|}}}{{main other|{{Pluralize from text|{{{opponents|}}}|likely=[[Category:Pages using infobox person with multiple opponents]]}}}}
| label50 = {{longitem|Board member of}}
| data50 = {{{boards|}}}
| label51 = {{longitem|{{#if:{{{criminal_charges|}}}|Criminal charges|Criminal charge{{pluralize from text|{{{criminal_charge|}}}|likely=(s)|plural=s}}}}}}
| data51 = {{if empty|{{{criminal_charges|}}}|{{{criminal_charge|}}}}}{{main other|{{Pluralize from text|{{{criminal_charge|}}}|likely=[[Category:Pages using infobox person with multiple criminal charges]]}}}}
| label52 = {{longitem|Criminal penalty}}
| data52 = {{{criminal_penalty|}}}
| label53 = {{longitem|{{#if:{{{judicial_status|}}}|Judicial status|Criminal status}}}}
| data53 = {{if empty|{{{judicial_status|}}} | {{{criminal_status|}}}}}
| class53 = category
| label54 = Spouse{{#if:{{{spouses|}}}|s|{{Pluralize from text|{{{spouse|}}}|likely=(s)|plural=s}}}}
| data54 = {{if empty|{{{spouse|}}}|{{{spouses|}}}}}{{main other|{{Pluralize from text| {{{spouse|}}} |likely=[[Category:Pages using infobox person with multiple spouses]]}}}}
| label55 = Partner{{#if:{{{partners|}}}|s|{{Pluralize from text|{{if empty|{{{partner|}}}}} |likely=(s)|plural=s}}}}
| data55 = {{if empty|{{{partner|}}}|{{{partners|}}}}}{{main other|{{Pluralize from text| {{{partner|}}} |likely=[[Category:Pages using infobox person with multiple partners]]}}}}
| label56 = Children
| data56 = {{{children|}}}
| label57 = {{#if:{{{parents|}}}|Parent{{Pluralize from text|{{{parents|}}}|likely=(s)|plural=s}}|<!--
-->{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|Parents|{{#if:{{{father|}}}|Father|{{#if:{{{mother|}}}|Mother}}}}}}}}
| data57 = {{#if:{{{parents|}}}|{{{parents}}}|{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|{{Unbulleted list|{{{father}}} (father)|{{{mother}}} (mother)}}|{{{mother|}}}{{{father|}}}}}}}<!--
-->{{main other|{{Pluralize from text|{{{parents|}}}|likely=[[Category:Pages using infobox person with multiple parents]]}}}}
| label58 = Relatives
| data58 = {{{relatives|}}}
| label59 = Family
| data59 = {{{family|}}}
| label60 = Call sign
| data60 = {{{callsign|}}}
| label61 = Awards
| data61 = {{{awards|}}}
| label62 = {{#if:{{{honours|}}}|Honours|Honors}}
| data62 = {{if empty|{{{honours|}}}|{{{honors|}}}}}
| data64 = {{{module|}}}
| data65 = {{{module2|}}}
| data66 = {{{module3|}}}
| data67 = {{{module4|}}}
| data68 = {{{module5|}}}
| data69 = {{{module6|}}}
| label70 = Website
| data70 = {{{website|}}}
| header71 = {{#if:{{{signature|}}}|{{if empty|{{{signature_type|}}}|Signature}}}}
| data72 = {{#invoke:InfoboxImage|InfoboxImage|image={{{signature|}}}|size={{{signature_size|}}}|class=infobox-signature skin-invert|sizedefault=150px|alt={{{signature_alt|}}}}}
| header73 = {{#if:{{{footnotes|}}}|Notes}}
| data74 = {{#if:{{{footnotes|}}}|<div style="text-align: left;">{{{footnotes}}}</div>}}
}}<!--
-->{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using {{if empty|{{lcfirst:{{{template_name|}}}}}|infobox person}} with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview = Page using [[Template:{{#if:{{{template_name|}}}|{{ucfirst:{{{template_name|}}}}}|Infobox person}}]] with unknown parameter "_VALUE_"|ignoreblank=y| agent | alma_mater | alt | awards | baptised | baptized | birth_date | birth_name | birth_place | boards | body_discovered | burial_coordinates | burial_place | callsign | caption | child | children | citizenship | credits | criminal_charge | criminal_charges | criminal_penalty | criminal_status | death_cause | death_date | death_place | disappeared_date | disappeared_place | disappeared_status | education | embed | embed_title | employer | era | family | father | footnotes | height | height_cm | height_ft | height_in | height_m | honorific_prefix | honorific_suffix | honors | honours | image | image_alt | image_caption | image_class | image_size | image_upright | judicial_status | known_for | label_name | landscape | module | module2 | module3 | module4 | module5 | module6 | monuments | mother | movement | name | native_name | native_name_lang | nocat_wdimage | notable_works | occupation | office | opponents | organisation | organization | organizations | other_names | other_party | parents | partner | partners | political_party | predecessor | pronunciation | relatives | resting_place | resting_place_coordinates | siglum | signature | signature_alt | signature_size | signature_type | spouse | spouses | style | successor | television | template_name | term | title | website | works | years_active }}<!--
-->{{Main other|{{#if:{{{pronunciation|}}}|[[Category:Biography template using pronunciation]]}}<!--
-->{{#if:{{{signature|}}}|[[Category:Biography with signature]]}}<!--
-->[[Category:Articles with hCards]]
}}{{#if:{{{alma_mater|}}}|{{preview warning|Page using [[Template:Infobox person]] with deprecated parameter {{code|alma_mater}} which should be merged with/replaced by {{code|education}}.}}{{main other|[[Category:Pages using infobox person with deprecated parameters]]}}}}<!--
-->{{#invoke:Check for conflicting parameters|check
| nested = 1
| template = [[Template:{{#if:{{{template_name|}}}|{{ucfirst:{{{template_name|}}}}}|Infobox person}}]]
| cat = {{main other|Category:Pages using {{if empty|{{{template_name|}}}|infobox person}} with conflicting parameters}}
| alma_mater; education
| child; embed
| image_alt; alt
| height_m; height_cm; height_ft; height
| caption; image_caption
| baptized; baptised
| organisation; organization; organizations
| {{#if:{{{works|}}}|works;}} {{#if:{{{credits|}}}|credits;}} {{#if:{{{label_name|}}}|label_name;}} notable_works
| height_m; height_cm
| office; title
| criminal_charges; criminal_charge
| spouse; spouses
| partner; partners
| {{#if:{{{parents|}}}||NULL_}}parents; {{#if:{{{father|}}}||NULL_}}father
| {{#if:{{{parents|}}}||NULL_}}parents; {{#if:{{{mother|}}}||NULL_}}mother
| honours; honors
}}{{#ifeq:{{if empty|{{{child|}}}|{{{embed|}}}}}|yes||{{Wikidata image|1={{{image|}}}|2={{{nocat_wdimage|}}}}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
7vi5qdz3sn5clcc2wp1z87vvrl84oup
33340
33339
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_person]]
33339
wikitext
text/x-wiki
<includeonly>{{#invoke:infobox|infoboxTemplate|child={{if empty|{{{child|}}}|{{{embed|}}}}}
| bodyclass = biography vcard
| above = {{#if:{{{honorific_prefix|}}}|<div class="honorific-prefix" style="font-size: 80%; font-weight: normal;">{{{honorific_prefix|}}}</div>}}<div class="fn">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</div>{{#if:{{{honorific_suffix|}}}|<div class="honorific-suffix" style="font-size: 80%; font-weight: normal;">{{{honorific_suffix|}}}</div>}}
| subheader = {{#ifeq:{{lc: {{if empty|{{{child|}}}|{{{embed|}}}}}}}|yes|{{#if:{{{embed_title|}}}|'''{{{embed_title|}}}'''}}}}
| subheader2 = {{#switch:{{if empty|{{{child|}}}|{{{embed|}}}}}|yes=<!--empty when this infobox is embedded-->|#default={{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}} }} }}
| subheaderstyle2 = font-size: 125%
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{#ifeq:{{lc:{{{landscape|}}}}}|yes|{{min|300|{{#if:{{#ifexpr:{{{image_size|}}}}}|300|{{{image_size|}}}}}}}x200px|{{{image_size|}}}}}|sizedefault=frameless|upright={{if empty|{{{image_upright|}}}|1}}|alt={{if empty|{{{alt|}}}|{{{image_alt|}}}}}|class={{{image_class|}}}|suppressplaceholder=yes}}
| caption = {{if empty|{{{caption|}}}|{{{image_caption|}}}}}
| label2 = Pronunciation
| data2 = {{{pronunciation|}}}
| label10 = Born
| data10 = {{br-separated entries
|1={{#if:{{{birth_name|}}}|<div style="display:inline" class="nickname">{{{birth_name|}}}</div>}}
|2={{#invoke:person date|birth}}
|3={{#if:{{{birth_place|}}}|<div style="display:inline" class="birthplace">{{{birth_place|}}}</div>}}
}}
| label11 = Bapti{{#if:{{{baptized|}}}|z|s}}ed
| data11 = {{#if:{{{birth_date|}}}||{{if empty|{{{baptized|}}}|{{{baptised|}}}}}}}
| label12 = Disappeared
| data12 = {{br-separated entries|1={{{disappeared_date|}}}|2={{{disappeared_place|}}}}}
| label13 = Status
| data13 = {{{disappeared_status|}}}
| label14 = Died
| data14 = {{br-separated entries
|1={{#invoke:person date|death}}
|2={{#if:{{{death_place|}}}|<div style="display:inline" class="deathplace">{{{death_place|}}}</div>}}
}}
| label15 = {{longitem|Cause of death}}
| data15 = {{{death_cause|}}}
| label16 = {{longitem|Body discovered}}
| data16 = {{{body_discovered|}}}
| label17 = {{longitem|{{#if:{{{burial_place|}}}|Burial place|Resting place}}}}
| data17 = {{#if:{{{burial_place|}}}|{{br-separated entries|1={{{burial_place|}}}|2={{{burial_coordinates|}}}}}|{{br-separated entries|1={{{resting_place|}}}|2={{{resting_place_coordinates|}}}}}}}
| class17 = label
| label18 = Monuments
| data18 = {{{monuments|}}}
| label21 = Other name{{pluralize from text|{{{other_names|}}}|plural=s}}
| data21 = {{{other_names|}}}
| class21 = nickname
| label22 = Siglum
| data22 = {{{siglum|}}}
| label23 = Citizenship
| data23 = {{{citizenship|}}}
| class23 = category
| label24 = Education
| data24 = {{{education|}}}
| label25 = Alma mater
| data25 = {{{alma_mater|}}}
| label26 = Occupation{{Pluralize from text|{{{occupation|}}}|plural=s}}
| data26 = {{{occupation|}}}
| class26 = role
| label27 = Years active
| data27 = {{{years_active|}}}
| label28 = Era
| data28 = {{{era|}}}
| class28 = category
| label29 = Employer{{Pluralize from text|{{{employer|}}}|likely=(s)|plural=s}}
| data29 = {{{employer|}}}{{main other|{{Pluralize from text| {{{employer|}}}|likely=[[Category:Pages using infobox person with multiple employers]]}}}}
| class29 = org
| label30 = {{#if:{{{organisation|}}}|Organisation|Organization}}{{#if:{{{organizations|}}}|s|{{pluralize from text|{{if empty|{{{organization|}}}|{{{organisation|}}}}}|likely=(s)|plural=s}}}}
| data30 = {{if empty|{{{organisation|}}}|{{{organization|}}}|{{{organizations|}}}}}{{main other|{{Pluralize from text|{{if empty|{{{organization|}}}|{{{organisation|}}}}}|likely=[[Category:Pages using infobox person with multiple organizations]]}}}}
| class30 = org
| label31 = Agent{{Pluralize from text|{{{agent|}}}|likely=(s)|plural=s}}
| data31 = {{{agent|}}}{{main other|{{Pluralize from text|{{{agent|}}}|likely=[[Category:Pages using infobox person with multiple agents]]}}}}
| class31 = agent
| label32 = Known for
| data32 = {{{known_for|}}}
| label33 = Works
| data33 = {{{works|}}}
| label34 = Notable credit{{Pluralize from text|{{{credits|}}}|likely=(s)|plural=s}}
| data34 = {{#if:{{{works|}}}|{{#if:{{{credits|}}}|{{preview warning|Note that if {{para|works}} is supplied, {{para|credits}} will not display.}}}}|<!--
-->{{{credits|}}}{{main other|{{Pluralize from text|{{{credits|}}}|likely=[[Category:Pages using infobox person with multiple credits]]}}}}}}
| label35 = Label{{Pluralize from text|{{{label_name|}}}|likely=(s)|plural=s}}
| data35 = {{#if:{{{works|}}}{{{credits|}}}|{{#if:{{{label_name|}}}|{{preview warning|Note that if {{para|works}} or {{para|credits}} is supplied, {{para|label_name}} will not display.}}}}|<!--
-->{{{label_name|}}}{{main other|{{Pluralize from text|{{{label_name|}}}|likely=[[Category:Pages using infobox person with multiple labels]]}}}}}}
| label36 = Notable work
| data36 = {{#if:{{{works|}}}{{{credits|}}}{{{label_name|}}}|{{#if:{{{notable_works|}}}|{{preview warning|Note that if {{para|works}}, {{para|credits}} or {{para|label_name}} is supplied, {{para|notable_works}} will not display.}}}}|{{{notable_works|}}}}}
| label37 = Style
| data37 = {{{style|}}}
| class37 = category
| label40 = Television
| data40 = {{{television|}}}
| label41 = Height
| data41 = {{#if:{{{height_m|}}}{{{height_cm|}}}{{{height_ft|}}}{{{height_in|}}} | {{convinfobox|{{if empty|{{{height_m|}}}|{{{height_cm|}}}}}|{{#if:{{{height_m|}}}|m|cm}}|{{{height_ft|}}}|ft|{{{height_in|}}}|in}}}}{{#if:{{{height|}}} | {{infobox person/height|{{{height|}}}}}}}
| label42 = {{#if:{{{office|}}}|Office|Title}}
| data42 = {{if empty|{{{office|}}}|{{{title|}}}}}
| class42 = title
| label43 = Term
| data43 = {{{term|}}}
| label44 = Predecessor
| data44 = {{{predecessor|}}}
| label45 = Successor
| data45 = {{{successor|}}}
| label46 = {{longitem|Political party}}
| data46 = {{{political_party|}}}
| class46 = org
| label47 = {{longitem|Other political<br />affiliations}}
| data47 = {{{other_party|}}}
| class47 = org
| label48 = Movement
| data48 = {{{movement|}}}
| class48 = category
| label49 = Opponent{{Pluralize from text|{{{opponents|}}}|likely=(s)|plural=s}}
| data49 = {{{opponents|}}}{{main other|{{Pluralize from text|{{{opponents|}}}|likely=[[Category:Pages using infobox person with multiple opponents]]}}}}
| label50 = {{longitem|Board member of}}
| data50 = {{{boards|}}}
| label51 = {{longitem|{{#if:{{{criminal_charges|}}}|Criminal charges|Criminal charge{{pluralize from text|{{{criminal_charge|}}}|likely=(s)|plural=s}}}}}}
| data51 = {{if empty|{{{criminal_charges|}}}|{{{criminal_charge|}}}}}{{main other|{{Pluralize from text|{{{criminal_charge|}}}|likely=[[Category:Pages using infobox person with multiple criminal charges]]}}}}
| label52 = {{longitem|Criminal penalty}}
| data52 = {{{criminal_penalty|}}}
| label53 = {{longitem|{{#if:{{{judicial_status|}}}|Judicial status|Criminal status}}}}
| data53 = {{if empty|{{{judicial_status|}}} | {{{criminal_status|}}}}}
| class53 = category
| label54 = Spouse{{#if:{{{spouses|}}}|s|{{Pluralize from text|{{{spouse|}}}|likely=(s)|plural=s}}}}
| data54 = {{if empty|{{{spouse|}}}|{{{spouses|}}}}}{{main other|{{Pluralize from text| {{{spouse|}}} |likely=[[Category:Pages using infobox person with multiple spouses]]}}}}
| label55 = Partner{{#if:{{{partners|}}}|s|{{Pluralize from text|{{if empty|{{{partner|}}}}} |likely=(s)|plural=s}}}}
| data55 = {{if empty|{{{partner|}}}|{{{partners|}}}}}{{main other|{{Pluralize from text| {{{partner|}}} |likely=[[Category:Pages using infobox person with multiple partners]]}}}}
| label56 = Children
| data56 = {{{children|}}}
| label57 = {{#if:{{{parents|}}}|Parent{{Pluralize from text|{{{parents|}}}|likely=(s)|plural=s}}|<!--
-->{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|Parents|{{#if:{{{father|}}}|Father|{{#if:{{{mother|}}}|Mother}}}}}}}}
| data57 = {{#if:{{{parents|}}}|{{{parents}}}|{{#ifexpr:{{count|{{{father|}}}|{{{mother|}}}}} > 1|{{Unbulleted list|{{{father}}} (father)|{{{mother}}} (mother)}}|{{{mother|}}}{{{father|}}}}}}}<!--
-->{{main other|{{Pluralize from text|{{{parents|}}}|likely=[[Category:Pages using infobox person with multiple parents]]}}}}
| label58 = Relatives
| data58 = {{{relatives|}}}
| label59 = Family
| data59 = {{{family|}}}
| label60 = Call sign
| data60 = {{{callsign|}}}
| label61 = Awards
| data61 = {{{awards|}}}
| label62 = {{#if:{{{honours|}}}|Honours|Honors}}
| data62 = {{if empty|{{{honours|}}}|{{{honors|}}}}}
| data64 = {{{module|}}}
| data65 = {{{module2|}}}
| data66 = {{{module3|}}}
| data67 = {{{module4|}}}
| data68 = {{{module5|}}}
| data69 = {{{module6|}}}
| label70 = Website
| data70 = {{{website|}}}
| header71 = {{#if:{{{signature|}}}|{{if empty|{{{signature_type|}}}|Signature}}}}
| data72 = {{#invoke:InfoboxImage|InfoboxImage|image={{{signature|}}}|size={{{signature_size|}}}|class=infobox-signature skin-invert|sizedefault=150px|alt={{{signature_alt|}}}}}
| header73 = {{#if:{{{footnotes|}}}|Notes}}
| data74 = {{#if:{{{footnotes|}}}|<div style="text-align: left;">{{{footnotes}}}</div>}}
}}<!--
-->{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using {{if empty|{{lcfirst:{{{template_name|}}}}}|infobox person}} with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview = Page using [[Template:{{#if:{{{template_name|}}}|{{ucfirst:{{{template_name|}}}}}|Infobox person}}]] with unknown parameter "_VALUE_"|ignoreblank=y| agent | alma_mater | alt | awards | baptised | baptized | birth_date | birth_name | birth_place | boards | body_discovered | burial_coordinates | burial_place | callsign | caption | child | children | citizenship | credits | criminal_charge | criminal_charges | criminal_penalty | criminal_status | death_cause | death_date | death_place | disappeared_date | disappeared_place | disappeared_status | education | embed | embed_title | employer | era | family | father | footnotes | height | height_cm | height_ft | height_in | height_m | honorific_prefix | honorific_suffix | honors | honours | image | image_alt | image_caption | image_class | image_size | image_upright | judicial_status | known_for | label_name | landscape | module | module2 | module3 | module4 | module5 | module6 | monuments | mother | movement | name | native_name | native_name_lang | nocat_wdimage | notable_works | occupation | office | opponents | organisation | organization | organizations | other_names | other_party | parents | partner | partners | political_party | predecessor | pronunciation | relatives | resting_place | resting_place_coordinates | siglum | signature | signature_alt | signature_size | signature_type | spouse | spouses | style | successor | television | template_name | term | title | website | works | years_active }}<!--
-->{{Main other|{{#if:{{{pronunciation|}}}|[[Category:Biography template using pronunciation]]}}<!--
-->{{#if:{{{signature|}}}|[[Category:Biography with signature]]}}<!--
-->[[Category:Articles with hCards]]
}}{{#if:{{{alma_mater|}}}|{{preview warning|Page using [[Template:Infobox person]] with deprecated parameter {{code|alma_mater}} which should be merged with/replaced by {{code|education}}.}}{{main other|[[Category:Pages using infobox person with deprecated parameters]]}}}}<!--
-->{{#invoke:Check for conflicting parameters|check
| nested = 1
| template = [[Template:{{#if:{{{template_name|}}}|{{ucfirst:{{{template_name|}}}}}|Infobox person}}]]
| cat = {{main other|Category:Pages using {{if empty|{{{template_name|}}}|infobox person}} with conflicting parameters}}
| alma_mater; education
| child; embed
| image_alt; alt
| height_m; height_cm; height_ft; height
| caption; image_caption
| baptized; baptised
| organisation; organization; organizations
| {{#if:{{{works|}}}|works;}} {{#if:{{{credits|}}}|credits;}} {{#if:{{{label_name|}}}|label_name;}} notable_works
| height_m; height_cm
| office; title
| criminal_charges; criminal_charge
| spouse; spouses
| partner; partners
| {{#if:{{{parents|}}}||NULL_}}parents; {{#if:{{{father|}}}||NULL_}}father
| {{#if:{{{parents|}}}||NULL_}}parents; {{#if:{{{mother|}}}||NULL_}}mother
| honours; honors
}}{{#ifeq:{{if empty|{{{child|}}}|{{{embed|}}}}}|yes||{{Wikidata image|1={{{image|}}}|2={{{nocat_wdimage|}}}}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
7vi5qdz3sn5clcc2wp1z87vvrl84oup
Tempilet:Wikidata image
10
2637
33341
2026-02-21T03:07:49Z
en>Hike395
0
simplify template, add qid and cat parameters
33341
wikitext
text/x-wiki
{{#if:{{#if:{{{qid|}}}||{{NAMESPACE}}}}{{{1|}}}{{{2|}}}||{{#if:{{#property:P18|from={{{qid|}}}}}|[[Category:{{if empty|{{{cat|}}}|No local image but image on Wikidata}}]]}}}}<noinclude>
{{doc}}
</noinclude>
j4r2yjlq7u6k84f6tg284tlgziaz4wx
33342
33341
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wikidata_image]]
33341
wikitext
text/x-wiki
{{#if:{{#if:{{{qid|}}}||{{NAMESPACE}}}}{{{1|}}}{{{2|}}}||{{#if:{{#property:P18|from={{{qid|}}}}}|[[Category:{{if empty|{{{cat|}}}|No local image but image on Wikidata}}]]}}}}<noinclude>
{{doc}}
</noinclude>
j4r2yjlq7u6k84f6tg284tlgziaz4wx
Tempilet:Str ≠ len
10
2638
33343
2017-03-25T12:38:47Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:Str ≠ len]]": Allowing template editors on some templates with full protection dating back to pre-[[WP:TPROT|TPROT]] times which aren't too often or too sensitively used. ([Edit=Require template editor access]...
33343
wikitext
text/x-wiki
{{{{{|safesubst:}}}#ifexpr: {{{{{|safesubst:}}}#invoke:String|len|s={{{1|}}}}} != {{{2|0}}} <noinclude><!-- str >= len --></noinclude>
| {{{3|}}}
| {{{4|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
bjndedolj3rubo3o1o2kt0n4hoa36ki
33344
33343
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Str_≠_len]]
33343
wikitext
text/x-wiki
{{{{{|safesubst:}}}#ifexpr: {{{{{|safesubst:}}}#invoke:String|len|s={{{1|}}}}} != {{{2|0}}} <noinclude><!-- str >= len --></noinclude>
| {{{3|}}}
| {{{4|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
bjndedolj3rubo3o1o2kt0n4hoa36ki
Tempilet:YEAR
10
2639
33345
2021-08-17T01:21:54Z
en>MusikBot II
0
Changed protection settings for "[[Template:YEAR]]": [[Wikipedia:High-risk templates|High-risk template or module]] 62847 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33345
wikitext
text/x-wiki
<includeonly>{{#if: {{{1|}}}
|{{#iferror:{{#time:Y|1 January {{{1|}}} }}
|{{#iferror:{{#time:Y|{{{1|}}} }}
|{{#ifeq:{{{2|}}}|{{{2}}}|error|{{error|Error}}}}
|{{#time:Y|{{{1|}}} }} }}
|{{#time:Y|1 January {{{1|}}} }} }}
|{{CURRENTYEAR}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
6pkr8ifd4do88keroffs6jc441jh1za
33346
33345
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:YEAR]]
33345
wikitext
text/x-wiki
<includeonly>{{#if: {{{1|}}}
|{{#iferror:{{#time:Y|1 January {{{1|}}} }}
|{{#iferror:{{#time:Y|{{{1|}}} }}
|{{#ifeq:{{{2|}}}|{{{2}}}|error|{{error|Error}}}}
|{{#time:Y|{{{1|}}} }} }}
|{{#time:Y|1 January {{{1|}}} }} }}
|{{CURRENTYEAR}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
6pkr8ifd4do88keroffs6jc441jh1za
Module:Uses Wikidata
828
2640
33349
2026-11-03T06:08:35Z
en>Axolitl
0
+skin-invert-image for dark mode visibility
33349
Scribunto
text/plain
local p = {}
function p.usesProperty(frame)
local args = frame.getParent(frame).args or nil
if mw.text.trim(args[1] or '') == '' then
args = frame.args
end
local result = '<ul>'
local ii = 1
while true do
local p_num = mw.text.trim(args[ii] or '')
if p_num ~= '' then
local label = mw.wikibase.getLabel(p_num) or "NO LABEL"
result = result .. "<li>[[File:Disc Plain blue dark.svg|middle|4px|link=|alt=|class=skin-invert-image]] <b><i>[[d:Property talk:" .. p_num .. "|" .. label .. " (" .. string.upper(p_num) .. ")]]</i></b> (see <span class='plainlinks'>[https://query.wikidata.org/embed.html#SELECT%20%3FWikidata_item_%20%3FWikidata_item_Label%20%3Fvalue%20%3FvalueLabel%20%3FEnglish_Wikipedia_article%20%23Show%20data%20in%20this%20order%0A%7B%0A%09%3FWikidata_item_%20wdt%3A" .. p_num .. "%20%3Fvalue%20.%20%23Collecting%20all%20items%20which%20have%20" .. p_num .. "%20data%2C%20from%20whole%20Wikidata%20item%20pages%0A%09OPTIONAL%20%7B%3FEnglish_Wikipedia_article%20schema%3Aabout%20%3FWikidata_item_%3B%20schema%3AisPartOf%20%3Chttps%3A%2F%2Fen.wikipedia.org%2F%3E%20.%7D%20%23If%20collected%20item%20has%20link%20to%20English%20Wikipedia%2C%20show%20that%0A%09SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22en%22%20%20%7D%20%23Show%20label%20in%20this%20language.%20%22en%22%20is%20English.%20%20%20%0A%7D%0ALIMIT%201000 uses]</span>)</li>"
ii = ii + 1
else break
end
end
result = result.."</ul>"
return result
end
function p.tuProperty(frame)
local parent = frame.getParent(frame)
local result = '<ul>'
local ii = 1
while true do
local p_num = mw.text.trim(parent.args[ii] or '')
if p_num ~= '' then
local label = mw.wikibase.getLabel(p_num) or "NO LABEL"
result = result .. "<li><span style='font-size:90%;line-height:1;'>●</span> <b>[[d:Property:" .. p_num .. "|" .. label .. "]]</b> <span style='font-size:90%;'>([[d:Property talk:" .. string.upper(p_num) .. "|" .. p_num .. "]])</span></li>"
ii = ii + 1
else break
end
end
result = result.."</ul>"
return result
end
return p
segejs5zqrzrucajk51t587vkh351ec
33350
33349
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Uses_Wikidata]]
33349
Scribunto
text/plain
local p = {}
function p.usesProperty(frame)
local args = frame.getParent(frame).args or nil
if mw.text.trim(args[1] or '') == '' then
args = frame.args
end
local result = '<ul>'
local ii = 1
while true do
local p_num = mw.text.trim(args[ii] or '')
if p_num ~= '' then
local label = mw.wikibase.getLabel(p_num) or "NO LABEL"
result = result .. "<li>[[File:Disc Plain blue dark.svg|middle|4px|link=|alt=|class=skin-invert-image]] <b><i>[[d:Property talk:" .. p_num .. "|" .. label .. " (" .. string.upper(p_num) .. ")]]</i></b> (see <span class='plainlinks'>[https://query.wikidata.org/embed.html#SELECT%20%3FWikidata_item_%20%3FWikidata_item_Label%20%3Fvalue%20%3FvalueLabel%20%3FEnglish_Wikipedia_article%20%23Show%20data%20in%20this%20order%0A%7B%0A%09%3FWikidata_item_%20wdt%3A" .. p_num .. "%20%3Fvalue%20.%20%23Collecting%20all%20items%20which%20have%20" .. p_num .. "%20data%2C%20from%20whole%20Wikidata%20item%20pages%0A%09OPTIONAL%20%7B%3FEnglish_Wikipedia_article%20schema%3Aabout%20%3FWikidata_item_%3B%20schema%3AisPartOf%20%3Chttps%3A%2F%2Fen.wikipedia.org%2F%3E%20.%7D%20%23If%20collected%20item%20has%20link%20to%20English%20Wikipedia%2C%20show%20that%0A%09SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22en%22%20%20%7D%20%23Show%20label%20in%20this%20language.%20%22en%22%20is%20English.%20%20%20%0A%7D%0ALIMIT%201000 uses]</span>)</li>"
ii = ii + 1
else break
end
end
result = result.."</ul>"
return result
end
function p.tuProperty(frame)
local parent = frame.getParent(frame)
local result = '<ul>'
local ii = 1
while true do
local p_num = mw.text.trim(parent.args[ii] or '')
if p_num ~= '' then
local label = mw.wikibase.getLabel(p_num) or "NO LABEL"
result = result .. "<li><span style='font-size:90%;line-height:1;'>●</span> <b>[[d:Property:" .. p_num .. "|" .. label .. "]]</b> <span style='font-size:90%;'>([[d:Property talk:" .. string.upper(p_num) .. "|" .. p_num .. "]])</span></li>"
ii = ii + 1
else break
end
end
result = result.."</ul>"
return result
end
return p
segejs5zqrzrucajk51t587vkh351ec
Tempilet:Abbreviation
10
2641
33351
2026-09-13T04:44:24Z
en>MPGuy2824
0
Move discussion complete. Template was moved.
33351
wikitext
text/x-wiki
<abbr {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:String|replace|{{{2|}}}|"|"}}}}">{{{1|}}}</abbr><noinclude>{{Documentation}}
</noinclude>
b6zvtcrye54kh0akzk3y1jq9lxg4lm6
33352
33351
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Abbreviation]]
33351
wikitext
text/x-wiki
<abbr {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} {{#if:{{{style|}}}|style="{{{style}}}"}} title="{{#tag:nowiki|{{#invoke:String|replace|{{{2|}}}|"|"}}}}">{{{1|}}}</abbr><noinclude>{{Documentation}}
</noinclude>
b6zvtcrye54kh0akzk3y1jq9lxg4lm6
Tempilet:Tomorrow
10
2642
33353
2017-03-25T12:38:48Z
en>Jo-Jo Eumerus
0
Changed protection level for "[[Template:Tomorrow]]": Allowing template editors on some templates with full protection dating back to pre-[[WP:TPROT|TPROT]] times which aren't too often or too sensitively used. ([Edit=Require template editor access] (i...
33353
wikitext
text/x-wiki
{{#switch:{{{1}}}
|long={{#time:F"{{{2| }}}"j",{{{2| }}}"Y|+1 day}}
|num={{#time:n"{{{2| }}}"j|+1 day}}
|#default={{#time:F"{{{2| }}}"j|+1 day}}
}}<noinclude>{{Documentation}}</noinclude>
b0ep5vap4y7luyxxv40z3l06wr11u1q
33354
33353
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tomorrow]]
33353
wikitext
text/x-wiki
{{#switch:{{{1}}}
|long={{#time:F"{{{2| }}}"j",{{{2| }}}"Y|+1 day}}
|num={{#time:n"{{{2| }}}"j|+1 day}}
|#default={{#time:F"{{{2| }}}"j|+1 day}}
}}<noinclude>{{Documentation}}</noinclude>
b0ep5vap4y7luyxxv40z3l06wr11u1q
Tempilet:Dc
10
2643
33355
2022-10-29T16:19:12Z
en>CrafterNova
0
+cat +r cat shell
33355
wikitext
text/x-wiki
#REDIRECT [[Template:Deprecated code]]
{{Rcatsh|
{{R from tsh}}
}}
lr8qfta0e6y0g72rp5jhz41s4w4ddhg
33356
33355
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Dc]]
33355
wikitext
text/x-wiki
#REDIRECT [[Template:Deprecated code]]
{{Rcatsh|
{{R from tsh}}
}}
lr8qfta0e6y0g72rp5jhz41s4w4ddhg
Tempilet:Deprecated code
10
2644
33357
2025-10-07T10:15:41Z
en>Sapphaline
0
Undid revision [[Special:Diff/1315425762|1315425762]] by [[Special:Contributions/Sira Aspera|Sira Aspera]] ([[User talk:Sira Aspera|talk]])
33357
wikitext
text/x-wiki
<del class="deprecated-content {{{class|}}}" style="color:{{#if:{{{red|}}}|var(--color-content-removed, #8B0000)|var(--color-subtle, #54595d)}}; text-decoration:none; {{#if:{{{style|}}}|{{{style}}}|}}" {{#if:{{{id|}}}|id="{{{id}}}"|}} {{#if:{{{title|{{{2|}}}}}}|title="{{{title|{{{2}}}}}}"|}}>{{{1}}}</del><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
rd5dtqx7ijlfoxt4pdt4wknm3rt5jf0
33358
33357
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Deprecated_code]]
33357
wikitext
text/x-wiki
<del class="deprecated-content {{{class|}}}" style="color:{{#if:{{{red|}}}|var(--color-content-removed, #8B0000)|var(--color-subtle, #54595d)}}; text-decoration:none; {{#if:{{{style|}}}|{{{style}}}|}}" {{#if:{{{id|}}}|id="{{{id}}}"|}} {{#if:{{{title|{{{2|}}}}}}|title="{{{title|{{{2}}}}}}"|}}>{{{1}}}</del><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
rd5dtqx7ijlfoxt4pdt4wknm3rt5jf0
Module:Parameter validation
828
2645
33359
2026-05-15T13:39:27Z
en>MSGJ
0
tweaks by [[User:Mr. Starfleet Command]]
33359
Scribunto
text/plain
local util = {
empty = function( s )
return s == nil or type( s ) == 'string' and mw.text.trim( s ) == ''
end,
extract_options = function ( frame, optionsPrefix )
optionsPrefix = optionsPrefix or 'options'
local options, n = {}
if frame.args.module_options then
local module_options = mw.loadData( frame.args.module_options )
if type( module_options ) ~= 'table' then return {} end
local title = mw.title.getCurrentTitle()
local local_ptions = module_options[ title.namespace ] or module_options[ title.nsText ] or {}
for k, v in pairs( local_ptions ) do options[k] = v end
end
repeat
local ok, more = pcall( mw.text.jsonDecode, frame.args[optionsPrefix .. ( n or '' )] )
if ok and type( more ) == 'table' then
for k, v in pairs( more ) do options[k] = v end
end
n = ( n or 0 ) + 1
until not ok
return options
end,
build_namelist = function ( template_name, sp )
local res = { template_name }
if sp then
if type( sp ) == 'string' then sp = { sp } end
for _, p in ipairs( sp ) do table.insert( res, template_name .. '/' .. p ) end
end
return res
end,
table_empty = function( t ) -- normally, test if next(t) is nil, but for some perverse reason, non-empty tables returned by loadData return nil...
if type( t ) ~= 'table' then return true end
if #t > 0 then return false end
return true
end,
}
local function _readTemplateData( templateName )
local title = mw.title.makeTitle( 0, templateName )
local templateContent = title and title.exists and title:getContent() -- template's raw content
local capture = templateContent and mw.ustring.match( templateContent, '<templatedata%s*>(.*)</templatedata%s*>' ) -- templatedata as text
-- capture = capture and mw.ustring.gsub( capture, '"(%d+)"', tonumber ) -- convert "1": {} to 1: {}. frame.args uses numerical indexes for order-based params.
local trailingComma = capture and mw.ustring.find( capture, ',%s*[%]%}]' ) -- look for ,] or ,} : jsonDecode allows it, but it's verbotten in json
if capture and not trailingComma then return pcall( mw.text.jsonDecode, capture ) end
return false
end
local function readTemplateData( templateName )
for _, name in ipairs( templateName ) do
local td, result = _readTemplateData( name )
if td then return result end
end
return nil
end
-- this is the function to be called by other modules. it expects the frame, and then an optional list of subpages, e.g. { "Documentation" }.
-- if second parameter is nil, only template page will be searched for templatedata.
local function calculateViolations( frame, subpages )
-- used for parameter type validy test. keyed by TD 'type' string. values are function(val) returning bool.
local type_validators = {
['number'] = function( s ) return mw.language.getContentLanguage():parseFormattedNumber( s ) end
}
local function compatible( typ, val )
local func = type_validators[typ]
return type( func ) ~= 'function' or util.empty( val ) or func( val )
end
local t_frame = frame:getParent()
local t_args, template_name = t_frame.args, t_frame:getTitle()
template_name = mw.ustring.gsub( template_name, '/sandbox', '', 1 )
local td_source = util.build_namelist( template_name, subpages )
if frame.args.td_source then
table.insert(td_source, frame.args.td_source)
end
local templatedata = readTemplateData( td_source )
local td_params = templatedata and templatedata.params
local all_aliases = {}
if not td_params then return { ['no-templatedata'] = { [''] = '' } } end
-- from this point on, we know templatedata is valid.
local res = {} -- before returning to caller, we'll prune empty tables
-- allow for aliases
for x, p in pairs( td_params ) do
for y, alias in ipairs( p.aliases or {} ) do
p.primary = x
td_params[x] = p
all_aliases[alias] = p
if tonumber(alias) then all_aliases[tonumber(alias)] = p end
end
end
-- handle undeclared and deprecated
local already_seen = {}
local series = frame.args.series
for p_name, value in pairs( t_args ) do
local tp_param, noval, numeric = td_params[p_name] or all_aliases[p_name], util.empty( value ), tonumber( p_name )
local table_name
local hasval = not noval
if not tp_param and series then -- 2nd chance. check to see if series
for s_name, p in pairs(td_params) do
if mw.ustring.match( p_name, '^' .. s_name .. '%d+' .. '$') then
-- mw.log('found p_name ' .. p_name .. ' s_name:' .. s_name, ' p is:', p) debugging series support
tp_param = p
end -- don't bother breaking. td always correct.
end
end
if not tp_param then -- not in TD: this is called undeclared
-- calculate the relevant table for this undeclared parameter, based on parameter and value types
table_name =
noval and numeric and 'empty-undeclared-numeric' or
noval and not numeric and 'empty-undeclared' or
hasval and numeric and 'undeclared-numeric' or
'undeclared' -- tzvototi nishar.
else -- in td: test for deprecation and mistype. if deprecated, no further tests
table_name = tp_param.deprecated and hasval and 'deprecated'
or tp_param.deprecated and noval and 'empty-deprecated'
or not compatible( tp_param.type, value ) and 'incompatible'
or not series and already_seen[tp_param] and hasval and 'duplicate'
if hasval and table_name ~= 'duplicate' then
already_seen[tp_param] = p_name
end
end
-- report it.
if table_name then
res[table_name] = res[table_name] or {}
if table_name == 'duplicate' then
local primary_param = tp_param.primary
local primaryData = res[table_name][primary_param]
if not primaryData then
primaryData = {}
table.insert(primaryData, already_seen[tp_param])
end
table.insert(primaryData, p_name)
res[table_name][primary_param] = primaryData
else
res[table_name][p_name] = value
end
end
end
-- check for empty/missing parameters declared "required"
for p_name, param in pairs( td_params ) do
if param.required and util.empty( t_args[p_name] ) then
local is_alias
for _, alias in ipairs( param.aliases or {} ) do is_alias = is_alias or not util.empty( t_args[alias] ) end
if not is_alias then
res['empty-required'] = res['empty-required'] or {}
res['empty-required'][p_name] = ''
end
end
end
mw.logObject(res)
return res
end
-- wraps report in hidden frame
local function wrapReport(report, template_name, options)
mw.logObject(report)
if util.empty( report ) then return '' end
local naked = mw.title.new( template_name ).text
naked = mw.ustring.gsub(naked, 'Infobox', 'infobox', 1)
report = ( options['wrapper-prefix'] or '<div class="paramvalidator-wrapper"><span class="paramvalidator-error">' )
.. report
.. ( options['wrapper-suffix'] or '</span></div>' )
report = mw.ustring.gsub( report, 'tname_naked', naked )
report = mw.ustring.gsub( report, 'templatename', template_name )
return report
end
-- this is the "user" version, called with {{#invoke:}} returns a string, as defined by the options parameter
local function validateParams( frame )
local options, report, template_name = util.extract_options( frame ), '', frame:getParent():getTitle()
local ignore = function( p_name )
for _, pattern in ipairs( options.ignore or {} ) do
if mw.ustring.match( p_name, '^' .. pattern .. '$' ) then return true end
end
return false
end
local replace_macros = function( error_type, s, param_names )
local function concat_and_escape( t , sep )
sep = sep or ', '
return ( mw.ustring.gsub( table.concat( t, sep ), '%%', '%%%%' ) )
end
if s and ( type( param_names ) == 'table' ) then
local k_ar, kv_ar = {}, {}
for k, v in pairs( param_names ) do
table.insert( k_ar, k )
if type(v) == 'table' then
v = table.concat(v, ', ')
end
if error_type == 'duplicate' then
table.insert( kv_ar, v)
else
table.insert( kv_ar, k .. ': ' .. v)
end
end
s = mw.ustring.gsub( s, 'paramname', concat_and_escape( k_ar ) )
s = mw.ustring.gsub( s, 'paramandvalue', concat_and_escape( kv_ar, ' AND ' ) )
if mw.getCurrentFrame():preprocess( '{{REVISIONID}}' ) ~= '' then
s = mw.ustring.gsub( s, '<div.*<%/div>', '', 1 )
end
end
return s
end
local report_params = function( key, param_names )
local res = replace_macros( key, options[key], param_names )
res = frame:preprocess(res or '')
report = report .. ( res or '' )
return res
end
-- no option no work.
if util.table_empty( options ) then return '' end
-- get the errors.
local violations = calculateViolations( frame, options['doc-subpage'] )
-- special request of bora: use skip_empty_numeric
if violations['empty-undeclared-numeric'] then
for i = 1, tonumber( options['skip-empty-numeric'] ) or 0 do
violations['empty-undeclared-numeric'][i] = nil
end
end
-- handle ignore list, and prune empty violations - in that order!
local offenders = 0
for name, tab in pairs( violations ) do
-- remove ignored parameters from all violations
for pname in pairs( tab ) do if ignore( pname ) then tab[pname] = nil end end
-- prune empty violations
if util.table_empty( tab ) then violations[name] = nil end
-- WORK IS DONE. report the errors.
-- if report then count it.
if violations[name] and report_params( name, tab ) then offenders = offenders + 1 end
end
if offenders > 1 then report_params( 'multiple' ) end
if offenders ~= 0 then report_params( 'any' ) end -- could have tested for empty( report ), but since we count them anyway...
return wrapReport(report, template_name, options)
end
return {
['validateparams'] = validateParams,
['calculateViolations'] = calculateViolations,
['wrapReport'] = wrapReport
}
b2xz8kqfrgct90ewowjyfx1v5w9ke5h
33360
33359
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Parameter_validation]]
33359
Scribunto
text/plain
local util = {
empty = function( s )
return s == nil or type( s ) == 'string' and mw.text.trim( s ) == ''
end,
extract_options = function ( frame, optionsPrefix )
optionsPrefix = optionsPrefix or 'options'
local options, n = {}
if frame.args.module_options then
local module_options = mw.loadData( frame.args.module_options )
if type( module_options ) ~= 'table' then return {} end
local title = mw.title.getCurrentTitle()
local local_ptions = module_options[ title.namespace ] or module_options[ title.nsText ] or {}
for k, v in pairs( local_ptions ) do options[k] = v end
end
repeat
local ok, more = pcall( mw.text.jsonDecode, frame.args[optionsPrefix .. ( n or '' )] )
if ok and type( more ) == 'table' then
for k, v in pairs( more ) do options[k] = v end
end
n = ( n or 0 ) + 1
until not ok
return options
end,
build_namelist = function ( template_name, sp )
local res = { template_name }
if sp then
if type( sp ) == 'string' then sp = { sp } end
for _, p in ipairs( sp ) do table.insert( res, template_name .. '/' .. p ) end
end
return res
end,
table_empty = function( t ) -- normally, test if next(t) is nil, but for some perverse reason, non-empty tables returned by loadData return nil...
if type( t ) ~= 'table' then return true end
if #t > 0 then return false end
return true
end,
}
local function _readTemplateData( templateName )
local title = mw.title.makeTitle( 0, templateName )
local templateContent = title and title.exists and title:getContent() -- template's raw content
local capture = templateContent and mw.ustring.match( templateContent, '<templatedata%s*>(.*)</templatedata%s*>' ) -- templatedata as text
-- capture = capture and mw.ustring.gsub( capture, '"(%d+)"', tonumber ) -- convert "1": {} to 1: {}. frame.args uses numerical indexes for order-based params.
local trailingComma = capture and mw.ustring.find( capture, ',%s*[%]%}]' ) -- look for ,] or ,} : jsonDecode allows it, but it's verbotten in json
if capture and not trailingComma then return pcall( mw.text.jsonDecode, capture ) end
return false
end
local function readTemplateData( templateName )
for _, name in ipairs( templateName ) do
local td, result = _readTemplateData( name )
if td then return result end
end
return nil
end
-- this is the function to be called by other modules. it expects the frame, and then an optional list of subpages, e.g. { "Documentation" }.
-- if second parameter is nil, only template page will be searched for templatedata.
local function calculateViolations( frame, subpages )
-- used for parameter type validy test. keyed by TD 'type' string. values are function(val) returning bool.
local type_validators = {
['number'] = function( s ) return mw.language.getContentLanguage():parseFormattedNumber( s ) end
}
local function compatible( typ, val )
local func = type_validators[typ]
return type( func ) ~= 'function' or util.empty( val ) or func( val )
end
local t_frame = frame:getParent()
local t_args, template_name = t_frame.args, t_frame:getTitle()
template_name = mw.ustring.gsub( template_name, '/sandbox', '', 1 )
local td_source = util.build_namelist( template_name, subpages )
if frame.args.td_source then
table.insert(td_source, frame.args.td_source)
end
local templatedata = readTemplateData( td_source )
local td_params = templatedata and templatedata.params
local all_aliases = {}
if not td_params then return { ['no-templatedata'] = { [''] = '' } } end
-- from this point on, we know templatedata is valid.
local res = {} -- before returning to caller, we'll prune empty tables
-- allow for aliases
for x, p in pairs( td_params ) do
for y, alias in ipairs( p.aliases or {} ) do
p.primary = x
td_params[x] = p
all_aliases[alias] = p
if tonumber(alias) then all_aliases[tonumber(alias)] = p end
end
end
-- handle undeclared and deprecated
local already_seen = {}
local series = frame.args.series
for p_name, value in pairs( t_args ) do
local tp_param, noval, numeric = td_params[p_name] or all_aliases[p_name], util.empty( value ), tonumber( p_name )
local table_name
local hasval = not noval
if not tp_param and series then -- 2nd chance. check to see if series
for s_name, p in pairs(td_params) do
if mw.ustring.match( p_name, '^' .. s_name .. '%d+' .. '$') then
-- mw.log('found p_name ' .. p_name .. ' s_name:' .. s_name, ' p is:', p) debugging series support
tp_param = p
end -- don't bother breaking. td always correct.
end
end
if not tp_param then -- not in TD: this is called undeclared
-- calculate the relevant table for this undeclared parameter, based on parameter and value types
table_name =
noval and numeric and 'empty-undeclared-numeric' or
noval and not numeric and 'empty-undeclared' or
hasval and numeric and 'undeclared-numeric' or
'undeclared' -- tzvototi nishar.
else -- in td: test for deprecation and mistype. if deprecated, no further tests
table_name = tp_param.deprecated and hasval and 'deprecated'
or tp_param.deprecated and noval and 'empty-deprecated'
or not compatible( tp_param.type, value ) and 'incompatible'
or not series and already_seen[tp_param] and hasval and 'duplicate'
if hasval and table_name ~= 'duplicate' then
already_seen[tp_param] = p_name
end
end
-- report it.
if table_name then
res[table_name] = res[table_name] or {}
if table_name == 'duplicate' then
local primary_param = tp_param.primary
local primaryData = res[table_name][primary_param]
if not primaryData then
primaryData = {}
table.insert(primaryData, already_seen[tp_param])
end
table.insert(primaryData, p_name)
res[table_name][primary_param] = primaryData
else
res[table_name][p_name] = value
end
end
end
-- check for empty/missing parameters declared "required"
for p_name, param in pairs( td_params ) do
if param.required and util.empty( t_args[p_name] ) then
local is_alias
for _, alias in ipairs( param.aliases or {} ) do is_alias = is_alias or not util.empty( t_args[alias] ) end
if not is_alias then
res['empty-required'] = res['empty-required'] or {}
res['empty-required'][p_name] = ''
end
end
end
mw.logObject(res)
return res
end
-- wraps report in hidden frame
local function wrapReport(report, template_name, options)
mw.logObject(report)
if util.empty( report ) then return '' end
local naked = mw.title.new( template_name ).text
naked = mw.ustring.gsub(naked, 'Infobox', 'infobox', 1)
report = ( options['wrapper-prefix'] or '<div class="paramvalidator-wrapper"><span class="paramvalidator-error">' )
.. report
.. ( options['wrapper-suffix'] or '</span></div>' )
report = mw.ustring.gsub( report, 'tname_naked', naked )
report = mw.ustring.gsub( report, 'templatename', template_name )
return report
end
-- this is the "user" version, called with {{#invoke:}} returns a string, as defined by the options parameter
local function validateParams( frame )
local options, report, template_name = util.extract_options( frame ), '', frame:getParent():getTitle()
local ignore = function( p_name )
for _, pattern in ipairs( options.ignore or {} ) do
if mw.ustring.match( p_name, '^' .. pattern .. '$' ) then return true end
end
return false
end
local replace_macros = function( error_type, s, param_names )
local function concat_and_escape( t , sep )
sep = sep or ', '
return ( mw.ustring.gsub( table.concat( t, sep ), '%%', '%%%%' ) )
end
if s and ( type( param_names ) == 'table' ) then
local k_ar, kv_ar = {}, {}
for k, v in pairs( param_names ) do
table.insert( k_ar, k )
if type(v) == 'table' then
v = table.concat(v, ', ')
end
if error_type == 'duplicate' then
table.insert( kv_ar, v)
else
table.insert( kv_ar, k .. ': ' .. v)
end
end
s = mw.ustring.gsub( s, 'paramname', concat_and_escape( k_ar ) )
s = mw.ustring.gsub( s, 'paramandvalue', concat_and_escape( kv_ar, ' AND ' ) )
if mw.getCurrentFrame():preprocess( '{{REVISIONID}}' ) ~= '' then
s = mw.ustring.gsub( s, '<div.*<%/div>', '', 1 )
end
end
return s
end
local report_params = function( key, param_names )
local res = replace_macros( key, options[key], param_names )
res = frame:preprocess(res or '')
report = report .. ( res or '' )
return res
end
-- no option no work.
if util.table_empty( options ) then return '' end
-- get the errors.
local violations = calculateViolations( frame, options['doc-subpage'] )
-- special request of bora: use skip_empty_numeric
if violations['empty-undeclared-numeric'] then
for i = 1, tonumber( options['skip-empty-numeric'] ) or 0 do
violations['empty-undeclared-numeric'][i] = nil
end
end
-- handle ignore list, and prune empty violations - in that order!
local offenders = 0
for name, tab in pairs( violations ) do
-- remove ignored parameters from all violations
for pname in pairs( tab ) do if ignore( pname ) then tab[pname] = nil end end
-- prune empty violations
if util.table_empty( tab ) then violations[name] = nil end
-- WORK IS DONE. report the errors.
-- if report then count it.
if violations[name] and report_params( name, tab ) then offenders = offenders + 1 end
end
if offenders > 1 then report_params( 'multiple' ) end
if offenders ~= 0 then report_params( 'any' ) end -- could have tested for empty( report ), but since we count them anyway...
return wrapReport(report, template_name, options)
end
return {
['validateparams'] = validateParams,
['calculateViolations'] = calculateViolations,
['wrapReport'] = wrapReport
}
b2xz8kqfrgct90ewowjyfx1v5w9ke5h
Module:Parameter validation/default config
828
2646
33361
2026-05-15T13:38:37Z
en>MSGJ
0
tweaks by [[User:Mr. Starfleet Command]]
33361
Scribunto
text/plain
local function create_message(msg)
return require('Module:If preview')._warning({
mw.ustring.format('[[templatename]] used with %s.', msg)
})
end
local function create(cat, msg)
return mw.ustring.format('{{main other|[[Category:Pages using tname_naked with %s parameters]]}}', cat) .. create_message(msg)
end
local options = {
['undeclared'] = create('unknown', 'unknown parameter(s): paramname'),
['deprecated'] = create('deprecated', 'deprecated parameter(s): paramname'),
['duplicate'] = create('duplicate', 'duplicate parameter(s): paramandvalue'),
['doc-subpage'] = 'doc',
}
local result = {
[0] = options,
[2] = options,
[4] = options,
[6] = options,
[10] = options,
[12] = options,
[14] = options,
}
return result
5q8hbkx98zpullg796znnwqi8pmpmz7
33362
33361
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Parameter_validation/default_config]]
33361
Scribunto
text/plain
local function create_message(msg)
return require('Module:If preview')._warning({
mw.ustring.format('[[templatename]] used with %s.', msg)
})
end
local function create(cat, msg)
return mw.ustring.format('{{main other|[[Category:Pages using tname_naked with %s parameters]]}}', cat) .. create_message(msg)
end
local options = {
['undeclared'] = create('unknown', 'unknown parameter(s): paramname'),
['deprecated'] = create('deprecated', 'deprecated parameter(s): paramname'),
['duplicate'] = create('duplicate', 'duplicate parameter(s): paramandvalue'),
['doc-subpage'] = 'doc',
}
local result = {
[0] = options,
[2] = options,
[4] = options,
[6] = options,
[10] = options,
[12] = options,
[14] = options,
}
return result
5q8hbkx98zpullg796znnwqi8pmpmz7
Tempilet:Br-separated entries
10
2647
33363
2026-09-12T02:27:13Z
en>BD2412
0
BD2412 moved page [[Template:Br separated entries]] to [[Template:Br-separated entries]] without leaving a redirect: Per outcome of RM at [[Template talk:Horizontal list#Requested move 3 August 2026]]
33363
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:Separated entries|br|dataPlural=1}}<noinclude>
{{documentation}}
</noinclude>
8xv8u5m4k3e3a02h7dtrmmoeszevcr0
33364
33363
2026-11-11T21:54:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Br-separated_entries]]
33363
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:Separated entries|br|dataPlural=1}}<noinclude>
{{documentation}}
</noinclude>
8xv8u5m4k3e3a02h7dtrmmoeszevcr0
Tempilet:Module other
10
2648
33365
2026-04-18T03:45:36Z
en>Pppery
0
Changed protection settings for "[[Template:Module other]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33365
wikitext
text/x-wiki
{{safesubst:<noinclude/>#switch:
<noinclude><!-- If no or empty "demospace" parameter then detect namespace --></noinclude>
{{safesubst:<noinclude/>#if:{{{demospace|}}}
| {{safesubst:<noinclude/>lc: {{{demospace}}} }} <noinclude><!-- Use lower case "demospace" --></noinclude>
| {{safesubst:<noinclude/>#ifeq:{{safesubst:<noinclude/>NAMESPACE}}|{{safesubst:<noinclude/>ns:Module}}
| module
| other
}}
}}
| module = {{{module|{{{1|}}}}}}
| other
| #default = {{{other|{{{2|}}}}}}
}}<noinclude><!--End switch-->
{{documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
6mo4qg9nwfuq6vj2r8irxnjnd71296k
33366
33365
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Module_other]]
33365
wikitext
text/x-wiki
{{safesubst:<noinclude/>#switch:
<noinclude><!-- If no or empty "demospace" parameter then detect namespace --></noinclude>
{{safesubst:<noinclude/>#if:{{{demospace|}}}
| {{safesubst:<noinclude/>lc: {{{demospace}}} }} <noinclude><!-- Use lower case "demospace" --></noinclude>
| {{safesubst:<noinclude/>#ifeq:{{safesubst:<noinclude/>NAMESPACE}}|{{safesubst:<noinclude/>ns:Module}}
| module
| other
}}
}}
| module = {{{module|{{{1|}}}}}}
| other
| #default = {{{other|{{{2|}}}}}}
}}<noinclude><!--End switch-->
{{documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
6mo4qg9nwfuq6vj2r8irxnjnd71296k
Module:Transclusion count/data/M
828
2649
33367
2026-10-18T05:10:36Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33367
Scribunto
text/plain
return {
["M"] = 2400,
["MAD"] = 2200,
["MAR"] = 3100,
["MAS"] = 3000,
["MDA"] = 2100,
["MDG"] = 2400,
["MEX"] = 7000,
["MINUTE"] = 2300,
["MKD"] = 2600,
["MLB_Farm_System"] = 2200,
["MLB_Year"] = 17000,
["MLB_standings"] = 3900,
["MLB_standings/styles.css"] = 4000,
["MLBplayer"] = 4100,
["MMA_record_start"] = 3800,
["MMArecordbox"] = 3800,
["MMSI_Number"] = 3400,
["MONTH"] = 27000,
["MONTHNAME"] = 647000,
["MONTHNUMBER"] = 688000,
["MS"] = 5700,
["MV"] = 10000,
["MYS"] = 4200,
["MacTutor"] = 2100,
["Main"] = 394000,
["Main_article"] = 26000,
["Main_category"] = 2100,
["Main_other"] = 12900000,
["Main_page_image"] = 35000,
["Main_page_image/DYK"] = 17000,
["Main_page_image/ITN/styles.css"] = 4800,
["Main_page_image/TFA"] = 6500,
["Maintenance_category"] = 95000,
["Malay_name"] = 2900,
["Map_requested"] = 6200,
["Map_requested/Category_helper"] = 6200,
["Map_scale"] = 27000,
["Maplink"] = 39000,
["Maplink-road"] = 7300,
["Marriage"] = 106000,
["Marriage/styles.css"] = 106000,
["Math"] = 12000,
["MathGenealogy"] = 7600,
["MathWorld"] = 2400,
["Mathgenealogy"] = 2500,
["Max"] = 2300,
["Maybe"] = 2600,
["Maybe_free_media"] = 10000,
["Maybe_pipe"] = 2400,
["Mbox"] = 4590000,
["Mdash"] = 11000,
["MeSH_name"] = 6000,
["Medal"] = 140000,
["MedalBottom"] = 15000,
["MedalBronze"] = 64000,
["MedalComp"] = 3100,
["MedalCompetition"] = 108000,
["MedalCount"] = 4200,
["MedalCountry"] = 96000,
["MedalGold"] = 63000,
["MedalOlympic"] = 4300,
["MedalOlympics"] = 6000,
["MedalSilver"] = 62000,
["MedalSport"] = 92000,
["MedalTableTop"] = 16000,
["MedalTop"] = 2600,
["MedalistTable"] = 18000,
["Medals_table"] = 17000,
["Media"] = 2700,
["MediaWiki_checkbox"] = 17000,
["Medical_resources"] = 7100,
["Merge_done"] = 5400,
["Merged-from"] = 21000,
["Merged-to"] = 25000,
["MeshName"] = 5900,
["Metacritic_film"] = 3800,
["Metadata_Population_DE-BY"] = 2100,
["Metadata_Population_DE-RP"] = 2500,
["Mi"] = 2900,
["Mid-Class"] = 15000,
["Mid-importance"] = 16000,
["Middot"] = 6500,
["Mil-unit-dis"] = 2000,
["Military_navigation"] = 67000,
["Military_unit_disambiguation"] = 2100,
["Min"] = 28000,
["Minor_planet"] = 5400,
["Minor_planet_link"] = 2700,
["Minor_planet_list_link"] = 4800,
["Minor_planets_navigator"] = 3200,
["MirrorH"] = 7000,
["Missing_information"] = 4400,
["Mlby"] = 17000,
["Mobile_IP"] = 8300,
["MobyGames"] = 11000,
["Moby_game"] = 7300,
["Mod"] = 8100,
["Module_other"] = 2900,
["Module_rating"] = 2400,
["Modulo"] = 8100,
["Mojo_title"] = 7500,
["Molecular_formula_index"] = 2700,
["Monday"] = 2800,
["Mono"] = 34000,
["Mono/styles.css"] = 35000,
["MonthCategoryNav"] = 28000,
["Month_category_navigation"] = 58000,
["Month_events_in_country_category_header"] = 13000,
["Month_in_country_category_header"] = 13000,
["Month_in_country_category_header/inner_core"] = 13000,
["Month_in_country_category_header/outer_core"] = 13000,
["Month_year_by_continent"] = 2000,
["Month_year_by_country"] = 2000,
["Month_year_events_by_continent"] = 2000,
["Month_year_events_by_country"] = 2000,
["Month_year_sports_events_in_country_category_header"] = 11000,
["Month_year_sports_events_in_country_category_header/core"] = 11000,
["MonthlyArchive"] = 4600,
["Monthly_archive_list"] = 5000,
["Monthly_clean-up_category"] = 19000,
["Monthly_clean-up_category/core"] = 19000,
["Monthly_clean-up_category/monthname"] = 19000,
["Monthly_clean-up_category/monthno"] = 19000,
["Monthly_clean-up_category/name_part"] = 19000,
["Monthly_clean-up_category/outer_core"] = 19000,
["Monthly_clean-up_category/styles.css"] = 19000,
["Monthly_clean-up_category/to_add"] = 3200,
["Monthly_clean_up_category"] = 6100,
["Monthly_links"] = 5000,
["Monthyear"] = 54000,
["Monthyear-1"] = 53000,
["MoreInfo"] = 2400,
["More_citations"] = 2000,
["More_citations_needed"] = 435000,
["More_citations_needed_section"] = 22000,
["More_footnotes"] = 22000,
["More_footnotes_needed"] = 56000,
["More_plot"] = 4100,
["More_references"] = 2600,
["More_sources"] = 2400,
["More_sources_needed"] = 2200,
["Moresources"] = 3900,
["Motor_Ship"] = 5700,
["Motor_Vessel"] = 10000,
["Motorsport_result"] = 2100,
["Motorsport_season"] = 3000,
["Motorsport_season/styles.css"] = 3000,
["Move-protected"] = 12000,
["Moved_discussion_from"] = 4300,
["Moved_discussion_to"] = 3500,
["Moved_from"] = 2100,
["Mp"] = 5400,
["Mpl"] = 2600,
["Msrslt"] = 2100,
["MultiReplace"] = 275000,
["Multiple_image"] = 71000,
["Multiple_image/styles.css"] = 71000,
["Multiple_issues"] = 135000,
["Multiple_issues/styles.css"] = 135000,
["Music"] = 10000,
["MusicBrainz_artist"] = 2700,
["MusicBrainz_meta"] = 6200,
["MusicBrainz_release_group"] = 2700,
["Music_ratings"] = 103000,
["Mvar"] = 9000,
["Mw_lang"] = 98000,
["My_sandbox"] = 3800,
["Myprefs"] = 15000,
["Module:MLB_standings"] = 4000,
["Module:MLB_standings/data"] = 4000,
["Module:Main_page_image"] = 24000,
["Module:Make_Wikisource_link"] = 20000,
["Module:Mapframe"] = 1700000,
["Module:Math"] = 1680000,
["Module:Medals_table"] = 17000,
["Module:Message_box"] = 21700000,
["Module:Message_box/ambox.css"] = 4110000,
["Module:Message_box/cmbox.css"] = 543000,
["Module:Message_box/configuration"] = 11800000,
["Module:Message_box/fmbox.css"] = 25000,
["Module:Message_box/imbox.css"] = 1010000,
["Module:Message_box/ombox.css"] = 1960000,
["Module:Message_box/tmbox.css"] = 14500000,
["Module:Military_navigation"] = 93000,
["Module:Minor_planet_list_link"] = 4800,
["Module:MultiReplace"] = 2300000,
["Module:Multiple_image"] = 71000,
["Module:Multiple_issues"] = 135000,
["Module:Music_chart"] = 80000,
["Module:Music_chart/album.json"] = 37000,
["Module:Music_chart/chartdata-canada.json"] = 8400,
["Module:Music_chart/chartdata-czech.json"] = 4600,
["Module:Music_chart/single.json"] = 43000,
["Module:Music_ratings"] = 103000,
["Module:Mw_lang"] = 98000,
}
dy9x9qfjdp045osfe62lf3n7t01c4db
33368
33367
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/M]]
33367
Scribunto
text/plain
return {
["M"] = 2400,
["MAD"] = 2200,
["MAR"] = 3100,
["MAS"] = 3000,
["MDA"] = 2100,
["MDG"] = 2400,
["MEX"] = 7000,
["MINUTE"] = 2300,
["MKD"] = 2600,
["MLB_Farm_System"] = 2200,
["MLB_Year"] = 17000,
["MLB_standings"] = 3900,
["MLB_standings/styles.css"] = 4000,
["MLBplayer"] = 4100,
["MMA_record_start"] = 3800,
["MMArecordbox"] = 3800,
["MMSI_Number"] = 3400,
["MONTH"] = 27000,
["MONTHNAME"] = 647000,
["MONTHNUMBER"] = 688000,
["MS"] = 5700,
["MV"] = 10000,
["MYS"] = 4200,
["MacTutor"] = 2100,
["Main"] = 394000,
["Main_article"] = 26000,
["Main_category"] = 2100,
["Main_other"] = 12900000,
["Main_page_image"] = 35000,
["Main_page_image/DYK"] = 17000,
["Main_page_image/ITN/styles.css"] = 4800,
["Main_page_image/TFA"] = 6500,
["Maintenance_category"] = 95000,
["Malay_name"] = 2900,
["Map_requested"] = 6200,
["Map_requested/Category_helper"] = 6200,
["Map_scale"] = 27000,
["Maplink"] = 39000,
["Maplink-road"] = 7300,
["Marriage"] = 106000,
["Marriage/styles.css"] = 106000,
["Math"] = 12000,
["MathGenealogy"] = 7600,
["MathWorld"] = 2400,
["Mathgenealogy"] = 2500,
["Max"] = 2300,
["Maybe"] = 2600,
["Maybe_free_media"] = 10000,
["Maybe_pipe"] = 2400,
["Mbox"] = 4590000,
["Mdash"] = 11000,
["MeSH_name"] = 6000,
["Medal"] = 140000,
["MedalBottom"] = 15000,
["MedalBronze"] = 64000,
["MedalComp"] = 3100,
["MedalCompetition"] = 108000,
["MedalCount"] = 4200,
["MedalCountry"] = 96000,
["MedalGold"] = 63000,
["MedalOlympic"] = 4300,
["MedalOlympics"] = 6000,
["MedalSilver"] = 62000,
["MedalSport"] = 92000,
["MedalTableTop"] = 16000,
["MedalTop"] = 2600,
["MedalistTable"] = 18000,
["Medals_table"] = 17000,
["Media"] = 2700,
["MediaWiki_checkbox"] = 17000,
["Medical_resources"] = 7100,
["Merge_done"] = 5400,
["Merged-from"] = 21000,
["Merged-to"] = 25000,
["MeshName"] = 5900,
["Metacritic_film"] = 3800,
["Metadata_Population_DE-BY"] = 2100,
["Metadata_Population_DE-RP"] = 2500,
["Mi"] = 2900,
["Mid-Class"] = 15000,
["Mid-importance"] = 16000,
["Middot"] = 6500,
["Mil-unit-dis"] = 2000,
["Military_navigation"] = 67000,
["Military_unit_disambiguation"] = 2100,
["Min"] = 28000,
["Minor_planet"] = 5400,
["Minor_planet_link"] = 2700,
["Minor_planet_list_link"] = 4800,
["Minor_planets_navigator"] = 3200,
["MirrorH"] = 7000,
["Missing_information"] = 4400,
["Mlby"] = 17000,
["Mobile_IP"] = 8300,
["MobyGames"] = 11000,
["Moby_game"] = 7300,
["Mod"] = 8100,
["Module_other"] = 2900,
["Module_rating"] = 2400,
["Modulo"] = 8100,
["Mojo_title"] = 7500,
["Molecular_formula_index"] = 2700,
["Monday"] = 2800,
["Mono"] = 34000,
["Mono/styles.css"] = 35000,
["MonthCategoryNav"] = 28000,
["Month_category_navigation"] = 58000,
["Month_events_in_country_category_header"] = 13000,
["Month_in_country_category_header"] = 13000,
["Month_in_country_category_header/inner_core"] = 13000,
["Month_in_country_category_header/outer_core"] = 13000,
["Month_year_by_continent"] = 2000,
["Month_year_by_country"] = 2000,
["Month_year_events_by_continent"] = 2000,
["Month_year_events_by_country"] = 2000,
["Month_year_sports_events_in_country_category_header"] = 11000,
["Month_year_sports_events_in_country_category_header/core"] = 11000,
["MonthlyArchive"] = 4600,
["Monthly_archive_list"] = 5000,
["Monthly_clean-up_category"] = 19000,
["Monthly_clean-up_category/core"] = 19000,
["Monthly_clean-up_category/monthname"] = 19000,
["Monthly_clean-up_category/monthno"] = 19000,
["Monthly_clean-up_category/name_part"] = 19000,
["Monthly_clean-up_category/outer_core"] = 19000,
["Monthly_clean-up_category/styles.css"] = 19000,
["Monthly_clean-up_category/to_add"] = 3200,
["Monthly_clean_up_category"] = 6100,
["Monthly_links"] = 5000,
["Monthyear"] = 54000,
["Monthyear-1"] = 53000,
["MoreInfo"] = 2400,
["More_citations"] = 2000,
["More_citations_needed"] = 435000,
["More_citations_needed_section"] = 22000,
["More_footnotes"] = 22000,
["More_footnotes_needed"] = 56000,
["More_plot"] = 4100,
["More_references"] = 2600,
["More_sources"] = 2400,
["More_sources_needed"] = 2200,
["Moresources"] = 3900,
["Motor_Ship"] = 5700,
["Motor_Vessel"] = 10000,
["Motorsport_result"] = 2100,
["Motorsport_season"] = 3000,
["Motorsport_season/styles.css"] = 3000,
["Move-protected"] = 12000,
["Moved_discussion_from"] = 4300,
["Moved_discussion_to"] = 3500,
["Moved_from"] = 2100,
["Mp"] = 5400,
["Mpl"] = 2600,
["Msrslt"] = 2100,
["MultiReplace"] = 275000,
["Multiple_image"] = 71000,
["Multiple_image/styles.css"] = 71000,
["Multiple_issues"] = 135000,
["Multiple_issues/styles.css"] = 135000,
["Music"] = 10000,
["MusicBrainz_artist"] = 2700,
["MusicBrainz_meta"] = 6200,
["MusicBrainz_release_group"] = 2700,
["Music_ratings"] = 103000,
["Mvar"] = 9000,
["Mw_lang"] = 98000,
["My_sandbox"] = 3800,
["Myprefs"] = 15000,
["Module:MLB_standings"] = 4000,
["Module:MLB_standings/data"] = 4000,
["Module:Main_page_image"] = 24000,
["Module:Make_Wikisource_link"] = 20000,
["Module:Mapframe"] = 1700000,
["Module:Math"] = 1680000,
["Module:Medals_table"] = 17000,
["Module:Message_box"] = 21700000,
["Module:Message_box/ambox.css"] = 4110000,
["Module:Message_box/cmbox.css"] = 543000,
["Module:Message_box/configuration"] = 11800000,
["Module:Message_box/fmbox.css"] = 25000,
["Module:Message_box/imbox.css"] = 1010000,
["Module:Message_box/ombox.css"] = 1960000,
["Module:Message_box/tmbox.css"] = 14500000,
["Module:Military_navigation"] = 93000,
["Module:Minor_planet_list_link"] = 4800,
["Module:MultiReplace"] = 2300000,
["Module:Multiple_image"] = 71000,
["Module:Multiple_issues"] = 135000,
["Module:Music_chart"] = 80000,
["Module:Music_chart/album.json"] = 37000,
["Module:Music_chart/chartdata-canada.json"] = 8400,
["Module:Music_chart/chartdata-czech.json"] = 4600,
["Module:Music_chart/single.json"] = 43000,
["Module:Music_ratings"] = 103000,
["Module:Mw_lang"] = 98000,
}
dy9x9qfjdp045osfe62lf3n7t01c4db
Tempilet:Qnote
10
2650
33369
2022-03-12T02:28:24Z
en>TEMPO156
0
Reverted 1 edit by [[Special:Contributions/Elliott Damned|Elliott Damned]] ([[User talk:Elliott Damned|talk]]) to last revision by ShakespeareFan00
33369
wikitext
text/x-wiki
<includeonly>:<em>'''Note<sup>{{{sup|}}}</sup>:''' {{{1|{{{note|}}}}}}</em></includeonly>
<noinclude>{{Documentation}}</noinclude>
4i7hd3b2kwvp1j8vsolzmtvg0zqhwn6
33370
33369
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Qnote]]
33369
wikitext
text/x-wiki
<includeonly>:<em>'''Note<sup>{{{sup|}}}</sup>:''' {{{1|{{{note|}}}}}}</em></includeonly>
<noinclude>{{Documentation}}</noinclude>
4i7hd3b2kwvp1j8vsolzmtvg0zqhwn6
Tempilet:Uses Wikidata
10
2651
33371
2023-10-06T20:05:41Z
en>SWinxy
0
Wrap catting in <includeonly> instead of an ifeq
33371
wikitext
text/x-wiki
{{Sister project
| position = {{{position|}}}
| project = data
| text = This {{module other|module|template}} uses {{#if:{{{section|}}} | one or more [[Wikidata]] properties; see {{Section link||{{{section}}}}} for details. | the [[Wikidata]] propert{{#if:{{{2|}}}|ies|y}}:
{{#invoke:Uses Wikidata|usesProperty}}
}}}}<includeonly>{{#switch:{{SUBPAGENAME}}
|sandbox |testcases |doc= <!--no category-->
|#default={{module other |[[Category:Modules using data from Wikidata]] |{{template other |[[Category:Templates using data from Wikidata]]}} }}
}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage -->
</noinclude>
ptftzgzv1nailmf6sz81senyn3mb5nu
33372
33371
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Uses_Wikidata]]
33371
wikitext
text/x-wiki
{{Sister project
| position = {{{position|}}}
| project = data
| text = This {{module other|module|template}} uses {{#if:{{{section|}}} | one or more [[Wikidata]] properties; see {{Section link||{{{section}}}}} for details. | the [[Wikidata]] propert{{#if:{{{2|}}}|ies|y}}:
{{#invoke:Uses Wikidata|usesProperty}}
}}}}<includeonly>{{#switch:{{SUBPAGENAME}}
|sandbox |testcases |doc= <!--no category-->
|#default={{module other |[[Category:Modules using data from Wikidata]] |{{template other |[[Category:Templates using data from Wikidata]]}} }}
}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage -->
</noinclude>
ptftzgzv1nailmf6sz81senyn3mb5nu
Tempilet:Dcr
10
2652
33373
2024-05-21T14:50:48Z
en>Primefac
0
Primefac moved page [[Template:Dcr]] to [[Template:Deprecated code red]]: expand name for clarity
33373
wikitext
text/x-wiki
#REDIRECT [[Template:Deprecated code red]]
{{Redirect category shell|
{{R from move}}
}}
87x8z51quza981n1vfjzeguj96paijz
33374
33373
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Dcr]]
33373
wikitext
text/x-wiki
#REDIRECT [[Template:Deprecated code red]]
{{Redirect category shell|
{{R from move}}
}}
87x8z51quza981n1vfjzeguj96paijz
Tempilet:In source
10
2653
33377
2025-11-18T18:00:42Z
en>MusikBot II
0
Protected "[[Template:In source]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 605 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33377
wikitext
text/x-wiki
<includeonly><span class="selfreference">[[Special:Search/insource:{{{1|{{PAGENAME}}}}}|{{{2|All pages with source code containing "{{{1|{{PAGENAME}}}}}"}}}]]</span></includeonly><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7dd2gs0rerll6ssugcz1kidlnrt21ph
33378
33377
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:In_source]]
33377
wikitext
text/x-wiki
<includeonly><span class="selfreference">[[Special:Search/insource:{{{1|{{PAGENAME}}}}}|{{{2|All pages with source code containing "{{{1|{{PAGENAME}}}}}"}}}]]</span></includeonly><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
7dd2gs0rerll6ssugcz1kidlnrt21ph
Tempilet:Insource
10
2654
33379
2015-07-08T01:35:33Z
en>Jarble
0
[[WP:AES|←]]Redirected page to [[Template:In source]]
33379
wikitext
text/x-wiki
#REDIRECT [[Template:In source]]
670ff68va3znjwj8ibbgdjofyh6hcy0
33380
33379
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Insource]]
33379
wikitext
text/x-wiki
#REDIRECT [[Template:In source]]
670ff68va3znjwj8ibbgdjofyh6hcy0
Tempilet:Marriage/doc
10
2655
33381
2026-09-03T19:05:27Z
en>Neveselbert
0
Reverting edit(s) by [[Special:Contributions/Spectritus|Spectritus]] ([[User_talk:Spectritus|talk]]) to rev. 1351165859 by Andrybak: Reverting [[WP:AGF|good faith]] edits, this interferes with the code [[w:en:WP:RW|(RW 16.1)]]
33381
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{high-use}}
{{Lua|Module:Check for unknown parameters|Module:Parameter validation}}
{{Uses Wikidata|P21|P570}}
{{Uses TemplateStyles|Template:Marriage/styles.css}}
==Usage==
{{TemplateData header}}
<templatedata>{
"format": "inline",
"description": "Intended for use in Infoboxes, specifically {{Infobox person}} and templates calling Infobox person.\n\n{{Marriage}} takes up to three unnamed parameters (name, start date, end date) plus an optional named parameter \"end=\" to provide the reason for the end of the marriage.",
"params": {
"1": {
"label": "Spouse's name",
"description": "Name of the person to whom the subject married. May be omitted, typically for remarriages to the same spouse.",
"type": "string",
"suggested": true
},
"2": {
"label": "Date married",
"description": "Date the marriage began.",
"type": "date",
"suggested": true
},
"3": {
"label": "Date ended",
"description": "Date the marriage was dissolved or the spouse of the article's subject died.",
"type": "date",
"required": false
},
"end": {
"label": "Reason marriage ended",
"description": "Reason for marriage's end. Suggested reasons are automatically abbreviated. If the marriage ended due to death of article's subject, do not provide a reason.",
"type": "string",
"required": false,
"aliases": [
"reason"
],
"suggestedvalues": [
"died",
"divorced",
"separated",
"annulled"
]
}
}
}</templatedata>
===Examples and usage notes===
{{Infobox person|name={{tl|Infobox person}}
|spouse = {{Plainlist|
* {{marriage |John Smith |1 January 1895 |December 31, 1905}}
* {{marriage |John Doe |1885 |July 27, 1888 |end=d.}}
* {{marriage |[[Jane Doe]] (ABX) |2002}}
* {{marriage |John Q. Public |2002|2010}}
* {{marriage |John Q. Citizen |2002|2010|end=div}}
* {{marriage |<!--John Q. Citizen-->|2012}}
* {{marriage |John Q. Taxpayer |2002|end=div}}
* {{marriage |Joe Blow|<!--unknown-->|2010|end=div}}
* {{marriage |Joe Bloggs|<!--unknown-->|2010}}
* {{marriage |Joe Sixpack|<!--unknown-->|2010|end=<!--uncertain-->}}
* {{marriage |Joe Schmo |end=div}}
* {{marriage |Juan Perez |2010|reason=<!--earliest-->}} }}
}}
Infoboxes already reduce text size to 88%, and [[MOS:FONTSIZE]] sets a lower limit for text size at 85% of the normal page font size, so it is not appropriate to use font size reduction when this template is used in an infobox. The example here is produced by:
<syntaxhighlight style="font-size:small;" lang="wikitext">
{{Infobox person |spouse = {{Plainlist|
* {{marriage |John Smith |1 January 1895 |December 31, 1905}}
* {{marriage |John Doe |1885 |July 27, 1888 |end=d.}}
* {{marriage |[[Jane Doe]] (ABX) |2002}}
* {{marriage |John Q. Public |2002|2010}}
* {{marriage |John Q. Citizen |2002|2010|end=div}}
* {{marriage |<!--John Q. Citizen-->|2012}}
* {{marriage |John Q. Taxpayer |2002|end=div}}
* {{marriage |Joe Blow|<!--unknown-->|2010|end=div}}
* {{marriage |Joe Bloggs|<!--unknown-->|2010}}
* {{marriage |Joe Sixpack|<!--unknown-->|2010|end=<!--uncertain-->}}
* {{marriage |Joe Schmo |end=div}}
* {{marriage |Juan Perez |2010|reason=<!--earliest-->}} }}
}}
</syntaxhighlight>
* None of the parameters are required on their own, but if a template is missing all three of start date, end date, and reason, an error message will be displayed.
* Use of the first two parameters with {{para|end}} ({{para|reason}}) will cause a line break between the name and the start date.
* Use of {{dc|his death}} or {{dc|her death}} for this purpose has been deprecated ([[Template talk:Marriage/Archive 5#Use "(m. 1900)" and do not fill in an end date|see discussion]]).
* If the marriage ended with the death of the article's subject, {{insource|"Omission per Template:Marriage instructions"|do {{em|not}} provide a date}}.
* For either date parameter, only the year will be displayed; if a full date is provided, it is included via a tooltip; i.e., {{tla|Tooltip}}.
{{qnote|Use of the values {{dcr|w}}, {{dcr|w.}}, {{dcr|wid}}, {{dcr|wid.}}, {{dcr|widow}}, or {{dcr|widowed}} is [[Template talk:Marriage/Archive 4#Who is widowed - topic or topic's spouse?|no longer supported]] and will display an error message.}}
==Tracking categories==
* {{Category link with count|Marriage template errors}}{{sup|†}}
* {{Category link with count|Pages using Marriage with duplicate parameters}} {{sup|‡}}
* {{Category link with count|Pages using Marriage with unknown parameters}} {{sup|‡}}
{{plainlist|
* {{small|{{sup|†}} Populated by template logic; contains invalid/missing dates and unsupported parameters/values.}}
* {{small|{{sup|‡}} Populated via [[Module:Parameter_validation|parameter validation]].}}
}}
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Text-specific formatting and function templates]]
[[Category:Marriage templates]]
[[Category:Templates that add a tracking category|{{PAGENAME}}]]
}}</includeonly>
6g1sy8ws2k3romvl8vk4fu1f9zf2qyr
33382
33381
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Marriage/doc]]
33381
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{high-use}}
{{Lua|Module:Check for unknown parameters|Module:Parameter validation}}
{{Uses Wikidata|P21|P570}}
{{Uses TemplateStyles|Template:Marriage/styles.css}}
==Usage==
{{TemplateData header}}
<templatedata>{
"format": "inline",
"description": "Intended for use in Infoboxes, specifically {{Infobox person}} and templates calling Infobox person.\n\n{{Marriage}} takes up to three unnamed parameters (name, start date, end date) plus an optional named parameter \"end=\" to provide the reason for the end of the marriage.",
"params": {
"1": {
"label": "Spouse's name",
"description": "Name of the person to whom the subject married. May be omitted, typically for remarriages to the same spouse.",
"type": "string",
"suggested": true
},
"2": {
"label": "Date married",
"description": "Date the marriage began.",
"type": "date",
"suggested": true
},
"3": {
"label": "Date ended",
"description": "Date the marriage was dissolved or the spouse of the article's subject died.",
"type": "date",
"required": false
},
"end": {
"label": "Reason marriage ended",
"description": "Reason for marriage's end. Suggested reasons are automatically abbreviated. If the marriage ended due to death of article's subject, do not provide a reason.",
"type": "string",
"required": false,
"aliases": [
"reason"
],
"suggestedvalues": [
"died",
"divorced",
"separated",
"annulled"
]
}
}
}</templatedata>
===Examples and usage notes===
{{Infobox person|name={{tl|Infobox person}}
|spouse = {{Plainlist|
* {{marriage |John Smith |1 January 1895 |December 31, 1905}}
* {{marriage |John Doe |1885 |July 27, 1888 |end=d.}}
* {{marriage |[[Jane Doe]] (ABX) |2002}}
* {{marriage |John Q. Public |2002|2010}}
* {{marriage |John Q. Citizen |2002|2010|end=div}}
* {{marriage |<!--John Q. Citizen-->|2012}}
* {{marriage |John Q. Taxpayer |2002|end=div}}
* {{marriage |Joe Blow|<!--unknown-->|2010|end=div}}
* {{marriage |Joe Bloggs|<!--unknown-->|2010}}
* {{marriage |Joe Sixpack|<!--unknown-->|2010|end=<!--uncertain-->}}
* {{marriage |Joe Schmo |end=div}}
* {{marriage |Juan Perez |2010|reason=<!--earliest-->}} }}
}}
Infoboxes already reduce text size to 88%, and [[MOS:FONTSIZE]] sets a lower limit for text size at 85% of the normal page font size, so it is not appropriate to use font size reduction when this template is used in an infobox. The example here is produced by:
<syntaxhighlight style="font-size:small;" lang="wikitext">
{{Infobox person |spouse = {{Plainlist|
* {{marriage |John Smith |1 January 1895 |December 31, 1905}}
* {{marriage |John Doe |1885 |July 27, 1888 |end=d.}}
* {{marriage |[[Jane Doe]] (ABX) |2002}}
* {{marriage |John Q. Public |2002|2010}}
* {{marriage |John Q. Citizen |2002|2010|end=div}}
* {{marriage |<!--John Q. Citizen-->|2012}}
* {{marriage |John Q. Taxpayer |2002|end=div}}
* {{marriage |Joe Blow|<!--unknown-->|2010|end=div}}
* {{marriage |Joe Bloggs|<!--unknown-->|2010}}
* {{marriage |Joe Sixpack|<!--unknown-->|2010|end=<!--uncertain-->}}
* {{marriage |Joe Schmo |end=div}}
* {{marriage |Juan Perez |2010|reason=<!--earliest-->}} }}
}}
</syntaxhighlight>
* None of the parameters are required on their own, but if a template is missing all three of start date, end date, and reason, an error message will be displayed.
* Use of the first two parameters with {{para|end}} ({{para|reason}}) will cause a line break between the name and the start date.
* Use of {{dc|his death}} or {{dc|her death}} for this purpose has been deprecated ([[Template talk:Marriage/Archive 5#Use "(m. 1900)" and do not fill in an end date|see discussion]]).
* If the marriage ended with the death of the article's subject, {{insource|"Omission per Template:Marriage instructions"|do {{em|not}} provide a date}}.
* For either date parameter, only the year will be displayed; if a full date is provided, it is included via a tooltip; i.e., {{tla|Tooltip}}.
{{qnote|Use of the values {{dcr|w}}, {{dcr|w.}}, {{dcr|wid}}, {{dcr|wid.}}, {{dcr|widow}}, or {{dcr|widowed}} is [[Template talk:Marriage/Archive 4#Who is widowed - topic or topic's spouse?|no longer supported]] and will display an error message.}}
==Tracking categories==
* {{Category link with count|Marriage template errors}}{{sup|†}}
* {{Category link with count|Pages using Marriage with duplicate parameters}} {{sup|‡}}
* {{Category link with count|Pages using Marriage with unknown parameters}} {{sup|‡}}
{{plainlist|
* {{small|{{sup|†}} Populated by template logic; contains invalid/missing dates and unsupported parameters/values.}}
* {{small|{{sup|‡}} Populated via [[Module:Parameter_validation|parameter validation]].}}
}}
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Text-specific formatting and function templates]]
[[Category:Marriage templates]]
[[Category:Templates that add a tracking category|{{PAGENAME}}]]
}}</includeonly>
6g1sy8ws2k3romvl8vk4fu1f9zf2qyr
Tempilet:Marriage/styles.css
10
2656
33383
2025-07-04T20:30:48Z
en>Paine Ellsworth
0
per edit request on talk page - remove unwanted property
33383
sanitized-css
text/css
/* {{pp-template}} */
.marriage-line-margin2px {
line-height: 0;
margin-bottom: -2px;
}
.marriage-line-margin3px {
line-height: 0;
margin-bottom: -3px;
}
.marriage-display-inline {
display: inline;
}
svkk90r9qcgelhufx0yirkmdwf7ntrk
33384
33383
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Marriage/styles.css]]
33383
sanitized-css
text/css
/* {{pp-template}} */
.marriage-line-margin2px {
line-height: 0;
margin-bottom: -2px;
}
.marriage-line-margin3px {
line-height: 0;
margin-bottom: -3px;
}
.marriage-display-inline {
display: inline;
}
svkk90r9qcgelhufx0yirkmdwf7ntrk
Tempilet:Deprecated code red
10
2657
33385
2025-03-09T10:16:35Z
en>Shkuru Afshar
0
33385
wikitext
text/x-wiki
{{Deprecated code|red=y|{{{1|Example text}}}}}<noinclude>
{{documentation|Template:Deprecated code/doc}}
<!-- Please add documentation and categories to the /doc subpage, interwikis to Wikidata, thank you -->
</noinclude>
nnzhg9piwznp35ceevmejv96r3otjrk
33386
33385
2026-11-11T21:54:27Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Deprecated_code_red]]
33385
wikitext
text/x-wiki
{{Deprecated code|red=y|{{{1|Example text}}}}}<noinclude>
{{documentation|Template:Deprecated code/doc}}
<!-- Please add documentation and categories to the /doc subpage, interwikis to Wikidata, thank you -->
</noinclude>
nnzhg9piwznp35ceevmejv96r3otjrk
Module:I18n
828
2658
33393
2025-05-05T01:09:55Z
en>Awesome Aasim
0
33393
Scribunto
text/plain
--- I18n library for message storage in Lua datastores.
-- The module is designed to enable message separation from modules &
-- templates. It has support for handling language fallbacks. This
-- module is a Lua port of [[wikia:dev:I18n-js]] and i18n modules that can be loaded
-- by it are editable through [[wikia:dev:I18nEdit]].
--
-- On Wikimedia projects, i18n messages are editable
-- through [[c:Special:PrefixIndex/Data:i18n/|Data:i18n/]] subpages on
-- Wikimedia Commons.
--
-- @module i18n
-- @version 1.4.0
-- @require Module:Entrypoint
-- @require Module:Fallbacklist
-- @author [[wikia:dev:User:KockaAdmiralac|KockaAdmiralac]] (original Fandom implementation)
-- @author [[wikia:dev:User:Speedit|Speedit]] (original Fandom implementation)
-- @author [[User:Awesome Aasim|Awesome Aasim]] (Wikimedia port)
-- @attribution [[wikia:dev:User:Cqm|Cqm]]
-- @release beta
-- @see [[wikia:dev:I18n|I18n guide]]
-- @see [[wikia:dev:I18n-js]]
-- @see [[wikia:dev:I18nEdit]]
-- <nowiki>
local i18n, _i18n = {}, {}
-- Module variables & dependencies.
local title = mw.title.getCurrentTitle()
local fallbacks = require('Module:Fallbacklist')
local entrypoint = require('Module:Entrypoint')
local uselang
--- Argument substitution as $n where n > 0.
-- @function _i18n.handleArgs
-- @param {string} msg Message to substitute arguments into.
-- @param {table} args Arguments table to substitute.
-- @return {string} Resulting message.
-- @local
function _i18n.handleArgs(msg, args)
for i, a in ipairs(args) do
msg = (string.gsub(msg, '%$' .. tostring(i), tostring(a)))
end
return msg
end
--- Checks whether a language code is valid.
-- @function _i18n.isValidCode
-- @param {string} code Language code to check.
-- @return {boolean} Whether the language code is valid.
-- @local
function _i18n.isValidCode(code)
return type(code) == 'string' and #mw.language.fetchLanguageName(code) ~= 0
end
--- Checks whether a message contains unprocessed wikitext.
-- Used to optimise message getter by not preprocessing pure text.
-- @function _i18n.isWikitext
-- @param {string} msg Message to check.
-- @return {boolean} Whether the message contains wikitext.
function _i18n.isWikitext(msg)
return
type(msg) == 'string' and
(
msg:find('%-%-%-%-') or
msg:find('%f[^\n%z][;:*#] ') or
msg:find('%f[^\n%z]==* *[^\n|]+ =*=%f[\n]') or
msg:find('%b<>') or msg:find('\'\'') or
msg:find('%[%b[]%]') or msg:find('{%b{}}')
)
end
--- I18n datastore class.
-- This is used to control language translation and access to individual
-- messages. The datastore instance provides language and message
-- getter-setter methods, which can be used to internationalize Lua modules.
-- The language methods (any ending in `Lang`) are all **chainable**.
-- @type Data
local Data = {}
Data.__index = Data
--- Datastore message getter utility.
-- This method returns localized messages from the datastore corresponding
-- to a `key`. These messages may have `$n` parameters, which can be
-- replaced by optional argument strings supplied by the `msg` call.
--
-- This function supports [[mw:Extension:Scribunto/Lua reference manual#named_arguments|named
-- arguments]]. The named argument syntax is more versatile despite its
-- verbosity; it can be used to select message language & source(s).
-- @function Data:msg
-- @usage
--
-- ds:msg{
-- key = 'message-name',
-- lang = '',
-- args = {...},
-- sources = {}
-- }
--
-- @usage
--
-- ds:msg('message-name', ...)
--
-- @param {string|table} opts Message configuration or key.
-- @param[opt] {string} opts.key Message key to return from the
-- datastore.
-- @param[opt] {table} opts.args Arguments to substitute into the
-- message (`$n`).
-- @param[opt] {table} opts.sources Source names to limit to (see
-- `Data:fromSources`).
-- @param[opt] {table} opts.lang Temporary language to use (see
-- `Data:inLang`).
-- @param[opt] {string} ... Arguments to substitute into the message
-- (`$n`).
-- @error[115] {string} 'missing arguments in Data:msg'
-- @return {string} Localised datastore message or `'<key>'`.
function Data:msg(opts, ...)
local frame = mw.getCurrentFrame()
-- Argument normalization.
if not self or not opts then
error('missing arguments in Data:msg')
end
local key = type(opts) == 'table' and opts.key or opts
local args = opts.args or {...}
-- Configuration parameters.
if opts.sources then
self:fromSources(unpack(opts.sources))
end
if opts.lang then
self:inLang(opts.lang)
end
-- Source handling.
local source_n = self.tempSources or self._sources
local source_i = {}
for n, i in pairs(source_n) do
source_i[i] = n
end
self.tempSources = nil
-- Language handling.
local lang = self.tempLang or self.defaultLang
self.tempLang = nil
-- Message fetching.
local msg
for i, messages in ipairs(self._messages) do
-- Message data.
local msg = (messages[lang] or {})[key]
-- Fallback support (experimental).
for _, l in ipairs((fallbacks[lang] or {})) do
if msg == nil then
msg = (messages[l] or {})[key]
end
end
-- Internal fallback to 'en'.
msg = msg ~= nil and msg or messages.en[key]
-- Handling argument substitution from Lua.
if msg and source_i[i] and #args > 0 then
msg = _i18n.handleArgs(msg, args)
end
if msg and source_i[i] and lang ~= 'qqx' then
return frame and _i18n.isWikitext(msg)
and frame:preprocess(mw.text.trim(msg))
or mw.text.trim(msg)
end
end
return '⧼' .. mw.text.nowiki(key) .. '⧽'
end
--- Datastore template parameter getter utility.
-- This method, given a table of arguments, tries to find a parameter's
-- localized name in the datastore and returns its value, or nil if
-- not present.
--
-- This method always uses the wiki's content language.
-- @function Data:parameter
-- @param {string} parameter Parameter's key in the datastore
-- @param {table} args Arguments to find the parameter in
-- @error[176] {string} 'missing arguments in Data:parameter'
-- @return {string|nil} Parameter's value or nil if not present
function Data:parameter(key, args)
-- Argument normalization.
if not self or not key or not args then
error('missing arguments in Data:parameter')
end
local contentLang = mw.language.getContentLanguage():getCode()
-- Message fetching.
for i, messages in ipairs(self._messages) do
local msg = (messages[contentLang] or {})[key]
if msg ~= nil and args[msg] ~= nil then
return args[msg]
end
for _, l in ipairs((fallbacks[contentLang] or {})) do
if msg == nil or args[msg] == nil then
-- Check next fallback.
msg = (messages[l] or {})[key]
else
-- A localized message was found.
return args[msg]
end
end
-- Fallback to English.
msg = messages.en[key]
if msg ~= nil and args[msg] ~= nil then
return args[msg]
end
end
end
--- Datastore temporary source setter to a specificed subset of datastores.
-- By default, messages are fetched from the datastore in the same
-- order of priority as `i18n.loadMessages`.
-- @function Data:fromSource
-- @param {string} ... Source name(s) to use.
-- @return {Data} Datastore instance.
function Data:fromSource(...)
local c = select('#', ...)
if c ~= 0 then
self.tempSources = {}
for i = 1, c do
local n = select(i, ...)
if type(n) == 'string' and type(self._sources[n]) == 'number' then
self.tempSources[n] = self._sources[n]
end
end
end
return self
end
--- Datastore default language getter.
-- @function Data:getLang
-- @return {string} Default language to serve datastore messages in.
function Data:getLang()
return self.defaultLang
end
--- Datastore language setter to `wgUserLanguage`.
-- @function Data:useUserLang
-- @return {Data} Datastore instance.
-- @note Scribunto only registers `wgUserLanguage` when an
-- invocation is at the top of the call stack.
function Data:useUserLang()
self.defaultLang = i18n.getLang() or self.defaultLang
return self
end
--- Datastore language setter to `wgContentLanguage`.
-- @function Data:useContentLang
-- @return {Data} Datastore instance.
function Data:useContentLang()
self.defaultLang = mw.language.getContentLanguage():getCode()
return self
end
--- Datastore language setter to specificed language.
-- @function Data:useLang
-- @param {string} code Language code to use.
-- @return {Data} Datastore instance.
function Data:useLang(code)
self.defaultLang = _i18n.isValidCode(code)
and code
or self.defaultLang
return self
end
--- Temporary datastore language setter to `wgUserLanguage`.
-- The datastore language reverts to the default language in the next
-- @{Data:msg} call.
-- @function Data:inUserLang
-- @return {Data} Datastore instance.
function Data:inUserLang()
self.tempLang = i18n.getLang() or self.tempLang
return self
end
--- Temporary datastore language setter to `wgContentLanguage`.
-- Only affects the next @{Data:msg} call.
-- @function Data:inContentLang
-- @return {Data} Datastore instance.
function Data:inContentLang()
self.tempLang = mw.language.getContentLanguage():getCode()
return self
end
--- Temporary datastore language setter to a specificed language.
-- Only affects the next @{Data:msg} call.
-- @function Data:inLang
-- @param {string} code Language code to use.
-- @return {Data} Datastore instance.
function Data:inLang(code)
self.tempLang = _i18n.isValidCode(code)
and code
or self.tempLang
return self
end
-- Package functions.
--- Localized message getter by key.
-- Can be used to fetch messages in a specific language code through `uselang`
-- parameter. Extra numbered parameters can be supplied for substitution into
-- the datastore message.
-- @function i18n.getMsg
-- @param {table} frame Frame table from invocation.
-- @param {table} frame.args Metatable containing arguments.
-- @param {string} frame.args[1] ROOTPAGENAME of i18n submodule.
-- @param {string} frame.args[2] Key of i18n message.
-- @param[opt] {string} frame.args.lang Default language of message.
-- @error[271] {string} 'missing arguments in i18n.getMsg'
-- @return {string} I18n message in localised language.
function i18n.getMsg(frame)
if
not frame or
not frame.args or
not frame.args[1] or
not frame.args[2]
then
error('missing arguments in i18n.getMsg')
end
local source = frame.args[1]
local key = frame.args[2]
-- Pass through extra arguments.
local repl = {}
for i, a in ipairs(frame.args) do
if i >= 3 then
repl[i-2] = a
end
end
-- Load message data.
local ds = i18n.loadMessages(source)
-- Pass through language argument.
ds:inLang(frame.args.uselang)
-- Return message.
return ds:msg { key = key, args = repl }
end
--- I18n message datastore loader.
-- @function i18n.loadMessages
-- @param {string} ... ROOTPAGENAME/path for target i18n
-- submodules.
-- @error[322] {string} 'no source supplied to i18n.loadMessages'
-- @return {table} I18n datastore instance.
-- @usage require('Module:I18n').loadMessages('1', '2')
function i18n.loadMessages(...)
local ds
local i = 0
local s = {}
for j = 1, select('#', ...) do
local source = select(j, ...)
if type(source) == 'string' and source ~= '' then
i = i + 1
s[source] = i
if not ds then
-- Instantiate datastore.
ds = {}
ds._messages = {}
-- Set default language.
setmetatable(ds, Data)
ds:useUserLang()
end
source = string.gsub(source, '^.', mw.ustring.upper)
local success, messages = pcall(mw.loadData, mw.ustring.find(source, ':')
and source
or 'Module:' .. source .. '/i18n')
if success then
local msgCopy = {}
local langSecond = nil
for lang_id, msgtbl in pairs(messages) do
if langSecond == nil then
if lang_id == "qqq" or fallbacks[lang_id] ~= nil then
langSecond = false
else
langSecond = true
end
end
for id_lang, msg in pairs(msgtbl) do
if langSecond then
msgCopy[id_lang] = msgCopy[id_lang] or {}
msgCopy[id_lang][lang_id] = msg
else
msgCopy[lang_id] = msgCopy[lang_id] or {}
msgCopy[lang_id][id_lang] = msg
end
end
end
ds._messages[i] = msgCopy
end
local tab = mw.ext.data.get('I18n/' .. source .. '.tab', '_')
local T = {}
if not success and not tab then error("i18n for " .. source .. " is missing") end
for _, row in pairs(tab.data) do -- convert the output into a dictionary table
local id, t = unpack(row)
for lang, msg in pairs(t) do
if not T[lang] then T[lang] = {} end
T[lang][id] = msg
end
end
if not success then
ds._messages[i] = T
else
for lang, msgTbl in pairs(T) do
ds._messages[i][lang] = ds._messages[i][lang] or msgTbl
end
end
end
end
if not ds then
error('no source supplied to i18n.loadMessages')
else
-- Attach source index map.
ds._sources = s
-- Return datastore instance.
return ds
end
end
--- Language code getter.
-- Can validate a template's language code through `uselang` parameter.
-- @function i18n.getLang
-- @return {string} Language code.
function i18n.getLang()
local frame = mw.getCurrentFrame() or {}
local parentFrame = frame.getParent and frame:getParent() or {}
local code = mw.language.getContentLanguage():getCode()
local subPage = title.subpageText
-- Language argument test.
local langOverride =
(frame.args or {}).uselang or
(parentFrame.args or {}).uselang
if _i18n.isValidCode(langOverride) then
code = langOverride
-- Subpage language test.
elseif title.isSubpage and _i18n.isValidCode(subPage) then
code = _i18n.isValidCode(subPage) and subPage or code
-- User language test.
elseif parentFrame.preprocess or frame.preprocess then
uselang = uselang
or parentFrame.preprocess
and parentFrame:preprocess('{{int:lang}}')
or frame:preprocess('{{int:lang}}')
local decodedLang = mw.text.decode(uselang)
if decodedLang ~= '<lang>' and decodedLang ~= '⧼lang⧽' then
code = decodedLang == '(lang)'
and 'qqx'
or uselang
end
end
return code
end
-- Credit to http://stackoverflow.com/a/1283608/2644759
-- cc-by-sa 3.0
local function tableMerge(t1, t2, overwrite)
for k,v in pairs(t2) do
if type(v) == "table" and type(t1[k]) == "table" then
-- since type(t1[k]) == type(v) == "table", so t1[k] and v is true
tableMerge(t1[k], v, overwrite) -- t2[k] == v
else
if overwrite or t1[k] == nil then t1[k] = v end
end
end
return t1
end
--- Given an i18n table instantiates the values (deprecated)
-- @function i18n.loadI18n
-- @param {string} name name of module with i18n
-- @param {table} i18n_arg existing i18n
function i18n.loadI18n(name, i18n_arg)
local exist, res = pcall(require, name)
if exist and next(res) ~= nil then
if i18n_arg then
tableMerge(i18n_arg, res.i18n, true)
end
end
end
--- Loads an i18n for a specific frame (deprecated)
-- @function i18n.loadI18nFrame
-- @param {string} name name of module with i18n
-- @param {table} i18n_arg existing i18n
function i18n.loadI18nFrame(frame, i18n_arg)
return i18n.loadI18n(frame:getTitle().."/i18n", i18n_arg)
end
--- Wrapper for the module.
-- @function i18n.main
-- @param {table} frame Frame invocation object.
-- @return {string} Module output in template context.
-- @usage {{#invoke:i18n|main}}
i18n.main = entrypoint(i18n)
return require("Module:Deprecated")(i18n,
{
["loadI18n"] = {
deprecated = true,
replacement = "use <code>i18n.loadMessages</code>"
},
["loadI18nFrame"] = {
deprecated = true,
replacement = "use <code>i18n.loadMessages</code>"
}
}
)
-- </nowiki>
mgfuyxvne0w09w2187b5onpo2rwoh53
33394
33393
2026-11-11T21:55:14Z
RAPTOR7762
18
1 revision imported from [[:en:Module:I18n]]
33393
Scribunto
text/plain
--- I18n library for message storage in Lua datastores.
-- The module is designed to enable message separation from modules &
-- templates. It has support for handling language fallbacks. This
-- module is a Lua port of [[wikia:dev:I18n-js]] and i18n modules that can be loaded
-- by it are editable through [[wikia:dev:I18nEdit]].
--
-- On Wikimedia projects, i18n messages are editable
-- through [[c:Special:PrefixIndex/Data:i18n/|Data:i18n/]] subpages on
-- Wikimedia Commons.
--
-- @module i18n
-- @version 1.4.0
-- @require Module:Entrypoint
-- @require Module:Fallbacklist
-- @author [[wikia:dev:User:KockaAdmiralac|KockaAdmiralac]] (original Fandom implementation)
-- @author [[wikia:dev:User:Speedit|Speedit]] (original Fandom implementation)
-- @author [[User:Awesome Aasim|Awesome Aasim]] (Wikimedia port)
-- @attribution [[wikia:dev:User:Cqm|Cqm]]
-- @release beta
-- @see [[wikia:dev:I18n|I18n guide]]
-- @see [[wikia:dev:I18n-js]]
-- @see [[wikia:dev:I18nEdit]]
-- <nowiki>
local i18n, _i18n = {}, {}
-- Module variables & dependencies.
local title = mw.title.getCurrentTitle()
local fallbacks = require('Module:Fallbacklist')
local entrypoint = require('Module:Entrypoint')
local uselang
--- Argument substitution as $n where n > 0.
-- @function _i18n.handleArgs
-- @param {string} msg Message to substitute arguments into.
-- @param {table} args Arguments table to substitute.
-- @return {string} Resulting message.
-- @local
function _i18n.handleArgs(msg, args)
for i, a in ipairs(args) do
msg = (string.gsub(msg, '%$' .. tostring(i), tostring(a)))
end
return msg
end
--- Checks whether a language code is valid.
-- @function _i18n.isValidCode
-- @param {string} code Language code to check.
-- @return {boolean} Whether the language code is valid.
-- @local
function _i18n.isValidCode(code)
return type(code) == 'string' and #mw.language.fetchLanguageName(code) ~= 0
end
--- Checks whether a message contains unprocessed wikitext.
-- Used to optimise message getter by not preprocessing pure text.
-- @function _i18n.isWikitext
-- @param {string} msg Message to check.
-- @return {boolean} Whether the message contains wikitext.
function _i18n.isWikitext(msg)
return
type(msg) == 'string' and
(
msg:find('%-%-%-%-') or
msg:find('%f[^\n%z][;:*#] ') or
msg:find('%f[^\n%z]==* *[^\n|]+ =*=%f[\n]') or
msg:find('%b<>') or msg:find('\'\'') or
msg:find('%[%b[]%]') or msg:find('{%b{}}')
)
end
--- I18n datastore class.
-- This is used to control language translation and access to individual
-- messages. The datastore instance provides language and message
-- getter-setter methods, which can be used to internationalize Lua modules.
-- The language methods (any ending in `Lang`) are all **chainable**.
-- @type Data
local Data = {}
Data.__index = Data
--- Datastore message getter utility.
-- This method returns localized messages from the datastore corresponding
-- to a `key`. These messages may have `$n` parameters, which can be
-- replaced by optional argument strings supplied by the `msg` call.
--
-- This function supports [[mw:Extension:Scribunto/Lua reference manual#named_arguments|named
-- arguments]]. The named argument syntax is more versatile despite its
-- verbosity; it can be used to select message language & source(s).
-- @function Data:msg
-- @usage
--
-- ds:msg{
-- key = 'message-name',
-- lang = '',
-- args = {...},
-- sources = {}
-- }
--
-- @usage
--
-- ds:msg('message-name', ...)
--
-- @param {string|table} opts Message configuration or key.
-- @param[opt] {string} opts.key Message key to return from the
-- datastore.
-- @param[opt] {table} opts.args Arguments to substitute into the
-- message (`$n`).
-- @param[opt] {table} opts.sources Source names to limit to (see
-- `Data:fromSources`).
-- @param[opt] {table} opts.lang Temporary language to use (see
-- `Data:inLang`).
-- @param[opt] {string} ... Arguments to substitute into the message
-- (`$n`).
-- @error[115] {string} 'missing arguments in Data:msg'
-- @return {string} Localised datastore message or `'<key>'`.
function Data:msg(opts, ...)
local frame = mw.getCurrentFrame()
-- Argument normalization.
if not self or not opts then
error('missing arguments in Data:msg')
end
local key = type(opts) == 'table' and opts.key or opts
local args = opts.args or {...}
-- Configuration parameters.
if opts.sources then
self:fromSources(unpack(opts.sources))
end
if opts.lang then
self:inLang(opts.lang)
end
-- Source handling.
local source_n = self.tempSources or self._sources
local source_i = {}
for n, i in pairs(source_n) do
source_i[i] = n
end
self.tempSources = nil
-- Language handling.
local lang = self.tempLang or self.defaultLang
self.tempLang = nil
-- Message fetching.
local msg
for i, messages in ipairs(self._messages) do
-- Message data.
local msg = (messages[lang] or {})[key]
-- Fallback support (experimental).
for _, l in ipairs((fallbacks[lang] or {})) do
if msg == nil then
msg = (messages[l] or {})[key]
end
end
-- Internal fallback to 'en'.
msg = msg ~= nil and msg or messages.en[key]
-- Handling argument substitution from Lua.
if msg and source_i[i] and #args > 0 then
msg = _i18n.handleArgs(msg, args)
end
if msg and source_i[i] and lang ~= 'qqx' then
return frame and _i18n.isWikitext(msg)
and frame:preprocess(mw.text.trim(msg))
or mw.text.trim(msg)
end
end
return '⧼' .. mw.text.nowiki(key) .. '⧽'
end
--- Datastore template parameter getter utility.
-- This method, given a table of arguments, tries to find a parameter's
-- localized name in the datastore and returns its value, or nil if
-- not present.
--
-- This method always uses the wiki's content language.
-- @function Data:parameter
-- @param {string} parameter Parameter's key in the datastore
-- @param {table} args Arguments to find the parameter in
-- @error[176] {string} 'missing arguments in Data:parameter'
-- @return {string|nil} Parameter's value or nil if not present
function Data:parameter(key, args)
-- Argument normalization.
if not self or not key or not args then
error('missing arguments in Data:parameter')
end
local contentLang = mw.language.getContentLanguage():getCode()
-- Message fetching.
for i, messages in ipairs(self._messages) do
local msg = (messages[contentLang] or {})[key]
if msg ~= nil and args[msg] ~= nil then
return args[msg]
end
for _, l in ipairs((fallbacks[contentLang] or {})) do
if msg == nil or args[msg] == nil then
-- Check next fallback.
msg = (messages[l] or {})[key]
else
-- A localized message was found.
return args[msg]
end
end
-- Fallback to English.
msg = messages.en[key]
if msg ~= nil and args[msg] ~= nil then
return args[msg]
end
end
end
--- Datastore temporary source setter to a specificed subset of datastores.
-- By default, messages are fetched from the datastore in the same
-- order of priority as `i18n.loadMessages`.
-- @function Data:fromSource
-- @param {string} ... Source name(s) to use.
-- @return {Data} Datastore instance.
function Data:fromSource(...)
local c = select('#', ...)
if c ~= 0 then
self.tempSources = {}
for i = 1, c do
local n = select(i, ...)
if type(n) == 'string' and type(self._sources[n]) == 'number' then
self.tempSources[n] = self._sources[n]
end
end
end
return self
end
--- Datastore default language getter.
-- @function Data:getLang
-- @return {string} Default language to serve datastore messages in.
function Data:getLang()
return self.defaultLang
end
--- Datastore language setter to `wgUserLanguage`.
-- @function Data:useUserLang
-- @return {Data} Datastore instance.
-- @note Scribunto only registers `wgUserLanguage` when an
-- invocation is at the top of the call stack.
function Data:useUserLang()
self.defaultLang = i18n.getLang() or self.defaultLang
return self
end
--- Datastore language setter to `wgContentLanguage`.
-- @function Data:useContentLang
-- @return {Data} Datastore instance.
function Data:useContentLang()
self.defaultLang = mw.language.getContentLanguage():getCode()
return self
end
--- Datastore language setter to specificed language.
-- @function Data:useLang
-- @param {string} code Language code to use.
-- @return {Data} Datastore instance.
function Data:useLang(code)
self.defaultLang = _i18n.isValidCode(code)
and code
or self.defaultLang
return self
end
--- Temporary datastore language setter to `wgUserLanguage`.
-- The datastore language reverts to the default language in the next
-- @{Data:msg} call.
-- @function Data:inUserLang
-- @return {Data} Datastore instance.
function Data:inUserLang()
self.tempLang = i18n.getLang() or self.tempLang
return self
end
--- Temporary datastore language setter to `wgContentLanguage`.
-- Only affects the next @{Data:msg} call.
-- @function Data:inContentLang
-- @return {Data} Datastore instance.
function Data:inContentLang()
self.tempLang = mw.language.getContentLanguage():getCode()
return self
end
--- Temporary datastore language setter to a specificed language.
-- Only affects the next @{Data:msg} call.
-- @function Data:inLang
-- @param {string} code Language code to use.
-- @return {Data} Datastore instance.
function Data:inLang(code)
self.tempLang = _i18n.isValidCode(code)
and code
or self.tempLang
return self
end
-- Package functions.
--- Localized message getter by key.
-- Can be used to fetch messages in a specific language code through `uselang`
-- parameter. Extra numbered parameters can be supplied for substitution into
-- the datastore message.
-- @function i18n.getMsg
-- @param {table} frame Frame table from invocation.
-- @param {table} frame.args Metatable containing arguments.
-- @param {string} frame.args[1] ROOTPAGENAME of i18n submodule.
-- @param {string} frame.args[2] Key of i18n message.
-- @param[opt] {string} frame.args.lang Default language of message.
-- @error[271] {string} 'missing arguments in i18n.getMsg'
-- @return {string} I18n message in localised language.
function i18n.getMsg(frame)
if
not frame or
not frame.args or
not frame.args[1] or
not frame.args[2]
then
error('missing arguments in i18n.getMsg')
end
local source = frame.args[1]
local key = frame.args[2]
-- Pass through extra arguments.
local repl = {}
for i, a in ipairs(frame.args) do
if i >= 3 then
repl[i-2] = a
end
end
-- Load message data.
local ds = i18n.loadMessages(source)
-- Pass through language argument.
ds:inLang(frame.args.uselang)
-- Return message.
return ds:msg { key = key, args = repl }
end
--- I18n message datastore loader.
-- @function i18n.loadMessages
-- @param {string} ... ROOTPAGENAME/path for target i18n
-- submodules.
-- @error[322] {string} 'no source supplied to i18n.loadMessages'
-- @return {table} I18n datastore instance.
-- @usage require('Module:I18n').loadMessages('1', '2')
function i18n.loadMessages(...)
local ds
local i = 0
local s = {}
for j = 1, select('#', ...) do
local source = select(j, ...)
if type(source) == 'string' and source ~= '' then
i = i + 1
s[source] = i
if not ds then
-- Instantiate datastore.
ds = {}
ds._messages = {}
-- Set default language.
setmetatable(ds, Data)
ds:useUserLang()
end
source = string.gsub(source, '^.', mw.ustring.upper)
local success, messages = pcall(mw.loadData, mw.ustring.find(source, ':')
and source
or 'Module:' .. source .. '/i18n')
if success then
local msgCopy = {}
local langSecond = nil
for lang_id, msgtbl in pairs(messages) do
if langSecond == nil then
if lang_id == "qqq" or fallbacks[lang_id] ~= nil then
langSecond = false
else
langSecond = true
end
end
for id_lang, msg in pairs(msgtbl) do
if langSecond then
msgCopy[id_lang] = msgCopy[id_lang] or {}
msgCopy[id_lang][lang_id] = msg
else
msgCopy[lang_id] = msgCopy[lang_id] or {}
msgCopy[lang_id][id_lang] = msg
end
end
end
ds._messages[i] = msgCopy
end
local tab = mw.ext.data.get('I18n/' .. source .. '.tab', '_')
local T = {}
if not success and not tab then error("i18n for " .. source .. " is missing") end
for _, row in pairs(tab.data) do -- convert the output into a dictionary table
local id, t = unpack(row)
for lang, msg in pairs(t) do
if not T[lang] then T[lang] = {} end
T[lang][id] = msg
end
end
if not success then
ds._messages[i] = T
else
for lang, msgTbl in pairs(T) do
ds._messages[i][lang] = ds._messages[i][lang] or msgTbl
end
end
end
end
if not ds then
error('no source supplied to i18n.loadMessages')
else
-- Attach source index map.
ds._sources = s
-- Return datastore instance.
return ds
end
end
--- Language code getter.
-- Can validate a template's language code through `uselang` parameter.
-- @function i18n.getLang
-- @return {string} Language code.
function i18n.getLang()
local frame = mw.getCurrentFrame() or {}
local parentFrame = frame.getParent and frame:getParent() or {}
local code = mw.language.getContentLanguage():getCode()
local subPage = title.subpageText
-- Language argument test.
local langOverride =
(frame.args or {}).uselang or
(parentFrame.args or {}).uselang
if _i18n.isValidCode(langOverride) then
code = langOverride
-- Subpage language test.
elseif title.isSubpage and _i18n.isValidCode(subPage) then
code = _i18n.isValidCode(subPage) and subPage or code
-- User language test.
elseif parentFrame.preprocess or frame.preprocess then
uselang = uselang
or parentFrame.preprocess
and parentFrame:preprocess('{{int:lang}}')
or frame:preprocess('{{int:lang}}')
local decodedLang = mw.text.decode(uselang)
if decodedLang ~= '<lang>' and decodedLang ~= '⧼lang⧽' then
code = decodedLang == '(lang)'
and 'qqx'
or uselang
end
end
return code
end
-- Credit to http://stackoverflow.com/a/1283608/2644759
-- cc-by-sa 3.0
local function tableMerge(t1, t2, overwrite)
for k,v in pairs(t2) do
if type(v) == "table" and type(t1[k]) == "table" then
-- since type(t1[k]) == type(v) == "table", so t1[k] and v is true
tableMerge(t1[k], v, overwrite) -- t2[k] == v
else
if overwrite or t1[k] == nil then t1[k] = v end
end
end
return t1
end
--- Given an i18n table instantiates the values (deprecated)
-- @function i18n.loadI18n
-- @param {string} name name of module with i18n
-- @param {table} i18n_arg existing i18n
function i18n.loadI18n(name, i18n_arg)
local exist, res = pcall(require, name)
if exist and next(res) ~= nil then
if i18n_arg then
tableMerge(i18n_arg, res.i18n, true)
end
end
end
--- Loads an i18n for a specific frame (deprecated)
-- @function i18n.loadI18nFrame
-- @param {string} name name of module with i18n
-- @param {table} i18n_arg existing i18n
function i18n.loadI18nFrame(frame, i18n_arg)
return i18n.loadI18n(frame:getTitle().."/i18n", i18n_arg)
end
--- Wrapper for the module.
-- @function i18n.main
-- @param {table} frame Frame invocation object.
-- @return {string} Module output in template context.
-- @usage {{#invoke:i18n|main}}
i18n.main = entrypoint(i18n)
return require("Module:Deprecated")(i18n,
{
["loadI18n"] = {
deprecated = true,
replacement = "use <code>i18n.loadMessages</code>"
},
["loadI18nFrame"] = {
deprecated = true,
replacement = "use <code>i18n.loadMessages</code>"
}
}
)
-- </nowiki>
mgfuyxvne0w09w2187b5onpo2rwoh53
Tempilet:Time ago
10
2660
33395
2019-11-08T05:01:19Z
en>Wugapodes
0
noncaps
33395
wikitext
text/x-wiki
{{#invoke:Time ago|main}}<noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage and interwikis go in Wikidata. -->
</noinclude>
mzprrwbd409g2cer41ys035v9oay1od
33396
33395
2026-11-11T21:55:14Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Time_ago]]
33395
wikitext
text/x-wiki
{{#invoke:Time ago|main}}<noinclude>
{{documentation}}
<!-- Categories go in the /doc subpage and interwikis go in Wikidata. -->
</noinclude>
mzprrwbd409g2cer41ys035v9oay1od
Module:Time ago
828
2661
33397
2021-02-02T18:35:13Z
en>GreenC
0
add new feature "|numeric" to print number only
33397
Scribunto
text/plain
-- Implement [[Template:Time ago]]
local numberSpell, yesno -- lazy load
function numberSpell(arg)
numberSpell = require('Module:NumberSpell')._main
return numberSpell(arg)
end
function yesno(arg)
yesno = require('Module:Yesno')
return yesno(arg)
end
local p = {}
-- Table to convert entered text values to numeric values.
local timeText = {
['seconds'] = 1,
['minutes'] = 60,
['hours'] = 3600,
['days'] = 86400,
['weeks'] = 604800,
['months'] = 2629800, -- 365.25 * 24 * 60 * 60 / 12
['years'] = 31557600
}
-- Table containing tables of possible units to use in output.
local timeUnits = {
[1] = { 'second', 'seconds', "second's", "seconds'" },
[60] = { 'minute', 'minutes', "minutes'", "minutes'" },
[3600] = { 'hour', 'hours', "hour's", "hours'" },
[86400] = { 'day', 'days', "day's", "days'" },
[604800] = { 'week', 'weeks', "week's", "weeks'", unit = 'w' },
[2629800] = { 'month', 'months', "month's", "months'", unit = 'm' },
[31557600] = { 'year', 'years', "year's", "years'", unit = 'y' }
}
function p._main( args )
-- Initialize variables
local lang = mw.language.getContentLanguage()
local auto_magnitude_num
local min_magnitude_num
local magnitude = args.magnitude
local min_magnitude = args.min_magnitude
local purge = args.purge
-- Add a purge link if something (usually "yes") is entered into the purge parameter
if purge then
purge = ' <span class="plainlinks">([' .. mw.title.getCurrentTitle():fullUrl('action=purge') .. ' purge])</span>'
else
purge = ''
end
-- Check that the entered timestamp is valid. If it isn't, then give an error message.
local success, inputTime = pcall( lang.formatDate, lang, 'xnU', args[1] )
if not success then
return '<strong class="error">Error: first parameter cannot be parsed as a date or time.</strong>'
end
-- Store the difference between the current time and the inputted time, as well as its absolute value.
local timeDiff = lang:formatDate( 'xnU' ) - inputTime
local absTimeDiff = math.abs( timeDiff )
if magnitude then
auto_magnitude_num = 0
min_magnitude_num = timeText[magnitude]
else
-- Calculate the appropriate unit of time if it was not specified as an argument.
local autoMagnitudeData = {
{ factor = 2, amn = 31557600 },
{ factor = 2, amn = 2629800 },
{ factor = 2, amn = 86400 },
{ factor = 2, amn = 3600 },
{ factor = 2, amn = 60 }
}
for _, t in ipairs( autoMagnitudeData ) do
if absTimeDiff / t.amn >= t.factor then
auto_magnitude_num = t.amn
break
end
end
auto_magnitude_num = auto_magnitude_num or 1
if min_magnitude then
min_magnitude_num = timeText[min_magnitude]
else
min_magnitude_num = -1
end
end
if not min_magnitude_num then
-- Default to seconds if an invalid magnitude is entered.
min_magnitude_num = 1
end
local result_num
local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )
local unit = timeUnits[magnitude_num].unit
if unit and absTimeDiff >= 864000 then
local Date = require('Module:Date')._Date
local input = lang:formatDate('Y-m-d H:i:s', args[1]) -- Date needs a clean date
input = Date(input)
if input then
local id
if input.hour == 0 and input.minute == 0 then
id = 'currentdate'
else
id = 'currentdatetime'
end
result_num = (Date(id) - input):age(unit)
end
end
result_num = result_num or math.floor ( absTimeDiff / magnitude_num )
local punctuation_key, suffix
if timeDiff >= 0 then -- Past
if result_num == 1 then
punctuation_key = 1
else
punctuation_key = 2
end
if args.ago == '' then
suffix = ''
else
suffix = ' ' .. (args.ago or 'ago')
end
else -- Future
if args.ago == '' then
suffix = ''
if result_num == 1 then
punctuation_key = 1
else
punctuation_key = 2
end
else
suffix = ' time'
if result_num == 1 then
punctuation_key = 3
else
punctuation_key = 4
end
end
end
local result_unit = timeUnits[ magnitude_num ][ punctuation_key ]
-- Convert numerals to words if appropriate.
local spell_out = args.spellout
local spell_out_max = tonumber(args.spelloutmax)
local result_num_text
if spell_out and (
( spell_out == 'auto' and 1 <= result_num and result_num <= 9 and result_num <= ( spell_out_max or 9 ) ) or
( yesno( spell_out ) and 1 <= result_num and result_num <= 100 and result_num <= ( spell_out_max or 100 ) )
)
then
result_num_text = numberSpell( result_num )
else
result_num_text = tostring( result_num )
end
-- numeric or string
local numeric_out = args.numeric
local result = ""
if numeric_out then
result = tostring( result_num )
else
result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier.
end
return result .. purge
end
function p.main( frame )
local args = require( 'Module:Arguments' ).getArgs( frame, {
valueFunc = function( k, v )
if v then
v = v:match( '^%s*(.-)%s*$' ) -- Trim whitespace.
if k == 'ago' or v ~= '' then
return v
end
end
return nil
end,
wrappers = 'Template:Time ago'
})
return p._main( args )
end
return p
owi7m6sdgrso49bzrq9mha9ire8l3cs
33398
33397
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Time_ago]]
33397
Scribunto
text/plain
-- Implement [[Template:Time ago]]
local numberSpell, yesno -- lazy load
function numberSpell(arg)
numberSpell = require('Module:NumberSpell')._main
return numberSpell(arg)
end
function yesno(arg)
yesno = require('Module:Yesno')
return yesno(arg)
end
local p = {}
-- Table to convert entered text values to numeric values.
local timeText = {
['seconds'] = 1,
['minutes'] = 60,
['hours'] = 3600,
['days'] = 86400,
['weeks'] = 604800,
['months'] = 2629800, -- 365.25 * 24 * 60 * 60 / 12
['years'] = 31557600
}
-- Table containing tables of possible units to use in output.
local timeUnits = {
[1] = { 'second', 'seconds', "second's", "seconds'" },
[60] = { 'minute', 'minutes', "minutes'", "minutes'" },
[3600] = { 'hour', 'hours', "hour's", "hours'" },
[86400] = { 'day', 'days', "day's", "days'" },
[604800] = { 'week', 'weeks', "week's", "weeks'", unit = 'w' },
[2629800] = { 'month', 'months', "month's", "months'", unit = 'm' },
[31557600] = { 'year', 'years', "year's", "years'", unit = 'y' }
}
function p._main( args )
-- Initialize variables
local lang = mw.language.getContentLanguage()
local auto_magnitude_num
local min_magnitude_num
local magnitude = args.magnitude
local min_magnitude = args.min_magnitude
local purge = args.purge
-- Add a purge link if something (usually "yes") is entered into the purge parameter
if purge then
purge = ' <span class="plainlinks">([' .. mw.title.getCurrentTitle():fullUrl('action=purge') .. ' purge])</span>'
else
purge = ''
end
-- Check that the entered timestamp is valid. If it isn't, then give an error message.
local success, inputTime = pcall( lang.formatDate, lang, 'xnU', args[1] )
if not success then
return '<strong class="error">Error: first parameter cannot be parsed as a date or time.</strong>'
end
-- Store the difference between the current time and the inputted time, as well as its absolute value.
local timeDiff = lang:formatDate( 'xnU' ) - inputTime
local absTimeDiff = math.abs( timeDiff )
if magnitude then
auto_magnitude_num = 0
min_magnitude_num = timeText[magnitude]
else
-- Calculate the appropriate unit of time if it was not specified as an argument.
local autoMagnitudeData = {
{ factor = 2, amn = 31557600 },
{ factor = 2, amn = 2629800 },
{ factor = 2, amn = 86400 },
{ factor = 2, amn = 3600 },
{ factor = 2, amn = 60 }
}
for _, t in ipairs( autoMagnitudeData ) do
if absTimeDiff / t.amn >= t.factor then
auto_magnitude_num = t.amn
break
end
end
auto_magnitude_num = auto_magnitude_num or 1
if min_magnitude then
min_magnitude_num = timeText[min_magnitude]
else
min_magnitude_num = -1
end
end
if not min_magnitude_num then
-- Default to seconds if an invalid magnitude is entered.
min_magnitude_num = 1
end
local result_num
local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )
local unit = timeUnits[magnitude_num].unit
if unit and absTimeDiff >= 864000 then
local Date = require('Module:Date')._Date
local input = lang:formatDate('Y-m-d H:i:s', args[1]) -- Date needs a clean date
input = Date(input)
if input then
local id
if input.hour == 0 and input.minute == 0 then
id = 'currentdate'
else
id = 'currentdatetime'
end
result_num = (Date(id) - input):age(unit)
end
end
result_num = result_num or math.floor ( absTimeDiff / magnitude_num )
local punctuation_key, suffix
if timeDiff >= 0 then -- Past
if result_num == 1 then
punctuation_key = 1
else
punctuation_key = 2
end
if args.ago == '' then
suffix = ''
else
suffix = ' ' .. (args.ago or 'ago')
end
else -- Future
if args.ago == '' then
suffix = ''
if result_num == 1 then
punctuation_key = 1
else
punctuation_key = 2
end
else
suffix = ' time'
if result_num == 1 then
punctuation_key = 3
else
punctuation_key = 4
end
end
end
local result_unit = timeUnits[ magnitude_num ][ punctuation_key ]
-- Convert numerals to words if appropriate.
local spell_out = args.spellout
local spell_out_max = tonumber(args.spelloutmax)
local result_num_text
if spell_out and (
( spell_out == 'auto' and 1 <= result_num and result_num <= 9 and result_num <= ( spell_out_max or 9 ) ) or
( yesno( spell_out ) and 1 <= result_num and result_num <= 100 and result_num <= ( spell_out_max or 100 ) )
)
then
result_num_text = numberSpell( result_num )
else
result_num_text = tostring( result_num )
end
-- numeric or string
local numeric_out = args.numeric
local result = ""
if numeric_out then
result = tostring( result_num )
else
result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier.
end
return result .. purge
end
function p.main( frame )
local args = require( 'Module:Arguments' ).getArgs( frame, {
valueFunc = function( k, v )
if v then
v = v:match( '^%s*(.-)%s*$' ) -- Trim whitespace.
if k == 'ago' or v ~= '' then
return v
end
end
return nil
end,
wrappers = 'Template:Time ago'
})
return p._main( args )
end
return p
owi7m6sdgrso49bzrq9mha9ire8l3cs
Tempilet:Mlx
10
2662
33401
2022-12-10T23:52:31Z
en>HouseBlaster
0
HouseBlaster moved page [[Template:Mlx]] to [[Template:Module link expanded]]: harmonize with [[Template:template link expanded]]
33401
wikitext
text/x-wiki
#REDIRECT [[Template:Module link expanded]]
{{Redirect category shell|
{{R from move}}
}}
6u0mtd8wyt6sh6giz1fysuswgr4n06a
33402
33401
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Mlx]]
33401
wikitext
text/x-wiki
#REDIRECT [[Template:Module link expanded]]
{{Redirect category shell|
{{R from move}}
}}
6u0mtd8wyt6sh6giz1fysuswgr4n06a
Module:I18n/doc
828
2663
33403
2024-11-20T01:00:27Z
en>Awesome Aasim
0
33403
wikitext
text/x-wiki
{{Lua autodoc|file=I18n|autodoc=yes}}
<noinclude>
[[Category:Module documentation pages]]
</noinclude>
ifmao5vx2uxg6hwm20cvnusihf83hmg
33404
33403
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:I18n/doc]]
33403
wikitext
text/x-wiki
{{Lua autodoc|file=I18n|autodoc=yes}}
<noinclude>
[[Category:Module documentation pages]]
</noinclude>
ifmao5vx2uxg6hwm20cvnusihf83hmg
Tempilet:Module link expanded
10
2664
33405
2024-06-07T21:34:51Z
en>Warudo
0
Undid revision [[Special:Diff/1227801694|1227801694]] by [[Special:Contributions/Nickps|Nickps]] ([[User talk:Nickps|talk]]) still no but at least it's not broken by default
33405
wikitext
text/x-wiki
<includeonly><code>{{{{{{{|safesubst:}}}#invoke:Separated entries|main|[[Module:{{{1}}}{{{section|}}}|#invoke:{{{1}}}]]|{{{2|''function''}}}|separator=|}}}}</code></includeonly><noinclude>{{documentation}}<!-- Categories go on the /doc subpage and interwikis go on Wikidata. --></noinclude>
tpsa8jwnzpeoby534aj24ra9nao5hif
33406
33405
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Module_link_expanded]]
33405
wikitext
text/x-wiki
<includeonly><code>{{{{{{{|safesubst:}}}#invoke:Separated entries|main|[[Module:{{{1}}}{{{section|}}}|#invoke:{{{1}}}]]|{{{2|''function''}}}|separator=|}}}}</code></includeonly><noinclude>{{documentation}}<!-- Categories go on the /doc subpage and interwikis go on Wikidata. --></noinclude>
tpsa8jwnzpeoby534aj24ra9nao5hif
Module:Docbunto
828
2665
33407
2026-09-11T17:09:15Z
en>Awesome Aasim
0
33407
Scribunto
text/plain
--- Docbunto is an automatic documentation generator for Scribunto modules.
-- The module is based on LuaDoc and LDoc. It produces documentation in
-- the form of MediaWiki markup, using `@tag`-prefixed comments embedded
-- in the source code of a Scribunto module. The taglet parser & doclet
-- renderer Docbunto uses are also publicly exposed to other modules.
--
-- Docbunto code items are introduced by a block comment (`--[[]]--`), an
-- inline comment with three hyphens (`---`), or an inline `@tag` comment.
-- The module can use static code analysis to infer variable names, item
-- privacy (`local` keyword), tables (`{}` constructor) and functions
-- (`function` keyword). MediaWiki and Markdown formatting is supported.
--
-- Items are usually rendered in the order they are defined, if they are
-- public items, or emulated classes extending the Lua primitives. There
-- are many customisation options available to change Docbunto behaviour.
--
-- @module docbunto
-- @alias p
-- @require Module:I18n
-- @require Module:Lua_lexer
-- @require Module:Unindent
-- @require Module:Yesno
-- @require Module:Arguments
-- @require Module:Documentation
-- @author [[wikia:dev:User:8nml|8nml]] (Fandom Dev Wiki)
-- @author [[User:Awesome Aasim|Awesome Aasim]] (Wikimedia port)
-- @attribution [https://github.com/stevedonovan @stevedonovan] ([https://github.com/stevedonovan/LDoc GitHub])
-- @release beta
-- <nowiki>
local p = {}
-- Module dependencies.
local title = mw.title.getCurrentTitle()
local i18n = require('Module:I18n').loadMessages('Docbunto'):useContentLang()
local references = mw.loadData('Module:Docbunto/references')
local lexer = require('Module:Lua lexer')
local unindent = require('Module:Unindent')
local yesno = require('Module:Yesno')
local doc = require('Module:Documentation')
local fileTooBig
local usingOptionsContent
local hasTodoItems
-- Module variables.
local DEFAULT_TITLE = title.namespace == 828 and doc.getEnvironment({}).templateTitle.text or ''
local DEFAULT_VARIABLE = DEFAULT_TITLE
:gsub('^%u', mw.ustring.lower)
:gsub('%s', '_'):gsub('%p', '.')
local frame, gsub, match
local syntaxhighlightPresent = mw.getCurrentFrame()
:preprocess("<syntaxhighlight lang=\"lua\">-- Lua</syntaxhighlight>")
~= "<syntaxhighlight lang=\"lua\">-- Lua</syntaxhighlight>"
-- Docbunto variables & tag tokens.
local TAG_MULTI = 'M'
local TAG_ID = 'ID'
local TAG_SINGLE = 'S'
local TAG_TYPE = 'T'
local TAG_FLAG = 'N'
local TAG_MULTI_LINE = 'ML'
-- Docbunto processing patterns.
local patterns = {}
--- Configuration options.
-- @table options
-- @field[opt] {boolean} options.all Include local items in
-- documentation.
-- @field[opt] {boolean} options.autodoc Whether the module is being
-- called to automatically provide missing documentation.
-- @field[opt] {boolean} options.boilerplate Removal of
-- boilerplate (license block comments).
-- @field[opt] {string} options.caption Infobox image caption.
-- @field[opt] {boolean} options.code Only document Docbunto code
-- items - exclude article infobox and lede from
-- rendered documentation. Permits article to be
-- edited in VisualEditor.
-- @field[opt] {boolean} options.colon Format tags with a `:` suffix
-- and without the `@` prefix. This bypasses the "doctag
-- soup" some authors complain of.
-- @field[opt] {string} options.image Infobox image.
-- @field[opt] {boolean} options.box Include infobox in output.
-- @field[opt] {boolean} options.footer Append a horizontal line &
-- "generated by Docbunto" to the bottom of the output.
-- @field[opt] {boolean} options.noluaref Don't link to the [[mw:
-- Extension:Scribunto/Lua reference manual|Lua reference manual]] for types.
-- @field[opt] {boolean} options.card Include endmatter card in the
-- output at the end of the documentation.
-- @field[opt] {boolean} options.plain Disable Markdown formatting
-- in documentation.
-- @field[opt] {string} options.preface Preface text to insert
-- between lede & item documentation, used to provide
-- usage and code examples.
-- @field[opt] {boolean} options.simple Limit documentation to
-- descriptions only. Removes documentation of
-- subitem tags such as `@param` and `@field` ([[#Item
-- subtags|see list]]).
-- @field[opt] {boolean} options.sort Sort documentation items in
-- alphabetical order.
-- @field[opt] {boolean} options.strip Remove table index in
-- documentation.
-- @field[opt] {boolean} options.ulist Indent subitems as `<ul>`
-- lists (LDoc/JSDoc behaviour).
-- @field[opt] {boolean} options.verbose Show the code
-- description of a package function when documenting
-- function modules.
-- Docbunto private utilities.
local utils = {}
--- @{string.find} optimisation for @{string} functions.
-- @function utils.strfind_wrap
-- @param {function} strfunc String library function.
-- @return {function} Function wrapped in @{string.find} check.
-- @local
function utils.strfind_wrap(func)
return function(...)
local arg = {...}
if string.find(arg[1], arg[2]) then
return func(...);
end
end
end
--- String concatenation utility.
-- @function join
-- @param {sequence<string>} tbl Table of string segments
-- @return {function} A concatenated string.
-- @local
function utils.join(tbl)
return table.concat(tbl, '')
end
--- Pattern configuration function.
-- Resets patterns for each documentation build.
-- @function utils.configure_patterns
-- @param {options} options Configuration options.
-- @local
function utils.configure_patterns(options)
-- Setup Unicode or ASCII character encoding (optimisation).
gsub = utils.strfind_wrap(
options.unicode
and mw.ustring.gsub
or string.gsub
)
match = utils.strfind_wrap(
options.unicode
and mw.ustring.match
or string.match
)
patterns.DOCBUNTO_SUMMARY =
options.iso639_th
and '^[^ ]+'
or
options.unicode
and '^[^.։。।෴۔።]+[.։。।෴۔።]?'
or '^[^.]+%.?'
patterns.DOCBUNTO_CONCAT = options.iso639_th and '' or ' '
patterns.DOCBUNTO_TYPE = '^{({*[^}]+}*)}%s*'
patterns.DOCBUNTO_WIKITEXT = '^[{|!}:#*=]+[%s-}]+'
-- Setup parsing tag patterns with colon mode support.
patterns.DOCBUNTO_TAG = options.colon and '^%s*(%w+):' or '^%s*@(%w+)'
patterns.DOCBUNTO_TAG_COMMENT = '^[-%s]*' .. patterns.DOCBUNTO_TAG:sub(2)
patterns.DOCBUNTO_TAG_VALUE = patterns.DOCBUNTO_TAG .. '(.*)'
patterns.DOCBUNTO_TAG_MOD_VALUE = patterns.DOCBUNTO_TAG .. '%[([^%]]*)%](.*)'
patterns.DOCBUNTO_TAG_OPTION_VALUE = '(%[[^%]]*%])%s*(.*)'
end
--- Tag processor function.
-- @function utils.process_tag
-- @param {string} str Tag string to process.
-- @return {table} Tag object.
-- @local
function utils.process_tag(str)
local tag = {}
if str:find(patterns.DOCBUNTO_TAG_MOD_VALUE) then
tag.name, tag.modifiers, tag.value = str:match(patterns.DOCBUNTO_TAG_MOD_VALUE)
local modifiers = {}
for m in tag.modifiers:gmatch('[^%s,]+') do
local i = m:find('=')
if i then
local key = mw.text.trim(m:sub(1, i - 1))
local val = mw.text.trim(m:sub(i + 1, #m))
modifiers[key] = val
else
modifiers[m] = true
end
end
if modifiers.optchain then
modifiers.opt = true
modifiers.optchain = nil
end
tag.modifiers = modifiers
else
tag.name, tag.value = str:match(patterns.DOCBUNTO_TAG_VALUE)
end
tag.value = mw.text.trim(tag.value)
if p.tags._type_alias[tag.name] then
if p.tags._type_alias[tag.name] ~= 'variable' then
tag.value = p.tags._type_alias[tag.name] .. ' ' .. tag.value
tag.name = 'field'
end
if tag.value:match('^%S+') ~= '...' then
tag.value = tag.value:gsub('^(%S+)', '{%1}')
end
end
tag.name = p.tags._alias[tag.name] or tag.name
if tag.name ~= 'usage' and tag.value:find(patterns.DOCBUNTO_TYPE) then
tag.type = tag.value:match(patterns.DOCBUNTO_TYPE)
if tag.type:find('^%?') then
tag.type = tag.type:sub(2) .. '|nil'
end
tag.value = tag.value:gsub(patterns.DOCBUNTO_TYPE, '')
end
if (tag.name == 'param' or tag.name == 'field') and tag.value:find(patterns.DOCBUNTO_TAG_OPTION_VALUE) then
tag.value = tag.value:gsub(patterns.DOCBUNTO_TAG_OPTION_VALUE, '%1 %2')
tag.modifiers = tag.modifiers or {}
tag.modifiers.opt = true
end
if p.tags[tag.name] == TAG_FLAG then
tag.value = true
end
return tag
end
--- Module info extraction utility.
-- @function utils.extract_info
-- @param {table} documentation Package doclet info.
-- @return {table} Information name-value map.
-- @local
function utils.extract_info(documentation)
local info = {}
for _, tag in ipairs(documentation.tags) do
if p.tags._module_info[tag.name] then
if info[tag.name] then
if not info[tag.name]:find('^%* ') then
info[tag.name] = '* ' .. info[tag.name]
end
info[tag.name] = info[tag.name] .. '\n* ' .. tag.value
else
info[tag.name] = tag.value
end
end
end
return info
end
--- Type extraction utility.
-- @function utils.extract_types
-- @param {table} item Item documentation data.
-- @return {sequence<string>} Item types.
-- @local
function utils.extract_types(item)
local item_types = {}
for _, tag in ipairs(item.tags) do
if p.tags[tag.name] == TAG_TYPE then
item_types[1] = tag.name
if tag.name == 'variable' then
local implied_local = utils.process_tag('@local')
table.insert(item.tags, mw.clone(implied_local))
item.tags['local'] = mw.clone(implied_local)
end
if
p.tags._generic_tags[item_types[1]] and
not p.tags._project_level[item_types[1]] and
tag.type
then
item_types[#item_types + 1] = tag.type
end
break
end
end
return item_types
end
--- Name extraction utility.
-- @function utils.extract_name
-- @param {table} item Item documentation data.
-- @param {boolean} project Whether the item is project-level.
-- @return {string} Item name.
-- @local
function utils.extract_name(item, opts)
opts = opts or {}
local item_name
for _, tag in ipairs(item.tags) do
if p.tags[tag.name] == TAG_TYPE then
item_name = tag.value; break
end
end
if item_name or not opts.project then
return item_name
end
item_name = item.code:match('\nreturn%s+([%w_]+)')
if item_name == 'p' and not item.tags['alias'] then
local implied_alias = { name = 'alias', value = 'p' }
item.tags['alias'] = implied_alias
table.insert(item.tags, implied_alias)
end
item_name = (item_name and item_name ~= 'p')
and item_name
or item.filename
:gsub('^' .. mw.site.namespaces[828].name .. ':', '')
:gsub('^(%u)', mw.ustring.lower)
:gsub('/', '.'):gsub(' ', '_')
return item_name
end
--- Source code utility for item name detection.
-- @function utils.deduce_name
-- @param {string} tokens Stream tokens for first line.
-- @param {string} index Stream token index.
-- @param {table} opts Configuration options.
-- @param[opt] {boolean} opts.lookahead Whether a variable name succeeds the index.
-- @param[opt] {boolean} opts.lookbehind Whether a variable name precedes the index.
-- @return {string} Item name.
-- @local
function utils.deduce_name(tokens, index, opts)
local name = ''
if opts.lookbehind then
for i2 = index, 1, -1 do
if tokens[i2].type ~= 'keyword' then
name = tokens[i2].data .. name
else
break
end
end
elseif opts.lookahead then
for i2 = index, #tokens do
if tokens[i2].type ~= 'keyword' and not tokens[i2].data:find('^%(') then
name = name .. tokens[i2].data
else
break
end
end
end
return name
end
--- Parses Lua item names to extract a hierarchy.
--- @function utils.parse_hierarchy
-- @param {string} item_name Documentation item name.
-- @return {sequence<string>} List of global keys to index the
-- variable reference.
-- @local
function utils.parse_hierarchy(item_name)
local hierarchy = {}
for _, lexeme in ipairs(lexer(item_name)) do
if lexeme.type == 'ident' or lexeme.type == 'string' or lexeme.type == 'number' then
hierarchy[#hierarchy + 1] = lexeme.text
end
end
return hierarchy
end
--- Code analysis utility.
-- @function utils.code_heuristic
-- @param {table} item Item documentation data.
-- @local
function utils.code_heuristic(item)
local is_section = item.tags['private'] or item.tags['local'] or item.type == 'type'
if item.name and item.type and is_section then
return
end
local tokens = lexer(item.code:match('^[^\n]*'))[1]
local t, i = tokens[1], 1
local item_name, item_type
local lexemes = {}
while t do
if t.type ~= 'whitespace' then
lexemes[#lexemes + 1] = tokens[i]
end
t, i = tokens[i + 1], i + 1
end
t, i = lexemes[1], 1
while t do
if t.data == '=' and not item.name then
item_name = utils.deduce_name(lexemes, i - 1, { lookbehind = true })
end
if t.data == 'function' and not item.name then
item_type = 'function'
if lexemes[i + 1] and lexemes[i + 1].data ~= '(' then
item_name = utils.deduce_name(lexemes, i + 1, { lookahead = true })
end
end
if t.data == '{' or t.data == '{}' and not item.type then
item_type = 'table'
end
if t.data == 'local' and not is_section then
local implied_local = utils.process_tag('@local')
table.insert(item.tags, implied_local)
item.tags['local'] = mw.clone(implied_local)
end
t, i = lexemes[i + 1], i + 1
end
item.name = item.name or item_name or ''
item.type = item.type or item_type
if #(item.types or {}) == 0 then
item.types[1] = item.type
end
end
--- Array hash map conversion utility.
-- @function utils.hash_map
-- @param {table} item Item documentation data array.
-- @return {table} Item documentation data map.
-- @local
function utils.hash_map(array)
local map = array
for _, element in ipairs(array) do
if map[element.name] and not map[element.name].name then
table.insert(map[element.name], mw.clone(element))
elseif map[element.name] and map[element.name].name then
map[element.name] = { map[element.name], mw.clone(element) }
else
map[element.name] = mw.clone(element)
end
end
return map
end
--- Item export utility.
-- @function utils.export_item
-- @param {table} documentation Package documentation data.
-- @param {string} item_reference Identifier name for item.
-- @param {string} item_index Identifier name for item.
-- @param {string} item_alias Export alias for item.
-- @param {boolean} factory_item Whether the documentation item is a factory function.
-- @local
function utils.export_item(documentation, item_reference, item_index, item_alias, factory_item)
for _, item in ipairs(documentation.items) do
if item_reference == item.name then
item.tags['local'] = nil
item.tags['private'] = nil
for index, tag in ipairs(item.tags) do
if p.tags._privacy_tags[tag.name] then
table.remove(item.tags, index)
end
end
item.type, item.types[1] = 'member', 'member'
local accessor
if item_alias:find('^%[') then
accessor = ''
else
local is_class = documentation.type == 'classmod' or factory_item
if is_class and not item.tags['static'] then
accessor = ':'
else
accessor = '.'
end
end
if factory_item then
item.alias = utils.join{
documentation.items[item_index].tags['factory'].value,
accessor,
item_alias
}
else
item.alias = utils.join{
((documentation.tags['alias'] or {}).value or documentation.name),
accessor,
item_alias
}
end
item.hierarchy = utils.parse_hierarchy(item.alias)
break
end
end
end
--- Subitem tag correction utility.
-- @function utils.correct_subitem_tag
-- @param {table} item Item documentation data.
-- @local
function utils.correct_subitem_tag(item)
local field_tag = item.tags['field']
if item.type ~= 'function' or not field_tag then
return
end
if field_tag.name then
field_tag.name = 'param'
else
for _, tag_el in ipairs(field_tag) do
tag_el.name = 'param'
end
end
local param_tag = item.tags['param']
if param_tag and not param_tag.name then
if field_tag.name then
table.insert(param_tag, field_tag)
else
for _, tag_el in ipairs(field_tag) do
table.insert(param_tag, tag_el)
end
end
elseif param_tag and param_tag.name then
if field_tag.name then
param_tag = { param_tag, field_tag }
else
for i, tag_el in ipairs(field_tag) do
if i == 1 then
param_tag = { param_tag }
end
for _, tag_el in ipairs(field_tag) do
table.insert(param_tag, tag_el)
end
end
end
else
param_tag = field_tag
end
item.tags['field'] = nil
end
--- Item override tag utility.
-- @function utils.override_item_tag
-- @param {table} item Item documentation data.
-- @param {string} name Tag name.
-- @param[opt] {string} alias Target alias for tag.
-- @local
function utils.override_item_tag(item, name, alias)
if item.tags[name] then
item[alias or name] = item.tags[name].value
end
end
--- Identity function.
-- @function utils.identity
-- @param x The variable by reference.
-- @return The parameter `x` by reference.
-- @local
function utils.identity(x)
return x
end
--- Argument processing
-- @param {string} funcName name of function
-- @return function to process arguments
-- @local
local function makeInvokeFunc(funcName)
return function (f)
local args = require("Module:Arguments").getArgs(f, {
valueFunc = function (key, value)
if type(value) == 'string' then
value = value:match('^%s*(.-)%s*$') -- Remove whitespace.
if key == 'heading' or value ~= '' then
return value
else
return nil
end
else
return value
end
end
})
return p[funcName](args)
end
end
-- Docbunto rendering logic.
local frontend = {}
--- Markdown header converter.
-- @function urils.markdown_header
-- @param {string} hash Leading hash.
-- @param {string} text Header text.
-- @return {string} MediaWiki header.
-- @local
function frontend.markdown_header(hash, text)
local symbol = '='
return utils.join{
'\n',
symbol:rep(#hash), ' ', text, ' ', symbol:rep(#hash),
'\n'
}
end
--- Item reference formatting.
-- @function urils.item_reference
-- @param {string} ref Item reference.
-- @return {string} Internal MediaWiki link to article item.
-- @local
function frontend.item_reference(ref)
local temp = mw.text.split(ref, '|')
local item = temp[1]
local text = temp[2] or temp[1]
if references.items[item] then
local interwiki = 'mw'
item = interwiki .. references.items[item]
else
item = '#' .. item
end
return mw.text.tag{
name = 'code',
content = utils.join{ '[[', item, '|', text, ']]' }
}
end
--- Doclet type reference preprocessor.
-- Formats types with links to the [[mw:Extension:Scribunto/Lua reference manual|Lua reference manual]].
-- @function frontend.type_reference
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.type_reference(item, options)
local interwiki = 'mw:'
if
not options.noluaref and
item.value and
item.value:match('^%S+') == mw.text.tag('code', nil, '...')
then
item.value = item.value:gsub('^(%S+)', mw.text.tag{
name = 'code',
content = utils.join{ '[[', interwiki, 'Lua reference manual#varargs|...]]' }
})
end
-- Handle tag type references.
item.types = item.types or item.type and { item.type }
if not item.types then
return
end
for index, item_type in ipairs(item.types) do
item.types[index] = item.types[index]:gsub('[%w_. ]+', function(item_type)
local data = references.types[item_type]
local name = data and data.name or item_type
if not name:match('%.') and not name:match('^%u') and data then
name = i18n:msg('type-' .. name)
end
if data and not options.noluaref then
return utils.join{ '[[', interwiki, data.link, '|', name , ']]' }
elseif
item_type:find(i18n:msg('line-no'):gsub('$1', ''))
then
return utils.join { '[[' , options.file , '#L-', item_type:sub(6), '|', name, ']]' }
elseif
not options.noluaref and
not p.tags._generic_tags[item_type]
then
return utils.join { '[[#', item_type, '|', name, ']]' }
end
end)
end
item.type = table.concat(item.types, i18n:msg('separator-dot'))
end
--- Markdown preprocessor to MediaWiki format.
-- @function frontend.markdown
-- @param {string} str Unprocessed Markdown string.
-- @return {string} MediaWiki-compatible markup with HTML formatting.
-- @local
function frontend.markdown(str)
-- Bold & italic tags.
str = str:gsub('%*%*%*([^\n*]+)%*%*%*', '<b><i>%1</i></b>')
str = str:gsub('%*%*([^\n*]+)%*%*', '<b>%1</b>')
str = str:gsub('%*([^\n*]+)%*', '<i>%1</i>')
-- Self-closing header support.
str = str:gsub('%f[^\n%z](#+) *([^\n#]+) *#+%s', frontend.markdown_header)
-- External and internal links.
str = str:gsub('%[([^\n%]]+)%]%(([^\n][^\n)]-)%)', '[%2 %1]')
str = str:gsub('%{@link%s+([^}]+)%}', '[%1]')
str = str:gsub('%@{([^\n}]+)}', frontend.item_reference)
-- Programming & scientific notation.
str = str:gsub('%f["`]`([^\n`]+)`%f[^"`]', '<code><nowiki>%1</nowiki></code>')
str = str:gsub('%$%$([^\n$]+)%$%$', '<math display="inline">%1</math>')
-- Strikethroughs.
str = str:gsub('~~([^\n~]+)~~', '<del>%1</del>')
-- HTML output.
return str
end
--- Doclet function item preprocessor.
-- Formats item name as a function call with top-level arguments.
-- @function frontend.pretask_function_name
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.pretask_function_name(item, options)
local target = item.alias and 'alias' or 'name'
item[target] = item[target] .. '('
if
item.tags['param'] and
item.tags['param'].value and
not item.tags['param'].value:find('^[%w_]+[.[]')
then
if (item.tags['param'].modifiers or {})['opt'] then
local optional = mw.html.create('span')
optional:css('opacity', '0.65')
optional:wikitext(item.tags['param'].value:match('^(%S+)'))
item[target] = item[target] .. tostring(optional)
else
item[target] = item[target] .. item.tags['param'].value:match('^(%S*)')
end
elseif item.tags['param'] then
for index, tag in ipairs(item.tags['param']) do
if not tag.value:find('^[%w_]+[.[]') then
if (tag.modifiers or {})['opt'] then
local param = mw.html.create('span')
param:css('opacity', '0.65')
param:wikitext((index > 1 and ', ' or '') .. tag.value:match('^%S+'))
item[target] = item[target] .. tostring(param)
else
item[target] = item[target] .. (index > 1 and ', ' or '') .. tag.value:match('^(%S+)')
end
end
end
end
item[target] = item[target] .. ')'
end
--- Doclet parameter/field subitem preprocessor.
-- Indents and wraps variable prefix with `code` tag.
-- @function pretask_variable_prefix
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.pretask_variable_prefix(item, options)
local indent_symbol = options.ulist and '*' or ':'
local indent_level, indentation, item_id
if item.value then
indent_level = item.value:match('^%S*') == '...'
and 0
or select(2, item.value:match('^%S*'):gsub('[.[]', ''))
indentation = indent_symbol:rep(indent_level)
item_id = options.item_id
item.value = indentation .. item.value:gsub(
'^(%S+)',
mw.text.tag{
name = 'code',
attrs = { id = item_id .. '~%1' },
content = '%1'
},
1
)
elseif item then
for _, item_el in ipairs(item) do
frontend.pretask_variable_prefix(item_el, options)
end
end
end
--- Doclet usage subitem preprocessor.
-- Formats usage example with `<syntaxhighlight>` tag.
-- @function frontend.pretask_usage_highlight
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.pretask_usage_highlight(item, options)
if item.value then
item.value = unindent(mw.text.trim(item.value))
if item.value:find('^{{.+}}$') then
item.value = item.value:gsub('=', mw.text.nowiki)
local multi_line = item.value:find('\n') and '|m = 1|' or '|'
if item.value:match('^{{([^:]+)') == '#invoke' then
item.value = item.value:gsub('^{{#invoke:', '{{mlx' .. multi_line)
else
if options.entrypoint then
item.value = item.value:gsub('^([^|]+)|%s*([^|}]-)(%s*)([|}])','%1|"%2"%3%4')
end
item.value = item.value:gsub('^{{', '{{tlx' .. multi_line)
end
local highlight_class = tonumber(mw.site.currentVersion:match('^%d%.%d+')) > 1.19
and 'mw-highlight'
or 'mw-geshi'
if item.value:find('\n') then
local highlight_div = mw.html.create('div')
highlight_div.addClass(highlight_class)
highlight_div.addClass('mw-content-ltr')
highlight_div:attr('dir', 'ltr')
highlight_div:wikitext(item.value)
item.value = tostring(highlight_div)
else
item.value = mw.text.tag{
name = 'span',
attrs = { class = 'code' },
content = item.value
}
end
else
local highlight_tag = mw.html.create('syntaxhighlight')
highlight_tag:attr('lang', 'lua')
if not item.value:find('\n') then
highlight_tag:attr('inline', 'inline')
end
highlight_tag:wikitext(item.value)
item.value = tostring(highlight_tag)
end
elseif item then
for _, item_el in ipairs(item) do
frontend.pretask_usage_highlight(item_el, options)
end
end
end
--- Doclet error subitem preprocessor.
-- Formats line numbers (`{#}`) in error tag values.
-- @function frontend.pretask_error_line
-- @param {table} item Item documentation data.
-- @local
function frontend.pretask_error_line(item, options)
if item.name then
local line
if item.modifiers and item.modifiers.line then
line = item.modifiers.line
end
for mod in pairs(item.modifiers or {}) do
if mod:find('^%d+$') then line = mod end
end
if line then
if item.types then
item.types[#item.types + 1] = i18n:msg('line-no', line)
else
item.type = i18n:msg('line-no', line)
end
end
elseif item then
for _, item_el in ipairs(item) do
frontend.pretask_error_line(item_el, options)
end
end
end
--- Doclet item renderer.
-- @function frontend.render_item
-- @param {table} stream Wikitext documentation stream.
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @param[opt] {function} pretask Item data preprocessor.
-- @local
function frontend.render_item(stream, item, options, pretask)
if pretask then pretask(item, options) end
local item_name = item.alias or item.name
frontend.type_reference(item, options)
local item_type = item.type
for _, name in ipairs(p.tags._subtype_hierarchy) do
if item.tags[name] then
item_type = item_type .. i18n:msg('separator-dot') .. name
end
end
item_type = i18n:msg('parentheses', item_type)
if options.strip and item.export and item.hierarchy then
item_name = item_name:gsub('^[%w_]+[.[]?', '')
end
-- add single spaces between parentheses similar to
-- MediaWiki documentation
if not item_name:find( '()', 1, true ) then
item_name = item_name:gsub('%(', '( ')
item_name = item_name:gsub('%)', ' )')
end
item_name = item_name:gsub('%[', '[ ')
item_name = item_name:gsub('%]', ' ]')
local code_node = mw.html.create('code')
:attr('id', options.item_id)
:wikitext(item_name)
if not usingOptionsContent then
local span_node = stream:wikitext(';')
:tag('span')
:addClass('plainlinks docbunto-link')
if fileTooBig or not syntaxhighlightPresent then
span_node:wikitext('[{{fullurl:' .. options.file .. '|action=edit#mw-ce-l' .. item.lineno .. '}} ' .. tostring(code_node) .. ']')
elseif title.namespace == 828 and options.file == title.text then
span_node:wikitext('[[' .. '#L-' .. item.lineno .. '|' .. tostring(code_node) .. ']]')
else
span_node:wikitext('[[' .. options.file .. '#L-' .. item.lineno .. '|' .. tostring(code_node) .. ']]')
end
else
stream:wikitext(';' .. tostring(code_node))
end
stream
:wikitext(item_type)
:newline()
if (#(item.summary or '') + #item.description) ~= 0 then
local separator = #(item.summary or '') ~= 0 and #item.description ~= 0
and (item.description:find(patterns.DOCBUNTO_WIKITEXT) and '\n' or patterns.DOCBUNTO_CONCAT)
or ''
local intro = (item.summary or '') .. separator .. item.description
intro = intro
:gsub('\n([{:#*])', '\n:%1')
:gsub('\n\n([^=])', '\n:%1')
stream:wikitext(':' .. intro):newline()
end
end
--- Doclet tag renderer.
-- @function frontend.render_tag
-- @param {table} stream Wikitext documentation stream.
-- @param {string} name Item tag name.
-- @param {table} tag Item tag data.
-- @param {options} options Configuration options.
-- @param[opt] {function} pretask Item data preprocessor.
-- @local
function frontend.render_tag(stream, name, tag, options, pretask)
if pretask then pretask(tag, options) end
if tag.value then
frontend.type_reference(tag, options)
local tag_name = i18n:msg('tag-' .. name, '1')
-- Handle ul/ol/dl comment support.
stream:wikitext(':')
:tag('b')
:wikitext(tag_name)
:done():done()
:wikitext(i18n:msg('separator-semicolon'))
:wikitext((mw.text.trim(tag.value):gsub('\n([{:#*])', '\n:%1')))
if tag.value:find('\n[{:#*]') and (tag.type or (tag.modifiers or {})['opt']) then
stream:newline():wikitext(':')
end
-- Type and optional appositive for tag.
if tag.type and (tag.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = {
tag.type ..
i18n:msg('separator-colon') ..
i18n:msg('optional')
}
})
elseif tag.type then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { tag.type }
})
elseif (tag.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { i18n:msg('optional') }
})
end
stream:newline()
else
local tag_name = i18n:msg('tag-' .. name, tostring(#tag))
stream
:wikitext(':')
:tag('b')
:wikitext(tag_name)
:done():done()
:wikitext(i18n:msg('separator-semicolon'))
:newline()
for _, tag_el in ipairs(tag) do
frontend.type_reference(tag_el, options)
local marker = options.ulist and '*' or ':'
stream:wikitext(':' .. marker .. tag_el.value:gsub('\n([{:#*])', '\n:' .. marker .. '%1'))
if tag_el.value:find('\n[{:#*]') and (tag_el.type or (tag_el.modifiers or {})['opt']) then
stream:newline():wikitext(':' .. marker .. (tag_el.value:match('^[*:]+') or ''))
end
if tag_el.type and (tag_el.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = {
tag_el.type ..
i18n:msg('separator-colon') ..
i18n:msg('optional')
}
})
elseif tag_el.type then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { tag_el.type }
})
elseif (tag_el.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { i18n:msg('optional') }
})
end
stream:newline()
end
end
end
--- Template entrypoint for [[Template:Docbunto]].
-- @function p._main
-- @param {table} args Arguments
-- @return {string} Module documentation output.
function p._main(args)
frame = mw.getCurrentFrame()
local modname = mw.text.trim(args[1] or args.file or DEFAULT_TITLE)
local options = {}
options.file = modname
options.all = yesno(args.all or false)
options.autodoc = yesno(args.autodoc or false)
options.boilerplate = yesno(args.boilerplate or options.autodoc or false)
options.box = yesno(args.box or args.infobox or options.autodoc or false)
options.caption = args.caption
options.card = yesno(args.card or (title.namespace == 828 and not options.autodoc))
options.code = yesno(args.code or false)
options.colon = yesno(args.colon or false)
options.footer = yesno(args.footer or title.namespace == 828)
options.image = args.image
options.migration = yesno(args.migration or false)
options.noluaref = yesno(args.noluaref or false)
options.plain = yesno(args.plain or false)
options.preface = args.preface
options.simple = yesno(args.simple or false)
options.sort = yesno(args.sort or false)
options.strip = yesno(args.strip or false)
options.verbose = yesno(args.verbose or false)
options.ulist = yesno(args.ulist or false)
return p.build(modname, options)
end
--- Entrypoint for the module.
-- @function p.main
-- @param {Frame} frame Module frame.
-- @return {string} Module documentation output.
p.main = makeInvokeFunc('_main')
--- Scribunto documentation generator entrypoint.
-- @function p.build
-- @param[opt] {string} modname Module page name (without namespace).
-- Default: second-level subpage.
-- @param[opt] {options} options Configuration options.
function p.build(modname, options)
modname = modname or DEFAULT_TITLE
options = options or {}
local tagdata = p.taglet(modname, options)
local docdata = p.doclet(tagdata, options)
return docdata
end
--- Docbunto taglet parser for Scribunto modules.
-- @function p.taglet
-- @param[opt] {string} modname Module page name (without namespace).
-- @param[opt] {options} options Configuration options.
-- @error[line=1081] {string} 'Lua source code not found in $1'
-- @error[line=1087] {string} 'documentation markup for Docbunto not found in $1'
-- @return {table} Module documentation data.
function p.taglet(modname, options)
modname = modname or DEFAULT_TITLE
options = options or {}
local filepath = mw.site.namespaces[828].name .. ':' .. modname
local content = mw.title.new(filepath):getContent()
-- Content checks.
if options.content then
content = options.content
usingOptionsContent = true
else
content = mw.title.new(filepath):getContent() or error(i18n:msg('no-content', filepath), 0)
end
-- Syntax highlighting is disabled for files above a specific size
fileTooBig = content:len() > 102400
if
not content:match('%-%-%-') and
not content:match(options.colon and '%w+:' or '@%w+')
then
error(i18n:msg('no-markup', filepath))
end
-- Remove leading escapes.
content = content:gsub('^%-%-+%s*<[^>]+>\n', '')
-- Remove closing pretty comments.
content = content:gsub('\n%-%-%-%-%-+(\n[^-]+)', '\n-- %1')
-- Remove boilerplate block comments.
if options.boilerplate then
content = content:gsub('^%-%-%[=*%[\n.-\n%-?%-?%]%=*]%-?%-?%s+', '')
content = content:gsub('%s+%-%-%[=*%[\n.-\n%-?%-?%]%=*]%-?%-?$', '')
end
-- Configure patterns for colon mode and Unicode character encoding.
options.unicode = type(content:find('[^%w%c%p%s]+')) == 'number'
options.iso639_th = type(content:find('\224\184[\129-\155]')) == 'number'
utils.configure_patterns(options)
-- Content lexing.
local lines = lexer(content)
local tokens = {}
local dummy_token = {
data = '',
posFirst = 1,
posLast = 1
}
local token_closure = 0
for _, line in ipairs(lines) do
if #line == 0 then
dummy_token.type = token_closure == 0
and 'whitespace'
or tokens[#tokens].type
table.insert(tokens, mw.clone(dummy_token))
else
for _, token in ipairs(line) do
if token.data:find('^%[=*%[$') or token.data:find('^%-%-%[=*%[$') then
token_closure = 1
end
if token.data:find(']=*]') then
token_closure = 0
end
table.insert(tokens, token)
end
end
end
-- Start documentation data.
local documentation = {}
documentation.filename = filepath
documentation.description = ''
documentation.code = content
documentation.comments = {}
documentation.tags = {}
documentation.items = {}
local line_no = 0
local item_index = 0
-- Taglet tracking variables.
local start_mode = true
local comment_mode = false
local doctag_mode = false
local export_mode = false
local special_tag = false
local pragma_mode = false
local factory_mode = false
local return_mode = false
local comment_tail = ''
local tag_name = ''
local new_item = false
local new_tag = false
local new_tag_item = false
local new_item_code = false
local pretty_comment = false
local comment_brace = false
local t, i, item = tokens[1], 1
local p_success, p_error = pcall(function()
while t do
-- Taglet variable update.
new_item = t.data:find('^%-%-%-') or t.data:find('^%-%-%[%=*%[$')
comment_tail = t.data:gsub('^%-%-+', '')
tag_name = comment_tail:match(patterns.DOCBUNTO_TAG)
tag_name = p.tags._alias[tag_name] or tag_name
new_tag = type(p.tags[tag_name]) == 'string'
local last_token = t.posFirst ~= 1 and 2 or 1
new_tag_item = (
new_tag and i > 1 and tokens[i - last_token].type ~= 'comment'
and not tokens[i - last_token].data:find(patterns.DOCBUNTO_TAG_COMMENT)
)
pretty_comment =
t.data:find('^%-%-%-+%s*$') or
t.data:find('[^-]+%-%-%-+%s*$') or
t.data:find('%-*[ \t]*<nowiki>$') or
t.data:find('%-*[ \t]*<pre>$')
comment_brace =
t.data:find('^%-%-%[=*%[$') or
t.data:find('^%-%-%]=*%]$') or
t.data:find('^%]=*%]%-%-$')
pragma_mode = tag_name == 'pragma'
export_mode = tag_name == 'export' and not doctag_mode
special_tag = pragma_mode or export_mode
local tags, tag, subtokens, separator
-- Line counter.
if t.posFirst == 1 then
line_no = line_no + 1
end
-- Data insertion logic.
if t.type == 'comment' then
if new_item then
comment_mode = true
end
if (new_tag or new_tag_item) and not special_tag then
comment_mode = true
doctag_mode = true
end
-- Module-level documentation taglet.
if start_mode then
table.insert(documentation.comments, t.data)
end
-- Module description.
if
start_mode and comment_mode and
not new_tag and not doctag_mode and
not pretty_comment and not comment_brace
then
separator = mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT)
and '\n'
or (#documentation.description ~= 0 and patterns.DOCBUNTO_CONCAT or '')
documentation.description = utils.join{
documentation.description,
separator,
mw.text.trim(comment_tail)
}
end
-- Switch from module description to module-level tag list.
if start_mode and new_tag and not export_mode then
doctag_mode = true
table.insert(documentation.tags, utils.process_tag(comment_tail))
-- Concatenating module-level tag with more information.
elseif
start_mode and doctag_mode and
not pretty_comment and not comment_brace
then
tags = documentation.tags
if p.tags[tags[#tags].name] == TAG_MULTI then
separator = mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT)
and '\n'
or patterns.DOCBUNTO_CONCAT
tags[#tags].value = utils.join{
tags[#tags].value,
separator,
mw.text.trim(comment_tail)
}
elseif p.tags[tags[#tags].name] == TAG_MULTI_LINE then
tags[#tags].value = utils.join{
tags[#tags].value,
'\n',
comment_tail
}
end
end
-- Detect a new documentation item.
if not start_mode and (new_item or new_tag_item) and not special_tag then
table.insert(documentation.items, {})
item_index = item_index + 1
item = documentation.items[item_index]
item.lineno = line_no
item.code = ''
item.comments = {}
item.description = ''
item.tags = {}
end
-- Concatenate an item with more information.
if
not start_mode and comment_mode and
not new_tag and not doctag_mode and
not pretty_comment and not comment_brace
then
separator = (mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT))
and '\n'
or (#item.description ~= 0 and patterns.DOCBUNTO_CONCAT or '')
item.description = utils.join{
item.description,
separator,
mw.text.trim(comment_tail)
}
end
-- Switch from item information to item tags.
if not start_mode and new_tag and not special_tag then
doctag_mode = true
table.insert(item.tags, utils.process_tag(comment_tail))
-- Extend item tags with lines of further information.
elseif
not start_mode and doctag_mode and
not pretty_comment and not comment_brace
then
tags = item.tags
if p.tags[tags[#tags].name] == TAG_MULTI then
separator = mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT)
and '\n'
or patterns.DOCBUNTO_CONCAT
tags[#tags].value = utils.join{
tags[#tags].value,
separator,
mw.text.trim(comment_tail)
}
elseif p.tags[tags[#tags].name] == TAG_MULTI_LINE then
tags[#tags].value = utils.join{
tags[#tags].value,
'\n',
comment_tail
}
end
end
-- Save pre-item comments to item information.
if not start_mode and (comment_mode or doctag_mode) then
table.insert(item.comments, t.data)
end
-- Export tag support.
if export_mode then
factory_mode = t.posFirst ~= 1
if factory_mode then
item.exports = true
else
documentation.exports = true
end
-- Parse export token data while concatenating code.
subtokens = {}
while t and (not factory_mode or (factory_mode and t.data ~= 'end')) do
if factory_mode then
item.code = utils.join{
item.code,
(t.posFirst == 1 and '\n' or ''),
t.data
}
end
-- Fetch our item export tokens aka "subtokens".
t, i = tokens[i + 1], i + 1
if t and t.posFirst == 1 then
line_no = line_no + 1
end
if t and t.type ~= 'whitespace' and t.type ~= 'keyword' and t.type ~= 'comment' then
table.insert(subtokens, t)
end
end
-- Tracking and boolean variables for parsing exports.
local separator = { [','] = true, [';'] = true }
local brace = { ['{'] = true, ['}'] = true }
local item_reference, item_alias = '', ''
local sequence_index, has_key = 0, false
local subtoken, index = subtokens[2], 2
-- Logic that exports items to an item or module.
while not brace[subtoken.data] do
if subtoken.data == '=' then
has_key = true
elseif not separator[subtoken.data] then
if has_key then
item_reference = item_reference .. subtoken.data
else
item_alias = item_alias .. subtoken.data
end
end
if subtokens[index + 1] and separator[subtokens[index + 1].data] or brace[subtokens[index + 1].data] then
if not has_key then
sequence_index = sequence_index + 1
item_reference, item_alias = item_alias, item_reference
item_alias = '[' .. tostring(sequence_index) .. ']'
end
utils.export_item(documentation, item_reference, item_index, item_alias, factory_mode)
item_reference, item_alias, has_key = '', '', false
end
subtoken, index = subtokens[index + 1], index + 1
end
if not factory_mode then
break -- end of file
else
factory_mode = false -- end of item
end
end
-- Pragma tag support.
if pragma_mode then
tag = utils.process_tag(comment_tail)
if tag.modifiers then
options[tag.value] = yesno((next((tag ).modifiers or {})), true)
elseif tag.value:find(' ') then
local index = tag.value:find(' ')
local key = tag.value:sub(1, index - 1)
local val = tag.value:sub(index + 1)
options[key] = yesno(val)
elseif options[tag.value] == nil then
options[tag.value] = true
end
end
end
-- Package data post-processing.
if (t.type ~= 'comment' or t.data:find('^%-%-%]=*%]$') or t.data:find('^%]=*%]%-%-$')) and (comment_mode or doctag_mode) and start_mode then
documentation.tags = utils.hash_map(documentation.tags)
documentation.name = utils.extract_name(documentation, { project = true })
documentation.info = utils.extract_info(documentation)
documentation.types = utils.extract_types(documentation) or { 'module' }
documentation.type = documentation.types[1]
-- N.B: summary field = 1st comment sentence; description = text remainder.
if #documentation.description ~= 0 then
documentation.summary = match(documentation.description, patterns.DOCBUNTO_SUMMARY)
documentation.description = documentation.description:sub(select(2, documentation.description:find('%s*', #documentation.summary + 1)) + 1)
end
documentation.description = documentation.description:gsub('%s%s+', '\n\n')
documentation.executable = p.tags._code_types[documentation.type] and true or false
utils.correct_subitem_tag(documentation)
utils.override_item_tag(documentation, 'name')
utils.override_item_tag(documentation, 'alias')
utils.override_item_tag(documentation, 'summary')
utils.override_item_tag(documentation, 'description')
utils.override_item_tag(documentation, 'class', 'type')
end
-- Item data post-processing.
if
(t.type ~= 'comment' or t.data:find('^%-%-%]=*%]$') or t.data:find('^%]=*%]%-%-$'))
and (comment_mode or doctag_mode) and item_index ~= 0
then
item.tags = utils.hash_map(item.tags)
item.name = utils.extract_name(item)
item.types = utils.extract_types(item)
item.type = item.types[1]
if #item.description ~= 0 then
item.summary = match(item.description, patterns.DOCBUNTO_SUMMARY)
item.description = item.description:sub(select(2, item.description:find('%s*', #item.summary + 1)) + 1)
end
item.description = item.description:gsub('%s%s+', '\n\n')
new_item_code = true
end
-- Documentation block reset.
if t.type ~= 'comment' or t.data:find('^%-%-%]=*%]$') or t.data:find('^%]=*%]%-%-$') then
start_mode = false
comment_mode = false
doctag_mode = false
export_mode = false
pragma_mode = false
end
-- Don't concatenate module return value into item code.
if t.data == 'return' and t.posFirst == 1 then
return_mode = true
end
-- Item code concatenation.
if item_index ~= 0 and not doctag_mode and not comment_mode and not comment_brace and not return_mode then
separator = #item.code ~= 0 and t.posFirst == 1 and '\n' or ''
item.code = utils.join{ item.code, separator, t.data }
-- Code analysis on item headline.
if new_item_code and item.code:find('\n') and t.posFirst == 1 then
utils.code_heuristic(item)
new_item_code = false
end
end
t, i = tokens[i + 1], i + 1
end
documentation.lineno = line_no
local package_name = (documentation.tags['alias'] or {}).value or documentation.name or DEFAULT_VARIABLE
local package_alias = (documentation.tags['alias'] or {}).value or 'p'
local export_ptn = '^%s([.[])'
for _, item in ipairs(documentation.items) do
if item.name == package_alias or (item.name and item.name:match('^' .. package_alias .. '[.[]')) then
item.alias = item.name:gsub(export_ptn:format(package_alias), documentation.name .. '%1')
end
if
item.name == package_name or
item.tags['export'] or
(item.name and package_name and item.name:find(export_ptn:format(package_name))) or
(item.alias and package_name and item.alias:find(export_ptn:format(package_name)))
then
item.export = true
item.tags['local'] = nil
item.tags['private'] = nil
for index, tag in ipairs(item.tags) do
if tag.name == 'local' or tag.name == 'private' then
table.remove(item.tags, index)
end
end
end
if item.name and (item.name:find('[.:]') or item.name:find('%[[\'"]')) then
item.hierarchy = utils.parse_hierarchy(item.name)
end
item.type = item.type or ((item.alias or item.name or ''):find('[.[]') and 'member' or 'variable')
utils.correct_subitem_tag(item)
utils.override_item_tag(item, 'name')
utils.override_item_tag(item, 'alias')
utils.override_item_tag(item, 'summary')
utils.override_item_tag(item, 'description')
utils.override_item_tag(item, 'class', 'type')
end
-- Sort documentation items by their access level.
-- Items are sorted by whether they are exported at the module level.
-- Items are then subsorted by whether the item is `@local` aka `@private`.
table.sort(documentation.items, function(item1, item2)
local inaccessible1 = item1.tags['local'] or item1.tags['private']
local inaccessible2 = item2.tags['local'] or item2.tags['private']
-- Send package items to the top.
if item1.export and not item2.export then
return true
elseif item2.export and not item1.export then
return false
-- Send private items to the bottom.
elseif inaccessible1 and not inaccessible2 then
return false
elseif inaccessible2 and not inaccessible1 then
return true
-- Optional alphabetical sort.
elseif options.sort then
return (item1.alias or item1.name) < (item2.alias or item2.name)
-- Sort via source code order by default.
else
return item1.lineno < item2.lineno
end
end)
end)
if not p_success then
mw.addWarning("Docbunto error: " .. p_error)
end
return documentation
end
--- Doclet renderer for Docbunto taglet data.
-- @function p.doclet
-- @param {table} data Taglet documentation data.
-- @param[opt] {options} options Configuration options.
-- @return {string} Wikitext documentation output.
function p.doclet(data, options)
local documentation = mw.html.create()
local namespace_ptn = utils.join{ '^', mw.site.namespaces[828].name, ':' }
local codepage = data.filename:gsub(namespace_ptn, '', 1)
options = options or {}
options.file = data.filename
frame = frame or mw.getCurrentFrame():getParent() or mw.getCurrentFrame()
local maybe_md = options.plain and utils.identity or frontend.markdown
local tohtml = function(str)
return frame:preprocess(maybe_md(str))
end
-- Disable edit sections for automatic documentation pages.
if not options.code then
documentation:wikitext(frame:preprocess('__NOEDITSECTION__'))
end
-- Information
if not options.code and options.box then
local custom, infobox = pcall(require, 'Module:Docbunto/infobox')
if custom and type(infobox) == 'function' then
documentation:wikitext(infobox(data, codepage, frame, options, title, maybe_md)):newline()
end
end
-- Documentation lede.
if not options.code and (#(data.summary or '') + #data.description) ~= 0 then
local separator = #(data.summary or '') ~= 0 and #data.description ~= 0
and (data.description:find(patterns.DOCBUNTO_WIKITEXT) and '\n\n' or patterns.DOCBUNTO_CONCAT)
or ''
local intro = utils.join{ data.summary or '', separator, data.description }
intro = tohtml(intro:gsub('^(' .. codepage .. ')', mw.text.tag('b', nil, '%1')))
if options.migration then
documentation:wikitext(frame:preprocess(mw.text.tag{
name = 'syntaxhighlight',
content = intro
})):newline():newline()
else
documentation:wikitext(intro):newline():newline()
end
end
-- Custom documentation preface.
if options.preface then
documentation:wikitext(options.preface):newline():newline()
end
-- Start code documentation.
local codedoc = mw.html.create()
local function_module = data.tags['param'] or data.tags['return']
local header_type =
documentation.type == 'classmod'
and 'class'
or function_module
and 'function'
or 'items'
if (function_module or #data.items ~= 0) and not options.code or options.preface then
codedoc
:tag('h2')
:wikitext(i18n:msg('header-documentation'))
:done()
:newline()
end
if (function_module or #data.items ~= 0) then
codedoc
:tag('h3')
:wikitext(i18n:msg('header-' .. header_type))
:done()
:newline()
end
-- Function module support.
if function_module then
data.type, data.types[1] = 'function', 'function'
options.item_id = data.name
if not options.code or not options.verbose then data.description = '' end
frontend.render_item(codedoc, data, options, frontend.pretask_function_name)
if not options.simple and data.tags['param'] then
frontend.render_tag(codedoc, 'param', data.tags['param'], options, frontend.pretask_variable_prefix)
end
if not options.simple and data.tags['error'] then
frontend.render_tag(codedoc, 'error', data.tags['error'], options, frontend.pretask_error_line)
end
if not options.simple and data.tags['return'] then
frontend.render_tag(codedoc, 'return', data.tags['return'], options)
end
end
-- Render documentation items.
local other_header = false
local private_header = false
local inaccessible
for _, item in ipairs(data.items) do
inaccessible = item.tags['local'] or item.tags['private']
if not options.all and inaccessible then
break
end
if
not other_header and item.type ~= 'section' and item.type ~= 'type' and
not item.export and not item.hierarchy and not inaccessible
then
codedoc
:tag('h3')
:wikitext(i18n:msg('header-other'))
:done()
:newline()
other_header = true
end
if not private_header and options.all and inaccessible then
codedoc
:tag('h3')
:wikitext(i18n:msg('header-private'))
:done()
:newline()
private_header = true
end
if item.type == 'section' then
codedoc
:tag('h3')
:wikitext((mw.ustring.gsub(item.summary or item.alias or item.name, '[.։。।෴۔።]$', '')))
:done()
:newline()
if #item.description ~= 0 then
codedoc:wikitext(mw.text.trim(item.description)):newline()
end
elseif item.type == 'type' then
if options.strip and item.export and item.hierarchy then
if item.alias then
item.alias = item.alias:gsub('^[%w_]+[.[]?', '')
else
item.name = item.name:gsub('^[%w_]+[.[]?', '')
end
end
codedoc
:tag('h3')
:wikitext(mw.text.tag('code', {}, item.alias or item.name))
:done()
:newline()
if (#(item.summary or '') + #item.description) ~= 0 then
local separator = #(item.summary or '') ~= 0 and #item.description ~= 0
and (item.description:find(patterns.DOCBUNTO_WIKITEXT) and '\n\n' or patterns.DOCBUNTO_CONCAT)
or ''
codedoc:wikitext((item.summary or '') .. separator .. item.description):newline()
end
elseif item.type == 'function' then
options.item_id = item.alias or item.name
frontend.render_item(codedoc, item, options, frontend.pretask_function_name)
if not options.simple and item.tags['param'] then
frontend.render_tag(codedoc, 'param', item.tags['param'], options, frontend.pretask_variable_prefix)
end
if not options.simple and item.tags['error'] then
frontend.render_tag(codedoc, 'error', item.tags['error'], options, frontend.pretask_error_line)
end
if not options.simple and item.tags['return'] then
frontend.render_tag(codedoc, 'return', item.tags['return'], options)
end
elseif
item.type == 'table' or
item.type ~= nil and (
item.type == 'member' or
item.type == 'variable'
) and (item.alias or item.name)
then
options.item_id = item.alias or item.name
frontend.render_item(codedoc, item, options)
if not options.simple and item.tags['field'] then
frontend.render_tag(codedoc, 'field', item.tags['field'], options, frontend.pretask_variable_prefix)
end
end
if item.type ~= 'section' and item.type ~= 'type' then
if not options.simple and item.tags['note'] then
frontend.render_tag(codedoc, 'note', item.tags['note'], options)
end
if not options.simple and item.tags['warning'] then
frontend.render_tag(codedoc, 'warning', item.tags['warning'], options)
end
if not options.simple and item.tags['fixme'] then
frontend.render_tag(codedoc, 'fixme', item.tags['fixme'], options)
end
if not options.simple and item.tags['todo'] then
frontend.render_tag(codedoc, 'todo', item.tags['todo'], options)
hasTodoItems = true
end
if not options.simple and item.tags['usage'] then
frontend.render_tag(codedoc, 'usage', item.tags['usage'], options, frontend.pretask_usage_highlight)
end
if not options.simple and item.tags['see'] then
frontend.render_tag(codedoc, 'see', item.tags['see'], options)
end
end
end
-- Render module-level annotations.
local header_level = options.code and 'h3' or 'h2'
local header_text
for _, tag_name in ipairs(p.tags._annotation_hierarchy) do
if data.tags[tag_name] then
header_text = i18n:msg('tag-' .. tag_name, data.tags[tag_name].value and '1' or '2')
header_text = '<' .. header_level .. '>' .. ' ' .. header_text .. ' ' .. '</' .. header_level .. '>'
codedoc:newline():wikitext(header_text):newline()
if data.tags[tag_name].value then
codedoc:wikitext(data.tags[tag_name].value):newline()
else
for _, tag_el in ipairs(data.tags[tag_name]) do
codedoc:wikitext('* ' .. tag_el.value):newline()
end
end
end
end
-- Byline for autogeneration.
if options.footer then
codedoc:newline()
codedoc:tag('hr'):done()
codedoc:newline()
codedoc:tag('p'):css( 'text-align', 'right' ):css('font-size', '80%'):wikitext(i18n:msg('message-autogeneration'))
end
-- Add nowiki tags for EOF termination in tests.
codedoc:tag('nowiki', { selfClosing = true })
-- Code documentation formatting.
codedoc = tohtml(tostring(codedoc))
documentation:wikitext(codedoc)
-- Endmatter table for module information.
if options.card then
local endmatter = mw.html.create('table')
endmatter:addClass('wikitable')
endmatter:css('width', '75%')
endmatter:css('margin', '0 auto 1em auto')
local module_type = data.type == 'module'
and i18n:msg('invocable-module')
or i18n:msg('meta-module')
endmatter
:tag('caption')
:wikitext('Module information card (autogenerated)')
endmatter
:tag('tr')
:tag('th'):attr('scope', 'col'):wikitext('Name'):done()
:tag('th'):attr('scope', 'col'):wikitext('Value'):done()
if options.image or data.info and data.info['image'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('endmatter-image')):done()
:tag('td')
:attr('align', 'center')
:wikitext('[[File:' .. (options.image or data.info['image']) .. '|270px|center]]')
:done()
:done()
end
if options.caption or data.info and data.info['caption'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('endmatter-caption')):done()
:tag('td')
:attr('align', options.image or data.info['image'] and 'center' or 'left')
:wikitext(tohtml(options.caption or data.info['caption']))
:done()
:done()
end
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext((gsub(i18n:msg('type-variable'), '^%w', mw.ustring.upper))):done()
:tag('td')
:attr('align', options.image or data.info and data.info['image'] and 'center' or 'left')
:wikitext(mw.text.tag({
name = options.image or data.info and data.info['image'] and 'h1' or 'span',
content = mw.text.tag({
name = 'b',
content = mw.text.tag({
name = 'code',
content = data.name or DEFAULT_VARIABLE
})
})
})):done()
:done()
:tag('tr')
:tag('td'):wikitext(i18n:msg('code')):done()
:tag('td'):wikitext(tohtml('[[' .. data.filename .. ']]')):done()
:done()
if data.info and data.info['release'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('release-status')):done()
:tag('td'):wikitext(tohtml(data.info['release'])):done()
:done()
end
if data.summary then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('description')):done()
:tag('td'):wikitext(tohtml(data.summary)):done()
:done()
end
if data.info and data.info['author'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('author')):done()
:tag('td'):newline():wikitext(tohtml(data.info['author'])):done()
:done()
end
if data.info and data.info['attribution'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('using-code-by')):done()
:tag('td'):wikitext(tohtml(data.info['attribution'])):done()
:done()
end
if data.info and data.info['credit'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('other-attribution')):done()
:tag('td'):wikitext(tohtml(data.info['credit'])):done()
:done()
end
if data.info and data.info['require'] then
data.info['require'] = data.info['require']
:gsub('^[^[%s]+$', '[[%1]]')
:gsub('%* ([^[%s]+)', '* [[%1]]')
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('dependencies')):done()
:tag('td'):newline():wikitext(tohtml(data.info['require'])):done()
:done()
end
if data.info and data.info['demo'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('examples')):done()
:tag('td'):wikitext(tohtml(data.info['demo'])):done()
:done()
end
endmatter:newline()
endmatter = tostring(endmatter)
documentation:newline():newline()
documentation:wikitext(endmatter)
end
documentation = tostring(documentation)
if hasTodoItems and options.autodoc
and mw.title.new('Module:' .. options.file).fullText == mw.title.getCurrentTitle().fullText then
documentation = documentation .. '[[Category:' .. i18n:msg('todo') .. ']]'
end
if mw.title.new('Module:Docbunto/styles.css').exists then
documentation = documentation .. frame:extensionTag('templatestyles', '', {src = 'Module:Docbunto/styles.css'})
end
return documentation
end
--- Token dictionary for Docbunto tags.
-- Maps Docbunto tag names to tag tokens.
-- * Multi-line tags use the `'M'` token.
-- * Multi-line preformatted tags use the `'ML'` token.
-- * Identifier tags use the `'ID'` token.
-- * Single-line tags use the `'S'` token.
-- * Flags use the `'N'` token.
-- * Type tags use the `'T'` token.
-- @table p.tags
p.tags = {
-- Item-level tags, available for global use.
['param'] = 'M', ['see'] = 'M', ['note'] = 'M', ['usage'] = 'ML',
['description'] = 'M', ['field'] = 'M', ['return'] = 'M',
['fixme'] = 'M', ['todo'] = 'M', ['warning'] = 'M', ['error'] = 'M';
['class'] = 'ID', ['name'] = 'ID', ['alias'] = 'ID';
['summary'] = 'S', ['pragma'] = 'S', ['factory'] = 'S',
['release'] = 'S', ['author'] = 'S', ['copyright'] = 'S', ['license'] = 'S',
['image'] = 'S', ['caption'] = 'S', ['require'] = 'S', ['attribution'] = 'S',
['credit'] = 'S', ['demo'] = 'S';
['local'] = 'N', ['export'] = 'N', ['private'] = 'N', ['constructor'] = 'N',
['static'] = 'N';
-- Project-level tags, all scoped to a file.
['module'] = 'T', ['script'] = 'T', ['classmod'] = 'T', ['topic'] = 'T',
['submodule'] = 'T', ['example'] = 'T', ['file'] = 'T';
-- Module-level tags, used to register module items.
['function'] = 'T', ['table'] = 'T', ['member'] = 'T', ['variable'] = 'T',
['section'] = 'T', ['type'] = 'T';
}
p.tags._alias = {
-- Normal aliases.
['about'] = 'summary',
['abstract'] = 'summary',
['brief'] = 'summary',
['bug'] = 'fixme',
['argument'] = 'param',
['credits'] = 'credit',
['code'] = 'usage',
['details'] = 'description',
['discussion'] = 'description',
['exception'] = 'error',
['lfunction'] = 'function',
['package'] = 'module',
['property'] = 'member',
['raise'] = 'error',
['requires'] = 'require',
['returns'] = 'return',
['throws'] = 'error',
['typedef'] = 'type',
-- Typed aliases.
['bool'] = 'field',
['func'] = 'field',
['int'] = 'field',
['number'] = 'field',
['string'] = 'field',
['tab'] = 'field',
['vararg'] = 'param',
['tfield'] = 'field',
['tparam'] = 'param',
['treturn'] = 'return'
}
p.tags._type_alias = {
-- Implicit type value alias.
['bool'] = 'boolean',
['func'] = 'function',
['int'] = 'number',
['number'] = 'number',
['string'] = 'string',
['tab'] = 'table',
['vararg'] = '...',
-- Pure typed modifier alias.
['tfield'] = 'variable',
['tparam'] = 'variable',
['treturn'] = 'variable'
}
p.tags._project_level = {
-- Contains code.
['module'] = true,
['script'] = true,
['classmod'] = true,
['submodule'] = true,
['file'] = true,
-- Contains documentation.
['topic'] = true,
['example'] = true
}
p.tags._code_types = {
['module'] = true,
['script'] = true,
['classmod'] = true
}
p.tags._module_info = {
['image'] = true,
['caption'] = true,
['release'] = true,
['author'] = true,
['copyright'] = true,
['license'] = true,
['require'] = true,
['credit'] = true,
['attribution'] = true,
['demo'] = true
}
p.tags._annotation_tags = {
['field'] = true,
['warning'] = true,
['fixme'] = true,
['note'] = true,
['todo'] = true,
['see'] = true
}
p.tags._annotation_hierarchy = {
'warning',
'fixme',
'note',
'todo',
'see'
}
p.tags._privacy_tags = {
['private'] = true,
['local'] = true
}
p.tags._generic_tags = {
['variable'] = true,
['member'] = true
}
p.tags._subtype_tags = {
['factory'] = true,
['local'] = true,
['private'] = true,
['constructor'] = true,
['static'] = true
}
p.tags._subtype_hierarchy = {
'private',
'local',
'static',
'factory',
'constructor'
}
return p
ttce6j3uqd6skz9pkmhumxfj4bct9ik
33408
33407
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Docbunto]]
33407
Scribunto
text/plain
--- Docbunto is an automatic documentation generator for Scribunto modules.
-- The module is based on LuaDoc and LDoc. It produces documentation in
-- the form of MediaWiki markup, using `@tag`-prefixed comments embedded
-- in the source code of a Scribunto module. The taglet parser & doclet
-- renderer Docbunto uses are also publicly exposed to other modules.
--
-- Docbunto code items are introduced by a block comment (`--[[]]--`), an
-- inline comment with three hyphens (`---`), or an inline `@tag` comment.
-- The module can use static code analysis to infer variable names, item
-- privacy (`local` keyword), tables (`{}` constructor) and functions
-- (`function` keyword). MediaWiki and Markdown formatting is supported.
--
-- Items are usually rendered in the order they are defined, if they are
-- public items, or emulated classes extending the Lua primitives. There
-- are many customisation options available to change Docbunto behaviour.
--
-- @module docbunto
-- @alias p
-- @require Module:I18n
-- @require Module:Lua_lexer
-- @require Module:Unindent
-- @require Module:Yesno
-- @require Module:Arguments
-- @require Module:Documentation
-- @author [[wikia:dev:User:8nml|8nml]] (Fandom Dev Wiki)
-- @author [[User:Awesome Aasim|Awesome Aasim]] (Wikimedia port)
-- @attribution [https://github.com/stevedonovan @stevedonovan] ([https://github.com/stevedonovan/LDoc GitHub])
-- @release beta
-- <nowiki>
local p = {}
-- Module dependencies.
local title = mw.title.getCurrentTitle()
local i18n = require('Module:I18n').loadMessages('Docbunto'):useContentLang()
local references = mw.loadData('Module:Docbunto/references')
local lexer = require('Module:Lua lexer')
local unindent = require('Module:Unindent')
local yesno = require('Module:Yesno')
local doc = require('Module:Documentation')
local fileTooBig
local usingOptionsContent
local hasTodoItems
-- Module variables.
local DEFAULT_TITLE = title.namespace == 828 and doc.getEnvironment({}).templateTitle.text or ''
local DEFAULT_VARIABLE = DEFAULT_TITLE
:gsub('^%u', mw.ustring.lower)
:gsub('%s', '_'):gsub('%p', '.')
local frame, gsub, match
local syntaxhighlightPresent = mw.getCurrentFrame()
:preprocess("<syntaxhighlight lang=\"lua\">-- Lua</syntaxhighlight>")
~= "<syntaxhighlight lang=\"lua\">-- Lua</syntaxhighlight>"
-- Docbunto variables & tag tokens.
local TAG_MULTI = 'M'
local TAG_ID = 'ID'
local TAG_SINGLE = 'S'
local TAG_TYPE = 'T'
local TAG_FLAG = 'N'
local TAG_MULTI_LINE = 'ML'
-- Docbunto processing patterns.
local patterns = {}
--- Configuration options.
-- @table options
-- @field[opt] {boolean} options.all Include local items in
-- documentation.
-- @field[opt] {boolean} options.autodoc Whether the module is being
-- called to automatically provide missing documentation.
-- @field[opt] {boolean} options.boilerplate Removal of
-- boilerplate (license block comments).
-- @field[opt] {string} options.caption Infobox image caption.
-- @field[opt] {boolean} options.code Only document Docbunto code
-- items - exclude article infobox and lede from
-- rendered documentation. Permits article to be
-- edited in VisualEditor.
-- @field[opt] {boolean} options.colon Format tags with a `:` suffix
-- and without the `@` prefix. This bypasses the "doctag
-- soup" some authors complain of.
-- @field[opt] {string} options.image Infobox image.
-- @field[opt] {boolean} options.box Include infobox in output.
-- @field[opt] {boolean} options.footer Append a horizontal line &
-- "generated by Docbunto" to the bottom of the output.
-- @field[opt] {boolean} options.noluaref Don't link to the [[mw:
-- Extension:Scribunto/Lua reference manual|Lua reference manual]] for types.
-- @field[opt] {boolean} options.card Include endmatter card in the
-- output at the end of the documentation.
-- @field[opt] {boolean} options.plain Disable Markdown formatting
-- in documentation.
-- @field[opt] {string} options.preface Preface text to insert
-- between lede & item documentation, used to provide
-- usage and code examples.
-- @field[opt] {boolean} options.simple Limit documentation to
-- descriptions only. Removes documentation of
-- subitem tags such as `@param` and `@field` ([[#Item
-- subtags|see list]]).
-- @field[opt] {boolean} options.sort Sort documentation items in
-- alphabetical order.
-- @field[opt] {boolean} options.strip Remove table index in
-- documentation.
-- @field[opt] {boolean} options.ulist Indent subitems as `<ul>`
-- lists (LDoc/JSDoc behaviour).
-- @field[opt] {boolean} options.verbose Show the code
-- description of a package function when documenting
-- function modules.
-- Docbunto private utilities.
local utils = {}
--- @{string.find} optimisation for @{string} functions.
-- @function utils.strfind_wrap
-- @param {function} strfunc String library function.
-- @return {function} Function wrapped in @{string.find} check.
-- @local
function utils.strfind_wrap(func)
return function(...)
local arg = {...}
if string.find(arg[1], arg[2]) then
return func(...);
end
end
end
--- String concatenation utility.
-- @function join
-- @param {sequence<string>} tbl Table of string segments
-- @return {function} A concatenated string.
-- @local
function utils.join(tbl)
return table.concat(tbl, '')
end
--- Pattern configuration function.
-- Resets patterns for each documentation build.
-- @function utils.configure_patterns
-- @param {options} options Configuration options.
-- @local
function utils.configure_patterns(options)
-- Setup Unicode or ASCII character encoding (optimisation).
gsub = utils.strfind_wrap(
options.unicode
and mw.ustring.gsub
or string.gsub
)
match = utils.strfind_wrap(
options.unicode
and mw.ustring.match
or string.match
)
patterns.DOCBUNTO_SUMMARY =
options.iso639_th
and '^[^ ]+'
or
options.unicode
and '^[^.։。।෴۔።]+[.։。।෴۔።]?'
or '^[^.]+%.?'
patterns.DOCBUNTO_CONCAT = options.iso639_th and '' or ' '
patterns.DOCBUNTO_TYPE = '^{({*[^}]+}*)}%s*'
patterns.DOCBUNTO_WIKITEXT = '^[{|!}:#*=]+[%s-}]+'
-- Setup parsing tag patterns with colon mode support.
patterns.DOCBUNTO_TAG = options.colon and '^%s*(%w+):' or '^%s*@(%w+)'
patterns.DOCBUNTO_TAG_COMMENT = '^[-%s]*' .. patterns.DOCBUNTO_TAG:sub(2)
patterns.DOCBUNTO_TAG_VALUE = patterns.DOCBUNTO_TAG .. '(.*)'
patterns.DOCBUNTO_TAG_MOD_VALUE = patterns.DOCBUNTO_TAG .. '%[([^%]]*)%](.*)'
patterns.DOCBUNTO_TAG_OPTION_VALUE = '(%[[^%]]*%])%s*(.*)'
end
--- Tag processor function.
-- @function utils.process_tag
-- @param {string} str Tag string to process.
-- @return {table} Tag object.
-- @local
function utils.process_tag(str)
local tag = {}
if str:find(patterns.DOCBUNTO_TAG_MOD_VALUE) then
tag.name, tag.modifiers, tag.value = str:match(patterns.DOCBUNTO_TAG_MOD_VALUE)
local modifiers = {}
for m in tag.modifiers:gmatch('[^%s,]+') do
local i = m:find('=')
if i then
local key = mw.text.trim(m:sub(1, i - 1))
local val = mw.text.trim(m:sub(i + 1, #m))
modifiers[key] = val
else
modifiers[m] = true
end
end
if modifiers.optchain then
modifiers.opt = true
modifiers.optchain = nil
end
tag.modifiers = modifiers
else
tag.name, tag.value = str:match(patterns.DOCBUNTO_TAG_VALUE)
end
tag.value = mw.text.trim(tag.value)
if p.tags._type_alias[tag.name] then
if p.tags._type_alias[tag.name] ~= 'variable' then
tag.value = p.tags._type_alias[tag.name] .. ' ' .. tag.value
tag.name = 'field'
end
if tag.value:match('^%S+') ~= '...' then
tag.value = tag.value:gsub('^(%S+)', '{%1}')
end
end
tag.name = p.tags._alias[tag.name] or tag.name
if tag.name ~= 'usage' and tag.value:find(patterns.DOCBUNTO_TYPE) then
tag.type = tag.value:match(patterns.DOCBUNTO_TYPE)
if tag.type:find('^%?') then
tag.type = tag.type:sub(2) .. '|nil'
end
tag.value = tag.value:gsub(patterns.DOCBUNTO_TYPE, '')
end
if (tag.name == 'param' or tag.name == 'field') and tag.value:find(patterns.DOCBUNTO_TAG_OPTION_VALUE) then
tag.value = tag.value:gsub(patterns.DOCBUNTO_TAG_OPTION_VALUE, '%1 %2')
tag.modifiers = tag.modifiers or {}
tag.modifiers.opt = true
end
if p.tags[tag.name] == TAG_FLAG then
tag.value = true
end
return tag
end
--- Module info extraction utility.
-- @function utils.extract_info
-- @param {table} documentation Package doclet info.
-- @return {table} Information name-value map.
-- @local
function utils.extract_info(documentation)
local info = {}
for _, tag in ipairs(documentation.tags) do
if p.tags._module_info[tag.name] then
if info[tag.name] then
if not info[tag.name]:find('^%* ') then
info[tag.name] = '* ' .. info[tag.name]
end
info[tag.name] = info[tag.name] .. '\n* ' .. tag.value
else
info[tag.name] = tag.value
end
end
end
return info
end
--- Type extraction utility.
-- @function utils.extract_types
-- @param {table} item Item documentation data.
-- @return {sequence<string>} Item types.
-- @local
function utils.extract_types(item)
local item_types = {}
for _, tag in ipairs(item.tags) do
if p.tags[tag.name] == TAG_TYPE then
item_types[1] = tag.name
if tag.name == 'variable' then
local implied_local = utils.process_tag('@local')
table.insert(item.tags, mw.clone(implied_local))
item.tags['local'] = mw.clone(implied_local)
end
if
p.tags._generic_tags[item_types[1]] and
not p.tags._project_level[item_types[1]] and
tag.type
then
item_types[#item_types + 1] = tag.type
end
break
end
end
return item_types
end
--- Name extraction utility.
-- @function utils.extract_name
-- @param {table} item Item documentation data.
-- @param {boolean} project Whether the item is project-level.
-- @return {string} Item name.
-- @local
function utils.extract_name(item, opts)
opts = opts or {}
local item_name
for _, tag in ipairs(item.tags) do
if p.tags[tag.name] == TAG_TYPE then
item_name = tag.value; break
end
end
if item_name or not opts.project then
return item_name
end
item_name = item.code:match('\nreturn%s+([%w_]+)')
if item_name == 'p' and not item.tags['alias'] then
local implied_alias = { name = 'alias', value = 'p' }
item.tags['alias'] = implied_alias
table.insert(item.tags, implied_alias)
end
item_name = (item_name and item_name ~= 'p')
and item_name
or item.filename
:gsub('^' .. mw.site.namespaces[828].name .. ':', '')
:gsub('^(%u)', mw.ustring.lower)
:gsub('/', '.'):gsub(' ', '_')
return item_name
end
--- Source code utility for item name detection.
-- @function utils.deduce_name
-- @param {string} tokens Stream tokens for first line.
-- @param {string} index Stream token index.
-- @param {table} opts Configuration options.
-- @param[opt] {boolean} opts.lookahead Whether a variable name succeeds the index.
-- @param[opt] {boolean} opts.lookbehind Whether a variable name precedes the index.
-- @return {string} Item name.
-- @local
function utils.deduce_name(tokens, index, opts)
local name = ''
if opts.lookbehind then
for i2 = index, 1, -1 do
if tokens[i2].type ~= 'keyword' then
name = tokens[i2].data .. name
else
break
end
end
elseif opts.lookahead then
for i2 = index, #tokens do
if tokens[i2].type ~= 'keyword' and not tokens[i2].data:find('^%(') then
name = name .. tokens[i2].data
else
break
end
end
end
return name
end
--- Parses Lua item names to extract a hierarchy.
--- @function utils.parse_hierarchy
-- @param {string} item_name Documentation item name.
-- @return {sequence<string>} List of global keys to index the
-- variable reference.
-- @local
function utils.parse_hierarchy(item_name)
local hierarchy = {}
for _, lexeme in ipairs(lexer(item_name)) do
if lexeme.type == 'ident' or lexeme.type == 'string' or lexeme.type == 'number' then
hierarchy[#hierarchy + 1] = lexeme.text
end
end
return hierarchy
end
--- Code analysis utility.
-- @function utils.code_heuristic
-- @param {table} item Item documentation data.
-- @local
function utils.code_heuristic(item)
local is_section = item.tags['private'] or item.tags['local'] or item.type == 'type'
if item.name and item.type and is_section then
return
end
local tokens = lexer(item.code:match('^[^\n]*'))[1]
local t, i = tokens[1], 1
local item_name, item_type
local lexemes = {}
while t do
if t.type ~= 'whitespace' then
lexemes[#lexemes + 1] = tokens[i]
end
t, i = tokens[i + 1], i + 1
end
t, i = lexemes[1], 1
while t do
if t.data == '=' and not item.name then
item_name = utils.deduce_name(lexemes, i - 1, { lookbehind = true })
end
if t.data == 'function' and not item.name then
item_type = 'function'
if lexemes[i + 1] and lexemes[i + 1].data ~= '(' then
item_name = utils.deduce_name(lexemes, i + 1, { lookahead = true })
end
end
if t.data == '{' or t.data == '{}' and not item.type then
item_type = 'table'
end
if t.data == 'local' and not is_section then
local implied_local = utils.process_tag('@local')
table.insert(item.tags, implied_local)
item.tags['local'] = mw.clone(implied_local)
end
t, i = lexemes[i + 1], i + 1
end
item.name = item.name or item_name or ''
item.type = item.type or item_type
if #(item.types or {}) == 0 then
item.types[1] = item.type
end
end
--- Array hash map conversion utility.
-- @function utils.hash_map
-- @param {table} item Item documentation data array.
-- @return {table} Item documentation data map.
-- @local
function utils.hash_map(array)
local map = array
for _, element in ipairs(array) do
if map[element.name] and not map[element.name].name then
table.insert(map[element.name], mw.clone(element))
elseif map[element.name] and map[element.name].name then
map[element.name] = { map[element.name], mw.clone(element) }
else
map[element.name] = mw.clone(element)
end
end
return map
end
--- Item export utility.
-- @function utils.export_item
-- @param {table} documentation Package documentation data.
-- @param {string} item_reference Identifier name for item.
-- @param {string} item_index Identifier name for item.
-- @param {string} item_alias Export alias for item.
-- @param {boolean} factory_item Whether the documentation item is a factory function.
-- @local
function utils.export_item(documentation, item_reference, item_index, item_alias, factory_item)
for _, item in ipairs(documentation.items) do
if item_reference == item.name then
item.tags['local'] = nil
item.tags['private'] = nil
for index, tag in ipairs(item.tags) do
if p.tags._privacy_tags[tag.name] then
table.remove(item.tags, index)
end
end
item.type, item.types[1] = 'member', 'member'
local accessor
if item_alias:find('^%[') then
accessor = ''
else
local is_class = documentation.type == 'classmod' or factory_item
if is_class and not item.tags['static'] then
accessor = ':'
else
accessor = '.'
end
end
if factory_item then
item.alias = utils.join{
documentation.items[item_index].tags['factory'].value,
accessor,
item_alias
}
else
item.alias = utils.join{
((documentation.tags['alias'] or {}).value or documentation.name),
accessor,
item_alias
}
end
item.hierarchy = utils.parse_hierarchy(item.alias)
break
end
end
end
--- Subitem tag correction utility.
-- @function utils.correct_subitem_tag
-- @param {table} item Item documentation data.
-- @local
function utils.correct_subitem_tag(item)
local field_tag = item.tags['field']
if item.type ~= 'function' or not field_tag then
return
end
if field_tag.name then
field_tag.name = 'param'
else
for _, tag_el in ipairs(field_tag) do
tag_el.name = 'param'
end
end
local param_tag = item.tags['param']
if param_tag and not param_tag.name then
if field_tag.name then
table.insert(param_tag, field_tag)
else
for _, tag_el in ipairs(field_tag) do
table.insert(param_tag, tag_el)
end
end
elseif param_tag and param_tag.name then
if field_tag.name then
param_tag = { param_tag, field_tag }
else
for i, tag_el in ipairs(field_tag) do
if i == 1 then
param_tag = { param_tag }
end
for _, tag_el in ipairs(field_tag) do
table.insert(param_tag, tag_el)
end
end
end
else
param_tag = field_tag
end
item.tags['field'] = nil
end
--- Item override tag utility.
-- @function utils.override_item_tag
-- @param {table} item Item documentation data.
-- @param {string} name Tag name.
-- @param[opt] {string} alias Target alias for tag.
-- @local
function utils.override_item_tag(item, name, alias)
if item.tags[name] then
item[alias or name] = item.tags[name].value
end
end
--- Identity function.
-- @function utils.identity
-- @param x The variable by reference.
-- @return The parameter `x` by reference.
-- @local
function utils.identity(x)
return x
end
--- Argument processing
-- @param {string} funcName name of function
-- @return function to process arguments
-- @local
local function makeInvokeFunc(funcName)
return function (f)
local args = require("Module:Arguments").getArgs(f, {
valueFunc = function (key, value)
if type(value) == 'string' then
value = value:match('^%s*(.-)%s*$') -- Remove whitespace.
if key == 'heading' or value ~= '' then
return value
else
return nil
end
else
return value
end
end
})
return p[funcName](args)
end
end
-- Docbunto rendering logic.
local frontend = {}
--- Markdown header converter.
-- @function urils.markdown_header
-- @param {string} hash Leading hash.
-- @param {string} text Header text.
-- @return {string} MediaWiki header.
-- @local
function frontend.markdown_header(hash, text)
local symbol = '='
return utils.join{
'\n',
symbol:rep(#hash), ' ', text, ' ', symbol:rep(#hash),
'\n'
}
end
--- Item reference formatting.
-- @function urils.item_reference
-- @param {string} ref Item reference.
-- @return {string} Internal MediaWiki link to article item.
-- @local
function frontend.item_reference(ref)
local temp = mw.text.split(ref, '|')
local item = temp[1]
local text = temp[2] or temp[1]
if references.items[item] then
local interwiki = 'mw'
item = interwiki .. references.items[item]
else
item = '#' .. item
end
return mw.text.tag{
name = 'code',
content = utils.join{ '[[', item, '|', text, ']]' }
}
end
--- Doclet type reference preprocessor.
-- Formats types with links to the [[mw:Extension:Scribunto/Lua reference manual|Lua reference manual]].
-- @function frontend.type_reference
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.type_reference(item, options)
local interwiki = 'mw:'
if
not options.noluaref and
item.value and
item.value:match('^%S+') == mw.text.tag('code', nil, '...')
then
item.value = item.value:gsub('^(%S+)', mw.text.tag{
name = 'code',
content = utils.join{ '[[', interwiki, 'Lua reference manual#varargs|...]]' }
})
end
-- Handle tag type references.
item.types = item.types or item.type and { item.type }
if not item.types then
return
end
for index, item_type in ipairs(item.types) do
item.types[index] = item.types[index]:gsub('[%w_. ]+', function(item_type)
local data = references.types[item_type]
local name = data and data.name or item_type
if not name:match('%.') and not name:match('^%u') and data then
name = i18n:msg('type-' .. name)
end
if data and not options.noluaref then
return utils.join{ '[[', interwiki, data.link, '|', name , ']]' }
elseif
item_type:find(i18n:msg('line-no'):gsub('$1', ''))
then
return utils.join { '[[' , options.file , '#L-', item_type:sub(6), '|', name, ']]' }
elseif
not options.noluaref and
not p.tags._generic_tags[item_type]
then
return utils.join { '[[#', item_type, '|', name, ']]' }
end
end)
end
item.type = table.concat(item.types, i18n:msg('separator-dot'))
end
--- Markdown preprocessor to MediaWiki format.
-- @function frontend.markdown
-- @param {string} str Unprocessed Markdown string.
-- @return {string} MediaWiki-compatible markup with HTML formatting.
-- @local
function frontend.markdown(str)
-- Bold & italic tags.
str = str:gsub('%*%*%*([^\n*]+)%*%*%*', '<b><i>%1</i></b>')
str = str:gsub('%*%*([^\n*]+)%*%*', '<b>%1</b>')
str = str:gsub('%*([^\n*]+)%*', '<i>%1</i>')
-- Self-closing header support.
str = str:gsub('%f[^\n%z](#+) *([^\n#]+) *#+%s', frontend.markdown_header)
-- External and internal links.
str = str:gsub('%[([^\n%]]+)%]%(([^\n][^\n)]-)%)', '[%2 %1]')
str = str:gsub('%{@link%s+([^}]+)%}', '[%1]')
str = str:gsub('%@{([^\n}]+)}', frontend.item_reference)
-- Programming & scientific notation.
str = str:gsub('%f["`]`([^\n`]+)`%f[^"`]', '<code><nowiki>%1</nowiki></code>')
str = str:gsub('%$%$([^\n$]+)%$%$', '<math display="inline">%1</math>')
-- Strikethroughs.
str = str:gsub('~~([^\n~]+)~~', '<del>%1</del>')
-- HTML output.
return str
end
--- Doclet function item preprocessor.
-- Formats item name as a function call with top-level arguments.
-- @function frontend.pretask_function_name
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.pretask_function_name(item, options)
local target = item.alias and 'alias' or 'name'
item[target] = item[target] .. '('
if
item.tags['param'] and
item.tags['param'].value and
not item.tags['param'].value:find('^[%w_]+[.[]')
then
if (item.tags['param'].modifiers or {})['opt'] then
local optional = mw.html.create('span')
optional:css('opacity', '0.65')
optional:wikitext(item.tags['param'].value:match('^(%S+)'))
item[target] = item[target] .. tostring(optional)
else
item[target] = item[target] .. item.tags['param'].value:match('^(%S*)')
end
elseif item.tags['param'] then
for index, tag in ipairs(item.tags['param']) do
if not tag.value:find('^[%w_]+[.[]') then
if (tag.modifiers or {})['opt'] then
local param = mw.html.create('span')
param:css('opacity', '0.65')
param:wikitext((index > 1 and ', ' or '') .. tag.value:match('^%S+'))
item[target] = item[target] .. tostring(param)
else
item[target] = item[target] .. (index > 1 and ', ' or '') .. tag.value:match('^(%S+)')
end
end
end
end
item[target] = item[target] .. ')'
end
--- Doclet parameter/field subitem preprocessor.
-- Indents and wraps variable prefix with `code` tag.
-- @function pretask_variable_prefix
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.pretask_variable_prefix(item, options)
local indent_symbol = options.ulist and '*' or ':'
local indent_level, indentation, item_id
if item.value then
indent_level = item.value:match('^%S*') == '...'
and 0
or select(2, item.value:match('^%S*'):gsub('[.[]', ''))
indentation = indent_symbol:rep(indent_level)
item_id = options.item_id
item.value = indentation .. item.value:gsub(
'^(%S+)',
mw.text.tag{
name = 'code',
attrs = { id = item_id .. '~%1' },
content = '%1'
},
1
)
elseif item then
for _, item_el in ipairs(item) do
frontend.pretask_variable_prefix(item_el, options)
end
end
end
--- Doclet usage subitem preprocessor.
-- Formats usage example with `<syntaxhighlight>` tag.
-- @function frontend.pretask_usage_highlight
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @local
function frontend.pretask_usage_highlight(item, options)
if item.value then
item.value = unindent(mw.text.trim(item.value))
if item.value:find('^{{.+}}$') then
item.value = item.value:gsub('=', mw.text.nowiki)
local multi_line = item.value:find('\n') and '|m = 1|' or '|'
if item.value:match('^{{([^:]+)') == '#invoke' then
item.value = item.value:gsub('^{{#invoke:', '{{mlx' .. multi_line)
else
if options.entrypoint then
item.value = item.value:gsub('^([^|]+)|%s*([^|}]-)(%s*)([|}])','%1|"%2"%3%4')
end
item.value = item.value:gsub('^{{', '{{tlx' .. multi_line)
end
local highlight_class = tonumber(mw.site.currentVersion:match('^%d%.%d+')) > 1.19
and 'mw-highlight'
or 'mw-geshi'
if item.value:find('\n') then
local highlight_div = mw.html.create('div')
highlight_div.addClass(highlight_class)
highlight_div.addClass('mw-content-ltr')
highlight_div:attr('dir', 'ltr')
highlight_div:wikitext(item.value)
item.value = tostring(highlight_div)
else
item.value = mw.text.tag{
name = 'span',
attrs = { class = 'code' },
content = item.value
}
end
else
local highlight_tag = mw.html.create('syntaxhighlight')
highlight_tag:attr('lang', 'lua')
if not item.value:find('\n') then
highlight_tag:attr('inline', 'inline')
end
highlight_tag:wikitext(item.value)
item.value = tostring(highlight_tag)
end
elseif item then
for _, item_el in ipairs(item) do
frontend.pretask_usage_highlight(item_el, options)
end
end
end
--- Doclet error subitem preprocessor.
-- Formats line numbers (`{#}`) in error tag values.
-- @function frontend.pretask_error_line
-- @param {table} item Item documentation data.
-- @local
function frontend.pretask_error_line(item, options)
if item.name then
local line
if item.modifiers and item.modifiers.line then
line = item.modifiers.line
end
for mod in pairs(item.modifiers or {}) do
if mod:find('^%d+$') then line = mod end
end
if line then
if item.types then
item.types[#item.types + 1] = i18n:msg('line-no', line)
else
item.type = i18n:msg('line-no', line)
end
end
elseif item then
for _, item_el in ipairs(item) do
frontend.pretask_error_line(item_el, options)
end
end
end
--- Doclet item renderer.
-- @function frontend.render_item
-- @param {table} stream Wikitext documentation stream.
-- @param {table} item Item documentation data.
-- @param {options} options Configuration options.
-- @param[opt] {function} pretask Item data preprocessor.
-- @local
function frontend.render_item(stream, item, options, pretask)
if pretask then pretask(item, options) end
local item_name = item.alias or item.name
frontend.type_reference(item, options)
local item_type = item.type
for _, name in ipairs(p.tags._subtype_hierarchy) do
if item.tags[name] then
item_type = item_type .. i18n:msg('separator-dot') .. name
end
end
item_type = i18n:msg('parentheses', item_type)
if options.strip and item.export and item.hierarchy then
item_name = item_name:gsub('^[%w_]+[.[]?', '')
end
-- add single spaces between parentheses similar to
-- MediaWiki documentation
if not item_name:find( '()', 1, true ) then
item_name = item_name:gsub('%(', '( ')
item_name = item_name:gsub('%)', ' )')
end
item_name = item_name:gsub('%[', '[ ')
item_name = item_name:gsub('%]', ' ]')
local code_node = mw.html.create('code')
:attr('id', options.item_id)
:wikitext(item_name)
if not usingOptionsContent then
local span_node = stream:wikitext(';')
:tag('span')
:addClass('plainlinks docbunto-link')
if fileTooBig or not syntaxhighlightPresent then
span_node:wikitext('[{{fullurl:' .. options.file .. '|action=edit#mw-ce-l' .. item.lineno .. '}} ' .. tostring(code_node) .. ']')
elseif title.namespace == 828 and options.file == title.text then
span_node:wikitext('[[' .. '#L-' .. item.lineno .. '|' .. tostring(code_node) .. ']]')
else
span_node:wikitext('[[' .. options.file .. '#L-' .. item.lineno .. '|' .. tostring(code_node) .. ']]')
end
else
stream:wikitext(';' .. tostring(code_node))
end
stream
:wikitext(item_type)
:newline()
if (#(item.summary or '') + #item.description) ~= 0 then
local separator = #(item.summary or '') ~= 0 and #item.description ~= 0
and (item.description:find(patterns.DOCBUNTO_WIKITEXT) and '\n' or patterns.DOCBUNTO_CONCAT)
or ''
local intro = (item.summary or '') .. separator .. item.description
intro = intro
:gsub('\n([{:#*])', '\n:%1')
:gsub('\n\n([^=])', '\n:%1')
stream:wikitext(':' .. intro):newline()
end
end
--- Doclet tag renderer.
-- @function frontend.render_tag
-- @param {table} stream Wikitext documentation stream.
-- @param {string} name Item tag name.
-- @param {table} tag Item tag data.
-- @param {options} options Configuration options.
-- @param[opt] {function} pretask Item data preprocessor.
-- @local
function frontend.render_tag(stream, name, tag, options, pretask)
if pretask then pretask(tag, options) end
if tag.value then
frontend.type_reference(tag, options)
local tag_name = i18n:msg('tag-' .. name, '1')
-- Handle ul/ol/dl comment support.
stream:wikitext(':')
:tag('b')
:wikitext(tag_name)
:done():done()
:wikitext(i18n:msg('separator-semicolon'))
:wikitext((mw.text.trim(tag.value):gsub('\n([{:#*])', '\n:%1')))
if tag.value:find('\n[{:#*]') and (tag.type or (tag.modifiers or {})['opt']) then
stream:newline():wikitext(':')
end
-- Type and optional appositive for tag.
if tag.type and (tag.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = {
tag.type ..
i18n:msg('separator-colon') ..
i18n:msg('optional')
}
})
elseif tag.type then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { tag.type }
})
elseif (tag.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { i18n:msg('optional') }
})
end
stream:newline()
else
local tag_name = i18n:msg('tag-' .. name, tostring(#tag))
stream
:wikitext(':')
:tag('b')
:wikitext(tag_name)
:done():done()
:wikitext(i18n:msg('separator-semicolon'))
:newline()
for _, tag_el in ipairs(tag) do
frontend.type_reference(tag_el, options)
local marker = options.ulist and '*' or ':'
stream:wikitext(':' .. marker .. tag_el.value:gsub('\n([{:#*])', '\n:' .. marker .. '%1'))
if tag_el.value:find('\n[{:#*]') and (tag_el.type or (tag_el.modifiers or {})['opt']) then
stream:newline():wikitext(':' .. marker .. (tag_el.value:match('^[*:]+') or ''))
end
if tag_el.type and (tag_el.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = {
tag_el.type ..
i18n:msg('separator-colon') ..
i18n:msg('optional')
}
})
elseif tag_el.type then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { tag_el.type }
})
elseif (tag_el.modifiers or {})['opt'] then
stream:wikitext(i18n:msg{
key = 'parentheses',
args = { i18n:msg('optional') }
})
end
stream:newline()
end
end
end
--- Template entrypoint for [[Template:Docbunto]].
-- @function p._main
-- @param {table} args Arguments
-- @return {string} Module documentation output.
function p._main(args)
frame = mw.getCurrentFrame()
local modname = mw.text.trim(args[1] or args.file or DEFAULT_TITLE)
local options = {}
options.file = modname
options.all = yesno(args.all or false)
options.autodoc = yesno(args.autodoc or false)
options.boilerplate = yesno(args.boilerplate or options.autodoc or false)
options.box = yesno(args.box or args.infobox or options.autodoc or false)
options.caption = args.caption
options.card = yesno(args.card or (title.namespace == 828 and not options.autodoc))
options.code = yesno(args.code or false)
options.colon = yesno(args.colon or false)
options.footer = yesno(args.footer or title.namespace == 828)
options.image = args.image
options.migration = yesno(args.migration or false)
options.noluaref = yesno(args.noluaref or false)
options.plain = yesno(args.plain or false)
options.preface = args.preface
options.simple = yesno(args.simple or false)
options.sort = yesno(args.sort or false)
options.strip = yesno(args.strip or false)
options.verbose = yesno(args.verbose or false)
options.ulist = yesno(args.ulist or false)
return p.build(modname, options)
end
--- Entrypoint for the module.
-- @function p.main
-- @param {Frame} frame Module frame.
-- @return {string} Module documentation output.
p.main = makeInvokeFunc('_main')
--- Scribunto documentation generator entrypoint.
-- @function p.build
-- @param[opt] {string} modname Module page name (without namespace).
-- Default: second-level subpage.
-- @param[opt] {options} options Configuration options.
function p.build(modname, options)
modname = modname or DEFAULT_TITLE
options = options or {}
local tagdata = p.taglet(modname, options)
local docdata = p.doclet(tagdata, options)
return docdata
end
--- Docbunto taglet parser for Scribunto modules.
-- @function p.taglet
-- @param[opt] {string} modname Module page name (without namespace).
-- @param[opt] {options} options Configuration options.
-- @error[line=1081] {string} 'Lua source code not found in $1'
-- @error[line=1087] {string} 'documentation markup for Docbunto not found in $1'
-- @return {table} Module documentation data.
function p.taglet(modname, options)
modname = modname or DEFAULT_TITLE
options = options or {}
local filepath = mw.site.namespaces[828].name .. ':' .. modname
local content = mw.title.new(filepath):getContent()
-- Content checks.
if options.content then
content = options.content
usingOptionsContent = true
else
content = mw.title.new(filepath):getContent() or error(i18n:msg('no-content', filepath), 0)
end
-- Syntax highlighting is disabled for files above a specific size
fileTooBig = content:len() > 102400
if
not content:match('%-%-%-') and
not content:match(options.colon and '%w+:' or '@%w+')
then
error(i18n:msg('no-markup', filepath))
end
-- Remove leading escapes.
content = content:gsub('^%-%-+%s*<[^>]+>\n', '')
-- Remove closing pretty comments.
content = content:gsub('\n%-%-%-%-%-+(\n[^-]+)', '\n-- %1')
-- Remove boilerplate block comments.
if options.boilerplate then
content = content:gsub('^%-%-%[=*%[\n.-\n%-?%-?%]%=*]%-?%-?%s+', '')
content = content:gsub('%s+%-%-%[=*%[\n.-\n%-?%-?%]%=*]%-?%-?$', '')
end
-- Configure patterns for colon mode and Unicode character encoding.
options.unicode = type(content:find('[^%w%c%p%s]+')) == 'number'
options.iso639_th = type(content:find('\224\184[\129-\155]')) == 'number'
utils.configure_patterns(options)
-- Content lexing.
local lines = lexer(content)
local tokens = {}
local dummy_token = {
data = '',
posFirst = 1,
posLast = 1
}
local token_closure = 0
for _, line in ipairs(lines) do
if #line == 0 then
dummy_token.type = token_closure == 0
and 'whitespace'
or tokens[#tokens].type
table.insert(tokens, mw.clone(dummy_token))
else
for _, token in ipairs(line) do
if token.data:find('^%[=*%[$') or token.data:find('^%-%-%[=*%[$') then
token_closure = 1
end
if token.data:find(']=*]') then
token_closure = 0
end
table.insert(tokens, token)
end
end
end
-- Start documentation data.
local documentation = {}
documentation.filename = filepath
documentation.description = ''
documentation.code = content
documentation.comments = {}
documentation.tags = {}
documentation.items = {}
local line_no = 0
local item_index = 0
-- Taglet tracking variables.
local start_mode = true
local comment_mode = false
local doctag_mode = false
local export_mode = false
local special_tag = false
local pragma_mode = false
local factory_mode = false
local return_mode = false
local comment_tail = ''
local tag_name = ''
local new_item = false
local new_tag = false
local new_tag_item = false
local new_item_code = false
local pretty_comment = false
local comment_brace = false
local t, i, item = tokens[1], 1
local p_success, p_error = pcall(function()
while t do
-- Taglet variable update.
new_item = t.data:find('^%-%-%-') or t.data:find('^%-%-%[%=*%[$')
comment_tail = t.data:gsub('^%-%-+', '')
tag_name = comment_tail:match(patterns.DOCBUNTO_TAG)
tag_name = p.tags._alias[tag_name] or tag_name
new_tag = type(p.tags[tag_name]) == 'string'
local last_token = t.posFirst ~= 1 and 2 or 1
new_tag_item = (
new_tag and i > 1 and tokens[i - last_token].type ~= 'comment'
and not tokens[i - last_token].data:find(patterns.DOCBUNTO_TAG_COMMENT)
)
pretty_comment =
t.data:find('^%-%-%-+%s*$') or
t.data:find('[^-]+%-%-%-+%s*$') or
t.data:find('%-*[ \t]*<nowiki>$') or
t.data:find('%-*[ \t]*<pre>$')
comment_brace =
t.data:find('^%-%-%[=*%[$') or
t.data:find('^%-%-%]=*%]$') or
t.data:find('^%]=*%]%-%-$')
pragma_mode = tag_name == 'pragma'
export_mode = tag_name == 'export' and not doctag_mode
special_tag = pragma_mode or export_mode
local tags, tag, subtokens, separator
-- Line counter.
if t.posFirst == 1 then
line_no = line_no + 1
end
-- Data insertion logic.
if t.type == 'comment' then
if new_item then
comment_mode = true
end
if (new_tag or new_tag_item) and not special_tag then
comment_mode = true
doctag_mode = true
end
-- Module-level documentation taglet.
if start_mode then
table.insert(documentation.comments, t.data)
end
-- Module description.
if
start_mode and comment_mode and
not new_tag and not doctag_mode and
not pretty_comment and not comment_brace
then
separator = mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT)
and '\n'
or (#documentation.description ~= 0 and patterns.DOCBUNTO_CONCAT or '')
documentation.description = utils.join{
documentation.description,
separator,
mw.text.trim(comment_tail)
}
end
-- Switch from module description to module-level tag list.
if start_mode and new_tag and not export_mode then
doctag_mode = true
table.insert(documentation.tags, utils.process_tag(comment_tail))
-- Concatenating module-level tag with more information.
elseif
start_mode and doctag_mode and
not pretty_comment and not comment_brace
then
tags = documentation.tags
if p.tags[tags[#tags].name] == TAG_MULTI then
separator = mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT)
and '\n'
or patterns.DOCBUNTO_CONCAT
tags[#tags].value = utils.join{
tags[#tags].value,
separator,
mw.text.trim(comment_tail)
}
elseif p.tags[tags[#tags].name] == TAG_MULTI_LINE then
tags[#tags].value = utils.join{
tags[#tags].value,
'\n',
comment_tail
}
end
end
-- Detect a new documentation item.
if not start_mode and (new_item or new_tag_item) and not special_tag then
table.insert(documentation.items, {})
item_index = item_index + 1
item = documentation.items[item_index]
item.lineno = line_no
item.code = ''
item.comments = {}
item.description = ''
item.tags = {}
end
-- Concatenate an item with more information.
if
not start_mode and comment_mode and
not new_tag and not doctag_mode and
not pretty_comment and not comment_brace
then
separator = (mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT))
and '\n'
or (#item.description ~= 0 and patterns.DOCBUNTO_CONCAT or '')
item.description = utils.join{
item.description,
separator,
mw.text.trim(comment_tail)
}
end
-- Switch from item information to item tags.
if not start_mode and new_tag and not special_tag then
doctag_mode = true
table.insert(item.tags, utils.process_tag(comment_tail))
-- Extend item tags with lines of further information.
elseif
not start_mode and doctag_mode and
not pretty_comment and not comment_brace
then
tags = item.tags
if p.tags[tags[#tags].name] == TAG_MULTI then
separator = mw.text.trim(comment_tail):find(patterns.DOCBUNTO_WIKITEXT)
and '\n'
or patterns.DOCBUNTO_CONCAT
tags[#tags].value = utils.join{
tags[#tags].value,
separator,
mw.text.trim(comment_tail)
}
elseif p.tags[tags[#tags].name] == TAG_MULTI_LINE then
tags[#tags].value = utils.join{
tags[#tags].value,
'\n',
comment_tail
}
end
end
-- Save pre-item comments to item information.
if not start_mode and (comment_mode or doctag_mode) then
table.insert(item.comments, t.data)
end
-- Export tag support.
if export_mode then
factory_mode = t.posFirst ~= 1
if factory_mode then
item.exports = true
else
documentation.exports = true
end
-- Parse export token data while concatenating code.
subtokens = {}
while t and (not factory_mode or (factory_mode and t.data ~= 'end')) do
if factory_mode then
item.code = utils.join{
item.code,
(t.posFirst == 1 and '\n' or ''),
t.data
}
end
-- Fetch our item export tokens aka "subtokens".
t, i = tokens[i + 1], i + 1
if t and t.posFirst == 1 then
line_no = line_no + 1
end
if t and t.type ~= 'whitespace' and t.type ~= 'keyword' and t.type ~= 'comment' then
table.insert(subtokens, t)
end
end
-- Tracking and boolean variables for parsing exports.
local separator = { [','] = true, [';'] = true }
local brace = { ['{'] = true, ['}'] = true }
local item_reference, item_alias = '', ''
local sequence_index, has_key = 0, false
local subtoken, index = subtokens[2], 2
-- Logic that exports items to an item or module.
while not brace[subtoken.data] do
if subtoken.data == '=' then
has_key = true
elseif not separator[subtoken.data] then
if has_key then
item_reference = item_reference .. subtoken.data
else
item_alias = item_alias .. subtoken.data
end
end
if subtokens[index + 1] and separator[subtokens[index + 1].data] or brace[subtokens[index + 1].data] then
if not has_key then
sequence_index = sequence_index + 1
item_reference, item_alias = item_alias, item_reference
item_alias = '[' .. tostring(sequence_index) .. ']'
end
utils.export_item(documentation, item_reference, item_index, item_alias, factory_mode)
item_reference, item_alias, has_key = '', '', false
end
subtoken, index = subtokens[index + 1], index + 1
end
if not factory_mode then
break -- end of file
else
factory_mode = false -- end of item
end
end
-- Pragma tag support.
if pragma_mode then
tag = utils.process_tag(comment_tail)
if tag.modifiers then
options[tag.value] = yesno((next((tag ).modifiers or {})), true)
elseif tag.value:find(' ') then
local index = tag.value:find(' ')
local key = tag.value:sub(1, index - 1)
local val = tag.value:sub(index + 1)
options[key] = yesno(val)
elseif options[tag.value] == nil then
options[tag.value] = true
end
end
end
-- Package data post-processing.
if (t.type ~= 'comment' or t.data:find('^%-%-%]=*%]$') or t.data:find('^%]=*%]%-%-$')) and (comment_mode or doctag_mode) and start_mode then
documentation.tags = utils.hash_map(documentation.tags)
documentation.name = utils.extract_name(documentation, { project = true })
documentation.info = utils.extract_info(documentation)
documentation.types = utils.extract_types(documentation) or { 'module' }
documentation.type = documentation.types[1]
-- N.B: summary field = 1st comment sentence; description = text remainder.
if #documentation.description ~= 0 then
documentation.summary = match(documentation.description, patterns.DOCBUNTO_SUMMARY)
documentation.description = documentation.description:sub(select(2, documentation.description:find('%s*', #documentation.summary + 1)) + 1)
end
documentation.description = documentation.description:gsub('%s%s+', '\n\n')
documentation.executable = p.tags._code_types[documentation.type] and true or false
utils.correct_subitem_tag(documentation)
utils.override_item_tag(documentation, 'name')
utils.override_item_tag(documentation, 'alias')
utils.override_item_tag(documentation, 'summary')
utils.override_item_tag(documentation, 'description')
utils.override_item_tag(documentation, 'class', 'type')
end
-- Item data post-processing.
if
(t.type ~= 'comment' or t.data:find('^%-%-%]=*%]$') or t.data:find('^%]=*%]%-%-$'))
and (comment_mode or doctag_mode) and item_index ~= 0
then
item.tags = utils.hash_map(item.tags)
item.name = utils.extract_name(item)
item.types = utils.extract_types(item)
item.type = item.types[1]
if #item.description ~= 0 then
item.summary = match(item.description, patterns.DOCBUNTO_SUMMARY)
item.description = item.description:sub(select(2, item.description:find('%s*', #item.summary + 1)) + 1)
end
item.description = item.description:gsub('%s%s+', '\n\n')
new_item_code = true
end
-- Documentation block reset.
if t.type ~= 'comment' or t.data:find('^%-%-%]=*%]$') or t.data:find('^%]=*%]%-%-$') then
start_mode = false
comment_mode = false
doctag_mode = false
export_mode = false
pragma_mode = false
end
-- Don't concatenate module return value into item code.
if t.data == 'return' and t.posFirst == 1 then
return_mode = true
end
-- Item code concatenation.
if item_index ~= 0 and not doctag_mode and not comment_mode and not comment_brace and not return_mode then
separator = #item.code ~= 0 and t.posFirst == 1 and '\n' or ''
item.code = utils.join{ item.code, separator, t.data }
-- Code analysis on item headline.
if new_item_code and item.code:find('\n') and t.posFirst == 1 then
utils.code_heuristic(item)
new_item_code = false
end
end
t, i = tokens[i + 1], i + 1
end
documentation.lineno = line_no
local package_name = (documentation.tags['alias'] or {}).value or documentation.name or DEFAULT_VARIABLE
local package_alias = (documentation.tags['alias'] or {}).value or 'p'
local export_ptn = '^%s([.[])'
for _, item in ipairs(documentation.items) do
if item.name == package_alias or (item.name and item.name:match('^' .. package_alias .. '[.[]')) then
item.alias = item.name:gsub(export_ptn:format(package_alias), documentation.name .. '%1')
end
if
item.name == package_name or
item.tags['export'] or
(item.name and package_name and item.name:find(export_ptn:format(package_name))) or
(item.alias and package_name and item.alias:find(export_ptn:format(package_name)))
then
item.export = true
item.tags['local'] = nil
item.tags['private'] = nil
for index, tag in ipairs(item.tags) do
if tag.name == 'local' or tag.name == 'private' then
table.remove(item.tags, index)
end
end
end
if item.name and (item.name:find('[.:]') or item.name:find('%[[\'"]')) then
item.hierarchy = utils.parse_hierarchy(item.name)
end
item.type = item.type or ((item.alias or item.name or ''):find('[.[]') and 'member' or 'variable')
utils.correct_subitem_tag(item)
utils.override_item_tag(item, 'name')
utils.override_item_tag(item, 'alias')
utils.override_item_tag(item, 'summary')
utils.override_item_tag(item, 'description')
utils.override_item_tag(item, 'class', 'type')
end
-- Sort documentation items by their access level.
-- Items are sorted by whether they are exported at the module level.
-- Items are then subsorted by whether the item is `@local` aka `@private`.
table.sort(documentation.items, function(item1, item2)
local inaccessible1 = item1.tags['local'] or item1.tags['private']
local inaccessible2 = item2.tags['local'] or item2.tags['private']
-- Send package items to the top.
if item1.export and not item2.export then
return true
elseif item2.export and not item1.export then
return false
-- Send private items to the bottom.
elseif inaccessible1 and not inaccessible2 then
return false
elseif inaccessible2 and not inaccessible1 then
return true
-- Optional alphabetical sort.
elseif options.sort then
return (item1.alias or item1.name) < (item2.alias or item2.name)
-- Sort via source code order by default.
else
return item1.lineno < item2.lineno
end
end)
end)
if not p_success then
mw.addWarning("Docbunto error: " .. p_error)
end
return documentation
end
--- Doclet renderer for Docbunto taglet data.
-- @function p.doclet
-- @param {table} data Taglet documentation data.
-- @param[opt] {options} options Configuration options.
-- @return {string} Wikitext documentation output.
function p.doclet(data, options)
local documentation = mw.html.create()
local namespace_ptn = utils.join{ '^', mw.site.namespaces[828].name, ':' }
local codepage = data.filename:gsub(namespace_ptn, '', 1)
options = options or {}
options.file = data.filename
frame = frame or mw.getCurrentFrame():getParent() or mw.getCurrentFrame()
local maybe_md = options.plain and utils.identity or frontend.markdown
local tohtml = function(str)
return frame:preprocess(maybe_md(str))
end
-- Disable edit sections for automatic documentation pages.
if not options.code then
documentation:wikitext(frame:preprocess('__NOEDITSECTION__'))
end
-- Information
if not options.code and options.box then
local custom, infobox = pcall(require, 'Module:Docbunto/infobox')
if custom and type(infobox) == 'function' then
documentation:wikitext(infobox(data, codepage, frame, options, title, maybe_md)):newline()
end
end
-- Documentation lede.
if not options.code and (#(data.summary or '') + #data.description) ~= 0 then
local separator = #(data.summary or '') ~= 0 and #data.description ~= 0
and (data.description:find(patterns.DOCBUNTO_WIKITEXT) and '\n\n' or patterns.DOCBUNTO_CONCAT)
or ''
local intro = utils.join{ data.summary or '', separator, data.description }
intro = tohtml(intro:gsub('^(' .. codepage .. ')', mw.text.tag('b', nil, '%1')))
if options.migration then
documentation:wikitext(frame:preprocess(mw.text.tag{
name = 'syntaxhighlight',
content = intro
})):newline():newline()
else
documentation:wikitext(intro):newline():newline()
end
end
-- Custom documentation preface.
if options.preface then
documentation:wikitext(options.preface):newline():newline()
end
-- Start code documentation.
local codedoc = mw.html.create()
local function_module = data.tags['param'] or data.tags['return']
local header_type =
documentation.type == 'classmod'
and 'class'
or function_module
and 'function'
or 'items'
if (function_module or #data.items ~= 0) and not options.code or options.preface then
codedoc
:tag('h2')
:wikitext(i18n:msg('header-documentation'))
:done()
:newline()
end
if (function_module or #data.items ~= 0) then
codedoc
:tag('h3')
:wikitext(i18n:msg('header-' .. header_type))
:done()
:newline()
end
-- Function module support.
if function_module then
data.type, data.types[1] = 'function', 'function'
options.item_id = data.name
if not options.code or not options.verbose then data.description = '' end
frontend.render_item(codedoc, data, options, frontend.pretask_function_name)
if not options.simple and data.tags['param'] then
frontend.render_tag(codedoc, 'param', data.tags['param'], options, frontend.pretask_variable_prefix)
end
if not options.simple and data.tags['error'] then
frontend.render_tag(codedoc, 'error', data.tags['error'], options, frontend.pretask_error_line)
end
if not options.simple and data.tags['return'] then
frontend.render_tag(codedoc, 'return', data.tags['return'], options)
end
end
-- Render documentation items.
local other_header = false
local private_header = false
local inaccessible
for _, item in ipairs(data.items) do
inaccessible = item.tags['local'] or item.tags['private']
if not options.all and inaccessible then
break
end
if
not other_header and item.type ~= 'section' and item.type ~= 'type' and
not item.export and not item.hierarchy and not inaccessible
then
codedoc
:tag('h3')
:wikitext(i18n:msg('header-other'))
:done()
:newline()
other_header = true
end
if not private_header and options.all and inaccessible then
codedoc
:tag('h3')
:wikitext(i18n:msg('header-private'))
:done()
:newline()
private_header = true
end
if item.type == 'section' then
codedoc
:tag('h3')
:wikitext((mw.ustring.gsub(item.summary or item.alias or item.name, '[.։。।෴۔።]$', '')))
:done()
:newline()
if #item.description ~= 0 then
codedoc:wikitext(mw.text.trim(item.description)):newline()
end
elseif item.type == 'type' then
if options.strip and item.export and item.hierarchy then
if item.alias then
item.alias = item.alias:gsub('^[%w_]+[.[]?', '')
else
item.name = item.name:gsub('^[%w_]+[.[]?', '')
end
end
codedoc
:tag('h3')
:wikitext(mw.text.tag('code', {}, item.alias or item.name))
:done()
:newline()
if (#(item.summary or '') + #item.description) ~= 0 then
local separator = #(item.summary or '') ~= 0 and #item.description ~= 0
and (item.description:find(patterns.DOCBUNTO_WIKITEXT) and '\n\n' or patterns.DOCBUNTO_CONCAT)
or ''
codedoc:wikitext((item.summary or '') .. separator .. item.description):newline()
end
elseif item.type == 'function' then
options.item_id = item.alias or item.name
frontend.render_item(codedoc, item, options, frontend.pretask_function_name)
if not options.simple and item.tags['param'] then
frontend.render_tag(codedoc, 'param', item.tags['param'], options, frontend.pretask_variable_prefix)
end
if not options.simple and item.tags['error'] then
frontend.render_tag(codedoc, 'error', item.tags['error'], options, frontend.pretask_error_line)
end
if not options.simple and item.tags['return'] then
frontend.render_tag(codedoc, 'return', item.tags['return'], options)
end
elseif
item.type == 'table' or
item.type ~= nil and (
item.type == 'member' or
item.type == 'variable'
) and (item.alias or item.name)
then
options.item_id = item.alias or item.name
frontend.render_item(codedoc, item, options)
if not options.simple and item.tags['field'] then
frontend.render_tag(codedoc, 'field', item.tags['field'], options, frontend.pretask_variable_prefix)
end
end
if item.type ~= 'section' and item.type ~= 'type' then
if not options.simple and item.tags['note'] then
frontend.render_tag(codedoc, 'note', item.tags['note'], options)
end
if not options.simple and item.tags['warning'] then
frontend.render_tag(codedoc, 'warning', item.tags['warning'], options)
end
if not options.simple and item.tags['fixme'] then
frontend.render_tag(codedoc, 'fixme', item.tags['fixme'], options)
end
if not options.simple and item.tags['todo'] then
frontend.render_tag(codedoc, 'todo', item.tags['todo'], options)
hasTodoItems = true
end
if not options.simple and item.tags['usage'] then
frontend.render_tag(codedoc, 'usage', item.tags['usage'], options, frontend.pretask_usage_highlight)
end
if not options.simple and item.tags['see'] then
frontend.render_tag(codedoc, 'see', item.tags['see'], options)
end
end
end
-- Render module-level annotations.
local header_level = options.code and 'h3' or 'h2'
local header_text
for _, tag_name in ipairs(p.tags._annotation_hierarchy) do
if data.tags[tag_name] then
header_text = i18n:msg('tag-' .. tag_name, data.tags[tag_name].value and '1' or '2')
header_text = '<' .. header_level .. '>' .. ' ' .. header_text .. ' ' .. '</' .. header_level .. '>'
codedoc:newline():wikitext(header_text):newline()
if data.tags[tag_name].value then
codedoc:wikitext(data.tags[tag_name].value):newline()
else
for _, tag_el in ipairs(data.tags[tag_name]) do
codedoc:wikitext('* ' .. tag_el.value):newline()
end
end
end
end
-- Byline for autogeneration.
if options.footer then
codedoc:newline()
codedoc:tag('hr'):done()
codedoc:newline()
codedoc:tag('p'):css( 'text-align', 'right' ):css('font-size', '80%'):wikitext(i18n:msg('message-autogeneration'))
end
-- Add nowiki tags for EOF termination in tests.
codedoc:tag('nowiki', { selfClosing = true })
-- Code documentation formatting.
codedoc = tohtml(tostring(codedoc))
documentation:wikitext(codedoc)
-- Endmatter table for module information.
if options.card then
local endmatter = mw.html.create('table')
endmatter:addClass('wikitable')
endmatter:css('width', '75%')
endmatter:css('margin', '0 auto 1em auto')
local module_type = data.type == 'module'
and i18n:msg('invocable-module')
or i18n:msg('meta-module')
endmatter
:tag('caption')
:wikitext('Module information card (autogenerated)')
endmatter
:tag('tr')
:tag('th'):attr('scope', 'col'):wikitext('Name'):done()
:tag('th'):attr('scope', 'col'):wikitext('Value'):done()
if options.image or data.info and data.info['image'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('endmatter-image')):done()
:tag('td')
:attr('align', 'center')
:wikitext('[[File:' .. (options.image or data.info['image']) .. '|270px|center]]')
:done()
:done()
end
if options.caption or data.info and data.info['caption'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('endmatter-caption')):done()
:tag('td')
:attr('align', options.image or data.info['image'] and 'center' or 'left')
:wikitext(tohtml(options.caption or data.info['caption']))
:done()
:done()
end
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext((gsub(i18n:msg('type-variable'), '^%w', mw.ustring.upper))):done()
:tag('td')
:attr('align', options.image or data.info and data.info['image'] and 'center' or 'left')
:wikitext(mw.text.tag({
name = options.image or data.info and data.info['image'] and 'h1' or 'span',
content = mw.text.tag({
name = 'b',
content = mw.text.tag({
name = 'code',
content = data.name or DEFAULT_VARIABLE
})
})
})):done()
:done()
:tag('tr')
:tag('td'):wikitext(i18n:msg('code')):done()
:tag('td'):wikitext(tohtml('[[' .. data.filename .. ']]')):done()
:done()
if data.info and data.info['release'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('release-status')):done()
:tag('td'):wikitext(tohtml(data.info['release'])):done()
:done()
end
if data.summary then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('description')):done()
:tag('td'):wikitext(tohtml(data.summary)):done()
:done()
end
if data.info and data.info['author'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('author')):done()
:tag('td'):newline():wikitext(tohtml(data.info['author'])):done()
:done()
end
if data.info and data.info['attribution'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('using-code-by')):done()
:tag('td'):wikitext(tohtml(data.info['attribution'])):done()
:done()
end
if data.info and data.info['credit'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('other-attribution')):done()
:tag('td'):wikitext(tohtml(data.info['credit'])):done()
:done()
end
if data.info and data.info['require'] then
data.info['require'] = data.info['require']
:gsub('^[^[%s]+$', '[[%1]]')
:gsub('%* ([^[%s]+)', '* [[%1]]')
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('dependencies')):done()
:tag('td'):newline():wikitext(tohtml(data.info['require'])):done()
:done()
end
if data.info and data.info['demo'] then
endmatter
:tag('tr')
:tag('td'):attr('scope', 'row'):wikitext(i18n:msg('examples')):done()
:tag('td'):wikitext(tohtml(data.info['demo'])):done()
:done()
end
endmatter:newline()
endmatter = tostring(endmatter)
documentation:newline():newline()
documentation:wikitext(endmatter)
end
documentation = tostring(documentation)
if hasTodoItems and options.autodoc
and mw.title.new('Module:' .. options.file).fullText == mw.title.getCurrentTitle().fullText then
documentation = documentation .. '[[Category:' .. i18n:msg('todo') .. ']]'
end
if mw.title.new('Module:Docbunto/styles.css').exists then
documentation = documentation .. frame:extensionTag('templatestyles', '', {src = 'Module:Docbunto/styles.css'})
end
return documentation
end
--- Token dictionary for Docbunto tags.
-- Maps Docbunto tag names to tag tokens.
-- * Multi-line tags use the `'M'` token.
-- * Multi-line preformatted tags use the `'ML'` token.
-- * Identifier tags use the `'ID'` token.
-- * Single-line tags use the `'S'` token.
-- * Flags use the `'N'` token.
-- * Type tags use the `'T'` token.
-- @table p.tags
p.tags = {
-- Item-level tags, available for global use.
['param'] = 'M', ['see'] = 'M', ['note'] = 'M', ['usage'] = 'ML',
['description'] = 'M', ['field'] = 'M', ['return'] = 'M',
['fixme'] = 'M', ['todo'] = 'M', ['warning'] = 'M', ['error'] = 'M';
['class'] = 'ID', ['name'] = 'ID', ['alias'] = 'ID';
['summary'] = 'S', ['pragma'] = 'S', ['factory'] = 'S',
['release'] = 'S', ['author'] = 'S', ['copyright'] = 'S', ['license'] = 'S',
['image'] = 'S', ['caption'] = 'S', ['require'] = 'S', ['attribution'] = 'S',
['credit'] = 'S', ['demo'] = 'S';
['local'] = 'N', ['export'] = 'N', ['private'] = 'N', ['constructor'] = 'N',
['static'] = 'N';
-- Project-level tags, all scoped to a file.
['module'] = 'T', ['script'] = 'T', ['classmod'] = 'T', ['topic'] = 'T',
['submodule'] = 'T', ['example'] = 'T', ['file'] = 'T';
-- Module-level tags, used to register module items.
['function'] = 'T', ['table'] = 'T', ['member'] = 'T', ['variable'] = 'T',
['section'] = 'T', ['type'] = 'T';
}
p.tags._alias = {
-- Normal aliases.
['about'] = 'summary',
['abstract'] = 'summary',
['brief'] = 'summary',
['bug'] = 'fixme',
['argument'] = 'param',
['credits'] = 'credit',
['code'] = 'usage',
['details'] = 'description',
['discussion'] = 'description',
['exception'] = 'error',
['lfunction'] = 'function',
['package'] = 'module',
['property'] = 'member',
['raise'] = 'error',
['requires'] = 'require',
['returns'] = 'return',
['throws'] = 'error',
['typedef'] = 'type',
-- Typed aliases.
['bool'] = 'field',
['func'] = 'field',
['int'] = 'field',
['number'] = 'field',
['string'] = 'field',
['tab'] = 'field',
['vararg'] = 'param',
['tfield'] = 'field',
['tparam'] = 'param',
['treturn'] = 'return'
}
p.tags._type_alias = {
-- Implicit type value alias.
['bool'] = 'boolean',
['func'] = 'function',
['int'] = 'number',
['number'] = 'number',
['string'] = 'string',
['tab'] = 'table',
['vararg'] = '...',
-- Pure typed modifier alias.
['tfield'] = 'variable',
['tparam'] = 'variable',
['treturn'] = 'variable'
}
p.tags._project_level = {
-- Contains code.
['module'] = true,
['script'] = true,
['classmod'] = true,
['submodule'] = true,
['file'] = true,
-- Contains documentation.
['topic'] = true,
['example'] = true
}
p.tags._code_types = {
['module'] = true,
['script'] = true,
['classmod'] = true
}
p.tags._module_info = {
['image'] = true,
['caption'] = true,
['release'] = true,
['author'] = true,
['copyright'] = true,
['license'] = true,
['require'] = true,
['credit'] = true,
['attribution'] = true,
['demo'] = true
}
p.tags._annotation_tags = {
['field'] = true,
['warning'] = true,
['fixme'] = true,
['note'] = true,
['todo'] = true,
['see'] = true
}
p.tags._annotation_hierarchy = {
'warning',
'fixme',
'note',
'todo',
'see'
}
p.tags._privacy_tags = {
['private'] = true,
['local'] = true
}
p.tags._generic_tags = {
['variable'] = true,
['member'] = true
}
p.tags._subtype_tags = {
['factory'] = true,
['local'] = true,
['private'] = true,
['constructor'] = true,
['static'] = true
}
p.tags._subtype_hierarchy = {
'private',
'local',
'static',
'factory',
'constructor'
}
return p
ttce6j3uqd6skz9pkmhumxfj4bct9ik
Module:Fallbacklist
828
2666
33409
2024-11-20T01:06:54Z
en>Awesome Aasim
0
33409
Scribunto
text/plain
--- Language fallback rules for other Lua modules.
-- @see [[c:Module:Fallbacklist]]
-- @release stable
-- @submodule
return {
-- crh (Crimean Tatar) cluster: crh-cyrl , crh-latn -> crh (Crimean Tatar)
['crh'] = {'crh-latn'},
['crh-cyrl'] = {'crh', 'ru'},
['crh-latn'] = {'crh'},
-- de (German) cluster:
['als'] = {'gsw', 'de'}, -- Alemannisch
['bar'] = {'de'}, -- Bavarian
['de-at'] = {'de'}, -- Austrian German
['de-ch'] = {'de'}, -- Swiss High German
['de-formal'] = {'de'}, -- German (formal address)
['dsb'] = {'de'}, -- Lower Sorbian
['frr'] = {'de'}, -- Northern Frisian
['hsb'] = {'de'}, -- Upper Sorbian
['ksh'] = {'de'}, -- Colognian
['lb'] = {'de'}, -- Luxembourgish
['nds'] = {'nds-nl', 'de'}, -- Low German
['nds-nl'] = {'nds', 'nl'}, -- Low Saxon (Netherlands)
['pdc'] = {'de'}, -- Deitsch
['pdt'] = {'nds', 'de'}, -- Plautdietsch
['pfl'] = {'de'}, -- Pälzisch
['sli'] = {'de'}, -- Lower Silesian
['stq'] = {'de'}, -- Seeltersk
['vmf'] = {'de'}, -- Upper Franconian
-- es (Spanish) cluster
['an'] = {'es'}, -- Aragonese
['arn'] = {'es'}, -- Mapuche
['ay'] = {'es'}, -- Aymara
['cbk-zam'] = {'es'}, -- Chavacano de Zamboanga
['gn'] = {'es'}, -- Guarani
['lad'] = {'es'}, -- Ladino
['nah'] = {'es'}, -- Nahuatl
['qu'] = {'es'}, -- Quechua
['qug'] = {'qu', 'es'}, -- Runa shimi
-- et (Estonian) cluster
['liv'] = {'et'}, -- Līvõ kēļ
['vep'] = {'et'}, -- Veps
['vro'] = {'et'}, -- Võro
['fiu-vro'] = {'vro', 'et'}, -- Võro
-- fa (Persian) cluster
['bcc'] = {'fa'}, -- Southern Balochi
['bqi'] = {'fa'}, -- Bakhtiari
['glk'] = {'fa'}, -- Gilaki
['mzn'] = {'fa'}, -- Mazandarani
-- fi (Finnish) cluster:
['fit'] = {'fi'}, -- meänkieli
['vot'] = {'fi'}, -- Votic
-- fr (French) cluster:
['bm'] = {'fr'}, -- Bambara
['br'] = {'fr'}, -- Breton
['co'] = {'fr'}, -- Corsican
['ff'] = {'fr'}, -- Fulah
['frc'] = {'fr'}, -- Cajun French
['frp'] = {'fr'}, -- Franco-Provençal
['ht'] = {'fr'}, -- Haitian
['ln'] = {'fr'}, -- Lingala
['mg'] = {'fr'}, -- Malagasy
['pcd'] = {'fr'}, -- Picard
['sg'] = {'fr'}, -- Sango
['ty'] = {'fr'}, -- Tahitian
['wa'] = {'fr'}, -- Walloon
['wo'] = {'fr'}, -- Wolof
-- hi (Hindi) cluster
['anp'] = {'hi'}, -- Angika
['mai'] = {'hi'}, -- Maithili
['sa'] = {'hi'}, -- Sanskrit
-- hif (Fiji Hindi) cluster: hif-deva , hif-latn -> hif (Fiji Hindi)
['hif'] = {'hif-latn'},
['hif-deva'] = {'hif'},
['hif-latn'] = {'hif'},
-- id (Indonesian) cluster
['min'] = {'id'}, -- Minangkabau
['ace'] = {'id'}, -- Achinese
['bug'] = {'id'}, -- Buginese
['bjn'] = {'id'}, -- Banjar
['jv'] = {'id'}, -- Javanese
['su'] = {'id'}, -- Sundanese
['map-bms'] = {'jv', 'id'}, -- Basa Banyumasan
-- ike (Eastern Canadian Inuktitut) cluster: ike-cans , ike-latn -> ike (Eastern Canadian Inuktitut)
['ike-cans'] = {'ik'},
['ike-latn'] = {'ik'},
-- it (Italian) cluster
['egl'] = {'it'}, -- Emiliàn
['eml'] = {'it'}, -- Emiliano-Romagnolo
['fur'] = {'it'}, -- Friulian
['lij'] = {'it'}, -- Ligure
['lmo'] = {'it'}, -- lumbaart
['nap'] = {'it'}, -- Neapolitan
['pms'] = {'it'}, -- Piedmontese
['rgn'] = {'it'}, -- Romagnol
['scn'] = {'it'}, -- Sicilian
['vec'] = {'it'}, -- vèneto
-- kk (Kazakh) cluster:
-- kk-arab , kk-cyrl , kk-latn , kk-cn , kk-kz , kk-tr -> kk (Kazakh)
['kk'] = {'kk-cyrl'}, -- Kazakh
['kk-arab'] = {'kk-cyrl', 'kk'}, -- Kazakh (Arabic script)
['kk-cn'] = {'kk-arab', 'kk-cyrl', 'kk'}, -- Kazakh (China)
['kk-cyrl'] = {'kk'}, -- Kazakh (Cyrillic script)
['kk-kz'] = {'kk', 'kk-cyrl'}, -- Kazakh (Kazakhstan)
['kk-latn'] = {'kk-cyrl', 'kk'}, -- Kazakh (Latin script)
['kk-tr'] = {'kk-latn', 'kk-cyrl', 'kk'}, -- Kazakh (Turkey)
['kaa'] = {'kk-latn', 'kk-cyrl'}, -- Kara-Kalpak
-- ku (Kurdish) cluster: ku-latn , ku-arab -> ku (Kurdish)
['ku'] = {'ku-latn'},
['ku-arab'] = {'ckb', 'ckb-arab', 'ku'}, -- كوردي (عەرەبی)
['ku-latn'] = {'ku'},
['ckb'] = {'ckb-arab', 'ku'},
-- nl (Dutch) cluster
['af'] = {'nl'}, -- Afrikaans
['fy'] = {'nl'}, -- Western Frisian
['li'] = {'nl'}, -- Liechtenstein
['nl-informal'] = {'nl'}, -- Nederlands (informeel)
['vls'] = {'nl'}, -- Vlaams
['zea'] = {'nl'}, -- Zeeuws
--pl (Polish) cluster
['csb'] = {'pl'}, -- Kashubian
['szl'] = {'pl'}, -- Silesian
-- pt (Portuguese) cluster
['gl'] = {'pt'}, -- Galician
['mwl'] = {'pt'}, -- Mirandese
['pt-br'] = {'pt'}, -- Brazilian Portuguese
-- ro (Romanian) cluster
['mo'] = {'ro'}, -- Moldavian
['rmy'] = {'ro'}, -- Romani
-- ru (Russian) cluster
['ab'] = {'ru'}, -- Abkhazian
['av'] = {'ru'}, -- Avaric
['ba'] = {'ru'}, -- Bashkir
['be-tarask'] = {'ru'}, -- Belorussian
['ce'] = {'ru'}, -- Chechen
['crh-cyrl'] = {'ru'}, -- Crimean Tatar (Cyrillic script)
['cv'] = {'ru'}, -- Chuvash
['inh'] = {'ru'}, -- Ingush
['koi'] = {'ru'}, -- Komi-Permyak
['krc'] = {'ru'}, -- Karachay-Balkar
['kv'] = {'ru'}, -- Komi
['lbe'] = {'ru'}, -- лакку
['lez'] = {'ru'}, -- Lezghian
['mhr'] = {'ru'}, -- Eastern Mari
['mrj'] = {'ru'}, -- Hill Mari
['myv'] = {'ru'}, -- Erzya
['os'] = {'ru'}, -- Ossetic
['rue'] = {'uk', 'ru'}, -- Rusyn
['sah'] = {'ru'}, -- Sakha
['tt'] = {'tt-cyrl', 'ru'}, -- Tatar
['tt-cyrl'] = {'ru'}, -- Tatar (Cyrillic script)
['udm'] = {'ru'}, -- Udmurt
['uk'] = {'ru'}, -- Ukranian
['xal'] = {'ru'}, -- Kalmyk
['tt'] = {'tt-cyrl', 'ru'}, -- Tatar
-- ruq (Megleno Romanian) cluster: ruq-cyrl , ruq-grek , ruq-latn -> ruq (Megleno Romanian)
['ruq'] = {'ruq-latn', 'ro'}, -- Megleno-Romanian
['ruq-cyrl'] = {'ruq', 'mk'}, -- Megleno-Romanian (Cyrillic script)
['ruq-grek'] = {'ruq'}, -- Megleno-Romanian (Greek script)
['ruq-latn'] = {'ro', 'ruq'}, -- Megleno-Romanian (Latin script)
-- sr (Serbian) cluster: sr-ec , sr-el -> sr (Serbian)
['sr'] = {'sr-ec'},
['sr-ec'] = {'sr'},
['sr-el'] = {'sr'},
-- tg (Tajik) cluster: tg-cyrl , tg-latn -> tg (Tajik)
['tg'] = {'tg-cyrl'},
['tg-cyrl'] = {'tg'},
['tg-latn'] = {'tg'},
-- tr (Turkish) cluster
['gag'] = {'tr'}, -- Gagauz
['kiu'] = {'tr'}, -- Kirmanjki
['lzz'] = {'tr'}, -- Lazuri
-- tt (Tatar) cluster: tt-cyrl , tt-latn -> tt (Tatar)
['tt-cyrl'] = {'tt'},
['tt-latn'] = {'tt'},
-- zh (Chinese) cluster
-- /includes/language/converters/ZhConverter.php
-- https://gerrit.wikimedia.org/r/703560
['cdo'] = {'nan', 'zh-hant', 'zh', 'zh-hans'}, -- Min Dong Chinese
['gan'] = {'gan-hant', 'gan-hans', 'zh-hant', 'zh-hans', 'zh'}, -- Gan
['gan-hans'] = {'gan', 'gan-hant', 'zh-hans', 'zh', 'zh-hant'}, -- Simplified Gan script
['gan-hant'] = {'gan', 'gan-hans', 'zh-hant', 'zh', 'zh-hans'}, -- Traditional Gan script
['hak'] = {'zh-hant', 'zh', 'zh-hans'}, -- Hakka
['ii'] = {'zh-cn', 'zh-hans', 'zh', 'zh-hant'}, -- Sichuan Yi
['lzh'] = {'zh-hant', 'zh', 'zh-hans'}, -- Literary Chinese
['nan'] = {'cdo', 'zh-hant', 'zh', 'zh-hans'}, -- Min Nan Chinese
['szy'] = {'zh-tw', 'zh-hant', 'zh', 'zh-hans'}, -- Sakizaya
['tay'] = {'zh-tw', 'zh-hant', 'zh', 'zh-hans'}, -- Atayal
['trv'] = {'zh-tw', 'zh-hant', 'zh', 'zh-hans'}, -- Seediq
['wuu'] = {'zh-hans', 'zh-hant', 'zh'}, -- Wu
-- https://phabricator.wikimedia.org/T59138
-- ['wuu'] = {'wuu-hans, 'wuu-hant', 'zh-hans', 'zh-hant', 'zh'}, -- Wu
-- ['wuu-hans'] = {'wuu', 'wuu-hant', 'zh-hans', 'zh', 'zh-hant'}, -- Simplified Wu
-- ['wuu-hant'] = {'wuu', 'wuu-hans', 'zh-hant', 'zh', 'zh-hans'}, -- Traditional Wu
['yue'] = {'zh-hk', 'zh-hant', 'zh-hans', 'zh'}, -- Cantonese
-- https://phabricator.wikimedia.org/T59106
-- ['yue'] = {'yue-hant', 'yue-hans, 'zh-hk', 'zh-hant', 'zh-hans', 'zh'}, -- Cantonese
-- ['yue-hans'] = {'yue', 'yue-hant', 'zh-hans', 'zh', 'zh-hk', 'zh-hant'}, -- Simplified Cantonese
-- ['yue-hant'] = {'yue', 'yue-hans', 'zh-hk', 'zh-hant', 'zh', 'zh-hans'}, -- Traditional Cantonese
['za'] = {'zh-hans', 'zh-hant', 'zh'}, -- Zhuang
-- The time allocated for running scripts has expired.
-- ['zh'] = {'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk'}, -- Chinese
-- ['zh-hans'] = {'zh-cn', 'zh', 'zh-hant'}, -- Simplified Chinese
-- ['zh-hant'] = {'zh-tw', 'zh-hk', 'zh', 'zh-hans'}, -- Traditional Chinese
-- ['zh-tw'] = {'zh-hant', 'zh-hk', 'zh', 'zh-hans'}, -- Chinese (Taiwan)
-- ['zh-hk'] = {'zh-hant', 'zh-tw', 'zh', 'zh-hans'}, -- Chinese (Hong Kong)
['zh'] = {'zh-hans', 'zh-hant', 'zh-hk'}, -- Chinese
['zh-hans'] = {'zh-hant', 'zh-hk'}, -- Simplified Chinese
['zh-hant'] = {'zh-hk', 'zh-hans'}, -- Traditional Chinese
['zh-cn'] = {'zh-hans', 'zh', 'zh-hant'}, -- Chinese (Mainland China)
['zh-sg'] = {'zh-hans', 'zh-cn', 'zh', 'zh-hant'}, -- Chinese (Singapore)
['zh-my'] = {'zh-hans', 'zh-sg', 'zh-cn', 'zh', 'zh-hant'}, -- Chinese (Malaysia)
['zh-tw'] = {'zh-hant', 'zh-hk', 'zh-hans'}, -- Chinese (Taiwan)
['zh-hk'] = {'zh-hant', 'zh-hans'}, -- Chinese (Hong Kong)
['zh-mo'] = {'zh-hant', 'zh-hk', 'zh-tw', 'zh', 'zh-hans'}, -- Chinese (Macau)
['zh-classical'] = {'lzh', 'zh-hant', 'zh', 'zh-hans'}, -- Classical Chinese -> Literary Chinese
['zh-min-nan'] = {'nan', 'cdo', 'zh-hant', 'zh', 'zh-hans'}, -- Chinese (Min Nan) -> Min Nan Chinese
['zh-yue'] = {'yue', 'zh-hk', 'zh-hant', 'zh-hans', 'zh'}, -- Yue Chinese -> Cantonese
------------------------
--------- misc ---------
------------------------
['arz'] = {'ar'}, -- Egyptian Arabic -> Arabic
['azb'] = {'az'}, -- Southern Azerbaijani -> Azerbaijani
['be-x-old'] = {'be-tarask'}, -- be-x-old -> be-tarask (wrong to correct Taraškievica form of Belarusian orthography)
['bh'] = {'bho'}, -- Bihari -> Bhojpuri
['bpy'] = {'bn'}, -- Bishnupria Manipuri -> Bengali
-- da
['jut'] = {'da'}, -- Jutish -> Danish
['kl'] = {'da'}, -- Kalaallisut -> Danish
['en-gb'] = {'en'}, -- Brexit -> English
['yi'] = {'he'}, -- Yiddish -> Hebrew
['iu'] = {'ike-cans'}, -- Inuktitut -> Eastern Canadian (Aboriginal syllabics)
['xmf'] = {'ka'}, -- Mingrelian -> Georgian
['kbd'] = {'kbd-cyrl', 'ru'}, -- Kabardian -> Адыгэбзэ
['tcy'] = {'kn'}, -- Tulu -> Kannada
['ko-kp'] = {'ko'}, -- 한국어 (조선) -> Korean
['ks'] = {'ks-arab'}, -- Kashmiri -> Kashmiri (Arabic script)
-- lt
['bat-smg'] = {'sgs', 'lt'}, -- Samogitian -> Lithuanian
['sgs'] = {'lt'}, -- Samogitian -> Lithuanian
['ltg'] = {'lv'}, -- Latvian -> Latgalian
['dtp'] = {'ms'}, -- Central Dusun -> Malay
['no'] = {'nb'}, -- Norwegian (bokmål) -> Norwegian Bokmål
['roa-rup'] = {'rup'}, -- Aromanian (other Romance) -> Aromanian
['aln'] = {'sq'}, -- Gheg Albanian -> Albanian
['ug'] = {'ug-arab'}, -- Uyghur -> Uyghur (Arabic script)
['khw'] = {'ur'}, -- Khowar -> Urdu
}
puottz3ra6u2ba8av2uuzkxjgvm5n0q
33410
33409
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Fallbacklist]]
33409
Scribunto
text/plain
--- Language fallback rules for other Lua modules.
-- @see [[c:Module:Fallbacklist]]
-- @release stable
-- @submodule
return {
-- crh (Crimean Tatar) cluster: crh-cyrl , crh-latn -> crh (Crimean Tatar)
['crh'] = {'crh-latn'},
['crh-cyrl'] = {'crh', 'ru'},
['crh-latn'] = {'crh'},
-- de (German) cluster:
['als'] = {'gsw', 'de'}, -- Alemannisch
['bar'] = {'de'}, -- Bavarian
['de-at'] = {'de'}, -- Austrian German
['de-ch'] = {'de'}, -- Swiss High German
['de-formal'] = {'de'}, -- German (formal address)
['dsb'] = {'de'}, -- Lower Sorbian
['frr'] = {'de'}, -- Northern Frisian
['hsb'] = {'de'}, -- Upper Sorbian
['ksh'] = {'de'}, -- Colognian
['lb'] = {'de'}, -- Luxembourgish
['nds'] = {'nds-nl', 'de'}, -- Low German
['nds-nl'] = {'nds', 'nl'}, -- Low Saxon (Netherlands)
['pdc'] = {'de'}, -- Deitsch
['pdt'] = {'nds', 'de'}, -- Plautdietsch
['pfl'] = {'de'}, -- Pälzisch
['sli'] = {'de'}, -- Lower Silesian
['stq'] = {'de'}, -- Seeltersk
['vmf'] = {'de'}, -- Upper Franconian
-- es (Spanish) cluster
['an'] = {'es'}, -- Aragonese
['arn'] = {'es'}, -- Mapuche
['ay'] = {'es'}, -- Aymara
['cbk-zam'] = {'es'}, -- Chavacano de Zamboanga
['gn'] = {'es'}, -- Guarani
['lad'] = {'es'}, -- Ladino
['nah'] = {'es'}, -- Nahuatl
['qu'] = {'es'}, -- Quechua
['qug'] = {'qu', 'es'}, -- Runa shimi
-- et (Estonian) cluster
['liv'] = {'et'}, -- Līvõ kēļ
['vep'] = {'et'}, -- Veps
['vro'] = {'et'}, -- Võro
['fiu-vro'] = {'vro', 'et'}, -- Võro
-- fa (Persian) cluster
['bcc'] = {'fa'}, -- Southern Balochi
['bqi'] = {'fa'}, -- Bakhtiari
['glk'] = {'fa'}, -- Gilaki
['mzn'] = {'fa'}, -- Mazandarani
-- fi (Finnish) cluster:
['fit'] = {'fi'}, -- meänkieli
['vot'] = {'fi'}, -- Votic
-- fr (French) cluster:
['bm'] = {'fr'}, -- Bambara
['br'] = {'fr'}, -- Breton
['co'] = {'fr'}, -- Corsican
['ff'] = {'fr'}, -- Fulah
['frc'] = {'fr'}, -- Cajun French
['frp'] = {'fr'}, -- Franco-Provençal
['ht'] = {'fr'}, -- Haitian
['ln'] = {'fr'}, -- Lingala
['mg'] = {'fr'}, -- Malagasy
['pcd'] = {'fr'}, -- Picard
['sg'] = {'fr'}, -- Sango
['ty'] = {'fr'}, -- Tahitian
['wa'] = {'fr'}, -- Walloon
['wo'] = {'fr'}, -- Wolof
-- hi (Hindi) cluster
['anp'] = {'hi'}, -- Angika
['mai'] = {'hi'}, -- Maithili
['sa'] = {'hi'}, -- Sanskrit
-- hif (Fiji Hindi) cluster: hif-deva , hif-latn -> hif (Fiji Hindi)
['hif'] = {'hif-latn'},
['hif-deva'] = {'hif'},
['hif-latn'] = {'hif'},
-- id (Indonesian) cluster
['min'] = {'id'}, -- Minangkabau
['ace'] = {'id'}, -- Achinese
['bug'] = {'id'}, -- Buginese
['bjn'] = {'id'}, -- Banjar
['jv'] = {'id'}, -- Javanese
['su'] = {'id'}, -- Sundanese
['map-bms'] = {'jv', 'id'}, -- Basa Banyumasan
-- ike (Eastern Canadian Inuktitut) cluster: ike-cans , ike-latn -> ike (Eastern Canadian Inuktitut)
['ike-cans'] = {'ik'},
['ike-latn'] = {'ik'},
-- it (Italian) cluster
['egl'] = {'it'}, -- Emiliàn
['eml'] = {'it'}, -- Emiliano-Romagnolo
['fur'] = {'it'}, -- Friulian
['lij'] = {'it'}, -- Ligure
['lmo'] = {'it'}, -- lumbaart
['nap'] = {'it'}, -- Neapolitan
['pms'] = {'it'}, -- Piedmontese
['rgn'] = {'it'}, -- Romagnol
['scn'] = {'it'}, -- Sicilian
['vec'] = {'it'}, -- vèneto
-- kk (Kazakh) cluster:
-- kk-arab , kk-cyrl , kk-latn , kk-cn , kk-kz , kk-tr -> kk (Kazakh)
['kk'] = {'kk-cyrl'}, -- Kazakh
['kk-arab'] = {'kk-cyrl', 'kk'}, -- Kazakh (Arabic script)
['kk-cn'] = {'kk-arab', 'kk-cyrl', 'kk'}, -- Kazakh (China)
['kk-cyrl'] = {'kk'}, -- Kazakh (Cyrillic script)
['kk-kz'] = {'kk', 'kk-cyrl'}, -- Kazakh (Kazakhstan)
['kk-latn'] = {'kk-cyrl', 'kk'}, -- Kazakh (Latin script)
['kk-tr'] = {'kk-latn', 'kk-cyrl', 'kk'}, -- Kazakh (Turkey)
['kaa'] = {'kk-latn', 'kk-cyrl'}, -- Kara-Kalpak
-- ku (Kurdish) cluster: ku-latn , ku-arab -> ku (Kurdish)
['ku'] = {'ku-latn'},
['ku-arab'] = {'ckb', 'ckb-arab', 'ku'}, -- كوردي (عەرەبی)
['ku-latn'] = {'ku'},
['ckb'] = {'ckb-arab', 'ku'},
-- nl (Dutch) cluster
['af'] = {'nl'}, -- Afrikaans
['fy'] = {'nl'}, -- Western Frisian
['li'] = {'nl'}, -- Liechtenstein
['nl-informal'] = {'nl'}, -- Nederlands (informeel)
['vls'] = {'nl'}, -- Vlaams
['zea'] = {'nl'}, -- Zeeuws
--pl (Polish) cluster
['csb'] = {'pl'}, -- Kashubian
['szl'] = {'pl'}, -- Silesian
-- pt (Portuguese) cluster
['gl'] = {'pt'}, -- Galician
['mwl'] = {'pt'}, -- Mirandese
['pt-br'] = {'pt'}, -- Brazilian Portuguese
-- ro (Romanian) cluster
['mo'] = {'ro'}, -- Moldavian
['rmy'] = {'ro'}, -- Romani
-- ru (Russian) cluster
['ab'] = {'ru'}, -- Abkhazian
['av'] = {'ru'}, -- Avaric
['ba'] = {'ru'}, -- Bashkir
['be-tarask'] = {'ru'}, -- Belorussian
['ce'] = {'ru'}, -- Chechen
['crh-cyrl'] = {'ru'}, -- Crimean Tatar (Cyrillic script)
['cv'] = {'ru'}, -- Chuvash
['inh'] = {'ru'}, -- Ingush
['koi'] = {'ru'}, -- Komi-Permyak
['krc'] = {'ru'}, -- Karachay-Balkar
['kv'] = {'ru'}, -- Komi
['lbe'] = {'ru'}, -- лакку
['lez'] = {'ru'}, -- Lezghian
['mhr'] = {'ru'}, -- Eastern Mari
['mrj'] = {'ru'}, -- Hill Mari
['myv'] = {'ru'}, -- Erzya
['os'] = {'ru'}, -- Ossetic
['rue'] = {'uk', 'ru'}, -- Rusyn
['sah'] = {'ru'}, -- Sakha
['tt'] = {'tt-cyrl', 'ru'}, -- Tatar
['tt-cyrl'] = {'ru'}, -- Tatar (Cyrillic script)
['udm'] = {'ru'}, -- Udmurt
['uk'] = {'ru'}, -- Ukranian
['xal'] = {'ru'}, -- Kalmyk
['tt'] = {'tt-cyrl', 'ru'}, -- Tatar
-- ruq (Megleno Romanian) cluster: ruq-cyrl , ruq-grek , ruq-latn -> ruq (Megleno Romanian)
['ruq'] = {'ruq-latn', 'ro'}, -- Megleno-Romanian
['ruq-cyrl'] = {'ruq', 'mk'}, -- Megleno-Romanian (Cyrillic script)
['ruq-grek'] = {'ruq'}, -- Megleno-Romanian (Greek script)
['ruq-latn'] = {'ro', 'ruq'}, -- Megleno-Romanian (Latin script)
-- sr (Serbian) cluster: sr-ec , sr-el -> sr (Serbian)
['sr'] = {'sr-ec'},
['sr-ec'] = {'sr'},
['sr-el'] = {'sr'},
-- tg (Tajik) cluster: tg-cyrl , tg-latn -> tg (Tajik)
['tg'] = {'tg-cyrl'},
['tg-cyrl'] = {'tg'},
['tg-latn'] = {'tg'},
-- tr (Turkish) cluster
['gag'] = {'tr'}, -- Gagauz
['kiu'] = {'tr'}, -- Kirmanjki
['lzz'] = {'tr'}, -- Lazuri
-- tt (Tatar) cluster: tt-cyrl , tt-latn -> tt (Tatar)
['tt-cyrl'] = {'tt'},
['tt-latn'] = {'tt'},
-- zh (Chinese) cluster
-- /includes/language/converters/ZhConverter.php
-- https://gerrit.wikimedia.org/r/703560
['cdo'] = {'nan', 'zh-hant', 'zh', 'zh-hans'}, -- Min Dong Chinese
['gan'] = {'gan-hant', 'gan-hans', 'zh-hant', 'zh-hans', 'zh'}, -- Gan
['gan-hans'] = {'gan', 'gan-hant', 'zh-hans', 'zh', 'zh-hant'}, -- Simplified Gan script
['gan-hant'] = {'gan', 'gan-hans', 'zh-hant', 'zh', 'zh-hans'}, -- Traditional Gan script
['hak'] = {'zh-hant', 'zh', 'zh-hans'}, -- Hakka
['ii'] = {'zh-cn', 'zh-hans', 'zh', 'zh-hant'}, -- Sichuan Yi
['lzh'] = {'zh-hant', 'zh', 'zh-hans'}, -- Literary Chinese
['nan'] = {'cdo', 'zh-hant', 'zh', 'zh-hans'}, -- Min Nan Chinese
['szy'] = {'zh-tw', 'zh-hant', 'zh', 'zh-hans'}, -- Sakizaya
['tay'] = {'zh-tw', 'zh-hant', 'zh', 'zh-hans'}, -- Atayal
['trv'] = {'zh-tw', 'zh-hant', 'zh', 'zh-hans'}, -- Seediq
['wuu'] = {'zh-hans', 'zh-hant', 'zh'}, -- Wu
-- https://phabricator.wikimedia.org/T59138
-- ['wuu'] = {'wuu-hans, 'wuu-hant', 'zh-hans', 'zh-hant', 'zh'}, -- Wu
-- ['wuu-hans'] = {'wuu', 'wuu-hant', 'zh-hans', 'zh', 'zh-hant'}, -- Simplified Wu
-- ['wuu-hant'] = {'wuu', 'wuu-hans', 'zh-hant', 'zh', 'zh-hans'}, -- Traditional Wu
['yue'] = {'zh-hk', 'zh-hant', 'zh-hans', 'zh'}, -- Cantonese
-- https://phabricator.wikimedia.org/T59106
-- ['yue'] = {'yue-hant', 'yue-hans, 'zh-hk', 'zh-hant', 'zh-hans', 'zh'}, -- Cantonese
-- ['yue-hans'] = {'yue', 'yue-hant', 'zh-hans', 'zh', 'zh-hk', 'zh-hant'}, -- Simplified Cantonese
-- ['yue-hant'] = {'yue', 'yue-hans', 'zh-hk', 'zh-hant', 'zh', 'zh-hans'}, -- Traditional Cantonese
['za'] = {'zh-hans', 'zh-hant', 'zh'}, -- Zhuang
-- The time allocated for running scripts has expired.
-- ['zh'] = {'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk'}, -- Chinese
-- ['zh-hans'] = {'zh-cn', 'zh', 'zh-hant'}, -- Simplified Chinese
-- ['zh-hant'] = {'zh-tw', 'zh-hk', 'zh', 'zh-hans'}, -- Traditional Chinese
-- ['zh-tw'] = {'zh-hant', 'zh-hk', 'zh', 'zh-hans'}, -- Chinese (Taiwan)
-- ['zh-hk'] = {'zh-hant', 'zh-tw', 'zh', 'zh-hans'}, -- Chinese (Hong Kong)
['zh'] = {'zh-hans', 'zh-hant', 'zh-hk'}, -- Chinese
['zh-hans'] = {'zh-hant', 'zh-hk'}, -- Simplified Chinese
['zh-hant'] = {'zh-hk', 'zh-hans'}, -- Traditional Chinese
['zh-cn'] = {'zh-hans', 'zh', 'zh-hant'}, -- Chinese (Mainland China)
['zh-sg'] = {'zh-hans', 'zh-cn', 'zh', 'zh-hant'}, -- Chinese (Singapore)
['zh-my'] = {'zh-hans', 'zh-sg', 'zh-cn', 'zh', 'zh-hant'}, -- Chinese (Malaysia)
['zh-tw'] = {'zh-hant', 'zh-hk', 'zh-hans'}, -- Chinese (Taiwan)
['zh-hk'] = {'zh-hant', 'zh-hans'}, -- Chinese (Hong Kong)
['zh-mo'] = {'zh-hant', 'zh-hk', 'zh-tw', 'zh', 'zh-hans'}, -- Chinese (Macau)
['zh-classical'] = {'lzh', 'zh-hant', 'zh', 'zh-hans'}, -- Classical Chinese -> Literary Chinese
['zh-min-nan'] = {'nan', 'cdo', 'zh-hant', 'zh', 'zh-hans'}, -- Chinese (Min Nan) -> Min Nan Chinese
['zh-yue'] = {'yue', 'zh-hk', 'zh-hant', 'zh-hans', 'zh'}, -- Yue Chinese -> Cantonese
------------------------
--------- misc ---------
------------------------
['arz'] = {'ar'}, -- Egyptian Arabic -> Arabic
['azb'] = {'az'}, -- Southern Azerbaijani -> Azerbaijani
['be-x-old'] = {'be-tarask'}, -- be-x-old -> be-tarask (wrong to correct Taraškievica form of Belarusian orthography)
['bh'] = {'bho'}, -- Bihari -> Bhojpuri
['bpy'] = {'bn'}, -- Bishnupria Manipuri -> Bengali
-- da
['jut'] = {'da'}, -- Jutish -> Danish
['kl'] = {'da'}, -- Kalaallisut -> Danish
['en-gb'] = {'en'}, -- Brexit -> English
['yi'] = {'he'}, -- Yiddish -> Hebrew
['iu'] = {'ike-cans'}, -- Inuktitut -> Eastern Canadian (Aboriginal syllabics)
['xmf'] = {'ka'}, -- Mingrelian -> Georgian
['kbd'] = {'kbd-cyrl', 'ru'}, -- Kabardian -> Адыгэбзэ
['tcy'] = {'kn'}, -- Tulu -> Kannada
['ko-kp'] = {'ko'}, -- 한국어 (조선) -> Korean
['ks'] = {'ks-arab'}, -- Kashmiri -> Kashmiri (Arabic script)
-- lt
['bat-smg'] = {'sgs', 'lt'}, -- Samogitian -> Lithuanian
['sgs'] = {'lt'}, -- Samogitian -> Lithuanian
['ltg'] = {'lv'}, -- Latvian -> Latgalian
['dtp'] = {'ms'}, -- Central Dusun -> Malay
['no'] = {'nb'}, -- Norwegian (bokmål) -> Norwegian Bokmål
['roa-rup'] = {'rup'}, -- Aromanian (other Romance) -> Aromanian
['aln'] = {'sq'}, -- Gheg Albanian -> Albanian
['ug'] = {'ug-arab'}, -- Uyghur -> Uyghur (Arabic script)
['khw'] = {'ur'}, -- Khowar -> Urdu
}
puottz3ra6u2ba8av2uuzkxjgvm5n0q
Module:Entrypoint
828
2667
33411
2024-11-20T01:02:58Z
en>Awesome Aasim
0
33411
Scribunto
text/plain
--- Entrypoint templating wrapper for Scribunto packages.
-- The module generates an entrypoint function that can execute Scribunto
-- package calls in the template context. This allows a package to support
-- both direct and template invocations.
--
-- @script entrypoint
-- @release beta
-- @author [[wikia:dev:User:8nml|8nml]] (Fandom Dev Wiki)
-- @param {table} package Scribunto package.
-- @error[85] {string} 'you must specify a function to call'
-- @error[91] {string} 'the function you specified did not exist'
-- @error[opt,95] {string} '$2 is not a function'
-- @return {function} Template entrypoint - @{main}.
-- @note Parent frames are not available in Entrypoint's
-- `frame`. This is because recursive (grandparent)
-- frame access is impossible in legacy Scribunto
-- due to [[mw:Manual:Parser#Empty-argument expansion
-- cache|empty-argument expansion cache]] limitations.
-- @note As Entrypoint enables template access rather than
-- a new extension hook, it does not work with named
-- numeric parameters such as `1=` or `2=`. This may
-- result in unexpected behaviour such as Entrypoint
-- and module errors.
--- Stateless, sequential Lua iterator.
-- @function inext
-- @param {table} t Invariant state to loop over.
-- @param {number} i Control variable (current index).
-- @return[opt] {number} Next index.
-- @return[opt] {number|string|table|boolean} Next value.
-- @see https://github.com/lua/lua/blob/v5.1.1/lbaselib.c#L247
local inext = select(1, ipairs{})
--- Check for MediaWiki version 1.25.
-- The concurrent Scribunto release adds a type check for package functions.
-- @variable {boolean} func_check
-- @see [[mw:MediaWiki 1.24/wmf7#Scribunto]]
local func_check = tonumber(mw.site.currentVersion:match('^%d+.%d+')) >= 1.25
--- MediaWiki error message getter.
-- Mimics Scribunto error formatting for script errors.
-- @function msg
-- @param {string} key MediaWiki i18n message key.
-- @param[opt] {string} fn_name Name of package function.
-- @return {string} Formatted lowercase message.
-- @local
local function msg(key, fn_name)
return select(1, mw.message.new(key)
:plain()
:match(':%s*(.-)[.۔。෴։።]?$')
:gsub('^.', mw.ustring.lower)
:gsub('$2', fn_name or '$2')
)
end
--- Template entrypoint function generated by this module.
-- @function main
-- @param {Frame} frame Scribunto frame in module context.
-- @return {string} Module output in template context.
return function(package) return function(f)
local frame = f:getParent()
local args_mt = {}
local arg_cache = {}
args_mt.__pairs = function()
return next, arg_cache, nil
end
args_mt.__ipairs = function()
return inext, arg_cache, 0
end
args_mt.__index = function(t, k)
return arg_cache[k]
end
for key, val in pairs(frame.args) do
arg_cache[key] = val
end
local fn_name = table.remove(arg_cache, 1)
f.args = setmetatable({}, args_mt)
frame.args = setmetatable({}, args_mt)
if not fn_name then
error(msg('scribunto-common-nofunction'))
end
fn_name = mw.text.trim(fn_name)
if not package[fn_name] then
error(msg('scribunto-common-nosuchfunction', fn_name))
end
if func_check and type(package[fn_name]) ~= 'function' then
error(msg('scribunto-common-notafunction', fn_name))
end
return package[fn_name](frame)
end end
l7xohd37g14pkh4rq39hdb3rm65nejf
33412
33411
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Entrypoint]]
33411
Scribunto
text/plain
--- Entrypoint templating wrapper for Scribunto packages.
-- The module generates an entrypoint function that can execute Scribunto
-- package calls in the template context. This allows a package to support
-- both direct and template invocations.
--
-- @script entrypoint
-- @release beta
-- @author [[wikia:dev:User:8nml|8nml]] (Fandom Dev Wiki)
-- @param {table} package Scribunto package.
-- @error[85] {string} 'you must specify a function to call'
-- @error[91] {string} 'the function you specified did not exist'
-- @error[opt,95] {string} '$2 is not a function'
-- @return {function} Template entrypoint - @{main}.
-- @note Parent frames are not available in Entrypoint's
-- `frame`. This is because recursive (grandparent)
-- frame access is impossible in legacy Scribunto
-- due to [[mw:Manual:Parser#Empty-argument expansion
-- cache|empty-argument expansion cache]] limitations.
-- @note As Entrypoint enables template access rather than
-- a new extension hook, it does not work with named
-- numeric parameters such as `1=` or `2=`. This may
-- result in unexpected behaviour such as Entrypoint
-- and module errors.
--- Stateless, sequential Lua iterator.
-- @function inext
-- @param {table} t Invariant state to loop over.
-- @param {number} i Control variable (current index).
-- @return[opt] {number} Next index.
-- @return[opt] {number|string|table|boolean} Next value.
-- @see https://github.com/lua/lua/blob/v5.1.1/lbaselib.c#L247
local inext = select(1, ipairs{})
--- Check for MediaWiki version 1.25.
-- The concurrent Scribunto release adds a type check for package functions.
-- @variable {boolean} func_check
-- @see [[mw:MediaWiki 1.24/wmf7#Scribunto]]
local func_check = tonumber(mw.site.currentVersion:match('^%d+.%d+')) >= 1.25
--- MediaWiki error message getter.
-- Mimics Scribunto error formatting for script errors.
-- @function msg
-- @param {string} key MediaWiki i18n message key.
-- @param[opt] {string} fn_name Name of package function.
-- @return {string} Formatted lowercase message.
-- @local
local function msg(key, fn_name)
return select(1, mw.message.new(key)
:plain()
:match(':%s*(.-)[.۔。෴։።]?$')
:gsub('^.', mw.ustring.lower)
:gsub('$2', fn_name or '$2')
)
end
--- Template entrypoint function generated by this module.
-- @function main
-- @param {Frame} frame Scribunto frame in module context.
-- @return {string} Module output in template context.
return function(package) return function(f)
local frame = f:getParent()
local args_mt = {}
local arg_cache = {}
args_mt.__pairs = function()
return next, arg_cache, nil
end
args_mt.__ipairs = function()
return inext, arg_cache, 0
end
args_mt.__index = function(t, k)
return arg_cache[k]
end
for key, val in pairs(frame.args) do
arg_cache[key] = val
end
local fn_name = table.remove(arg_cache, 1)
f.args = setmetatable({}, args_mt)
frame.args = setmetatable({}, args_mt)
if not fn_name then
error(msg('scribunto-common-nofunction'))
end
fn_name = mw.text.trim(fn_name)
if not package[fn_name] then
error(msg('scribunto-common-nosuchfunction', fn_name))
end
if func_check and type(package[fn_name]) ~= 'function' then
error(msg('scribunto-common-notafunction', fn_name))
end
return package[fn_name](frame)
end end
l7xohd37g14pkh4rq39hdb3rm65nejf
Module:Docbunto/i18n
828
2668
33413
2026-09-11T17:08:27Z
en>Awesome Aasim
0
33413
Scribunto
text/plain
-- <nowiki>
return {
["_metadata"] = {
["order"] = {
"endmatter-caption",
"endmatter-image",
"line-no",
"header-class",
"header-documentation",
"header-function",
"header-items",
"header-other",
"header-private",
"message-autogeneration",
"no-content",
"no-markup",
"optional",
"parentheses",
"separator-colon",
"separator-dot",
"separator-semicolon",
"tag-error",
"tag-field",
"tag-fixme",
"tag-note",
"tag-param",
"tag-return",
"tag-see",
"tag-todo",
"tag-usage",
"tag-warning",
"todo",
"type-boolean",
"type-function",
"type-member",
"type-nil",
"type-number",
"type-sequence",
"type-string",
"type-table",
"type-variable"
}
},
["en"] = {
["endmatter-caption"] = "Caption",
["endmatter-image"] = "Image",
["line-no"] = "line $1",
["header-class"] = "Package class",
["header-documentation"] = "Documentation",
["header-function"] = "Package function",
["header-items"] = "Package items",
["header-other"] = "Other items",
["header-private"] = "Private items",
["message-autogeneration"] = "Documentation above is auto generated",
["no-content"] = "Lua source code not found in $1",
["no-markup"] = "documentation markup for Docbunto not found in $1",
["optional"] = "optional",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Error|Errors}}",
["tag-field"] = "{{plural:$1|Field|Fields}}",
["tag-fixme"] = "{{plural:$1|Bug|Bugs}}",
["tag-note"] = "{{plural:$1|Note|Notes}}",
["tag-param"] = "{{plural:$1|Parameter|Parameters}}",
["tag-return"] = "Returns",
["tag-see"] = "See also",
["tag-todo"] = "TODO",
["tag-usage"] = "Usage",
["tag-warning"] = "{{plural:$1|Warning|Warnings}}",
["todo"] = "Modules with TODO items",
["type-boolean"] = "boolean",
["type-function"] = "function",
["type-member"] = "member",
["type-nil"] = "nil",
["type-number"] = "number",
["type-sequence"] = "sequence",
["type-string"] = "string",
["type-table"] = "table",
["type-variable"] = "variable"
},
["qqq"] = {
["endmatter-caption"] = "Text of the caption key in the module data, rendered within the endmatter card.",
["endmatter-image"] = "Text of the image key in the module data, rendered within the endmatter card.",
["line-no"] = "The line number of the call. $1 is the line number filled in from this.",
["header-class"] = "Header for modules that export a class",
["header-documentation"] = "Header for documentation section",
["header-function"] = "Header for modules that export a function",
["header-items"] = "Header for modules that export a static table",
["header-other"] = "Subheading for public items that aren't package members (e.g. return tables)",
["header-private"] = "Subheading for private items that are local to a module",
["message-autogeneration"] = "Footer text for the code documentation in the output, showing that it is Lua-generated content.",
["no-content"] = "Lua error when queried module is non-existent",
["no-markup"] = "Lua error when queried module contains no documentation markup",
["optional"] = "Optional tag documentation entry",
["parentheses"] = "Used to wrap item types and tag entry types. {{optional}}",
["separator-colon"] = "Used to separate tag entry labels from the entry documentation. {{optional}}",
["separator-dot"] = "Used to separate horizontal lists such as item flags",
["separator-semicolon"] = "Used to separate item or tag types. {{optional}}",
["tag-error"] = "Tag entry label for a function's @error tags. $1 is the number of @error tags present for the item",
["tag-field"] = "Tag entry label for a table's @field tags. $1 is the number of @field tags present for the item",
["tag-fixme"] = "Tag entry label for an item's documented bugs. $1 is the number of @fixme tags present for the item",
["tag-note"] = "Tag entry label for an item's developer notes. $1 is the number of @note tags present for the item",
["tag-param"] = "{{PLURAL:$1|Parameter|Parameters}}",
["tag-return"] = "Tag entry label for a function's @return tags",
["tag-see"] = "Tag entry label for an item's @see tags",
["tag-todo"] = "Tag entry label for an item's @todo tags",
["tag-usage"] = "Tag entry label for an item's @usage tags",
["tag-warning"] = "Tag entry label for an item's warning notes. $1 is the number of @warning tags present for the item",
["todo"] = "Category to populate if a TODO tag is present in the module source.",
["type-boolean"] = "Lua's boolean type for items or tags",
["type-function"] = "Lua's function type for items or tags",
["type-member"] = "Custom type for class members that are primitives (boolean, number or string)",
["type-nil"] = "Lua's nil type for items or tags",
["type-number"] = "Lua's number type for items or tags",
["type-sequence"] = "Lua's table type for items or tags that are a sequence",
["type-string"] = "Lua's string type for items or tags",
["type-table"] = "Lua's table type for items or tags",
["type-variable"] = "Custom type for private items that are primitives (boolean, number or string) and local to a module"
},
["bn"] = {
["header-class"] = "প্যাকেজ ক্লাস",
["header-documentation"] = "ডকুমেন্টেশন",
["header-function"] = "প্যাকেজ ফাঙ্কশন",
["header-items"] = "প্যাকেজ আইটেম",
["header-other"] = "অন্য আইটেম",
["header-private"] = "ব্যক্তিগত আইটেম",
["no-content"] = "$1তে লুয়া সোর্স কোড পাওয়া যায়নি",
["no-markup"] = "ডোকবুনটোর জন্য ডকুমেন্টেশন মার্কআপ $1এ পাওয়া যায়নি",
["optional"] = "বিকল্পিক",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|ত্রূটি|ত্রূটি}}",
["tag-field"] = "{{plural:$1|ফিল্ড|ফিল্ড}}",
["tag-fixme"] = "{{plural:$1|বাগ|বাগ}}",
["tag-note"] = "{{plural:$1|নোট|নোট}}",
["tag-param"] = "{{plural:$1|প্যারামেটের|প্যারামেটের}}",
["tag-return"] = "দেয়ে",
["tag-see"] = "আরও দেখেন",
["tag-todo"] = "টুডু",
["tag-usage"] = "প্রয়োগ",
["tag-warning"] = "{{plural:$1|সূচনা|সূচনা}}",
["type-boolean"] = "বুলিয়ান",
["type-function"] = "ফাঙ্কশন",
["type-member"] = "সদস্য",
["type-nil"] = "নাই",
["type-number"] = "সংখ্যা",
["type-string"] = "স্ট্রিং",
["type-table"] = "টেবিল",
["type-variable"] = "ভ্যারিয়েবল"
},
["de"] = {
["header-class"] = "Paketklassen",
["header-documentation"] = "Dokumentation",
["header-function"] = "Paketfunktion",
["header-items"] = "Paketname",
["header-other"] = "Andere Werte",
["header-private"] = "Private Werte",
["no-content"] = "Lua Quellcode in $1 nicht gefunden",
["no-markup"] = "Dokumentation-Markup für Docbunto in $1 nicht gefunden",
["optional"] = "optional",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "Fehler",
["tag-field"] = "{{plural:$1|Feld|Felder}}",
["tag-fixme"] = "Fehler",
["tag-note"] = "{{plural:$1|Notiz|Notizen}}",
["tag-param"] = "Parameter",
["tag-return"] = "Ausgabe",
["tag-see"] = "Siehe auch",
["tag-todo"] = "TODO",
["tag-usage"] = "Verwendung",
["tag-warning"] = "{{plural:$1|Warnung|Warnungen}}",
["type-boolean"] = "Boolean",
["type-function"] = "Funktion",
["type-member"] = "Mitglied",
["type-nil"] = "null",
["type-number"] = "Nummer",
["type-sequence"] = "Sequenz",
["type-string"] = "String",
["type-table"] = "Table",
["type-variable"] = "Variable"
},
["fr"] = {
["header-class"] = "Classe des paquets",
["header-documentation"] = "Documentation",
["header-function"] = "Fonction de paquet",
["header-items"] = "Objets du paquet",
["header-other"] = "Autres objets",
["header-private"] = "Objets privés",
["no-content"] = "Code source Lua source non trouvée dans $1",
["no-markup"] = "Documentation markup pour Docbunto introuvable dans $1",
["optional"] = "optionnel",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Erreur|Erreurs}}",
["tag-field"] = "{{plural:$1|Champ|Champs}}",
["tag-fixme"] = "{{plural:$1|Bug|Bugs}}",
["tag-note"] = "{{plural:$1|Note|Notes}}",
["tag-param"] = "{{plural:$1|Paramètre|Paramètres}}",
["tag-return"] = "Retours",
["tag-see"] = "Voir aussi",
["tag-todo"] = "TODO",
["tag-usage"] = "Utilisation",
["tag-warning"] = "{{plural:$1|Avertissement|Avertissements}}",
["type-boolean"] = "booléen",
["type-function"] = "fonction",
["type-member"] = "membre",
["type-nil"] = "nil",
["type-number"] = "nombre",
["type-sequence"] = "séquence",
["type-string"] = "chaîne",
["type-table"] = "tableau",
["type-variable"] = "variable"
},
["hi"] = {
["header-class"] = "क्लास को पैकेज करें",
["header-documentation"] = "प्रलेख",
["header-function"] = "फंक्शन को पैकेज करें",
["header-items"] = "पैकेज के आयटम",
["header-other"] = "दुसरे आयटम",
["header-private"] = "व्यक्तिगत आयटम्स",
["no-content"] = "$1 में लुआ स्रोत कोड नहीं मिला",
["no-markup"] = "Docbunto के लिए प्रलेख मार्कअप $1 में नहीं मिला",
["optional"] = "वैकल्पिक",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|त्रुटि|त्रुटियाँ}}",
["tag-field"] = "{{plural:$1|फ़ील्ड|फ़ील्ड्स}}",
["tag-fixme"] = "{{plural:$1|बग|बग्स}}",
["tag-note"] = "{{plural:$1|नोट|नोट्स}}",
["tag-param"] = "{{plural:$1|पैरामीटर|पैरामीटर्स}}",
["tag-return"] = "लौटाता है",
["tag-see"] = "ये भी देखें",
["tag-todo"] = "टू-डू",
["tag-usage"] = "प्रयोग",
["tag-warning"] = "{{plural:$1|चेतावनी|चेतावनियाँ}}",
["type-boolean"] = "बूलियन",
["type-function"] = "फंक्शन",
["type-member"] = "सदस्य",
["type-nil"] = "खाली",
["type-number"] = "संख्या",
["type-sequence"] = "क्रम",
["type-string"] = "स्ट्रिंग",
["type-table"] = "टेबल",
["type-variable"] = "वेरिएबल"
},
["ja"] = {
["header-class"] = "パッケージクラス",
["header-documentation"] = "ドキュメンテーション",
["header-function"] = "パッケージ関数",
["header-items"] = "パッケージ要素",
["header-other"] = "ほかアイテム",
["header-private"] = "プライベート要素",
["optional"] = "オプションです",
["parentheses"] = "($1)",
["separator-colon"] = "; ",
["separator-dot"] = "・",
["separator-semicolon"] = ":",
["tag-error"] = "エラー",
["tag-field"] = "フィールド",
["tag-fixme"] = "バグ",
["tag-note"] = "ノート",
["tag-param"] = "パラメータ",
["tag-return"] = "{{plural:$1|戻り値|複数の戻り値}}",
["tag-see"] = "関連項目",
["tag-todo"] = "タスク",
["tag-usage"] = "使用例",
["tag-warning"] = "警告",
["type-boolean"] = "ブーリアン",
["type-function"] = "関数",
["type-member"] = "メンバ",
["type-nil"] = "空",
["type-number"] = "数",
["type-string"] = "文字列",
["type-table"] = "テーブル",
["type-variable"] = "変数"
},
["ko"] = {
["header-documentation"] = "문서",
["header-items"] = "패키지 아이템",
["no-markup"] = "$1에서 Docbunto 문서 마크업을 찾지 못했습니다",
["separator-dot"] = "・",
["tag-param"] = "{{plural:$1|매개변수|매개변수}}",
["tag-return"] = "반환값"
},
["pl"] = {
["no-content"] = "Nie odnaleziono kodu źróðłowego Lua w $1",
["no-markup"] = "Nie odnaleziono znaczników Docbunto w $1"
},
["ru"] = {
["header-class"] = "Класс пакета",
["header-documentation"] = "Документация",
["header-function"] = "Функция пакета",
["header-items"] = "Элементы пакета",
["header-other"] = "Другие элементы",
["header-private"] = "Приватные элементы",
["no-content"] = "На $1 нет исходного кода Lua",
["no-markup"] = "на $1 нет разметки документации Docbunto",
["optional"] = "необязательный",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Ошибка|Ошибки}}",
["tag-field"] = "{{plural:$1|Поле|Поля}}",
["tag-fixme"] = "{{plural:$1|Недочет|Недочеты}}",
["tag-note"] = "{{plural:$1|Замечание|Замечания}}",
["tag-param"] = "{{plural:$1|Аргумент|Аргументы}}",
["tag-return"] = "Возвращает",
["tag-see"] = "Смотрите также",
["tag-todo"] = "TODO",
["tag-usage"] = "Использование",
["tag-warning"] = "{{plural:$1|Предупреждение|Предупреждения}}",
["type-boolean"] = "логический",
["type-function"] = "функция",
["type-member"] = "член класса",
["type-nil"] = "nil",
["type-number"] = "число",
["type-sequence"] = "последовательность",
["type-string"] = "строка",
["type-table"] = "таблица",
["type-variable"] = "переменная"
},
["tl"] = {
["header-items"] = "Mga aytem sa package",
["no-content"] = "Ang ''Luabsource code'' ay hindi mahanap sa $1",
["no-markup"] = "Ang ''markup'' sa documentasyon para sa Docbuntu ay hindi mahanap sa $1",
["optional"] = "opsyonal",
["parentheses"] = "",
["separator-dot"] = " • ",
["tag-note"] = "{{plural:$1|Tala|Mga tala}}",
["tag-todo"] = "MGA GAWAIN",
["tag-usage"] = "Paggamit",
["tag-warning"] = "{{plural:$1|Babala|Mga babala}}",
["type-table"] = "talaan",
["type-variable"] = ""
},
["tr"] = {
["header-class"] = "Paket sınıfı",
["header-documentation"] = "Belgelendirme",
["header-function"] = "Paket işlevi",
["header-items"] = "Paket öğeleri",
["header-other"] = "Diğer öğeler",
["header-private"] = "Özel öğeler",
["no-content"] = "Lua kaynak kodu $1 sorgusunda bulunamadı",
["no-markup"] = "Docbunto için belge işaretlemesi $1 sayfasında bulunamadı",
["optional"] = "isteğe bağlı",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Hata|Hatalar}}",
["tag-field"] = "{{plural:$1|Alan|Alanlar}}",
["tag-fixme"] = "{{plural:$1|Hata|Hatalar}}",
["tag-note"] = "{{plural:$1|Not|Notlar}}",
["tag-param"] = "{{plural:$1|Parametre|Parametreler}}",
["tag-return"] = "Döndürmeler",
["tag-see"] = "Ayrıca bakınız",
["tag-todo"] = "YAPILACAKLAR",
["tag-usage"] = "Kullanım",
["tag-warning"] = "{{plural:$1|Uyarı|Uyarılar}}",
["type-boolean"] = "boole",
["type-function"] = "işlev",
["type-member"] = "üye",
["type-nil"] = "nil",
["type-number"] = "sayı",
["type-sequence"] = "sıra",
["type-string"] = "dize",
["type-table"] = "tablo",
["type-variable"] = "değişken"
},
["vi"] = {
["header-class"] = "Lớp gói",
["header-documentation"] = "Tài liệu",
["header-function"] = "Hàm gói",
["header-items"] = "Mục gói",
["header-other"] = "Mục khác",
["header-private"] = "Mục riêng",
["no-content"] = "Không tìm thấy mã nguồn Lua trong $1",
["optional"] = "tuỳ chọn",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["tag-error"] = "Lỗi",
["tag-field"] = "{{plural:$1|Trường|Các trường}}\n",
["tag-note"] = "Lưu ý",
["tag-param"] = "{{plural:$1|Tham số|Các tham số}}",
["tag-return"] = "Trả về",
["tag-see"] = "Xem thêm",
["tag-usage"] = "Cách dùng",
["tag-warning"] = "Cảnh báo",
["type-function"] = "hàm",
["type-member"] = "",
["type-number"] = "số",
["type-sequence"] = "chuỗi",
["type-string"] = "xâu",
["type-table"] = "bảng",
["type-variable"] = "biến"
},
["zh"] = {
["header-class"] = "程序包类",
["header-documentation"] = "文档",
["header-function"] = "程序包函数",
["header-items"] = "程序包项",
["header-other"] = "其他项",
["header-private"] = "私有项",
["no-content"] = "没有在$1中找到Lua源代码",
["no-markup"] = "没有在$1中找到Docbunto的文档标记",
["optional"] = "可选",
["parentheses"] = "($1)",
["separator-colon"] = ";",
["separator-dot"] = "・",
["separator-semicolon"] = ":",
["tag-error"] = "错误",
["tag-field"] = "字段",
["tag-fixme"] = "漏洞",
["tag-note"] = "注意",
["tag-param"] = "参数",
["tag-return"] = "返回",
["tag-see"] = "另见",
["tag-todo"] = "待办",
["tag-usage"] = "用法",
["tag-warning"] = "警告",
["type-boolean"] = "布尔",
["type-function"] = "函数",
["type-member"] = "成员",
["type-nil"] = "nil",
["type-number"] = "数字",
["type-sequence"] = "序列",
["type-string"] = "字符串",
["type-table"] = "表",
["type-variable"] = "变量"
}
}
-- </nowiki>
5l18tlde3m296sm5gsnrbbp9iy7ac6p
33414
33413
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Docbunto/i18n]]
33413
Scribunto
text/plain
-- <nowiki>
return {
["_metadata"] = {
["order"] = {
"endmatter-caption",
"endmatter-image",
"line-no",
"header-class",
"header-documentation",
"header-function",
"header-items",
"header-other",
"header-private",
"message-autogeneration",
"no-content",
"no-markup",
"optional",
"parentheses",
"separator-colon",
"separator-dot",
"separator-semicolon",
"tag-error",
"tag-field",
"tag-fixme",
"tag-note",
"tag-param",
"tag-return",
"tag-see",
"tag-todo",
"tag-usage",
"tag-warning",
"todo",
"type-boolean",
"type-function",
"type-member",
"type-nil",
"type-number",
"type-sequence",
"type-string",
"type-table",
"type-variable"
}
},
["en"] = {
["endmatter-caption"] = "Caption",
["endmatter-image"] = "Image",
["line-no"] = "line $1",
["header-class"] = "Package class",
["header-documentation"] = "Documentation",
["header-function"] = "Package function",
["header-items"] = "Package items",
["header-other"] = "Other items",
["header-private"] = "Private items",
["message-autogeneration"] = "Documentation above is auto generated",
["no-content"] = "Lua source code not found in $1",
["no-markup"] = "documentation markup for Docbunto not found in $1",
["optional"] = "optional",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Error|Errors}}",
["tag-field"] = "{{plural:$1|Field|Fields}}",
["tag-fixme"] = "{{plural:$1|Bug|Bugs}}",
["tag-note"] = "{{plural:$1|Note|Notes}}",
["tag-param"] = "{{plural:$1|Parameter|Parameters}}",
["tag-return"] = "Returns",
["tag-see"] = "See also",
["tag-todo"] = "TODO",
["tag-usage"] = "Usage",
["tag-warning"] = "{{plural:$1|Warning|Warnings}}",
["todo"] = "Modules with TODO items",
["type-boolean"] = "boolean",
["type-function"] = "function",
["type-member"] = "member",
["type-nil"] = "nil",
["type-number"] = "number",
["type-sequence"] = "sequence",
["type-string"] = "string",
["type-table"] = "table",
["type-variable"] = "variable"
},
["qqq"] = {
["endmatter-caption"] = "Text of the caption key in the module data, rendered within the endmatter card.",
["endmatter-image"] = "Text of the image key in the module data, rendered within the endmatter card.",
["line-no"] = "The line number of the call. $1 is the line number filled in from this.",
["header-class"] = "Header for modules that export a class",
["header-documentation"] = "Header for documentation section",
["header-function"] = "Header for modules that export a function",
["header-items"] = "Header for modules that export a static table",
["header-other"] = "Subheading for public items that aren't package members (e.g. return tables)",
["header-private"] = "Subheading for private items that are local to a module",
["message-autogeneration"] = "Footer text for the code documentation in the output, showing that it is Lua-generated content.",
["no-content"] = "Lua error when queried module is non-existent",
["no-markup"] = "Lua error when queried module contains no documentation markup",
["optional"] = "Optional tag documentation entry",
["parentheses"] = "Used to wrap item types and tag entry types. {{optional}}",
["separator-colon"] = "Used to separate tag entry labels from the entry documentation. {{optional}}",
["separator-dot"] = "Used to separate horizontal lists such as item flags",
["separator-semicolon"] = "Used to separate item or tag types. {{optional}}",
["tag-error"] = "Tag entry label for a function's @error tags. $1 is the number of @error tags present for the item",
["tag-field"] = "Tag entry label for a table's @field tags. $1 is the number of @field tags present for the item",
["tag-fixme"] = "Tag entry label for an item's documented bugs. $1 is the number of @fixme tags present for the item",
["tag-note"] = "Tag entry label for an item's developer notes. $1 is the number of @note tags present for the item",
["tag-param"] = "{{PLURAL:$1|Parameter|Parameters}}",
["tag-return"] = "Tag entry label for a function's @return tags",
["tag-see"] = "Tag entry label for an item's @see tags",
["tag-todo"] = "Tag entry label for an item's @todo tags",
["tag-usage"] = "Tag entry label for an item's @usage tags",
["tag-warning"] = "Tag entry label for an item's warning notes. $1 is the number of @warning tags present for the item",
["todo"] = "Category to populate if a TODO tag is present in the module source.",
["type-boolean"] = "Lua's boolean type for items or tags",
["type-function"] = "Lua's function type for items or tags",
["type-member"] = "Custom type for class members that are primitives (boolean, number or string)",
["type-nil"] = "Lua's nil type for items or tags",
["type-number"] = "Lua's number type for items or tags",
["type-sequence"] = "Lua's table type for items or tags that are a sequence",
["type-string"] = "Lua's string type for items or tags",
["type-table"] = "Lua's table type for items or tags",
["type-variable"] = "Custom type for private items that are primitives (boolean, number or string) and local to a module"
},
["bn"] = {
["header-class"] = "প্যাকেজ ক্লাস",
["header-documentation"] = "ডকুমেন্টেশন",
["header-function"] = "প্যাকেজ ফাঙ্কশন",
["header-items"] = "প্যাকেজ আইটেম",
["header-other"] = "অন্য আইটেম",
["header-private"] = "ব্যক্তিগত আইটেম",
["no-content"] = "$1তে লুয়া সোর্স কোড পাওয়া যায়নি",
["no-markup"] = "ডোকবুনটোর জন্য ডকুমেন্টেশন মার্কআপ $1এ পাওয়া যায়নি",
["optional"] = "বিকল্পিক",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|ত্রূটি|ত্রূটি}}",
["tag-field"] = "{{plural:$1|ফিল্ড|ফিল্ড}}",
["tag-fixme"] = "{{plural:$1|বাগ|বাগ}}",
["tag-note"] = "{{plural:$1|নোট|নোট}}",
["tag-param"] = "{{plural:$1|প্যারামেটের|প্যারামেটের}}",
["tag-return"] = "দেয়ে",
["tag-see"] = "আরও দেখেন",
["tag-todo"] = "টুডু",
["tag-usage"] = "প্রয়োগ",
["tag-warning"] = "{{plural:$1|সূচনা|সূচনা}}",
["type-boolean"] = "বুলিয়ান",
["type-function"] = "ফাঙ্কশন",
["type-member"] = "সদস্য",
["type-nil"] = "নাই",
["type-number"] = "সংখ্যা",
["type-string"] = "স্ট্রিং",
["type-table"] = "টেবিল",
["type-variable"] = "ভ্যারিয়েবল"
},
["de"] = {
["header-class"] = "Paketklassen",
["header-documentation"] = "Dokumentation",
["header-function"] = "Paketfunktion",
["header-items"] = "Paketname",
["header-other"] = "Andere Werte",
["header-private"] = "Private Werte",
["no-content"] = "Lua Quellcode in $1 nicht gefunden",
["no-markup"] = "Dokumentation-Markup für Docbunto in $1 nicht gefunden",
["optional"] = "optional",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "Fehler",
["tag-field"] = "{{plural:$1|Feld|Felder}}",
["tag-fixme"] = "Fehler",
["tag-note"] = "{{plural:$1|Notiz|Notizen}}",
["tag-param"] = "Parameter",
["tag-return"] = "Ausgabe",
["tag-see"] = "Siehe auch",
["tag-todo"] = "TODO",
["tag-usage"] = "Verwendung",
["tag-warning"] = "{{plural:$1|Warnung|Warnungen}}",
["type-boolean"] = "Boolean",
["type-function"] = "Funktion",
["type-member"] = "Mitglied",
["type-nil"] = "null",
["type-number"] = "Nummer",
["type-sequence"] = "Sequenz",
["type-string"] = "String",
["type-table"] = "Table",
["type-variable"] = "Variable"
},
["fr"] = {
["header-class"] = "Classe des paquets",
["header-documentation"] = "Documentation",
["header-function"] = "Fonction de paquet",
["header-items"] = "Objets du paquet",
["header-other"] = "Autres objets",
["header-private"] = "Objets privés",
["no-content"] = "Code source Lua source non trouvée dans $1",
["no-markup"] = "Documentation markup pour Docbunto introuvable dans $1",
["optional"] = "optionnel",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Erreur|Erreurs}}",
["tag-field"] = "{{plural:$1|Champ|Champs}}",
["tag-fixme"] = "{{plural:$1|Bug|Bugs}}",
["tag-note"] = "{{plural:$1|Note|Notes}}",
["tag-param"] = "{{plural:$1|Paramètre|Paramètres}}",
["tag-return"] = "Retours",
["tag-see"] = "Voir aussi",
["tag-todo"] = "TODO",
["tag-usage"] = "Utilisation",
["tag-warning"] = "{{plural:$1|Avertissement|Avertissements}}",
["type-boolean"] = "booléen",
["type-function"] = "fonction",
["type-member"] = "membre",
["type-nil"] = "nil",
["type-number"] = "nombre",
["type-sequence"] = "séquence",
["type-string"] = "chaîne",
["type-table"] = "tableau",
["type-variable"] = "variable"
},
["hi"] = {
["header-class"] = "क्लास को पैकेज करें",
["header-documentation"] = "प्रलेख",
["header-function"] = "फंक्शन को पैकेज करें",
["header-items"] = "पैकेज के आयटम",
["header-other"] = "दुसरे आयटम",
["header-private"] = "व्यक्तिगत आयटम्स",
["no-content"] = "$1 में लुआ स्रोत कोड नहीं मिला",
["no-markup"] = "Docbunto के लिए प्रलेख मार्कअप $1 में नहीं मिला",
["optional"] = "वैकल्पिक",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|त्रुटि|त्रुटियाँ}}",
["tag-field"] = "{{plural:$1|फ़ील्ड|फ़ील्ड्स}}",
["tag-fixme"] = "{{plural:$1|बग|बग्स}}",
["tag-note"] = "{{plural:$1|नोट|नोट्स}}",
["tag-param"] = "{{plural:$1|पैरामीटर|पैरामीटर्स}}",
["tag-return"] = "लौटाता है",
["tag-see"] = "ये भी देखें",
["tag-todo"] = "टू-डू",
["tag-usage"] = "प्रयोग",
["tag-warning"] = "{{plural:$1|चेतावनी|चेतावनियाँ}}",
["type-boolean"] = "बूलियन",
["type-function"] = "फंक्शन",
["type-member"] = "सदस्य",
["type-nil"] = "खाली",
["type-number"] = "संख्या",
["type-sequence"] = "क्रम",
["type-string"] = "स्ट्रिंग",
["type-table"] = "टेबल",
["type-variable"] = "वेरिएबल"
},
["ja"] = {
["header-class"] = "パッケージクラス",
["header-documentation"] = "ドキュメンテーション",
["header-function"] = "パッケージ関数",
["header-items"] = "パッケージ要素",
["header-other"] = "ほかアイテム",
["header-private"] = "プライベート要素",
["optional"] = "オプションです",
["parentheses"] = "($1)",
["separator-colon"] = "; ",
["separator-dot"] = "・",
["separator-semicolon"] = ":",
["tag-error"] = "エラー",
["tag-field"] = "フィールド",
["tag-fixme"] = "バグ",
["tag-note"] = "ノート",
["tag-param"] = "パラメータ",
["tag-return"] = "{{plural:$1|戻り値|複数の戻り値}}",
["tag-see"] = "関連項目",
["tag-todo"] = "タスク",
["tag-usage"] = "使用例",
["tag-warning"] = "警告",
["type-boolean"] = "ブーリアン",
["type-function"] = "関数",
["type-member"] = "メンバ",
["type-nil"] = "空",
["type-number"] = "数",
["type-string"] = "文字列",
["type-table"] = "テーブル",
["type-variable"] = "変数"
},
["ko"] = {
["header-documentation"] = "문서",
["header-items"] = "패키지 아이템",
["no-markup"] = "$1에서 Docbunto 문서 마크업을 찾지 못했습니다",
["separator-dot"] = "・",
["tag-param"] = "{{plural:$1|매개변수|매개변수}}",
["tag-return"] = "반환값"
},
["pl"] = {
["no-content"] = "Nie odnaleziono kodu źróðłowego Lua w $1",
["no-markup"] = "Nie odnaleziono znaczników Docbunto w $1"
},
["ru"] = {
["header-class"] = "Класс пакета",
["header-documentation"] = "Документация",
["header-function"] = "Функция пакета",
["header-items"] = "Элементы пакета",
["header-other"] = "Другие элементы",
["header-private"] = "Приватные элементы",
["no-content"] = "На $1 нет исходного кода Lua",
["no-markup"] = "на $1 нет разметки документации Docbunto",
["optional"] = "необязательный",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Ошибка|Ошибки}}",
["tag-field"] = "{{plural:$1|Поле|Поля}}",
["tag-fixme"] = "{{plural:$1|Недочет|Недочеты}}",
["tag-note"] = "{{plural:$1|Замечание|Замечания}}",
["tag-param"] = "{{plural:$1|Аргумент|Аргументы}}",
["tag-return"] = "Возвращает",
["tag-see"] = "Смотрите также",
["tag-todo"] = "TODO",
["tag-usage"] = "Использование",
["tag-warning"] = "{{plural:$1|Предупреждение|Предупреждения}}",
["type-boolean"] = "логический",
["type-function"] = "функция",
["type-member"] = "член класса",
["type-nil"] = "nil",
["type-number"] = "число",
["type-sequence"] = "последовательность",
["type-string"] = "строка",
["type-table"] = "таблица",
["type-variable"] = "переменная"
},
["tl"] = {
["header-items"] = "Mga aytem sa package",
["no-content"] = "Ang ''Luabsource code'' ay hindi mahanap sa $1",
["no-markup"] = "Ang ''markup'' sa documentasyon para sa Docbuntu ay hindi mahanap sa $1",
["optional"] = "opsyonal",
["parentheses"] = "",
["separator-dot"] = " • ",
["tag-note"] = "{{plural:$1|Tala|Mga tala}}",
["tag-todo"] = "MGA GAWAIN",
["tag-usage"] = "Paggamit",
["tag-warning"] = "{{plural:$1|Babala|Mga babala}}",
["type-table"] = "talaan",
["type-variable"] = ""
},
["tr"] = {
["header-class"] = "Paket sınıfı",
["header-documentation"] = "Belgelendirme",
["header-function"] = "Paket işlevi",
["header-items"] = "Paket öğeleri",
["header-other"] = "Diğer öğeler",
["header-private"] = "Özel öğeler",
["no-content"] = "Lua kaynak kodu $1 sorgusunda bulunamadı",
["no-markup"] = "Docbunto için belge işaretlemesi $1 sayfasında bulunamadı",
["optional"] = "isteğe bağlı",
["parentheses"] = " ($1)",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["separator-semicolon"] = ": ",
["tag-error"] = "{{plural:$1|Hata|Hatalar}}",
["tag-field"] = "{{plural:$1|Alan|Alanlar}}",
["tag-fixme"] = "{{plural:$1|Hata|Hatalar}}",
["tag-note"] = "{{plural:$1|Not|Notlar}}",
["tag-param"] = "{{plural:$1|Parametre|Parametreler}}",
["tag-return"] = "Döndürmeler",
["tag-see"] = "Ayrıca bakınız",
["tag-todo"] = "YAPILACAKLAR",
["tag-usage"] = "Kullanım",
["tag-warning"] = "{{plural:$1|Uyarı|Uyarılar}}",
["type-boolean"] = "boole",
["type-function"] = "işlev",
["type-member"] = "üye",
["type-nil"] = "nil",
["type-number"] = "sayı",
["type-sequence"] = "sıra",
["type-string"] = "dize",
["type-table"] = "tablo",
["type-variable"] = "değişken"
},
["vi"] = {
["header-class"] = "Lớp gói",
["header-documentation"] = "Tài liệu",
["header-function"] = "Hàm gói",
["header-items"] = "Mục gói",
["header-other"] = "Mục khác",
["header-private"] = "Mục riêng",
["no-content"] = "Không tìm thấy mã nguồn Lua trong $1",
["optional"] = "tuỳ chọn",
["separator-colon"] = "; ",
["separator-dot"] = " • ",
["tag-error"] = "Lỗi",
["tag-field"] = "{{plural:$1|Trường|Các trường}}\n",
["tag-note"] = "Lưu ý",
["tag-param"] = "{{plural:$1|Tham số|Các tham số}}",
["tag-return"] = "Trả về",
["tag-see"] = "Xem thêm",
["tag-usage"] = "Cách dùng",
["tag-warning"] = "Cảnh báo",
["type-function"] = "hàm",
["type-member"] = "",
["type-number"] = "số",
["type-sequence"] = "chuỗi",
["type-string"] = "xâu",
["type-table"] = "bảng",
["type-variable"] = "biến"
},
["zh"] = {
["header-class"] = "程序包类",
["header-documentation"] = "文档",
["header-function"] = "程序包函数",
["header-items"] = "程序包项",
["header-other"] = "其他项",
["header-private"] = "私有项",
["no-content"] = "没有在$1中找到Lua源代码",
["no-markup"] = "没有在$1中找到Docbunto的文档标记",
["optional"] = "可选",
["parentheses"] = "($1)",
["separator-colon"] = ";",
["separator-dot"] = "・",
["separator-semicolon"] = ":",
["tag-error"] = "错误",
["tag-field"] = "字段",
["tag-fixme"] = "漏洞",
["tag-note"] = "注意",
["tag-param"] = "参数",
["tag-return"] = "返回",
["tag-see"] = "另见",
["tag-todo"] = "待办",
["tag-usage"] = "用法",
["tag-warning"] = "警告",
["type-boolean"] = "布尔",
["type-function"] = "函数",
["type-member"] = "成员",
["type-nil"] = "nil",
["type-number"] = "数字",
["type-sequence"] = "序列",
["type-string"] = "字符串",
["type-table"] = "表",
["type-variable"] = "变量"
}
}
-- </nowiki>
5l18tlde3m296sm5gsnrbbp9iy7ac6p
Module:Docbunto/references
828
2669
33415
2024-09-25T06:37:59Z
en>Awesome Aasim
0
copy from testwiki, based on work from [[wikia:w:c:dev:Module:Docbunto/references]]
33415
Scribunto
text/plain
--- Reference table for Docbunto reference links.
-- List of global functions and tables available in Scribunto.
-- @file docbunto_references
--- Reference data map for types.
-- @property {table} docbunto_references.types
--- Reference link map for global items.
-- @property {table} docbunto_references.items
return {
types = {
-- Lua types available to Scribunto.
["nil"] = { link = "mw:Extension:Scribunto/Lua reference manual#nil", name = "nil" },
["bool"] = { link = "mw:Extension:Scribunto/Lua reference manual#boolean", name = "boolean" },
["boolean"] = { link = "mw:Extension:Scribunto/Lua reference manual#boolean", name = "boolean" },
["string"] = { link = "mw:Extension:Scribunto/Lua reference manual#string", name = "string" },
["int"] = { link = "mw:Extension:Scribunto/Lua reference manual#number", name = "number" },
["number"] = { link = "mw:Extension:Scribunto/Lua reference manual#number", name = "number" },
["tab"] = { link = "mw:Extension:Scribunto/Lua reference manual#table", name = "table" },
["table"] = { link = "mw:Extension:Scribunto/Lua reference manual#table", name = "table" },
["sequence"] = { link = "mw:Extension:Scribunto/Lua reference manual#sequence", name = "sequence" },
["func"] = { link = "mw:Extension:Scribunto/Lua reference manual#function", name = "function" },
["function"] = { link = "mw:Extension:Scribunto/Lua reference manual#function", name = "function" },
-- Scribunto library objects.
["mw.loadData"] = { link = "mw:Extension:Scribunto/Lua reference manual#mw.loadData", name = "DataWrapper" },
["DataWrapper"] = { link = "mw:Extension:Scribunto/Lua reference manual#mw.loadData", name = "DataWrapper" },
["Frame"] = { link = "mw:Extension:Scribunto/Lua reference manual#Frame object", name = "Frame" },
["mw.language"] = { link = "mw:Extension:Scribunto/Lua reference manual#Language object", name = "Lang" },
["Lang"] = { link = "mw:Extension:Scribunto/Lua reference manual#Language object", name = "Lang" },
["mw.uri"] = { link = "mw:Extension:Scribunto/Lua reference manual#URI object", name = "Uri" },
["Uri"] = { link = "mw:Extension:Scribunto/Lua reference manual#URI object", name = "Uri" },
["mw.html"] = { link = "mw:Extension:Scribunto/Lua reference manual#HTML object", name = "HTMLBuilder" },
["HTMLBuilder"] = { link = "mw:Extension:Scribunto/Lua reference manual#HTML object", name = "HTMLBuilder" },
["mw.title"] = { link = "mw:Extension:Scribunto/Lua reference manual#Title objects", name = "Title" },
["Title"] = { link = "mw:Extension:Scribunto/Lua reference manual#Title objects", name = "Title" },
["mw.message"] = { link = "mw:Extension:Scribunto/Lua reference manual#Message object", name = "Msg" },
["Msg"] = { link = "mw:Extension:Scribunto/Lua reference manual#Message object", name = "Msg" },
},
items = {
-- Types and primitives.
["..."] = "mw:Extension:Scribunto/Lua reference manual#varargs",
["nil"] = "mw:Extension:Scribunto/Lua reference manual#nil",
["boolean"] = "mw:Extension:Scribunto/Lua reference manual#boolean",
["number"] = "mw:Extension:Scribunto/Lua reference manual#number",
["sequence"] = "mw:Extension:Scribunto/Lua reference manual#sequence",
["function"] = "mw:Extension:Scribunto/Lua reference manual#function",
-- Global variables and functions.
["_G"] = "mw:Extension:Scribunto/Lua reference manual#_G",
["_VERSION"] = "mw:Extension:Scribunto/Lua reference manual#_VERSION",
["assert"] = "mw:Extension:Scribunto/Lua reference manual#assert",
["error"] = "mw:Extension:Scribunto/Lua reference manual#error",
["getmetatable"] = "mw:Extension:Scribunto/Lua reference manual#getmetatable",
["setmetatable"] = "mw:Extension:Scribunto/Lua reference manual#setmetatable",
["ipairs"] = "mw:Extension:Scribunto/Lua reference manual#ipairs",
["next"] = "mw:Extension:Scribunto/Lua reference manual#next",
["pairs"] = "mw:Extension:Scribunto/Lua reference manual#pairs",
["pcall"] = "mw:Extension:Scribunto/Lua reference manual#pcall",
["xpcall"] = "mw:Extension:Scribunto/Lua reference manual#xpcall",
["rawequal"] = "mw:Extension:Scribunto/Lua reference manual#rawequal",
["rawget"] = "mw:Extension:Scribunto/Lua reference manual#rawget",
["rawset"] = "mw:Extension:Scribunto/Lua reference manual#rawset",
["require"] = "mw:Extension:Scribunto/Lua reference manual#require",
["select"] = "mw:Extension:Scribunto/Lua reference manual#select",
["tonumber"] = "mw:Extension:Scribunto/Lua reference manual#tonumber",
["tostring"] = "mw:Extension:Scribunto/Lua reference manual#tostring",
["type"] = "mw:Extension:Scribunto/Lua reference manual#type",
["unpack"] = "mw:Extension:Scribunto/Lua reference manual#unpack",
-- Lua debug library.
["debug"] = "mw:Extension:Scribunto/Lua reference manual#Debug library",
["debug.traceback"] = "mw:Extension:Scribunto/Lua reference manual#debug.traceback",
-- Lua math library.
["math"] = "mw:Extension:Scribunto/Lua reference manual#Math library",
["math.abs"] = "mw:Extension:Scribunto/Lua reference manual#math.abs",
["math.acos"] = "mw:Extension:Scribunto/Lua reference manual#math.acos",
["math.asin"] = "mw:Extension:Scribunto/Lua reference manual#math.asin",
["math.atan"] = "mw:Extension:Scribunto/Lua reference manual#math.atan",
["math.atan2"] = "mw:Extension:Scribunto/Lua reference manual#math.atan2",
["math.ceil"] = "mw:Extension:Scribunto/Lua reference manual#math.ceil",
["math.cos"] = "mw:Extension:Scribunto/Lua reference manual#math.cos",
["math.cosh"] = "mw:Extension:Scribunto/Lua reference manual#math.cosh",
["math.deg"] = "mw:Extension:Scribunto/Lua reference manual#math.deg",
["math.exp"] = "mw:Extension:Scribunto/Lua reference manual#math.exp",
["math.floor"] = "mw:Extension:Scribunto/Lua reference manual#math.floor",
["math.fmod"] = "mw:Extension:Scribunto/Lua reference manual#math.fmod",
["math.frexp"] = "mw:Extension:Scribunto/Lua reference manual#math.frexp",
["math.huge"] = "mw:Extension:Scribunto/Lua reference manual#math.huge",
["math.ldexp"] = "mw:Extension:Scribunto/Lua reference manual#math.ldexp",
["math.log"] = "mw:Extension:Scribunto/Lua reference manual#math.log",
["math.log10"] = "mw:Extension:Scribunto/Lua reference manual#math.log10",
["math.max"] = "mw:Extension:Scribunto/Lua reference manual#math.max",
["math.min"] = "mw:Extension:Scribunto/Lua reference manual#math.min",
["math.modf"] = "mw:Extension:Scribunto/Lua reference manual#math.modf",
["math.pi"] = "mw:Extension:Scribunto/Lua reference manual#math.pi",
["math.pow"] = "mw:Extension:Scribunto/Lua reference manual#math.pow",
["math.rad"] = "mw:Extension:Scribunto/Lua reference manual#math.rad",
["math.random"] = "mw:Extension:Scribunto/Lua reference manual#math.random",
["math.randomseed"] = "mw:Extension:Scribunto/Lua reference manual#math.randomseed",
["math.sin"] = "mw:Extension:Scribunto/Lua reference manual#math.sin",
["math.sinh"] = "mw:Extension:Scribunto/Lua reference manual#math.sinh",
["math.sqrt"] = "mw:Extension:Scribunto/Lua reference manual#math.sqrt",
["math.tan"] = "mw:Extension:Scribunto/Lua reference manual#math.tan",
["math.tanh"] = "mw:Extension:Scribunto/Lua reference manual#math.tanh",
-- Operating system library.
["os"] = "mw:Extension:Scribunto/Lua reference manual#Operating system library",
["os.clock"] = "mw:Extension:Scribunto/Lua reference manual#os.clock",
["os.date"] = "mw:Extension:Scribunto/Lua reference manual#os.date",
["os.difftime"] = "mw:Extension:Scribunto/Lua reference manual#os.difftime",
["os.time"] = "mw:Extension:Scribunto/Lua reference manual#os.time",
-- Package library.
["package"] = "mw:Extension:Scribunto/Lua reference manual#Package library",
["package.loaded"] = "mw:Extension:Scribunto/Lua reference manual#package.loaded",
["package.loaders"] = "mw:Extension:Scribunto/Lua reference manual#package.loaders",
["package.preload"] = "mw:Extension:Scribunto/Lua reference manual#package.preload",
["package.seeall"] = "mw:Extension:Scribunto/Lua reference manual#package.seeall",
-- Lua string library.
["string"] = "mw:Extension:Scribunto/Lua reference manual#String library",
["string.byte"] = "mw:Extension:Scribunto/Lua reference manual#string.byte",
["string.char"] = "mw:Extension:Scribunto/Lua reference manual#string.char",
["string.find"] = "mw:Extension:Scribunto/Lua reference manual#string.find",
["string.format"] = "mw:Extension:Scribunto/Lua reference manual#string.format",
["string.gmatch"] = "mw:Extension:Scribunto/Lua reference manual#string.gmatch",
["string.gsub"] = "mw:Extension:Scribunto/Lua reference manual#string.gsub",
["string.len"] = "mw:Extension:Scribunto/Lua reference manual#string.len",
["string.lower"] = "mw:Extension:Scribunto/Lua reference manual#string.lower",
["string.match"] = "mw:Extension:Scribunto/Lua reference manual#string.match",
["string.rep"] = "mw:Extension:Scribunto/Lua reference manual#string.rep",
["string.reverse"] = "mw:Extension:Scribunto/Lua reference manual#string.reverse",
["string.sub"] = "mw:Extension:Scribunto/Lua reference manual#string.sub",
["string.upper"] = "mw:Extension:Scribunto/Lua reference manual#string.upper",
-- Lua table library.
["table"] = "mw:Extension:Scribunto/Lua reference manual#Table library",
["table.concat"] = "mw:Extension:Scribunto/Lua reference manual#table.concat",
["table.insert"] = "mw:Extension:Scribunto/Lua reference manual#table.insert",
["table.maxn"] = "mw:Extension:Scribunto/Lua reference manual#table.maxn",
["table.remove"] = "mw:Extension:Scribunto/Lua reference manual#table.remove",
["table.sort"] = "mw:Extension:Scribunto/Lua reference manual#table.sort",
-- MediaWiki Scribunto library.
["mw"] = "mw:Extension:Scribunto/Lua reference manual",
["mw.allToString"] = "mw:Extension:Scribunto/Lua reference manual#mw.allToString",
["mw.clearLogBuffer"] = "mw:Extension:Scribunto/Lua reference manual#mw.clearLogBuffer",
["mw.clone"] = "mw:Extension:Scribunto/Lua reference manual#mw.clone",
["mw.executeFunction"] = "mw:Extension:Scribunto/Lua reference manual#mw.executeFunction",
["mw.executeModule"] = "mw:Extension:Scribunto/Lua reference manual#mw.executeModule",
["mw.getCurrentFrame"] = "mw:Extension:Scribunto/Lua reference manual#mw.getCurrentFrame",
["mw.getLogBuffer"] = "mw:Extension:Scribunto/Lua reference manual#mw.getLogBuffer",
["mw.incrementExpensiveFunctionCount"] = "mw:Extension:Scribunto/Lua reference manual#mw.incrementExpensiveFunctionCount",
["mw.loadData"] = "mw:Extension:Scribunto/Lua reference manual#mw.loadData",
["DataWrapper"] = "mw:Extension:Scribunto/Lua reference manual#mw.loadData",
["mw.log"] = "mw:Extension:Scribunto/Lua reference manual#mw.log",
["print"] = "mw:Extension:Scribunto/Lua reference manual#mw.log",
-- Scribunto frame object.
["frame"] = "mw:Extension:Scribunto/Lua reference manual#Frame object",
["frame.args"] = "mw:Extension:Scribunto/Lua reference manual#frame.args",
["frame:getParent"] = "mw:Extension:Scribunto/Lua reference manual#frame:getParent",
["frame:expandTemplate"] = "mw:Extension:Scribunto/Lua reference manual#frame:expandTemplate",
["frame:preprocess"] = "mw:Extension:Scribunto/Lua reference manual#frame:preprocess",
["frame:getArgument"] = "mw:Extension:Scribunto/Lua reference manual#frame:getArgument",
["frame:newParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newParserValue",
["frame:newTemplateParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newTemplateParserValue",
["frame:argumentPairs"] = "mw:Extension:Scribunto/Lua reference manual#frame:argumentPairs",
["frame:getTitle"] = "mw:Extension:Scribunto/Lua reference manual#frame:getTitle",
-- Scribunto frame object as `Frame` class.
["Frame"] = "mw:Extension:Scribunto/Lua reference manual#Frame object",
["Frame.args"] = "mw:Extension:Scribunto/Lua reference manual#frame.args",
["Frame:getParent"] = "mw:Extension:Scribunto/Lua reference manual#frame:getParent",
["Frame:expandTemplate"] = "mw:Extension:Scribunto/Lua reference manual#frame:expandTemplate",
["Frame:preprocess"] = "mw:Extension:Scribunto/Lua reference manual#frame:preprocess",
["Frame:getArgument"] = "mw:Extension:Scribunto/Lua reference manual#frame:getArgument",
["Frame:newParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newParserValue",
["Frame:newTemplateParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newTemplateParserValue",
["Frame:argumentPairs"] = "mw:Extension:Scribunto/Lua reference manual#frame:argumentPairs",
["Frame:getTitle"] = "mw:Extension:Scribunto/Lua reference manual#frame:getTitle",
-- Scribunto language library.
["mw.language"] = "mw:Extension:Scribunto/Lua reference manual#Language library",
["mw.language.fetchLanguageName"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.fetchLanguageName",
["mw.language.getContentLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.getContentLanguage",
["mw.language.isValidBuiltInCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.isValidBuiltInCode",
["mw.language.isValidCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.isValidCode",
["mw.language.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.new",
-- Scribunto language object.
["lang"] = "mw:Extension:Scribunto/Lua reference manual#Language object",
["mw.language:getCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:getCode",
["mw.language:isRTL"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:isRTL",
["mw.language:lc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lc",
["mw.language:lcfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lcfirst",
["mw.language:uc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:uc",
["mw.language:ucfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:ucfirst",
["mw.language:caseFold"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:caseFold",
["mw.language:formatNum"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatNum",
["mw.language:formatDate"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatDate",
["mw.language:parseFormattedNumber"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:parseFormattedNumber",
["mw.language:convertPlural"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertPlural",
["mw.language:convertGrammar"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertGrammar",
["mw.language:gender"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:gender",
-- Scribunto language object as `Lang` class.
["Lang"] = "mw:Extension:Scribunto/Lua reference manual#Language object",
["Lang:getCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:getCode",
["Lang:isRTL"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:isRTL",
["Lang:lc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lc",
["Lang:lcfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lcfirst",
["Lang:uc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:uc",
["Lang:ucfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:ucfirst",
["Lang:caseFold"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:caseFold",
["Lang:formatNum"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatNum",
["Lang:formatDate"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatDate",
["Lang:parseFormattedNumber"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:parseFormattedNumber",
["Lang:convertPlural"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertPlural",
["Lang:convertGrammar"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertGrammar",
["Lang:gender"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:gender",
-- Scribunto site library.
["mw.site"] = "mw:Extension:Scribunto/Lua reference manual#Site library",
["mw.site.currentVersion"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.currentVersion",
["mw.site.scriptPath"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.scriptPath",
["mw.site.server"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.server",
["mw.site.siteName"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.siteName",
["mw.site.stylePath"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stylePath",
["mw.site.namespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.namespaces",
["mw.site.contentNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.contentNamespaces",
["mw.site.subjectNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.subjectNamespaces",
["mw.site.talkNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.talkNamespaces",
["mw.site.sassParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.sassParams",
["mw.site.stats"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats",
["mw.site.stats.pagesInCategory"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats.pagesInCategory",
["mw.site.stats.pagesInNamespace"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats.pagesInNamespace",
["mw.site.stats.usersInGroup"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats.usersInGroup",
-- Scribunto URI library.
["mw.uri"] = "mw:Extension:Scribunto/Lua reference manual#Uri library",
["mw.uri.encode"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.encode",
["mw.uri.decode"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.decode",
["mw.uri.anchorEncode"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.anchorEncode",
["mw.uri.buildQueryString"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.buildQueryString",
["mw.uri.parseQueryString"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.parseQueryString",
["mw.uri.canonicalUrl"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.canonicalUrl",
["mw.uri.fullUrl"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.fullUrl",
["mw.uri.localUrl"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.localUrl",
["mw.uri.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.new",
["mw.uri.validate"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.validate",
-- Scribunto URI object.
["uri"] = "mw:Extension:Scribunto/Lua reference manual#URI object",
["mw.uri:parse"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:parse",
["mw.uri:clone"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:clone",
["mw.uri:extend"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:extend",
-- Scribunto URI object as `Uri` class.
["Uri"] = "mw:Extension:Scribunto/Lua reference manual#URI object",
["Uri:parse"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:parse",
["Uri:parse"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:parse",
["Uri:clone"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:clone",
["Uri:extend"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:extend",
-- Scribunto UTF8-safe string library.
["mw.ustring"] = "mw:Extension:Scribunto/Lua reference manual#Ustring library",
["mw.ustring.maxPatternLength"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.maxPatternLength",
["mw.ustring.maxStringLength"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.maxStringLength",
["mw.ustring.byte"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.byte",
["mw.ustring.byteoffset"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.byteoffset",
["mw.ustring.char"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.char",
["mw.ustring.codepoint"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.codepoint",
["mw.ustring.find"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.find",
["mw.ustring.format"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.format",
["mw.ustring.gcodepoint"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.gcodepoint",
["mw.ustring.gmatch"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.gmatch",
["mw.ustring.gsub"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.gsub",
["mw.ustring.isutf8"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.isutf8",
["mw.ustring.len"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.len",
["mw.ustring.lower"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.lower",
["mw.ustring.match"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.match",
["mw.ustring.rep"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.rep",
["mw.ustring.sub"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.sub",
["mw.ustring.toNFC"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.toNFC",
["mw.ustring.toNFD"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.toNFD",
["mw.ustring.upper"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.upper",
-- Scribunto HTML library.
["mw.html"] = "mw:Extension:Scribunto/Lua reference manual#HTML library",
["mw.html.create"] = "mw:Extension:Scribunto/Lua reference manual#mw.html.create",
-- Scribunto HTML object.
["html"] = "mw:Extension:Scribunto/Lua reference manual#HTML object",
["mw.html:node"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:node",
["mw.html:wikitext"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:wikitext",
["mw.html:newline"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:newline",
["mw.html:tag"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:tag",
["mw.html:attr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:attr",
["mw.html:getAttr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:getAttr",
["mw.html:addClass"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:addClass",
["mw.html:css"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:css",
["mw.html:cssText"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:cssText",
["mw.html:done"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:done",
["mw.html:allDone"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:allDone",
-- Scribunto HTML object as `HTMLBuilder` class.
["HTMLBuilder"] = "mw:Extension:Scribunto/Lua reference manual#HTML object",
["HTMLBuilder:node"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:node",
["HTMLBuilder:wikitext"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:wikitext",
["HTMLBuilder:newline"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:newline",
["HTMLBuilder:tag"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:tag",
["HTMLBuilder:attr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:attr",
["HTMLBuilder:getAttr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:getAttr",
["HTMLBuilder:addClass"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:addClass",
["HTMLBuilder:css"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:css",
["HTMLBuilder:cssText"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:cssText",
["HTMLBuilder:done"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:done",
["HTMLBuilder:allDone"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:allDone",
-- Scribunto text library.
["mw.text"] = "mw:Extension:Scribunto/Lua reference manual#Text library",
["mw.text.decode"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.decode",
["mw.text.encode"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.encode",
["mw.text.listToText"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.listToText",
["mw.text.nowiki"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.nowiki",
["mw.text.split"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.split",
["mw.text.gsplit"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.gsplit",
["mw.text.tag"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.tag",
["mw.text.trim"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.trim",
["mw.text.truncate"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.truncate",
["mw.text.unstrip"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.unstrip",
-- Scribunto title library.
["mw.title"] = "mw:Extension:Scribunto/Lua reference manual#Title library",
["mw.title.equals"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.equals",
["mw.title.compare"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.compare",
["mw.title.getCurrentTitle"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.getCurrentTile",
["mw.title.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.new",
["mw.title.makeTitle"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.makeTitle",
-- Scribunto title object.
["mw.title.id"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.interwiki"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.namespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.fragment"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.nsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.subjectNsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.text"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.prefixedText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.fullText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.rootText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.baseText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.subpageText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.canTalk"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.exists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.fileExists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isContentPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isExternal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isLocal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isRedirect"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isSpecialPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isSubpage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isTalkPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:isSubpageOf"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:inNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:inNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:hasSubjectNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.basePageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.rootPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.talkPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.subjectPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.protectionLevels"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:subPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:partialUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:fullUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:localUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:canonicalUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:getContent"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
-- Scribunto title object as `Title` class.
["Title"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.id"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.interwiki"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.namespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.fragment"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.nsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.subjectNsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.text"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.prefixedText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.fullText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.rootText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.baseText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.subpageText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.canTalk"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.exists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.fileExists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isContentPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isExternal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isLocal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isRedirect"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isSpecialPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isSubpage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isTalkPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:isSubpageOf"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:inNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:inNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:hasSubjectNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.basePageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.rootPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.talkPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.subjectPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.protectionLevels"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:subPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:partialUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:fullUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:localUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:canonicalUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:getContent"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
-- Scribunto message library.
["mw.message"] = "mw:Extension:Scribunto/Lua reference manual#Message library",
["mw.message.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.new",
["mw.message.newFallbackSequence"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.newFallbackSequence",
["mw.message.rawParam"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.rawParam",
["mw.message.numParam"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.numParam",
["mw.message.getDefaultLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.getDefaultLanguage",
-- Scribunto message object.
["msg"] = "mw:Extension:Scribunto/Lua reference manual#Message object",
["mw.message:params"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:params",
["mw.message:rawParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:rawParams",
["mw.message:numParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:numParams",
["mw.message:inLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:inLanguage",
["mw.message:useDatabase"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:useDatabase",
["mw.message:plain"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:plain",
["mw.message:exists"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:exists",
["mw.message:isBlank"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isBlank",
["mw.message:isDisabled"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isDisabled",
-- Scribunto message object as `Msg` class.
["Msg"] = "mw:Extension:Scribunto/Lua reference manual#Message object",
["Msg:params"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:params",
["Msg:rawParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:rawParams",
["Msg:numParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:numParams",
["Msg:inLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:inLanguage",
["Msg:useDatabase"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:useDatabase",
["Msg:plain"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:plain",
["Msg:exists"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:exists",
["Msg:isBlank"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isBlank",
["Msg:isDisabled"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isDisabled",
}
}
mjxb8skj02djmabwzn0kbg2eptjb0r6
33416
33415
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Docbunto/references]]
33415
Scribunto
text/plain
--- Reference table for Docbunto reference links.
-- List of global functions and tables available in Scribunto.
-- @file docbunto_references
--- Reference data map for types.
-- @property {table} docbunto_references.types
--- Reference link map for global items.
-- @property {table} docbunto_references.items
return {
types = {
-- Lua types available to Scribunto.
["nil"] = { link = "mw:Extension:Scribunto/Lua reference manual#nil", name = "nil" },
["bool"] = { link = "mw:Extension:Scribunto/Lua reference manual#boolean", name = "boolean" },
["boolean"] = { link = "mw:Extension:Scribunto/Lua reference manual#boolean", name = "boolean" },
["string"] = { link = "mw:Extension:Scribunto/Lua reference manual#string", name = "string" },
["int"] = { link = "mw:Extension:Scribunto/Lua reference manual#number", name = "number" },
["number"] = { link = "mw:Extension:Scribunto/Lua reference manual#number", name = "number" },
["tab"] = { link = "mw:Extension:Scribunto/Lua reference manual#table", name = "table" },
["table"] = { link = "mw:Extension:Scribunto/Lua reference manual#table", name = "table" },
["sequence"] = { link = "mw:Extension:Scribunto/Lua reference manual#sequence", name = "sequence" },
["func"] = { link = "mw:Extension:Scribunto/Lua reference manual#function", name = "function" },
["function"] = { link = "mw:Extension:Scribunto/Lua reference manual#function", name = "function" },
-- Scribunto library objects.
["mw.loadData"] = { link = "mw:Extension:Scribunto/Lua reference manual#mw.loadData", name = "DataWrapper" },
["DataWrapper"] = { link = "mw:Extension:Scribunto/Lua reference manual#mw.loadData", name = "DataWrapper" },
["Frame"] = { link = "mw:Extension:Scribunto/Lua reference manual#Frame object", name = "Frame" },
["mw.language"] = { link = "mw:Extension:Scribunto/Lua reference manual#Language object", name = "Lang" },
["Lang"] = { link = "mw:Extension:Scribunto/Lua reference manual#Language object", name = "Lang" },
["mw.uri"] = { link = "mw:Extension:Scribunto/Lua reference manual#URI object", name = "Uri" },
["Uri"] = { link = "mw:Extension:Scribunto/Lua reference manual#URI object", name = "Uri" },
["mw.html"] = { link = "mw:Extension:Scribunto/Lua reference manual#HTML object", name = "HTMLBuilder" },
["HTMLBuilder"] = { link = "mw:Extension:Scribunto/Lua reference manual#HTML object", name = "HTMLBuilder" },
["mw.title"] = { link = "mw:Extension:Scribunto/Lua reference manual#Title objects", name = "Title" },
["Title"] = { link = "mw:Extension:Scribunto/Lua reference manual#Title objects", name = "Title" },
["mw.message"] = { link = "mw:Extension:Scribunto/Lua reference manual#Message object", name = "Msg" },
["Msg"] = { link = "mw:Extension:Scribunto/Lua reference manual#Message object", name = "Msg" },
},
items = {
-- Types and primitives.
["..."] = "mw:Extension:Scribunto/Lua reference manual#varargs",
["nil"] = "mw:Extension:Scribunto/Lua reference manual#nil",
["boolean"] = "mw:Extension:Scribunto/Lua reference manual#boolean",
["number"] = "mw:Extension:Scribunto/Lua reference manual#number",
["sequence"] = "mw:Extension:Scribunto/Lua reference manual#sequence",
["function"] = "mw:Extension:Scribunto/Lua reference manual#function",
-- Global variables and functions.
["_G"] = "mw:Extension:Scribunto/Lua reference manual#_G",
["_VERSION"] = "mw:Extension:Scribunto/Lua reference manual#_VERSION",
["assert"] = "mw:Extension:Scribunto/Lua reference manual#assert",
["error"] = "mw:Extension:Scribunto/Lua reference manual#error",
["getmetatable"] = "mw:Extension:Scribunto/Lua reference manual#getmetatable",
["setmetatable"] = "mw:Extension:Scribunto/Lua reference manual#setmetatable",
["ipairs"] = "mw:Extension:Scribunto/Lua reference manual#ipairs",
["next"] = "mw:Extension:Scribunto/Lua reference manual#next",
["pairs"] = "mw:Extension:Scribunto/Lua reference manual#pairs",
["pcall"] = "mw:Extension:Scribunto/Lua reference manual#pcall",
["xpcall"] = "mw:Extension:Scribunto/Lua reference manual#xpcall",
["rawequal"] = "mw:Extension:Scribunto/Lua reference manual#rawequal",
["rawget"] = "mw:Extension:Scribunto/Lua reference manual#rawget",
["rawset"] = "mw:Extension:Scribunto/Lua reference manual#rawset",
["require"] = "mw:Extension:Scribunto/Lua reference manual#require",
["select"] = "mw:Extension:Scribunto/Lua reference manual#select",
["tonumber"] = "mw:Extension:Scribunto/Lua reference manual#tonumber",
["tostring"] = "mw:Extension:Scribunto/Lua reference manual#tostring",
["type"] = "mw:Extension:Scribunto/Lua reference manual#type",
["unpack"] = "mw:Extension:Scribunto/Lua reference manual#unpack",
-- Lua debug library.
["debug"] = "mw:Extension:Scribunto/Lua reference manual#Debug library",
["debug.traceback"] = "mw:Extension:Scribunto/Lua reference manual#debug.traceback",
-- Lua math library.
["math"] = "mw:Extension:Scribunto/Lua reference manual#Math library",
["math.abs"] = "mw:Extension:Scribunto/Lua reference manual#math.abs",
["math.acos"] = "mw:Extension:Scribunto/Lua reference manual#math.acos",
["math.asin"] = "mw:Extension:Scribunto/Lua reference manual#math.asin",
["math.atan"] = "mw:Extension:Scribunto/Lua reference manual#math.atan",
["math.atan2"] = "mw:Extension:Scribunto/Lua reference manual#math.atan2",
["math.ceil"] = "mw:Extension:Scribunto/Lua reference manual#math.ceil",
["math.cos"] = "mw:Extension:Scribunto/Lua reference manual#math.cos",
["math.cosh"] = "mw:Extension:Scribunto/Lua reference manual#math.cosh",
["math.deg"] = "mw:Extension:Scribunto/Lua reference manual#math.deg",
["math.exp"] = "mw:Extension:Scribunto/Lua reference manual#math.exp",
["math.floor"] = "mw:Extension:Scribunto/Lua reference manual#math.floor",
["math.fmod"] = "mw:Extension:Scribunto/Lua reference manual#math.fmod",
["math.frexp"] = "mw:Extension:Scribunto/Lua reference manual#math.frexp",
["math.huge"] = "mw:Extension:Scribunto/Lua reference manual#math.huge",
["math.ldexp"] = "mw:Extension:Scribunto/Lua reference manual#math.ldexp",
["math.log"] = "mw:Extension:Scribunto/Lua reference manual#math.log",
["math.log10"] = "mw:Extension:Scribunto/Lua reference manual#math.log10",
["math.max"] = "mw:Extension:Scribunto/Lua reference manual#math.max",
["math.min"] = "mw:Extension:Scribunto/Lua reference manual#math.min",
["math.modf"] = "mw:Extension:Scribunto/Lua reference manual#math.modf",
["math.pi"] = "mw:Extension:Scribunto/Lua reference manual#math.pi",
["math.pow"] = "mw:Extension:Scribunto/Lua reference manual#math.pow",
["math.rad"] = "mw:Extension:Scribunto/Lua reference manual#math.rad",
["math.random"] = "mw:Extension:Scribunto/Lua reference manual#math.random",
["math.randomseed"] = "mw:Extension:Scribunto/Lua reference manual#math.randomseed",
["math.sin"] = "mw:Extension:Scribunto/Lua reference manual#math.sin",
["math.sinh"] = "mw:Extension:Scribunto/Lua reference manual#math.sinh",
["math.sqrt"] = "mw:Extension:Scribunto/Lua reference manual#math.sqrt",
["math.tan"] = "mw:Extension:Scribunto/Lua reference manual#math.tan",
["math.tanh"] = "mw:Extension:Scribunto/Lua reference manual#math.tanh",
-- Operating system library.
["os"] = "mw:Extension:Scribunto/Lua reference manual#Operating system library",
["os.clock"] = "mw:Extension:Scribunto/Lua reference manual#os.clock",
["os.date"] = "mw:Extension:Scribunto/Lua reference manual#os.date",
["os.difftime"] = "mw:Extension:Scribunto/Lua reference manual#os.difftime",
["os.time"] = "mw:Extension:Scribunto/Lua reference manual#os.time",
-- Package library.
["package"] = "mw:Extension:Scribunto/Lua reference manual#Package library",
["package.loaded"] = "mw:Extension:Scribunto/Lua reference manual#package.loaded",
["package.loaders"] = "mw:Extension:Scribunto/Lua reference manual#package.loaders",
["package.preload"] = "mw:Extension:Scribunto/Lua reference manual#package.preload",
["package.seeall"] = "mw:Extension:Scribunto/Lua reference manual#package.seeall",
-- Lua string library.
["string"] = "mw:Extension:Scribunto/Lua reference manual#String library",
["string.byte"] = "mw:Extension:Scribunto/Lua reference manual#string.byte",
["string.char"] = "mw:Extension:Scribunto/Lua reference manual#string.char",
["string.find"] = "mw:Extension:Scribunto/Lua reference manual#string.find",
["string.format"] = "mw:Extension:Scribunto/Lua reference manual#string.format",
["string.gmatch"] = "mw:Extension:Scribunto/Lua reference manual#string.gmatch",
["string.gsub"] = "mw:Extension:Scribunto/Lua reference manual#string.gsub",
["string.len"] = "mw:Extension:Scribunto/Lua reference manual#string.len",
["string.lower"] = "mw:Extension:Scribunto/Lua reference manual#string.lower",
["string.match"] = "mw:Extension:Scribunto/Lua reference manual#string.match",
["string.rep"] = "mw:Extension:Scribunto/Lua reference manual#string.rep",
["string.reverse"] = "mw:Extension:Scribunto/Lua reference manual#string.reverse",
["string.sub"] = "mw:Extension:Scribunto/Lua reference manual#string.sub",
["string.upper"] = "mw:Extension:Scribunto/Lua reference manual#string.upper",
-- Lua table library.
["table"] = "mw:Extension:Scribunto/Lua reference manual#Table library",
["table.concat"] = "mw:Extension:Scribunto/Lua reference manual#table.concat",
["table.insert"] = "mw:Extension:Scribunto/Lua reference manual#table.insert",
["table.maxn"] = "mw:Extension:Scribunto/Lua reference manual#table.maxn",
["table.remove"] = "mw:Extension:Scribunto/Lua reference manual#table.remove",
["table.sort"] = "mw:Extension:Scribunto/Lua reference manual#table.sort",
-- MediaWiki Scribunto library.
["mw"] = "mw:Extension:Scribunto/Lua reference manual",
["mw.allToString"] = "mw:Extension:Scribunto/Lua reference manual#mw.allToString",
["mw.clearLogBuffer"] = "mw:Extension:Scribunto/Lua reference manual#mw.clearLogBuffer",
["mw.clone"] = "mw:Extension:Scribunto/Lua reference manual#mw.clone",
["mw.executeFunction"] = "mw:Extension:Scribunto/Lua reference manual#mw.executeFunction",
["mw.executeModule"] = "mw:Extension:Scribunto/Lua reference manual#mw.executeModule",
["mw.getCurrentFrame"] = "mw:Extension:Scribunto/Lua reference manual#mw.getCurrentFrame",
["mw.getLogBuffer"] = "mw:Extension:Scribunto/Lua reference manual#mw.getLogBuffer",
["mw.incrementExpensiveFunctionCount"] = "mw:Extension:Scribunto/Lua reference manual#mw.incrementExpensiveFunctionCount",
["mw.loadData"] = "mw:Extension:Scribunto/Lua reference manual#mw.loadData",
["DataWrapper"] = "mw:Extension:Scribunto/Lua reference manual#mw.loadData",
["mw.log"] = "mw:Extension:Scribunto/Lua reference manual#mw.log",
["print"] = "mw:Extension:Scribunto/Lua reference manual#mw.log",
-- Scribunto frame object.
["frame"] = "mw:Extension:Scribunto/Lua reference manual#Frame object",
["frame.args"] = "mw:Extension:Scribunto/Lua reference manual#frame.args",
["frame:getParent"] = "mw:Extension:Scribunto/Lua reference manual#frame:getParent",
["frame:expandTemplate"] = "mw:Extension:Scribunto/Lua reference manual#frame:expandTemplate",
["frame:preprocess"] = "mw:Extension:Scribunto/Lua reference manual#frame:preprocess",
["frame:getArgument"] = "mw:Extension:Scribunto/Lua reference manual#frame:getArgument",
["frame:newParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newParserValue",
["frame:newTemplateParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newTemplateParserValue",
["frame:argumentPairs"] = "mw:Extension:Scribunto/Lua reference manual#frame:argumentPairs",
["frame:getTitle"] = "mw:Extension:Scribunto/Lua reference manual#frame:getTitle",
-- Scribunto frame object as `Frame` class.
["Frame"] = "mw:Extension:Scribunto/Lua reference manual#Frame object",
["Frame.args"] = "mw:Extension:Scribunto/Lua reference manual#frame.args",
["Frame:getParent"] = "mw:Extension:Scribunto/Lua reference manual#frame:getParent",
["Frame:expandTemplate"] = "mw:Extension:Scribunto/Lua reference manual#frame:expandTemplate",
["Frame:preprocess"] = "mw:Extension:Scribunto/Lua reference manual#frame:preprocess",
["Frame:getArgument"] = "mw:Extension:Scribunto/Lua reference manual#frame:getArgument",
["Frame:newParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newParserValue",
["Frame:newTemplateParserValue"] = "mw:Extension:Scribunto/Lua reference manual#frame:newTemplateParserValue",
["Frame:argumentPairs"] = "mw:Extension:Scribunto/Lua reference manual#frame:argumentPairs",
["Frame:getTitle"] = "mw:Extension:Scribunto/Lua reference manual#frame:getTitle",
-- Scribunto language library.
["mw.language"] = "mw:Extension:Scribunto/Lua reference manual#Language library",
["mw.language.fetchLanguageName"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.fetchLanguageName",
["mw.language.getContentLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.getContentLanguage",
["mw.language.isValidBuiltInCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.isValidBuiltInCode",
["mw.language.isValidCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.isValidCode",
["mw.language.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.language.new",
-- Scribunto language object.
["lang"] = "mw:Extension:Scribunto/Lua reference manual#Language object",
["mw.language:getCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:getCode",
["mw.language:isRTL"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:isRTL",
["mw.language:lc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lc",
["mw.language:lcfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lcfirst",
["mw.language:uc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:uc",
["mw.language:ucfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:ucfirst",
["mw.language:caseFold"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:caseFold",
["mw.language:formatNum"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatNum",
["mw.language:formatDate"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatDate",
["mw.language:parseFormattedNumber"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:parseFormattedNumber",
["mw.language:convertPlural"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertPlural",
["mw.language:convertGrammar"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertGrammar",
["mw.language:gender"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:gender",
-- Scribunto language object as `Lang` class.
["Lang"] = "mw:Extension:Scribunto/Lua reference manual#Language object",
["Lang:getCode"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:getCode",
["Lang:isRTL"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:isRTL",
["Lang:lc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lc",
["Lang:lcfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:lcfirst",
["Lang:uc"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:uc",
["Lang:ucfirst"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:ucfirst",
["Lang:caseFold"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:caseFold",
["Lang:formatNum"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatNum",
["Lang:formatDate"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:formatDate",
["Lang:parseFormattedNumber"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:parseFormattedNumber",
["Lang:convertPlural"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertPlural",
["Lang:convertGrammar"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:convertGrammar",
["Lang:gender"] = "mw:Extension:Scribunto/Lua reference manual#mw.language:gender",
-- Scribunto site library.
["mw.site"] = "mw:Extension:Scribunto/Lua reference manual#Site library",
["mw.site.currentVersion"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.currentVersion",
["mw.site.scriptPath"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.scriptPath",
["mw.site.server"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.server",
["mw.site.siteName"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.siteName",
["mw.site.stylePath"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stylePath",
["mw.site.namespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.namespaces",
["mw.site.contentNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.contentNamespaces",
["mw.site.subjectNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.subjectNamespaces",
["mw.site.talkNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.talkNamespaces",
["mw.site.sassParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.sassParams",
["mw.site.stats"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats",
["mw.site.stats.pagesInCategory"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats.pagesInCategory",
["mw.site.stats.pagesInNamespace"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats.pagesInNamespace",
["mw.site.stats.usersInGroup"] = "mw:Extension:Scribunto/Lua reference manual#mw.site.stats.usersInGroup",
-- Scribunto URI library.
["mw.uri"] = "mw:Extension:Scribunto/Lua reference manual#Uri library",
["mw.uri.encode"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.encode",
["mw.uri.decode"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.decode",
["mw.uri.anchorEncode"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.anchorEncode",
["mw.uri.buildQueryString"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.buildQueryString",
["mw.uri.parseQueryString"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.parseQueryString",
["mw.uri.canonicalUrl"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.canonicalUrl",
["mw.uri.fullUrl"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.fullUrl",
["mw.uri.localUrl"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.localUrl",
["mw.uri.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.new",
["mw.uri.validate"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri.validate",
-- Scribunto URI object.
["uri"] = "mw:Extension:Scribunto/Lua reference manual#URI object",
["mw.uri:parse"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:parse",
["mw.uri:clone"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:clone",
["mw.uri:extend"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:extend",
-- Scribunto URI object as `Uri` class.
["Uri"] = "mw:Extension:Scribunto/Lua reference manual#URI object",
["Uri:parse"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:parse",
["Uri:parse"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:parse",
["Uri:clone"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:clone",
["Uri:extend"] = "mw:Extension:Scribunto/Lua reference manual#mw.uri:extend",
-- Scribunto UTF8-safe string library.
["mw.ustring"] = "mw:Extension:Scribunto/Lua reference manual#Ustring library",
["mw.ustring.maxPatternLength"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.maxPatternLength",
["mw.ustring.maxStringLength"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.maxStringLength",
["mw.ustring.byte"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.byte",
["mw.ustring.byteoffset"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.byteoffset",
["mw.ustring.char"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.char",
["mw.ustring.codepoint"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.codepoint",
["mw.ustring.find"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.find",
["mw.ustring.format"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.format",
["mw.ustring.gcodepoint"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.gcodepoint",
["mw.ustring.gmatch"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.gmatch",
["mw.ustring.gsub"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.gsub",
["mw.ustring.isutf8"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.isutf8",
["mw.ustring.len"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.len",
["mw.ustring.lower"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.lower",
["mw.ustring.match"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.match",
["mw.ustring.rep"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.rep",
["mw.ustring.sub"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.sub",
["mw.ustring.toNFC"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.toNFC",
["mw.ustring.toNFD"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.toNFD",
["mw.ustring.upper"] = "mw:Extension:Scribunto/Lua reference manual#mw.ustring.upper",
-- Scribunto HTML library.
["mw.html"] = "mw:Extension:Scribunto/Lua reference manual#HTML library",
["mw.html.create"] = "mw:Extension:Scribunto/Lua reference manual#mw.html.create",
-- Scribunto HTML object.
["html"] = "mw:Extension:Scribunto/Lua reference manual#HTML object",
["mw.html:node"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:node",
["mw.html:wikitext"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:wikitext",
["mw.html:newline"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:newline",
["mw.html:tag"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:tag",
["mw.html:attr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:attr",
["mw.html:getAttr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:getAttr",
["mw.html:addClass"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:addClass",
["mw.html:css"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:css",
["mw.html:cssText"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:cssText",
["mw.html:done"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:done",
["mw.html:allDone"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:allDone",
-- Scribunto HTML object as `HTMLBuilder` class.
["HTMLBuilder"] = "mw:Extension:Scribunto/Lua reference manual#HTML object",
["HTMLBuilder:node"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:node",
["HTMLBuilder:wikitext"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:wikitext",
["HTMLBuilder:newline"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:newline",
["HTMLBuilder:tag"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:tag",
["HTMLBuilder:attr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:attr",
["HTMLBuilder:getAttr"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:getAttr",
["HTMLBuilder:addClass"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:addClass",
["HTMLBuilder:css"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:css",
["HTMLBuilder:cssText"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:cssText",
["HTMLBuilder:done"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:done",
["HTMLBuilder:allDone"] = "mw:Extension:Scribunto/Lua reference manual#mw.html:allDone",
-- Scribunto text library.
["mw.text"] = "mw:Extension:Scribunto/Lua reference manual#Text library",
["mw.text.decode"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.decode",
["mw.text.encode"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.encode",
["mw.text.listToText"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.listToText",
["mw.text.nowiki"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.nowiki",
["mw.text.split"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.split",
["mw.text.gsplit"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.gsplit",
["mw.text.tag"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.tag",
["mw.text.trim"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.trim",
["mw.text.truncate"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.truncate",
["mw.text.unstrip"] = "mw:Extension:Scribunto/Lua reference manual#mw.text.unstrip",
-- Scribunto title library.
["mw.title"] = "mw:Extension:Scribunto/Lua reference manual#Title library",
["mw.title.equals"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.equals",
["mw.title.compare"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.compare",
["mw.title.getCurrentTitle"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.getCurrentTile",
["mw.title.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.new",
["mw.title.makeTitle"] = "mw:Extension:Scribunto/Lua reference manual#mw.title.makeTitle",
-- Scribunto title object.
["mw.title.id"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.interwiki"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.namespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.fragment"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.nsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.subjectNsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.text"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.prefixedText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.fullText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.rootText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.baseText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.subpageText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.canTalk"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.exists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.fileExists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isContentPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isExternal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isLocal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isRedirect"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isSpecialPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isSubpage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.isTalkPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:isSubpageOf"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:inNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:inNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:hasSubjectNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.basePageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.rootPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.talkPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.subjectPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title.protectionLevels"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:subPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:partialUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:fullUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:localUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:canonicalUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["mw.title:getContent"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
-- Scribunto title object as `Title` class.
["Title"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.id"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.interwiki"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.namespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.fragment"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.nsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.subjectNsText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.text"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.prefixedText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.fullText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.rootText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.baseText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.subpageText"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.canTalk"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.exists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.fileExists"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isContentPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isExternal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isLocal"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isRedirect"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isSpecialPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isSubpage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.isTalkPage"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:isSubpageOf"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:inNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:inNamespaces"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:hasSubjectNamespace"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.basePageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.rootPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.talkPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.subjectPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title.protectionLevels"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:subPageTitle"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:partialUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:fullUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:localUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:canonicalUrl"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
["Title:getContent"] = "mw:Extension:Scribunto/Lua reference manual#Title objects",
-- Scribunto message library.
["mw.message"] = "mw:Extension:Scribunto/Lua reference manual#Message library",
["mw.message.new"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.new",
["mw.message.newFallbackSequence"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.newFallbackSequence",
["mw.message.rawParam"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.rawParam",
["mw.message.numParam"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.numParam",
["mw.message.getDefaultLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.message.getDefaultLanguage",
-- Scribunto message object.
["msg"] = "mw:Extension:Scribunto/Lua reference manual#Message object",
["mw.message:params"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:params",
["mw.message:rawParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:rawParams",
["mw.message:numParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:numParams",
["mw.message:inLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:inLanguage",
["mw.message:useDatabase"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:useDatabase",
["mw.message:plain"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:plain",
["mw.message:exists"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:exists",
["mw.message:isBlank"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isBlank",
["mw.message:isDisabled"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isDisabled",
-- Scribunto message object as `Msg` class.
["Msg"] = "mw:Extension:Scribunto/Lua reference manual#Message object",
["Msg:params"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:params",
["Msg:rawParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:rawParams",
["Msg:numParams"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:numParams",
["Msg:inLanguage"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:inLanguage",
["Msg:useDatabase"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:useDatabase",
["Msg:plain"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:plain",
["Msg:exists"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:exists",
["Msg:isBlank"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isBlank",
["Msg:isDisabled"] = "mw:Extension:Scribunto/Lua reference manual#mw.message:isDisabled",
}
}
mjxb8skj02djmabwzn0kbg2eptjb0r6
Module:Lua lexer
828
2670
33417
2026-06-08T03:21:07Z
en>Awesome Aasim
0
remove header but link to MIT license
33417
Scribunto
text/plain
--- Lexer for Lua source code written in pure Lua.
-- @script lexer
-- @license [https://github.com/LoganDark/lua-lexer/blob/master/LICENSE MIT]
-- @author https://github.com/LoganDark
-- @param {string} text Lua source code to lex.
-- @return {string} Table of line arrays containing lexemes.
--- Mapper for individual token list string.
-- @param {string} src List of characters or keywords to map.
-- @param[opt] {table} list Table to extend by reference.
-- @return {{char=true,...}}, map
-- @local
local function lookupify(src, list)
list = list or {}
if type(src) == 'string' then
for i = 1, src:len() do
list[src:sub(i, i)] = true
end
elseif type(src) == 'table' then
for i = 1, #src do
list[src[i]] = true
end
end
return list
end
--- Base identifier character set.
-- @variable {string} base_ident
local base_ident = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
--- Base identifier character set.
-- @variable {string} base_digits
local base_digits = '0123456789'
--- Base identifier character set.
-- @variable {string} base_operators
local base_operators = '+-*/^%#'
--- Map of Lua character patterns.
-- @table chars
-- @field {table} whitespace Boolean map of whitespace
-- tokens.
-- @field {table} validEscapes Boolean map of valid escape
-- characters.
-- @field {table} ident Boolean map of valid identifier
-- characters.
-- @field {table} symbols Boolean map of valid symbol and
-- operator characters.
-- @local
local chars = {
whitespace = lookupify(' \n\t\r'),
validEscapes = lookupify('abfnrtv"\'\\'),
ident = lookupify(
base_ident .. base_digits,
{
start = lookupify(base_ident),
}
),
digits = lookupify(
base_digits,
{
hex = lookupify(base_digits .. 'abcdefABCDEF')
}
),
symbols = lookupify(
base_operators .. ',{}[]();.:', {
equality = lookupify('~=><'),
operators = lookupify(base_operators)
}
)
}
--- List of Lua keywords.
-- @table keywords
-- @field structure Boolean map of structure keywords.
-- @field values Boolean map of primitive keywords.
local keywords = {
structure = lookupify({
'and', 'break', 'do', 'else', 'elseif', 'end', 'for', 'function',
'goto', 'if', 'in', 'local', 'not', 'or', 'repeat', 'return', 'then',
'until', 'while'
}),
values = lookupify({
'true', 'false', 'nil'
})
}
-- Lexer function export.
return function(text)
local pos = 1
local start = 1
local buffer = {}
local lines = {}
local function look(delta)
delta = pos + (delta or 0)
return text:sub(delta, delta)
end
local function get()
pos = pos + 1
return look(-1)
end
local function getDataLevel()
local num = 0
while look(num) == '=' do
num = num + 1
end
if look(num) == '[' then
pos = pos + num + 1
return num
end
end
local function getCurrentTokenText()
return text:sub(start, pos - 1)
end
local currentLineLength = 0
local lineoffset = 0
local function pushToken(type, text)
text = text or getCurrentTokenText()
local tk = buffer[#buffer]
if not tk or tk.type ~= type then
tk = {
type = type,
data = text,
posFirst = start - lineoffset,
posLast = pos - 1 - lineoffset
}
if tk.data ~= '' then
buffer[#buffer + 1] = tk
end
else
tk.data = tk.data .. text
tk.posLast = tk.posLast + text:len()
end
currentLineLength = currentLineLength + text:len()
start = pos
return tk
end
local function newline()
lines[#lines + 1] = buffer
buffer = {}
get()
pushToken('newline')
buffer[1] = nil
lineoffset = lineoffset + currentLineLength
currentLineLength = 0
end
local function getData(level, type)
while true do
local char = get()
if char == '' then
return
elseif char == '\n' then
pos = pos - 1
pushToken(type)
newline()
elseif char == ']' then
local valid = true
for i = 1, level do
if look() == '=' then
pos = pos + 1
else
valid = false
break
end
end
if valid and look() == ']' then
pos = pos - level - 1
return
end
end
end
end
local function chompWhitespace()
while true do
local char = look()
if char == '\n' then
pushToken('whitespace')
newline()
elseif chars.whitespace[char] then
pos = pos + 1
else
break
end
end
pushToken('whitespace')
end
while true do
chompWhitespace()
local char = get()
if char == '' then
break
elseif char == '-' and look() == '-' then
pos = pos + 1
if look() == '[' then
pos = pos + 1
local level = getDataLevel()
if level then
getData(level, 'comment')
pos = pos + level + 2
pushToken('comment')
else
while true do
local char2 = get()
if char2 == '' or char2 == '\n' then
pos = pos - 1
pushToken('comment')
if char2 == '\n' then
newline()
end
break
end
end
end
else
while true do
local char2 = get()
if char2 == '' or char2 == '\n' then
pos = pos - 1
pushToken('comment')
if char2 == '\n' then
newline()
end
break
end
end
end
pushToken('comment')
elseif char == '\'' or char == '"' then
pushToken('string_start')
while true do
local char2 = get()
if char2 == '\\' then
pos = pos - 1
pushToken('string')
get()
local char3 = get()
if chars.digits[char3] then
for i = 1, 2 do
if chars.digits[look()] then
pos = pos + 1
end
end
elseif char3 == 'x' then
if chars.digits.hex[look()] and chars.digits.hex[look(1)] then
pos = pos + 2
else
pushToken('unidentified')
end
elseif char3 == '\n' then
pos = pos - 1
pushToken('escape')
newline()
elseif not chars.validEscapes[char3] then
pushToken('unidentified')
end
pushToken('escape')
elseif char2 == '\n' then
pos = pos - 1
pushToken('string')
newline()
break
elseif char2 == char or char2 == '' then
pos = pos - 1
pushToken('string')
get()
break
end
end
pushToken('string_end')
elseif chars.ident.start[char] then
while chars.ident[look()] do
pos = pos + 1
end
local word = getCurrentTokenText()
if keywords.structure[word] then
pushToken('keyword')
elseif keywords.values[word] then
pushToken('value')
else
pushToken('ident')
end
elseif chars.digits[char] or (char == '.' and chars.digits[look()]) then
if char == '0' and look() == 'x' then
pos = pos + 1
while chars.digits.hex[look()] do
pos = pos + 1
end
else
while chars.digits[look()] do
pos = pos + 1
end
if look() == '.' then
pos = pos + 1
while chars.digits[look()] do
pos = pos + 1
end
end
if look():lower() == 'e' then
pos = pos + 1
if look() == '-' then
pos = pos + 1
end
while chars.digits[look()] do
pos = pos + 1
end
end
end
pushToken('number')
elseif char == '[' then
local level = getDataLevel()
if level then
pushToken('string_start')
getData(level, 'string')
pushToken('string')
pos = pos + level + 2
pushToken('string_end')
else
pushToken('symbol')
end
elseif char == '.' then
if look() == '.' then
pos = pos + 1
if look() == '.' then
pos = pos + 1
end
end
if getCurrentTokenText():len() == 3 then
pushToken('vararg')
else
pushToken('symbol')
end
elseif char == ':' and look() == ':' then
get()
pushToken('label_start')
chompWhitespace()
if chars.ident.start[look()] then
get()
while chars.ident[look()] do
get()
end
pushToken('label')
chompWhitespace()
if look() == ':' and look(1) == ':' then
get()
get()
pushToken('label_end')
end
end
elseif chars.symbols.equality[char] then
if look() == '=' then
pos = pos + 1
end
pushToken('operator')
elseif chars.symbols[char] then
if chars.symbols.operators[char] then
pushToken('operator')
else
pushToken('symbol')
end
else
pushToken('unidentified')
end
end
lines[#lines + 1] = buffer
return lines
end
kmv09oaxzsoiuyngaiw84n7j6vfbjmq
33418
33417
2026-11-11T21:55:15Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Lua_lexer]]
33417
Scribunto
text/plain
--- Lexer for Lua source code written in pure Lua.
-- @script lexer
-- @license [https://github.com/LoganDark/lua-lexer/blob/master/LICENSE MIT]
-- @author https://github.com/LoganDark
-- @param {string} text Lua source code to lex.
-- @return {string} Table of line arrays containing lexemes.
--- Mapper for individual token list string.
-- @param {string} src List of characters or keywords to map.
-- @param[opt] {table} list Table to extend by reference.
-- @return {{char=true,...}}, map
-- @local
local function lookupify(src, list)
list = list or {}
if type(src) == 'string' then
for i = 1, src:len() do
list[src:sub(i, i)] = true
end
elseif type(src) == 'table' then
for i = 1, #src do
list[src[i]] = true
end
end
return list
end
--- Base identifier character set.
-- @variable {string} base_ident
local base_ident = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
--- Base identifier character set.
-- @variable {string} base_digits
local base_digits = '0123456789'
--- Base identifier character set.
-- @variable {string} base_operators
local base_operators = '+-*/^%#'
--- Map of Lua character patterns.
-- @table chars
-- @field {table} whitespace Boolean map of whitespace
-- tokens.
-- @field {table} validEscapes Boolean map of valid escape
-- characters.
-- @field {table} ident Boolean map of valid identifier
-- characters.
-- @field {table} symbols Boolean map of valid symbol and
-- operator characters.
-- @local
local chars = {
whitespace = lookupify(' \n\t\r'),
validEscapes = lookupify('abfnrtv"\'\\'),
ident = lookupify(
base_ident .. base_digits,
{
start = lookupify(base_ident),
}
),
digits = lookupify(
base_digits,
{
hex = lookupify(base_digits .. 'abcdefABCDEF')
}
),
symbols = lookupify(
base_operators .. ',{}[]();.:', {
equality = lookupify('~=><'),
operators = lookupify(base_operators)
}
)
}
--- List of Lua keywords.
-- @table keywords
-- @field structure Boolean map of structure keywords.
-- @field values Boolean map of primitive keywords.
local keywords = {
structure = lookupify({
'and', 'break', 'do', 'else', 'elseif', 'end', 'for', 'function',
'goto', 'if', 'in', 'local', 'not', 'or', 'repeat', 'return', 'then',
'until', 'while'
}),
values = lookupify({
'true', 'false', 'nil'
})
}
-- Lexer function export.
return function(text)
local pos = 1
local start = 1
local buffer = {}
local lines = {}
local function look(delta)
delta = pos + (delta or 0)
return text:sub(delta, delta)
end
local function get()
pos = pos + 1
return look(-1)
end
local function getDataLevel()
local num = 0
while look(num) == '=' do
num = num + 1
end
if look(num) == '[' then
pos = pos + num + 1
return num
end
end
local function getCurrentTokenText()
return text:sub(start, pos - 1)
end
local currentLineLength = 0
local lineoffset = 0
local function pushToken(type, text)
text = text or getCurrentTokenText()
local tk = buffer[#buffer]
if not tk or tk.type ~= type then
tk = {
type = type,
data = text,
posFirst = start - lineoffset,
posLast = pos - 1 - lineoffset
}
if tk.data ~= '' then
buffer[#buffer + 1] = tk
end
else
tk.data = tk.data .. text
tk.posLast = tk.posLast + text:len()
end
currentLineLength = currentLineLength + text:len()
start = pos
return tk
end
local function newline()
lines[#lines + 1] = buffer
buffer = {}
get()
pushToken('newline')
buffer[1] = nil
lineoffset = lineoffset + currentLineLength
currentLineLength = 0
end
local function getData(level, type)
while true do
local char = get()
if char == '' then
return
elseif char == '\n' then
pos = pos - 1
pushToken(type)
newline()
elseif char == ']' then
local valid = true
for i = 1, level do
if look() == '=' then
pos = pos + 1
else
valid = false
break
end
end
if valid and look() == ']' then
pos = pos - level - 1
return
end
end
end
end
local function chompWhitespace()
while true do
local char = look()
if char == '\n' then
pushToken('whitespace')
newline()
elseif chars.whitespace[char] then
pos = pos + 1
else
break
end
end
pushToken('whitespace')
end
while true do
chompWhitespace()
local char = get()
if char == '' then
break
elseif char == '-' and look() == '-' then
pos = pos + 1
if look() == '[' then
pos = pos + 1
local level = getDataLevel()
if level then
getData(level, 'comment')
pos = pos + level + 2
pushToken('comment')
else
while true do
local char2 = get()
if char2 == '' or char2 == '\n' then
pos = pos - 1
pushToken('comment')
if char2 == '\n' then
newline()
end
break
end
end
end
else
while true do
local char2 = get()
if char2 == '' or char2 == '\n' then
pos = pos - 1
pushToken('comment')
if char2 == '\n' then
newline()
end
break
end
end
end
pushToken('comment')
elseif char == '\'' or char == '"' then
pushToken('string_start')
while true do
local char2 = get()
if char2 == '\\' then
pos = pos - 1
pushToken('string')
get()
local char3 = get()
if chars.digits[char3] then
for i = 1, 2 do
if chars.digits[look()] then
pos = pos + 1
end
end
elseif char3 == 'x' then
if chars.digits.hex[look()] and chars.digits.hex[look(1)] then
pos = pos + 2
else
pushToken('unidentified')
end
elseif char3 == '\n' then
pos = pos - 1
pushToken('escape')
newline()
elseif not chars.validEscapes[char3] then
pushToken('unidentified')
end
pushToken('escape')
elseif char2 == '\n' then
pos = pos - 1
pushToken('string')
newline()
break
elseif char2 == char or char2 == '' then
pos = pos - 1
pushToken('string')
get()
break
end
end
pushToken('string_end')
elseif chars.ident.start[char] then
while chars.ident[look()] do
pos = pos + 1
end
local word = getCurrentTokenText()
if keywords.structure[word] then
pushToken('keyword')
elseif keywords.values[word] then
pushToken('value')
else
pushToken('ident')
end
elseif chars.digits[char] or (char == '.' and chars.digits[look()]) then
if char == '0' and look() == 'x' then
pos = pos + 1
while chars.digits.hex[look()] do
pos = pos + 1
end
else
while chars.digits[look()] do
pos = pos + 1
end
if look() == '.' then
pos = pos + 1
while chars.digits[look()] do
pos = pos + 1
end
end
if look():lower() == 'e' then
pos = pos + 1
if look() == '-' then
pos = pos + 1
end
while chars.digits[look()] do
pos = pos + 1
end
end
end
pushToken('number')
elseif char == '[' then
local level = getDataLevel()
if level then
pushToken('string_start')
getData(level, 'string')
pushToken('string')
pos = pos + level + 2
pushToken('string_end')
else
pushToken('symbol')
end
elseif char == '.' then
if look() == '.' then
pos = pos + 1
if look() == '.' then
pos = pos + 1
end
end
if getCurrentTokenText():len() == 3 then
pushToken('vararg')
else
pushToken('symbol')
end
elseif char == ':' and look() == ':' then
get()
pushToken('label_start')
chompWhitespace()
if chars.ident.start[look()] then
get()
while chars.ident[look()] do
get()
end
pushToken('label')
chompWhitespace()
if look() == ':' and look(1) == ':' then
get()
get()
pushToken('label_end')
end
end
elseif chars.symbols.equality[char] then
if look() == '=' then
pos = pos + 1
end
pushToken('operator')
elseif chars.symbols[char] then
if chars.symbols.operators[char] then
pushToken('operator')
else
pushToken('symbol')
end
else
pushToken('unidentified')
end
end
lines[#lines + 1] = buffer
return lines
end
kmv09oaxzsoiuyngaiw84n7j6vfbjmq
Module:Unindent
828
2671
33419
2026-01-30T15:31:11Z
en>Awesome Aasim
0
33419
Scribunto
text/plain
--[[
Copyright (c) 2013 Enrique García Cota
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--]]
-- <nowiki>
--- Unindent resets the indentation level of mulitline strings.
-- It is useful for multiline strings inside functions and large tables.
-- This module serves as a utility function for string parsing.
--
-- Lua supports multiline strings in the format `[[\n...\n]]`. In general,
-- Lua does not outdent indented multiline strings out of the box. Though
-- Lua supports variable indentation in multiline strings, custom logic is
-- necessary to reset the string's indentation. This module adopts a
-- flexible approach based on string scanning.
--
-- Unlike Penlight's `pl.text.dedent` behaviour where every line has the
-- indentation of the first line removed, the line prefixed with the least
-- non-tab whitespace is reset to zero indentation. Thus, the opening line
-- of the string may retain some indentation *if* there are lines of less
-- indentation terminating the string.
--
-- @script unindent
-- @license MIT
-- @release stable
-- @author [[wikia:dev:User:8nml|8nml]]
-- @attribution [https://github.com/kikito @kikito] ([https://github.com/kikito/inspect.lua/blob/master/spec/unindent.lua GitHub])
-- @param {string} str Multiline string indented consistently.
-- @returns {string} Unindented string.
return function(str)
str = str:gsub(' +$', ''):gsub('^ +', '') -- remove spaces at start and end
local level = math.huge
local minPrefix = ''
local len
for prefix in str:gmatch('\n( +)') do
len = #prefix
if len < level then
level = len
minPrefix = prefix
end
end
return (str:gsub('\n' .. minPrefix, '\n'):gsub('\n$', ''))
end
njtcm3z8uvh69ku6zyaxoc681v6dcko
33420
33419
2026-11-11T21:55:16Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Unindent]]
33419
Scribunto
text/plain
--[[
Copyright (c) 2013 Enrique García Cota
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--]]
-- <nowiki>
--- Unindent resets the indentation level of mulitline strings.
-- It is useful for multiline strings inside functions and large tables.
-- This module serves as a utility function for string parsing.
--
-- Lua supports multiline strings in the format `[[\n...\n]]`. In general,
-- Lua does not outdent indented multiline strings out of the box. Though
-- Lua supports variable indentation in multiline strings, custom logic is
-- necessary to reset the string's indentation. This module adopts a
-- flexible approach based on string scanning.
--
-- Unlike Penlight's `pl.text.dedent` behaviour where every line has the
-- indentation of the first line removed, the line prefixed with the least
-- non-tab whitespace is reset to zero indentation. Thus, the opening line
-- of the string may retain some indentation *if* there are lines of less
-- indentation terminating the string.
--
-- @script unindent
-- @license MIT
-- @release stable
-- @author [[wikia:dev:User:8nml|8nml]]
-- @attribution [https://github.com/kikito @kikito] ([https://github.com/kikito/inspect.lua/blob/master/spec/unindent.lua GitHub])
-- @param {string} str Multiline string indented consistently.
-- @returns {string} Unindented string.
return function(str)
str = str:gsub(' +$', ''):gsub('^ +', '') -- remove spaces at start and end
local level = math.huge
local minPrefix = ''
local len
for prefix in str:gmatch('\n( +)') do
len = #prefix
if len < level then
level = len
minPrefix = prefix
end
end
return (str:gsub('\n' .. minPrefix, '\n'):gsub('\n$', ''))
end
njtcm3z8uvh69ku6zyaxoc681v6dcko
Tempilet:Infobox Lua
10
2672
33421
2026-06-03T15:31:02Z
en>Awesome Aasim
0
33421
wikitext
text/x-wiki
{{Infobox
| bodyclass = infobox-lua
| bodystyle = {{#ifeq: {{{styled|}}} | yes | border: 2px ridge #CAE1FF; width: 30em; padding-bottom: 0px; | <!-- nothing --> }} {{{bodystyle|}}}
| title = {{{title|{{PAGENAME}}}}}
| above = {{#ifeq: {{{styled|}}} | yes | {{{name|{{SUBPAGENAME}}}}} | <!-- nothing --> }}
| titlestyle = {{#ifeq: {{{styled|}}} | yes | font-size: 0.95em; padding: 0px; margin: 0px | <!-- nothing --> }}
| abovestyle = {{#ifeq: {{{styled|}}} | yes | background:#83C5DA; padding: 3px 0px | <!-- nothing --> }}
| labelstyle = {{#ifeq: {{{styled|}}} | yes | background:#DFEFFF; padding: 0px 7px; vertical-align: middle | <!-- nothing --> }}
| datastyle = {{#ifeq: {{{styled|}}} | yes | padding: 5px 5px; | <!-- nothing --> }}
| image = {{{image|}}}
| caption = {{{caption|}}}
| label1 = Description
| data1 = {{{description|}}}
| label2 = Author(s)
| data2 = {{{author|}}}
| label3 = Code source
| data3 = {{#if:{{{code|}}}|{{#ifeq:{{{code|}}}|{{{title|{{PAGENAME}}}}}||[[Module:{{{code|}}}]]}}}}
| label4 = Status
| data4 = {{#switch: {{lc:{{{status|}}}}}
| pre-alpha | prealpha | pa | experimental = <div style="background-color:orangered;color:white;text-align:center;padding:3px;">Experimental</div>
| alpha | a = <div style="background-color:orange;color:white;text-align:center;padding:3px;">Alpha</div>
| beta | b = <div style="background-color:yellow;color:black;text-align:center;padding:3px;">Beta</div>
| release | r | general | g | stable = <div style="background-color:green;color:white;text-align:center;padding:3px;">Release</div>
| broken | br | unstable = <div style="background-color:red;color:white;text-align:center;padding:3px;">Broken</div>
| deprecated | d | defunct = <div style="background-color:darkred;color:white;text-align:center;padding:3px;">Deprecated</div>
| #default = <div style="background-color:gray;color:white;text-align:center;padding:3px;">Unknown</div>
}}
| label5 = Testcase Status
| data5 = {{#ifexist:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases|{{#switch:{{#invoke:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases|run|displayMode=enum}}
| fail = <div style="background-color:red;color:white;text-align:center;padding:3px;">[[{{TALKPAGENAME:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases}}|<span style="background-color:red;color:white;text-align:center;">Errors</span>]]</div>
| skipped = <div style="background-color:gray;color:black;text-align:center;padding:3px;">[[{{TALKPAGENAME:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases}}|<span style="background-color:gray;color:black;text-align:center;">Skipped</span>]]</div>
| success = <div style="background-color:green;color:white;text-align:center;padding:3px;">[[{{TALKPAGENAME:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases}}|<span style="background-color:green;color:white;text-align:center;">Passed</span>]]</div>
| #default = <div style="background-color:gray;color:white;text-align:center;padding:3px;">Unknown</div>
}}}}
| label6 = Version
| data6 = {{{version|}}}
| label7 = Updated
| data7 = {{#time:F j, Y|{{{updated|{{REVISIONTIMESTAMP:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}}}}}}}} ({{time ago|1={{{updated|{{REVISIONTIMESTAMP:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}}}}}}}})
| label8 = Dependencies
| data8 = {{{dependencies|}}}
| label9 = Skins
| data9 = {{{skins|}}}
| label10 = Using code by
| data10 = {{{using code by|}}}
| label11 = License
| data11 = {{{license|}}}
| label12 = Other attribution
| data12 = {{{other attribution|}}}
}}<noinclude>
{{documentation}}
</noinclude>
17w9hv9iwsg0anyttkk7tytxrvovlzt
33422
33421
2026-11-11T21:55:16Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_Lua]]
33421
wikitext
text/x-wiki
{{Infobox
| bodyclass = infobox-lua
| bodystyle = {{#ifeq: {{{styled|}}} | yes | border: 2px ridge #CAE1FF; width: 30em; padding-bottom: 0px; | <!-- nothing --> }} {{{bodystyle|}}}
| title = {{{title|{{PAGENAME}}}}}
| above = {{#ifeq: {{{styled|}}} | yes | {{{name|{{SUBPAGENAME}}}}} | <!-- nothing --> }}
| titlestyle = {{#ifeq: {{{styled|}}} | yes | font-size: 0.95em; padding: 0px; margin: 0px | <!-- nothing --> }}
| abovestyle = {{#ifeq: {{{styled|}}} | yes | background:#83C5DA; padding: 3px 0px | <!-- nothing --> }}
| labelstyle = {{#ifeq: {{{styled|}}} | yes | background:#DFEFFF; padding: 0px 7px; vertical-align: middle | <!-- nothing --> }}
| datastyle = {{#ifeq: {{{styled|}}} | yes | padding: 5px 5px; | <!-- nothing --> }}
| image = {{{image|}}}
| caption = {{{caption|}}}
| label1 = Description
| data1 = {{{description|}}}
| label2 = Author(s)
| data2 = {{{author|}}}
| label3 = Code source
| data3 = {{#if:{{{code|}}}|{{#ifeq:{{{code|}}}|{{{title|{{PAGENAME}}}}}||[[Module:{{{code|}}}]]}}}}
| label4 = Status
| data4 = {{#switch: {{lc:{{{status|}}}}}
| pre-alpha | prealpha | pa | experimental = <div style="background-color:orangered;color:white;text-align:center;padding:3px;">Experimental</div>
| alpha | a = <div style="background-color:orange;color:white;text-align:center;padding:3px;">Alpha</div>
| beta | b = <div style="background-color:yellow;color:black;text-align:center;padding:3px;">Beta</div>
| release | r | general | g | stable = <div style="background-color:green;color:white;text-align:center;padding:3px;">Release</div>
| broken | br | unstable = <div style="background-color:red;color:white;text-align:center;padding:3px;">Broken</div>
| deprecated | d | defunct = <div style="background-color:darkred;color:white;text-align:center;padding:3px;">Deprecated</div>
| #default = <div style="background-color:gray;color:white;text-align:center;padding:3px;">Unknown</div>
}}
| label5 = Testcase Status
| data5 = {{#ifexist:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases|{{#switch:{{#invoke:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases|run|displayMode=enum}}
| fail = <div style="background-color:red;color:white;text-align:center;padding:3px;">[[{{TALKPAGENAME:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases}}|<span style="background-color:red;color:white;text-align:center;">Errors</span>]]</div>
| skipped = <div style="background-color:gray;color:black;text-align:center;padding:3px;">[[{{TALKPAGENAME:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases}}|<span style="background-color:gray;color:black;text-align:center;">Skipped</span>]]</div>
| success = <div style="background-color:green;color:white;text-align:center;padding:3px;">[[{{TALKPAGENAME:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}/testcases}}|<span style="background-color:green;color:white;text-align:center;">Passed</span>]]</div>
| #default = <div style="background-color:gray;color:white;text-align:center;padding:3px;">Unknown</div>
}}}}
| label6 = Version
| data6 = {{{version|}}}
| label7 = Updated
| data7 = {{#time:F j, Y|{{{updated|{{REVISIONTIMESTAMP:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}}}}}}}} ({{time ago|1={{{updated|{{REVISIONTIMESTAMP:Module:{{{source|{{{title|{{PAGENAME}}}}}}}}}}}}}}})
| label8 = Dependencies
| data8 = {{{dependencies|}}}
| label9 = Skins
| data9 = {{{skins|}}}
| label10 = Using code by
| data10 = {{{using code by|}}}
| label11 = License
| data11 = {{{license|}}}
| label12 = Other attribution
| data12 = {{{other attribution|}}}
}}<noinclude>
{{documentation}}
</noinclude>
17w9hv9iwsg0anyttkk7tytxrvovlzt
Tempilet:Lua autodoc
10
2673
33423
2024-09-26T02:22:47Z
en>Awesome Aasim
0
[[WP:AES|←]]Created page with '<includeonly>{{#invoke:Docbunto|main}}</includeonly><noinclude> {{documentation}} </noinclude>'
33423
wikitext
text/x-wiki
<includeonly>{{#invoke:Docbunto|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
io4wp1dpjy0cnp37az2fv47kkj2k6hm
33424
33423
2026-11-11T21:55:16Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Lua_autodoc]]
33423
wikitext
text/x-wiki
<includeonly>{{#invoke:Docbunto|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
io4wp1dpjy0cnp37az2fv47kkj2k6hm
Module:Docbunto/infobox
828
2674
33425
2026-06-08T03:19:07Z
en>Awesome Aasim
0
33425
Scribunto
text/plain
--- Infobox for Lua modules.
-- @script infobox
-- @param {table} data Taglet documentation data.
-- @param {string} codepage Code page name.
-- @param {table} frame Template invocation frame.
-- @param {table} options Docbunto configuration options.
-- @return {string} Infobox wikitext.
return function(data, codepage, frame, options, title, maybe_md)
local module_rating_box = {}
if data.info and data.info['release'] then
module_rating_box.title = 'Module rating'
module_rating_box.args = {}
module_rating_box.args[1] = data.info['release']
end
local statusHeader = ''
if module_rating_box.title then
statusHeader = data.info and data.info['release']
and frame:expandTemplate{
title = module_rating_box.title,
args = module_rating_box.args
} or ''
end
local modules = data.info and data.info['require'] and mw.text.split(data.info['require']
:gsub('^[^[%s]+$', '%1')
:gsub('%* ([^[%s]+)', '%1'), '\n') or {}
for k,v in ipairs(modules) do
modules[k] = v
end
local dependencies = ''
if #modules ~= 0 then
dependencies = require("Module:Lua banner").renderBox(modules)
end
if not options.autodoc then
dependencies = ''
statusHeader = ''
end
local infobox = {}
infobox.title = 'Infobox Lua'
infobox.args = {}
if codepage ~= mw.text.split(title.text, '/')[2] then
infobox.args['title'] = codepage
infobox.args['code'] = codepage
end
if options.image or ( data.info and data.info['image'] ) then
infobox.args['image file'] = data.info['image']
end
if options.caption or ( data.info and data.info['caption'] ) then
infobox.args['image caption'] = frame:preprocess(maybe_md(
options.caption or data.info['caption']
))
end
infobox.args['type'] = data.type == 'module' and 'invocable' or 'meta'
if data.info and data.info['release'] then
infobox.args['status'] = data.info and data.info['release']
end
if data.summary then
local description = data.summary
if description:find('^(' .. codepage .. ')') then
description = description:gsub('^' .. codepage .. '%s(%w)', mw.ustring.upper)
end
infobox.args['description'] = frame:preprocess(maybe_md(description))
end
if data.info and data.info['author'] then
infobox.args['author'] = frame:preprocess(maybe_md(data.info['author']))
end
if data.info and data.info['attribution'] then
infobox.args['using code by'] = frame:preprocess(maybe_md(data.info['attribution']))
end
if data.info and data.info['credit'] then
infobox.args['other attribution'] = frame:preprocess(maybe_md(data.info['credit']))
end
if data.info and data.info['license'] then
infobox.args['license'] = frame:preprocess(maybe_md(data.info['license']))
end
if data.info and data.info['require'] then
local req = data.info['require']
:gsub('^[^[%s]+$', '[[%1]]')
:gsub('%* ([^[%s]+)', '* [[%1]]')
infobox.args['dependencies'] = frame:preprocess(maybe_md(req))
end
if codepage ~= 'I18n' and data.code:find('[\'"]Module:I18n[\'"]') then
infobox.args['languages'] = 'auto'
elseif data.code:find('mw%.message%.new') then
infobox.args['languages'] = 'mw'
end
if data.info and data.info['demo'] then
infobox.args['examples'] = frame:preprocess(maybe_md(data.info['demo']))
end
return statusHeader .. dependencies .. frame:expandTemplate(infobox)
end
1t8sky8u88tcgb3wx7rl184tu7c7jbw
33426
33425
2026-11-11T21:55:16Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Docbunto/infobox]]
33425
Scribunto
text/plain
--- Infobox for Lua modules.
-- @script infobox
-- @param {table} data Taglet documentation data.
-- @param {string} codepage Code page name.
-- @param {table} frame Template invocation frame.
-- @param {table} options Docbunto configuration options.
-- @return {string} Infobox wikitext.
return function(data, codepage, frame, options, title, maybe_md)
local module_rating_box = {}
if data.info and data.info['release'] then
module_rating_box.title = 'Module rating'
module_rating_box.args = {}
module_rating_box.args[1] = data.info['release']
end
local statusHeader = ''
if module_rating_box.title then
statusHeader = data.info and data.info['release']
and frame:expandTemplate{
title = module_rating_box.title,
args = module_rating_box.args
} or ''
end
local modules = data.info and data.info['require'] and mw.text.split(data.info['require']
:gsub('^[^[%s]+$', '%1')
:gsub('%* ([^[%s]+)', '%1'), '\n') or {}
for k,v in ipairs(modules) do
modules[k] = v
end
local dependencies = ''
if #modules ~= 0 then
dependencies = require("Module:Lua banner").renderBox(modules)
end
if not options.autodoc then
dependencies = ''
statusHeader = ''
end
local infobox = {}
infobox.title = 'Infobox Lua'
infobox.args = {}
if codepage ~= mw.text.split(title.text, '/')[2] then
infobox.args['title'] = codepage
infobox.args['code'] = codepage
end
if options.image or ( data.info and data.info['image'] ) then
infobox.args['image file'] = data.info['image']
end
if options.caption or ( data.info and data.info['caption'] ) then
infobox.args['image caption'] = frame:preprocess(maybe_md(
options.caption or data.info['caption']
))
end
infobox.args['type'] = data.type == 'module' and 'invocable' or 'meta'
if data.info and data.info['release'] then
infobox.args['status'] = data.info and data.info['release']
end
if data.summary then
local description = data.summary
if description:find('^(' .. codepage .. ')') then
description = description:gsub('^' .. codepage .. '%s(%w)', mw.ustring.upper)
end
infobox.args['description'] = frame:preprocess(maybe_md(description))
end
if data.info and data.info['author'] then
infobox.args['author'] = frame:preprocess(maybe_md(data.info['author']))
end
if data.info and data.info['attribution'] then
infobox.args['using code by'] = frame:preprocess(maybe_md(data.info['attribution']))
end
if data.info and data.info['credit'] then
infobox.args['other attribution'] = frame:preprocess(maybe_md(data.info['credit']))
end
if data.info and data.info['license'] then
infobox.args['license'] = frame:preprocess(maybe_md(data.info['license']))
end
if data.info and data.info['require'] then
local req = data.info['require']
:gsub('^[^[%s]+$', '[[%1]]')
:gsub('%* ([^[%s]+)', '* [[%1]]')
infobox.args['dependencies'] = frame:preprocess(maybe_md(req))
end
if codepage ~= 'I18n' and data.code:find('[\'"]Module:I18n[\'"]') then
infobox.args['languages'] = 'auto'
elseif data.code:find('mw%.message%.new') then
infobox.args['languages'] = 'mw'
end
if data.info and data.info['demo'] then
infobox.args['examples'] = frame:preprocess(maybe_md(data.info['demo']))
end
return statusHeader .. dependencies .. frame:expandTemplate(infobox)
end
1t8sky8u88tcgb3wx7rl184tu7c7jbw
Module:Deprecated
828
2675
33427
2025-05-27T19:00:29Z
en>Awesome Aasim
0
33427
Scribunto
text/plain
--- Marks items as deprecated, and provides a warning when they are called.
--
-- ## Limitations ##
-- This module will not provide a warning if a deprecated item is called from
-- within the same module that this module is used.
--
-- @release alpha
-- @author [[User:Awesome_Aasim|Awesome Aasim]]
-- @function deprecated
-- @param {table} p package frame
-- @param deprecatedTable
-- @return package
return function(p, deprecatedTable, replacement)
local pckg = {}
--- Warn
-- @param {string} text warning text
function warn(text)
local tb = debug.traceback()
mw.log(text .. '\n' .. tb)
mw.addWarning(text .. tb:gsub("\n", "<br/>"):gsub("\t", " "))
end
if deprecatedTable == nil or deprecatedTable == true then
deprecatedTable = {}
for k,_ in pairs(p) do
deprecatedTable[k] = {
deprecated = true,
replacement = replacement or ""
}
end
end
setmetatable(pckg, {
__index = function(t, index)
if deprecatedTable[index] and deprecatedTable[index]["deprecated"] then
warn(
mw.ustring.format(
"Deprecated member <code>%s</code> called. ", index
) .. (
deprecatedTable[index]["replacement"]
and mw.ustring.format("Please %s instead.", deprecatedTable[index]["replacement"])
or ''
)
)
end
return p[index]
end
})
return pckg
end
my1p1xp76qgfnvctx8pevv0cvz0hjyb
33428
33427
2026-11-11T21:55:16Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Deprecated]]
33427
Scribunto
text/plain
--- Marks items as deprecated, and provides a warning when they are called.
--
-- ## Limitations ##
-- This module will not provide a warning if a deprecated item is called from
-- within the same module that this module is used.
--
-- @release alpha
-- @author [[User:Awesome_Aasim|Awesome Aasim]]
-- @function deprecated
-- @param {table} p package frame
-- @param deprecatedTable
-- @return package
return function(p, deprecatedTable, replacement)
local pckg = {}
--- Warn
-- @param {string} text warning text
function warn(text)
local tb = debug.traceback()
mw.log(text .. '\n' .. tb)
mw.addWarning(text .. tb:gsub("\n", "<br/>"):gsub("\t", " "))
end
if deprecatedTable == nil or deprecatedTable == true then
deprecatedTable = {}
for k,_ in pairs(p) do
deprecatedTable[k] = {
deprecated = true,
replacement = replacement or ""
}
end
end
setmetatable(pckg, {
__index = function(t, index)
if deprecatedTable[index] and deprecatedTable[index]["deprecated"] then
warn(
mw.ustring.format(
"Deprecated member <code>%s</code> called. ", index
) .. (
deprecatedTable[index]["replacement"]
and mw.ustring.format("Please %s instead.", deprecatedTable[index]["replacement"])
or ''
)
)
end
return p[index]
end
})
return pckg
end
my1p1xp76qgfnvctx8pevv0cvz0hjyb
Tempilet:URL
10
2678
33430
2019-11-18T00:50:36Z
en>Jonesey95
0
Adding unknown parameter tracking through [[:Category:Pages using URL template with unknown parameters]] using [[Module:check for unknown parameters]]
33430
wikitext
text/x-wiki
<includeonly>{{#invoke:URL|url}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using URL template with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:URL]] with unknown parameter "_VALUE_"|ignoreblank=y | 1 | 2 }}<noinclude>{{documentation}}</noinclude>
a3iaiir0mhs0y2mdlkbw2snyhxnxqwu
33431
33430
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Template:URL]]
33430
wikitext
text/x-wiki
<includeonly>{{#invoke:URL|url}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using URL template with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:URL]] with unknown parameter "_VALUE_"|ignoreblank=y | 1 | 2 }}<noinclude>{{documentation}}</noinclude>
a3iaiir0mhs0y2mdlkbw2snyhxnxqwu
Tempilet:Snd
10
2679
33432
2018-02-23T16:30:27Z
en>Primefac
0
Changed protection level for "[[Template:Snd]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33432
wikitext
text/x-wiki
#REDIRECT [[Template:Spaced en dash]]
{{Redirect category shell|
{{R from template shortcut}}
}}
6y1jf3vhhwxcerubucgqprgobpyko43
33433
33432
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Snd]]
33432
wikitext
text/x-wiki
#REDIRECT [[Template:Spaced en dash]]
{{Redirect category shell|
{{R from template shortcut}}
}}
6y1jf3vhhwxcerubucgqprgobpyko43
Tempilet:Spaced en dash
10
2680
33434
2026-02-16T22:55:52Z
en>Mclay1
0
updating hidden note
33434
wikitext
text/x-wiki
– <noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
49sm01rc15z5lq8edlf4iu1hcr5naq8
33435
33434
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Spaced_en_dash]]
33434
wikitext
text/x-wiki
– <noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
49sm01rc15z5lq8edlf4iu1hcr5naq8
Module:Wd
828
2681
33436
2026-11-05T22:01:06Z
en>Janhrach
0
update from sandbox [[Module talk:Wd#Proposed update: customizable snak-->param rendering, related changes, misc. bugfixes]]
33436
Scribunto
text/plain
-- Original module located at [[:en:Module:Wd]] and [[:en:Module:Wd/i18n]].
require("strict")
local p = {}
local module_arg = ...
local i18n
local i18nPath
local function loadI18n(aliasesP, frame)
local title
if frame then
-- current module invoked by page/template, get its title from frame
title = frame:getTitle()
else
-- current module included by other module, get its title from ...
title = module_arg
end
if not i18n then
i18nPath = title .. "/i18n"
i18n = require(i18nPath).init(aliasesP)
end
end
p.claimCommands = {
property = "property",
properties = "properties",
qualifier = "qualifier",
qualifiers = "qualifiers",
reference = "reference",
references = "references"
}
p.generalCommands = {
label = "label",
title = "title",
description = "description",
alias = "alias",
aliases = "aliases",
badge = "badge",
badges = "badges"
}
p.flags = {
linked = "linked",
short = "short",
raw = "raw",
multilanguage = "multilanguage",
unit = "unit",
-------------
preferred = "preferred",
normal = "normal",
deprecated = "deprecated",
best = "best",
future = "future",
current = "current",
former = "former",
edit = "edit",
editAtEnd = "edit@end",
mdy = "mdy",
single = "single",
sourced = "sourced"
}
p.args = {
eid = "eid",
page = "page",
date = "date",
globalSiteId = "globalSiteId"
}
local aliasesP = {
coord = "P625",
-----------------------
image = "P18",
author = "P50",
authorNameString = "P2093",
publisher = "P123",
importedFrom = "P143",
wikimediaImportURL = "P4656",
statedIn = "P248",
pages = "P304",
language = "P407",
wikimediaLanguageCode = "P424",
hasPart = "P527",
publicationDate = "P577",
startTime = "P580",
endTime = "P582",
chapter = "P792",
retrieved = "P813",
referenceURL = "P854",
sectionVerseOrParagraph = "P958",
archiveURL = "P1065",
title = "P1476",
formatterURL = "P1630",
quote = "P1683",
shortName = "P1813",
definingFormula = "P2534",
archiveDate = "P2960",
inferredFrom = "P3452",
typeOfReference = "P3865",
column = "P3903",
subjectNamedAs = "P1810",
wikidataProperty = "P1687",
publishedIn = "P1433",
lastUpdate = "P5017"
}
local aliasesQ = {
percentage = "Q11229",
prolepticJulianCalendar = "Q1985786",
citeWeb = "Q5637226",
citeQ = "Q22321052"
}
local parameters = {
property = "%p",
qualifier = "%q",
reference = "%r",
alias = "%a",
badge = "%b",
separator = "%s",
general = "%x"
}
local formats = {
property = "%p[%s][%r]",
qualifier = "%q[%s][%r]",
reference = "%r",
propertyWithQualifier = "%p[ <span style=\"font-size:85\\%\">(%q)</span>][%s][%r]",
alias = "%a[%s]",
badge = "%b[%s]"
}
local hookNames = { -- {level_1, level_2}
[parameters.property] = {"getProperty"},
[parameters.reference] = {"getReferences", "getReference"},
[parameters.qualifier] = {"getAllQualifiers"},
[parameters.qualifier.."\\d"] = {"getQualifiers", "getQualifier"},
[parameters.alias] = {"getAlias"},
[parameters.badge] = {"getBadge"}
}
-- default value objects, should NOT be mutated but instead copied
local defaultSeparators = {
["sep"] = {" "},
["sep%s"] = {","},
["sep%q"] = {"; "},
["sep%q\\d"] = {", "},
["sep%r"] = nil, -- none
["punc"] = nil -- none
}
local rankTable = {
["preferred"] = 1,
["normal"] = 2,
["deprecated"] = 3
}
local function replaceAlias(id)
if aliasesP[id] then
id = aliasesP[id]
end
return id
end
local function errorText(code, ...)
local text = i18n["errors"][code]
if arg then text = mw.ustring.format(text, unpack(arg)) end
return text
end
local function throwError(errorMessage, ...)
error(errorText(errorMessage, unpack(arg)))
end
local function replaceDecimalMark(num)
return mw.ustring.gsub(num, "[.]", i18n['numeric']['decimal-mark'], 1)
end
local function padZeros(num, numDigits)
local numZeros
local negative = false
if num < 0 then
negative = true
num = num * -1
end
num = tostring(num)
numZeros = numDigits - num:len()
for _ = 1, numZeros do
num = "0"..num
end
if negative then
num = "-"..num
end
return num
end
local function replaceSpecialChar(chr)
if chr == '_' then
-- replace underscores with spaces
return ' '
else
return chr
end
end
local function replaceSpecialChars(str)
local chr
local esc = false
local strOut = ""
for i = 1, #str do
chr = str:sub(i,i)
if not esc then
if chr == '\\' then
esc = true
else
strOut = strOut .. replaceSpecialChar(chr)
end
else
strOut = strOut .. chr
esc = false
end
end
return strOut
end
local function buildWikilink(target, label)
if not label or target == label then
return "[[" .. target .. "]]"
else
return "[[" .. target .. "|" .. label .. "]]"
end
end
-- used to make frame.args mutable, to replace #frame.args (which is always 0)
-- with the actual amount and to simply copy tables
local function copyTable(tIn)
if not tIn then
return nil
end
local tOut = {}
for i, v in pairs(tIn) do
tOut[i] = v
end
return tOut
end
-- used to merge output arrays together;
-- note that it currently mutates the first input array
local function mergeArrays(a1, a2)
for i = 1, #a2 do
a1[#a1 + 1] = a2[i]
end
return a1
end
local function split(str, del)
local out = {}
local i, j = str:find(del)
if i and j then
out[1] = str:sub(1, i - 1)
out[2] = str:sub(j + 1)
else
out[1] = str
end
return out
end
local function parseWikidataURL(url)
local id
if url:match('^http[s]?://') then
id = split(url, "Q")
if id[2] then
return "Q" .. id[2]
end
end
return nil
end
local function parseDate(dateStr, precision)
precision = precision or "d"
local i, j, index, ptr
local parts = {nil, nil, nil}
if dateStr == nil then
return parts[1], parts[2], parts[3] -- year, month, day
end
-- 'T' for snak values, '/' for outputs with '/Julian' attached
i, j = dateStr:find("[T/]")
if i then
dateStr = dateStr:sub(1, i-1)
end
local from = 1
if dateStr:sub(1,1) == "-" then
-- this is a negative number, look further ahead
from = 2
end
index = 1
ptr = 1
i, j = dateStr:find("-", from)
if i then
-- year
parts[index] = tonumber(dateStr:sub(ptr, i-1), 10) -- explicitly give base 10 to prevent error
if parts[index] == -0 then
parts[index] = tonumber("0") -- for some reason, 'parts[index] = 0' may actually store '-0', so parse from string instead
end
if precision == "y" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
i, j = dateStr:find("-", ptr)
if i then
-- month
parts[index] = tonumber(dateStr:sub(ptr, i-1), 10)
if precision == "m" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
end
end
if dateStr:sub(ptr) ~= "" then
-- day if we have month, month if we have year, or year
parts[index] = tonumber(dateStr:sub(ptr), 10)
end
return parts[1], parts[2], parts[3] -- year, month, day
end
local function datePrecedesDate(aY, aM, aD, bY, bM, bD)
if aY == nil or bY == nil then
return nil
end
aM = aM or 1
aD = aD or 1
bM = bM or 1
bD = bD or 1
if aY < bY then
return true
end
if aY > bY then
return false
end
if aM < bM then
return true
end
if aM > bM then
return false
end
if aD < bD then
return true
end
return false
end
local function getHookName(param, index)
if hookNames[param] then
return hookNames[param][index]
elseif param:len() > 2 then
return hookNames[param:sub(1, 2).."\\d"][index]
else
return nil
end
end
local function alwaysTrue()
return true
end
-- The following function parses a format string.
--
-- The example below shows how a parsed string is structured in memory.
-- Variables other than 'str' and 'child' are left out for clarity's sake.
--
-- Example:
-- "A %p B [%s[%q1]] C [%r] D"
--
-- Structure:
-- [
-- {
-- str = "A "
-- },
-- {
-- str = "%p"
-- },
-- {
-- str = " B ",
-- child =
-- [
-- {
-- str = "%s",
-- child =
-- [
-- {
-- str = "%q1"
-- }
-- ]
-- }
-- ]
-- },
-- {
-- str = " C ",
-- child =
-- [
-- {
-- str = "%r"
-- }
-- ]
-- },
-- {
-- str = " D"
-- }
-- ]
--
local function parseFormat(str)
local chr, esc, param, root, cur, prev, new
local params = {}
local function newObject(array)
local obj = {} -- new object
obj.str = ""
array[#array + 1] = obj -- array{object}
obj.parent = array
return obj
end
local function endParam()
if param > 0 then
if cur.str ~= "" then
cur.str = "%"..cur.str
cur.param = true
params[cur.str] = true
cur.parent.req[cur.str] = true
prev = cur
cur = newObject(cur.parent)
end
param = 0
end
end
root = {} -- array
root.req = {}
cur = newObject(root)
prev = nil
esc = false
param = 0
for i = 1, #str do
chr = str:sub(i,i)
if not esc then
if chr == '\\' then
endParam()
esc = true
elseif chr == '%' then
endParam()
if cur.str ~= "" then
cur = newObject(cur.parent)
end
param = 2
elseif chr == '[' then
endParam()
if prev and cur.str == "" then
table.remove(cur.parent)
cur = prev
end
cur.child = {} -- new array
cur.child.req = {}
cur.child.parent = cur
cur = newObject(cur.child)
elseif chr == ']' then
endParam()
if cur.parent.parent then
new = newObject(cur.parent.parent.parent)
if cur.str == "" then
table.remove(cur.parent)
end
cur = new
end
else
if param > 1 then
param = param - 1
elseif param == 1 then
if not chr:match('%d') then
endParam()
end
end
cur.str = cur.str .. replaceSpecialChar(chr)
end
else
cur.str = cur.str .. chr
esc = false
end
prev = nil
end
endParam()
-- make sure that at least one required parameter has been defined
if not next(root.req) then
throwError("missing-required-parameter")
end
-- make sure that the separator parameter "%s" is not amongst the required parameters
if root.req[parameters.separator] then
throwError("extra-required-parameter", parameters.separator)
end
return root, params
end
local function sortOnRank(claims)
local rankPos
local ranks = {{}, {}, {}, {}} -- preferred, normal, deprecated, (default)
local sorted = {}
for _, v in ipairs(claims) do
rankPos = rankTable[v.rank] or 4
ranks[rankPos][#ranks[rankPos] + 1] = v
end
sorted = ranks[1]
sorted = mergeArrays(sorted, ranks[2])
sorted = mergeArrays(sorted, ranks[3])
return sorted
end
local function isValueInTable(searchedItem, inputTable)
for _, item in pairs(inputTable) do
if item == searchedItem then
return true
end
end
return false
end
local Config = {}
-- allows for recursive calls
function Config:new()
local cfg = {}
setmetatable(cfg, self)
self.__index = self
cfg.separators = {
-- single value objects wrapped in arrays so that we can pass by reference
["sep"] = {copyTable(defaultSeparators["sep"])},
["sep%s"] = {copyTable(defaultSeparators["sep%s"])},
["sep%q"] = {copyTable(defaultSeparators["sep%q"])},
["sep%r"] = {copyTable(defaultSeparators["sep%r"])},
["punc"] = {copyTable(defaultSeparators["punc"])}
}
cfg.entity = nil
cfg.entityID = nil
cfg.propertyID = nil
cfg.propertyValue = nil
cfg.qualifierIDs = {}
cfg.qualifierIDsAndValues = {}
cfg.bestRank = true
cfg.ranks = {true, true, false} -- preferred = true, normal = true, deprecated = false
cfg.foundRank = #cfg.ranks
cfg.flagBest = false
cfg.flagRank = false
cfg.periods = {true, true, true} -- future = true, current = true, former = true
cfg.flagPeriod = false
cfg.atDate = {parseDate(os.date('!%Y-%m-%d'))} -- today as {year, month, day}
cfg.mdyDate = false
cfg.singleClaim = false
cfg.sourcedOnly = false
cfg.editable = false
cfg.editAtEnd = false
cfg.inSitelinks = false
cfg.langCode = mw.language.getContentLanguage().code
cfg.langName = mw.language.fetchLanguageName(cfg.langCode, cfg.langCode)
cfg.langObj = mw.language.new(cfg.langCode)
cfg.siteID = mw.wikibase.getGlobalSiteId()
cfg.states = {}
cfg.states.qualifiersCount = 0
cfg.curState = nil
cfg.prefetchedRefs = nil
return cfg
end
local State = {}
function State:new(cfg, type)
local stt = {}
setmetatable(stt, self)
self.__index = self
stt.conf = cfg
stt.type = type
stt.results = {}
stt.parsedFormat = {}
stt.separator = {}
stt.movSeparator = {}
stt.puncMark = {}
stt.linked = false
stt.rawValue = false
stt.shortName = false
stt.anyLanguage = false
stt.unitOnly = false
stt.singleValue = false
return stt
end
-- if id == nil then item connected to current page is used
function Config:getLabel(id, raw, link, short)
local label = nil
local prefix, title= "", nil
if not id then
id = mw.wikibase.getEntityIdForCurrentPage()
if not id then
return ""
end
end
id = id:upper() -- just to be sure
if raw then
-- check if given id actually exists
if mw.wikibase.isValidEntityId(id) and mw.wikibase.entityExists(id) then
label = id
end
prefix, title = "d:Special:EntityPage/", label -- may be nil
else
-- try short name first if requested
if short then
label = p._property{aliasesP.shortName, [p.args.eid] = id} -- get short name
if label == "" then
label = nil
end
end
-- get label
if not label then
label = mw.wikibase.getLabel(id)
end
end
if not label then
label = ""
elseif link then
-- build a link if requested
if not title then
if id:sub(1,1) == "Q" then
title = mw.wikibase.getSitelink(id)
elseif id:sub(1,1) == "P" then
-- properties have no sitelink, link to Wikidata instead
prefix, title = "d:Special:EntityPage/", id
end
end
label = mw.text.nowiki(label) -- escape raw label text so it cannot be wikitext markup
if title then
label = buildWikilink(prefix .. title, label)
end
end
return label
end
function Config:getEditIcon()
local value = ""
local prefix = ""
local front = " "
local back = ""
if self.entityID:sub(1,1) == "P" then
prefix = "Property:"
end
if self.editAtEnd then
front = '<span style="float:'
if self.langObj:isRTL() then
front = front .. 'left'
else
front = front .. 'right'
end
front = front .. '">'
back = '</span>'
end
value = "[[File:OOjs UI icon edit-ltr-progressive.svg|frameless|text-top|10px|alt=" .. i18n['info']['edit-on-wikidata'] .. "|link=https://www.wikidata.org/wiki/" .. prefix .. self.entityID .. "?uselang=" .. self.langCode
if self.propertyID then
value = value .. "#" .. self.propertyID
elseif self.inSitelinks then
value = value .. "#sitelinks-wikipedia"
end
value = value .. "|" .. i18n['info']['edit-on-wikidata'] .. "]]"
return front .. value .. back
end
-- used to create the final output string when it's all done, so that for references the
-- function extensionTag("ref", ...) is only called when they really ended up in the final output
function Config:concatValues(valuesArray)
local outString = ""
local j, skip
for i = 1, #valuesArray do
-- check if this is a reference
if valuesArray[i].refHash then
j = i - 1
skip = false
-- skip this reference if it is part of a continuous row of references that already contains the exact same reference
while valuesArray[j] and valuesArray[j].refHash do
if valuesArray[i].refHash == valuesArray[j].refHash then
skip = true
break
end
j = j - 1
end
if not skip then
-- add <ref> tag with the reference's hash as its name (to deduplicate references)
outString = outString .. mw.getCurrentFrame():extensionTag("ref", valuesArray[i][1], {name = valuesArray[i].refHash})
end
else
outString = outString .. valuesArray[i][1]
end
end
return outString
end
function Config:convertUnit(unit, raw, link, short, unitOnly)
local space = " "
local label = ""
local itemID
if unit == "" or unit == "1" then
return nil
end
if unitOnly then
space = ""
end
itemID = parseWikidataURL(unit)
if itemID then
if itemID == aliasesQ.percentage then
return "%"
else
label = self:getLabel(itemID, raw, link, short)
if label ~= "" then
return space .. label
end
end
end
return ""
end
function State:getValue(snak)
return self.conf:getValue(snak, self.rawValue, self.linked, self.shortName, self.anyLanguage, self.unitOnly, false, self.type:sub(1,2))
end
function Config:getValue(snak, raw, link, short, anyLang, unitOnly, noSpecial, type)
if snak.snaktype == 'value' then
local datatype = snak.datavalue.type
local subtype = snak.datatype
local datavalue = snak.datavalue.value
if datatype == 'string' then
if subtype == 'url' and link then
-- create link explicitly
if raw then
-- will render as a linked number like [1]
return "[" .. datavalue .. "]"
else
return "[" .. datavalue .. " " .. datavalue .. "]"
end
elseif subtype == 'commonsMedia' then
if link then
return buildWikilink("c:File:" .. datavalue, datavalue)
elseif not raw then
return "[[File:" .. datavalue .. "]]"
else
return datavalue
end
elseif subtype == 'geo-shape' and link then
return buildWikilink("c:" .. datavalue, datavalue)
elseif subtype == 'math' and not raw then
local attribute = nil
if (type == parameters.property or (type == parameters.qualifier and self.propertyID == aliasesP.hasPart)) and snak.property == aliasesP.definingFormula then
attribute = {qid = self.entityID}
end
return mw.getCurrentFrame():extensionTag("math", datavalue, attribute)
elseif subtype == 'external-id' and link then
local url = p._property{p.flags.raw, aliasesP.formatterURL, [p.args.eid] = snak.property} -- get formatter URL
if url ~= "" then
url = mw.ustring.gsub(url, "$1", datavalue)
return "[" .. url .. " " .. datavalue .. "]"
else
return datavalue
end
else
return datavalue
end
elseif datatype == 'monolingualtext' then
if anyLang or datavalue['language'] == self.langCode then
return datavalue['text']
else
return nil
end
elseif datatype == 'quantity' then
local value = ""
local unit
if not unitOnly then
-- get value and strip + signs from front
value = mw.ustring.gsub(datavalue['amount'], "^%+(.+)$", "%1")
if raw then
return value
end
-- replace decimal mark based on locale
value = replaceDecimalMark(value)
-- add delimiters for readability
value = i18n.addDelimiters(value)
end
unit = self:convertUnit(datavalue['unit'], raw, link, short, unitOnly)
if unit then
value = value .. unit
end
return value
elseif datatype == 'time' then
local y, m, d, p, yDiv, yRound, yFull, value, calendarID, dateStr
local yFactor = 1
local sign = 1
local prefix = ""
local suffix = ""
local mayAddCalendar = false
local calendar = ""
local precision = datavalue['precision']
if precision == 11 then
p = "d"
elseif precision == 10 then
p = "m"
else
p = "y"
yFactor = 10^(9-precision)
end
y, m, d = parseDate(datavalue['time'], p)
if y < 0 then
sign = -1
y = y * sign
end
-- if precision is tens/hundreds/thousands/millions/billions of years
if precision <= 8 then
yDiv = y / yFactor
-- if precision is tens/hundreds/thousands of years
if precision >= 6 then
mayAddCalendar = true
if precision <= 7 then
-- round centuries/millenniums up (e.g. 20th century or 3rd millennium)
yRound = math.ceil(yDiv)
if not raw then
if precision == 6 then
suffix = i18n['datetime']['suffixes']['millennium']
else
suffix = i18n['datetime']['suffixes']['century']
end
suffix = i18n.getOrdinalSuffix(yRound) .. suffix
else
-- if not verbose, take the first year of the century/millennium
-- (e.g. 1901 for 20th century or 2001 for 3rd millennium)
yRound = (yRound - 1) * yFactor + 1
end
else
-- precision == 8
-- round decades down (e.g. 2010s)
yRound = math.floor(yDiv) * yFactor
if not raw then
prefix = i18n['datetime']['prefixes']['decade-period']
suffix = i18n['datetime']['suffixes']['decade-period']
end
end
if raw and sign < 0 then
-- if BCE then compensate for "counting backwards"
-- (e.g. -2019 for 2010s BCE, -2000 for 20th century BCE or -3000 for 3rd millennium BCE)
yRound = yRound + yFactor - 1
end
else
local yReFactor, yReDiv, yReRound
-- round to nearest for tens of thousands of years or more
yRound = math.floor(yDiv + 0.5)
if yRound == 0 then
if precision <= 2 and y ~= 0 then
yReFactor = 1e6
yReDiv = y / yReFactor
yReRound = math.floor(yReDiv + 0.5)
if yReDiv == yReRound then
-- change precision to millions of years only if we have a whole number of them
precision = 3
yFactor = yReFactor
yRound = yReRound
end
end
if yRound == 0 then
-- otherwise, take the unrounded (original) number of years
precision = 5
yFactor = 1
yRound = y
mayAddCalendar = true
end
end
if precision >= 1 and y ~= 0 then
yFull = yRound * yFactor
yReFactor = 1e9
yReDiv = yFull / yReFactor
yReRound = math.floor(yReDiv + 0.5)
if yReDiv == yReRound then
-- change precision to billions of years if we're in that range
precision = 0
yFactor = yReFactor
yRound = yReRound
else
yReFactor = 1e6
yReDiv = yFull / yReFactor
yReRound = math.floor(yReDiv + 0.5)
if yReDiv == yReRound then
-- change precision to millions of years if we're in that range
precision = 3
yFactor = yReFactor
yRound = yReRound
end
end
end
if not raw then
if precision == 3 then
suffix = i18n['datetime']['suffixes']['million-years']
elseif precision == 0 then
suffix = i18n['datetime']['suffixes']['billion-years']
else
yRound = yRound * yFactor
if yRound == 1 then
suffix = i18n['datetime']['suffixes']['year']
else
suffix = i18n['datetime']['suffixes']['years']
end
end
else
yRound = yRound * yFactor
end
end
else
yRound = y
mayAddCalendar = true
end
if mayAddCalendar then
calendarID = parseWikidataURL(datavalue['calendarmodel'])
if calendarID and calendarID == aliasesQ.prolepticJulianCalendar then
if not raw then
if link then
calendar = " ("..buildWikilink(i18n['datetime']['julian-calendar'], i18n['datetime']['julian'])..")"
else
calendar = " ("..i18n['datetime']['julian']..")"
end
else
calendar = "/"..i18n['datetime']['julian']
end
end
end
if not raw then
local ce = nil
if sign < 0 then
ce = i18n['datetime']['BCE']
elseif precision <= 5 then
ce = i18n['datetime']['CE']
end
if ce then
if link then
ce = buildWikilink(i18n['datetime']['common-era'], ce)
end
suffix = suffix .. " " .. ce
end
value = tostring(yRound)
if m then
dateStr = self.langObj:formatDate("F", "1-"..m.."-1")
if d then
if self.mdyDate then
dateStr = dateStr .. " " .. d .. ","
else
dateStr = d .. " " .. dateStr
end
end
value = dateStr .. " " .. value
end
value = prefix .. value .. suffix .. calendar
else
value = padZeros(yRound * sign, 4)
if m then
value = value .. "-" .. padZeros(m, 2)
if d then
value = value .. "-" .. padZeros(d, 2)
end
end
value = value .. calendar
end
return value
elseif datatype == 'globecoordinate' then
-- logic from https://github.com/DataValues/Geo (v4.0.1)
local precision, unitsPerDegree, numDigits, strFormat, value, globe
local latitude, latConv, latValue, latLink
local longitude, lonConv, lonValue, lonLink
local latDirection, latDirectionN, latDirectionS, latDirectionEN
local lonDirection, lonDirectionE, lonDirectionW, lonDirectionEN
local degSymbol, minSymbol, secSymbol, separator
local latDegrees = nil
local latMinutes = nil
local latSeconds = nil
local lonDegrees = nil
local lonMinutes = nil
local lonSeconds = nil
local latDegSym = ""
local latMinSym = ""
local latSecSym = ""
local lonDegSym = ""
local lonMinSym = ""
local lonSecSym = ""
local latDirectionEN_N = "N"
local latDirectionEN_S = "S"
local lonDirectionEN_E = "E"
local lonDirectionEN_W = "W"
if not raw then
latDirectionN = i18n['coord']['latitude-north']
latDirectionS = i18n['coord']['latitude-south']
lonDirectionE = i18n['coord']['longitude-east']
lonDirectionW = i18n['coord']['longitude-west']
degSymbol = i18n['coord']['degrees']
minSymbol = i18n['coord']['minutes']
secSymbol = i18n['coord']['seconds']
separator = i18n['coord']['separator']
else
latDirectionN = latDirectionEN_N
latDirectionS = latDirectionEN_S
lonDirectionE = lonDirectionEN_E
lonDirectionW = lonDirectionEN_W
degSymbol = "/"
minSymbol = "/"
secSymbol = "/"
separator = "/"
end
latitude = datavalue['latitude']
longitude = datavalue['longitude']
if latitude < 0 then
latDirection = latDirectionS
latDirectionEN = latDirectionEN_S
latitude = math.abs(latitude)
else
latDirection = latDirectionN
latDirectionEN = latDirectionEN_N
end
if longitude < 0 then
lonDirection = lonDirectionW
lonDirectionEN = lonDirectionEN_W
longitude = math.abs(longitude)
else
lonDirection = lonDirectionE
lonDirectionEN = lonDirectionEN_E
end
precision = datavalue['precision']
if not precision or precision <= 0 then
precision = 1 / 3600 -- precision not set (correctly), set to arcsecond
end
-- remove insignificant detail
latitude = math.floor(latitude / precision + 0.5) * precision
longitude = math.floor(longitude / precision + 0.5) * precision
if precision >= 1 - (1 / 60) and precision < 1 then
precision = 1
elseif precision >= (1 / 60) - (1 / 3600) and precision < (1 / 60) then
precision = 1 / 60
end
if precision >= 1 then
unitsPerDegree = 1
elseif precision >= (1 / 60) then
unitsPerDegree = 60
else
unitsPerDegree = 3600
end
numDigits = math.ceil(-math.log10(unitsPerDegree * precision))
if numDigits <= 0 then
numDigits = tonumber("0") -- for some reason, 'numDigits = 0' may actually store '-0', so parse from string instead
end
strFormat = "%." .. numDigits .. "f"
if precision >= 1 then
latDegrees = strFormat:format(latitude)
lonDegrees = strFormat:format(longitude)
if not raw then
latDegSym = replaceDecimalMark(latDegrees) .. degSymbol
lonDegSym = replaceDecimalMark(lonDegrees) .. degSymbol
else
latDegSym = latDegrees .. degSymbol
lonDegSym = lonDegrees .. degSymbol
end
else
latConv = math.floor(latitude * unitsPerDegree * 10^numDigits + 0.5) / 10^numDigits
lonConv = math.floor(longitude * unitsPerDegree * 10^numDigits + 0.5) / 10^numDigits
if precision >= (1 / 60) then
latMinutes = latConv
lonMinutes = lonConv
else
latSeconds = latConv
lonSeconds = lonConv
latMinutes = math.floor(latSeconds / 60)
lonMinutes = math.floor(lonSeconds / 60)
latSeconds = strFormat:format(latSeconds - (latMinutes * 60))
lonSeconds = strFormat:format(lonSeconds - (lonMinutes * 60))
if not raw then
latSecSym = replaceDecimalMark(latSeconds) .. secSymbol
lonSecSym = replaceDecimalMark(lonSeconds) .. secSymbol
else
latSecSym = latSeconds .. secSymbol
lonSecSym = lonSeconds .. secSymbol
end
end
latDegrees = math.floor(latMinutes / 60)
lonDegrees = math.floor(lonMinutes / 60)
latDegSym = latDegrees .. degSymbol
lonDegSym = lonDegrees .. degSymbol
latMinutes = latMinutes - (latDegrees * 60)
lonMinutes = lonMinutes - (lonDegrees * 60)
if precision >= (1 / 60) then
latMinutes = strFormat:format(latMinutes)
lonMinutes = strFormat:format(lonMinutes)
if not raw then
latMinSym = replaceDecimalMark(latMinutes) .. minSymbol
lonMinSym = replaceDecimalMark(lonMinutes) .. minSymbol
else
latMinSym = latMinutes .. minSymbol
lonMinSym = lonMinutes .. minSymbol
end
else
latMinSym = latMinutes .. minSymbol
lonMinSym = lonMinutes .. minSymbol
end
end
latValue = latDegSym .. latMinSym .. latSecSym .. latDirection
lonValue = lonDegSym .. lonMinSym .. lonSecSym .. lonDirection
value = latValue .. separator .. lonValue
if link then
globe = parseWikidataURL(datavalue['globe'])
if globe then
globe = mw.wikibase.getLabelByLang(globe, "en"):lower()
else
globe = "earth"
end
latLink = table.concat({latDegrees, latMinutes, latSeconds}, "_")
lonLink = table.concat({lonDegrees, lonMinutes, lonSeconds}, "_")
value = "[https://geohack.toolforge.org/geohack.php?language="..self.langCode.."¶ms="..latLink.."_"..latDirectionEN.."_"..lonLink.."_"..lonDirectionEN.."_globe:"..globe.." "..value.."]"
end
return value
elseif datatype == 'wikibase-entityid' then
local label
local itemID = datavalue['numeric-id']
if subtype == 'wikibase-item' then
itemID = "Q" .. itemID
elseif subtype == 'wikibase-property' then
itemID = "P" .. itemID
else
return '<strong class="error">' .. errorText('unknown-data-type', subtype) .. '</strong>'
end
label = self:getLabel(itemID, raw, link, short)
if label == "" then
label = nil
end
return label
else
return '<strong class="error">' .. errorText('unknown-data-type', datatype) .. '</strong>'
end
elseif snak.snaktype == 'somevalue' and not noSpecial then
if raw then
return " " -- single space represents 'somevalue'
else
return i18n['values']['unknown']
end
elseif snak.snaktype == 'novalue' and not noSpecial then
if raw then
return "" -- empty string represents 'novalue'
else
return i18n['values']['none']
end
else
return nil
end
end
function Config:getSingleRawQualifier(claim, qualifierID)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[qualifierID] end
if qualifiers and qualifiers[1] then
return self:getValue(qualifiers[1], true) -- raw = true
else
return nil
end
end
function Config:snakEqualsValue(snak, value)
local snakValue = self:getValue(snak, true) -- raw = true
if snakValue and snak.snaktype == 'value' and snak.datavalue.type == 'wikibase-entityid' then value = value:upper() end
return snakValue == value
end
function Config:setRank(rank)
local rankPos
if rank == p.flags.best then
self.bestRank = true
self.flagBest = true -- mark that 'best' flag was given
return
end
if rank:sub(1,9) == p.flags.preferred then
rankPos = 1
elseif rank:sub(1,6) == p.flags.normal then
rankPos = 2
elseif rank:sub(1,10) == p.flags.deprecated then
rankPos = 3
else
return
end
-- one of the rank flags was given, check if another one was given before
if not self.flagRank then
self.ranks = {false, false, false} -- no other rank flag given before, so unset ranks
self.bestRank = self.flagBest -- unsets bestRank only if 'best' flag was not given before
self.flagRank = true -- mark that a rank flag was given
end
if rank:sub(-1) == "+" then
for i = rankPos, 1, -1 do
self.ranks[i] = true
end
elseif rank:sub(-1) == "-" then
for i = rankPos, #self.ranks do
self.ranks[i] = true
end
else
self.ranks[rankPos] = true
end
end
function Config:setPeriod(period)
local periodPos
if period == p.flags.future then
periodPos = 1
elseif period == p.flags.current then
periodPos = 2
elseif period == p.flags.former then
periodPos = 3
else
return
end
-- one of the period flags was given, check if another one was given before
if not self.flagPeriod then
self.periods = {false, false, false} -- no other period flag given before, so unset periods
self.flagPeriod = true -- mark that a period flag was given
end
self.periods[periodPos] = true
end
function Config:qualifierMatches(claim, id, value)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[id] end
if qualifiers then
for _, v in pairs(qualifiers) do
if self:snakEqualsValue(v, value) then
return true
end
end
elseif value == "" then
-- if the qualifier is not present then treat it the same as the special value 'novalue'
return true
end
return false
end
function Config:rankMatches(rankPos)
if self.bestRank then
return (self.ranks[rankPos] and self.foundRank >= rankPos)
else
return self.ranks[rankPos]
end
end
function Config:timeMatches(claim)
local startTime = nil
local startTimeY = nil
local startTimeM = nil
local startTimeD = nil
local endTime = nil
local endTimeY = nil
local endTimeM = nil
local endTimeD = nil
if self.periods[1] and self.periods[2] and self.periods[3] then
-- any time
return true
end
startTime = self:getSingleRawQualifier(claim, aliasesP.startTime)
if startTime and startTime ~= "" and startTime ~= " " then
startTimeY, startTimeM, startTimeD = parseDate(startTime)
end
endTime = self:getSingleRawQualifier(claim, aliasesP.endTime)
if endTime and endTime ~= "" and endTime ~= " " then
endTimeY, endTimeM, endTimeD = parseDate(endTime)
end
if startTimeY ~= nil and endTimeY ~= nil and datePrecedesDate(endTimeY, endTimeM, endTimeD, startTimeY, startTimeM, startTimeD) then
-- invalidate end time if it precedes start time
endTimeY = nil
endTimeM = nil
endTimeD = nil
end
if self.periods[1] then
-- future
if startTimeY and datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], startTimeY, startTimeM, startTimeD) then
return true
end
end
if self.periods[2] then
-- current
if (startTimeY == nil or not datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], startTimeY, startTimeM, startTimeD)) and
(endTimeY == nil or datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], endTimeY, endTimeM, endTimeD)) then
return true
end
end
if self.periods[3] then
-- former
if endTimeY and not datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], endTimeY, endTimeM, endTimeD) then
return true
end
end
return false
end
function Config:processFlag(flag)
if not flag then
return false
end
if flag == p.flags.linked then
self.curState.linked = true
return true
elseif flag == p.flags.raw then
self.curState.rawValue = true
if self.curState == self.states[parameters.reference] then
-- raw reference values end with periods and require a separator (other than none)
self.separators["sep%r"][1] = {" "}
end
return true
elseif flag == p.flags.short then
self.curState.shortName = true
return true
elseif flag == p.flags.multilanguage then
self.curState.anyLanguage = true
return true
elseif flag == p.flags.unit then
self.curState.unitOnly = true
return true
elseif flag == p.flags.mdy then
self.mdyDate = true
return true
elseif flag == p.flags.single then
self.singleClaim = true
return true
elseif flag == p.flags.sourced then
self.sourcedOnly = true
return true
elseif flag == p.flags.edit then
self.editable = true
return true
elseif flag == p.flags.editAtEnd then
self.editable = true
self.editAtEnd = true
return true
elseif flag == p.flags.best or flag:match('^'..p.flags.preferred..'[+-]?$') or flag:match('^'..p.flags.normal..'[+-]?$') or flag:match('^'..p.flags.deprecated..'[+-]?$') then
self:setRank(flag)
return true
elseif flag == p.flags.future or flag == p.flags.current or flag == p.flags.former then
self:setPeriod(flag)
return true
elseif flag == "" then
-- ignore empty flags and carry on
return true
else
return false
end
end
function Config:processFlagOrCommand(flag)
local param = ""
if not flag then
return false
end
if flag == p.claimCommands.property or flag == p.claimCommands.properties then
param = parameters.property
elseif flag == p.claimCommands.qualifier or flag == p.claimCommands.qualifiers then
self.states.qualifiersCount = self.states.qualifiersCount + 1
param = parameters.qualifier .. self.states.qualifiersCount
self.separators["sep"..param] = {copyTable(defaultSeparators["sep%q\\d"])}
elseif flag == p.claimCommands.reference or flag == p.claimCommands.references then
param = parameters.reference
else
return self:processFlag(flag)
end
if self.states[param] then
return false
end
-- create a new state for each command
self.states[param] = State:new(self, param)
-- use "%x" as the general parameter name
self.states[param].parsedFormat = parseFormat(parameters.general) -- will be overwritten for param=="%p"
-- set the separator
self.states[param].separator = self.separators["sep"..param] -- will be nil for param=="%p", which will be set separately
if flag == p.claimCommands.property or flag == p.claimCommands.qualifier or flag == p.claimCommands.reference then
self.states[param].singleValue = true
end
self.curState = self.states[param]
return true
end
function Config:processSeparators(args)
local sep
for i, v in pairs(self.separators) do
if args[i] then
sep = replaceSpecialChars(args[i])
if sep ~= "" then
self.separators[i][1] = {sep}
else
self.separators[i][1] = nil
end
end
end
end
function Config:setFormatAndSeparators(state, parsedFormat)
state.parsedFormat = parsedFormat
state.separator = self.separators["sep"]
state.movSeparator = self.separators["sep"..parameters.separator]
state.puncMark = self.separators["punc"]
end
-- determines if a claim has references by prefetching them from the claim using getReferences,
-- which applies some filtering that determines if a reference is actually returned,
-- and caches the references for later use
function State:isSourced(claim)
self.conf.prefetchedRefs = self:getReferences(claim)
return (#self.conf.prefetchedRefs > 0)
end
function State:resetCaches()
-- any prefetched references of the previous claim must not be used
self.conf.prefetchedRefs = nil
end
function State:claimMatches(claim)
local matches, rankPos
-- first of all, reset any cached values used for the previous claim
self:resetCaches()
-- if a property value was given, check if it matches the claim's property value
if self.conf.propertyValue then
matches = self.conf:snakEqualsValue(claim.mainsnak, self.conf.propertyValue)
else
matches = true
end
-- if any qualifier values were given, check if each matches one of the claim's qualifier values
for i, v in pairs(self.conf.qualifierIDsAndValues) do
matches = (matches and self.conf:qualifierMatches(claim, i, v))
end
-- check if the claim's rank and time period match
rankPos = rankTable[claim.rank] or 4
matches = (matches and self.conf:rankMatches(rankPos) and self.conf:timeMatches(claim))
-- if only claims with references must be returned, check if this one has any
if self.conf.sourcedOnly then
matches = (matches and self:isSourced(claim)) -- prefetches and caches references
end
return matches, rankPos
end
function State:out()
local result -- collection of arrays with value objects
local valuesArray -- array with value objects
local sep = nil -- value object
local out = {} -- array with value objects
local function walk(formatTable, result)
local valuesArray = {} -- array with value objects
for i, v in pairs(formatTable.req) do
if not result[i] or not result[i][1] then
-- we've got no result for a parameter that is required on this level,
-- so skip this level (and its children) by returning an empty result
return {}
end
end
for _, v in ipairs(formatTable) do
if v.param then
valuesArray = mergeArrays(valuesArray, result[v.str])
elseif v.str ~= "" then
valuesArray[#valuesArray + 1] = {v.str}
end
if v.child then
valuesArray = mergeArrays(valuesArray, walk(v.child, result))
end
end
return valuesArray
end
-- iterate through the results from back to front, so that we know when to add separators
for i = #self.results, 1, -1 do
result = self.results[i]
-- if there is already some output, then add the separators
if #out > 0 then
sep = self.separator[1] -- fixed separator
result[parameters.separator] = {self.movSeparator[1]} -- movable separator
else
sep = nil
result[parameters.separator] = {self.puncMark[1]} -- optional punctuation mark
end
valuesArray = walk(self.parsedFormat, result)
if #valuesArray > 0 then
if sep then
valuesArray[#valuesArray + 1] = sep
end
out = mergeArrays(valuesArray, out)
end
end
-- reset state before next iteration
self.results = {}
return out
end
-- level 1 hook
function State:getProperty(claim)
local value = {self:getValue(claim.mainsnak)} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
-- level 1 hook
function State:getQualifiers(claim, param)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[self.conf.qualifierIDs[param]] end
if qualifiers then
-- iterate through claim's qualifier statements to collect their values;
-- return array with multiple value objects
return self.conf.states[param]:iterate(qualifiers, {[parameters.general] = hookNames[parameters.qualifier.."\\d"][2], count = 1}) -- pass qualifier state with level 2 hook
else
return {} -- return empty array
end
end
-- level 2 hook
function State:getQualifier(snak)
local value = {self:getValue(snak)} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
-- level 1 hook
function State:getAllQualifiers(claim, param, result, hooks)
local out = {} -- array with value objects
local sep = self.conf.separators["sep"..parameters.qualifier][1] -- value object
-- iterate through the output of the separate "qualifier(s)" commands
for i = 1, self.conf.states.qualifiersCount do
-- if a hook has not been called yet, call it now
if not result[parameters.qualifier..i] then
self:callHook(parameters.qualifier..i, hooks, claim, result)
end
-- if there is output for this particular "qualifier(s)" command, then add it
if result[parameters.qualifier..i] and result[parameters.qualifier..i][1] then
-- if there is already some output, then add the separator
if #out > 0 and sep then
out[#out + 1] = sep
end
out = mergeArrays(out, result[parameters.qualifier..i])
end
end
return out
end
-- level 1 hook
function State:getReferences(claim)
if self.conf.prefetchedRefs then
-- return references that have been prefetched by isSourced
return self.conf.prefetchedRefs
end
if claim.references then
-- iterate through claim's reference statements to collect their values;
-- return array with multiple value objects
return self.conf.states[parameters.reference]:iterate(claim.references, {[parameters.general] = hookNames[parameters.reference][2], count = 1}) -- pass reference state with level 2 hook
else
return {} -- return empty array
end
end
-- level 2 hook
function State:getReference(statement)
local citeParamMapping = i18n['cite']['param-mapping']
local citeConfig = i18n['cite']['config']
local citeTypes = i18n['cite']['output-types']
-- for each citation type, there will be an associative array that associates lists of rendered properties
-- to citation-template parameters
local candidateParams = {}
-- like above, but only associates one rendered property to each parameter; if the above variable
-- contains more strings for a parameter, the strings will be assigned to numbered params (e.g. "author1")
local citeParams = {}
local citeErrors = {}
local referenceEmpty = true -- will be set to false if at least one parameter is left unremoved
local version = 13 -- increment this each time the below logic is changed to avoid conflict errors
if not statement.snaks then
return {}
end
-- don't use bot-added references referencing Wikimedia projects or containing "inferred from" (such references are not usable on Wikipedia)
if statement.snaks[aliasesP.importedFrom] or statement.snaks[aliasesP.wikimediaImportURL] or statement.snaks[aliasesP.inferredFrom] then
return {}
end
-- don't include "type of reference"
if statement.snaks[aliasesP.typeOfReference] then
statement.snaks[aliasesP.typeOfReference] = nil
end
-- don't include "image" to prevent littering
if statement.snaks[aliasesP.image] then
statement.snaks[aliasesP.image] = nil
end
-- initialize candidateParams and citeParams
for _, citeType in ipairs(citeTypes) do
candidateParams[citeType] = {}
citeParams[citeType] = {}
end
-- fill candidateParams
for _, citeType in ipairs(citeTypes) do
-- This will contain value--priority pairs for each param name.
local candidateValuesAndPriorities = {}
-- fill candidateValuesAndPriorities
for refProperty in pairs(statement.snaks) do
if citeErrors[citeType] then
break
end
repeat -- just a simple wrapper to emulate "continue"
-- set mappingKey
local mappingKey
if statement.snaks[refProperty][1].datatype == 'external-id' then
mappingKey = "external-id"
else
mappingKey = refProperty
end
local paramName = citeParamMapping[citeType][mappingKey]
-- skip properties with empty parameter name
if paramName == "" then
break -- skip this property for this value of citeType
end
-- handle unknown properties in the reference
if not paramName then
referenceEmpty = false
local propertyWikitext = "[[d:Special:EntityPage/" .. refProperty .. "|" .. self.conf:getLabel(refProperty) .. " (" .. refProperty .. ")]]"
local error_message = errorText("unknown-property-in-ref", propertyWikitext)
assert(error_message) -- Should not be nil
citeErrors[citeType] = error_message
break
end
-- set processedProperty
local processedProperty
local raw = false -- if the value is wanted raw
if isValueInTable(paramName, citeConfig[citeType]["raw-value-params"] or {}) then
raw = true
end
local customRenderer = nil
if citeConfig[citeType]["customRenderers"] then
customRenderer = citeConfig[citeType]["customRenderers"][paramName]
end
if isValueInTable(paramName, citeConfig[citeType]["numbered-params"] or {}) then
-- Multiple values may be given.
processedProperty = self:getReferenceDetails(statement.snaks, refProperty, raw, self.linked, true, customRenderer) -- anyLang = true
else
-- If multiple values are given, all but the first suitable one are discarted.
processedProperty = {self:getReferenceDetail(statement.snaks, refProperty, raw, self.linked and (statement.snaks[refProperty][1].datatype ~= 'url'), true, customRenderer)} -- link = true/false, anyLang = true
end
if #processedProperty == 0 then
break
end
referenceEmpty = false
-- add an empty entry to candidateValuesAndPriorities, if there isn't one already
if not candidateValuesAndPriorities[paramName] then
candidateValuesAndPriorities[paramName] = {}
end
-- find the priority of refProperty
-- (the actual index is mappingKey, not refProperty, because of external IDs)
local thisPropertyPriority = -1
local thisParamPrioritization = (citeConfig[citeType]["prioritization"] or {})[paramName]
if thisParamPrioritization then
for i_priority, i_key in ipairs(thisParamPrioritization) do
if i_key == mappingKey then
thisPropertyPriority = i_priority
end
end
end
for _, propertyValue in pairs(processedProperty) do
table.insert(
candidateValuesAndPriorities[paramName],
{propertyValue, thisPropertyPriority}
)
end
until true
end
-- fill candidateParams[citeType]
if not citeErrors[citeType] then
local compareValuePriorities = function(pair1, pair2)
if pair1[2] == -1 and pair2[2] ~= -1 then
return false
end
if pair1[2] ~= -1 and pair2[2] == -1 then
return true
end
return pair1[2] < pair2[2]
end
-- fill candidateParams[citeType][paramName] for each used param
for paramName, _ in pairs(candidateValuesAndPriorities) do
table.sort(candidateValuesAndPriorities[paramName], compareValuePriorities)
candidateParams[citeType][paramName] = {}
for _, valuePriorityPair in ipairs(candidateValuesAndPriorities[paramName]) do
table.insert(candidateParams[citeType][paramName], valuePriorityPair[1])
end
end
end
end
-- fill citeParams
for _, citeType in ipairs(citeTypes) do
for paramName, paramValues in pairs(candidateParams[citeType]) do
if #paramValues == 1 or not isValueInTable(paramName, citeConfig[citeType]["numbered-params"] or {}) then
citeParams[citeType][paramName] = paramValues[1]
else
-- There is more than one value for this parameter - the values will
-- go into separate numbered parameters (e.g. "author1", "author2")
for paramNum, paramValue in pairs(paramValues) do
citeParams[citeType][paramName .. paramNum] = paramValue
end
end
end
end
-- handle missing mandatory parameters for the templates
for _, citeType in ipairs(citeTypes) do
for _, requiredCiteParam in pairs(citeConfig[citeType]["mandatory-params"] or {}) do
if not citeParams[citeType][requiredCiteParam] then -- The required param is not present.
if citeErrors[citeType] then -- Do not override the previous error, if it exists.
break
end
local error_message = errorText("missing-mandatory-param", requiredCiteParam)
assert(error_message) -- Should not be nil
citeErrors[citeType] = error_message
end
end
end
local citeTypeToUse = nil
-- choose the output template
for _, citeType in ipairs(citeTypes) do
if not citeErrors[citeType] then
citeTypeToUse = citeType
break
end
end
-- set refContent
local refContent = ""
if citeTypeToUse then
local templateToUse = citeConfig[citeTypeToUse]["template"]
local paramsToUse = citeParams[citeTypeToUse]
if not templateToUse or templateToUse == "" then
throwError("no-such-reference-template", tostring(templateToUse), i18nPath, citeTypeToUse)
end
-- if this module is being substituted then build a regular template call, otherwise expand the template
if mw.isSubsting() then
for i, v in pairs(paramsToUse) do
refContent = refContent .. "|" .. i .. "=" .. v
end
refContent = "{{" .. templateToUse .. refContent .. "}}"
else
xpcall(
function () refContent = mw.getCurrentFrame():expandTemplate{title=templateToUse, args=paramsToUse} end,
function () throwError("no-such-reference-template", templateToUse, i18nPath, citeTypeToUse) end
)
end
-- If the citation couldn't be displayed using any template, but is not empty (barring ignored propeties), throw an error.
elseif not referenceEmpty then
refContent = errorText("malformed-reference-header")
for _, citeType in ipairs(citeTypes) do
local templateWikitext = "<nowiki>{{</nowiki>[[Template:" .. citeConfig[citeType]["template"] .. "|" .. citeConfig[citeType]["template"] .. "]]<nowiki>}}</nowiki>"
refContent = refContent .. errorText("template-failure-reason", templateWikitext, citeErrors[citeType])
end
refContent = refContent .. errorText("malformed-reference-footer")
end
-- wrap refContent
local ref = {}
if refContent ~= "" then
ref = {refContent}
if not self.rawValue then
-- this should become a <ref> tag, so save the reference's hash for later
ref.refHash = "wikidata-" .. statement.hash .. "-v" .. (tonumber(i18n['version']) + version)
end
return {ref}
else
return {}
end
end
-- gets a detail of one particular type for a reference
function State:getReferenceDetail(snaks, dType, raw, link, anyLang, customRenderer)
local switchLang = anyLang
local value = nil
if not snaks[dType] then
return nil
end
-- if anyLang, first try the local language and otherwise any language
repeat
for _, v in ipairs(snaks[dType]) do
local defaultRenderer = function ()
return self.conf:getValue(v, raw, link, false, anyLang and not switchLang, false, true) -- noSpecial = true
end
if customRenderer then
value = customRenderer(
v, dType,
defaultRenderer,
p._properties,
function (...) return self.conf:getValue(unpack(arg)) end,
snaks
)
else
value = defaultRenderer()
end
if value then
break
end
end
if value or not anyLang then
break
end
switchLang = not switchLang
until anyLang and switchLang
return value
end
-- gets the details of one particular type for a reference
function State:getReferenceDetails(snaks, dType, raw, link, anyLang, customRenderer)
local values = {}
if not snaks[dType] then
return {}
end
for _, v in ipairs(snaks[dType]) do
local defaultRenderer = function ()
return self.conf:getValue(v, raw, link, false, anyLang, false, true) -- noSpecial = true
end
local value
if customRenderer then
value = customRenderer(
v, dType,
defaultRenderer,
p._properties,
function (...) return self.conf:getValue(unpack(arg)) end,
snaks
)
else
value = defaultRenderer()
end
-- if value is nil then it will not be added to the table
values[#values + 1] = value
end
return values
end
-- level 1 hook
function State:getAlias(object)
local value = object.value
local title = nil
if value and self.linked then
if self.conf.entityID:sub(1,1) == "Q" then
title = mw.wikibase.getSitelink(self.conf.entityID)
elseif self.conf.entityID:sub(1,1) == "P" then
title = "d:Property:" .. self.conf.entityID
end
if title then
value = buildWikilink(title, value)
end
end
value = {value} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
-- level 1 hook
function State:getBadge(value)
value = self.conf:getLabel(value, self.rawValue, self.linked, self.shortName)
if value == "" then
value = nil
end
value = {value} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
function State:callHook(param, hooks, statement, result)
-- call a parameter's hook if it has been defined and if it has not been called before
if not result[param] and hooks[param] then
local valuesArray = self[hooks[param]](self, statement, param, result, hooks) -- array with value objects
-- add to the result
if #valuesArray > 0 then
result[param] = valuesArray
result.count = result.count + 1
else
result[param] = {} -- an empty array to indicate that we've tried this hook already
return true -- miss == true
end
end
return false
end
-- iterate through claims, claim's qualifiers or claim's references to collect values
function State:iterate(statements, hooks, matchHook)
matchHook = matchHook or alwaysTrue
local matches = false
local rankPos = nil
local result, gotRequired
for _, v in ipairs(statements) do
-- rankPos will be nil for non-claim statements (e.g. qualifiers, references, etc.)
matches, rankPos = matchHook(self, v)
if matches then
result = {count = 0} -- collection of arrays with value objects
local function walk(formatTable)
local miss
for i2, v2 in pairs(formatTable.req) do
-- call a hook, adding its return value to the result
miss = self:callHook(i2, hooks, v, result)
if miss then
-- we miss a required value for this level, so return false
return false
end
if result.count == hooks.count then
-- we're done if all hooks have been called;
-- returning at this point breaks the loop
return true
end
end
for _, v2 in ipairs(formatTable) do
if result.count == hooks.count then
-- we're done if all hooks have been called;
-- returning at this point prevents further childs from being processed
return true
end
if v2.child then
walk(v2.child)
end
end
return true
end
gotRequired = walk(self.parsedFormat)
-- only append the result if we got values for all required parameters on the root level
if gotRequired then
-- if we have a rankPos (only with matchHook() for complete claims), then update the foundRank
if rankPos and self.conf.foundRank > rankPos then
self.conf.foundRank = rankPos
end
-- append the result
self.results[#self.results + 1] = result
-- break if we only need a single value
if self.singleValue then
break
end
end
end
end
return self:out()
end
local function getEntityId(arg, eid, page, allowOmitPropPrefix, globalSiteId)
local id = nil
local prop = nil
if arg then
if arg:sub(1,1) == ":" then
page = arg
eid = nil
elseif arg:sub(1,1):upper() == "Q" or arg:sub(1,9):lower() == "property:" or allowOmitPropPrefix then
eid = arg
page = nil
else
prop = arg
end
end
if eid then
if eid:sub(1,9):lower() == "property:" then
id = replaceAlias(mw.text.trim(eid:sub(10)))
if id:sub(1,1):upper() ~= "P" then
id = ""
end
else
id = replaceAlias(eid)
end
elseif page then
if page:sub(1,1) == ":" then
page = mw.text.trim(page:sub(2))
end
id = mw.wikibase.getEntityIdForTitle(page, globalSiteId) or ""
end
if not id then
id = mw.wikibase.getEntityIdForCurrentPage() or ""
end
id = id:upper()
if not mw.wikibase.isValidEntityId(id) then
id = ""
end
return id, prop
end
local function nextArg(args)
local arg = args[args.pointer]
if arg then
args.pointer = args.pointer + 1
return mw.text.trim(arg)
else
return nil
end
end
local function claimCommand(args, funcName)
local cfg = Config:new()
cfg:processFlagOrCommand(funcName) -- process first command (== function name)
local lastArg, parsedFormat, formatParams, claims, value
local hooks = {count = 0}
-- set the date if given;
-- must come BEFORE processing the flags
if args[p.args.date] then
cfg.atDate = {parseDate(args[p.args.date])}
cfg.periods = {false, true, false} -- change default time constraint to 'current'
end
-- process flags and commands
repeat
lastArg = nextArg(args)
until not cfg:processFlagOrCommand(lastArg)
-- get the entity ID from either the positional argument, the eid argument or the page argument
cfg.entityID, cfg.propertyID = getEntityId(lastArg, args[p.args.eid], args[p.args.page], false, args[p.args.globalSiteId])
if cfg.entityID == "" then
return "" -- we cannot continue without a valid entity ID
end
cfg.entity = mw.wikibase.getEntity(cfg.entityID)
if not cfg.propertyID then
cfg.propertyID = nextArg(args)
end
cfg.propertyID = replaceAlias(cfg.propertyID)
if not cfg.entity or not cfg.propertyID then
return "" -- we cannot continue without an entity or a property ID
end
cfg.propertyID = cfg.propertyID:upper()
if not cfg.entity.claims or not cfg.entity.claims[cfg.propertyID] then
return "" -- there is no use to continue without any claims
end
claims = cfg.entity.claims[cfg.propertyID]
if cfg.states.qualifiersCount > 0 then
-- do further processing if "qualifier(s)" command was given
if #args - args.pointer + 1 > cfg.states.qualifiersCount then
-- claim ID or literal value has been given
cfg.propertyValue = nextArg(args)
end
for i = 1, cfg.states.qualifiersCount do
-- check if given qualifier ID is an alias and add it
cfg.qualifierIDs[parameters.qualifier..i] = replaceAlias(nextArg(args) or ""):upper()
end
elseif cfg.states[parameters.reference] then
-- do further processing if "reference(s)" command was given
cfg.propertyValue = nextArg(args)
end
-- check for special property value 'somevalue' or 'novalue'
if cfg.propertyValue then
cfg.propertyValue = replaceSpecialChars(cfg.propertyValue)
if cfg.propertyValue ~= "" and mw.text.trim(cfg.propertyValue) == "" then
cfg.propertyValue = " " -- single space represents 'somevalue', whereas empty string represents 'novalue'
else
cfg.propertyValue = mw.text.trim(cfg.propertyValue)
end
end
-- parse the desired format, or choose an appropriate format
if args["format"] then
parsedFormat, formatParams = parseFormat(args["format"])
elseif cfg.states.qualifiersCount > 0 then -- "qualifier(s)" command given
if cfg.states[parameters.property] then -- "propert(y|ies)" command given
parsedFormat, formatParams = parseFormat(formats.propertyWithQualifier)
else
parsedFormat, formatParams = parseFormat(formats.qualifier)
end
elseif cfg.states[parameters.property] then -- "propert(y|ies)" command given
parsedFormat, formatParams = parseFormat(formats.property)
else -- "reference(s)" command given
parsedFormat, formatParams = parseFormat(formats.reference)
end
-- if a "qualifier(s)" command and no "propert(y|ies)" command has been given, make the movable separator a semicolon
if cfg.states.qualifiersCount > 0 and not cfg.states[parameters.property] then
cfg.separators["sep"..parameters.separator][1] = {";"}
end
-- if only "reference(s)" has been given, set the default separator to none (except when raw)
if cfg.states[parameters.reference] and not cfg.states[parameters.property] and cfg.states.qualifiersCount == 0
and not cfg.states[parameters.reference].rawValue then
cfg.separators["sep"][1] = nil
end
-- if exactly one "qualifier(s)" command has been given, make "sep%q" point to "sep%q1" to make them equivalent
if cfg.states.qualifiersCount == 1 then
cfg.separators["sep"..parameters.qualifier] = cfg.separators["sep"..parameters.qualifier.."1"]
end
-- process overridden separator values;
-- must come AFTER tweaking the default separators
cfg:processSeparators(args)
-- define the hooks that should be called (getProperty, getQualifiers, getReferences);
-- only define a hook if both its command ("propert(y|ies)", "reference(s)", "qualifier(s)") and its parameter ("%p", "%r", "%q1", "%q2", "%q3") have been given
for i, v in pairs(cfg.states) do
-- e.g. 'formatParams["%q1"] or formatParams["%q"]' to define hook even if "%q1" was not defined to be able to build a complete value for "%q"
if formatParams[i] or formatParams[i:sub(1, 2)] then
hooks[i] = getHookName(i, 1)
hooks.count = hooks.count + 1
end
end
-- the "%q" parameter is not attached to a state, but is a collection of the results of multiple states (attached to "%q1", "%q2", "%q3", ...);
-- so if this parameter is given then this hook must be defined separately, but only if at least one "qualifier(s)" command has been given
if formatParams[parameters.qualifier] and cfg.states.qualifiersCount > 0 then
hooks[parameters.qualifier] = getHookName(parameters.qualifier, 1)
hooks.count = hooks.count + 1
end
-- create a state for "properties" if it doesn't exist yet, which will be used as a base configuration for each claim iteration;
-- must come AFTER defining the hooks
if not cfg.states[parameters.property] then
cfg.states[parameters.property] = State:new(cfg, parameters.property)
-- if the "single" flag has been given then this state should be equivalent to "property" (singular)
if cfg.singleClaim then
cfg.states[parameters.property].singleValue = true
end
end
-- if the "sourced" flag has been given then create a state for "reference" if it doesn't exist yet, using default values,
-- which must exist in order to be able to determine if a claim has any references;
-- must come AFTER defining the hooks
if cfg.sourcedOnly and not cfg.states[parameters.reference] then
cfg:processFlagOrCommand(p.claimCommands.reference) -- use singular "reference" to minimize overhead
end
-- set the parsed format and the separators (and optional punctuation mark);
-- must come AFTER creating the additonal states
cfg:setFormatAndSeparators(cfg.states[parameters.property], parsedFormat)
-- process qualifier matching values, analogous to cfg.propertyValue
for i, v in pairs(args) do
i = tostring(i)
if i:match('^[Pp]%d+$') or aliasesP[i] then
v = replaceSpecialChars(v)
-- check for special qualifier value 'somevalue'
if v ~= "" and mw.text.trim(v) == "" then
v = " " -- single space represents 'somevalue'
end
cfg.qualifierIDsAndValues[replaceAlias(i):upper()] = v
end
end
-- first sort the claims on rank to pre-define the order of output (preferred first, then normal, then deprecated)
claims = sortOnRank(claims)
-- then iterate through the claims to collect values
value = cfg:concatValues(cfg.states[parameters.property]:iterate(claims, hooks, State.claimMatches)) -- pass property state with level 1 hooks and matchHook
-- if desired, add a clickable icon that may be used to edit the returned values on Wikidata
if cfg.editable and value ~= "" then
value = value .. cfg:getEditIcon()
end
return value
end
local function generalCommand(args, funcName)
local cfg = Config:new()
cfg.curState = State:new(cfg)
local lastArg
local value = nil
repeat
lastArg = nextArg(args)
until not cfg:processFlag(lastArg)
-- get the entity ID from either the positional argument, the eid argument or the page argument
cfg.entityID = getEntityId(lastArg, args[p.args.eid], args[p.args.page], true, args[p.args.globalSiteId])
if cfg.entityID == "" or not mw.wikibase.entityExists(cfg.entityID) then
return "" -- we cannot continue without an entity
end
-- serve according to the given command
if funcName == p.generalCommands.label then
value = cfg:getLabel(cfg.entityID, cfg.curState.rawValue, cfg.curState.linked, cfg.curState.shortName)
elseif funcName == p.generalCommands.title then
cfg.inSitelinks = true
if cfg.entityID:sub(1,1) == "Q" then
value = mw.wikibase.getSitelink(cfg.entityID)
end
if cfg.curState.linked and value then
value = buildWikilink(value)
end
elseif funcName == p.generalCommands.description then
value = mw.wikibase.getDescription(cfg.entityID)
else
local parsedFormat, formatParams
local hooks = {count = 0}
cfg.entity = mw.wikibase.getEntity(cfg.entityID)
if funcName == p.generalCommands.alias or funcName == p.generalCommands.badge then
cfg.curState.singleValue = true
end
if funcName == p.generalCommands.alias or funcName == p.generalCommands.aliases then
if not cfg.entity.aliases or not cfg.entity.aliases[cfg.langCode] then
return "" -- there is no use to continue without any aliasses
end
local aliases = cfg.entity.aliases[cfg.langCode]
-- parse the desired format, or parse the default aliases format
if args["format"] then
parsedFormat, formatParams = parseFormat(args["format"])
else
parsedFormat, formatParams = parseFormat(formats.alias)
end
-- process overridden separator values;
-- must come AFTER tweaking the default separators
cfg:processSeparators(args)
-- define the hook that should be called (getAlias);
-- only define the hook if the parameter ("%a") has been given
if formatParams[parameters.alias] then
hooks[parameters.alias] = getHookName(parameters.alias, 1)
hooks.count = hooks.count + 1
end
-- set the parsed format and the separators (and optional punctuation mark)
cfg:setFormatAndSeparators(cfg.curState, parsedFormat)
-- iterate to collect values
value = cfg:concatValues(cfg.curState:iterate(aliases, hooks))
elseif funcName == p.generalCommands.badge or funcName == p.generalCommands.badges then
if not cfg.entity.sitelinks or not cfg.entity.sitelinks[cfg.siteID] or not cfg.entity.sitelinks[cfg.siteID].badges then
return "" -- there is no use to continue without any badges
end
local badges = cfg.entity.sitelinks[cfg.siteID].badges
cfg.inSitelinks = true
-- parse the desired format, or parse the default aliases format
if args["format"] then
parsedFormat, formatParams = parseFormat(args["format"])
else
parsedFormat, formatParams = parseFormat(formats.badge)
end
-- process overridden separator values;
-- must come AFTER tweaking the default separators
cfg:processSeparators(args)
-- define the hook that should be called (getBadge);
-- only define the hook if the parameter ("%b") has been given
if formatParams[parameters.badge] then
hooks[parameters.badge] = getHookName(parameters.badge, 1)
hooks.count = hooks.count + 1
end
-- set the parsed format and the separators (and optional punctuation mark)
cfg:setFormatAndSeparators(cfg.curState, parsedFormat)
-- iterate to collect values
value = cfg:concatValues(cfg.curState:iterate(badges, hooks))
end
end
value = value or ""
if cfg.editable and value ~= "" then
-- if desired, add a clickable icon that may be used to edit the returned value on Wikidata
value = value .. cfg:getEditIcon()
end
return value
end
-- modules that include this module should call the functions with an underscore prepended, e.g.: p._property(args)
local function establishCommands(commandList, commandFunc)
for _, commandName in pairs(commandList) do
local function wikitextWrapper(frame)
local args = copyTable(frame.args)
args.pointer = 1
loadI18n(aliasesP, frame)
return commandFunc(args, commandName)
end
p[commandName] = wikitextWrapper
local function luaWrapper(args)
args = copyTable(args)
args.pointer = 1
loadI18n(aliasesP)
return commandFunc(args, commandName)
end
p["_" .. commandName] = luaWrapper
end
end
establishCommands(p.claimCommands, claimCommand)
establishCommands(p.generalCommands, generalCommand)
-- main function that is supposed to be used by wrapper templates
function p.main(frame)
if not mw.wikibase then return nil end
local f, args
loadI18n(aliasesP, frame)
-- get the parent frame to take the arguments that were passed to the wrapper template
frame = frame:getParent() or frame
if not frame.args[1] then
throwError("no-function-specified")
end
f = mw.text.trim(frame.args[1])
if f == "main" then
throwError("main-called-twice")
end
assert(p["_"..f], errorText('no-such-function', f))
-- copy arguments from immutable to mutable table
args = copyTable(frame.args)
-- remove the function name from the list
table.remove(args, 1)
return p["_"..f](args)
end
return p
dyjtoxlu5p2mq8c2h4dmvnmhx8qx22r
33437
33436
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Wd]]
33436
Scribunto
text/plain
-- Original module located at [[:en:Module:Wd]] and [[:en:Module:Wd/i18n]].
require("strict")
local p = {}
local module_arg = ...
local i18n
local i18nPath
local function loadI18n(aliasesP, frame)
local title
if frame then
-- current module invoked by page/template, get its title from frame
title = frame:getTitle()
else
-- current module included by other module, get its title from ...
title = module_arg
end
if not i18n then
i18nPath = title .. "/i18n"
i18n = require(i18nPath).init(aliasesP)
end
end
p.claimCommands = {
property = "property",
properties = "properties",
qualifier = "qualifier",
qualifiers = "qualifiers",
reference = "reference",
references = "references"
}
p.generalCommands = {
label = "label",
title = "title",
description = "description",
alias = "alias",
aliases = "aliases",
badge = "badge",
badges = "badges"
}
p.flags = {
linked = "linked",
short = "short",
raw = "raw",
multilanguage = "multilanguage",
unit = "unit",
-------------
preferred = "preferred",
normal = "normal",
deprecated = "deprecated",
best = "best",
future = "future",
current = "current",
former = "former",
edit = "edit",
editAtEnd = "edit@end",
mdy = "mdy",
single = "single",
sourced = "sourced"
}
p.args = {
eid = "eid",
page = "page",
date = "date",
globalSiteId = "globalSiteId"
}
local aliasesP = {
coord = "P625",
-----------------------
image = "P18",
author = "P50",
authorNameString = "P2093",
publisher = "P123",
importedFrom = "P143",
wikimediaImportURL = "P4656",
statedIn = "P248",
pages = "P304",
language = "P407",
wikimediaLanguageCode = "P424",
hasPart = "P527",
publicationDate = "P577",
startTime = "P580",
endTime = "P582",
chapter = "P792",
retrieved = "P813",
referenceURL = "P854",
sectionVerseOrParagraph = "P958",
archiveURL = "P1065",
title = "P1476",
formatterURL = "P1630",
quote = "P1683",
shortName = "P1813",
definingFormula = "P2534",
archiveDate = "P2960",
inferredFrom = "P3452",
typeOfReference = "P3865",
column = "P3903",
subjectNamedAs = "P1810",
wikidataProperty = "P1687",
publishedIn = "P1433",
lastUpdate = "P5017"
}
local aliasesQ = {
percentage = "Q11229",
prolepticJulianCalendar = "Q1985786",
citeWeb = "Q5637226",
citeQ = "Q22321052"
}
local parameters = {
property = "%p",
qualifier = "%q",
reference = "%r",
alias = "%a",
badge = "%b",
separator = "%s",
general = "%x"
}
local formats = {
property = "%p[%s][%r]",
qualifier = "%q[%s][%r]",
reference = "%r",
propertyWithQualifier = "%p[ <span style=\"font-size:85\\%\">(%q)</span>][%s][%r]",
alias = "%a[%s]",
badge = "%b[%s]"
}
local hookNames = { -- {level_1, level_2}
[parameters.property] = {"getProperty"},
[parameters.reference] = {"getReferences", "getReference"},
[parameters.qualifier] = {"getAllQualifiers"},
[parameters.qualifier.."\\d"] = {"getQualifiers", "getQualifier"},
[parameters.alias] = {"getAlias"},
[parameters.badge] = {"getBadge"}
}
-- default value objects, should NOT be mutated but instead copied
local defaultSeparators = {
["sep"] = {" "},
["sep%s"] = {","},
["sep%q"] = {"; "},
["sep%q\\d"] = {", "},
["sep%r"] = nil, -- none
["punc"] = nil -- none
}
local rankTable = {
["preferred"] = 1,
["normal"] = 2,
["deprecated"] = 3
}
local function replaceAlias(id)
if aliasesP[id] then
id = aliasesP[id]
end
return id
end
local function errorText(code, ...)
local text = i18n["errors"][code]
if arg then text = mw.ustring.format(text, unpack(arg)) end
return text
end
local function throwError(errorMessage, ...)
error(errorText(errorMessage, unpack(arg)))
end
local function replaceDecimalMark(num)
return mw.ustring.gsub(num, "[.]", i18n['numeric']['decimal-mark'], 1)
end
local function padZeros(num, numDigits)
local numZeros
local negative = false
if num < 0 then
negative = true
num = num * -1
end
num = tostring(num)
numZeros = numDigits - num:len()
for _ = 1, numZeros do
num = "0"..num
end
if negative then
num = "-"..num
end
return num
end
local function replaceSpecialChar(chr)
if chr == '_' then
-- replace underscores with spaces
return ' '
else
return chr
end
end
local function replaceSpecialChars(str)
local chr
local esc = false
local strOut = ""
for i = 1, #str do
chr = str:sub(i,i)
if not esc then
if chr == '\\' then
esc = true
else
strOut = strOut .. replaceSpecialChar(chr)
end
else
strOut = strOut .. chr
esc = false
end
end
return strOut
end
local function buildWikilink(target, label)
if not label or target == label then
return "[[" .. target .. "]]"
else
return "[[" .. target .. "|" .. label .. "]]"
end
end
-- used to make frame.args mutable, to replace #frame.args (which is always 0)
-- with the actual amount and to simply copy tables
local function copyTable(tIn)
if not tIn then
return nil
end
local tOut = {}
for i, v in pairs(tIn) do
tOut[i] = v
end
return tOut
end
-- used to merge output arrays together;
-- note that it currently mutates the first input array
local function mergeArrays(a1, a2)
for i = 1, #a2 do
a1[#a1 + 1] = a2[i]
end
return a1
end
local function split(str, del)
local out = {}
local i, j = str:find(del)
if i and j then
out[1] = str:sub(1, i - 1)
out[2] = str:sub(j + 1)
else
out[1] = str
end
return out
end
local function parseWikidataURL(url)
local id
if url:match('^http[s]?://') then
id = split(url, "Q")
if id[2] then
return "Q" .. id[2]
end
end
return nil
end
local function parseDate(dateStr, precision)
precision = precision or "d"
local i, j, index, ptr
local parts = {nil, nil, nil}
if dateStr == nil then
return parts[1], parts[2], parts[3] -- year, month, day
end
-- 'T' for snak values, '/' for outputs with '/Julian' attached
i, j = dateStr:find("[T/]")
if i then
dateStr = dateStr:sub(1, i-1)
end
local from = 1
if dateStr:sub(1,1) == "-" then
-- this is a negative number, look further ahead
from = 2
end
index = 1
ptr = 1
i, j = dateStr:find("-", from)
if i then
-- year
parts[index] = tonumber(dateStr:sub(ptr, i-1), 10) -- explicitly give base 10 to prevent error
if parts[index] == -0 then
parts[index] = tonumber("0") -- for some reason, 'parts[index] = 0' may actually store '-0', so parse from string instead
end
if precision == "y" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
i, j = dateStr:find("-", ptr)
if i then
-- month
parts[index] = tonumber(dateStr:sub(ptr, i-1), 10)
if precision == "m" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
end
end
if dateStr:sub(ptr) ~= "" then
-- day if we have month, month if we have year, or year
parts[index] = tonumber(dateStr:sub(ptr), 10)
end
return parts[1], parts[2], parts[3] -- year, month, day
end
local function datePrecedesDate(aY, aM, aD, bY, bM, bD)
if aY == nil or bY == nil then
return nil
end
aM = aM or 1
aD = aD or 1
bM = bM or 1
bD = bD or 1
if aY < bY then
return true
end
if aY > bY then
return false
end
if aM < bM then
return true
end
if aM > bM then
return false
end
if aD < bD then
return true
end
return false
end
local function getHookName(param, index)
if hookNames[param] then
return hookNames[param][index]
elseif param:len() > 2 then
return hookNames[param:sub(1, 2).."\\d"][index]
else
return nil
end
end
local function alwaysTrue()
return true
end
-- The following function parses a format string.
--
-- The example below shows how a parsed string is structured in memory.
-- Variables other than 'str' and 'child' are left out for clarity's sake.
--
-- Example:
-- "A %p B [%s[%q1]] C [%r] D"
--
-- Structure:
-- [
-- {
-- str = "A "
-- },
-- {
-- str = "%p"
-- },
-- {
-- str = " B ",
-- child =
-- [
-- {
-- str = "%s",
-- child =
-- [
-- {
-- str = "%q1"
-- }
-- ]
-- }
-- ]
-- },
-- {
-- str = " C ",
-- child =
-- [
-- {
-- str = "%r"
-- }
-- ]
-- },
-- {
-- str = " D"
-- }
-- ]
--
local function parseFormat(str)
local chr, esc, param, root, cur, prev, new
local params = {}
local function newObject(array)
local obj = {} -- new object
obj.str = ""
array[#array + 1] = obj -- array{object}
obj.parent = array
return obj
end
local function endParam()
if param > 0 then
if cur.str ~= "" then
cur.str = "%"..cur.str
cur.param = true
params[cur.str] = true
cur.parent.req[cur.str] = true
prev = cur
cur = newObject(cur.parent)
end
param = 0
end
end
root = {} -- array
root.req = {}
cur = newObject(root)
prev = nil
esc = false
param = 0
for i = 1, #str do
chr = str:sub(i,i)
if not esc then
if chr == '\\' then
endParam()
esc = true
elseif chr == '%' then
endParam()
if cur.str ~= "" then
cur = newObject(cur.parent)
end
param = 2
elseif chr == '[' then
endParam()
if prev and cur.str == "" then
table.remove(cur.parent)
cur = prev
end
cur.child = {} -- new array
cur.child.req = {}
cur.child.parent = cur
cur = newObject(cur.child)
elseif chr == ']' then
endParam()
if cur.parent.parent then
new = newObject(cur.parent.parent.parent)
if cur.str == "" then
table.remove(cur.parent)
end
cur = new
end
else
if param > 1 then
param = param - 1
elseif param == 1 then
if not chr:match('%d') then
endParam()
end
end
cur.str = cur.str .. replaceSpecialChar(chr)
end
else
cur.str = cur.str .. chr
esc = false
end
prev = nil
end
endParam()
-- make sure that at least one required parameter has been defined
if not next(root.req) then
throwError("missing-required-parameter")
end
-- make sure that the separator parameter "%s" is not amongst the required parameters
if root.req[parameters.separator] then
throwError("extra-required-parameter", parameters.separator)
end
return root, params
end
local function sortOnRank(claims)
local rankPos
local ranks = {{}, {}, {}, {}} -- preferred, normal, deprecated, (default)
local sorted = {}
for _, v in ipairs(claims) do
rankPos = rankTable[v.rank] or 4
ranks[rankPos][#ranks[rankPos] + 1] = v
end
sorted = ranks[1]
sorted = mergeArrays(sorted, ranks[2])
sorted = mergeArrays(sorted, ranks[3])
return sorted
end
local function isValueInTable(searchedItem, inputTable)
for _, item in pairs(inputTable) do
if item == searchedItem then
return true
end
end
return false
end
local Config = {}
-- allows for recursive calls
function Config:new()
local cfg = {}
setmetatable(cfg, self)
self.__index = self
cfg.separators = {
-- single value objects wrapped in arrays so that we can pass by reference
["sep"] = {copyTable(defaultSeparators["sep"])},
["sep%s"] = {copyTable(defaultSeparators["sep%s"])},
["sep%q"] = {copyTable(defaultSeparators["sep%q"])},
["sep%r"] = {copyTable(defaultSeparators["sep%r"])},
["punc"] = {copyTable(defaultSeparators["punc"])}
}
cfg.entity = nil
cfg.entityID = nil
cfg.propertyID = nil
cfg.propertyValue = nil
cfg.qualifierIDs = {}
cfg.qualifierIDsAndValues = {}
cfg.bestRank = true
cfg.ranks = {true, true, false} -- preferred = true, normal = true, deprecated = false
cfg.foundRank = #cfg.ranks
cfg.flagBest = false
cfg.flagRank = false
cfg.periods = {true, true, true} -- future = true, current = true, former = true
cfg.flagPeriod = false
cfg.atDate = {parseDate(os.date('!%Y-%m-%d'))} -- today as {year, month, day}
cfg.mdyDate = false
cfg.singleClaim = false
cfg.sourcedOnly = false
cfg.editable = false
cfg.editAtEnd = false
cfg.inSitelinks = false
cfg.langCode = mw.language.getContentLanguage().code
cfg.langName = mw.language.fetchLanguageName(cfg.langCode, cfg.langCode)
cfg.langObj = mw.language.new(cfg.langCode)
cfg.siteID = mw.wikibase.getGlobalSiteId()
cfg.states = {}
cfg.states.qualifiersCount = 0
cfg.curState = nil
cfg.prefetchedRefs = nil
return cfg
end
local State = {}
function State:new(cfg, type)
local stt = {}
setmetatable(stt, self)
self.__index = self
stt.conf = cfg
stt.type = type
stt.results = {}
stt.parsedFormat = {}
stt.separator = {}
stt.movSeparator = {}
stt.puncMark = {}
stt.linked = false
stt.rawValue = false
stt.shortName = false
stt.anyLanguage = false
stt.unitOnly = false
stt.singleValue = false
return stt
end
-- if id == nil then item connected to current page is used
function Config:getLabel(id, raw, link, short)
local label = nil
local prefix, title= "", nil
if not id then
id = mw.wikibase.getEntityIdForCurrentPage()
if not id then
return ""
end
end
id = id:upper() -- just to be sure
if raw then
-- check if given id actually exists
if mw.wikibase.isValidEntityId(id) and mw.wikibase.entityExists(id) then
label = id
end
prefix, title = "d:Special:EntityPage/", label -- may be nil
else
-- try short name first if requested
if short then
label = p._property{aliasesP.shortName, [p.args.eid] = id} -- get short name
if label == "" then
label = nil
end
end
-- get label
if not label then
label = mw.wikibase.getLabel(id)
end
end
if not label then
label = ""
elseif link then
-- build a link if requested
if not title then
if id:sub(1,1) == "Q" then
title = mw.wikibase.getSitelink(id)
elseif id:sub(1,1) == "P" then
-- properties have no sitelink, link to Wikidata instead
prefix, title = "d:Special:EntityPage/", id
end
end
label = mw.text.nowiki(label) -- escape raw label text so it cannot be wikitext markup
if title then
label = buildWikilink(prefix .. title, label)
end
end
return label
end
function Config:getEditIcon()
local value = ""
local prefix = ""
local front = " "
local back = ""
if self.entityID:sub(1,1) == "P" then
prefix = "Property:"
end
if self.editAtEnd then
front = '<span style="float:'
if self.langObj:isRTL() then
front = front .. 'left'
else
front = front .. 'right'
end
front = front .. '">'
back = '</span>'
end
value = "[[File:OOjs UI icon edit-ltr-progressive.svg|frameless|text-top|10px|alt=" .. i18n['info']['edit-on-wikidata'] .. "|link=https://www.wikidata.org/wiki/" .. prefix .. self.entityID .. "?uselang=" .. self.langCode
if self.propertyID then
value = value .. "#" .. self.propertyID
elseif self.inSitelinks then
value = value .. "#sitelinks-wikipedia"
end
value = value .. "|" .. i18n['info']['edit-on-wikidata'] .. "]]"
return front .. value .. back
end
-- used to create the final output string when it's all done, so that for references the
-- function extensionTag("ref", ...) is only called when they really ended up in the final output
function Config:concatValues(valuesArray)
local outString = ""
local j, skip
for i = 1, #valuesArray do
-- check if this is a reference
if valuesArray[i].refHash then
j = i - 1
skip = false
-- skip this reference if it is part of a continuous row of references that already contains the exact same reference
while valuesArray[j] and valuesArray[j].refHash do
if valuesArray[i].refHash == valuesArray[j].refHash then
skip = true
break
end
j = j - 1
end
if not skip then
-- add <ref> tag with the reference's hash as its name (to deduplicate references)
outString = outString .. mw.getCurrentFrame():extensionTag("ref", valuesArray[i][1], {name = valuesArray[i].refHash})
end
else
outString = outString .. valuesArray[i][1]
end
end
return outString
end
function Config:convertUnit(unit, raw, link, short, unitOnly)
local space = " "
local label = ""
local itemID
if unit == "" or unit == "1" then
return nil
end
if unitOnly then
space = ""
end
itemID = parseWikidataURL(unit)
if itemID then
if itemID == aliasesQ.percentage then
return "%"
else
label = self:getLabel(itemID, raw, link, short)
if label ~= "" then
return space .. label
end
end
end
return ""
end
function State:getValue(snak)
return self.conf:getValue(snak, self.rawValue, self.linked, self.shortName, self.anyLanguage, self.unitOnly, false, self.type:sub(1,2))
end
function Config:getValue(snak, raw, link, short, anyLang, unitOnly, noSpecial, type)
if snak.snaktype == 'value' then
local datatype = snak.datavalue.type
local subtype = snak.datatype
local datavalue = snak.datavalue.value
if datatype == 'string' then
if subtype == 'url' and link then
-- create link explicitly
if raw then
-- will render as a linked number like [1]
return "[" .. datavalue .. "]"
else
return "[" .. datavalue .. " " .. datavalue .. "]"
end
elseif subtype == 'commonsMedia' then
if link then
return buildWikilink("c:File:" .. datavalue, datavalue)
elseif not raw then
return "[[File:" .. datavalue .. "]]"
else
return datavalue
end
elseif subtype == 'geo-shape' and link then
return buildWikilink("c:" .. datavalue, datavalue)
elseif subtype == 'math' and not raw then
local attribute = nil
if (type == parameters.property or (type == parameters.qualifier and self.propertyID == aliasesP.hasPart)) and snak.property == aliasesP.definingFormula then
attribute = {qid = self.entityID}
end
return mw.getCurrentFrame():extensionTag("math", datavalue, attribute)
elseif subtype == 'external-id' and link then
local url = p._property{p.flags.raw, aliasesP.formatterURL, [p.args.eid] = snak.property} -- get formatter URL
if url ~= "" then
url = mw.ustring.gsub(url, "$1", datavalue)
return "[" .. url .. " " .. datavalue .. "]"
else
return datavalue
end
else
return datavalue
end
elseif datatype == 'monolingualtext' then
if anyLang or datavalue['language'] == self.langCode then
return datavalue['text']
else
return nil
end
elseif datatype == 'quantity' then
local value = ""
local unit
if not unitOnly then
-- get value and strip + signs from front
value = mw.ustring.gsub(datavalue['amount'], "^%+(.+)$", "%1")
if raw then
return value
end
-- replace decimal mark based on locale
value = replaceDecimalMark(value)
-- add delimiters for readability
value = i18n.addDelimiters(value)
end
unit = self:convertUnit(datavalue['unit'], raw, link, short, unitOnly)
if unit then
value = value .. unit
end
return value
elseif datatype == 'time' then
local y, m, d, p, yDiv, yRound, yFull, value, calendarID, dateStr
local yFactor = 1
local sign = 1
local prefix = ""
local suffix = ""
local mayAddCalendar = false
local calendar = ""
local precision = datavalue['precision']
if precision == 11 then
p = "d"
elseif precision == 10 then
p = "m"
else
p = "y"
yFactor = 10^(9-precision)
end
y, m, d = parseDate(datavalue['time'], p)
if y < 0 then
sign = -1
y = y * sign
end
-- if precision is tens/hundreds/thousands/millions/billions of years
if precision <= 8 then
yDiv = y / yFactor
-- if precision is tens/hundreds/thousands of years
if precision >= 6 then
mayAddCalendar = true
if precision <= 7 then
-- round centuries/millenniums up (e.g. 20th century or 3rd millennium)
yRound = math.ceil(yDiv)
if not raw then
if precision == 6 then
suffix = i18n['datetime']['suffixes']['millennium']
else
suffix = i18n['datetime']['suffixes']['century']
end
suffix = i18n.getOrdinalSuffix(yRound) .. suffix
else
-- if not verbose, take the first year of the century/millennium
-- (e.g. 1901 for 20th century or 2001 for 3rd millennium)
yRound = (yRound - 1) * yFactor + 1
end
else
-- precision == 8
-- round decades down (e.g. 2010s)
yRound = math.floor(yDiv) * yFactor
if not raw then
prefix = i18n['datetime']['prefixes']['decade-period']
suffix = i18n['datetime']['suffixes']['decade-period']
end
end
if raw and sign < 0 then
-- if BCE then compensate for "counting backwards"
-- (e.g. -2019 for 2010s BCE, -2000 for 20th century BCE or -3000 for 3rd millennium BCE)
yRound = yRound + yFactor - 1
end
else
local yReFactor, yReDiv, yReRound
-- round to nearest for tens of thousands of years or more
yRound = math.floor(yDiv + 0.5)
if yRound == 0 then
if precision <= 2 and y ~= 0 then
yReFactor = 1e6
yReDiv = y / yReFactor
yReRound = math.floor(yReDiv + 0.5)
if yReDiv == yReRound then
-- change precision to millions of years only if we have a whole number of them
precision = 3
yFactor = yReFactor
yRound = yReRound
end
end
if yRound == 0 then
-- otherwise, take the unrounded (original) number of years
precision = 5
yFactor = 1
yRound = y
mayAddCalendar = true
end
end
if precision >= 1 and y ~= 0 then
yFull = yRound * yFactor
yReFactor = 1e9
yReDiv = yFull / yReFactor
yReRound = math.floor(yReDiv + 0.5)
if yReDiv == yReRound then
-- change precision to billions of years if we're in that range
precision = 0
yFactor = yReFactor
yRound = yReRound
else
yReFactor = 1e6
yReDiv = yFull / yReFactor
yReRound = math.floor(yReDiv + 0.5)
if yReDiv == yReRound then
-- change precision to millions of years if we're in that range
precision = 3
yFactor = yReFactor
yRound = yReRound
end
end
end
if not raw then
if precision == 3 then
suffix = i18n['datetime']['suffixes']['million-years']
elseif precision == 0 then
suffix = i18n['datetime']['suffixes']['billion-years']
else
yRound = yRound * yFactor
if yRound == 1 then
suffix = i18n['datetime']['suffixes']['year']
else
suffix = i18n['datetime']['suffixes']['years']
end
end
else
yRound = yRound * yFactor
end
end
else
yRound = y
mayAddCalendar = true
end
if mayAddCalendar then
calendarID = parseWikidataURL(datavalue['calendarmodel'])
if calendarID and calendarID == aliasesQ.prolepticJulianCalendar then
if not raw then
if link then
calendar = " ("..buildWikilink(i18n['datetime']['julian-calendar'], i18n['datetime']['julian'])..")"
else
calendar = " ("..i18n['datetime']['julian']..")"
end
else
calendar = "/"..i18n['datetime']['julian']
end
end
end
if not raw then
local ce = nil
if sign < 0 then
ce = i18n['datetime']['BCE']
elseif precision <= 5 then
ce = i18n['datetime']['CE']
end
if ce then
if link then
ce = buildWikilink(i18n['datetime']['common-era'], ce)
end
suffix = suffix .. " " .. ce
end
value = tostring(yRound)
if m then
dateStr = self.langObj:formatDate("F", "1-"..m.."-1")
if d then
if self.mdyDate then
dateStr = dateStr .. " " .. d .. ","
else
dateStr = d .. " " .. dateStr
end
end
value = dateStr .. " " .. value
end
value = prefix .. value .. suffix .. calendar
else
value = padZeros(yRound * sign, 4)
if m then
value = value .. "-" .. padZeros(m, 2)
if d then
value = value .. "-" .. padZeros(d, 2)
end
end
value = value .. calendar
end
return value
elseif datatype == 'globecoordinate' then
-- logic from https://github.com/DataValues/Geo (v4.0.1)
local precision, unitsPerDegree, numDigits, strFormat, value, globe
local latitude, latConv, latValue, latLink
local longitude, lonConv, lonValue, lonLink
local latDirection, latDirectionN, latDirectionS, latDirectionEN
local lonDirection, lonDirectionE, lonDirectionW, lonDirectionEN
local degSymbol, minSymbol, secSymbol, separator
local latDegrees = nil
local latMinutes = nil
local latSeconds = nil
local lonDegrees = nil
local lonMinutes = nil
local lonSeconds = nil
local latDegSym = ""
local latMinSym = ""
local latSecSym = ""
local lonDegSym = ""
local lonMinSym = ""
local lonSecSym = ""
local latDirectionEN_N = "N"
local latDirectionEN_S = "S"
local lonDirectionEN_E = "E"
local lonDirectionEN_W = "W"
if not raw then
latDirectionN = i18n['coord']['latitude-north']
latDirectionS = i18n['coord']['latitude-south']
lonDirectionE = i18n['coord']['longitude-east']
lonDirectionW = i18n['coord']['longitude-west']
degSymbol = i18n['coord']['degrees']
minSymbol = i18n['coord']['minutes']
secSymbol = i18n['coord']['seconds']
separator = i18n['coord']['separator']
else
latDirectionN = latDirectionEN_N
latDirectionS = latDirectionEN_S
lonDirectionE = lonDirectionEN_E
lonDirectionW = lonDirectionEN_W
degSymbol = "/"
minSymbol = "/"
secSymbol = "/"
separator = "/"
end
latitude = datavalue['latitude']
longitude = datavalue['longitude']
if latitude < 0 then
latDirection = latDirectionS
latDirectionEN = latDirectionEN_S
latitude = math.abs(latitude)
else
latDirection = latDirectionN
latDirectionEN = latDirectionEN_N
end
if longitude < 0 then
lonDirection = lonDirectionW
lonDirectionEN = lonDirectionEN_W
longitude = math.abs(longitude)
else
lonDirection = lonDirectionE
lonDirectionEN = lonDirectionEN_E
end
precision = datavalue['precision']
if not precision or precision <= 0 then
precision = 1 / 3600 -- precision not set (correctly), set to arcsecond
end
-- remove insignificant detail
latitude = math.floor(latitude / precision + 0.5) * precision
longitude = math.floor(longitude / precision + 0.5) * precision
if precision >= 1 - (1 / 60) and precision < 1 then
precision = 1
elseif precision >= (1 / 60) - (1 / 3600) and precision < (1 / 60) then
precision = 1 / 60
end
if precision >= 1 then
unitsPerDegree = 1
elseif precision >= (1 / 60) then
unitsPerDegree = 60
else
unitsPerDegree = 3600
end
numDigits = math.ceil(-math.log10(unitsPerDegree * precision))
if numDigits <= 0 then
numDigits = tonumber("0") -- for some reason, 'numDigits = 0' may actually store '-0', so parse from string instead
end
strFormat = "%." .. numDigits .. "f"
if precision >= 1 then
latDegrees = strFormat:format(latitude)
lonDegrees = strFormat:format(longitude)
if not raw then
latDegSym = replaceDecimalMark(latDegrees) .. degSymbol
lonDegSym = replaceDecimalMark(lonDegrees) .. degSymbol
else
latDegSym = latDegrees .. degSymbol
lonDegSym = lonDegrees .. degSymbol
end
else
latConv = math.floor(latitude * unitsPerDegree * 10^numDigits + 0.5) / 10^numDigits
lonConv = math.floor(longitude * unitsPerDegree * 10^numDigits + 0.5) / 10^numDigits
if precision >= (1 / 60) then
latMinutes = latConv
lonMinutes = lonConv
else
latSeconds = latConv
lonSeconds = lonConv
latMinutes = math.floor(latSeconds / 60)
lonMinutes = math.floor(lonSeconds / 60)
latSeconds = strFormat:format(latSeconds - (latMinutes * 60))
lonSeconds = strFormat:format(lonSeconds - (lonMinutes * 60))
if not raw then
latSecSym = replaceDecimalMark(latSeconds) .. secSymbol
lonSecSym = replaceDecimalMark(lonSeconds) .. secSymbol
else
latSecSym = latSeconds .. secSymbol
lonSecSym = lonSeconds .. secSymbol
end
end
latDegrees = math.floor(latMinutes / 60)
lonDegrees = math.floor(lonMinutes / 60)
latDegSym = latDegrees .. degSymbol
lonDegSym = lonDegrees .. degSymbol
latMinutes = latMinutes - (latDegrees * 60)
lonMinutes = lonMinutes - (lonDegrees * 60)
if precision >= (1 / 60) then
latMinutes = strFormat:format(latMinutes)
lonMinutes = strFormat:format(lonMinutes)
if not raw then
latMinSym = replaceDecimalMark(latMinutes) .. minSymbol
lonMinSym = replaceDecimalMark(lonMinutes) .. minSymbol
else
latMinSym = latMinutes .. minSymbol
lonMinSym = lonMinutes .. minSymbol
end
else
latMinSym = latMinutes .. minSymbol
lonMinSym = lonMinutes .. minSymbol
end
end
latValue = latDegSym .. latMinSym .. latSecSym .. latDirection
lonValue = lonDegSym .. lonMinSym .. lonSecSym .. lonDirection
value = latValue .. separator .. lonValue
if link then
globe = parseWikidataURL(datavalue['globe'])
if globe then
globe = mw.wikibase.getLabelByLang(globe, "en"):lower()
else
globe = "earth"
end
latLink = table.concat({latDegrees, latMinutes, latSeconds}, "_")
lonLink = table.concat({lonDegrees, lonMinutes, lonSeconds}, "_")
value = "[https://geohack.toolforge.org/geohack.php?language="..self.langCode.."¶ms="..latLink.."_"..latDirectionEN.."_"..lonLink.."_"..lonDirectionEN.."_globe:"..globe.." "..value.."]"
end
return value
elseif datatype == 'wikibase-entityid' then
local label
local itemID = datavalue['numeric-id']
if subtype == 'wikibase-item' then
itemID = "Q" .. itemID
elseif subtype == 'wikibase-property' then
itemID = "P" .. itemID
else
return '<strong class="error">' .. errorText('unknown-data-type', subtype) .. '</strong>'
end
label = self:getLabel(itemID, raw, link, short)
if label == "" then
label = nil
end
return label
else
return '<strong class="error">' .. errorText('unknown-data-type', datatype) .. '</strong>'
end
elseif snak.snaktype == 'somevalue' and not noSpecial then
if raw then
return " " -- single space represents 'somevalue'
else
return i18n['values']['unknown']
end
elseif snak.snaktype == 'novalue' and not noSpecial then
if raw then
return "" -- empty string represents 'novalue'
else
return i18n['values']['none']
end
else
return nil
end
end
function Config:getSingleRawQualifier(claim, qualifierID)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[qualifierID] end
if qualifiers and qualifiers[1] then
return self:getValue(qualifiers[1], true) -- raw = true
else
return nil
end
end
function Config:snakEqualsValue(snak, value)
local snakValue = self:getValue(snak, true) -- raw = true
if snakValue and snak.snaktype == 'value' and snak.datavalue.type == 'wikibase-entityid' then value = value:upper() end
return snakValue == value
end
function Config:setRank(rank)
local rankPos
if rank == p.flags.best then
self.bestRank = true
self.flagBest = true -- mark that 'best' flag was given
return
end
if rank:sub(1,9) == p.flags.preferred then
rankPos = 1
elseif rank:sub(1,6) == p.flags.normal then
rankPos = 2
elseif rank:sub(1,10) == p.flags.deprecated then
rankPos = 3
else
return
end
-- one of the rank flags was given, check if another one was given before
if not self.flagRank then
self.ranks = {false, false, false} -- no other rank flag given before, so unset ranks
self.bestRank = self.flagBest -- unsets bestRank only if 'best' flag was not given before
self.flagRank = true -- mark that a rank flag was given
end
if rank:sub(-1) == "+" then
for i = rankPos, 1, -1 do
self.ranks[i] = true
end
elseif rank:sub(-1) == "-" then
for i = rankPos, #self.ranks do
self.ranks[i] = true
end
else
self.ranks[rankPos] = true
end
end
function Config:setPeriod(period)
local periodPos
if period == p.flags.future then
periodPos = 1
elseif period == p.flags.current then
periodPos = 2
elseif period == p.flags.former then
periodPos = 3
else
return
end
-- one of the period flags was given, check if another one was given before
if not self.flagPeriod then
self.periods = {false, false, false} -- no other period flag given before, so unset periods
self.flagPeriod = true -- mark that a period flag was given
end
self.periods[periodPos] = true
end
function Config:qualifierMatches(claim, id, value)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[id] end
if qualifiers then
for _, v in pairs(qualifiers) do
if self:snakEqualsValue(v, value) then
return true
end
end
elseif value == "" then
-- if the qualifier is not present then treat it the same as the special value 'novalue'
return true
end
return false
end
function Config:rankMatches(rankPos)
if self.bestRank then
return (self.ranks[rankPos] and self.foundRank >= rankPos)
else
return self.ranks[rankPos]
end
end
function Config:timeMatches(claim)
local startTime = nil
local startTimeY = nil
local startTimeM = nil
local startTimeD = nil
local endTime = nil
local endTimeY = nil
local endTimeM = nil
local endTimeD = nil
if self.periods[1] and self.periods[2] and self.periods[3] then
-- any time
return true
end
startTime = self:getSingleRawQualifier(claim, aliasesP.startTime)
if startTime and startTime ~= "" and startTime ~= " " then
startTimeY, startTimeM, startTimeD = parseDate(startTime)
end
endTime = self:getSingleRawQualifier(claim, aliasesP.endTime)
if endTime and endTime ~= "" and endTime ~= " " then
endTimeY, endTimeM, endTimeD = parseDate(endTime)
end
if startTimeY ~= nil and endTimeY ~= nil and datePrecedesDate(endTimeY, endTimeM, endTimeD, startTimeY, startTimeM, startTimeD) then
-- invalidate end time if it precedes start time
endTimeY = nil
endTimeM = nil
endTimeD = nil
end
if self.periods[1] then
-- future
if startTimeY and datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], startTimeY, startTimeM, startTimeD) then
return true
end
end
if self.periods[2] then
-- current
if (startTimeY == nil or not datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], startTimeY, startTimeM, startTimeD)) and
(endTimeY == nil or datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], endTimeY, endTimeM, endTimeD)) then
return true
end
end
if self.periods[3] then
-- former
if endTimeY and not datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], endTimeY, endTimeM, endTimeD) then
return true
end
end
return false
end
function Config:processFlag(flag)
if not flag then
return false
end
if flag == p.flags.linked then
self.curState.linked = true
return true
elseif flag == p.flags.raw then
self.curState.rawValue = true
if self.curState == self.states[parameters.reference] then
-- raw reference values end with periods and require a separator (other than none)
self.separators["sep%r"][1] = {" "}
end
return true
elseif flag == p.flags.short then
self.curState.shortName = true
return true
elseif flag == p.flags.multilanguage then
self.curState.anyLanguage = true
return true
elseif flag == p.flags.unit then
self.curState.unitOnly = true
return true
elseif flag == p.flags.mdy then
self.mdyDate = true
return true
elseif flag == p.flags.single then
self.singleClaim = true
return true
elseif flag == p.flags.sourced then
self.sourcedOnly = true
return true
elseif flag == p.flags.edit then
self.editable = true
return true
elseif flag == p.flags.editAtEnd then
self.editable = true
self.editAtEnd = true
return true
elseif flag == p.flags.best or flag:match('^'..p.flags.preferred..'[+-]?$') or flag:match('^'..p.flags.normal..'[+-]?$') or flag:match('^'..p.flags.deprecated..'[+-]?$') then
self:setRank(flag)
return true
elseif flag == p.flags.future or flag == p.flags.current or flag == p.flags.former then
self:setPeriod(flag)
return true
elseif flag == "" then
-- ignore empty flags and carry on
return true
else
return false
end
end
function Config:processFlagOrCommand(flag)
local param = ""
if not flag then
return false
end
if flag == p.claimCommands.property or flag == p.claimCommands.properties then
param = parameters.property
elseif flag == p.claimCommands.qualifier or flag == p.claimCommands.qualifiers then
self.states.qualifiersCount = self.states.qualifiersCount + 1
param = parameters.qualifier .. self.states.qualifiersCount
self.separators["sep"..param] = {copyTable(defaultSeparators["sep%q\\d"])}
elseif flag == p.claimCommands.reference or flag == p.claimCommands.references then
param = parameters.reference
else
return self:processFlag(flag)
end
if self.states[param] then
return false
end
-- create a new state for each command
self.states[param] = State:new(self, param)
-- use "%x" as the general parameter name
self.states[param].parsedFormat = parseFormat(parameters.general) -- will be overwritten for param=="%p"
-- set the separator
self.states[param].separator = self.separators["sep"..param] -- will be nil for param=="%p", which will be set separately
if flag == p.claimCommands.property or flag == p.claimCommands.qualifier or flag == p.claimCommands.reference then
self.states[param].singleValue = true
end
self.curState = self.states[param]
return true
end
function Config:processSeparators(args)
local sep
for i, v in pairs(self.separators) do
if args[i] then
sep = replaceSpecialChars(args[i])
if sep ~= "" then
self.separators[i][1] = {sep}
else
self.separators[i][1] = nil
end
end
end
end
function Config:setFormatAndSeparators(state, parsedFormat)
state.parsedFormat = parsedFormat
state.separator = self.separators["sep"]
state.movSeparator = self.separators["sep"..parameters.separator]
state.puncMark = self.separators["punc"]
end
-- determines if a claim has references by prefetching them from the claim using getReferences,
-- which applies some filtering that determines if a reference is actually returned,
-- and caches the references for later use
function State:isSourced(claim)
self.conf.prefetchedRefs = self:getReferences(claim)
return (#self.conf.prefetchedRefs > 0)
end
function State:resetCaches()
-- any prefetched references of the previous claim must not be used
self.conf.prefetchedRefs = nil
end
function State:claimMatches(claim)
local matches, rankPos
-- first of all, reset any cached values used for the previous claim
self:resetCaches()
-- if a property value was given, check if it matches the claim's property value
if self.conf.propertyValue then
matches = self.conf:snakEqualsValue(claim.mainsnak, self.conf.propertyValue)
else
matches = true
end
-- if any qualifier values were given, check if each matches one of the claim's qualifier values
for i, v in pairs(self.conf.qualifierIDsAndValues) do
matches = (matches and self.conf:qualifierMatches(claim, i, v))
end
-- check if the claim's rank and time period match
rankPos = rankTable[claim.rank] or 4
matches = (matches and self.conf:rankMatches(rankPos) and self.conf:timeMatches(claim))
-- if only claims with references must be returned, check if this one has any
if self.conf.sourcedOnly then
matches = (matches and self:isSourced(claim)) -- prefetches and caches references
end
return matches, rankPos
end
function State:out()
local result -- collection of arrays with value objects
local valuesArray -- array with value objects
local sep = nil -- value object
local out = {} -- array with value objects
local function walk(formatTable, result)
local valuesArray = {} -- array with value objects
for i, v in pairs(formatTable.req) do
if not result[i] or not result[i][1] then
-- we've got no result for a parameter that is required on this level,
-- so skip this level (and its children) by returning an empty result
return {}
end
end
for _, v in ipairs(formatTable) do
if v.param then
valuesArray = mergeArrays(valuesArray, result[v.str])
elseif v.str ~= "" then
valuesArray[#valuesArray + 1] = {v.str}
end
if v.child then
valuesArray = mergeArrays(valuesArray, walk(v.child, result))
end
end
return valuesArray
end
-- iterate through the results from back to front, so that we know when to add separators
for i = #self.results, 1, -1 do
result = self.results[i]
-- if there is already some output, then add the separators
if #out > 0 then
sep = self.separator[1] -- fixed separator
result[parameters.separator] = {self.movSeparator[1]} -- movable separator
else
sep = nil
result[parameters.separator] = {self.puncMark[1]} -- optional punctuation mark
end
valuesArray = walk(self.parsedFormat, result)
if #valuesArray > 0 then
if sep then
valuesArray[#valuesArray + 1] = sep
end
out = mergeArrays(valuesArray, out)
end
end
-- reset state before next iteration
self.results = {}
return out
end
-- level 1 hook
function State:getProperty(claim)
local value = {self:getValue(claim.mainsnak)} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
-- level 1 hook
function State:getQualifiers(claim, param)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[self.conf.qualifierIDs[param]] end
if qualifiers then
-- iterate through claim's qualifier statements to collect their values;
-- return array with multiple value objects
return self.conf.states[param]:iterate(qualifiers, {[parameters.general] = hookNames[parameters.qualifier.."\\d"][2], count = 1}) -- pass qualifier state with level 2 hook
else
return {} -- return empty array
end
end
-- level 2 hook
function State:getQualifier(snak)
local value = {self:getValue(snak)} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
-- level 1 hook
function State:getAllQualifiers(claim, param, result, hooks)
local out = {} -- array with value objects
local sep = self.conf.separators["sep"..parameters.qualifier][1] -- value object
-- iterate through the output of the separate "qualifier(s)" commands
for i = 1, self.conf.states.qualifiersCount do
-- if a hook has not been called yet, call it now
if not result[parameters.qualifier..i] then
self:callHook(parameters.qualifier..i, hooks, claim, result)
end
-- if there is output for this particular "qualifier(s)" command, then add it
if result[parameters.qualifier..i] and result[parameters.qualifier..i][1] then
-- if there is already some output, then add the separator
if #out > 0 and sep then
out[#out + 1] = sep
end
out = mergeArrays(out, result[parameters.qualifier..i])
end
end
return out
end
-- level 1 hook
function State:getReferences(claim)
if self.conf.prefetchedRefs then
-- return references that have been prefetched by isSourced
return self.conf.prefetchedRefs
end
if claim.references then
-- iterate through claim's reference statements to collect their values;
-- return array with multiple value objects
return self.conf.states[parameters.reference]:iterate(claim.references, {[parameters.general] = hookNames[parameters.reference][2], count = 1}) -- pass reference state with level 2 hook
else
return {} -- return empty array
end
end
-- level 2 hook
function State:getReference(statement)
local citeParamMapping = i18n['cite']['param-mapping']
local citeConfig = i18n['cite']['config']
local citeTypes = i18n['cite']['output-types']
-- for each citation type, there will be an associative array that associates lists of rendered properties
-- to citation-template parameters
local candidateParams = {}
-- like above, but only associates one rendered property to each parameter; if the above variable
-- contains more strings for a parameter, the strings will be assigned to numbered params (e.g. "author1")
local citeParams = {}
local citeErrors = {}
local referenceEmpty = true -- will be set to false if at least one parameter is left unremoved
local version = 13 -- increment this each time the below logic is changed to avoid conflict errors
if not statement.snaks then
return {}
end
-- don't use bot-added references referencing Wikimedia projects or containing "inferred from" (such references are not usable on Wikipedia)
if statement.snaks[aliasesP.importedFrom] or statement.snaks[aliasesP.wikimediaImportURL] or statement.snaks[aliasesP.inferredFrom] then
return {}
end
-- don't include "type of reference"
if statement.snaks[aliasesP.typeOfReference] then
statement.snaks[aliasesP.typeOfReference] = nil
end
-- don't include "image" to prevent littering
if statement.snaks[aliasesP.image] then
statement.snaks[aliasesP.image] = nil
end
-- initialize candidateParams and citeParams
for _, citeType in ipairs(citeTypes) do
candidateParams[citeType] = {}
citeParams[citeType] = {}
end
-- fill candidateParams
for _, citeType in ipairs(citeTypes) do
-- This will contain value--priority pairs for each param name.
local candidateValuesAndPriorities = {}
-- fill candidateValuesAndPriorities
for refProperty in pairs(statement.snaks) do
if citeErrors[citeType] then
break
end
repeat -- just a simple wrapper to emulate "continue"
-- set mappingKey
local mappingKey
if statement.snaks[refProperty][1].datatype == 'external-id' then
mappingKey = "external-id"
else
mappingKey = refProperty
end
local paramName = citeParamMapping[citeType][mappingKey]
-- skip properties with empty parameter name
if paramName == "" then
break -- skip this property for this value of citeType
end
-- handle unknown properties in the reference
if not paramName then
referenceEmpty = false
local propertyWikitext = "[[d:Special:EntityPage/" .. refProperty .. "|" .. self.conf:getLabel(refProperty) .. " (" .. refProperty .. ")]]"
local error_message = errorText("unknown-property-in-ref", propertyWikitext)
assert(error_message) -- Should not be nil
citeErrors[citeType] = error_message
break
end
-- set processedProperty
local processedProperty
local raw = false -- if the value is wanted raw
if isValueInTable(paramName, citeConfig[citeType]["raw-value-params"] or {}) then
raw = true
end
local customRenderer = nil
if citeConfig[citeType]["customRenderers"] then
customRenderer = citeConfig[citeType]["customRenderers"][paramName]
end
if isValueInTable(paramName, citeConfig[citeType]["numbered-params"] or {}) then
-- Multiple values may be given.
processedProperty = self:getReferenceDetails(statement.snaks, refProperty, raw, self.linked, true, customRenderer) -- anyLang = true
else
-- If multiple values are given, all but the first suitable one are discarted.
processedProperty = {self:getReferenceDetail(statement.snaks, refProperty, raw, self.linked and (statement.snaks[refProperty][1].datatype ~= 'url'), true, customRenderer)} -- link = true/false, anyLang = true
end
if #processedProperty == 0 then
break
end
referenceEmpty = false
-- add an empty entry to candidateValuesAndPriorities, if there isn't one already
if not candidateValuesAndPriorities[paramName] then
candidateValuesAndPriorities[paramName] = {}
end
-- find the priority of refProperty
-- (the actual index is mappingKey, not refProperty, because of external IDs)
local thisPropertyPriority = -1
local thisParamPrioritization = (citeConfig[citeType]["prioritization"] or {})[paramName]
if thisParamPrioritization then
for i_priority, i_key in ipairs(thisParamPrioritization) do
if i_key == mappingKey then
thisPropertyPriority = i_priority
end
end
end
for _, propertyValue in pairs(processedProperty) do
table.insert(
candidateValuesAndPriorities[paramName],
{propertyValue, thisPropertyPriority}
)
end
until true
end
-- fill candidateParams[citeType]
if not citeErrors[citeType] then
local compareValuePriorities = function(pair1, pair2)
if pair1[2] == -1 and pair2[2] ~= -1 then
return false
end
if pair1[2] ~= -1 and pair2[2] == -1 then
return true
end
return pair1[2] < pair2[2]
end
-- fill candidateParams[citeType][paramName] for each used param
for paramName, _ in pairs(candidateValuesAndPriorities) do
table.sort(candidateValuesAndPriorities[paramName], compareValuePriorities)
candidateParams[citeType][paramName] = {}
for _, valuePriorityPair in ipairs(candidateValuesAndPriorities[paramName]) do
table.insert(candidateParams[citeType][paramName], valuePriorityPair[1])
end
end
end
end
-- fill citeParams
for _, citeType in ipairs(citeTypes) do
for paramName, paramValues in pairs(candidateParams[citeType]) do
if #paramValues == 1 or not isValueInTable(paramName, citeConfig[citeType]["numbered-params"] or {}) then
citeParams[citeType][paramName] = paramValues[1]
else
-- There is more than one value for this parameter - the values will
-- go into separate numbered parameters (e.g. "author1", "author2")
for paramNum, paramValue in pairs(paramValues) do
citeParams[citeType][paramName .. paramNum] = paramValue
end
end
end
end
-- handle missing mandatory parameters for the templates
for _, citeType in ipairs(citeTypes) do
for _, requiredCiteParam in pairs(citeConfig[citeType]["mandatory-params"] or {}) do
if not citeParams[citeType][requiredCiteParam] then -- The required param is not present.
if citeErrors[citeType] then -- Do not override the previous error, if it exists.
break
end
local error_message = errorText("missing-mandatory-param", requiredCiteParam)
assert(error_message) -- Should not be nil
citeErrors[citeType] = error_message
end
end
end
local citeTypeToUse = nil
-- choose the output template
for _, citeType in ipairs(citeTypes) do
if not citeErrors[citeType] then
citeTypeToUse = citeType
break
end
end
-- set refContent
local refContent = ""
if citeTypeToUse then
local templateToUse = citeConfig[citeTypeToUse]["template"]
local paramsToUse = citeParams[citeTypeToUse]
if not templateToUse or templateToUse == "" then
throwError("no-such-reference-template", tostring(templateToUse), i18nPath, citeTypeToUse)
end
-- if this module is being substituted then build a regular template call, otherwise expand the template
if mw.isSubsting() then
for i, v in pairs(paramsToUse) do
refContent = refContent .. "|" .. i .. "=" .. v
end
refContent = "{{" .. templateToUse .. refContent .. "}}"
else
xpcall(
function () refContent = mw.getCurrentFrame():expandTemplate{title=templateToUse, args=paramsToUse} end,
function () throwError("no-such-reference-template", templateToUse, i18nPath, citeTypeToUse) end
)
end
-- If the citation couldn't be displayed using any template, but is not empty (barring ignored propeties), throw an error.
elseif not referenceEmpty then
refContent = errorText("malformed-reference-header")
for _, citeType in ipairs(citeTypes) do
local templateWikitext = "<nowiki>{{</nowiki>[[Template:" .. citeConfig[citeType]["template"] .. "|" .. citeConfig[citeType]["template"] .. "]]<nowiki>}}</nowiki>"
refContent = refContent .. errorText("template-failure-reason", templateWikitext, citeErrors[citeType])
end
refContent = refContent .. errorText("malformed-reference-footer")
end
-- wrap refContent
local ref = {}
if refContent ~= "" then
ref = {refContent}
if not self.rawValue then
-- this should become a <ref> tag, so save the reference's hash for later
ref.refHash = "wikidata-" .. statement.hash .. "-v" .. (tonumber(i18n['version']) + version)
end
return {ref}
else
return {}
end
end
-- gets a detail of one particular type for a reference
function State:getReferenceDetail(snaks, dType, raw, link, anyLang, customRenderer)
local switchLang = anyLang
local value = nil
if not snaks[dType] then
return nil
end
-- if anyLang, first try the local language and otherwise any language
repeat
for _, v in ipairs(snaks[dType]) do
local defaultRenderer = function ()
return self.conf:getValue(v, raw, link, false, anyLang and not switchLang, false, true) -- noSpecial = true
end
if customRenderer then
value = customRenderer(
v, dType,
defaultRenderer,
p._properties,
function (...) return self.conf:getValue(unpack(arg)) end,
snaks
)
else
value = defaultRenderer()
end
if value then
break
end
end
if value or not anyLang then
break
end
switchLang = not switchLang
until anyLang and switchLang
return value
end
-- gets the details of one particular type for a reference
function State:getReferenceDetails(snaks, dType, raw, link, anyLang, customRenderer)
local values = {}
if not snaks[dType] then
return {}
end
for _, v in ipairs(snaks[dType]) do
local defaultRenderer = function ()
return self.conf:getValue(v, raw, link, false, anyLang, false, true) -- noSpecial = true
end
local value
if customRenderer then
value = customRenderer(
v, dType,
defaultRenderer,
p._properties,
function (...) return self.conf:getValue(unpack(arg)) end,
snaks
)
else
value = defaultRenderer()
end
-- if value is nil then it will not be added to the table
values[#values + 1] = value
end
return values
end
-- level 1 hook
function State:getAlias(object)
local value = object.value
local title = nil
if value and self.linked then
if self.conf.entityID:sub(1,1) == "Q" then
title = mw.wikibase.getSitelink(self.conf.entityID)
elseif self.conf.entityID:sub(1,1) == "P" then
title = "d:Property:" .. self.conf.entityID
end
if title then
value = buildWikilink(title, value)
end
end
value = {value} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
-- level 1 hook
function State:getBadge(value)
value = self.conf:getLabel(value, self.rawValue, self.linked, self.shortName)
if value == "" then
value = nil
end
value = {value} -- create one value object
if #value > 0 then
return {value} -- wrap the value object in an array and return it
else
return {} -- return empty array if there was no value
end
end
function State:callHook(param, hooks, statement, result)
-- call a parameter's hook if it has been defined and if it has not been called before
if not result[param] and hooks[param] then
local valuesArray = self[hooks[param]](self, statement, param, result, hooks) -- array with value objects
-- add to the result
if #valuesArray > 0 then
result[param] = valuesArray
result.count = result.count + 1
else
result[param] = {} -- an empty array to indicate that we've tried this hook already
return true -- miss == true
end
end
return false
end
-- iterate through claims, claim's qualifiers or claim's references to collect values
function State:iterate(statements, hooks, matchHook)
matchHook = matchHook or alwaysTrue
local matches = false
local rankPos = nil
local result, gotRequired
for _, v in ipairs(statements) do
-- rankPos will be nil for non-claim statements (e.g. qualifiers, references, etc.)
matches, rankPos = matchHook(self, v)
if matches then
result = {count = 0} -- collection of arrays with value objects
local function walk(formatTable)
local miss
for i2, v2 in pairs(formatTable.req) do
-- call a hook, adding its return value to the result
miss = self:callHook(i2, hooks, v, result)
if miss then
-- we miss a required value for this level, so return false
return false
end
if result.count == hooks.count then
-- we're done if all hooks have been called;
-- returning at this point breaks the loop
return true
end
end
for _, v2 in ipairs(formatTable) do
if result.count == hooks.count then
-- we're done if all hooks have been called;
-- returning at this point prevents further childs from being processed
return true
end
if v2.child then
walk(v2.child)
end
end
return true
end
gotRequired = walk(self.parsedFormat)
-- only append the result if we got values for all required parameters on the root level
if gotRequired then
-- if we have a rankPos (only with matchHook() for complete claims), then update the foundRank
if rankPos and self.conf.foundRank > rankPos then
self.conf.foundRank = rankPos
end
-- append the result
self.results[#self.results + 1] = result
-- break if we only need a single value
if self.singleValue then
break
end
end
end
end
return self:out()
end
local function getEntityId(arg, eid, page, allowOmitPropPrefix, globalSiteId)
local id = nil
local prop = nil
if arg then
if arg:sub(1,1) == ":" then
page = arg
eid = nil
elseif arg:sub(1,1):upper() == "Q" or arg:sub(1,9):lower() == "property:" or allowOmitPropPrefix then
eid = arg
page = nil
else
prop = arg
end
end
if eid then
if eid:sub(1,9):lower() == "property:" then
id = replaceAlias(mw.text.trim(eid:sub(10)))
if id:sub(1,1):upper() ~= "P" then
id = ""
end
else
id = replaceAlias(eid)
end
elseif page then
if page:sub(1,1) == ":" then
page = mw.text.trim(page:sub(2))
end
id = mw.wikibase.getEntityIdForTitle(page, globalSiteId) or ""
end
if not id then
id = mw.wikibase.getEntityIdForCurrentPage() or ""
end
id = id:upper()
if not mw.wikibase.isValidEntityId(id) then
id = ""
end
return id, prop
end
local function nextArg(args)
local arg = args[args.pointer]
if arg then
args.pointer = args.pointer + 1
return mw.text.trim(arg)
else
return nil
end
end
local function claimCommand(args, funcName)
local cfg = Config:new()
cfg:processFlagOrCommand(funcName) -- process first command (== function name)
local lastArg, parsedFormat, formatParams, claims, value
local hooks = {count = 0}
-- set the date if given;
-- must come BEFORE processing the flags
if args[p.args.date] then
cfg.atDate = {parseDate(args[p.args.date])}
cfg.periods = {false, true, false} -- change default time constraint to 'current'
end
-- process flags and commands
repeat
lastArg = nextArg(args)
until not cfg:processFlagOrCommand(lastArg)
-- get the entity ID from either the positional argument, the eid argument or the page argument
cfg.entityID, cfg.propertyID = getEntityId(lastArg, args[p.args.eid], args[p.args.page], false, args[p.args.globalSiteId])
if cfg.entityID == "" then
return "" -- we cannot continue without a valid entity ID
end
cfg.entity = mw.wikibase.getEntity(cfg.entityID)
if not cfg.propertyID then
cfg.propertyID = nextArg(args)
end
cfg.propertyID = replaceAlias(cfg.propertyID)
if not cfg.entity or not cfg.propertyID then
return "" -- we cannot continue without an entity or a property ID
end
cfg.propertyID = cfg.propertyID:upper()
if not cfg.entity.claims or not cfg.entity.claims[cfg.propertyID] then
return "" -- there is no use to continue without any claims
end
claims = cfg.entity.claims[cfg.propertyID]
if cfg.states.qualifiersCount > 0 then
-- do further processing if "qualifier(s)" command was given
if #args - args.pointer + 1 > cfg.states.qualifiersCount then
-- claim ID or literal value has been given
cfg.propertyValue = nextArg(args)
end
for i = 1, cfg.states.qualifiersCount do
-- check if given qualifier ID is an alias and add it
cfg.qualifierIDs[parameters.qualifier..i] = replaceAlias(nextArg(args) or ""):upper()
end
elseif cfg.states[parameters.reference] then
-- do further processing if "reference(s)" command was given
cfg.propertyValue = nextArg(args)
end
-- check for special property value 'somevalue' or 'novalue'
if cfg.propertyValue then
cfg.propertyValue = replaceSpecialChars(cfg.propertyValue)
if cfg.propertyValue ~= "" and mw.text.trim(cfg.propertyValue) == "" then
cfg.propertyValue = " " -- single space represents 'somevalue', whereas empty string represents 'novalue'
else
cfg.propertyValue = mw.text.trim(cfg.propertyValue)
end
end
-- parse the desired format, or choose an appropriate format
if args["format"] then
parsedFormat, formatParams = parseFormat(args["format"])
elseif cfg.states.qualifiersCount > 0 then -- "qualifier(s)" command given
if cfg.states[parameters.property] then -- "propert(y|ies)" command given
parsedFormat, formatParams = parseFormat(formats.propertyWithQualifier)
else
parsedFormat, formatParams = parseFormat(formats.qualifier)
end
elseif cfg.states[parameters.property] then -- "propert(y|ies)" command given
parsedFormat, formatParams = parseFormat(formats.property)
else -- "reference(s)" command given
parsedFormat, formatParams = parseFormat(formats.reference)
end
-- if a "qualifier(s)" command and no "propert(y|ies)" command has been given, make the movable separator a semicolon
if cfg.states.qualifiersCount > 0 and not cfg.states[parameters.property] then
cfg.separators["sep"..parameters.separator][1] = {";"}
end
-- if only "reference(s)" has been given, set the default separator to none (except when raw)
if cfg.states[parameters.reference] and not cfg.states[parameters.property] and cfg.states.qualifiersCount == 0
and not cfg.states[parameters.reference].rawValue then
cfg.separators["sep"][1] = nil
end
-- if exactly one "qualifier(s)" command has been given, make "sep%q" point to "sep%q1" to make them equivalent
if cfg.states.qualifiersCount == 1 then
cfg.separators["sep"..parameters.qualifier] = cfg.separators["sep"..parameters.qualifier.."1"]
end
-- process overridden separator values;
-- must come AFTER tweaking the default separators
cfg:processSeparators(args)
-- define the hooks that should be called (getProperty, getQualifiers, getReferences);
-- only define a hook if both its command ("propert(y|ies)", "reference(s)", "qualifier(s)") and its parameter ("%p", "%r", "%q1", "%q2", "%q3") have been given
for i, v in pairs(cfg.states) do
-- e.g. 'formatParams["%q1"] or formatParams["%q"]' to define hook even if "%q1" was not defined to be able to build a complete value for "%q"
if formatParams[i] or formatParams[i:sub(1, 2)] then
hooks[i] = getHookName(i, 1)
hooks.count = hooks.count + 1
end
end
-- the "%q" parameter is not attached to a state, but is a collection of the results of multiple states (attached to "%q1", "%q2", "%q3", ...);
-- so if this parameter is given then this hook must be defined separately, but only if at least one "qualifier(s)" command has been given
if formatParams[parameters.qualifier] and cfg.states.qualifiersCount > 0 then
hooks[parameters.qualifier] = getHookName(parameters.qualifier, 1)
hooks.count = hooks.count + 1
end
-- create a state for "properties" if it doesn't exist yet, which will be used as a base configuration for each claim iteration;
-- must come AFTER defining the hooks
if not cfg.states[parameters.property] then
cfg.states[parameters.property] = State:new(cfg, parameters.property)
-- if the "single" flag has been given then this state should be equivalent to "property" (singular)
if cfg.singleClaim then
cfg.states[parameters.property].singleValue = true
end
end
-- if the "sourced" flag has been given then create a state for "reference" if it doesn't exist yet, using default values,
-- which must exist in order to be able to determine if a claim has any references;
-- must come AFTER defining the hooks
if cfg.sourcedOnly and not cfg.states[parameters.reference] then
cfg:processFlagOrCommand(p.claimCommands.reference) -- use singular "reference" to minimize overhead
end
-- set the parsed format and the separators (and optional punctuation mark);
-- must come AFTER creating the additonal states
cfg:setFormatAndSeparators(cfg.states[parameters.property], parsedFormat)
-- process qualifier matching values, analogous to cfg.propertyValue
for i, v in pairs(args) do
i = tostring(i)
if i:match('^[Pp]%d+$') or aliasesP[i] then
v = replaceSpecialChars(v)
-- check for special qualifier value 'somevalue'
if v ~= "" and mw.text.trim(v) == "" then
v = " " -- single space represents 'somevalue'
end
cfg.qualifierIDsAndValues[replaceAlias(i):upper()] = v
end
end
-- first sort the claims on rank to pre-define the order of output (preferred first, then normal, then deprecated)
claims = sortOnRank(claims)
-- then iterate through the claims to collect values
value = cfg:concatValues(cfg.states[parameters.property]:iterate(claims, hooks, State.claimMatches)) -- pass property state with level 1 hooks and matchHook
-- if desired, add a clickable icon that may be used to edit the returned values on Wikidata
if cfg.editable and value ~= "" then
value = value .. cfg:getEditIcon()
end
return value
end
local function generalCommand(args, funcName)
local cfg = Config:new()
cfg.curState = State:new(cfg)
local lastArg
local value = nil
repeat
lastArg = nextArg(args)
until not cfg:processFlag(lastArg)
-- get the entity ID from either the positional argument, the eid argument or the page argument
cfg.entityID = getEntityId(lastArg, args[p.args.eid], args[p.args.page], true, args[p.args.globalSiteId])
if cfg.entityID == "" or not mw.wikibase.entityExists(cfg.entityID) then
return "" -- we cannot continue without an entity
end
-- serve according to the given command
if funcName == p.generalCommands.label then
value = cfg:getLabel(cfg.entityID, cfg.curState.rawValue, cfg.curState.linked, cfg.curState.shortName)
elseif funcName == p.generalCommands.title then
cfg.inSitelinks = true
if cfg.entityID:sub(1,1) == "Q" then
value = mw.wikibase.getSitelink(cfg.entityID)
end
if cfg.curState.linked and value then
value = buildWikilink(value)
end
elseif funcName == p.generalCommands.description then
value = mw.wikibase.getDescription(cfg.entityID)
else
local parsedFormat, formatParams
local hooks = {count = 0}
cfg.entity = mw.wikibase.getEntity(cfg.entityID)
if funcName == p.generalCommands.alias or funcName == p.generalCommands.badge then
cfg.curState.singleValue = true
end
if funcName == p.generalCommands.alias or funcName == p.generalCommands.aliases then
if not cfg.entity.aliases or not cfg.entity.aliases[cfg.langCode] then
return "" -- there is no use to continue without any aliasses
end
local aliases = cfg.entity.aliases[cfg.langCode]
-- parse the desired format, or parse the default aliases format
if args["format"] then
parsedFormat, formatParams = parseFormat(args["format"])
else
parsedFormat, formatParams = parseFormat(formats.alias)
end
-- process overridden separator values;
-- must come AFTER tweaking the default separators
cfg:processSeparators(args)
-- define the hook that should be called (getAlias);
-- only define the hook if the parameter ("%a") has been given
if formatParams[parameters.alias] then
hooks[parameters.alias] = getHookName(parameters.alias, 1)
hooks.count = hooks.count + 1
end
-- set the parsed format and the separators (and optional punctuation mark)
cfg:setFormatAndSeparators(cfg.curState, parsedFormat)
-- iterate to collect values
value = cfg:concatValues(cfg.curState:iterate(aliases, hooks))
elseif funcName == p.generalCommands.badge or funcName == p.generalCommands.badges then
if not cfg.entity.sitelinks or not cfg.entity.sitelinks[cfg.siteID] or not cfg.entity.sitelinks[cfg.siteID].badges then
return "" -- there is no use to continue without any badges
end
local badges = cfg.entity.sitelinks[cfg.siteID].badges
cfg.inSitelinks = true
-- parse the desired format, or parse the default aliases format
if args["format"] then
parsedFormat, formatParams = parseFormat(args["format"])
else
parsedFormat, formatParams = parseFormat(formats.badge)
end
-- process overridden separator values;
-- must come AFTER tweaking the default separators
cfg:processSeparators(args)
-- define the hook that should be called (getBadge);
-- only define the hook if the parameter ("%b") has been given
if formatParams[parameters.badge] then
hooks[parameters.badge] = getHookName(parameters.badge, 1)
hooks.count = hooks.count + 1
end
-- set the parsed format and the separators (and optional punctuation mark)
cfg:setFormatAndSeparators(cfg.curState, parsedFormat)
-- iterate to collect values
value = cfg:concatValues(cfg.curState:iterate(badges, hooks))
end
end
value = value or ""
if cfg.editable and value ~= "" then
-- if desired, add a clickable icon that may be used to edit the returned value on Wikidata
value = value .. cfg:getEditIcon()
end
return value
end
-- modules that include this module should call the functions with an underscore prepended, e.g.: p._property(args)
local function establishCommands(commandList, commandFunc)
for _, commandName in pairs(commandList) do
local function wikitextWrapper(frame)
local args = copyTable(frame.args)
args.pointer = 1
loadI18n(aliasesP, frame)
return commandFunc(args, commandName)
end
p[commandName] = wikitextWrapper
local function luaWrapper(args)
args = copyTable(args)
args.pointer = 1
loadI18n(aliasesP)
return commandFunc(args, commandName)
end
p["_" .. commandName] = luaWrapper
end
end
establishCommands(p.claimCommands, claimCommand)
establishCommands(p.generalCommands, generalCommand)
-- main function that is supposed to be used by wrapper templates
function p.main(frame)
if not mw.wikibase then return nil end
local f, args
loadI18n(aliasesP, frame)
-- get the parent frame to take the arguments that were passed to the wrapper template
frame = frame:getParent() or frame
if not frame.args[1] then
throwError("no-function-specified")
end
f = mw.text.trim(frame.args[1])
if f == "main" then
throwError("main-called-twice")
end
assert(p["_"..f], errorText('no-such-function', f))
-- copy arguments from immutable to mutable table
args = copyTable(frame.args)
-- remove the function name from the list
table.remove(args, 1)
return p["_"..f](args)
end
return p
dyjtoxlu5p2mq8c2h4dmvnmhx8qx22r
Module:Wd/i18n
828
2682
33438
2026-11-05T22:01:07Z
en>Janhrach
0
update from sandbox; see [[Module talk:Wd#Proposed update: customizable snak-->param rendering, related changes, misc. bugfixes]]
33438
Scribunto
text/plain
-- The values and functions in this submodule should be localized per wiki.
local p = {}
function p.init(aliasesP)
p = {
["version"] = "9", -- increment this each time the below parameters are changed to avoid reference conflict errors
["errors"] = {
["unknown-data-type"] = "Unknown or unsupported datatype '%s'.",
["missing-required-parameter"] = "No required parameters defined, needing at least one",
["extra-required-parameter"] = "Parameter '%s' must be defined as optional",
["no-function-specified"] = "You must specify a function to call", -- equal to the standard module error message
["main-called-twice"] = 'The function "main" cannot be called twice',
["no-such-function"] = 'The function "%s" does not exist', -- equal to the standard module error message
["no-such-reference-template"] = 'Error: template "%s", which is set in %s as the output template for the citation-output type "%s", does not exist',
-- Parts of the error message signalling a malformed reference.
["malformed-reference-header"] = "<div style=\"color:#dd3333\">\nError: Unable to display the reference from Wikidata properly. Technical details:\n",
["malformed-reference-footer"] = "See [[Module:wd/doc#References|the documentation]] for further details.\n</div>\n[[Category:Module:Wd reference errors]]",
["template-failure-reason"] = "* Reason for the failure of %s: %s\n",
["missing-mandatory-param"] = 'The output template call would miss the mandatory parameter <code>%s</code>.',
["unknown-property-in-ref"] = 'The Wikidata reference contains the property %s, which is not assigned to any parameter of this template.'
},
["info"] = {
["edit-on-wikidata"] = "Edit this on Wikidata"
},
["numeric"] = {
["decimal-mark"] = ".",
["delimiter"] = ","
},
["datetime"] = {
["prefixes"] = {
["decade-period"] = ""
},
["suffixes"] = {
["decade-period"] = "s",
["millennium"] = " millennium",
["century"] = " century",
["million-years"] = " million years",
["billion-years"] = " billion years",
["year"] = " year",
["years"] = " years"
},
["julian-calendar"] = "Julian calendar", -- linked page title
["julian"] = "Julian",
["BCE"] = "BCE",
["CE"] = "CE",
["common-era"] = "Common Era" -- linked page title
},
["coord"] = {
["latitude-north"] = "N",
["latitude-south"] = "S",
["longitude-east"] = "E",
["longitude-west"] = "W",
["degrees"] = "°",
["minutes"] = "'",
["seconds"] = '"',
["separator"] = ", "
},
["values"] = {
["unknown"] = "unknown",
["none"] = "none"
},
["cite"] = {
["output-types"] = {"web", "q"}, -- In this order, the output types will be tried
["param-mapping"] = {
["web"] = {
-- <= left side: all allowed reference properties for *web page sources* per https://www.wikidata.org/wiki/Help:Sources
-- => right side: corresponding parameter names in (equivalent of) [[:en:Template:Cite web]] (if non-existent, keep empty i.e. "")
[aliasesP.statedIn] = "website",
[aliasesP.referenceURL] = "url",
[aliasesP.publicationDate] = "date",
[aliasesP.lastUpdate] = "date",
[aliasesP.retrieved] = "access-date",
[aliasesP.title] = "title",
[aliasesP.subjectNamedAs] = "title",
[aliasesP.archiveURL] = "archive-url",
[aliasesP.archiveDate] = "archive-date",
[aliasesP.language] = "language",
[aliasesP.author] = "author",
[aliasesP.authorNameString] = "author",
[aliasesP.publisher] = "publisher",
[aliasesP.quote] = "quote",
[aliasesP.pages] = "pages", -- extra option
[aliasesP.publishedIn] = "website",
[aliasesP.sectionVerseOrParagraph] = "at",
["external-id"] = "url", -- used for any type of database property ID
},
["q"] = {
-- <= left side: all allowed reference properties for *sources other than web pages* per https://www.wikidata.org/wiki/Help:Sources
-- => right side: corresponding parameter names in (equivalent of) [[:en:Template:Cite Q]] (if non-existent, keep empty i.e. "")
[aliasesP.statedIn] = "1",
[aliasesP.pages] = "pages",
[aliasesP.column] = "at",
[aliasesP.chapter] = "chapter",
[aliasesP.sectionVerseOrParagraph] = "section",
["external-id"] = "id", -- used for any type of database property ID
[aliasesP.title] = "title",
[aliasesP.publicationDate] = "date",
[aliasesP.lastUpdate] = "date",
[aliasesP.retrieved] = "access-date"
}
},
["config"] = {
-- supported fields:
-- - template: name of the template used for output
-- - numbered-params:
-- citation params accepting an arbitrary number of values
-- by numbering the params (e.g. author1, author2)
-- - raw-value-params:
-- params taking a raw value (which means the property is
-- rendered with getValue with raw=true)
-- - mandatory-params:
-- params that are required to be in the template call
-- (after potentially appending numbers
-- to params listed in numbered-params)
-- - prioritization:
-- table associating a list of properties, in the order
-- in which they are preferred, to template parameters;
-- properties not mentioned here have the lowest priority;
-- no key of this table can be from numbered-params
-- - customRenderers:
-- functions that override the default way a single
-- Wikidata value is rendered (converted into a suitable
-- template argument) for the given template parameter;
-- these functions receive the following arguments:
-- snak -- the Wikidata value to be rendered
-- refProperty -- the property with which `snak` is associated;
-- this is useful if this custom renderer handles
-- multiple properties
-- defaultRenderer -- argumentless function that returns a string
-- containing the default rendering of `snak`
-- propertiesFunc -- the function `_properties`, as defined by the wd module
-- getValue -- the internal module function used for rendering snaks
-- Leaving out the "template" field causes the output type to be ignored.
["web"] = {
["template"] = "Cite web",
["numbered-params"] = {"author"},
["mandatory-params"] = {"url"},
["prioritization"] = {
["date"] = {aliasesP.lastUpdate, aliasesP.publicationDate},
["title"] = {aliasesP.title, aliasesP.subjectNamedAs},
["url"] = {aliasesP.referenceURL, "external-id"}
},
["customRenderers"] = {
["language"] = function (snak, _, defaultRenderer, propertiesFunc, getValue)
-- Discart the local language.
local langQID = getValue(snak, true, false) -- argument explanation: raw, not linked
if mw.language.getContentLanguage().code == propertiesFunc{aliasesP.wikimediaLanguageCode, ["eid"] = langQID} then
return nil
end
return defaultRenderer()
end,
["url"] = function (snak, refProperty, defaultRenderer, propertiesFunc, getValue, snaks)
if refProperty == aliasesP.referenceURL then
-- plain URLs from Wikidata don't need special handling.
return defaultRenderer()
end
-- Now we know that `snak` contains an external ID. We want to convert it into a URL.
if not snaks[aliasesP.statedIn] then
-- No source database is cited explicitly. Wikidata discourages this.
return nil -- Don't return anything in this case.
end
-- Check if the ID indeed refers to the cited source given in the "Stated in" field.
local citedSourceQID = getValue(snaks[aliasesP.statedIn][1], true, false) -- argument explanation: raw, not linked
local sourceAssociatedProps = propertiesFunc{"raw", aliasesP.wikidataProperty, ["eid"] = citedSourceQID} -- fetch the associated properties for the cited source
for i, associatedProp in pairs(mw.text.split(sourceAssociatedProps, ", ", true)) do
if associatedProp == refProperty then
-- The external ID indeed refers to the source identified by citedSourceQID.
local renderedSnak = getValue(snak, false, true) -- not raw, linked
if mw.ustring.match(renderedSnak, "^%[%Z- %Z+%]$") then
-- The last getValue call returned a URL in square brackets.
-- strip link wikisyntax, and return the bare URL
local url = mw.ustring.gsub(renderedSnak, "^%[(%Z-) %Z+%]$", "%1") -- gsub returns two values
return url
end
end
end
end,
}
},
["q"] = {
["template"] = "Cite Q",
["raw-value-params"] = {"1"}, -- the first, unnamed parameter of CiteQ takes a QID, not the name of the item cited
["mandatory-params"] = {"1"},
["prioritization"] = {
["date"] = {aliasesP.lastUpdate, aliasesP.publicationDate}
},
["customRenderers"] = {
["id"] = function (_, refProperty, defaultRenderer)
local output = defaultRenderer()
if output then
output = mw.wikibase.getLabel(refProperty) .. " " .. output
end
return output
end,
}
}
}
}
}
p.getOrdinalSuffix = function(num)
if tostring(num):sub(-2,-2) == '1' then
return "th" -- 10th, 11th, 12th, 13th, ... 19th
end
num = tostring(num):sub(-1)
if num == '1' then
return "st"
elseif num == '2' then
return "nd"
elseif num == '3' then
return "rd"
else
return "th"
end
end
p.addDelimiters = function(n)
local left, num, right = string.match(n, "^([^%d]*%d)(%d*)(.-)$")
if left and num and right then
return left .. (num:reverse():gsub("(%d%d%d)", "%1" .. p['numeric']['delimiter']):reverse()) .. right
else
return n
end
end
return p
end
return p
oxg4xygireze1hyk3uq0s2xrq92yivw
33439
33438
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Wd/i18n]]
33438
Scribunto
text/plain
-- The values and functions in this submodule should be localized per wiki.
local p = {}
function p.init(aliasesP)
p = {
["version"] = "9", -- increment this each time the below parameters are changed to avoid reference conflict errors
["errors"] = {
["unknown-data-type"] = "Unknown or unsupported datatype '%s'.",
["missing-required-parameter"] = "No required parameters defined, needing at least one",
["extra-required-parameter"] = "Parameter '%s' must be defined as optional",
["no-function-specified"] = "You must specify a function to call", -- equal to the standard module error message
["main-called-twice"] = 'The function "main" cannot be called twice',
["no-such-function"] = 'The function "%s" does not exist', -- equal to the standard module error message
["no-such-reference-template"] = 'Error: template "%s", which is set in %s as the output template for the citation-output type "%s", does not exist',
-- Parts of the error message signalling a malformed reference.
["malformed-reference-header"] = "<div style=\"color:#dd3333\">\nError: Unable to display the reference from Wikidata properly. Technical details:\n",
["malformed-reference-footer"] = "See [[Module:wd/doc#References|the documentation]] for further details.\n</div>\n[[Category:Module:Wd reference errors]]",
["template-failure-reason"] = "* Reason for the failure of %s: %s\n",
["missing-mandatory-param"] = 'The output template call would miss the mandatory parameter <code>%s</code>.',
["unknown-property-in-ref"] = 'The Wikidata reference contains the property %s, which is not assigned to any parameter of this template.'
},
["info"] = {
["edit-on-wikidata"] = "Edit this on Wikidata"
},
["numeric"] = {
["decimal-mark"] = ".",
["delimiter"] = ","
},
["datetime"] = {
["prefixes"] = {
["decade-period"] = ""
},
["suffixes"] = {
["decade-period"] = "s",
["millennium"] = " millennium",
["century"] = " century",
["million-years"] = " million years",
["billion-years"] = " billion years",
["year"] = " year",
["years"] = " years"
},
["julian-calendar"] = "Julian calendar", -- linked page title
["julian"] = "Julian",
["BCE"] = "BCE",
["CE"] = "CE",
["common-era"] = "Common Era" -- linked page title
},
["coord"] = {
["latitude-north"] = "N",
["latitude-south"] = "S",
["longitude-east"] = "E",
["longitude-west"] = "W",
["degrees"] = "°",
["minutes"] = "'",
["seconds"] = '"',
["separator"] = ", "
},
["values"] = {
["unknown"] = "unknown",
["none"] = "none"
},
["cite"] = {
["output-types"] = {"web", "q"}, -- In this order, the output types will be tried
["param-mapping"] = {
["web"] = {
-- <= left side: all allowed reference properties for *web page sources* per https://www.wikidata.org/wiki/Help:Sources
-- => right side: corresponding parameter names in (equivalent of) [[:en:Template:Cite web]] (if non-existent, keep empty i.e. "")
[aliasesP.statedIn] = "website",
[aliasesP.referenceURL] = "url",
[aliasesP.publicationDate] = "date",
[aliasesP.lastUpdate] = "date",
[aliasesP.retrieved] = "access-date",
[aliasesP.title] = "title",
[aliasesP.subjectNamedAs] = "title",
[aliasesP.archiveURL] = "archive-url",
[aliasesP.archiveDate] = "archive-date",
[aliasesP.language] = "language",
[aliasesP.author] = "author",
[aliasesP.authorNameString] = "author",
[aliasesP.publisher] = "publisher",
[aliasesP.quote] = "quote",
[aliasesP.pages] = "pages", -- extra option
[aliasesP.publishedIn] = "website",
[aliasesP.sectionVerseOrParagraph] = "at",
["external-id"] = "url", -- used for any type of database property ID
},
["q"] = {
-- <= left side: all allowed reference properties for *sources other than web pages* per https://www.wikidata.org/wiki/Help:Sources
-- => right side: corresponding parameter names in (equivalent of) [[:en:Template:Cite Q]] (if non-existent, keep empty i.e. "")
[aliasesP.statedIn] = "1",
[aliasesP.pages] = "pages",
[aliasesP.column] = "at",
[aliasesP.chapter] = "chapter",
[aliasesP.sectionVerseOrParagraph] = "section",
["external-id"] = "id", -- used for any type of database property ID
[aliasesP.title] = "title",
[aliasesP.publicationDate] = "date",
[aliasesP.lastUpdate] = "date",
[aliasesP.retrieved] = "access-date"
}
},
["config"] = {
-- supported fields:
-- - template: name of the template used for output
-- - numbered-params:
-- citation params accepting an arbitrary number of values
-- by numbering the params (e.g. author1, author2)
-- - raw-value-params:
-- params taking a raw value (which means the property is
-- rendered with getValue with raw=true)
-- - mandatory-params:
-- params that are required to be in the template call
-- (after potentially appending numbers
-- to params listed in numbered-params)
-- - prioritization:
-- table associating a list of properties, in the order
-- in which they are preferred, to template parameters;
-- properties not mentioned here have the lowest priority;
-- no key of this table can be from numbered-params
-- - customRenderers:
-- functions that override the default way a single
-- Wikidata value is rendered (converted into a suitable
-- template argument) for the given template parameter;
-- these functions receive the following arguments:
-- snak -- the Wikidata value to be rendered
-- refProperty -- the property with which `snak` is associated;
-- this is useful if this custom renderer handles
-- multiple properties
-- defaultRenderer -- argumentless function that returns a string
-- containing the default rendering of `snak`
-- propertiesFunc -- the function `_properties`, as defined by the wd module
-- getValue -- the internal module function used for rendering snaks
-- Leaving out the "template" field causes the output type to be ignored.
["web"] = {
["template"] = "Cite web",
["numbered-params"] = {"author"},
["mandatory-params"] = {"url"},
["prioritization"] = {
["date"] = {aliasesP.lastUpdate, aliasesP.publicationDate},
["title"] = {aliasesP.title, aliasesP.subjectNamedAs},
["url"] = {aliasesP.referenceURL, "external-id"}
},
["customRenderers"] = {
["language"] = function (snak, _, defaultRenderer, propertiesFunc, getValue)
-- Discart the local language.
local langQID = getValue(snak, true, false) -- argument explanation: raw, not linked
if mw.language.getContentLanguage().code == propertiesFunc{aliasesP.wikimediaLanguageCode, ["eid"] = langQID} then
return nil
end
return defaultRenderer()
end,
["url"] = function (snak, refProperty, defaultRenderer, propertiesFunc, getValue, snaks)
if refProperty == aliasesP.referenceURL then
-- plain URLs from Wikidata don't need special handling.
return defaultRenderer()
end
-- Now we know that `snak` contains an external ID. We want to convert it into a URL.
if not snaks[aliasesP.statedIn] then
-- No source database is cited explicitly. Wikidata discourages this.
return nil -- Don't return anything in this case.
end
-- Check if the ID indeed refers to the cited source given in the "Stated in" field.
local citedSourceQID = getValue(snaks[aliasesP.statedIn][1], true, false) -- argument explanation: raw, not linked
local sourceAssociatedProps = propertiesFunc{"raw", aliasesP.wikidataProperty, ["eid"] = citedSourceQID} -- fetch the associated properties for the cited source
for i, associatedProp in pairs(mw.text.split(sourceAssociatedProps, ", ", true)) do
if associatedProp == refProperty then
-- The external ID indeed refers to the source identified by citedSourceQID.
local renderedSnak = getValue(snak, false, true) -- not raw, linked
if mw.ustring.match(renderedSnak, "^%[%Z- %Z+%]$") then
-- The last getValue call returned a URL in square brackets.
-- strip link wikisyntax, and return the bare URL
local url = mw.ustring.gsub(renderedSnak, "^%[(%Z-) %Z+%]$", "%1") -- gsub returns two values
return url
end
end
end
end,
}
},
["q"] = {
["template"] = "Cite Q",
["raw-value-params"] = {"1"}, -- the first, unnamed parameter of CiteQ takes a QID, not the name of the item cited
["mandatory-params"] = {"1"},
["prioritization"] = {
["date"] = {aliasesP.lastUpdate, aliasesP.publicationDate}
},
["customRenderers"] = {
["id"] = function (_, refProperty, defaultRenderer)
local output = defaultRenderer()
if output then
output = mw.wikibase.getLabel(refProperty) .. " " .. output
end
return output
end,
}
}
}
}
}
p.getOrdinalSuffix = function(num)
if tostring(num):sub(-2,-2) == '1' then
return "th" -- 10th, 11th, 12th, 13th, ... 19th
end
num = tostring(num):sub(-1)
if num == '1' then
return "st"
elseif num == '2' then
return "nd"
elseif num == '3' then
return "rd"
else
return "th"
end
end
p.addDelimiters = function(n)
local left, num, right = string.match(n, "^([^%d]*%d)(%d*)(.-)$")
if left and num and right then
return left .. (num:reverse():gsub("(%d%d%d)", "%1" .. p['numeric']['delimiter']):reverse()) .. right
else
return n
end
end
return p
end
return p
oxg4xygireze1hyk3uq0s2xrq92yivw
Tempilet:Wikidata
10
2683
33440
2019-07-03T10:25:41Z
en>Ymblanter
0
Changed protection level for "[[Template:Wikidata]]": [[WP:High-risk templates|Highly visible template]]: request at [[WP:RFPP]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33440
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:Wd|main}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
aqnmh4azo4jle51xny4knl3b1hl9873
33441
33440
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wikidata]]
33440
wikitext
text/x-wiki
<includeonly>{{safesubst:#invoke:Wd|main}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
aqnmh4azo4jle51xny4knl3b1hl9873
Module:URL
828
2684
33442
2025-11-12T22:08:00Z
en>Zackmann08
0
Check for nested calls. See [[Template_talk:URL]] for more details.
33442
Scribunto
text/plain
--
-- This module implements {{URL}}
--
-- See unit tests at [[Module:URL/testcases]]
local p = {}
local function safeUri(s)
local success, uri = pcall(function()
return mw.uri.new(s)
end)
if success then
return uri
end
end
local function extractUrl(args)
for name, val in pairs(args) do
if name ~= 2 and name ~= "msg" then
local url = name .. "=" .. val;
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
local uri = safeUri(url);
if uri and uri.host then
return url
end
end
end
end
function p._url(url, text, msg)
url = mw.text.trim(url or '')
text = mw.text.trim(text or '')
-- Check for pre-formatted url. Catches '{{url|{{url|google.com}}}}' that can occur via template
if (mw.ustring.match(url, '^<span class="url">')) then
return url, text, msg
end
local nomsg = (msg or ''):sub(1,1):lower() == "n" or msg == 'false' -- boolean: true if msg is "false" or starts with n or N
if url == '' then
if text == '' then
if nomsg then
return nil
else
return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
end
else
return text
end
end
-- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL.
url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
-- If there is an empty query string or fragment id, remove it as it will cause mw.uri.new to throw an error
url = mw.ustring.gsub(url, '#$', '')
url = mw.ustring.gsub(url, '%?$', '')
-- If it's an HTTP[S] URL without the double slash, fix it.
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
local uri = safeUri(url)
-- Handle URL's without a protocol and URL's that are protocol-relative,
-- e.g. www.example.com/foo or www.example.com:8080/foo, and //www.example.com/foo
if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' then
url = 'http://' .. url
uri = safeUri(url)
end
if text == '' then
if uri then
if uri.path == '/' then uri.path = '' end
local port = ''
if uri.port then port = ':' .. uri.port end
text = mw.ustring.lower(uri.host or '') .. port .. (uri.relativePath or '')
-- Add <wbr> before _/.-# sequences
text = mw.ustring.gsub(text,"(/+)","<wbr/>%1") -- This entry MUST be the first. "<wbr/>" has a "/" in it, you know.
text = mw.ustring.gsub(text,"(%.+)","<wbr/>%1")
-- text = mw.ustring.gsub(text,"(%-+)","<wbr/>%1") -- DISABLED for now
text = mw.ustring.gsub(text,"(%#+)","<wbr/>%1")
text = mw.ustring.gsub(text,"(_+)","<wbr/>%1")
else -- URL is badly-formed, so just display whatever was passed in
text = url
end
end
return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
end
--[[
The main entry point for calling from Template:URL.
--]]
function p.url(frame)
local templateArgs = frame.args
local parentArgs = frame:getParent().args
local url = templateArgs[1] or parentArgs[1]
local text = templateArgs[2] or parentArgs[2] or ''
local msg = templateArgs.msg or parentArgs.msg or ''
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
return p._url(url, text, msg)
end
--[[
The entry point for calling from the forked Template:URL2.
This function returns no message by default.
It strips out wiki-link markup, html tags, and everything after a space.
--]]
function p.url2(frame)
local templateArgs = frame.args
local parentArgs = frame:getParent().args
local url = templateArgs[1] or parentArgs[1]
local text = templateArgs[2] or parentArgs[2] or ''
-- default to no message
local msg = templateArgs.msg or parentArgs.msg or 'no'
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
-- if the url came from a Wikidata call, it might have a pen icon appended
-- we want to keep that and add it back at the end.
local u1, penicon = mw.ustring.match( url, "(.*)( <span class='penicon.*)" )
if penicon then url = u1 end
-- strip out html tags and [ ] from url
url = (url or ''):gsub("<[^>]*>", ""):gsub("[%[%]]", "")
-- truncate anything after a space
url = url:gsub("%%20", " "):gsub(" .*", "")
return (p._url(url, text, msg) or "") .. (penicon or "")
end
return p
rc4hltyh23z2og5tb2epk1nszo4pvtx
33443
33442
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Module:URL]]
33442
Scribunto
text/plain
--
-- This module implements {{URL}}
--
-- See unit tests at [[Module:URL/testcases]]
local p = {}
local function safeUri(s)
local success, uri = pcall(function()
return mw.uri.new(s)
end)
if success then
return uri
end
end
local function extractUrl(args)
for name, val in pairs(args) do
if name ~= 2 and name ~= "msg" then
local url = name .. "=" .. val;
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
local uri = safeUri(url);
if uri and uri.host then
return url
end
end
end
end
function p._url(url, text, msg)
url = mw.text.trim(url or '')
text = mw.text.trim(text or '')
-- Check for pre-formatted url. Catches '{{url|{{url|google.com}}}}' that can occur via template
if (mw.ustring.match(url, '^<span class="url">')) then
return url, text, msg
end
local nomsg = (msg or ''):sub(1,1):lower() == "n" or msg == 'false' -- boolean: true if msg is "false" or starts with n or N
if url == '' then
if text == '' then
if nomsg then
return nil
else
return mw.getCurrentFrame():expandTemplate{ title = 'tlx', args = { 'URL', "''example.com''", "''optional display text''" } }
end
else
return text
end
end
-- If the URL contains any unencoded spaces, encode them, because MediaWiki will otherwise interpret a space as the end of the URL.
url = mw.ustring.gsub(url, '%s', function(s) return mw.uri.encode(s, 'PATH') end)
-- If there is an empty query string or fragment id, remove it as it will cause mw.uri.new to throw an error
url = mw.ustring.gsub(url, '#$', '')
url = mw.ustring.gsub(url, '%?$', '')
-- If it's an HTTP[S] URL without the double slash, fix it.
url = mw.ustring.gsub(url, '^[Hh][Tt][Tt][Pp]([Ss]?):(/?)([^/])', 'http%1://%3')
local uri = safeUri(url)
-- Handle URL's without a protocol and URL's that are protocol-relative,
-- e.g. www.example.com/foo or www.example.com:8080/foo, and //www.example.com/foo
if uri and (not uri.protocol or (uri.protocol and not uri.host)) and url:sub(1, 2) ~= '//' then
url = 'http://' .. url
uri = safeUri(url)
end
if text == '' then
if uri then
if uri.path == '/' then uri.path = '' end
local port = ''
if uri.port then port = ':' .. uri.port end
text = mw.ustring.lower(uri.host or '') .. port .. (uri.relativePath or '')
-- Add <wbr> before _/.-# sequences
text = mw.ustring.gsub(text,"(/+)","<wbr/>%1") -- This entry MUST be the first. "<wbr/>" has a "/" in it, you know.
text = mw.ustring.gsub(text,"(%.+)","<wbr/>%1")
-- text = mw.ustring.gsub(text,"(%-+)","<wbr/>%1") -- DISABLED for now
text = mw.ustring.gsub(text,"(%#+)","<wbr/>%1")
text = mw.ustring.gsub(text,"(_+)","<wbr/>%1")
else -- URL is badly-formed, so just display whatever was passed in
text = url
end
end
return mw.ustring.format('<span class="url">[%s %s]</span>', url, text)
end
--[[
The main entry point for calling from Template:URL.
--]]
function p.url(frame)
local templateArgs = frame.args
local parentArgs = frame:getParent().args
local url = templateArgs[1] or parentArgs[1]
local text = templateArgs[2] or parentArgs[2] or ''
local msg = templateArgs.msg or parentArgs.msg or ''
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
return p._url(url, text, msg)
end
--[[
The entry point for calling from the forked Template:URL2.
This function returns no message by default.
It strips out wiki-link markup, html tags, and everything after a space.
--]]
function p.url2(frame)
local templateArgs = frame.args
local parentArgs = frame:getParent().args
local url = templateArgs[1] or parentArgs[1]
local text = templateArgs[2] or parentArgs[2] or ''
-- default to no message
local msg = templateArgs.msg or parentArgs.msg or 'no'
url = url or extractUrl(templateArgs) or extractUrl(parentArgs) or ''
-- if the url came from a Wikidata call, it might have a pen icon appended
-- we want to keep that and add it back at the end.
local u1, penicon = mw.ustring.match( url, "(.*)( <span class='penicon.*)" )
if penicon then url = u1 end
-- strip out html tags and [ ] from url
url = (url or ''):gsub("<[^>]*>", ""):gsub("[%[%]]", "")
-- truncate anything after a space
url = url:gsub("%%20", " "):gsub(" .*", "")
return (p._url(url, text, msg) or "") .. (penicon or "")
end
return p
rc4hltyh23z2og5tb2epk1nszo4pvtx
Tempilet:Wikidata entity link
10
2685
33444
2025-08-31T13:22:58Z
en>Jonesey95
0
slight improvement when multiple ' characters are used in a label; more may be needed for other markup
33444
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}
| {{#switch:{{padleft:|1|{{uc:{{{1}}}}}}}
| Q | P = [[d:Special:EntityPage/{{uc:{{{1}}}}}|{{replace|{{#invoke:wd|label|{{uc:{{{1}}}}}}}|'|'}} <small>({{uc:{{{1}}}}})</small>]]
| #default = [[d:Special:EntityPage/Q{{uc:{{{1}}}}}|{{replace|{{#invoke:wd|label|Q{{uc:{{{1}}}}}}}|'|'}} <small>(Q{{uc:{{{1|}}}}})</small>]]
}}
| {{#if:{{#invoke:wd|label|raw}}
| [[d:Special:EntityPage/{{#invoke:wd|label|raw}}|{{#invoke:wd|label}} <small>({{#invoke:wd|label|raw}})</small>]]
| <small>(no entity)</small>
}}
}}</includeonly><noinclude>{{Documentation}}</noinclude>
npxjrdgcgdl6eaxswj000ifruiuxxmj
33445
33444
2026-11-11T21:57:52Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wikidata_entity_link]]
33444
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}
| {{#switch:{{padleft:|1|{{uc:{{{1}}}}}}}
| Q | P = [[d:Special:EntityPage/{{uc:{{{1}}}}}|{{replace|{{#invoke:wd|label|{{uc:{{{1}}}}}}}|'|'}} <small>({{uc:{{{1}}}}})</small>]]
| #default = [[d:Special:EntityPage/Q{{uc:{{{1}}}}}|{{replace|{{#invoke:wd|label|Q{{uc:{{{1}}}}}}}|'|'}} <small>(Q{{uc:{{{1|}}}}})</small>]]
}}
| {{#if:{{#invoke:wd|label|raw}}
| [[d:Special:EntityPage/{{#invoke:wd|label|raw}}|{{#invoke:wd|label}} <small>({{#invoke:wd|label|raw}})</small>]]
| <small>(no entity)</small>
}}
}}</includeonly><noinclude>{{Documentation}}</noinclude>
npxjrdgcgdl6eaxswj000ifruiuxxmj
Tempilet:Wikidata property link
10
2686
33446
2024-12-27T18:00:10Z
en>MusikBot II
0
Changed protection settings for "[[Template:Wikidata property link]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2502 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
33446
wikitext
text/x-wiki
<includeonly>{{#switch:{{str left|{{uc:{{{id|}}}}}|1}}
| N <!--none--> = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{wikidata|label|{{uc:{{{1|}}}}}}}]]
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|{{wikidata|label|P{{uc:{{{1|}}}}}}}]]
}}
| O <!--only--> = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{uc:{{{1|}}}}}]]
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|P{{uc:{{{1|}}}}}]]
}}
| F <!--first--> = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{uc:{{{1|}}}}}]]{{#if:{{wikidata|label|{{uc:{{{1|}}}}}}}|: <small>{{wikidata|label|{{uc:{{{1|}}}}}}}</small>}}
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|P{{uc:{{{1|}}}}}]]{{#if:{{wikidata|label|P{{uc:{{{1|}}}}}}}|: <small>{{wikidata|label|P{{uc:{{{1|}}}}}}}</small>}}
}}
| #default = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{wikidata|label|{{uc:{{{1|}}}}}}} <small>({{uc:{{{1|}}}}})</small>]]
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|{{wikidata|label|P{{uc:{{{1|}}}}}}} <small>(P{{uc:{{{1|}}}}})</small>]]
}}
}}</includeonly><noinclude>{{Documentation}}</noinclude>
k8jv170qlggs0249fpe48ygwkpgfzbn
33447
33446
2026-11-11T21:57:53Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Wikidata_property_link]]
33446
wikitext
text/x-wiki
<includeonly>{{#switch:{{str left|{{uc:{{{id|}}}}}|1}}
| N <!--none--> = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{wikidata|label|{{uc:{{{1|}}}}}}}]]
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|{{wikidata|label|P{{uc:{{{1|}}}}}}}]]
}}
| O <!--only--> = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{uc:{{{1|}}}}}]]
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|P{{uc:{{{1|}}}}}]]
}}
| F <!--first--> = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{uc:{{{1|}}}}}]]{{#if:{{wikidata|label|{{uc:{{{1|}}}}}}}|: <small>{{wikidata|label|{{uc:{{{1|}}}}}}}</small>}}
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|P{{uc:{{{1|}}}}}]]{{#if:{{wikidata|label|P{{uc:{{{1|}}}}}}}|: <small>{{wikidata|label|P{{uc:{{{1|}}}}}}}</small>}}
}}
| #default = {{#switch:{{str left|{{uc:{{{1|}}}}}|1}}
| P = [[d:Special:EntityPage/{{uc:{{{1|}}}}}|{{wikidata|label|{{uc:{{{1|}}}}}}} <small>({{uc:{{{1|}}}}})</small>]]
| [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|{{wikidata|label|P{{uc:{{{1|}}}}}}} <small>(P{{uc:{{{1|}}}}})</small>]]
}}
}}</includeonly><noinclude>{{Documentation}}</noinclude>
k8jv170qlggs0249fpe48ygwkpgfzbn
Tempilet:URL/doc
10
2687
33448
2026-03-20T10:08:16Z
en>Colonies Chris
0
33448
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES AT THE BOTTOM OF THIS PAGE -->
{{for|encoding URLs|Help:Magic words#urlencode}}
{{Used in system|in [[MediaWiki:Titleblacklist-custom-URL]]}}
{{Lua|Module:Check for unknown parameters|Module:URL}}
This template creates a formatted external link. It formats the appearance of '''''displayed''''' URLs, while making them ''machine-readable'' as part of emitted [[microformat]] meta-data, inside templates such as infoboxes.
{{Anchor|Parm2}}'''Note:''' If you wish to display text instead of the URL (e.g. [https://example.com website] instead of {{URL|example.com}}), please '''do not use this template'''. Instead, consider using normal [[Help:Link#External_links|wiki markup]] or [[Template:Official website]]. Displaying text instead of the url will render the microformat data invalid.
For web-based references, please see [[Wikipedia:Citation templates]].
== Usage ==
* <code><nowiki>{{URL|</nowiki>''example.com''<nowiki>}}</nowiki></code>
** The first parameter is parsed to decide whether it is a complete URL. If it doesn't start with a URI scheme (such as "http:", "https:", or "ftp:"), the prefix "http://" is prepended to the specified generated target URL of the link.
** Parameter 2 (<code><nowiki>{{URL|</nowiki>''url name''<nowiki>|</nowiki>'''''optional display text'''''<nowiki>}}</nowiki></code>) is '''deprecated'''. See [[#Parm2|note]] above for more information and alternative templates.
=== URL with {{=}} character should use numbered parameters ===
If the URL contains an equals sign, as is common in a query string, the parameter {{para|1}} should be used for the URL (<code><nowiki>{{URL|</nowiki>1=''example.com''<nowiki>}}</nowiki></code>). This applies when the value of the URL is unknown, for example, when this template is used in another template specifying the effective URL as a variable value
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | 1=https://example.com/?id=42 }}</nowiki>}}
The template attempts to handle simple cases where a URL containing an equals sign is specified without the necessary {{para|1}}, but it is still better practice to pass it in.
The '''deprecated''' second parameter for the displayed text, if present in legacy uses, '''must''' also be explicitly numbered if the first parameter is explicitly numbered (<code><nowiki>{{URL|</nowiki>1=''url name''<nowiki>|</nowiki>2=''optional display text''<nowiki>}}</nowiki></code>); otherwise it will override the value of the first parameter:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | 1=https://example.com/?id=42 | 2=Title }}</nowiki>}}
=== Examples ===
The template displays an instructional message if there is no input:
{{nowiki template demo|format=inline|code=<nowiki>{{URL| }}</nowiki>}}
The template wraps the output in {{tag|span|attribs=class="url"}} (see {{Section link||Microformat}}) and adds [[HTML element#wbr|<wbr/>]] before displayed periods:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | www.example.com }}</nowiki>}}
The use of [[HTTP|http://]], [[HTTPS|https://]], a [[URL#prurl|protocol-relative URL]], or a different protocol is preserved in the URL but is not shown in the [[link text]]:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | http://www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | https://www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | //www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | ftp://www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | ftp://ftp.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | irc://irc.example.com/channel }}</nowiki>}}
If the path is only a slash (<code>/</code>) it is not displayed in the link text:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | http://example.com/ }}</nowiki>}}
The template also adds [[HTML element#wbr|<wbr/>]] before any displayed slashes (<code>/</code>) in the path:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | example.com/path }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | https://example.com/path }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | www.example.com/path/ }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | https://www.example.com/path/ }}</nowiki>}}
Upper case in the [[domain name]] is preserved in the URL, but not in the link text (upper case in the path is not changed):
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | EXAMPLE.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | Example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | Example.com/PathPath }}</nowiki>}}
For a URL containing an equal sign (<code>=</code>), use {{para|1}}:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL |1= example.com/path?page=42 }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL |1= https://example.com/path?page=42 }}</nowiki>}}
The template currently supports an optional second parameter which is used as the link text, though its use is discouraged (see [[#Parm2|note]]):
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | www.example.com | example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | example.com | Example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL |1= example.com/path?page=42 |2= example.com }}</nowiki>}}
The URL may be obtained from [[Wikidata]] as shown in this example for {{Wikidata entity link|23317}}, where the property {{Wikidata property link|856}} contains {{Wikidata|property|Q23317|P856}}:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | {{Wikidata|property|Q23317|P856}} }}</nowiki>}}
== Microformat ==
The template wraps the ''displayed'' URL with a <code>class="url"</code> so that it is included in any parent [[microformat]] which takes a URL parameter{{Snd}} see [[WP:UF|our microformats project]].
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "A template to display and format a URL, inside other templates.",
"params": {
"1": {
"label": "URL",
"description": "The URL to be linked",
"type": "string",
"required": true
},
"2": {
"label": "Display text",
"description": "The text to be displayed instead of the URL. Deprecated",
"type": "string",
"required": false,
"deprecated": true
}
}
}
</templatedata>
== Maintenance categories ==
* {{clc|Pages using URL template with unknown parameters}}
== See also ==
* {{Tl|URL2}}
* {{module link|WikidataIB|url2}}
* {{Tl|Official URL}}
* {{Tl|Official website}}
* {{Tl|Plain link}}
* {{Tl|Word break}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:External link templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
0l9qyfkwhw9wtvm5e2m2zxljm3ilrq4
33449
33448
2026-11-11T21:57:53Z
RAPTOR7762
18
1 revision imported from [[:en:Template:URL/doc]]
33448
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES AT THE BOTTOM OF THIS PAGE -->
{{for|encoding URLs|Help:Magic words#urlencode}}
{{Used in system|in [[MediaWiki:Titleblacklist-custom-URL]]}}
{{Lua|Module:Check for unknown parameters|Module:URL}}
This template creates a formatted external link. It formats the appearance of '''''displayed''''' URLs, while making them ''machine-readable'' as part of emitted [[microformat]] meta-data, inside templates such as infoboxes.
{{Anchor|Parm2}}'''Note:''' If you wish to display text instead of the URL (e.g. [https://example.com website] instead of {{URL|example.com}}), please '''do not use this template'''. Instead, consider using normal [[Help:Link#External_links|wiki markup]] or [[Template:Official website]]. Displaying text instead of the url will render the microformat data invalid.
For web-based references, please see [[Wikipedia:Citation templates]].
== Usage ==
* <code><nowiki>{{URL|</nowiki>''example.com''<nowiki>}}</nowiki></code>
** The first parameter is parsed to decide whether it is a complete URL. If it doesn't start with a URI scheme (such as "http:", "https:", or "ftp:"), the prefix "http://" is prepended to the specified generated target URL of the link.
** Parameter 2 (<code><nowiki>{{URL|</nowiki>''url name''<nowiki>|</nowiki>'''''optional display text'''''<nowiki>}}</nowiki></code>) is '''deprecated'''. See [[#Parm2|note]] above for more information and alternative templates.
=== URL with {{=}} character should use numbered parameters ===
If the URL contains an equals sign, as is common in a query string, the parameter {{para|1}} should be used for the URL (<code><nowiki>{{URL|</nowiki>1=''example.com''<nowiki>}}</nowiki></code>). This applies when the value of the URL is unknown, for example, when this template is used in another template specifying the effective URL as a variable value
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | 1=https://example.com/?id=42 }}</nowiki>}}
The template attempts to handle simple cases where a URL containing an equals sign is specified without the necessary {{para|1}}, but it is still better practice to pass it in.
The '''deprecated''' second parameter for the displayed text, if present in legacy uses, '''must''' also be explicitly numbered if the first parameter is explicitly numbered (<code><nowiki>{{URL|</nowiki>1=''url name''<nowiki>|</nowiki>2=''optional display text''<nowiki>}}</nowiki></code>); otherwise it will override the value of the first parameter:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | 1=https://example.com/?id=42 | 2=Title }}</nowiki>}}
=== Examples ===
The template displays an instructional message if there is no input:
{{nowiki template demo|format=inline|code=<nowiki>{{URL| }}</nowiki>}}
The template wraps the output in {{tag|span|attribs=class="url"}} (see {{Section link||Microformat}}) and adds [[HTML element#wbr|<wbr/>]] before displayed periods:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | www.example.com }}</nowiki>}}
The use of [[HTTP|http://]], [[HTTPS|https://]], a [[URL#prurl|protocol-relative URL]], or a different protocol is preserved in the URL but is not shown in the [[link text]]:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | http://www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | https://www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | //www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | ftp://www.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | ftp://ftp.example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | irc://irc.example.com/channel }}</nowiki>}}
If the path is only a slash (<code>/</code>) it is not displayed in the link text:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | http://example.com/ }}</nowiki>}}
The template also adds [[HTML element#wbr|<wbr/>]] before any displayed slashes (<code>/</code>) in the path:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | example.com/path }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | https://example.com/path }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | www.example.com/path/ }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | https://www.example.com/path/ }}</nowiki>}}
Upper case in the [[domain name]] is preserved in the URL, but not in the link text (upper case in the path is not changed):
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | EXAMPLE.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | Example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | Example.com/PathPath }}</nowiki>}}
For a URL containing an equal sign (<code>=</code>), use {{para|1}}:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL |1= example.com/path?page=42 }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL |1= https://example.com/path?page=42 }}</nowiki>}}
The template currently supports an optional second parameter which is used as the link text, though its use is discouraged (see [[#Parm2|note]]):
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | www.example.com | example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | example.com | Example.com }}</nowiki>}}
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL |1= example.com/path?page=42 |2= example.com }}</nowiki>}}
The URL may be obtained from [[Wikidata]] as shown in this example for {{Wikidata entity link|23317}}, where the property {{Wikidata property link|856}} contains {{Wikidata|property|Q23317|P856}}:
{{nowiki template demo|format=inline|output=nowiki+|code=<nowiki>{{URL | {{Wikidata|property|Q23317|P856}} }}</nowiki>}}
== Microformat ==
The template wraps the ''displayed'' URL with a <code>class="url"</code> so that it is included in any parent [[microformat]] which takes a URL parameter{{Snd}} see [[WP:UF|our microformats project]].
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "A template to display and format a URL, inside other templates.",
"params": {
"1": {
"label": "URL",
"description": "The URL to be linked",
"type": "string",
"required": true
},
"2": {
"label": "Display text",
"description": "The text to be displayed instead of the URL. Deprecated",
"type": "string",
"required": false,
"deprecated": true
}
}
}
</templatedata>
== Maintenance categories ==
* {{clc|Pages using URL template with unknown parameters}}
== See also ==
* {{Tl|URL2}}
* {{module link|WikidataIB|url2}}
* {{Tl|Official URL}}
* {{Tl|Official website}}
* {{Tl|Plain link}}
* {{Tl|Word break}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:External link templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
0l9qyfkwhw9wtvm5e2m2zxljm3ilrq4
Tempilet:Listen
10
2688
33452
2018-06-16T13:14:35Z
en>Nardog
0
includeonly
33452
wikitext
text/x-wiki
<includeonly>{{#invoke:Listen|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
hrgupcux3r81j1cr9hj6di8wz9bpl12
33453
33452
2026-11-11T21:59:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Listen]]
33452
wikitext
text/x-wiki
<includeonly>{{#invoke:Listen|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
hrgupcux3r81j1cr9hj6di8wz9bpl12
Module:Listen
828
2689
33454
2022-07-07T17:12:31Z
en>Izno
0
we cookin with templatestyles now
33454
Scribunto
text/plain
local mFileLink = require('Module:File link')
local mTableTools = require('Module:TableTools')
local mSideBox = require('Module:Side box')
local lang = mw.language.new('en')
local p = {}
local function formatLength(length)
-- Formats a duration in seconds in "(h:)mm:ss" (minutes are zero-padded
-- only if there are hours).
if not length or length == 0 then
return nil
end
-- Add 0.5 to offset the rounding down
local t = lang:getDurationIntervals(length + 0.5, { 'hours', 'minutes', 'seconds' })
local s = t.seconds and string.format('%02d', t.seconds) or '00'
local m = t.minutes or 0
local span = mw.html.create('span'):addClass('duration')
if t.hours then
span
:tag('span')
:addClass('h')
:wikitext(t.hours)
:done()
:wikitext(':')
m = string.format('%02d', m)
end
span
:tag('span')
:addClass('min')
:wikitext(m)
:done()
:wikitext(':')
:tag('span')
:addClass('s')
:wikitext(s)
:done()
return tostring(span)
end
local function renderRow(filename, title, play, alt, description, start, length, hasImage)
-- Renders the HTML for one file description row.
if not filename then
return nil
end
length = formatLength(length)
length = length and string.format(' (%s)', length) or ''
local root = mw.html.create('')
root:tag('div')
:addClass('haudio')
:newline()
:tag('div')
:addClass('listen-file-header')
:wikitext(string.format(
'[[:File:%s|%s]]%s',
filename,
title or '',
length
))
:done()
:newline()
:tag('div')
:wikitext(play ~= 'no' and mFileLink._main{
file = filename,
size = hasImage and '232px' or '215px',
alt = alt,
start = start
}
or nil
)
:done()
:newline()
:tag('div')
:addClass('description')
:wikitext(description)
:done()
:done()
return tostring(root)
end
local function renderTrackingCategories(isPlain, hasMissing, isEmpty, titleObj)
-- Renders all tracking categories produced by the template.
-- isPlain, hasMissing and isEmpty are passed through from p._main,
-- and the titleObj is only used for testing purposes.
local cats = {}
local currentTitle = titleObj or mw.title.getCurrentTitle()
if currentTitle.namespace == 0 then
-- We are in mainspace.
if not isEmpty then
cats[#cats + 1] = 'Articles with hAudio microformats'
end
if hasMissing then
cats[#cats + 1] = 'Articles with empty listen template'
end
end
if isPlain then
cats[#cats + 1] = 'Listen template using plain parameter'
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
function p._main(args)
-- Organise the arguments by number.
local isPlain = args.plain == 'yes'
local isEmbedded = args.embed and true
local hasImage = not isPlain and not isEmbedded and args.image ~= 'none'
local numArgs, missingFiles = {}, {}
do
local origNumArgs = mTableTools.numData(args)
origNumArgs[1] = origNumArgs.other -- Overwrite args.filename1 etc. with args.filename etc.
origNumArgs = mTableTools.compressSparseArray(origNumArgs)
for i, t in ipairs(origNumArgs) do
-- Check if the files exist.
local obj = t.filename and mw.title.makeTitle(-2, t.filename)
if obj and obj.exists then
if t.length == 'yes' or
-- Show length if the video height would be less than 150px
obj.file.width / obj.file.height > (hasImage and 1.547 or 1.434)
then
t.length = obj.file.length
else
t.length = nil
end
numArgs[#numArgs + 1] = t
else
missingFiles[#missingFiles + 1] = t.filename or i
end
end
end
-- Render warning
local hasMissing = #missingFiles ~= 0
local previewWarning = ''
if hasMissing then
for i, v in ipairs(missingFiles) do
missingFiles[i] = type(v) == 'string'
and string.format('missing file "%s"', v)
or string.format('empty filename #%s', v)
end
previewWarning = string.format(
'Page using [[Template:Listen]] with %s',
mw.text.listToText(missingFiles)
)
previewWarning = require('Module:If preview')._warning({previewWarning})
end
-- Exit early if none exist.
if #numArgs == 0 then
return previewWarning .. renderTrackingCategories(isPlain, hasMissing, true)
end
-- Build the arguments for {{side box}}
local sbArgs = {
metadata = 'no',
position = (isPlain or isEmbedded) and 'left' or args.pos,
style = args.style,
templatestyles = 'Module:Listen/styles.css'
}
-- Class arguments
do
local class = {
'listen',
'noprint'
}
if isPlain then
table.insert(class, 'listen-plain')
end
if isEmbedded then
table.insert(class, 'listen-embedded')
end
if not hasImage then
table.insert(class, 'listen-noimage')
end
if args.pos == 'left' and not isPlain and not isEmbedded then
table.insert(class, 'listen-left')
elseif args.pos == 'center' then
table.insert(class, 'listen-center')
end
sbArgs.class = table.concat(class, ' ')
end
-- Image
if not isPlain and not isEmbedded then
if args.image then
sbArgs.image = args.image
else
local images = {
speech = 'Audio-input-microphone.svg',
music = 'Gnome-mime-audio-openclipart.svg',
default = 'Gnome-mime-sound-openclipart.svg'
}
sbArgs.image = mFileLink._main{
file = args.type and images[args.type] or images.default,
size = '65x50px',
location = 'center',
link = '',
alt = ''
}
end
end
-- Text
do
local header
if args.header then
header = mw.html.create('div')
header:addClass('listen-header')
:wikitext(args.header)
header = tostring(header) .. '\n'
else
header = ''
end
local text = {}
for i, t in ipairs(numArgs) do
text[#text + 1] = renderRow(
t.filename, t.title, t.play, t.alt, t.description, t.start,
t.length, hasImage
)
if numArgs[i + 1] then
text[#text + 1] = '<hr/>'
end
end
sbArgs.text = header .. table.concat(text)
end
-- Below
if not isPlain and not isEmbedded and args.help ~= 'no' then
sbArgs.below = string.format(
'<hr/><i class="selfreference">Problems playing %s? See [[Help:Media|media help]].</i>',
#numArgs == 1 and 'this file' or 'these files'
)
end
-- Render the side box.
local sideBox = mSideBox._main(sbArgs)
-- Render the tracking categories.
local trackingCategories = renderTrackingCategories(isPlain, hasMissing)
return previewWarning .. sideBox .. trackingCategories
end
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p
pshu9hn2rm9f5n35bkb0qnl4u7oiy1b
33455
33454
2026-11-11T21:59:12Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Listen]]
33454
Scribunto
text/plain
local mFileLink = require('Module:File link')
local mTableTools = require('Module:TableTools')
local mSideBox = require('Module:Side box')
local lang = mw.language.new('en')
local p = {}
local function formatLength(length)
-- Formats a duration in seconds in "(h:)mm:ss" (minutes are zero-padded
-- only if there are hours).
if not length or length == 0 then
return nil
end
-- Add 0.5 to offset the rounding down
local t = lang:getDurationIntervals(length + 0.5, { 'hours', 'minutes', 'seconds' })
local s = t.seconds and string.format('%02d', t.seconds) or '00'
local m = t.minutes or 0
local span = mw.html.create('span'):addClass('duration')
if t.hours then
span
:tag('span')
:addClass('h')
:wikitext(t.hours)
:done()
:wikitext(':')
m = string.format('%02d', m)
end
span
:tag('span')
:addClass('min')
:wikitext(m)
:done()
:wikitext(':')
:tag('span')
:addClass('s')
:wikitext(s)
:done()
return tostring(span)
end
local function renderRow(filename, title, play, alt, description, start, length, hasImage)
-- Renders the HTML for one file description row.
if not filename then
return nil
end
length = formatLength(length)
length = length and string.format(' (%s)', length) or ''
local root = mw.html.create('')
root:tag('div')
:addClass('haudio')
:newline()
:tag('div')
:addClass('listen-file-header')
:wikitext(string.format(
'[[:File:%s|%s]]%s',
filename,
title or '',
length
))
:done()
:newline()
:tag('div')
:wikitext(play ~= 'no' and mFileLink._main{
file = filename,
size = hasImage and '232px' or '215px',
alt = alt,
start = start
}
or nil
)
:done()
:newline()
:tag('div')
:addClass('description')
:wikitext(description)
:done()
:done()
return tostring(root)
end
local function renderTrackingCategories(isPlain, hasMissing, isEmpty, titleObj)
-- Renders all tracking categories produced by the template.
-- isPlain, hasMissing and isEmpty are passed through from p._main,
-- and the titleObj is only used for testing purposes.
local cats = {}
local currentTitle = titleObj or mw.title.getCurrentTitle()
if currentTitle.namespace == 0 then
-- We are in mainspace.
if not isEmpty then
cats[#cats + 1] = 'Articles with hAudio microformats'
end
if hasMissing then
cats[#cats + 1] = 'Articles with empty listen template'
end
end
if isPlain then
cats[#cats + 1] = 'Listen template using plain parameter'
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
function p._main(args)
-- Organise the arguments by number.
local isPlain = args.plain == 'yes'
local isEmbedded = args.embed and true
local hasImage = not isPlain and not isEmbedded and args.image ~= 'none'
local numArgs, missingFiles = {}, {}
do
local origNumArgs = mTableTools.numData(args)
origNumArgs[1] = origNumArgs.other -- Overwrite args.filename1 etc. with args.filename etc.
origNumArgs = mTableTools.compressSparseArray(origNumArgs)
for i, t in ipairs(origNumArgs) do
-- Check if the files exist.
local obj = t.filename and mw.title.makeTitle(-2, t.filename)
if obj and obj.exists then
if t.length == 'yes' or
-- Show length if the video height would be less than 150px
obj.file.width / obj.file.height > (hasImage and 1.547 or 1.434)
then
t.length = obj.file.length
else
t.length = nil
end
numArgs[#numArgs + 1] = t
else
missingFiles[#missingFiles + 1] = t.filename or i
end
end
end
-- Render warning
local hasMissing = #missingFiles ~= 0
local previewWarning = ''
if hasMissing then
for i, v in ipairs(missingFiles) do
missingFiles[i] = type(v) == 'string'
and string.format('missing file "%s"', v)
or string.format('empty filename #%s', v)
end
previewWarning = string.format(
'Page using [[Template:Listen]] with %s',
mw.text.listToText(missingFiles)
)
previewWarning = require('Module:If preview')._warning({previewWarning})
end
-- Exit early if none exist.
if #numArgs == 0 then
return previewWarning .. renderTrackingCategories(isPlain, hasMissing, true)
end
-- Build the arguments for {{side box}}
local sbArgs = {
metadata = 'no',
position = (isPlain or isEmbedded) and 'left' or args.pos,
style = args.style,
templatestyles = 'Module:Listen/styles.css'
}
-- Class arguments
do
local class = {
'listen',
'noprint'
}
if isPlain then
table.insert(class, 'listen-plain')
end
if isEmbedded then
table.insert(class, 'listen-embedded')
end
if not hasImage then
table.insert(class, 'listen-noimage')
end
if args.pos == 'left' and not isPlain and not isEmbedded then
table.insert(class, 'listen-left')
elseif args.pos == 'center' then
table.insert(class, 'listen-center')
end
sbArgs.class = table.concat(class, ' ')
end
-- Image
if not isPlain and not isEmbedded then
if args.image then
sbArgs.image = args.image
else
local images = {
speech = 'Audio-input-microphone.svg',
music = 'Gnome-mime-audio-openclipart.svg',
default = 'Gnome-mime-sound-openclipart.svg'
}
sbArgs.image = mFileLink._main{
file = args.type and images[args.type] or images.default,
size = '65x50px',
location = 'center',
link = '',
alt = ''
}
end
end
-- Text
do
local header
if args.header then
header = mw.html.create('div')
header:addClass('listen-header')
:wikitext(args.header)
header = tostring(header) .. '\n'
else
header = ''
end
local text = {}
for i, t in ipairs(numArgs) do
text[#text + 1] = renderRow(
t.filename, t.title, t.play, t.alt, t.description, t.start,
t.length, hasImage
)
if numArgs[i + 1] then
text[#text + 1] = '<hr/>'
end
end
sbArgs.text = header .. table.concat(text)
end
-- Below
if not isPlain and not isEmbedded and args.help ~= 'no' then
sbArgs.below = string.format(
'<hr/><i class="selfreference">Problems playing %s? See [[Help:Media|media help]].</i>',
#numArgs == 1 and 'this file' or 'these files'
)
end
-- Render the side box.
local sideBox = mSideBox._main(sbArgs)
-- Render the tracking categories.
local trackingCategories = renderTrackingCategories(isPlain, hasMissing)
return previewWarning .. sideBox .. trackingCategories
end
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p
pshu9hn2rm9f5n35bkb0qnl4u7oiy1b
Tempilet:Duration
10
2690
33456
2020-05-11T13:05:33Z
en>Pppery
0
Module renamed
33456
wikitext
text/x-wiki
{{#invoke:Duration|main}}<noinclude>{{documentation}}</noinclude>
4ipagk29116gu7wnlcktmxttu0wvm29
33457
33456
2026-11-11T21:59:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Duration]]
33456
wikitext
text/x-wiki
{{#invoke:Duration|main}}<noinclude>{{documentation}}</noinclude>
4ipagk29116gu7wnlcktmxttu0wvm29
Tempilet:Large
10
2691
33458
2023-01-16T01:12:34Z
en>Jonesey95
0
use this template's own documentation
33458
wikitext
text/x-wiki
<span style="font-size:120%">{{{1}}}</span><noinclude>
{{Documentation}}
</noinclude>
gb9jg7srxpcm0n8wv0k3unldj3qzdrc
33459
33458
2026-11-11T21:59:12Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Large]]
33458
wikitext
text/x-wiki
<span style="font-size:120%">{{{1}}}</span><noinclude>
{{Documentation}}
</noinclude>
gb9jg7srxpcm0n8wv0k3unldj3qzdrc
Module:Duration
828
2692
33460
2020-05-11T14:05:19Z
en>Pppery
0
Fix error message per edit request
33460
Scribunto
text/plain
local p = {}
function p._error( error_str )
return '[[Category:Duration with input error]]<strong class="error">Error in Module:Duration: ' .. error_str .. '</strong>'
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Duration', 'Template:Duration/sandbox'}})
local tmp = args.duration or args[1] or ''
local duration = {}
if tonumber(args[1]) or args[2] or args[3] then
if args[4] then return p._error('Parameter number 4 should not be specified') end
if not args[1] or args[1] == '' then
duration = {args[2] or 0, args[3] or 0}
else
duration = {args[1], args[2] or 0, args[3] or 0}
end
tmp = nil
for k, v in ipairs(duration) do
duration[k] = tonumber(v)
if not duration[k] then return p._error('Invalid values') end
end
elseif args.h or args.m or args.s then
if not args.h or args.h == '' then
duration = {args.m or 0, args.s or 0}
else
duration = {args.h, args.m or 0, args.s or 0}
end
tmp = nil
for k, v in ipairs(duration) do
duration[k] = tonumber(v)
if not duration[k] then return p._error('Invalid values') end
end
else
if mw.ustring.find(tmp, 'class="duration"', 1, yes) then return tmp end -- if there is already a microformat, don't do anything
duration = mw.text.split(mw.ustring.match(tmp, '%d*:?%d+:%d+%.?%d*') or '', ':') -- split into table
if duration[4] then return p._error('Maximum of two colons allowed') end
for k, v in ipairs(duration) do duration[k] = tonumber(v) or 0 end -- convert values to numbers
end
if duration[3] then
if (duration[1] + duration[2] + duration[3]) == 0 then return nil end
if (duration[1] ~= math.ceil(duration[1])) or (duration[2] ~= math.ceil(duration[2])) then return p._error('Hours and minutes values must be integers') end
if duration[3] >= 60 then return p._error('Seconds value must be less than 60') end
if duration[2] >= 60 then return p._error('Minutes value must be less than 60 if hours value is specified') end
if duration[2] < 10 then duration[2] = '0'..duration[2] end -- zero padding
if duration[3] < 10 then duration[3] = '0'..duration[3] end
duration = '<span class="duration"><span class="h">' .. duration[1] .. '</span>:<span class="min">' .. duration[2] .. '</span>:<span class="s">' .. duration[3] .. '</span></span>'
elseif duration[2] then
if (duration[1] + duration[2]) == 0 then return nil end
if duration[1] ~= math.ceil(duration[1]) then return p._error('Hours and minutes values must be integers') end
if duration[2] >= 60 then return p._error('Seconds value must be less than 60') end
if duration[2] < 10 then duration[2] = '0'..duration[2] end -- zero padding
duration = '<span class="duration"><span class="min">' .. duration[1] .. '</span>:<span class="s">' .. duration[2] .. '</span></span>'
else
duration = ''
end
if tmp and tmp ~= '' then
if duration ~= '' then tmp = mw.ustring.gsub(tmp, '%d*:?%d+:%d+%.?%d*', duration, 1) else tmp = tmp .. ' [[Category:Duration without hAudio microformat]]' end
else
if duration ~= '' then tmp = duration end
end
return tmp
end
return p
s4x5hkhx6ru9jkw7syru3b80wgxn0cn
33461
33460
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Duration]]
33460
Scribunto
text/plain
local p = {}
function p._error( error_str )
return '[[Category:Duration with input error]]<strong class="error">Error in Module:Duration: ' .. error_str .. '</strong>'
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Duration', 'Template:Duration/sandbox'}})
local tmp = args.duration or args[1] or ''
local duration = {}
if tonumber(args[1]) or args[2] or args[3] then
if args[4] then return p._error('Parameter number 4 should not be specified') end
if not args[1] or args[1] == '' then
duration = {args[2] or 0, args[3] or 0}
else
duration = {args[1], args[2] or 0, args[3] or 0}
end
tmp = nil
for k, v in ipairs(duration) do
duration[k] = tonumber(v)
if not duration[k] then return p._error('Invalid values') end
end
elseif args.h or args.m or args.s then
if not args.h or args.h == '' then
duration = {args.m or 0, args.s or 0}
else
duration = {args.h, args.m or 0, args.s or 0}
end
tmp = nil
for k, v in ipairs(duration) do
duration[k] = tonumber(v)
if not duration[k] then return p._error('Invalid values') end
end
else
if mw.ustring.find(tmp, 'class="duration"', 1, yes) then return tmp end -- if there is already a microformat, don't do anything
duration = mw.text.split(mw.ustring.match(tmp, '%d*:?%d+:%d+%.?%d*') or '', ':') -- split into table
if duration[4] then return p._error('Maximum of two colons allowed') end
for k, v in ipairs(duration) do duration[k] = tonumber(v) or 0 end -- convert values to numbers
end
if duration[3] then
if (duration[1] + duration[2] + duration[3]) == 0 then return nil end
if (duration[1] ~= math.ceil(duration[1])) or (duration[2] ~= math.ceil(duration[2])) then return p._error('Hours and minutes values must be integers') end
if duration[3] >= 60 then return p._error('Seconds value must be less than 60') end
if duration[2] >= 60 then return p._error('Minutes value must be less than 60 if hours value is specified') end
if duration[2] < 10 then duration[2] = '0'..duration[2] end -- zero padding
if duration[3] < 10 then duration[3] = '0'..duration[3] end
duration = '<span class="duration"><span class="h">' .. duration[1] .. '</span>:<span class="min">' .. duration[2] .. '</span>:<span class="s">' .. duration[3] .. '</span></span>'
elseif duration[2] then
if (duration[1] + duration[2]) == 0 then return nil end
if duration[1] ~= math.ceil(duration[1]) then return p._error('Hours and minutes values must be integers') end
if duration[2] >= 60 then return p._error('Seconds value must be less than 60') end
if duration[2] < 10 then duration[2] = '0'..duration[2] end -- zero padding
duration = '<span class="duration"><span class="min">' .. duration[1] .. '</span>:<span class="s">' .. duration[2] .. '</span></span>'
else
duration = ''
end
if tmp and tmp ~= '' then
if duration ~= '' then tmp = mw.ustring.gsub(tmp, '%d*:?%d+:%d+%.?%d*', duration, 1) else tmp = tmp .. ' [[Category:Duration without hAudio microformat]]' end
else
if duration ~= '' then tmp = duration end
end
return tmp
end
return p
s4x5hkhx6ru9jkw7syru3b80wgxn0cn
Tempilet:Microformat message
10
2693
33464
2026-10-16T08:47:17Z
en>Danny 1994
0
33464
wikitext
text/x-wiki
The [[Help:HTML in wikitext|HTML mark-up]] produced by this template includes {{#if:{{{type|}}} |{{{type}}} |an [[{{{format}}} microformat]]}} that makes {{{data}}} readily [[Parsing|parsable]] by computer programs. This aids tasks such as the cataloguing of articles and maintenance of databases. For more information about the use of microformats on Wikipedia, please visit [[Wikipedia:WikiProject Microformats|the Microformat WikiProject]].<!--
-->{{#if:{{{subtemplates<includeonly>|</includeonly>}}}
| <div style="margin-top:0.5em;margin-bottom:0.65em;">
; {{large|Subtemplates}}
{{{subtemplates}}}
'''''Please do not remove instances of these subtemplates.'''''
</div>}}<!--
-->{{#if:{{{subsection1|}}}
| <div style="margin-top:0.5em;margin-bottom:0.65em;"><!--(newline in case subsection begins with heading:)-->
{{{subsection1}}}
</div>}}<!--
-->{{#if:{{{1<includeonly>|</includeonly>}}} <!--(i.e. if at least one unnamed parameter supplied:)-->
| <div style="margin-top:0.5em;margin-bottom:0.65em;">
; {{large|Classes used}}
The [[HTML attribute|HTML class]]es of this microformat include:
: {{Horizontal list
|item_style=font-size:110%;{{{itemstyle|}}}
|{{{1}}} |{{{2<includeonly>|</includeonly>}}} |{{{3|<noinclude>{{nobold|……}}</noinclude>}}}
|{{{4|}}} |{{{5|}}} |{{{6|}}} |{{{7|}}} |{{{8|}}} |{{{9|}}} |{{{10|}}} |{{{11|}}} |{{{12|}}} |{{{13|}}} |{{{14|}}} |{{{15|}}} |{{{16|}}} |{{{17|}}} |{{{18|}}} |{{{19|}}} |{{{20|}}}
}} </div>
{{longitem|style=line-height:1.3em|'''''Please do not rename or remove these classes{{#if:{{{nocollapse<includeonly>|</includeonly>}}} |<br/>nor collapse nested elements which use them}}.'''''}}<!--
-->}}<!--(end #if:[1])--><noinclude>
{{documentation}}
</noinclude>
n9n0wy4h7hft55i3rpw1h23xusucxzm
33465
33464
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Microformat_message]]
33464
wikitext
text/x-wiki
The [[Help:HTML in wikitext|HTML mark-up]] produced by this template includes {{#if:{{{type|}}} |{{{type}}} |an [[{{{format}}} microformat]]}} that makes {{{data}}} readily [[Parsing|parsable]] by computer programs. This aids tasks such as the cataloguing of articles and maintenance of databases. For more information about the use of microformats on Wikipedia, please visit [[Wikipedia:WikiProject Microformats|the Microformat WikiProject]].<!--
-->{{#if:{{{subtemplates<includeonly>|</includeonly>}}}
| <div style="margin-top:0.5em;margin-bottom:0.65em;">
; {{large|Subtemplates}}
{{{subtemplates}}}
'''''Please do not remove instances of these subtemplates.'''''
</div>}}<!--
-->{{#if:{{{subsection1|}}}
| <div style="margin-top:0.5em;margin-bottom:0.65em;"><!--(newline in case subsection begins with heading:)-->
{{{subsection1}}}
</div>}}<!--
-->{{#if:{{{1<includeonly>|</includeonly>}}} <!--(i.e. if at least one unnamed parameter supplied:)-->
| <div style="margin-top:0.5em;margin-bottom:0.65em;">
; {{large|Classes used}}
The [[HTML attribute|HTML class]]es of this microformat include:
: {{Horizontal list
|item_style=font-size:110%;{{{itemstyle|}}}
|{{{1}}} |{{{2<includeonly>|</includeonly>}}} |{{{3|<noinclude>{{nobold|……}}</noinclude>}}}
|{{{4|}}} |{{{5|}}} |{{{6|}}} |{{{7|}}} |{{{8|}}} |{{{9|}}} |{{{10|}}} |{{{11|}}} |{{{12|}}} |{{{13|}}} |{{{14|}}} |{{{15|}}} |{{{16|}}} |{{{17|}}} |{{{18|}}} |{{{19|}}} |{{{20|}}}
}} </div>
{{longitem|style=line-height:1.3em|'''''Please do not rename or remove these classes{{#if:{{{nocollapse<includeonly>|</includeonly>}}} |<br/>nor collapse nested elements which use them}}.'''''}}<!--
-->}}<!--(end #if:[1])--><noinclude>
{{documentation}}
</noinclude>
n9n0wy4h7hft55i3rpw1h23xusucxzm
Tempilet:Film- and television-related infobox templates
10
2694
33466
2024-08-26T19:17:05Z
en>Gonnym
0
33466
wikitext
text/x-wiki
{{Navbox
| name = Film- and television-related infobox templates
| title = Film- and television-related infobox templates
| listclass = hlist
| state = {{{state|autocollapse}}}
| group1 = [[Wikipedia:List of infoboxes#Film|Film]]
| list1 =
* [[Template:Infobox film|Film]]
** [[Template:Infobox film/short description|/short description]]
* [[Template:Infobox film or theatre festival|Film or theatre festival]]
* [[Template:Infobox art movement|Art movement]]
* [[Template:Infobox cinema market|Cinema market]]
* [[Template:Infobox movie quote|Movie quote]]
| group2 = [[Wikipedia:List of infoboxes#Television|Television]]
| list2 =
* [[Template:Infobox television|Television]]
** [[Template:Infobox television/Short description|/Short description]]
* [[Template:Infobox television season|Television season]]
** [[Template:Infobox reality competition season|Reality competition season]]
* [[Template:Infobox television episode|Television episode]]
** [[Template:Infobox television crossover episode|crossover]]
*** [[Template:Infobox television crossover episode/part|/part]]
** ''[[Template:Infobox Doctor Who episode|Doctor Who]]''
** ''[[Template:Infobox Futurama episode|Futurama]]''
** ''[[Template:Infobox Simpsons episode|Simpsons]]''
* [[Template:Infobox animanga/Video|Animanga]]
| group3 = Misc video
| list3 =
* ''[[Template:Infobox Paris by Night|Paris by Night]]''
* [[Template:Infobox machinima|Machinima]]
| group4 = Industry
| list4 =
* [[Template:Infobox award|Award]]
* [[Template:Infobox awards list|Awards list]]
* [[Template:Infobox film awards|Film awards]]
** [[Template:Infobox film awards/link|/link]]
** [[Template:Infobox film awards/style|/style]]
* [[Template:Infobox broadcasting network|Broadcasting network]]
* [[Template:Infobox television channel|Television channel]]
* [[Template:Infobox television station|Television station]]
* [[Template:Infobox programming block|Programming block]]
* [[Template:Infobox presenter|Presenter]]
| group5 = [[Wikipedia:List of infoboxes#Photography|Technical]]
| list5 =
* [[Template:Infobox camera|Camera]]
* [[Template:Infobox movie camera|Movie camera]]
* [[Template:Infobox camera mount|Camera mount]]
* [[Template:Infobox photographic lens|Photographic lens]]
* [[Template:Infobox lens design|Lens design]]
* [[Template:Infobox photographic film|Photographic film]]
| group6 = [[Wikipedia:List of infoboxes#Fictional elements|Fiction]]
| list6 =
* [[Template:Infobox fictional artifact|Artifact]]
* [[Template:Infobox character|Character]]
** [[Template:Infobox Doctor Who doctor|Doctor Who doctor]]
** [[Template:Infobox G.I. Joe character|''G.I. Joe'']]
** [[Template:Infobox soap character|Soap opera]]
* [[Template:Infobox fictional family|Family]]
** [[Template:Infobox fictional family/member|Family member]]
* [[Template:Infobox fictional location|Location]]
* [[Template:Infobox fictional organisation|Organisation]]
* [[Template:Infobox fictional race|Race]]
* [[Template:Infobox fictional vehicle|Vehicle]]
| group7 = Template modules
| list7 =
* [[Template:Infobox name module|Name module]]
* [[Template:Based on|Based on]]
* [[Template:Infobox person|Person]]
* [[Template:Listen|Listen]]
| group8 = Related
| list8 =
* [[Template:Infobox advertising|Advertising]]
* [[Template:Infobox media franchise|Media franchise]]
* [[Template:Infobox audio drama|Audio drama]]
* [[Template:Infobox podcast|Podcast]]
* [[Template:Infobox radio station|Radio station]]
* [[Template:Infobox radio show|Radio show]]
}}<noinclude>
{{Documentation}}
</noinclude>
f8ik4bsipy145ylrinaubi93ilbrurb
33467
33466
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Film-_and_television-related_infobox_templates]]
33466
wikitext
text/x-wiki
{{Navbox
| name = Film- and television-related infobox templates
| title = Film- and television-related infobox templates
| listclass = hlist
| state = {{{state|autocollapse}}}
| group1 = [[Wikipedia:List of infoboxes#Film|Film]]
| list1 =
* [[Template:Infobox film|Film]]
** [[Template:Infobox film/short description|/short description]]
* [[Template:Infobox film or theatre festival|Film or theatre festival]]
* [[Template:Infobox art movement|Art movement]]
* [[Template:Infobox cinema market|Cinema market]]
* [[Template:Infobox movie quote|Movie quote]]
| group2 = [[Wikipedia:List of infoboxes#Television|Television]]
| list2 =
* [[Template:Infobox television|Television]]
** [[Template:Infobox television/Short description|/Short description]]
* [[Template:Infobox television season|Television season]]
** [[Template:Infobox reality competition season|Reality competition season]]
* [[Template:Infobox television episode|Television episode]]
** [[Template:Infobox television crossover episode|crossover]]
*** [[Template:Infobox television crossover episode/part|/part]]
** ''[[Template:Infobox Doctor Who episode|Doctor Who]]''
** ''[[Template:Infobox Futurama episode|Futurama]]''
** ''[[Template:Infobox Simpsons episode|Simpsons]]''
* [[Template:Infobox animanga/Video|Animanga]]
| group3 = Misc video
| list3 =
* ''[[Template:Infobox Paris by Night|Paris by Night]]''
* [[Template:Infobox machinima|Machinima]]
| group4 = Industry
| list4 =
* [[Template:Infobox award|Award]]
* [[Template:Infobox awards list|Awards list]]
* [[Template:Infobox film awards|Film awards]]
** [[Template:Infobox film awards/link|/link]]
** [[Template:Infobox film awards/style|/style]]
* [[Template:Infobox broadcasting network|Broadcasting network]]
* [[Template:Infobox television channel|Television channel]]
* [[Template:Infobox television station|Television station]]
* [[Template:Infobox programming block|Programming block]]
* [[Template:Infobox presenter|Presenter]]
| group5 = [[Wikipedia:List of infoboxes#Photography|Technical]]
| list5 =
* [[Template:Infobox camera|Camera]]
* [[Template:Infobox movie camera|Movie camera]]
* [[Template:Infobox camera mount|Camera mount]]
* [[Template:Infobox photographic lens|Photographic lens]]
* [[Template:Infobox lens design|Lens design]]
* [[Template:Infobox photographic film|Photographic film]]
| group6 = [[Wikipedia:List of infoboxes#Fictional elements|Fiction]]
| list6 =
* [[Template:Infobox fictional artifact|Artifact]]
* [[Template:Infobox character|Character]]
** [[Template:Infobox Doctor Who doctor|Doctor Who doctor]]
** [[Template:Infobox G.I. Joe character|''G.I. Joe'']]
** [[Template:Infobox soap character|Soap opera]]
* [[Template:Infobox fictional family|Family]]
** [[Template:Infobox fictional family/member|Family member]]
* [[Template:Infobox fictional location|Location]]
* [[Template:Infobox fictional organisation|Organisation]]
* [[Template:Infobox fictional race|Race]]
* [[Template:Infobox fictional vehicle|Vehicle]]
| group7 = Template modules
| list7 =
* [[Template:Infobox name module|Name module]]
* [[Template:Based on|Based on]]
* [[Template:Infobox person|Person]]
* [[Template:Listen|Listen]]
| group8 = Related
| list8 =
* [[Template:Infobox advertising|Advertising]]
* [[Template:Infobox media franchise|Media franchise]]
* [[Template:Infobox audio drama|Audio drama]]
* [[Template:Infobox podcast|Podcast]]
* [[Template:Infobox radio station|Radio station]]
* [[Template:Infobox radio show|Radio show]]
}}<noinclude>
{{Documentation}}
</noinclude>
f8ik4bsipy145ylrinaubi93ilbrurb
Tempilet:UF-audio
10
2695
33468
2026-01-22T23:38:42Z
en>JJMC89 bot III
0
Moving [[:Category:Microformat (uF) message templates]] to [[:Category:Microformat message templates]] per [[Wikipedia:Categories for discussion/Speedy]]
33468
wikitext
text/x-wiki
{{Microformat message
| format = hAudio
| data = an audio recording's details
| subtemplates =
Date-of-publication ("published") information will only be included in the microformat if {{tl|start date}} (or, where appropriate, {{tl|start date and age}}) is used in a parent infobox/template. Do not, however, use {{tlf|start date}} or {{tlf|start date and age}} [[Wikipedia:WikiProject Microformats/dates|if a date before 1583 CE is involved]].
Use {{tl|duration}} to specify the duration/length of a recording. For instance, if the recording's duration is 3 minutes 45 seconds, use {{tlc|duration|m{{=}}3|s{{=}}45}} (which appears as: {{duration|m=3|s=45}}). If needed, {{para|h}} may be included to specify a number of hours.
|haudio |fn |album |description |category |contributor |duration |h |item |min |photo |position |price |published |s
| nocollapse = on
}}<includeonly>{{Sandbox other||[[Category:Templates generating hAudio microformats|{{PAGENAME}}]]}}</includeonly><noinclude>
{{Documentation |content={{Microformat message templates}}}}
[[Category:Microformat message templates]]
</noinclude>
2dr4ussbu81i3busgc3kp7kijpsdggz
33469
33468
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Template:UF-audio]]
33468
wikitext
text/x-wiki
{{Microformat message
| format = hAudio
| data = an audio recording's details
| subtemplates =
Date-of-publication ("published") information will only be included in the microformat if {{tl|start date}} (or, where appropriate, {{tl|start date and age}}) is used in a parent infobox/template. Do not, however, use {{tlf|start date}} or {{tlf|start date and age}} [[Wikipedia:WikiProject Microformats/dates|if a date before 1583 CE is involved]].
Use {{tl|duration}} to specify the duration/length of a recording. For instance, if the recording's duration is 3 minutes 45 seconds, use {{tlc|duration|m{{=}}3|s{{=}}45}} (which appears as: {{duration|m=3|s=45}}). If needed, {{para|h}} may be included to specify a number of hours.
|haudio |fn |album |description |category |contributor |duration |h |item |min |photo |position |price |published |s
| nocollapse = on
}}<includeonly>{{Sandbox other||[[Category:Templates generating hAudio microformats|{{PAGENAME}}]]}}</includeonly><noinclude>
{{Documentation |content={{Microformat message templates}}}}
[[Category:Microformat message templates]]
</noinclude>
2dr4ussbu81i3busgc3kp7kijpsdggz
Tempilet:Listen/doc
10
2696
33470
2025-01-02T09:46:17Z
en>Nardog
0
Reverted 2 edits by [[Special:Contributions/Vcvfou698069|Vcvfou698069]] ([[User talk:Vcvfou698069|talk]]): Use Wikidata
33470
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-use}}
{{For|the inline audio template|Template:Audio}}
{{Lua|Module:Listen}}
{{tl|{{BASEPAGENAME}}}} allows audio and video files to be embedded in articles. It should be used for audio files that are set off from the text, such as music clips or sound recordings.
==Simple usage==
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{Listen
| filename =
| title =
| description =
| pos =
}}
</syntaxhighlight>
* '''filename''' ''(Required)'': the pagename of the media file, {{em|without}} the <code>File:</code> (formerly <code>Image:</code>) prefix
* '''title''' ''(Required)'': the title of the audio file, to be displayed. Do not use wikilinks in the title – they will not work.
* '''description''': a description of the sounds being heard
* '''pos''': right (default), left, or center
===Multiple files===
Additional files can be embedded in an article with one template by appending a number to each parameter.
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{Listen
| filename =
| title =
| alt =
| description =
| filename2 =
| title2 =
| alt2 =
| description2 =
| filename3 =
| title3 =
| alt3 =
| description3 =
}}
</syntaxhighlight>
* '''filename''' ''(Required)'': the pagename of the media file, ''without'' the File: (formerly Image:) prefix
* '''title''' ''(Required)'': the title of the audio file, to be displayed.
* '''alt''': alt text for the image displayed for the file, for visually impaired readers; see ''[[Wikipedia:Alternative text for images]]''. This is needed for file formats that include video as well as sound. The alt text should describe just the initial static image, not the entire video or its sound.
* '''description''': a description of the sounds being heard
==Style parameters==
The template also takes a number of style parameters to control its appearance:
* '''type''': can be used to alter the image displayed at the left depending on the type of audio content being embedded. Acceptable values are '''music''', '''speech''' and '''sound''' (default)
* '''header''': can be used to add a header to the box.
* '''help''': if set to {{para|help|no}}, suppresses the help text that normally appears at the bottom of the box. Only do this if there are other audio files on the page which ''do'' have the help link; it ''must'' be provided on ''at least'' the first file on the article.
* '''pos''': by default the box floats to the right side of the screen. Setting this to '''left''' or '''center''' will float the box on the left-hand side, or center it, respectively.
* '''image''': define a different image. E.g. {{nowrap|{{para|image|<nowiki>[[File:Example.jpg|50px]]</nowiki>}}}}. You can set {{para|image|none}} to disable the image entirely.
* '''style''': can be used to pass specific style instructions to the box. Setting this to '''float:none''' will anchor the box when this is convenient. Setting this to '''float:none; clear:none''' will enable the anchored box to co-exist gracefully beside another floating box.
* '''play''(n)''''': some media files cannot be displayed inline; if this is the case set {{para|play|no}} to prevent the broken inline link from displaying.
* '''plain''': if set {{para|plain|yes}}, removes most of the ornamentation (table border, image, and help links) to give a minimalist version. This also removes the left/right float and positioning, to allow the box to be manually positioned as desired using the {{para|style}} (e.g., {{Para|style|float:right}}) parameter and surrounding markup.
* '''embed''': use {{para|embed|yes}} to remove border and padding when using as a module embedded in another infobox (see examples below).
* '''start''(n)''''': Timestamp at which the file should start playing
* '''length''(n)''''': setting {{para|length''(n)''|hide}} hides the duration (h:m:s).
==Examples==
===Basic===
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
}}
</syntaxhighlight>
{{Clear}}
===With video===
{{Listen
| image = [[File:Crystal Project video camera.png|50px]]
| help = no
| filename = Barack Obama inaugural address.ogv
| alt = A black man in a black coat gestures and talks at a lecturn surrounded by teleprompters. Behind him, in the background, are about a dozen warmly-dressed onlookers.
| title = Inaugural address of Barack Obama
| description = Barack Obama's [[First inauguration of Barack Obama|first inaugural address]], January 20, 2009<br />(Duration: 21 minutes, 21 seconds)
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| image = [[File:Crystal Project video camera.png|50px]]
| help = no
| filename = Barack Obama inaugural address.ogv
| alt = A black man in a black coat gestures and talks at a lecturn surrounded by teleprompters. Behind him, in the background, are about a dozen warmly-dressed onlookers.
| title = Inaugural address of Barack Obama
| description = Barack Obama's [[First inauguration of Barack Obama|first inaugural address]], January 20, 2009<br />(Duration: 21 minutes, 21 seconds)
}}
</syntaxhighlight>
{{Clear}}
===With header===
{{Listen
| header = Recordings of this phrase:
| type = speech
| filename = Frase de Neil Armstrong.ogg
| title = "One small step for a man..."
| description = First words spoken on the [[Moon]]
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| header = Recordings of this phrase:
| type = speech
| filename = Frase de Neil Armstrong.ogg
| title = "One small step for a man..."
| description = First words spoken on the [[Moon]].
}}
</syntaxhighlight>
{{Clear}}
===Embedding===
{{see also|Template:Listen voice}}
{{Infobox person
| name = Dr. Accordion
| occupation = Accordion player
| module =
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| embed = yes
}}
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox person
| name = Dr. Accordion
| occupation = Accordion player
| module =
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| embed = yes
}}
}}
</syntaxhighlight>
{{Clear}}
===Plain===
{|
|<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| plain = yes
| style = float:left
}}
</syntaxhighlight>
|{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| plain = yes
| style = float:left
}}
|}
{{Clear}}
===Multiple files===
{{Listen
| type = music
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
| filename2 = Moonlight.ogg
| title2 = ''Moonlight Sonata''
| description2 = [[Ludwig van Beethoven|Beethoven]]'s [[Piano Sonata No. 14 (Beethoven)|Sonata in C-sharp minor]]
| filename3 = Brahms-waltz15.ogg
| title3 = Waltz No. 15
| description3 = From [[Sixteen Waltzes, Op. 39 (Brahms)|Sixteen Waltzes, Op. 39]] by [[Johannes Brahms|Brahms]]
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| type = music
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
| filename2 = Moonlight.ogg
| title2 = ''Moonlight Sonata''
| description2 = [[Ludwig van Beethoven|Beethoven]]'s [[Piano Sonata No. 14 (Beethoven)|Sonata in C-sharp minor]]
| filename3 = Brahms-waltz15.ogg
| title3 = Waltz No. 15
| description3 = From [[Sixteen Waltzes, Op. 39 (Brahms)|Sixteen Waltzes, Op. 39]] by [[Johannes Brahms|Brahms]]
}}
</syntaxhighlight>
{{Clear}}
==Microformat==
{{UF-audio}}
==Tracking categories==
* {{clc|Articles with hAudio microformats}}
* {{clc|Articles with empty listen template}}
* {{clc|Listen template using plain parameter}}
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "Allows audio and video files to be embedded in articles.",
"format": "{{_\n| ____________ = _\n}}\n",
"params": {
"header": {
"label": "Header",
"description": "Text or other content to go above all the files in the template (but within the template boundary). Allows markup.",
"type": "content"
},
"type": {
"label": "Music or speech icon",
"description": "Enter \"music\" or \"speech\" here to change the template icon to a speaker with music notes or a microphone.",
"type": "line",
"example": "music",
"default": "sound",
"suggestedvalues": [
"sound",
"music",
"speech"
]
},
"image": {
"label": "Custom icon",
"description": "Custom image to replace the speaker icon in the template. Alternatively, enter \"none\" here to hide the icon entirely.",
"type": "wiki-file-name",
"example": "[[File:Example.jpg|50px]], none"
},
"filename": {
"label": "Filename",
"description": "The filename of the file. Filename2, filename3, etc. can be used for subsequent files.",
"type": "wiki-file-name",
"required": true
},
"title": {
"label": "Title",
"description": "The title to display for the file. Title2, title3, etc. can be used for subsequent files.",
"type": "string",
"required": true
},
"description": {
"label": "Description",
"description": "A description of the file. Description2, description3, etc. can be used for subsequent files.",
"type": "string",
"suggested": true
},
"start": {
"label": "Start time",
"description": "Timestamp at which the first file should start playing (start2, start3, etc. can be used for subsequent files)",
"type": "line",
"example": "0:20"
},
"length": {
"label": "Hide duration?",
"description": "Enter \"hide\" here to hide the duration of the first file (length2, length3, etc. can be used for subsequent files).",
"type": "line",
"example": "hide"
},
"play": {
"label": "Hide player?",
"description": "Enter \"no\" here to hide the file player for the first file (play2, play3, etc. can be used for subsequent files). To be used for some media files that cannot be displayed inline, to prevent a broken inline link from showing.",
"type": "line",
"example": "no"
},
"help": {
"label": "Hide help text?",
"description": "Enter \"no\" here to hide the \"Problems playing this file? See media help.\" text at the bottom of the template. Must not be done on the first instance of the template; optional on subsequent instances of the template.",
"type": "line",
"example": "no"
},
"pos": {
"label": "Position",
"description": "Enter \"left\" or \"center\" here to change the default position of the template from on the right.",
"type": "line",
"example": "left",
"default": "right",
"suggestedvalues": [
"left",
"center",
"right"
]
},
"plain": {
"label": "Plain style?",
"description": "Enter \"yes\" here to remove most of the ornamentation (border, background, icon and help text) and the float/positioning of the template to give a minimalist version, allowing the user to use the custom CSS (\"style\") parameter to style and position the template.",
"type": "line",
"example": "yes"
},
"embed": {
"label": "Optimise for embedding?",
"description": "Enter any text here to remove the left, right and bottom border, the background, the icon, the help text and the padding of the template for use in an infobox.",
"type": "line",
"example": "y"
},
"style": {
"label": "Custom CSS",
"description": "Custom CSS for the template",
"type": "content",
"example": "float:none; clear:none"
}
},
"paramOrder": [
"header",
"type",
"image",
"filename",
"title",
"description",
"start",
"length",
"play",
"help",
"pos",
"plain",
"embed",
"style"
]
}
</templatedata>
==See also==
{{Audio templates}}
{{Film- and television-related infobox templates}}
<includeonly>{{Sandbox other||
[[Category:Audio templates]]
[[Category:Embeddable templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
px067nh6v1aqxwnp0gknw461b7xtsd5
33471
33470
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Listen/doc]]
33470
wikitext
text/x-wiki
{{Documentation subpage}}
{{High-use}}
{{For|the inline audio template|Template:Audio}}
{{Lua|Module:Listen}}
{{tl|{{BASEPAGENAME}}}} allows audio and video files to be embedded in articles. It should be used for audio files that are set off from the text, such as music clips or sound recordings.
==Simple usage==
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{Listen
| filename =
| title =
| description =
| pos =
}}
</syntaxhighlight>
* '''filename''' ''(Required)'': the pagename of the media file, {{em|without}} the <code>File:</code> (formerly <code>Image:</code>) prefix
* '''title''' ''(Required)'': the title of the audio file, to be displayed. Do not use wikilinks in the title – they will not work.
* '''description''': a description of the sounds being heard
* '''pos''': right (default), left, or center
===Multiple files===
Additional files can be embedded in an article with one template by appending a number to each parameter.
<syntaxhighlight lang="wikitext" style="overflow: auto">
{{Listen
| filename =
| title =
| alt =
| description =
| filename2 =
| title2 =
| alt2 =
| description2 =
| filename3 =
| title3 =
| alt3 =
| description3 =
}}
</syntaxhighlight>
* '''filename''' ''(Required)'': the pagename of the media file, ''without'' the File: (formerly Image:) prefix
* '''title''' ''(Required)'': the title of the audio file, to be displayed.
* '''alt''': alt text for the image displayed for the file, for visually impaired readers; see ''[[Wikipedia:Alternative text for images]]''. This is needed for file formats that include video as well as sound. The alt text should describe just the initial static image, not the entire video or its sound.
* '''description''': a description of the sounds being heard
==Style parameters==
The template also takes a number of style parameters to control its appearance:
* '''type''': can be used to alter the image displayed at the left depending on the type of audio content being embedded. Acceptable values are '''music''', '''speech''' and '''sound''' (default)
* '''header''': can be used to add a header to the box.
* '''help''': if set to {{para|help|no}}, suppresses the help text that normally appears at the bottom of the box. Only do this if there are other audio files on the page which ''do'' have the help link; it ''must'' be provided on ''at least'' the first file on the article.
* '''pos''': by default the box floats to the right side of the screen. Setting this to '''left''' or '''center''' will float the box on the left-hand side, or center it, respectively.
* '''image''': define a different image. E.g. {{nowrap|{{para|image|<nowiki>[[File:Example.jpg|50px]]</nowiki>}}}}. You can set {{para|image|none}} to disable the image entirely.
* '''style''': can be used to pass specific style instructions to the box. Setting this to '''float:none''' will anchor the box when this is convenient. Setting this to '''float:none; clear:none''' will enable the anchored box to co-exist gracefully beside another floating box.
* '''play''(n)''''': some media files cannot be displayed inline; if this is the case set {{para|play|no}} to prevent the broken inline link from displaying.
* '''plain''': if set {{para|plain|yes}}, removes most of the ornamentation (table border, image, and help links) to give a minimalist version. This also removes the left/right float and positioning, to allow the box to be manually positioned as desired using the {{para|style}} (e.g., {{Para|style|float:right}}) parameter and surrounding markup.
* '''embed''': use {{para|embed|yes}} to remove border and padding when using as a module embedded in another infobox (see examples below).
* '''start''(n)''''': Timestamp at which the file should start playing
* '''length''(n)''''': setting {{para|length''(n)''|hide}} hides the duration (h:m:s).
==Examples==
===Basic===
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
}}
</syntaxhighlight>
{{Clear}}
===With video===
{{Listen
| image = [[File:Crystal Project video camera.png|50px]]
| help = no
| filename = Barack Obama inaugural address.ogv
| alt = A black man in a black coat gestures and talks at a lecturn surrounded by teleprompters. Behind him, in the background, are about a dozen warmly-dressed onlookers.
| title = Inaugural address of Barack Obama
| description = Barack Obama's [[First inauguration of Barack Obama|first inaugural address]], January 20, 2009<br />(Duration: 21 minutes, 21 seconds)
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| image = [[File:Crystal Project video camera.png|50px]]
| help = no
| filename = Barack Obama inaugural address.ogv
| alt = A black man in a black coat gestures and talks at a lecturn surrounded by teleprompters. Behind him, in the background, are about a dozen warmly-dressed onlookers.
| title = Inaugural address of Barack Obama
| description = Barack Obama's [[First inauguration of Barack Obama|first inaugural address]], January 20, 2009<br />(Duration: 21 minutes, 21 seconds)
}}
</syntaxhighlight>
{{Clear}}
===With header===
{{Listen
| header = Recordings of this phrase:
| type = speech
| filename = Frase de Neil Armstrong.ogg
| title = "One small step for a man..."
| description = First words spoken on the [[Moon]]
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| header = Recordings of this phrase:
| type = speech
| filename = Frase de Neil Armstrong.ogg
| title = "One small step for a man..."
| description = First words spoken on the [[Moon]].
}}
</syntaxhighlight>
{{Clear}}
===Embedding===
{{see also|Template:Listen voice}}
{{Infobox person
| name = Dr. Accordion
| occupation = Accordion player
| module =
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| embed = yes
}}
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox person
| name = Dr. Accordion
| occupation = Accordion player
| module =
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| embed = yes
}}
}}
</syntaxhighlight>
{{Clear}}
===Plain===
{|
|<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| plain = yes
| style = float:left
}}
</syntaxhighlight>
|{{Listen
| filename = Accordion chords-01.ogg
| title = Accordion chords
| plain = yes
| style = float:left
}}
|}
{{Clear}}
===Multiple files===
{{Listen
| type = music
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
| filename2 = Moonlight.ogg
| title2 = ''Moonlight Sonata''
| description2 = [[Ludwig van Beethoven|Beethoven]]'s [[Piano Sonata No. 14 (Beethoven)|Sonata in C-sharp minor]]
| filename3 = Brahms-waltz15.ogg
| title3 = Waltz No. 15
| description3 = From [[Sixteen Waltzes, Op. 39 (Brahms)|Sixteen Waltzes, Op. 39]] by [[Johannes Brahms|Brahms]]
}}
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Listen
| type = music
| filename = Accordion chords-01.ogg
| title = Accordion chords
| description = Chords being played on an accordion
| filename2 = Moonlight.ogg
| title2 = ''Moonlight Sonata''
| description2 = [[Ludwig van Beethoven|Beethoven]]'s [[Piano Sonata No. 14 (Beethoven)|Sonata in C-sharp minor]]
| filename3 = Brahms-waltz15.ogg
| title3 = Waltz No. 15
| description3 = From [[Sixteen Waltzes, Op. 39 (Brahms)|Sixteen Waltzes, Op. 39]] by [[Johannes Brahms|Brahms]]
}}
</syntaxhighlight>
{{Clear}}
==Microformat==
{{UF-audio}}
==Tracking categories==
* {{clc|Articles with hAudio microformats}}
* {{clc|Articles with empty listen template}}
* {{clc|Listen template using plain parameter}}
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "Allows audio and video files to be embedded in articles.",
"format": "{{_\n| ____________ = _\n}}\n",
"params": {
"header": {
"label": "Header",
"description": "Text or other content to go above all the files in the template (but within the template boundary). Allows markup.",
"type": "content"
},
"type": {
"label": "Music or speech icon",
"description": "Enter \"music\" or \"speech\" here to change the template icon to a speaker with music notes or a microphone.",
"type": "line",
"example": "music",
"default": "sound",
"suggestedvalues": [
"sound",
"music",
"speech"
]
},
"image": {
"label": "Custom icon",
"description": "Custom image to replace the speaker icon in the template. Alternatively, enter \"none\" here to hide the icon entirely.",
"type": "wiki-file-name",
"example": "[[File:Example.jpg|50px]], none"
},
"filename": {
"label": "Filename",
"description": "The filename of the file. Filename2, filename3, etc. can be used for subsequent files.",
"type": "wiki-file-name",
"required": true
},
"title": {
"label": "Title",
"description": "The title to display for the file. Title2, title3, etc. can be used for subsequent files.",
"type": "string",
"required": true
},
"description": {
"label": "Description",
"description": "A description of the file. Description2, description3, etc. can be used for subsequent files.",
"type": "string",
"suggested": true
},
"start": {
"label": "Start time",
"description": "Timestamp at which the first file should start playing (start2, start3, etc. can be used for subsequent files)",
"type": "line",
"example": "0:20"
},
"length": {
"label": "Hide duration?",
"description": "Enter \"hide\" here to hide the duration of the first file (length2, length3, etc. can be used for subsequent files).",
"type": "line",
"example": "hide"
},
"play": {
"label": "Hide player?",
"description": "Enter \"no\" here to hide the file player for the first file (play2, play3, etc. can be used for subsequent files). To be used for some media files that cannot be displayed inline, to prevent a broken inline link from showing.",
"type": "line",
"example": "no"
},
"help": {
"label": "Hide help text?",
"description": "Enter \"no\" here to hide the \"Problems playing this file? See media help.\" text at the bottom of the template. Must not be done on the first instance of the template; optional on subsequent instances of the template.",
"type": "line",
"example": "no"
},
"pos": {
"label": "Position",
"description": "Enter \"left\" or \"center\" here to change the default position of the template from on the right.",
"type": "line",
"example": "left",
"default": "right",
"suggestedvalues": [
"left",
"center",
"right"
]
},
"plain": {
"label": "Plain style?",
"description": "Enter \"yes\" here to remove most of the ornamentation (border, background, icon and help text) and the float/positioning of the template to give a minimalist version, allowing the user to use the custom CSS (\"style\") parameter to style and position the template.",
"type": "line",
"example": "yes"
},
"embed": {
"label": "Optimise for embedding?",
"description": "Enter any text here to remove the left, right and bottom border, the background, the icon, the help text and the padding of the template for use in an infobox.",
"type": "line",
"example": "y"
},
"style": {
"label": "Custom CSS",
"description": "Custom CSS for the template",
"type": "content",
"example": "float:none; clear:none"
}
},
"paramOrder": [
"header",
"type",
"image",
"filename",
"title",
"description",
"start",
"length",
"play",
"help",
"pos",
"plain",
"embed",
"style"
]
}
</templatedata>
==See also==
{{Audio templates}}
{{Film- and television-related infobox templates}}
<includeonly>{{Sandbox other||
[[Category:Audio templates]]
[[Category:Embeddable templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
px067nh6v1aqxwnp0gknw461b7xtsd5
Module:Listen/styles.css
828
2697
33472
2025-05-13T14:44:59Z
en>Pppery
0
Undid revision [[Special:Diff/1289142946|1289142946]] by [[Special:Contributions/Andrybak|Andrybak]] ([[User talk:Andrybak|talk]]) [[WP:BRD]], see [[Template talk:Listen#Edit request 12 May 2025]]
33472
sanitized-css
text/css
/* {{pp|small=y}} */
.listen .side-box-text {
line-height: 1.1em;
}
.listen-plain {
border: none;
background: transparent;
}
.listen-embedded {
width: 100%;
margin: 0;
border-width: 1px 0 0 0;
background: transparent;
}
.listen-header {
padding: 2px;
}
.listen-embedded .listen-header {
padding: 2px 0;
}
.listen-file-header {
padding: 4px 0;
}
.listen .description {
padding-top: 2px;
}
.listen .mw-tmh-player {
max-width: 100%;
}
/* have to deal with Vector suboptimal */
@media (max-width: 719px) {
.listen {
clear: both;
}
}
@media (min-width: 720px) {
.listen:not(.listen-noimage) {
width: 320px;
}
/* left/right (core template takes care of right)/center mutually exclusive */
.listen-left {
/* TODO: Understand why this overflow is here. */
overflow: visible;
float: left;
}
.listen-center {
float: none;
margin-left: auto;
margin-right: auto;
}
}
8wj5f95mzuq4d8vsnr0wimpjcllnyau
33473
33472
2026-11-11T21:59:13Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Listen/styles.css]]
33472
sanitized-css
text/css
/* {{pp|small=y}} */
.listen .side-box-text {
line-height: 1.1em;
}
.listen-plain {
border: none;
background: transparent;
}
.listen-embedded {
width: 100%;
margin: 0;
border-width: 1px 0 0 0;
background: transparent;
}
.listen-header {
padding: 2px;
}
.listen-embedded .listen-header {
padding: 2px 0;
}
.listen-file-header {
padding: 4px 0;
}
.listen .description {
padding-top: 2px;
}
.listen .mw-tmh-player {
max-width: 100%;
}
/* have to deal with Vector suboptimal */
@media (max-width: 719px) {
.listen {
clear: both;
}
}
@media (min-width: 720px) {
.listen:not(.listen-noimage) {
width: 320px;
}
/* left/right (core template takes care of right)/center mutually exclusive */
.listen-left {
/* TODO: Understand why this overflow is here. */
overflow: visible;
float: left;
}
.listen-center {
float: none;
margin-left: auto;
margin-right: auto;
}
}
8wj5f95mzuq4d8vsnr0wimpjcllnyau
Tempilet:Listen voice
10
2698
33474
2026-04-11T21:03:24Z
en>Zzuuzz
0
Protected "[[Template:Listen voice]]": [[Wikipedia:High-risk templates|High risk template]] ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
33474
wikitext
text/x-wiki
<includeonly>{{Listen
|embed=yes
|filename={{{filename}}}
|title={{{title|{{{name|{{PAGENAMEBASE}}}}}'s voice}}}
|type=speech
|description={{Br separated entries
|1={{{description|}}}
|2={{#if:{{{recorded|}}}{{{published|}}}<!--
-->|{{#if:{{{recorded|}}}<!--
-->|Recorded {{{recorded}}}<!--
-->|{{#if:{{{published|}}}<!--
-->|Published {{{published}}}<!--
-->}}<!--
-->}}<!--
-->|[[:File:{{{filename}}}|{{{filename}}}]]<!--
-->}}
}}
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
deh9y6ddko815opqrpefybhuxs1nk9m
33475
33474
2026-11-11T22:00:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Listen_voice]]
33474
wikitext
text/x-wiki
<includeonly>{{Listen
|embed=yes
|filename={{{filename}}}
|title={{{title|{{{name|{{PAGENAMEBASE}}}}}'s voice}}}
|type=speech
|description={{Br separated entries
|1={{{description|}}}
|2={{#if:{{{recorded|}}}{{{published|}}}<!--
-->|{{#if:{{{recorded|}}}<!--
-->|Recorded {{{recorded}}}<!--
-->|{{#if:{{{published|}}}<!--
-->|Published {{{published}}}<!--
-->}}<!--
-->}}<!--
-->|[[:File:{{{filename}}}|{{{filename}}}]]<!--
-->}}
}}
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
deh9y6ddko815opqrpefybhuxs1nk9m
Tempilet:Listen voice/doc
10
2699
33478
2026-10-20T12:19:51Z
en>Andrybak
0
/* Example */ fix linter warning
33478
wikitext
text/x-wiki
{{Documentation subpage}}
This template is intended to be used as a module in template {{tl|Infobox person}}. This is a wrapper around template {{tl|Listen}}.
== Usage ==
Mandatory parameters only:
<syntaxhighlight lang="wikitext">
{{Infobox person
|module={{Listen voice
|filename=
|recorded=
}}
}}
</syntaxhighlight>
or
<syntaxhighlight lang="wikitext">
{{Infobox person
|module={{Listen voice
|filename=
|published=
}}
}}
</syntaxhighlight>
==Parameters==
;{{para|filename}}
:File with the recording of the person's voice, without the <code>File:</code> prefix. Required.
;{{para|recorded}} or {{para|published}}
:Date of the recording (preferred) or date of the publishing (if date of the recording isn't available). Technically optional, but highly recommended. The date is used to construct the text below the audio player "Recorded/Published <var>date</var>". The text can be expanded using parameter {{para|description}}. Otherwise the description is hidden.
===Optional parameters===
;{{para|description}}
:Provide additional description of what the person is talking about. Optional.
;{{para|title}}
:Override the whole title of the {{tl|Listen}} box (text above audio player), which defaults to "Jane Doe's voice". Optional.
;{{para|name}}
:Override person's name in the default title, which defaults to {{tl|PAGENAMEBASE}}. Optional.
==Example==
{| class="wikitable"
|-
! Wikitext !! Result
|-
|
<syntaxhighlight lang="wikitext">
{{Infobox person
|name=Example
|image=Example.png
|module={{Listen voice
|name=Example McExampleface
|filename=Example.ogg
|description=McExampleface providing a voice sample
|recorded=August 2005
}}
}}
</syntaxhighlight>
|
{{Infobox person
|name=Example
|image=Example.png
|module={{Listen voice
|name=Example McExampleface
|filename=Example.ogg
|description=McExampleface providing a voice sample
|recorded=August 2005
}}
}}
|}
<includeonly>{{Sandbox other||
<!-- Categories below this line -->
[[Category:Audio templates|Voice]]
[[Category:Wrapper templates]]
[[Category:Templates generating hAudio microformats]]
}}</includeonly>
m78447mw7uj78chgqqb64mbqtjcn8xb
33479
33478
2026-11-11T22:00:06Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Listen_voice/doc]]
33478
wikitext
text/x-wiki
{{Documentation subpage}}
This template is intended to be used as a module in template {{tl|Infobox person}}. This is a wrapper around template {{tl|Listen}}.
== Usage ==
Mandatory parameters only:
<syntaxhighlight lang="wikitext">
{{Infobox person
|module={{Listen voice
|filename=
|recorded=
}}
}}
</syntaxhighlight>
or
<syntaxhighlight lang="wikitext">
{{Infobox person
|module={{Listen voice
|filename=
|published=
}}
}}
</syntaxhighlight>
==Parameters==
;{{para|filename}}
:File with the recording of the person's voice, without the <code>File:</code> prefix. Required.
;{{para|recorded}} or {{para|published}}
:Date of the recording (preferred) or date of the publishing (if date of the recording isn't available). Technically optional, but highly recommended. The date is used to construct the text below the audio player "Recorded/Published <var>date</var>". The text can be expanded using parameter {{para|description}}. Otherwise the description is hidden.
===Optional parameters===
;{{para|description}}
:Provide additional description of what the person is talking about. Optional.
;{{para|title}}
:Override the whole title of the {{tl|Listen}} box (text above audio player), which defaults to "Jane Doe's voice". Optional.
;{{para|name}}
:Override person's name in the default title, which defaults to {{tl|PAGENAMEBASE}}. Optional.
==Example==
{| class="wikitable"
|-
! Wikitext !! Result
|-
|
<syntaxhighlight lang="wikitext">
{{Infobox person
|name=Example
|image=Example.png
|module={{Listen voice
|name=Example McExampleface
|filename=Example.ogg
|description=McExampleface providing a voice sample
|recorded=August 2005
}}
}}
</syntaxhighlight>
|
{{Infobox person
|name=Example
|image=Example.png
|module={{Listen voice
|name=Example McExampleface
|filename=Example.ogg
|description=McExampleface providing a voice sample
|recorded=August 2005
}}
}}
|}
<includeonly>{{Sandbox other||
<!-- Categories below this line -->
[[Category:Audio templates|Voice]]
[[Category:Wrapper templates]]
[[Category:Templates generating hAudio microformats]]
}}</includeonly>
m78447mw7uj78chgqqb64mbqtjcn8xb
Tempilet mossa:Listen voice
11
2700
33480
2024-06-01T22:13:01Z
en>Neveselbert
0
/* Submodule for Template:Infobox person */ Reply
33480
wikitext
text/x-wiki
== Submodule for [[Template:Infobox person]] ==
For articles of some people, a snippet of their voice is added to the infobox (for examples, see [[commons:Category:Voice samples in English]]). This is done using template {{tl|Listen}}. I've implemented a wrapper around it to simplify addition to the infobox and to unify styling: template {{tl|Listen voice}}. Examples of how it is used:
{| class="wikitable"
|+ Examples of usage of [[Template:{{PAGENAME}}]]
|-
! Diff !! Article !! Notes
|-
| [[Special:Diff/1224590335/1226617170]] || [[Stephen Fry]] || Simplest usage, with {{para|recorded}}
|-
| [[Special:Diff/1220907103/1226617359]] || [[Daniel Stenberg]] || Simplest usage, with {{para|published}}
|-
| [[Special:Diff/1226468150/1226617420]] || [[Katie Mack (astrophysicist)]] || with {{para|title}} overriding the text above the audio player
|-
| [[Special:Diff/1226619683]] || [[Emily Temple-Wood]] || with {{para|name}} to preserve wording used in {{tl|Listen}} before, which used only the surname
|-
| [[Special:Diff/1226618835]] || [[Ban Ki-moon]] || with {{para|description}} overriding the text below the audio player
|}
—[[User:Andrybak|andrybak]] ([[User talk:Andrybak|talk]]) 20:30, 31 May 2024 (UTC)
:This looks really good, {{u|andrybak}}. Would you be alright with [[Special:Diff/1226628213/1226785823|this slight adjustment]]? This way, {{para|recorded}} and {{para|published}} can be filled in addition to {{para|description}}. ‑‑[[User:Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]] <b>·</b> [[Special:Contribs/Neveselbert|contribs]] <b>·</b> [[Special:EmailUser/Neveselbert|email]]) 20:18, 1 June 2024 (UTC)
::[[User:Neveselbert|Neveselbert]], that would be great. There aren't yet a lot of transclusions of this template, so improvements like this should be easy to implement. For this change, I don't anticipate any breakage, but for some pages, splitting {{para|description}} into {{para|description}} and {{para|recorded}} would be useful. For example, [[Ban Ki-moon]], [[Margaret Thatcher]], [[John F. Kennedy]]. —[[User:Andrybak|andrybak]] ([[User talk:Andrybak|talk]]) 20:35, 1 June 2024 (UTC)
:::How would you like to reword the documentation? ‑‑[[User:Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]] <b>·</b> [[Special:Contribs/Neveselbert|contribs]] <b>·</b> [[Special:EmailUser/Neveselbert|email]]) 20:55, 1 June 2024 (UTC)
::::I'll update it after the new code gets a couple of uses on the pages. —[[User:Andrybak|andrybak]] ([[User talk:Andrybak|talk]]) 21:10, 1 June 2024 (UTC)
:::::{{done}} for [[Special:Diff/1226798756|Margaret Thatcher]] and [[Special:Diff/1226799038|Elizabeth II]]. ‑‑[[User:Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]] <b>·</b> [[Special:Contribs/Neveselbert|contribs]] <b>·</b> [[Special:EmailUser/Neveselbert|email]]) 22:13, 1 June 2024 (UTC)
g1h7eilcp07l4enm6k26gd40ek78cqs
33481
33480
2026-11-11T22:00:06Z
RAPTOR7762
18
1 revision imported from [[:en:Template_talk:Listen_voice]]
33480
wikitext
text/x-wiki
== Submodule for [[Template:Infobox person]] ==
For articles of some people, a snippet of their voice is added to the infobox (for examples, see [[commons:Category:Voice samples in English]]). This is done using template {{tl|Listen}}. I've implemented a wrapper around it to simplify addition to the infobox and to unify styling: template {{tl|Listen voice}}. Examples of how it is used:
{| class="wikitable"
|+ Examples of usage of [[Template:{{PAGENAME}}]]
|-
! Diff !! Article !! Notes
|-
| [[Special:Diff/1224590335/1226617170]] || [[Stephen Fry]] || Simplest usage, with {{para|recorded}}
|-
| [[Special:Diff/1220907103/1226617359]] || [[Daniel Stenberg]] || Simplest usage, with {{para|published}}
|-
| [[Special:Diff/1226468150/1226617420]] || [[Katie Mack (astrophysicist)]] || with {{para|title}} overriding the text above the audio player
|-
| [[Special:Diff/1226619683]] || [[Emily Temple-Wood]] || with {{para|name}} to preserve wording used in {{tl|Listen}} before, which used only the surname
|-
| [[Special:Diff/1226618835]] || [[Ban Ki-moon]] || with {{para|description}} overriding the text below the audio player
|}
—[[User:Andrybak|andrybak]] ([[User talk:Andrybak|talk]]) 20:30, 31 May 2024 (UTC)
:This looks really good, {{u|andrybak}}. Would you be alright with [[Special:Diff/1226628213/1226785823|this slight adjustment]]? This way, {{para|recorded}} and {{para|published}} can be filled in addition to {{para|description}}. ‑‑[[User:Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]] <b>·</b> [[Special:Contribs/Neveselbert|contribs]] <b>·</b> [[Special:EmailUser/Neveselbert|email]]) 20:18, 1 June 2024 (UTC)
::[[User:Neveselbert|Neveselbert]], that would be great. There aren't yet a lot of transclusions of this template, so improvements like this should be easy to implement. For this change, I don't anticipate any breakage, but for some pages, splitting {{para|description}} into {{para|description}} and {{para|recorded}} would be useful. For example, [[Ban Ki-moon]], [[Margaret Thatcher]], [[John F. Kennedy]]. —[[User:Andrybak|andrybak]] ([[User talk:Andrybak|talk]]) 20:35, 1 June 2024 (UTC)
:::How would you like to reword the documentation? ‑‑[[User:Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]] <b>·</b> [[Special:Contribs/Neveselbert|contribs]] <b>·</b> [[Special:EmailUser/Neveselbert|email]]) 20:55, 1 June 2024 (UTC)
::::I'll update it after the new code gets a couple of uses on the pages. —[[User:Andrybak|andrybak]] ([[User talk:Andrybak|talk]]) 21:10, 1 June 2024 (UTC)
:::::{{done}} for [[Special:Diff/1226798756|Margaret Thatcher]] and [[Special:Diff/1226799038|Elizabeth II]]. ‑‑[[User:Neveselbert|Neveselbert]] ([[User talk:Neveselbert|talk]] <b>·</b> [[Special:Contribs/Neveselbert|contribs]] <b>·</b> [[Special:EmailUser/Neveselbert|email]]) 22:13, 1 June 2024 (UTC)
g1h7eilcp07l4enm6k26gd40ek78cqs
Tempilet:Death date
10
2701
33483
2020-04-23T09:50:14Z
en>Uzume
0
update tracking to use [[Module:Wd]] instead of the unmaintained and deprecated [[Module:Wikidata]]
33483
wikitext
text/x-wiki
<includeonly><span style="display:none">(<span class="dday deathdate">{{{1}}}-{{padleft:{{MONTHNUMBER|{{{2}}}}}|2|0}}-{{padleft:{{{3}}}|2|0}}</span>)</span>{{#if:{{{df|}}}|{{#expr:{{{3}}}}} {{MONTHNAME|{{{2}}}}}|{{MONTHNAME|{{{2}}}}} {{#expr:{{{3}}}}},}} {{#expr:{{{1}}}}}<!--
-- Error checks --
-->{{#ifexpr: ( {{{1|}}} > {{CURRENTYEAR}} )
|  {{error|invalid year}}{{main other|[[Category:Pages using age template with invalid date]]}}
}}{{#if:{{{2|}}}|{{#ifexpr: ( {{{2|}}} > 12 ) OR ( {{{2|}}} < 1 )
|  {{error|invalid month}}{{main other|[[Category:Pages using age template with invalid date]]}}|}}
}}{{#if:{{{3|}}}|{{#ifexpr: ( {{{3|}}} > 31 ) OR ( {{{3|}}} < 1 )
|  {{error|invalid day}}{{main other|[[Category:Pages using age template with invalid date]]}}|}}
}}{{#ifeq: {{NAMESPACENUMBER}} | 0
| {{#if: {{#invoke:wd|label|raw}}
| {{#if: {{#invoke:String|match|{{#invoke:wd|properties|raw|P31}},|Q5,|1|1|true|}}
| {{#if: {{#invoke:wd|properties|raw|P570}}
|
| [[Category:Date of death not in Wikidata]]
}}
}}
| [[Category:Articles without Wikidata item]]
}}
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
aqf5ek360nnrfql0360tv8d8gmtmedz
33484
33483
2026-11-11T22:07:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Death_date]]
33483
wikitext
text/x-wiki
<includeonly><span style="display:none">(<span class="dday deathdate">{{{1}}}-{{padleft:{{MONTHNUMBER|{{{2}}}}}|2|0}}-{{padleft:{{{3}}}|2|0}}</span>)</span>{{#if:{{{df|}}}|{{#expr:{{{3}}}}} {{MONTHNAME|{{{2}}}}}|{{MONTHNAME|{{{2}}}}} {{#expr:{{{3}}}}},}} {{#expr:{{{1}}}}}<!--
-- Error checks --
-->{{#ifexpr: ( {{{1|}}} > {{CURRENTYEAR}} )
|  {{error|invalid year}}{{main other|[[Category:Pages using age template with invalid date]]}}
}}{{#if:{{{2|}}}|{{#ifexpr: ( {{{2|}}} > 12 ) OR ( {{{2|}}} < 1 )
|  {{error|invalid month}}{{main other|[[Category:Pages using age template with invalid date]]}}|}}
}}{{#if:{{{3|}}}|{{#ifexpr: ( {{{3|}}} > 31 ) OR ( {{{3|}}} < 1 )
|  {{error|invalid day}}{{main other|[[Category:Pages using age template with invalid date]]}}|}}
}}{{#ifeq: {{NAMESPACENUMBER}} | 0
| {{#if: {{#invoke:wd|label|raw}}
| {{#if: {{#invoke:String|match|{{#invoke:wd|properties|raw|P31}},|Q5,|1|1|true|}}
| {{#if: {{#invoke:wd|properties|raw|P570}}
|
| [[Category:Date of death not in Wikidata]]
}}
}}
| [[Category:Articles without Wikidata item]]
}}
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
aqf5ek360nnrfql0360tv8d8gmtmedz
Tempilet:Navbox with collapsible groups
10
2702
33485
2025-01-24T14:38:01Z
en>Ahecht
0
Consolidate to [[Module:Navbox]]
33485
wikitext
text/x-wiki
{{#invoke:Navbox|with collapsible groups}}<noinclude>
{{documentation}}
</noinclude>
0et0dat8y10f19rcple250dan4w781r
33486
33485
2026-11-11T22:07:47Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Navbox_with_collapsible_groups]]
33485
wikitext
text/x-wiki
{{#invoke:Navbox|with collapsible groups}}<noinclude>
{{documentation}}
</noinclude>
0et0dat8y10f19rcple250dan4w781r
Tempilet:\
10
2703
33487
2015-12-13T11:55:37Z
en>Graeme Bartlett
0
Changed protection level of Template:\: [[WP:High-risk templates|Highly visible template]] ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only administrators] (indefinite))
33487
wikitext
text/x-wiki
/ <noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
gfvlsjgnfxn02vdp58sww0lo44n62ht
33488
33487
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:\]]
33487
wikitext
text/x-wiki
/ <noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
gfvlsjgnfxn02vdp58sww0lo44n62ht
Tempilet:MONTHNUMBER
10
2704
33489
2024-02-06T21:07:17Z
en>Dinoguy1000
0
make subst:able
33489
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#if:{{{1|}}}
|{{safesubst:<noinclude/>#switch:{{safesubst:<noinclude/>lc:{{{1}}}}}
|january|jan=1
|february|feb=2
|march|mar=3
|apr|april=4
|may=5
|june|jun=6
|july|jul=7
|august|aug=8
|september|sep|sept=9
|october|oct=10
|november|nov=11
|december|dec=12
|{{safesubst:<noinclude/>#ifexpr:{{{1}}}<0
|{{safesubst:<noinclude/>#ifexpr:(({{{1}}})round 0)!=({{{1}}})
|{{safesubst:<noinclude/>#expr:12-(((0.5-({{{1}}}))round 0)mod 12)}}
|{{safesubst:<noinclude/>#expr:12-(((11.5-({{{1}}}))round 0)mod 12)}}
}}
|{{safesubst:<noinclude/>#expr:(((10.5+{{{1}}})round 0)mod 12)+1}}
}}
}}
|Missing required parameter 1=''month''!
}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
k1zoi9cw55ms0orrvxfbpmvcdz7h10y
33490
33489
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:MONTHNUMBER]]
33489
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#if:{{{1|}}}
|{{safesubst:<noinclude/>#switch:{{safesubst:<noinclude/>lc:{{{1}}}}}
|january|jan=1
|february|feb=2
|march|mar=3
|apr|april=4
|may=5
|june|jun=6
|july|jul=7
|august|aug=8
|september|sep|sept=9
|october|oct=10
|november|nov=11
|december|dec=12
|{{safesubst:<noinclude/>#ifexpr:{{{1}}}<0
|{{safesubst:<noinclude/>#ifexpr:(({{{1}}})round 0)!=({{{1}}})
|{{safesubst:<noinclude/>#expr:12-(((0.5-({{{1}}}))round 0)mod 12)}}
|{{safesubst:<noinclude/>#expr:12-(((11.5-({{{1}}}))round 0)mod 12)}}
}}
|{{safesubst:<noinclude/>#expr:(((10.5+{{{1}}})round 0)mod 12)+1}}
}}
}}
|Missing required parameter 1=''month''!
}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
k1zoi9cw55ms0orrvxfbpmvcdz7h10y
Tempilet:MONTHNAME
10
2705
33491
2020-06-10T21:21:03Z
en>Primefac
0
Reverted edits by [[Special:Contribs/Primefac|Primefac]] ([[User talk:Primefac|talk]]) to last version by Jo-Jo Eumerus
33491
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}|{{#switch:{{MONTHNUMBER|{{{1}}}}}|1=January|2=February|3=March|4=April|5=May|6=June|7=July|8=August|9=September|10=October|11=November|12=December|Incorrect required parameter 1=''month''!}}|Missing required parameter 1=''month''!}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4cf5sge5nt8b4gwjre9u8yifa3kstt2
33492
33491
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:MONTHNAME]]
33491
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}|{{#switch:{{MONTHNUMBER|{{{1}}}}}|1=January|2=February|3=March|4=April|5=May|6=June|7=July|8=August|9=September|10=October|11=November|12=December|Incorrect required parameter 1=''month''!}}|Missing required parameter 1=''month''!}}</includeonly><noinclude>
{{Documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
4cf5sge5nt8b4gwjre9u8yifa3kstt2
Tempilet:Resize
10
2706
33493
2024-09-28T13:55:16Z
en>Rjjiii
0
from sandbox; merging with [[Template:Midsize]]
33493
wikitext
text/x-wiki
{{safesubst<noinclude />:#if:{{{2|}}}
|<{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}} style="font-size:{{{1|}}};">{{{2|}}}</{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}}>
|<{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}} style="font-size:{{{size|90}}}%;">{{{1}}}</{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}}>
}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! -->
</noinclude>
jbt5r04v9bllgb6hs0brjngki3od8xo
33494
33493
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Resize]]
33493
wikitext
text/x-wiki
{{safesubst<noinclude />:#if:{{{2|}}}
|<{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}} style="font-size:{{{1|}}};">{{{2|}}}</{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}}>
|<{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}} style="font-size:{{{size|90}}}%;">{{{1}}}</{{safesubst<noinclude />:#ifeq:{{{div|}}}|yes|div|span}}>
}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! -->
</noinclude>
jbt5r04v9bllgb6hs0brjngki3od8xo
Tempilet:Tracks Wikidata
10
2707
33495
2023-10-06T19:37:14Z
en>SWinxy
0
{{Section link}}
33495
wikitext
text/x-wiki
{{Sister project
| image = [[File:Wikidata-logo-with-magnifying-glass-icon.svg|40px|link=Wikipedia:Wikidata]]
| position = {{{position|}}}
| text = This {{template other
| template
| {{module other
| module
| {{category other
| category
| page <!-- not template, module, or category -->
}}
}}
}} [[:Category:{{{cat|Wikidata tracking categories}}}|tracks]] {{#if:{{{section|}}}
| one or more [[Wikidata]] properties; see {{Section link||{{{section}}}}} for details.
| the [[Wikidata]] propert{{#if:{{{2|}}}|ies:|y:}} {{#invoke:Uses Wikidata|usesProperty}}
}}
}}<includeonly>{{#switch:{{SUBPAGENAME}}
|sandbox |testcases |doc= <!--no category-->
|#default = {{template other
| [[Category:Templates tracking Wikidata]]
| {{module other
| [[Category:Modules tracking Wikidata]]
| {{category other
| <!-- if used in a category, don't automatically add parent category -->
| <!-- not template, module, or category -->
}}
}}
}}
}}</includeonly><noinclude>
{{Documentation}}<!-- Add categories and interwikis to the /doc sub-page -->
</noinclude>
7tc9ffs0uh5p7zhqdmtv1esq6o76x8s
33496
33495
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tracks_Wikidata]]
33495
wikitext
text/x-wiki
{{Sister project
| image = [[File:Wikidata-logo-with-magnifying-glass-icon.svg|40px|link=Wikipedia:Wikidata]]
| position = {{{position|}}}
| text = This {{template other
| template
| {{module other
| module
| {{category other
| category
| page <!-- not template, module, or category -->
}}
}}
}} [[:Category:{{{cat|Wikidata tracking categories}}}|tracks]] {{#if:{{{section|}}}
| one or more [[Wikidata]] properties; see {{Section link||{{{section}}}}} for details.
| the [[Wikidata]] propert{{#if:{{{2|}}}|ies:|y:}} {{#invoke:Uses Wikidata|usesProperty}}
}}
}}<includeonly>{{#switch:{{SUBPAGENAME}}
|sandbox |testcases |doc= <!--no category-->
|#default = {{template other
| [[Category:Templates tracking Wikidata]]
| {{module other
| [[Category:Modules tracking Wikidata]]
| {{category other
| <!-- if used in a category, don't automatically add parent category -->
| <!-- not template, module, or category -->
}}
}}
}}
}}</includeonly><noinclude>
{{Documentation}}<!-- Add categories and interwikis to the /doc sub-page -->
</noinclude>
7tc9ffs0uh5p7zhqdmtv1esq6o76x8s
Tempilet:Birth, death and age templates
10
2708
33499
2026-09-22T23:43:05Z
en>Scyrme
0
more accurate description
33499
wikitext
text/x-wiki
{{Navbox with collapsible groups
|name =Birth, death and age templates
|state={{if empty|{{{state|}}}|<includeonly>collapsed</includeonly>|<noinclude>uncollapsed</noinclude>}}
|title=Birth, death and age templates
|selected={{if empty|{{{selected|}}}|{{{expanded|}}}|{{{1|}}}}}
|listclass=hlist <!-- can't see why tracking=no doesn't work, but this does -->
|abbr1=BDA
|section1=birth, death, age
|state1 = <noinclude>uncollapsed</noinclude>
|content1=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Birth templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Birth date}}|To display a birth date and related hidden metadata.
|{{Template link|Birth date text}}|
|{{Template link|Birth date and age}}|{{Template link with link off|Birth date}} with suffix '(age ''N'')'.
|{{Template link|Birth date and age2}}|{{Template link with link off|Birth date and age}} plus age as of a specified date.
|{{Template link|Birth date and age text}}|As {{Template link with link off|Birth date and age}}, but accepts dates in text form ('15 June 1950', 'June 15, 1950', 'June 1950', etc.).
|{{Template link|Birth date and age in years and days}}|{{Template link with link off|Birth date and age}}, but with the age displayed in years and days rather than just years.
|{{Template link|Birth year and age}}|Year of birth and approximate age.
|{{Template link|Birth based on age as of date}}|To display approximate birth year and current age given a particular date (e.g. when a dated reference mentions the age of a person), only works for living people.
|{{Template link|Birth based on age as of dates}}|To display approximate birth year and current age given several particular dates (e.g. when a dated reference mentions the age of a person), only works for living people.
|{{Template link|Birth based on age at death}}|To display approximate birth year based on age at death, or on age at a specific date if death date isn't known.
}}
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Death templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Death date}}|To display a death date and related hidden metadata.
|{{Template link|Death date text}}|
|{{Template link|Death date and age}}|{{Template link with link off|Death date}} with suffix '(aged ''N'')'; also called with {{Template link with link off|event date and age}}.
|{{Template link|Death date and given age}}|To display a death date and specified age.
|{{Template link|Death year and age}}|To display a year of, and approximate age at death.
}}
|abbr2=Age
|section2=age only
|state2 = <noinclude>uncollapsed</noinclude>
|content2=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Conventional age templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Age in years, months, weeks and days}}|Number of complete years, months, weeks and days between two dates.
|{{Template link|Age in years, months and days}}|Number of complete years, months and days between two dates.
|{{Template link|Age in years and months}}|Number of complete years and remaining months between two dates.
|{{Template link|Age in years and days}}|Number of complete years and remaining days between two dates.
|{{Template link|Age in years and days nts}}|{{Template link with link off|Age in years and days}} with output formatted for use in [[Help:Sortable tables|number sortable tables]].
|{{Template link|Age in decimal years}}|Number of years between two dates, rounded to the specified number of decimal places.
|{{Template link|Age in years}}|Number of years between two dates.
|{{Template link|Age in years nts}}|{{Template link with link off|Age in years}} with output formatted for use in number sortable tables.
|{{Template link|Age in months}}|Number of months between two dates.
|{{Template link|Age in weeks and days}}|Number of weeks and days between two dates.
|{{Template link|Age in weeks}}|Number of weeks between two dates.
|{{Template link|Age in days}}|Age in days between two dates.
|{{Template link|Age in days nts}}|{{Template link with link off|Age in days}} with output formatted for use in number sortable tables.
}}
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Reverse-determined age template |{{Resize|110%|Description{{\}}use }}
|{{Template link|Age}}|Age based on number of complete years between two dates.
|{{Template link|Age nts}}|{{Template link with link off|Age}} with output formatted for use in [[Help:Sortable tables|number sortable tables]].
|{{Template link|Age as of date}}|Current age (in years) from a known age at a specified date.
|{{Template link|Age for infant}}|Current age for infant: months and days up to one year, years and months up to three years, and years beyond age 3.
}}
|abbr3=Dates
|section3=start{{\}}end dates
|state3 = <noinclude>uncollapsed</noinclude>
|content3=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Date-focused templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Start date}} / {{Template link|End date}}|
|{{Template link|Start date text}} / {{Template link|End date text}}|
|{{Template link|Start date and age}} / {{Template link|End date and age}}|
}}
|abbr4=Misc
|section4=miscellaneous
|state4 = <noinclude>uncollapsed</noinclude>
|content4=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Template |{{Resize|110%|Description{{\}}use }}
|{{Template link|OldStyleDate<!--|9 June|1672|30 May-->}}|Manual [[dual dating]] in [[Julian calendar|Julian]] and [[Gregorian calendar]]s.
|{{Template link|OldStyleDateDY}}|As {{Template link with link off|OldStyleDate}} for when Julian / Gregorian dates fall in different years.
|{{Template link|OldStyleDateNY}}|As {{Template link with link off|OldStyleDate}} but no year displayed.
|{{Template link|Julian to Gregorian}}|Automatically convert [[Old Style and New Style dates|Old Style to New Style]].
|{{Template link|Gregorian to Julian}}|Automatically convert New Style to Old Style.
|{{Template link|Annunciation Style to New Style}}|Automatically convert Annunciation Style to New Style.
|{{Template link|New Style to Annunciation Style}}|Automatically convert New Style to Annunciation Style.
|{{Template link|Unidentified for}}|Prepends "Unidentified for" before {{Template link with link off|Age in years, months and days}}.
|{{Template link|Missing for}}|Prepends "Missing for" before {{Template link with link off|Age in years, months and days}}.
}}
|belowclass=hlist
|belowstyle=font-weight:bold
|below=
*[[Wikipedia:Age calculation templates|About age calculation templates]]
*[[:Category:Date mathematics templates|Date mathematics templates]]
}}<noinclude>{{Documentation}}</noinclude>
sk96jg3ly540klikhrtut99snikeq69
33500
33499
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Birth,_death_and_age_templates]]
33499
wikitext
text/x-wiki
{{Navbox with collapsible groups
|name =Birth, death and age templates
|state={{if empty|{{{state|}}}|<includeonly>collapsed</includeonly>|<noinclude>uncollapsed</noinclude>}}
|title=Birth, death and age templates
|selected={{if empty|{{{selected|}}}|{{{expanded|}}}|{{{1|}}}}}
|listclass=hlist <!-- can't see why tracking=no doesn't work, but this does -->
|abbr1=BDA
|section1=birth, death, age
|state1 = <noinclude>uncollapsed</noinclude>
|content1=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Birth templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Birth date}}|To display a birth date and related hidden metadata.
|{{Template link|Birth date text}}|
|{{Template link|Birth date and age}}|{{Template link with link off|Birth date}} with suffix '(age ''N'')'.
|{{Template link|Birth date and age2}}|{{Template link with link off|Birth date and age}} plus age as of a specified date.
|{{Template link|Birth date and age text}}|As {{Template link with link off|Birth date and age}}, but accepts dates in text form ('15 June 1950', 'June 15, 1950', 'June 1950', etc.).
|{{Template link|Birth date and age in years and days}}|{{Template link with link off|Birth date and age}}, but with the age displayed in years and days rather than just years.
|{{Template link|Birth year and age}}|Year of birth and approximate age.
|{{Template link|Birth based on age as of date}}|To display approximate birth year and current age given a particular date (e.g. when a dated reference mentions the age of a person), only works for living people.
|{{Template link|Birth based on age as of dates}}|To display approximate birth year and current age given several particular dates (e.g. when a dated reference mentions the age of a person), only works for living people.
|{{Template link|Birth based on age at death}}|To display approximate birth year based on age at death, or on age at a specific date if death date isn't known.
}}
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Death templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Death date}}|To display a death date and related hidden metadata.
|{{Template link|Death date text}}|
|{{Template link|Death date and age}}|{{Template link with link off|Death date}} with suffix '(aged ''N'')'; also called with {{Template link with link off|event date and age}}.
|{{Template link|Death date and given age}}|To display a death date and specified age.
|{{Template link|Death year and age}}|To display a year of, and approximate age at death.
}}
|abbr2=Age
|section2=age only
|state2 = <noinclude>uncollapsed</noinclude>
|content2=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Conventional age templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Age in years, months, weeks and days}}|Number of complete years, months, weeks and days between two dates.
|{{Template link|Age in years, months and days}}|Number of complete years, months and days between two dates.
|{{Template link|Age in years and months}}|Number of complete years and remaining months between two dates.
|{{Template link|Age in years and days}}|Number of complete years and remaining days between two dates.
|{{Template link|Age in years and days nts}}|{{Template link with link off|Age in years and days}} with output formatted for use in [[Help:Sortable tables|number sortable tables]].
|{{Template link|Age in decimal years}}|Number of years between two dates, rounded to the specified number of decimal places.
|{{Template link|Age in years}}|Number of years between two dates.
|{{Template link|Age in years nts}}|{{Template link with link off|Age in years}} with output formatted for use in number sortable tables.
|{{Template link|Age in months}}|Number of months between two dates.
|{{Template link|Age in weeks and days}}|Number of weeks and days between two dates.
|{{Template link|Age in weeks}}|Number of weeks between two dates.
|{{Template link|Age in days}}|Age in days between two dates.
|{{Template link|Age in days nts}}|{{Template link with link off|Age in days}} with output formatted for use in number sortable tables.
}}
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Reverse-determined age template |{{Resize|110%|Description{{\}}use }}
|{{Template link|Age}}|Age based on number of complete years between two dates.
|{{Template link|Age nts}}|{{Template link with link off|Age}} with output formatted for use in [[Help:Sortable tables|number sortable tables]].
|{{Template link|Age as of date}}|Current age (in years) from a known age at a specified date.
|{{Template link|Age for infant}}|Current age for infant: months and days up to one year, years and months up to three years, and years beyond age 3.
}}
|abbr3=Dates
|section3=start{{\}}end dates
|state3 = <noinclude>uncollapsed</noinclude>
|content3=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Date-focused templates |{{Resize|110%|Description{{\}}use }}
|{{Template link|Start date}} / {{Template link|End date}}|
|{{Template link|Start date text}} / {{Template link|End date text}}|
|{{Template link|Start date and age}} / {{Template link|End date and age}}|
}}
|abbr4=Misc
|section4=miscellaneous
|state4 = <noinclude>uncollapsed</noinclude>
|content4=
{{Aligned table|fullwidth=y
|style=line-height:1.45em; text-align:left
|col1style=font-size:110%; white-space:nowrap; padding-right:1.0em; width:18em
|row1style=line-height:1.6em; font-weight:bold; border-bottom:1px solid #aaa
|Template |{{Resize|110%|Description{{\}}use }}
|{{Template link|OldStyleDate<!--|9 June|1672|30 May-->}}|Manual [[dual dating]] in [[Julian calendar|Julian]] and [[Gregorian calendar]]s.
|{{Template link|OldStyleDateDY}}|As {{Template link with link off|OldStyleDate}} for when Julian / Gregorian dates fall in different years.
|{{Template link|OldStyleDateNY}}|As {{Template link with link off|OldStyleDate}} but no year displayed.
|{{Template link|Julian to Gregorian}}|Automatically convert [[Old Style and New Style dates|Old Style to New Style]].
|{{Template link|Gregorian to Julian}}|Automatically convert New Style to Old Style.
|{{Template link|Annunciation Style to New Style}}|Automatically convert Annunciation Style to New Style.
|{{Template link|New Style to Annunciation Style}}|Automatically convert New Style to Annunciation Style.
|{{Template link|Unidentified for}}|Prepends "Unidentified for" before {{Template link with link off|Age in years, months and days}}.
|{{Template link|Missing for}}|Prepends "Missing for" before {{Template link with link off|Age in years, months and days}}.
}}
|belowclass=hlist
|belowstyle=font-weight:bold
|below=
*[[Wikipedia:Age calculation templates|About age calculation templates]]
*[[:Category:Date mathematics templates|Date mathematics templates]]
}}<noinclude>{{Documentation}}</noinclude>
sk96jg3ly540klikhrtut99snikeq69
Tempilet:Death date/doc
10
2709
33501
2025-03-22T17:52:29Z
en>Gonnym
0
/* See also */ bypass redirect
33501
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE -->
{{High-use}}
{{Tracks Wikidata|P570}}
{{Lua|Module:String|Module:Wd}}
'''{{NAMESPACE}}:{{BASEPAGENAME}}''' will return a person's date of death.
Using this template rather than simply inserting the date into articles allows for the inclusion of hidden [[metadata]] about the date. This metadata can be used by web browsers and other software tools to extract the details, and display them using some other website or mapping tool, index or search them.
== Usage ==
: <code><nowiki>{{</nowiki>{{BASEPAGENAME}}|<var>year of death</var>|<var>month of death</var>|<var>day of death</var>|<var>additional parameters</var><nowiki>}}</nowiki></code>
=== Additional parameters ===
The '''df''' (day first) and '''mf''' (month first) parameters indicate the intended date format to display. The appropriate parameter should be set to "y" or "yes", e.g. {{para|df|y}} or {{para|df|yes}}.
The default output of this template is to display the month before the day. This default may not be appropriate for articles about people from parts of the world where the day precedes the month in a date. In such articles the parameter, "df", should be set to display the day before the month.
The parameter "mf", while not actually used by the template, will indicate that month first format is intended. Using these parameters can assist [[WP:BOT|bots]] or other automated processing to detect which date format is intended; leaving the format as default may lead an editor or bot to change the format to an unintended value.
Do not specify both "df" and "mf" parameters in the same use of the template, as these formats are mutually exclusive.
=== Range, Calendar ===
Since the data is emitted in the [[ISO 8601]] format, the calendar must be the Gregorian calendar; the first acceptable year is 1583, the last acceptable year is 9999 (which would only be a concern for fictitious characters).
== Examples ==
{{nowiki template demo|format=inline|code=<nowiki>{{</nowiki>{{BASEPAGENAME}}<nowiki>|1993|2|24}}</nowiki>}}
{{nowiki template demo|format=inline|code=<nowiki>{{</nowiki>{{BASEPAGENAME}}<nowiki>|1993|2|24|df=yes}}</nowiki>}}
{{nowiki template demo|format=inline|code=<nowiki>{{</nowiki>{{BASEPAGENAME}}<nowiki>|1993|2|24|mf=yes}}</nowiki>}}
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "This template will return a person's date of death. Using this template rather than simply inserting the date into articles allows for the inclusion of hidden metadata about the date. This metadata can be used by web browsers and other software tools to extract the details, and display them using some other website or mapping tool, index, or search them.",
"params": {
"1": {
"label": "Year of death",
"description": "The year in which the person died.",
"type": "number",
"example": "1993",
"required": true
},
"2": {
"label": "Month of death",
"description": "The month (number) in which the person died.",
"type": "number",
"example": "2",
"required": true
},
"3": {
"label": "Day of death",
"description": "The day (number) in which the person died.",
"type": "number",
"example": "24",
"required": true
},
"df": {
"label": "Day first",
"description": "When set to 'y' or 'yes', the date of death is output in a DMY format.",
"type": "string",
"example": "y",
"required": false
},
"mf": {
"label": "Month first",
"description": "When set to 'y' or 'yes', stresses that the default MDY date format is intended for the date of death.",
"type": "string",
"example": "y",
"required": false
}
}
}
</templatedata>
== Tracking categories ==
* {{clc|Pages using age template with invalid date}}
* {{clc|Date of death not in Wikidata}}
* {{clc|Articles without Wikidata item}}
== See also ==
* {{tl|Death date text}} which accepts formats like "1 April 1990" or "April 1, 1990"
* {{tl|Death date and age}} or {{tl|Death-date and age}} if date of birth is known
{{Birth, death and age templates}}
<includeonly>{{sandbox other||
[[Category:Date mathematics templates]]
[[Category:Templates generating microformat dates]]
[[Category:Templates generating hCalendars]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
b54m6utl1niu4etrwwqoq6ep7tczmoq
33502
33501
2026-11-11T22:07:48Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Death_date/doc]]
33501
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE -->
{{High-use}}
{{Tracks Wikidata|P570}}
{{Lua|Module:String|Module:Wd}}
'''{{NAMESPACE}}:{{BASEPAGENAME}}''' will return a person's date of death.
Using this template rather than simply inserting the date into articles allows for the inclusion of hidden [[metadata]] about the date. This metadata can be used by web browsers and other software tools to extract the details, and display them using some other website or mapping tool, index or search them.
== Usage ==
: <code><nowiki>{{</nowiki>{{BASEPAGENAME}}|<var>year of death</var>|<var>month of death</var>|<var>day of death</var>|<var>additional parameters</var><nowiki>}}</nowiki></code>
=== Additional parameters ===
The '''df''' (day first) and '''mf''' (month first) parameters indicate the intended date format to display. The appropriate parameter should be set to "y" or "yes", e.g. {{para|df|y}} or {{para|df|yes}}.
The default output of this template is to display the month before the day. This default may not be appropriate for articles about people from parts of the world where the day precedes the month in a date. In such articles the parameter, "df", should be set to display the day before the month.
The parameter "mf", while not actually used by the template, will indicate that month first format is intended. Using these parameters can assist [[WP:BOT|bots]] or other automated processing to detect which date format is intended; leaving the format as default may lead an editor or bot to change the format to an unintended value.
Do not specify both "df" and "mf" parameters in the same use of the template, as these formats are mutually exclusive.
=== Range, Calendar ===
Since the data is emitted in the [[ISO 8601]] format, the calendar must be the Gregorian calendar; the first acceptable year is 1583, the last acceptable year is 9999 (which would only be a concern for fictitious characters).
== Examples ==
{{nowiki template demo|format=inline|code=<nowiki>{{</nowiki>{{BASEPAGENAME}}<nowiki>|1993|2|24}}</nowiki>}}
{{nowiki template demo|format=inline|code=<nowiki>{{</nowiki>{{BASEPAGENAME}}<nowiki>|1993|2|24|df=yes}}</nowiki>}}
{{nowiki template demo|format=inline|code=<nowiki>{{</nowiki>{{BASEPAGENAME}}<nowiki>|1993|2|24|mf=yes}}</nowiki>}}
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"description": "This template will return a person's date of death. Using this template rather than simply inserting the date into articles allows for the inclusion of hidden metadata about the date. This metadata can be used by web browsers and other software tools to extract the details, and display them using some other website or mapping tool, index, or search them.",
"params": {
"1": {
"label": "Year of death",
"description": "The year in which the person died.",
"type": "number",
"example": "1993",
"required": true
},
"2": {
"label": "Month of death",
"description": "The month (number) in which the person died.",
"type": "number",
"example": "2",
"required": true
},
"3": {
"label": "Day of death",
"description": "The day (number) in which the person died.",
"type": "number",
"example": "24",
"required": true
},
"df": {
"label": "Day first",
"description": "When set to 'y' or 'yes', the date of death is output in a DMY format.",
"type": "string",
"example": "y",
"required": false
},
"mf": {
"label": "Month first",
"description": "When set to 'y' or 'yes', stresses that the default MDY date format is intended for the date of death.",
"type": "string",
"example": "y",
"required": false
}
}
}
</templatedata>
== Tracking categories ==
* {{clc|Pages using age template with invalid date}}
* {{clc|Date of death not in Wikidata}}
* {{clc|Articles without Wikidata item}}
== See also ==
* {{tl|Death date text}} which accepts formats like "1 April 1990" or "April 1, 1990"
* {{tl|Death date and age}} or {{tl|Death-date and age}} if date of birth is known
{{Birth, death and age templates}}
<includeonly>{{sandbox other||
[[Category:Date mathematics templates]]
[[Category:Templates generating microformat dates]]
[[Category:Templates generating hCalendars]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
b54m6utl1niu4etrwwqoq6ep7tczmoq
Tempilet:Birth date and age
10
2710
33503
2025-03-19T15:27:02Z
en>Bearcat
0
33503
wikitext
text/x-wiki
<includeonly>{{{{{♥|safesubst:}}}#invoke:age|birth_date_and_age}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using birth date and age with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Birth date and age]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | 3 | day | month | year | df | mf }}<!--
-->{{#ifeq: {{NAMESPACENUMBER}} | 0
| {{#if: {{#invoke:wd|label|raw}}
| {{#if: {{#invoke:String|match|{{#invoke:wd|properties|raw|P31}},|Q5,|1|1|true|}}
| {{#if: {{#invoke:wd|properties|raw|P569}}
|
| [[Category:Date of birth not in Wikidata]]
}}
}}
| [[Category:Articles without Wikidata item]]
}}
}}</includeonly><noinclude>{{documentation}}</noinclude>
63aqc12xtws4j2e9ii2pd1n6qpg9tr7
33504
33503
2026-11-11T22:09:03Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Birth_date_and_age]]
33503
wikitext
text/x-wiki
<includeonly>{{{{{♥|safesubst:}}}#invoke:age|birth_date_and_age}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using birth date and age with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Birth date and age]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | 3 | day | month | year | df | mf }}<!--
-->{{#ifeq: {{NAMESPACENUMBER}} | 0
| {{#if: {{#invoke:wd|label|raw}}
| {{#if: {{#invoke:String|match|{{#invoke:wd|properties|raw|P31}},|Q5,|1|1|true|}}
| {{#if: {{#invoke:wd|properties|raw|P569}}
|
| [[Category:Date of birth not in Wikidata]]
}}
}}
| [[Category:Articles without Wikidata item]]
}}
}}</includeonly><noinclude>{{documentation}}</noinclude>
63aqc12xtws4j2e9ii2pd1n6qpg9tr7
Module:Age
828
2711
33505
2025-12-10T08:08:14Z
en>Johnuniq
0
update from [[Module:Age/sandbox]]: bda, dda format output date to match the input if no df/mf parameter per [[User:Zackmann08]]'s suggestion at [[Module talk:Age#Updating df/mf syntax]]
33505
Scribunto
text/plain
-- Implement various "age of" and other date-related templates.
local mtext = {
-- Message and other text that should be localized.
-- Also need to localize text in table names in function dateDifference.
['mt-bad-param2'] = 'Parameter $1=$2 is invalid',
['mt-bad-show'] = 'Parameter show=$1 is not supported here',
['mt-cannot-add'] = 'Cannot add "$1"',
['mt-conflicting-show'] = 'Parameter show=$1 conflicts with round=$2',
['mt-date-wrong-order'] = 'The second date must be later in time than the first date',
['mt-dd-future'] = 'Death date (first date) must not be in the future',
['mt-dd-wrong-order'] = 'Death date (first date) must be later in time than the birth date (second date)',
['mt-invalid-bd-age'] = 'Invalid birth date for calculating age',
['mt-invalid-dates-age'] = 'Invalid dates for calculating age',
['mt-invalid-end'] = 'Invalid end date in second parameter',
['mt-invalid-start'] = 'Invalid start date in first parameter',
['mt-need-jdn'] = 'Need valid Julian date number',
['mt-need-valid-bd'] = 'Need valid birth date: year, month, day',
['mt-need-valid-bd2'] = 'Need valid birth date (second date): year, month, day',
['mt-need-valid-date'] = 'Need valid date',
['mt-need-valid-dd'] = 'Need valid death date (first date): year, month, day',
['mt-need-valid-ymd'] = 'Need valid year, month, day',
['mt-need-valid-ymd-current'] = 'Need valid year|month|day or "currentdate"',
['mt-need-valid-ymd2'] = 'Second date should be year, month, day',
['mt-template-bad-name'] = 'The specified template name is not valid',
['mt-template-x'] = 'The template invoking this must have "|template=x" where x is the wanted operation',
['mt-warn-param1'] = 'Invalid parameter $1',
['mt-warn-param2'] = 'Parameter $1=$2 is invalid',
['txt-affirmative'] = { y = true, yes = true, Y = true, Yes = true, YES = true }, -- valid values for df + mf parameters
['txt-yes'] = { y = true, yes = true, on = true }, -- valid values for parameters introduced with this module
['txt-and'] = ' and ',
['txt-or'] = ' or ',
['txt-category'] = 'Category:Pages using age template with invalid date',
['txt-comma-and'] = ', and ',
['txt-error'] = 'Error: ',
['txt-format-default'] = 'mf', -- 'df' (day first = dmy) or 'mf' (month first = mdy)
['txt-module-convertnumeric'] = 'Module:ConvertNumeric',
['txt-module-date'] = 'Module:Date',
['txt-sandbox'] = 'sandbox',
['txt-bda'] = '<span style="display:none"> (<span class="bday">$1</span>) </span>$2<span class="noprint ForceAgeToShow"> (age $3)</span>',
['txt-dda'] = '$2<span style="display:none">($1)</span> (aged $3)',
['txt-bda-disp'] = 'disp_raw', -- disp_raw → age is a number only; disp_age → age is a number and unit (normally years but months or days if very young)
['txt-dda-disp'] = 'disp_raw',
['txt-dmy'] = '%-d %B %-Y',
['txt-mdy'] = '%B %-d, %-Y',
}
local isWarning = {
['mt-warn-param1'] = true,
['mt-warn-param2'] = true,
}
-- yes[parameter] is true if parameter should be interpreted as "yes".
-- Do not want to accept mixed upper/lowercase unless done by previously used templates.
-- Need to accept "on" because "round=on" is wanted.
local yes = mtext['txt-yes']
-- Max valid age.
local MAX_AGE = 130
local translate, from_en, to_en, isZero
if translate then
-- Functions to translate from en to local language and reverse go here.
-- See example at [[:bn:Module:বয়স]].
else
from_en = function (text)
return text
end
isZero = function (text)
return tonumber(text) == 0
end
end
local _Date, _currentDate
local function getExports(frame)
-- Return objects exported from the date module or its sandbox.
if not _Date then
local sandbox = frame:getTitle():find(mtext['txt-sandbox'], 1, true) and ('/' .. mtext['txt-sandbox']) or ''
local datemod = require(mtext['txt-module-date'] .. sandbox)
local realDate = datemod._Date
_currentDate = datemod._current
if to_en then
_Date = function (...)
local args = {}
for i, v in ipairs({...}) do
args[i] = to_en(v)
end
return realDate(unpack(args))
end
else
_Date = realDate
end
end
return _Date, _currentDate
end
local Collection -- a table to hold items
Collection = {
add = function (self, item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end,
join = function (self, sep)
return table.concat(self, sep)
end,
remove = function (self, pos)
if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then
self.n = self.n - 1
return table.remove(self, pos)
end
end,
sort = function (self, comp)
table.sort(self, comp)
end,
new = function ()
return setmetatable({n = 0}, Collection)
end
}
Collection.__index = Collection
local function stripToNil(text)
-- If text is a string, return its trimmed content, or nil if empty.
-- Otherwise return text (which may, for example, be nil).
if type(text) == 'string' then
text = text:match('(%S.-)%s*$')
end
return text
end
local function substituteParameters(text, ...)
-- Return text after substituting any given parameters for $1, $2, etc.
return mw.message.newRawMessage(text, ...):plain()
end
local function message(msg, ...)
-- Return formatted message text for an error or warning.
local function getText(msg)
return mtext[msg] or error('Bug: message "' .. tostring(msg) .. '" not defined')
end
local categories = {
error = mtext['txt-category'],
warning = mtext['txt-category'],
}
local a, b, k, category
local text = substituteParameters(getText(msg), ...)
if isWarning[msg] then
a = '<sup>[<i>'
b = '</i>]</sup>'
k = 'warning'
else
a = '<strong class="error">' .. getText('txt-error')
b = '</strong>'
k = 'error'
end
if mw.title.getCurrentTitle():inNamespaces(0) then
-- Category only in namespaces: 0=article.
category = '[[' .. categories[k] .. ']]'
end
return
a ..
mw.text.nowiki(text) ..
b ..
(category or '')
end
local function dateFormat(args, options)
-- Return
-- nil, f if parameter is valid
-- m, f otherwise
-- where
-- m = string for warning message with category
-- f = string for wanted date format
local wanted
if options.suppliedformat == 'dmy' then
wanted = 'df'
elseif options.suppliedformat == 'mdy' then
wanted = 'mf'
else
wanted = mtext['txt-format-default']
end
local problem
local other = wanted == 'df' and 'mf' or 'df'
local parm = args[other] or ''
if mtext['txt-affirmative'][parm] then
wanted = other
elseif parm ~= '' then
problem = message('mt-warn-param2', other, parm)
end
return problem, wanted == 'df' and mtext['txt-dmy'] or mtext['txt-mdy']
end
local function formatNumber(number)
-- Return the given number formatted with commas as group separators,
-- given that the number is an integer.
local numstr = tostring(number)
local length = #numstr
local places = Collection.new()
local pos = 0
repeat
places:add(pos)
pos = pos + 3
until pos >= length
places:add(length)
local groups = Collection.new()
for i = places.n, 2, -1 do
local p1 = length - places[i] + 1
local p2 = length - places[i - 1]
groups:add(numstr:sub(p1, p2))
end
return groups:join(',')
end
local function spellNumber(number, options, i)
-- Return result of spelling number, or
-- return number (as a string) if cannot spell it.
-- i == 1 for the first number which can optionally start with an uppercase letter.
number = tostring(number)
return require(mtext['txt-module-convertnumeric']).spell_number(
number,
nil, -- fraction numerator
nil, -- fraction denominator
i == 1 and options.upper, -- true: 'One' instead of 'one'
not options.us, -- true: use 'and' between tens/ones etc
options.adj, -- true: hyphenated
options.ordinal -- true: 'first' instead of 'one'
) or number
end
local function makeExtra(args, flagCurrent)
-- Return extra text that will be inserted before the visible result
-- but after any sort key.
local extra = args.prefix or ''
if mw.ustring.len(extra) > 1 then
-- Parameter "~" gives "~3" whereas "over" gives "over 3".
if extra:sub(-6, -1) ~= ' ' then
extra = extra .. ' '
end
end
if flagCurrent then
extra = '<span class="currentage"></span>' .. extra
end
return extra
end
local function makeSort(value, sortable)
-- Return a sort key if requested.
-- Assume value is a valid number which has not overflowed.
if sortable == 'sortable_table' or sortable == 'sortable_on' or sortable == 'sortable_debug' then
local sortKey
if value == 0 then
sortKey = '5000000000000000000'
else
local mag = math.floor(math.log10(math.abs(value)) + 1e-14)
if value > 0 then
sortKey = 7000 + mag
else
sortKey = 2999 - mag
value = value + 10^(mag+1)
end
sortKey = string.format('%d', sortKey) .. string.format('%015.0f', math.floor(value * 10^(14-mag)))
end
local result
if sortable == 'sortable_table' then
result = 'data-sort-value="_SORTKEY_"|'
elseif sortable == 'sortable_debug' then
result = '<span data-sort-value="_SORTKEY_♠"><span style="border:1px solid">_SORTKEY_♠</span></span>'
else
result = '<span data-sort-value="_SORTKEY_♠"></span>'
end
return (result:gsub('_SORTKEY_', sortKey))
end
end
local translateParameters = {
abbr = {
off = 'abbr_off',
on = 'abbr_on',
},
disp = {
age = 'disp_age',
raw = 'disp_raw',
},
format = {
raw = 'format_raw',
commas = 'format_commas',
},
round = {
on = 'on',
yes = 'on',
months = 'ym',
weeks = 'ymw',
days = 'ymd',
hours = 'ymdh',
},
sep = {
comma = 'sep_comma',
[','] = 'sep_comma',
serialcomma = 'sep_serialcomma',
space = 'sep_space',
},
show = {
hide = { id = 'hide' },
y = { 'y', id = 'y' },
ym = { 'y', 'm', id = 'ym' },
ymd = { 'y', 'm', 'd', id = 'ymd' },
ymw = { 'y', 'm', 'w', id = 'ymw' },
ymwd = { 'y', 'm', 'w', 'd', id = 'ymwd' },
yd = { 'y', 'd', id = 'yd', keepZero = true },
m = { 'm', id = 'm' },
md = { 'm', 'd', id = 'md' },
w = { 'w', id = 'w' },
wd = { 'w', 'd', id = 'wd' },
h = { 'H', id = 'h' },
hm = { 'H', 'M', id = 'hm' },
hms = { 'H', 'M', 'S', id = 'hms' },
M = { 'M', id = 'M' },
s = { 'S', id = 's' },
d = { 'd', id = 'd' },
dh = { 'd', 'H', id = 'dh' },
dhm = { 'd', 'H', 'M', id = 'dhm' },
dhms = { 'd', 'H', 'M', 'S', id = 'dhms' },
ymdh = { 'y', 'm', 'd', 'H', id = 'ymdh' },
ymdhm = { 'y', 'm', 'd', 'H', 'M', id = 'ymdhm' },
ymwdh = { 'y', 'm', 'w', 'd', 'H', id = 'ymwdh' },
ymwdhm = { 'y', 'm', 'w', 'd', 'H', 'M', id = 'ymwdhm' },
},
sortable = {
off = false,
on = 'sortable_on',
table = 'sortable_table',
debug = 'sortable_debug',
},
}
local spellOptions = {
cardinal = {},
Cardinal = { upper = true },
cardinal_us = { us = true },
Cardinal_us = { us = true, upper = true },
ordinal = { ordinal = true },
Ordinal = { ordinal = true, upper = true },
ordinal_us = { ordinal = true, us = true },
Ordinal_us = { ordinal = true, us = true, upper = true },
}
local function dateExtract(frame)
-- Return part of a date after performing an optional operation.
local Date = getExports(frame)
local args = frame:getParent().args
local parms = {}
for i, v in ipairs(args) do
parms[i] = v
end
if yes[args.fix] then
table.insert(parms, 'fix')
end
if yes[args.partial] then
table.insert(parms, 'partial')
end
local show = stripToNil(args.show) or 'dmy'
local date = Date(unpack(parms))
if not date then
if show == 'format' then
return 'error'
end
return message('mt-need-valid-date')
end
local add = stripToNil(args.add)
if add then
for item in add:gmatch('%S+') do
date = date + item
if not date then
return message('mt-cannot-add', item)
end
end
end
local sortKey, result
local sortable = translateParameters.sortable[args.sortable]
if sortable then
local value = (date.partial and date.partial.first or date).jdz
sortKey = makeSort(value, sortable)
end
if show ~= 'hide' then
result = date[show]
if result == nil then
result = from_en(date:text(show))
elseif type(result) == 'boolean' then
result = result and '1' or '0'
else
result = from_en(tostring(result))
end
end
return (sortKey or '') .. makeExtra(args) .. (result or '')
end
local function rangeJoin(range)
-- Return text to be used between a range of ages.
return range == 'dash' and '–' or mtext['txt-or']
end
local function makeText(values, components, names, options, noUpper)
-- Return wikitext representing an age or duration.
local text = Collection.new()
local count = #values
local sep = names.sep or ''
for i, v in ipairs(values) do
-- v is a number (say 4 for 4 years), or a table ({4,5} for 4 or 5 years).
local islist = type(v) == 'table'
if (islist or v > 0) or (text.n == 0 and i == count) or (text.n > 0 and components.keepZero) then
local fmt, vstr
if options.spell then
fmt = function(number)
return spellNumber(number, options.spell, noUpper or i)
end
elseif i == 1 and options.format == 'format_commas' then
-- Numbers after the first should be small and not need formatting.
fmt = formatNumber
else
fmt = tostring
end
if islist then
vstr = fmt(v[1]) .. rangeJoin(options.range)
noUpper = true
vstr = vstr .. fmt(v[2])
else
vstr = fmt(v)
end
local name = names[components[i]]
if name then
if type(name) == 'table' then
name = mw.getContentLanguage():plural(islist and v[2] or v, name)
end
text:add(vstr .. sep .. name)
else
text:add(vstr)
end
end
end
local first, last
if options.join == 'sep_space' then
first = ' '
last = ' '
elseif options.join == 'sep_comma' then
first = ', '
last = ', '
elseif options.join == 'sep_serialcomma' and text.n > 2 then
first = ', '
last = mtext['txt-comma-and']
else
first = ', '
last = mtext['txt-and']
end
for i, v in ipairs(text) do
if i < text.n then
text[i] = v .. (i + 1 < text.n and first or last)
end
end
local sign = ''
if options.isnegative then
-- Do not display negative zero.
if text.n > 1 or (text.n == 1 and text[1]:sub(1, 1) ~= '0' ) then
if options.format == 'format_raw' then
sign = '-' -- plain hyphen so result can be used in a calculation
else
sign = '−' -- Unicode U+2212 MINUS SIGN
end
end
end
return
(options.sortKey or '') ..
(options.extra or '') ..
sign ..
text:join() ..
(options.suffix or '')
end
local function dateDifference(parms)
-- Return a formatted date difference using the given parameters
-- which have been validated.
local names = {
-- Each name is:
-- * a string if no plural form of the name is used; or
-- * a table of strings, one of which is selected using the rules at
-- https://translatewiki.net/wiki/Plural/Mediawiki_plural_rules
abbr_off = {
sep = ' ',
y = {'year', 'years'},
m = {'month', 'months'},
w = {'week', 'weeks'},
d = {'day', 'days'},
H = {'hour', 'hours'},
M = {'minute', 'minutes'},
S = {'second', 'seconds'},
},
abbr_on = {
y = 'y',
m = 'm',
w = 'w',
d = 'd',
H = 'h',
M = 'm',
S = 's',
},
abbr_infant = { -- for {{age for infant}}
sep = ' ',
y = {'yr', 'yrs'},
m = {'mo', 'mos'},
w = {'wk', 'wks'},
d = {'day', 'days'},
H = {'hr', 'hrs'},
M = {'min', 'mins'},
S = {'sec', 'secs'},
},
abbr_raw = {},
}
local diff = parms.diff -- must be a valid date difference
local show = parms.show -- may be nil; default is set below
local abbr = parms.abbr or 'abbr_off'
local defaultJoin
if abbr ~= 'abbr_off' then
defaultJoin = 'sep_space'
end
if not show then
show = 'ymd'
if parms.disp == 'disp_age' then
if diff.years < 3 then
defaultJoin = 'sep_space'
if diff.years >= 1 then
show = 'ym'
else
show = 'md'
end
else
show = 'y'
end
end
end
if type(show) ~= 'table' then
show = translateParameters.show[show]
end
if parms.disp == 'disp_raw' then
defaultJoin = 'sep_space'
abbr = 'abbr_raw'
elseif parms.wantSc then
defaultJoin = 'sep_serialcomma'
end
local diffOptions = {
round = parms.round,
duration = parms.wantDuration,
range = parms.range and true or nil,
}
local sortKey
if parms.sortable then
local value = diff.age_days + (parms.wantDuration and 1 or 0) -- days and fraction of a day
if diff.isnegative then
value = -value
end
sortKey = makeSort(value, parms.sortable)
end
local textOptions = {
extra = parms.extra,
format = parms.format,
join = parms.sep or defaultJoin,
isnegative = diff.isnegative,
range = parms.range,
sortKey = sortKey,
spell = parms.spell,
suffix = parms.suffix, -- not currently used
}
if show.id == 'hide' then
return sortKey or ''
end
local values = { diff:age(show.id, diffOptions) }
if values[1] then
return makeText(values, show, names[abbr], textOptions)
end
if diff.partial then
-- Handle a more complex range such as
-- {{age_yd|20 Dec 2001|2003|range=yes}} → 1 year, 12 days or 2 years, 11 days
local opt = {
format = textOptions.format,
join = textOptions.join,
isnegative = textOptions.isnegative,
spell = textOptions.spell,
}
return
(textOptions.sortKey or '') ..
makeText({ diff.partial.mindiff:age(show.id, diffOptions) }, show, names[abbr], opt) ..
rangeJoin(textOptions.range) ..
makeText({ diff.partial.maxdiff:age(show.id, diffOptions) }, show, names[abbr], opt, true) ..
(textOptions.suffix or '')
end
return message('mt-bad-show', show.id)
end
local function getDates(frame, getopt)
-- Parse template parameters and return one of:
-- * date (a date table, if single)
-- * date1, date2 (two date tables, if not single)
-- * text (a string error message)
-- A missing date is optionally replaced with the current date.
-- If wantMixture is true, a missing date component is replaced
-- from the current date, so can get a bizarre mixture of
-- specified/current y/m/d as has been done by some "age" templates.
-- Some results may be placed in table getopt.
local Date, currentDate = getExports(frame)
getopt = getopt or {}
local function flagCurrent(text)
-- This allows the calling template to detect if the current date has been used,
-- that is, whether both dates have been entered in a template expecting two.
-- For example, an infobox may want the age when an event occurred, not the current age.
-- Don't bother detecting if wantMixture is used because not needed and it is a poor option.
if not text then
if getopt.noMissing then
return nil -- this gives a nil date which gives an error
end
text = 'currentdate'
if getopt.flag == 'usesCurrent' then
getopt.usesCurrent = true
end
end
return text
end
local args = frame:getParent().args
local fields = {}
local isNamed = args.year or args.year1 or args.year2 or
args.month or args.month1 or args.month2 or
args.day or args.day1 or args.day2
if isNamed then
fields[1] = args.year1 or args.year
fields[2] = args.month1 or args.month
fields[3] = args.day1 or args.day
fields[4] = args.year2
fields[5] = args.month2
fields[6] = args.day2
else
for i = 1, 6 do
fields[i] = args[i]
end
end
local imax = 0
for i = 1, 6 do
fields[i] = stripToNil(fields[i])
if fields[i] then
imax = i
end
if getopt.omitZero and i % 3 ~= 1 then -- omit zero months and days as unknown values but keep year 0 which is 1 BCE
if isZero(fields[i]) then
fields[i] = nil
getopt.partial = true
end
end
end
local fix = getopt.fix and 'fix' or ''
local partialText = getopt.partial and 'partial' or ''
local dates = {}
if isNamed or imax >= 3 then
local nrDates = getopt.single and 1 or 2
if getopt.wantMixture then
-- Cannot be partial since empty fields are set from current.
local components = { 'year', 'month', 'day' }
for i = 1, nrDates * 3 do
fields[i] = fields[i] or currentDate[components[i > 3 and i - 3 or i]]
end
for i = 1, nrDates do
local index = i == 1 and 1 or 4
local y, m, d = fields[index], fields[index+1], fields[index+2]
if (m == 2 or m == '2') and (d == 29 or d == '29') then
-- Workaround error with following which attempt to use invalid date 2001-02-29.
-- {{age_ymwd|year1=2001|year2=2004|month2=2|day2=29}}
-- {{age_ymwd|year1=2001|month1=2|year2=2004|month2=1|day2=29}}
-- TODO Get rid of wantMixture because even this ugly code does not handle
-- 'Feb' or 'February' or 'feb' or 'february'.
if not ((y % 4 == 0 and y % 100 ~= 0) or y % 400 == 0) then
d = 28
end
end
dates[i] = Date(y, m, d)
end
else
-- If partial dates are allowed, accept
-- year only, or
-- year and month only
-- Do not accept year and day without a month because that makes no sense
-- (and because, for example, Date('partial', 2001, nil, 12) sets day = nil, not 12).
for i = 1, nrDates do
local index = i == 1 and 1 or 4
local y, m, d = fields[index], fields[index+1], fields[index+2]
if (getopt.partial and y and (m or not d)) or (y and m and d) then
dates[i] = Date(fix, partialText, y, m, d)
elseif not y and not m and not d then
dates[i] = Date(flagCurrent())
end
end
end
else
getopt.textdates = true -- have parsed each date from a single text field
dates[1] = Date(fix, partialText, flagCurrent(fields[1]))
if not getopt.single then
dates[2] = Date(fix, partialText, flagCurrent(fields[2]))
end
end
if not dates[1] then
return message(getopt.missing1 or 'mt-need-valid-ymd')
end
if getopt.textdates then
getopt.suppliedformat = dates[1].format
end
if getopt.single then
return dates[1]
end
if not dates[2] then
return message(getopt.missing2 or 'mt-need-valid-ymd2')
end
return dates[1], dates[2]
end
local function ageGeneric(frame)
-- Return the result required by the specified template.
-- Can use sortable=x where x = on/table/off/debug in any supported template.
-- Some templates default to sortable=on but can be overridden.
local name = frame.args.template
if not name then
return message('mt-template-x')
end
local args = frame:getParent().args
local specs = {
age_days = { -- {{age in days}}
show = 'd',
disp = 'disp_raw',
},
age_days_nts = { -- {{age in days nts}}
show = 'd',
disp = 'disp_raw',
format = 'format_commas',
sortable = 'on',
},
duration_days = { -- {{duration in days}}
show = 'd',
disp = 'disp_raw',
duration = true,
},
duration_days_nts = { -- {{duration in days nts}}
show = 'd',
disp = 'disp_raw',
format = 'format_commas',
sortable = 'on',
duration = true,
},
age_full_years = { -- {{age}}
show = 'y',
abbr = 'abbr_raw',
flag = 'usesCurrent',
omitZero = true,
range = 'dash',
},
age_full_years_nts = { -- {{age nts}}
show = 'y',
abbr = 'abbr_raw',
format = 'format_commas',
sortable = 'on',
},
age_in_years = { -- {{age in years}}
show = 'y',
abbr = 'abbr_raw',
negative = 'error',
range = 'dash',
},
age_in_years_nts = { -- {{age in years nts}}
show = 'y',
abbr = 'abbr_raw',
negative = 'error',
range = 'dash',
format = 'format_commas',
sortable = 'on',
},
age_infant = { -- {{age for infant}}
-- Do not set show because special processing is done later.
abbr = yes[args.abbr] and 'abbr_infant' or 'abbr_off',
disp = 'disp_age',
sep = 'sep_space',
sortable = 'on',
},
age_m = { -- {{age in months}}
show = 'm',
disp = 'disp_raw',
},
age_w = { -- {{age in weeks}}
show = 'w',
disp = 'disp_raw',
},
age_wd = { -- {{age in weeks and days}}
show = 'wd',
},
age_yd = { -- {{age in years and days}}
show = 'yd',
format = 'format_commas',
sep = args.sep ~= 'and' and 'sep_comma' or nil,
},
age_yd_nts = { -- {{age in years and days nts}}
show = 'yd',
format = 'format_commas',
sep = args.sep ~= 'and' and 'sep_comma' or nil,
sortable = 'on',
},
age_ym = { -- {{age in years and months}}
show = 'ym',
sep = 'sep_comma',
},
age_ymd = { -- {{age in years, months and days}}
show = 'ymd',
range = true,
},
age_ymwd = { -- {{age in years, months, weeks and days}}
show = 'ymwd',
wantMixture = true,
},
}
local spec = specs[name]
if not spec then
return message('mt-template-bad-name')
end
if name == 'age_days' then
local su = stripToNil(args['show unit'])
if su then
if su == 'abbr' or su == 'full' then
spec.disp = nil
spec.abbr = su == 'abbr' and 'abbr_on' or nil
end
end
end
local partial, autofill
local range = stripToNil(args.range) or spec.range
if range then
-- Suppose partial dates are used and age could be 11 or 12 years.
-- "|range=" (empty value) has no effect (spec is used).
-- "|range=yes" or spec.range == true sets range = true (gives "11 or 12")
-- "|range=dash" or spec.range == 'dash' sets range = 'dash' (gives "11–12").
-- "|range=no" or spec.range == 'no' sets range = nil and fills each date in the diff (gives "12").
-- ("on" is equivalent to "yes", and "off" is equivalent to "no").
-- "|range=OTHER" sets range = nil and rejects partial dates.
range = ({ dash = 'dash', off = 'no', no = 'no', [true] = true })[range] or yes[range]
if range then
partial = true -- accept partial dates with a possible age range for the result
if range == 'no' then
autofill = true -- missing month/day in first or second date are filled from other date or 1
range = nil
end
end
end
local getopt = {
fix = yes[args.fix],
flag = stripToNil(args.flag) or spec.flag,
omitZero = spec.omitZero,
partial = partial,
wantMixture = spec.wantMixture,
}
local date1, date2 = getDates(frame, getopt)
if type(date1) == 'string' then
return date1
end
local format = stripToNil(args.format)
local spell = spellOptions[format]
if format then
format = 'format_' .. format
elseif name == 'age_days' and getopt.textdates then
format = 'format_commas'
end
local parms = {
diff = date2:subtract(date1, { fill = autofill }),
wantDuration = spec.duration or yes[args.duration],
range = range,
wantSc = yes[args.sc],
show = args.show == 'hide' and 'hide' or spec.show,
abbr = spec.abbr,
disp = spec.disp,
extra = makeExtra(args, getopt.usesCurrent and format ~= 'format_raw'),
format = format or spec.format,
round = yes[args.round],
sep = spec.sep,
sortable = translateParameters.sortable[args.sortable or spec.sortable],
spell = spell,
}
if (spec.negative or frame.args.negative) == 'error' and parms.diff.isnegative then
return message('mt-date-wrong-order')
end
return from_en(dateDifference(parms))
end
local function isFake(args)
-- Some templates have TemplateData with an auto value like "{{Birth date and age|YYYY|MM|DD}}".
-- Return true if that appears to be the case so the caller can output nothing rather than an error.
return args[1] == 'YYYY'
end
local function bda(frame)
-- Implement [[Template:Birth date and age]].
local args = frame:getParent().args
if isFake(args) then
return ''
end
local options = {
missing1 = 'mt-need-valid-bd',
noMissing = true,
single = true,
}
local date = getDates(frame, options)
if type(date) == 'string' then
return date -- error text
end
local Date = getExports(frame)
local diff = Date('currentdate') - date
if diff.isnegative or diff.years > MAX_AGE then
return message('mt-invalid-bd-age')
end
local disp = mtext['txt-bda-disp']
local show = 'y'
if diff.years < 2 then
disp = 'disp_age'
if diff.years == 0 and diff.months == 0 then
show = 'd'
else
show = 'm'
end
end
local problem, format = dateFormat(args, options)
local result = substituteParameters(
mtext['txt-bda'],
date:text('%-Y-%m-%d'),
from_en(date:text(format)),
from_en(dateDifference({
diff = diff,
show = show,
abbr = 'abbr_off',
disp = disp,
sep = 'sep_space',
}))
) .. (problem or '')
local warnings = tonumber(frame.args.warnings)
if warnings and warnings > 0 then
local good = {
df = true,
mf = true,
day = true,
day1 = true,
month = true,
month1 = true,
year = true,
year1 = true,
}
local invalid
local imax = options.textdates and 1 or 3
for k, _ in pairs(args) do
if type(k) == 'number' then
if k > imax then
invalid = tostring(k)
break
end
else
if not good[k] then
invalid = k
break
end
end
end
if invalid then
result = result .. message('mt-warn-param1', invalid)
end
end
return result
end
local function dda(frame)
-- Implement [[Template:Death date and age]].
local args = frame:getParent().args
if isFake(args) then
return ''
end
local options = {
missing1 = 'mt-need-valid-dd',
missing2 = 'mt-need-valid-bd2',
noMissing = true,
partial = true,
}
local date1, date2 = getDates(frame, options)
if type(date1) == 'string' then
return date1
end
local diff = date1 - date2
if diff.isnegative then
return message('mt-dd-wrong-order')
end
local Date = getExports(frame)
local today = Date('currentdate') + 1 -- one day in future allows for timezones
if date1 > today then
return message('mt-dd-future')
end
local years
if diff.partial then
years = diff.partial.years
years = type(years) == 'table' and years[2] or years
else
years = diff.years
end
if years > MAX_AGE then
return message('mt-invalid-dates-age')
end
local fmt_date, fmt_ymd, problem
if date1.day then -- y, m, d known
problem, fmt_date = dateFormat(args, options)
fmt_ymd = '%-Y-%m-%d'
elseif date1.month then -- y, m known; d unknown
fmt_date = '%B %-Y'
fmt_ymd = '%-Y-%m-00'
else -- y known; m, d unknown
fmt_date = '%-Y'
fmt_ymd = '%-Y-00-00'
end
local sortKey
local sortable = translateParameters.sortable[args.sortable]
if sortable then
local value = (date1.partial and date1.partial.first or date1).jdz
sortKey = makeSort(value, sortable)
end
local result = (sortKey or '') .. substituteParameters(
mtext['txt-dda'],
date1:text(fmt_ymd),
from_en(date1:text(fmt_date)),
from_en(dateDifference({
diff = diff,
show = 'y',
abbr = 'abbr_off',
disp = mtext['txt-dda-disp'],
range = 'dash',
sep = 'sep_space',
}))
) .. (problem or '')
local warnings = tonumber(frame.args.warnings)
if warnings and warnings > 0 then
local good = {
df = true,
mf = true,
}
local invalid
local imax = options.textdates and 2 or 6
for k, _ in pairs(args) do
if type(k) == 'number' then
if k > imax then
invalid = tostring(k)
break
end
else
if not good[k] then
invalid = k
break
end
end
end
if invalid then
result = result .. message('mt-warn-param1', invalid)
end
end
return result
end
local function dateToGsd(frame)
-- Implement [[Template:Gregorian serial date]].
-- Return Gregorian serial date of the given date, or the current date.
-- The returned value is negative for dates before 1 January 1 AD
-- despite the fact that GSD is not defined for such dates.
local date = getDates(frame, { wantMixture=true, single=true })
if type(date) == 'string' then
return date
end
return tostring(date.gsd)
end
local function jdToDate(frame)
-- Return formatted date from a Julian date.
-- The result includes a time if the input includes a fraction.
-- The word 'Julian' is accepted for the Julian calendar.
local Date = getExports(frame)
local args = frame:getParent().args
local date = Date('juliandate', args[1], args[2])
if date then
return from_en(date:text())
end
return message('mt-need-jdn')
end
local function dateToJd(frame)
-- Return Julian date (a number) from a date which may include a time,
-- or the current date ('currentdate') or current date and time ('currentdatetime').
-- The word 'Julian' is accepted for the Julian calendar.
local Date = getExports(frame)
local args = frame:getParent().args
local date = Date(args[1], args[2], args[3], args[4], args[5], args[6], args[7])
if date then
return tostring(date.jd)
end
return message('mt-need-valid-ymd-current')
end
local function timeInterval(frame)
-- Implement [[Template:Time interval]].
-- There are two positional arguments: date1, date2.
-- The default for each is the current date and time.
-- Result is date2 - date1 formatted.
local Date = getExports(frame)
local args = frame:getParent().args
local parms = {
extra = makeExtra(args),
wantDuration = yes[args.duration],
range = yes[args.range] or (args.range == 'dash' and 'dash' or nil),
wantSc = yes[args.sc],
}
local fix = yes[args.fix] and 'fix' or ''
local date1 = Date(fix, 'partial', stripToNil(args[1]) or 'currentdatetime')
if not date1 then
return message('mt-invalid-start')
end
local date2 = Date(fix, 'partial', stripToNil(args[2]) or 'currentdatetime')
if not date2 then
return message('mt-invalid-end')
end
parms.diff = date2 - date1
for argname, translate in pairs(translateParameters) do
local parm = stripToNil(args[argname])
if parm then
parm = translate[parm]
if parm == nil then -- test for nil because false is a valid setting
return message('mt-bad-param2', argname, args[argname])
end
parms[argname] = parm
end
end
if parms.round then
local round = parms.round
local show = parms.show
if round ~= 'on' then
if show then
if show.id ~= round then
return message('mt-conflicting-show', args.show, args.round)
end
else
parms.show = translateParameters.show[round]
end
end
parms.round = true
end
return from_en(dateDifference(parms))
end
local function templateGeneric(frame)
-- Example: {{#invoke:age||template=age_days|1 Apr 1980|1 Apr 2080|format=raw}} → 36525
local name = frame.args.template
if not name then
return message('mt-template-x')
end
return ageGeneric(frame:newChild({title = mw.title.new(name, 10), args = frame.args}))
end
return {
age_generic = ageGeneric, -- can emulate several age templates
birth_date_and_age = bda, -- Template:Birth_date_and_age
death_date_and_age = dda, -- Template:Death_date_and_age
gsd = dateToGsd, -- Template:Gregorian_serial_date
extract = dateExtract, -- Template:Extract
jd_to_date = jdToDate, -- Template:?
JULIANDAY = dateToJd, -- Template:JULIANDAY
time_interval = timeInterval, -- Template:Time_interval
[''] = templateGeneric, -- same as age_generic, but can be invoked directly
}
5jfartpt852zyo065229cuu9b3q1sqo
33506
33505
2026-11-11T22:09:04Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Age]]
33505
Scribunto
text/plain
-- Implement various "age of" and other date-related templates.
local mtext = {
-- Message and other text that should be localized.
-- Also need to localize text in table names in function dateDifference.
['mt-bad-param2'] = 'Parameter $1=$2 is invalid',
['mt-bad-show'] = 'Parameter show=$1 is not supported here',
['mt-cannot-add'] = 'Cannot add "$1"',
['mt-conflicting-show'] = 'Parameter show=$1 conflicts with round=$2',
['mt-date-wrong-order'] = 'The second date must be later in time than the first date',
['mt-dd-future'] = 'Death date (first date) must not be in the future',
['mt-dd-wrong-order'] = 'Death date (first date) must be later in time than the birth date (second date)',
['mt-invalid-bd-age'] = 'Invalid birth date for calculating age',
['mt-invalid-dates-age'] = 'Invalid dates for calculating age',
['mt-invalid-end'] = 'Invalid end date in second parameter',
['mt-invalid-start'] = 'Invalid start date in first parameter',
['mt-need-jdn'] = 'Need valid Julian date number',
['mt-need-valid-bd'] = 'Need valid birth date: year, month, day',
['mt-need-valid-bd2'] = 'Need valid birth date (second date): year, month, day',
['mt-need-valid-date'] = 'Need valid date',
['mt-need-valid-dd'] = 'Need valid death date (first date): year, month, day',
['mt-need-valid-ymd'] = 'Need valid year, month, day',
['mt-need-valid-ymd-current'] = 'Need valid year|month|day or "currentdate"',
['mt-need-valid-ymd2'] = 'Second date should be year, month, day',
['mt-template-bad-name'] = 'The specified template name is not valid',
['mt-template-x'] = 'The template invoking this must have "|template=x" where x is the wanted operation',
['mt-warn-param1'] = 'Invalid parameter $1',
['mt-warn-param2'] = 'Parameter $1=$2 is invalid',
['txt-affirmative'] = { y = true, yes = true, Y = true, Yes = true, YES = true }, -- valid values for df + mf parameters
['txt-yes'] = { y = true, yes = true, on = true }, -- valid values for parameters introduced with this module
['txt-and'] = ' and ',
['txt-or'] = ' or ',
['txt-category'] = 'Category:Pages using age template with invalid date',
['txt-comma-and'] = ', and ',
['txt-error'] = 'Error: ',
['txt-format-default'] = 'mf', -- 'df' (day first = dmy) or 'mf' (month first = mdy)
['txt-module-convertnumeric'] = 'Module:ConvertNumeric',
['txt-module-date'] = 'Module:Date',
['txt-sandbox'] = 'sandbox',
['txt-bda'] = '<span style="display:none"> (<span class="bday">$1</span>) </span>$2<span class="noprint ForceAgeToShow"> (age $3)</span>',
['txt-dda'] = '$2<span style="display:none">($1)</span> (aged $3)',
['txt-bda-disp'] = 'disp_raw', -- disp_raw → age is a number only; disp_age → age is a number and unit (normally years but months or days if very young)
['txt-dda-disp'] = 'disp_raw',
['txt-dmy'] = '%-d %B %-Y',
['txt-mdy'] = '%B %-d, %-Y',
}
local isWarning = {
['mt-warn-param1'] = true,
['mt-warn-param2'] = true,
}
-- yes[parameter] is true if parameter should be interpreted as "yes".
-- Do not want to accept mixed upper/lowercase unless done by previously used templates.
-- Need to accept "on" because "round=on" is wanted.
local yes = mtext['txt-yes']
-- Max valid age.
local MAX_AGE = 130
local translate, from_en, to_en, isZero
if translate then
-- Functions to translate from en to local language and reverse go here.
-- See example at [[:bn:Module:বয়স]].
else
from_en = function (text)
return text
end
isZero = function (text)
return tonumber(text) == 0
end
end
local _Date, _currentDate
local function getExports(frame)
-- Return objects exported from the date module or its sandbox.
if not _Date then
local sandbox = frame:getTitle():find(mtext['txt-sandbox'], 1, true) and ('/' .. mtext['txt-sandbox']) or ''
local datemod = require(mtext['txt-module-date'] .. sandbox)
local realDate = datemod._Date
_currentDate = datemod._current
if to_en then
_Date = function (...)
local args = {}
for i, v in ipairs({...}) do
args[i] = to_en(v)
end
return realDate(unpack(args))
end
else
_Date = realDate
end
end
return _Date, _currentDate
end
local Collection -- a table to hold items
Collection = {
add = function (self, item)
if item ~= nil then
self.n = self.n + 1
self[self.n] = item
end
end,
join = function (self, sep)
return table.concat(self, sep)
end,
remove = function (self, pos)
if self.n > 0 and (pos == nil or (0 < pos and pos <= self.n)) then
self.n = self.n - 1
return table.remove(self, pos)
end
end,
sort = function (self, comp)
table.sort(self, comp)
end,
new = function ()
return setmetatable({n = 0}, Collection)
end
}
Collection.__index = Collection
local function stripToNil(text)
-- If text is a string, return its trimmed content, or nil if empty.
-- Otherwise return text (which may, for example, be nil).
if type(text) == 'string' then
text = text:match('(%S.-)%s*$')
end
return text
end
local function substituteParameters(text, ...)
-- Return text after substituting any given parameters for $1, $2, etc.
return mw.message.newRawMessage(text, ...):plain()
end
local function message(msg, ...)
-- Return formatted message text for an error or warning.
local function getText(msg)
return mtext[msg] or error('Bug: message "' .. tostring(msg) .. '" not defined')
end
local categories = {
error = mtext['txt-category'],
warning = mtext['txt-category'],
}
local a, b, k, category
local text = substituteParameters(getText(msg), ...)
if isWarning[msg] then
a = '<sup>[<i>'
b = '</i>]</sup>'
k = 'warning'
else
a = '<strong class="error">' .. getText('txt-error')
b = '</strong>'
k = 'error'
end
if mw.title.getCurrentTitle():inNamespaces(0) then
-- Category only in namespaces: 0=article.
category = '[[' .. categories[k] .. ']]'
end
return
a ..
mw.text.nowiki(text) ..
b ..
(category or '')
end
local function dateFormat(args, options)
-- Return
-- nil, f if parameter is valid
-- m, f otherwise
-- where
-- m = string for warning message with category
-- f = string for wanted date format
local wanted
if options.suppliedformat == 'dmy' then
wanted = 'df'
elseif options.suppliedformat == 'mdy' then
wanted = 'mf'
else
wanted = mtext['txt-format-default']
end
local problem
local other = wanted == 'df' and 'mf' or 'df'
local parm = args[other] or ''
if mtext['txt-affirmative'][parm] then
wanted = other
elseif parm ~= '' then
problem = message('mt-warn-param2', other, parm)
end
return problem, wanted == 'df' and mtext['txt-dmy'] or mtext['txt-mdy']
end
local function formatNumber(number)
-- Return the given number formatted with commas as group separators,
-- given that the number is an integer.
local numstr = tostring(number)
local length = #numstr
local places = Collection.new()
local pos = 0
repeat
places:add(pos)
pos = pos + 3
until pos >= length
places:add(length)
local groups = Collection.new()
for i = places.n, 2, -1 do
local p1 = length - places[i] + 1
local p2 = length - places[i - 1]
groups:add(numstr:sub(p1, p2))
end
return groups:join(',')
end
local function spellNumber(number, options, i)
-- Return result of spelling number, or
-- return number (as a string) if cannot spell it.
-- i == 1 for the first number which can optionally start with an uppercase letter.
number = tostring(number)
return require(mtext['txt-module-convertnumeric']).spell_number(
number,
nil, -- fraction numerator
nil, -- fraction denominator
i == 1 and options.upper, -- true: 'One' instead of 'one'
not options.us, -- true: use 'and' between tens/ones etc
options.adj, -- true: hyphenated
options.ordinal -- true: 'first' instead of 'one'
) or number
end
local function makeExtra(args, flagCurrent)
-- Return extra text that will be inserted before the visible result
-- but after any sort key.
local extra = args.prefix or ''
if mw.ustring.len(extra) > 1 then
-- Parameter "~" gives "~3" whereas "over" gives "over 3".
if extra:sub(-6, -1) ~= ' ' then
extra = extra .. ' '
end
end
if flagCurrent then
extra = '<span class="currentage"></span>' .. extra
end
return extra
end
local function makeSort(value, sortable)
-- Return a sort key if requested.
-- Assume value is a valid number which has not overflowed.
if sortable == 'sortable_table' or sortable == 'sortable_on' or sortable == 'sortable_debug' then
local sortKey
if value == 0 then
sortKey = '5000000000000000000'
else
local mag = math.floor(math.log10(math.abs(value)) + 1e-14)
if value > 0 then
sortKey = 7000 + mag
else
sortKey = 2999 - mag
value = value + 10^(mag+1)
end
sortKey = string.format('%d', sortKey) .. string.format('%015.0f', math.floor(value * 10^(14-mag)))
end
local result
if sortable == 'sortable_table' then
result = 'data-sort-value="_SORTKEY_"|'
elseif sortable == 'sortable_debug' then
result = '<span data-sort-value="_SORTKEY_♠"><span style="border:1px solid">_SORTKEY_♠</span></span>'
else
result = '<span data-sort-value="_SORTKEY_♠"></span>'
end
return (result:gsub('_SORTKEY_', sortKey))
end
end
local translateParameters = {
abbr = {
off = 'abbr_off',
on = 'abbr_on',
},
disp = {
age = 'disp_age',
raw = 'disp_raw',
},
format = {
raw = 'format_raw',
commas = 'format_commas',
},
round = {
on = 'on',
yes = 'on',
months = 'ym',
weeks = 'ymw',
days = 'ymd',
hours = 'ymdh',
},
sep = {
comma = 'sep_comma',
[','] = 'sep_comma',
serialcomma = 'sep_serialcomma',
space = 'sep_space',
},
show = {
hide = { id = 'hide' },
y = { 'y', id = 'y' },
ym = { 'y', 'm', id = 'ym' },
ymd = { 'y', 'm', 'd', id = 'ymd' },
ymw = { 'y', 'm', 'w', id = 'ymw' },
ymwd = { 'y', 'm', 'w', 'd', id = 'ymwd' },
yd = { 'y', 'd', id = 'yd', keepZero = true },
m = { 'm', id = 'm' },
md = { 'm', 'd', id = 'md' },
w = { 'w', id = 'w' },
wd = { 'w', 'd', id = 'wd' },
h = { 'H', id = 'h' },
hm = { 'H', 'M', id = 'hm' },
hms = { 'H', 'M', 'S', id = 'hms' },
M = { 'M', id = 'M' },
s = { 'S', id = 's' },
d = { 'd', id = 'd' },
dh = { 'd', 'H', id = 'dh' },
dhm = { 'd', 'H', 'M', id = 'dhm' },
dhms = { 'd', 'H', 'M', 'S', id = 'dhms' },
ymdh = { 'y', 'm', 'd', 'H', id = 'ymdh' },
ymdhm = { 'y', 'm', 'd', 'H', 'M', id = 'ymdhm' },
ymwdh = { 'y', 'm', 'w', 'd', 'H', id = 'ymwdh' },
ymwdhm = { 'y', 'm', 'w', 'd', 'H', 'M', id = 'ymwdhm' },
},
sortable = {
off = false,
on = 'sortable_on',
table = 'sortable_table',
debug = 'sortable_debug',
},
}
local spellOptions = {
cardinal = {},
Cardinal = { upper = true },
cardinal_us = { us = true },
Cardinal_us = { us = true, upper = true },
ordinal = { ordinal = true },
Ordinal = { ordinal = true, upper = true },
ordinal_us = { ordinal = true, us = true },
Ordinal_us = { ordinal = true, us = true, upper = true },
}
local function dateExtract(frame)
-- Return part of a date after performing an optional operation.
local Date = getExports(frame)
local args = frame:getParent().args
local parms = {}
for i, v in ipairs(args) do
parms[i] = v
end
if yes[args.fix] then
table.insert(parms, 'fix')
end
if yes[args.partial] then
table.insert(parms, 'partial')
end
local show = stripToNil(args.show) or 'dmy'
local date = Date(unpack(parms))
if not date then
if show == 'format' then
return 'error'
end
return message('mt-need-valid-date')
end
local add = stripToNil(args.add)
if add then
for item in add:gmatch('%S+') do
date = date + item
if not date then
return message('mt-cannot-add', item)
end
end
end
local sortKey, result
local sortable = translateParameters.sortable[args.sortable]
if sortable then
local value = (date.partial and date.partial.first or date).jdz
sortKey = makeSort(value, sortable)
end
if show ~= 'hide' then
result = date[show]
if result == nil then
result = from_en(date:text(show))
elseif type(result) == 'boolean' then
result = result and '1' or '0'
else
result = from_en(tostring(result))
end
end
return (sortKey or '') .. makeExtra(args) .. (result or '')
end
local function rangeJoin(range)
-- Return text to be used between a range of ages.
return range == 'dash' and '–' or mtext['txt-or']
end
local function makeText(values, components, names, options, noUpper)
-- Return wikitext representing an age or duration.
local text = Collection.new()
local count = #values
local sep = names.sep or ''
for i, v in ipairs(values) do
-- v is a number (say 4 for 4 years), or a table ({4,5} for 4 or 5 years).
local islist = type(v) == 'table'
if (islist or v > 0) or (text.n == 0 and i == count) or (text.n > 0 and components.keepZero) then
local fmt, vstr
if options.spell then
fmt = function(number)
return spellNumber(number, options.spell, noUpper or i)
end
elseif i == 1 and options.format == 'format_commas' then
-- Numbers after the first should be small and not need formatting.
fmt = formatNumber
else
fmt = tostring
end
if islist then
vstr = fmt(v[1]) .. rangeJoin(options.range)
noUpper = true
vstr = vstr .. fmt(v[2])
else
vstr = fmt(v)
end
local name = names[components[i]]
if name then
if type(name) == 'table' then
name = mw.getContentLanguage():plural(islist and v[2] or v, name)
end
text:add(vstr .. sep .. name)
else
text:add(vstr)
end
end
end
local first, last
if options.join == 'sep_space' then
first = ' '
last = ' '
elseif options.join == 'sep_comma' then
first = ', '
last = ', '
elseif options.join == 'sep_serialcomma' and text.n > 2 then
first = ', '
last = mtext['txt-comma-and']
else
first = ', '
last = mtext['txt-and']
end
for i, v in ipairs(text) do
if i < text.n then
text[i] = v .. (i + 1 < text.n and first or last)
end
end
local sign = ''
if options.isnegative then
-- Do not display negative zero.
if text.n > 1 or (text.n == 1 and text[1]:sub(1, 1) ~= '0' ) then
if options.format == 'format_raw' then
sign = '-' -- plain hyphen so result can be used in a calculation
else
sign = '−' -- Unicode U+2212 MINUS SIGN
end
end
end
return
(options.sortKey or '') ..
(options.extra or '') ..
sign ..
text:join() ..
(options.suffix or '')
end
local function dateDifference(parms)
-- Return a formatted date difference using the given parameters
-- which have been validated.
local names = {
-- Each name is:
-- * a string if no plural form of the name is used; or
-- * a table of strings, one of which is selected using the rules at
-- https://translatewiki.net/wiki/Plural/Mediawiki_plural_rules
abbr_off = {
sep = ' ',
y = {'year', 'years'},
m = {'month', 'months'},
w = {'week', 'weeks'},
d = {'day', 'days'},
H = {'hour', 'hours'},
M = {'minute', 'minutes'},
S = {'second', 'seconds'},
},
abbr_on = {
y = 'y',
m = 'm',
w = 'w',
d = 'd',
H = 'h',
M = 'm',
S = 's',
},
abbr_infant = { -- for {{age for infant}}
sep = ' ',
y = {'yr', 'yrs'},
m = {'mo', 'mos'},
w = {'wk', 'wks'},
d = {'day', 'days'},
H = {'hr', 'hrs'},
M = {'min', 'mins'},
S = {'sec', 'secs'},
},
abbr_raw = {},
}
local diff = parms.diff -- must be a valid date difference
local show = parms.show -- may be nil; default is set below
local abbr = parms.abbr or 'abbr_off'
local defaultJoin
if abbr ~= 'abbr_off' then
defaultJoin = 'sep_space'
end
if not show then
show = 'ymd'
if parms.disp == 'disp_age' then
if diff.years < 3 then
defaultJoin = 'sep_space'
if diff.years >= 1 then
show = 'ym'
else
show = 'md'
end
else
show = 'y'
end
end
end
if type(show) ~= 'table' then
show = translateParameters.show[show]
end
if parms.disp == 'disp_raw' then
defaultJoin = 'sep_space'
abbr = 'abbr_raw'
elseif parms.wantSc then
defaultJoin = 'sep_serialcomma'
end
local diffOptions = {
round = parms.round,
duration = parms.wantDuration,
range = parms.range and true or nil,
}
local sortKey
if parms.sortable then
local value = diff.age_days + (parms.wantDuration and 1 or 0) -- days and fraction of a day
if diff.isnegative then
value = -value
end
sortKey = makeSort(value, parms.sortable)
end
local textOptions = {
extra = parms.extra,
format = parms.format,
join = parms.sep or defaultJoin,
isnegative = diff.isnegative,
range = parms.range,
sortKey = sortKey,
spell = parms.spell,
suffix = parms.suffix, -- not currently used
}
if show.id == 'hide' then
return sortKey or ''
end
local values = { diff:age(show.id, diffOptions) }
if values[1] then
return makeText(values, show, names[abbr], textOptions)
end
if diff.partial then
-- Handle a more complex range such as
-- {{age_yd|20 Dec 2001|2003|range=yes}} → 1 year, 12 days or 2 years, 11 days
local opt = {
format = textOptions.format,
join = textOptions.join,
isnegative = textOptions.isnegative,
spell = textOptions.spell,
}
return
(textOptions.sortKey or '') ..
makeText({ diff.partial.mindiff:age(show.id, diffOptions) }, show, names[abbr], opt) ..
rangeJoin(textOptions.range) ..
makeText({ diff.partial.maxdiff:age(show.id, diffOptions) }, show, names[abbr], opt, true) ..
(textOptions.suffix or '')
end
return message('mt-bad-show', show.id)
end
local function getDates(frame, getopt)
-- Parse template parameters and return one of:
-- * date (a date table, if single)
-- * date1, date2 (two date tables, if not single)
-- * text (a string error message)
-- A missing date is optionally replaced with the current date.
-- If wantMixture is true, a missing date component is replaced
-- from the current date, so can get a bizarre mixture of
-- specified/current y/m/d as has been done by some "age" templates.
-- Some results may be placed in table getopt.
local Date, currentDate = getExports(frame)
getopt = getopt or {}
local function flagCurrent(text)
-- This allows the calling template to detect if the current date has been used,
-- that is, whether both dates have been entered in a template expecting two.
-- For example, an infobox may want the age when an event occurred, not the current age.
-- Don't bother detecting if wantMixture is used because not needed and it is a poor option.
if not text then
if getopt.noMissing then
return nil -- this gives a nil date which gives an error
end
text = 'currentdate'
if getopt.flag == 'usesCurrent' then
getopt.usesCurrent = true
end
end
return text
end
local args = frame:getParent().args
local fields = {}
local isNamed = args.year or args.year1 or args.year2 or
args.month or args.month1 or args.month2 or
args.day or args.day1 or args.day2
if isNamed then
fields[1] = args.year1 or args.year
fields[2] = args.month1 or args.month
fields[3] = args.day1 or args.day
fields[4] = args.year2
fields[5] = args.month2
fields[6] = args.day2
else
for i = 1, 6 do
fields[i] = args[i]
end
end
local imax = 0
for i = 1, 6 do
fields[i] = stripToNil(fields[i])
if fields[i] then
imax = i
end
if getopt.omitZero and i % 3 ~= 1 then -- omit zero months and days as unknown values but keep year 0 which is 1 BCE
if isZero(fields[i]) then
fields[i] = nil
getopt.partial = true
end
end
end
local fix = getopt.fix and 'fix' or ''
local partialText = getopt.partial and 'partial' or ''
local dates = {}
if isNamed or imax >= 3 then
local nrDates = getopt.single and 1 or 2
if getopt.wantMixture then
-- Cannot be partial since empty fields are set from current.
local components = { 'year', 'month', 'day' }
for i = 1, nrDates * 3 do
fields[i] = fields[i] or currentDate[components[i > 3 and i - 3 or i]]
end
for i = 1, nrDates do
local index = i == 1 and 1 or 4
local y, m, d = fields[index], fields[index+1], fields[index+2]
if (m == 2 or m == '2') and (d == 29 or d == '29') then
-- Workaround error with following which attempt to use invalid date 2001-02-29.
-- {{age_ymwd|year1=2001|year2=2004|month2=2|day2=29}}
-- {{age_ymwd|year1=2001|month1=2|year2=2004|month2=1|day2=29}}
-- TODO Get rid of wantMixture because even this ugly code does not handle
-- 'Feb' or 'February' or 'feb' or 'february'.
if not ((y % 4 == 0 and y % 100 ~= 0) or y % 400 == 0) then
d = 28
end
end
dates[i] = Date(y, m, d)
end
else
-- If partial dates are allowed, accept
-- year only, or
-- year and month only
-- Do not accept year and day without a month because that makes no sense
-- (and because, for example, Date('partial', 2001, nil, 12) sets day = nil, not 12).
for i = 1, nrDates do
local index = i == 1 and 1 or 4
local y, m, d = fields[index], fields[index+1], fields[index+2]
if (getopt.partial and y and (m or not d)) or (y and m and d) then
dates[i] = Date(fix, partialText, y, m, d)
elseif not y and not m and not d then
dates[i] = Date(flagCurrent())
end
end
end
else
getopt.textdates = true -- have parsed each date from a single text field
dates[1] = Date(fix, partialText, flagCurrent(fields[1]))
if not getopt.single then
dates[2] = Date(fix, partialText, flagCurrent(fields[2]))
end
end
if not dates[1] then
return message(getopt.missing1 or 'mt-need-valid-ymd')
end
if getopt.textdates then
getopt.suppliedformat = dates[1].format
end
if getopt.single then
return dates[1]
end
if not dates[2] then
return message(getopt.missing2 or 'mt-need-valid-ymd2')
end
return dates[1], dates[2]
end
local function ageGeneric(frame)
-- Return the result required by the specified template.
-- Can use sortable=x where x = on/table/off/debug in any supported template.
-- Some templates default to sortable=on but can be overridden.
local name = frame.args.template
if not name then
return message('mt-template-x')
end
local args = frame:getParent().args
local specs = {
age_days = { -- {{age in days}}
show = 'd',
disp = 'disp_raw',
},
age_days_nts = { -- {{age in days nts}}
show = 'd',
disp = 'disp_raw',
format = 'format_commas',
sortable = 'on',
},
duration_days = { -- {{duration in days}}
show = 'd',
disp = 'disp_raw',
duration = true,
},
duration_days_nts = { -- {{duration in days nts}}
show = 'd',
disp = 'disp_raw',
format = 'format_commas',
sortable = 'on',
duration = true,
},
age_full_years = { -- {{age}}
show = 'y',
abbr = 'abbr_raw',
flag = 'usesCurrent',
omitZero = true,
range = 'dash',
},
age_full_years_nts = { -- {{age nts}}
show = 'y',
abbr = 'abbr_raw',
format = 'format_commas',
sortable = 'on',
},
age_in_years = { -- {{age in years}}
show = 'y',
abbr = 'abbr_raw',
negative = 'error',
range = 'dash',
},
age_in_years_nts = { -- {{age in years nts}}
show = 'y',
abbr = 'abbr_raw',
negative = 'error',
range = 'dash',
format = 'format_commas',
sortable = 'on',
},
age_infant = { -- {{age for infant}}
-- Do not set show because special processing is done later.
abbr = yes[args.abbr] and 'abbr_infant' or 'abbr_off',
disp = 'disp_age',
sep = 'sep_space',
sortable = 'on',
},
age_m = { -- {{age in months}}
show = 'm',
disp = 'disp_raw',
},
age_w = { -- {{age in weeks}}
show = 'w',
disp = 'disp_raw',
},
age_wd = { -- {{age in weeks and days}}
show = 'wd',
},
age_yd = { -- {{age in years and days}}
show = 'yd',
format = 'format_commas',
sep = args.sep ~= 'and' and 'sep_comma' or nil,
},
age_yd_nts = { -- {{age in years and days nts}}
show = 'yd',
format = 'format_commas',
sep = args.sep ~= 'and' and 'sep_comma' or nil,
sortable = 'on',
},
age_ym = { -- {{age in years and months}}
show = 'ym',
sep = 'sep_comma',
},
age_ymd = { -- {{age in years, months and days}}
show = 'ymd',
range = true,
},
age_ymwd = { -- {{age in years, months, weeks and days}}
show = 'ymwd',
wantMixture = true,
},
}
local spec = specs[name]
if not spec then
return message('mt-template-bad-name')
end
if name == 'age_days' then
local su = stripToNil(args['show unit'])
if su then
if su == 'abbr' or su == 'full' then
spec.disp = nil
spec.abbr = su == 'abbr' and 'abbr_on' or nil
end
end
end
local partial, autofill
local range = stripToNil(args.range) or spec.range
if range then
-- Suppose partial dates are used and age could be 11 or 12 years.
-- "|range=" (empty value) has no effect (spec is used).
-- "|range=yes" or spec.range == true sets range = true (gives "11 or 12")
-- "|range=dash" or spec.range == 'dash' sets range = 'dash' (gives "11–12").
-- "|range=no" or spec.range == 'no' sets range = nil and fills each date in the diff (gives "12").
-- ("on" is equivalent to "yes", and "off" is equivalent to "no").
-- "|range=OTHER" sets range = nil and rejects partial dates.
range = ({ dash = 'dash', off = 'no', no = 'no', [true] = true })[range] or yes[range]
if range then
partial = true -- accept partial dates with a possible age range for the result
if range == 'no' then
autofill = true -- missing month/day in first or second date are filled from other date or 1
range = nil
end
end
end
local getopt = {
fix = yes[args.fix],
flag = stripToNil(args.flag) or spec.flag,
omitZero = spec.omitZero,
partial = partial,
wantMixture = spec.wantMixture,
}
local date1, date2 = getDates(frame, getopt)
if type(date1) == 'string' then
return date1
end
local format = stripToNil(args.format)
local spell = spellOptions[format]
if format then
format = 'format_' .. format
elseif name == 'age_days' and getopt.textdates then
format = 'format_commas'
end
local parms = {
diff = date2:subtract(date1, { fill = autofill }),
wantDuration = spec.duration or yes[args.duration],
range = range,
wantSc = yes[args.sc],
show = args.show == 'hide' and 'hide' or spec.show,
abbr = spec.abbr,
disp = spec.disp,
extra = makeExtra(args, getopt.usesCurrent and format ~= 'format_raw'),
format = format or spec.format,
round = yes[args.round],
sep = spec.sep,
sortable = translateParameters.sortable[args.sortable or spec.sortable],
spell = spell,
}
if (spec.negative or frame.args.negative) == 'error' and parms.diff.isnegative then
return message('mt-date-wrong-order')
end
return from_en(dateDifference(parms))
end
local function isFake(args)
-- Some templates have TemplateData with an auto value like "{{Birth date and age|YYYY|MM|DD}}".
-- Return true if that appears to be the case so the caller can output nothing rather than an error.
return args[1] == 'YYYY'
end
local function bda(frame)
-- Implement [[Template:Birth date and age]].
local args = frame:getParent().args
if isFake(args) then
return ''
end
local options = {
missing1 = 'mt-need-valid-bd',
noMissing = true,
single = true,
}
local date = getDates(frame, options)
if type(date) == 'string' then
return date -- error text
end
local Date = getExports(frame)
local diff = Date('currentdate') - date
if diff.isnegative or diff.years > MAX_AGE then
return message('mt-invalid-bd-age')
end
local disp = mtext['txt-bda-disp']
local show = 'y'
if diff.years < 2 then
disp = 'disp_age'
if diff.years == 0 and diff.months == 0 then
show = 'd'
else
show = 'm'
end
end
local problem, format = dateFormat(args, options)
local result = substituteParameters(
mtext['txt-bda'],
date:text('%-Y-%m-%d'),
from_en(date:text(format)),
from_en(dateDifference({
diff = diff,
show = show,
abbr = 'abbr_off',
disp = disp,
sep = 'sep_space',
}))
) .. (problem or '')
local warnings = tonumber(frame.args.warnings)
if warnings and warnings > 0 then
local good = {
df = true,
mf = true,
day = true,
day1 = true,
month = true,
month1 = true,
year = true,
year1 = true,
}
local invalid
local imax = options.textdates and 1 or 3
for k, _ in pairs(args) do
if type(k) == 'number' then
if k > imax then
invalid = tostring(k)
break
end
else
if not good[k] then
invalid = k
break
end
end
end
if invalid then
result = result .. message('mt-warn-param1', invalid)
end
end
return result
end
local function dda(frame)
-- Implement [[Template:Death date and age]].
local args = frame:getParent().args
if isFake(args) then
return ''
end
local options = {
missing1 = 'mt-need-valid-dd',
missing2 = 'mt-need-valid-bd2',
noMissing = true,
partial = true,
}
local date1, date2 = getDates(frame, options)
if type(date1) == 'string' then
return date1
end
local diff = date1 - date2
if diff.isnegative then
return message('mt-dd-wrong-order')
end
local Date = getExports(frame)
local today = Date('currentdate') + 1 -- one day in future allows for timezones
if date1 > today then
return message('mt-dd-future')
end
local years
if diff.partial then
years = diff.partial.years
years = type(years) == 'table' and years[2] or years
else
years = diff.years
end
if years > MAX_AGE then
return message('mt-invalid-dates-age')
end
local fmt_date, fmt_ymd, problem
if date1.day then -- y, m, d known
problem, fmt_date = dateFormat(args, options)
fmt_ymd = '%-Y-%m-%d'
elseif date1.month then -- y, m known; d unknown
fmt_date = '%B %-Y'
fmt_ymd = '%-Y-%m-00'
else -- y known; m, d unknown
fmt_date = '%-Y'
fmt_ymd = '%-Y-00-00'
end
local sortKey
local sortable = translateParameters.sortable[args.sortable]
if sortable then
local value = (date1.partial and date1.partial.first or date1).jdz
sortKey = makeSort(value, sortable)
end
local result = (sortKey or '') .. substituteParameters(
mtext['txt-dda'],
date1:text(fmt_ymd),
from_en(date1:text(fmt_date)),
from_en(dateDifference({
diff = diff,
show = 'y',
abbr = 'abbr_off',
disp = mtext['txt-dda-disp'],
range = 'dash',
sep = 'sep_space',
}))
) .. (problem or '')
local warnings = tonumber(frame.args.warnings)
if warnings and warnings > 0 then
local good = {
df = true,
mf = true,
}
local invalid
local imax = options.textdates and 2 or 6
for k, _ in pairs(args) do
if type(k) == 'number' then
if k > imax then
invalid = tostring(k)
break
end
else
if not good[k] then
invalid = k
break
end
end
end
if invalid then
result = result .. message('mt-warn-param1', invalid)
end
end
return result
end
local function dateToGsd(frame)
-- Implement [[Template:Gregorian serial date]].
-- Return Gregorian serial date of the given date, or the current date.
-- The returned value is negative for dates before 1 January 1 AD
-- despite the fact that GSD is not defined for such dates.
local date = getDates(frame, { wantMixture=true, single=true })
if type(date) == 'string' then
return date
end
return tostring(date.gsd)
end
local function jdToDate(frame)
-- Return formatted date from a Julian date.
-- The result includes a time if the input includes a fraction.
-- The word 'Julian' is accepted for the Julian calendar.
local Date = getExports(frame)
local args = frame:getParent().args
local date = Date('juliandate', args[1], args[2])
if date then
return from_en(date:text())
end
return message('mt-need-jdn')
end
local function dateToJd(frame)
-- Return Julian date (a number) from a date which may include a time,
-- or the current date ('currentdate') or current date and time ('currentdatetime').
-- The word 'Julian' is accepted for the Julian calendar.
local Date = getExports(frame)
local args = frame:getParent().args
local date = Date(args[1], args[2], args[3], args[4], args[5], args[6], args[7])
if date then
return tostring(date.jd)
end
return message('mt-need-valid-ymd-current')
end
local function timeInterval(frame)
-- Implement [[Template:Time interval]].
-- There are two positional arguments: date1, date2.
-- The default for each is the current date and time.
-- Result is date2 - date1 formatted.
local Date = getExports(frame)
local args = frame:getParent().args
local parms = {
extra = makeExtra(args),
wantDuration = yes[args.duration],
range = yes[args.range] or (args.range == 'dash' and 'dash' or nil),
wantSc = yes[args.sc],
}
local fix = yes[args.fix] and 'fix' or ''
local date1 = Date(fix, 'partial', stripToNil(args[1]) or 'currentdatetime')
if not date1 then
return message('mt-invalid-start')
end
local date2 = Date(fix, 'partial', stripToNil(args[2]) or 'currentdatetime')
if not date2 then
return message('mt-invalid-end')
end
parms.diff = date2 - date1
for argname, translate in pairs(translateParameters) do
local parm = stripToNil(args[argname])
if parm then
parm = translate[parm]
if parm == nil then -- test for nil because false is a valid setting
return message('mt-bad-param2', argname, args[argname])
end
parms[argname] = parm
end
end
if parms.round then
local round = parms.round
local show = parms.show
if round ~= 'on' then
if show then
if show.id ~= round then
return message('mt-conflicting-show', args.show, args.round)
end
else
parms.show = translateParameters.show[round]
end
end
parms.round = true
end
return from_en(dateDifference(parms))
end
local function templateGeneric(frame)
-- Example: {{#invoke:age||template=age_days|1 Apr 1980|1 Apr 2080|format=raw}} → 36525
local name = frame.args.template
if not name then
return message('mt-template-x')
end
return ageGeneric(frame:newChild({title = mw.title.new(name, 10), args = frame.args}))
end
return {
age_generic = ageGeneric, -- can emulate several age templates
birth_date_and_age = bda, -- Template:Birth_date_and_age
death_date_and_age = dda, -- Template:Death_date_and_age
gsd = dateToGsd, -- Template:Gregorian_serial_date
extract = dateExtract, -- Template:Extract
jd_to_date = jdToDate, -- Template:?
JULIANDAY = dateToJd, -- Template:JULIANDAY
time_interval = timeInterval, -- Template:Time_interval
[''] = templateGeneric, -- same as age_generic, but can be invoked directly
}
5jfartpt852zyo065229cuu9b3q1sqo
Tempilet:Age
10
2712
33507
2021-02-06T06:09:01Z
en>Johnuniq
0
fix to not display confusing "0" on Template:Age per request
33507
wikitext
text/x-wiki
<includeonly>{{#invoke:age|age_generic|template=age_full_years}}</includeonly><noinclude>{{documentation}}</noinclude>
7ja0eus7qdx5cxy7ni0lo2ih7pb00lj
33508
33507
2026-11-11T22:09:04Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Age]]
33507
wikitext
text/x-wiki
<includeonly>{{#invoke:age|age_generic|template=age_full_years}}</includeonly><noinclude>{{documentation}}</noinclude>
7ja0eus7qdx5cxy7ni0lo2ih7pb00lj
Tempilet:Date-mf
10
2713
33509
2021-06-15T17:09:49Z
en>Frietjes
0
reduce complexity by using padleft: parserfunction directly
33509
wikitext
text/x-wiki
{{#ifeq:{{{test| }}}| ||{{{up-date}}}}}{{#if:{{{2|}}}|{{{2}}}|{{{1|}}}{{#ifeq:{{{BCE| }}}| ||BCE}}}}<!-- BELOW FOR hCalendar/vevent
--><span style="display:none"> (<span class="{{{class|dtstart}}} {{{class-extra|}}}">{{#ifeq:{{{ISO8601| }}}| |{{#ifeq:{{{BCE| }}}| ||-}}{{padleft:{{#expr:{{#time:Y|{{#ifeq:{{{class|dtend}}}|dtend|{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|3}}}}{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|1}}}}-3000 }}|4|0}}{{#time:{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|2}}|{{#ifeq:{{{class|dtend}}}|dtend|{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|3}}}}{{#titleparts:{{{up-date|/-m-d}}}|1|1}}}}{{#ifeq:{{{timezone| }}}| ||Z}}|{{{ISO8601|}}}}}</span>)</span><noinclude>
{{documentation}}
</noinclude>
0up47z3b5aifjx4toi38dpusqqch0d6
33510
33509
2026-11-11T22:09:04Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Date-mf]]
33509
wikitext
text/x-wiki
{{#ifeq:{{{test| }}}| ||{{{up-date}}}}}{{#if:{{{2|}}}|{{{2}}}|{{{1|}}}{{#ifeq:{{{BCE| }}}| ||BCE}}}}<!-- BELOW FOR hCalendar/vevent
--><span style="display:none"> (<span class="{{{class|dtstart}}} {{{class-extra|}}}">{{#ifeq:{{{ISO8601| }}}| |{{#ifeq:{{{BCE| }}}| ||-}}{{padleft:{{#expr:{{#time:Y|{{#ifeq:{{{class|dtend}}}|dtend|{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|3}}}}{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|1}}}}-3000 }}|4|0}}{{#time:{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|2}}|{{#ifeq:{{{class|dtend}}}|dtend|{{#titleparts:{{{up-date|/-m-d/+1 hour ,}}}|1|3}}}}{{#titleparts:{{{up-date|/-m-d}}}|1|1}}}}{{#ifeq:{{{timezone| }}}| ||Z}}|{{{ISO8601|}}}}}</span>)</span><noinclude>
{{documentation}}
</noinclude>
0up47z3b5aifjx4toi38dpusqqch0d6
Tempilet:Warning
10
2714
33511
2026-01-08T01:42:46Z
en>HouseBlaster
0
+{{[[TM:Editnotice EXPECTUNUSEDTEMPLATE|Editnotice EXPECTUNUSEDTEMPLATE]]}}
33511
wikitext
text/x-wiki
{{Mbox
| name = Warning
| demospace = {{{demospace|}}}
| style = {{#if:{{{style|}}} |{{{style}}} }}
| subst = <includeonly>{{subst:substcheck}}</includeonly>
| type = content
| image = {{#if:{{{image|}}}| [[File:{{{image}}}|{{{imagesize|40px}}}|Warning]] }}
| small = {{{small|}}}
| smallimage = {{#if:{{{image|}}}| [[File:{{{image}}}|30px|Warning]]}}
| imageright = {{#if:{{{imageright|}}} |{{{imageright}}} |{{#if:{{{shortcut|{{{shortcut1|}}}}}} |{{Ombox/shortcut|{{{shortcut|{{{shortcut1|}}}}}}|{{{shortcut2|}}}|{{{shortcut3|}}}|{{{shortcut4|}}}|{{{shortcut5|}}}}}}} }}
| textstyle = {{{textstyle|text-align: {{#if:{{{center|}}}|center|{{{align|left}}}}};}}}
| text = {{#if:{{{header|{{{heading|{{{title|}}}}}}}}} |<div style="{{{headstyle|text-align: {{#if:{{{center|}}}|center|left}};}}}">'''{{{header|{{{heading|{{{title|}}}}}}}}}'''</div>}}<!--
-->{{{text|{{{content|{{{reason|{{{1}}}}}}}}}}}}
}}{{Editnotice EXPECTUNUSEDTEMPLATE}}<noinclude>
<!-- Add categories to the /doc subpage; interwikis go to Wikidata. -->
{{Documentation}}
</noinclude>
qlfgcdm78oom27fkyum3vvodkp2mpjk
33512
33511
2026-11-11T22:09:04Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Warning]]
33511
wikitext
text/x-wiki
{{Mbox
| name = Warning
| demospace = {{{demospace|}}}
| style = {{#if:{{{style|}}} |{{{style}}} }}
| subst = <includeonly>{{subst:substcheck}}</includeonly>
| type = content
| image = {{#if:{{{image|}}}| [[File:{{{image}}}|{{{imagesize|40px}}}|Warning]] }}
| small = {{{small|}}}
| smallimage = {{#if:{{{image|}}}| [[File:{{{image}}}|30px|Warning]]}}
| imageright = {{#if:{{{imageright|}}} |{{{imageright}}} |{{#if:{{{shortcut|{{{shortcut1|}}}}}} |{{Ombox/shortcut|{{{shortcut|{{{shortcut1|}}}}}}|{{{shortcut2|}}}|{{{shortcut3|}}}|{{{shortcut4|}}}|{{{shortcut5|}}}}}}} }}
| textstyle = {{{textstyle|text-align: {{#if:{{{center|}}}|center|{{{align|left}}}}};}}}
| text = {{#if:{{{header|{{{heading|{{{title|}}}}}}}}} |<div style="{{{headstyle|text-align: {{#if:{{{center|}}}|center|left}};}}}">'''{{{header|{{{heading|{{{title|}}}}}}}}}'''</div>}}<!--
-->{{{text|{{{content|{{{reason|{{{1}}}}}}}}}}}}
}}{{Editnotice EXPECTUNUSEDTEMPLATE}}<noinclude>
<!-- Add categories to the /doc subpage; interwikis go to Wikidata. -->
{{Documentation}}
</noinclude>
qlfgcdm78oom27fkyum3vvodkp2mpjk
Tempilet:Tlp
10
2715
33513
2017-01-23T13:35:17Z
en>MSGJ
0
MSGJ moved page [[Template:Tlp]] to [[Template:Template link with parameters]]: expand name of template
33513
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with parameters]]
{{R from move}}
6l74hww4lk18kiq6ytyy69dsjvrnwju
33514
33513
2026-11-11T22:09:04Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tlp]]
33513
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with parameters]]
{{R from move}}
6l74hww4lk18kiq6ytyy69dsjvrnwju
Tempilet:Template link with parameters
10
2716
33515
2020-11-21T12:04:32Z
en>Primefac
0
33515
wikitext
text/x-wiki
<includeonly>{{#Invoke:Template link general|main|nowrap=yes}}</includeonly><noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlp}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
gt546e9yvffjmbtpahxkuxy5pg9coua
33516
33515
2026-11-11T22:09:04Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Template_link_with_parameters]]
33515
wikitext
text/x-wiki
<includeonly>{{#Invoke:Template link general|main|nowrap=yes}}</includeonly><noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlp}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
gt546e9yvffjmbtpahxkuxy5pg9coua
Tempilet:Template link with bold
10
2717
33517
2021-09-28T03:40:57Z
en>MusikBot II
0
Protected "[[Template:Template link with bold]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 464 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33517
wikitext
text/x-wiki
{{#Invoke:Template link general|main|bold=on}}<noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlb}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
n7m4iye4a3bll5v8ee1fe7fjm4w193m
33518
33517
2026-11-11T22:09:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Template_link_with_bold]]
33517
wikitext
text/x-wiki
{{#Invoke:Template link general|main|bold=on}}<noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlb}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
n7m4iye4a3bll5v8ee1fe7fjm4w193m
Tempilet:Tlb
10
2718
33519
2021-09-28T03:41:05Z
en>MusikBot II
0
Protected "[[Template:Tlb]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 463 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
33519
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with bold]]
{{Redirect category shell|
{{R from move}}
}}
914a40dvcixa43myb6gpqzvhlc5mk8g
33520
33519
2026-11-11T22:09:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tlb]]
33519
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with bold]]
{{Redirect category shell|
{{R from move}}
}}
914a40dvcixa43myb6gpqzvhlc5mk8g
Module:Transclusion count/data/B
828
2719
33521
2026-10-18T05:08:46Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
33521
Scribunto
text/plain
return {
["B-Class"] = 18000,
["BBC_Online"] = 3700,
["BBC_programme"] = 2700,
["BCGNIS"] = 2100,
["BDFA"] = 4000,
["BDFutbol"] = 8500,
["BEL"] = 9300,
["BGR"] = 6000,
["BIH"] = 4400,
["BLP"] = 1240000,
["BLP_no_footnotes"] = 3300,
["BLP_one_source"] = 11000,
["BLP_others"] = 15000,
["BLP_primary_sources"] = 6100,
["BLP_sources"] = 100000,
["BLP_sources_section"] = 3400,
["BLP_unreferenced"] = 7700,
["BLP_unreferenced_section"] = 7500,
["BLP_unsourced"] = 7600,
["BLR"] = 5300,
["BRA"] = 11000,
["BS_template"] = 3300,
["BSsplit"] = 15000,
["BSto"] = 7700,
["BUL"] = 5500,
["BWF.TournamentSoftware.com_profile"] = 2200,
["Babel"] = 45000,
["Background_color"] = 7000,
["Bad_JPEG"] = 2500,
["Ballotpedia"] = 2100,
["Bar_box"] = 9500,
["Bar_percent"] = 9300,
["Barrington_Atlas"] = 2100,
["Base_Mérimée"] = 2600,
["Baseball_navbox"] = 13000,
["Baseball_primary_link"] = 9000,
["Baseball_primary_style"] = 18000,
["Baseball_secondary_link"] = 7600,
["Baseball_secondary_style"] = 15000,
["Baseball_year"] = 13000,
["Baseballstats"] = 27000,
["Based_on"] = 32000,
["Basketball_color"] = 7200,
["Basketball_color_cell"] = 12000,
["Basketball_color_cell2"] = 5900,
["Basketball_current_roster"] = 2500,
["Basketball_kit"] = 3900,
["Basketball_primary_style"] = 2200,
["Basketball_roster_footer"] = 2100,
["Basketballbox"] = 5000,
["Basketballstats"] = 3700,
["Bcc"] = 2100,
["Before_and_after_year_navbox_links"] = 2500,
["Better_source"] = 2500,
["Better_source_needed"] = 28000,
["Better_source_requested"] = 4000,
["Bibleverse"] = 8000,
["Big"] = 330000,
["Bigger"] = 44000,
["BillboardURLbyName"] = 8900,
["Billie_Jean_King_Cup_player"] = 2100,
["BioRef"] = 4000,
["Bio_icon"] = 90000,
["Bio_icon2"] = 90000,
["Biographical_Directory_of_Congress"] = 10000,
["Bioguide"] = 3200,
["Biology_high_taxon_classification_navs"] = 2200,
["Birds_tasks"] = 33000,
["Birdsong"] = 2700,
["Birth-date"] = 4400,
["Birth-date_and_age"] = 7600,
["Birth_based_on_age_as_of_date"] = 8000,
["Birth_date"] = 481000,
["Birth_date_and_age"] = 809000,
["Birth_date_and_age2"] = 6800,
["Birth_date_and_age_text"] = 13000,
["Birth_date_text"] = 55000,
["Birth_year"] = 27000,
["Birth_year_and_age"] = 75000,
["Bk"] = 4200,
["Bkicon"] = 2600,
["Blanked_IP_talk"] = 8270000,
["Blist"] = 33000,
["Block_indent"] = 1110000,
["Block_indent/styles.css"] = 1110000,
["Blocked_and_tagged"] = 6100,
["Blocked_proxy"] = 19000,
["Blockedtaggedclosing"] = 3100,
["Blockquote"] = 217000,
["Blockquote/styles.css"] = 217000,
["Blue"] = 18000,
["Bnt"] = 5500,
["Bold_div"] = 3100,
["Border"] = 3300,
["Bot"] = 2100,
["Bot/messages"] = 2100,
["Bot/styles.css"] = 2100,
["BotApproved"] = 2400,
["BotTrial"] = 2500,
["Bot_trial"] = 2700,
["Botanist"] = 4900,
["Botanist/styles.css"] = 4900,
["Both"] = 1460000,
["Botop"] = 2300,
["Bots"] = 18000,
["Box"] = 271000,
["Box-footer"] = 6400,
["Box-header"] = 5600,
["Box-shadow_border"] = 123000,
["BoxRec"] = 5800,
["Boxbottom"] = 2600,
["Boxboxbottom"] = 17000,
["Boxboxtop"] = 19000,
["BoxingRecordSummary"] = 4300,
["Boxing_record_summary"] = 4300,
["Boxrec"] = 4500,
["Bq"] = 21000,
["Br"] = 15000,
["Br-separated_entries"] = 1550000,
["Br_list"] = 8400,
["Br_separated_entries"] = 1430000,
["Bracket"] = 2900,
["Break"] = 31000,
["British_English"] = 19000,
["Brldb_prim"] = 2200,
["Broken_anchor"] = 3300,
["Broken_anchors"] = 48000,
["Broken_ref"] = 64000,
["Broken_ref/cat"] = 8300,
["Broken_ref/lang"] = 64000,
["Broken_ref/styles.css"] = 55000,
["Bronze03"] = 18000,
["Bronze3"] = 44000,
["Bronze_medal"] = 7100,
["Bronze_medal_icon"] = 57000,
["Bs_position"] = 2200,
["Btc"] = 2600,
["Buddhism_topics"] = 2200,
["Bulleted_list"] = 280000,
["Bus_icon"] = 3800,
["Busy"] = 3000,
["Butt-Stations"] = 2600,
["Button"] = 48000,
["By"] = 4100,
["By_whom"] = 6500,
["Module:Babel"] = 45000,
["Module:Banner_shell"] = 12100000,
["Module:Banner_shell/config"] = 12100000,
["Module:Banner_shell/styles.css"] = 12100000,
["Module:BaseConvert"] = 38000,
["Module:Based_on"] = 32000,
["Module:Bibleverse"] = 8000,
["Module:Birth_based_on_age_as_of_dates"] = 8000,
["Module:Box-header"] = 5900,
["Module:Box-header/colours"] = 5900,
["Module:Box-header/styles.css"] = 5900,
["Module:British_regnal_year"] = 2600,
["Module:British_regnal_year/data"] = 2600,
["Module:Buffer"] = 2370000,
["Module:Build_bracket"] = 9500,
["Module:Build_bracket/Config"] = 9500,
["Module:Build_bracket/Helpers"] = 9500,
["Module:Build_bracket/Logic"] = 9500,
["Module:Build_bracket/Params"] = 9500,
["Module:Build_bracket/Paths"] = 9500,
["Module:Build_bracket/Render"] = 9500,
["Module:Build_bracket/StateChecks"] = 9500,
["Module:Build_bracket/styles.css"] = 9500,
}
0gct4neg2ofsb5ooyb0qovuczxnnwl1
33522
33521
2026-11-11T22:09:05Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/B]]
33521
Scribunto
text/plain
return {
["B-Class"] = 18000,
["BBC_Online"] = 3700,
["BBC_programme"] = 2700,
["BCGNIS"] = 2100,
["BDFA"] = 4000,
["BDFutbol"] = 8500,
["BEL"] = 9300,
["BGR"] = 6000,
["BIH"] = 4400,
["BLP"] = 1240000,
["BLP_no_footnotes"] = 3300,
["BLP_one_source"] = 11000,
["BLP_others"] = 15000,
["BLP_primary_sources"] = 6100,
["BLP_sources"] = 100000,
["BLP_sources_section"] = 3400,
["BLP_unreferenced"] = 7700,
["BLP_unreferenced_section"] = 7500,
["BLP_unsourced"] = 7600,
["BLR"] = 5300,
["BRA"] = 11000,
["BS_template"] = 3300,
["BSsplit"] = 15000,
["BSto"] = 7700,
["BUL"] = 5500,
["BWF.TournamentSoftware.com_profile"] = 2200,
["Babel"] = 45000,
["Background_color"] = 7000,
["Bad_JPEG"] = 2500,
["Ballotpedia"] = 2100,
["Bar_box"] = 9500,
["Bar_percent"] = 9300,
["Barrington_Atlas"] = 2100,
["Base_Mérimée"] = 2600,
["Baseball_navbox"] = 13000,
["Baseball_primary_link"] = 9000,
["Baseball_primary_style"] = 18000,
["Baseball_secondary_link"] = 7600,
["Baseball_secondary_style"] = 15000,
["Baseball_year"] = 13000,
["Baseballstats"] = 27000,
["Based_on"] = 32000,
["Basketball_color"] = 7200,
["Basketball_color_cell"] = 12000,
["Basketball_color_cell2"] = 5900,
["Basketball_current_roster"] = 2500,
["Basketball_kit"] = 3900,
["Basketball_primary_style"] = 2200,
["Basketball_roster_footer"] = 2100,
["Basketballbox"] = 5000,
["Basketballstats"] = 3700,
["Bcc"] = 2100,
["Before_and_after_year_navbox_links"] = 2500,
["Better_source"] = 2500,
["Better_source_needed"] = 28000,
["Better_source_requested"] = 4000,
["Bibleverse"] = 8000,
["Big"] = 330000,
["Bigger"] = 44000,
["BillboardURLbyName"] = 8900,
["Billie_Jean_King_Cup_player"] = 2100,
["BioRef"] = 4000,
["Bio_icon"] = 90000,
["Bio_icon2"] = 90000,
["Biographical_Directory_of_Congress"] = 10000,
["Bioguide"] = 3200,
["Biology_high_taxon_classification_navs"] = 2200,
["Birds_tasks"] = 33000,
["Birdsong"] = 2700,
["Birth-date"] = 4400,
["Birth-date_and_age"] = 7600,
["Birth_based_on_age_as_of_date"] = 8000,
["Birth_date"] = 481000,
["Birth_date_and_age"] = 809000,
["Birth_date_and_age2"] = 6800,
["Birth_date_and_age_text"] = 13000,
["Birth_date_text"] = 55000,
["Birth_year"] = 27000,
["Birth_year_and_age"] = 75000,
["Bk"] = 4200,
["Bkicon"] = 2600,
["Blanked_IP_talk"] = 8270000,
["Blist"] = 33000,
["Block_indent"] = 1110000,
["Block_indent/styles.css"] = 1110000,
["Blocked_and_tagged"] = 6100,
["Blocked_proxy"] = 19000,
["Blockedtaggedclosing"] = 3100,
["Blockquote"] = 217000,
["Blockquote/styles.css"] = 217000,
["Blue"] = 18000,
["Bnt"] = 5500,
["Bold_div"] = 3100,
["Border"] = 3300,
["Bot"] = 2100,
["Bot/messages"] = 2100,
["Bot/styles.css"] = 2100,
["BotApproved"] = 2400,
["BotTrial"] = 2500,
["Bot_trial"] = 2700,
["Botanist"] = 4900,
["Botanist/styles.css"] = 4900,
["Both"] = 1460000,
["Botop"] = 2300,
["Bots"] = 18000,
["Box"] = 271000,
["Box-footer"] = 6400,
["Box-header"] = 5600,
["Box-shadow_border"] = 123000,
["BoxRec"] = 5800,
["Boxbottom"] = 2600,
["Boxboxbottom"] = 17000,
["Boxboxtop"] = 19000,
["BoxingRecordSummary"] = 4300,
["Boxing_record_summary"] = 4300,
["Boxrec"] = 4500,
["Bq"] = 21000,
["Br"] = 15000,
["Br-separated_entries"] = 1550000,
["Br_list"] = 8400,
["Br_separated_entries"] = 1430000,
["Bracket"] = 2900,
["Break"] = 31000,
["British_English"] = 19000,
["Brldb_prim"] = 2200,
["Broken_anchor"] = 3300,
["Broken_anchors"] = 48000,
["Broken_ref"] = 64000,
["Broken_ref/cat"] = 8300,
["Broken_ref/lang"] = 64000,
["Broken_ref/styles.css"] = 55000,
["Bronze03"] = 18000,
["Bronze3"] = 44000,
["Bronze_medal"] = 7100,
["Bronze_medal_icon"] = 57000,
["Bs_position"] = 2200,
["Btc"] = 2600,
["Buddhism_topics"] = 2200,
["Bulleted_list"] = 280000,
["Bus_icon"] = 3800,
["Busy"] = 3000,
["Butt-Stations"] = 2600,
["Button"] = 48000,
["By"] = 4100,
["By_whom"] = 6500,
["Module:Babel"] = 45000,
["Module:Banner_shell"] = 12100000,
["Module:Banner_shell/config"] = 12100000,
["Module:Banner_shell/styles.css"] = 12100000,
["Module:BaseConvert"] = 38000,
["Module:Based_on"] = 32000,
["Module:Bibleverse"] = 8000,
["Module:Birth_based_on_age_as_of_dates"] = 8000,
["Module:Box-header"] = 5900,
["Module:Box-header/colours"] = 5900,
["Module:Box-header/styles.css"] = 5900,
["Module:British_regnal_year"] = 2600,
["Module:British_regnal_year/data"] = 2600,
["Module:Buffer"] = 2370000,
["Module:Build_bracket"] = 9500,
["Module:Build_bracket/Config"] = 9500,
["Module:Build_bracket/Helpers"] = 9500,
["Module:Build_bracket/Logic"] = 9500,
["Module:Build_bracket/Params"] = 9500,
["Module:Build_bracket/Paths"] = 9500,
["Module:Build_bracket/Render"] = 9500,
["Module:Build_bracket/StateChecks"] = 9500,
["Module:Build_bracket/styles.css"] = 9500,
}
0gct4neg2ofsb5ooyb0qovuczxnnwl1
Tempilet:Birth date and age/doc
10
2720
33523
2026-10-03T02:32:57Z
en>Zyxw
0
/* TemplateData */ update label
33523
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE -->
{{Warning|Do '''NOT''' use this template when the exact date of birth is disputed or unknown; consider using {{tlp|Birth year and age}} instead.}}
{{High-use}}
{{Template shortcut|bda}}
{{Tracks Wikidata|P569}}
{{Lua|Module:Age|Module:Check for unknown parameters}}
The {{tlb|Birth date and age}} template is used to display a living person's date of birth and current age. Using this template instead of inserting a plain date allows the inclusion of hidden [[metadata]] about the birth date. This metadata can be read by web browsers, search engines, or other software tools for indexing or display purposes.
== Usage ==
This template is intended for an article about a living person. For a deceased person, use {{tlp|Birth date}} in combination with {{tlp|Death date and age}}.
; Basic syntax
<pre>
{{Birth date and age|YYYY|MM|DD}}
{{Birth date and age|YYYY|MM|DD|df=yes}}
</pre>
* `YYYY` – Year of birth
* `MM` – Month of birth
* `DD` – Day of birth
* `df=yes` (optional) – Formats the date in day–month–year order
; Unnamed parameters for year, month, day
: <code><nowiki>{{</nowiki>Birth date and age|''year of birth''|''month of birth''|''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
: <code><nowiki>{{</nowiki>bda|''year of birth''|''month of birth''|''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
; Named parameters for year, month, day
: <code><nowiki>{{</nowiki>Birth date and age|year=''year of birth''|month=''month of birth''|day=''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
: <code><nowiki>{{</nowiki>bda|year=''year of birth''|month=''month of birth''|day=''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
=== Additional parameters ===
The '''df''' (day first) and '''mf''' (month first) parameters indicate the intended date format to display. The appropriate parameter should be set to "y" or "yes" e.g. '''df=yes''' or '''mf=y'''.
The default output of this template is to display the month before the day. This default may not be appropriate for articles about people from parts of the world where the day precedes the month in a date. In such articles the parameter, "df", should be set to display the day before the month.
The parameter "mf", while not actually used by the template, will indicate that month first format is intended. Using these parameters can assist [[WP:BOT|bots]] or other automated processing to detect which date format is intended; leaving the format as default may lead an editor or bot to change the format to an unintended value.
Do not specify both "df" and "mf" parameters in the same use of the template, as these formats are mutually exclusive.
=== Error tracking ===
Some kinds of invalid input are tracked in [[:Category:Pages using age template with invalid date]].
Also see {{clc|Pages using birth date and age with unknown parameters}}.
=== hCard microformat ===
This template also returns the date, hidden by CSS, in the [[WP:ISO 8601|ISO 8601]] standard.<ref>{{cite web | date = April 7, 2013 | url = http://microformats.org/wiki/date-pattern | title = Date Design Pattern | website = Microformats Wiki}}</ref>
<ref>{{cite web | date = August 28, 2009 | url = http://microformats.org/wiki/hcalendar-issues-closed | title = hCalendar closed issues | website = Microformats Wiki}} Specifically rejects supporting the Julian calendar.</ref> For example:
: <code><nowiki>(<span class="bday">1993-02-24</span>)</nowiki></code>
Note: For the "foundation", "built" and similar set-up dates of companies, buildings etc., use {{tl|start date}} (this will work for year-only or month-year dates). Because the ISO 8601 standard requires the [[Gregorian calendar]], this template should not be used if the date is given in the [[Julian calendar]].
For further information, visit [[Wikipedia:WikiProject Microformats|the microformats project]].
=== Notes ===
* '''Do not use with non-Gregorian dates''' because the resulting hCard hidden date will be false.
* The template will appear broken when the parameters are left blank.
* When only the year of a person's birth is known, or if it is desired not to state a person's full dates of birth for privacy reasons, consider using the templates {{Tl|Birth year}} or {{Tl|Birth year and age}} instead.
* The age displayed is calculated when the page is last [[Wikipedia:Purge|purged]]. If the age appears incorrect, purge the page or save it without making any changes to update the calculation. Appending <code>&action=purge</code> to the URL will also refresh the age.
* For disputed or uncertain birth dates, use {{tlp|Birth year and age}} to avoid misleading information.
== Examples ==
; Unnamed parameters for year, month, day
: <code><nowiki>{{Birth date and age|1993|2|24}}</nowiki></code> returns "{{Birth date and age|1993|2|24}}"
: <code><nowiki>{{Birth date and age|1993|2|24|mf=yes}}</nowiki></code> returns "{{Birth date and age|1993|2|24|mf=yes}}"
: <code><nowiki>{{Birth date and age|1993|2|24|df=yes}}</nowiki></code> returns "{{Birth date and age|1993|2|24|df=yes}}"
; Named parameters for year, month, day
: <code><nowiki>{{Birth date and age|year=1993|month=2|day=24}}</nowiki></code> returns "{{Birth date and age|year=1993|month=2|day=24}}"
: <code><nowiki>{{Birth date and age|year=1993|month=2|day=24|mf=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=2|day=24|mf=yes}}"
: <code><nowiki>{{Birth date and age|year=1993|month=2|day=24|df=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=2|day=24|df=yes}}"
=== Using month name instead of number ===
The following examples use a parameter value that will not work in the {{tlp|Birth date}}, {{tlp|Death date}}, or {{tlp|Death date and age}} templates.
; Unnamed parameters for year, month name, day
: <code><nowiki>{{Birth date and age|1993|February|24}}</nowiki></code> returns "{{Birth date and age|1993|February|24}}"
: <code><nowiki>{{Birth date and age|1993|Feb|24|mf=yes}}</nowiki></code> returns "{{Birth date and age|1993|Feb|24|mf=yes}}"
: <code><nowiki>{{Birth date and age|1993|Feb|24|df=yes}}</nowiki></code> returns "{{Birth date and age|1993|Feb|24|df=yes}}"
; Named parameters for year, month name, day
: <code><nowiki>{{Birth date and age|year=1993|month=February|day=24}}</nowiki></code> returns "{{Birth date and age|year=1993|month=February|day=24}}"
: <code><nowiki>{{Birth date and age|year=1993|month=Feb|day=24|mf=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=Feb|day=24|mf=yes}}"
: <code><nowiki>{{Birth date and age|year=1993|month=Feb|day=24|df=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=Feb|day=24|df=yes}}"
=== Using full date in one parameter ===
The following examples use a parameter value that will not work in the {{tlp|Birth date}}, {{tlp|Death date}}, or {{tlp|Death date and age}} templates.
; Unnamed parameter for full date (output in MDY format)
: <code><nowiki>{{Birth date and age|February 24, 1993}}</nowiki></code> returns "{{Birth date and age|February 24, 1993}}"
: <code><nowiki>{{Birth date and age|1993-2-24}}</nowiki></code> returns "{{Birth date and age|1993-2-24}}"
: <code><nowiki>{{Birth date and age|24 Feb 1993|mf=y}}</nowiki></code> returns "{{Birth date and age|24 Feb 1993|mf=y}}"
; Unnamed parameter for full date (output in DMY format)
: <code><nowiki>{{Birth date and age|24 February 1993}}</nowiki></code> returns "{{Birth date and age|24 February 1993}}"
: <code><nowiki>{{Birth date and age|1993-2-24|df=y}}</nowiki></code> returns "{{Birth date and age|1993-2-24|df=y}}"
: <code><nowiki>{{Birth date and age|Feb 24, 1993|df=y}}</nowiki></code> returns "{{Birth date and age|Feb 24, 1993|df=y}}"
; Output compared to {{tlp|Birth date and age text}}
: <code><nowiki>{{Birth date and age|24 February 1993}}</nowiki></code> returns "{{Birth date and age|24 February 1993}}"
: <code><nowiki>{{Birth date and age text|24 February 1993}}</nowiki></code> returns "{{Birth date and age text|24 February 1993}}"
: <code><nowiki>{{Birth date and age|Feb 24, 1993}}</nowiki></code> returns "{{Birth date and age|Feb 24, 1993}}"
: <code><nowiki>{{Birth date and age text|Feb 24, 1993}}</nowiki></code> returns "{{Birth date and age text|Feb 24, 1993}}"
: <code><nowiki>{{Birth date and age|Feb. 24, 1993}}</nowiki></code> returns "{{Birth date and age|Feb. 24, 1993}}"
: <code><nowiki>{{Birth date and age text|Feb. 24, 1993}}</nowiki></code> returns "{{Birth date and age text|Feb. 24, 1993}}"
== TemplateData ==
{{TemplateDataHeader}}
<templatedata>
{
"description": "This template will return a living person's date of birth and age. Using this template rather than simply inserting the date into articles allows for the inclusion of hidden metadata about the date. This metadata can be used by web browsers and other software tools to extract the details, and display them using some other website or mapping tool, index, or search them.",
"params": {
"1": {
"label": "Year of birth or Date of birth",
"description": "The year in which the person was born. Parameter 1 may instead contain the date of birth (string), in which case the remaining parameters are not required (see examples).",
"type": "string",
"example": "1993 / February 24, 1993 / 24 February 1993",
"required": true,
"aliases": [
"year"
]
},
"2": {
"label": "Month of birth",
"description": "The month (number or string) in which the person was born. Parameter 2 is not required when using date of birth (string) in parameter 1 (see examples).",
"type": "string",
"example": "2 / Feb / February",
"required": true,
"aliases": [
"month"
]
},
"3": {
"label": "Day of birth",
"description": "The day (number) in which the person was born. Parameter 3 is not required when using date of birth (string) in parameter 1 (see examples).",
"type": "number",
"example": "24",
"required": true,
"aliases": [
"day"
]
},
"df": {
"label": "Day first",
"description": "When set to 'y' or 'yes', the date of birth is output in a DMY format. This is not required when using date of birth (string) in parameter 1, since template keeps whichever date format is used (see examples).",
"type": "line",
"required": false,
"suggestedvalues": [
"yes",
"y"
]
},
"mf": {
"label": "Month first",
"description": "When set to 'y' or 'yes', stresses that the default MDY date format is intended for the date of birth. This is not required when using date of birth (string) in parameter 1, since template keeps whichever date format is used (see examples).",
"type": "line",
"required": false,
"autovalue": "yes",
"suggestedvalues": [
"yes",
"y"
]
}
}
}
</templatedata>
== References ==
{{Reflist}}
== Tracking categories ==
* {{Category link with count|Pages using birth date and age with unknown parameters}}
* {{Category link with count|Date of birth not in Wikidata}}
* {{Category link with count|Articles without Wikidata item}}
== See also ==
* {{tl|Birth date and age text}}, formerly {{Tl|Birth-date and age}}, which accepts formats like "1 April 1990" or "April 1, 1990" and retains date format
* {{tl|Birth date}} or {{Tl|Birth date text}} for a deceased person
* {{tl|Birth year and age}} for year of birth, with optional parameter for month (for approximate or disputed birth dates)
* {{tl|Death date and age}} – Displays the date of death and age at death for deceased persons
* {{tl|Recent birth}} or {{tl|Recent death}}
* {{tl|Birth based on age as of date}} for approximate year of birth, when exact date of birth is unsourced
{{Birth, death and age templates}}
<includeonly>{{sandbox other||
<!----- CATEGORIES BELOW THIS LINE, PLEASE: ----->
[[Category:Date mathematics templates]]
[[Category:Templates generating microformat date and age]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
pya1aupfgwmlywwh0b33g6s6tj5h4cy
33524
33523
2026-11-11T22:09:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Birth_date_and_age/doc]]
33523
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- PLEASE ADD CATEGORIES WHERE INDICATED AT THE BOTTOM OF THIS PAGE -->
{{Warning|Do '''NOT''' use this template when the exact date of birth is disputed or unknown; consider using {{tlp|Birth year and age}} instead.}}
{{High-use}}
{{Template shortcut|bda}}
{{Tracks Wikidata|P569}}
{{Lua|Module:Age|Module:Check for unknown parameters}}
The {{tlb|Birth date and age}} template is used to display a living person's date of birth and current age. Using this template instead of inserting a plain date allows the inclusion of hidden [[metadata]] about the birth date. This metadata can be read by web browsers, search engines, or other software tools for indexing or display purposes.
== Usage ==
This template is intended for an article about a living person. For a deceased person, use {{tlp|Birth date}} in combination with {{tlp|Death date and age}}.
; Basic syntax
<pre>
{{Birth date and age|YYYY|MM|DD}}
{{Birth date and age|YYYY|MM|DD|df=yes}}
</pre>
* `YYYY` – Year of birth
* `MM` – Month of birth
* `DD` – Day of birth
* `df=yes` (optional) – Formats the date in day–month–year order
; Unnamed parameters for year, month, day
: <code><nowiki>{{</nowiki>Birth date and age|''year of birth''|''month of birth''|''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
: <code><nowiki>{{</nowiki>bda|''year of birth''|''month of birth''|''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
; Named parameters for year, month, day
: <code><nowiki>{{</nowiki>Birth date and age|year=''year of birth''|month=''month of birth''|day=''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
: <code><nowiki>{{</nowiki>bda|year=''year of birth''|month=''month of birth''|day=''day of birth''|''additional parameters''<nowiki>}}</nowiki></code>
=== Additional parameters ===
The '''df''' (day first) and '''mf''' (month first) parameters indicate the intended date format to display. The appropriate parameter should be set to "y" or "yes" e.g. '''df=yes''' or '''mf=y'''.
The default output of this template is to display the month before the day. This default may not be appropriate for articles about people from parts of the world where the day precedes the month in a date. In such articles the parameter, "df", should be set to display the day before the month.
The parameter "mf", while not actually used by the template, will indicate that month first format is intended. Using these parameters can assist [[WP:BOT|bots]] or other automated processing to detect which date format is intended; leaving the format as default may lead an editor or bot to change the format to an unintended value.
Do not specify both "df" and "mf" parameters in the same use of the template, as these formats are mutually exclusive.
=== Error tracking ===
Some kinds of invalid input are tracked in [[:Category:Pages using age template with invalid date]].
Also see {{clc|Pages using birth date and age with unknown parameters}}.
=== hCard microformat ===
This template also returns the date, hidden by CSS, in the [[WP:ISO 8601|ISO 8601]] standard.<ref>{{cite web | date = April 7, 2013 | url = http://microformats.org/wiki/date-pattern | title = Date Design Pattern | website = Microformats Wiki}}</ref>
<ref>{{cite web | date = August 28, 2009 | url = http://microformats.org/wiki/hcalendar-issues-closed | title = hCalendar closed issues | website = Microformats Wiki}} Specifically rejects supporting the Julian calendar.</ref> For example:
: <code><nowiki>(<span class="bday">1993-02-24</span>)</nowiki></code>
Note: For the "foundation", "built" and similar set-up dates of companies, buildings etc., use {{tl|start date}} (this will work for year-only or month-year dates). Because the ISO 8601 standard requires the [[Gregorian calendar]], this template should not be used if the date is given in the [[Julian calendar]].
For further information, visit [[Wikipedia:WikiProject Microformats|the microformats project]].
=== Notes ===
* '''Do not use with non-Gregorian dates''' because the resulting hCard hidden date will be false.
* The template will appear broken when the parameters are left blank.
* When only the year of a person's birth is known, or if it is desired not to state a person's full dates of birth for privacy reasons, consider using the templates {{Tl|Birth year}} or {{Tl|Birth year and age}} instead.
* The age displayed is calculated when the page is last [[Wikipedia:Purge|purged]]. If the age appears incorrect, purge the page or save it without making any changes to update the calculation. Appending <code>&action=purge</code> to the URL will also refresh the age.
* For disputed or uncertain birth dates, use {{tlp|Birth year and age}} to avoid misleading information.
== Examples ==
; Unnamed parameters for year, month, day
: <code><nowiki>{{Birth date and age|1993|2|24}}</nowiki></code> returns "{{Birth date and age|1993|2|24}}"
: <code><nowiki>{{Birth date and age|1993|2|24|mf=yes}}</nowiki></code> returns "{{Birth date and age|1993|2|24|mf=yes}}"
: <code><nowiki>{{Birth date and age|1993|2|24|df=yes}}</nowiki></code> returns "{{Birth date and age|1993|2|24|df=yes}}"
; Named parameters for year, month, day
: <code><nowiki>{{Birth date and age|year=1993|month=2|day=24}}</nowiki></code> returns "{{Birth date and age|year=1993|month=2|day=24}}"
: <code><nowiki>{{Birth date and age|year=1993|month=2|day=24|mf=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=2|day=24|mf=yes}}"
: <code><nowiki>{{Birth date and age|year=1993|month=2|day=24|df=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=2|day=24|df=yes}}"
=== Using month name instead of number ===
The following examples use a parameter value that will not work in the {{tlp|Birth date}}, {{tlp|Death date}}, or {{tlp|Death date and age}} templates.
; Unnamed parameters for year, month name, day
: <code><nowiki>{{Birth date and age|1993|February|24}}</nowiki></code> returns "{{Birth date and age|1993|February|24}}"
: <code><nowiki>{{Birth date and age|1993|Feb|24|mf=yes}}</nowiki></code> returns "{{Birth date and age|1993|Feb|24|mf=yes}}"
: <code><nowiki>{{Birth date and age|1993|Feb|24|df=yes}}</nowiki></code> returns "{{Birth date and age|1993|Feb|24|df=yes}}"
; Named parameters for year, month name, day
: <code><nowiki>{{Birth date and age|year=1993|month=February|day=24}}</nowiki></code> returns "{{Birth date and age|year=1993|month=February|day=24}}"
: <code><nowiki>{{Birth date and age|year=1993|month=Feb|day=24|mf=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=Feb|day=24|mf=yes}}"
: <code><nowiki>{{Birth date and age|year=1993|month=Feb|day=24|df=yes}}</nowiki></code> returns "{{Birth date and age|year=1993|month=Feb|day=24|df=yes}}"
=== Using full date in one parameter ===
The following examples use a parameter value that will not work in the {{tlp|Birth date}}, {{tlp|Death date}}, or {{tlp|Death date and age}} templates.
; Unnamed parameter for full date (output in MDY format)
: <code><nowiki>{{Birth date and age|February 24, 1993}}</nowiki></code> returns "{{Birth date and age|February 24, 1993}}"
: <code><nowiki>{{Birth date and age|1993-2-24}}</nowiki></code> returns "{{Birth date and age|1993-2-24}}"
: <code><nowiki>{{Birth date and age|24 Feb 1993|mf=y}}</nowiki></code> returns "{{Birth date and age|24 Feb 1993|mf=y}}"
; Unnamed parameter for full date (output in DMY format)
: <code><nowiki>{{Birth date and age|24 February 1993}}</nowiki></code> returns "{{Birth date and age|24 February 1993}}"
: <code><nowiki>{{Birth date and age|1993-2-24|df=y}}</nowiki></code> returns "{{Birth date and age|1993-2-24|df=y}}"
: <code><nowiki>{{Birth date and age|Feb 24, 1993|df=y}}</nowiki></code> returns "{{Birth date and age|Feb 24, 1993|df=y}}"
; Output compared to {{tlp|Birth date and age text}}
: <code><nowiki>{{Birth date and age|24 February 1993}}</nowiki></code> returns "{{Birth date and age|24 February 1993}}"
: <code><nowiki>{{Birth date and age text|24 February 1993}}</nowiki></code> returns "{{Birth date and age text|24 February 1993}}"
: <code><nowiki>{{Birth date and age|Feb 24, 1993}}</nowiki></code> returns "{{Birth date and age|Feb 24, 1993}}"
: <code><nowiki>{{Birth date and age text|Feb 24, 1993}}</nowiki></code> returns "{{Birth date and age text|Feb 24, 1993}}"
: <code><nowiki>{{Birth date and age|Feb. 24, 1993}}</nowiki></code> returns "{{Birth date and age|Feb. 24, 1993}}"
: <code><nowiki>{{Birth date and age text|Feb. 24, 1993}}</nowiki></code> returns "{{Birth date and age text|Feb. 24, 1993}}"
== TemplateData ==
{{TemplateDataHeader}}
<templatedata>
{
"description": "This template will return a living person's date of birth and age. Using this template rather than simply inserting the date into articles allows for the inclusion of hidden metadata about the date. This metadata can be used by web browsers and other software tools to extract the details, and display them using some other website or mapping tool, index, or search them.",
"params": {
"1": {
"label": "Year of birth or Date of birth",
"description": "The year in which the person was born. Parameter 1 may instead contain the date of birth (string), in which case the remaining parameters are not required (see examples).",
"type": "string",
"example": "1993 / February 24, 1993 / 24 February 1993",
"required": true,
"aliases": [
"year"
]
},
"2": {
"label": "Month of birth",
"description": "The month (number or string) in which the person was born. Parameter 2 is not required when using date of birth (string) in parameter 1 (see examples).",
"type": "string",
"example": "2 / Feb / February",
"required": true,
"aliases": [
"month"
]
},
"3": {
"label": "Day of birth",
"description": "The day (number) in which the person was born. Parameter 3 is not required when using date of birth (string) in parameter 1 (see examples).",
"type": "number",
"example": "24",
"required": true,
"aliases": [
"day"
]
},
"df": {
"label": "Day first",
"description": "When set to 'y' or 'yes', the date of birth is output in a DMY format. This is not required when using date of birth (string) in parameter 1, since template keeps whichever date format is used (see examples).",
"type": "line",
"required": false,
"suggestedvalues": [
"yes",
"y"
]
},
"mf": {
"label": "Month first",
"description": "When set to 'y' or 'yes', stresses that the default MDY date format is intended for the date of birth. This is not required when using date of birth (string) in parameter 1, since template keeps whichever date format is used (see examples).",
"type": "line",
"required": false,
"autovalue": "yes",
"suggestedvalues": [
"yes",
"y"
]
}
}
}
</templatedata>
== References ==
{{Reflist}}
== Tracking categories ==
* {{Category link with count|Pages using birth date and age with unknown parameters}}
* {{Category link with count|Date of birth not in Wikidata}}
* {{Category link with count|Articles without Wikidata item}}
== See also ==
* {{tl|Birth date and age text}}, formerly {{Tl|Birth-date and age}}, which accepts formats like "1 April 1990" or "April 1, 1990" and retains date format
* {{tl|Birth date}} or {{Tl|Birth date text}} for a deceased person
* {{tl|Birth year and age}} for year of birth, with optional parameter for month (for approximate or disputed birth dates)
* {{tl|Death date and age}} – Displays the date of death and age at death for deceased persons
* {{tl|Recent birth}} or {{tl|Recent death}}
* {{tl|Birth based on age as of date}} for approximate year of birth, when exact date of birth is unsourced
{{Birth, death and age templates}}
<includeonly>{{sandbox other||
<!----- CATEGORIES BELOW THIS LINE, PLEASE: ----->
[[Category:Date mathematics templates]]
[[Category:Templates generating microformat date and age]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
pya1aupfgwmlywwh0b33g6s6tj5h4cy
Tempilet:Birth date text
10
2721
33525
2025-03-13T14:59:38Z
en>Gonnym
0
update unknown checking
33525
wikitext
text/x-wiki
{{#iferror:<span style="display:none">{{#time: Y|{{{1|0009-11}}}}}</span>|Not recognized as a date. Years must have 4 digits (use leading zeros for years < 1000).|{{#iferror:{{Date-mf|{{#ifeq:{{{1| }}}| |{{{ISO8601|{{{dt|}}}}}}|{{{1|}}}}}|{{{2|{{{display|}}}}}}|timezone={{{timezone|{{{tz|}}}}}}
|up-date={{#ifeq:"{{lc:{{{1|0009-11}}}}}"|"{{padleft:{{#expr:{{{1|0009-11}}}}}|4|0}}"|<!--Here if Test1 satisfied: see talk -->{{#time:Y|{{#expr:{{{1|0009-11}}}+3000}}}}//{{#if:{{{BCE|{{{BC|}}}}}}|-1 year, |+1 year, }}|{{#iferror:{{#ifexpr:((abs({{{1|0009-11}}}))< 1900) and ({{#time:Y|{{{1|0009-11}}}}} >1900) | {{#ifexpr:({{#time:Y|{{{1|0009-11}}}}}) <2000|{{#expr:{{#time:Y|{{{1|0009-11}}}}}+1100}}|{{#expr:{{#time:Y|{{{1|0009-11}}}}}+1000}} }} |{{#expr:{{#time:Y|{{{1|0009-11}}}}}+3000}}}}|{{#expr:{{#time:Y|{{{1|0009-11}}}}}+3000}}}}<!--done with year -->{{#ifeq:{{#time:d H:i:s|{{{1|0009-11}}} }}|{{#iferror:{{#ifexpr:{{{1|0009-11}}}|{{#time:d}}}}|01}} 00:00:00|{{#time:-m|{{{1|0009-11}}}}}/-m/+1 month, |{{#ifeq:{{#time:H:i:s|{{{1|0009-11}}}}}|00:00:00|{{#time:-m-d|{{{1|0009-11}}}}}/-m-d/+1 day, |{{#ifeq:{{#time:i:s|{{{1|0009-11}}}}}|00:00|{{#time:-m-d H:00|{{{1|0009-11}}}}}/-m-dTH/+1 hour, |{{#ifeq:{{#time:s|{{{1|0009-11}}}}}|00|{{#time:-m-d H:i|{{{1|0009-11}}}}}/-m-dTH:i/+1 minute, |{{#time:-m-d H:i:s|{{{1|0009-11}}}}}/-m-dTH:i:s/+1 second, }}}}}}}}}}
|BCE={{{BCE|{{{BC|}}}}}}
|ISO8601={{{ISO8601|{{{dt|}}}}}}
|class-extra={{{class-extra|}}} bday<!-- random extra classes to add eg:bday updated -->
|class=dtstart
|test={{{test|}}}
}}|Did not recognize date. Try slightly modifying the date in the first parameter.}}
}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using Birth date text with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Birth date text]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | BC | BCE | class-extra | display | dt | ISO8601 | test | timezone | tz }}<!--
-->{{#ifeq: {{NAMESPACENUMBER}} | 0
| {{#if: {{#invoke:wd|label|raw}}
| {{#if: {{#invoke:String|match|{{#invoke:wd|properties|raw|P31}},|Q5,|1|1|true|}}
| {{#if: {{#invoke:wd|properties|raw|P569}}
|
| [[Category:Date of birth not in Wikidata]]
}}
}}
| [[Category:Articles without Wikidata item]]
}}
}}<noinclude>
{{Documentation|Template:Start date text/doc}}
</noinclude>
a3l6s0xst4gswfoxzktpueluj1eeg3p
33526
33525
2026-11-11T22:09:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Birth_date_text]]
33525
wikitext
text/x-wiki
{{#iferror:<span style="display:none">{{#time: Y|{{{1|0009-11}}}}}</span>|Not recognized as a date. Years must have 4 digits (use leading zeros for years < 1000).|{{#iferror:{{Date-mf|{{#ifeq:{{{1| }}}| |{{{ISO8601|{{{dt|}}}}}}|{{{1|}}}}}|{{{2|{{{display|}}}}}}|timezone={{{timezone|{{{tz|}}}}}}
|up-date={{#ifeq:"{{lc:{{{1|0009-11}}}}}"|"{{padleft:{{#expr:{{{1|0009-11}}}}}|4|0}}"|<!--Here if Test1 satisfied: see talk -->{{#time:Y|{{#expr:{{{1|0009-11}}}+3000}}}}//{{#if:{{{BCE|{{{BC|}}}}}}|-1 year, |+1 year, }}|{{#iferror:{{#ifexpr:((abs({{{1|0009-11}}}))< 1900) and ({{#time:Y|{{{1|0009-11}}}}} >1900) | {{#ifexpr:({{#time:Y|{{{1|0009-11}}}}}) <2000|{{#expr:{{#time:Y|{{{1|0009-11}}}}}+1100}}|{{#expr:{{#time:Y|{{{1|0009-11}}}}}+1000}} }} |{{#expr:{{#time:Y|{{{1|0009-11}}}}}+3000}}}}|{{#expr:{{#time:Y|{{{1|0009-11}}}}}+3000}}}}<!--done with year -->{{#ifeq:{{#time:d H:i:s|{{{1|0009-11}}} }}|{{#iferror:{{#ifexpr:{{{1|0009-11}}}|{{#time:d}}}}|01}} 00:00:00|{{#time:-m|{{{1|0009-11}}}}}/-m/+1 month, |{{#ifeq:{{#time:H:i:s|{{{1|0009-11}}}}}|00:00:00|{{#time:-m-d|{{{1|0009-11}}}}}/-m-d/+1 day, |{{#ifeq:{{#time:i:s|{{{1|0009-11}}}}}|00:00|{{#time:-m-d H:00|{{{1|0009-11}}}}}/-m-dTH/+1 hour, |{{#ifeq:{{#time:s|{{{1|0009-11}}}}}|00|{{#time:-m-d H:i|{{{1|0009-11}}}}}/-m-dTH:i/+1 minute, |{{#time:-m-d H:i:s|{{{1|0009-11}}}}}/-m-dTH:i:s/+1 second, }}}}}}}}}}
|BCE={{{BCE|{{{BC|}}}}}}
|ISO8601={{{ISO8601|{{{dt|}}}}}}
|class-extra={{{class-extra|}}} bday<!-- random extra classes to add eg:bday updated -->
|class=dtstart
|test={{{test|}}}
}}|Did not recognize date. Try slightly modifying the date in the first parameter.}}
}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using Birth date text with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Birth date text]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | BC | BCE | class-extra | display | dt | ISO8601 | test | timezone | tz }}<!--
-->{{#ifeq: {{NAMESPACENUMBER}} | 0
| {{#if: {{#invoke:wd|label|raw}}
| {{#if: {{#invoke:String|match|{{#invoke:wd|properties|raw|P31}},|Q5,|1|1|true|}}
| {{#if: {{#invoke:wd|properties|raw|P569}}
|
| [[Category:Date of birth not in Wikidata]]
}}
}}
| [[Category:Articles without Wikidata item]]
}}
}}<noinclude>
{{Documentation|Template:Start date text/doc}}
</noinclude>
a3l6s0xst4gswfoxzktpueluj1eeg3p
Tempilet:Birth date and age text
10
2722
33527
2025-09-02T21:58:24Z
en>Fayenatic london
0
update category link
33527
wikitext
text/x-wiki
<includeonly>{{Birth date text|dt={{{dt|}}}|{{{gregorian|{{{1|}}}}}}|{{{2|{{{1|}}}}}}}} (age {{Age|{{#ifeq:"{{lc:{{{1|0009-11}}}}}"|"{{padleft:{{#expr:{{{1|0009-11}}}}}|4|0}}"|<!--Here if it is a 4 digit year only-Test1 satisfied: see talk -->{{{1|0009-11}}}|{{#expr: {{#iferror:{{#ifexpr:((abs({{{1|0009-11}}}))< 1900) and ({{#time:Y|{{{1|0009-11}}}}} >1900) | {{#ifexpr:({{#time:Y|{{{1|0009-11}}}}}) <2000|{{#expr:{{#time:Y|{{{1|0009-11}}}}}-1900}}|{{#expr:{{#time:Y|{{{1|0009-11}}}}}-2000}} }} |{{#time:Y|{{{1|0009-11}}}}} }}|{{#time:Y|{{{1|0009-11}}}}} }}{{#switch:{{{bce|}}}|b|bd|d|db=*(-1) +1}}}} }}|{{#time:m|{{{1|}}}}}|{{#time:d|{{{1|}}}}} }})<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using Birth date and age text with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Birth-date and age]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | bce | dt | gregorian }}</includeonly><noinclude>
{{documentation}}
</noinclude>
8uvmblxgjahrrsmxlhs4n1toxxt2qcd
33528
33527
2026-11-11T22:09:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Birth_date_and_age_text]]
33527
wikitext
text/x-wiki
<includeonly>{{Birth date text|dt={{{dt|}}}|{{{gregorian|{{{1|}}}}}}|{{{2|{{{1|}}}}}}}} (age {{Age|{{#ifeq:"{{lc:{{{1|0009-11}}}}}"|"{{padleft:{{#expr:{{{1|0009-11}}}}}|4|0}}"|<!--Here if it is a 4 digit year only-Test1 satisfied: see talk -->{{{1|0009-11}}}|{{#expr: {{#iferror:{{#ifexpr:((abs({{{1|0009-11}}}))< 1900) and ({{#time:Y|{{{1|0009-11}}}}} >1900) | {{#ifexpr:({{#time:Y|{{{1|0009-11}}}}}) <2000|{{#expr:{{#time:Y|{{{1|0009-11}}}}}-1900}}|{{#expr:{{#time:Y|{{{1|0009-11}}}}}-2000}} }} |{{#time:Y|{{{1|0009-11}}}}} }}|{{#time:Y|{{{1|0009-11}}}}} }}{{#switch:{{{bce|}}}|b|bd|d|db=*(-1) +1}}}} }}|{{#time:m|{{{1|}}}}}|{{#time:d|{{{1|}}}}} }})<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using Birth date and age text with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Birth-date and age]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | bce | dt | gregorian }}</includeonly><noinclude>
{{documentation}}
</noinclude>
8uvmblxgjahrrsmxlhs4n1toxxt2qcd
Adamawa
0
2723
33532
2026-11-11T22:12:05Z
RAPTOR7762
18
RAPTOR7762 moved page [[Adamawa]] to [[Jiha Adamawa]]
33532
wikitext
text/x-wiki
#REDIRECT [[Jiha Adamawa]]
0n0967ynqzuom72rtf94mt57g9o6ju3
Tempilet:Infobox civil conflict
10
2724
33535
2026-10-08T16:48:19Z
en>Pondering my orb
0
/* */ Removed pluralization from deaths parameter.
33535
wikitext
text/x-wiki
<includeonly>{{#if:{{{campaign_box|}}}|{{stack begin|clear=true}}}}{{#invoke:infobox|infoboxTemplate
| child = {{{child|}}}
| subbox = {{{subbox|}}}
| bodyclass = vevent
| bodystyle = width:25.5em;border-spacing: 2px;
| abovestyle = background-color:#CEE0F2;color:inherit;text-align:center;vertical-align:middle;font-size:110%;
| aboveclass = summary
| above = {{if empty | {{{name|}}} | {{#ifeq:{{{child|}}}|yes||{{PAGENAMEBASE}}}} }}
| autoheaders = y
| headerstyle = background-color:#CEE0F2;color:inherit;
| subheaderstyle = background-color:#eeeeee;color:inherit;text-align:center;vertical-align:middle;
| subheader = {{br separated entries
|{{{subtitle|}}}
|{{#if:{{{part_of|}}}|Part of {{{part_of|}}}}}
}}
| image = {{#invoke:InfoboxImage|InfoboxImage |image={{{image|}}} |size={{{image_size|}}} |sizedefault=frameless |upright={{if empty|{{{image_upright|}}}|1.15}} |alt={{{alt|}}} |border={{if empty|{{{border|}}}|no}} }}
| imagestyle = text-align: center; border-bottom: 1px solid #aaa; line-height: 1.5em;
| captionstyle = padding:0.35em 0.35em 0.25em;line-height:1.25em;
| caption = {{{caption|}}}
| labelstyle = white-space:nowrap;padding-right:0.65em<!--(to ensure gap between any long/nonwrapped label and subsequent data on same line-->;
| datastyle = line-height:1.3em;
| label1 = Date
| data1 = {{#invoke:WikidataIB|getValue|P585|name=date|suppressfields={{{suppressfields|}}}|fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}}|onlysourced={{{onlysourced|}}}|{{{date|}}} {{#if:{{{time|}}}|<br/>{{{time}}}}}{{#if:{{{time_begin|}}}|<br/>{{{time_begin|}}} – {{{time_end|}}}}} {{#if:{{{timezone|}}}|({{{timezone}}})}} }}
| label2 = Location
| data2 = {{#invoke:WikidataIB|getValue|P276|name=location|suppressfields={{{suppressfields|}}}|fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}}|onlysourced={{{onlysourced|}}}|{{br separated entries
| 1= {{#if:{{{location|}}}|<div style="display:inline;" class="location">{{{location|}}}</div>}}
| 2 = {{{coordinates|}}}
}} }}
| label3 = Caused by
| data3 = {{{causes|}}}
| label4 = Goals
| data4 = {{{goals|}}}
| label5 = Objectives
| data5 = {{{objectives|}}}
| label6 = Methods
| data6 = {{{methods|}}}
| label7 = Status
| data7 = {{{status|}}}
| label8 = Result
| data8 = {{{result|}}}
| label9 = Concessions
| data9 = {{{concessions|}}}
| header10 = Parties
| data11 = {{#if:{{{side1|}}}{{{side2|}}}{{{side3|}}}{{{side1a|}}}{{{side2a|}}}{{{side3a|}}}{{{side1b|}}}{{{side2b|}}}{{{side3b|}}}{{{side1c|}}}{{{side2c|}}}{{{side3c|}}}{{{side1d|}}}{{{side2d|}}}{{{side3d|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;">
{{#if:{{{side1|}}}{{{side2|}}}{{{side3|}}}|<tr>
<td style="{{#if:{{{side2|}}}{{{side3|}}}|width:{{#if:{{{side3|}}}|33%|50%}};}}"><div>
{{{side1|}}}</div></td>
{{#if:{{{side2|}}}|<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{side2}}}</div></td>}}
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{side3}}}</div></td>
}}</tr>
}}
{{#if:{{{side1a|}}}{{{side2a|}}}{{{side3a|}}}|<tr>
<td style="{{#if:{{{side2a|}}}{{{side3a|}}}|width:{{#if:{{{side3a|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1a|}}}</div></td>
{{#if:{{{side2a|}}}|<td style="width:{{#if:{{{side3a|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2a}}}</div></td>}}
{{#if:{{{side3a|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3a}}}</div></td>
}}</tr>
}}
{{#if:{{{side1b|}}}{{{side2b|}}}{{{side3b|}}}|<tr>
<td style="{{#if:{{{side2b|}}}{{{side3b|}}}|width:{{#if:{{{side3b|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1b|}}}</div></td>
{{#if:{{{side2b|}}}|<td style="width:{{#if:{{{side3b|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2b}}}</div></td>}}
{{#if:{{{side3b|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3b}}}</div></td>
}}</tr>
}}
{{#if:{{{side1c|}}}{{{side2c|}}}{{{side3c|}}}|<tr>
<td style="{{#if:{{{side2c|}}}{{{side3c|}}}|width:{{#if:{{{side3c|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1c|}}}</div></td>
{{#if:{{{side2c|}}}|<td style="width:{{#if:{{{side3c|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2c}}}</div></td>}}
{{#if:{{{side3c|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3c}}}</div></td>
}}</tr>
}}
{{#if:{{{side1d|}}}{{{side2d|}}}{{{side3d|}}}|<tr>
<td style="{{#if:{{{side2d|}}}|width:{{#if:{{{side3d|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1d|}}}</div></td>
{{#if:{{{side2d|}}}|<td style="width:{{#if:{{{side3d|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2d}}}</div></td>}}
{{#if:{{{side3d|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3d}}}</div></td>
}}</tr>
}}</table>}}
| header12 = Lead figures
| data13 = {{Infobox/Columns|{{{lead_figures1|}}}|{{{lead_figures2|}}}|{{{lead_figures3|}}} }}
| header14 = Units involved
| data15 = {{Infobox/Columns|{{{units1|}}}|{{{units2|}}}|{{{units3|}}} }}
| header16 = Number
| data17 = {{#if:{{{how_many1|}}}{{{how_many2|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;{{#if:{{{side3|}}}||{{#if:{{{how_many3|}}}|border-bottom:1px dotted #aaa}}}}"><tr>
<td style="width:{{#if:{{{side3|}}}|33%|50%}};"><div>
{{{how_many1|}}}</div></td>
<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{how_many2|}}}</div></td>
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{how_many3|}}}</div></td>
}}</tr></table>
}}
| data18 = {{#if:{{{side3|}}}||{{{how_many3|}}}}}
| header19 = Casualties and losses
| data20 = {{#if:{{{casualties1|}}}{{{casualties2|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;{{#if:{{{side3|}}}||{{#if:{{{casualties3|}}}|border-bottom:1px dotted #aaa}}}}"><tr>
<td style="{{#if:{{{side2|}}}{{{side3|}}}|width:{{#if:{{{side3|}}}|33%|50%}};}}"><div>
{{{casualties1|}}}</div></td>
<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{casualties2|}}}</div></td>
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{casualties3|}}}</div></td>
}}</tr></table>
}}
| data21 = {{#if:{{{side3|}}}||{{{casualties3|}}}}}
| header22 = {{if empty|{{{casualties_label|}}}| Casualties }}
| label23 = Deaths
| data23 = {{{fatalities|}}}
| label24 = Injuries
| data24 = {{{injuries|}}}
| label25 = Arrested
| data25 = {{{arrests|}}}
| label26 = Damage
| data26 = {{{damage|}}}
| label27 = {{longitem|Buildings destroyed}}
| data27 = {{{buildings|}}}
| label28 = [[Detention (imprisonment)|Detained]]
| data28 = {{{detentions|}}}
| label29 = [[Criminal charge|Charged]]
| data29 = {{{charged|}}}
| label30 = [[Fine (penalty)|Fined]]
| data30 = {{{fined|}}}
| label31 = {{{effect_label}}}
| data31 = {{{effect|}}}
| header32 = <nowiki />
| data33 = {{#if:{{{pushpin_map|}}}|
{{#if:{{{coordinates2|}}}|
{{Location map many|{{{pushpin_map|}}}
| width = {{if empty|{{{pushpin_map_size|}}}|220}}
| float = center
| border = infobox
| caption = {{{pushpin_caption|Location within {{#invoke:Location map|data|{{{pushpin_map|}}}|name}} }}}
| coordinates1 = {{{coordinates|}}} | label1 = {{{pushpin_label|}}}
| coordinates2 = {{{coordinates2|}}}| label2 = {{{pushpin_label2|}}}
{{#if:{{{coordinates3|}}} | {{!}} coordinates3 = {{{coordinates3|}}} {{!}} label3 = {{{pushpin_label3|}}} }}
{{#if:{{{coordinates4|}}} | {{!}} coordinates4 = {{{coordinates4|}}} {{!}} label4 = {{{pushpin_label4|}}} }}
{{#if:{{{coordinates5|}}} | {{!}} coordinates5 = {{{coordinates5|}}} {{!}} label6 = {{{pushpin_label5|}}} }}
{{#if:{{{coordinates6|}}} | {{!}} coordinates6 = {{{coordinates6|}}} {{!}} label7 = {{{pushpin_label6|}}} }}
{{#if:{{{coordinates7|}}} | {{!}} coordinates7 = {{{coordinates7|}}} {{!}} label8 = {{{pushpin_label7|}}} }}
{{#if:{{{coordinates8|}}} | {{!}} coordinates8 = {{{coordinates8|}}} {{!}} label9 = {{{pushpin_label8|}}} }}
{{#if:{{{coordinates9|}}} | {{!}} coordinates9 = {{{coordinates9|}}} {{!}} label10 = {{{pushpin_label9|}}} }}
{{#if:{{{coordinates10|}}} | {{!}} coordinates10 = {{{coordinates10|}}} {{!}} label11 = {{{pushpin_label10|}}} }}
}}
| {{#invoke:Location map|infobox_pushpin_map
| default_width = 220
}}
}}
}}
| header34 = {{#if:{{{pushpin_map|}}}||<nowiki />}}
| data35 = {{#invoke:Infobox mapframe|autoWithCaption}}
| belowstyle = border-top:1px #aaa solid
| below = {{{notes|}}}
}}{{#if:{{{campaign_box|}}}|{{{campaign_box|}}}{{stack end}}}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox civil conflict with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox civil conflict]] with unknown parameter "_VALUE_" | ignoreblank = y | mapframe_args = y | pushpin_map_args = y | alt | arrests | border | buildings | campaign_box | caption | casualties_label | casualties1 | casualties2 | casualties3 | causes | charged | child | concessions | coordinates | coordinates2 | coordinates3 | coordinates4 | coordinates5 | coordinates6 | coordinates7 | coordinates8 | coordinates9 | coordinates10 | damage | date | detentions | effect | effect_label | fatalities | fetchwikidata | fined | goals | how_many1 | how_many2 | how_many3 | image | image_size | image_upright | injuries | lead_figures1 | lead_figures2 | lead_figures3 | location | methods | name | notes | objectives | onlysourced | part_of | result | side1 | side1a | side1b | side1c | side1d | side2 | side2a | side2b | side2c | side2d | side3 | side3a | side3b | side3c | side3d | status | subbox | subtitle | suppressfields | time | time_begin | time_end | timezone | units1 | units2 | units3
| regexp1 = pushpin_label[1-9] | pushpin_label10
}}<noinclude>
{{documentation}}
</noinclude>
a3vmu2bzbjjed4sfjlapi2qj9j075e2
33536
33535
2026-11-11T22:44:23Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_civil_conflict]]
33535
wikitext
text/x-wiki
<includeonly>{{#if:{{{campaign_box|}}}|{{stack begin|clear=true}}}}{{#invoke:infobox|infoboxTemplate
| child = {{{child|}}}
| subbox = {{{subbox|}}}
| bodyclass = vevent
| bodystyle = width:25.5em;border-spacing: 2px;
| abovestyle = background-color:#CEE0F2;color:inherit;text-align:center;vertical-align:middle;font-size:110%;
| aboveclass = summary
| above = {{if empty | {{{name|}}} | {{#ifeq:{{{child|}}}|yes||{{PAGENAMEBASE}}}} }}
| autoheaders = y
| headerstyle = background-color:#CEE0F2;color:inherit;
| subheaderstyle = background-color:#eeeeee;color:inherit;text-align:center;vertical-align:middle;
| subheader = {{br separated entries
|{{{subtitle|}}}
|{{#if:{{{part_of|}}}|Part of {{{part_of|}}}}}
}}
| image = {{#invoke:InfoboxImage|InfoboxImage |image={{{image|}}} |size={{{image_size|}}} |sizedefault=frameless |upright={{if empty|{{{image_upright|}}}|1.15}} |alt={{{alt|}}} |border={{if empty|{{{border|}}}|no}} }}
| imagestyle = text-align: center; border-bottom: 1px solid #aaa; line-height: 1.5em;
| captionstyle = padding:0.35em 0.35em 0.25em;line-height:1.25em;
| caption = {{{caption|}}}
| labelstyle = white-space:nowrap;padding-right:0.65em<!--(to ensure gap between any long/nonwrapped label and subsequent data on same line-->;
| datastyle = line-height:1.3em;
| label1 = Date
| data1 = {{#invoke:WikidataIB|getValue|P585|name=date|suppressfields={{{suppressfields|}}}|fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}}|onlysourced={{{onlysourced|}}}|{{{date|}}} {{#if:{{{time|}}}|<br/>{{{time}}}}}{{#if:{{{time_begin|}}}|<br/>{{{time_begin|}}} – {{{time_end|}}}}} {{#if:{{{timezone|}}}|({{{timezone}}})}} }}
| label2 = Location
| data2 = {{#invoke:WikidataIB|getValue|P276|name=location|suppressfields={{{suppressfields|}}}|fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}}|onlysourced={{{onlysourced|}}}|{{br separated entries
| 1= {{#if:{{{location|}}}|<div style="display:inline;" class="location">{{{location|}}}</div>}}
| 2 = {{{coordinates|}}}
}} }}
| label3 = Caused by
| data3 = {{{causes|}}}
| label4 = Goals
| data4 = {{{goals|}}}
| label5 = Objectives
| data5 = {{{objectives|}}}
| label6 = Methods
| data6 = {{{methods|}}}
| label7 = Status
| data7 = {{{status|}}}
| label8 = Result
| data8 = {{{result|}}}
| label9 = Concessions
| data9 = {{{concessions|}}}
| header10 = Parties
| data11 = {{#if:{{{side1|}}}{{{side2|}}}{{{side3|}}}{{{side1a|}}}{{{side2a|}}}{{{side3a|}}}{{{side1b|}}}{{{side2b|}}}{{{side3b|}}}{{{side1c|}}}{{{side2c|}}}{{{side3c|}}}{{{side1d|}}}{{{side2d|}}}{{{side3d|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;">
{{#if:{{{side1|}}}{{{side2|}}}{{{side3|}}}|<tr>
<td style="{{#if:{{{side2|}}}{{{side3|}}}|width:{{#if:{{{side3|}}}|33%|50%}};}}"><div>
{{{side1|}}}</div></td>
{{#if:{{{side2|}}}|<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{side2}}}</div></td>}}
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{side3}}}</div></td>
}}</tr>
}}
{{#if:{{{side1a|}}}{{{side2a|}}}{{{side3a|}}}|<tr>
<td style="{{#if:{{{side2a|}}}{{{side3a|}}}|width:{{#if:{{{side3a|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1a|}}}</div></td>
{{#if:{{{side2a|}}}|<td style="width:{{#if:{{{side3a|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2a}}}</div></td>}}
{{#if:{{{side3a|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3a}}}</div></td>
}}</tr>
}}
{{#if:{{{side1b|}}}{{{side2b|}}}{{{side3b|}}}|<tr>
<td style="{{#if:{{{side2b|}}}{{{side3b|}}}|width:{{#if:{{{side3b|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1b|}}}</div></td>
{{#if:{{{side2b|}}}|<td style="width:{{#if:{{{side3b|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2b}}}</div></td>}}
{{#if:{{{side3b|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3b}}}</div></td>
}}</tr>
}}
{{#if:{{{side1c|}}}{{{side2c|}}}{{{side3c|}}}|<tr>
<td style="{{#if:{{{side2c|}}}{{{side3c|}}}|width:{{#if:{{{side3c|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1c|}}}</div></td>
{{#if:{{{side2c|}}}|<td style="width:{{#if:{{{side3c|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2c}}}</div></td>}}
{{#if:{{{side3c|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3c}}}</div></td>
}}</tr>
}}
{{#if:{{{side1d|}}}{{{side2d|}}}{{{side3d|}}}|<tr>
<td style="{{#if:{{{side2d|}}}|width:{{#if:{{{side3d|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1d|}}}</div></td>
{{#if:{{{side2d|}}}|<td style="width:{{#if:{{{side3d|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2d}}}</div></td>}}
{{#if:{{{side3d|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3d}}}</div></td>
}}</tr>
}}</table>}}
| header12 = Lead figures
| data13 = {{Infobox/Columns|{{{lead_figures1|}}}|{{{lead_figures2|}}}|{{{lead_figures3|}}} }}
| header14 = Units involved
| data15 = {{Infobox/Columns|{{{units1|}}}|{{{units2|}}}|{{{units3|}}} }}
| header16 = Number
| data17 = {{#if:{{{how_many1|}}}{{{how_many2|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;{{#if:{{{side3|}}}||{{#if:{{{how_many3|}}}|border-bottom:1px dotted #aaa}}}}"><tr>
<td style="width:{{#if:{{{side3|}}}|33%|50%}};"><div>
{{{how_many1|}}}</div></td>
<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{how_many2|}}}</div></td>
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{how_many3|}}}</div></td>
}}</tr></table>
}}
| data18 = {{#if:{{{side3|}}}||{{{how_many3|}}}}}
| header19 = Casualties and losses
| data20 = {{#if:{{{casualties1|}}}{{{casualties2|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;{{#if:{{{side3|}}}||{{#if:{{{casualties3|}}}|border-bottom:1px dotted #aaa}}}}"><tr>
<td style="{{#if:{{{side2|}}}{{{side3|}}}|width:{{#if:{{{side3|}}}|33%|50%}};}}"><div>
{{{casualties1|}}}</div></td>
<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{casualties2|}}}</div></td>
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{casualties3|}}}</div></td>
}}</tr></table>
}}
| data21 = {{#if:{{{side3|}}}||{{{casualties3|}}}}}
| header22 = {{if empty|{{{casualties_label|}}}| Casualties }}
| label23 = Deaths
| data23 = {{{fatalities|}}}
| label24 = Injuries
| data24 = {{{injuries|}}}
| label25 = Arrested
| data25 = {{{arrests|}}}
| label26 = Damage
| data26 = {{{damage|}}}
| label27 = {{longitem|Buildings destroyed}}
| data27 = {{{buildings|}}}
| label28 = [[Detention (imprisonment)|Detained]]
| data28 = {{{detentions|}}}
| label29 = [[Criminal charge|Charged]]
| data29 = {{{charged|}}}
| label30 = [[Fine (penalty)|Fined]]
| data30 = {{{fined|}}}
| label31 = {{{effect_label}}}
| data31 = {{{effect|}}}
| header32 = <nowiki />
| data33 = {{#if:{{{pushpin_map|}}}|
{{#if:{{{coordinates2|}}}|
{{Location map many|{{{pushpin_map|}}}
| width = {{if empty|{{{pushpin_map_size|}}}|220}}
| float = center
| border = infobox
| caption = {{{pushpin_caption|Location within {{#invoke:Location map|data|{{{pushpin_map|}}}|name}} }}}
| coordinates1 = {{{coordinates|}}} | label1 = {{{pushpin_label|}}}
| coordinates2 = {{{coordinates2|}}}| label2 = {{{pushpin_label2|}}}
{{#if:{{{coordinates3|}}} | {{!}} coordinates3 = {{{coordinates3|}}} {{!}} label3 = {{{pushpin_label3|}}} }}
{{#if:{{{coordinates4|}}} | {{!}} coordinates4 = {{{coordinates4|}}} {{!}} label4 = {{{pushpin_label4|}}} }}
{{#if:{{{coordinates5|}}} | {{!}} coordinates5 = {{{coordinates5|}}} {{!}} label6 = {{{pushpin_label5|}}} }}
{{#if:{{{coordinates6|}}} | {{!}} coordinates6 = {{{coordinates6|}}} {{!}} label7 = {{{pushpin_label6|}}} }}
{{#if:{{{coordinates7|}}} | {{!}} coordinates7 = {{{coordinates7|}}} {{!}} label8 = {{{pushpin_label7|}}} }}
{{#if:{{{coordinates8|}}} | {{!}} coordinates8 = {{{coordinates8|}}} {{!}} label9 = {{{pushpin_label8|}}} }}
{{#if:{{{coordinates9|}}} | {{!}} coordinates9 = {{{coordinates9|}}} {{!}} label10 = {{{pushpin_label9|}}} }}
{{#if:{{{coordinates10|}}} | {{!}} coordinates10 = {{{coordinates10|}}} {{!}} label11 = {{{pushpin_label10|}}} }}
}}
| {{#invoke:Location map|infobox_pushpin_map
| default_width = 220
}}
}}
}}
| header34 = {{#if:{{{pushpin_map|}}}||<nowiki />}}
| data35 = {{#invoke:Infobox mapframe|autoWithCaption}}
| belowstyle = border-top:1px #aaa solid
| below = {{{notes|}}}
}}{{#if:{{{campaign_box|}}}|{{{campaign_box|}}}{{stack end}}}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox civil conflict with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox civil conflict]] with unknown parameter "_VALUE_" | ignoreblank = y | mapframe_args = y | pushpin_map_args = y | alt | arrests | border | buildings | campaign_box | caption | casualties_label | casualties1 | casualties2 | casualties3 | causes | charged | child | concessions | coordinates | coordinates2 | coordinates3 | coordinates4 | coordinates5 | coordinates6 | coordinates7 | coordinates8 | coordinates9 | coordinates10 | damage | date | detentions | effect | effect_label | fatalities | fetchwikidata | fined | goals | how_many1 | how_many2 | how_many3 | image | image_size | image_upright | injuries | lead_figures1 | lead_figures2 | lead_figures3 | location | methods | name | notes | objectives | onlysourced | part_of | result | side1 | side1a | side1b | side1c | side1d | side2 | side2a | side2b | side2c | side2d | side3 | side3a | side3b | side3c | side3d | status | subbox | subtitle | suppressfields | time | time_begin | time_end | timezone | units1 | units2 | units3
| regexp1 = pushpin_label[1-9] | pushpin_label10
}}<noinclude>
{{documentation}}
</noinclude>
a3vmu2bzbjjed4sfjlapi2qj9j075e2
33585
33536
2026-11-11T22:45:02Z
RAPTOR7762
18
/* */
33585
wikitext
text/x-wiki
<includeonly>{{#if:{{{campaign_box|}}}|{{stack begin|clear=true}}}}{{Infobox/sandbox|infoboxTemplate
| child = {{{child|}}}
| subbox = {{{subbox|}}}
| bodyclass = vevent
| bodystyle = width:25.5em;border-spacing: 2px;
| abovestyle = background-color:#CEE0F2;color:inherit;text-align:center;vertical-align:middle;font-size:110%;
| aboveclass = summary
| above = {{if empty | {{{name|}}} | {{#ifeq:{{{child|}}}|yes||{{PAGENAMEBASE}}}} }}
| autoheaders = y
| headerstyle = background-color:#CEE0F2;color:inherit;
| subheaderstyle = background-color:#eeeeee;color:inherit;text-align:center;vertical-align:middle;
| subheader = {{br separated entries
|{{{subtitle|}}}
|{{#if:{{{part_of|}}}|Part of {{{part_of|}}}}}
}}
| image = {{#invoke:InfoboxImage|InfoboxImage |image={{{image|}}} |size={{{image_size|}}} |sizedefault=frameless |upright={{if empty|{{{image_upright|}}}|1.15}} |alt={{{alt|}}} |border={{if empty|{{{border|}}}|no}} }}
| imagestyle = text-align: center; border-bottom: 1px solid #aaa; line-height: 1.5em;
| captionstyle = padding:0.35em 0.35em 0.25em;line-height:1.25em;
| caption = {{{caption|}}}
| labelstyle = white-space:nowrap;padding-right:0.65em<!--(to ensure gap between any long/nonwrapped label and subsequent data on same line-->;
| datastyle = line-height:1.3em;
| label1 = Date
| data1 = {{#invoke:WikidataIB|getValue|P585|name=date|suppressfields={{{suppressfields|}}}|fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}}|onlysourced={{{onlysourced|}}}|{{{date|}}} {{#if:{{{time|}}}|<br/>{{{time}}}}}{{#if:{{{time_begin|}}}|<br/>{{{time_begin|}}} – {{{time_end|}}}}} {{#if:{{{timezone|}}}|({{{timezone}}})}} }}
| label2 = Location
| data2 = {{#invoke:WikidataIB|getValue|P276|name=location|suppressfields={{{suppressfields|}}}|fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}}|onlysourced={{{onlysourced|}}}|{{br separated entries
| 1= {{#if:{{{location|}}}|<div style="display:inline;" class="location">{{{location|}}}</div>}}
| 2 = {{{coordinates|}}}
}} }}
| label3 = Caused by
| data3 = {{{causes|}}}
| label4 = Goals
| data4 = {{{goals|}}}
| label5 = Objectives
| data5 = {{{objectives|}}}
| label6 = Methods
| data6 = {{{methods|}}}
| label7 = Status
| data7 = {{{status|}}}
| label8 = Result
| data8 = {{{result|}}}
| label9 = Concessions
| data9 = {{{concessions|}}}
| header10 = Parties
| data11 = {{#if:{{{side1|}}}{{{side2|}}}{{{side3|}}}{{{side1a|}}}{{{side2a|}}}{{{side3a|}}}{{{side1b|}}}{{{side2b|}}}{{{side3b|}}}{{{side1c|}}}{{{side2c|}}}{{{side3c|}}}{{{side1d|}}}{{{side2d|}}}{{{side3d|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;">
{{#if:{{{side1|}}}{{{side2|}}}{{{side3|}}}|<tr>
<td style="{{#if:{{{side2|}}}{{{side3|}}}|width:{{#if:{{{side3|}}}|33%|50%}};}}"><div>
{{{side1|}}}</div></td>
{{#if:{{{side2|}}}|<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{side2}}}</div></td>}}
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{side3}}}</div></td>
}}</tr>
}}
{{#if:{{{side1a|}}}{{{side2a|}}}{{{side3a|}}}|<tr>
<td style="{{#if:{{{side2a|}}}{{{side3a|}}}|width:{{#if:{{{side3a|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1a|}}}</div></td>
{{#if:{{{side2a|}}}|<td style="width:{{#if:{{{side3a|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2a}}}</div></td>}}
{{#if:{{{side3a|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3a}}}</div></td>
}}</tr>
}}
{{#if:{{{side1b|}}}{{{side2b|}}}{{{side3b|}}}|<tr>
<td style="{{#if:{{{side2b|}}}{{{side3b|}}}|width:{{#if:{{{side3b|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1b|}}}</div></td>
{{#if:{{{side2b|}}}|<td style="width:{{#if:{{{side3b|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2b}}}</div></td>}}
{{#if:{{{side3b|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3b}}}</div></td>
}}</tr>
}}
{{#if:{{{side1c|}}}{{{side2c|}}}{{{side3c|}}}|<tr>
<td style="{{#if:{{{side2c|}}}{{{side3c|}}}|width:{{#if:{{{side3c|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1c|}}}</div></td>
{{#if:{{{side2c|}}}|<td style="width:{{#if:{{{side3c|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2c}}}</div></td>}}
{{#if:{{{side3c|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3c}}}</div></td>
}}</tr>
}}
{{#if:{{{side1d|}}}{{{side2d|}}}{{{side3d|}}}|<tr>
<td style="{{#if:{{{side2d|}}}|width:{{#if:{{{side3d|}}}|33%|50%}};}}border-top:1px dotted #aaa">
<div>
{{{side1d|}}}</div></td>
{{#if:{{{side2d|}}}|<td style="width:{{#if:{{{side3d|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side2d}}}</div></td>}}
{{#if:{{{side3d|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa; border-top:1px dotted #aaa">
<div>
{{{side3d}}}</div></td>
}}</tr>
}}</table>}}
| header12 = Lead figures
| data13 = {{Infobox/Columns|{{{lead_figures1|}}}|{{{lead_figures2|}}}|{{{lead_figures3|}}} }}
| header14 = Units involved
| data15 = {{Infobox/Columns|{{{units1|}}}|{{{units2|}}}|{{{units3|}}} }}
| header16 = Number
| data17 = {{#if:{{{how_many1|}}}{{{how_many2|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;{{#if:{{{side3|}}}||{{#if:{{{how_many3|}}}|border-bottom:1px dotted #aaa}}}}"><tr>
<td style="width:{{#if:{{{side3|}}}|33%|50%}};"><div>
{{{how_many1|}}}</div></td>
<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{how_many2|}}}</div></td>
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{how_many3|}}}</div></td>
}}</tr></table>
}}
| data18 = {{#if:{{{side3|}}}||{{{how_many3|}}}}}
| header19 = Casualties and losses
| data20 = {{#if:{{{casualties1|}}}{{{casualties2|}}}
|<table style="width:100%; border-spacing:0; margin:0; text-align:left; display:inline-table;{{#if:{{{side3|}}}||{{#if:{{{casualties3|}}}|border-bottom:1px dotted #aaa}}}}"><tr>
<td style="{{#if:{{{side2|}}}{{{side3|}}}|width:{{#if:{{{side3|}}}|33%|50%}};}}"><div>
{{{casualties1|}}}</div></td>
<td style="width:{{#if:{{{side3|}}}|33%|50%}}; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{casualties2|}}}</div></td>
{{#if:{{{side3|}}}|<td style="width:33%; padding-left:0.25em; border-left:1px dotted #aaa"><div>
{{{casualties3|}}}</div></td>
}}</tr></table>
}}
| data21 = {{#if:{{{side3|}}}||{{{casualties3|}}}}}
| header22 = {{if empty|{{{casualties_label|}}}| Casualties }}
| label23 = Deaths
| data23 = {{{fatalities|}}}
| label24 = Injuries
| data24 = {{{injuries|}}}
| label25 = Arrested
| data25 = {{{arrests|}}}
| label26 = Damage
| data26 = {{{damage|}}}
| label27 = {{longitem|Buildings destroyed}}
| data27 = {{{buildings|}}}
| label28 = [[Detention (imprisonment)|Detained]]
| data28 = {{{detentions|}}}
| label29 = [[Criminal charge|Charged]]
| data29 = {{{charged|}}}
| label30 = [[Fine (penalty)|Fined]]
| data30 = {{{fined|}}}
| label31 = {{{effect_label}}}
| data31 = {{{effect|}}}
| header32 = <nowiki />
| data33 = {{#if:{{{pushpin_map|}}}|
{{#if:{{{coordinates2|}}}|
{{Location map many|{{{pushpin_map|}}}
| width = {{if empty|{{{pushpin_map_size|}}}|220}}
| float = center
| border = infobox
| caption = {{{pushpin_caption|Location within {{#invoke:Location map|data|{{{pushpin_map|}}}|name}} }}}
| coordinates1 = {{{coordinates|}}} | label1 = {{{pushpin_label|}}}
| coordinates2 = {{{coordinates2|}}}| label2 = {{{pushpin_label2|}}}
{{#if:{{{coordinates3|}}} | {{!}} coordinates3 = {{{coordinates3|}}} {{!}} label3 = {{{pushpin_label3|}}} }}
{{#if:{{{coordinates4|}}} | {{!}} coordinates4 = {{{coordinates4|}}} {{!}} label4 = {{{pushpin_label4|}}} }}
{{#if:{{{coordinates5|}}} | {{!}} coordinates5 = {{{coordinates5|}}} {{!}} label6 = {{{pushpin_label5|}}} }}
{{#if:{{{coordinates6|}}} | {{!}} coordinates6 = {{{coordinates6|}}} {{!}} label7 = {{{pushpin_label6|}}} }}
{{#if:{{{coordinates7|}}} | {{!}} coordinates7 = {{{coordinates7|}}} {{!}} label8 = {{{pushpin_label7|}}} }}
{{#if:{{{coordinates8|}}} | {{!}} coordinates8 = {{{coordinates8|}}} {{!}} label9 = {{{pushpin_label8|}}} }}
{{#if:{{{coordinates9|}}} | {{!}} coordinates9 = {{{coordinates9|}}} {{!}} label10 = {{{pushpin_label9|}}} }}
{{#if:{{{coordinates10|}}} | {{!}} coordinates10 = {{{coordinates10|}}} {{!}} label11 = {{{pushpin_label10|}}} }}
}}
| {{#invoke:Location map|infobox_pushpin_map
| default_width = 220
}}
}}
}}
| header34 = {{#if:{{{pushpin_map|}}}||<nowiki />}}
| data35 = {{#invoke:Infobox mapframe|autoWithCaption}}
| belowstyle = border-top:1px #aaa solid
| below = {{{notes|}}}
}}{{#if:{{{campaign_box|}}}|{{{campaign_box|}}}{{stack end}}}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox civil conflict with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox civil conflict]] with unknown parameter "_VALUE_" | ignoreblank = y | mapframe_args = y | pushpin_map_args = y | alt | arrests | border | buildings | campaign_box | caption | casualties_label | casualties1 | casualties2 | casualties3 | causes | charged | child | concessions | coordinates | coordinates2 | coordinates3 | coordinates4 | coordinates5 | coordinates6 | coordinates7 | coordinates8 | coordinates9 | coordinates10 | damage | date | detentions | effect | effect_label | fatalities | fetchwikidata | fined | goals | how_many1 | how_many2 | how_many3 | image | image_size | image_upright | injuries | lead_figures1 | lead_figures2 | lead_figures3 | location | methods | name | notes | objectives | onlysourced | part_of | result | side1 | side1a | side1b | side1c | side1d | side2 | side2a | side2b | side2c | side2d | side3 | side3a | side3b | side3c | side3d | status | subbox | subtitle | suppressfields | time | time_begin | time_end | timezone | units1 | units2 | units3
| regexp1 = pushpin_label[1-9] | pushpin_label10
}}<noinclude>
{{documentation}}
</noinclude>
dg3f19v65cz3jxbn9kwg4llwfgwc7gt
Module:Infobox mapframe
828
2725
33541
2026-10-02T22:57:03Z
en>Zackmann08
0
Correct edit summary this time... With all the deprecations that have been done recently, 'coord' is no longer a supported Infobox parameter anywhere. Should always be 'coordinates'
33541
Scribunto
text/plain
local mf = require('Module:Mapframe')
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local infoboxImage = require('Module:InfoboxImage').InfoboxImage
-- Defaults
local DEFAULT_FRAME_WIDTH = "270"
local DEFAULT_FRAME_HEIGHT = "200"
local DEFAULT_ZOOM = 10
local DEFAULT_GEOMASK_STROKE_WIDTH = "1"
local DEFAULT_GEOMASK_STROKE_COLOR = "#777777"
local DEFAULT_GEOMASK_FILL = "#888888"
local DEFAULT_GEOMASK_FILL_OPACITY = "0.25"
local DEFAULT_SHAPE_STROKE_WIDTH = "2"
local DEFAULT_SHAPE_STROKE_COLOR = "#FF0000"
local DEFAULT_SHAPE_FILL = "#606060"
local DEFAULT_SHAPE_FILL_OPACITY = "0.1"
local DEFAULT_LINE_STROKE_WIDTH = "5"
local DEFAULT_LINE_STROKE_COLOR = "#FF0000"
local DEFAULT_MARKER_COLOR = "#5E74F3"
local util = {}
function util.noop(info)
local DEFAULT_NOOP_OUTPUT = ""
-- uncomment this when debugging
-- DEFAULT_NOOP_OUTPUT = "debug: mapframe no-op: " .. info
-- mw.log(DEFAULT_NOOP_OUTPUT)
return DEFAULT_NOOP_OUTPUT
end
-- Trim whitespace from args, and remove empty args
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
function util.getBestStatement(item_id, property_id)
if not(item_id) or not(mw.wikibase.isValidEntityId(item_id)) or not(mw.wikibase.entityExists(item_id)) then
return false
end
local statements = mw.wikibase.getBestStatements(item_id, property_id)
if not statements or #statements == 0 then
return false
end
local hasNoValue = ( statements[1].mainsnak and statements[1].mainsnak.snaktype == 'novalue' )
if hasNoValue then
return false
end
return statements[1]
end
function util.hasWikidataProperty(item_id, property_id)
return util.getBestStatement(item_id, property_id) and true or false
end
function util.getStatementValue(statement)
return statement and statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value or nil
end
function util.relatedEntity(item_id, property_id)
local value = util.getStatementValue( util.getBestStatement(item_id, property_id) )
return value and value.id or false
end
function util.idType(id)
if not id then
return nil
elseif mw.ustring.match(id, "[Pp]%d+") then
return "property"
elseif mw.ustring.match(id, "[Qq]%d+") then
return "item"
else
return nil
end
end
function util.shouldAutoRun(frame)
-- Check if should be running
local pargs = frame.getParent(frame).args
local explicitlyOn = yesno(mw.text.trim(pargs.mapframe or "")) -- true of false or nil
if pargs.coordinates == "{{{coordinates}}}" then explicitlyOn = false end
if type(pargs.coordinates) == 'string' and string.match(pargs.coordinates, 'coord.missing') then explicitlyOn = false end
local onByDefault = (explicitlyOn == nil) and yesno(mw.text.trim(frame.args.onByDefault or ""), false) -- true or false
return explicitlyOn or onByDefault
end
function util.argsFromAuto(frame)
-- Get args from the frame (invoke call) and the parent (template call).
-- Frame arguments are default values which are overridden by parent values
-- when both are present
local args = getArgs(frame, {parentFirst = true})
-- Discard args not prefixed with "mapframe-", remove that prefix from those that remain
local fixedArgs = {}
for name, val in pairs(args) do
local fixedName = string.match(name, "^mapframe%-(.+)$" )
if fixedName then
fixedArgs[fixedName] = val
-- allow coord, coordinates, etc to be unprefixed
elseif name == "coordinates" or name == "coordinate" and not fixedArgs.coord then
fixedArgs.coord = val
-- allow id, qid to be unprefixed, map to id (if not already present)
elseif name == "id" or name == "qid" and not fixedArgs.id then
fixedArgs.id = val
-- allow captionstyle to be unprefixed, for compatibility with [[Module:Infobox]]
elseif name == "captionstyle" and not fixedArgs.captionstyle then
fixedArgs.captionstyle = val
end
end
return fixedArgs
end
function util.parseCustomWikitext(customWikitext)
-- infoboxImage will format an image if given wikitext containing an
-- image, or else pass through the wikitext unmodified
return infoboxImage({
args = {
image = customWikitext
}
})
end
function util.trackAndWarn(trackingCat, warning)
local title = mw.title.getCurrentTitle()
local results = title and title.namespace == 0 and trackingCat and '[[Category:'..trackingCat..']]' or ''
if warning then
local warn = require('Module:If preview')._warning
results = results..warn({warning})
end
return results
end
function util.ternary(flag, other)
other = other or 'other'
flag = flag == 'none' and 'no' or flag
local yesNoOut = yesno(flag,other)
local yes = (yesNoOut == true)
local no = (yesNoOut == false)
return yes, no
end
local p = {}
p._caption = function(args)
if args.caption then
return args.caption
elseif args.switcher then
return util.noop("no caption or switcher")
end
local maskItem
local maskType = util.idType(args.geomask)
if maskType == 'item' then
maskItem = args.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(args.id or mw.wikibase.getEntityIdForCurrentPage(), args.geomask)
end
local maskItemLabel = maskItem and mw.wikibase.getLabel( maskItem )
return maskItemLabel and "Location in "..maskItemLabel
or util.noop("missing maskItemLabel with type " .. (maskType or "nil") .. " and item " .. (maskItem or "nil"))
end
--A list of types for objects that are too small to allow Kartographer to take over zoom
local tinyType = {
landmark=true,
railwaystation=true,
edu=true,
pass=true,
camera=true
}
p._main = function(_config)
-- accumulate tracking cats
local tracking = ''
-- `config` is the args passed to this module
local config = util.trimArgs(_config)
-- allow alias for config.coord
config.coord = config.coord or config.coordinates
-- Require wikidata item, or specified coords
local wikidataId = config.id or mw.wikibase.getEntityIdForCurrentPage()
if not(wikidataId) and not(config.coord) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- Require coords (specified or from wikidata), so that map will be centred somewhere
-- (P625 = coordinate location)
local wdCoordinates = util.getStatementValue(util.getBestStatement(wikidataId, 'P625'))
if not (config.coord or wdCoordinates) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- `args` is the arguments which will be passed to the mapframe module
local args = {}
-- Some defaults/overrides for infobox presentation
args.display = "inline"
args.frame = "yes"
args.plain = "yes"
args["frame-width"] = config["frame-width"] or config.width or DEFAULT_FRAME_WIDTH
args["frame-height"] = config["frame-height"] or config.height or DEFAULT_FRAME_HEIGHT
args["frame-align"] = "center"
args["frame-coord"] = config["frame-coordinates"] or config["frame-coord"]
-- Note: config["coordinates"] or config["coord"] should not be used for the alignment of the frame;
-- see talk page ( https://en.wikipedia.org/wiki/Special:Diff/876492931 )
-- deprecated lat and long parameters
args["frame-lat"] = config["frame-lat"] or config["frame-latitude"]
args["frame-long"] = config["frame-long"] or config["frame-longitude"]
-- if zoom isn't specified from config, first check wikidata
local zoom = config.zoom or util.getStatementValue(util.getBestStatement(wikidataId, 'P6592'))
if not zoom then
-- Calculate zoom from length or area (converted to km or km2)
-- Zoom so that length or area is completely included in mapframe
local getZoom = require('Module:Infobox dim')._zoom
zoom = getZoom({length_km=config.length_km, length_mi=config.length_mi,
width_km=config.width_km, width_mi=config.width_mi,
area_km2=config.area_km2, area_mi2=config.area_mi2,
area_ha=config.area_ha, area_acre=config.area_acre,
type=config.type, population=config.population,
viewport_px=math.min(args["frame-width"],args["frame-height"]),
latitude=wdCoordinates and wdCoordinates.latitude})
end
args.zoom = zoom or DEFAULT_ZOOM
-- Use OSM relation ID if available; otherwise use geoshape if that is available
-- (geoshape is required for defunct entities, which are outside OSM's scope)
local hasOsmRelationId = util.hasWikidataProperty(wikidataId, 'P402') -- P402 is OSM relation ID
local hasGeoshape = util.hasWikidataProperty(wikidataId, 'P3896') -- P3896 is geoshape
local wikidataProvidesGeo = hasOsmRelationId or hasGeoshape
-- determine marker argument value, determine whether to show marker
local forcePoint, suppressPoint = util.ternary(config.point)
local forceMarker, suppressMarker = util.ternary(config.marker,true)
forcePoint = forcePoint or forceMarker
suppressPoint = suppressPoint or suppressMarker
local showMarker = not suppressPoint and (forcePoint or not wikidataProvidesGeo or config.coord)
-- wikidata = "yes" turns on both shape and line
-- wikidata = "no" turns off both shape and line
-- otherwise show both if wikidata provides geo
local forceWikidata, suppressWikidata = util.ternary(config.wikidata)
local showShape = not suppressWikidata and (forceWikidata or wikidataProvidesGeo or not config.coord)
local showLine = showShape
-- determine shape parameter value, determine whether to show or suppress shape
-- also determine whether to invert shape
local forceShape, suppressShape = util.ternary(config.shape)
showShape = wikidataId and not suppressShape and (forceShape or showShape)
local shapeType = config.shape == 'inverse' and 'shape-inverse' or 'shape'
-- determine line parameter value, determine whether to show or suppress line
local forceLine, suppressLine = util.ternary(config.line)
showLine = wikidataId and not suppressLine and (forceLine or showLine)
local maskItem
-- Switcher
if config.switcher == "zooms" then
-- switching between zoom levels
local maxZoom = math.max(tonumber(args.zoom), 3) -- what zoom would have otherwise been (if 3 or more, otherwise 3)
local minZoom = 1 -- completely zoomed out
local midZoom = math.floor((maxZoom + minZoom)/2) -- midway between maxn and min
args.switch = "zoomed in, zoomed midway, zoomed out"
args.zoom = string.format("SWITCH:%d,%d,%d", maxZoom, midZoom, minZoom)
elseif config.switcher == "auto" then
-- switching between P276 and P131 areas with recursive lookup, e.g. item's city,
-- that city's state, and that state's country
args.zoom = nil -- let kartographer determine the zoom
local maskLabels = {}
local maskItems = {}
local maskItemId = util.relatedEntity(wikidataId, "P276") or util.relatedEntity(wikidataId, "P131")
local maskLabel = mw.wikibase.getLabel(maskItemId)
while maskItemId and maskLabel and mw.text.trim(maskLabel) ~= "" do
table.insert(maskLabels, maskLabel)
table.insert(maskItems, maskItemId)
maskItemId = maskItemId and util.relatedEntity(maskItemId, "P131")
maskLabel = maskItemId and mw.wikibase.getLabel(maskItemId)
end
if #maskLabels > 1 then
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
elseif #maskLabels == 1 then
maskItem = maskItemId[1]
end
elseif config.switcher == "geomasks" and config.geomask then
-- switching between items in geomask parameter
args.zoom = nil -- let kartographer determine the zoom
local separator = (mw.ustring.find(config.geomask, "###", 0, true ) and "###") or
(mw.ustring.find(config.geomask, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
local maskItems = mw.text.split(mw.ustring.gsub(config.geomask, "SWITCH:", ""), pattern)
local maskLabels = {}
if #maskItems > 1 then
for i, item in ipairs(maskItems) do
table.insert(maskLabels, mw.wikibase.getLabel(item))
end
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
end
end
-- resolve geomask item id (if not using geomask switcher)
if not maskItem then --
local maskType = util.idType(config.geomask)
if maskType == 'item' then
maskItem = config.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(wikidataId, config.geomask)
end
end
-- if asking for shape or line from Wikidata
-- and if Wikidata actually has shape/line data (wikidataProvidesGeo=true)
-- and if no geomask
-- and if zoom not explicitly set
-- and if the object size inferred from its type is not too small
-- then let Kartographer "take over" zoom
if (showLine or showShape) and wikidataProvidesGeo and not maskItem
and not config.zoom and not (config.type and tinyType[config.type]) then
args.zoom = nil
end
if not maskItem and not showShape and not showLine and not showMarker then
return false, util.trackAndWarn('Pages using infobox mapframe with no geometry','No geometry specified for mapframe')
end
-- Keep track of arg numbering
local argNumber = ''
local function incrementArgNumber()
if argNumber == '' then
argNumber = 2
else
argNumber = argNumber + 1
end
end
-- Geomask
if maskItem then
args["type"..argNumber] = "shape-inverse"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = config["geomask-stroke-width"] or DEFAULT_GEOMASK_STROKE_WIDTH
args["stroke-color"..argNumber] = config["geomask-stroke-color"] or config["geomask-stroke-colour"] or DEFAULT_GEOMASK_STROKE_COLOR
args["fill"..argNumber] = config["geomask-fill"] or DEFAULT_GEOMASK_FILL
args["fill-opacity"..argNumber] = config["geomask-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
-- Let kartographer determine zoom and position, unless it is explicitly set in config
if not config.zoom and not config.switcher then
args.zoom = nil
args["frame-coord"] = nil
args["frame-lat"] = nil
args["frame-long"] = nil
local maskArea = util.getStatementValue( util.getBestStatement(maskItem, 'P2046') )
end
incrementArgNumber()
-- Hack to fix phab:T255932
if not args.zoom then
args["type"..argNumber] = "line"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = 0
incrementArgNumber()
end
end
-- Shape (or shape-inverse)
if showShape then
args["type"..argNumber] = shapeType
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["shape-stroke-width"] or config["stroke-width"] or DEFAULT_SHAPE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["shape-stroke-color"] or config["shape-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_SHAPE_STROKE_COLOR
args["fill"..argNumber] = config["shape-fill"] or DEFAULT_SHAPE_FILL
args["fill-opacity"..argNumber] = config["shape-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
incrementArgNumber()
end
-- Line
if showLine then
args["type"..argNumber] = "line"
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["line-stroke-width"] or config["stroke-width"] or DEFAULT_LINE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["line-stroke-color"] or config["line-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_LINE_STROKE_COLOR
incrementArgNumber()
end
-- Point marker
if showMarker then
args["type"..argNumber] = "point"
if config.id then args["id"..argNumber] = config.id end
if config.coord then args["coord"..argNumber] = config.coord end
if config.marker then args["marker"..argNumber] = config.marker end
args["marker-color"..argNumber] = config["marker-color"] or config["marker-colour"] or DEFAULT_MARKER_COLOR
incrementArgNumber()
end
-- if Wikidata doesn't link to OSM and the map has no mask or point,
-- then center the map on the coordinates either from the infobox or from wikidata
if not maskItem and not showMarker and not wikidataProvidesGeo then
if config.coord then
args["frame-coord"] = args["frame-coord"] or config.coord
else
args["frame-lat"] = args["frame-lat"] or wdCoordinates.latitude
args["frame-long"] = args["frame-long"] or wdCoordinates.longitude
end
tracking = tracking..util.trackAndWarn('Pages using infobox mapframe with forced centering')
end
-- protect against nil frame arguments
args["frame-coord"] = args["frame-coord"] or ""
args["frame-lat"] = args["frame-lat"] or ""
args["frame-long"] = args["frame-long"] or ""
local mapframe = args.switch and mf.multi(args) or mf._main(args)
tracking = tracking..((showLine or showShape) and not wikidataProvidesGeo
and util.trackAndWarn('Pages using infobox mapframe without shape links in Wikidata')
or '')
return true, mapframe.. tracking
end
-- Entry points
p.main = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local _, mapframe = p._main(parentArgs)
return frame:preprocess(mapframe)
end
p.auto = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("auto should not autorun")
end
local args = util.argsFromAuto(frame)
if args.custom then
return frame:preprocess(util.parseCustomWikitext(args.custom))
end
local _, mapframe = p._main(args)
return frame:preprocess(mapframe)
end
p.autocaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autocaption should not autorun")
end
local args = util.argsFromAuto(frame)
local caption = p._caption(args)
return caption
end
p.autoWithCaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autoWithCaption should not autorun")
end
local args = util.argsFromAuto(frame)
local wikitext
local caption
local ok
if args.custom then
ok = true
wikitext = util.parseCustomWikitext(args.custom)
else
ok, wikitext = p._main(args)
end
if not ok then return wikitext end
wikitext = frame:preprocess(wikitext)
caption = p._caption(args)
local data = mw.html.create():wikitext(wikitext)
data:tag('div')
:addClass('infobox-caption')
:cssText(args.captionstyle)
:wikitext(caption)
return tostring(data)
end
return p
875oxmrlaiy3xr3n98jl2ndg6rcmzou
33542
33541
2026-11-11T22:44:23Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Infobox_mapframe]]
33541
Scribunto
text/plain
local mf = require('Module:Mapframe')
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local infoboxImage = require('Module:InfoboxImage').InfoboxImage
-- Defaults
local DEFAULT_FRAME_WIDTH = "270"
local DEFAULT_FRAME_HEIGHT = "200"
local DEFAULT_ZOOM = 10
local DEFAULT_GEOMASK_STROKE_WIDTH = "1"
local DEFAULT_GEOMASK_STROKE_COLOR = "#777777"
local DEFAULT_GEOMASK_FILL = "#888888"
local DEFAULT_GEOMASK_FILL_OPACITY = "0.25"
local DEFAULT_SHAPE_STROKE_WIDTH = "2"
local DEFAULT_SHAPE_STROKE_COLOR = "#FF0000"
local DEFAULT_SHAPE_FILL = "#606060"
local DEFAULT_SHAPE_FILL_OPACITY = "0.1"
local DEFAULT_LINE_STROKE_WIDTH = "5"
local DEFAULT_LINE_STROKE_COLOR = "#FF0000"
local DEFAULT_MARKER_COLOR = "#5E74F3"
local util = {}
function util.noop(info)
local DEFAULT_NOOP_OUTPUT = ""
-- uncomment this when debugging
-- DEFAULT_NOOP_OUTPUT = "debug: mapframe no-op: " .. info
-- mw.log(DEFAULT_NOOP_OUTPUT)
return DEFAULT_NOOP_OUTPUT
end
-- Trim whitespace from args, and remove empty args
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
function util.getBestStatement(item_id, property_id)
if not(item_id) or not(mw.wikibase.isValidEntityId(item_id)) or not(mw.wikibase.entityExists(item_id)) then
return false
end
local statements = mw.wikibase.getBestStatements(item_id, property_id)
if not statements or #statements == 0 then
return false
end
local hasNoValue = ( statements[1].mainsnak and statements[1].mainsnak.snaktype == 'novalue' )
if hasNoValue then
return false
end
return statements[1]
end
function util.hasWikidataProperty(item_id, property_id)
return util.getBestStatement(item_id, property_id) and true or false
end
function util.getStatementValue(statement)
return statement and statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value or nil
end
function util.relatedEntity(item_id, property_id)
local value = util.getStatementValue( util.getBestStatement(item_id, property_id) )
return value and value.id or false
end
function util.idType(id)
if not id then
return nil
elseif mw.ustring.match(id, "[Pp]%d+") then
return "property"
elseif mw.ustring.match(id, "[Qq]%d+") then
return "item"
else
return nil
end
end
function util.shouldAutoRun(frame)
-- Check if should be running
local pargs = frame.getParent(frame).args
local explicitlyOn = yesno(mw.text.trim(pargs.mapframe or "")) -- true of false or nil
if pargs.coordinates == "{{{coordinates}}}" then explicitlyOn = false end
if type(pargs.coordinates) == 'string' and string.match(pargs.coordinates, 'coord.missing') then explicitlyOn = false end
local onByDefault = (explicitlyOn == nil) and yesno(mw.text.trim(frame.args.onByDefault or ""), false) -- true or false
return explicitlyOn or onByDefault
end
function util.argsFromAuto(frame)
-- Get args from the frame (invoke call) and the parent (template call).
-- Frame arguments are default values which are overridden by parent values
-- when both are present
local args = getArgs(frame, {parentFirst = true})
-- Discard args not prefixed with "mapframe-", remove that prefix from those that remain
local fixedArgs = {}
for name, val in pairs(args) do
local fixedName = string.match(name, "^mapframe%-(.+)$" )
if fixedName then
fixedArgs[fixedName] = val
-- allow coord, coordinates, etc to be unprefixed
elseif name == "coordinates" or name == "coordinate" and not fixedArgs.coord then
fixedArgs.coord = val
-- allow id, qid to be unprefixed, map to id (if not already present)
elseif name == "id" or name == "qid" and not fixedArgs.id then
fixedArgs.id = val
-- allow captionstyle to be unprefixed, for compatibility with [[Module:Infobox]]
elseif name == "captionstyle" and not fixedArgs.captionstyle then
fixedArgs.captionstyle = val
end
end
return fixedArgs
end
function util.parseCustomWikitext(customWikitext)
-- infoboxImage will format an image if given wikitext containing an
-- image, or else pass through the wikitext unmodified
return infoboxImage({
args = {
image = customWikitext
}
})
end
function util.trackAndWarn(trackingCat, warning)
local title = mw.title.getCurrentTitle()
local results = title and title.namespace == 0 and trackingCat and '[[Category:'..trackingCat..']]' or ''
if warning then
local warn = require('Module:If preview')._warning
results = results..warn({warning})
end
return results
end
function util.ternary(flag, other)
other = other or 'other'
flag = flag == 'none' and 'no' or flag
local yesNoOut = yesno(flag,other)
local yes = (yesNoOut == true)
local no = (yesNoOut == false)
return yes, no
end
local p = {}
p._caption = function(args)
if args.caption then
return args.caption
elseif args.switcher then
return util.noop("no caption or switcher")
end
local maskItem
local maskType = util.idType(args.geomask)
if maskType == 'item' then
maskItem = args.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(args.id or mw.wikibase.getEntityIdForCurrentPage(), args.geomask)
end
local maskItemLabel = maskItem and mw.wikibase.getLabel( maskItem )
return maskItemLabel and "Location in "..maskItemLabel
or util.noop("missing maskItemLabel with type " .. (maskType or "nil") .. " and item " .. (maskItem or "nil"))
end
--A list of types for objects that are too small to allow Kartographer to take over zoom
local tinyType = {
landmark=true,
railwaystation=true,
edu=true,
pass=true,
camera=true
}
p._main = function(_config)
-- accumulate tracking cats
local tracking = ''
-- `config` is the args passed to this module
local config = util.trimArgs(_config)
-- allow alias for config.coord
config.coord = config.coord or config.coordinates
-- Require wikidata item, or specified coords
local wikidataId = config.id or mw.wikibase.getEntityIdForCurrentPage()
if not(wikidataId) and not(config.coord) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- Require coords (specified or from wikidata), so that map will be centred somewhere
-- (P625 = coordinate location)
local wdCoordinates = util.getStatementValue(util.getBestStatement(wikidataId, 'P625'))
if not (config.coord or wdCoordinates) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- `args` is the arguments which will be passed to the mapframe module
local args = {}
-- Some defaults/overrides for infobox presentation
args.display = "inline"
args.frame = "yes"
args.plain = "yes"
args["frame-width"] = config["frame-width"] or config.width or DEFAULT_FRAME_WIDTH
args["frame-height"] = config["frame-height"] or config.height or DEFAULT_FRAME_HEIGHT
args["frame-align"] = "center"
args["frame-coord"] = config["frame-coordinates"] or config["frame-coord"]
-- Note: config["coordinates"] or config["coord"] should not be used for the alignment of the frame;
-- see talk page ( https://en.wikipedia.org/wiki/Special:Diff/876492931 )
-- deprecated lat and long parameters
args["frame-lat"] = config["frame-lat"] or config["frame-latitude"]
args["frame-long"] = config["frame-long"] or config["frame-longitude"]
-- if zoom isn't specified from config, first check wikidata
local zoom = config.zoom or util.getStatementValue(util.getBestStatement(wikidataId, 'P6592'))
if not zoom then
-- Calculate zoom from length or area (converted to km or km2)
-- Zoom so that length or area is completely included in mapframe
local getZoom = require('Module:Infobox dim')._zoom
zoom = getZoom({length_km=config.length_km, length_mi=config.length_mi,
width_km=config.width_km, width_mi=config.width_mi,
area_km2=config.area_km2, area_mi2=config.area_mi2,
area_ha=config.area_ha, area_acre=config.area_acre,
type=config.type, population=config.population,
viewport_px=math.min(args["frame-width"],args["frame-height"]),
latitude=wdCoordinates and wdCoordinates.latitude})
end
args.zoom = zoom or DEFAULT_ZOOM
-- Use OSM relation ID if available; otherwise use geoshape if that is available
-- (geoshape is required for defunct entities, which are outside OSM's scope)
local hasOsmRelationId = util.hasWikidataProperty(wikidataId, 'P402') -- P402 is OSM relation ID
local hasGeoshape = util.hasWikidataProperty(wikidataId, 'P3896') -- P3896 is geoshape
local wikidataProvidesGeo = hasOsmRelationId or hasGeoshape
-- determine marker argument value, determine whether to show marker
local forcePoint, suppressPoint = util.ternary(config.point)
local forceMarker, suppressMarker = util.ternary(config.marker,true)
forcePoint = forcePoint or forceMarker
suppressPoint = suppressPoint or suppressMarker
local showMarker = not suppressPoint and (forcePoint or not wikidataProvidesGeo or config.coord)
-- wikidata = "yes" turns on both shape and line
-- wikidata = "no" turns off both shape and line
-- otherwise show both if wikidata provides geo
local forceWikidata, suppressWikidata = util.ternary(config.wikidata)
local showShape = not suppressWikidata and (forceWikidata or wikidataProvidesGeo or not config.coord)
local showLine = showShape
-- determine shape parameter value, determine whether to show or suppress shape
-- also determine whether to invert shape
local forceShape, suppressShape = util.ternary(config.shape)
showShape = wikidataId and not suppressShape and (forceShape or showShape)
local shapeType = config.shape == 'inverse' and 'shape-inverse' or 'shape'
-- determine line parameter value, determine whether to show or suppress line
local forceLine, suppressLine = util.ternary(config.line)
showLine = wikidataId and not suppressLine and (forceLine or showLine)
local maskItem
-- Switcher
if config.switcher == "zooms" then
-- switching between zoom levels
local maxZoom = math.max(tonumber(args.zoom), 3) -- what zoom would have otherwise been (if 3 or more, otherwise 3)
local minZoom = 1 -- completely zoomed out
local midZoom = math.floor((maxZoom + minZoom)/2) -- midway between maxn and min
args.switch = "zoomed in, zoomed midway, zoomed out"
args.zoom = string.format("SWITCH:%d,%d,%d", maxZoom, midZoom, minZoom)
elseif config.switcher == "auto" then
-- switching between P276 and P131 areas with recursive lookup, e.g. item's city,
-- that city's state, and that state's country
args.zoom = nil -- let kartographer determine the zoom
local maskLabels = {}
local maskItems = {}
local maskItemId = util.relatedEntity(wikidataId, "P276") or util.relatedEntity(wikidataId, "P131")
local maskLabel = mw.wikibase.getLabel(maskItemId)
while maskItemId and maskLabel and mw.text.trim(maskLabel) ~= "" do
table.insert(maskLabels, maskLabel)
table.insert(maskItems, maskItemId)
maskItemId = maskItemId and util.relatedEntity(maskItemId, "P131")
maskLabel = maskItemId and mw.wikibase.getLabel(maskItemId)
end
if #maskLabels > 1 then
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
elseif #maskLabels == 1 then
maskItem = maskItemId[1]
end
elseif config.switcher == "geomasks" and config.geomask then
-- switching between items in geomask parameter
args.zoom = nil -- let kartographer determine the zoom
local separator = (mw.ustring.find(config.geomask, "###", 0, true ) and "###") or
(mw.ustring.find(config.geomask, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
local maskItems = mw.text.split(mw.ustring.gsub(config.geomask, "SWITCH:", ""), pattern)
local maskLabels = {}
if #maskItems > 1 then
for i, item in ipairs(maskItems) do
table.insert(maskLabels, mw.wikibase.getLabel(item))
end
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
end
end
-- resolve geomask item id (if not using geomask switcher)
if not maskItem then --
local maskType = util.idType(config.geomask)
if maskType == 'item' then
maskItem = config.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(wikidataId, config.geomask)
end
end
-- if asking for shape or line from Wikidata
-- and if Wikidata actually has shape/line data (wikidataProvidesGeo=true)
-- and if no geomask
-- and if zoom not explicitly set
-- and if the object size inferred from its type is not too small
-- then let Kartographer "take over" zoom
if (showLine or showShape) and wikidataProvidesGeo and not maskItem
and not config.zoom and not (config.type and tinyType[config.type]) then
args.zoom = nil
end
if not maskItem and not showShape and not showLine and not showMarker then
return false, util.trackAndWarn('Pages using infobox mapframe with no geometry','No geometry specified for mapframe')
end
-- Keep track of arg numbering
local argNumber = ''
local function incrementArgNumber()
if argNumber == '' then
argNumber = 2
else
argNumber = argNumber + 1
end
end
-- Geomask
if maskItem then
args["type"..argNumber] = "shape-inverse"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = config["geomask-stroke-width"] or DEFAULT_GEOMASK_STROKE_WIDTH
args["stroke-color"..argNumber] = config["geomask-stroke-color"] or config["geomask-stroke-colour"] or DEFAULT_GEOMASK_STROKE_COLOR
args["fill"..argNumber] = config["geomask-fill"] or DEFAULT_GEOMASK_FILL
args["fill-opacity"..argNumber] = config["geomask-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
-- Let kartographer determine zoom and position, unless it is explicitly set in config
if not config.zoom and not config.switcher then
args.zoom = nil
args["frame-coord"] = nil
args["frame-lat"] = nil
args["frame-long"] = nil
local maskArea = util.getStatementValue( util.getBestStatement(maskItem, 'P2046') )
end
incrementArgNumber()
-- Hack to fix phab:T255932
if not args.zoom then
args["type"..argNumber] = "line"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = 0
incrementArgNumber()
end
end
-- Shape (or shape-inverse)
if showShape then
args["type"..argNumber] = shapeType
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["shape-stroke-width"] or config["stroke-width"] or DEFAULT_SHAPE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["shape-stroke-color"] or config["shape-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_SHAPE_STROKE_COLOR
args["fill"..argNumber] = config["shape-fill"] or DEFAULT_SHAPE_FILL
args["fill-opacity"..argNumber] = config["shape-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
incrementArgNumber()
end
-- Line
if showLine then
args["type"..argNumber] = "line"
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["line-stroke-width"] or config["stroke-width"] or DEFAULT_LINE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["line-stroke-color"] or config["line-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_LINE_STROKE_COLOR
incrementArgNumber()
end
-- Point marker
if showMarker then
args["type"..argNumber] = "point"
if config.id then args["id"..argNumber] = config.id end
if config.coord then args["coord"..argNumber] = config.coord end
if config.marker then args["marker"..argNumber] = config.marker end
args["marker-color"..argNumber] = config["marker-color"] or config["marker-colour"] or DEFAULT_MARKER_COLOR
incrementArgNumber()
end
-- if Wikidata doesn't link to OSM and the map has no mask or point,
-- then center the map on the coordinates either from the infobox or from wikidata
if not maskItem and not showMarker and not wikidataProvidesGeo then
if config.coord then
args["frame-coord"] = args["frame-coord"] or config.coord
else
args["frame-lat"] = args["frame-lat"] or wdCoordinates.latitude
args["frame-long"] = args["frame-long"] or wdCoordinates.longitude
end
tracking = tracking..util.trackAndWarn('Pages using infobox mapframe with forced centering')
end
-- protect against nil frame arguments
args["frame-coord"] = args["frame-coord"] or ""
args["frame-lat"] = args["frame-lat"] or ""
args["frame-long"] = args["frame-long"] or ""
local mapframe = args.switch and mf.multi(args) or mf._main(args)
tracking = tracking..((showLine or showShape) and not wikidataProvidesGeo
and util.trackAndWarn('Pages using infobox mapframe without shape links in Wikidata')
or '')
return true, mapframe.. tracking
end
-- Entry points
p.main = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local _, mapframe = p._main(parentArgs)
return frame:preprocess(mapframe)
end
p.auto = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("auto should not autorun")
end
local args = util.argsFromAuto(frame)
if args.custom then
return frame:preprocess(util.parseCustomWikitext(args.custom))
end
local _, mapframe = p._main(args)
return frame:preprocess(mapframe)
end
p.autocaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autocaption should not autorun")
end
local args = util.argsFromAuto(frame)
local caption = p._caption(args)
return caption
end
p.autoWithCaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autoWithCaption should not autorun")
end
local args = util.argsFromAuto(frame)
local wikitext
local caption
local ok
if args.custom then
ok = true
wikitext = util.parseCustomWikitext(args.custom)
else
ok, wikitext = p._main(args)
end
if not ok then return wikitext end
wikitext = frame:preprocess(wikitext)
caption = p._caption(args)
local data = mw.html.create():wikitext(wikitext)
data:tag('div')
:addClass('infobox-caption')
:cssText(args.captionstyle)
:wikitext(caption)
return tostring(data)
end
return p
875oxmrlaiy3xr3n98jl2ndg6rcmzou
Module:Mapframe
828
2726
33543
2026-10-18T22:35:06Z
en>Jonesey95
0
"coordinates" is the canonical form of this parameter. "coord" is not supported by all templates that call this module, so the Lua error message should not suggest putting coordinates in "|coord=".
33543
Scribunto
text/plain
-- Note: Originally written on English Wikipedia at https://en.wikipedia.org/wiki/Module:Mapframe
--[[----------------------------------------------------------------------------
##### Localisation (L10n) settings #####
Replace values in quotes ("") with localised values
----------------------------------------------------------------------------]]--
local L10n = {}
local wb = mw.wikibase
-- Modue dependencies
local parser -- local copy of https://www.mediawiki.org/wiki/Module:WikitextParser loaded lazily
-- "strict" should not be used, at least until all other modules which require this module are not using globals.
-- Template parameter names (unnumbered versions only)
-- Specify each as either a single string, or a table of strings (aliases)
-- Aliases are checked left-to-right, i.e. `{ "one", "two" }` is equivalent to using `{{{one| {{{two|}}} }}}` in a template
L10n.para = {
display = "display",
type = "type",
id = { "id", "ids" },
from = "from",
raw = "raw",
title = "title",
description = "description",
strokeColor = { "stroke-color", "stroke-colour" },
strokeWidth = "stroke-width",
strokeOpacity = "stroke-opacity",
fill = "fill",
fillOpacity = "fill-opacity",
coord = { "coordinates", "coord" },
marker = "marker",
markerColor = { "marker-color", "marker-colour" },
markerSize = "marker-size",
radius = { "radius", "radius_m" },
radiusKm = "radius_km",
radiusFt = "radius_ft",
radiusMi = "radius_mi",
edges = "edges",
text = "text",
icon = "icon",
zoom = "zoom",
frame = "frame",
plain = "plain",
frameWidth = "frame-width",
frameHeight = "frame-height",
frameCoordinates= { "frame-coordinates", "frame-coord" },
frameLatitude = { "frame-lat", "frame-latitude" },
frameLongitude = { "frame-long", "frame-longitude" },
frameAlign = "frame-align",
switch = "switch",
overlay = "overlay",
overlayBorder = "overlay-border",
overlayHorizontalAlignment = "overlay-horizontal-alignment",
overlayVerticalAlignment = "overlay-vertical-alignment",
overlayHorizontalOffset = "overlay-horizontal-offset",
overlayVerticalOffset = "overlay-vertical-offset"
}
-- Names of other templates this module can extract coordinates from
L10n.template = {
templates = { -- The coord template, as well as templates with output that contains {{coord}}
"Coord", "Coord/sandbox",
"NRHP row", "NRHP row/sandbox",
"WikidataCoord", "WikidataCoord/sandbox", "Wikidatacoord", "Wikidata coord"
},
modules = { -- The coordinates module, as well as modules with output that contains {{coord}}
"Coordinates", "Coordinates/sandbox",
"WikidataCoord", "WikidataCoord/sandbox"
}
}
-- Error messages
L10n.error = {
badDisplayPara = "Invalid display parameter",
noCoords = "Coordinates must be specified on Wikidata or in |" .. ( type(L10n.para.coord)== 'table' and L10n.para.coord[1] or L10n.para.coord ) .. "=",
wikidataCoords = "Coordinates not found on Wikidata",
noCircleCoords = "Circle centre coordinates must be specified, or available via Wikidata",
negativeRadius = "Circle radius must be a positive number",
noRadius = "Circle radius must be specified",
negativeEdges = "Circle edges must be a positive number",
noSwitchPara = "Found only one switch value in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
oneSwitchLabel = "Found only one label in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noSwitchLists = "At least one parameter must have a SWITCH: list",
switchMismatches = "All SWITCH: lists must have the same number of values",
-- "%s" and "%d" tokens will be replaced with strings and numbers when used
oneSwitchValue = "Found only one switch value in |%s=",
fewerSwitchLabels = "Found %d switch values but only %d labels in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noNamedCoords = "No named coordinates found in %s"
}
-- Other strings
L10n.str = {
-- valid values for display parameter, e.g. (|display=inline) or (|display=title) or (|display=inline,title) or (|display=title,inline)
inline = "inline",
title = "title",
dsep = ",", -- separator between inline and title (comma in the example above)
-- valid values for type parameter
line = "line", -- geoline feature (e.g. a road)
shape = "shape", -- geoshape feature (e.g. a state or province)
shapeInverse = "shape-inverse", -- geomask feature (the inverse of a geoshape)
data = "data", -- geoJSON data page on Commons
point = "point", -- single point feature (coordinates)
circle = "circle", -- circular area around a point
named = "named", -- all named coordinates in an article or section
-- Keyword to indicate a switch list. Must NOT use the special characters ^$()%.[]*+-?
switch = "SWITCH",
-- valid values for icon, frame, and plain parameters
affirmedWords = ' '..table.concat({
"add",
"added",
"affirm",
"affirmed",
"include",
"included",
"on",
"true",
"yes",
"y"
}, ' ')..' ',
declinedWords = ' '..table.concat({
"decline",
"declined",
"exclude",
"excluded",
"false",
"none",
"not",
"no",
"n",
"off",
"omit",
"omitted",
"remove",
"removed"
}, ' ')..' '
}
-- Default values for parameters
L10n.defaults = {
display = L10n.str.inline,
text = "Map",
frameWidth = "300",
frameHeight = "200",
frameAlign = "right",
markerColor = "5E74F3",
markerSize = nil,
strokeColor = "#ff0000",
strokeWidth = 6,
edges = 32, -- number of edges used to approximate a circle
overlayBorder = "1px solid white",
overlayHorizontalAlignment = "right",
overlayHorizontalOffset = "0",
overlayVerticalAlignment = "bottom",
overlayVerticalOffset = "0"
}
-- #### End of L10n settings ####
--[[----------------------------------------------------------------------------
Utility methods
----------------------------------------------------------------------------]]--
local util = {}
--[[
Looks up a parameter value based on the id (a key from the L10n.para table) and
optionally a suffix, for parameters that can be suffixed (e.g. type2 is type
with suffix 2).
@param {table} args key-value pairs of parameter names and their values
@param {string} param_id id for parameter name (key from the L10n.para table)
@param {string} [suffix] suffix for parameter name
@returns {string|nil} parameter value if found, or nil if not found
]]--
function util.getParameterValue(args, param_id, suffix)
suffix = suffix or ''
if type( L10n.para[param_id] ) ~= 'table' then
return args[L10n.para[param_id]..suffix]
end
for _i, paramAlias in ipairs(L10n.para[param_id]) do
if args[paramAlias..suffix] then
return args[paramAlias..suffix]
end
end
return nil
end
--[[
Trim whitespace from args, and remove empty args. Also fix control characters.
@param {table} argsTable
@returns {table} trimmed args table
]]--
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(key) == 'string' and type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
-- control characters inside json need to be escaped, but stripping them is simpler
-- See also T214984
-- However, *don't* strip control characters from wikitext (text or description parameters) or you'll break strip markers
-- Alternatively it might be better to only strip control char from raw parameter content
if util.matchesParam('text', key) or util.matchesParam('description', key, key:gsub('^%D+(%d+)$', '%1') ) then
cleanArgs[key] = val
else
cleanArgs[key] = val:gsub('%c',' ')
end
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
--[[
Check if a parameter name matches an unlocalized parameter key
@param {string} key - the unlocalized parameter name to search through
@param {string} name - the localized parameter name to check
@param {string|nil} - an optional suffix to apply to the value(s) from the localization key
@returns {boolean} true if the name matches the parameter, false otherwise
]]--
function util.matchesParam(key, name, suffix)
local param = L10n.para[key]
suffix = suffix or ''
if type(param) == 'table' then
for _, v in pairs(param) do
if (v .. suffix) == name then return true end
end
return false
end
return ((param .. suffix) == name)
end
--[[
Check if a value is affirmed (one of the values in L10n.str.affirmedWords)
@param {string} val Value to be checked
@returns {boolean} true if affirmed, false otherwise
]]--
function util.isAffirmed(val)
if not(val) then return false end
return string.find(L10n.str.affirmedWords, ' '..val..' ', 1, true ) and true or false
end
--[[
Check if a value is declined (one of the values in L10n.str.declinedWords)
@param {string} val Value to be checked
@returns {boolean} true if declined, false otherwise
]]--
function util.isDeclined(val)
if not(val) then return false end
return string.find(L10n.str.declinedWords , ' '..val..' ', 1, true ) and true or false
end
--[[
Check if the name of a template matches the known coord templates or wrappers
(in L10n.template.templates and L10n.template.modules). The name is normalised
when checked, so e.g. the names "Coord", "coord", and " Coord" all return true.
@param {string} name
@returns {boolean} true if it is a coord template or wrapper, false otherwise
]]--
function util.isCoordTemplateOrWrapper(name)
name = mw.text.trim(name)
local modName = mw.ustring.gsub(name, '#invoke:', '')
local inputTitle = mw.title.new(modName, (name ~= modName) and 'Module' or 'Template')
if not inputTitle then
return false
end
-- Create (or reuse) mw.title objects for each known coord template/wrapper.
-- Stored in L10n.template.title so that they don't need to be recreated
-- each time this function is called
if not L10n.template.titles then
L10n.template.titles = {}
for _, v in pairs(L10n.template.templates) do
table.insert(L10n.template.titles, mw.title.new(v, 'Template'))
end
for _, v in pairs(L10n.template.modules) do
table.insert(L10n.template.titles, mw.title.new(v, 'Module'))
end
end
for _, templateTitle in pairs(L10n.template.titles) do
if mw.title.equals(inputTitle, templateTitle) then
return true
end
end
return false
end
--[[
Recursively extract coord templates which have a name parameter.
@param {string} wikitext
@returns {table} table sequence of coord templates
]]--
function util.extractCoordTemplates(wikitext)
local output = {}
local templates = mw.ustring.gmatch(wikitext, '{%b{}}')
for template in templates do
local templateName = mw.ustring.match(template, '{{([^}|]+)')
local nameParam = mw.ustring.match(template, "|%s*name%s*=%s*[^}|]+")
if util.isCoordTemplateOrWrapper(templateName) then
if nameParam then table.insert(output, template) end
elseif mw.ustring.find(mw.ustring.sub(template, 2), "{{") then
local subOutput = util.extractCoordTemplates(mw.ustring.sub(template, 2))
for _, t in pairs(subOutput) do
table.insert(output, t)
end
end
end
-- ensure coords are not using title display
for k, v in pairs(output) do
output[k] = mw.ustring.gsub(v, "|%s*display%s*=[^|}]+", "|display=inline")
end
return output
end
--[[
Gets all named coordinates from a page or a section of a page.
@param {string|nil} page Page name, or name#section, to get named coordinates
from. If the name is omitted, i.e. #section or nil or empty string, then
the current page will be used.
@returns {table} sequence of {coord, name, description} tables where coord is
the coordinates in a format suitable for #util.parseCoords, name is a string,
and description is a string (coordinates in a format suitable for displaying
to the reader). If for some reason the name can't be found, the description
is nil and the name contains display-format coordinates.
@throws {L10n.error.noNamedCoords} if no named coordinates are found.
]]--
function util.getNamedCoords(page)
local parts = mw.text.split(page or "", "#", true)
local name = parts[1] == "" and mw.title.getCurrentTitle().prefixedText or parts[1]
local section = parts[2]
local title = mw.title.new(name)
if title.isRedirect then
title = title.redirectTarget
end
local pageWikitext = title:getContent()
if section then
if parser == nil then
-- load [[Module:WikitextParser]] lazily so it is only transcluded on pages that use it
parser = require("Module:WikitextParser")
end
pageWikitext = parser.getSection(pageWikitext, section) or ''
end
local coordTemplates = util.extractCoordTemplates(pageWikitext)
if #coordTemplates == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
local frame = mw.getCurrentFrame()
local sep = "________"
local expandedContent = frame:preprocess(table.concat(coordTemplates, sep))
local expandedTemplates = mw.text.split(expandedContent, sep)
local namedCoords = {}
for _, expandedTemplate in pairs(expandedTemplates) do
local coord = mw.ustring.match(expandedTemplate, "<span class=\"geo%-dec\".->(.-)</span>")
if coord then
local coordname = (
-- name specified by a wrapper template, e.g [[Article|Name]]
mw.ustring.match(expandedTemplate, "<span class=\"mapframe%-coord%-name\">(.-)</span>") or
-- name passed into coord template
mw.ustring.match(expandedTemplate, "<span class=\"fn org\">(.-)</span>") or
-- default to the coordinates if the name can't be retrieved
coord
)
local description = coordname ~= coord and coord
table.insert(namedCoords, {
coord=mw.ustring.gsub(coord, "[° ]", "_"),
name=coordname, description=description
})
end
end
if #namedCoords == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
return namedCoords
end
--[[
Parse coordinate values from the params passed in a GeoHack url (such as
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1_2_N_3_4_W_ or
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1.23_S_4.56_E_ )
or non-url string in the same format (such as `1_2_N_3_4_W_` or `1.23_S_4.56_E_`)
@param {string} coords string containing coordinates
@returns {number, number} latitude, longitude
]]--
function util.parseCoords(coords)
local coordsPatt
if mw.ustring.find(coords, "params=", 1, true) then
-- prevent false matches from page name, e.g. ?pagename=Lorem_S._Ipsum
coordsPatt = 'params=([_%.%d]+[NS][_%.%d]+[EW])'
else
-- not actually a geohack url, just the same format
coordsPatt = '[_%.%d]+[NS][_%.%d]+[EW]'
end
local parts = mw.text.split((mw.ustring.match(coords, coordsPatt) or ''), '_')
local lat_d = tonumber(parts[1])
assert(lat_d, "Unable to get latitude from input '"..coords.."'.")
local lat_m = tonumber(parts[2]) -- nil if coords are in decimal format
local lat_s = lat_m and tonumber(parts[3]) -- nil if coords are either in decimal format or degrees and minutes only
local lat = lat_d + (lat_m or 0)/60 + (lat_s or 0)/3600
if parts[#parts/2] == 'S' then
lat = lat * -1
end
local long_d = tonumber(parts[1+#parts/2])
assert(long_d, "Unable to get longitude from input '"..coords.."'.")
local long_m = tonumber(parts[2+#parts/2]) -- nil if coords are in decimal format
local long_s = long_m and tonumber(parts[3+#parts/2]) -- nil if coords are either in decimal format or degrees and minutes only
local long = long_d + (long_m or 0)/60 + (long_s or 0)/3600
if parts[#parts] == 'W' then
long = long * -1
end
return lat, long
end
--[[
Get coordinates from a Wikidata item
@param {string} item_id Wikidata item id (Q number)
@returns {number, number} latitude, longitude
@throws {L10n.error.noCoords} if item_id is invalid or the item does not exist
@throws {L10n.error.wikidataCoords} if the the item does not have a P625
statement (coordinates), or it is set to "no value"
]]--
function util.wikidataCoords(item_id)
if not (item_id and wb.isValidEntityId(item_id) and wb.entityExists(item_id)) then
error(L10n.error.noCoords, 0)
end
local coordStatements = wb.getBestStatements(item_id, 'P625')
if not coordStatements or #coordStatements == 0 then
error(L10n.error.wikidataCoords, 0)
end
local hasNoValue = ( coordStatements[1].mainsnak and (coordStatements[1].mainsnak.snaktype == 'novalue' or coordStatements[1].mainsnak.snaktype == 'somevalue') )
if hasNoValue then
error(L10n.error.wikidataCoords, 0)
end
local wdCoords = coordStatements[1]['mainsnak']['datavalue']['value']
return tonumber(wdCoords['latitude']), tonumber(wdCoords['longitude'])
end
--[[
Creates a polygon that approximates a circle
@param {number} lat Latitude
@param {number} long Longitude
@param {number} radius Radius in metres
@param {number} n Number of edges for the polygon
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
]]--
function util.circleToPolygon(lat, long, radius, n) -- n is number of edges
-- Based on https://github.com/gabzim/circle-to-polygon, ISC licence
local function offset(cLat, cLon, distance, bearing)
local lat1 = math.rad(cLat)
local lon1 = math.rad(cLon)
local dByR = distance / 6378137 -- distance divided by 6378137 (radius of the earth) wgs84
local offet_lat = math.asin(
math.sin(lat1) * math.cos(dByR) +
math.cos(lat1) * math.sin(dByR) * math.cos(bearing)
)
local offet_lon = lon1 + math.atan2(
math.sin(bearing) * math.sin(dByR) * math.cos(lat1),
math.cos(dByR) - math.sin(lat1) * math.sin(offet_lat)
)
return {math.deg(offet_lon), math.deg(offet_lat)}
end
local coordinates = {};
local i = 0;
while i < n do
table.insert(coordinates,
offset(lat, long, radius, (2*math.pi*i*-1)/n)
)
i = i + 1
end
table.insert(coordinates, offset(lat, long, radius, 0))
return coordinates
end
--[[
Get the number of key-value pairs in a table, which might not be a sequence.
@param {table} t
@returns {number} count of key-value pairs
]]--
function util.tableCount(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
--[[
For a table where the values are all tables, returns either the util.tableCount
of the subtables if they are all the same, or nil if they are not all the same.
@param {table} t
@returns {number|nil} count of key-value pairs of subtable, or nil if subtables
have different counts
]]--
function util.subTablesCount(t)
local count = nil
for k, v in pairs(t) do
if count == nil then
count = util.tableCount(v)
elseif count ~= util.tableCount(v) then
return nil
end
end
return count
end
--[[
Splits a list into a table sequence. The items in the list may be separated by
commas, or by semicolons (if items may contain commas), or by "###" (if items
may contain semicolons).
@param {string} listString
@returns {table} sequence of list items
]]--
function util.tableFromList(listString)
if type(listString) ~= "string" or listString == "" then return nil end
local separator = (mw.ustring.find(listString, "###", 0, true ) and "###") or
(mw.ustring.find(listString, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
return mw.text.split(listString, pattern)
end
-- Boolean in outer scope indicating if Kartographer should be able to
-- automatically calculate coordinates (see phab:T227402)
local coordsDerivedFromFeatures = false;
--[[----------------------------------------------------------------------------
Make methods: These take in a table of arguments, and return either a string
or a table to be used in the eventual output.
----------------------------------------------------------------------------]]--
local make = {}
--[[
Makes content to go inside the maplink or mapframe tag.
@param {table} args
@returns {string} tag content
]]--
function make.content(args)
if util.getParameterValue(args, 'raw') then
coordsDerivedFromFeatures = true -- Kartographer should be able to automatically calculate coords from raw geoJSON
return util.getParameterValue(args, 'raw')
end
local content = {}
local argsExpanded = {}
for k, v in pairs(args) do
local index = string.match( k, '^[^0-9]+([0-9]*)$' )
if index ~= nil then
local indexNumber
if index ~= '' then
indexNumber = tonumber(index)
else
indexNumber = 1
end
if argsExpanded[indexNumber] == nil then
argsExpanded[indexNumber] = {}
end
argsExpanded[indexNumber][ string.gsub(k, index, '') ] = v
end
end
for contentIndex, contentArgs in pairs(argsExpanded) do
local argType = util.getParameterValue(contentArgs, "type")
-- Kartographer automatically calculates coords if geolines/shapes are used (T227402)
if not coordsDerivedFromFeatures then
coordsDerivedFromFeatures = ( argType == L10n.str.line or argType == L10n.str.shape ) and true or false
end
if argType == L10n.str.named then
local namedCoords = util.getNamedCoords(util.getParameterValue(contentArgs, "from"))
local typeKey = type(L10n.para.type) == "table" and L10n.para.type[1] or L10n.para.type
local coordKey = type(L10n.para.coord) == "table" and L10n.para.coord[1] or L10n.para.coord
local titleKey = type(L10n.para.title) == "table" and L10n.para.title[1] or L10n.para.title
local descKey = type(L10n.para.description) == "table" and L10n.para.description[1] or L10n.para.description
for _, namedCoord in pairs(namedCoords) do
contentArgs[typeKey] = "point"
contentArgs[coordKey] = namedCoord.coord
contentArgs[titleKey] = namedCoord.name
contentArgs[descKey] = namedCoord.description
content[#content+1] = make.contentJson(contentArgs)
end
else
content[#content + 1] = make.contentJson(contentArgs)
end
end
--Single item, no array needed
if #content==1 then return content[1] end
--Multiple items get placed in a FeatureCollection
local contentArray = '[\n' .. table.concat( content, ',\n') .. '\n]'
return contentArray
end
--[[
Make coordinates from the coord arg, or the id arg, or the current page's
Wikidata item.
@param {table} args
@param {boolean} [plainOutput]
@returns {Mixed} Either:
{number, number} latitude, longitude if plainOutput is true; or
{table} table sequence of longitude, then latitude (gives the required format
for GeoJSON when encoded)
]]--
function make.coords(args, plainOutput)
local coords, lat, long
local frame = mw.getCurrentFrame()
if util.getParameterValue(args, 'coord') then
coords = frame:preprocess( util.getParameterValue(args, 'coord') )
lat, long = util.parseCoords(coords)
else
lat, long = util.wikidataCoords(util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
end
if plainOutput then
return lat, long
end
return {[0] = long, [1] = lat}
end
--[[
Makes a table of coordinates that approximate a circle.
@param {table} args
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
@throws {L10n.error.noCircleCoords} if centre coordinates are not specified
@throws {L10n.error.noRadius} if radius is not specified
@throws {L10n.error.negativeRadius} if radius is negative or zero
@throws {L10n.error.negativeEdges} if edges is negative or zero
]]--
function make.circleCoords(args)
local lat, long = make.coords(args, true)
local radius = util.getParameterValue(args, 'radius')
if not radius then
radius = util.getParameterValue(args, 'radiusKm') and tonumber(util.getParameterValue(args, 'radiusKm'))*1000
if not radius then
radius = util.getParameterValue(args, 'radiusMi') and tonumber(util.getParameterValue(args, 'radiusMi'))*1609.344
if not radius then
radius = util.getParameterValue(args, 'radiusFt') and tonumber(util.getParameterValue(args, 'radiusFt'))*0.3048
end
end
end
local edges = util.getParameterValue(args, 'edges') or L10n.defaults.edges
if not lat or not long then
error(L10n.error.noCircleCoords, 0)
elseif not radius then
error(L10n.error.noRadius, 0)
elseif tonumber(radius) <= 0 then
error(L10n.error.negativeRadius, 0)
elseif tonumber(edges) <= 0 then
error(L10n.error.negativeEdges, 0)
end
return util.circleToPolygon(lat, long, radius, tonumber(edges))
end
--[[
Makes JSON data for a feature
@param contentArgs args for this feature. Keys must be the non-suffixed version
of the parameter names, i.e. use type, stroke, fill,... rather than type3,
stroke3, fill3,...
@returns {string} JSON encoded data
]]--
function make.contentJson(contentArgs)
local data = {}
if util.getParameterValue(contentArgs, 'type') == L10n.str.point or util.getParameterValue(contentArgs, 'type') == L10n.str.circle then
local isCircle = util.getParameterValue(contentArgs, 'type') == L10n.str.circle
data.type = "Feature"
data.geometry = {
type = isCircle and "LineString" or "Point",
coordinates = isCircle and make.circleCoords(contentArgs) or make.coords(contentArgs)
}
data.properties = {
title = util.getParameterValue(contentArgs, 'title') or mw.getCurrentFrame():getParent():getTitle()
}
if isCircle then
-- TODO: This is very similar to below, should be extracted into a function
data.properties.stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor
data.properties["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
data.properties['fill-opacity'] = fillOpacity and tonumber(fillOpacity) or 0.6
end
else -- is a point
local markerSymbol = util.getParameterValue(contentArgs, 'marker') or L10n.defaults.marker
-- allow blank to be explicitly specified, for overriding infoboxes or other templates with a default value
if markerSymbol ~= "blank" then
data.properties["marker-symbol"] = markerSymbol
end
data.properties["marker-color"] = util.getParameterValue(contentArgs, 'markerColor') or L10n.defaults.markerColor
data.properties["marker-size"] = util.getParameterValue(contentArgs, 'markerSize') or L10n.defaults.markerSize
end
else
data.type = "ExternalData"
if util.getParameterValue(contentArgs, 'type') == L10n.str.data or util.getParameterValue(contentArgs, 'from') then
data.service = "page"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.line then
data.service = "geoline"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shape then
data.service = "geoshape"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shapeInverse then
data.service = "geomask"
end
if util.getParameterValue(contentArgs, 'id') or (not (util.getParameterValue(contentArgs, 'from')) and wb.getEntityIdForCurrentPage()) then
data.ids = util.getParameterValue(contentArgs, 'id') or wb.getEntityIdForCurrentPage()
else
data.title = util.getParameterValue(contentArgs, 'from')
end
data.properties = {
stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor,
["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
}
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill and (data.service == "geoshape" or data.service == "geomask") then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
if fillOpacity then
data.properties['fill-opacity'] = tonumber(fillOpacity)
end
end
end
data.properties.title = util.getParameterValue(contentArgs, 'title') or mw.title.getCurrentTitle().text
if util.getParameterValue(contentArgs, 'description') then
data.properties.description = util.getParameterValue(contentArgs, 'description')
end
return mw.text.jsonEncode(data)
end
--[[
Makes attributes for the maplink or mapframe tag.
@param {table} args
@param {boolean} [isTitle] Tag is to be displayed in the title of page rather
than inline
@returns {table<string,string>} key-value pairs of attribute names and values
]]--
function make.tagAttribs(args, isTitle)
local attribs = {}
if util.getParameterValue(args, 'zoom') then
attribs.zoom = util.getParameterValue(args, 'zoom')
end
if util.isDeclined(util.getParameterValue(args, 'icon')) then
attribs.class = "no-icon"
end
if util.getParameterValue(args, 'type') == L10n.str.point and not coordsDerivedFromFeatures then
local lat, long = make.coords(args, 'plainOutput')
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
if util.isAffirmed(util.getParameterValue(args, 'frame')) and not(isTitle) then
attribs.width = util.getParameterValue(args, 'frameWidth') or L10n.defaults.frameWidth
attribs.height = util.getParameterValue(args, 'frameHeight') or L10n.defaults.frameHeight
if util.getParameterValue(args, 'frameCoordinates') then
local frameLat, frameLong = util.parseCoords(util.getParameterValue(args, 'frameCoordinates'))
attribs.latitude = frameLat
attribs.longitude = frameLong
else
if util.getParameterValue(args, 'frameLatitude') then
attribs.latitude = util.getParameterValue(args, 'frameLatitude')
end
if util.getParameterValue(args, 'frameLongitude') then
attribs.longitude = util.getParameterValue(args, 'frameLongitude')
end
end
if not attribs.latitude and not attribs.longitude and not coordsDerivedFromFeatures then
local success, lat, long = pcall(util.wikidataCoords, util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
if success then
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
end
if util.getParameterValue(args, 'frameAlign') then
attribs.align = util.getParameterValue(args, 'frameAlign')
end
if util.isAffirmed(util.getParameterValue(args, 'plain')) then
attribs.frameless = "1"
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
return attribs
end
--[[
Makes maplink wikitext that will be located in the top-right of the title of the
page (the same place where coords with |display=title are positioned).
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.titleOutput(args, tagContent)
local titleTag = mw.text.tag('maplink', make.tagAttribs(args, true), tagContent)
local spanAttribs = {
style = "font-size: small;",
id = "mapframe-coordinates"
}
local indicatorContent = mw.text.tag('span', spanAttribs, titleTag)
return mw.getCurrentFrame():extensionTag {
name = "indicator",
content = indicatorContent,
args = {
name = "zzz-mapframe" --zzz: show as last indicator
}
}
end
--[[
Makes maplink or mapframe wikitext that will be located inline.
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.inlineOutput(args, tagContent)
local tagName = 'maplink'
if util.getParameterValue(args, 'frame') then
tagName = 'mapframe'
end
return mw.text.tag(tagName, make.tagAttribs(args), tagContent)
end
--[[
Makes the HTML required for the swicther to work, including the templatestyles
tag.
@param {table} params table sequence of {map, label} tables
@param {string} params{}.map Wikitext for mapframe map
@param {string} params{}.label Label text for swicther option
@param {table} options
@param {string} options.alignment "left" or "center" or "right"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} options.width Width of frame, e.g. "200"
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} swicther HTML
]]--
function make.switcherHtml(params, options)
options = options or {}
local frame = mw.getCurrentFrame()
local styles = frame:extensionTag{
name = "templatestyles",
args = {src = "Template:Maplink/styles-multi.css"}
}
local container = mw.html.create("div")
:addClass("switcher-container")
:addClass("mapframe-multi-container")
if options.alignment == "left" or options.alignment == "right" then
container:addClass("float"..options.alignment)
else -- alignment is "center"
container:addClass("center")
end
for i = 1, #params do
container
:tag("div")
:wikitext(params[i].map)
:tag("span")
:addClass("switcher-label")
:css("display", "none")
:wikitext(mw.text.trim(params[i].label))
end
if not options.isThumbnail then
return styles .. tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.alignment, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-multi-outer-container")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.alignment == "left" or options.alignment == "right" then
outerCountainer:addClass("float"..options.alignment)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return styles .. tostring(outerCountainer)
end
--[[
Makes the HTML required for an overlay map to work
tag.
@param {string} overlayMap wikitext for the overlay map
@param {string} baseMap wikitext for the base map
@param {table} options various styling/display options
@param {string} options.align "left" or "center" or "right"
@param {string|number} options.width Width of the base map, e.g. "300"
@param {string|number} options.width Height of the base map, e.g. "200"
@param {string} options.border Border style for the overlayed map, e.g. "1px solid white"
@param {string} options.horizontalAlignment Horizontal alignment for overlay map, "left" or "right"
@param {string|number} options.horizontalOffset Horizontal offset in pixels from the alignment edge, e.g "10"
@param {string} options.verticalAlignment Vertical alignment for overlay map, "top" or "bottom"
@param {string|number} options.verticalOffset Vertical offset in pixels from the alignment edge, e.g. is "10"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} HTML for basemap with overlay
]]--
function make.overlayHtml(overlayMap, baseMap, options)
options = options or {}
local containerFloatClass = "float"..(options.align or "none")
if options.align == "center" then
containerFloatClass = "center"
end
local containerStyle = {
position = "relative",
width = options.width .. "px",
height = options.height .. "px",
overflow = "hidden" -- mobile/minerva tends to add scrollbars for a couple of pixels
}
if options.align == "center" then
containerStyle["margin-left"] = "auto"
containerStyle["margin-right"] = "auto"
end
local container = mw.html.create("div")
:addClass("mapframe-withOverlay-container")
:addClass(containerFloatClass)
:addClass("noresize")
:css(containerStyle)
local overlayStyle = {
position = "absolute",
["z-index"] = "1",
border = options.border or "1px solid white"
}
if options.horizontalAlignment == "right" then
overlayStyle.right = options.horizontalOffset .. "px"
else
overlayStyle.left = options.horizontalOffset .. "px"
end
if options.verticalAlignment == "bottom" then
overlayStyle.bottom = options.verticalOffset .. "px"
else
overlayStyle.top = options.verticalOffset .. "px"
end
local overlayDiv = mw.html.create("div")
:css(overlayStyle)
:wikitext(overlayMap)
container
:node(overlayDiv)
:wikitext(baseMap)
if not options.isThumbnail then
return tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.align, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-withOverlay-outerContainer")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.align == "left" or options.align == "right" then
outerCountainer:addClass("t"..options.align)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return tostring(outerCountainer)
end
--[[----------------------------------------------------------------------------
Package to be exported, i.e. methods which will available to templates and
other modules.
----------------------------------------------------------------------------]]--
local p = {}
-- Entry point for templates
function p.main(frame)
local parent = frame.getParent(frame)
-- Check for overlay option
local overlay = util.getParameterValue(parent.args, 'overlay')
local hasOverlay = overlay and mw.text.trim(overlay) ~= ""
-- Check for switch option
local switch = util.getParameterValue(parent.args, 'switch')
local isMulti = switch and mw.text.trim(switch) ~= ""
-- Create output by choosing method to suit options
local output
if hasOverlay then
output = p.withOverlay(parent.args)
elseif isMulti then
output = p.multi(parent.args)
else
output = p._main(parent.args)
end
-- Preprocess output before returning it
return frame:preprocess(output)
end
-- Entry points for modules
function p._main(_args)
local args = util.trimArgs(_args)
local tagContent = make.content(args)
local display = mw.text.split(util.getParameterValue(args, 'display') or L10n.defaults.display, '%s*' .. L10n.str.dsep .. '%s*')
local displayInTitle = display[1] == L10n.str.title or display[2] == L10n.str.title
local displayInline = display[1] == L10n.str.inline or display[2] == L10n.str.inline
local output
if displayInTitle and displayInline then
output = make.titleOutput(args, tagContent) .. make.inlineOutput(args, tagContent)
elseif displayInTitle then
output = make.titleOutput(args, tagContent)
elseif displayInline then
output = make.inlineOutput(args, tagContent)
else
error(L10n.error.badDisplayPara)
end
return output
end
function p.multi(_args)
local args = util.trimArgs(_args)
if not args[L10n.para.switch] then error(L10n.error.noSwitchPara, 0) end
local switchParamValue = util.getParameterValue(args, 'switch')
local switchLabels = util.tableFromList(switchParamValue)
if #switchLabels == 1 then error(L10n.error.oneSwitchLabel, 0) end
local mapframeArgs = {}
local switchParams = {}
for name, val in pairs(args) do
-- Copy to mapframeArgs, if not the switch labels or a switch parameter
if val ~= switchParamValue and not string.match(val, "^"..L10n.str.switch..":") then
mapframeArgs[name] = val
end
-- Check if this is a param to switch. If so, store the name and switch
-- values in switchParams table.
local switchList = string.match(val, "^"..L10n.str.switch..":(.+)")
if switchList ~= nil then
local values = util.tableFromList(switchList)
if #values == 1 then
error(string.format(L10n.error.oneSwitchValue, name), 0)
end
switchParams[name] = values
end
end
if util.tableCount(switchParams) == 0 then
error(L10n.error.noSwitchLists, 0)
end
local switchCount = util.subTablesCount(switchParams)
if not switchCount then
error(L10n.error.switchMismatches, 0)
elseif switchCount > #switchLabels then
error(string.format(L10n.error.fewerSwitchLabels, switchCount, #switchLabels), 0)
end
-- Ensure a plain frame will be used (thumbnail will be built by the
-- make.switcherHtml function if required, so that switcher options are
-- inside the thumnail)
mapframeArgs.plain = "yes"
local switcher = {}
for i = 1, switchCount do
local label = switchLabels[i]
for name, values in pairs(switchParams) do
mapframeArgs[name] = values[i]
end
table.insert(switcher, {
map = p._main(mapframeArgs),
label = "Show "..label
})
end
return make.switcherHtml(switcher, {
alignment = args["frame-align"] or "right",
isThumbnail = (args.frame and not args.plain) and true or false,
width = args["frame-width"] or L10n.defaults.frameWidth,
caption = args.text
})
end
function p.withOverlay(_args)
-- Get and trim wikitext for overlay map
local overlayMap = _args.overlay
if type(overlayMap) == 'string' then
overlayMap = overlayMap:match('^%s*(.-)%s*$')
end
local isThumbnail = (util.getParameterValue(_args, "frame") and not util.getParameterValue(_args, "plain")) and true or false
-- Get base map using the _main function, as a plain map
local args = util.trimArgs(_args)
args.plain = "yes"
local basemap = p._main(args)
-- Extract overlay options from args
local overlayOptions = {
width = util.getParameterValue(args, "frameWidth") or L10n.defaults.frameWidth,
height = util.getParameterValue(args, "frameHeight") or L10n.defaults.frameHeight,
align = util.getParameterValue(args, "frameAlign") or L10n.defaults.frameAlign,
border = util.getParameterValue(args, "overlayBorder") or L10n.defaults.overlayBorder,
horizontalAlignment = util.getParameterValue(args, "overlayHorizontalAlignment") or L10n.defaults.overlayHorizontalAlignment,
horizontalOffset = util.getParameterValue(args, "overlayHorizontalOffset") or L10n.defaults.overlayHorizontalOffset,
verticalAlignment = util.getParameterValue(args, "overlayVerticalAlignment") or L10n.defaults.overlayVerticalAlignment,
verticalOffset = util.getParameterValue(args, "overlayVerticalOffset") or L10n.defaults.overlayVerticalOffset,
isThumbnail = isThumbnail,
caption = util.getParameterValue(args, "text") or L10n.defaults.text
}
-- Make the HTML for the overlaying maps
return make.overlayHtml(overlayMap, basemap, overlayOptions)
end
-- Entry point for testcase tests
p.test = util
return p
cbg20zhedgvi7tds8motk323r37gona
33544
33543
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Mapframe]]
33543
Scribunto
text/plain
-- Note: Originally written on English Wikipedia at https://en.wikipedia.org/wiki/Module:Mapframe
--[[----------------------------------------------------------------------------
##### Localisation (L10n) settings #####
Replace values in quotes ("") with localised values
----------------------------------------------------------------------------]]--
local L10n = {}
local wb = mw.wikibase
-- Modue dependencies
local parser -- local copy of https://www.mediawiki.org/wiki/Module:WikitextParser loaded lazily
-- "strict" should not be used, at least until all other modules which require this module are not using globals.
-- Template parameter names (unnumbered versions only)
-- Specify each as either a single string, or a table of strings (aliases)
-- Aliases are checked left-to-right, i.e. `{ "one", "two" }` is equivalent to using `{{{one| {{{two|}}} }}}` in a template
L10n.para = {
display = "display",
type = "type",
id = { "id", "ids" },
from = "from",
raw = "raw",
title = "title",
description = "description",
strokeColor = { "stroke-color", "stroke-colour" },
strokeWidth = "stroke-width",
strokeOpacity = "stroke-opacity",
fill = "fill",
fillOpacity = "fill-opacity",
coord = { "coordinates", "coord" },
marker = "marker",
markerColor = { "marker-color", "marker-colour" },
markerSize = "marker-size",
radius = { "radius", "radius_m" },
radiusKm = "radius_km",
radiusFt = "radius_ft",
radiusMi = "radius_mi",
edges = "edges",
text = "text",
icon = "icon",
zoom = "zoom",
frame = "frame",
plain = "plain",
frameWidth = "frame-width",
frameHeight = "frame-height",
frameCoordinates= { "frame-coordinates", "frame-coord" },
frameLatitude = { "frame-lat", "frame-latitude" },
frameLongitude = { "frame-long", "frame-longitude" },
frameAlign = "frame-align",
switch = "switch",
overlay = "overlay",
overlayBorder = "overlay-border",
overlayHorizontalAlignment = "overlay-horizontal-alignment",
overlayVerticalAlignment = "overlay-vertical-alignment",
overlayHorizontalOffset = "overlay-horizontal-offset",
overlayVerticalOffset = "overlay-vertical-offset"
}
-- Names of other templates this module can extract coordinates from
L10n.template = {
templates = { -- The coord template, as well as templates with output that contains {{coord}}
"Coord", "Coord/sandbox",
"NRHP row", "NRHP row/sandbox",
"WikidataCoord", "WikidataCoord/sandbox", "Wikidatacoord", "Wikidata coord"
},
modules = { -- The coordinates module, as well as modules with output that contains {{coord}}
"Coordinates", "Coordinates/sandbox",
"WikidataCoord", "WikidataCoord/sandbox"
}
}
-- Error messages
L10n.error = {
badDisplayPara = "Invalid display parameter",
noCoords = "Coordinates must be specified on Wikidata or in |" .. ( type(L10n.para.coord)== 'table' and L10n.para.coord[1] or L10n.para.coord ) .. "=",
wikidataCoords = "Coordinates not found on Wikidata",
noCircleCoords = "Circle centre coordinates must be specified, or available via Wikidata",
negativeRadius = "Circle radius must be a positive number",
noRadius = "Circle radius must be specified",
negativeEdges = "Circle edges must be a positive number",
noSwitchPara = "Found only one switch value in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
oneSwitchLabel = "Found only one label in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noSwitchLists = "At least one parameter must have a SWITCH: list",
switchMismatches = "All SWITCH: lists must have the same number of values",
-- "%s" and "%d" tokens will be replaced with strings and numbers when used
oneSwitchValue = "Found only one switch value in |%s=",
fewerSwitchLabels = "Found %d switch values but only %d labels in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noNamedCoords = "No named coordinates found in %s"
}
-- Other strings
L10n.str = {
-- valid values for display parameter, e.g. (|display=inline) or (|display=title) or (|display=inline,title) or (|display=title,inline)
inline = "inline",
title = "title",
dsep = ",", -- separator between inline and title (comma in the example above)
-- valid values for type parameter
line = "line", -- geoline feature (e.g. a road)
shape = "shape", -- geoshape feature (e.g. a state or province)
shapeInverse = "shape-inverse", -- geomask feature (the inverse of a geoshape)
data = "data", -- geoJSON data page on Commons
point = "point", -- single point feature (coordinates)
circle = "circle", -- circular area around a point
named = "named", -- all named coordinates in an article or section
-- Keyword to indicate a switch list. Must NOT use the special characters ^$()%.[]*+-?
switch = "SWITCH",
-- valid values for icon, frame, and plain parameters
affirmedWords = ' '..table.concat({
"add",
"added",
"affirm",
"affirmed",
"include",
"included",
"on",
"true",
"yes",
"y"
}, ' ')..' ',
declinedWords = ' '..table.concat({
"decline",
"declined",
"exclude",
"excluded",
"false",
"none",
"not",
"no",
"n",
"off",
"omit",
"omitted",
"remove",
"removed"
}, ' ')..' '
}
-- Default values for parameters
L10n.defaults = {
display = L10n.str.inline,
text = "Map",
frameWidth = "300",
frameHeight = "200",
frameAlign = "right",
markerColor = "5E74F3",
markerSize = nil,
strokeColor = "#ff0000",
strokeWidth = 6,
edges = 32, -- number of edges used to approximate a circle
overlayBorder = "1px solid white",
overlayHorizontalAlignment = "right",
overlayHorizontalOffset = "0",
overlayVerticalAlignment = "bottom",
overlayVerticalOffset = "0"
}
-- #### End of L10n settings ####
--[[----------------------------------------------------------------------------
Utility methods
----------------------------------------------------------------------------]]--
local util = {}
--[[
Looks up a parameter value based on the id (a key from the L10n.para table) and
optionally a suffix, for parameters that can be suffixed (e.g. type2 is type
with suffix 2).
@param {table} args key-value pairs of parameter names and their values
@param {string} param_id id for parameter name (key from the L10n.para table)
@param {string} [suffix] suffix for parameter name
@returns {string|nil} parameter value if found, or nil if not found
]]--
function util.getParameterValue(args, param_id, suffix)
suffix = suffix or ''
if type( L10n.para[param_id] ) ~= 'table' then
return args[L10n.para[param_id]..suffix]
end
for _i, paramAlias in ipairs(L10n.para[param_id]) do
if args[paramAlias..suffix] then
return args[paramAlias..suffix]
end
end
return nil
end
--[[
Trim whitespace from args, and remove empty args. Also fix control characters.
@param {table} argsTable
@returns {table} trimmed args table
]]--
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(key) == 'string' and type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
-- control characters inside json need to be escaped, but stripping them is simpler
-- See also T214984
-- However, *don't* strip control characters from wikitext (text or description parameters) or you'll break strip markers
-- Alternatively it might be better to only strip control char from raw parameter content
if util.matchesParam('text', key) or util.matchesParam('description', key, key:gsub('^%D+(%d+)$', '%1') ) then
cleanArgs[key] = val
else
cleanArgs[key] = val:gsub('%c',' ')
end
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
--[[
Check if a parameter name matches an unlocalized parameter key
@param {string} key - the unlocalized parameter name to search through
@param {string} name - the localized parameter name to check
@param {string|nil} - an optional suffix to apply to the value(s) from the localization key
@returns {boolean} true if the name matches the parameter, false otherwise
]]--
function util.matchesParam(key, name, suffix)
local param = L10n.para[key]
suffix = suffix or ''
if type(param) == 'table' then
for _, v in pairs(param) do
if (v .. suffix) == name then return true end
end
return false
end
return ((param .. suffix) == name)
end
--[[
Check if a value is affirmed (one of the values in L10n.str.affirmedWords)
@param {string} val Value to be checked
@returns {boolean} true if affirmed, false otherwise
]]--
function util.isAffirmed(val)
if not(val) then return false end
return string.find(L10n.str.affirmedWords, ' '..val..' ', 1, true ) and true or false
end
--[[
Check if a value is declined (one of the values in L10n.str.declinedWords)
@param {string} val Value to be checked
@returns {boolean} true if declined, false otherwise
]]--
function util.isDeclined(val)
if not(val) then return false end
return string.find(L10n.str.declinedWords , ' '..val..' ', 1, true ) and true or false
end
--[[
Check if the name of a template matches the known coord templates or wrappers
(in L10n.template.templates and L10n.template.modules). The name is normalised
when checked, so e.g. the names "Coord", "coord", and " Coord" all return true.
@param {string} name
@returns {boolean} true if it is a coord template or wrapper, false otherwise
]]--
function util.isCoordTemplateOrWrapper(name)
name = mw.text.trim(name)
local modName = mw.ustring.gsub(name, '#invoke:', '')
local inputTitle = mw.title.new(modName, (name ~= modName) and 'Module' or 'Template')
if not inputTitle then
return false
end
-- Create (or reuse) mw.title objects for each known coord template/wrapper.
-- Stored in L10n.template.title so that they don't need to be recreated
-- each time this function is called
if not L10n.template.titles then
L10n.template.titles = {}
for _, v in pairs(L10n.template.templates) do
table.insert(L10n.template.titles, mw.title.new(v, 'Template'))
end
for _, v in pairs(L10n.template.modules) do
table.insert(L10n.template.titles, mw.title.new(v, 'Module'))
end
end
for _, templateTitle in pairs(L10n.template.titles) do
if mw.title.equals(inputTitle, templateTitle) then
return true
end
end
return false
end
--[[
Recursively extract coord templates which have a name parameter.
@param {string} wikitext
@returns {table} table sequence of coord templates
]]--
function util.extractCoordTemplates(wikitext)
local output = {}
local templates = mw.ustring.gmatch(wikitext, '{%b{}}')
for template in templates do
local templateName = mw.ustring.match(template, '{{([^}|]+)')
local nameParam = mw.ustring.match(template, "|%s*name%s*=%s*[^}|]+")
if util.isCoordTemplateOrWrapper(templateName) then
if nameParam then table.insert(output, template) end
elseif mw.ustring.find(mw.ustring.sub(template, 2), "{{") then
local subOutput = util.extractCoordTemplates(mw.ustring.sub(template, 2))
for _, t in pairs(subOutput) do
table.insert(output, t)
end
end
end
-- ensure coords are not using title display
for k, v in pairs(output) do
output[k] = mw.ustring.gsub(v, "|%s*display%s*=[^|}]+", "|display=inline")
end
return output
end
--[[
Gets all named coordinates from a page or a section of a page.
@param {string|nil} page Page name, or name#section, to get named coordinates
from. If the name is omitted, i.e. #section or nil or empty string, then
the current page will be used.
@returns {table} sequence of {coord, name, description} tables where coord is
the coordinates in a format suitable for #util.parseCoords, name is a string,
and description is a string (coordinates in a format suitable for displaying
to the reader). If for some reason the name can't be found, the description
is nil and the name contains display-format coordinates.
@throws {L10n.error.noNamedCoords} if no named coordinates are found.
]]--
function util.getNamedCoords(page)
local parts = mw.text.split(page or "", "#", true)
local name = parts[1] == "" and mw.title.getCurrentTitle().prefixedText or parts[1]
local section = parts[2]
local title = mw.title.new(name)
if title.isRedirect then
title = title.redirectTarget
end
local pageWikitext = title:getContent()
if section then
if parser == nil then
-- load [[Module:WikitextParser]] lazily so it is only transcluded on pages that use it
parser = require("Module:WikitextParser")
end
pageWikitext = parser.getSection(pageWikitext, section) or ''
end
local coordTemplates = util.extractCoordTemplates(pageWikitext)
if #coordTemplates == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
local frame = mw.getCurrentFrame()
local sep = "________"
local expandedContent = frame:preprocess(table.concat(coordTemplates, sep))
local expandedTemplates = mw.text.split(expandedContent, sep)
local namedCoords = {}
for _, expandedTemplate in pairs(expandedTemplates) do
local coord = mw.ustring.match(expandedTemplate, "<span class=\"geo%-dec\".->(.-)</span>")
if coord then
local coordname = (
-- name specified by a wrapper template, e.g [[Article|Name]]
mw.ustring.match(expandedTemplate, "<span class=\"mapframe%-coord%-name\">(.-)</span>") or
-- name passed into coord template
mw.ustring.match(expandedTemplate, "<span class=\"fn org\">(.-)</span>") or
-- default to the coordinates if the name can't be retrieved
coord
)
local description = coordname ~= coord and coord
table.insert(namedCoords, {
coord=mw.ustring.gsub(coord, "[° ]", "_"),
name=coordname, description=description
})
end
end
if #namedCoords == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
return namedCoords
end
--[[
Parse coordinate values from the params passed in a GeoHack url (such as
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1_2_N_3_4_W_ or
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1.23_S_4.56_E_ )
or non-url string in the same format (such as `1_2_N_3_4_W_` or `1.23_S_4.56_E_`)
@param {string} coords string containing coordinates
@returns {number, number} latitude, longitude
]]--
function util.parseCoords(coords)
local coordsPatt
if mw.ustring.find(coords, "params=", 1, true) then
-- prevent false matches from page name, e.g. ?pagename=Lorem_S._Ipsum
coordsPatt = 'params=([_%.%d]+[NS][_%.%d]+[EW])'
else
-- not actually a geohack url, just the same format
coordsPatt = '[_%.%d]+[NS][_%.%d]+[EW]'
end
local parts = mw.text.split((mw.ustring.match(coords, coordsPatt) or ''), '_')
local lat_d = tonumber(parts[1])
assert(lat_d, "Unable to get latitude from input '"..coords.."'.")
local lat_m = tonumber(parts[2]) -- nil if coords are in decimal format
local lat_s = lat_m and tonumber(parts[3]) -- nil if coords are either in decimal format or degrees and minutes only
local lat = lat_d + (lat_m or 0)/60 + (lat_s or 0)/3600
if parts[#parts/2] == 'S' then
lat = lat * -1
end
local long_d = tonumber(parts[1+#parts/2])
assert(long_d, "Unable to get longitude from input '"..coords.."'.")
local long_m = tonumber(parts[2+#parts/2]) -- nil if coords are in decimal format
local long_s = long_m and tonumber(parts[3+#parts/2]) -- nil if coords are either in decimal format or degrees and minutes only
local long = long_d + (long_m or 0)/60 + (long_s or 0)/3600
if parts[#parts] == 'W' then
long = long * -1
end
return lat, long
end
--[[
Get coordinates from a Wikidata item
@param {string} item_id Wikidata item id (Q number)
@returns {number, number} latitude, longitude
@throws {L10n.error.noCoords} if item_id is invalid or the item does not exist
@throws {L10n.error.wikidataCoords} if the the item does not have a P625
statement (coordinates), or it is set to "no value"
]]--
function util.wikidataCoords(item_id)
if not (item_id and wb.isValidEntityId(item_id) and wb.entityExists(item_id)) then
error(L10n.error.noCoords, 0)
end
local coordStatements = wb.getBestStatements(item_id, 'P625')
if not coordStatements or #coordStatements == 0 then
error(L10n.error.wikidataCoords, 0)
end
local hasNoValue = ( coordStatements[1].mainsnak and (coordStatements[1].mainsnak.snaktype == 'novalue' or coordStatements[1].mainsnak.snaktype == 'somevalue') )
if hasNoValue then
error(L10n.error.wikidataCoords, 0)
end
local wdCoords = coordStatements[1]['mainsnak']['datavalue']['value']
return tonumber(wdCoords['latitude']), tonumber(wdCoords['longitude'])
end
--[[
Creates a polygon that approximates a circle
@param {number} lat Latitude
@param {number} long Longitude
@param {number} radius Radius in metres
@param {number} n Number of edges for the polygon
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
]]--
function util.circleToPolygon(lat, long, radius, n) -- n is number of edges
-- Based on https://github.com/gabzim/circle-to-polygon, ISC licence
local function offset(cLat, cLon, distance, bearing)
local lat1 = math.rad(cLat)
local lon1 = math.rad(cLon)
local dByR = distance / 6378137 -- distance divided by 6378137 (radius of the earth) wgs84
local offet_lat = math.asin(
math.sin(lat1) * math.cos(dByR) +
math.cos(lat1) * math.sin(dByR) * math.cos(bearing)
)
local offet_lon = lon1 + math.atan2(
math.sin(bearing) * math.sin(dByR) * math.cos(lat1),
math.cos(dByR) - math.sin(lat1) * math.sin(offet_lat)
)
return {math.deg(offet_lon), math.deg(offet_lat)}
end
local coordinates = {};
local i = 0;
while i < n do
table.insert(coordinates,
offset(lat, long, radius, (2*math.pi*i*-1)/n)
)
i = i + 1
end
table.insert(coordinates, offset(lat, long, radius, 0))
return coordinates
end
--[[
Get the number of key-value pairs in a table, which might not be a sequence.
@param {table} t
@returns {number} count of key-value pairs
]]--
function util.tableCount(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
--[[
For a table where the values are all tables, returns either the util.tableCount
of the subtables if they are all the same, or nil if they are not all the same.
@param {table} t
@returns {number|nil} count of key-value pairs of subtable, or nil if subtables
have different counts
]]--
function util.subTablesCount(t)
local count = nil
for k, v in pairs(t) do
if count == nil then
count = util.tableCount(v)
elseif count ~= util.tableCount(v) then
return nil
end
end
return count
end
--[[
Splits a list into a table sequence. The items in the list may be separated by
commas, or by semicolons (if items may contain commas), or by "###" (if items
may contain semicolons).
@param {string} listString
@returns {table} sequence of list items
]]--
function util.tableFromList(listString)
if type(listString) ~= "string" or listString == "" then return nil end
local separator = (mw.ustring.find(listString, "###", 0, true ) and "###") or
(mw.ustring.find(listString, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
return mw.text.split(listString, pattern)
end
-- Boolean in outer scope indicating if Kartographer should be able to
-- automatically calculate coordinates (see phab:T227402)
local coordsDerivedFromFeatures = false;
--[[----------------------------------------------------------------------------
Make methods: These take in a table of arguments, and return either a string
or a table to be used in the eventual output.
----------------------------------------------------------------------------]]--
local make = {}
--[[
Makes content to go inside the maplink or mapframe tag.
@param {table} args
@returns {string} tag content
]]--
function make.content(args)
if util.getParameterValue(args, 'raw') then
coordsDerivedFromFeatures = true -- Kartographer should be able to automatically calculate coords from raw geoJSON
return util.getParameterValue(args, 'raw')
end
local content = {}
local argsExpanded = {}
for k, v in pairs(args) do
local index = string.match( k, '^[^0-9]+([0-9]*)$' )
if index ~= nil then
local indexNumber
if index ~= '' then
indexNumber = tonumber(index)
else
indexNumber = 1
end
if argsExpanded[indexNumber] == nil then
argsExpanded[indexNumber] = {}
end
argsExpanded[indexNumber][ string.gsub(k, index, '') ] = v
end
end
for contentIndex, contentArgs in pairs(argsExpanded) do
local argType = util.getParameterValue(contentArgs, "type")
-- Kartographer automatically calculates coords if geolines/shapes are used (T227402)
if not coordsDerivedFromFeatures then
coordsDerivedFromFeatures = ( argType == L10n.str.line or argType == L10n.str.shape ) and true or false
end
if argType == L10n.str.named then
local namedCoords = util.getNamedCoords(util.getParameterValue(contentArgs, "from"))
local typeKey = type(L10n.para.type) == "table" and L10n.para.type[1] or L10n.para.type
local coordKey = type(L10n.para.coord) == "table" and L10n.para.coord[1] or L10n.para.coord
local titleKey = type(L10n.para.title) == "table" and L10n.para.title[1] or L10n.para.title
local descKey = type(L10n.para.description) == "table" and L10n.para.description[1] or L10n.para.description
for _, namedCoord in pairs(namedCoords) do
contentArgs[typeKey] = "point"
contentArgs[coordKey] = namedCoord.coord
contentArgs[titleKey] = namedCoord.name
contentArgs[descKey] = namedCoord.description
content[#content+1] = make.contentJson(contentArgs)
end
else
content[#content + 1] = make.contentJson(contentArgs)
end
end
--Single item, no array needed
if #content==1 then return content[1] end
--Multiple items get placed in a FeatureCollection
local contentArray = '[\n' .. table.concat( content, ',\n') .. '\n]'
return contentArray
end
--[[
Make coordinates from the coord arg, or the id arg, or the current page's
Wikidata item.
@param {table} args
@param {boolean} [plainOutput]
@returns {Mixed} Either:
{number, number} latitude, longitude if plainOutput is true; or
{table} table sequence of longitude, then latitude (gives the required format
for GeoJSON when encoded)
]]--
function make.coords(args, plainOutput)
local coords, lat, long
local frame = mw.getCurrentFrame()
if util.getParameterValue(args, 'coord') then
coords = frame:preprocess( util.getParameterValue(args, 'coord') )
lat, long = util.parseCoords(coords)
else
lat, long = util.wikidataCoords(util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
end
if plainOutput then
return lat, long
end
return {[0] = long, [1] = lat}
end
--[[
Makes a table of coordinates that approximate a circle.
@param {table} args
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
@throws {L10n.error.noCircleCoords} if centre coordinates are not specified
@throws {L10n.error.noRadius} if radius is not specified
@throws {L10n.error.negativeRadius} if radius is negative or zero
@throws {L10n.error.negativeEdges} if edges is negative or zero
]]--
function make.circleCoords(args)
local lat, long = make.coords(args, true)
local radius = util.getParameterValue(args, 'radius')
if not radius then
radius = util.getParameterValue(args, 'radiusKm') and tonumber(util.getParameterValue(args, 'radiusKm'))*1000
if not radius then
radius = util.getParameterValue(args, 'radiusMi') and tonumber(util.getParameterValue(args, 'radiusMi'))*1609.344
if not radius then
radius = util.getParameterValue(args, 'radiusFt') and tonumber(util.getParameterValue(args, 'radiusFt'))*0.3048
end
end
end
local edges = util.getParameterValue(args, 'edges') or L10n.defaults.edges
if not lat or not long then
error(L10n.error.noCircleCoords, 0)
elseif not radius then
error(L10n.error.noRadius, 0)
elseif tonumber(radius) <= 0 then
error(L10n.error.negativeRadius, 0)
elseif tonumber(edges) <= 0 then
error(L10n.error.negativeEdges, 0)
end
return util.circleToPolygon(lat, long, radius, tonumber(edges))
end
--[[
Makes JSON data for a feature
@param contentArgs args for this feature. Keys must be the non-suffixed version
of the parameter names, i.e. use type, stroke, fill,... rather than type3,
stroke3, fill3,...
@returns {string} JSON encoded data
]]--
function make.contentJson(contentArgs)
local data = {}
if util.getParameterValue(contentArgs, 'type') == L10n.str.point or util.getParameterValue(contentArgs, 'type') == L10n.str.circle then
local isCircle = util.getParameterValue(contentArgs, 'type') == L10n.str.circle
data.type = "Feature"
data.geometry = {
type = isCircle and "LineString" or "Point",
coordinates = isCircle and make.circleCoords(contentArgs) or make.coords(contentArgs)
}
data.properties = {
title = util.getParameterValue(contentArgs, 'title') or mw.getCurrentFrame():getParent():getTitle()
}
if isCircle then
-- TODO: This is very similar to below, should be extracted into a function
data.properties.stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor
data.properties["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
data.properties['fill-opacity'] = fillOpacity and tonumber(fillOpacity) or 0.6
end
else -- is a point
local markerSymbol = util.getParameterValue(contentArgs, 'marker') or L10n.defaults.marker
-- allow blank to be explicitly specified, for overriding infoboxes or other templates with a default value
if markerSymbol ~= "blank" then
data.properties["marker-symbol"] = markerSymbol
end
data.properties["marker-color"] = util.getParameterValue(contentArgs, 'markerColor') or L10n.defaults.markerColor
data.properties["marker-size"] = util.getParameterValue(contentArgs, 'markerSize') or L10n.defaults.markerSize
end
else
data.type = "ExternalData"
if util.getParameterValue(contentArgs, 'type') == L10n.str.data or util.getParameterValue(contentArgs, 'from') then
data.service = "page"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.line then
data.service = "geoline"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shape then
data.service = "geoshape"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shapeInverse then
data.service = "geomask"
end
if util.getParameterValue(contentArgs, 'id') or (not (util.getParameterValue(contentArgs, 'from')) and wb.getEntityIdForCurrentPage()) then
data.ids = util.getParameterValue(contentArgs, 'id') or wb.getEntityIdForCurrentPage()
else
data.title = util.getParameterValue(contentArgs, 'from')
end
data.properties = {
stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor,
["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
}
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill and (data.service == "geoshape" or data.service == "geomask") then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
if fillOpacity then
data.properties['fill-opacity'] = tonumber(fillOpacity)
end
end
end
data.properties.title = util.getParameterValue(contentArgs, 'title') or mw.title.getCurrentTitle().text
if util.getParameterValue(contentArgs, 'description') then
data.properties.description = util.getParameterValue(contentArgs, 'description')
end
return mw.text.jsonEncode(data)
end
--[[
Makes attributes for the maplink or mapframe tag.
@param {table} args
@param {boolean} [isTitle] Tag is to be displayed in the title of page rather
than inline
@returns {table<string,string>} key-value pairs of attribute names and values
]]--
function make.tagAttribs(args, isTitle)
local attribs = {}
if util.getParameterValue(args, 'zoom') then
attribs.zoom = util.getParameterValue(args, 'zoom')
end
if util.isDeclined(util.getParameterValue(args, 'icon')) then
attribs.class = "no-icon"
end
if util.getParameterValue(args, 'type') == L10n.str.point and not coordsDerivedFromFeatures then
local lat, long = make.coords(args, 'plainOutput')
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
if util.isAffirmed(util.getParameterValue(args, 'frame')) and not(isTitle) then
attribs.width = util.getParameterValue(args, 'frameWidth') or L10n.defaults.frameWidth
attribs.height = util.getParameterValue(args, 'frameHeight') or L10n.defaults.frameHeight
if util.getParameterValue(args, 'frameCoordinates') then
local frameLat, frameLong = util.parseCoords(util.getParameterValue(args, 'frameCoordinates'))
attribs.latitude = frameLat
attribs.longitude = frameLong
else
if util.getParameterValue(args, 'frameLatitude') then
attribs.latitude = util.getParameterValue(args, 'frameLatitude')
end
if util.getParameterValue(args, 'frameLongitude') then
attribs.longitude = util.getParameterValue(args, 'frameLongitude')
end
end
if not attribs.latitude and not attribs.longitude and not coordsDerivedFromFeatures then
local success, lat, long = pcall(util.wikidataCoords, util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
if success then
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
end
if util.getParameterValue(args, 'frameAlign') then
attribs.align = util.getParameterValue(args, 'frameAlign')
end
if util.isAffirmed(util.getParameterValue(args, 'plain')) then
attribs.frameless = "1"
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
return attribs
end
--[[
Makes maplink wikitext that will be located in the top-right of the title of the
page (the same place where coords with |display=title are positioned).
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.titleOutput(args, tagContent)
local titleTag = mw.text.tag('maplink', make.tagAttribs(args, true), tagContent)
local spanAttribs = {
style = "font-size: small;",
id = "mapframe-coordinates"
}
local indicatorContent = mw.text.tag('span', spanAttribs, titleTag)
return mw.getCurrentFrame():extensionTag {
name = "indicator",
content = indicatorContent,
args = {
name = "zzz-mapframe" --zzz: show as last indicator
}
}
end
--[[
Makes maplink or mapframe wikitext that will be located inline.
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.inlineOutput(args, tagContent)
local tagName = 'maplink'
if util.getParameterValue(args, 'frame') then
tagName = 'mapframe'
end
return mw.text.tag(tagName, make.tagAttribs(args), tagContent)
end
--[[
Makes the HTML required for the swicther to work, including the templatestyles
tag.
@param {table} params table sequence of {map, label} tables
@param {string} params{}.map Wikitext for mapframe map
@param {string} params{}.label Label text for swicther option
@param {table} options
@param {string} options.alignment "left" or "center" or "right"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} options.width Width of frame, e.g. "200"
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} swicther HTML
]]--
function make.switcherHtml(params, options)
options = options or {}
local frame = mw.getCurrentFrame()
local styles = frame:extensionTag{
name = "templatestyles",
args = {src = "Template:Maplink/styles-multi.css"}
}
local container = mw.html.create("div")
:addClass("switcher-container")
:addClass("mapframe-multi-container")
if options.alignment == "left" or options.alignment == "right" then
container:addClass("float"..options.alignment)
else -- alignment is "center"
container:addClass("center")
end
for i = 1, #params do
container
:tag("div")
:wikitext(params[i].map)
:tag("span")
:addClass("switcher-label")
:css("display", "none")
:wikitext(mw.text.trim(params[i].label))
end
if not options.isThumbnail then
return styles .. tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.alignment, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-multi-outer-container")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.alignment == "left" or options.alignment == "right" then
outerCountainer:addClass("float"..options.alignment)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return styles .. tostring(outerCountainer)
end
--[[
Makes the HTML required for an overlay map to work
tag.
@param {string} overlayMap wikitext for the overlay map
@param {string} baseMap wikitext for the base map
@param {table} options various styling/display options
@param {string} options.align "left" or "center" or "right"
@param {string|number} options.width Width of the base map, e.g. "300"
@param {string|number} options.width Height of the base map, e.g. "200"
@param {string} options.border Border style for the overlayed map, e.g. "1px solid white"
@param {string} options.horizontalAlignment Horizontal alignment for overlay map, "left" or "right"
@param {string|number} options.horizontalOffset Horizontal offset in pixels from the alignment edge, e.g "10"
@param {string} options.verticalAlignment Vertical alignment for overlay map, "top" or "bottom"
@param {string|number} options.verticalOffset Vertical offset in pixels from the alignment edge, e.g. is "10"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} HTML for basemap with overlay
]]--
function make.overlayHtml(overlayMap, baseMap, options)
options = options or {}
local containerFloatClass = "float"..(options.align or "none")
if options.align == "center" then
containerFloatClass = "center"
end
local containerStyle = {
position = "relative",
width = options.width .. "px",
height = options.height .. "px",
overflow = "hidden" -- mobile/minerva tends to add scrollbars for a couple of pixels
}
if options.align == "center" then
containerStyle["margin-left"] = "auto"
containerStyle["margin-right"] = "auto"
end
local container = mw.html.create("div")
:addClass("mapframe-withOverlay-container")
:addClass(containerFloatClass)
:addClass("noresize")
:css(containerStyle)
local overlayStyle = {
position = "absolute",
["z-index"] = "1",
border = options.border or "1px solid white"
}
if options.horizontalAlignment == "right" then
overlayStyle.right = options.horizontalOffset .. "px"
else
overlayStyle.left = options.horizontalOffset .. "px"
end
if options.verticalAlignment == "bottom" then
overlayStyle.bottom = options.verticalOffset .. "px"
else
overlayStyle.top = options.verticalOffset .. "px"
end
local overlayDiv = mw.html.create("div")
:css(overlayStyle)
:wikitext(overlayMap)
container
:node(overlayDiv)
:wikitext(baseMap)
if not options.isThumbnail then
return tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.align, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-withOverlay-outerContainer")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.align == "left" or options.align == "right" then
outerCountainer:addClass("t"..options.align)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return tostring(outerCountainer)
end
--[[----------------------------------------------------------------------------
Package to be exported, i.e. methods which will available to templates and
other modules.
----------------------------------------------------------------------------]]--
local p = {}
-- Entry point for templates
function p.main(frame)
local parent = frame.getParent(frame)
-- Check for overlay option
local overlay = util.getParameterValue(parent.args, 'overlay')
local hasOverlay = overlay and mw.text.trim(overlay) ~= ""
-- Check for switch option
local switch = util.getParameterValue(parent.args, 'switch')
local isMulti = switch and mw.text.trim(switch) ~= ""
-- Create output by choosing method to suit options
local output
if hasOverlay then
output = p.withOverlay(parent.args)
elseif isMulti then
output = p.multi(parent.args)
else
output = p._main(parent.args)
end
-- Preprocess output before returning it
return frame:preprocess(output)
end
-- Entry points for modules
function p._main(_args)
local args = util.trimArgs(_args)
local tagContent = make.content(args)
local display = mw.text.split(util.getParameterValue(args, 'display') or L10n.defaults.display, '%s*' .. L10n.str.dsep .. '%s*')
local displayInTitle = display[1] == L10n.str.title or display[2] == L10n.str.title
local displayInline = display[1] == L10n.str.inline or display[2] == L10n.str.inline
local output
if displayInTitle and displayInline then
output = make.titleOutput(args, tagContent) .. make.inlineOutput(args, tagContent)
elseif displayInTitle then
output = make.titleOutput(args, tagContent)
elseif displayInline then
output = make.inlineOutput(args, tagContent)
else
error(L10n.error.badDisplayPara)
end
return output
end
function p.multi(_args)
local args = util.trimArgs(_args)
if not args[L10n.para.switch] then error(L10n.error.noSwitchPara, 0) end
local switchParamValue = util.getParameterValue(args, 'switch')
local switchLabels = util.tableFromList(switchParamValue)
if #switchLabels == 1 then error(L10n.error.oneSwitchLabel, 0) end
local mapframeArgs = {}
local switchParams = {}
for name, val in pairs(args) do
-- Copy to mapframeArgs, if not the switch labels or a switch parameter
if val ~= switchParamValue and not string.match(val, "^"..L10n.str.switch..":") then
mapframeArgs[name] = val
end
-- Check if this is a param to switch. If so, store the name and switch
-- values in switchParams table.
local switchList = string.match(val, "^"..L10n.str.switch..":(.+)")
if switchList ~= nil then
local values = util.tableFromList(switchList)
if #values == 1 then
error(string.format(L10n.error.oneSwitchValue, name), 0)
end
switchParams[name] = values
end
end
if util.tableCount(switchParams) == 0 then
error(L10n.error.noSwitchLists, 0)
end
local switchCount = util.subTablesCount(switchParams)
if not switchCount then
error(L10n.error.switchMismatches, 0)
elseif switchCount > #switchLabels then
error(string.format(L10n.error.fewerSwitchLabels, switchCount, #switchLabels), 0)
end
-- Ensure a plain frame will be used (thumbnail will be built by the
-- make.switcherHtml function if required, so that switcher options are
-- inside the thumnail)
mapframeArgs.plain = "yes"
local switcher = {}
for i = 1, switchCount do
local label = switchLabels[i]
for name, values in pairs(switchParams) do
mapframeArgs[name] = values[i]
end
table.insert(switcher, {
map = p._main(mapframeArgs),
label = "Show "..label
})
end
return make.switcherHtml(switcher, {
alignment = args["frame-align"] or "right",
isThumbnail = (args.frame and not args.plain) and true or false,
width = args["frame-width"] or L10n.defaults.frameWidth,
caption = args.text
})
end
function p.withOverlay(_args)
-- Get and trim wikitext for overlay map
local overlayMap = _args.overlay
if type(overlayMap) == 'string' then
overlayMap = overlayMap:match('^%s*(.-)%s*$')
end
local isThumbnail = (util.getParameterValue(_args, "frame") and not util.getParameterValue(_args, "plain")) and true or false
-- Get base map using the _main function, as a plain map
local args = util.trimArgs(_args)
args.plain = "yes"
local basemap = p._main(args)
-- Extract overlay options from args
local overlayOptions = {
width = util.getParameterValue(args, "frameWidth") or L10n.defaults.frameWidth,
height = util.getParameterValue(args, "frameHeight") or L10n.defaults.frameHeight,
align = util.getParameterValue(args, "frameAlign") or L10n.defaults.frameAlign,
border = util.getParameterValue(args, "overlayBorder") or L10n.defaults.overlayBorder,
horizontalAlignment = util.getParameterValue(args, "overlayHorizontalAlignment") or L10n.defaults.overlayHorizontalAlignment,
horizontalOffset = util.getParameterValue(args, "overlayHorizontalOffset") or L10n.defaults.overlayHorizontalOffset,
verticalAlignment = util.getParameterValue(args, "overlayVerticalAlignment") or L10n.defaults.overlayVerticalAlignment,
verticalOffset = util.getParameterValue(args, "overlayVerticalOffset") or L10n.defaults.overlayVerticalOffset,
isThumbnail = isThumbnail,
caption = util.getParameterValue(args, "text") or L10n.defaults.text
}
-- Make the HTML for the overlaying maps
return make.overlayHtml(overlayMap, basemap, overlayOptions)
end
-- Entry point for testcase tests
p.test = util
return p
cbg20zhedgvi7tds8motk323r37gona
Tempilet:Xt
10
2727
33545
2026-04-03T01:40:33Z
en>Primefac
0
Primefac moved page [[Template:Xt]] to [[Template:Example text]] over redirect: expand name for clarity
33545
wikitext
text/x-wiki
#REDIRECT [[Template:Example text]]
{{Redirect category shell|
{{R from move}}
}}
6wp7cp03bm6mrd7rqdaeekj99exkxko
33546
33545
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Xt]]
33545
wikitext
text/x-wiki
#REDIRECT [[Template:Example text]]
{{Redirect category shell|
{{R from move}}
}}
6wp7cp03bm6mrd7rqdaeekj99exkxko
Tempilet:Box-shadow border
10
2728
33547
2021-04-24T05:24:06Z
en>Izno
0
you missed one
33547
wikitext
text/x-wiki
{{#switch:{{{1|all}}}
| a | all | #default = box-shadow: inset {{{w|{{{3|1px}}}}}} {{{w|{{{3|1px}}}}}} 0 {{{c1|{{{c|{{{2|#000}}}}}}}}}, inset -{{{w|{{{3|1px}}}}}} -{{{w|{{{3|1px}}}}}} 0 {{{c2|{{{c|{{{2|#000}}}}}}}}};
| t | top = box-shadow: inset 0 {{{w|{{{3|1px}}}}}} 0 0 {{{c|{{{2|#000}}}}}};
| b | bottom = box-shadow: inset 0 -{{{w|{{{3|1px}}}}}} 0 0 {{{c|{{{2|#000}}}}}};
| tb | bt | top bottom | bottom top = box-shadow: inset 0 {{{w|{{{3|1px}}}}}} 0 0 {{{c1|{{{c|{{{2|#000}}}}}}}}}, inset 0 -{{{w|{{{3|1px}}}}}} 0 0 {{{c2|{{{c|{{{2|#000}}}}}}}}};
| lr | rl | left right | right left = box-shadow: inset {{{w|{{{3|1px}}}}}} 0 0 0 {{{c1|{{{c|{{{2|#000}}}}}}}}}, inset -{{{w|{{{3|1px}}}}}} 0 0 0 {{{c2|{{{c|{{{2|#000}}}}}}}}};
| l | left = box-shadow: inset {{{w|{{{3|1px}}}}}} 0 0 0 {{{c|{{{2|#000}}}}}};
| r | right = box-shadow: inset -{{{w|{{{3|1px}}}}}} 0 0 0 {{{c|{{{2|#000}}}}}};
}}<noinclude>
{{Documentation}}
</noinclude>
rurbhtylkzxmynscha2ck5lpu2wervo
33548
33547
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Box-shadow_border]]
33547
wikitext
text/x-wiki
{{#switch:{{{1|all}}}
| a | all | #default = box-shadow: inset {{{w|{{{3|1px}}}}}} {{{w|{{{3|1px}}}}}} 0 {{{c1|{{{c|{{{2|#000}}}}}}}}}, inset -{{{w|{{{3|1px}}}}}} -{{{w|{{{3|1px}}}}}} 0 {{{c2|{{{c|{{{2|#000}}}}}}}}};
| t | top = box-shadow: inset 0 {{{w|{{{3|1px}}}}}} 0 0 {{{c|{{{2|#000}}}}}};
| b | bottom = box-shadow: inset 0 -{{{w|{{{3|1px}}}}}} 0 0 {{{c|{{{2|#000}}}}}};
| tb | bt | top bottom | bottom top = box-shadow: inset 0 {{{w|{{{3|1px}}}}}} 0 0 {{{c1|{{{c|{{{2|#000}}}}}}}}}, inset 0 -{{{w|{{{3|1px}}}}}} 0 0 {{{c2|{{{c|{{{2|#000}}}}}}}}};
| lr | rl | left right | right left = box-shadow: inset {{{w|{{{3|1px}}}}}} 0 0 0 {{{c1|{{{c|{{{2|#000}}}}}}}}}, inset -{{{w|{{{3|1px}}}}}} 0 0 0 {{{c2|{{{c|{{{2|#000}}}}}}}}};
| l | left = box-shadow: inset {{{w|{{{3|1px}}}}}} 0 0 0 {{{c|{{{2|#000}}}}}};
| r | right = box-shadow: inset -{{{w|{{{3|1px}}}}}} 0 0 0 {{{c|{{{2|#000}}}}}};
}}<noinclude>
{{Documentation}}
</noinclude>
rurbhtylkzxmynscha2ck5lpu2wervo
Tempilet:Start date
10
2729
33549
2025-03-11T11:58:05Z
en>Primefac
0
Undid revision [[Special:Diff/1279926643|1279926643]] by [[Special:Contributions/Primefac|Primefac]] ([[User talk:Primefac|talk]]) bloody hell, the two of us have a ridiculous ability to edit-conflict (module updated two minutes ago)
33549
wikitext
text/x-wiki
<includeonly>{{#invoke:Date time|generate_date}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using start date with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Start date]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | 3 | 4 | 5 | 6 | 7 | df }}</includeonly><noinclude>
{{documentation}}
</noinclude>
ryuirexkn63z8pry0gkvpkppv2541q9
33550
33549
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Start_date]]
33549
wikitext
text/x-wiki
<includeonly>{{#invoke:Date time|generate_date}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using start date with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:Start date]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | 3 | 4 | 5 | 6 | 7 | df }}</includeonly><noinclude>
{{documentation}}
</noinclude>
ryuirexkn63z8pry0gkvpkppv2541q9
Tempilet:End date
10
2730
33551
2025-03-10T11:01:53Z
en>Gonnym
0
Template now uses [[Module:Date time]] to both generate a date and validate the values
33551
wikitext
text/x-wiki
<includeonly>{{#invoke:Date time|generate_date|template=end date}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using end date with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:End date]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | 3 | 4 | 5 | 6 | 7 | df }}</includeonly><noinclude>
{{documentation}}
</noinclude>
6m23mqv3mwwuptox037l46czuqvo66t
33552
33551
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:End_date]]
33551
wikitext
text/x-wiki
<includeonly>{{#invoke:Date time|generate_date|template=end date}}<!-- Tracking categories
-->{{#invoke:Check for unknown parameters|check|unknown={{Main other|[[Category:Pages using end date with unknown parameters|_VALUE_]]}}|preview=Page using [[Template:End date]] with unknown parameter "_VALUE_"|showblankpositional=1| 1 | 2 | 3 | 4 | 5 | 6 | 7 | df }}</includeonly><noinclude>
{{documentation}}
</noinclude>
6m23mqv3mwwuptox037l46czuqvo66t
Module:Location map/data/Earth
828
2731
33553
2019-11-17T21:50:23Z
en>Sumanuil
0
Blast it.
33553
Scribunto
text/plain
return {
name = 'Earth',
top = 90,
bottom = -90,
left = -180,
right = 180,
image = 'World location map (equirectangular 180).svg',
image1='World location map (equirectangular 180).svg'}
1gh5izdoszwn7ruavo5dysgd43evgoy
33554
33553
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Location_map/data/Earth]]
33553
Scribunto
text/plain
return {
name = 'Earth',
top = 90,
bottom = -90,
left = -180,
right = 180,
image = 'World location map (equirectangular 180).svg',
image1='World location map (equirectangular 180).svg'}
1gh5izdoszwn7ruavo5dysgd43evgoy
Tempilet:Infobox/Columns
10
2732
33555
2024-09-09T21:11:21Z
en>Izno
0
change name
33555
wikitext
text/x-wiki
{{#if:{{{1|}}}{{{2|}}}{{{3|}}}{{{4|}}}|<templatestyles src="Infobox/Columns/styles.css"/>{{plainlist|class=infobox-columns infobox-columns-{{#if:{{{4|}}}|4|{{#if:{{{3|}}}|3|2}}}} {{#if:{{{centered text|}}}||infobox-columns-text-left}}}}
<div>
{{{1|}}}
</div>
<div>
{{{2|}}}
</div><!--
-->{{#if:{{{3|}}}|<div>
{{{3}}}
</div>}}<!--
-->{{#if:{{{4|}}}|<div>
{{{4}}}
</div>}}
{{endplainlist}}}}<noinclude>
{{Documentation}}
</noinclude>
rzt0989b75yhwpr4p467gqn3vde71ia
33556
33555
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox/Columns]]
33555
wikitext
text/x-wiki
{{#if:{{{1|}}}{{{2|}}}{{{3|}}}{{{4|}}}|<templatestyles src="Infobox/Columns/styles.css"/>{{plainlist|class=infobox-columns infobox-columns-{{#if:{{{4|}}}|4|{{#if:{{{3|}}}|3|2}}}} {{#if:{{{centered text|}}}||infobox-columns-text-left}}}}
<div>
{{{1|}}}
</div>
<div>
{{{2|}}}
</div><!--
-->{{#if:{{{3|}}}|<div>
{{{3}}}
</div>}}<!--
-->{{#if:{{{4|}}}|<div>
{{{4}}}
</div>}}
{{endplainlist}}}}<noinclude>
{{Documentation}}
</noinclude>
rzt0989b75yhwpr4p467gqn3vde71ia
Tempilet:Civil navigation
10
2733
33557
2025-10-07T21:33:31Z
en>SirOlgen
0
Linter [[MediaWikiWiki:Special:MyLanguage/Help:Lint errors/night-mode-unaware-background-color|Background color]] fix via [[Special:LintErrors/night-mode-unaware-background-color|error list]] – added missing text color definition(s)
33557
wikitext
text/x-wiki
<includeonly>{{#invoke:Template wrapper|wrap|_template=navbox
|titlestyle= background-color:#CEE0F2;color:black; {{{titlestyle|}}}
|bodystyle= {{#switch:{{{style|}}}|wide=|#default= {{#ifeq:{{{border|}}}|child|margin: 0; float: right; clear: right; width: 25em; margin-bottom: 0.5em;|margin:0;float:right;clear:right;width:25.5em;margin-bottom:0.5em;margin-left:1em;}}}}
|groupstyle= background-color:#eeeeee;color:black; {{{groupstyle|}}}
|belowstyle= background-color:#eeeeee;color:black; {{{belowstyle|}}}
|abovestyle= background-color:#eeeeee;color:black; {{{abovestyle|}}}
|oddstyle= {{#if:{{{odd_color|}}}|background: {{{odd_color|}}};}}
|evenstyle= {{#if:{{{even_color|}}}|background: {{{even_color|}}};}}
|name={{#if:{{{name|}}}|{{{name|}}}|{{{raw_name|}}}}}
|navbar={{#if:{{{raw_name|}}}{{{name|}}}||plain}}
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
2beh07vhv9nqxsw6s2bz3aa1eubjv4c
33558
33557
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Civil_navigation]]
33557
wikitext
text/x-wiki
<includeonly>{{#invoke:Template wrapper|wrap|_template=navbox
|titlestyle= background-color:#CEE0F2;color:black; {{{titlestyle|}}}
|bodystyle= {{#switch:{{{style|}}}|wide=|#default= {{#ifeq:{{{border|}}}|child|margin: 0; float: right; clear: right; width: 25em; margin-bottom: 0.5em;|margin:0;float:right;clear:right;width:25.5em;margin-bottom:0.5em;margin-left:1em;}}}}
|groupstyle= background-color:#eeeeee;color:black; {{{groupstyle|}}}
|belowstyle= background-color:#eeeeee;color:black; {{{belowstyle|}}}
|abovestyle= background-color:#eeeeee;color:black; {{{abovestyle|}}}
|oddstyle= {{#if:{{{odd_color|}}}|background: {{{odd_color|}}};}}
|evenstyle= {{#if:{{{even_color|}}}|background: {{{even_color|}}};}}
|name={{#if:{{{name|}}}|{{{name|}}}|{{{raw_name|}}}}}
|navbar={{#if:{{{raw_name|}}}{{{name|}}}||plain}}
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
2beh07vhv9nqxsw6s2bz3aa1eubjv4c
Module:Location map/data/World
828
2734
33559
2024-01-03T19:11:37Z
en>Pppery (alt)
0
/* top */Convert old-style module redirect to new built-in module redirect
33559
Scribunto
text/plain
return require [[Module:Location map/data/Earth]]
czmg6w16brnqctco2h2qosyhu1lun1y
33560
33559
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Location_map/data/World]]
33559
Scribunto
text/plain
return require [[Module:Location map/data/Earth]]
czmg6w16brnqctco2h2qosyhu1lun1y
Tempilet:Coords
10
2735
33561
2018-02-23T16:29:42Z
en>Primefac
0
Changed protection level for "[[Template:Coords]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
33561
wikitext
text/x-wiki
#REDIRECT [[Template:Coord]]
{{Rcat shell|{{R from modification}}}}
06839ly4it0wlt508fk18o88f8r9an4
33562
33561
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Coords]]
33561
wikitext
text/x-wiki
#REDIRECT [[Template:Coord]]
{{Rcat shell|{{R from modification}}}}
06839ly4it0wlt508fk18o88f8r9an4
Tempilet:Civil conflict sidebar
10
2736
33563
2025-10-03T19:01:22Z
en>Jonesey95
0
fix text color in dark mode; this generally works but may cause problems, in which case revert or try specifying a different CSS value
33563
wikitext
text/x-wiki
<includeonly>{{civil navigation
|name = {{{name|}}}
| above = {{br separated entries|{{{above|}}}|{{#if:{{{partof|}}}|Part of {{{partof}}}}}}}
|state = {{{state|}}}
|style = float:right; clear:right; margin:0.2em 0 0.2em 0.5em; width:{{{width|300px}}}; display:table;
|titlestyle = background-color: #CEE0F2; color:inherit;
|border = {{{border|}}}
|title = <span style="line-height:1.6em">{{#if:{{{title|}}}|{{{title}}}|{{{name}}}}}</span>
|abovestyle = background-color: #eeeeee; color:inherit; vertical-align: middle
|belowstyle = background-color: #eeeeee; color:inherit; vertical-align: middle; {{box-shadow border|t|#aaa|1px}}
|belowclass = {{{belowclass|}}}
|bodyclass = {{{bodyclass|}}}
|listclass = {{{listclass|}}}
|list1 = {{{events|}}}
|below = {{{notes|}}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
ft4pvsfz3wkj8jgeibmyszi88mgyyzu
33564
33563
2026-11-11T22:44:24Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Civil_conflict_sidebar]]
33563
wikitext
text/x-wiki
<includeonly>{{civil navigation
|name = {{{name|}}}
| above = {{br separated entries|{{{above|}}}|{{#if:{{{partof|}}}|Part of {{{partof}}}}}}}
|state = {{{state|}}}
|style = float:right; clear:right; margin:0.2em 0 0.2em 0.5em; width:{{{width|300px}}}; display:table;
|titlestyle = background-color: #CEE0F2; color:inherit;
|border = {{{border|}}}
|title = <span style="line-height:1.6em">{{#if:{{{title|}}}|{{{title}}}|{{{name}}}}}</span>
|abovestyle = background-color: #eeeeee; color:inherit; vertical-align: middle
|belowstyle = background-color: #eeeeee; color:inherit; vertical-align: middle; {{box-shadow border|t|#aaa|1px}}
|belowclass = {{{belowclass|}}}
|bodyclass = {{{bodyclass|}}}
|listclass = {{{listclass|}}}
|list1 = {{{events|}}}
|below = {{{notes|}}}
}}</includeonly><noinclude>
{{documentation}}
</noinclude>
ft4pvsfz3wkj8jgeibmyszi88mgyyzu
Tempilet:Example text
10
2737
33565
2026-04-03T01:40:33Z
en>Primefac
0
Primefac moved page [[Template:Xt]] to [[Template:Example text]] over redirect: expand name for clarity
33565
wikitext
text/x-wiki
{{#ifeq:{{NAMESPACE}}|{{ns:0}}|{{FormattingError|[[:{{safesubst:<noinclude/>#invoke:TEMPLATENAME|main}}]] is only for examples of style and formatting. Do not use it in actual articles.}}|<span class="example" style="font-family: Georgia, 'DejaVu Serif', serif; color: var(--color-content-added, #006400);" {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1|Example text}}}</span>}}<noinclude>
{{Documentation}}
</noinclude>
7n235ara48gqnbnh3ezp3hh3cz76mpf
33566
33565
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Example_text]]
33565
wikitext
text/x-wiki
{{#ifeq:{{NAMESPACE}}|{{ns:0}}|{{FormattingError|[[:{{safesubst:<noinclude/>#invoke:TEMPLATENAME|main}}]] is only for examples of style and formatting. Do not use it in actual articles.}}|<span class="example" style="font-family: Georgia, 'DejaVu Serif', serif; color: var(--color-content-added, #006400);" {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1|Example text}}}</span>}}<noinclude>
{{Documentation}}
</noinclude>
7n235ara48gqnbnh3ezp3hh3cz76mpf
Tempilet:Infobox mapframe/doc/parameters
10
2738
33567
2026-10-09T07:19:46Z
en>Joy
0
sorry, that is actually much uglier, i don't think we should do it even if it feels right Undid 2 revisions from [[Special:Diff/1379310623|1379310623]] until [[Special:Diff/1379311084|1379311084]]
33567
wikitext
text/x-wiki
<includeonly>{{navbar|Template:Infobox mapframe/doc/parameters|plain=y|style=float: right;}}</includeonly><nowiki></nowiki>
*Basic {{template link|Infobox mapframe}} parameters:{{#if:{{{noprefix|}}}||<nowiki></nowiki>
**'''mapframe''' – Specify yes or no to show or hide the map, overriding the default. ''Default:'' {{{mapframe|no}}}{{#if:{{{onByDefault|}}}|, ''but also modified by onByDefault''}}
*** Internal ''onByDefault'' parameter: {{{onByDefault|''not specified''}}}
**{{#if:{{{noprefix|}}}||'''mapframe-coordinates''' or '''mapframe-coord''' or}} '''coordinates''' or '''coord''' – Coordinates to use, instead of any on Wikidata. Use the {{template link|Coord}} template, e.g. {{parameter|coord|2={{template link expanded|Coord|12.34|N|56.78|E}}}}. ''Default:'' {{{mapframe-coordinates|{{{mapframe-coord|{{{coordinates|{{{coord|''coordinates from Wikidata [[d:Property:P625]]''}}}}}}}}}}}}
**'''mapframe-caption''' – Caption for the map. ''Default'': {{{mapframe-caption|''blank'' (or if {{parameter|mapframe-geomask}} is set, "{{xt|Location in {{em|geomask's label}}}}")}}}
**'''mapframe-custom''' – Use a custom map instead of the automatic mapframe. Specify either a {{template link expanded|maplink}} template, or another template that generates a mapframe map, or an image name. If used, most mapframe parameters will be ignored. ''Default'': ''not specified''}}
**{{#if:{{{noprefix|}}}|'''id'''|'''mapframe-id''' or '''id''' or '''qid'''}} – Id (Q-number) of Wikidata item to use. ''Default:'' ''item for current page''
**'''{{#if:{{{noprefix|}}}||mapframe-}}wikidata''' – Set to {{mono|yes}} to show all shape/line features from OpenStreetMap. ''Default:'' {{{mapframe-wikidata|''not specified''}}}
*Customise which features are displayed:
**'''{{#if:{{{noprefix|}}}||mapframe-}}point''' – Turn off display of point feature by setting to {{mono|none}}. Force point marker to be displayed by setting to {{mono|on}}. ''Default:'' {{{mapframe-point|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}shape''' – Turn off display of shape feature by setting to {{mono|none}}. Force display of shape by setting to {{mono|on}}. Use an inverse shape (geomask) instead of a regular shape by setting to {{mono|inverse}}. ''Default:'' {{{mapframe-shape|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}line''' – Turn off display of line feature by setting to {{mono|none}}. Force display of line by setting to {{mono|on}}. ''Default:'' {{{mapframe-line|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask''' – Wikidata item to use as a geomask (everything outside the boundary is shaded darker). Can either be a specific Wikidata item (Q-number), or a property that specifies the item to use (e.g. {{mono|P17}} for {{Wikidata entity link|P17}}, {{mono|P131}} for {{Wikidata entity link|P131}}). ''Default:'' {{{mapframe-geomask|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}switcher''' – set to {{mono|auto}} or {{mono|geomasks}} or {{mono|zooms}} to enable [[Template:Switcher]]-style switching between multiple mapframes. ''Default:'' {{{mapframe-switcher|''not specified''}}}
***{{mono|auto}} – switch geomasks found in {{Wikidata entity link|P276}} and {{Wikidata entity link|P131}} statements on the page's Wikidata item, searching recursively. E.g. an item's city, that city's state, and that state's country.
***{{mono|geomasks}} – switch between the geomasks specified as a comma-separated list of Wikidata items (Q-numbers) in the '''{{#if:{{{noprefix|}}}||mapframe-}}geomask''' parameter
***{{mono|zooms}} – switch between "zoomed in"/"zoomed midway"/"zoomed out", where "zoomed in" is the default zoom (with a minimum of {{mono|3}}), "zoomed out" is {{mono|1}}, and "zoomed midway" is the average
*Other optional parameters:
**'''{{#if:{{{noprefix|}}}||mapframe-}}frame-width''' or '''{{#if:{{{noprefix|}}}||mapframe-}}width''' – Frame width. ''Default:'' {{{mapframe-frame-width|270}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}frame-height''' or '''{{#if:{{{noprefix|}}}||mapframe-}}height''' – Frame height. ''Default:'' {{{mapframe-frame-height|200}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}shape-fill''' – Color used to fill shape features. ''Default:'' {{{mapframe-shape-fill|#606060}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}shape-fill-opacity''' – Opacity level of shape fill, a number between 0 and 1. ''Default:'' {{{mapframe-shape-fill-opacity|0.1}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}stroke-colour''' – Color of line features, and outlines of shape features. ''Default:'' {{{mapframe-stroke-color|{{{mapframe-stroke-colour|#ff0000}}}}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}line-stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}line-stroke-colour''' – Color of line features. ''Default:'' {{{mapframe-line-stroke-color|{{{mapframe-line-stroke-colour|#ff0000}}}}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}shape-stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}shape-stroke-colour''' – Color of outlines of shape features. ''Default:'' {{{mapframe-shape-stroke-color|{{{mapframe-shape-stroke-colour|#ff0000}}}}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}stroke-width''' – Width of line features, and outlines of shape features. ''Default:'' {{{mapframe-stroke-width|2}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}shape-stroke-width''' – Width of outlines of shape features. ''Default:'' {{{mapframe-shape-stroke-width|2}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}line-stroke-width''' – Width of line features. ''Default:'' {{{mapframe-line-stroke-width|5}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}marker''' – Marker symbol to use for coordinates; see [[mw:Help:Extension:Kartographer/Icons]] for options. ''Default:'' {{{mapframe-marker|''not specified (i.e. blank)''}}}
***Can also be set to {{mono|blank}} to override any default marker symbol
**'''{{#if:{{{noprefix|}}}||mapframe-}}marker-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}marker-colour''' – Background color for the marker. ''Default:'' {{{mapframe-marker-color|{{{mapframe-marker-colour|#5E74F3}}}}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}geomask-stroke-colour''' – Color of outline of geomask shape. ''Default:'' {{{mapframe-geomask-stroke-color|{{{mapframe-geomask-stroke-colour|#555555}}}}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-stroke-width''' – Width of outline of geomask shape. ''Default:'' {{{mapframe-geomask-stroke-width|1}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-fill''' – Color used to fill outside geomask features. ''Default:'' {{{mapframe-geomask-fill|#606060}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-fill-opacity''' – Opacity level of fill outside geomask features, a number between 0 and 1. ''Default:'' {{{mapframe-geomask-fill-opacity|0.25}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}zoom''' – Set the zoom level, from "1" (map of earth) to "18" (maximum zoom in), to be used if the zoom level cannot be determined automatically from object length or area. ''Default:'' {{{mapframe-zoom|10}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}length_km {{nobold|or}} {{#if:{{{noprefix|}}}||mapframe-}}length_mi {{nobold|or}} {{#if:{{{noprefix|}}}||mapframe-}}area_km2 {{nobold|or}} {{#if:{{{noprefix|}}}||mapframe-}}area_mi2''' – Determine zoom level by passing in object's length (in kilometres or miles) or area (in square kilometres or square miles). ''Default:'' ''{{{mapframe-length_km|not specified}}} / {{{mapframe-length_mi|not specified}}} / {{{mapframe-area_km2|not specified}}} / {{{mapframe-area_mi2|not specified}}}''
**'''{{#if:{{{noprefix|}}}||mapframe-}}frame-coordinates''' or '''{{#if:{{{noprefix|}}}||mapframe-}}frame-coord''' – Alternate latitude and longitude coordinates for initial placement of map, using {{template link|coord}}. ''Default:'' ''derived from item coordinates''
**'''{{#if:{{{noprefix|}}}||mapframe-}}type''' – Set the type of the object, with the same usage as {{template link|coord}}. ''Default:'' {{{mapframe-type|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}population''' – Set the population, useful with type="city", for {{template link|Infobox dim}}. ''Default:'' {{{mapframe-population|''not specified''}}}
{{#if:{{{deprecated|}}}|<nowiki></nowiki>
*Deprecated parameters
**{{gray|1='''{{#if:{{{noprefix|}}}||mapframe-}}frame-lat''' or '''{{#if:{{{noprefix|}}}||mapframe-}}frame-latitude'''}} – Alternate latitude coordinate for initial placement of map; default is derived from item coordinates
**{{gray|1='''{{#if:{{{noprefix|}}}||mapframe-}}frame-long''' or '''{{#if:{{{noprefix|}}}||mapframe-}}frame-longitude'''}} – Alternate longitude coordinate for initial placement of map; default is derived from item coordinates
}}<noinclude>{{Documentation}}</noinclude>
848wzme8ii3ss8czwhghd2yk6dbgcvd
33568
33567
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_mapframe/doc/parameters]]
33567
wikitext
text/x-wiki
<includeonly>{{navbar|Template:Infobox mapframe/doc/parameters|plain=y|style=float: right;}}</includeonly><nowiki></nowiki>
*Basic {{template link|Infobox mapframe}} parameters:{{#if:{{{noprefix|}}}||<nowiki></nowiki>
**'''mapframe''' – Specify yes or no to show or hide the map, overriding the default. ''Default:'' {{{mapframe|no}}}{{#if:{{{onByDefault|}}}|, ''but also modified by onByDefault''}}
*** Internal ''onByDefault'' parameter: {{{onByDefault|''not specified''}}}
**{{#if:{{{noprefix|}}}||'''mapframe-coordinates''' or '''mapframe-coord''' or}} '''coordinates''' or '''coord''' – Coordinates to use, instead of any on Wikidata. Use the {{template link|Coord}} template, e.g. {{parameter|coord|2={{template link expanded|Coord|12.34|N|56.78|E}}}}. ''Default:'' {{{mapframe-coordinates|{{{mapframe-coord|{{{coordinates|{{{coord|''coordinates from Wikidata [[d:Property:P625]]''}}}}}}}}}}}}
**'''mapframe-caption''' – Caption for the map. ''Default'': {{{mapframe-caption|''blank'' (or if {{parameter|mapframe-geomask}} is set, "{{xt|Location in {{em|geomask's label}}}}")}}}
**'''mapframe-custom''' – Use a custom map instead of the automatic mapframe. Specify either a {{template link expanded|maplink}} template, or another template that generates a mapframe map, or an image name. If used, most mapframe parameters will be ignored. ''Default'': ''not specified''}}
**{{#if:{{{noprefix|}}}|'''id'''|'''mapframe-id''' or '''id''' or '''qid'''}} – Id (Q-number) of Wikidata item to use. ''Default:'' ''item for current page''
**'''{{#if:{{{noprefix|}}}||mapframe-}}wikidata''' – Set to {{mono|yes}} to show all shape/line features from OpenStreetMap. ''Default:'' {{{mapframe-wikidata|''not specified''}}}
*Customise which features are displayed:
**'''{{#if:{{{noprefix|}}}||mapframe-}}point''' – Turn off display of point feature by setting to {{mono|none}}. Force point marker to be displayed by setting to {{mono|on}}. ''Default:'' {{{mapframe-point|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}shape''' – Turn off display of shape feature by setting to {{mono|none}}. Force display of shape by setting to {{mono|on}}. Use an inverse shape (geomask) instead of a regular shape by setting to {{mono|inverse}}. ''Default:'' {{{mapframe-shape|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}line''' – Turn off display of line feature by setting to {{mono|none}}. Force display of line by setting to {{mono|on}}. ''Default:'' {{{mapframe-line|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask''' – Wikidata item to use as a geomask (everything outside the boundary is shaded darker). Can either be a specific Wikidata item (Q-number), or a property that specifies the item to use (e.g. {{mono|P17}} for {{Wikidata entity link|P17}}, {{mono|P131}} for {{Wikidata entity link|P131}}). ''Default:'' {{{mapframe-geomask|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}switcher''' – set to {{mono|auto}} or {{mono|geomasks}} or {{mono|zooms}} to enable [[Template:Switcher]]-style switching between multiple mapframes. ''Default:'' {{{mapframe-switcher|''not specified''}}}
***{{mono|auto}} – switch geomasks found in {{Wikidata entity link|P276}} and {{Wikidata entity link|P131}} statements on the page's Wikidata item, searching recursively. E.g. an item's city, that city's state, and that state's country.
***{{mono|geomasks}} – switch between the geomasks specified as a comma-separated list of Wikidata items (Q-numbers) in the '''{{#if:{{{noprefix|}}}||mapframe-}}geomask''' parameter
***{{mono|zooms}} – switch between "zoomed in"/"zoomed midway"/"zoomed out", where "zoomed in" is the default zoom (with a minimum of {{mono|3}}), "zoomed out" is {{mono|1}}, and "zoomed midway" is the average
*Other optional parameters:
**'''{{#if:{{{noprefix|}}}||mapframe-}}frame-width''' or '''{{#if:{{{noprefix|}}}||mapframe-}}width''' – Frame width. ''Default:'' {{{mapframe-frame-width|270}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}frame-height''' or '''{{#if:{{{noprefix|}}}||mapframe-}}height''' – Frame height. ''Default:'' {{{mapframe-frame-height|200}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}shape-fill''' – Color used to fill shape features. ''Default:'' {{{mapframe-shape-fill|#606060}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}shape-fill-opacity''' – Opacity level of shape fill, a number between 0 and 1. ''Default:'' {{{mapframe-shape-fill-opacity|0.1}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}stroke-colour''' – Color of line features, and outlines of shape features. ''Default:'' {{{mapframe-stroke-color|{{{mapframe-stroke-colour|#ff0000}}}}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}line-stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}line-stroke-colour''' – Color of line features. ''Default:'' {{{mapframe-line-stroke-color|{{{mapframe-line-stroke-colour|#ff0000}}}}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}shape-stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}shape-stroke-colour''' – Color of outlines of shape features. ''Default:'' {{{mapframe-shape-stroke-color|{{{mapframe-shape-stroke-colour|#ff0000}}}}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}stroke-width''' – Width of line features, and outlines of shape features. ''Default:'' {{{mapframe-stroke-width|2}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}shape-stroke-width''' – Width of outlines of shape features. ''Default:'' {{{mapframe-shape-stroke-width|2}}}
***'''{{#if:{{{noprefix|}}}||mapframe-}}line-stroke-width''' – Width of line features. ''Default:'' {{{mapframe-line-stroke-width|5}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}marker''' – Marker symbol to use for coordinates; see [[mw:Help:Extension:Kartographer/Icons]] for options. ''Default:'' {{{mapframe-marker|''not specified (i.e. blank)''}}}
***Can also be set to {{mono|blank}} to override any default marker symbol
**'''{{#if:{{{noprefix|}}}||mapframe-}}marker-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}marker-colour''' – Background color for the marker. ''Default:'' {{{mapframe-marker-color|{{{mapframe-marker-colour|#5E74F3}}}}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-stroke-color''' or '''{{#if:{{{noprefix|}}}||mapframe-}}geomask-stroke-colour''' – Color of outline of geomask shape. ''Default:'' {{{mapframe-geomask-stroke-color|{{{mapframe-geomask-stroke-colour|#555555}}}}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-stroke-width''' – Width of outline of geomask shape. ''Default:'' {{{mapframe-geomask-stroke-width|1}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-fill''' – Color used to fill outside geomask features. ''Default:'' {{{mapframe-geomask-fill|#606060}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}geomask-fill-opacity''' – Opacity level of fill outside geomask features, a number between 0 and 1. ''Default:'' {{{mapframe-geomask-fill-opacity|0.25}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}zoom''' – Set the zoom level, from "1" (map of earth) to "18" (maximum zoom in), to be used if the zoom level cannot be determined automatically from object length or area. ''Default:'' {{{mapframe-zoom|10}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}length_km {{nobold|or}} {{#if:{{{noprefix|}}}||mapframe-}}length_mi {{nobold|or}} {{#if:{{{noprefix|}}}||mapframe-}}area_km2 {{nobold|or}} {{#if:{{{noprefix|}}}||mapframe-}}area_mi2''' – Determine zoom level by passing in object's length (in kilometres or miles) or area (in square kilometres or square miles). ''Default:'' ''{{{mapframe-length_km|not specified}}} / {{{mapframe-length_mi|not specified}}} / {{{mapframe-area_km2|not specified}}} / {{{mapframe-area_mi2|not specified}}}''
**'''{{#if:{{{noprefix|}}}||mapframe-}}frame-coordinates''' or '''{{#if:{{{noprefix|}}}||mapframe-}}frame-coord''' – Alternate latitude and longitude coordinates for initial placement of map, using {{template link|coord}}. ''Default:'' ''derived from item coordinates''
**'''{{#if:{{{noprefix|}}}||mapframe-}}type''' – Set the type of the object, with the same usage as {{template link|coord}}. ''Default:'' {{{mapframe-type|''not specified''}}}
**'''{{#if:{{{noprefix|}}}||mapframe-}}population''' – Set the population, useful with type="city", for {{template link|Infobox dim}}. ''Default:'' {{{mapframe-population|''not specified''}}}
{{#if:{{{deprecated|}}}|<nowiki></nowiki>
*Deprecated parameters
**{{gray|1='''{{#if:{{{noprefix|}}}||mapframe-}}frame-lat''' or '''{{#if:{{{noprefix|}}}||mapframe-}}frame-latitude'''}} – Alternate latitude coordinate for initial placement of map; default is derived from item coordinates
**{{gray|1='''{{#if:{{{noprefix|}}}||mapframe-}}frame-long''' or '''{{#if:{{{noprefix|}}}||mapframe-}}frame-longitude'''}} – Alternate longitude coordinate for initial placement of map; default is derived from item coordinates
}}<noinclude>{{Documentation}}</noinclude>
848wzme8ii3ss8czwhghd2yk6dbgcvd
Tempilet:Campaignbox 2018–19 Arab protests
10
2739
33569
2025-06-05T12:00:06Z
en>EmausBot
0
Bot: Fixing double redirect from [[Template:Campaignbox Second Arab Spring]] to [[Template:Campaignbox 2018–2024 Arab protests]]
33569
wikitext
text/x-wiki
#REDIRECT [[Template:Campaignbox 2018–2024 Arab protests]]
{{Redirect category shell|
{{R from move}}
}}
5uwm9xbuz9yxryb5u0f8jiw85mqzysr
33570
33569
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Campaignbox_2018–19_Arab_protests]]
33569
wikitext
text/x-wiki
#REDIRECT [[Template:Campaignbox 2018–2024 Arab protests]]
{{Redirect category shell|
{{R from move}}
}}
5uwm9xbuz9yxryb5u0f8jiw85mqzysr
Tempilet:Infobox civil conflict/doc
10
2740
33571
2026-09-17T01:51:58Z
en>Zackmann08
0
/* Template data */
33571
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{High-use|1242}}<!-- as of February 10, 2019 -->
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
A civil conflict infobox may be used to summarize information about a particular civil conflict (for example, protest, strike, clash with police) in a standard manner. This template is designed for non-military conflicts, so please do not use on the entry of military conflict.
== Usage ==
{{parameter names example | alt | arrests | border | buildings | caption | casualties1 | casualties2 | casualties3 | causes | charged | concessions | coordinates = {{coords|1|N|1|W}} | damage | date | detentions | effect | effect_label | fatalities | fined | goals | how_many1 | how_many2 | how_many3 | image | image_size | image_upright | injuries | lead_figures1 | lead_figures2 | lead_figures3 | location | pushpin_caption | pushpin_map = World | methods | name | notes | part_of | result | side1 | side1a | side1b | side1c | side1d | side2 | side2a | side2b | side2c | side2d | side3 | side3a | side3b | side3c | side3d | status | subtitle | time | time_begin | time_end | timezone | units1 | units2 | units3 }}
The infobox should be added using the {{tl|Infobox civil conflict}} template, as shown below:
<syntaxhighlight lang="wikitext">
{{Infobox civil conflict
| name =
| subtitle =
| part_of =
| image =
| caption =
| date =
| location =
| coordinates =
| causes =
| goals =
| methods =
| status =
| result =
| side1 =
| side2 =
| side3 =
| lead_figures1 =
| lead_figures2 =
| lead_figures3 =
| how_many1 =
| how_many2 =
| how_many3 =
| casualties1 =
| casualties2 =
| casualties3 =
| fatalities =
| injuries =
| arrests =
| damage =
| buildings =
| detentions =
| charged =
| fined =
| effect =
| effect_label =
| casualties_label =
| notes =
}}
</syntaxhighlight>
All parameters are optional parameters, the general please fill out conflict, date, place, result. Can also follow the different nature of the conflict, to adopt the parameters.
* '''name''' – the name of the conflict being described (e.g. "2011 Wisconsin budget protest").
* '''subtitle''' – alternative name of the conflict being described (e.g. "2011 budget repair bill protests in Wisconsin").
* '''part_of''' – ''optional'' – the larger conflict containing the event described in the article. For protests, it could be larger encompassing movement.
* '''image''' – ''optional'' – an image for the infobox. The image must be given in the form <nowiki>[[File:Example.jpg|300px|alt=Example alt text]]</nowiki>; in particular, the ''thumb'' attribute must '''not''' be selected.
* '''caption''' – ''optional'' – the text to be placed below the image.
* '''date''' – ''optional'' – the date of the conflict described. Convention is to give the actual date for the civil conflict.
* '''time''' – The time of the civil conflict, or of multiple civil conflict if they all occurred at the same time (do not use this along with '''time_begin''' and '''time_end''')
* '''time_begin''' and '''time_end''' – The start and end times, respectively, if a series of civil conflict (do not use this along with '''time''')
* '''timezone''' – The timezone of the location of the civil conflict(s); UTC+X, UTC−X, or UTC (i.e. offset from [[UTC]]) preferred
* '''location''' – the location of the conflict. For conflicts covering a wide area, a general description (e.g. "France", or "Europe", or "Worldwide") may be used.
* '''coordinates''' – ''optional'' – the location of the structure, given as a coordinate pair by using {{tl|coord}} with ''display=inline,title''.
* '''pushpin_map''' – ''optional'' – the base map to be used for the location map, e.g. "Scotland"; see {{tl|location map}} for more details.
* '''pushpin_pushpin_map_size''' – ''optional'' – width of the location map in pixels (px), e.g. "150"; defaults to: "220".
* '''pushpin_caption''' – ''optional'' – caption displayed below the location map; defaults to "Location within {{{pushpin_map}}}", e.g. "Location within Scotland".
* '''pushpin_label''' – ''optional'' – the label placed next to the marker on the location map.
* '''goals''' – ''optional'' – goal for the conflict. For instance, [[Regime change]], [[human rights]], [[democracy]].
* '''methods''' – ''optional'' methods used in the civil dispute. Many terms can be used. For instance, [[Protest march]], [[Picketing (protest)|Picketing]], [[Street protesters]], [[Petitions]], [[Sit-in]], [[Riot]], [[Hunger strike]], [[Suicide]], [[Bombing]], [[Strike action|Strike]], [[Walkout]], [[Lockout (industry)|Lockout]], [[Boycott]], or [[Book burning]]. See: [[Protest#Forms of protest]].
* '''status''' – ''optional'' – for ongoing conflicts, the current status of the conflict. This should not be used if a final '''result''' (below) is provided.
* '''result''' – ''optional'' – The choice of term should reflect what the sources say. In cases where the standard terms do not accurately describe the outcome, a link to the section of the article where the result is discussed in detail (such as "See the 'Aftermath' section") should be used instead of introducing non-standard terms like "marginal" or contradictory statements. It is better to omit this parameter altogether than to engage in [[WP:NOR|speculation]] about which side won or by how much. The value of '''result''' will not display if '''status''' contains a value.
* '''side1'''/'''side2'''/'''side3''' – ''optional'' – the parties participating in the conflict. When there is a large number of participants, it may be better to list only the three or four major groups on each side of the conflict, and to describe the rest in the body of the article. The '''side3''' field may be used if a conflict has three distinct "sides", and should be left blank on other articles. Sides should be listed in order of importance to the conflict, be it in terms of political clout, or a recognized chain of command. If differing metrics can support alternative lists, then ordering is left to the editors of the particular article.
** '''side1a'''/'''side2a'''/'''side3a''' – ''optional'' – in cases where the parties significantly changed over the course of the conflict, these subsidiary fields may be used to provide additional rows for the '''side''N''''' fields (above).
** '''side1b'''/'''side2b'''/'''side3b''' – ''optional'' – additional row, as above.
** '''side1c'''/'''side2c'''/'''side3c''' – ''optional'' – additional row, as above.
** '''side1d'''/'''side2d'''/'''side3d''' – ''optional'' – additional row, as above.
* '''lead_figures1'''/'''lead_figures2'''/'''lead_figures3''' – ''optional'' – the primary leaders (ie the key or significant leaders) of the sides involved. To avoid bloating the infobox, this should be limited to a maximum of about seven for any side. The '''lead_figures3''' field can only be used if the '''side3''' field is set.
* '''units1'''/'''units2'''/'''units3''' – ''optional'' – the people or groups involved. If a large number of distinct groups are present, it may be better to reference the body of the article than to include the entire list in this field. The '''units3''' field can only be used if the '''side3''' field is set.
* '''how_many1'''/'''how_many2''' – ''optional'' – the numerical size of the people involved.
* '''how_many3''' – ''optional'' – if '''side3''' is set, this is a third size field identical to the two above; if it is '''''not''''' set, this is an alternate combined field for use where only the total participation in a conflict is known.
* '''casualties1'''/'''casualties2''' – ''optional'' – casualties suffered, including dead, wounded, missing, and arrested.
* '''casualties3''' – ''optional'' – if '''side3''' is set, this is a third casualty field identical to the two above; if it is '''''not''''' set, this is an alternate combined field for use where only the total casualties of a conflict are known, or where civilian casualties cannot be directly attributed to either side.
* '''fatalities'''– ''optional'' – the numerical size of the dead.
* '''injuries''' – ''optional'' – the numerical size of the injured.
* '''arrests''' – ''optional'' – the numerical size of the arrested.
* '''damage''' – ''optional'' – the numerical size of the damage.
* '''buildings''' – ''optional'' – the numerical size of the buildings destroyed.
* '''detentions'''– ''optional'' – the numerical size of the detained.
* '''charged'''– ''optional'' – the name of the Criminal charge.
* '''fined'''– ''optional'' – the numerical size of the fine penalty.
* '''effect'''– ''optional'' – the effect
* '''effect_label'''– ''optional'' – the name of the effect
* '''casualties_label''' - ''optional'' - Renames the section label of the casualties field. The default label is ''Casualties''.
* '''notes''' – ''optional'' – optional field for further notes; this should only be used in exceptional circumstances.
* '''campaign_box''' – ''optional'' – optional field for appending a [[Template:Side box]] to the bottom of the infobox, which allows both boxes to float as a single element (useful if there are subsequent left floating images, which would otherwise not be able to float above the side box); the template must be specified in the format <nowiki>{{Side box XYZ}}</nowiki>.
===Mapframe maps===
To include a mapframe map, use the following parameters:
{{Infobox mapframe/doc/parameters}}
=== Pushpin map ===
{{Location map/doc/infobox parameters}}
== Example ==
{{Infobox civil conflict
|name= 2011 Wisconsin protests
|part_of= [[2011 United States public employee protests]]
|image= Gov Walker Protests1 JR.jpg
|caption= Thousands gather inside Madison Wisconsin's Capitol rotunda to protest Governor Walker's proposed bill.
|alt=Overhead view of hundreds of people wearing red for the teachers' unions, protesting against Walker's bill.
|date= {{Start date|2011|2|14}} – {{End date|2011|6|16}}
|location=[[Madison, Wisconsin|Madison]], Wisconsin, U.S.
|coordinates=
|status= Active protests ended by late June 2011; several pending lawsuits
|causes= Opposition to certain provisions in legislation (Budget Repair Bill) proposed by Governor Scott Walker to limit public employee collective bargaining and address a state budget shortfall.
|concessions= none; Budget Repair Bill passed; 2 Republican State Senators recalled from office (8/9/2011); 2 Democratic State Senators win recall elections on 8/16/11; Failed [[2012 Wisconsin gubernatorial recall election|recall attempt]] of Governor Scott Walker.
|methods= [[Protest]]s, [[sit-in]]s, [[demonstration (people)|demonstrations]], [[recall election]]s, quorum-busting
|side1=
Political organizations:
* [[Democratic Party of Wisconsin]]
* [[Organizing for America]]
Unions:
* [[Service Employees International Union|SEIU]]
* [[Industrial Workers of the World|IWW]]
* [[Wisconsin Education Association Council|WEAC]] ([[National Education Association|NEA]] affiliate)
|side2=
* [[Republican Party of Wisconsin]]
* Anti-tax activists, many affiliated with the [[Tea Party movement]]
|lead_figures1= ''Non-centralized leadership''
'''Wisconsin Democratic Legislature figures''':
* Senate Minority Leader [[Mark F. Miller|Mark Miller]]
* Assembly Minority Leader [[Peter W. Barca|Peter Barca]]
'''Wisconsin Senate 14''':
* [[Tim Carpenter]]
* [[Spencer Coggs]]
* [[Timothy Cullen (Wisconsin politician)|Tim Cullen]]
* [[Jon Erpenbach]]
* [[Dave Hansen (politician)|Dave Hansen]]
* [[Jim Holperin]]
* [[Robert Jauch]]
* [[Chris Larson]]
* [[Julie Lassa]]
* [[Mark Miller (Wisconsin politician)|Mark Miller]]
* [[Fred Risser]]
* [[Lena Taylor]]
* [[Kathleen Vinehout]]
* [[Robert Wirch]]
|lead_figures2= [[Scott Walker (politician)|Governor Scott Walker]]
'''Wisconsin Republican Legislature figures''':
* Senate Majority Leader [[Scott L. Fitzgerald|Scott Fitzgerald]]
* President of the Senate [[Michael Ellis (American politician)|Michael Ellis]]
* Assembly Speaker [[Jeff Fitzgerald]]
* Assembly Majority Leader [[Scott Suder]]
|casualties1= {{unbulleted list
| '''Deaths''': 0
| '''Injuries''': 0
| '''Arrests''': 10+
}}
|casualties2=
|casualties_label= Arrests, etc.
|how_many1 = '''Protesters:''' 100,000+
|how_many2= 100+ Wisconsin police and national guardsmen<br/>'''Counter protesters:'''<br />Several thousand}}
<syntaxhighlight lang="wikitext">
{{Infobox civil conflict
|name= 2011 Wisconsin protests
|part_of= [[2011 United States public employee protests]]
|image= Gov Walker Protests1 JR.jpg
|caption= Thousands gather inside Madison Wisconsin's Capitol rotunda to protest Governor Walker's proposed bill.
|alt=Overhead view of hundreds of people wearing red for the teachers' unions, protesting against Walker's bill.
|date= {{Start date|2011|2|14}} – {{End date|2011|6|16}}
|location=[[Madison, Wisconsin|Madison]], Wisconsin, U.S.
|coordinates=
|status= Active protests ended by late June 2011; several pending lawsuits
|causes= Opposition to certain provisions in legislation (Budget Repair Bill) proposed by Governor Scott Walker to limit public employee collective bargaining and address a state budget shortfall.
|concessions= none; Budget Repair Bill passed; 2 Republican State Senators recalled from office (8/9/2011); 2 Democratic State Senators win recall elections on 8/16/11; Failed [[2012 Wisconsin gubernatorial recall election|recall attempt]] of Governor Scott Walker.
|methods= [[Protest]]s, [[sit-in]]s, [[demonstration (people)|demonstrations]], [[recall election]]s, quorum-busting
|side1=
Political organizations:
* [[Democratic Party of Wisconsin]]
* [[Organizing for America]]
Unions:
* [[Service Employees International Union|SEIU]]
* [[Industrial Workers of the World|IWW]]
* [[Wisconsin Education Association Council|WEAC]] ([[National Education Association|NEA]] affiliate)
|side2=
* [[Republican Party of Wisconsin]]
* Anti-tax activists, many affiliated with the [[Tea Party movement]]
|lead_figures1= ''Non-centralized leadership''
'''Wisconsin Democratic Legislature figures''':
* Senate Minority Leader [[Mark F. Miller|Mark Miller]]
* Assembly Minority Leader [[Peter W. Barca|Peter Barca]]
'''Wisconsin Senate 14''':
* [[Tim Carpenter]]
* [[Spencer Coggs]]
* [[Timothy Cullen (Wisconsin politician)|Tim Cullen]]
* [[Jon Erpenbach]]
* [[Dave Hansen (politician)|Dave Hansen]]
* [[Jim Holperin]]
* [[Robert Jauch]]
* [[Chris Larson]]
* [[Julie Lassa]]
* [[Mark Miller (Wisconsin politician)|Mark Miller]]
* [[Fred Risser]]
* [[Lena Taylor]]
* [[Kathleen Vinehout]]
* [[Robert Wirch]]
|lead_figures2= [[Scott Walker (politician)|Governor Scott Walker]]
'''Wisconsin Republican Legislature figures''':
* Senate Majority Leader [[Scott L. Fitzgerald|Scott Fitzgerald]]
* President of the Senate [[Michael Ellis (American politician)|Michael Ellis]]
* Assembly Speaker [[Jeff Fitzgerald]]
* Assembly Majority Leader [[Scott Suder]]
|casualties1= {{unbulleted list
| '''Deaths''': 0
| '''Injuries''': 0
| '''Arrests''': 10+
}}
|casualties2=
|casualties_label= Arrests, etc.
|how_many1 = '''Protesters:''' 100,000+
|how_many2 = 100+ Wisconsin police and national guardsmen<br/>'''Counter protesters:'''<br />Several thousand
}}
</syntaxhighlight>
==Campaignboxes==
{{Main|Template:Civil conflict sidebar}}
===Basic usage===
<div style="float:right;width:26.7em;margin-bottom:1.0em;">
{{Campaignbox 2018–19 Arab protests}}
</div>
<syntaxhighlight lang="wikitext">
{{civil conflict sidebar
| name = {{subst:PAGENAME}}
| above =
| state = {{{state|}}}
| listclass = hlist
| events =
*
*
}}</syntaxhighlight>
==Additional parameters ==
<syntaxhighlight lang="wikitext">
| bodyclass =
| belowclass =
| notes =
</syntaxhighlight>
== Tracking categories ==
{{Infobox tracking cats}}
== Template data ==
{{collapse top|title=[[Wikipedia:TemplateData|TemplateData]] documentation used by [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>
{
"description": "A civil conflict infobox may be used to summarize information about a particular civil conflict (for example, protest, clash with police, etc) in a standard manner. This template is designed for non-military conflicts, so please do not use on the entry of military conflict.",
"format": "block",
"params": {
"name": {
"label": "Name",
"description": "The name of the conflict being described",
"type": "string",
"required": false,
"example": "2011 Wisconsin budget protest"
},
"subtitle": {
"label": "Subtitle",
"description": "Alternative name of the conflict being described",
"type": "string",
"required": false,
"example": "2011 budget repair bill protests in Wisconsin"
},
"latitude": {
"label": "latitude",
"type": "number",
"required": false
},
"longitude": {
"label": "longitude",
"type": "number",
"required": false
},
"concessions": {
"label": "concessions",
"type": "line",
"required": false
},
"part_of": {
"label": "Part of",
"description": "The larger conflict containing the event described in the article. For protests, it could be larger encompassing movement.",
"type": "string"
},
"image": {
"label": "Image",
"description": "The image to use for the infobox.",
"type": "wiki-file-name",
"required": false,
"suggested": true
},
"alt": {
"label": "Image alternative text",
"description": "Alternative text for the image. See MOS:ALT for guidance",
"type": "string",
"suggested": true
},
"caption": {
"label": "Image caption",
"description": "The text to be placed below the image",
"type": "line",
"required": false
},
"date": {
"label": "Date",
"description": "The date of the conflict described. Convention is to give the actual date for the civil conflict.",
"type": "date",
"required": false,
"example": "{{Start date|2022|2|15}}",
"suggested": true
},
"time": {
"label": "Time started",
"description": "The time of the civil conflict, or of multiple civil conflict if they all occurred at the same time. Do not use this along with time_begin and time_end.",
"type": "line",
"required": false
},
"time_begin": {
"label": "Time begin",
"description": "The start time, if a series of civil conflict. Do not use this along with time.",
"type": "line",
"required": false
},
"time_end": {
"label": "Time end",
"description": "The end time, if a series of civil conflict. Do not use this along with time.",
"type": "line",
"required": false
},
"timezone": {
"label": "Timezone",
"description": "The timezone of the location of the civil conflict(s).",
"type": "string",
"required": false,
"example": "UTC+6"
},
"location": {
"label": "Location",
"type": "line",
"required": true,
"description": "The location of the conflict. For conflicts covering a wide area, a general description (e.g. \"France\", or \"Europe\", or \"Worldwide\") may be used.",
"example": "Worldwide"
},
"coordinates": {
"label": "Coordinates",
"type": "wiki-template-name",
"required": false,
"description": "The location of the structure, given as a coordinate pair by using {{coord}} with display=inline,title.",
"example": "{{coord|12|W|-55|S|display=inline,title}}",
"suggested": true
},
"causes": {
"label": "causes",
"type": "content",
"required": false
},
"goals": {
"label": "goals",
"type": "content",
"required": false
},
"methods": {
"label": "methods",
"type": "content",
"required": false
},
"status": {
"label": "status",
"type": "content",
"required": false
},
"result": {
"label": "result",
"type": "content",
"required": false
},
"side1": {
"label": "side1",
"type": "content",
"required": false
},
"side2": {
"label": "side2",
"type": "content",
"required": false
},
"side3": {
"label": "side3",
"type": "content",
"required": false
},
"side1a": {
"label": "side1a",
"type": "content",
"required": false
},
"side2a": {
"label": "side2a",
"type": "content",
"required": false
},
"side3a": {
"label": "side3a",
"type": "content",
"required": false
},
"side1b": {
"label": "side1b",
"type": "content",
"required": false
},
"side2b": {
"label": "side2b",
"type": "content",
"required": false
},
"side3b": {
"label": "side3b",
"type": "content",
"required": false
},
"side1c": {
"label": "side1c",
"type": "content",
"required": false
},
"side2c": {
"label": "side2c",
"type": "content",
"required": false
},
"side3c": {
"label": "side3c",
"type": "content",
"required": false
},
"side1d": {
"label": "side1d",
"type": "content",
"required": false
},
"side2d": {
"label": "side2d",
"type": "content",
"required": false
},
"side3d": {
"label": "side3d",
"type": "content",
"required": false
},
"lead_figures1": {
"label": "lead_figures1",
"type": "content",
"required": false
},
"lead_figures2": {
"label": "lead_figures2",
"type": "content",
"required": false
},
"lead_figures3": {
"label": "lead_figures3",
"type": "content",
"required": false
},
"units1": {
"label": "units1",
"type": "content",
"required": false
},
"units2": {
"label": "units2",
"type": "content",
"required": false
},
"units3": {
"label": "units3",
"type": "content",
"required": false
},
"how_many1": {
"label": "how_many1",
"type": "number",
"required": false
},
"how_many2": {
"label": "how_many2",
"type": "number",
"required": false
},
"how_many3": {
"label": "how_many3",
"type": "number",
"required": false
},
"casualties1": {
"label": "casualties1",
"type": "number",
"required": false
},
"casualties2": {
"label": "casualties2",
"type": "number",
"required": false
},
"casualties3": {
"label": "casualties3",
"type": "number",
"required": false
},
"injuries": {
"label": "injuries",
"type": "number",
"required": false
},
"fatalities": {
"label": "fatalities",
"type": "number",
"required": false
},
"arrests": {
"label": "arrests",
"type": "number",
"required": false
},
"damage": {
"label": "damage",
"type": "line",
"required": false
},
"detentions": {
"label": "detentions",
"type": "number",
"required": false
},
"charged": {
"label": "charged",
"type": "number",
"required": false
},
"fined": {
"label": "fined",
"type": "number",
"required": false
},
"effect": {
"label": "effect",
"type": "string",
"required": false
},
"effect_label": {
"label": "effect_label",
"type": "string",
"required": false
},
"casualties_label": {
"label": "casualties_label",
"type": "string",
"required": false
},
"notes": {
"label": "notes",
"type": "string",
"required": false
},
"pushpin_map": {
"label": "pushpin_map",
"type": "string",
"required": false
},
"pushpin_map_size": {
"label": "pushpin_map_size",
"type": "string",
"required": false
},
"pushpin_label": {
"label": "pushpin_label",
"type": "string",
"required": false
},
"pushpin_caption": {
"label": "pushpin_caption",
"type": "string",
"required": false
},
"state": {}
},
"paramOrder": [
"name",
"subtitle",
"part_of",
"image",
"alt",
"caption",
"date",
"time",
"time_begin",
"time_end",
"timezone",
"location",
"coordinates",
"latitude",
"longitude",
"concessions",
"causes",
"goals",
"methods",
"status",
"result",
"side1",
"side2",
"side3",
"side1a",
"side2a",
"side3a",
"side1b",
"side2b",
"side3b",
"side1c",
"side2c",
"side3c",
"side1d",
"side2d",
"side3d",
"lead_figures1",
"lead_figures2",
"lead_figures3",
"units1",
"units2",
"units3",
"how_many1",
"how_many2",
"how_many3",
"casualties1",
"casualties2",
"casualties3",
"injuries",
"fatalities",
"arrests",
"damage",
"detentions",
"charged",
"fined",
"effect",
"effect_label",
"casualties_label",
"notes",
"pushpin_map",
"pushpin_map_size",
"pushpin_label",
"pushpin_caption",
"state"
]
}
</templatedata>
{{collapse bottom}}
== See also ==
* {{Tlg|Infobox military conflict}} for an infobox better suited for military conflicts.
* {{Tlg|Infobox civilian attack}} for an infobox to be used for particular violent attacks in a civilian context (such as terrorist attacks, murders, etc.).
<!-- Start of hidden references section -->
<includeonly>{{Sandbox other||
<!--Categories below this line, please; interwikis at Wikidata-->
[[Category:Events infobox templates|Civil conflict]]
[[Category:Civil infobox templates]]
[[Category:Embeddable templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
ecze3e4tnudl431ky4goh02vbx9nnbd
33572
33571
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_civil_conflict/doc]]
33571
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{High-use|1242}}<!-- as of February 10, 2019 -->
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
A civil conflict infobox may be used to summarize information about a particular civil conflict (for example, protest, strike, clash with police) in a standard manner. This template is designed for non-military conflicts, so please do not use on the entry of military conflict.
== Usage ==
{{parameter names example | alt | arrests | border | buildings | caption | casualties1 | casualties2 | casualties3 | causes | charged | concessions | coordinates = {{coords|1|N|1|W}} | damage | date | detentions | effect | effect_label | fatalities | fined | goals | how_many1 | how_many2 | how_many3 | image | image_size | image_upright | injuries | lead_figures1 | lead_figures2 | lead_figures3 | location | pushpin_caption | pushpin_map = World | methods | name | notes | part_of | result | side1 | side1a | side1b | side1c | side1d | side2 | side2a | side2b | side2c | side2d | side3 | side3a | side3b | side3c | side3d | status | subtitle | time | time_begin | time_end | timezone | units1 | units2 | units3 }}
The infobox should be added using the {{tl|Infobox civil conflict}} template, as shown below:
<syntaxhighlight lang="wikitext">
{{Infobox civil conflict
| name =
| subtitle =
| part_of =
| image =
| caption =
| date =
| location =
| coordinates =
| causes =
| goals =
| methods =
| status =
| result =
| side1 =
| side2 =
| side3 =
| lead_figures1 =
| lead_figures2 =
| lead_figures3 =
| how_many1 =
| how_many2 =
| how_many3 =
| casualties1 =
| casualties2 =
| casualties3 =
| fatalities =
| injuries =
| arrests =
| damage =
| buildings =
| detentions =
| charged =
| fined =
| effect =
| effect_label =
| casualties_label =
| notes =
}}
</syntaxhighlight>
All parameters are optional parameters, the general please fill out conflict, date, place, result. Can also follow the different nature of the conflict, to adopt the parameters.
* '''name''' – the name of the conflict being described (e.g. "2011 Wisconsin budget protest").
* '''subtitle''' – alternative name of the conflict being described (e.g. "2011 budget repair bill protests in Wisconsin").
* '''part_of''' – ''optional'' – the larger conflict containing the event described in the article. For protests, it could be larger encompassing movement.
* '''image''' – ''optional'' – an image for the infobox. The image must be given in the form <nowiki>[[File:Example.jpg|300px|alt=Example alt text]]</nowiki>; in particular, the ''thumb'' attribute must '''not''' be selected.
* '''caption''' – ''optional'' – the text to be placed below the image.
* '''date''' – ''optional'' – the date of the conflict described. Convention is to give the actual date for the civil conflict.
* '''time''' – The time of the civil conflict, or of multiple civil conflict if they all occurred at the same time (do not use this along with '''time_begin''' and '''time_end''')
* '''time_begin''' and '''time_end''' – The start and end times, respectively, if a series of civil conflict (do not use this along with '''time''')
* '''timezone''' – The timezone of the location of the civil conflict(s); UTC+X, UTC−X, or UTC (i.e. offset from [[UTC]]) preferred
* '''location''' – the location of the conflict. For conflicts covering a wide area, a general description (e.g. "France", or "Europe", or "Worldwide") may be used.
* '''coordinates''' – ''optional'' – the location of the structure, given as a coordinate pair by using {{tl|coord}} with ''display=inline,title''.
* '''pushpin_map''' – ''optional'' – the base map to be used for the location map, e.g. "Scotland"; see {{tl|location map}} for more details.
* '''pushpin_pushpin_map_size''' – ''optional'' – width of the location map in pixels (px), e.g. "150"; defaults to: "220".
* '''pushpin_caption''' – ''optional'' – caption displayed below the location map; defaults to "Location within {{{pushpin_map}}}", e.g. "Location within Scotland".
* '''pushpin_label''' – ''optional'' – the label placed next to the marker on the location map.
* '''goals''' – ''optional'' – goal for the conflict. For instance, [[Regime change]], [[human rights]], [[democracy]].
* '''methods''' – ''optional'' methods used in the civil dispute. Many terms can be used. For instance, [[Protest march]], [[Picketing (protest)|Picketing]], [[Street protesters]], [[Petitions]], [[Sit-in]], [[Riot]], [[Hunger strike]], [[Suicide]], [[Bombing]], [[Strike action|Strike]], [[Walkout]], [[Lockout (industry)|Lockout]], [[Boycott]], or [[Book burning]]. See: [[Protest#Forms of protest]].
* '''status''' – ''optional'' – for ongoing conflicts, the current status of the conflict. This should not be used if a final '''result''' (below) is provided.
* '''result''' – ''optional'' – The choice of term should reflect what the sources say. In cases where the standard terms do not accurately describe the outcome, a link to the section of the article where the result is discussed in detail (such as "See the 'Aftermath' section") should be used instead of introducing non-standard terms like "marginal" or contradictory statements. It is better to omit this parameter altogether than to engage in [[WP:NOR|speculation]] about which side won or by how much. The value of '''result''' will not display if '''status''' contains a value.
* '''side1'''/'''side2'''/'''side3''' – ''optional'' – the parties participating in the conflict. When there is a large number of participants, it may be better to list only the three or four major groups on each side of the conflict, and to describe the rest in the body of the article. The '''side3''' field may be used if a conflict has three distinct "sides", and should be left blank on other articles. Sides should be listed in order of importance to the conflict, be it in terms of political clout, or a recognized chain of command. If differing metrics can support alternative lists, then ordering is left to the editors of the particular article.
** '''side1a'''/'''side2a'''/'''side3a''' – ''optional'' – in cases where the parties significantly changed over the course of the conflict, these subsidiary fields may be used to provide additional rows for the '''side''N''''' fields (above).
** '''side1b'''/'''side2b'''/'''side3b''' – ''optional'' – additional row, as above.
** '''side1c'''/'''side2c'''/'''side3c''' – ''optional'' – additional row, as above.
** '''side1d'''/'''side2d'''/'''side3d''' – ''optional'' – additional row, as above.
* '''lead_figures1'''/'''lead_figures2'''/'''lead_figures3''' – ''optional'' – the primary leaders (ie the key or significant leaders) of the sides involved. To avoid bloating the infobox, this should be limited to a maximum of about seven for any side. The '''lead_figures3''' field can only be used if the '''side3''' field is set.
* '''units1'''/'''units2'''/'''units3''' – ''optional'' – the people or groups involved. If a large number of distinct groups are present, it may be better to reference the body of the article than to include the entire list in this field. The '''units3''' field can only be used if the '''side3''' field is set.
* '''how_many1'''/'''how_many2''' – ''optional'' – the numerical size of the people involved.
* '''how_many3''' – ''optional'' – if '''side3''' is set, this is a third size field identical to the two above; if it is '''''not''''' set, this is an alternate combined field for use where only the total participation in a conflict is known.
* '''casualties1'''/'''casualties2''' – ''optional'' – casualties suffered, including dead, wounded, missing, and arrested.
* '''casualties3''' – ''optional'' – if '''side3''' is set, this is a third casualty field identical to the two above; if it is '''''not''''' set, this is an alternate combined field for use where only the total casualties of a conflict are known, or where civilian casualties cannot be directly attributed to either side.
* '''fatalities'''– ''optional'' – the numerical size of the dead.
* '''injuries''' – ''optional'' – the numerical size of the injured.
* '''arrests''' – ''optional'' – the numerical size of the arrested.
* '''damage''' – ''optional'' – the numerical size of the damage.
* '''buildings''' – ''optional'' – the numerical size of the buildings destroyed.
* '''detentions'''– ''optional'' – the numerical size of the detained.
* '''charged'''– ''optional'' – the name of the Criminal charge.
* '''fined'''– ''optional'' – the numerical size of the fine penalty.
* '''effect'''– ''optional'' – the effect
* '''effect_label'''– ''optional'' – the name of the effect
* '''casualties_label''' - ''optional'' - Renames the section label of the casualties field. The default label is ''Casualties''.
* '''notes''' – ''optional'' – optional field for further notes; this should only be used in exceptional circumstances.
* '''campaign_box''' – ''optional'' – optional field for appending a [[Template:Side box]] to the bottom of the infobox, which allows both boxes to float as a single element (useful if there are subsequent left floating images, which would otherwise not be able to float above the side box); the template must be specified in the format <nowiki>{{Side box XYZ}}</nowiki>.
===Mapframe maps===
To include a mapframe map, use the following parameters:
{{Infobox mapframe/doc/parameters}}
=== Pushpin map ===
{{Location map/doc/infobox parameters}}
== Example ==
{{Infobox civil conflict
|name= 2011 Wisconsin protests
|part_of= [[2011 United States public employee protests]]
|image= Gov Walker Protests1 JR.jpg
|caption= Thousands gather inside Madison Wisconsin's Capitol rotunda to protest Governor Walker's proposed bill.
|alt=Overhead view of hundreds of people wearing red for the teachers' unions, protesting against Walker's bill.
|date= {{Start date|2011|2|14}} – {{End date|2011|6|16}}
|location=[[Madison, Wisconsin|Madison]], Wisconsin, U.S.
|coordinates=
|status= Active protests ended by late June 2011; several pending lawsuits
|causes= Opposition to certain provisions in legislation (Budget Repair Bill) proposed by Governor Scott Walker to limit public employee collective bargaining and address a state budget shortfall.
|concessions= none; Budget Repair Bill passed; 2 Republican State Senators recalled from office (8/9/2011); 2 Democratic State Senators win recall elections on 8/16/11; Failed [[2012 Wisconsin gubernatorial recall election|recall attempt]] of Governor Scott Walker.
|methods= [[Protest]]s, [[sit-in]]s, [[demonstration (people)|demonstrations]], [[recall election]]s, quorum-busting
|side1=
Political organizations:
* [[Democratic Party of Wisconsin]]
* [[Organizing for America]]
Unions:
* [[Service Employees International Union|SEIU]]
* [[Industrial Workers of the World|IWW]]
* [[Wisconsin Education Association Council|WEAC]] ([[National Education Association|NEA]] affiliate)
|side2=
* [[Republican Party of Wisconsin]]
* Anti-tax activists, many affiliated with the [[Tea Party movement]]
|lead_figures1= ''Non-centralized leadership''
'''Wisconsin Democratic Legislature figures''':
* Senate Minority Leader [[Mark F. Miller|Mark Miller]]
* Assembly Minority Leader [[Peter W. Barca|Peter Barca]]
'''Wisconsin Senate 14''':
* [[Tim Carpenter]]
* [[Spencer Coggs]]
* [[Timothy Cullen (Wisconsin politician)|Tim Cullen]]
* [[Jon Erpenbach]]
* [[Dave Hansen (politician)|Dave Hansen]]
* [[Jim Holperin]]
* [[Robert Jauch]]
* [[Chris Larson]]
* [[Julie Lassa]]
* [[Mark Miller (Wisconsin politician)|Mark Miller]]
* [[Fred Risser]]
* [[Lena Taylor]]
* [[Kathleen Vinehout]]
* [[Robert Wirch]]
|lead_figures2= [[Scott Walker (politician)|Governor Scott Walker]]
'''Wisconsin Republican Legislature figures''':
* Senate Majority Leader [[Scott L. Fitzgerald|Scott Fitzgerald]]
* President of the Senate [[Michael Ellis (American politician)|Michael Ellis]]
* Assembly Speaker [[Jeff Fitzgerald]]
* Assembly Majority Leader [[Scott Suder]]
|casualties1= {{unbulleted list
| '''Deaths''': 0
| '''Injuries''': 0
| '''Arrests''': 10+
}}
|casualties2=
|casualties_label= Arrests, etc.
|how_many1 = '''Protesters:''' 100,000+
|how_many2= 100+ Wisconsin police and national guardsmen<br/>'''Counter protesters:'''<br />Several thousand}}
<syntaxhighlight lang="wikitext">
{{Infobox civil conflict
|name= 2011 Wisconsin protests
|part_of= [[2011 United States public employee protests]]
|image= Gov Walker Protests1 JR.jpg
|caption= Thousands gather inside Madison Wisconsin's Capitol rotunda to protest Governor Walker's proposed bill.
|alt=Overhead view of hundreds of people wearing red for the teachers' unions, protesting against Walker's bill.
|date= {{Start date|2011|2|14}} – {{End date|2011|6|16}}
|location=[[Madison, Wisconsin|Madison]], Wisconsin, U.S.
|coordinates=
|status= Active protests ended by late June 2011; several pending lawsuits
|causes= Opposition to certain provisions in legislation (Budget Repair Bill) proposed by Governor Scott Walker to limit public employee collective bargaining and address a state budget shortfall.
|concessions= none; Budget Repair Bill passed; 2 Republican State Senators recalled from office (8/9/2011); 2 Democratic State Senators win recall elections on 8/16/11; Failed [[2012 Wisconsin gubernatorial recall election|recall attempt]] of Governor Scott Walker.
|methods= [[Protest]]s, [[sit-in]]s, [[demonstration (people)|demonstrations]], [[recall election]]s, quorum-busting
|side1=
Political organizations:
* [[Democratic Party of Wisconsin]]
* [[Organizing for America]]
Unions:
* [[Service Employees International Union|SEIU]]
* [[Industrial Workers of the World|IWW]]
* [[Wisconsin Education Association Council|WEAC]] ([[National Education Association|NEA]] affiliate)
|side2=
* [[Republican Party of Wisconsin]]
* Anti-tax activists, many affiliated with the [[Tea Party movement]]
|lead_figures1= ''Non-centralized leadership''
'''Wisconsin Democratic Legislature figures''':
* Senate Minority Leader [[Mark F. Miller|Mark Miller]]
* Assembly Minority Leader [[Peter W. Barca|Peter Barca]]
'''Wisconsin Senate 14''':
* [[Tim Carpenter]]
* [[Spencer Coggs]]
* [[Timothy Cullen (Wisconsin politician)|Tim Cullen]]
* [[Jon Erpenbach]]
* [[Dave Hansen (politician)|Dave Hansen]]
* [[Jim Holperin]]
* [[Robert Jauch]]
* [[Chris Larson]]
* [[Julie Lassa]]
* [[Mark Miller (Wisconsin politician)|Mark Miller]]
* [[Fred Risser]]
* [[Lena Taylor]]
* [[Kathleen Vinehout]]
* [[Robert Wirch]]
|lead_figures2= [[Scott Walker (politician)|Governor Scott Walker]]
'''Wisconsin Republican Legislature figures''':
* Senate Majority Leader [[Scott L. Fitzgerald|Scott Fitzgerald]]
* President of the Senate [[Michael Ellis (American politician)|Michael Ellis]]
* Assembly Speaker [[Jeff Fitzgerald]]
* Assembly Majority Leader [[Scott Suder]]
|casualties1= {{unbulleted list
| '''Deaths''': 0
| '''Injuries''': 0
| '''Arrests''': 10+
}}
|casualties2=
|casualties_label= Arrests, etc.
|how_many1 = '''Protesters:''' 100,000+
|how_many2 = 100+ Wisconsin police and national guardsmen<br/>'''Counter protesters:'''<br />Several thousand
}}
</syntaxhighlight>
==Campaignboxes==
{{Main|Template:Civil conflict sidebar}}
===Basic usage===
<div style="float:right;width:26.7em;margin-bottom:1.0em;">
{{Campaignbox 2018–19 Arab protests}}
</div>
<syntaxhighlight lang="wikitext">
{{civil conflict sidebar
| name = {{subst:PAGENAME}}
| above =
| state = {{{state|}}}
| listclass = hlist
| events =
*
*
}}</syntaxhighlight>
==Additional parameters ==
<syntaxhighlight lang="wikitext">
| bodyclass =
| belowclass =
| notes =
</syntaxhighlight>
== Tracking categories ==
{{Infobox tracking cats}}
== Template data ==
{{collapse top|title=[[Wikipedia:TemplateData|TemplateData]] documentation used by [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>
{
"description": "A civil conflict infobox may be used to summarize information about a particular civil conflict (for example, protest, clash with police, etc) in a standard manner. This template is designed for non-military conflicts, so please do not use on the entry of military conflict.",
"format": "block",
"params": {
"name": {
"label": "Name",
"description": "The name of the conflict being described",
"type": "string",
"required": false,
"example": "2011 Wisconsin budget protest"
},
"subtitle": {
"label": "Subtitle",
"description": "Alternative name of the conflict being described",
"type": "string",
"required": false,
"example": "2011 budget repair bill protests in Wisconsin"
},
"latitude": {
"label": "latitude",
"type": "number",
"required": false
},
"longitude": {
"label": "longitude",
"type": "number",
"required": false
},
"concessions": {
"label": "concessions",
"type": "line",
"required": false
},
"part_of": {
"label": "Part of",
"description": "The larger conflict containing the event described in the article. For protests, it could be larger encompassing movement.",
"type": "string"
},
"image": {
"label": "Image",
"description": "The image to use for the infobox.",
"type": "wiki-file-name",
"required": false,
"suggested": true
},
"alt": {
"label": "Image alternative text",
"description": "Alternative text for the image. See MOS:ALT for guidance",
"type": "string",
"suggested": true
},
"caption": {
"label": "Image caption",
"description": "The text to be placed below the image",
"type": "line",
"required": false
},
"date": {
"label": "Date",
"description": "The date of the conflict described. Convention is to give the actual date for the civil conflict.",
"type": "date",
"required": false,
"example": "{{Start date|2022|2|15}}",
"suggested": true
},
"time": {
"label": "Time started",
"description": "The time of the civil conflict, or of multiple civil conflict if they all occurred at the same time. Do not use this along with time_begin and time_end.",
"type": "line",
"required": false
},
"time_begin": {
"label": "Time begin",
"description": "The start time, if a series of civil conflict. Do not use this along with time.",
"type": "line",
"required": false
},
"time_end": {
"label": "Time end",
"description": "The end time, if a series of civil conflict. Do not use this along with time.",
"type": "line",
"required": false
},
"timezone": {
"label": "Timezone",
"description": "The timezone of the location of the civil conflict(s).",
"type": "string",
"required": false,
"example": "UTC+6"
},
"location": {
"label": "Location",
"type": "line",
"required": true,
"description": "The location of the conflict. For conflicts covering a wide area, a general description (e.g. \"France\", or \"Europe\", or \"Worldwide\") may be used.",
"example": "Worldwide"
},
"coordinates": {
"label": "Coordinates",
"type": "wiki-template-name",
"required": false,
"description": "The location of the structure, given as a coordinate pair by using {{coord}} with display=inline,title.",
"example": "{{coord|12|W|-55|S|display=inline,title}}",
"suggested": true
},
"causes": {
"label": "causes",
"type": "content",
"required": false
},
"goals": {
"label": "goals",
"type": "content",
"required": false
},
"methods": {
"label": "methods",
"type": "content",
"required": false
},
"status": {
"label": "status",
"type": "content",
"required": false
},
"result": {
"label": "result",
"type": "content",
"required": false
},
"side1": {
"label": "side1",
"type": "content",
"required": false
},
"side2": {
"label": "side2",
"type": "content",
"required": false
},
"side3": {
"label": "side3",
"type": "content",
"required": false
},
"side1a": {
"label": "side1a",
"type": "content",
"required": false
},
"side2a": {
"label": "side2a",
"type": "content",
"required": false
},
"side3a": {
"label": "side3a",
"type": "content",
"required": false
},
"side1b": {
"label": "side1b",
"type": "content",
"required": false
},
"side2b": {
"label": "side2b",
"type": "content",
"required": false
},
"side3b": {
"label": "side3b",
"type": "content",
"required": false
},
"side1c": {
"label": "side1c",
"type": "content",
"required": false
},
"side2c": {
"label": "side2c",
"type": "content",
"required": false
},
"side3c": {
"label": "side3c",
"type": "content",
"required": false
},
"side1d": {
"label": "side1d",
"type": "content",
"required": false
},
"side2d": {
"label": "side2d",
"type": "content",
"required": false
},
"side3d": {
"label": "side3d",
"type": "content",
"required": false
},
"lead_figures1": {
"label": "lead_figures1",
"type": "content",
"required": false
},
"lead_figures2": {
"label": "lead_figures2",
"type": "content",
"required": false
},
"lead_figures3": {
"label": "lead_figures3",
"type": "content",
"required": false
},
"units1": {
"label": "units1",
"type": "content",
"required": false
},
"units2": {
"label": "units2",
"type": "content",
"required": false
},
"units3": {
"label": "units3",
"type": "content",
"required": false
},
"how_many1": {
"label": "how_many1",
"type": "number",
"required": false
},
"how_many2": {
"label": "how_many2",
"type": "number",
"required": false
},
"how_many3": {
"label": "how_many3",
"type": "number",
"required": false
},
"casualties1": {
"label": "casualties1",
"type": "number",
"required": false
},
"casualties2": {
"label": "casualties2",
"type": "number",
"required": false
},
"casualties3": {
"label": "casualties3",
"type": "number",
"required": false
},
"injuries": {
"label": "injuries",
"type": "number",
"required": false
},
"fatalities": {
"label": "fatalities",
"type": "number",
"required": false
},
"arrests": {
"label": "arrests",
"type": "number",
"required": false
},
"damage": {
"label": "damage",
"type": "line",
"required": false
},
"detentions": {
"label": "detentions",
"type": "number",
"required": false
},
"charged": {
"label": "charged",
"type": "number",
"required": false
},
"fined": {
"label": "fined",
"type": "number",
"required": false
},
"effect": {
"label": "effect",
"type": "string",
"required": false
},
"effect_label": {
"label": "effect_label",
"type": "string",
"required": false
},
"casualties_label": {
"label": "casualties_label",
"type": "string",
"required": false
},
"notes": {
"label": "notes",
"type": "string",
"required": false
},
"pushpin_map": {
"label": "pushpin_map",
"type": "string",
"required": false
},
"pushpin_map_size": {
"label": "pushpin_map_size",
"type": "string",
"required": false
},
"pushpin_label": {
"label": "pushpin_label",
"type": "string",
"required": false
},
"pushpin_caption": {
"label": "pushpin_caption",
"type": "string",
"required": false
},
"state": {}
},
"paramOrder": [
"name",
"subtitle",
"part_of",
"image",
"alt",
"caption",
"date",
"time",
"time_begin",
"time_end",
"timezone",
"location",
"coordinates",
"latitude",
"longitude",
"concessions",
"causes",
"goals",
"methods",
"status",
"result",
"side1",
"side2",
"side3",
"side1a",
"side2a",
"side3a",
"side1b",
"side2b",
"side3b",
"side1c",
"side2c",
"side3c",
"side1d",
"side2d",
"side3d",
"lead_figures1",
"lead_figures2",
"lead_figures3",
"units1",
"units2",
"units3",
"how_many1",
"how_many2",
"how_many3",
"casualties1",
"casualties2",
"casualties3",
"injuries",
"fatalities",
"arrests",
"damage",
"detentions",
"charged",
"fined",
"effect",
"effect_label",
"casualties_label",
"notes",
"pushpin_map",
"pushpin_map_size",
"pushpin_label",
"pushpin_caption",
"state"
]
}
</templatedata>
{{collapse bottom}}
== See also ==
* {{Tlg|Infobox military conflict}} for an infobox better suited for military conflicts.
* {{Tlg|Infobox civilian attack}} for an infobox to be used for particular violent attacks in a civilian context (such as terrorist attacks, murders, etc.).
<!-- Start of hidden references section -->
<includeonly>{{Sandbox other||
<!--Categories below this line, please; interwikis at Wikidata-->
[[Category:Events infobox templates|Civil conflict]]
[[Category:Civil infobox templates]]
[[Category:Embeddable templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
ecze3e4tnudl431ky4goh02vbx9nnbd
Tempilet:Infobox/Columns/styles.css
10
2741
33573
2024-09-09T21:10:53Z
en>Izno
0
move text align to its own box
33573
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
.infobox-columns {
display: flex;
}
/* TODO: Remove .infobox when element selectors in Common.css are removed as
* we are overriding text-align: center on .infobox .infobox-full-data here
*/
.infobox .infobox-columns-text-left {
text-align: left;
}
.infobox-columns > div {
box-sizing: border-box;
width: 50%;
padding: 2px;
}
.infobox-columns-3 > div {
width: 33.33%;
}
.infobox-columns-4 > div {
width: 25%;
}
.infobox-columns > div:not(:first-child) {
border-left: 1px dotted #aaa;
padding-left: 5px;
}
8oonclotoveh1vbltlu4uow6vll01oe
33574
33573
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox/Columns/styles.css]]
33573
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
.infobox-columns {
display: flex;
}
/* TODO: Remove .infobox when element selectors in Common.css are removed as
* we are overriding text-align: center on .infobox .infobox-full-data here
*/
.infobox .infobox-columns-text-left {
text-align: left;
}
.infobox-columns > div {
box-sizing: border-box;
width: 50%;
padding: 2px;
}
.infobox-columns-3 > div {
width: 33.33%;
}
.infobox-columns-4 > div {
width: 25%;
}
.infobox-columns > div:not(:first-child) {
border-left: 1px dotted #aaa;
padding-left: 5px;
}
8oonclotoveh1vbltlu4uow6vll01oe
Tempilet mossa:Infobox civil conflict
11
2742
33575
2026-10-14T06:11:40Z
en>Lexiconaut
0
/* Dates and times */ new section
33575
wikitext
text/x-wiki
{{WPBS|
{{WikiProject Infoboxes}}
{{WikiProject Politics}}
{{WikiProject Crime|terrorism=yes}}
{{WPMILHIST}}
}}
{{tfdend|date=12 March 2011|result=no consensus}}
== Image vs. File ==
For the link to images, I believe the preferred syntax is "File:" rather than "Image:". For example, "<nowiki>[[File:Example.jpg|300px|alt=Example alt text]]</nowiki>." See [[WP:EIS]]. I don't know how to change this in the template, or I would. —[[User:Diiscool|Diiscool]] ([[User talk:Diiscool|talk]]) 19:38, 17 March 2011 (UTC)
* I think all the instances of the infobox uses their own format of either "File:" or "Image:". I don't think the infobox itself has reference to either. ~ [[User:Justin Ormont|Justin Ormont]] ([[User talk:Justin Ormont|talk]]) 23:46, 18 March 2011 (UTC)
== Casualties section ==
I would prefer the sequence be deaths, injuries, arrests. Not a big deal, but I think people are most concerned about the death count. [[User:Flatterworld|Flatterworld]] ([[User talk:Flatterworld|talk]]) 05:34, 27 March 2011 (UTC)
: Those fields are not in explicitly in the infobox (yet). Right now the order is specified on a per-article basis. However, if the version in the sandbox is used, then the order will be fixed. See [[Template:Infobox civil conflict/testcases]], for example. Thanks! [[User:Plastikspork|Plastikspork]] [[User talk:Plastikspork|<sub style="font-size: 60%">―Œ</sub><sup style="margin-left:-3ex">(talk)</sup>]] 07:15, 27 March 2011 (UTC)
:: You can use the fields directly in the current version, although they are currently undocumented. The template will format them into a table if you use |injuries = xxx | fatalities = xxx | arrests = xxx. Generally though I recommend making a table or list and putting that in to the casualties1, casualties2, casualties3 fields as it's much more flexible. If put into the casualties3 field, it will show up with the full width of the infobox available to the table/list and only about half if put into casualties1 or casualties2. I changed the order for you, but only if you're using the {injuries, fatalities, arrests} fields. ~ [[User:Justin Ormont|Justin Ormont]] ([[User talk:Justin Ormont|talk]]) 08:33, 27 March 2011 (UTC)
== 300px ==
This is a poorly coded infobox as far as images go. Please help. - [[User:Peregrine Fisher|Peregrine Fisher]] ([[User talk:Peregrine Fisher|talk]]) 04:14, 7 October 2011 (UTC)
: Uh, you're misreading the documentation. Where it says "The image must be given in the form <code><nowiki>[[Image:Example.jpg|300px|alt=Example alt text]]</nowiki></code>" it simply means that you have to specify the image: tags and a size. There's nothing to mandate 300px. [[user:thumperward|Chris Cunningham (user:thumperward)]] - [[user talk:thumperward|talk]] 09:20, 7 October 2011 (UTC)
::What I mean is that it should force the image to be 300px. An article I was working on had it specified at 250px, and I had to come here to figure out what size would fit the box correctly. - [[User:Peregrine Fisher|Peregrine Fisher]] ([[User talk:Peregrine Fisher|talk]]) 18:13, 7 October 2011 (UTC)
::: It can't do that using the current syntax as the image field is freeform. Images shouldn't be 300px anyway: they should usually be specified as <code>frameless</code> in infoboxes, which means they respect the user's thumbnail size without borders or being upscaled. [[user:thumperward|Chris Cunningham (user:thumperward)]] - [[user talk:thumperward|talk]] 19:44, 7 October 2011 (UTC)
==Law enforcement actions use this??==
[[Wikipedia:Templates_for_discussion/Log/2011_October_26#Template:Infobox_law_enforcement_action| The AfD'd Law enforcement action template]] (which was poorly formed) was described as being duplicative of this one. But is it a CIVIL affair if the police/military are attacking people, be it in US, Syria, Libya, China, etc, and calling it a "law enforcement action"? Any thoughts? ''[[User:Carolmooredc|CarolMooreDC]]'' 15:52, 3 November 2011 (UTC)
== Colors ==
Recently the color of the underbars has been changed to grey on [[Template:Infobox military conflict|Infobox military conflict]] and [[Template:Infobox operational plan|Infobox operational plan]]. This is the bar that says ''"Part of [insert conflict here]"''. I think, for consistency, it should be changed to grey on this infobox too.<br>Agree/Disagree? [[User:Asarlaí|~Asarlaí]] 01:14, 10 January 2012 (UTC)
== arrests vs detentions ==
I think a separate field is needed. People can be held longer than an [[arrest]] if [[Detention (imprisonment)|detained]]. --<small> [[User:とある白い猫/13|A Certain White Cat]]</small> <sup>[[User talk:とある白い猫/13|chi?]]</sup> 14:48, 22 June 2013 (UTC)
== Methods list ==
Hi there, anyone know why the {{para|methods}} list has items capped? "Protest, Sit in, Demonstrations" should be "Protest, sit in, demonstrations", shouldn't it? Sit in and Demonstration are not proper nouns. We typically use lower case, for instance at [[Template:Infobox person]] in the {{para|occupation}} field we'd write: Actor, dancer, singer, doctor (technically it would be in an {{tl|hlist}} but that wouldn't render properly here.) Thoughts? Should I change this? [[User:Cyphoidbomb|Cyphoidbomb]] ([[User talk:Cyphoidbomb|talk]]) 05:48, 20 January 2017 (UTC)
== Documentation subpage ==
The doc subpage needs update. I can be bold and add some parameters. However, I may have to copy text from another doc subpage. Of course, someone else here can update it. --[[User:George Ho|George Ho]] ([[User talk:George Ho|talk]]) 21:09, 11 February 2017 (UTC)
==Updates==
I am suggesting we permanently reinstate [https://en.wikipedia.org/w/index.php?title=Template:Infobox_civil_conflict&oldid=782299680 my recent edits]. Tons of articles have both singular and plural information for the fields given. Several conflicts occur in more then one location, several conflicts occur longer then just one single date (even the events of the [[2011 Wisconsin protests|example article]] went on for 4 months), and a conflict may only have one cause, etc. Having "(s)" in each label ensures that each usage is correct. Also, the sub-header shouldn't match the above color, because is gets confusing becasue it looks like its one solid block. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 04:36, 26 May 2017 (UTC)
:{{Reply|Grapesoda22}} Thanks for taking this to the talk page. I understand your line of reasoning for the singular/plural edits, but I think the changes you made to address it make the infobox look worse. I was hoping to find a better solution. Perhaps a conditional code that can accommodate data that is either singular or plural and display the correct form. {{u|Frietjes}} is this possible?
:As for the sub-header, I simply disagree. I don't have that issue. However, infoboxes that use [[Template:Infobox military conflict]] use two different colors to distinguish one box from the other. How about something like that? [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 05:08, 26 May 2017 (UTC)
:: [[User:Mitchumch|Mitchumch]], yes, if there are any labels for data items which may be singular or plural, we can toggle the label based differing label parameters (e.g., allow both {{para|cause}} and {{para|causes}} and have the label changed based on which one is used). I find [https://snook.ca/technical/colour_contrast/colour.html colour contrast tool] useful for testing colour combinations. in particular, if I put CEE0F2 in the first box and slide the saturation bar you get other variations. I put a version in [[Template:Infobox civil conflict/sandbox|the sandbox]] with (1) alternative plural labels for some fields, and (2) a different colour for the subheader. feel free to experiment with other changes there (e.g., change the colours if you want to test something else). [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 13:23, 26 May 2017 (UTC)
:::{{Reply|Frietjes}} Thank you. What do you think {{u|Grapesoda22}}? [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 20:38, 26 May 2017 (UTC)
::::{{Reply|Frietjes}}{{re|Mitchumch}} I'm not to enthusiastic about about this toggling idea at all. 100,000 years ago [[Template:Infobox award]] utilized toggling for its hosting field.[https://en.wikipedia.org/w/index.php?title=Template:Infobox_award&action=edit&oldid=711993882 ]. It was a disaster because in most cases editors didn't utilize the toggling properly, and as a result most infoboxs weren't labeled properly, defeating the purpose. It would have been a long tedious mess to go thought every single page with the infobox to ensure that the fields are correct. I handled it there by changing the label to "Hosted by". All pages with that infobox with the field now say "Hosted by" weather the field listed is |host= or |hosts=. "Hosted by" is correct if there is on single host or 100 hosts, and it's cleaner then saying "Host(s)".
I would like to do the same or something similar here. For instance we could change "Causes" to "Caused by" and Date with "Duration". But its more difficult here then the awards box, so some info might be stuck with "(s)", but it would still be better the having them all that way.
With the sub-header, I'd suggest making it grey to sync up with its [[Template:Infobox military conflict|sister template]]. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 23:55, 26 May 2017 (UTC)
:{{Reply|Grapesoda22}} I can agree with the subheader. The terms in the infobox is more tricky. Here are the terms up for debate:
:*"Date" or "Date(s)"
:*"Location" or "Location(s)"
:*"Causes" or "Cause(s)" or '''"Caused by"'''
:*"Goals" or "Goal(s)"
:*"Methods" or "Method(s)"
:*"Result" or "Result(s)"
:*"Concessions given" or "Concession(s) given"
:*"Deaths" or <abbr>"No.</abbr> of Deaths"
:*"Injuries" or <abbr>"No.</abbr> of Injuries"
:*"Arrests" or <abbr>"No.</abbr> of Arrests"
:I think "Caused by" is more acceptable than "Cause(s)".
:For "Deaths", "Injuries", and "Arrests" what if we follow the [[Template:Infobox military conflict]] lead. There is no field for "Arrests", but there is a field for "Casualties". The terms "Deaths" and "Injuries" do not appear in final presentation of infobox, but the editor is left to describe the casualties. I also think the header for this section could be changed to "Casualties and arrests" instead of "Arrests, etc". [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 05:23, 27 May 2017 (UTC)
::{{re|Mitchumch}}I still say we go with the "(s)" format, with "Causes" replaced with "Caused by". Appearance wise I don't like it anymore then you do, but I feel our hands are a little tied. I do like your idea about having the "Casualties" field like the Military conflict infobox. I also want to point out that some of the issues sparking this plural vs. singular fields debate are also a problem on the military box as well, we should look into fixing that. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 00:41, 28 May 2017 (UTC)
:::{{re|Grapesoda22}} Sorry about that. The editors at [[Wikipedia:WikiProject Military history]] will probably want to weigh in on any changes to their templates. On that point, I'm more inclined to defer to their judgment whatever the outcome.
:::Unfortunately, the (s) edit to the civil conflict infobox appears unprofessional to me. If the the words were within a sentence, then I could understand the concern surrounding singular or plural forms. However, these words are fields within an infobox. The need for (s) does not appear warranted to me. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 03:47, 29 May 2017 (UTC)
::{{re|Mitchumch}} That argument goes against [[WP:IDONTLIKEIT]]. I understand that its not very attractive visually, but it is certainly not "unprofessional" by any means. What's unprofessional is an article like [[Protests against Donald Trump|this]] that has 9 locations listed on a singular label and has an almost 2 year history listed as a single date. Also, we can't have a whole sentences in a small space allotted for just a label. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 04:34, 29 May 2017 (UTC)
:::{{re|Grapesoda22}} In regards to [[WP:IDONTLIKEIT]], which [[Wikipedia:Policies and guidelines]] does the absence of (s) violate? Once [[Wikipedia:Policies and guidelines]] is followed, I think it comes down to editors tastes.
:::As for the Donald Trump protest infobox, the location field can state "worldwide" with a note attached for further details. I imagine that note is going to get longer over time. As for the Date field, I believe a date1 and date2 field could solve that issue. Any attempt to add a date range within one field would render it invalid. The Donald Trump protest infobox ought to have a start date with "ongoing" for date2 field.
:::I didn't understand your last sentence. Please elaborate. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 04:49, 29 May 2017 (UTC)
::::{{re|Mitchumch}}"Unfortunately, the (s) edit to the civil conflict infobox '''''appears unprofessional {{underline|to me}}'''''" is very much an IDON'TLIKEIT statement. The Trump protests is just the example I pointed to for this debate. There are multiple examples of conflicts in multiple locations, not all of them could be fixed by just saying "worldwide". This notion that (s) is this terrible taboo thing for labels is ridiculous. It should be avoided if there are better options but, in this case its just not working out for the most part. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 16:16, 29 May 2017 (UTC)
:::::{{re|Grapesoda22}} [[WP:IDONTLIKEIT]] explicitly states, ''"Content on Wikipedia is judged based on its [[Wikipedia:Policies and guidelines|compliance with guidelines]], not its physical appearance. '''Once you can make all the content comply, you can then work with that and tidy it up'''."'' Can you point to a violation of policy or guideline? If not, then "I don't like it" is what this discussion is for ''you'' and me.
:::::Some edits on Wikipedia are "I don't like it" edits. Some editors don't like infoboxes, some do. There is nothing you can say that will change that. Therefore, some articles don't have infoboxes. There is no policy or guideline stipulating the presence of infoboxes on article pages.
:::::I'm more than willing to work with you. Please keep in mind I am seeking changes that will produce a singular and plural form. There appear to be [https://tools.wmflabs.org/templatecount/index.php?lang=en&name=Infobox_civil_conflict&namespace=10#bottom 1012] articles that use this template. I'm willing to help implement the changes. We've agreed on four fields that can be changed, not including the subheader.
::::: There are still six fields that are unchanged. The core issue you had with changing the template coding was that users ignored it. If editors are placed in a position of ''not'' being able to ignore the changes, then those changes should stick. Using "location1, location2, location3, etc." should work. Any attempt to bypass will result in the contents in those fields not displaying.
:::::*"Date" or "Date(s)"
:::::*"Location" or "Location(s)"
:::::*"Goals" or "Goal(s)"
:::::*"Methods" or "Method(s)"
:::::*"Result" or "Result(s)"
:::::*"Concessions given" or "Concession(s) given"
::::: [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 17:50, 29 May 2017 (UTC)
:::::::::::::::::::
{{re|Mitchumch}}
What if we change:
* Date to Duration
* Result to Resulted in
* Location to Located
[[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 18:32, 29 May 2017 (UTC)
:{{re|Grapesoda22}} "Date" and "Duration" are not synonymous. Date = May 29, 2017. Duration = 5 days, 10 hours, and 5 seconds. "Resulted in" appears promising. "Location" is a noun while "Located" is a verb. Example, I located the car near the entrance of the restaurant. The term implies an action upon something, not the position of something.
:As for the fields "Goals", "Methods", and "Concessions given" I'm inclined to remove them. The [[Template:Infobox military conflict]] doesn't use them. Those fields seem best addressed within the article body. At the very least "Resulted in" can cover "Concessions given".
:Also, I think the "Caused by" and "Resulted in" fields should be displayed as a [[Template:Nowrap]] term. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 23:10, 29 May 2017 (UTC)
::{{re|Mitchumch}}I'm really dumb... so bare with me.
We could change "Date" to "Start date" and merge "Status", "Result" and the end date together. Like for [[2011 Wisconsin protests]].... the "Start date" field just say February 14, 2011 and the "Status" field would read "Active protests ended on June 16, 2011 with several pending lawsuits".... which it basically already does now. As for the rest I really just want bight the bullet and just use (s). [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 01:26, 30 May 2017 (UTC)
::{{re|Mitchumch}} Maybe even change "Methods" to "Approach". [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 01:33, 30 May 2017 (UTC)
:::{{re|Grapesoda22}}
:::*"Status" should be left alone as there was no issue with singular or plural form.
:::*"Result" is designated for something entirely different than an end date would imply. "Resulted in" is good for me.
:::*"Methods" and "Goals" seem usually used for one faction, not all factions. Therefore, delete along with "Concessions given".
:::*"Date" seems only solution is code - startdate= and enddate=. If no enddate=, then singular. If enddate=, then plural.
:::*The (s) edit is a no-go for me.
:::The [[2011 Wisconsin protests]] is about a demonstration that ended on June 16, 2011. "Status" should be blank as there is no ongoing demonstration. Hang in there. This infobox was in need of a review anyway. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 02:35, 30 May 2017 (UTC)
{{re|Mitchumch}} Give me a break on the (s) thing. I'm really getting frustrated. I've been trying to work with you for days and days on this. I'm just asking you to suck it up and deal with it for only 4 of these labels. ''I've'' compromised a lot to appease ''you'' on several of the other fields and even the sub-header. Its not an unreasonable request. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 03:11, 30 May 2017 (UTC)
:{{re|Grapesoda22}} I was very clear at beginning that I objected to (s). If you thought at some point I would agree to (s), then I'm sorry you thought that. We can always leave the template as-is. Or, we can continue to work thru this. I thought we were making progress. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 03:26, 30 May 2017 (UTC)
::{{re|Mitchumch}} We have been making progress (some of the edits [https://en.wikipedia.org/w/index.php?title=Template:Infobox_civil_conflict&diff=782305226&oldid=782299680 I've already enacted]). But this is getting more complicated then it has to be. The (s) format is such a simple acceptable fix and its starting to annoy me that you're ''so'' dead-set against it, when its a tactic that has worked in countless other infoboxes.
I really just want to be done with this. I'm going though Wikipedia burn out in general (not just with this). I want to go away for a while and take a [[Wikipedia:Wikibreak|Wikibreak]]. Thats why [[User_talk:Mitchumch#Template talk:Infobox civil conflict|I'm eager to get this done]].
I have no animosity towards you personally. You've been very civil and quick with responses. I say this to clarify, because I could see how this could be perceived negatively. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 04:05, 30 May 2017 (UTC)
:{{re|Grapesoda22}} Please remember, I am here to avoid the (s) edit '''and''' to find an alternative that you and I agree upon. That's it. If you want to take a break, then take a break. This infobox is not going anywhere and I'm not going anywhere. But, there is no timetable to this discussion. Discussions can last several days or more and that is not unusual. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 04:29, 30 May 2017 (UTC)
::{{re|Mitchumch}} Ok, I'm leaving Wikipedia for a while. I'd say make all of the updates we agreed upon (I've already done a few) and leave the unresolved stuff the way it was beefore. Maybe someday we can come back to it, but in the meantime I'm not up to it. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 05:18, 30 May 2017 (UTC)
== Party that is officially not interfering? ==
Is there an option for adding parties who are parties to the conflict but do not take sides?[[User:Bohbye|Bohbye]] ([[User talk:Bohbye|talk]]) 06:45, 26 January 2019 (UTC)
:It seems like this template needs a <code>leadfigures</code> parameter that can be used when the lead figures don't cleanly fit into sides (i.e. the sides are amorphous or the groups involved are frequently changing allegiance), or when there are only lead figures on one side (i.e. people fighting against an institution or widespread practice, e.g. lunch-counter sit-ins to protest racial discrimination). It's also common that a lead figure will be a mediator or peacemaker between two sides, and thus not fit into the current scheme. [[User:Kaldari|Kaldari]] ([[User talk:Kaldari|talk]]) 17:31, 30 September 2019 (UTC)
== Supporting other map types? ==
As many know, there are [[Wikipedia:Maps on Wikipedia|many mapping options available]], including {{tl|maplink}}, probably the best, easiest to create/edit, and with the most detail. This infobox should support these maps and probably others. I noticed this because right now, articles on the [[George Floyd protests]] need to have maps separate, below the infoboxes. [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 21:25, 5 June 2020 (UTC)
: I agree. I'd like to see a concerted effort to make maps easier to use across the board, especially within infoboxes. I'm an experienced editor and half the time I can't figure out which type of map can be used, or recall the exact name of which pushpin/whatever map is best. ---[[User:Another Believer|<span style="color:navy">Another Believer</span>]] <sub>([[User talk:Another Believer|<span style="color:#C60">Talk</span>]])</sub> 15:34, 6 June 2020 (UTC)
::{{ping|Evad37}} is this something that can be done here - are you able to add the mapping ability? Will want an image_map parameter that would support {{tl|George Floyd protests map}} or [[:Commons:Data:George Floyd protests map.map]]. [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 22:08, 7 June 2020 (UTC)
:::Looking in to this now. To use {{tl|George Floyd protests map}}, that template will need to support the frameless option. - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 00:13, 16 June 2020 (UTC)
::::Alright - that should be an easy fix, right? Not sure the exact coding for it... [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 00:26, 16 June 2020 (UTC)
:::::Should be, will take a look shortly. I've added mapframe mapping ability to this template, see [[Template:Infobox_civil_conflict/testcases#Mapframe_maps|mapframe testcases]] and documentation. - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 01:37, 16 June 2020 (UTC)
:::::{{ping|Ɱ}} {{done}}, {{tlx|George Floyd protests map|2=infobox=yes}} will make the map frameless and centered. - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 02:00, 16 June 2020 (UTC)
::::::{{re|Evad37}} Thanks so much for your good work! Would you perhaps move it though to the end of the infobox? I think people would find maps less obtrusive there... [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 15:47, 16 June 2020 (UTC)
::::::Also would you add functionality for image maps? I believe that may be important for now, before the code for the Geroge Floyd map is moved to Commons which can support it better. [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 15:50, 16 June 2020 (UTC)
:::::::{{re|Ɱ}} {{done}}. You can now use {{para|mapframe-custom}} to specify either an image name, or a {{tl|maplink}} template that can e.g. show a map from a Data: page on Commons - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 04:11, 17 June 2020 (UTC)
::::::::Thanks, great work. It works but still displays "{{red|Warning: Page using Template:Infobox civil conflict with unknown parameter "mapframe-custom" (this message is shown only in preview).}}" [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 16:42, 17 June 2020 (UTC)
:::::::::{{Fixed}}, just missed adding that one to the list of known parameters - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 23:42, 17 June 2020 (UTC)
== "Causes" parameter ==
Hello all- I think the wording produced by the "causes" parameter could be improved. {{!xt|Caused by}} is not necessarily accurate, as it ascribes motivation to peoples' actions. I would suggest changing it to something along the lines of {{xt|Motivation, Provocation/Provoked by, Complaints, Issues, Genesis, Grounds}}. [[User:Eric|Eric]] <sup>[[User talk:Eric|talk]]</sup> 11:50, 7 November 2020 (UTC)
== Unknown parameter "damage"? ==
Why does [https://en.wikipedia.org/w/index.php?title=2020_Serbian_protests&oldid=995619168 this version of] [[2020 Serbian protests]] display this message in preview?
Warning: Page using Template:Infobox civil conflict with unknown parameter "damage" (this message is shown only in preview).
Nothing jumps out to me as an issue with how {{para|damage}} is specified. – [[Special:Contributions/108.56.139.120|108.56.139.120]] ([[User talk:108.56.139.120|talk]]) 00:59, 22 December 2020 (UTC)
== Infobox civil conflict and [[2021 storming of the United States Capitol]] ==
{{resolved}}
{{ping|Grapesoda22}} {{ping|Frietjes}} {{ping|Mitchumch}} {{ping|Justin Ormont}} {{ping|Plastikspork}}
[[:Template:Infobox civil conflict]] on [[2021 storming of the United States Capitol]] complains:
* Warning: Page using '''Template:Infobox civil conflict''' with unknown parameter "timezone"
** (this message is shown only in preview).
* Warning: Page using '''Template:Infobox civil conflict''' with unknown parameter "time-end"
** (this message is shown only in preview).
* Warning: Page using '''Template:Infobox civil conflict''' with unknown parameter "time-begin"
** (this message is shown only in preview).
No [[:Template:Infobox civil conflict/testcases|testcases]] use "timezone". "time-end", or "time-begin". Is [[:Template:Infobox civil conflict]] broken?
.... [[User:0mtwb9gd5wx|0mtwb9gd5wx]] ([[User talk:0mtwb9gd5wx|talk]]) 20:17, 20 May 2021 (UTC)
:I have updated the unknown parameter check in the template. It was missing a bunch of supported parameters. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 22:25, 20 May 2021 (UTC)
== Update heading ==
any objections to changing the heading from "Parties to the civil conflict" to "Parties to the conflict"? seems more concise and avoids to objections raised in [[Wikipedia:Templates_for_discussion/Log/2022_December_9#Template:Infobox_diplomatic_crisis|these discussions]]. [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 22:01, 20 January 2023 (UTC)
== RfC: Mandatory "partof" field ==
{{closed rfc top
| status =
| result = I have fixed the [[WP:TDATA]] to reflect that the "partof" parameter is described as optional in the Usage section of the template. In the future, {{u|Parham wiki}}, Requests for Comment (RfCs) are used to reach consensus on issues after other types of discussions have failed to produce consensus. Please review [[WP:RfC]]. This should've been posted as an ordinary topic on this talk page, not an RfC. [[User:Voorts|voorts]] ([[User talk:Voorts|talk]]/[[Special:Contributions/Voorts|contributions]]) 02:54, 6 July 2023 (UTC)
}}
Mandatory "partof" field is illogical, for example in the article [[Nahel Merzouk protests]] it is not part of anything, but when editing the infobox it says it must be filled! We should be able to disable the field. [[User:Parham wiki|Parham wiki]] ([[User talk:Parham wiki|talk]]) 17:14, 5 July 2023 (UTC)
:The documentation claims it's an optional parameter, and as far as I can read the code, it indeed is. Am I missing something here? [[User:Ljleppan|''Ljleppan'']] ([[User talk:Ljleppan|talk]]) 19:29, 5 July 2023 (UTC)
::When I edit the [[Nahel Merzouk protests]] infobox, it says "Field is required" under the name of the parameter, after editing it says: "'''Required field missing'''
::Are you sure you want to continue without filling the "Part of" field?". [[User:Parham wiki|Parham wiki]] ([[User talk:Parham wiki|talk]]) 20:34, 5 July 2023 (UTC)
{{closed rfc bottom}}
== size4, is it a valid field or not? ==
@[[User:Phuzion|Phuzion]], @[[User:Jonesey95|Jonesey95]], something about this was added and reverted respectively by you two in Dec 2023. [[Ambazonian leadership crisis]] and [[2018 Georgian protests]] are throwing an error at [[:Category:Pages using infobox civil conflict with unknown parameters]], yet the template documentation lists it as a valid field. So, what's up? [[User:Zaathras|Zaathras]] ([[User talk:Zaathras|talk]]) 20:28, 10 February 2024 (UTC)
:{{para|size4}} is not a supported parameters. I have removed it from the documentation. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 20:36, 10 February 2024 (UTC)
::Alrighty, thanks. So with this, I presume there's no need for the corresponding leadfigures4, howmany4, casualties4. Should these be removed as well? [[User:Zaathras|Zaathras]] ([[User talk:Zaathras|talk]]) 01:20, 11 February 2024 (UTC)
:::Yes, I think so, since there is no "side4" to provide a fourth column. I have removed them. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 17:40, 11 February 2024 (UTC)
::::Awesome, thanks for the assists. [[User:Zaathras|Zaathras]] ([[User talk:Zaathras|talk]]) 00:41, 13 February 2024 (UTC)
== Using arrests parameter not possible when casualties1+ is used ==
It seems not possible to include arrests parameter when casulaties1/2/3 are in use. I assume this is due to the similar labelling being used, and inability for the template to use a row-based and normal format in combination? Could this possibly be resolved with having an arrests_label parameter, or otherwise the casulaties_label functioning for casulaties1/2/3 as well, in order to be able to have separate sub-sections?
The reason being is that for [[2024 United Kingdom riots]] while the injuries themselves can be attributed to different sides of the conflict, the number of arrests are only the total within the conflict. I has meant that casulaties1/2/3 can no longer be used to document injuries (which is unfortunate) and instead the more generic injuries parameter has to be invoked, [https://en.wikipedia.org/w/index.php?title=2024_United_Kingdom_riots&diff=prev&oldid=1239485102 see diff] of change for idea of what I mean.
Let me know if that didn't make any sense, you might have to try yourself to understand. [[User:CommunityNotesContributor|CNC]] ([[User talk:CommunityNotesContributor|talk]]) 15:45, 9 August 2024 (UTC)
:Pining a few contributors to this problem to see if anyone can help/advise, hope that's OK, apologies if not:
:@[[User:Justin Ormont|Justin Ormont]] @[[User:Mjbmr|Mjbmr]] @[[User:Frietjes|Frietjes]] @[[User:Frietjes|Frietjes]] @[[User:Jonesey95|Jonesey95]] @[[User:Evad37|Evad37]] [[User:CommunityNotesContributor|CNC]] ([[User talk:CommunityNotesContributor|talk]]) 15:52, 9 August 2024 (UTC)
:: looking at the code, you are correct, if {{para|casualties1}} or {{para|casualties2}} or {{para|casualties3}} are used then the code disables {{para|fatalities}} and {{para|injuries}} and {{para|arrests}} and {{para|damage}}. [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 18:46, 9 August 2024 (UTC)
== Three or more alternative names ==
According to the [[Wikipedia:Manual of Style/Lead section#Alternative names|Manual of Style/Lead Section]] there should be a space in the infobox to have alternative names if there are more than two alternative names and if the alternative names don't contain complex material. I came across an [[Johnson County War|article]] that requires this because the conflict has 3 alternative names. Two primarily used by academics (War on Powder River and the Wyoming Range War) as well as a name primarily used by people who live in the area (the [https://visitbuffalowy.com/buffalo-art/johnson-county-cattle-war/ Johnson County Cattle War]).
How should we edit the template to add this option? Or am I missing guidance that this is not required and can be solved another way? Please advise [[User:Babanaeb|Babanaeb]] ([[User talk:Babanaeb|talk]]) 20:21, 17 July 2025 (UTC)
:Use {{para|subtitle}}, per the template's documentation. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 23:48, 18 July 2025 (UTC)
::In the documentation for this page it only gives examples of one name being used there. And this would conflict with the style guideline that says if a conflict is known by four or more names they should all be in the infobox? If not ill just add it in the subtitle. Would I add all alternative names to the subtitle or just the one? [[User:Babanaeb|Babanaeb]] ([[User talk:Babanaeb|talk]]) 16:29, 22 July 2025 (UTC)
:::That MOS section specifically says to put alternative names in the infobox: "Useful when there are a large number of alternative names and pronunciations". – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 16:54, 23 July 2025 (UTC)
== Deprecate & clean up conflicting parameters ==
This template currently has a large number of conflicting parameters which can cause issues. As part of an ongoing effort to reduce these conflicts and reduce the overhead maintenance required on these templates, I am going to deprecate and ultimately remove a large number of these params, particularly those that fail to conform to [[MOS:INFOBOXNAME]]. Note that this follows a long list of similar clean ups that I have done on countless other Infoboxes. The parameters I plan to replace are the following:
{| class="wikitable"
! Deprecate
! Replace with
|-
|{{para|partof}}
|{{para|part_of}}
|-
|{{para|image size}}
|{{para|image_size}}
|-
|{{para|image_alt}}
|{{para|alt}}
|-
|{{para|time-begin}}
|{{para|time_begin}}
|-
|{{para|time-end}}
|{{para|time_end}}
|-
|{{para|place}}
|{{para|location}}
|-
|{{para|leadfigures1}}
|{{para|lead_figures1}}
|-
|{{para|leadfigures2}}
|{{para|lead_figures2}}
|-
|{{para|leadfigures3}}
|{{para|lead_figures3}}
|-
|{{para|howmany1}}
|{{para|how_many1}}
|-
|{{para|howmany2}}
|{{para|how_many2}}
|-
|{{para|howmany3}}
|{{para|how_many3}}
|-
|{{para|buildings destroyed}}
|{{para|buildings}}
|-
|{{para|map_coord}}
|{{para|coordinates}}
|-
|{{para|sidebox}}
|rowspan=2|{{para|campaign_box}}
|-
|{{para|campaignbox}}
|}
Please chime in below with any questions, comments or concerns about this cleanup. '''[[User:Zackmann08|<span style="color:#00d5ff !important">Zack</span><span style="color:#007F94 !important">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange !important">What I been doing</span>]]</sub>) 21:46, 23 June 2026 (UTC)
== Lead figures section of the infobox ==
[[Talk:2025–2026 Iranian protests#RFC: Reza Pahlavi as "Lead figure" in the infobox|This RfC]] identifies an ambiguity between how the section of the infobox is titled (''lead figures'') and the advice in the infobox, which is to populate the parameter with the ''key or significant leaders of the sides involved''. A ''lead figure'' and a ''leader'' are not necessarily identical (as evidence by the RfC discussion). This ambiguity should be resolved. I would suggest that the title of the infobox section be changed to ''leaders''. The alternative is to change the documentation. Ping {{U|Zackmann08}} as you are doing housekeeping on infoboxes. [[User:Cinderella157|Cinderella157]] ([[User talk:Cinderella157|talk]]) 00:07, 16 July 2026 (UTC)
== Pushpin map cleanup ==
As part of a larger refactor of [[Module:Location map]], I will be refactoring the way that this Infobox calls the location map code. The only noticeable change for most will be that the parameter names related to the pushpin maps will now all start with {{para|pushpin_...}}. This is part of a larger effort to make things consistent across Infoboxes. When this is done, ALL infoboxes using pushpin maps will use the same parameters. For more information about this, please see [[Module_talk:Location_map#Proposal_to_refactor_the_way_Template:Location_map_works_in_Infoboxes|this post]]. As part of this cleanup, I am also going to resolving any conflicting parameters that I can find and cleaning up parameter names that fail to conform to [[MOS:INFOBOXNAME]]. Note that this follows a long list of similar clean ups that I have done on countless other Infoboxes. The parameters I plan to replace are the following:
{| class="wikitable"
! Deprecate
! Replace with
|-
| {{para|map_type}}
| {{para|pushpin_map}}
|-
| {{para|map_size}}
| {{para|pushpin_map_size}}
|-
| {{para|map_label}}
| {{para|pushpin_label}}
|-
| {{para|map_label2}}
| {{para|pushpin_label2}}
|-
| {{para|map_label3}}
| {{para|pushpin_label3}}
|-
| {{para|map_label4}}
| {{para|pushpin_label4}}
|-
| {{para|map_label5}}
| {{para|pushpin_label5}}
|-
| {{para|map_label6}}
| {{para|pushpin_label6}}
|-
| {{para|map_label7}}
| {{para|pushpin_label7}}
|-
| {{para|map_label8}}
| {{para|pushpin_label8}}
|-
| {{para|map_label9}}
| {{para|pushpin_label9}}
|-
| {{para|map_label10}}
| {{para|pushpin_label10}}
|-
| {{para|map_caption}}
| {{para|pushpin_caption}}
|}
Please chime in below with any questions, comments or concerns about this cleanup. '''[[User:Zackmann08|<span style="color:#00d5ff">Zack</span><span style="color:#007F94">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange">What I been doing</span>]]</sub>) 03:35, 22 August 2026 (UTC)
== Dates and times ==
Why does this template have the option to include start time and end time ({{para|time_begin}} and {{para|time_end}}) but not start date and end date? --[[User:Lexiconaut|Lexiconaut]] ([[User talk:Lexiconaut|talk]]) 06:11, 14 October 2026 (UTC)
0vy0v8a05p2t3lnhus23uct6r0hv8uh
33576
33575
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Template_talk:Infobox_civil_conflict]]
33575
wikitext
text/x-wiki
{{WPBS|
{{WikiProject Infoboxes}}
{{WikiProject Politics}}
{{WikiProject Crime|terrorism=yes}}
{{WPMILHIST}}
}}
{{tfdend|date=12 March 2011|result=no consensus}}
== Image vs. File ==
For the link to images, I believe the preferred syntax is "File:" rather than "Image:". For example, "<nowiki>[[File:Example.jpg|300px|alt=Example alt text]]</nowiki>." See [[WP:EIS]]. I don't know how to change this in the template, or I would. —[[User:Diiscool|Diiscool]] ([[User talk:Diiscool|talk]]) 19:38, 17 March 2011 (UTC)
* I think all the instances of the infobox uses their own format of either "File:" or "Image:". I don't think the infobox itself has reference to either. ~ [[User:Justin Ormont|Justin Ormont]] ([[User talk:Justin Ormont|talk]]) 23:46, 18 March 2011 (UTC)
== Casualties section ==
I would prefer the sequence be deaths, injuries, arrests. Not a big deal, but I think people are most concerned about the death count. [[User:Flatterworld|Flatterworld]] ([[User talk:Flatterworld|talk]]) 05:34, 27 March 2011 (UTC)
: Those fields are not in explicitly in the infobox (yet). Right now the order is specified on a per-article basis. However, if the version in the sandbox is used, then the order will be fixed. See [[Template:Infobox civil conflict/testcases]], for example. Thanks! [[User:Plastikspork|Plastikspork]] [[User talk:Plastikspork|<sub style="font-size: 60%">―Œ</sub><sup style="margin-left:-3ex">(talk)</sup>]] 07:15, 27 March 2011 (UTC)
:: You can use the fields directly in the current version, although they are currently undocumented. The template will format them into a table if you use |injuries = xxx | fatalities = xxx | arrests = xxx. Generally though I recommend making a table or list and putting that in to the casualties1, casualties2, casualties3 fields as it's much more flexible. If put into the casualties3 field, it will show up with the full width of the infobox available to the table/list and only about half if put into casualties1 or casualties2. I changed the order for you, but only if you're using the {injuries, fatalities, arrests} fields. ~ [[User:Justin Ormont|Justin Ormont]] ([[User talk:Justin Ormont|talk]]) 08:33, 27 March 2011 (UTC)
== 300px ==
This is a poorly coded infobox as far as images go. Please help. - [[User:Peregrine Fisher|Peregrine Fisher]] ([[User talk:Peregrine Fisher|talk]]) 04:14, 7 October 2011 (UTC)
: Uh, you're misreading the documentation. Where it says "The image must be given in the form <code><nowiki>[[Image:Example.jpg|300px|alt=Example alt text]]</nowiki></code>" it simply means that you have to specify the image: tags and a size. There's nothing to mandate 300px. [[user:thumperward|Chris Cunningham (user:thumperward)]] - [[user talk:thumperward|talk]] 09:20, 7 October 2011 (UTC)
::What I mean is that it should force the image to be 300px. An article I was working on had it specified at 250px, and I had to come here to figure out what size would fit the box correctly. - [[User:Peregrine Fisher|Peregrine Fisher]] ([[User talk:Peregrine Fisher|talk]]) 18:13, 7 October 2011 (UTC)
::: It can't do that using the current syntax as the image field is freeform. Images shouldn't be 300px anyway: they should usually be specified as <code>frameless</code> in infoboxes, which means they respect the user's thumbnail size without borders or being upscaled. [[user:thumperward|Chris Cunningham (user:thumperward)]] - [[user talk:thumperward|talk]] 19:44, 7 October 2011 (UTC)
==Law enforcement actions use this??==
[[Wikipedia:Templates_for_discussion/Log/2011_October_26#Template:Infobox_law_enforcement_action| The AfD'd Law enforcement action template]] (which was poorly formed) was described as being duplicative of this one. But is it a CIVIL affair if the police/military are attacking people, be it in US, Syria, Libya, China, etc, and calling it a "law enforcement action"? Any thoughts? ''[[User:Carolmooredc|CarolMooreDC]]'' 15:52, 3 November 2011 (UTC)
== Colors ==
Recently the color of the underbars has been changed to grey on [[Template:Infobox military conflict|Infobox military conflict]] and [[Template:Infobox operational plan|Infobox operational plan]]. This is the bar that says ''"Part of [insert conflict here]"''. I think, for consistency, it should be changed to grey on this infobox too.<br>Agree/Disagree? [[User:Asarlaí|~Asarlaí]] 01:14, 10 January 2012 (UTC)
== arrests vs detentions ==
I think a separate field is needed. People can be held longer than an [[arrest]] if [[Detention (imprisonment)|detained]]. --<small> [[User:とある白い猫/13|A Certain White Cat]]</small> <sup>[[User talk:とある白い猫/13|chi?]]</sup> 14:48, 22 June 2013 (UTC)
== Methods list ==
Hi there, anyone know why the {{para|methods}} list has items capped? "Protest, Sit in, Demonstrations" should be "Protest, sit in, demonstrations", shouldn't it? Sit in and Demonstration are not proper nouns. We typically use lower case, for instance at [[Template:Infobox person]] in the {{para|occupation}} field we'd write: Actor, dancer, singer, doctor (technically it would be in an {{tl|hlist}} but that wouldn't render properly here.) Thoughts? Should I change this? [[User:Cyphoidbomb|Cyphoidbomb]] ([[User talk:Cyphoidbomb|talk]]) 05:48, 20 January 2017 (UTC)
== Documentation subpage ==
The doc subpage needs update. I can be bold and add some parameters. However, I may have to copy text from another doc subpage. Of course, someone else here can update it. --[[User:George Ho|George Ho]] ([[User talk:George Ho|talk]]) 21:09, 11 February 2017 (UTC)
==Updates==
I am suggesting we permanently reinstate [https://en.wikipedia.org/w/index.php?title=Template:Infobox_civil_conflict&oldid=782299680 my recent edits]. Tons of articles have both singular and plural information for the fields given. Several conflicts occur in more then one location, several conflicts occur longer then just one single date (even the events of the [[2011 Wisconsin protests|example article]] went on for 4 months), and a conflict may only have one cause, etc. Having "(s)" in each label ensures that each usage is correct. Also, the sub-header shouldn't match the above color, because is gets confusing becasue it looks like its one solid block. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 04:36, 26 May 2017 (UTC)
:{{Reply|Grapesoda22}} Thanks for taking this to the talk page. I understand your line of reasoning for the singular/plural edits, but I think the changes you made to address it make the infobox look worse. I was hoping to find a better solution. Perhaps a conditional code that can accommodate data that is either singular or plural and display the correct form. {{u|Frietjes}} is this possible?
:As for the sub-header, I simply disagree. I don't have that issue. However, infoboxes that use [[Template:Infobox military conflict]] use two different colors to distinguish one box from the other. How about something like that? [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 05:08, 26 May 2017 (UTC)
:: [[User:Mitchumch|Mitchumch]], yes, if there are any labels for data items which may be singular or plural, we can toggle the label based differing label parameters (e.g., allow both {{para|cause}} and {{para|causes}} and have the label changed based on which one is used). I find [https://snook.ca/technical/colour_contrast/colour.html colour contrast tool] useful for testing colour combinations. in particular, if I put CEE0F2 in the first box and slide the saturation bar you get other variations. I put a version in [[Template:Infobox civil conflict/sandbox|the sandbox]] with (1) alternative plural labels for some fields, and (2) a different colour for the subheader. feel free to experiment with other changes there (e.g., change the colours if you want to test something else). [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 13:23, 26 May 2017 (UTC)
:::{{Reply|Frietjes}} Thank you. What do you think {{u|Grapesoda22}}? [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 20:38, 26 May 2017 (UTC)
::::{{Reply|Frietjes}}{{re|Mitchumch}} I'm not to enthusiastic about about this toggling idea at all. 100,000 years ago [[Template:Infobox award]] utilized toggling for its hosting field.[https://en.wikipedia.org/w/index.php?title=Template:Infobox_award&action=edit&oldid=711993882 ]. It was a disaster because in most cases editors didn't utilize the toggling properly, and as a result most infoboxs weren't labeled properly, defeating the purpose. It would have been a long tedious mess to go thought every single page with the infobox to ensure that the fields are correct. I handled it there by changing the label to "Hosted by". All pages with that infobox with the field now say "Hosted by" weather the field listed is |host= or |hosts=. "Hosted by" is correct if there is on single host or 100 hosts, and it's cleaner then saying "Host(s)".
I would like to do the same or something similar here. For instance we could change "Causes" to "Caused by" and Date with "Duration". But its more difficult here then the awards box, so some info might be stuck with "(s)", but it would still be better the having them all that way.
With the sub-header, I'd suggest making it grey to sync up with its [[Template:Infobox military conflict|sister template]]. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 23:55, 26 May 2017 (UTC)
:{{Reply|Grapesoda22}} I can agree with the subheader. The terms in the infobox is more tricky. Here are the terms up for debate:
:*"Date" or "Date(s)"
:*"Location" or "Location(s)"
:*"Causes" or "Cause(s)" or '''"Caused by"'''
:*"Goals" or "Goal(s)"
:*"Methods" or "Method(s)"
:*"Result" or "Result(s)"
:*"Concessions given" or "Concession(s) given"
:*"Deaths" or <abbr>"No.</abbr> of Deaths"
:*"Injuries" or <abbr>"No.</abbr> of Injuries"
:*"Arrests" or <abbr>"No.</abbr> of Arrests"
:I think "Caused by" is more acceptable than "Cause(s)".
:For "Deaths", "Injuries", and "Arrests" what if we follow the [[Template:Infobox military conflict]] lead. There is no field for "Arrests", but there is a field for "Casualties". The terms "Deaths" and "Injuries" do not appear in final presentation of infobox, but the editor is left to describe the casualties. I also think the header for this section could be changed to "Casualties and arrests" instead of "Arrests, etc". [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 05:23, 27 May 2017 (UTC)
::{{re|Mitchumch}}I still say we go with the "(s)" format, with "Causes" replaced with "Caused by". Appearance wise I don't like it anymore then you do, but I feel our hands are a little tied. I do like your idea about having the "Casualties" field like the Military conflict infobox. I also want to point out that some of the issues sparking this plural vs. singular fields debate are also a problem on the military box as well, we should look into fixing that. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 00:41, 28 May 2017 (UTC)
:::{{re|Grapesoda22}} Sorry about that. The editors at [[Wikipedia:WikiProject Military history]] will probably want to weigh in on any changes to their templates. On that point, I'm more inclined to defer to their judgment whatever the outcome.
:::Unfortunately, the (s) edit to the civil conflict infobox appears unprofessional to me. If the the words were within a sentence, then I could understand the concern surrounding singular or plural forms. However, these words are fields within an infobox. The need for (s) does not appear warranted to me. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 03:47, 29 May 2017 (UTC)
::{{re|Mitchumch}} That argument goes against [[WP:IDONTLIKEIT]]. I understand that its not very attractive visually, but it is certainly not "unprofessional" by any means. What's unprofessional is an article like [[Protests against Donald Trump|this]] that has 9 locations listed on a singular label and has an almost 2 year history listed as a single date. Also, we can't have a whole sentences in a small space allotted for just a label. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 04:34, 29 May 2017 (UTC)
:::{{re|Grapesoda22}} In regards to [[WP:IDONTLIKEIT]], which [[Wikipedia:Policies and guidelines]] does the absence of (s) violate? Once [[Wikipedia:Policies and guidelines]] is followed, I think it comes down to editors tastes.
:::As for the Donald Trump protest infobox, the location field can state "worldwide" with a note attached for further details. I imagine that note is going to get longer over time. As for the Date field, I believe a date1 and date2 field could solve that issue. Any attempt to add a date range within one field would render it invalid. The Donald Trump protest infobox ought to have a start date with "ongoing" for date2 field.
:::I didn't understand your last sentence. Please elaborate. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 04:49, 29 May 2017 (UTC)
::::{{re|Mitchumch}}"Unfortunately, the (s) edit to the civil conflict infobox '''''appears unprofessional {{underline|to me}}'''''" is very much an IDON'TLIKEIT statement. The Trump protests is just the example I pointed to for this debate. There are multiple examples of conflicts in multiple locations, not all of them could be fixed by just saying "worldwide". This notion that (s) is this terrible taboo thing for labels is ridiculous. It should be avoided if there are better options but, in this case its just not working out for the most part. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 16:16, 29 May 2017 (UTC)
:::::{{re|Grapesoda22}} [[WP:IDONTLIKEIT]] explicitly states, ''"Content on Wikipedia is judged based on its [[Wikipedia:Policies and guidelines|compliance with guidelines]], not its physical appearance. '''Once you can make all the content comply, you can then work with that and tidy it up'''."'' Can you point to a violation of policy or guideline? If not, then "I don't like it" is what this discussion is for ''you'' and me.
:::::Some edits on Wikipedia are "I don't like it" edits. Some editors don't like infoboxes, some do. There is nothing you can say that will change that. Therefore, some articles don't have infoboxes. There is no policy or guideline stipulating the presence of infoboxes on article pages.
:::::I'm more than willing to work with you. Please keep in mind I am seeking changes that will produce a singular and plural form. There appear to be [https://tools.wmflabs.org/templatecount/index.php?lang=en&name=Infobox_civil_conflict&namespace=10#bottom 1012] articles that use this template. I'm willing to help implement the changes. We've agreed on four fields that can be changed, not including the subheader.
::::: There are still six fields that are unchanged. The core issue you had with changing the template coding was that users ignored it. If editors are placed in a position of ''not'' being able to ignore the changes, then those changes should stick. Using "location1, location2, location3, etc." should work. Any attempt to bypass will result in the contents in those fields not displaying.
:::::*"Date" or "Date(s)"
:::::*"Location" or "Location(s)"
:::::*"Goals" or "Goal(s)"
:::::*"Methods" or "Method(s)"
:::::*"Result" or "Result(s)"
:::::*"Concessions given" or "Concession(s) given"
::::: [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 17:50, 29 May 2017 (UTC)
:::::::::::::::::::
{{re|Mitchumch}}
What if we change:
* Date to Duration
* Result to Resulted in
* Location to Located
[[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 18:32, 29 May 2017 (UTC)
:{{re|Grapesoda22}} "Date" and "Duration" are not synonymous. Date = May 29, 2017. Duration = 5 days, 10 hours, and 5 seconds. "Resulted in" appears promising. "Location" is a noun while "Located" is a verb. Example, I located the car near the entrance of the restaurant. The term implies an action upon something, not the position of something.
:As for the fields "Goals", "Methods", and "Concessions given" I'm inclined to remove them. The [[Template:Infobox military conflict]] doesn't use them. Those fields seem best addressed within the article body. At the very least "Resulted in" can cover "Concessions given".
:Also, I think the "Caused by" and "Resulted in" fields should be displayed as a [[Template:Nowrap]] term. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 23:10, 29 May 2017 (UTC)
::{{re|Mitchumch}}I'm really dumb... so bare with me.
We could change "Date" to "Start date" and merge "Status", "Result" and the end date together. Like for [[2011 Wisconsin protests]].... the "Start date" field just say February 14, 2011 and the "Status" field would read "Active protests ended on June 16, 2011 with several pending lawsuits".... which it basically already does now. As for the rest I really just want bight the bullet and just use (s). [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 01:26, 30 May 2017 (UTC)
::{{re|Mitchumch}} Maybe even change "Methods" to "Approach". [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 01:33, 30 May 2017 (UTC)
:::{{re|Grapesoda22}}
:::*"Status" should be left alone as there was no issue with singular or plural form.
:::*"Result" is designated for something entirely different than an end date would imply. "Resulted in" is good for me.
:::*"Methods" and "Goals" seem usually used for one faction, not all factions. Therefore, delete along with "Concessions given".
:::*"Date" seems only solution is code - startdate= and enddate=. If no enddate=, then singular. If enddate=, then plural.
:::*The (s) edit is a no-go for me.
:::The [[2011 Wisconsin protests]] is about a demonstration that ended on June 16, 2011. "Status" should be blank as there is no ongoing demonstration. Hang in there. This infobox was in need of a review anyway. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 02:35, 30 May 2017 (UTC)
{{re|Mitchumch}} Give me a break on the (s) thing. I'm really getting frustrated. I've been trying to work with you for days and days on this. I'm just asking you to suck it up and deal with it for only 4 of these labels. ''I've'' compromised a lot to appease ''you'' on several of the other fields and even the sub-header. Its not an unreasonable request. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 03:11, 30 May 2017 (UTC)
:{{re|Grapesoda22}} I was very clear at beginning that I objected to (s). If you thought at some point I would agree to (s), then I'm sorry you thought that. We can always leave the template as-is. Or, we can continue to work thru this. I thought we were making progress. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 03:26, 30 May 2017 (UTC)
::{{re|Mitchumch}} We have been making progress (some of the edits [https://en.wikipedia.org/w/index.php?title=Template:Infobox_civil_conflict&diff=782305226&oldid=782299680 I've already enacted]). But this is getting more complicated then it has to be. The (s) format is such a simple acceptable fix and its starting to annoy me that you're ''so'' dead-set against it, when its a tactic that has worked in countless other infoboxes.
I really just want to be done with this. I'm going though Wikipedia burn out in general (not just with this). I want to go away for a while and take a [[Wikipedia:Wikibreak|Wikibreak]]. Thats why [[User_talk:Mitchumch#Template talk:Infobox civil conflict|I'm eager to get this done]].
I have no animosity towards you personally. You've been very civil and quick with responses. I say this to clarify, because I could see how this could be perceived negatively. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 04:05, 30 May 2017 (UTC)
:{{re|Grapesoda22}} Please remember, I am here to avoid the (s) edit '''and''' to find an alternative that you and I agree upon. That's it. If you want to take a break, then take a break. This infobox is not going anywhere and I'm not going anywhere. But, there is no timetable to this discussion. Discussions can last several days or more and that is not unusual. [[User:Mitchumch|Mitchumch]] ([[User talk:Mitchumch|talk]]) 04:29, 30 May 2017 (UTC)
::{{re|Mitchumch}} Ok, I'm leaving Wikipedia for a while. I'd say make all of the updates we agreed upon (I've already done a few) and leave the unresolved stuff the way it was beefore. Maybe someday we can come back to it, but in the meantime I'm not up to it. [[User:Grapesoda22|<span style="color:#6F2DA8;">Grapesoda22</span>]] ([[User talk:Grapesoda22|✉]]) 05:18, 30 May 2017 (UTC)
== Party that is officially not interfering? ==
Is there an option for adding parties who are parties to the conflict but do not take sides?[[User:Bohbye|Bohbye]] ([[User talk:Bohbye|talk]]) 06:45, 26 January 2019 (UTC)
:It seems like this template needs a <code>leadfigures</code> parameter that can be used when the lead figures don't cleanly fit into sides (i.e. the sides are amorphous or the groups involved are frequently changing allegiance), or when there are only lead figures on one side (i.e. people fighting against an institution or widespread practice, e.g. lunch-counter sit-ins to protest racial discrimination). It's also common that a lead figure will be a mediator or peacemaker between two sides, and thus not fit into the current scheme. [[User:Kaldari|Kaldari]] ([[User talk:Kaldari|talk]]) 17:31, 30 September 2019 (UTC)
== Supporting other map types? ==
As many know, there are [[Wikipedia:Maps on Wikipedia|many mapping options available]], including {{tl|maplink}}, probably the best, easiest to create/edit, and with the most detail. This infobox should support these maps and probably others. I noticed this because right now, articles on the [[George Floyd protests]] need to have maps separate, below the infoboxes. [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 21:25, 5 June 2020 (UTC)
: I agree. I'd like to see a concerted effort to make maps easier to use across the board, especially within infoboxes. I'm an experienced editor and half the time I can't figure out which type of map can be used, or recall the exact name of which pushpin/whatever map is best. ---[[User:Another Believer|<span style="color:navy">Another Believer</span>]] <sub>([[User talk:Another Believer|<span style="color:#C60">Talk</span>]])</sub> 15:34, 6 June 2020 (UTC)
::{{ping|Evad37}} is this something that can be done here - are you able to add the mapping ability? Will want an image_map parameter that would support {{tl|George Floyd protests map}} or [[:Commons:Data:George Floyd protests map.map]]. [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 22:08, 7 June 2020 (UTC)
:::Looking in to this now. To use {{tl|George Floyd protests map}}, that template will need to support the frameless option. - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 00:13, 16 June 2020 (UTC)
::::Alright - that should be an easy fix, right? Not sure the exact coding for it... [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 00:26, 16 June 2020 (UTC)
:::::Should be, will take a look shortly. I've added mapframe mapping ability to this template, see [[Template:Infobox_civil_conflict/testcases#Mapframe_maps|mapframe testcases]] and documentation. - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 01:37, 16 June 2020 (UTC)
:::::{{ping|Ɱ}} {{done}}, {{tlx|George Floyd protests map|2=infobox=yes}} will make the map frameless and centered. - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 02:00, 16 June 2020 (UTC)
::::::{{re|Evad37}} Thanks so much for your good work! Would you perhaps move it though to the end of the infobox? I think people would find maps less obtrusive there... [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 15:47, 16 June 2020 (UTC)
::::::Also would you add functionality for image maps? I believe that may be important for now, before the code for the Geroge Floyd map is moved to Commons which can support it better. [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 15:50, 16 June 2020 (UTC)
:::::::{{re|Ɱ}} {{done}}. You can now use {{para|mapframe-custom}} to specify either an image name, or a {{tl|maplink}} template that can e.g. show a map from a Data: page on Commons - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 04:11, 17 June 2020 (UTC)
::::::::Thanks, great work. It works but still displays "{{red|Warning: Page using Template:Infobox civil conflict with unknown parameter "mapframe-custom" (this message is shown only in preview).}}" [[User:Ɱ|<span style="text-shadow:#bbb 0.1em 0.1em 0.1em;" class="texhtml">'''ɱ'''</span>]] [[User talk:Ɱ|(talk)]] 16:42, 17 June 2020 (UTC)
:::::::::{{Fixed}}, just missed adding that one to the list of known parameters - <u>'''[[User:Evad37|Evad]]''37'''''</u> <span style="font-size:95%;">[[[d:w:User talk:Evad37|talk]]]</span> 23:42, 17 June 2020 (UTC)
== "Causes" parameter ==
Hello all- I think the wording produced by the "causes" parameter could be improved. {{!xt|Caused by}} is not necessarily accurate, as it ascribes motivation to peoples' actions. I would suggest changing it to something along the lines of {{xt|Motivation, Provocation/Provoked by, Complaints, Issues, Genesis, Grounds}}. [[User:Eric|Eric]] <sup>[[User talk:Eric|talk]]</sup> 11:50, 7 November 2020 (UTC)
== Unknown parameter "damage"? ==
Why does [https://en.wikipedia.org/w/index.php?title=2020_Serbian_protests&oldid=995619168 this version of] [[2020 Serbian protests]] display this message in preview?
Warning: Page using Template:Infobox civil conflict with unknown parameter "damage" (this message is shown only in preview).
Nothing jumps out to me as an issue with how {{para|damage}} is specified. – [[Special:Contributions/108.56.139.120|108.56.139.120]] ([[User talk:108.56.139.120|talk]]) 00:59, 22 December 2020 (UTC)
== Infobox civil conflict and [[2021 storming of the United States Capitol]] ==
{{resolved}}
{{ping|Grapesoda22}} {{ping|Frietjes}} {{ping|Mitchumch}} {{ping|Justin Ormont}} {{ping|Plastikspork}}
[[:Template:Infobox civil conflict]] on [[2021 storming of the United States Capitol]] complains:
* Warning: Page using '''Template:Infobox civil conflict''' with unknown parameter "timezone"
** (this message is shown only in preview).
* Warning: Page using '''Template:Infobox civil conflict''' with unknown parameter "time-end"
** (this message is shown only in preview).
* Warning: Page using '''Template:Infobox civil conflict''' with unknown parameter "time-begin"
** (this message is shown only in preview).
No [[:Template:Infobox civil conflict/testcases|testcases]] use "timezone". "time-end", or "time-begin". Is [[:Template:Infobox civil conflict]] broken?
.... [[User:0mtwb9gd5wx|0mtwb9gd5wx]] ([[User talk:0mtwb9gd5wx|talk]]) 20:17, 20 May 2021 (UTC)
:I have updated the unknown parameter check in the template. It was missing a bunch of supported parameters. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 22:25, 20 May 2021 (UTC)
== Update heading ==
any objections to changing the heading from "Parties to the civil conflict" to "Parties to the conflict"? seems more concise and avoids to objections raised in [[Wikipedia:Templates_for_discussion/Log/2022_December_9#Template:Infobox_diplomatic_crisis|these discussions]]. [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 22:01, 20 January 2023 (UTC)
== RfC: Mandatory "partof" field ==
{{closed rfc top
| status =
| result = I have fixed the [[WP:TDATA]] to reflect that the "partof" parameter is described as optional in the Usage section of the template. In the future, {{u|Parham wiki}}, Requests for Comment (RfCs) are used to reach consensus on issues after other types of discussions have failed to produce consensus. Please review [[WP:RfC]]. This should've been posted as an ordinary topic on this talk page, not an RfC. [[User:Voorts|voorts]] ([[User talk:Voorts|talk]]/[[Special:Contributions/Voorts|contributions]]) 02:54, 6 July 2023 (UTC)
}}
Mandatory "partof" field is illogical, for example in the article [[Nahel Merzouk protests]] it is not part of anything, but when editing the infobox it says it must be filled! We should be able to disable the field. [[User:Parham wiki|Parham wiki]] ([[User talk:Parham wiki|talk]]) 17:14, 5 July 2023 (UTC)
:The documentation claims it's an optional parameter, and as far as I can read the code, it indeed is. Am I missing something here? [[User:Ljleppan|''Ljleppan'']] ([[User talk:Ljleppan|talk]]) 19:29, 5 July 2023 (UTC)
::When I edit the [[Nahel Merzouk protests]] infobox, it says "Field is required" under the name of the parameter, after editing it says: "'''Required field missing'''
::Are you sure you want to continue without filling the "Part of" field?". [[User:Parham wiki|Parham wiki]] ([[User talk:Parham wiki|talk]]) 20:34, 5 July 2023 (UTC)
{{closed rfc bottom}}
== size4, is it a valid field or not? ==
@[[User:Phuzion|Phuzion]], @[[User:Jonesey95|Jonesey95]], something about this was added and reverted respectively by you two in Dec 2023. [[Ambazonian leadership crisis]] and [[2018 Georgian protests]] are throwing an error at [[:Category:Pages using infobox civil conflict with unknown parameters]], yet the template documentation lists it as a valid field. So, what's up? [[User:Zaathras|Zaathras]] ([[User talk:Zaathras|talk]]) 20:28, 10 February 2024 (UTC)
:{{para|size4}} is not a supported parameters. I have removed it from the documentation. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 20:36, 10 February 2024 (UTC)
::Alrighty, thanks. So with this, I presume there's no need for the corresponding leadfigures4, howmany4, casualties4. Should these be removed as well? [[User:Zaathras|Zaathras]] ([[User talk:Zaathras|talk]]) 01:20, 11 February 2024 (UTC)
:::Yes, I think so, since there is no "side4" to provide a fourth column. I have removed them. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 17:40, 11 February 2024 (UTC)
::::Awesome, thanks for the assists. [[User:Zaathras|Zaathras]] ([[User talk:Zaathras|talk]]) 00:41, 13 February 2024 (UTC)
== Using arrests parameter not possible when casualties1+ is used ==
It seems not possible to include arrests parameter when casulaties1/2/3 are in use. I assume this is due to the similar labelling being used, and inability for the template to use a row-based and normal format in combination? Could this possibly be resolved with having an arrests_label parameter, or otherwise the casulaties_label functioning for casulaties1/2/3 as well, in order to be able to have separate sub-sections?
The reason being is that for [[2024 United Kingdom riots]] while the injuries themselves can be attributed to different sides of the conflict, the number of arrests are only the total within the conflict. I has meant that casulaties1/2/3 can no longer be used to document injuries (which is unfortunate) and instead the more generic injuries parameter has to be invoked, [https://en.wikipedia.org/w/index.php?title=2024_United_Kingdom_riots&diff=prev&oldid=1239485102 see diff] of change for idea of what I mean.
Let me know if that didn't make any sense, you might have to try yourself to understand. [[User:CommunityNotesContributor|CNC]] ([[User talk:CommunityNotesContributor|talk]]) 15:45, 9 August 2024 (UTC)
:Pining a few contributors to this problem to see if anyone can help/advise, hope that's OK, apologies if not:
:@[[User:Justin Ormont|Justin Ormont]] @[[User:Mjbmr|Mjbmr]] @[[User:Frietjes|Frietjes]] @[[User:Frietjes|Frietjes]] @[[User:Jonesey95|Jonesey95]] @[[User:Evad37|Evad37]] [[User:CommunityNotesContributor|CNC]] ([[User talk:CommunityNotesContributor|talk]]) 15:52, 9 August 2024 (UTC)
:: looking at the code, you are correct, if {{para|casualties1}} or {{para|casualties2}} or {{para|casualties3}} are used then the code disables {{para|fatalities}} and {{para|injuries}} and {{para|arrests}} and {{para|damage}}. [[User:Frietjes|Frietjes]] ([[User talk:Frietjes|talk]]) 18:46, 9 August 2024 (UTC)
== Three or more alternative names ==
According to the [[Wikipedia:Manual of Style/Lead section#Alternative names|Manual of Style/Lead Section]] there should be a space in the infobox to have alternative names if there are more than two alternative names and if the alternative names don't contain complex material. I came across an [[Johnson County War|article]] that requires this because the conflict has 3 alternative names. Two primarily used by academics (War on Powder River and the Wyoming Range War) as well as a name primarily used by people who live in the area (the [https://visitbuffalowy.com/buffalo-art/johnson-county-cattle-war/ Johnson County Cattle War]).
How should we edit the template to add this option? Or am I missing guidance that this is not required and can be solved another way? Please advise [[User:Babanaeb|Babanaeb]] ([[User talk:Babanaeb|talk]]) 20:21, 17 July 2025 (UTC)
:Use {{para|subtitle}}, per the template's documentation. – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 23:48, 18 July 2025 (UTC)
::In the documentation for this page it only gives examples of one name being used there. And this would conflict with the style guideline that says if a conflict is known by four or more names they should all be in the infobox? If not ill just add it in the subtitle. Would I add all alternative names to the subtitle or just the one? [[User:Babanaeb|Babanaeb]] ([[User talk:Babanaeb|talk]]) 16:29, 22 July 2025 (UTC)
:::That MOS section specifically says to put alternative names in the infobox: "Useful when there are a large number of alternative names and pronunciations". – [[User:Jonesey95|Jonesey95]] ([[User talk:Jonesey95|talk]]) 16:54, 23 July 2025 (UTC)
== Deprecate & clean up conflicting parameters ==
This template currently has a large number of conflicting parameters which can cause issues. As part of an ongoing effort to reduce these conflicts and reduce the overhead maintenance required on these templates, I am going to deprecate and ultimately remove a large number of these params, particularly those that fail to conform to [[MOS:INFOBOXNAME]]. Note that this follows a long list of similar clean ups that I have done on countless other Infoboxes. The parameters I plan to replace are the following:
{| class="wikitable"
! Deprecate
! Replace with
|-
|{{para|partof}}
|{{para|part_of}}
|-
|{{para|image size}}
|{{para|image_size}}
|-
|{{para|image_alt}}
|{{para|alt}}
|-
|{{para|time-begin}}
|{{para|time_begin}}
|-
|{{para|time-end}}
|{{para|time_end}}
|-
|{{para|place}}
|{{para|location}}
|-
|{{para|leadfigures1}}
|{{para|lead_figures1}}
|-
|{{para|leadfigures2}}
|{{para|lead_figures2}}
|-
|{{para|leadfigures3}}
|{{para|lead_figures3}}
|-
|{{para|howmany1}}
|{{para|how_many1}}
|-
|{{para|howmany2}}
|{{para|how_many2}}
|-
|{{para|howmany3}}
|{{para|how_many3}}
|-
|{{para|buildings destroyed}}
|{{para|buildings}}
|-
|{{para|map_coord}}
|{{para|coordinates}}
|-
|{{para|sidebox}}
|rowspan=2|{{para|campaign_box}}
|-
|{{para|campaignbox}}
|}
Please chime in below with any questions, comments or concerns about this cleanup. '''[[User:Zackmann08|<span style="color:#00d5ff !important">Zack</span><span style="color:#007F94 !important">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange !important">What I been doing</span>]]</sub>) 21:46, 23 June 2026 (UTC)
== Lead figures section of the infobox ==
[[Talk:2025–2026 Iranian protests#RFC: Reza Pahlavi as "Lead figure" in the infobox|This RfC]] identifies an ambiguity between how the section of the infobox is titled (''lead figures'') and the advice in the infobox, which is to populate the parameter with the ''key or significant leaders of the sides involved''. A ''lead figure'' and a ''leader'' are not necessarily identical (as evidence by the RfC discussion). This ambiguity should be resolved. I would suggest that the title of the infobox section be changed to ''leaders''. The alternative is to change the documentation. Ping {{U|Zackmann08}} as you are doing housekeeping on infoboxes. [[User:Cinderella157|Cinderella157]] ([[User talk:Cinderella157|talk]]) 00:07, 16 July 2026 (UTC)
== Pushpin map cleanup ==
As part of a larger refactor of [[Module:Location map]], I will be refactoring the way that this Infobox calls the location map code. The only noticeable change for most will be that the parameter names related to the pushpin maps will now all start with {{para|pushpin_...}}. This is part of a larger effort to make things consistent across Infoboxes. When this is done, ALL infoboxes using pushpin maps will use the same parameters. For more information about this, please see [[Module_talk:Location_map#Proposal_to_refactor_the_way_Template:Location_map_works_in_Infoboxes|this post]]. As part of this cleanup, I am also going to resolving any conflicting parameters that I can find and cleaning up parameter names that fail to conform to [[MOS:INFOBOXNAME]]. Note that this follows a long list of similar clean ups that I have done on countless other Infoboxes. The parameters I plan to replace are the following:
{| class="wikitable"
! Deprecate
! Replace with
|-
| {{para|map_type}}
| {{para|pushpin_map}}
|-
| {{para|map_size}}
| {{para|pushpin_map_size}}
|-
| {{para|map_label}}
| {{para|pushpin_label}}
|-
| {{para|map_label2}}
| {{para|pushpin_label2}}
|-
| {{para|map_label3}}
| {{para|pushpin_label3}}
|-
| {{para|map_label4}}
| {{para|pushpin_label4}}
|-
| {{para|map_label5}}
| {{para|pushpin_label5}}
|-
| {{para|map_label6}}
| {{para|pushpin_label6}}
|-
| {{para|map_label7}}
| {{para|pushpin_label7}}
|-
| {{para|map_label8}}
| {{para|pushpin_label8}}
|-
| {{para|map_label9}}
| {{para|pushpin_label9}}
|-
| {{para|map_label10}}
| {{para|pushpin_label10}}
|-
| {{para|map_caption}}
| {{para|pushpin_caption}}
|}
Please chime in below with any questions, comments or concerns about this cleanup. '''[[User:Zackmann08|<span style="color:#00d5ff">Zack</span><span style="color:#007F94">mann</span>]]''' (<sup>[[User_talk:Zackmann08|Talk to me]]</sup>/<sub>[[Special:Contributions/Zackmann08|<span style="color:orange">What I been doing</span>]]</sub>) 03:35, 22 August 2026 (UTC)
== Dates and times ==
Why does this template have the option to include start time and end time ({{para|time_begin}} and {{para|time_end}}) but not start date and end date? --[[User:Lexiconaut|Lexiconaut]] ([[User talk:Lexiconaut|talk]]) 06:11, 14 October 2026 (UTC)
0vy0v8a05p2t3lnhus23uct6r0hv8uh
Module:Date time
828
2743
33579
2025-04-10T14:19:53Z
en>Gonnym
0
remove categories from /testcases other than in this module
33579
Scribunto
text/plain
--[[
Module:Date time – Date formatting and validation module.
This module provides functions for validating and formatting dates in templates such as
{{Start date}}, {{End date}}, {{Start date and age}}, and {{End date and age}}.
It handles:
- Validation of date components (year, month, day)
- Validation of time components (hour, minute, second)
- Timezone formatting and validation
- Generation of appropriate hCalendar microformat markup
- "time-ago" calculations
Design notes:
- Functions are organized into helper, validation, and formatting sections
- Error handling uses a consistent pattern with centralized error messages
- Timezone validation supports standard ISO 8601 formats
- Leap year calculation is cached for performance
]]
require("strict")
local p = {}
---------------
-- Constants --
---------------
local HTML_SPACE = " "
local HTML_NBSP = " "
-- Error message constants
local ERROR_MESSAGES = {
integers = "All values must be integers",
has_leading_zeros = "Values cannot have unnecessary leading zeros",
missing_year = "Year value is required",
invalid_month = "Value is not a valid month",
missing_month = "Month value is required when a day is provided",
invalid_day = "Value is not a valid day (Month %d has %d days)",
invalid_hour = "Value is not a valid hour",
invalid_minute = "Value is not a valid minute",
invalid_second = "Value is not a valid second",
timezone_incomplete_date = "A timezone cannot be set without a day and hour",
invalid_timezone = "Value is not a valid timezone",
yes_value_parameter = '%s must be either "yes" or "y"',
duplicate_parameters = 'Duplicate parameters used: %s and %s',
template = "Template not supported",
time_without_hour = "Minutes and seconds require an hour value"
}
-- Template class mapping
-- "itvstart" and "itvend" are unique classes used by the TV infoboxes,
-- which only allow the usage of {{Start date}} and {{End date}}.
local TEMPLATE_CLASSES = {
["start date"] = "bday dtstart published updated itvstart",
["start date and age"] = "bday dtstart published updated",
["end date"] = "dtend itvend",
["end date and age"] = "dtend"
}
-- Templates that require "time ago" calculations
local TIME_AGO = {
["start date and age"] = true,
["end date and age"] = true
}
-- English month names
local MONTHS = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
}
-- Error category
local ERROR_CATEGORY = "[[Category:Pages using Module:Date time with invalid values]]"
-- Namespaces where error categories should be applied
local CATEGORY_NAMESPACES = {
[0] = true, -- Article
[1] = true, -- Article talk
[4] = true, -- Wikipedia
[10] = true, -- Template
[100] = true, -- Portal
[118] = true -- Draft
}
-- Cached leap year calculations for performance
local leap_year_cache = {}
-- Local variables for error handling
local help_link
----------------------
-- Helper Functions --
----------------------
--- Pads a number with leading zeros to ensure a minimum of two digits.
-- @param value (number|string) The value to pad with leading zeros
-- @return string The value padded to at least two digits, or nil if input is nil
local function pad_left_zeros(value)
if value == nil then
return nil
end
local str = tostring(value)
return string.rep("0", math.max(0, 2 - #str)) .. str
end
--- Replaces [[U+2212]] (Unicode minus) with [[U+002D]] (ASCII hyphen) or vice versa.
-- @param value (string) The string value to process
-- @param to_unicode (boolean) If true, converts ASCII hyphen to Unicode minus;
-- If false, converts Unicode minus to ASCII hyphen
-- @return string The processed string with appropriate minus characters, or nil if input is nil
local function replace_minus_character(value, to_unicode)
if not value then
return nil
end
if to_unicode then
return value:gsub("-", "−")
end
return value:gsub("−", "-")
end
--- Normalizes timezone format by ensuring proper padding of hours.
-- @param timezone (string) The timezone string to normalize
-- @return string The normalized timezone string with properly padded hours, or nil if input is nil
local function fix_timezone(timezone)
if not timezone then
return nil
end
-- Replace U+2212 (Unicode minus) with U+002D (ASCII hyphen)
timezone = replace_minus_character(timezone, false)
-- Match the timezone pattern for ±H:MM format
local sign, hour, minutes = timezone:match("^([+-])(%d+):(%d+)$")
if sign and hour and minutes then
-- Pad the hour with a leading zero if necessary
hour = pad_left_zeros(hour)
return sign .. hour .. ":" .. minutes
end
-- If no match, return the original timezone (this handles invalid or already padded timezones)
return timezone
end
--- Checks if a timezone string is valid according to standard timezone formats.
-- Valid timezones range from UTC-12:00 to UTC+14:00.
-- @param timezone (string) The timezone string to validate
-- @return boolean true if the timezone is valid, false otherwise
local function is_timezone_valid(timezone)
-- Consolidated timezone pattern for better performance
local valid_patterns = {
-- Z (UTC)
"^Z$",
-- Full timezone with minutes ±HH:MM
"^[+]0[1-9]:[0-5][0-9]$",
"^[+-]0[1-9]:[0-5][0-9]$",
"^[+-]1[0-2]:[0-5][0-9]$",
"^[+]1[34]:[0-5][0-9]$",
-- Whole hour timezones ±HH
"^[+-]0[1-9]$",
"^[+-]1[0-2]$",
"^[+]1[34]$",
-- Special cases
"^[+]00:00$",
"^[+]00$"
}
-- Additional checks for invalid -00 and -00:00 cases
if timezone == "-00" or timezone == "-00:00" then
return false
end
for _, pattern in ipairs(valid_patterns) do
if string.match(timezone, pattern) then
return true
end
end
return false
end
--- Checks if a given year is a leap year.
-- Uses a cache for better performance.
-- @param year (number) The year to check for leap year status
-- @return boolean true if the year is a leap year, false otherwise
local function is_leap_year(year)
if leap_year_cache[year] == nil then
leap_year_cache[year] = (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0)
end
return leap_year_cache[year]
end
--- Returns the number of days in a given month of a specified year.
-- Handles leap years for February.
-- @param year (number) The year to check for leap year conditions
-- @param month (number) The month (1-12) for which to return the number of days
-- @return number The number of days in the specified month, accounting for leap years
local function get_days_in_month(year, month)
local days_in_month = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
if month == 2 and is_leap_year(year) then
return 29
end
return days_in_month[month] or 0
end
--- Checks if a given value has invalid leading zeros.
-- @param value (string) The value to check for leading zeros
-- @param field_type (string) Field type ("day", "month", "hour", "minute", "second")
-- @return boolean true if the value has invalid leading zeros, false otherwise
local function has_leading_zeros(value, field_type)
value = tostring(value)
-- Common checks for day and month
if field_type == "day" or field_type == "month" then
-- Reject "00" and values with leading zero followed by more than one digit
return value == "00" or
string.match(value, "^0[0-9][0-9]$") ~= nil or
string.match(value, "^0[1-9][0-9]") ~= nil
end
-- Checks for hour, minute, second
if field_type == "hour" or field_type == "minute" or field_type == "second" then
-- Allow "00" and "01" to "09"
if value == "00" or string.match(value, "^0[1-9]$") then
return false
end
-- Reject values starting with "0" followed by more than one digit
return string.match(value, "^0[0-9][0-9]+$") ~= nil
end
return false
end
--- Checks if a given value is an integer.
-- @param value (string|number) The value to check
-- @return boolean true if the value is a valid integer, false otherwise
local function is_integer(value)
if not value then
return false
end
-- Check if the value is a number first
local num_value = tonumber(value)
if not num_value then
return false
end
-- Check if it's an integer by comparing floor with the original
if math.floor(num_value) ~= num_value then
return false
end
-- For string inputs, check for decimal point to reject values like "7."
if type(value) == "string" then
-- If the string contains a decimal point, it's not an integer
if string.find(value, "%.") then
return false
end
end
return true
end
--- Returns the name of a month based on its numerical representation.
-- @param month_number (number) The month number (1-12)
-- @return string|nil The name of the month, or nil if invalid
local function get_month_name(month_number)
month_number = tonumber(month_number)
return MONTHS[month_number]
end
--- Generates an error message wrapped in HTML.
-- @param message (string) The error message to format
-- @param add_tracking_category (boolean, optional) If false, omits the tracking category
-- @return string An HTML-formatted error message with help link and error category
local function generate_error(message, add_tracking_category)
local category = ERROR_CATEGORY
if add_tracking_category == false then
category = ""
end
-- Get current page title object
local article_title = mw.title.getCurrentTitle()
-- Special case for testcases pages
local is_test_page = article_title.subpageText == "testcases"
local allow_this_test_page = article_title.fullText == "Module talk:Date time/testcases"
-- Remove category if the page is not in a tracked namespace or is any other testcases other than this module
if (not CATEGORY_NAMESPACES[article_title.namespace] and not allow_this_test_page)
or (is_test_page and not allow_this_test_page) then
category = ""
end
return '<strong class="error">Error: ' .. message .. '</strong> ' .. help_link .. category
end
--------------------------
-- Formatting Functions --
--------------------------
--- Formats the time portion of a datetime string.
-- @param hour (string) The hour component
-- @param minute (string) The minute component
-- @param second (string) The second component
-- @return string The formatted time string, or empty string if hour is nil
local function format_time_string(hour, minute, second)
if not hour then
return ""
end
local time_string = string.format("%s:%s", hour, minute)
if second and second ~= "00" and minute ~= "00" then
time_string = string.format("%s:%s", time_string, second)
end
return time_string .. "," .. HTML_SPACE
end
--- Formats the date portion of a datetime string based on the specified format.
-- @param year (string) The year component
-- @param month (string) The month component
-- @param day (string) The day component
-- @param date_format_dmy (string) The date format ("yes" or "y" for day-month-year, otherwise month-day-year)
-- @return string The formatted date string, or empty string if year is nil
local function format_date_string(year, month, day, date_format_dmy)
if not year then
return ""
end
local date_string
if month then
local month_name = get_month_name(month)
if day then
day = tonumber(day)
if date_format_dmy then
date_string = day .. HTML_NBSP .. month_name
else
date_string = month_name .. HTML_NBSP .. day .. ","
end
date_string = date_string .. HTML_NBSP .. year
else
date_string = month_name .. HTML_NBSP .. year
end
else
date_string = year
end
return date_string
end
--- Formats the timezone portion of a datetime string.
-- @param timezone (string) The timezone component
-- @return string The formatted timezone string, or empty string if timezone is nil
local function format_timezone(timezone)
if not timezone then
return ""
end
return HTML_SPACE .. (timezone == "Z" and "(UTC)" or "(" .. timezone .. ")")
end
--- Generates an hCalendar microformat string for the given date-time values.
-- @param date_time_values (table) A table containing date and time components
-- @param classes (string) The CSS classes to apply to the microformat span
-- @return string The HTML for the hCalendar microformat
local function generate_h_calendar(date_time_values, classes)
local parts = {}
if date_time_values.year then
table.insert(parts, date_time_values.year)
if date_time_values.month then
table.insert(parts, "-" .. date_time_values.month)
if date_time_values.day then
table.insert(parts, "-" .. date_time_values.day)
end
end
if date_time_values.hour then
table.insert(parts, "T" .. date_time_values.hour)
if date_time_values.minute then
table.insert(parts, ":" .. date_time_values.minute)
if date_time_values.second then
table.insert(parts, ":" .. date_time_values.second)
end
end
end
end
local h_calendar_content = table.concat(parts) .. (date_time_values.timezone or "")
local class_span = string.format('<span class="%s">', classes)
return string.format(
'<span style="display: none;">%s(%s)</span>',
HTML_NBSP,
class_span .. h_calendar_content .. '</span>'
)
end
--- Generates a "time ago" string for age calculation templates.
-- @param date_time_values (table) Table containing date components (year, month, day)
-- @param br (boolean) Whether to include a line break before the time ago text
-- @param p (boolean) Whether to format with parentheses around the time ago text
-- @return string Formatted "time ago" text wrapped in a noprint span
local function get_time_ago(date_time_values, br, p)
-- Build timestamp based on available date components
local timestamp
local min_magnitude
if date_time_values.day then
-- Format with padding for month and day if needed
timestamp = string.format("%d-%02d-%02d",
date_time_values.year,
date_time_values.month,
date_time_values.day)
min_magnitude = "days"
elseif date_time_values.month then
-- Format with padding for month if needed
timestamp = string.format("%d-%02d",
date_time_values.year,
date_time_values.month)
-- Get the current date
local current_date = os.date("*t")
-- Compute the difference in months
local year_diff = current_date.year - date_time_values.year
local month_diff = (year_diff * 12) + (current_date.month - date_time_values.month)
-- If the difference is less than 12 months, use "months", otherwise "years"
if month_diff < 12 then
min_magnitude = "months"
else
min_magnitude = "years"
end
else
timestamp = tostring(date_time_values.year)
min_magnitude = "years"
end
-- Calculate time ago using [[Module:Time]] ago
local m_time_ago = require("Module:Time ago")._main
local time_ago = m_time_ago({timestamp, ["min_magnitude"] = min_magnitude})
-- Format the result based on br and p parameters
if br then
time_ago = p and ("<br/>(" .. time_ago .. ")") or (";<br/>" .. time_ago)
else
time_ago = p and (HTML_SPACE .. "(" .. time_ago .. ")") or (";" .. HTML_SPACE .. time_ago)
end
-- Wrap in noprint span
return "<span class=\"noprint\">" .. time_ago .. "</span>"
end
--------------------------
-- Validation Functions --
--------------------------
--- Validates the date and time values provided.
-- @param args (table) Table containing date and time values and optional parameters
-- @return nil|string Nil if validation passes, or an error message if validation fails
local function _validate_date_time(args)
local template_name = args.template or "start date"
help_link = string.format("<small>[[:Template:%s|(help)]]</small>", template_name)
-- Store and validate date-time values
local date_time_values = {
year = args[1],
month = args[2],
day = args[3],
hour = args[4],
minute = args[5],
second = args[6]
}
-- Validate each value
for key, value in pairs(date_time_values) do
if value then
-- Check for integer and leading zeros
if not is_integer(value) then
return generate_error(ERROR_MESSAGES.integers)
end
if has_leading_zeros(tostring(value), key) then
return generate_error(ERROR_MESSAGES.has_leading_zeros)
end
-- Convert to number
date_time_values[key] = tonumber(value)
end
end
-- Validate date components
if not date_time_values.year then
return generate_error(ERROR_MESSAGES.missing_year)
end
if date_time_values.month and (date_time_values.month < 1 or date_time_values.month > 12) then
return generate_error(ERROR_MESSAGES.invalid_month)
end
if date_time_values.day then
if not date_time_values.month then
return generate_error(ERROR_MESSAGES.missing_month)
end
local max_day = get_days_in_month(date_time_values.year, date_time_values.month)
if date_time_values.day < 1 or date_time_values.day > max_day then
return generate_error(string.format(ERROR_MESSAGES.invalid_day, date_time_values.month, max_day))
end
end
-- Validate time components
if (date_time_values.minute or date_time_values.second) and not date_time_values.hour then
return generate_error(ERROR_MESSAGES.time_without_hour)
end
if date_time_values.hour and (date_time_values.hour < 0 or date_time_values.hour > 23) then
return generate_error(ERROR_MESSAGES.invalid_hour)
end
if date_time_values.minute and (date_time_values.minute < 0 or date_time_values.minute > 59) then
return generate_error(ERROR_MESSAGES.invalid_minute)
end
if date_time_values.second and (date_time_values.second < 0 or date_time_values.second > 59) then
return generate_error(ERROR_MESSAGES.invalid_second)
end
-- Timezone cannot be set without a specific date and hour
if args[7] and not (date_time_values.day and date_time_values.hour) then
return generate_error(ERROR_MESSAGES.timezone_incomplete_date)
elseif args[7] and not is_timezone_valid(args[7]) then
return generate_error(ERROR_MESSAGES.invalid_timezone)
end
-- Validate that there aren't any duplicate parameters
if args.p and args.paren then
return generate_error(string.format(ERROR_MESSAGES.duplicate_parameters, "p", "paren"))
end
-- Validate parameters that use "y" or "yes" for values
local boolean_params = {'df', 'p', 'paren', 'br'}
for _, param_name in ipairs(boolean_params) do
if args[param_name] and not (args[param_name] == "yes" or args[param_name] == "y") then
return generate_error(string.format(ERROR_MESSAGES.yes_value_parameter, param_name))
end
end
return nil
end
----------------------
-- Public Functions --
----------------------
--- Validates date-time values from template arguments.
-- @param frame (table) The MediaWiki frame containing template arguments
-- @return nil|string Result of date-time validation
function p.validate_date_time(frame)
local get_args = require("Module:Arguments").getArgs
local args = get_args(frame)
-- Sanitize inputs
args[7] = fix_timezone(args[7])
return _validate_date_time(args)
end
--- Generates a formatted date string with microformat markup.
-- @param frame (table) The MediaWiki frame containing template arguments
-- @return string A formatted date string, or an error message if validation fails
function p.generate_date(frame)
local get_args = require("Module:Arguments").getArgs
local args = get_args(frame)
-- Sanitize inputs
args[7] = fix_timezone(args[7])
local validation_error = _validate_date_time(args)
if validation_error then
return validation_error
end
local classes = TEMPLATE_CLASSES[args.template or "start date"]
if not classes then
return generate_error(ERROR_MESSAGES.template, false)
end
-- Process date-time values
local date_time_values = {
year = args[1],
month = pad_left_zeros(args[2]),
day = pad_left_zeros(args[3]),
hour = pad_left_zeros(args[4]),
minute = args[5] and pad_left_zeros(args[5]) or "00",
second = args[6] and pad_left_zeros(args[6]) or "00",
timezone = replace_minus_character(args[7], true) -- Restore U+2212 (Unicode minus)
}
-- Generate individual components
local time_string = format_time_string(
date_time_values.hour,
date_time_values.minute,
date_time_values.second
)
local date_string = format_date_string(
date_time_values.year,
date_time_values.month,
date_time_values.day,
args.df
)
local timezone_string = format_timezone(date_time_values.timezone)
local time_ago = ""
if TIME_AGO[args.template] then
time_ago = get_time_ago(
date_time_values,
args.br,
args.p or args.paren
)
end
local h_calendar = generate_h_calendar(date_time_values, classes)
-- Combine components
return time_string .. date_string .. timezone_string .. time_ago .. h_calendar
end
return p
m1n2ubn29iw0dq7s8rz8ddwljxm563c
33580
33579
2026-11-11T22:44:25Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Date_time]]
33579
Scribunto
text/plain
--[[
Module:Date time – Date formatting and validation module.
This module provides functions for validating and formatting dates in templates such as
{{Start date}}, {{End date}}, {{Start date and age}}, and {{End date and age}}.
It handles:
- Validation of date components (year, month, day)
- Validation of time components (hour, minute, second)
- Timezone formatting and validation
- Generation of appropriate hCalendar microformat markup
- "time-ago" calculations
Design notes:
- Functions are organized into helper, validation, and formatting sections
- Error handling uses a consistent pattern with centralized error messages
- Timezone validation supports standard ISO 8601 formats
- Leap year calculation is cached for performance
]]
require("strict")
local p = {}
---------------
-- Constants --
---------------
local HTML_SPACE = " "
local HTML_NBSP = " "
-- Error message constants
local ERROR_MESSAGES = {
integers = "All values must be integers",
has_leading_zeros = "Values cannot have unnecessary leading zeros",
missing_year = "Year value is required",
invalid_month = "Value is not a valid month",
missing_month = "Month value is required when a day is provided",
invalid_day = "Value is not a valid day (Month %d has %d days)",
invalid_hour = "Value is not a valid hour",
invalid_minute = "Value is not a valid minute",
invalid_second = "Value is not a valid second",
timezone_incomplete_date = "A timezone cannot be set without a day and hour",
invalid_timezone = "Value is not a valid timezone",
yes_value_parameter = '%s must be either "yes" or "y"',
duplicate_parameters = 'Duplicate parameters used: %s and %s',
template = "Template not supported",
time_without_hour = "Minutes and seconds require an hour value"
}
-- Template class mapping
-- "itvstart" and "itvend" are unique classes used by the TV infoboxes,
-- which only allow the usage of {{Start date}} and {{End date}}.
local TEMPLATE_CLASSES = {
["start date"] = "bday dtstart published updated itvstart",
["start date and age"] = "bday dtstart published updated",
["end date"] = "dtend itvend",
["end date and age"] = "dtend"
}
-- Templates that require "time ago" calculations
local TIME_AGO = {
["start date and age"] = true,
["end date and age"] = true
}
-- English month names
local MONTHS = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
}
-- Error category
local ERROR_CATEGORY = "[[Category:Pages using Module:Date time with invalid values]]"
-- Namespaces where error categories should be applied
local CATEGORY_NAMESPACES = {
[0] = true, -- Article
[1] = true, -- Article talk
[4] = true, -- Wikipedia
[10] = true, -- Template
[100] = true, -- Portal
[118] = true -- Draft
}
-- Cached leap year calculations for performance
local leap_year_cache = {}
-- Local variables for error handling
local help_link
----------------------
-- Helper Functions --
----------------------
--- Pads a number with leading zeros to ensure a minimum of two digits.
-- @param value (number|string) The value to pad with leading zeros
-- @return string The value padded to at least two digits, or nil if input is nil
local function pad_left_zeros(value)
if value == nil then
return nil
end
local str = tostring(value)
return string.rep("0", math.max(0, 2 - #str)) .. str
end
--- Replaces [[U+2212]] (Unicode minus) with [[U+002D]] (ASCII hyphen) or vice versa.
-- @param value (string) The string value to process
-- @param to_unicode (boolean) If true, converts ASCII hyphen to Unicode minus;
-- If false, converts Unicode minus to ASCII hyphen
-- @return string The processed string with appropriate minus characters, or nil if input is nil
local function replace_minus_character(value, to_unicode)
if not value then
return nil
end
if to_unicode then
return value:gsub("-", "−")
end
return value:gsub("−", "-")
end
--- Normalizes timezone format by ensuring proper padding of hours.
-- @param timezone (string) The timezone string to normalize
-- @return string The normalized timezone string with properly padded hours, or nil if input is nil
local function fix_timezone(timezone)
if not timezone then
return nil
end
-- Replace U+2212 (Unicode minus) with U+002D (ASCII hyphen)
timezone = replace_minus_character(timezone, false)
-- Match the timezone pattern for ±H:MM format
local sign, hour, minutes = timezone:match("^([+-])(%d+):(%d+)$")
if sign and hour and minutes then
-- Pad the hour with a leading zero if necessary
hour = pad_left_zeros(hour)
return sign .. hour .. ":" .. minutes
end
-- If no match, return the original timezone (this handles invalid or already padded timezones)
return timezone
end
--- Checks if a timezone string is valid according to standard timezone formats.
-- Valid timezones range from UTC-12:00 to UTC+14:00.
-- @param timezone (string) The timezone string to validate
-- @return boolean true if the timezone is valid, false otherwise
local function is_timezone_valid(timezone)
-- Consolidated timezone pattern for better performance
local valid_patterns = {
-- Z (UTC)
"^Z$",
-- Full timezone with minutes ±HH:MM
"^[+]0[1-9]:[0-5][0-9]$",
"^[+-]0[1-9]:[0-5][0-9]$",
"^[+-]1[0-2]:[0-5][0-9]$",
"^[+]1[34]:[0-5][0-9]$",
-- Whole hour timezones ±HH
"^[+-]0[1-9]$",
"^[+-]1[0-2]$",
"^[+]1[34]$",
-- Special cases
"^[+]00:00$",
"^[+]00$"
}
-- Additional checks for invalid -00 and -00:00 cases
if timezone == "-00" or timezone == "-00:00" then
return false
end
for _, pattern in ipairs(valid_patterns) do
if string.match(timezone, pattern) then
return true
end
end
return false
end
--- Checks if a given year is a leap year.
-- Uses a cache for better performance.
-- @param year (number) The year to check for leap year status
-- @return boolean true if the year is a leap year, false otherwise
local function is_leap_year(year)
if leap_year_cache[year] == nil then
leap_year_cache[year] = (year % 4 == 0 and year % 100 ~= 0) or (year % 400 == 0)
end
return leap_year_cache[year]
end
--- Returns the number of days in a given month of a specified year.
-- Handles leap years for February.
-- @param year (number) The year to check for leap year conditions
-- @param month (number) The month (1-12) for which to return the number of days
-- @return number The number of days in the specified month, accounting for leap years
local function get_days_in_month(year, month)
local days_in_month = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
if month == 2 and is_leap_year(year) then
return 29
end
return days_in_month[month] or 0
end
--- Checks if a given value has invalid leading zeros.
-- @param value (string) The value to check for leading zeros
-- @param field_type (string) Field type ("day", "month", "hour", "minute", "second")
-- @return boolean true if the value has invalid leading zeros, false otherwise
local function has_leading_zeros(value, field_type)
value = tostring(value)
-- Common checks for day and month
if field_type == "day" or field_type == "month" then
-- Reject "00" and values with leading zero followed by more than one digit
return value == "00" or
string.match(value, "^0[0-9][0-9]$") ~= nil or
string.match(value, "^0[1-9][0-9]") ~= nil
end
-- Checks for hour, minute, second
if field_type == "hour" or field_type == "minute" or field_type == "second" then
-- Allow "00" and "01" to "09"
if value == "00" or string.match(value, "^0[1-9]$") then
return false
end
-- Reject values starting with "0" followed by more than one digit
return string.match(value, "^0[0-9][0-9]+$") ~= nil
end
return false
end
--- Checks if a given value is an integer.
-- @param value (string|number) The value to check
-- @return boolean true if the value is a valid integer, false otherwise
local function is_integer(value)
if not value then
return false
end
-- Check if the value is a number first
local num_value = tonumber(value)
if not num_value then
return false
end
-- Check if it's an integer by comparing floor with the original
if math.floor(num_value) ~= num_value then
return false
end
-- For string inputs, check for decimal point to reject values like "7."
if type(value) == "string" then
-- If the string contains a decimal point, it's not an integer
if string.find(value, "%.") then
return false
end
end
return true
end
--- Returns the name of a month based on its numerical representation.
-- @param month_number (number) The month number (1-12)
-- @return string|nil The name of the month, or nil if invalid
local function get_month_name(month_number)
month_number = tonumber(month_number)
return MONTHS[month_number]
end
--- Generates an error message wrapped in HTML.
-- @param message (string) The error message to format
-- @param add_tracking_category (boolean, optional) If false, omits the tracking category
-- @return string An HTML-formatted error message with help link and error category
local function generate_error(message, add_tracking_category)
local category = ERROR_CATEGORY
if add_tracking_category == false then
category = ""
end
-- Get current page title object
local article_title = mw.title.getCurrentTitle()
-- Special case for testcases pages
local is_test_page = article_title.subpageText == "testcases"
local allow_this_test_page = article_title.fullText == "Module talk:Date time/testcases"
-- Remove category if the page is not in a tracked namespace or is any other testcases other than this module
if (not CATEGORY_NAMESPACES[article_title.namespace] and not allow_this_test_page)
or (is_test_page and not allow_this_test_page) then
category = ""
end
return '<strong class="error">Error: ' .. message .. '</strong> ' .. help_link .. category
end
--------------------------
-- Formatting Functions --
--------------------------
--- Formats the time portion of a datetime string.
-- @param hour (string) The hour component
-- @param minute (string) The minute component
-- @param second (string) The second component
-- @return string The formatted time string, or empty string if hour is nil
local function format_time_string(hour, minute, second)
if not hour then
return ""
end
local time_string = string.format("%s:%s", hour, minute)
if second and second ~= "00" and minute ~= "00" then
time_string = string.format("%s:%s", time_string, second)
end
return time_string .. "," .. HTML_SPACE
end
--- Formats the date portion of a datetime string based on the specified format.
-- @param year (string) The year component
-- @param month (string) The month component
-- @param day (string) The day component
-- @param date_format_dmy (string) The date format ("yes" or "y" for day-month-year, otherwise month-day-year)
-- @return string The formatted date string, or empty string if year is nil
local function format_date_string(year, month, day, date_format_dmy)
if not year then
return ""
end
local date_string
if month then
local month_name = get_month_name(month)
if day then
day = tonumber(day)
if date_format_dmy then
date_string = day .. HTML_NBSP .. month_name
else
date_string = month_name .. HTML_NBSP .. day .. ","
end
date_string = date_string .. HTML_NBSP .. year
else
date_string = month_name .. HTML_NBSP .. year
end
else
date_string = year
end
return date_string
end
--- Formats the timezone portion of a datetime string.
-- @param timezone (string) The timezone component
-- @return string The formatted timezone string, or empty string if timezone is nil
local function format_timezone(timezone)
if not timezone then
return ""
end
return HTML_SPACE .. (timezone == "Z" and "(UTC)" or "(" .. timezone .. ")")
end
--- Generates an hCalendar microformat string for the given date-time values.
-- @param date_time_values (table) A table containing date and time components
-- @param classes (string) The CSS classes to apply to the microformat span
-- @return string The HTML for the hCalendar microformat
local function generate_h_calendar(date_time_values, classes)
local parts = {}
if date_time_values.year then
table.insert(parts, date_time_values.year)
if date_time_values.month then
table.insert(parts, "-" .. date_time_values.month)
if date_time_values.day then
table.insert(parts, "-" .. date_time_values.day)
end
end
if date_time_values.hour then
table.insert(parts, "T" .. date_time_values.hour)
if date_time_values.minute then
table.insert(parts, ":" .. date_time_values.minute)
if date_time_values.second then
table.insert(parts, ":" .. date_time_values.second)
end
end
end
end
local h_calendar_content = table.concat(parts) .. (date_time_values.timezone or "")
local class_span = string.format('<span class="%s">', classes)
return string.format(
'<span style="display: none;">%s(%s)</span>',
HTML_NBSP,
class_span .. h_calendar_content .. '</span>'
)
end
--- Generates a "time ago" string for age calculation templates.
-- @param date_time_values (table) Table containing date components (year, month, day)
-- @param br (boolean) Whether to include a line break before the time ago text
-- @param p (boolean) Whether to format with parentheses around the time ago text
-- @return string Formatted "time ago" text wrapped in a noprint span
local function get_time_ago(date_time_values, br, p)
-- Build timestamp based on available date components
local timestamp
local min_magnitude
if date_time_values.day then
-- Format with padding for month and day if needed
timestamp = string.format("%d-%02d-%02d",
date_time_values.year,
date_time_values.month,
date_time_values.day)
min_magnitude = "days"
elseif date_time_values.month then
-- Format with padding for month if needed
timestamp = string.format("%d-%02d",
date_time_values.year,
date_time_values.month)
-- Get the current date
local current_date = os.date("*t")
-- Compute the difference in months
local year_diff = current_date.year - date_time_values.year
local month_diff = (year_diff * 12) + (current_date.month - date_time_values.month)
-- If the difference is less than 12 months, use "months", otherwise "years"
if month_diff < 12 then
min_magnitude = "months"
else
min_magnitude = "years"
end
else
timestamp = tostring(date_time_values.year)
min_magnitude = "years"
end
-- Calculate time ago using [[Module:Time]] ago
local m_time_ago = require("Module:Time ago")._main
local time_ago = m_time_ago({timestamp, ["min_magnitude"] = min_magnitude})
-- Format the result based on br and p parameters
if br then
time_ago = p and ("<br/>(" .. time_ago .. ")") or (";<br/>" .. time_ago)
else
time_ago = p and (HTML_SPACE .. "(" .. time_ago .. ")") or (";" .. HTML_SPACE .. time_ago)
end
-- Wrap in noprint span
return "<span class=\"noprint\">" .. time_ago .. "</span>"
end
--------------------------
-- Validation Functions --
--------------------------
--- Validates the date and time values provided.
-- @param args (table) Table containing date and time values and optional parameters
-- @return nil|string Nil if validation passes, or an error message if validation fails
local function _validate_date_time(args)
local template_name = args.template or "start date"
help_link = string.format("<small>[[:Template:%s|(help)]]</small>", template_name)
-- Store and validate date-time values
local date_time_values = {
year = args[1],
month = args[2],
day = args[3],
hour = args[4],
minute = args[5],
second = args[6]
}
-- Validate each value
for key, value in pairs(date_time_values) do
if value then
-- Check for integer and leading zeros
if not is_integer(value) then
return generate_error(ERROR_MESSAGES.integers)
end
if has_leading_zeros(tostring(value), key) then
return generate_error(ERROR_MESSAGES.has_leading_zeros)
end
-- Convert to number
date_time_values[key] = tonumber(value)
end
end
-- Validate date components
if not date_time_values.year then
return generate_error(ERROR_MESSAGES.missing_year)
end
if date_time_values.month and (date_time_values.month < 1 or date_time_values.month > 12) then
return generate_error(ERROR_MESSAGES.invalid_month)
end
if date_time_values.day then
if not date_time_values.month then
return generate_error(ERROR_MESSAGES.missing_month)
end
local max_day = get_days_in_month(date_time_values.year, date_time_values.month)
if date_time_values.day < 1 or date_time_values.day > max_day then
return generate_error(string.format(ERROR_MESSAGES.invalid_day, date_time_values.month, max_day))
end
end
-- Validate time components
if (date_time_values.minute or date_time_values.second) and not date_time_values.hour then
return generate_error(ERROR_MESSAGES.time_without_hour)
end
if date_time_values.hour and (date_time_values.hour < 0 or date_time_values.hour > 23) then
return generate_error(ERROR_MESSAGES.invalid_hour)
end
if date_time_values.minute and (date_time_values.minute < 0 or date_time_values.minute > 59) then
return generate_error(ERROR_MESSAGES.invalid_minute)
end
if date_time_values.second and (date_time_values.second < 0 or date_time_values.second > 59) then
return generate_error(ERROR_MESSAGES.invalid_second)
end
-- Timezone cannot be set without a specific date and hour
if args[7] and not (date_time_values.day and date_time_values.hour) then
return generate_error(ERROR_MESSAGES.timezone_incomplete_date)
elseif args[7] and not is_timezone_valid(args[7]) then
return generate_error(ERROR_MESSAGES.invalid_timezone)
end
-- Validate that there aren't any duplicate parameters
if args.p and args.paren then
return generate_error(string.format(ERROR_MESSAGES.duplicate_parameters, "p", "paren"))
end
-- Validate parameters that use "y" or "yes" for values
local boolean_params = {'df', 'p', 'paren', 'br'}
for _, param_name in ipairs(boolean_params) do
if args[param_name] and not (args[param_name] == "yes" or args[param_name] == "y") then
return generate_error(string.format(ERROR_MESSAGES.yes_value_parameter, param_name))
end
end
return nil
end
----------------------
-- Public Functions --
----------------------
--- Validates date-time values from template arguments.
-- @param frame (table) The MediaWiki frame containing template arguments
-- @return nil|string Result of date-time validation
function p.validate_date_time(frame)
local get_args = require("Module:Arguments").getArgs
local args = get_args(frame)
-- Sanitize inputs
args[7] = fix_timezone(args[7])
return _validate_date_time(args)
end
--- Generates a formatted date string with microformat markup.
-- @param frame (table) The MediaWiki frame containing template arguments
-- @return string A formatted date string, or an error message if validation fails
function p.generate_date(frame)
local get_args = require("Module:Arguments").getArgs
local args = get_args(frame)
-- Sanitize inputs
args[7] = fix_timezone(args[7])
local validation_error = _validate_date_time(args)
if validation_error then
return validation_error
end
local classes = TEMPLATE_CLASSES[args.template or "start date"]
if not classes then
return generate_error(ERROR_MESSAGES.template, false)
end
-- Process date-time values
local date_time_values = {
year = args[1],
month = pad_left_zeros(args[2]),
day = pad_left_zeros(args[3]),
hour = pad_left_zeros(args[4]),
minute = args[5] and pad_left_zeros(args[5]) or "00",
second = args[6] and pad_left_zeros(args[6]) or "00",
timezone = replace_minus_character(args[7], true) -- Restore U+2212 (Unicode minus)
}
-- Generate individual components
local time_string = format_time_string(
date_time_values.hour,
date_time_values.minute,
date_time_values.second
)
local date_string = format_date_string(
date_time_values.year,
date_time_values.month,
date_time_values.day,
args.df
)
local timezone_string = format_timezone(date_time_values.timezone)
local time_ago = ""
if TIME_AGO[args.template] then
time_ago = get_time_ago(
date_time_values,
args.br,
args.p or args.paren
)
end
local h_calendar = generate_h_calendar(date_time_values, classes)
-- Combine components
return time_string .. date_string .. timezone_string .. time_ago .. h_calendar
end
return p
m1n2ubn29iw0dq7s8rz8ddwljxm563c
Tempilet:Campaignbox 2018–2024 Arab protests
10
2744
33581
2025-06-05T11:15:38Z
en>AimanAbir18plus
0
AimanAbir18plus moved page [[Template:Campaignbox Second Arab Spring]] to [[Template:Campaignbox 2018–2024 Arab protests]]: main article moved
33581
wikitext
text/x-wiki
{{civil conflict sidebar
| name = Campaignbox Second Arab Spring
| state = {{{state|{{{1|}}}}}}
| title = [[Second Arab Spring]]
| listclass = hlist
| border =
| bodyclass =
| belowclass = hlist
| notes = '''See also'''
* {{Icon|Category}} '''[[:Category:Second Arab Spring|Category]]'''
| events =
* [[2018 Iraqi protests]]
* [[2018 Tunisian protests]]
* [[2018 Jordanian protests]]
* Sudan
** [[Sudanese Revolution]]
** [[2019–2022 Sudanese protests]]
* [[2019–2021 Algerian protests]]
* [[2019 Gaza economic protests]]
* [[2019 Egyptian protests|2019]]–[[2020 Egyptian protests]]
* [[2019–2021 Lebanese protests]]
* [[2019–2021 Iraqi protests]]
* [[2021 Tunisian protests]]
}}<noinclude>
[[Category:Arab world templates]]
[[Category:Middle East campaignbox templates]]
</noinclude>
tqs982eljfrdd03gga0e3tv1daguut2
33582
33581
2026-11-11T22:44:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Campaignbox_2018–2024_Arab_protests]]
33581
wikitext
text/x-wiki
{{civil conflict sidebar
| name = Campaignbox Second Arab Spring
| state = {{{state|{{{1|}}}}}}
| title = [[Second Arab Spring]]
| listclass = hlist
| border =
| bodyclass =
| belowclass = hlist
| notes = '''See also'''
* {{Icon|Category}} '''[[:Category:Second Arab Spring|Category]]'''
| events =
* [[2018 Iraqi protests]]
* [[2018 Tunisian protests]]
* [[2018 Jordanian protests]]
* Sudan
** [[Sudanese Revolution]]
** [[2019–2022 Sudanese protests]]
* [[2019–2021 Algerian protests]]
* [[2019 Gaza economic protests]]
* [[2019 Egyptian protests|2019]]–[[2020 Egyptian protests]]
* [[2019–2021 Lebanese protests]]
* [[2019–2021 Iraqi protests]]
* [[2021 Tunisian protests]]
}}<noinclude>
[[Category:Arab world templates]]
[[Category:Middle East campaignbox templates]]
</noinclude>
tqs982eljfrdd03gga0e3tv1daguut2
Tempilet:Location map/doc/infobox parameters
10
2745
33583
2026-09-05T03:14:14Z
en>Helpful Cat
0
ce
33583
wikitext
text/x-wiki
{{navbar|Template:Location map/doc/infobox parameters|plain=y|style=float: right;}}
Below are the parameters used by [[Module:Location map]] to produce the pushpin map in this Infobox. These parameters are available for editors to set in articles that use this infobox. For the maps available, please consult [[Template:Location map#Available maps|available maps]].
{| class="wikitable"
! Parameter
! Description
! Default
|-
|{{para|pushpin_map}}
| The map(s) to display. For example, specifying England will use the values for England in Module:Location map/data/England.Multiple maps can be shown by providing a list of map names separated by {{code|#}}. For multiple maps, the first is shown by default. A reader can select the others with radio buttons.
| ''{{if empty|{{{pushpin_map|}}}|N/A}}''
|-
|{{para|pushpin_caption}}
| The text of a caption to be displayed below the map. If not provided a default caption will be generated. Multiple captions can be shown when separated by {{code|##}} (that's two).
| ''{{if empty|{{{pushpin_caption|}}}|Location within MAPNAME}}''
|-
|{{para|pushpin_relief}}
| 0/false/off will cause the template to display the map defined as {{code|image}} (generally not a [[Cartographic relief depiction|relief map]]). 1/true/on will cause the template to display the map defined as {{code|image1}} (generally a relief map). Any non-zero numeric value such as {{code|2}} or {{code|3}} will display {{code|image2}} or {{code|image3}}, if those images are defined. Any other non-empty value will cause display of {{code|image1}}. See the example at [[Template:Location map+/relief|Location map+/relief]].
| ''{{if empty|{{{pushpin_relief|}}}|0}}''
|-
|{{para|pushpin_label}}
| The text of the label to display next to the identifying mark; a [[H:WIKILINK|wikilink]] can be used. You can enclose the label inside of {{tl|nowrap}} if you want to make sure that it stays on a single line.
| ''{{if empty|{{{pushpin_label|}}}|N/A}}''
|-
|{{para|pushpin_label_size}}
| The font size to use for the label, given as a percentage of the normal font size (<100=smaller, >100=larger); the default size is 90. Do not include {{kbd|%}}. For example, use {{para|pushpin_label_size|80}}, not {{para|pushpin_label_size|80%}}. If set to {{code|0}}, the label is only displayed when the user hovers over the mark.
| ''{{if empty|{{{pushpin_label_size|}}}|90}}''
|-
|style="white-space:nowrap;"<!--Only need to nowrap the longest one-->|{{para|pushpin_label_position}}
| The position of the label relative to the identifying mark; valid values are {{code|left}}, {{code|right}}, {{code|top}}, {{code|bottom}} and {{code|none}}. This defaults to either {{code|left}} or {{code|right}}, depending on the coordinates of the marker and its position relative to the right border of the map image. When {{para|pushpin_label_position|none}}, any defined label will not be displayed with the mark, but it will be used to create the default caption.
| ''{{if empty|{{{pushpin_label_position|}}}|N/A}}''
|-
|{{para|pushpin_mark}}
| The name of an image file to display as the identifying mark; the default is {{#if:{{{pushpin_mark|}}}|[[:File:{{{pushpin_mark|}}}]] [[File:{{{pushpin_mark|}}}|{{if empty|{{{pushpin_mark_size|}}}|8}}px]]|[[:File:Red pog.svg|Red pog.svg]] [[File:Red pog.svg|8px]]}}. See examples at [[Commons:Location markers]] and [[Commons:Category:Map icons]].
| ''{{#if:{{{pushpin_mark|}}}|[[:File:{{{pushpin_mark|}}}]] [[File:{{{pushpin_mark|}}}|{{if empty|{{{pushpin_mark_size|}}}|8}}px]]|[[:File:Red pog.svg|Red pog.svg]] [[File:Red pog.svg|8px]]}}''
|-
|{{para|pushpin_mark_size}}
| The size of the identifying mark in pixels. Do not include {{kbd|px}}
| ''{{if empty|{{{pushpin_mark_size|}}}|8}}''
|-
|{{para|pushpin_alt}}
| Alt text for map; used by [[screen reader]]s. See [[WP:ALT]].
| ''{{if empty|{{{pushpin_alt|}}}|N/A}}''
|-
|{{para|pushpin_background}}
| The background color to use for the label; see [[Web colors]]. The default is no background color, which shows the map image behind the label.
| ''{{if empty|{{{pushpin_background|}}}|N/A}}''
|-
|{{para|pushpin_map_size}}
| Determines the width of the map in [[pixel]]s, overriding any default values; do not include {{kbd|px}}.
| ''{{if empty|{{{pushpin_map_size|}}}|N/A}}''
|}
6b1yr7qzrw168dd8s3klnlgu2wy21gi
33584
33583
2026-11-11T22:44:26Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Location_map/doc/infobox_parameters]]
33583
wikitext
text/x-wiki
{{navbar|Template:Location map/doc/infobox parameters|plain=y|style=float: right;}}
Below are the parameters used by [[Module:Location map]] to produce the pushpin map in this Infobox. These parameters are available for editors to set in articles that use this infobox. For the maps available, please consult [[Template:Location map#Available maps|available maps]].
{| class="wikitable"
! Parameter
! Description
! Default
|-
|{{para|pushpin_map}}
| The map(s) to display. For example, specifying England will use the values for England in Module:Location map/data/England.Multiple maps can be shown by providing a list of map names separated by {{code|#}}. For multiple maps, the first is shown by default. A reader can select the others with radio buttons.
| ''{{if empty|{{{pushpin_map|}}}|N/A}}''
|-
|{{para|pushpin_caption}}
| The text of a caption to be displayed below the map. If not provided a default caption will be generated. Multiple captions can be shown when separated by {{code|##}} (that's two).
| ''{{if empty|{{{pushpin_caption|}}}|Location within MAPNAME}}''
|-
|{{para|pushpin_relief}}
| 0/false/off will cause the template to display the map defined as {{code|image}} (generally not a [[Cartographic relief depiction|relief map]]). 1/true/on will cause the template to display the map defined as {{code|image1}} (generally a relief map). Any non-zero numeric value such as {{code|2}} or {{code|3}} will display {{code|image2}} or {{code|image3}}, if those images are defined. Any other non-empty value will cause display of {{code|image1}}. See the example at [[Template:Location map+/relief|Location map+/relief]].
| ''{{if empty|{{{pushpin_relief|}}}|0}}''
|-
|{{para|pushpin_label}}
| The text of the label to display next to the identifying mark; a [[H:WIKILINK|wikilink]] can be used. You can enclose the label inside of {{tl|nowrap}} if you want to make sure that it stays on a single line.
| ''{{if empty|{{{pushpin_label|}}}|N/A}}''
|-
|{{para|pushpin_label_size}}
| The font size to use for the label, given as a percentage of the normal font size (<100=smaller, >100=larger); the default size is 90. Do not include {{kbd|%}}. For example, use {{para|pushpin_label_size|80}}, not {{para|pushpin_label_size|80%}}. If set to {{code|0}}, the label is only displayed when the user hovers over the mark.
| ''{{if empty|{{{pushpin_label_size|}}}|90}}''
|-
|style="white-space:nowrap;"<!--Only need to nowrap the longest one-->|{{para|pushpin_label_position}}
| The position of the label relative to the identifying mark; valid values are {{code|left}}, {{code|right}}, {{code|top}}, {{code|bottom}} and {{code|none}}. This defaults to either {{code|left}} or {{code|right}}, depending on the coordinates of the marker and its position relative to the right border of the map image. When {{para|pushpin_label_position|none}}, any defined label will not be displayed with the mark, but it will be used to create the default caption.
| ''{{if empty|{{{pushpin_label_position|}}}|N/A}}''
|-
|{{para|pushpin_mark}}
| The name of an image file to display as the identifying mark; the default is {{#if:{{{pushpin_mark|}}}|[[:File:{{{pushpin_mark|}}}]] [[File:{{{pushpin_mark|}}}|{{if empty|{{{pushpin_mark_size|}}}|8}}px]]|[[:File:Red pog.svg|Red pog.svg]] [[File:Red pog.svg|8px]]}}. See examples at [[Commons:Location markers]] and [[Commons:Category:Map icons]].
| ''{{#if:{{{pushpin_mark|}}}|[[:File:{{{pushpin_mark|}}}]] [[File:{{{pushpin_mark|}}}|{{if empty|{{{pushpin_mark_size|}}}|8}}px]]|[[:File:Red pog.svg|Red pog.svg]] [[File:Red pog.svg|8px]]}}''
|-
|{{para|pushpin_mark_size}}
| The size of the identifying mark in pixels. Do not include {{kbd|px}}
| ''{{if empty|{{{pushpin_mark_size|}}}|8}}''
|-
|{{para|pushpin_alt}}
| Alt text for map; used by [[screen reader]]s. See [[WP:ALT]].
| ''{{if empty|{{{pushpin_alt|}}}|N/A}}''
|-
|{{para|pushpin_background}}
| The background color to use for the label; see [[Web colors]]. The default is no background color, which shows the map image behind the label.
| ''{{if empty|{{{pushpin_background|}}}|N/A}}''
|-
|{{para|pushpin_map_size}}
| Determines the width of the map in [[pixel]]s, overriding any default values; do not include {{kbd|px}}.
| ''{{if empty|{{{pushpin_map_size|}}}|N/A}}''
|}
6b1yr7qzrw168dd8s3klnlgu2wy21gi
Tempilet:Infobox broadcasting network
10
2746
33586
2026-03-02T16:45:46Z
en>Nintendofan885
0
allow giving class to logo
33586
wikitext
text/x-wiki
{{Infobox
| bodyclass = vcard
| titleclass = fn org
| title = {{{network_name|{{{name|}}}}}}
| imageclass = logo
| image = {{#invoke:InfoboxImage|InfoboxImage |image={{{network_logo|{{{logo|}}}}}} |size={{{network_logo_size|{{{logo_size|{{{logosize|}}}}}}}}} |sizedefault=frameless |alt={{{network_logo_alt|{{{logo_alt|}}}}}}|class={{{logo_class|}}} }}
| caption = {{{network_logo caption|{{{logo caption|{{{logo_caption|}}}}}}}}}
| image2 = {{#if:{{{collapsible|}}} |{{Hidden begin|title=Screenshot|titlestyle=text-align:center;}}}} {{#invoke:InfoboxImage|InfoboxImage |image={{{image|{{{screenshot|}}}}}} |size={{{image_size|{{{screenshot_size|}}}}}} |sizedefault=300px |alt={{{image_alt|{{{screenshot_alt|}}}}}} }}
| caption2 = {{{caption|}}} {{#if:{{{collapsible|}}} |{{Hidden end}}}}
| labelstyle = padding-right:1.0em<!--keeps labels and data separate-->;
| label1 = Type
| class1 = category
| data1 = {{{network_type|{{{type|}}}}}}
| label2 = Branding
| data2 = {{{branding|}}}
| label3 = Country
| class3 = adr
| data3 = {{#if:{{{country|}}} |<div style="display:inline;" class="country-name">{{{country}}}</div>}}
| label4 = {{longitem|First air date}}
| data4 = {{{airdate|}}}
| label5 = Availability
| data5 = {{{available|}}}
| label6 = Founded
| data6 = {{{founded|}}}{{{foundation|}}} {{#if:{{{founded|}}} |{{#if:{{{founder|}}}|<br/>by {{{founder}}} }} }}
| label7 = [[Motto]]
| data7 = {{{motto|}}}
| label8 = Members
| data8 = {{{members|}}}
| label9 = TV stations
| data9 = {{{tvstations|}}}
| label10 = TV transmitters
| data10 = {{{tvtransmitters|}}}
| label11 = Radio stations
| data11 = {{{radiostations|}}}
| label12 = Radio transmitters
| data12 = {{{radiotransmitters|}}}
| label13 = {{longitem|[[Market share]]}}
| data13 = {{{market_share|}}}
| label14 = [[Financial endowment|Endowment]]
| data14 = {{{endowment|}}}
| label15 = [[Revenue]]
| data15 = {{{revenue|}}}
| label16 = {{longitem|[[Net income]]}}
| data16 = {{{net_income|}}}
| label17 = {{longitem|Licence area}}
| data17 = {{{license_area|{{{licence_area|}}}}}}
| label18 = Headquarters
| data18 = {{{headquarters|{{{headquarters|}}}}}}
| label19 = {{longitem|Broadcast area}}
| data19 = {{{broadcast_area|}}}
| label20 = Area
| class20 = label
| data20 = {{{area|}}}
| label21 = Nation <!-- for BBC stations -->
| data21 = {{{nation|}}}
| label22 = Regions <!-- for BBC stations -->
| data22 = {{{regions|}}}
| label23 = [[Effective radiated power|ERP]]
| data23 = {{{erp|}}}
| label24 = Owner
| data24 = {{{owner|}}}
| label25 = Parent
| data25 = {{{parent|}}}
| label26 = {{longitem|Key people}}
| data26 = {{{key_people|{{{keypeople|}}}}}}
| label27 = Established
| data27 = {{{established|}}}
| label28 = {{longitem|[[Test card]]}}
| data28 = {{{test_card|{{{test card|}}}}}}
| label29 = {{longitem|Transmission test}}
| data29 = {{{test_of_transmission|{{{test of transmission|}}}}}}
| label30 = {{longitem|Launch date}}
| data30 = {{{launch_date|{{{launched|{{{launch date|}}}}}}}}}
| label31 = Dissolved
| data31 = {{{closure_date|{{{closed|{{{dissolved|}}}}}}}}}
| label32 = {{longitem|Former names}}
| data32 = {{{past_names|{{{former_names|}}}}}}
| label33 = {{longitem|[[Digital terrestrial television|Digital channel]]{{pluralize from text|{{{digital|}}}|plural=s}}}}
| data33 = {{{digital|}}}
| label34 = {{longitem|[[Virtual channel|Virtual channel]]{{pluralize from text|{{{virtual channel|}}}|plural=s}}}}
| data34 = {{{virtual channel|}}}
| label35 = {{longitem|[[Analog television|Analogue channel]]{{pluralize from text|{{{analog|}}}|plural=s}}}}
| data35 = {{{analog|}}}
| label36 = {{longitem|[[Analog television|Analog channel]]{{pluralize from text|{{{analog channgel|{{{Analog channel|}}}}}}|plural=s}}}}
| data36 = {{{Analog channel|{{{analog channel|}}}}}}
| label37 = {{longitem|Picture format}}
| data37 = {{{Picture format|{{{picture format|}}}}}}
| label38 = {{longitem|{{{servicename1|}}}}}
| data38 = {{{service1|}}}
| label39 = {{longitem|{{{servicename2|}}}}}
| data39 = {{{service2|}}}
| label40 = {{longitem|{{{servicename3|}}}}}
| data40 = {{{service3|}}}
| label41 = {{longitem|{{{servicename4|}}}}}
| data41 = {{{service4|}}}
| label42 = {{longitem|{{{servicename5|}}}}}
| data42 = {{{service5|}}}
| label43 = {{longitem|{{{servicename6|}}}}}
| data43 = {{{service6|}}}
| label44 = {{longitem|{{{servicename7|}}}}}
| data44 = {{{service7|}}}
| label45 = <span style="white-space:nowrap;">[[Call sign|Callsigns]]</span>
| data45 = {{{callsign|{{{callsigns|}}}}}}
| label46 = {{longitem|Callsign meaning}}
| data46 = {{{callsign_meaning|}}}
| label47 = {{longitem|Former callsigns}}
| data47 = {{{former_callsigns|}}}
| label48 = [[Network affiliate|Affiliation]]{{pluralize from text|{{{affiliations|{{{affiliation|}}}}}}|plural=s}}
| data48 = {{{affiliations|{{{affiliation|}}}}}}
| label49 = <span style="white-space:nowrap;">[[Network affiliate|Affiliates]]</span>
| data49 = {{{affiliates|}}}
| label50 = Group
| data50 = {{{groups|}}}
| label51 = {{longitem|Former [[Network affiliate|affiliations]]}}
| data51 = {{{former_affiliations|}}}
| label52 = [[Webcast]]
| data52 = {{{webcast|}}}
| label53 = {{longitem|Official website}}
| data53 = {{{website|}}}
| label54 = Language
| data54 = {{{language|}}}
| label55 = Replaced
| data55 = {{{replaced|}}}
| label56 = Replaced by
| data56 = {{{replaced_by|}}}
| label57 = Subsidiary
| data57 = {{{subsidiary|}}}
| data58 = {{{module|}}}
| data60 = {{#if:{{{footnotes|}}} |<div style="text-align:left;">'''Notes'''<br/>{{{footnotes}}}</div>}}
}}{{#invoke:Check for unknown parameters | check | ignoreblank = y
| unknown = {{Main other|[[Category:Pages using infobox broadcasting network with unknown parameters|_VALUE_{{PAGENAME}}]]}}
| preview = Page using [[Template:Infobox broadcasting network]] with unknown parameter "_VALUE_"
| network_name | name | network_logo | logo | network_logo_size | logo_size | logosize | network_logo_alt | logo_alt | network_logo caption | logo caption | logo_caption | logo_class | collapsible | image | screenshot | image_size | screenshot_size | image_alt | screenshot_alt | caption | network_type | type | branding | country | airdate | available | founded | foundation | founder | motto | tvstations | tvtransmitters | radiostations | radiotransmitters | market_share | endowment | revenue | net_income | license_area | licence_area | headquarters | broadcast_area | area | nation | regions | erp | owner | parent | key_people | keypeople | established | test_card | test card | test of transmission | test_of_transmission | launch_date | launched | launch date | closure_date | closed | dissolved | past_names | former_names | digital | virtual channel | analog | Analog channel | analog channel | Picture format | picture format | servicename1 | service1 | servicename2 | service2 | servicename3 | service3 | servicename4 | service4 | servicename5 | service5 | servicename6 | service6 | servicename7 | service7 | callsign | callsigns | callsign_meaning | former_callsigns | affiliations | affiliation | affiliates | groups | former_affiliations | webcast | website | language | replaced | replaced_by | subsidiary | module | footnotes
}}<noinclude>
{{Documentation}}
</noinclude>
jm2y084jl65gc2jjg1drytjw90ifhmm
33587
33586
2026-11-11T22:53:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_broadcasting_network]]
33586
wikitext
text/x-wiki
{{Infobox
| bodyclass = vcard
| titleclass = fn org
| title = {{{network_name|{{{name|}}}}}}
| imageclass = logo
| image = {{#invoke:InfoboxImage|InfoboxImage |image={{{network_logo|{{{logo|}}}}}} |size={{{network_logo_size|{{{logo_size|{{{logosize|}}}}}}}}} |sizedefault=frameless |alt={{{network_logo_alt|{{{logo_alt|}}}}}}|class={{{logo_class|}}} }}
| caption = {{{network_logo caption|{{{logo caption|{{{logo_caption|}}}}}}}}}
| image2 = {{#if:{{{collapsible|}}} |{{Hidden begin|title=Screenshot|titlestyle=text-align:center;}}}} {{#invoke:InfoboxImage|InfoboxImage |image={{{image|{{{screenshot|}}}}}} |size={{{image_size|{{{screenshot_size|}}}}}} |sizedefault=300px |alt={{{image_alt|{{{screenshot_alt|}}}}}} }}
| caption2 = {{{caption|}}} {{#if:{{{collapsible|}}} |{{Hidden end}}}}
| labelstyle = padding-right:1.0em<!--keeps labels and data separate-->;
| label1 = Type
| class1 = category
| data1 = {{{network_type|{{{type|}}}}}}
| label2 = Branding
| data2 = {{{branding|}}}
| label3 = Country
| class3 = adr
| data3 = {{#if:{{{country|}}} |<div style="display:inline;" class="country-name">{{{country}}}</div>}}
| label4 = {{longitem|First air date}}
| data4 = {{{airdate|}}}
| label5 = Availability
| data5 = {{{available|}}}
| label6 = Founded
| data6 = {{{founded|}}}{{{foundation|}}} {{#if:{{{founded|}}} |{{#if:{{{founder|}}}|<br/>by {{{founder}}} }} }}
| label7 = [[Motto]]
| data7 = {{{motto|}}}
| label8 = Members
| data8 = {{{members|}}}
| label9 = TV stations
| data9 = {{{tvstations|}}}
| label10 = TV transmitters
| data10 = {{{tvtransmitters|}}}
| label11 = Radio stations
| data11 = {{{radiostations|}}}
| label12 = Radio transmitters
| data12 = {{{radiotransmitters|}}}
| label13 = {{longitem|[[Market share]]}}
| data13 = {{{market_share|}}}
| label14 = [[Financial endowment|Endowment]]
| data14 = {{{endowment|}}}
| label15 = [[Revenue]]
| data15 = {{{revenue|}}}
| label16 = {{longitem|[[Net income]]}}
| data16 = {{{net_income|}}}
| label17 = {{longitem|Licence area}}
| data17 = {{{license_area|{{{licence_area|}}}}}}
| label18 = Headquarters
| data18 = {{{headquarters|{{{headquarters|}}}}}}
| label19 = {{longitem|Broadcast area}}
| data19 = {{{broadcast_area|}}}
| label20 = Area
| class20 = label
| data20 = {{{area|}}}
| label21 = Nation <!-- for BBC stations -->
| data21 = {{{nation|}}}
| label22 = Regions <!-- for BBC stations -->
| data22 = {{{regions|}}}
| label23 = [[Effective radiated power|ERP]]
| data23 = {{{erp|}}}
| label24 = Owner
| data24 = {{{owner|}}}
| label25 = Parent
| data25 = {{{parent|}}}
| label26 = {{longitem|Key people}}
| data26 = {{{key_people|{{{keypeople|}}}}}}
| label27 = Established
| data27 = {{{established|}}}
| label28 = {{longitem|[[Test card]]}}
| data28 = {{{test_card|{{{test card|}}}}}}
| label29 = {{longitem|Transmission test}}
| data29 = {{{test_of_transmission|{{{test of transmission|}}}}}}
| label30 = {{longitem|Launch date}}
| data30 = {{{launch_date|{{{launched|{{{launch date|}}}}}}}}}
| label31 = Dissolved
| data31 = {{{closure_date|{{{closed|{{{dissolved|}}}}}}}}}
| label32 = {{longitem|Former names}}
| data32 = {{{past_names|{{{former_names|}}}}}}
| label33 = {{longitem|[[Digital terrestrial television|Digital channel]]{{pluralize from text|{{{digital|}}}|plural=s}}}}
| data33 = {{{digital|}}}
| label34 = {{longitem|[[Virtual channel|Virtual channel]]{{pluralize from text|{{{virtual channel|}}}|plural=s}}}}
| data34 = {{{virtual channel|}}}
| label35 = {{longitem|[[Analog television|Analogue channel]]{{pluralize from text|{{{analog|}}}|plural=s}}}}
| data35 = {{{analog|}}}
| label36 = {{longitem|[[Analog television|Analog channel]]{{pluralize from text|{{{analog channgel|{{{Analog channel|}}}}}}|plural=s}}}}
| data36 = {{{Analog channel|{{{analog channel|}}}}}}
| label37 = {{longitem|Picture format}}
| data37 = {{{Picture format|{{{picture format|}}}}}}
| label38 = {{longitem|{{{servicename1|}}}}}
| data38 = {{{service1|}}}
| label39 = {{longitem|{{{servicename2|}}}}}
| data39 = {{{service2|}}}
| label40 = {{longitem|{{{servicename3|}}}}}
| data40 = {{{service3|}}}
| label41 = {{longitem|{{{servicename4|}}}}}
| data41 = {{{service4|}}}
| label42 = {{longitem|{{{servicename5|}}}}}
| data42 = {{{service5|}}}
| label43 = {{longitem|{{{servicename6|}}}}}
| data43 = {{{service6|}}}
| label44 = {{longitem|{{{servicename7|}}}}}
| data44 = {{{service7|}}}
| label45 = <span style="white-space:nowrap;">[[Call sign|Callsigns]]</span>
| data45 = {{{callsign|{{{callsigns|}}}}}}
| label46 = {{longitem|Callsign meaning}}
| data46 = {{{callsign_meaning|}}}
| label47 = {{longitem|Former callsigns}}
| data47 = {{{former_callsigns|}}}
| label48 = [[Network affiliate|Affiliation]]{{pluralize from text|{{{affiliations|{{{affiliation|}}}}}}|plural=s}}
| data48 = {{{affiliations|{{{affiliation|}}}}}}
| label49 = <span style="white-space:nowrap;">[[Network affiliate|Affiliates]]</span>
| data49 = {{{affiliates|}}}
| label50 = Group
| data50 = {{{groups|}}}
| label51 = {{longitem|Former [[Network affiliate|affiliations]]}}
| data51 = {{{former_affiliations|}}}
| label52 = [[Webcast]]
| data52 = {{{webcast|}}}
| label53 = {{longitem|Official website}}
| data53 = {{{website|}}}
| label54 = Language
| data54 = {{{language|}}}
| label55 = Replaced
| data55 = {{{replaced|}}}
| label56 = Replaced by
| data56 = {{{replaced_by|}}}
| label57 = Subsidiary
| data57 = {{{subsidiary|}}}
| data58 = {{{module|}}}
| data60 = {{#if:{{{footnotes|}}} |<div style="text-align:left;">'''Notes'''<br/>{{{footnotes}}}</div>}}
}}{{#invoke:Check for unknown parameters | check | ignoreblank = y
| unknown = {{Main other|[[Category:Pages using infobox broadcasting network with unknown parameters|_VALUE_{{PAGENAME}}]]}}
| preview = Page using [[Template:Infobox broadcasting network]] with unknown parameter "_VALUE_"
| network_name | name | network_logo | logo | network_logo_size | logo_size | logosize | network_logo_alt | logo_alt | network_logo caption | logo caption | logo_caption | logo_class | collapsible | image | screenshot | image_size | screenshot_size | image_alt | screenshot_alt | caption | network_type | type | branding | country | airdate | available | founded | foundation | founder | motto | tvstations | tvtransmitters | radiostations | radiotransmitters | market_share | endowment | revenue | net_income | license_area | licence_area | headquarters | broadcast_area | area | nation | regions | erp | owner | parent | key_people | keypeople | established | test_card | test card | test of transmission | test_of_transmission | launch_date | launched | launch date | closure_date | closed | dissolved | past_names | former_names | digital | virtual channel | analog | Analog channel | analog channel | Picture format | picture format | servicename1 | service1 | servicename2 | service2 | servicename3 | service3 | servicename4 | service4 | servicename5 | service5 | servicename6 | service6 | servicename7 | service7 | callsign | callsigns | callsign_meaning | former_callsigns | affiliations | affiliation | affiliates | groups | former_affiliations | webcast | website | language | replaced | replaced_by | subsidiary | module | footnotes
}}<noinclude>
{{Documentation}}
</noinclude>
jm2y084jl65gc2jjg1drytjw90ifhmm
33594
33587
2026-11-11T22:53:59Z
RAPTOR7762
18
/* */
33594
wikitext
text/x-wiki
{{Infobox/sandbox
| bodyclass = vcard
| titleclass = fn org
| title = {{{network_name|{{{name|}}}}}}
| imageclass = logo
| image = {{#invoke:InfoboxImage|InfoboxImage |image={{{network_logo|{{{logo|}}}}}} |size={{{network_logo_size|{{{logo_size|{{{logosize|}}}}}}}}} |sizedefault=frameless |alt={{{network_logo_alt|{{{logo_alt|}}}}}}|class={{{logo_class|}}} }}
| caption = {{{network_logo caption|{{{logo caption|{{{logo_caption|}}}}}}}}}
| image2 = {{#if:{{{collapsible|}}} |{{Hidden begin|title=Screenshot|titlestyle=text-align:center;}}}} {{#invoke:InfoboxImage|InfoboxImage |image={{{image|{{{screenshot|}}}}}} |size={{{image_size|{{{screenshot_size|}}}}}} |sizedefault=300px |alt={{{image_alt|{{{screenshot_alt|}}}}}} }}
| caption2 = {{{caption|}}} {{#if:{{{collapsible|}}} |{{Hidden end}}}}
| labelstyle = padding-right:1.0em<!--keeps labels and data separate-->;
| label1 = Type
| class1 = category
| data1 = {{{network_type|{{{type|}}}}}}
| label2 = Branding
| data2 = {{{branding|}}}
| label3 = Country
| class3 = adr
| data3 = {{#if:{{{country|}}} |<div style="display:inline;" class="country-name">{{{country}}}</div>}}
| label4 = {{longitem|First air date}}
| data4 = {{{airdate|}}}
| label5 = Availability
| data5 = {{{available|}}}
| label6 = Founded
| data6 = {{{founded|}}}{{{foundation|}}} {{#if:{{{founded|}}} |{{#if:{{{founder|}}}|<br/>by {{{founder}}} }} }}
| label7 = [[Motto]]
| data7 = {{{motto|}}}
| label8 = Members
| data8 = {{{members|}}}
| label9 = TV stations
| data9 = {{{tvstations|}}}
| label10 = TV transmitters
| data10 = {{{tvtransmitters|}}}
| label11 = Radio stations
| data11 = {{{radiostations|}}}
| label12 = Radio transmitters
| data12 = {{{radiotransmitters|}}}
| label13 = {{longitem|[[Market share]]}}
| data13 = {{{market_share|}}}
| label14 = [[Financial endowment|Endowment]]
| data14 = {{{endowment|}}}
| label15 = [[Revenue]]
| data15 = {{{revenue|}}}
| label16 = {{longitem|[[Net income]]}}
| data16 = {{{net_income|}}}
| label17 = {{longitem|Licence area}}
| data17 = {{{license_area|{{{licence_area|}}}}}}
| label18 = Headquarters
| data18 = {{{headquarters|{{{headquarters|}}}}}}
| label19 = {{longitem|Broadcast area}}
| data19 = {{{broadcast_area|}}}
| label20 = Area
| class20 = label
| data20 = {{{area|}}}
| label21 = Nation <!-- for BBC stations -->
| data21 = {{{nation|}}}
| label22 = Regions <!-- for BBC stations -->
| data22 = {{{regions|}}}
| label23 = [[Effective radiated power|ERP]]
| data23 = {{{erp|}}}
| label24 = Owner
| data24 = {{{owner|}}}
| label25 = Parent
| data25 = {{{parent|}}}
| label26 = {{longitem|Key people}}
| data26 = {{{key_people|{{{keypeople|}}}}}}
| label27 = Established
| data27 = {{{established|}}}
| label28 = {{longitem|[[Test card]]}}
| data28 = {{{test_card|{{{test card|}}}}}}
| label29 = {{longitem|Transmission test}}
| data29 = {{{test_of_transmission|{{{test of transmission|}}}}}}
| label30 = {{longitem|Launch date}}
| data30 = {{{launch_date|{{{launched|{{{launch date|}}}}}}}}}
| label31 = Dissolved
| data31 = {{{closure_date|{{{closed|{{{dissolved|}}}}}}}}}
| label32 = {{longitem|Former names}}
| data32 = {{{past_names|{{{former_names|}}}}}}
| label33 = {{longitem|[[Digital terrestrial television|Digital channel]]{{pluralize from text|{{{digital|}}}|plural=s}}}}
| data33 = {{{digital|}}}
| label34 = {{longitem|[[Virtual channel|Virtual channel]]{{pluralize from text|{{{virtual channel|}}}|plural=s}}}}
| data34 = {{{virtual channel|}}}
| label35 = {{longitem|[[Analog television|Analogue channel]]{{pluralize from text|{{{analog|}}}|plural=s}}}}
| data35 = {{{analog|}}}
| label36 = {{longitem|[[Analog television|Analog channel]]{{pluralize from text|{{{analog channgel|{{{Analog channel|}}}}}}|plural=s}}}}
| data36 = {{{Analog channel|{{{analog channel|}}}}}}
| label37 = {{longitem|Picture format}}
| data37 = {{{Picture format|{{{picture format|}}}}}}
| label38 = {{longitem|{{{servicename1|}}}}}
| data38 = {{{service1|}}}
| label39 = {{longitem|{{{servicename2|}}}}}
| data39 = {{{service2|}}}
| label40 = {{longitem|{{{servicename3|}}}}}
| data40 = {{{service3|}}}
| label41 = {{longitem|{{{servicename4|}}}}}
| data41 = {{{service4|}}}
| label42 = {{longitem|{{{servicename5|}}}}}
| data42 = {{{service5|}}}
| label43 = {{longitem|{{{servicename6|}}}}}
| data43 = {{{service6|}}}
| label44 = {{longitem|{{{servicename7|}}}}}
| data44 = {{{service7|}}}
| label45 = <span style="white-space:nowrap;">[[Call sign|Callsigns]]</span>
| data45 = {{{callsign|{{{callsigns|}}}}}}
| label46 = {{longitem|Callsign meaning}}
| data46 = {{{callsign_meaning|}}}
| label47 = {{longitem|Former callsigns}}
| data47 = {{{former_callsigns|}}}
| label48 = [[Network affiliate|Affiliation]]{{pluralize from text|{{{affiliations|{{{affiliation|}}}}}}|plural=s}}
| data48 = {{{affiliations|{{{affiliation|}}}}}}
| label49 = <span style="white-space:nowrap;">[[Network affiliate|Affiliates]]</span>
| data49 = {{{affiliates|}}}
| label50 = Group
| data50 = {{{groups|}}}
| label51 = {{longitem|Former [[Network affiliate|affiliations]]}}
| data51 = {{{former_affiliations|}}}
| label52 = [[Webcast]]
| data52 = {{{webcast|}}}
| label53 = {{longitem|Official website}}
| data53 = {{{website|}}}
| label54 = Language
| data54 = {{{language|}}}
| label55 = Replaced
| data55 = {{{replaced|}}}
| label56 = Replaced by
| data56 = {{{replaced_by|}}}
| label57 = Subsidiary
| data57 = {{{subsidiary|}}}
| data58 = {{{module|}}}
| data60 = {{#if:{{{footnotes|}}} |<div style="text-align:left;">'''Notes'''<br/>{{{footnotes}}}</div>}}
}}{{#invoke:Check for unknown parameters | check | ignoreblank = y
| unknown = {{Main other|[[Category:Pages using infobox broadcasting network with unknown parameters|_VALUE_{{PAGENAME}}]]}}
| preview = Page using [[Template:Infobox broadcasting network]] with unknown parameter "_VALUE_"
| network_name | name | network_logo | logo | network_logo_size | logo_size | logosize | network_logo_alt | logo_alt | network_logo caption | logo caption | logo_caption | logo_class | collapsible | image | screenshot | image_size | screenshot_size | image_alt | screenshot_alt | caption | network_type | type | branding | country | airdate | available | founded | foundation | founder | motto | tvstations | tvtransmitters | radiostations | radiotransmitters | market_share | endowment | revenue | net_income | license_area | licence_area | headquarters | broadcast_area | area | nation | regions | erp | owner | parent | key_people | keypeople | established | test_card | test card | test of transmission | test_of_transmission | launch_date | launched | launch date | closure_date | closed | dissolved | past_names | former_names | digital | virtual channel | analog | Analog channel | analog channel | Picture format | picture format | servicename1 | service1 | servicename2 | service2 | servicename3 | service3 | servicename4 | service4 | servicename5 | service5 | servicename6 | service6 | servicename7 | service7 | callsign | callsigns | callsign_meaning | former_callsigns | affiliations | affiliation | affiliates | groups | former_affiliations | webcast | website | language | replaced | replaced_by | subsidiary | module | footnotes
}}<noinclude>
{{Documentation}}
</noinclude>
hhh8c8g1yvmdeewhrinm4f04yzaty80
Tempilet:Remove first word
10
2747
33588
2018-02-13T20:10:27Z
en>WOSlinker
0
separate pp-template not needed
33588
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:String|replace|source={{{1}}}|pattern=^[^{{{sep|%s}}}]*{{{sep|%s}}}*|replace=|plain=false}}<noinclude>{{Documentation}}</noinclude>
q3rvb3vj9phd54s3yecz8846q90qfgo
33589
33588
2026-11-11T22:53:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Remove_first_word]]
33588
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:String|replace|source={{{1}}}|pattern=^[^{{{sep|%s}}}]*{{{sep|%s}}}*|replace=|plain=false}}<noinclude>{{Documentation}}</noinclude>
q3rvb3vj9phd54s3yecz8846q90qfgo
Tempilet:UF-hcard-org
10
2748
33590
2026-07-13T07:06:21Z
en>Jeeputer
0
close {{sandbox other}}
33590
wikitext
text/x-wiki
{{Microformat message
| format = hCard
| data = an organization's details
| subtemplates =
* Use {{#ifeq:{{yesno-yes|{{{age|}}}}}|yes|{{tl|Start date and age}}|{{tl|Start date}}}} for the date on which an organisation was "established", "founded", "opened" or otherwise started, [[Wikipedia:WikiProject Microformats/dates|unless that date is before 1583 CE]].
* Use {{tl|URL}} for an organisation's URL.
|adr |agent |category |country-name |extended-address |fn |geo |label |latitude |locality |longitude |nickname |note |org |region |street-address |url |vcard
| nocollapse = on
}}<includeonly>{{sandbox other||{{Category handler
|all=[[Category:Templates generating hCards]]
|nocat={{{nocat|}}}
}}}}</includeonly><noinclude>
{{Documentation |content={{Microformat message templates}}
==Tracking category==
* {{clc|Templates generating hCards}}
}}
[[Category:Microformat message templates]]
[[Category:Templates generating hCards| ]]
</noinclude>
fyxqv9jkntfi8s8a49e2q6pmc8oo7av
33591
33590
2026-11-11T22:53:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:UF-hcard-org]]
33590
wikitext
text/x-wiki
{{Microformat message
| format = hCard
| data = an organization's details
| subtemplates =
* Use {{#ifeq:{{yesno-yes|{{{age|}}}}}|yes|{{tl|Start date and age}}|{{tl|Start date}}}} for the date on which an organisation was "established", "founded", "opened" or otherwise started, [[Wikipedia:WikiProject Microformats/dates|unless that date is before 1583 CE]].
* Use {{tl|URL}} for an organisation's URL.
|adr |agent |category |country-name |extended-address |fn |geo |label |latitude |locality |longitude |nickname |note |org |region |street-address |url |vcard
| nocollapse = on
}}<includeonly>{{sandbox other||{{Category handler
|all=[[Category:Templates generating hCards]]
|nocat={{{nocat|}}}
}}}}</includeonly><noinclude>
{{Documentation |content={{Microformat message templates}}
==Tracking category==
* {{clc|Templates generating hCards}}
}}
[[Category:Microformat message templates]]
[[Category:Templates generating hCards| ]]
</noinclude>
fyxqv9jkntfi8s8a49e2q6pmc8oo7av
Tempilet:Infobox broadcasting network/doc
10
2749
33592
2026-09-11T13:10:57Z
en>John of Reading
0
/* TemplateData */ Typo fixing, replaced: headquarted → headquartered
33592
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[</nowiki>[[Wikipedia:Wikidata]]<nowiki>]]) -->
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
{{Parameter names example |name |logo |logo_size |logo_alt |logo_caption <!-- |collapsible --> |image |image_size |image_alt |caption |type |branding |country |airdate |available |founded |founder |motto |tvstations |tvtransmitters |radiostations |radiotransmitters |market_share |endowment |revenue |net_income |licence_area |headquarters |broadcast_area |area |nation |regions |erp |owner |parent |key_people |established |test_card |test_of_transmission |launch_date |dissolved |former_names |digital |virtual channel |analog |analog channel |picture format |servicename1 |service1 |servicename2=...... |service2=...... |servicename7 |service7 |callsigns |callsign_meaning |former_callsigns |affiliation |affiliates |groups |former_affiliations |webcast |website |language |replaced |replaced_by |subsidiary |module |footnotes}}
This infobox is for articles about [[broadcast network]]s. It should not be used for television stations or radio stations. Use [[:Template:Infobox television station]] or [[:Template:Infobox radio station]], instead.
== Usage ==
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Infobox broadcasting network
| name =
| logo =
| logo_size =
| logo_alt =
| logo_caption =
| collapsible =
| image =
| image_size =
| image_alt =
| caption =
| type =
| branding =
| country =
| airdate =
| available =
| founded =
| founder =
| motto =
| members =
| tvstations =
| tvtransmitters =
| radiostations =
| radiotransmitters =
| market_share =
| endowment =
| revenue =
| net_income =
| licence_area = <!-- or | license_area = -->
| headquarters =
| broadcast_area =
| area =
| nation =
| regions =
| erp =
| owner =
| parent =
| key_people =
| established =
| test_card =
| test_of_transmission =
| launch_date = <!-- {{Start date|YYYY|MM|DD|df=y}} -->
| dissolved = <!-- {{End date|YYYY|MM|DD|df=y}} -->
| former_names =
| digital =
| virtual channel =
| analog =
| analog channel =
| picture format =
| servicename1 =
| service1 =
| servicename2 =
| service2 =
| servicename3 =
| service3 =
| servicename4 =
| service4 =
| servicename5 =
| service5 =
| servicename6 =
| service6 =
| servicename7 =
| service7 =
| callsigns = <!-- or | callsign = -->
| callsign_meaning =
| former_callsigns =
| affiliation = <!-- or | affiliations = -->
| affiliates =
| groups =
| former_affiliations =
| webcast =
| website = <!-- {{URL|example.com}} -->
| language =
| replaced =
| replaced_by =
| subsidiary =
| module = <!-- Other templates can be embedded here -->
| footnotes =
}}
</syntaxhighlight>
Use <nowiki>{{Start date|YYYY|MM|DD}}</nowiki> (with {{Para|df|y}} if applicable) for one of {{para|airdate}}, {{para|founded}}, {{para|foundation}} or {{para|launch_date}}.
== Microformat ==
{{UF-hcard-org}}
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {
"name": {
"type": "string",
"suggested": true,
"aliases": [
"network_name"
],
"label": "Name",
"description": "Name of the broadcasting network.",
"example": "BBC"
},
"logo": {
"type": "wiki-file-name",
"suggested": true,
"aliases": [
"network_logo"
],
"label": "Logo",
"description": "The network's logo."
},
"logo_caption": {
"type": "content",
"aliases": [
"network_logo caption",
"logo caption"
],
"label": "Logo's caption",
"description": "The logo's caption.",
"suggested": true
},
"logo_size": {
"type": "number",
"aliases": [
"network_logo_size",
"logosize"
],
"label": "Logo size",
"description": "Size of the image, in pixels.",
"example": "250"
},
"logo_alt": {
"type": "content",
"aliases": [
"network_logo_alt"
],
"label": "Logo caption alt text",
"description": "Alt text of the logo. Alt text will be read out by screen readers and is not visible."
},
"collapsible": {
"label": "Collapsible?",
"description": "Set image to be collapsible.",
"type": "boolean"
},
"image": {
"type": "wiki-file-name",
"aliases": [
"screenshot"
],
"label": "Screenshot",
"description": "Screenshot of the network's website."
},
"image_size": {
"aliases": [
"screenshot_size"
],
"label": "Screenshot size",
"description": "Size of the screenshot, in pixels.",
"type": "number"
},
"image_alt": {
"aliases": [
"screenshot_alt"
],
"label": "Screenshot alt text",
"description": "Alt text of the screenshot. Alt text will be read out by screen readers and is not visible.",
"type": "content"
},
"caption": {
"type": "content",
"label": "Screenshot's caption",
"description": "The screenshot's caption."
},
"type": {
"type": "content",
"aliases": [
"network_type"
],
"label": "Type",
"description": "Type of broadcasting network.",
"example": "Radio, terrestrial television and satellite television broadcaster",
"suggested": true
},
"branding": {
"type": "string",
"label": "Branding",
"description": "What the network brands itself as.",
"example": "NHK"
},
"country": {
"type": "string",
"label": "Country",
"description": "Country where the network is headquartered.",
"suggested": true
},
"airdate": {
"type": "string",
"label": "First air date",
"description": "Date which the network first aired, in the format {{Start date|YYYY|MM|DD|df=y}}.",
"example": "{{Start date|1970|2|26}}",
"suggested": true
},
"available": {
"type": "string",
"label": "Availability",
"description": "Regions where the network is available.",
"example": "Global",
"suggested": true
},
"founded": {
"type": "string",
"aliases": [
"foundation"
],
"label": "Founded",
"description": "Where the network was founded.",
"suggested": true
},
"founder": {
"type": "string",
"label": "Founder",
"description": "Who founded the network."
},
"motto": {
"type": "content",
"label": "Motto"
},
"members": {
"type": "content",
"label": "Members"
},
"tvstations": {
"type": "string",
"label": "TV stations"
},
"tvtransmitters": {
"type": "string",
"label": "TV transmitters"
},
"radiostations": {
"type": "string",
"label": "Radio stations"
},
"radiotransmitters": {
"type": "string",
"label": "Radio transmitters"
},
"market_share": {
"type": "string",
"label": "Market share"
},
"endowment": {
"type": "string",
"label": "Endowment",
"description": "Financial endowment. Use {{increase}} or {{decrease}} at the beginning, and then state the endowment and year.",
"example": "{{increase}} $100.0 million (2000)"
},
"revenue": {
"type": "string",
"label": "Revenue",
"description": "Use {{increase}} or {{decrease}} at the beginning, and then state the revenue and year.",
"example": "{{increase}} $100.0 million (2000)"
},
"net_income": {
"label": "Net income",
"description": "Use {{increase}} or {{decrease}} at the beginning, and then state the net income and year.",
"example": "{{increase}} $100.0 million (2000)",
"type": "string"
},
"license_area": {
"type": "string",
"aliases": [
"licence_area"
],
"label": "License area",
"description": "Area which the network is licensed to broadcast in."
},
"headquarters": {
"type": "string",
"label": "Headquarters",
"description": "Location of network's headquarters."
},
"broadcast_area": {
"label": "Broadcast area",
"description": "Area(s) which the network broadcasts in.",
"type": "string"
},
"area": {
"label": "Area",
"type": "content"
},
"nation": {
"label": "Nation",
"type": "string"
},
"regions": {
"type": "string",
"label": "Regions"
},
"erp": {
"type": "string",
"label": "Effective radiated power"
},
"owner": {
"type": "string",
"label": "Owner"
},
"parent": {
"label": "Parent",
"type": "string"
},
"key_people": {
"aliases": [
"keypeople"
],
"type": "content",
"label": "Key people",
"description": "People key to the network, for example the CEO.",
"example": "[[Katherine Maher]] (CEO)"
},
"established": {
"label": "Established",
"description": "When the network was established. Use {{Start date|YYYY|MM|DD|df=y}}.",
"example": "{{Start date|2016|df=y}}",
"type": "string"
},
"test_card": {
"label": "Test card",
"type": "string"
},
"test_of_transmission": {
"aliases": [
"test of transmission"
],
"label": "Transmission test",
"type": "content"
},
"launch_date": {
"aliases": [
"launched"
],
"label": "Launch date",
"description": "Date when the network was launched. Use {{Start date|YYYY|MM|DD|df=y}}.",
"type": "string"
},
"dissolved": {
"type": "string",
"aliases": [
"closure_date",
"closed"
],
"label": "Dissolved",
"description": "Date when the network was dissolved. Use {{End date|YYYY|MM|DD|df=y}}."
},
"former_names": {
"type": "content",
"aliases": [
"past_names"
],
"label": "Former names",
"description": "Former names of the network."
},
"digital": {
"type": "content",
"label": "Digital channel(s)",
"description": "List of digital channels the network owns."
},
"virtual channel": {
"type": "content",
"label": "Virtual channel(s)",
"description": "List of digital channels the network owns."
},
"analog": {
"type": "content",
"aliases": [
"Analog channel"
],
"label": "Analogue channel(s)",
"description": "List of analogue channels the network owns."
},
"Picture format": {
"aliases": [
"picture_format",
"picture format"
],
"type": "content",
"label": "Picture format",
"description": "What formats the network broadcasts in.",
"example": "[[1080i]] ([[HDTV]])"
},
"servicename1": {
"type": "string",
"label": "Service name 1",
"description": "Name of the service that the network operates. Continues until 7.",
"example": "[[Free-to-air|Free channels]]"
},
"service1": {
"type": "number",
"label": "Service 1",
"description": "Number of channels the network broadcasts of service name 1. Continues until 7."
},
"servicename2": {
"type": "string",
"label": "Service name 2"
},
"service2": {
"type": "string",
"label": "Service 2"
},
"servicename3": {
"type": "string",
"label": "Service name 3"
},
"service3": {
"type": "string",
"label": "Service 3"
},
"servicename4": {
"type": "string",
"label": "Service name 4"
},
"service4": {
"type": "string",
"label": "Service 4"
},
"servicename5": {
"type": "string",
"label": "Service name 5"
},
"service5": {
"type": "string",
"label": "Service 5"
},
"servicename6": {
"type": "string",
"label": "Service name 6"
},
"service6": {
"type": "string",
"label": "Service 6"
},
"servicename7": {
"type": "string",
"label": "Service name 7"
},
"service7": {
"type": "string",
"label": "Service 7"
},
"callsigns": {
"type": "string",
"aliases": [
"callsign"
],
"label": "Callsign(s)",
"description": "Callsign of the network."
},
"callsign_meaning": {
"type": "string",
"label": "Callsign meaning",
"description": "Meaning of the callsign."
},
"former_callsigns": {
"type": "string",
"label": "Former callsigns"
},
"affiliation": {
"type": "string",
"aliases": [
"affiliations",
"affiliates"
],
"label": "Network affiliation(s)",
"description": "List of network affiliate(s)."
},
"groups": {
"type": "string",
"label": "Group(s)"
},
"former_affiliations": {
"type": "string",
"label": "Former affiliation(s)",
"description": "List of former network affiliate(s)."
},
"webcast": {
"label": "Webcast",
"description": "Link to a webcast of the broadcast network.",
"type": "string"
},
"website": {
"type": "string",
"label": "Official website",
"description": "Use {{URL}}.",
"suggested": true
},
"language": {
"type": "content",
"label": "Language(s)",
"description": "Language(s) the network broadcasts in."
},
"replaced": {
"type": "content",
"label": "Replaced",
"description": "If this network replaced another network, list the replaced network here."
},
"replaced_by": {
"type": "content",
"label": "Replaced by",
"description": "If this network has been replaced, list here what networks it has been replaced by."
},
"subsidiary": {
"type": "content",
"label": "Subsidiary of?"
},
"module": {
"type": "content",
"label": "Module",
"description": "Other templates can be embedded here."
},
"footnotes": {
"type": "content",
"label": "Notes",
"description": "Footnotes which will be at the bottom of the infobox."
}
},
"description": "This infobox is for articles about broadcast networks. It should not be used for television stations or radio stations. Use {{Infobox television station}} or {{Infobox radio station}}, instead.",
"paramOrder": [
"name",
"logo",
"logo_caption",
"logo_size",
"logo_alt",
"collapsible",
"image",
"image_size",
"image_alt",
"caption",
"type",
"branding",
"country",
"airdate",
"available",
"founded",
"founder",
"motto",
"members",
"tvstations",
"tvtransmitters",
"radiostations",
"radiotransmitters",
"market_share",
"endowment",
"revenue",
"net_income",
"license_area",
"headquarters",
"broadcast_area",
"area",
"nation",
"regions",
"erp",
"owner",
"parent",
"key_people",
"established",
"test_card",
"test_of_transmission",
"launch_date",
"dissolved",
"former_names",
"digital",
"virtual channel",
"analog",
"Picture format",
"servicename1",
"service1",
"servicename2",
"service2",
"servicename3",
"service3",
"servicename4",
"service4",
"servicename5",
"service5",
"servicename6",
"service6",
"servicename7",
"service7",
"callsigns",
"callsign_meaning",
"former_callsigns",
"affiliation",
"groups",
"former_affiliations",
"webcast",
"website",
"language",
"replaced",
"replaced_by",
"subsidiary",
"module",
"footnotes"
],
"format": "block"
}
</templatedata>
== Tracking category ==
* {{clc|Pages using infobox broadcasting network with unknown parameters}}
==See also==
{{Film- and television-related infobox templates}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Radio infobox templates|Network]]
[[Category:Television infobox templates|Broadcasting network]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
401cn9tzxqjbnjqz1a3c4b3giv99qlz
33593
33592
2026-11-11T22:53:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_broadcasting_network/doc]]
33592
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[</nowiki>[[Wikipedia:Wikidata]]<nowiki>]]) -->
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
{{Parameter names example |name |logo |logo_size |logo_alt |logo_caption <!-- |collapsible --> |image |image_size |image_alt |caption |type |branding |country |airdate |available |founded |founder |motto |tvstations |tvtransmitters |radiostations |radiotransmitters |market_share |endowment |revenue |net_income |licence_area |headquarters |broadcast_area |area |nation |regions |erp |owner |parent |key_people |established |test_card |test_of_transmission |launch_date |dissolved |former_names |digital |virtual channel |analog |analog channel |picture format |servicename1 |service1 |servicename2=...... |service2=...... |servicename7 |service7 |callsigns |callsign_meaning |former_callsigns |affiliation |affiliates |groups |former_affiliations |webcast |website |language |replaced |replaced_by |subsidiary |module |footnotes}}
This infobox is for articles about [[broadcast network]]s. It should not be used for television stations or radio stations. Use [[:Template:Infobox television station]] or [[:Template:Infobox radio station]], instead.
== Usage ==
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Infobox broadcasting network
| name =
| logo =
| logo_size =
| logo_alt =
| logo_caption =
| collapsible =
| image =
| image_size =
| image_alt =
| caption =
| type =
| branding =
| country =
| airdate =
| available =
| founded =
| founder =
| motto =
| members =
| tvstations =
| tvtransmitters =
| radiostations =
| radiotransmitters =
| market_share =
| endowment =
| revenue =
| net_income =
| licence_area = <!-- or | license_area = -->
| headquarters =
| broadcast_area =
| area =
| nation =
| regions =
| erp =
| owner =
| parent =
| key_people =
| established =
| test_card =
| test_of_transmission =
| launch_date = <!-- {{Start date|YYYY|MM|DD|df=y}} -->
| dissolved = <!-- {{End date|YYYY|MM|DD|df=y}} -->
| former_names =
| digital =
| virtual channel =
| analog =
| analog channel =
| picture format =
| servicename1 =
| service1 =
| servicename2 =
| service2 =
| servicename3 =
| service3 =
| servicename4 =
| service4 =
| servicename5 =
| service5 =
| servicename6 =
| service6 =
| servicename7 =
| service7 =
| callsigns = <!-- or | callsign = -->
| callsign_meaning =
| former_callsigns =
| affiliation = <!-- or | affiliations = -->
| affiliates =
| groups =
| former_affiliations =
| webcast =
| website = <!-- {{URL|example.com}} -->
| language =
| replaced =
| replaced_by =
| subsidiary =
| module = <!-- Other templates can be embedded here -->
| footnotes =
}}
</syntaxhighlight>
Use <nowiki>{{Start date|YYYY|MM|DD}}</nowiki> (with {{Para|df|y}} if applicable) for one of {{para|airdate}}, {{para|founded}}, {{para|foundation}} or {{para|launch_date}}.
== Microformat ==
{{UF-hcard-org}}
==TemplateData==
{{TemplateData header}}
<templatedata>
{
"params": {
"name": {
"type": "string",
"suggested": true,
"aliases": [
"network_name"
],
"label": "Name",
"description": "Name of the broadcasting network.",
"example": "BBC"
},
"logo": {
"type": "wiki-file-name",
"suggested": true,
"aliases": [
"network_logo"
],
"label": "Logo",
"description": "The network's logo."
},
"logo_caption": {
"type": "content",
"aliases": [
"network_logo caption",
"logo caption"
],
"label": "Logo's caption",
"description": "The logo's caption.",
"suggested": true
},
"logo_size": {
"type": "number",
"aliases": [
"network_logo_size",
"logosize"
],
"label": "Logo size",
"description": "Size of the image, in pixels.",
"example": "250"
},
"logo_alt": {
"type": "content",
"aliases": [
"network_logo_alt"
],
"label": "Logo caption alt text",
"description": "Alt text of the logo. Alt text will be read out by screen readers and is not visible."
},
"collapsible": {
"label": "Collapsible?",
"description": "Set image to be collapsible.",
"type": "boolean"
},
"image": {
"type": "wiki-file-name",
"aliases": [
"screenshot"
],
"label": "Screenshot",
"description": "Screenshot of the network's website."
},
"image_size": {
"aliases": [
"screenshot_size"
],
"label": "Screenshot size",
"description": "Size of the screenshot, in pixels.",
"type": "number"
},
"image_alt": {
"aliases": [
"screenshot_alt"
],
"label": "Screenshot alt text",
"description": "Alt text of the screenshot. Alt text will be read out by screen readers and is not visible.",
"type": "content"
},
"caption": {
"type": "content",
"label": "Screenshot's caption",
"description": "The screenshot's caption."
},
"type": {
"type": "content",
"aliases": [
"network_type"
],
"label": "Type",
"description": "Type of broadcasting network.",
"example": "Radio, terrestrial television and satellite television broadcaster",
"suggested": true
},
"branding": {
"type": "string",
"label": "Branding",
"description": "What the network brands itself as.",
"example": "NHK"
},
"country": {
"type": "string",
"label": "Country",
"description": "Country where the network is headquartered.",
"suggested": true
},
"airdate": {
"type": "string",
"label": "First air date",
"description": "Date which the network first aired, in the format {{Start date|YYYY|MM|DD|df=y}}.",
"example": "{{Start date|1970|2|26}}",
"suggested": true
},
"available": {
"type": "string",
"label": "Availability",
"description": "Regions where the network is available.",
"example": "Global",
"suggested": true
},
"founded": {
"type": "string",
"aliases": [
"foundation"
],
"label": "Founded",
"description": "Where the network was founded.",
"suggested": true
},
"founder": {
"type": "string",
"label": "Founder",
"description": "Who founded the network."
},
"motto": {
"type": "content",
"label": "Motto"
},
"members": {
"type": "content",
"label": "Members"
},
"tvstations": {
"type": "string",
"label": "TV stations"
},
"tvtransmitters": {
"type": "string",
"label": "TV transmitters"
},
"radiostations": {
"type": "string",
"label": "Radio stations"
},
"radiotransmitters": {
"type": "string",
"label": "Radio transmitters"
},
"market_share": {
"type": "string",
"label": "Market share"
},
"endowment": {
"type": "string",
"label": "Endowment",
"description": "Financial endowment. Use {{increase}} or {{decrease}} at the beginning, and then state the endowment and year.",
"example": "{{increase}} $100.0 million (2000)"
},
"revenue": {
"type": "string",
"label": "Revenue",
"description": "Use {{increase}} or {{decrease}} at the beginning, and then state the revenue and year.",
"example": "{{increase}} $100.0 million (2000)"
},
"net_income": {
"label": "Net income",
"description": "Use {{increase}} or {{decrease}} at the beginning, and then state the net income and year.",
"example": "{{increase}} $100.0 million (2000)",
"type": "string"
},
"license_area": {
"type": "string",
"aliases": [
"licence_area"
],
"label": "License area",
"description": "Area which the network is licensed to broadcast in."
},
"headquarters": {
"type": "string",
"label": "Headquarters",
"description": "Location of network's headquarters."
},
"broadcast_area": {
"label": "Broadcast area",
"description": "Area(s) which the network broadcasts in.",
"type": "string"
},
"area": {
"label": "Area",
"type": "content"
},
"nation": {
"label": "Nation",
"type": "string"
},
"regions": {
"type": "string",
"label": "Regions"
},
"erp": {
"type": "string",
"label": "Effective radiated power"
},
"owner": {
"type": "string",
"label": "Owner"
},
"parent": {
"label": "Parent",
"type": "string"
},
"key_people": {
"aliases": [
"keypeople"
],
"type": "content",
"label": "Key people",
"description": "People key to the network, for example the CEO.",
"example": "[[Katherine Maher]] (CEO)"
},
"established": {
"label": "Established",
"description": "When the network was established. Use {{Start date|YYYY|MM|DD|df=y}}.",
"example": "{{Start date|2016|df=y}}",
"type": "string"
},
"test_card": {
"label": "Test card",
"type": "string"
},
"test_of_transmission": {
"aliases": [
"test of transmission"
],
"label": "Transmission test",
"type": "content"
},
"launch_date": {
"aliases": [
"launched"
],
"label": "Launch date",
"description": "Date when the network was launched. Use {{Start date|YYYY|MM|DD|df=y}}.",
"type": "string"
},
"dissolved": {
"type": "string",
"aliases": [
"closure_date",
"closed"
],
"label": "Dissolved",
"description": "Date when the network was dissolved. Use {{End date|YYYY|MM|DD|df=y}}."
},
"former_names": {
"type": "content",
"aliases": [
"past_names"
],
"label": "Former names",
"description": "Former names of the network."
},
"digital": {
"type": "content",
"label": "Digital channel(s)",
"description": "List of digital channels the network owns."
},
"virtual channel": {
"type": "content",
"label": "Virtual channel(s)",
"description": "List of digital channels the network owns."
},
"analog": {
"type": "content",
"aliases": [
"Analog channel"
],
"label": "Analogue channel(s)",
"description": "List of analogue channels the network owns."
},
"Picture format": {
"aliases": [
"picture_format",
"picture format"
],
"type": "content",
"label": "Picture format",
"description": "What formats the network broadcasts in.",
"example": "[[1080i]] ([[HDTV]])"
},
"servicename1": {
"type": "string",
"label": "Service name 1",
"description": "Name of the service that the network operates. Continues until 7.",
"example": "[[Free-to-air|Free channels]]"
},
"service1": {
"type": "number",
"label": "Service 1",
"description": "Number of channels the network broadcasts of service name 1. Continues until 7."
},
"servicename2": {
"type": "string",
"label": "Service name 2"
},
"service2": {
"type": "string",
"label": "Service 2"
},
"servicename3": {
"type": "string",
"label": "Service name 3"
},
"service3": {
"type": "string",
"label": "Service 3"
},
"servicename4": {
"type": "string",
"label": "Service name 4"
},
"service4": {
"type": "string",
"label": "Service 4"
},
"servicename5": {
"type": "string",
"label": "Service name 5"
},
"service5": {
"type": "string",
"label": "Service 5"
},
"servicename6": {
"type": "string",
"label": "Service name 6"
},
"service6": {
"type": "string",
"label": "Service 6"
},
"servicename7": {
"type": "string",
"label": "Service name 7"
},
"service7": {
"type": "string",
"label": "Service 7"
},
"callsigns": {
"type": "string",
"aliases": [
"callsign"
],
"label": "Callsign(s)",
"description": "Callsign of the network."
},
"callsign_meaning": {
"type": "string",
"label": "Callsign meaning",
"description": "Meaning of the callsign."
},
"former_callsigns": {
"type": "string",
"label": "Former callsigns"
},
"affiliation": {
"type": "string",
"aliases": [
"affiliations",
"affiliates"
],
"label": "Network affiliation(s)",
"description": "List of network affiliate(s)."
},
"groups": {
"type": "string",
"label": "Group(s)"
},
"former_affiliations": {
"type": "string",
"label": "Former affiliation(s)",
"description": "List of former network affiliate(s)."
},
"webcast": {
"label": "Webcast",
"description": "Link to a webcast of the broadcast network.",
"type": "string"
},
"website": {
"type": "string",
"label": "Official website",
"description": "Use {{URL}}.",
"suggested": true
},
"language": {
"type": "content",
"label": "Language(s)",
"description": "Language(s) the network broadcasts in."
},
"replaced": {
"type": "content",
"label": "Replaced",
"description": "If this network replaced another network, list the replaced network here."
},
"replaced_by": {
"type": "content",
"label": "Replaced by",
"description": "If this network has been replaced, list here what networks it has been replaced by."
},
"subsidiary": {
"type": "content",
"label": "Subsidiary of?"
},
"module": {
"type": "content",
"label": "Module",
"description": "Other templates can be embedded here."
},
"footnotes": {
"type": "content",
"label": "Notes",
"description": "Footnotes which will be at the bottom of the infobox."
}
},
"description": "This infobox is for articles about broadcast networks. It should not be used for television stations or radio stations. Use {{Infobox television station}} or {{Infobox radio station}}, instead.",
"paramOrder": [
"name",
"logo",
"logo_caption",
"logo_size",
"logo_alt",
"collapsible",
"image",
"image_size",
"image_alt",
"caption",
"type",
"branding",
"country",
"airdate",
"available",
"founded",
"founder",
"motto",
"members",
"tvstations",
"tvtransmitters",
"radiostations",
"radiotransmitters",
"market_share",
"endowment",
"revenue",
"net_income",
"license_area",
"headquarters",
"broadcast_area",
"area",
"nation",
"regions",
"erp",
"owner",
"parent",
"key_people",
"established",
"test_card",
"test_of_transmission",
"launch_date",
"dissolved",
"former_names",
"digital",
"virtual channel",
"analog",
"Picture format",
"servicename1",
"service1",
"servicename2",
"service2",
"servicename3",
"service3",
"servicename4",
"service4",
"servicename5",
"service5",
"servicename6",
"service6",
"servicename7",
"service7",
"callsigns",
"callsign_meaning",
"former_callsigns",
"affiliation",
"groups",
"former_affiliations",
"webcast",
"website",
"language",
"replaced",
"replaced_by",
"subsidiary",
"module",
"footnotes"
],
"format": "block"
}
</templatedata>
== Tracking category ==
* {{clc|Pages using infobox broadcasting network with unknown parameters}}
==See also==
{{Film- and television-related infobox templates}}
<includeonly>{{Sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Radio infobox templates|Network]]
[[Category:Television infobox templates|Broadcasting network]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
401cn9tzxqjbnjqz1a3c4b3giv99qlz
Tempilet:Infobox grapheme
10
2750
33596
2026-07-20T14:10:17Z
en>Frietjes
0
update parameters
33596
wikitext
text/x-wiki
{{Infobox
|bodystyle={{#if:{{{boxsize|}}}|width:{{{boxsize}}};}}
|autoheaders=y
|abovestyle=background:{{#switch:{{lc:{{{type|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantary|[[consonantary]]=palegreen
|alphabet|[[alphabet]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabary|[[syllabary]]=pink |semisyllabary|[[semisyllabary]]=magenta
|manual|[[manual]]=paleturquoise |pictographic|[[pictographic]]=palegoldenrod
|ideographic|[[ideographic]]=gold |logographic|[[logographic]]|[[logosyllabic]]=mistyrose
|stenography|[[stenography]] |shorthand|[[shorthand]] =
{{#switch:{{lc:{{{SHtype|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantal|[[consonantal]]=palegreen
|alphabetic|[[alphabetic]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabic|[[syllabic]]=pink |semisyllabic|[[semisyllabic]]=magenta
|undeciphered=gainsboro |alternative=khaki
|#default=turquoise
}}
|undeciphered=gainsboro |alternative=khaki
|tactile=white;font-variant:small-caps
|#default=white
}};
color:{{#switch:{{lc:{{{SHform|}}}}}
|cursive|printed=#303030 |stenographic=#405000 |geometric=#005020
|semi-script|elliptical|script-geometric=#600000 |script=#500030
|#default= #202122;
}};<!--
font-variant/style:
-->{{#switch:{{lc:{{{mode|}}}}}
|tactile=font-variant:small-caps
|stenographic|[[stenographic]]|shorthand|[[shorthand]]=font-style:italic
|manual=font-style:italic;font-variant:small-caps
|#default=
}};
|headerstyle=background:{{#switch:{{lc:{{{type|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantary|[[consonantary]]=palegreen
|alphabet|[[alphabet]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabary|[[syllabary]]=pink |semisyllabary|[[semisyllabary]]=magenta
|manual|[[manual]]=paleturquoise |pictographic|[[pictographic]]=palegoldenrod
|ideographic|[[ideographic]]=gold |logographic|[[logographic]]|[[logosyllabic]]=mistyrose
|stenography|[[stenography]] |shorthand|[[shorthand]] =
{{#switch:{{lc:{{{SHtype|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantal|[[consonantal]]=palegreen
|alphabetic|[[alphabetic]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabic|[[syllabic]]=pink |semisyllabic|[[semisyllabic]]=magenta
|undeciphered=gainsboro |alternative=khaki
|#default=turquoise
}}
|undeciphered=gainsboro |alternative=khaki
|tactile=white;font-variant:small-caps
|#default=white
}};
color:{{#switch:{{lc:{{{SHform|}}}}}
|cursive|printed=#303030 |stenographic=#405000 |geometric=#005020
|semi-script|elliptical|script-geometric=#600000 |script=#500030
|#default=#202122;
}};
font-variant/style:
{{#switch:{{lc:{{{mode|}}}}}
|tactile=font-variant:small-caps
|stenographic|[[stenographic]]|shorthand|[[shorthand]]=font-style:italic
|manual=font-style:italic;font-variant:small-caps
|#default=
}};
|above={{{name|{{PAGENAME}}}}}
|subheader=<span style="font-size: 4em; line-height: 1.2em; vertical-align: super; font-weight: normal;">{{{letter|}}}</span>
|subheader2={{{variations|}}}
|image={{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{imagesize|}}}|sizedefault=frameless|upright={{{imageupright|1}}}|alt={{{imagealt|}}}|class={{{imageclass|}}}|suppressplaceholder=yes}}
|caption={{{caption|}}}
|image2={{#invoke:InfoboxImage|InfoboxImage|image={{{image2|}}}|size={{{imagesize2|{{{imagesize|}}}}}}|sizedefault=frameless|upright={{{imageupright2|1}}}|alt={{{imagealt2|}}}|class={{{imageclass2|}}}|suppressplaceholder=yes}}
|caption2={{{caption2|}}}
|image3={{#invoke:InfoboxImage|InfoboxImage|image={{{image3|}}}|size={{{imagesize3|{{{imagesize|}}}}}}|sizedefault=frameless|upright={{{imageupright3|1}}}|alt={{{imagealt3|}}}|class={{{imageclass3|}}}|suppressplaceholder=yes}}
|caption3={{{caption3|}}}
|header1=Usage
|label2=Writing system
|data2={{{script|}}}
|label3=Type
|data3={{{type|}}}{{{typedesc|}}}
|label4=Language of origin
|data4={{{language|}}}
|label5=[[Latin phonology and orthography|Latin orthography]]
|data5={{if empty|{{{latin_orthography|}}}|{{{Latin|}}}}}
|label6=Sound values
|data6={{#ifeq:{{{type|}}}|pictographic||{{#ifeq:{{{type|}}}|[[pictographic]]||{{{phonemes|}}}}}}}
|label7=In {{#if:{{{unicode_type|}}}|{{{unicode_type}}}|[[Unicode]]}}
|data7={{#if:{{{unicode|}}}|{{#if:{{{no_unicode_code|}}}|{{{unicode|}}}|<code>{{{unicode|}}}</code>}}}}
|label8={{#switch:{{lc:{{{type|}}}}}
|[[abjad]]|abjad|[[abuguida]]|abuguida|[[alphabet]]|alphabet=Alphabetical|#default=Lexicographic}} position
|data8={{{alphanumber|}}}
|header9=History
|label10=Development
|data10={{#if:{{{fam1|}}}
|<div style="font-size: 1.25em;">{{{fam1}}}}}{{#if:{{{fam2|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam2}}}}}{{#if:{{{fam3|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam3}}}}}{{#if:{{{fam4|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam4}}}}}{{#if:{{{fam5|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam5}}}}}{{#if:{{{fam6|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam6}}}}}{{#if:{{{fam7|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam7}}}}}{{#if:{{{fam8|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam8}}}}}{{#if:{{{fam9|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam9}}}}}{{#if:{{{fam10|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam10}}}}}{{#if:{{{fam11|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam11}}}}}{{#if:{{{fam12|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam12}}}}}{{#if:{{{fam13|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam13}}}}}{{#if:{{{fam14|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam14}}}}}{{#if:{{{fam15|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam15}}}}}{{#if:{{{fam16|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam16}}}}}{{#if:{{{fam17|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam17}}}}}{{#if:{{{fam18|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam18}}}}}{{#if:{{{fam19|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam19}}}}}{{#if:{{{fam20|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam20}}}}}{{#if:{{{fam1|}}}|<ul style="margin-left:0.45em;"><li><b>{{{letter|{{PAGENAME}}}}}</b></li></ul>}}{{#if:{{{fam20|}}}
|</li></ul>}}{{#if:{{{fam19|}}}
|</li></ul>}}{{#if:{{{fam18|}}}
|</li></ul>}}{{#if:{{{fam17|}}}
|</li></ul>}}{{#if:{{{fam16|}}}
|</li></ul>}}{{#if:{{{fam15|}}}
|</li></ul>}}{{#if:{{{fam14|}}}
|</li></ul>}}{{#if:{{{fam13|}}}
|</li></ul>}}{{#if:{{{fam12|}}}
|</li></ul>}}{{#if:{{{fam11|}}}
|</li></ul>}}{{#if:{{{fam10|}}}
|</li></ul>}}{{#if:{{{fam9|}}}
|</li></ul>}}{{#if:{{{fam8|}}}
|</li></ul>}}{{#if:{{{fam7|}}}
|</li></ul>}}{{#if:{{{fam6|}}}
|</li></ul>}}{{#if:{{{fam5|}}}
|</li></ul>}}{{#if:{{{fam4|}}}
|</li></ul>}}{{#if:{{{fam3|}}}
|</li></ul>}}{{#if:{{{fam2|}}}
|</li></ul>}}{{#if:{{{fam1|}}}
|</div>}}
|label11=Time period
|data11={{{usageperiod|}}}
|label12=Descendants
|data12={{{children|}}}
|label13=Sisters
|data13={{{sisters|}}}
|label14=Transliterations
|data14={{{equivalents|}}}
|label15=Variations
|data15={{{variations|}}}
|header16=Other
|label17=Associated graphs
|data17={{{associates|}}}
|label18=Associated numbers
|data18={{{number|}}}
|label19=Writing direction
|data19={{{direction|}}}
|data25={{{module|}}}
|belowclass=noprint selfref
|belowstyle=padding:0.3em 0.5em;text-align:left;line-height:1.3;
|below={{#if:{{{phonemes|}}}|{{IPA notice/msg}}|}}
}}<includeonly>{{#if:{{{letter|}}}||[[Category:Pages using Template:Infobox grapheme without param letter]]}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox grapheme with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox grapheme]] with unknown parameter "_VALUE_"|ignoreblank=y| alphanumber | associates | boxsize | caption | caption2 | caption3 | children | direction | equivalents | fam1 | fam2 | fam3 | fam4 | fam5 | fam6 | fam7 | fam8 | fam9 | fam10 | fam11 | fam12 | fam13 | fam14 | fam15 | fam16 | fam17 | fam18 | fam19 | fam20 | image | image2 | image3 | imagealt | imagealt2 | imagealt3 | imageclass | imageclass2 | imageclass3 | imagesize | imagesize2 | imagesize3 | imageupright | imageupright2 | imageupright3 | language | Latin | latin_orthography | letter | mode | module | name | no_unicode_code | number | phonemes | script | SHform | SHtype | sisters | type | typedesc | unicode | unicode_type | usageperiod | variations }}<noinclude>
{{documentation}}
</noinclude>
t0fbisorcpmtb9q3wxszywyxjelmzpo
33597
33596
2026-11-12T06:46:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_grapheme]]
33596
wikitext
text/x-wiki
{{Infobox
|bodystyle={{#if:{{{boxsize|}}}|width:{{{boxsize}}};}}
|autoheaders=y
|abovestyle=background:{{#switch:{{lc:{{{type|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantary|[[consonantary]]=palegreen
|alphabet|[[alphabet]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabary|[[syllabary]]=pink |semisyllabary|[[semisyllabary]]=magenta
|manual|[[manual]]=paleturquoise |pictographic|[[pictographic]]=palegoldenrod
|ideographic|[[ideographic]]=gold |logographic|[[logographic]]|[[logosyllabic]]=mistyrose
|stenography|[[stenography]] |shorthand|[[shorthand]] =
{{#switch:{{lc:{{{SHtype|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantal|[[consonantal]]=palegreen
|alphabetic|[[alphabetic]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabic|[[syllabic]]=pink |semisyllabic|[[semisyllabic]]=magenta
|undeciphered=gainsboro |alternative=khaki
|#default=turquoise
}}
|undeciphered=gainsboro |alternative=khaki
|tactile=white;font-variant:small-caps
|#default=white
}};
color:{{#switch:{{lc:{{{SHform|}}}}}
|cursive|printed=#303030 |stenographic=#405000 |geometric=#005020
|semi-script|elliptical|script-geometric=#600000 |script=#500030
|#default= #202122;
}};<!--
font-variant/style:
-->{{#switch:{{lc:{{{mode|}}}}}
|tactile=font-variant:small-caps
|stenographic|[[stenographic]]|shorthand|[[shorthand]]=font-style:italic
|manual=font-style:italic;font-variant:small-caps
|#default=
}};
|headerstyle=background:{{#switch:{{lc:{{{type|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantary|[[consonantary]]=palegreen
|alphabet|[[alphabet]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabary|[[syllabary]]=pink |semisyllabary|[[semisyllabary]]=magenta
|manual|[[manual]]=paleturquoise |pictographic|[[pictographic]]=palegoldenrod
|ideographic|[[ideographic]]=gold |logographic|[[logographic]]|[[logosyllabic]]=mistyrose
|stenography|[[stenography]] |shorthand|[[shorthand]] =
{{#switch:{{lc:{{{SHtype|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantal|[[consonantal]]=palegreen
|alphabetic|[[alphabetic]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabic|[[syllabic]]=pink |semisyllabic|[[semisyllabic]]=magenta
|undeciphered=gainsboro |alternative=khaki
|#default=turquoise
}}
|undeciphered=gainsboro |alternative=khaki
|tactile=white;font-variant:small-caps
|#default=white
}};
color:{{#switch:{{lc:{{{SHform|}}}}}
|cursive|printed=#303030 |stenographic=#405000 |geometric=#005020
|semi-script|elliptical|script-geometric=#600000 |script=#500030
|#default=#202122;
}};
font-variant/style:
{{#switch:{{lc:{{{mode|}}}}}
|tactile=font-variant:small-caps
|stenographic|[[stenographic]]|shorthand|[[shorthand]]=font-style:italic
|manual=font-style:italic;font-variant:small-caps
|#default=
}};
|above={{{name|{{PAGENAME}}}}}
|subheader=<span style="font-size: 4em; line-height: 1.2em; vertical-align: super; font-weight: normal;">{{{letter|}}}</span>
|subheader2={{{variations|}}}
|image={{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{imagesize|}}}|sizedefault=frameless|upright={{{imageupright|1}}}|alt={{{imagealt|}}}|class={{{imageclass|}}}|suppressplaceholder=yes}}
|caption={{{caption|}}}
|image2={{#invoke:InfoboxImage|InfoboxImage|image={{{image2|}}}|size={{{imagesize2|{{{imagesize|}}}}}}|sizedefault=frameless|upright={{{imageupright2|1}}}|alt={{{imagealt2|}}}|class={{{imageclass2|}}}|suppressplaceholder=yes}}
|caption2={{{caption2|}}}
|image3={{#invoke:InfoboxImage|InfoboxImage|image={{{image3|}}}|size={{{imagesize3|{{{imagesize|}}}}}}|sizedefault=frameless|upright={{{imageupright3|1}}}|alt={{{imagealt3|}}}|class={{{imageclass3|}}}|suppressplaceholder=yes}}
|caption3={{{caption3|}}}
|header1=Usage
|label2=Writing system
|data2={{{script|}}}
|label3=Type
|data3={{{type|}}}{{{typedesc|}}}
|label4=Language of origin
|data4={{{language|}}}
|label5=[[Latin phonology and orthography|Latin orthography]]
|data5={{if empty|{{{latin_orthography|}}}|{{{Latin|}}}}}
|label6=Sound values
|data6={{#ifeq:{{{type|}}}|pictographic||{{#ifeq:{{{type|}}}|[[pictographic]]||{{{phonemes|}}}}}}}
|label7=In {{#if:{{{unicode_type|}}}|{{{unicode_type}}}|[[Unicode]]}}
|data7={{#if:{{{unicode|}}}|{{#if:{{{no_unicode_code|}}}|{{{unicode|}}}|<code>{{{unicode|}}}</code>}}}}
|label8={{#switch:{{lc:{{{type|}}}}}
|[[abjad]]|abjad|[[abuguida]]|abuguida|[[alphabet]]|alphabet=Alphabetical|#default=Lexicographic}} position
|data8={{{alphanumber|}}}
|header9=History
|label10=Development
|data10={{#if:{{{fam1|}}}
|<div style="font-size: 1.25em;">{{{fam1}}}}}{{#if:{{{fam2|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam2}}}}}{{#if:{{{fam3|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam3}}}}}{{#if:{{{fam4|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam4}}}}}{{#if:{{{fam5|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam5}}}}}{{#if:{{{fam6|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam6}}}}}{{#if:{{{fam7|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam7}}}}}{{#if:{{{fam8|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam8}}}}}{{#if:{{{fam9|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam9}}}}}{{#if:{{{fam10|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam10}}}}}{{#if:{{{fam11|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam11}}}}}{{#if:{{{fam12|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam12}}}}}{{#if:{{{fam13|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam13}}}}}{{#if:{{{fam14|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam14}}}}}{{#if:{{{fam15|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam15}}}}}{{#if:{{{fam16|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam16}}}}}{{#if:{{{fam17|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam17}}}}}{{#if:{{{fam18|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam18}}}}}{{#if:{{{fam19|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam19}}}}}{{#if:{{{fam20|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam20}}}}}{{#if:{{{fam1|}}}|<ul style="margin-left:0.45em;"><li><b>{{{letter|{{PAGENAME}}}}}</b></li></ul>}}{{#if:{{{fam20|}}}
|</li></ul>}}{{#if:{{{fam19|}}}
|</li></ul>}}{{#if:{{{fam18|}}}
|</li></ul>}}{{#if:{{{fam17|}}}
|</li></ul>}}{{#if:{{{fam16|}}}
|</li></ul>}}{{#if:{{{fam15|}}}
|</li></ul>}}{{#if:{{{fam14|}}}
|</li></ul>}}{{#if:{{{fam13|}}}
|</li></ul>}}{{#if:{{{fam12|}}}
|</li></ul>}}{{#if:{{{fam11|}}}
|</li></ul>}}{{#if:{{{fam10|}}}
|</li></ul>}}{{#if:{{{fam9|}}}
|</li></ul>}}{{#if:{{{fam8|}}}
|</li></ul>}}{{#if:{{{fam7|}}}
|</li></ul>}}{{#if:{{{fam6|}}}
|</li></ul>}}{{#if:{{{fam5|}}}
|</li></ul>}}{{#if:{{{fam4|}}}
|</li></ul>}}{{#if:{{{fam3|}}}
|</li></ul>}}{{#if:{{{fam2|}}}
|</li></ul>}}{{#if:{{{fam1|}}}
|</div>}}
|label11=Time period
|data11={{{usageperiod|}}}
|label12=Descendants
|data12={{{children|}}}
|label13=Sisters
|data13={{{sisters|}}}
|label14=Transliterations
|data14={{{equivalents|}}}
|label15=Variations
|data15={{{variations|}}}
|header16=Other
|label17=Associated graphs
|data17={{{associates|}}}
|label18=Associated numbers
|data18={{{number|}}}
|label19=Writing direction
|data19={{{direction|}}}
|data25={{{module|}}}
|belowclass=noprint selfref
|belowstyle=padding:0.3em 0.5em;text-align:left;line-height:1.3;
|below={{#if:{{{phonemes|}}}|{{IPA notice/msg}}|}}
}}<includeonly>{{#if:{{{letter|}}}||[[Category:Pages using Template:Infobox grapheme without param letter]]}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox grapheme with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox grapheme]] with unknown parameter "_VALUE_"|ignoreblank=y| alphanumber | associates | boxsize | caption | caption2 | caption3 | children | direction | equivalents | fam1 | fam2 | fam3 | fam4 | fam5 | fam6 | fam7 | fam8 | fam9 | fam10 | fam11 | fam12 | fam13 | fam14 | fam15 | fam16 | fam17 | fam18 | fam19 | fam20 | image | image2 | image3 | imagealt | imagealt2 | imagealt3 | imageclass | imageclass2 | imageclass3 | imagesize | imagesize2 | imagesize3 | imageupright | imageupright2 | imageupright3 | language | Latin | latin_orthography | letter | mode | module | name | no_unicode_code | number | phonemes | script | SHform | SHtype | sisters | type | typedesc | unicode | unicode_type | usageperiod | variations }}<noinclude>
{{documentation}}
</noinclude>
t0fbisorcpmtb9q3wxszywyxjelmzpo
33606
33597
2026-11-12T06:46:24Z
RAPTOR7762
18
/* */
33606
wikitext
text/x-wiki
{{Infobox/sandbox
|bodystyle={{#if:{{{boxsize|}}}|width:{{{boxsize}}};}}
|autoheaders=y
|abovestyle=background:{{#switch:{{lc:{{{type|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantary|[[consonantary]]=palegreen
|alphabet|[[alphabet]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabary|[[syllabary]]=pink |semisyllabary|[[semisyllabary]]=magenta
|manual|[[manual]]=paleturquoise |pictographic|[[pictographic]]=palegoldenrod
|ideographic|[[ideographic]]=gold |logographic|[[logographic]]|[[logosyllabic]]=mistyrose
|stenography|[[stenography]] |shorthand|[[shorthand]] =
{{#switch:{{lc:{{{SHtype|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantal|[[consonantal]]=palegreen
|alphabetic|[[alphabetic]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabic|[[syllabic]]=pink |semisyllabic|[[semisyllabic]]=magenta
|undeciphered=gainsboro |alternative=khaki
|#default=turquoise
}}
|undeciphered=gainsboro |alternative=khaki
|tactile=white;font-variant:small-caps
|#default=white
}};
color:{{#switch:{{lc:{{{SHform|}}}}}
|cursive|printed=#303030 |stenographic=#405000 |geometric=#005020
|semi-script|elliptical|script-geometric=#600000 |script=#500030
|#default= #202122;
}};<!--
font-variant/style:
-->{{#switch:{{lc:{{{mode|}}}}}
|tactile=font-variant:small-caps
|stenographic|[[stenographic]]|shorthand|[[shorthand]]=font-style:italic
|manual=font-style:italic;font-variant:small-caps
|#default=
}};
|headerstyle=background:{{#switch:{{lc:{{{type|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantary|[[consonantary]]=palegreen
|alphabet|[[alphabet]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabary|[[syllabary]]=pink |semisyllabary|[[semisyllabary]]=magenta
|manual|[[manual]]=paleturquoise |pictographic|[[pictographic]]=palegoldenrod
|ideographic|[[ideographic]]=gold |logographic|[[logographic]]|[[logosyllabic]]=mistyrose
|stenography|[[stenography]] |shorthand|[[shorthand]] =
{{#switch:{{lc:{{{SHtype|}}}}}
|abjad|[[abjad]]|impure abjad|impure [[abjad]]|consonantal|[[consonantal]]=palegreen
|alphabetic|[[alphabetic]]=lightblue |abugida|[[abugida]]=navajowhite
|syllabic|[[syllabic]]=pink |semisyllabic|[[semisyllabic]]=magenta
|undeciphered=gainsboro |alternative=khaki
|#default=turquoise
}}
|undeciphered=gainsboro |alternative=khaki
|tactile=white;font-variant:small-caps
|#default=white
}};
color:{{#switch:{{lc:{{{SHform|}}}}}
|cursive|printed=#303030 |stenographic=#405000 |geometric=#005020
|semi-script|elliptical|script-geometric=#600000 |script=#500030
|#default=#202122;
}};
font-variant/style:
{{#switch:{{lc:{{{mode|}}}}}
|tactile=font-variant:small-caps
|stenographic|[[stenographic]]|shorthand|[[shorthand]]=font-style:italic
|manual=font-style:italic;font-variant:small-caps
|#default=
}};
|above={{{name|{{PAGENAME}}}}}
|subheader=<span style="font-size: 4em; line-height: 1.2em; vertical-align: super; font-weight: normal;">{{{letter|}}}</span>
|subheader2={{{variations|}}}
|image={{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{imagesize|}}}|sizedefault=frameless|upright={{{imageupright|1}}}|alt={{{imagealt|}}}|class={{{imageclass|}}}|suppressplaceholder=yes}}
|caption={{{caption|}}}
|image2={{#invoke:InfoboxImage|InfoboxImage|image={{{image2|}}}|size={{{imagesize2|{{{imagesize|}}}}}}|sizedefault=frameless|upright={{{imageupright2|1}}}|alt={{{imagealt2|}}}|class={{{imageclass2|}}}|suppressplaceholder=yes}}
|caption2={{{caption2|}}}
|image3={{#invoke:InfoboxImage|InfoboxImage|image={{{image3|}}}|size={{{imagesize3|{{{imagesize|}}}}}}|sizedefault=frameless|upright={{{imageupright3|1}}}|alt={{{imagealt3|}}}|class={{{imageclass3|}}}|suppressplaceholder=yes}}
|caption3={{{caption3|}}}
|header1=Usage
|label2=Writing system
|data2={{{script|}}}
|label3=Type
|data3={{{type|}}}{{{typedesc|}}}
|label4=Language of origin
|data4={{{language|}}}
|label5=[[Latin phonology and orthography|Latin orthography]]
|data5={{if empty|{{{latin_orthography|}}}|{{{Latin|}}}}}
|label6=Sound values
|data6={{#ifeq:{{{type|}}}|pictographic||{{#ifeq:{{{type|}}}|[[pictographic]]||{{{phonemes|}}}}}}}
|label7=In {{#if:{{{unicode_type|}}}|{{{unicode_type}}}|[[Unicode]]}}
|data7={{#if:{{{unicode|}}}|{{#if:{{{no_unicode_code|}}}|{{{unicode|}}}|<code>{{{unicode|}}}</code>}}}}
|label8={{#switch:{{lc:{{{type|}}}}}
|[[abjad]]|abjad|[[abuguida]]|abuguida|[[alphabet]]|alphabet=Alphabetical|#default=Lexicographic}} position
|data8={{{alphanumber|}}}
|header9=History
|label10=Development
|data10={{#if:{{{fam1|}}}
|<div style="font-size: 1.25em;">{{{fam1}}}}}{{#if:{{{fam2|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam2}}}}}{{#if:{{{fam3|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam3}}}}}{{#if:{{{fam4|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam4}}}}}{{#if:{{{fam5|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam5}}}}}{{#if:{{{fam6|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam6}}}}}{{#if:{{{fam7|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam7}}}}}{{#if:{{{fam8|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam8}}}}}{{#if:{{{fam9|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam9}}}}}{{#if:{{{fam10|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam10}}}}}{{#if:{{{fam11|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam11}}}}}{{#if:{{{fam12|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam12}}}}}{{#if:{{{fam13|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam13}}}}}{{#if:{{{fam14|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam14}}}}}{{#if:{{{fam15|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam15}}}}}{{#if:{{{fam16|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam16}}}}}{{#if:{{{fam17|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam17}}}}}{{#if:{{{fam18|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam18}}}}}{{#if:{{{fam19|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam19}}}}}{{#if:{{{fam20|}}}
|<ul style="margin-left:0.45em;"><li>{{{fam20}}}}}{{#if:{{{fam1|}}}|<ul style="margin-left:0.45em;"><li><b>{{{letter|{{PAGENAME}}}}}</b></li></ul>}}{{#if:{{{fam20|}}}
|</li></ul>}}{{#if:{{{fam19|}}}
|</li></ul>}}{{#if:{{{fam18|}}}
|</li></ul>}}{{#if:{{{fam17|}}}
|</li></ul>}}{{#if:{{{fam16|}}}
|</li></ul>}}{{#if:{{{fam15|}}}
|</li></ul>}}{{#if:{{{fam14|}}}
|</li></ul>}}{{#if:{{{fam13|}}}
|</li></ul>}}{{#if:{{{fam12|}}}
|</li></ul>}}{{#if:{{{fam11|}}}
|</li></ul>}}{{#if:{{{fam10|}}}
|</li></ul>}}{{#if:{{{fam9|}}}
|</li></ul>}}{{#if:{{{fam8|}}}
|</li></ul>}}{{#if:{{{fam7|}}}
|</li></ul>}}{{#if:{{{fam6|}}}
|</li></ul>}}{{#if:{{{fam5|}}}
|</li></ul>}}{{#if:{{{fam4|}}}
|</li></ul>}}{{#if:{{{fam3|}}}
|</li></ul>}}{{#if:{{{fam2|}}}
|</li></ul>}}{{#if:{{{fam1|}}}
|</div>}}
|label11=Time period
|data11={{{usageperiod|}}}
|label12=Descendants
|data12={{{children|}}}
|label13=Sisters
|data13={{{sisters|}}}
|label14=Transliterations
|data14={{{equivalents|}}}
|label15=Variations
|data15={{{variations|}}}
|header16=Other
|label17=Associated graphs
|data17={{{associates|}}}
|label18=Associated numbers
|data18={{{number|}}}
|label19=Writing direction
|data19={{{direction|}}}
|data25={{{module|}}}
|belowclass=noprint selfref
|belowstyle=padding:0.3em 0.5em;text-align:left;line-height:1.3;
|below={{#if:{{{phonemes|}}}|{{IPA notice/msg}}|}}
}}<includeonly>{{#if:{{{letter|}}}||[[Category:Pages using Template:Infobox grapheme without param letter]]}}</includeonly>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox grapheme with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox grapheme]] with unknown parameter "_VALUE_"|ignoreblank=y| alphanumber | associates | boxsize | caption | caption2 | caption3 | children | direction | equivalents | fam1 | fam2 | fam3 | fam4 | fam5 | fam6 | fam7 | fam8 | fam9 | fam10 | fam11 | fam12 | fam13 | fam14 | fam15 | fam16 | fam17 | fam18 | fam19 | fam20 | image | image2 | image3 | imagealt | imagealt2 | imagealt3 | imageclass | imageclass2 | imageclass3 | imagesize | imagesize2 | imagesize3 | imageupright | imageupright2 | imageupright3 | language | Latin | latin_orthography | letter | mode | module | name | no_unicode_code | number | phonemes | script | SHform | SHtype | sisters | type | typedesc | unicode | unicode_type | usageperiod | variations }}<noinclude>
{{documentation}}
</noinclude>
jf1atscnp8qwhrqs7fzt2kj15t6jckv
Tempilet:Angbr IPA
10
2751
33598
2024-12-29T17:50:30Z
en>Nardog
0
use wrapper
33598
wikitext
text/x-wiki
⟨{{#invoke:Template wrapper|wrap|_template=IPA|_include-positional=yes}}⟩<noinclude>{{documentation}}</noinclude>
j69lz758i59cjpp16tk1z2r4yt0l5sg
33599
33598
2026-11-12T06:46:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Angbr_IPA]]
33598
wikitext
text/x-wiki
⟨{{#invoke:Template wrapper|wrap|_template=IPA|_include-positional=yes}}⟩<noinclude>{{documentation}}</noinclude>
j69lz758i59cjpp16tk1z2r4yt0l5sg
Tempilet:IPA notice/msg
10
2752
33600
2026-04-29T21:12:30Z
en>Kanguole
0
Undid revision [[Special:Diff/1351721602|1351721602]] by [[Special:Contributions/Un assiolo|Un assiolo]] ([[User talk:Un assiolo|talk]]) unhelpful clutter on many hundreds of articles, very few of which are about English
33600
wikitext
text/x-wiki
{{yesno|{{{preamble|yes}}}|no=|yes=This {{#if:{{{1|}}}|{{{1}}}|{{main other|article|page}}}} contains '''[[phonetic transcription]]s in the [[International Phonetic Alphabet]] (IPA)'''. }}For an introductory guide on IPA symbols, see [[Help:IPA]].{{yesno|{{{brackets|yes}}}|no=|yes= For the distinction between {{IPA|[ ]}}, {{IPA|/ /}} and {{angbr IPA| }}, see [[International Phonetic Alphabet#Brackets and transcription delimiters|IPA § Brackets and transcription delimiters]].}}<noinclude>{{documentation}}</noinclude>
meupq2hkilsu8wjth9lqtqqfzoud6xa
33601
33600
2026-11-12T06:46:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPA_notice/msg]]
33600
wikitext
text/x-wiki
{{yesno|{{{preamble|yes}}}|no=|yes=This {{#if:{{{1|}}}|{{{1}}}|{{main other|article|page}}}} contains '''[[phonetic transcription]]s in the [[International Phonetic Alphabet]] (IPA)'''. }}For an introductory guide on IPA symbols, see [[Help:IPA]].{{yesno|{{{brackets|yes}}}|no=|yes= For the distinction between {{IPA|[ ]}}, {{IPA|/ /}} and {{angbr IPA| }}, see [[International Phonetic Alphabet#Brackets and transcription delimiters|IPA § Brackets and transcription delimiters]].}}<noinclude>{{documentation}}</noinclude>
meupq2hkilsu8wjth9lqtqqfzoud6xa
Tempilet:Nbsp
10
2753
33602
2018-11-19T18:04:40Z
en>Amorymeltzer
0
{{R from template shortcut}}
33602
wikitext
text/x-wiki
#REDIRECT [[Template:Spaces]]
{{Redirect category shell|
{{R from move}}
{{R from alternative name}}
{{R from template shortcut}}
}}
2axdy32whej7ce74avad8qnsbuwaoxi
33603
33602
2026-11-12T06:46:05Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Nbsp]]
33602
wikitext
text/x-wiki
#REDIRECT [[Template:Spaces]]
{{Redirect category shell|
{{R from move}}
{{R from alternative name}}
{{R from template shortcut}}
}}
2axdy32whej7ce74avad8qnsbuwaoxi
Tempilet:Infobox grapheme/doc
10
2754
33604
2025-10-28T04:01:52Z
en>Grapesurgeon
0
adding module param to doc
33604
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
{{Infobox grapheme
|name=''name''
|letter=''letter''
|variations=''variations''
|image=Example en.svg
|imageclass=skin-invert-image
|imagesize=
|imagealt=''imagealt''
|image2=Example.svg
|imageclass2=skin-invert-image
|imagesize2=
|imagealt2=''imagealt2''
|image3=Example2.svg
|imageclass3=skin-invert-image
|imagesize3=
|imagealt3=''imagealt3''
|boxsize=
|script=''script''
|type=''type''{{nbsp}}
|typedesc=''typedesc''
|SHtype=''SHtype''
|SHform=''SHform''
|mode=''mode''
|language=''language''
|phonemes=''phonemes''
|unicode=''unicode''
|alphanumber=''alphanumber''
|number=''number''
|fam1=''fam1'' <!-- breaks parser PLEASE FIX THIS!! -->
|fam2=''fam2'' <!-- breaks parser PLEASE FIX THIS!! -->
|fam3=''fam3'' <!-- breaks parser PLEASE FIX THIS!! -->
|fam4=''fam4'' <!-- breaks parser PLEASE FIX THIS!! -->
|usageperiod=''usageperiod''
|children=''children''
|sisters=''sisters''
|equivalents=''equivalents''
|associates=''associates''
|direction=''direction''
|module=''module''
}}
==Usage==
This template is intended to be used to summarize the content of articles about [[grapheme]]s. It automatically attaches a notice about the use of IPA symbols if necessary. Below is the full syntax for the template and the options for various parameters.
===Syntax===
<syntaxhighlight lang="wikitext">
{{Infobox grapheme
|name=
|letter=
|variations=
|image=
|imageupright=
|imagesize=
|imagealt=
|imageclass=
|image2=
|imageupright2=
|imagesize2=
|imagealt2=
|imageclass2=
|boxsize=
|script=
|type=
|typedesc=
|SHtype=
|SHform=
|mode=
|language=
|phonemes=
|unicode=
|alphanumber=
|number=
|fam1=
|fam2=
.
.
.
|fam20=
|usageperiod=
|children=
|sisters=
|equivalents=
|associates=
|direction=
|module=
}}
</syntaxhighlight>
===Options for ''type'' parameter===
Select color coding according to the type of writing system:
{| style="text-align:center; font-size:120%;" cellspacing="4" cellpadding="3"
|;style="background:palegreen; color: #202122;" | Abjad
|style="background:lightblue; color: #202122;" | Alphabet
|style="background:navajowhite; color: #202122;" | Abugida
|style="background:pink; color: #202122;" | Syllabary
|style="background:magenta; color: #202122;" | Semisyllabary
|-
|style="background:paleturquoise; color: #202122;"| Manual
|style="background:palegoldenrod; color: #202122;"| Pictographic
|style="background:gold; color: #202122;" | Ideographic
|style="background:mistyrose; color: #202122;" | Logographic
|-
|style="background:turquoise; color: #202122;" | Stenography
|style="background:turquoise; color: #202122;" | Shorthand
|style="background:gainsboro; color: #202122;" | Undeciphered
|style="background:khaki; color: #202122;" | Alternative
|style="background:white; color: #202122;" | (default)
|}
===Options for ''SHform'' parameter===
This field should only be included if "type" = stenography or shorthand. Select text color coding according to the shorthand letterforms:
{| style="text-align:center; font-size:120%;" cellspacing="4" cellpadding="3"
|style="background:white; color:#303030;"| '''Cursive'''
|style="background:white; color:#303030;"| '''Printed'''
|style="background:white; color:#405000;"| '''Stenographic'''
|style="background:white; color:#005020;"| '''Geometric'''
|style="background:white; color:#500030;"| '''Script'''
|-
|style="background:white; color:#600000;"| '''Semi-Script'''
|style="background:white; color:#600000;"| '''Elliptical'''
|style="background:white; color:#600000;"| '''Script-Geometric'''
|style="background:white; color: #202122;" | '''(default)'''
|}
===Options for ''SHtype'' parameter===
This field should only be included if "type" = stenography or shorthand. Select background color coding according to the type of writing system:
{| style="text-align:center; font-size:120%;" cellspacing="4" cellpadding="3"
|style="background:palegreen; color: #202122;" | '''Abjadi'''
|style="background:palegreen; color: #202122;" | '''Consonantal'''
|style="background:lightblue; color: #202122;" | '''Alphabetic'''
|style="background:navajowhite; color: #202122;" | '''Abugida'''
|style="background:pink; color: #202122;" | '''Syllabic'''
|-
|style="background:magenta; color: #202122;" | '''Semisyllabic'''
|style="background:palegoldenrod; color: #202122;"| '''Mixed'''
|style="background:gainsboro; color: #202122;" | '''Undeciphered'''
|style="background:khaki; color: #202122;" | '''Alternative'''
|style="background:turquoise; color: #202122;" | '''(default)'''
|}
==Tracking categories==
* {{clc|Pages using Template:Infobox grapheme without param letter}}
* {{clc| Pages using infobox grapheme with unknown parameters}}
==TemplateData==
<templatedata>
{
"description": "An infobox for displaying data about a grapheme or letter",
"params": {
"name": {
"label": "Name",
"description": "The English name of the letter",
"type": "string",
"required": false,
"default": "{{PAGENAME}}"
},
"letter": {
"label": "Letter",
"description": "The Unicode character for the letter",
"type": "string",
"required": false
},
"variations": {
"label": "Variants",
"description": "Variations of the grapheme",
"type": "string",
"required": false
},
"image": {
"label": "Image",
"description": "The image to display at the top of the infobox",
"type": "string",
"required": false
},
"image2": {
"label": "Image 2",
"description": "The second image to display at the top of the infobox",
"type": "string",
"required": false
},
"image3": {
"label": "Image 3",
"description": "The third image to display at the top of the infobox",
"type": "string",
"required": false
},
"imageclass": {
"label": "Image CSS class",
"description": "CSS class for the image, use 'skin-invert-image' for darkmode support",
"type": "string",
"required": false
},
"script": {
"label": "Script",
"description": "The script the letter belongs to",
"type": "string",
"required": false
},
"type": {
"label": "Type",
"description": "The type of script the letter belongs to; determines background color of the infobox",
"type": "string",
"required": false
},
"typedesc": {
"label": "Type description",
"description": "The script suffix for the script which the letter belongs to",
"type": "string",
"required": false
},
"SHtype": {
"label": "Shorthand type",
"description": "The type of shorthand script the letter belongs to; determines background color of the infobox",
"type": "string",
"required": false
},
"SHform": {
"label": "Shorthand form",
"description": "The form of the shorthand the letter belongs to",
"type": "string",
"required": false
},
"language": {
"label": "Language",
"description": "The language the letter belongs to, or originated in",
"type": "string",
"required": false
},
"phonemes": {
"label": "Phonemes",
"description": "The phonemes the letter represents",
"type": "string",
"required": false
},
"unicode": {
"label": "Unicode",
"description": "The Unicode code point for the grapheme",
"type": "string",
"required": false
},
"alphanumber": {
"label": "Alphabet number",
"description": "The positional number of the alphabet of the letter",
"type": "string",
"required": false
},
"fam1": {
"label": "Ancestor grapheme 1",
"description": "The 1st grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam2": {
"label": "Ancestor grapheme 2",
"description": "The 2nd grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam3": {
"label": "Ancestor grapheme 3",
"description": "The 3rd grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam4": {
"label": "Ancestor grapheme 4",
"description": "The 4th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam5": {
"label": "Ancestor grapheme 5",
"description": "The 5th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam6": {
"label": "Ancestor grapheme 6",
"description": "The 6th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam7": {
"label": "Ancestor grapheme 7",
"description": "The 7th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam8": {
"label": "Ancestor grapheme 8",
"description": "The 8th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam9": {
"label": "Ancestor grapheme 9",
"description": "The 9th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam10": {
"label": "Ancestor grapheme 10",
"description": "The 10th grapheme the letter is descended from. For extra ancestor graphemes, add consecutive fam# parameters",
"type": "string",
"required": false
},
"usageperiod": {
"label": "Usage period",
"description": "The timeperiod the letter is or was used in",
"type": "string",
"required": false
},
"children": {
"label": "Descendant graphemes",
"description": "The graphemes that are descended from the letter",
"type": "string",
"required": false
},
"sisters": {
"label": "Sister graphemes",
"description": "The sister graphemes of the letter",
"type": "string",
"required": false
},
"equivalents": {
"label": "Transliteration equivalents",
"description": "Equivalents to this letter in other scripts",
"type": "string",
"required": false
},
"associates": {
"label": "Associated graphs",
"description": "Graphs the grapheme is associated with",
"type": "string",
"required": false
},
"number": {
"label": "Associated numbers",
"description": "Numbers associated with the grapheme",
"type": "string",
"required": false
},
"direction": {
"label": "Writing direction",
"description": "The direction that the grapheme is written in",
"type": "string",
"required": false
}
},
"format": "block"
}
</templatedata>
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Writing system templates]]
[[Category:Language infobox templates]]
}}</includeonly>
k1az7fzbdwbayrbkljbwuqb5wex5va0
33605
33604
2026-11-12T06:46:06Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Infobox_grapheme/doc]]
33604
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Check for unknown parameters}}
{{Infobox grapheme
|name=''name''
|letter=''letter''
|variations=''variations''
|image=Example en.svg
|imageclass=skin-invert-image
|imagesize=
|imagealt=''imagealt''
|image2=Example.svg
|imageclass2=skin-invert-image
|imagesize2=
|imagealt2=''imagealt2''
|image3=Example2.svg
|imageclass3=skin-invert-image
|imagesize3=
|imagealt3=''imagealt3''
|boxsize=
|script=''script''
|type=''type''{{nbsp}}
|typedesc=''typedesc''
|SHtype=''SHtype''
|SHform=''SHform''
|mode=''mode''
|language=''language''
|phonemes=''phonemes''
|unicode=''unicode''
|alphanumber=''alphanumber''
|number=''number''
|fam1=''fam1'' <!-- breaks parser PLEASE FIX THIS!! -->
|fam2=''fam2'' <!-- breaks parser PLEASE FIX THIS!! -->
|fam3=''fam3'' <!-- breaks parser PLEASE FIX THIS!! -->
|fam4=''fam4'' <!-- breaks parser PLEASE FIX THIS!! -->
|usageperiod=''usageperiod''
|children=''children''
|sisters=''sisters''
|equivalents=''equivalents''
|associates=''associates''
|direction=''direction''
|module=''module''
}}
==Usage==
This template is intended to be used to summarize the content of articles about [[grapheme]]s. It automatically attaches a notice about the use of IPA symbols if necessary. Below is the full syntax for the template and the options for various parameters.
===Syntax===
<syntaxhighlight lang="wikitext">
{{Infobox grapheme
|name=
|letter=
|variations=
|image=
|imageupright=
|imagesize=
|imagealt=
|imageclass=
|image2=
|imageupright2=
|imagesize2=
|imagealt2=
|imageclass2=
|boxsize=
|script=
|type=
|typedesc=
|SHtype=
|SHform=
|mode=
|language=
|phonemes=
|unicode=
|alphanumber=
|number=
|fam1=
|fam2=
.
.
.
|fam20=
|usageperiod=
|children=
|sisters=
|equivalents=
|associates=
|direction=
|module=
}}
</syntaxhighlight>
===Options for ''type'' parameter===
Select color coding according to the type of writing system:
{| style="text-align:center; font-size:120%;" cellspacing="4" cellpadding="3"
|;style="background:palegreen; color: #202122;" | Abjad
|style="background:lightblue; color: #202122;" | Alphabet
|style="background:navajowhite; color: #202122;" | Abugida
|style="background:pink; color: #202122;" | Syllabary
|style="background:magenta; color: #202122;" | Semisyllabary
|-
|style="background:paleturquoise; color: #202122;"| Manual
|style="background:palegoldenrod; color: #202122;"| Pictographic
|style="background:gold; color: #202122;" | Ideographic
|style="background:mistyrose; color: #202122;" | Logographic
|-
|style="background:turquoise; color: #202122;" | Stenography
|style="background:turquoise; color: #202122;" | Shorthand
|style="background:gainsboro; color: #202122;" | Undeciphered
|style="background:khaki; color: #202122;" | Alternative
|style="background:white; color: #202122;" | (default)
|}
===Options for ''SHform'' parameter===
This field should only be included if "type" = stenography or shorthand. Select text color coding according to the shorthand letterforms:
{| style="text-align:center; font-size:120%;" cellspacing="4" cellpadding="3"
|style="background:white; color:#303030;"| '''Cursive'''
|style="background:white; color:#303030;"| '''Printed'''
|style="background:white; color:#405000;"| '''Stenographic'''
|style="background:white; color:#005020;"| '''Geometric'''
|style="background:white; color:#500030;"| '''Script'''
|-
|style="background:white; color:#600000;"| '''Semi-Script'''
|style="background:white; color:#600000;"| '''Elliptical'''
|style="background:white; color:#600000;"| '''Script-Geometric'''
|style="background:white; color: #202122;" | '''(default)'''
|}
===Options for ''SHtype'' parameter===
This field should only be included if "type" = stenography or shorthand. Select background color coding according to the type of writing system:
{| style="text-align:center; font-size:120%;" cellspacing="4" cellpadding="3"
|style="background:palegreen; color: #202122;" | '''Abjadi'''
|style="background:palegreen; color: #202122;" | '''Consonantal'''
|style="background:lightblue; color: #202122;" | '''Alphabetic'''
|style="background:navajowhite; color: #202122;" | '''Abugida'''
|style="background:pink; color: #202122;" | '''Syllabic'''
|-
|style="background:magenta; color: #202122;" | '''Semisyllabic'''
|style="background:palegoldenrod; color: #202122;"| '''Mixed'''
|style="background:gainsboro; color: #202122;" | '''Undeciphered'''
|style="background:khaki; color: #202122;" | '''Alternative'''
|style="background:turquoise; color: #202122;" | '''(default)'''
|}
==Tracking categories==
* {{clc|Pages using Template:Infobox grapheme without param letter}}
* {{clc| Pages using infobox grapheme with unknown parameters}}
==TemplateData==
<templatedata>
{
"description": "An infobox for displaying data about a grapheme or letter",
"params": {
"name": {
"label": "Name",
"description": "The English name of the letter",
"type": "string",
"required": false,
"default": "{{PAGENAME}}"
},
"letter": {
"label": "Letter",
"description": "The Unicode character for the letter",
"type": "string",
"required": false
},
"variations": {
"label": "Variants",
"description": "Variations of the grapheme",
"type": "string",
"required": false
},
"image": {
"label": "Image",
"description": "The image to display at the top of the infobox",
"type": "string",
"required": false
},
"image2": {
"label": "Image 2",
"description": "The second image to display at the top of the infobox",
"type": "string",
"required": false
},
"image3": {
"label": "Image 3",
"description": "The third image to display at the top of the infobox",
"type": "string",
"required": false
},
"imageclass": {
"label": "Image CSS class",
"description": "CSS class for the image, use 'skin-invert-image' for darkmode support",
"type": "string",
"required": false
},
"script": {
"label": "Script",
"description": "The script the letter belongs to",
"type": "string",
"required": false
},
"type": {
"label": "Type",
"description": "The type of script the letter belongs to; determines background color of the infobox",
"type": "string",
"required": false
},
"typedesc": {
"label": "Type description",
"description": "The script suffix for the script which the letter belongs to",
"type": "string",
"required": false
},
"SHtype": {
"label": "Shorthand type",
"description": "The type of shorthand script the letter belongs to; determines background color of the infobox",
"type": "string",
"required": false
},
"SHform": {
"label": "Shorthand form",
"description": "The form of the shorthand the letter belongs to",
"type": "string",
"required": false
},
"language": {
"label": "Language",
"description": "The language the letter belongs to, or originated in",
"type": "string",
"required": false
},
"phonemes": {
"label": "Phonemes",
"description": "The phonemes the letter represents",
"type": "string",
"required": false
},
"unicode": {
"label": "Unicode",
"description": "The Unicode code point for the grapheme",
"type": "string",
"required": false
},
"alphanumber": {
"label": "Alphabet number",
"description": "The positional number of the alphabet of the letter",
"type": "string",
"required": false
},
"fam1": {
"label": "Ancestor grapheme 1",
"description": "The 1st grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam2": {
"label": "Ancestor grapheme 2",
"description": "The 2nd grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam3": {
"label": "Ancestor grapheme 3",
"description": "The 3rd grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam4": {
"label": "Ancestor grapheme 4",
"description": "The 4th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam5": {
"label": "Ancestor grapheme 5",
"description": "The 5th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam6": {
"label": "Ancestor grapheme 6",
"description": "The 6th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam7": {
"label": "Ancestor grapheme 7",
"description": "The 7th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam8": {
"label": "Ancestor grapheme 8",
"description": "The 8th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam9": {
"label": "Ancestor grapheme 9",
"description": "The 9th grapheme the letter is descended from",
"type": "string",
"required": false
},
"fam10": {
"label": "Ancestor grapheme 10",
"description": "The 10th grapheme the letter is descended from. For extra ancestor graphemes, add consecutive fam# parameters",
"type": "string",
"required": false
},
"usageperiod": {
"label": "Usage period",
"description": "The timeperiod the letter is or was used in",
"type": "string",
"required": false
},
"children": {
"label": "Descendant graphemes",
"description": "The graphemes that are descended from the letter",
"type": "string",
"required": false
},
"sisters": {
"label": "Sister graphemes",
"description": "The sister graphemes of the letter",
"type": "string",
"required": false
},
"equivalents": {
"label": "Transliteration equivalents",
"description": "Equivalents to this letter in other scripts",
"type": "string",
"required": false
},
"associates": {
"label": "Associated graphs",
"description": "Graphs the grapheme is associated with",
"type": "string",
"required": false
},
"number": {
"label": "Associated numbers",
"description": "Numbers associated with the grapheme",
"type": "string",
"required": false
},
"direction": {
"label": "Writing direction",
"description": "The direction that the grapheme is written in",
"type": "string",
"required": false
}
},
"format": "block"
}
</templatedata>
<includeonly>{{sandbox other||
<!-- Categories below this line, please; interwikis at Wikidata -->
[[Category:Writing system templates]]
[[Category:Language infobox templates]]
}}</includeonly>
k1az7fzbdwbayrbkljbwuqb5wex5va0
Tempilet:Circa
10
2755
33608
2024-07-24T01:25:28Z
en>Primefac
0
Undid revision [[Special:Diff/1236205778|1236205778]] by [[Special:Contributions/Primefac|Primefac]] ([[User talk:Primefac|talk]]) rvt, change contested
33608
wikitext
text/x-wiki
{{#if:{{{sortable|}}}
|<span style="display:none; speak:none;">{{padleft:{{{1|}}}|4|0}} </span>
}}{{#switch:{{{lk|}}}
|no|off = <span title="circa">c.</span>
|yes|on = [[wikt:circa#English|c.]]
|abbr
|#default = <abbr title="circa">c.</abbr>
}}{{#ifeq:{{{1|+}}}|{{{1|-}}}
|<span style="white-space:nowrap;"> {{trim|{{{1}}}}}</span>
}}{{#if:{{{2|}}}
| – c.<span style="white-space:nowrap;"> {{{2}}}</span>
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using circa with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Circa]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | i | lk | sortable }}<noinclude>
{{Documentation}}
</noinclude>
th0ehkxku0fvgpf4hucg12qtkpt8n5u
33609
33608
2026-11-12T07:30:57Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Circa]]
33608
wikitext
text/x-wiki
{{#if:{{{sortable|}}}
|<span style="display:none; speak:none;">{{padleft:{{{1|}}}|4|0}} </span>
}}{{#switch:{{{lk|}}}
|no|off = <span title="circa">c.</span>
|yes|on = [[wikt:circa#English|c.]]
|abbr
|#default = <abbr title="circa">c.</abbr>
}}{{#ifeq:{{{1|+}}}|{{{1|-}}}
|<span style="white-space:nowrap;"> {{trim|{{{1}}}}}</span>
}}{{#if:{{{2|}}}
| – c.<span style="white-space:nowrap;"> {{{2}}}</span>
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using circa with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Circa]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | i | lk | sortable }}<noinclude>
{{Documentation}}
</noinclude>
th0ehkxku0fvgpf4hucg12qtkpt8n5u
Tempilet:Templatedata header
10
2756
33610
2024-09-20T21:49:24Z
en>Knitsey
0
Reverted 1 edit by [[Special:Contributions/Nachaka|Nachaka]] ([[User talk:Nachaka|talk]])
33610
wikitext
text/x-wiki
#REDIRECT [[Template:TemplateData header]]
4f5j00d4fbzl99id7id41c4xn7tyk03
33611
33610
2026-11-12T07:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Templatedata_header]]
33610
wikitext
text/x-wiki
#REDIRECT [[Template:TemplateData header]]
4f5j00d4fbzl99id7id41c4xn7tyk03
Tempilet:Circa/doc
10
2757
33612
2026-09-21T21:31:45Z
en>Scyrme
0
clarify, as this parameter still produces a tooltip, just not an abbr tooltip
33612
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Categories go where indicated at the bottom of this page, please; interwikis go to Wikidata (see also: [[Wikipedia:Wikidata]]). -->
{{High-use}}
{{COinS safe|n|addtext=<br />The CS1 and CS2 templates have limited [[Help:Citation_Style_1#Date_format_compliance_with_Wikipedia's_Manual_of_Style|support]] for <code>c.</code> as an abbreviation in the date fields.}}
{{Lua|Module:Check for unknown parameters}}
{{Template shortcut|c.}}
==Usage==
This template generates an abbreviation for ''[[wikt:circa#English|circa]]'': {{circa}} By default the abbreviation is marked with an HTML <code><abbr></code> tag, which in most browsers renders as a [[tooltip]] when hovered.
===Examples===
{| class="wikitable"
|-
! Syntax
! What it looks like
! Notes
|-
| <code><nowiki>{{circa|1325}}</nowiki></code>
| {{circa|1325}}
| rowspan="2" | Default style: no line break allowed; thin space
|-
| <code><nowiki>{{circa|1325 BCE}}</nowiki></code>
| {{circa|1325 BCE}}
|-
| <code><nowiki>{{circa|1325|lk=yes}}</nowiki></code>
| {{circa|1325|lk=yes}}
| Replace abbreviation tooltip with a link to Wiktionary instead
|-
| <code><nowiki>{{circa|1325|lk=no}}</nowiki></code>
| {{circa|1325|lk=no}}
| Removes the dotted line by replacing the abbreviation tooltip (equivalent to {{tl|abbr}}) with a title tooltip (equivalent to {{tl|tooltip}})
|-
| <code><nowiki>{{circa|1000|1050}}</nowiki></code>
| {{circa|1000|1050}}
| For a range with both dates approximate. No tooltip on the second instance of "c."
|-
| <code><nowiki>{{circa|1000–1050}}</nowiki></code>
| {{circa|1000–1050}}
| Another option for a range; but, per [[MOS:CIRCA]], prefer <code><nowiki>{{circa|1000|1050}}</nowiki></code>
|}
===Parameters===
Using the date itself as parameter (for example, <code><nowiki>{{circa|1956}}</nowiki></code>, giving "{{circa|1956}}"), web browsers do not insert a line break anywhere in the string. By contrast, <code><nowiki>{{circa}} 1956</nowiki></code> allows a line break between the "{{circa}}" and the number. Also, with the date as a parameter a thinner space is used with many browsers:
* "{{circa|1956}}" is generated by <code><nowiki>{{circa|1956}}</nowiki></code>.
* "{{circa}} 1956" is generated by <code><nowiki>{{circa}} 1956</nowiki></code>.
If the parameter {{para|lk}} (for "link") is set as {{para|lk|no}} or {{para|lk|off}}, the abbreviation is rendered as "{{circa|lk=no}}", without a wikilink or abbreviation element. If it is absent, or set to {{para|lk|abbr}}, the abbreviation is rendered with the HTML <code><abbr></code> element. If it is set to {{para|lk|yes}} or {{para|lk|on}}, it is rendered as "{{circa|lk=yes}}", with a wikilink to the ''[[:wikt:circa]]'' article in Wiktionary and <em>not</em> an abbreviation element. <code>lk=no</code> can be used to avoid [[WP:Overlinking|overlinking]] when this template is used repeatedly in the body of an article. For example:
* <code><nowiki>[[Dionysius Exiguus]] was born {{circa|470}}, lived in Rome from {{circa|lk=no|500}}, and died {{circa|lk=no|544}}.</nowiki></code>
*:→ [[Dionysius Exiguus]] was born {{circa|470}}, lived in Rome from {{circa|lk=no|500}}, and died {{circa|lk=no|544}}.
{{circa/doc/sortable}}
==Tracking categories==
*{{clc|Pages using circa with unknown parameters}}
==See also==
*{{tl|cx}}{{snd}}a shortcut with {{para|lk|no}}
*{{tl|Born in}}
*{{tl|Died in}}
*{{tl|Ante}}
*{{tl|Floruit}}
*{{tl|Married in}}
*{{tl|Reign}}
*[[Tempore]]
==TemplateData==
{{templatedata header}}
<templatedata>
{
"params": {
"1": {
"label": "year",
"type": "string",
"suggested": true,
"description": "An approximate date",
"example": "1965"
},
"2": {
"label": "end year",
"type": "string",
"description": "Use when the start and end dates of a range are both approximate.",
"example": "1980"
},
"sortable": {
"label": "sortable",
"description": "Set to “yes” for values in sortable tables",
"suggestedvalues": [
"yes"
],
"default": "yes"
},
"lk": {
"label": "link",
"description": "If ‘on’, a link is added to the wiktionary article for circa. If ‘off’, the c. does not link or tooltip “circa”. Should be set to ‘off’ for the second and subsequent uses of this template. (Values ‘yes’ or ‘no’ may also be used.)",
"type": "string",
"suggestedvalues": [
"on",
"off"
]
}
},
"paramOrder": [
"1",
"2",
"lk",
"sortable"
],
"description": "This template generates an abbreviation for circa."
}
</templatedata>
<includeonly>{{Sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Time and date abbreviation templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
5k9pqwivrqvyme8x4kmzru38jy7uhze
33613
33612
2026-11-12T07:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Circa/doc]]
33612
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Categories go where indicated at the bottom of this page, please; interwikis go to Wikidata (see also: [[Wikipedia:Wikidata]]). -->
{{High-use}}
{{COinS safe|n|addtext=<br />The CS1 and CS2 templates have limited [[Help:Citation_Style_1#Date_format_compliance_with_Wikipedia's_Manual_of_Style|support]] for <code>c.</code> as an abbreviation in the date fields.}}
{{Lua|Module:Check for unknown parameters}}
{{Template shortcut|c.}}
==Usage==
This template generates an abbreviation for ''[[wikt:circa#English|circa]]'': {{circa}} By default the abbreviation is marked with an HTML <code><abbr></code> tag, which in most browsers renders as a [[tooltip]] when hovered.
===Examples===
{| class="wikitable"
|-
! Syntax
! What it looks like
! Notes
|-
| <code><nowiki>{{circa|1325}}</nowiki></code>
| {{circa|1325}}
| rowspan="2" | Default style: no line break allowed; thin space
|-
| <code><nowiki>{{circa|1325 BCE}}</nowiki></code>
| {{circa|1325 BCE}}
|-
| <code><nowiki>{{circa|1325|lk=yes}}</nowiki></code>
| {{circa|1325|lk=yes}}
| Replace abbreviation tooltip with a link to Wiktionary instead
|-
| <code><nowiki>{{circa|1325|lk=no}}</nowiki></code>
| {{circa|1325|lk=no}}
| Removes the dotted line by replacing the abbreviation tooltip (equivalent to {{tl|abbr}}) with a title tooltip (equivalent to {{tl|tooltip}})
|-
| <code><nowiki>{{circa|1000|1050}}</nowiki></code>
| {{circa|1000|1050}}
| For a range with both dates approximate. No tooltip on the second instance of "c."
|-
| <code><nowiki>{{circa|1000–1050}}</nowiki></code>
| {{circa|1000–1050}}
| Another option for a range; but, per [[MOS:CIRCA]], prefer <code><nowiki>{{circa|1000|1050}}</nowiki></code>
|}
===Parameters===
Using the date itself as parameter (for example, <code><nowiki>{{circa|1956}}</nowiki></code>, giving "{{circa|1956}}"), web browsers do not insert a line break anywhere in the string. By contrast, <code><nowiki>{{circa}} 1956</nowiki></code> allows a line break between the "{{circa}}" and the number. Also, with the date as a parameter a thinner space is used with many browsers:
* "{{circa|1956}}" is generated by <code><nowiki>{{circa|1956}}</nowiki></code>.
* "{{circa}} 1956" is generated by <code><nowiki>{{circa}} 1956</nowiki></code>.
If the parameter {{para|lk}} (for "link") is set as {{para|lk|no}} or {{para|lk|off}}, the abbreviation is rendered as "{{circa|lk=no}}", without a wikilink or abbreviation element. If it is absent, or set to {{para|lk|abbr}}, the abbreviation is rendered with the HTML <code><abbr></code> element. If it is set to {{para|lk|yes}} or {{para|lk|on}}, it is rendered as "{{circa|lk=yes}}", with a wikilink to the ''[[:wikt:circa]]'' article in Wiktionary and <em>not</em> an abbreviation element. <code>lk=no</code> can be used to avoid [[WP:Overlinking|overlinking]] when this template is used repeatedly in the body of an article. For example:
* <code><nowiki>[[Dionysius Exiguus]] was born {{circa|470}}, lived in Rome from {{circa|lk=no|500}}, and died {{circa|lk=no|544}}.</nowiki></code>
*:→ [[Dionysius Exiguus]] was born {{circa|470}}, lived in Rome from {{circa|lk=no|500}}, and died {{circa|lk=no|544}}.
{{circa/doc/sortable}}
==Tracking categories==
*{{clc|Pages using circa with unknown parameters}}
==See also==
*{{tl|cx}}{{snd}}a shortcut with {{para|lk|no}}
*{{tl|Born in}}
*{{tl|Died in}}
*{{tl|Ante}}
*{{tl|Floruit}}
*{{tl|Married in}}
*{{tl|Reign}}
*[[Tempore]]
==TemplateData==
{{templatedata header}}
<templatedata>
{
"params": {
"1": {
"label": "year",
"type": "string",
"suggested": true,
"description": "An approximate date",
"example": "1965"
},
"2": {
"label": "end year",
"type": "string",
"description": "Use when the start and end dates of a range are both approximate.",
"example": "1980"
},
"sortable": {
"label": "sortable",
"description": "Set to “yes” for values in sortable tables",
"suggestedvalues": [
"yes"
],
"default": "yes"
},
"lk": {
"label": "link",
"description": "If ‘on’, a link is added to the wiktionary article for circa. If ‘off’, the c. does not link or tooltip “circa”. Should be set to ‘off’ for the second and subsequent uses of this template. (Values ‘yes’ or ‘no’ may also be used.)",
"type": "string",
"suggestedvalues": [
"on",
"off"
]
}
},
"paramOrder": [
"1",
"2",
"lk",
"sortable"
],
"description": "This template generates an abbreviation for circa."
}
</templatedata>
<includeonly>{{Sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Time and date abbreviation templates]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
5k9pqwivrqvyme8x4kmzru38jy7uhze
Tempilet:Circa/doc/sortable
10
2758
33614
2024-09-27T21:05:27Z
en>1234qwer1234qwer4
0
Disambiguating links to [[Help:Sorting]] (link changed to [[Help:Sortable tables]]) using [[User:Qwertyytrewqqwerty/DisamAssist|DisamAssist]].
33614
wikitext
text/x-wiki
If the parameter "<code>sortable=yes</code>" is specified, the template generates invisible text that will cause the column to sort correctly in [[Help:Sortable tables|sortable]] [[Help:Tables|tables]]. However, it is at the cost of having that invisible text read out audibly by many [[Screen reader|screen readers]]. "Col 1" without the template does not sort correctly. "Col 2" with the template and <code>sortable=yes</code> sorts correctly.
<div style="display:inline-table; vertical-align:top;">
{| class="sortable wikitable" style=text-align:right;
|-
! Title!!Col 1!!Col 2
|-
| style=text-align:left; | Foo|| 1066|| 1066
|-
| style=text-align:left; | Bar|| c. 1510|| {{circa|1510|sortable=yes}}
|-
| style=text-align:left; | Baz|| 1956|| 1956
|-
| style=text-align:left; | Jaz|| c. 410|| {{circa|410|sortable=yes}}
|}
</div>
<div style="display:inline-table; vertical-align:top;">
<syntaxhighlight lang=wikitext>
{| class="sortable wikitable" style=text-align:right;
|-
! Title!!Col 1!!Col 2
|-
| style=text-align:left; | Foo|| 1066|| 1066
|-
| style=text-align:left; | Bar|| c. 1510|| {{circa|1510|sortable=yes}}
|-
| style=text-align:left; | Baz|| 1956|| 1956
|-
| style=text-align:left; | Jaz|| c. 410|| {{circa|410|sortable=yes}}
|}
</syntaxhighlight>
</div>
gv770jbfh6rn7nmmvxd9gt0163dd0sk
33615
33614
2026-11-12T07:30:58Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Circa/doc/sortable]]
33614
wikitext
text/x-wiki
If the parameter "<code>sortable=yes</code>" is specified, the template generates invisible text that will cause the column to sort correctly in [[Help:Sortable tables|sortable]] [[Help:Tables|tables]]. However, it is at the cost of having that invisible text read out audibly by many [[Screen reader|screen readers]]. "Col 1" without the template does not sort correctly. "Col 2" with the template and <code>sortable=yes</code> sorts correctly.
<div style="display:inline-table; vertical-align:top;">
{| class="sortable wikitable" style=text-align:right;
|-
! Title!!Col 1!!Col 2
|-
| style=text-align:left; | Foo|| 1066|| 1066
|-
| style=text-align:left; | Bar|| c. 1510|| {{circa|1510|sortable=yes}}
|-
| style=text-align:left; | Baz|| 1956|| 1956
|-
| style=text-align:left; | Jaz|| c. 410|| {{circa|410|sortable=yes}}
|}
</div>
<div style="display:inline-table; vertical-align:top;">
<syntaxhighlight lang=wikitext>
{| class="sortable wikitable" style=text-align:right;
|-
! Title!!Col 1!!Col 2
|-
| style=text-align:left; | Foo|| 1066|| 1066
|-
| style=text-align:left; | Bar|| c. 1510|| {{circa|1510|sortable=yes}}
|-
| style=text-align:left; | Baz|| 1956|| 1956
|-
| style=text-align:left; | Jaz|| c. 410|| {{circa|410|sortable=yes}}
|}
</syntaxhighlight>
</div>
gv770jbfh6rn7nmmvxd9gt0163dd0sk
Tempilet:Flex list
10
2759
33616
2025-05-22T19:42:14Z
en>Izno
0
rm whitespace
33616
wikitext
text/x-wiki
<templatestyles src="Template:Flex list/styles.css" />{{#invoke:list|unbulleted|class=flex-list flex-list-{{{width|3em}}} {{#ifeq:{{{grow|}}}|y|flex-list-grow}}}}<noinclude>{{Documentation}}</noinclude>
eu4zxmdhlhizpv8hns67h65i9fztmpl
33617
33616
2026-11-12T07:31:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Flex_list]]
33616
wikitext
text/x-wiki
<templatestyles src="Template:Flex list/styles.css" />{{#invoke:list|unbulleted|class=flex-list flex-list-{{{width|3em}}} {{#ifeq:{{{grow|}}}|y|flex-list-grow}}}}<noinclude>{{Documentation}}</noinclude>
eu4zxmdhlhizpv8hns67h65i9fztmpl
Tempilet:IPA link
10
2760
33618
2026-04-27T03:31:06Z
en>Pppery
0
Changed protection settings for "[[Template:IPA link]]" ([Edit=Require extended confirmed access] (indefinite) [Move=Require administrator access] (indefinite))
33618
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
99tmmy1kbwuscys61iyebbrezcxtb14
33619
33618
2026-11-12T07:31:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPA_link]]
33618
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
99tmmy1kbwuscys61iyebbrezcxtb14
Tempilet:IPAlink
10
2761
33620
2017-05-04T08:40:58Z
en>AnomieBOT
0
[[User:AnomieBOT/docs/TemplateSubster|Substing templates]]: {{Redr}}. See [[User:AnomieBOT/docs/TemplateSubster]] for info.
33620
wikitext
text/x-wiki
#REDIRECT [[Template:IPA link]]
{{redirect category shell|{{R from move}}{{R from modification}}}}
mxz0uc6va7ill496j4n81gtvqbgdbyo
33621
33620
2026-11-12T07:31:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPAlink]]
33620
wikitext
text/x-wiki
#REDIRECT [[Template:IPA link]]
{{redirect category shell|{{R from move}}{{R from modification}}}}
mxz0uc6va7ill496j4n81gtvqbgdbyo
Tempilet:Flex list/doc
10
2762
33622
2025-07-24T16:46:25Z
en>GhostInTheMachine
0
add a couple of clears so that the text and example line up
33622
wikitext
text/x-wiki
{{Documentation subpage}}
{{Lua|Module:List}}
{{Uses TemplateStyles|Template:Flex list/styles.css}}
This template is used to put entries to a grid. It is often used in letter articles, such as [[A]].
{{-}}
For example: <syntaxhighlight lang="wikitext">{{flex list|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}]|{{IPAc-en|eɪ}}}}</syntaxhighlight> inside {{tl|Infobox grapheme}} gives:
{{Infobox grapheme
| phonemes ={{flex list|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}]|{{IPAc-en|eɪ}}}}
}}
{{-}}
When add |width=2em, it gives:
{{Infobox grapheme
| phonemes ={{flex list|width=2em|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}]|{{IPAc-en|eɪ}}}}
}}
<includeonly>{{sandbox other||
<!-- Categories below this line -->
[[Category:List formatting and function templates]]
}}</includeonly>
gy4rmngg4a52bih1hhg867j34cecvkx
33623
33622
2026-11-12T07:31:43Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Flex_list/doc]]
33622
wikitext
text/x-wiki
{{Documentation subpage}}
{{Lua|Module:List}}
{{Uses TemplateStyles|Template:Flex list/styles.css}}
This template is used to put entries to a grid. It is often used in letter articles, such as [[A]].
{{-}}
For example: <syntaxhighlight lang="wikitext">{{flex list|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}]|{{IPAc-en|eɪ}}}}</syntaxhighlight> inside {{tl|Infobox grapheme}} gives:
{{Infobox grapheme
| phonemes ={{flex list|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}]|{{IPAc-en|eɪ}}}}
}}
{{-}}
When add |width=2em, it gives:
{{Infobox grapheme
| phonemes ={{flex list|width=2em|[{{IPAlink|a}}]|[{{IPAlink|ɑ}}]|[{{IPAlink|ɒ}}]|[{{IPAlink|æ}}]|[{{IPAlink|ə}}]|[{{IPAlink|ɛ}}]|[{{IPAlink|oː}}]|[{{IPAlink|ɔ}}]|[{{IPAlink|e}}]|[{{IPAlink|ʕ}}]|[{{IPAlink|ʌ}}]|{{IPAc-en|eɪ}}}}
}}
<includeonly>{{sandbox other||
<!-- Categories below this line -->
[[Category:List formatting and function templates]]
}}</includeonly>
gy4rmngg4a52bih1hhg867j34cecvkx
Tempilet:Flex list/styles.css
10
2763
33624
2025-05-22T19:48:37Z
en>Izno
0
duplicate
33624
sanitized-css
text/css
.flex-list ul {
display: flex; /* eat whitespace */
flex-wrap: wrap;
margin: 0;
padding: 0;
}
.flex-list li {
text-align: center;
padding: 0 0.25em;
}
.flex-list-2em li {
min-width: 1.5em;
}
.flex-list-3em li {
min-width: 2.5em;
}
.flex-list-grow li {
flex-grow: 1;
}
1iunx5sz93zvxkdx5l2m9uq65bffll3
33625
33624
2026-11-12T07:31:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Flex_list/styles.css]]
33624
sanitized-css
text/css
.flex-list ul {
display: flex; /* eat whitespace */
flex-wrap: wrap;
margin: 0;
padding: 0;
}
.flex-list li {
text-align: center;
padding: 0 0.25em;
}
.flex-list-2em li {
min-width: 1.5em;
}
.flex-list-3em li {
min-width: 2.5em;
}
.flex-list-grow li {
flex-grow: 1;
}
1iunx5sz93zvxkdx5l2m9uq65bffll3
Tempilet:Latin letter info
10
2764
33626
2021-07-30T14:46:22Z
en>Izno
0
remove cruft
33626
wikitext
text/x-wiki
#redirect [[Template:Latin alphabet sidebar]]
9fjo84dt4jcn23pwsvgh962c66y2akd
33627
33626
2026-11-12T07:33:18Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Latin_letter_info]]
33626
wikitext
text/x-wiki
#redirect [[Template:Latin alphabet sidebar]]
9fjo84dt4jcn23pwsvgh962c66y2akd