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]]&nbsp;&nbsp;[[File:2023 Facebook icon.svg|30px|link=https://www.facebook.com/61590521903033/]]&nbsp;&nbsp;[[File:Tango style Wikipedia Icon.svg|30px|link=w:bol:]]&nbsp;&nbsp;[[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=]]&nbsp;&nbsp;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=]]&nbsp;&nbsp; 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=]]&nbsp;&nbsp; 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=]]&nbsp;&nbsp;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=]]&nbsp;&nbsp;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=]]&nbsp;&nbsp;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 '&nbsp;') .. (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 '&nbsp;') .. 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('&nbsp;', ' '):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 '&nbsp;') .. (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 '&nbsp;') .. 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('&nbsp;', ' '):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&ndash;1978, 1987&ndash;1999, 2009&ndash;2011,<br>2012&ndash;present) | other_party = {{unbulleted list | [[Reform Party of the United States of America|Reform]] (1999&ndash;2001) | [[Democratic Party (United States)|Democratic]] (2001&ndash;2009) | [[Independent politician|Independent]] (2011&ndash;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&ndash;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&ndash;1978, 1987&ndash;1999, 2009&ndash;2011,<br>2012&ndash;present) | other_party = {{unbulleted list | [[Reform Party of the United States of America|Reform]] (1999&ndash;2001) | [[Democratic Party (United States)|Democratic]] (2001&ndash;2009) | [[Independent politician|Independent]] (2011&ndash;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&ndash;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]', { ['['] = '&#91;', [']'] = '&#93;', ['\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 .. '&nbsp;', '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("&mdash;", 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 ('&nbsp;',''); -- count nbsps -- There is exactly 1 semicolon per &nbsp; 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&#035') or url:match ('%.pdf&#035'); 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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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]', { ['['] = '&#91;', [']'] = '&#93;', ['\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 .. '&nbsp;', '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("&mdash;", 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 ('&nbsp;',''); -- count nbsps -- There is exactly 1 semicolon per &nbsp; 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&#035') or url:match ('%.pdf&#035'); 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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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&nbsp;ed.)', ['episode'] = 'Episode $1', ['et al'] = 'et&nbsp;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">&#124;$1=</code> / <code class="cs1-code">&#124;$2=</code> mismatch', -- $1 is year param name; $2 is date param name ['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]:&nbsp;$1', ['notitle'] = 'No title', -- for |title=(()) and (in the future) |title=none ['original'] = 'the original', ['origdate'] = ' [$1]', ['retrieved'] = 'Retrieved $1', ['season'] = 'Season $1', ['section'] = '§&nbsp;$1', ['sections'] = '§§&nbsp;$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.&nbsp;$2', -- $1 is sepc; bold journal style volume is in presentation{} ['vol-no'] = '$1 Vol.&nbsp;$2, no.&nbsp;$3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization) ['issue'] = '$1 No.&nbsp;$2', -- $1 is sepc ['art'] = '$1 Art.&nbsp;$2', -- $1 is sepc; for {{cite conference}} only ['vol-art'] = '$1 Vol.&nbsp;$2, art.&nbsp;$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.&nbsp;$2", -- $1 is sepc ['pp-prefix'] = "$1 pp.&nbsp;$2", -- $1 is sepc ['j-page(s)'] = ': $1', -- same for page and pages ['sheet'] = '$1 Sheet&nbsp;$2', -- $1 is sepc ['sheets'] = '$1 Sheets&nbsp;$2', -- $1 is sepc ['j-sheet'] = ': Sheet&nbsp;$1', ['j-sheets'] = ': Sheets&nbsp;$1', ['language'] = '(in $1)', ['via'] = " &ndash; 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;">&#123;{$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;">&#123;{$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 &#8239; 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">&#124;$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'] = "&#91;''$1''&#93;", ['trans-quoted-title'] = "&#91;$1&#93;", -- 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]?%.&nbsp;', -- 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">&#124;access-date=</code> requires <code class="cs1-code">&#124;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">&#124;$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">&#124;archive-date=</code> requires <code class="cs1-code">&#124;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">&#124;archive-date=</code> / <code class="cs1-code">&#124;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">&#124;archive-url=</code> requires <code class="cs1-code">&#124;archive-date=</code>', anchor = 'archive_missing_date', category = 'CS1 errors: archive-url', hidden = false }, err_archive_missing_url = { message = '<code class="cs1-code">&#124;archive-url=</code> requires <code class="cs1-code">&#124;url=</code>', anchor = 'archive_missing_url', category = 'CS1 errors: archive-url', hidden = false }, err_archive_url = { message = '<code class="cs1-code">&#124;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">&#124;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">&#124;$1=</code> requires <code class="cs1-code">&#124;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">&#124;arxiv=</code> value', anchor = 'bad_arxiv', category = 'CS1 errors: arXiv', hidden = false }, err_bad_asin = { message = 'Check <code class="cs1-code">&#124;asin=</code> value', anchor = 'bad_asin', category ='CS1 errors: ASIN', hidden = false }, err_bad_asin_tld = { message = 'Check <code class="cs1-code">&#124;asin-tld=</code> value', anchor = 'bad_asin_tld', category ='CS1 errors: ASIN TLD', hidden = false }, err_bad_bibcode = { message = 'Check <code class="cs1-code">&#124;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">&#124;biorxiv=</code> value', anchor = 'bad_biorxiv', category = 'CS1 errors: bioRxiv', hidden = false }, err_bad_citeseerx = { message = 'Check <code class="cs1-code">&#124;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">&#124;doi=</code> value', anchor = 'bad_doi', category = 'CS1 errors: DOI', hidden = false }, err_bad_hdl = { message = 'Check <code class="cs1-code">&#124;hdl=</code> value', anchor = 'bad_hdl', category = 'CS1 errors: HDL', hidden = false }, err_bad_isbn = { message = 'Check <code class="cs1-code">&#124;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">&#124;ismn=</code> value', anchor = 'bad_ismn', category = 'CS1 errors: ISMN', hidden = false }, err_bad_issn = { message = 'Check <code class="cs1-code">&#124;$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">&#124;jfm=</code> value', anchor = 'bad_jfm', category = 'CS1 errors: JFM', hidden = false }, err_bad_jstor = { message = 'Check <code class="cs1-code">&#124;jstor=</code> value', anchor = 'bad_jstor', category = 'CS1 errors: JSTOR', hidden = false }, err_bad_lccn = { message = 'Check <code class="cs1-code">&#124;lccn=</code> value', anchor = 'bad_lccn', category = 'CS1 errors: LCCN', hidden = false }, err_bad_medrxiv = { message = 'Check <code class="cs1-code">&#124;medrxiv=</code> value', anchor = 'bad_medrxiv', category = 'CS1 errors: medRxiv', hidden = false }, err_bad_mr = { message = 'Check <code class="cs1-code">&#124;mr=</code> value', anchor = 'bad_mr', category = 'CS1 errors: MR', hidden = false }, err_bad_oclc = { message = 'Check <code class="cs1-code">&#124;oclc=</code> value', anchor = 'bad_oclc', category = 'CS1 errors: OCLC', hidden = false }, err_bad_ol = { message = 'Check <code class="cs1-code">&#124;ol=</code> value', anchor = 'bad_ol', category = 'CS1 errors: OL', hidden = false }, err_bad_osti = { message = 'Check <code class="cs1-code">&#124;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">&#124;$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">&#124;pmc=</code> value', anchor = 'bad_pmc', category = 'CS1 errors: PMC', hidden = false }, err_bad_pmid = { message = 'Check <code class="cs1-code">&#124;pmid=</code> value', anchor = 'bad_pmid', category = 'CS1 errors: PMID', hidden = false }, err_bad_rfc = { message = 'Check <code class="cs1-code">&#124;rfc=</code> value', anchor = 'bad_rfc', category = 'CS1 errors: RFC', hidden = false }, err_bad_s2cid = { message = 'Check <code class="cs1-code">&#124;s2cid=</code> value', anchor = 'bad_s2cid', category = 'CS1 errors: S2CID', hidden = false }, err_bad_sbn = { message = 'Check <code class="cs1-code">&#124;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">&#124;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">&#124;message-id=</code> value', anchor = 'bad_message_id', category = 'CS1 errors: message-id', hidden = false }, err_bad_zbl = { message = 'Check <code class="cs1-code">&#124;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">&#124;biorxiv=</code> required', anchor = 'biorxiv_missing', category = 'CS1 errors: bioRxiv', -- same as bad bioRxiv hidden = false }, err_chapter_ignored = { message = '<code class="cs1-code">&#124;$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">&#124;$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">&#124;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">&#124;url=</code>', anchor = 'cite_web_url', category = 'CS1 errors: requires URL', hidden = false }, err_class_ignored = { message = '<code class="cs1-code">&#124;class=</code> ignored', anchor = 'class_ignored', category = 'CS1 errors: class', hidden = false }, err_contributor_ignored = { message = '<code class="cs1-code">&#124;contributor=</code> ignored', anchor = 'contributor_ignored', category = 'CS1 errors: contributor', hidden = false }, err_contributor_missing_required_param = { message = '<code class="cs1-code">&#124;contributor=</code> requires <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> requires <code class="cs1-code">&#124;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">&#124;$1=</code> requires <code class="cs1-code">&#124;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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> missing <code class="cs1-code">&#124;$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">&#124;$1=</code> requires <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$1-access=</code> requires <code class="cs1-code">&#124;$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">&#124;$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">&#124;$1=</code> ignored (<code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;trans-$1=</code> requires <code class="cs1-code">&#124;$1=</code> or <code class="cs1-code">&#124;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">&#124;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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, } --[[--------------------------< 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&nbsp;ed.)', ['episode'] = 'Episode $1', ['et al'] = 'et&nbsp;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">&#124;$1=</code> / <code class="cs1-code">&#124;$2=</code> mismatch', -- $1 is year param name; $2 is date param name ['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]:&nbsp;$1', ['notitle'] = 'No title', -- for |title=(()) and (in the future) |title=none ['original'] = 'the original', ['origdate'] = ' [$1]', ['retrieved'] = 'Retrieved $1', ['season'] = 'Season $1', ['section'] = '§&nbsp;$1', ['sections'] = '§§&nbsp;$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.&nbsp;$2', -- $1 is sepc; bold journal style volume is in presentation{} ['vol-no'] = '$1 Vol.&nbsp;$2, no.&nbsp;$3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization) ['issue'] = '$1 No.&nbsp;$2', -- $1 is sepc ['art'] = '$1 Art.&nbsp;$2', -- $1 is sepc; for {{cite conference}} only ['vol-art'] = '$1 Vol.&nbsp;$2, art.&nbsp;$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.&nbsp;$2", -- $1 is sepc ['pp-prefix'] = "$1 pp.&nbsp;$2", -- $1 is sepc ['j-page(s)'] = ': $1', -- same for page and pages ['sheet'] = '$1 Sheet&nbsp;$2', -- $1 is sepc ['sheets'] = '$1 Sheets&nbsp;$2', -- $1 is sepc ['j-sheet'] = ': Sheet&nbsp;$1', ['j-sheets'] = ': Sheets&nbsp;$1', ['language'] = '(in $1)', ['via'] = " &ndash; 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;">&#123;{$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;">&#123;{$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 &#8239; 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">&#124;$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'] = "&#91;''$1''&#93;", ['trans-quoted-title'] = "&#91;$1&#93;", -- 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]?%.&nbsp;', -- 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">&#124;access-date=</code> requires <code class="cs1-code">&#124;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">&#124;$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">&#124;archive-date=</code> requires <code class="cs1-code">&#124;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">&#124;archive-date=</code> / <code class="cs1-code">&#124;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">&#124;archive-url=</code> requires <code class="cs1-code">&#124;archive-date=</code>', anchor = 'archive_missing_date', category = 'CS1 errors: archive-url', hidden = false }, err_archive_missing_url = { message = '<code class="cs1-code">&#124;archive-url=</code> requires <code class="cs1-code">&#124;url=</code>', anchor = 'archive_missing_url', category = 'CS1 errors: archive-url', hidden = false }, err_archive_url = { message = '<code class="cs1-code">&#124;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">&#124;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">&#124;$1=</code> requires <code class="cs1-code">&#124;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">&#124;arxiv=</code> value', anchor = 'bad_arxiv', category = 'CS1 errors: arXiv', hidden = false }, err_bad_asin = { message = 'Check <code class="cs1-code">&#124;asin=</code> value', anchor = 'bad_asin', category ='CS1 errors: ASIN', hidden = false }, err_bad_asin_tld = { message = 'Check <code class="cs1-code">&#124;asin-tld=</code> value', anchor = 'bad_asin_tld', category ='CS1 errors: ASIN TLD', hidden = false }, err_bad_bibcode = { message = 'Check <code class="cs1-code">&#124;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">&#124;biorxiv=</code> value', anchor = 'bad_biorxiv', category = 'CS1 errors: bioRxiv', hidden = false }, err_bad_citeseerx = { message = 'Check <code class="cs1-code">&#124;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">&#124;doi=</code> value', anchor = 'bad_doi', category = 'CS1 errors: DOI', hidden = false }, err_bad_hdl = { message = 'Check <code class="cs1-code">&#124;hdl=</code> value', anchor = 'bad_hdl', category = 'CS1 errors: HDL', hidden = false }, err_bad_isbn = { message = 'Check <code class="cs1-code">&#124;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">&#124;ismn=</code> value', anchor = 'bad_ismn', category = 'CS1 errors: ISMN', hidden = false }, err_bad_issn = { message = 'Check <code class="cs1-code">&#124;$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">&#124;jfm=</code> value', anchor = 'bad_jfm', category = 'CS1 errors: JFM', hidden = false }, err_bad_jstor = { message = 'Check <code class="cs1-code">&#124;jstor=</code> value', anchor = 'bad_jstor', category = 'CS1 errors: JSTOR', hidden = false }, err_bad_lccn = { message = 'Check <code class="cs1-code">&#124;lccn=</code> value', anchor = 'bad_lccn', category = 'CS1 errors: LCCN', hidden = false }, err_bad_medrxiv = { message = 'Check <code class="cs1-code">&#124;medrxiv=</code> value', anchor = 'bad_medrxiv', category = 'CS1 errors: medRxiv', hidden = false }, err_bad_mr = { message = 'Check <code class="cs1-code">&#124;mr=</code> value', anchor = 'bad_mr', category = 'CS1 errors: MR', hidden = false }, err_bad_oclc = { message = 'Check <code class="cs1-code">&#124;oclc=</code> value', anchor = 'bad_oclc', category = 'CS1 errors: OCLC', hidden = false }, err_bad_ol = { message = 'Check <code class="cs1-code">&#124;ol=</code> value', anchor = 'bad_ol', category = 'CS1 errors: OL', hidden = false }, err_bad_osti = { message = 'Check <code class="cs1-code">&#124;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">&#124;$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">&#124;pmc=</code> value', anchor = 'bad_pmc', category = 'CS1 errors: PMC', hidden = false }, err_bad_pmid = { message = 'Check <code class="cs1-code">&#124;pmid=</code> value', anchor = 'bad_pmid', category = 'CS1 errors: PMID', hidden = false }, err_bad_rfc = { message = 'Check <code class="cs1-code">&#124;rfc=</code> value', anchor = 'bad_rfc', category = 'CS1 errors: RFC', hidden = false }, err_bad_s2cid = { message = 'Check <code class="cs1-code">&#124;s2cid=</code> value', anchor = 'bad_s2cid', category = 'CS1 errors: S2CID', hidden = false }, err_bad_sbn = { message = 'Check <code class="cs1-code">&#124;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">&#124;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">&#124;message-id=</code> value', anchor = 'bad_message_id', category = 'CS1 errors: message-id', hidden = false }, err_bad_zbl = { message = 'Check <code class="cs1-code">&#124;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">&#124;biorxiv=</code> required', anchor = 'biorxiv_missing', category = 'CS1 errors: bioRxiv', -- same as bad bioRxiv hidden = false }, err_chapter_ignored = { message = '<code class="cs1-code">&#124;$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">&#124;$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">&#124;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">&#124;url=</code>', anchor = 'cite_web_url', category = 'CS1 errors: requires URL', hidden = false }, err_class_ignored = { message = '<code class="cs1-code">&#124;class=</code> ignored', anchor = 'class_ignored', category = 'CS1 errors: class', hidden = false }, err_contributor_ignored = { message = '<code class="cs1-code">&#124;contributor=</code> ignored', anchor = 'contributor_ignored', category = 'CS1 errors: contributor', hidden = false }, err_contributor_missing_required_param = { message = '<code class="cs1-code">&#124;contributor=</code> requires <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> requires <code class="cs1-code">&#124;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">&#124;$1=</code> requires <code class="cs1-code">&#124;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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$1=</code> missing <code class="cs1-code">&#124;$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">&#124;$1=</code> requires <code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$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">&#124;$1-access=</code> requires <code class="cs1-code">&#124;$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">&#124;$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">&#124;$1=</code> ignored (<code class="cs1-code">&#124;$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">&#124;$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">&#124;$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">&#124;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">&#124;trans-$1=</code> requires <code class="cs1-code">&#124;$1=</code> or <code class="cs1-code">&#124;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">&#124;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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', 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 = '&nbsp;', 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 = '&nbsp;', }, ['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 = '&nbsp;', }, } --[[--------------------------< 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 (&ndash; etc.) with hyphens; do we need to replace numerical entities like &#32; 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;">&#39;(s?)</span>', "'%1"); -- replace {{'}} or {{'s}} with simple apostrophe or apostrophe-s value = value:gsub ('&nbsp;', ' '); -- replace &nbsp; 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 ('&zwj;', ''); -- remove &zwj; 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 (&ndash; etc.) with hyphens; do we need to replace numerical entities like &#32; 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;">&#39;(s?)</span>', "'%1"); -- replace {{'}} or {{'s}} with simple apostrophe or apostrophe-s value = value:gsub ('&nbsp;', ' '); -- replace &nbsp; 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 ('&zwj;', ''); -- remove &zwj; 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("&#123;&#123;%s[[%s|%s]]&#125;&#125;", 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("&#123;&#123;%s%s&#125;&#125;", 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("&#123;&#123;%s[[%s|%s]]&#125;&#125;", 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("&#123;&#123;%s%s&#125;&#125;", 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, "{", "&#x7B;") section = string.gsub(section, "}", "&#x7D;") 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 = '§&nbsp;' .. 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 = '&#8203; and ' else conjunction = ', and ' end ret = mw.text.listToText(ret, nil, conjunction) -- Add the intro text. local intro = '§§&nbsp;' 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, "{", "&#x7B;") section = string.gsub(section, "}", "&#x7D;") 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 = '§&nbsp;' .. 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 = '&#8203; and ' else conjunction = ', and ' end ret = mw.text.listToText(ret, nil, conjunction) -- Add the intro text. local intro = '§§&nbsp;' 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>&lbrack;[[Special:Edit/%s|e]]&rbrack;</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>&lbrack;[[Special:Edit/%s|e]]&rbrack;</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&nbsp;by | Native&nbsp;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|}}}|–}}&nbsp;({{{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|}}}|–}}&nbsp;({{{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&nbsp;in}} | data17 = {{if empty|{{{nation|}}}|{{{official|}}}}} | label18 = {{longitem|class=nowrap|Recognised minority<br />language&nbsp;in}} | data18 = {{#if:{{{minority|}}} |<div style="<!--label17 above almost always linewraps, so:-->vertical-align:middle;">{{{minority}}}</div>}} | label19 = [[List of language regulators|Regulated&nbsp;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}}} }}&nbsp;([[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}}} }}&nbsp;([[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 = &nbsp; | data27 = {{Infobox language/linguistlist|1={{{linglist2|}}}|2={{{lingname2|}}}}} | label28 = &nbsp; | data28 = {{Infobox language/linguistlist|1={{{linglist3|}}}|2={{{lingname3|}}}}} | label29 = &nbsp; | data29 = {{Infobox language/linguistlist|1={{{linglist4|}}}|2={{{lingname4|}}}}} | label30 = &nbsp; | data30 = {{Infobox language/linguistlist|1={{{linglist5|}}}|2={{{lingname5|}}}}} | label31 = &nbsp; | 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|}}}|&nbsp; {{{glottoname}}}}}}}}}}}<!-- -->{{#if:{{{glotto2|}}}|{{#if:{{{glotto|}}}|<br />|<!--no break when more than one box on a page-->}}<code>{{glottolink|{{{glotto2}}}}}</code>{{#if:{{{glottoname2|}}}|&nbsp; {{{glottoname2}}}}}}}<!-- -->{{#if:{{{glotto3|}}}|{{#if:{{{glotto2|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto3}}}}}</code>{{#if:{{{glottoname3|}}}|&nbsp; {{{glottoname3}}}}}}}<!-- -->{{#if:{{{glotto4|}}}|{{#if:{{{glotto3|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto4}}}}}</code>{{#if:{{{glottoname4|}}}|&nbsp; {{{glottoname4}}}}}}}<!-- -->{{#if:{{{glotto5|}}}|{{#if:{{{glotto4|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto5}}}}}</code>{{#if:{{{glottoname5|}}}|&nbsp; {{{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|}}}|&nbsp;{{{aiatsisname}}}}} }}{{#if:{{{aiatsis2|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis2}}} {{{aiatsis2}}}]</code>{{#if:{{{aiatsisname2|}}}|&nbsp;{{{aiatsisname2}}}}} }}{{#if:{{{aiatsis3|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis3}}} {{{aiatsis3}}}]</code>{{#if:{{{aiatsisname3|}}}|&nbsp;{{{aiatsisname3}}}}} }}{{#if:{{{aiatsis4|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis4}}} {{{aiatsis4}}}]</code>{{#if:{{{aiatsisname4|}}}|&nbsp;{{{aiatsisname4}}}}} }}{{#if:{{{aiatsis5|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis5}}} {{{aiatsis5}}}]</code>{{#if:{{{aiatsisname5|}}}|&nbsp;{{{aiatsisname5}}}}} }}{{#if:{{{aiatsis6|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis6}}} {{{aiatsis6}}}]</code>{{#if:{{{aiatsisname6|}}}|&nbsp;{{{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 = &nbsp;<!--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 = &nbsp; | data37 = {{#if:{{{ELP3|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP3}}} {{{ELPname3}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}} | label38 = &nbsp; | data38 = {{#if:{{{ELP4|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP4}}} {{{ELPname4}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}} | label39 = &nbsp; | data39 = {{#if:{{{ELP5|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP5}}} {{{ELPname5}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}} | label40 = &nbsp; | 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 = &nbsp; | data43 = {{Infobox language/lingualist|1={{{lingua2|}}}|2={{{linguaname2|}}}}} | label44 = &nbsp; | data44 = {{Infobox language/lingualist|1={{{lingua3|}}}|2={{{linguaname3|}}}}} | label45 = &nbsp; | data45 = {{Infobox language/lingualist|1={{{lingua4|}}}|2={{{linguaname4|}}}}} | label46 = &nbsp; | data46 = {{Infobox language/lingualist|1={{{lingua5|}}}|2={{{linguaname5|}}}}} | label47 = &nbsp; | data47 = {{Infobox language/lingualist|1={{{lingua6|}}}|2={{{linguaname6|}}}}} | label48 = &nbsp; | data48 = {{Infobox language/lingualist|1={{{lingua7|}}}|2={{{linguaname7|}}}}} | label49 = &nbsp; | data49 = {{Infobox language/lingualist|1={{{lingua8|}}}|2={{{linguaname8|}}}}} | label50 = &nbsp; | data50 = {{Infobox language/lingualist|1={{{lingua9|}}}|2={{{linguaname9|}}}}} | label51 = &nbsp; | 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]] | &nbsp; = [[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&nbsp;by | Native&nbsp;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|}}}|–}}&nbsp;({{{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|}}}|–}}&nbsp;({{{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&nbsp;in}} | data17 = {{if empty|{{{nation|}}}|{{{official|}}}}} | label18 = {{longitem|class=nowrap|Recognised minority<br />language&nbsp;in}} | data18 = {{#if:{{{minority|}}} |<div style="<!--label17 above almost always linewraps, so:-->vertical-align:middle;">{{{minority}}}</div>}} | label19 = [[List of language regulators|Regulated&nbsp;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}}} }}&nbsp;([[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}}} }}&nbsp;([[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 = &nbsp; | data27 = {{Infobox language/linguistlist|1={{{linglist2|}}}|2={{{lingname2|}}}}} | label28 = &nbsp; | data28 = {{Infobox language/linguistlist|1={{{linglist3|}}}|2={{{lingname3|}}}}} | label29 = &nbsp; | data29 = {{Infobox language/linguistlist|1={{{linglist4|}}}|2={{{lingname4|}}}}} | label30 = &nbsp; | data30 = {{Infobox language/linguistlist|1={{{linglist5|}}}|2={{{lingname5|}}}}} | label31 = &nbsp; | 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|}}}|&nbsp; {{{glottoname}}}}}}}}}}}<!-- -->{{#if:{{{glotto2|}}}|{{#if:{{{glotto|}}}|<br />|<!--no break when more than one box on a page-->}}<code>{{glottolink|{{{glotto2}}}}}</code>{{#if:{{{glottoname2|}}}|&nbsp; {{{glottoname2}}}}}}}<!-- -->{{#if:{{{glotto3|}}}|{{#if:{{{glotto2|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto3}}}}}</code>{{#if:{{{glottoname3|}}}|&nbsp; {{{glottoname3}}}}}}}<!-- -->{{#if:{{{glotto4|}}}|{{#if:{{{glotto3|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto4}}}}}</code>{{#if:{{{glottoname4|}}}|&nbsp; {{{glottoname4}}}}}}}<!-- -->{{#if:{{{glotto5|}}}|{{#if:{{{glotto4|}}}|<br />|<!--no break-->}}<code>{{glottolink|{{{glotto5}}}}}</code>{{#if:{{{glottoname5|}}}|&nbsp; {{{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|}}}|&nbsp;{{{aiatsisname}}}}} }}{{#if:{{{aiatsis2|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis2}}} {{{aiatsis2}}}]</code>{{#if:{{{aiatsisname2|}}}|&nbsp;{{{aiatsisname2}}}}} }}{{#if:{{{aiatsis3|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis3}}} {{{aiatsis3}}}]</code>{{#if:{{{aiatsisname3|}}}|&nbsp;{{{aiatsisname3}}}}} }}{{#if:{{{aiatsis4|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis4}}} {{{aiatsis4}}}]</code>{{#if:{{{aiatsisname4|}}}|&nbsp;{{{aiatsisname4}}}}} }}{{#if:{{{aiatsis5|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis5}}} {{{aiatsis5}}}]</code>{{#if:{{{aiatsisname5|}}}|&nbsp;{{{aiatsisname5}}}}} }}{{#if:{{{aiatsis6|}}}|, <code>[https://collection.aiatsis.gov.au/austlang/language/{{{aiatsis6}}} {{{aiatsis6}}}]</code>{{#if:{{{aiatsisname6|}}}|&nbsp;{{{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 = &nbsp;<!--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 = &nbsp; | data37 = {{#if:{{{ELP3|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP3}}} {{{ELPname3}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}} | label38 = &nbsp; | data38 = {{#if:{{{ELP4|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP4}}} {{{ELPname4}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}} | label39 = &nbsp; | data39 = {{#if:{{{ELP5|}}}|[https://www.endangeredlanguages.com/elp-language/{{{ELP5}}} {{{ELPname5}}}]{{Main other|[[Category:Language articles with manual ELP links]]}}}} | label40 = &nbsp; | 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 = &nbsp; | data43 = {{Infobox language/lingualist|1={{{lingua2|}}}|2={{{linguaname2|}}}}} | label44 = &nbsp; | data44 = {{Infobox language/lingualist|1={{{lingua3|}}}|2={{{linguaname3|}}}}} | label45 = &nbsp; | data45 = {{Infobox language/lingualist|1={{{lingua4|}}}|2={{{linguaname4|}}}}} | label46 = &nbsp; | data46 = {{Infobox language/lingualist|1={{{lingua5|}}}|2={{{linguaname5|}}}}} | label47 = &nbsp; | data47 = {{Infobox language/lingualist|1={{{lingua6|}}}|2={{{linguaname6|}}}}} | label48 = &nbsp; | data48 = {{Infobox language/lingualist|1={{{lingua7|}}}|2={{{linguaname7|}}}}} | label49 = &nbsp; | data49 = {{Infobox language/lingualist|1={{{lingua8|}}}|2={{{linguaname8|}}}}} | label50 = &nbsp; | data50 = {{Infobox language/lingualist|1={{{lingua9|}}}|2={{{linguaname9|}}}}} | label51 = &nbsp; | 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]] | &nbsp; = [[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|&#x27E8;{{{1|}}}&#x27E9;}}<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|&#x27E8;{{{1|}}}&#x27E9;}}<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|}}}}}|&nbsp;}}</span>|&nbsp;}}<!-- --></span><!-- -->&nbsp;{{{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|}}}}}|&nbsp;}}</span>|&nbsp;}}<!-- --></span><!-- -->&nbsp;{{{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|&#32;}}}</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|&#32;}}}</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|}}}|&nbsp;–&nbsp;{{{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|}}}|&nbsp;–&nbsp;{{{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 = '&#123;' local rb = '&#125;' 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 = '&#123;' local rb = '&#125;' 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|}}} | &nbsp; (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|}}} | &nbsp; (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.&nbsp;", pages_sep = ", pp.&nbsp;", 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, ' &amp; ', 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, ' &amp; ', 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, ' ', ' &amp; ', 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, ' &amp; ', 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;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities with their characters; semicolon mucks up the text.split str = str:gsub ('&#45;', '-'); -- replace HTML numeric entity with hyphen character str = str:gsub ('&nbsp;', ' '); -- replace &nbsp; 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.&nbsp;", pages_sep = ", pp.&nbsp;", 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, ' &amp; ', 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, ' &amp; ', 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, ' ', ' &amp; ', 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, ' &amp; ', 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;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities with their characters; semicolon mucks up the text.split str = str:gsub ('&#45;', '-'); -- replace HTML numeric entity with hyphen character str = str:gsub ('&nbsp;', ' '); -- replace &nbsp; 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&#039;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_&amp;_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_&amp;_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&#039;_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&#039;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&#039;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&#039;Byrne1849'] = {'Cite NBD1849'}, ['CITEREFO&#039;ConnorRobertson'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;ConnorRobertson1996'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;ConnorRobertson2000'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;ConnorRobertson2004'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;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&#039;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_&amp;_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_&amp;_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&#039;_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&#039;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&#039;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&#039;Byrne1849'] = {'Cite NBD1849'}, ['CITEREFO&#039;ConnorRobertson'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;ConnorRobertson1996'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;ConnorRobertson2000'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;ConnorRobertson2004'] = {'MacTutor Biography', 'MacTutor'}, ['CITEREFO&#039;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}}}}}}}}}&nbsp;([[Script (comics)|w]],&nbsp;[[artist|a]]) }}<!-- -->{{#if:{{{Writer|{{{writer|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|}}}}}}}}}| ,&#32; }}{{{Writer|{{{writer}}}}}}{{#if:{{{Cowriters|{{{cowriters|}}}}}} |,&#32;{{{Cowriters|{{{cowriters|}}}}}} }}&nbsp;([[Script (comics)|w]]) }}<!-- -->{{#if:{{{Artist|{{{artist|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|}}}}}}}}}}}}}}}| ,&#32; }}{{{Artist|{{{artist}}}}}}{{#if:{{{Coartists|{{{coartists|}}}}}} |,&#32;{{{Coartists|{{{coartists}}}}}} }}&nbsp;([[artist|a]]) }}<!-- -->{{#if:{{{Penciller|{{{penciller|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Penciller|{{{penciller}}}}}}{{#if:{{{Copencillers|{{{copencillers|}}}}}} |,&#32;{{{Copencillers|{{{copencillers}}}}}} }}&nbsp;([[penciller|p]]) }}<!-- -->{{#if:{{{Inker|{{{inker|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Inker|{{{inker}}}}}}{{#if:{{{Coinkers|{{{coinkers|}}}}}} |,&#32;{{{Coinkers|{{{coinkers}}}}}} }}&nbsp;([[inker|i]]) }}<!-- -->{{#if:{{{Colorist|{{{colorist|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Colorist|{{{colorist}}}}}}&nbsp;([[colorist|col]]) }}<!-- -->{{#if:{{{Letterer|{{{letterer|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Letterer|{{{letterer}}}}}}&nbsp;([[letterer|let]]) }}<!-- -->{{#if:{{{Editor|{{{editor|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Editor|{{{editor}}}}}}&nbsp;([[Editing|ed]]) }}<!-- -->{{#if:{{{others|}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{others}}} }}<!-- -->{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|{{{others|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| .&#32; }}<!-- -->{{#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|}}}| &#32;({{{format}}}) }}| "{{#invoke:String|replace|source={{{Story|{{{story}}}}}}|pattern="|replace=|count=2}}"{{#if:{{{format|}}}| &#32;({{{format}}}) }} }}{{#if:{{{Title|{{{title|{{{Strip|{{{strip|}}}}}}}}}}}} |&#32;''{{{Title|{{{title|{{{Strip|{{{strip}}}}}}}}}}}}'' | }}| {{#if:{{{url|}}}| ''[{{#ifeq: {{{url-status}}}|live |{{{url}}} |{{if empty|{{{archive-url|}}}|{{{url|}}} }} }} {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}]''{{#if:{{{format|}}}| &#32;({{{format}}}) }}| '' {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}''{{#if:{{{format|}}}| &#32;({{{format}}}) }} }} }}<!-- -->{{#if:{{{Strip|{{{strip|}}}}}}| {{#if: {{{Paper|{{{paper|{{{newspaper|}}}}}}}}} |.&#32;''{{{Paper|{{{paper|{{{newspaper}}}}}}}}}''}}{{#if: {{{Location|{{{location|}}}}}} |&#32;({{{Location|{{{location}}}}}})}}<!-- -->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}} |.&#32;{{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}} }} }}<!-- -->{{#if:{{{Volume|{{{volume|}}}}}} |,&#32;vol.&nbsp;{{{Volume|{{{volume}}}}}} }}<!-- -->{{#if:{{{Issue|{{{issue|}}}}}}| ,&#32;no.&nbsp;{{#invoke:String|replace|source={{{Issue|{{{issue}}}}}}|pattern=#|replace=|count=1}} }}<!-- -->{{#if:{{{Strip|{{{strip|}}}}}}|<!--Strip=true. Else below: -->|<!-- -->{{#if:{{{Page|{{{page|}}}}}} |,&#32;p.&nbsp;{{{Page|{{{page}}}}}} |{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}} |{{#if:{{{at|}}}|,&#32;{{{at}}}|,&#32;pp.&nbsp;{{#invoke:String|replace|source={{{Pages|{{{pages}}}}}}|pattern=-|replace=&ndash;}}}} }} }}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}} }}<!-- -->{{#if:{{{Strip|{{{strip|}}}}}}| {{#if: {{{Supplement|{{{supplement|}}}}}} |&#32;[{{{Supplement|{{{supplement}}}}}}]}}<!-- -->{{#if:{{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher|}}}}}}}}}}}} |,&#32;{{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher}}}}}}}}}}}}}}<!-- -->{{#if:{{{Page|{{{page|}}}}}} |,&#32;p.&nbsp;{{{Page|{{{page}}}}}} |{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}} |{{#if:{{{at|}}}|,&#32;{{{at}}}|,&#32;pp.&nbsp;{{#invoke:String|replace|{{{Pages|{{{pages}}}}}}|-|&ndash;}}}} }} }}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}} |<!--not a strip--> <!-- -->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}|&#32;({{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}})}}<!-- -->{{#if:{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate|}}}}}}}}}}}}| .&#32;{{#if:{{{Location|{{{location|}}}}}}| {{{Location|{{{location}}}}}}:&#32; }}{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate}}}}}}}}}}}} }} }}<!-- -->{{#if:{{{ID|{{{id|}}}}}}| ,&#32;{{{ID|{{{id}}}}}} }}<!-- -->{{#switch:{{{language|{{{Language|}}}}}} |en |En |English = |{{#if:{{{language|{{{Language|}}}}}}| ,&#32;{{in lang|{{{language|{{{Language|}}}}}}}} }} }}<!-- --><!-- -->{{#if:{{{url|}}}|{{#if:{{{archive-url|}}}|{{ #ifeq:{{{url-status}}}|live |.&#32;[{{{archive-url|}}} Archived] from the original |.&#32;Archived from [{{{url}}} the original]}}{{ #if:{{{archive-date|}}}|&#32;on {{#invoke:Auto date formatter|access_archive_format|{{{archive-date}}}}} }} }}<!-- -->{{#if: {{{accessdate|{{{access-date|}}}}}}| .&#32;Retrieved {{#invoke:Auto date formatter|access_archive_format|{{{accessdate|{{{access-date|}}}}}}}} }}}}.<!-- -->{{#if:{{{quote|}}}| &#32;&#34;{{{quote}}}&#34;}}{{#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}}}}}}}}}&nbsp;([[Script (comics)|w]],&nbsp;[[artist|a]]) }}<!-- -->{{#if:{{{Writer|{{{writer|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|}}}}}}}}}| ,&#32; }}{{{Writer|{{{writer}}}}}}{{#if:{{{Cowriters|{{{cowriters|}}}}}} |,&#32;{{{Cowriters|{{{cowriters|}}}}}} }}&nbsp;([[Script (comics)|w]]) }}<!-- -->{{#if:{{{Artist|{{{artist|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|}}}}}}}}}}}}}}}| ,&#32; }}{{{Artist|{{{artist}}}}}}{{#if:{{{Coartists|{{{coartists|}}}}}} |,&#32;{{{Coartists|{{{coartists}}}}}} }}&nbsp;([[artist|a]]) }}<!-- -->{{#if:{{{Penciller|{{{penciller|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Penciller|{{{penciller}}}}}}{{#if:{{{Copencillers|{{{copencillers|}}}}}} |,&#32;{{{Copencillers|{{{copencillers}}}}}} }}&nbsp;([[penciller|p]]) }}<!-- -->{{#if:{{{Inker|{{{inker|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Inker|{{{inker}}}}}}{{#if:{{{Coinkers|{{{coinkers|}}}}}} |,&#32;{{{Coinkers|{{{coinkers}}}}}} }}&nbsp;([[inker|i]]) }}<!-- -->{{#if:{{{Colorist|{{{colorist|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Colorist|{{{colorist}}}}}}&nbsp;([[colorist|col]]) }}<!-- -->{{#if:{{{Letterer|{{{letterer|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Letterer|{{{letterer}}}}}}&nbsp;([[letterer|let]]) }}<!-- -->{{#if:{{{Editor|{{{editor|}}}}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{Editor|{{{editor}}}}}}&nbsp;([[Editing|ed]]) }}<!-- -->{{#if:{{{others|}}}| {{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| ,&#32; }}{{{others}}} }}<!-- -->{{#if:{{{Cartoonist|{{{cartoonist|{{{creator|{{{Writer|{{{writer|{{{Artist|{{{artist|{{{Penciller|{{{penciller|{{{Inker|{{{inker|{{{Colorist|{{{colorist|{{{Letterer|{{{letterer|{{{Editor|{{{editor|{{{others|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}| .&#32; }}<!-- -->{{#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|}}}| &#32;({{{format}}}) }}| "{{#invoke:String|replace|source={{{Story|{{{story}}}}}}|pattern="|replace=|count=2}}"{{#if:{{{format|}}}| &#32;({{{format}}}) }} }}{{#if:{{{Title|{{{title|{{{Strip|{{{strip|}}}}}}}}}}}} |&#32;''{{{Title|{{{title|{{{Strip|{{{strip}}}}}}}}}}}}'' | }}| {{#if:{{{url|}}}| ''[{{#ifeq: {{{url-status}}}|live |{{{url}}} |{{if empty|{{{archive-url|}}}|{{{url|}}} }} }} {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}]''{{#if:{{{format|}}}| &#32;({{{format}}}) }}| '' {{{Title|{{{title|{{{Strip|{{{strip|{{Noitalic|Untitled}}}}}}}}}}}}}}''{{#if:{{{format|}}}| &#32;({{{format}}}) }} }} }}<!-- -->{{#if:{{{Strip|{{{strip|}}}}}}| {{#if: {{{Paper|{{{paper|{{{newspaper|}}}}}}}}} |.&#32;''{{{Paper|{{{paper|{{{newspaper}}}}}}}}}''}}{{#if: {{{Location|{{{location|}}}}}} |&#32;({{{Location|{{{location}}}}}})}}<!-- -->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}} |.&#32;{{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}} }} }}<!-- -->{{#if:{{{Volume|{{{volume|}}}}}} |,&#32;vol.&nbsp;{{{Volume|{{{volume}}}}}} }}<!-- -->{{#if:{{{Issue|{{{issue|}}}}}}| ,&#32;no.&nbsp;{{#invoke:String|replace|source={{{Issue|{{{issue}}}}}}|pattern=#|replace=|count=1}} }}<!-- -->{{#if:{{{Strip|{{{strip|}}}}}}|<!--Strip=true. Else below: -->|<!-- -->{{#if:{{{Page|{{{page|}}}}}} |,&#32;p.&nbsp;{{{Page|{{{page}}}}}} |{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}} |{{#if:{{{at|}}}|,&#32;{{{at}}}|,&#32;pp.&nbsp;{{#invoke:String|replace|source={{{Pages|{{{pages}}}}}}|pattern=-|replace=&ndash;}}}} }} }}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}} }}<!-- -->{{#if:{{{Strip|{{{strip|}}}}}}| {{#if: {{{Supplement|{{{supplement|}}}}}} |&#32;[{{{Supplement|{{{supplement}}}}}}]}}<!-- -->{{#if:{{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher|}}}}}}}}}}}} |,&#32;{{{Syndicate|{{{syndicate|{{{Publisher|{{{publisher}}}}}}}}}}}}}}<!-- -->{{#if:{{{Page|{{{page|}}}}}} |,&#32;p.&nbsp;{{{Page|{{{page}}}}}} |{{#if:{{{Pages|{{{pages|{{{at|}}}}}}}}} |{{#if:{{{at|}}}|,&#32;{{{at}}}|,&#32;pp.&nbsp;{{#invoke:String|replace|{{{Pages|{{{pages}}}}}}|-|&ndash;}}}} }} }}{{#if:{{{Panel|{{{panel|}}}}}}|/{{{Panel|{{{panel}}}}}}}} |<!--not a strip--> <!-- -->{{#if:{{{Date|{{{date|{{{year|}}}}}}}}}|&#32;({{#invoke:Auto date formatter|pub_date_format|{{{Date|{{{date|{{{year|}}}}}}}}}}})}}<!-- -->{{#if:{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate|}}}}}}}}}}}}| .&#32;{{#if:{{{Location|{{{location|}}}}}}| {{{Location|{{{location}}}}}}:&#32; }}{{{Publisher|{{{publisher|{{{Syndicate|{{{syndicate}}}}}}}}}}}} }} }}<!-- -->{{#if:{{{ID|{{{id|}}}}}}| ,&#32;{{{ID|{{{id}}}}}} }}<!-- -->{{#switch:{{{language|{{{Language|}}}}}} |en |En |English = |{{#if:{{{language|{{{Language|}}}}}}| ,&#32;{{in lang|{{{language|{{{Language|}}}}}}}} }} }}<!-- --><!-- -->{{#if:{{{url|}}}|{{#if:{{{archive-url|}}}|{{ #ifeq:{{{url-status}}}|live |.&#32;[{{{archive-url|}}} Archived] from the original |.&#32;Archived from [{{{url}}} the original]}}{{ #if:{{{archive-date|}}}|&#32;on {{#invoke:Auto date formatter|access_archive_format|{{{archive-date}}}}} }} }}<!-- -->{{#if: {{{accessdate|{{{access-date|}}}}}}| .&#32;Retrieved {{#invoke:Auto date formatter|access_archive_format|{{{accessdate|{{{access-date|}}}}}}}} }}}}.<!-- -->{{#if:{{{quote|}}}| &#32;&#34;{{{quote}}}&#34;}}{{#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|}}}&#8202;{{#if:{{{1|}}} |{{{1}}}&#8202; }}{{{after|}}}}} |&#8202;{{#if:{{{1|}}} |{{{1}}}&#8202; }} }}<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|}}}&#8202;{{#if:{{{1|}}} |{{{1}}}&#8202; }}{{{after|}}}}} |&#8202;{{#if:{{{1|}}} |{{{1}}}&#8202; }} }}<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}}}&#32; }}{{{Surname1}}}]] |{{ #if: {{{Given1|}}} |{{{Given1}}}&#32; }}{{{Surname1}}} }}{{ #if: {{{Surname2|}}} |{{ #if: {{{Surname3|}}} |,&#32; |&#32;{{#ifeq:{{{Txt|}}}|yes|and|&amp;}}&#32; }}{{ #if: {{{Authorlink2|}}} |[[{{{Authorlink2}}} |{{{Given2|}}} {{{Surname2}}}]] |{{{Given2|}}} {{{Surname2}}} }}{{ #if: {{{Surname3|}}} |{{#ifeq:{{{Txt|}}}|yes|,&#32;and&#32;|&#32;&amp;&#32;}}{{ #if: {{{Authorlink3|}}} |[[{{{Authorlink3}}} |{{{Given3|}}} {{{Surname3}}}]] |{{{Given3|}}} {{{Surname3}}} }}{{ #if:{{{Surname4|}}} |&#32;et al. }} }} }} |{{ #if: {{{EditorSurname1|}}} |{{ #if: {{{Editorlink1|}}} |[[{{{Editorlink1}}} |{{{EditorSurname1}}}{{ #if: {{{EditorGiven1|}}} |, {{{EditorGiven1}}} }}]] |{{{EditorSurname1}}}{{ #if: {{{EditorGiven1|}}} |, {{{EditorGiven1}}} }} }}{{ #if: {{{EditorSurname2|}}} |{{ #if: {{{EditorSurname3|}}} |<nowiki>; </nowiki> |&#32;&amp;&#32; }}{{ #if: {{{Editorlink2|}}} |[[{{{Editorlink2}}} |{{{EditorGiven2|}}} {{{EditorSurname2}}}]] |{{{EditorGiven2|}}} {{{EditorSurname2}}} }}{{ #if: {{{EditorSurname3|}}} |&#32;&amp; {{ #if: {{{Editorlink3|}}} |[[{{{Editorlink3}}} |{{{EditorGiven3|}}} {{{EditorSurname3}}}]] |{{{EditorGiven3|}}} {{{EditorSurname3}}} }}{{ #if:{{{EditorSurname4|}}} |&#32;et al. }} }} }}, ed{{#if:{{{EditorSurname2|}}}|s}}. }} }}&nbsp;{{#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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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}}}&#32; }}{{{Surname1}}}]] |{{ #if: {{{Given1|}}} |{{{Given1}}}&#32; }}{{{Surname1}}} }}{{ #if: {{{Surname2|}}} |{{ #if: {{{Surname3|}}} |,&#32; |&#32;{{#ifeq:{{{Txt|}}}|yes|and|&amp;}}&#32; }}{{ #if: {{{Authorlink2|}}} |[[{{{Authorlink2}}} |{{{Given2|}}} {{{Surname2}}}]] |{{{Given2|}}} {{{Surname2}}} }}{{ #if: {{{Surname3|}}} |{{#ifeq:{{{Txt|}}}|yes|,&#32;and&#32;|&#32;&amp;&#32;}}{{ #if: {{{Authorlink3|}}} |[[{{{Authorlink3}}} |{{{Given3|}}} {{{Surname3}}}]] |{{{Given3|}}} {{{Surname3}}} }}{{ #if:{{{Surname4|}}} |&#32;et al. }} }} }} |{{ #if: {{{EditorSurname1|}}} |{{ #if: {{{Editorlink1|}}} |[[{{{Editorlink1}}} |{{{EditorSurname1}}}{{ #if: {{{EditorGiven1|}}} |, {{{EditorGiven1}}} }}]] |{{{EditorSurname1}}}{{ #if: {{{EditorGiven1|}}} |, {{{EditorGiven1}}} }} }}{{ #if: {{{EditorSurname2|}}} |{{ #if: {{{EditorSurname3|}}} |<nowiki>; </nowiki> |&#32;&amp;&#32; }}{{ #if: {{{Editorlink2|}}} |[[{{{Editorlink2}}} |{{{EditorGiven2|}}} {{{EditorSurname2}}}]] |{{{EditorGiven2|}}} {{{EditorSurname2}}} }}{{ #if: {{{EditorSurname3|}}} |&#32;&amp; {{ #if: {{{Editorlink3|}}} |[[{{{Editorlink3}}} |{{{EditorGiven3|}}} {{{EditorSurname3}}}]] |{{{EditorGiven3|}}} {{{EditorSurname3}}} }}{{ #if:{{{EditorSurname4|}}} |&#32;et al. }} }} }}, ed{{#if:{{{EditorSurname2|}}}|s}}. }} }}&nbsp;{{#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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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|}}}|,&ensp;{{{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] .. ' &amp; ' .. args.last[3]; elseif 2 == #args.last then -- two (first & second) contributors = args.last[1] .. ' &amp; ' .. 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 .. ' &amp; ' .. 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 .. ' &amp; ' .. 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.&nbsp;", pages_sep = ", pp.&nbsp;", 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] .. ' &amp; ' .. args.last[3]; elseif 2 == #args.last then -- two (first & second) contributors = args.last[1] .. ' &amp; ' .. 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 .. ' &amp; ' .. 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 .. ' &amp; ' .. 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.&nbsp;", pages_sep = ", pp.&nbsp;", 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]]''':'''&nbsp;}}<!-- -->{{#if:{{{1|}}}|{{#ifeq:{{padleft:|1|{{{1|T}}}}}|T|[[Phabricator:{{{1}}}|{{{1}}}]]|[[Phabricator:T{{{1}}}|T{{{1}}}]]}}{{#if:{{{label1|}}}|&#32;({{{label1}}})}}|[[Phabricator:|Phabricator]]}}<!-- Extra fields -->{{#if:{{{2|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{2|T}}}}}|T|[[Phabricator:{{{2}}}|{{{2}}}]]|[[Phabricator:T{{{2}}}|T{{{2}}}]]}}{{#if:{{{label2|}}}|&#32;({{{label2}}})}}}}<!-- -->{{#if:{{{3|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{3|T}}}}}|T|[[Phabricator:{{{3}}}|{{{3}}}]]|[[Phabricator:T{{{3}}}|T{{{3}}}]]}}{{#if:{{{label3|}}}|&#32;({{{label3}}})}}}}<!-- -->{{#if:{{{4|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{4|T}}}}}|T|[[Phabricator:{{{4}}}|{{{4}}}]]|[[Phabricator:T{{{4}}}|T{{{4}}}]]}}{{#if:{{{label4|}}}|&#32;({{{label4}}})}}}}<!-- -->{{#if:{{{5|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{5|T}}}}}|T|[[Phabricator:{{{5}}}|{{{5}}}]]|[[Phabricator:T{{{5}}}|T{{{5}}}]]}}{{#if:{{{label5|}}}|&#32;({{{label5}}})}}}}<!-- -->{{#if:{{{6|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{6|T}}}}}|T|[[Phabricator:{{{6}}}|{{{6}}}]]|[[Phabricator:T{{{6}}}|T{{{6}}}]]}}{{#if:{{{label6|}}}|&#32;({{{label6}}})}}}}<!-- -->{{#if:{{{7|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{7|T}}}}}|T|[[Phabricator:{{{7}}}|{{{7}}}]]|[[Phabricator:T{{{7}}}|T{{{7}}}]]}}{{#if:{{{label7|}}}|&#32;({{{label7}}})}}}}<!-- -->{{#if:{{{8|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{8|T}}}}}|T|[[Phabricator:{{{8}}}|{{{8}}}]]|[[Phabricator:T{{{8}}}|T{{{8}}}]]}}{{#if:{{{label8|}}}|&#32;({{{label8}}})}}}}<!-- -->{{#if:{{{9|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{9|T}}}}}|T|[[Phabricator:{{{9}}}|{{{9}}}]]|[[Phabricator:T{{{9}}}|T{{{9}}}]]}}{{#if:{{{label9|}}}|&#32;({{{label9}}})}}}}<!-- -->{{#if:{{{10|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{10|T}}}}}|T|[[Phabricator:{{{10}}}|{{{10}}}]]|[[Phabricator:T{{{10}}}|T{{{10}}}]]}}{{#if:{{{label10|}}}|&#32;({{{label10}}})}}}}<!-- -->{{#if:{{{11|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{11|T}}}}}|T|[[Phabricator:{{{11}}}|{{{11}}}]]|[[Phabricator:T{{{11}}}|T{{{11}}}]]}}{{#if:{{{label11|}}}|&#32;({{{label11}}})}}}}<!-- -->{{#if:{{{12|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{12|T}}}}}|T|[[Phabricator:{{{12}}}|{{{12}}}]]|[[Phabricator:T{{{12}}}|T{{{12}}}]]}}{{#if:{{{label12|}}}|&#32;({{{label12}}})}}}}<!-- -->{{#if:{{{13|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{13|T}}}}}|T|[[Phabricator:{{{13}}}|{{{13}}}]]|[[Phabricator:T{{{13}}}|T{{{13}}}]]}}{{#if:{{{label13|}}}|&#32;({{{label13}}})}}}}<!-- -->{{#if:{{{14|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{14|T}}}}}|T|[[Phabricator:{{{14}}}|{{{14}}}]]|[[Phabricator:T{{{14}}}|T{{{14}}}]]}}{{#if:{{{label14|}}}|&#32;({{{label14}}})}}}}<!-- -->{{#if:{{{15|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{15|T}}}}}|T|[[Phabricator:{{{15}}}|{{{15}}}]]|[[Phabricator:T{{{15}}}|T{{{15}}}]]}}{{#if:{{{label15|}}}|&#32;({{{label15}}})}}}}<!-- -->{{#if:{{{16|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{16|T}}}}}|T|[[Phabricator:{{{16}}}|{{{16}}}]]|[[Phabricator:T{{{16}}}|T{{{16}}}]]}}{{#if:{{{label16|}}}|&#32;({{{label16}}})}}}}<!-- -->{{#if:{{{17|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{17|T}}}}}|T|[[Phabricator:{{{17}}}|{{{17}}}]]|[[Phabricator:T{{{17}}}|T{{{17}}}]]}}{{#if:{{{label17|}}}|&#32;({{{label17}}})}}}}<!-- -->{{#if:{{{18|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{18|T}}}}}|T|[[Phabricator:{{{18}}}|{{{18}}}]]|[[Phabricator:T{{{18}}}|T{{{18}}}]]}}{{#if:{{{label18|}}}|&#32;({{{label18}}})}}}}<!-- -->{{#if:{{{19|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{19|T}}}}}|T|[[Phabricator:{{{19}}}|{{{19}}}]]|[[Phabricator:T{{{19}}}|T{{{19}}}]]}}{{#if:{{{label19|}}}|&#32;({{{label19}}})}}}}<!-- -->{{#if:{{{20|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{20|T}}}}}|T|[[Phabricator:{{{20}}}|{{{20}}}]]|[[Phabricator:T{{{20}}}|T{{{20}}}]]}}{{#if:{{{label20|}}}|&#32;({{{label20}}})}}}}<!-- -->{{#if:{{{label|}}}|&#32;({{{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]]''':'''&nbsp;}}<!-- -->{{#if:{{{1|}}}|{{#ifeq:{{padleft:|1|{{{1|T}}}}}|T|[[Phabricator:{{{1}}}|{{{1}}}]]|[[Phabricator:T{{{1}}}|T{{{1}}}]]}}{{#if:{{{label1|}}}|&#32;({{{label1}}})}}|[[Phabricator:|Phabricator]]}}<!-- Extra fields -->{{#if:{{{2|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{2|T}}}}}|T|[[Phabricator:{{{2}}}|{{{2}}}]]|[[Phabricator:T{{{2}}}|T{{{2}}}]]}}{{#if:{{{label2|}}}|&#32;({{{label2}}})}}}}<!-- -->{{#if:{{{3|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{3|T}}}}}|T|[[Phabricator:{{{3}}}|{{{3}}}]]|[[Phabricator:T{{{3}}}|T{{{3}}}]]}}{{#if:{{{label3|}}}|&#32;({{{label3}}})}}}}<!-- -->{{#if:{{{4|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{4|T}}}}}|T|[[Phabricator:{{{4}}}|{{{4}}}]]|[[Phabricator:T{{{4}}}|T{{{4}}}]]}}{{#if:{{{label4|}}}|&#32;({{{label4}}})}}}}<!-- -->{{#if:{{{5|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{5|T}}}}}|T|[[Phabricator:{{{5}}}|{{{5}}}]]|[[Phabricator:T{{{5}}}|T{{{5}}}]]}}{{#if:{{{label5|}}}|&#32;({{{label5}}})}}}}<!-- -->{{#if:{{{6|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{6|T}}}}}|T|[[Phabricator:{{{6}}}|{{{6}}}]]|[[Phabricator:T{{{6}}}|T{{{6}}}]]}}{{#if:{{{label6|}}}|&#32;({{{label6}}})}}}}<!-- -->{{#if:{{{7|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{7|T}}}}}|T|[[Phabricator:{{{7}}}|{{{7}}}]]|[[Phabricator:T{{{7}}}|T{{{7}}}]]}}{{#if:{{{label7|}}}|&#32;({{{label7}}})}}}}<!-- -->{{#if:{{{8|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{8|T}}}}}|T|[[Phabricator:{{{8}}}|{{{8}}}]]|[[Phabricator:T{{{8}}}|T{{{8}}}]]}}{{#if:{{{label8|}}}|&#32;({{{label8}}})}}}}<!-- -->{{#if:{{{9|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{9|T}}}}}|T|[[Phabricator:{{{9}}}|{{{9}}}]]|[[Phabricator:T{{{9}}}|T{{{9}}}]]}}{{#if:{{{label9|}}}|&#32;({{{label9}}})}}}}<!-- -->{{#if:{{{10|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{10|T}}}}}|T|[[Phabricator:{{{10}}}|{{{10}}}]]|[[Phabricator:T{{{10}}}|T{{{10}}}]]}}{{#if:{{{label10|}}}|&#32;({{{label10}}})}}}}<!-- -->{{#if:{{{11|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{11|T}}}}}|T|[[Phabricator:{{{11}}}|{{{11}}}]]|[[Phabricator:T{{{11}}}|T{{{11}}}]]}}{{#if:{{{label11|}}}|&#32;({{{label11}}})}}}}<!-- -->{{#if:{{{12|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{12|T}}}}}|T|[[Phabricator:{{{12}}}|{{{12}}}]]|[[Phabricator:T{{{12}}}|T{{{12}}}]]}}{{#if:{{{label12|}}}|&#32;({{{label12}}})}}}}<!-- -->{{#if:{{{13|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{13|T}}}}}|T|[[Phabricator:{{{13}}}|{{{13}}}]]|[[Phabricator:T{{{13}}}|T{{{13}}}]]}}{{#if:{{{label13|}}}|&#32;({{{label13}}})}}}}<!-- -->{{#if:{{{14|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{14|T}}}}}|T|[[Phabricator:{{{14}}}|{{{14}}}]]|[[Phabricator:T{{{14}}}|T{{{14}}}]]}}{{#if:{{{label14|}}}|&#32;({{{label14}}})}}}}<!-- -->{{#if:{{{15|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{15|T}}}}}|T|[[Phabricator:{{{15}}}|{{{15}}}]]|[[Phabricator:T{{{15}}}|T{{{15}}}]]}}{{#if:{{{label15|}}}|&#32;({{{label15}}})}}}}<!-- -->{{#if:{{{16|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{16|T}}}}}|T|[[Phabricator:{{{16}}}|{{{16}}}]]|[[Phabricator:T{{{16}}}|T{{{16}}}]]}}{{#if:{{{label16|}}}|&#32;({{{label16}}})}}}}<!-- -->{{#if:{{{17|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{17|T}}}}}|T|[[Phabricator:{{{17}}}|{{{17}}}]]|[[Phabricator:T{{{17}}}|T{{{17}}}]]}}{{#if:{{{label17|}}}|&#32;({{{label17}}})}}}}<!-- -->{{#if:{{{18|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{18|T}}}}}|T|[[Phabricator:{{{18}}}|{{{18}}}]]|[[Phabricator:T{{{18}}}|T{{{18}}}]]}}{{#if:{{{label18|}}}|&#32;({{{label18}}})}}}}<!-- -->{{#if:{{{19|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{19|T}}}}}|T|[[Phabricator:{{{19}}}|{{{19}}}]]|[[Phabricator:T{{{19}}}|T{{{19}}}]]}}{{#if:{{{label19|}}}|&#32;({{{label19}}})}}}}<!-- -->{{#if:{{{20|}}}|{{nbsp}}• {{#ifeq:{{padleft:|1|{{{20|T}}}}}|T|[[Phabricator:{{{20}}}|{{{20}}}]]|[[Phabricator:T{{{20}}}|T{{{20}}}]]}}{{#if:{{{label20|}}}|&#32;({{{label20}}})}}}}<!-- -->{{#if:{{{label|}}}|&#32;({{{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>&amp;lt;</code> and <code>&amp;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>&amp;lt;</code> and <code>&amp;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>| &lt;{{var|last1}}*> | &lt;{{var|last2}}> | &lt;{{var|last3}}> | &lt;{{var|last4}}> | &lt;{{var|year}}*> | p= &lt;{{var|page}}> | loc= &lt;{{var|location}}> &#125;&#125;</code></div> with * &lt;{{var|last1}}> – required; surname of first author or corporate author * &lt;{{var|last2}}>–&lt;{{var|last4}}> – positional parameters; surnames of next three authors; required if available in the full citation * &lt;{{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 &sect;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 &sect;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.&amp;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>| &lt;{{var|last1}}*> | &lt;{{var|last2}}> | &lt;{{var|last3}}> | &lt;{{var|last4}}> | &lt;{{var|year}}*> | p= &lt;{{var|page}}> | loc= &lt;{{var|location}}> &#125;&#125;</code></div> with * &lt;{{var|last1}}> – required; surname of first author or corporate author * &lt;{{var|last2}}>–&lt;{{var|last4}}> – positional parameters; surnames of next three authors; required if available in the full citation * &lt;{{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 &sect;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 &sect;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.&amp;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&GTC70'] = {'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&GTC70'] = {'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|&nbsp;}}}}}}}}|#|&#35;}}|*|&#42;}}|:|&#58;}}|⊗ϑ|}}</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|&nbsp;}}}}}}}}|#|&#35;}}|*|&#42;}}|:|&#58;}}|⊗ϑ|}}</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(' %-', ' -&#8288;') :gsub('^%-', '-&#8288;') .. '</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(' %-', ' -&#8288;') :gsub('^%-', '-&#8288;') .. '</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}}}|,&#32;}}|conjunction={{safesubst<noinclude/>:#if:{{{and|}}}|{{{and}}}|&#32;and&#32;}}}}{{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}}}|,&#32;}}|conjunction={{safesubst<noinclude/>:#if:{{{and|}}}|{{{and}}}|&#32;and&#32;}}}}{{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=&#8199; |en=&ensp; |em=&emsp; |thin=&thinsp; |hair=&#8202; |&nbsp; }} |{{#invoke:String|rep|{{#switch:{{{2}}} |fig=&#8199; |en=&ensp; |em=&emsp; |thin=&thinsp; |hair=&#8202; |&nbsp; }}|{{{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=&#8199; |en=&ensp; |em=&emsp; |thin=&thinsp; |hair=&#8202; |&nbsp; }} |{{#invoke:String|rep|{{#switch:{{{2}}} |fig=&#8199; |en=&ensp; |em=&emsp; |thin=&thinsp; |hair=&#8202; |&nbsp; }}|{{{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 "&nbsp;and&nbsp;" (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 "&nbsp;and&nbsp;" 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 "&nbsp;and&nbsp;" (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 "&nbsp;and&nbsp;" 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|-}}}||&lrm;}}<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|-}}}||&lrm;}}<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&#32;|}}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&#32;|}}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 = '&nbsp;<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 = '&nbsp;<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&nbsp;of&nbsp;death | data7 = {{{death_cause|}}} | label8 = Resting&nbsp;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&nbsp;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&nbsp;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&nbsp;of&nbsp;death | data7 = {{{death_cause|}}} | label8 = Resting&nbsp;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&nbsp;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&nbsp;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&nbsp;of&nbsp;death | data7 = {{{death_cause|}}} | label8 = Resting&nbsp;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&nbsp;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&nbsp;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|}}} |&#32;[[{{{office}}}]]}}{{#if:{{{state|}}} |&#32;[[{{{state}}}]]}}{{#if:{{{title|}}} |&#32;{{{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&nbsp;Parliament]] |Scottish = [[Member of the Scottish&nbsp;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.}}}}&#32;{{#if:{{{state_delegate|}}}|House&#32;of&#32;Delegates|{{#if:{{{state_house|}}}| }}House&#32;of&#32;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}}&#32;with&#32;{{#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}}&#32;with&#32;{{#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>&#32;<br />{{{termstart}}}{{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leader}}&#32;with&#32;{{#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|}}} |&#32;[[{{{office}}}]]}}{{#if:{{{state|}}} |&#32;[[{{{state}}}]]}}{{#if:{{{title|}}} |&#32;{{{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&nbsp;Parliament]] |Scottish = [[Member of the Scottish&nbsp;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.}}}}&#32;{{#if:{{{state_delegate|}}}|House&#32;of&#32;Delegates|{{#if:{{{state_house|}}}| }}House&#32;of&#32;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}}&#32;with&#32;{{#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}}&#32;with&#32;{{#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>&#32;<br />{{{termstart}}}{{#if:{{{alongside|}}}{{{co-leader|}}}|<div style="line-height:normal; padding-top:0.2em; padding-bottom:0.1em">{{#if:{{{alongside|}}}|Serving|Co-leader}}&#32;with&#32;{{#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|–|&nbsp;–&#32;}}{{{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|–|&nbsp;–&#32;}}{{{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&nbsp;cm') s = mw.ustring.gsub(s, '(%d)%s+[Mm]', '%1&nbsp;m') s = mw.ustring.gsub(s, '(%d)%s+[Ff][Tt]', '%1&nbsp;ft') s = mw.ustring.gsub(s, '(%d)%s+[Ii][Nn]', '%1&nbsp;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, '★', '&nbsp;') 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&nbsp;cm') s = mw.ustring.gsub(s, '(%d)%s+[Mm]', '%1&nbsp;m') s = mw.ustring.gsub(s, '(%d)%s+[Ff][Tt]', '%1&nbsp;ft') s = mw.ustring.gsub(s, '(%d)%s+[Ii][Nn]', '%1&nbsp;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, '★', '&nbsp;') 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]] &lt;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 &lt;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]] &lt;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 &lt;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">&#8203;</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">&#8203;</div>}} |{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}} |<div class="marriage-line-margin2px">&#8203;</div> |{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2=20 |3=<div class="marriage-line-margin2px">&#8203;</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">&#8203;</div> |{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}} |3=<div class="marriage-line-margin2px">&#8203;</div>}}}} }}}}}}&#32;<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;}}}}}}}}">&#8203;</div>&#40;<!-- -->{{#if:{{{2|}}} |{{#ifeq:{{{end|{{{reason|+}}}}}}| |{{#switch:{{{3|}}} | = after&nbsp;}} |{{abbreviation|m.|married}}&nbsp;}}{{#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&nbsp;{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}} |{{error-small|date missing}}}}}}<!-- -->{{#if:{{{end|{{{reason|}}}}}}|{{#if:{{{2|}}}{{{3|}}}|&#44;&#32;}}}}}} }}{{#if:{{{3|}}} |{{#ifeq:{{{end|{{{reason|}}}}}}| |{{#if:{{{2|}}}|&#x2060;&#8211;&#x2060;|{{#ifeq:{{{end|+}}}|{{{end|-}}} |{{#ifeq:{{{end|+}}}|{{{end|-}}} | until | before }} |{{#ifeq:{{{reason|+}}}|{{{reason|-}}} | until | before }}}}&nbsp;}} |{{#if:{{{2|}}} |&#59;&#32; }}{{#switch:{{lc:{{{end|{{{reason|}}}}}}}} | d | d. | died = died&nbsp;<!-- this used to be {{abbreviation|d.|died}} but caused confusion with "divorced" --> | div | div. | divorce | divorced = {{abbreviation|div.|divorced}}&nbsp; | sep | sep. | separated = {{abbreviation|sep.|separated}}&nbsp; <!-- commonly used reason for end --> | ann | ann. | annulled | annulment = {{abbreviation|ann.|annulled}}&nbsp; <!-- commonly used reason for end --> | she d. | her d. | she died | her death = {{#ifeq:{{#property:P21}}|male|died&nbsp;|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}}&nbsp;}} | he d. | his d. | he died | his death = {{#ifeq:{{#property:P21}}|female|died&nbsp;|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}}&nbsp;}} | w | w. | wid | wid. | widow | widowed = {{main other|[[Category:Marriage template errors|W{{PAGENAME}}]]}}{{error-small|invalid reason}}&nbsp; | = <!--(reason marriage ended not supplied)--> | #default = {{{end|{{{reason|}}}}}}&nbsp; }} }}{{#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|}}}}}}|&#44;&#32;|}} }}{{#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&nbsp}} | = <!--(reason marriage ended not supplied)--> | #default = {{{end|{{{reason|}}}}}} }} }}&#41;<wbr />&#8203;</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">&#8203;</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">&#8203;</div>}} |{{#if:{{in string|source={{{1}}}|target=<br|plain=true|nomatch=}} |<div class="marriage-line-margin2px">&#8203;</div> |{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2=20 |3=<div class="marriage-line-margin2px">&#8203;</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">&#8203;</div> |{{str ≥ len|1={{#invoke:delink|delink|{{{1}}}}}|2={{if both|{{{2|}}}|{{{3|}}}|15|20}} |3=<div class="marriage-line-margin2px">&#8203;</div>}}}} }}}}}}&#32;<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;}}}}}}}}">&#8203;</div>&#40;<!-- -->{{#if:{{{2|}}} |{{#ifeq:{{{end|{{{reason|+}}}}}}| |{{#switch:{{{3|}}} | = after&nbsp;}} |{{abbreviation|m.|married}}&nbsp;}}{{#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&nbsp;{{#invoke:WikidataIB|getValue|P570|fwd=ALL|maxvals=1|noicon=true|pd=yes|df=y}} |{{error-small|date missing}}}}}}<!-- -->{{#if:{{{end|{{{reason|}}}}}}|{{#if:{{{2|}}}{{{3|}}}|&#44;&#32;}}}}}} }}{{#if:{{{3|}}} |{{#ifeq:{{{end|{{{reason|}}}}}}| |{{#if:{{{2|}}}|&#x2060;&#8211;&#x2060;|{{#ifeq:{{{end|+}}}|{{{end|-}}} |{{#ifeq:{{{end|+}}}|{{{end|-}}} | until | before }} |{{#ifeq:{{{reason|+}}}|{{{reason|-}}} | until | before }}}}&nbsp;}} |{{#if:{{{2|}}} |&#59;&#32; }}{{#switch:{{lc:{{{end|{{{reason|}}}}}}}} | d | d. | died = died&nbsp;<!-- this used to be {{abbreviation|d.|died}} but caused confusion with "divorced" --> | div | div. | divorce | divorced = {{abbreviation|div.|divorced}}&nbsp; | sep | sep. | separated = {{abbreviation|sep.|separated}}&nbsp; <!-- commonly used reason for end --> | ann | ann. | annulled | annulment = {{abbreviation|ann.|annulled}}&nbsp; <!-- commonly used reason for end --> | she d. | her d. | she died | her death = {{#ifeq:{{#property:P21}}|male|died&nbsp;|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}}&nbsp;}} | he d. | his d. | he died | his death = {{#ifeq:{{#property:P21}}|female|died&nbsp;|{{main other|[[Category:Marriage template errors|X{{PAGENAME}}]]}}{{error-small|"{{lc:{{{end|{{{reason|}}}}}}}}" is deprecated; use "died" instead.}}&nbsp;}} | w | w. | wid | wid. | widow | widowed = {{main other|[[Category:Marriage template errors|W{{PAGENAME}}]]}}{{error-small|invalid reason}}&nbsp; | = <!--(reason marriage ended not supplied)--> | #default = {{{end|{{{reason|}}}}}}&nbsp; }} }}{{#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|}}}}}}|&#44;&#32;|}} }}{{#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&nbsp}} | = <!--(reason marriage ended not supplied)--> | #default = {{{end|{{{reason|}}}}}} }} }}&#41;<wbr />&#8203;</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=&#58;|4=^;|5=&#59;|6=^*|7=&#42;|8=^#|9=&#35;}}<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=&#58;|4=^;|5=&#59;|6=^*|7=&#42;|8=^#|9=&#35;}}<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 = "&nbsp;" .. i18n["BC"] -- prepend a non-breaking space. else bc = "&nbsp;" .. 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 = "&nbsp;" -- 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>&nbsp;') -- 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 = "&nbsp;<span class='penicon autoconfirmed-show'>[[" -- "&nbsp;<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 = "&nbsp;", 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 = "&ndash;" if t:find("%s") or t:find("&nbsp;") then dsep = " &ndash; " 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 "&nbsp;" -- 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("(.+)&nbsp;(.+)") -- 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>&nbsp;" .. 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 = "&nbsp;" .. i18n["BC"] -- prepend a non-breaking space. else bc = "&nbsp;" .. 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 = "&nbsp;" -- 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>&nbsp;') -- 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 = "&nbsp;<span class='penicon autoconfirmed-show'>[[" -- "&nbsp;<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 = "&nbsp;", 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 = "&ndash;" if t:find("%s") or t:find("&nbsp;") then dsep = " &ndash; " 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 "&nbsp;" -- 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("(.+)&nbsp;(.+)") -- 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>&nbsp;" .. 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|}}}|"|&quot;}}}}">{{{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|}}}|"|&quot;}}}}">{{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|}}}|"|&quot;}}}}">{{{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|}}}|"|&quot;}}}}">{{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&nbsp;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&nbsp;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&nbsp;mater | data25 = {{{alma_mater|}}} | label26 = Occupation{{Pluralize from text|{{{occupation|}}}|plural=s}} | data26 = {{{occupation|}}} | class26 = role | label27 = Years&nbsp;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&nbsp;for | data32 = {{{known_for|}}} | label33 = Works | data33 = {{{works|}}} | label34 = Notable&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;mater | data25 = {{{alma_mater|}}} | label26 = Occupation{{Pluralize from text|{{{occupation|}}}|plural=s}} | data26 = {{{occupation|}}} | class26 = role | label27 = Years&nbsp;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&nbsp;for | data32 = {{{known_for|}}} | label33 = Works | data33 = {{{works|}}} | label34 = Notable&nbsp;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&nbsp;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&nbsp;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&nbsp;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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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|}}}|"|&quot;}}}}">{{{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|}}}|"|&quot;}}}}">{{{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 '&#x29FC;' .. mw.text.nowiki(key) .. '&#x29FD;' 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 '&#x29FC;' .. mw.text.nowiki(key) .. '&#x29FD;' 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>&#123;&#123;{{{{{|safesubst:}}}#invoke:Separated entries|main|[[Module:{{{1}}}{{{section|}}}|#invoke:{{{1}}}]]|{{{2|''function''}}}|separator=&#124;}}&#125;&#125;</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>&#123;&#123;{{{{{|safesubst:}}}#invoke:Separated entries|main|[[Module:{{{1}}}{{{section|}}}|#invoke:{{{1}}}]]|{{{2|''function''}}}|separator=&#124;}}&#125;&#125;</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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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"] = "&nbsp;• ", ["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", "&emsp;")) 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", "&emsp;")) 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 &nbsp;&ndash;&#32;<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 &nbsp;&ndash;&#32;<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 = "&nbsp;" 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.."&params="..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 = "&nbsp;" 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.."&params="..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, "(.*)(&nbsp;<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, "(.*)(&nbsp;<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}}}}}}}|'|&#39;}} <small>({{uc:{{{1}}}}})</small>]] | #default = [[d:Special:EntityPage/Q{{uc:{{{1}}}}}|{{replace|{{#invoke:wd|label|Q{{uc:{{{1}}}}}}}|'|&#39;}} <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}}}}}}}|'|&#39;}} <small>({{uc:{{{1}}}}})</small>]] | #default = [[d:Special:EntityPage/Q{{uc:{{{1}}}}}|{{replace|{{#invoke:wd|label|Q{{uc:{{{1}}}}}}}|'|&#39;}} <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|}}}}}}}|&#58; <small>{{wikidata|label|{{uc:{{{1|}}}}}}}</small>}} | [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|P{{uc:{{{1|}}}}}]]{{#if:{{wikidata|label|P{{uc:{{{1|}}}}}}}|&#58; <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|}}}}}}}|&#58; <small>{{wikidata|label|{{uc:{{{1|}}}}}}}</small>}} | [[d:Special:EntityPage/P{{uc:{{{1|}}}}}|P{{uc:{{{1|}}}}}]]{{#if:{{wikidata|label|P{{uc:{{{1|}}}}}}}|&#58; <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|&lt;wbr/&gt;]] 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|&lt;wbr/&gt;]] 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|&lt;wbr/&gt;]] 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|&lt;wbr/&gt;]] 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&nbsp;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&nbsp;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}}. &#8209;&#8209;[[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? &#8209;&#8209;[[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]]. &#8209;&#8209;[[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}}. &#8209;&#8209;[[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? &#8209;&#8209;[[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]]. &#8209;&#8209;[[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}} ) | &#32;{{error|invalid year}}{{main other|[[Category:Pages using age template with invalid date]]}} }}{{#if:{{{2|}}}|{{#ifexpr: ( {{{2|}}} > 12 ) OR ( {{{2|}}} < 1 ) | &#32;{{error|invalid month}}{{main other|[[Category:Pages using age template with invalid date]]}}|}} }}{{#if:{{{3|}}}|{{#ifexpr: ( {{{3|}}} > 31 ) OR ( {{{3|}}} < 1 ) | &#32;{{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}} ) | &#32;{{error|invalid year}}{{main other|[[Category:Pages using age template with invalid date]]}} }}{{#if:{{{2|}}}|{{#ifexpr: ( {{{2|}}} > 12 ) OR ( {{{2|}}} < 1 ) | &#32;{{error|invalid month}}{{main other|[[Category:Pages using age template with invalid date]]}}|}} }}{{#if:{{{3|}}}|{{#ifexpr: ( {{{3|}}} > 31 ) OR ( {{{3|}}} < 1 ) | &#32;{{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 &nbsp;/&#32;<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 &nbsp;/&#32;<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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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&nbsp;|{{Resize|110%|Description{{\}}use&nbsp;}} |{{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'] = '&nbsp;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&nbsp;$3)</span>', ['txt-dda'] = '$2<span style="display:none">($1)</span> (aged&nbsp;$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) ~= '&nbsp;' 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 = '&nbsp;', 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 = '&nbsp;', 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'] = '&nbsp;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&nbsp;$3)</span>', ['txt-dda'] = '$2<span style="display:none">($1)</span> (aged&nbsp;$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) ~= '&nbsp;' 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 = '&nbsp;', 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 = '&nbsp;', 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">&#160;(<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">&#160;(<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&nbsp;{{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&nbsp;{{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|}}}&nbsp;– {{{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|}}}&nbsp;– {{{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|}}}&nbsp;– {{{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 == "&#123;&#123;&#123;coordinates&#125;&#125;&#125;" 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 == "&#123;&#123;&#123;coordinates&#125;&#125;&#125;" 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&params=1_2_N_3_4_W_ or //tools.wmflabs.org/geohack/geohack.php?pagename=Example&params=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&params=1_2_N_3_4_W_ or //tools.wmflabs.org/geohack/geohack.php?pagename=Example&params=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''' &ndash; ''optional'' &ndash; the location of the structure, given as a coordinate pair by using {{tl|coord}} with ''display=inline,title''. * '''pushpin_map''' &ndash; ''optional'' &ndash; the base map to be used for the location map, e.g. "Scotland"; see {{tl|location map}} for more details. * '''pushpin_pushpin_map_size''' &ndash; ''optional'' &ndash; width of the location map in pixels (px), e.g. "150"; defaults to: "220". * '''pushpin_caption''' &ndash; ''optional'' &ndash; caption displayed below the location map; defaults to "Location within {{{pushpin_map}}}", e.g. "Location within Scotland". * '''pushpin_label''' &ndash; ''optional'' &ndash; 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''' &ndash; ''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''' &ndash; ''optional'' &ndash; the location of the structure, given as a coordinate pair by using {{tl|coord}} with ''display=inline,title''. * '''pushpin_map''' &ndash; ''optional'' &ndash; the base map to be used for the location map, e.g. "Scotland"; see {{tl|location map}} for more details. * '''pushpin_pushpin_map_size''' &ndash; ''optional'' &ndash; width of the location map in pixels (px), e.g. "150"; defaults to: "220". * '''pushpin_caption''' &ndash; ''optional'' &ndash; caption displayed below the location map; defaults to "Location within {{{pushpin_map}}}", e.g. "Location within Scotland". * '''pushpin_label''' &ndash; ''optional'' &ndash; 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''' &ndash; ''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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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>&nbsp;<span style="font-size:95%;">&#91;[[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 = "&#32;" local HTML_NBSP = "&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 = "&#32;" local HTML_NBSP = "&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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;{{#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&nbsp;{{#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&nbsp;{{#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 &#x27E8;{{#invoke:Template wrapper|wrap|_template=IPA|_include-positional=yes}}&#x27E9;<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 &#x27E8;{{#invoke:Template wrapper|wrap|_template=IPA|_include-positional=yes}}&#x27E9;<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)'''.&#32;}}For an introductory guide on IPA symbols, see [[Help:IPA]].{{yesno|{{{brackets|yes}}}|no=|yes=&#32;For the distinction between {{IPA|[&nbsp;]}}, {{IPA|/&nbsp;/}} and {{angbr IPA|&nbsp;}}, see [[International Phonetic Alphabet#Brackets and transcription delimiters|IPA §&nbsp;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)'''.&#32;}}For an introductory guide on IPA symbols, see [[Help:IPA]].{{yesno|{{{brackets|yes}}}|no=|yes=&#32;For the distinction between {{IPA|[&nbsp;]}}, {{IPA|/&nbsp;/}} and {{angbr IPA|&nbsp;}}, see [[International Phonetic Alphabet#Brackets and transcription delimiters|IPA §&nbsp;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}}&nbsp;</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;">&thinsp;{{trim|{{{1}}}}}</span> }}{{#if:{{{2|}}} |&nbsp;– c.<span style="white-space:nowrap;">&thinsp;{{{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}}&nbsp;</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;">&thinsp;{{trim|{{{1}}}}}</span> }}{{#if:{{{2|}}} |&nbsp;– c.<span style="white-space:nowrap;">&thinsp;{{{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>&lt;abbr&gt;</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>&lt;abbr&gt;</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>&lt;abbr&gt;</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>&lt;abbr&gt;</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&nbsp;1" without the template does not sort correctly. "Col&nbsp;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&nbsp;1" without the template does not sort correctly. "Col&nbsp;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