Wiktionary
gdwiktionary
https://gd.wiktionary.org/wiki/Pr%C3%AComh-Dhuilleag
MediaWiki 1.48.0-wmf.1
case-sensitive
Meadhan
Sònraichte
Deasbaireachd
Cleachdaiche
Deasbaireachd a' chleachdaiche
Wiktionary
An deasbaireachd aig Wiktionary
Faidhle
Deasbaireachd an fhaidhle
MediaWiki
Deasbaireachd MediaWiki
Teamplaid
Deasbaireachd na teamplaid
Cobhair
Deasbaireachd na cobharach
Roinn-seòrsa
Deasbaireachd na roinn-seòrsa
TimedText
TimedText talk
Mòideal
Deasbaireachd mòideil
Event
Event talk
MediaWiki:Gadget-WiktCountryFlags.css
8
17939
89289
88881
2026-11-02T23:08:17Z
Maintenance script
1536
Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup)
89289
css
text/css
/*
* flags.css - adds flags to language headers.
* originally created by [[User:Prince Kassad]]
* this version is auto-generated from the list at [[Wiktionary:Language flags list]]
* ([[Special:Permalink/91668618]])
*/
.ns-0 h2 #Translingual::before, .ns-0 h2#Translingual::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6a/Earth_Day_Flag.png/40px-Earth_Day_Flag.png');}
.ns-0 h2 #English::before, .ns-0 h2#English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0b/English_language.svg/40px-English_language.svg.png');}
.ns-0 h2 #\'Are\'are::before, .ns-0 h2#\'Are\'are::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/78/Flag_of_Guadalcanal.svg/40px-Flag_of_Guadalcanal.svg.png');}
.ns-0 h2 #Aari::before, .ns-0 h2#Aari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8a/Flag_of_Southern_Ethiopia.svg/40px-Flag_of_Southern_Ethiopia.svg.png');}
.ns-0 h2 #Abau::before, .ns-0 h2#Abau::before, .ns-0 h2 #Krisa::before, .ns-0 h2#Krisa::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/de/Flag_of_Sandaun.svg/40px-Flag_of_Sandaun.svg.png');}
.ns-0 h2 #Abaza::before, .ns-0 h2#Abaza::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Abazinia.svg/40px-Flag_of_Abazinia.svg.png');}
.ns-0 h2 #Abenaki::before, .ns-0 h2#Abenaki::before, .ns-0 h2 #Malecite-Passamaquoddy::before, .ns-0 h2#Malecite-Passamaquoddy::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/19/Wabanaki_Seal.png/40px-Wabanaki_Seal.png');}
.ns-0 h2 #Abkhaz::before, .ns-0 h2#Abkhaz::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7a/Flag_of_the_Republic_of_Abkhazia.svg/40px-Flag_of_the_Republic_of_Abkhazia.svg.png');}
.ns-0 h2 #Acehnese::before, .ns-0 h2#Acehnese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d8/Flag_of_Aceh_Sultanate.svg/40px-Flag_of_Aceh_Sultanate.svg.png');}
.ns-0 h2 #Acholi::before, .ns-0 h2#Acholi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/96/Flag_of_Acholi.svg/40px-Flag_of_Acholi.svg.png');}
.ns-0 h2 #Adzera::before, .ns-0 h2#Adzera::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_Morobe.png/40px-Flag_of_Morobe.png');}
.ns-0 h2 #Afar::before, .ns-0 h2#Afar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_Djibouti.svg/40px-Flag_of_Djibouti.svg.png');}
.ns-0 h2 #Afrikaans::before, .ns-0 h2#Afrikaans::before, .ns-0 h2 #Fanagalo::before, .ns-0 h2#Fanagalo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/af/Flag_of_South_Africa.svg/40px-Flag_of_South_Africa.svg.png');}
.ns-0 h2 #Agutaynen::before, .ns-0 h2#Agutaynen::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_Agutaya,_Palawan.png/40px-Flag_of_Agutaya,_Palawan.png');}
.ns-0 h2 #Ahom::before, .ns-0 h2#Ahom::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8b/Ahom_insignia_plain.svg/40px-Ahom_insignia_plain.svg.png');}
.ns-0 h2 #Ainu::before, .ns-0 h2#Ainu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9b/Flag_of_Ainu.svg/40px-Flag_of_Ainu.svg.png');}
.ns-0 h2 #Akan::before, .ns-0 h2#Akan::before, .ns-0 h2 #Dagbani::before, .ns-0 h2#Dagbani::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Ghana.svg/40px-Flag_of_Ghana.svg.png');}
.ns-0 h2 #Akha::before, .ns-0 h2#Akha::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_the_Akha_National_Development_Party.svg/40px-Flag_of_the_Akha_National_Development_Party.svg.png');}
.ns-0 h2 #Akkala_Sami::before, .ns-0 h2#Akkala_Sami::before, .ns-0 h2 #Inari_Sami::before, .ns-0 h2#Inari_Sami::before, .ns-0 h2 #Kemi_Sami::before, .ns-0 h2#Kemi_Sami::before, .ns-0 h2 #Kildin_Sami::before, .ns-0 h2#Kildin_Sami::before, .ns-0 h2 #Lule_Sami::before, .ns-0 h2#Lule_Sami::before, .ns-0 h2 #Northern_Sami::before, .ns-0 h2#Northern_Sami::before, .ns-0 h2 #Pite_Sami::before, .ns-0 h2#Pite_Sami::before, .ns-0 h2 #Skolt_Sami::before, .ns-0 h2#Skolt_Sami::before, .ns-0 h2 #Southern_Sami::before, .ns-0 h2#Southern_Sami::before, .ns-0 h2 #Ter_Sami::before, .ns-0 h2#Ter_Sami::before, .ns-0 h2 #Ume_Sami::before, .ns-0 h2#Ume_Sami::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1b/Sami_flag.svg/40px-Sami_flag.svg.png');}
.ns-0 h2 #Aklanon::before, .ns-0 h2#Aklanon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/90/PH-AKL_Flag.png/40px-PH-AKL_Flag.png');}
.ns-0 h2 #Albanian::before, .ns-0 h2#Albanian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Albania.svg/40px-Flag_of_Albania.svg.png');}
.ns-0 h2 #Alemannic_German::before, .ns-0 h2#Alemannic_German::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Flag_of_Switzerland_(Pantone).svg/40px-Flag_of_Switzerland_(Pantone).svg.png');}
.ns-0 h2 #Aleut::before, .ns-0 h2#Aleut::before, .ns-0 h2 #Inupiaq::before, .ns-0 h2#Inupiaq::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Alaska.svg/40px-Flag_of_Alaska.svg.png');}
.ns-0 h2 #Algerian_Arabic::before, .ns-0 h2#Algerian_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Algeria.svg/40px-Flag_of_Algeria.svg.png');}
.ns-0 h2 #Ambonese_Malay::before, .ns-0 h2#Ambonese_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c0/Lambang_Ambon.png/28px-Lambang_Ambon.png');}
.ns-0 h2 #American_Sign_Language::before, .ns-0 h2#American_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/40px-Flag_of_the_United_States.svg.png');}
.ns-0 h2 #Amharic::before, .ns-0 h2#Amharic::before, .ns-0 h2 #Argobba::before, .ns-0 h2#Argobba::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Ethiopia.svg/40px-Flag_of_Ethiopia.svg.png');}
.ns-0 h2 #Amis::before, .ns-0 h2#Amis::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/28/Emblem_of_Hualien_County_2010.svg/37px-Emblem_of_Hualien_County_2010.svg.png');}
.ns-0 h2 #Ancient_Greek::before, .ns-0 h2#Ancient_Greek::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/58/Byzantine_imperial_flag,_14th_century,_square.svg/37px-Byzantine_imperial_flag,_14th_century,_square.svg.png');}
.ns-0 h2 #Andalusian_Arabic::before, .ns-0 h2#Andalusian_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Green-White_Flag.svg/40px-Green-White_Flag.svg.png');}
.ns-0 h2 #Angevin::before, .ns-0 h2#Angevin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/ad/Flag_of_Anjou.svg/40px-Flag_of_Anjou.svg.png');}
.ns-0 h2 #Angika::before, .ns-0 h2#Angika::before, .ns-0 h2 #Magahi::before, .ns-0 h2#Magahi::before, .ns-0 h2 #Maithili::before, .ns-0 h2#Maithili::before, .ns-0 h2 #Santali::before, .ns-0 h2#Santali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a9/Jharkhand_Rajakiya_Chihna.svg/40px-Jharkhand_Rajakiya_Chihna.svg.png');}
.ns-0 h2 #Angolar::before, .ns-0 h2#Angolar::before, .ns-0 h2 #Sãotomense::before, .ns-0 h2#Sãotomense::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_São_Tomé_and_Príncipe.svg/40px-Flag_of_São_Tomé_and_Príncipe.svg.png');}
.ns-0 h2 #Anguthimri::before, .ns-0 h2#Anguthimri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/04/Flag_of_Queensland.svg/40px-Flag_of_Queensland.svg.png');}
.ns-0 h2 #Annobonese::before, .ns-0 h2#Annobonese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/72/Bandera_Annobon.png/40px-Bandera_Annobon.png');}
.ns-0 h2 #Antigua_and_Barbuda_Creole_English::before, .ns-0 h2#Antigua_and_Barbuda_Creole_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Antigua_and_Barbuda.svg/40px-Flag_of_Antigua_and_Barbuda.svg.png');}
.ns-0 h2 #Antillean_Creole::before, .ns-0 h2#Antillean_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Saint_Lucia.svg/40px-Flag_of_Saint_Lucia.svg.png');}
.ns-0 h2 #Ao::before, .ns-0 h2#Ao::before, .ns-0 h2 #Naga_Pidgin::before, .ns-0 h2#Naga_Pidgin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dd/Unofficial_flag_of_Nagaland.svg/40px-Unofficial_flag_of_Nagaland.svg.png');}
.ns-0 h2 #Arabic::before, .ns-0 h2#Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2b/Flag_of_the_Arab_League.svg/40px-Flag_of_the_Arab_League.svg.png');}
.ns-0 h2 #Aragonese::before, .ns-0 h2#Aragonese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/18/Flag_of_Aragon.svg/40px-Flag_of_Aragon.svg.png');}
.ns-0 h2 #Arapaho::before, .ns-0 h2#Arapaho::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/85/Flag_of_Arapaho_Nation.svg/40px-Flag_of_Arapaho_Nation.svg.png');}
.ns-0 h2 #Armenian::before, .ns-0 h2#Armenian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Armenia.svg/40px-Flag_of_Armenia.svg.png');}
.ns-0 h2 #Aromanian::before, .ns-0 h2#Aromanian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/97/Aromanian_flag.svg/40px-Aromanian_flag.svg.png');}
.ns-0 h2 #Asi::before, .ns-0 h2#Asi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/39/Flag_of_Banton,_Romblon.png/40px-Flag_of_Banton,_Romblon.png');}
.ns-0 h2 #Assamese::before, .ns-0 h2#Assamese::before, .ns-0 h2 #Bodo_\(India\)::before, .ns-0 h2#Bodo_\(India\)::before, .ns-0 h2 #Gujarati::before, .ns-0 h2#Gujarati::before, .ns-0 h2 #Hindi::before, .ns-0 h2#Hindi::before, .ns-0 h2 #Malayalam::before, .ns-0 h2#Malayalam::before, .ns-0 h2 #Marathi::before, .ns-0 h2#Marathi::before, .ns-0 h2 #Telugu::before, .ns-0 h2#Telugu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_India.svg/40px-Flag_of_India.svg.png');}
.ns-0 h2 #Assyrian_Neo-Aramaic::before, .ns-0 h2#Assyrian_Neo-Aramaic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_the_Assyrians_(gold_and_blue_Assur).svg/40px-Flag_of_the_Assyrians_(gold_and_blue_Assur).svg.png');}
.ns-0 h2 #Asturian::before, .ns-0 h2#Asturian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_Asturias.svg/40px-Flag_of_Asturias.svg.png');}
.ns-0 h2 #Atayal::before, .ns-0 h2#Atayal::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_New_Taipei_City.svg/40px-Flag_of_New_Taipei_City.svg.png');}
.ns-0 h2 #Atikamekw::before, .ns-0 h2#Atikamekw::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5f/Flag_of_Quebec.svg/40px-Flag_of_Quebec.svg.png');}
.ns-0 h2 #Aukan::before, .ns-0 h2#Aukan::before, .ns-0 h2 #Saramaccan::before, .ns-0 h2#Saramaccan::before, .ns-0 h2 #Sranan_Tongo::before, .ns-0 h2#Sranan_Tongo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/60/Flag_of_Suriname.svg/40px-Flag_of_Suriname.svg.png');}
.ns-0 h2 #Australian_Kriol::before, .ns-0 h2#Australian_Kriol::before, .ns-0 h2 #Torres_Strait_Creole::before, .ns-0 h2#Torres_Strait_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3f/Australian_Aboriginal_Flag.svg/40px-Australian_Aboriginal_Flag.svg.png');}
.ns-0 h2 #Avar::before, .ns-0 h2#Avar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/80/Flag_of_Avars.svg/40px-Flag_of_Avars.svg.png');}
.ns-0 h2 #Avestan::before, .ns-0 h2#Avestan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f9/Faravahar-Gold.svg/40px-Faravahar-Gold.svg.png');}
.ns-0 h2 #Awadhi::before, .ns-0 h2#Awadhi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f2/Flag_of_Awadh.svg/40px-Flag_of_Awadh.svg.png');}
.ns-0 h2 #Aymara::before, .ns-0 h2#Aymara::before, .ns-0 h2 #Bolivian_Sign_Language::before, .ns-0 h2#Bolivian_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/de/Flag_of_Bolivia_(state).svg/40px-Flag_of_Bolivia_(state).svg.png');}
.ns-0 h2 #Azerbaijani::before, .ns-0 h2#Azerbaijani::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Azerbaijan.svg/40px-Flag_of_Azerbaijan.svg.png');}
.ns-0 h2 #Baba_Malay::before, .ns-0 h2#Baba_Malay::before, .ns-0 h2 #Singapore_Sign_Language::before, .ns-0 h2#Singapore_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Singapore.svg/40px-Flag_of_Singapore.svg.png');}
.ns-0 h2 #Bacanese_Malay::before, .ns-0 h2#Bacanese_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Bendera_Sultan_Bacan.svg/40px-Bendera_Sultan_Bacan.svg.png');}
.ns-0 h2 #Badaga::before, .ns-0 h2#Badaga::before, .ns-0 h2 #Tamil::before, .ns-0 h2#Tamil::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7c/Seal_of_Tamil_Nadu.svg/40px-Seal_of_Tamil_Nadu.svg.png');}
.ns-0 h2 #Bagheli::before, .ns-0 h2#Bagheli::before, .ns-0 h2 #Bundeli::before, .ns-0 h2#Bundeli::before, .ns-0 h2 #Korku::before, .ns-0 h2#Korku::before, .ns-0 h2 #Malvi::before, .ns-0 h2#Malvi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/ae/Emblem_of_Madhya_Pradesh.svg/40px-Emblem_of_Madhya_Pradesh.svg.png');}
.ns-0 h2 #Baharna_Arabic::before, .ns-0 h2#Baharna_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Bahrain.svg/40px-Flag_of_Bahrain.svg.png');}
.ns-0 h2 #Bahnar::before, .ns-0 h2#Bahnar::before, .ns-0 h2 #Hrê::before, .ns-0 h2#Hrê::before, .ns-0 h2 #Vietnamese::before, .ns-0 h2#Vietnamese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Vietnam.svg/40px-Flag_of_Vietnam.svg.png');}
.ns-0 h2 #Bajan::before, .ns-0 h2#Bajan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ef/Flag_of_Barbados.svg/40px-Flag_of_Barbados.svg.png');}
.ns-0 h2 #Balinese::before, .ns-0 h2#Balinese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/89/Historical_Flag_of_Bali.png/40px-Historical_Flag_of_Bali.png');}
.ns-0 h2 #Balinese_Malay::before, .ns-0 h2#Balinese_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/10/Coat_of_arms_of_Bali.svg/35px-Coat_of_arms_of_Bali.svg.png');}
.ns-0 h2 #Balti::before, .ns-0 h2#Balti::before, .ns-0 h2 #Burushaski::before, .ns-0 h2#Burushaski::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/62/Flag_of_Hunza.svg/40px-Flag_of_Hunza.svg.png');}
.ns-0 h2 #Baluchi::before, .ns-0 h2#Baluchi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Balochistan.svg/40px-Flag_of_Balochistan.svg.png');}
.ns-0 h2 #Bambara::before, .ns-0 h2#Bambara::before, .ns-0 h2 #Soninke::before, .ns-0 h2#Soninke::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_Mali.svg/40px-Flag_of_Mali.svg.png');}
.ns-0 h2 #Banjarese::before, .ns-0 h2#Banjarese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a5/Banjar_Sultanate_Flag.svg/40px-Banjar_Sultanate_Flag.svg.png');}
.ns-0 h2 #Baoule::before, .ns-0 h2#Baoule::before, .ns-0 h2 #Dyula::before, .ns-0 h2#Dyula::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Côte_d'Ivoire.svg/40px-Flag_of_Côte_d'Ivoire.svg.png");}
.ns-0 h2 #Bari::before, .ns-0 h2#Bari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d2/Flag_of_the_Bari_people.svg/40px-Flag_of_the_Bari_people.svg.png');}
.ns-0 h2 #Barikanchi::before, .ns-0 h2#Barikanchi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2b/Flag_of_the_Nigerian_Armed_Forces.svg/40px-Flag_of_the_Nigerian_Armed_Forces.svg.png');}
.ns-0 h2 #Bashkir::before, .ns-0 h2#Bashkir::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3d/Flag_of_Bashkortostan.svg/40px-Flag_of_Bashkortostan.svg.png');}
.ns-0 h2 #Basque::before, .ns-0 h2#Basque::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2d/Flag_of_the_Basque_Country.svg/40px-Flag_of_the_Basque_Country.svg.png');}
.ns-0 h2 #Bavarian::before, .ns-0 h2#Bavarian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_Bavaria_(lozengy).svg/40px-Flag_of_Bavaria_(lozengy).svg.png');}
.ns-0 h2 #Beja::before, .ns-0 h2#Beja::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_the_Beja_Congress.svg/40px-Flag_of_the_Beja_Congress.svg.png');}
.ns-0 h2 #Belarusian::before, .ns-0 h2#Belarusian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/85/Flag_of_Belarus.svg/40px-Flag_of_Belarus.svg.png');}
.ns-0 h2 #Belizean_Creole::before, .ns-0 h2#Belizean_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e7/Flag_of_Belize.svg/40px-Flag_of_Belize.svg.png');}
.ns-0 h2 #Bella_Coola::before, .ns-0 h2#Bella_Coola::before, .ns-0 h2 #Halkomelem::before, .ns-0 h2#Halkomelem::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_British_Columbia.svg/40px-Flag_of_British_Columbia.svg.png');}
.ns-0 h2 #Bemba::before, .ns-0 h2#Bemba::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Zambia.svg/40px-Flag_of_Zambia.svg.png');}
.ns-0 h2 #Bengali::before, .ns-0 h2#Bengali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/80/Bengali_language.svg/40px-Bengali_language.svg.png');}
.ns-0 h2 #Berau_Malay::before, .ns-0 h2#Berau_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7f/East_Borneo_Sultanate_Flags.png/40px-East_Borneo_Sultanate_Flags.png');}
.ns-0 h2 #Berbice_Creole_Dutch::before, .ns-0 h2#Berbice_Creole_Dutch::before, .ns-0 h2 #Skepi_Creole_Dutch::before, .ns-0 h2#Skepi_Creole_Dutch::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_the_Dutch_West_India_Company.svg/40px-Flag_of_the_Dutch_West_India_Company.svg.png');}
.ns-0 h2 #Betawi::before, .ns-0 h2#Betawi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/eb/Coat_of_arms_of_Jakarta.svg/30px-Coat_of_arms_of_Jakarta.svg.png');}
.ns-0 h2 #Bhojpuri::before, .ns-0 h2#Bhojpuri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fa/Seal_of_Uttar_Pradesh.svg/40px-Seal_of_Uttar_Pradesh.svg.png');}
.ns-0 h2 #Bihari::before, .ns-0 h2#Bihari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e9/Seal_of_Bihar.svg/40px-Seal_of_Bihar.svg.png');}
.ns-0 h2 #Bima::before, .ns-0 h2#Bima::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6d/Bendera_Kesultanan_Bima.png/40px-Bendera_Kesultanan_Bima.png');}
.ns-0 h2 #Binukid::before, .ns-0 h2#Binukid::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c8/Flag_of_the_Province_of_Bukidnon.svg/40px-Flag_of_the_Province_of_Bukidnon.svg.png');}
.ns-0 h2 #Bislama::before, .ns-0 h2#Bislama::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Vanuatu.svg/40px-Flag_of_Vanuatu.svg.png');}
.ns-0 h2 #Blackfoot::before, .ns-0 h2#Blackfoot::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_the_Blackfoot_Confederacy.jpg/40px-Flag_of_the_Blackfoot_Confederacy.jpg');}
.ns-0 h2 #Boon::before, .ns-0 h2#Boon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a6/Flag_of_Jubaland_(Somalia).svg/40px-Flag_of_Jubaland_(Somalia).svg.png');}
.ns-0 h2 #Bourbonnais-Berrichon::before, .ns-0 h2#Bourbonnais-Berrichon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f9/Flag_of_Bourbonnais.svg/40px-Flag_of_Bourbonnais.svg.png');}
.ns-0 h2 #Bourguignon::before, .ns-0 h2#Bourguignon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_Bourgogne.svg/40px-Flag_of_Bourgogne.svg.png');}
.ns-0 h2 #Brahui::before, .ns-0 h2#Brahui::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/59/FlagofKalat.svg/40px-FlagofKalat.svg.png');}
.ns-0 h2 #Brazilian_Sign_Language::before, .ns-0 h2#Brazilian_Sign_Language::before, .ns-0 h2 #Old_Tupi::before, .ns-0 h2#Old_Tupi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Brazil.svg/40px-Flag_of_Brazil.svg.png');}
.ns-0 h2 #Breton::before, .ns-0 h2#Breton::before, .ns-0 h2 #Gallo::before, .ns-0 h2#Gallo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7d/Flag_of_Brittany.svg/40px-Flag_of_Brittany.svg.png');}
.ns-0 h2 #Brokkat::before, .ns-0 h2#Brokkat::before, .ns-0 h2 #Bumthangkha::before, .ns-0 h2#Bumthangkha::before, .ns-0 h2 #Chocangaca::before, .ns-0 h2#Chocangaca::before, .ns-0 h2 #Dzala::before, .ns-0 h2#Dzala::before, .ns-0 h2 #Dzongkha::before, .ns-0 h2#Dzongkha::before, .ns-0 h2 #Kurtöp::before, .ns-0 h2#Kurtöp::before, .ns-0 h2 #Tshangla::before, .ns-0 h2#Tshangla::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/91/Flag_of_Bhutan.svg/40px-Flag_of_Bhutan.svg.png');}
.ns-0 h2 #Brooke\'s_Point_Palawano::before, .ns-0 h2#Brooke\'s_Point_Palawano::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a8/Flag_of_Palawan,_Philippines.svg/40px-Flag_of_Palawan,_Philippines.svg.png');}
.ns-0 h2 #Brunei_Malay::before, .ns-0 h2#Brunei_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Brunei.svg/40px-Flag_of_Brunei.svg.png');}
.ns-0 h2 #Bulgarian::before, .ns-0 h2#Bulgarian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Bulgaria.svg/40px-Flag_of_Bulgaria.svg.png');}
.ns-0 h2 #Bunun::before, .ns-0 h2#Bunun::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Nantou_County.svg/40px-Flag_of_Nantou_County.svg.png');}
.ns-0 h2 #Burmese::before, .ns-0 h2#Burmese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8c/Flag_of_Myanmar.svg/40px-Flag_of_Myanmar.svg.png');}
.ns-0 h2 #Buryat::before, .ns-0 h2#Buryat::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/68/Flag_of_Buryatia.svg/40px-Flag_of_Buryatia.svg.png');}
.ns-0 h2 #Butuanon::before, .ns-0 h2#Butuanon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7b/Butuancityflag.jpg/40px-Butuancityflag.jpg');}
.ns-0 h2 #Cahuilla::before, .ns-0 h2#Cahuilla::before, .ns-0 h2 #Northern_Valley_Yokuts::before, .ns-0 h2#Northern_Valley_Yokuts::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_California.svg/40px-Flag_of_California.svg.png');}
.ns-0 h2 #Calabrian_Greek::before, .ns-0 h2#Calabrian_Greek::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8b/Flag_of_Calabria.svg/40px-Flag_of_Calabria.svg.png');}
.ns-0 h2 #Caluyanun::before, .ns-0 h2#Caluyanun::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Caluya,_Antique.png/40px-Flag_of_Caluya,_Antique.png');}
.ns-0 h2 #Caló::before, .ns-0 h2#Caló::before, .ns-0 h2 #Romani::before, .ns-0 h2#Romani::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/10/Flag_of_the_Romani_people.svg/40px-Flag_of_the_Romani_people.svg.png');}
.ns-0 h2 #Cameroon_Pidgin::before, .ns-0 h2#Cameroon_Pidgin::before, .ns-0 h2 #Ghomala\'::before, .ns-0 h2#Ghomala\'::before, .ns-0 h2 #Matal::before, .ns-0 h2#Matal::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4f/Flag_of_Cameroon.svg/40px-Flag_of_Cameroon.svg.png');}
.ns-0 h2 #Cantonese::before, .ns-0 h2#Cantonese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_Hong_Kong.svg/40px-Flag_of_Hong_Kong.svg.png');}
.ns-0 h2 #Caribbean_Hindustani::before, .ns-0 h2#Caribbean_Hindustani::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Suriname_and_Guyana.png/40px-Flag_of_Suriname_and_Guyana.png');}
.ns-0 h2 #Carolinian::before, .ns-0 h2#Carolinian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_the_Northern_Mariana_Islands.svg/40px-Flag_of_the_Northern_Mariana_Islands.svg.png');}
.ns-0 h2 #Carpathian_Rusyn::before, .ns-0 h2#Carpathian_Rusyn::before, .ns-0 h2 #Pannonian_Rusyn::before, .ns-0 h2#Pannonian_Rusyn::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Rusyns_2007.svg/40px-Flag_of_Rusyns_2007.svg.png');}
.ns-0 h2 #Catalan::before, .ns-0 h2#Catalan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Catalonia.svg/40px-Flag_of_Catalonia.svg.png');}
.ns-0 h2 #Cavineña::before, .ns-0 h2#Cavineña::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/70/Flag_of_Beni.svg/40px-Flag_of_Beni.svg.png');}
.ns-0 h2 #Cebuano::before, .ns-0 h2#Cebuano::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Cebu_(province).svg/40px-Flag_of_Cebu_(province).svg.png');}
.ns-0 h2 #Central_Atlas_Tamazight::before, .ns-0 h2#Central_Atlas_Tamazight::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ec/Berber_flag.svg/40px-Berber_flag.svg.png');}
.ns-0 h2 #Central_Bikol::before, .ns-0 h2#Central_Bikol::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_the_Katipuneros_of_Bicol.svg/40px-Flag_of_the_Katipuneros_of_Bicol.svg.png');}
.ns-0 h2 #Central_Dusun::before, .ns-0 h2#Central_Dusun::before, .ns-0 h2 #Sabah_Malay::before, .ns-0 h2#Sabah_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b5/Flag_of_Sabah.svg/40px-Flag_of_Sabah.svg.png');}
.ns-0 h2 #Central_Kurdish::before, .ns-0 h2#Central_Kurdish::before, .ns-0 h2 #Northern_Kurdish::before, .ns-0 h2#Northern_Kurdish::before, .ns-0 h2 #Southern_Kurdish::before, .ns-0 h2#Southern_Kurdish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_Kurdistan.svg/40px-Flag_of_Kurdistan.svg.png');}
.ns-0 h2 #Central_Mansi::before, .ns-0 h2#Central_Mansi::before, .ns-0 h2 #Eastern_Khanty::before, .ns-0 h2#Eastern_Khanty::before, .ns-0 h2 #Northern_Khanty::before, .ns-0 h2#Northern_Khanty::before, .ns-0 h2 #Northern_Mansi::before, .ns-0 h2#Northern_Mansi::before, .ns-0 h2 #Southern_Khanty::before, .ns-0 h2#Southern_Khanty::before, .ns-0 h2 #Southern_Mansi::before, .ns-0 h2#Southern_Mansi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/70/Flag_of_Yugra.svg/40px-Flag_of_Yugra.svg.png');}
.ns-0 h2 #Central_Nahuatl::before, .ns-0 h2#Central_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_Tlaxcala.svg/40px-Flag_of_Tlaxcala.svg.png');}
.ns-0 h2 #Chadian_Arabic::before, .ns-0 h2#Chadian_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4b/Flag_of_Chad.svg/40px-Flag_of_Chad.svg.png');}
.ns-0 h2 #Chakma::before, .ns-0 h2#Chakma::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d7/Chakma_Flag.jpg/40px-Chakma_Flag.jpg');}
.ns-0 h2 #Chaldean_Neo-Aramaic::before, .ns-0 h2#Chaldean_Neo-Aramaic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/95/Chaldean_flag.svg/40px-Chaldean_flag.svg.png');}
.ns-0 h2 #Chamorro::before, .ns-0 h2#Chamorro::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/07/Flag_of_Guam.svg/40px-Flag_of_Guam.svg.png');}
.ns-0 h2 #Champenois::before, .ns-0 h2#Champenois::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f1/Flag_of_Champagne-Ardenne.svg/40px-Flag_of_Champagne-Ardenne.svg.png');}
.ns-0 h2 #Chavacano::before, .ns-0 h2#Chavacano::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/16/Flag_of_Zamboanga.jpg/40px-Flag_of_Zamboanga.jpg');}
.ns-0 h2 #Chechen::before, .ns-0 h2#Chechen::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/13/Flag_of_the_Chechen_Republic.svg/40px-Flag_of_the_Chechen_Republic.svg.png');}
.ns-0 h2 #Cherokee::before, .ns-0 h2#Cherokee::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4d/Flag_of_the_Cherokee_Nation.svg/40px-Flag_of_the_Cherokee_Nation.svg.png');}
.ns-0 h2 #Cheyenne::before, .ns-0 h2#Cheyenne::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e7/Flag_of_Northern_Cheyenne.svg/40px-Flag_of_Northern_Cheyenne.svg.png');}
.ns-0 h2 #Chhattisgarhi::before, .ns-0 h2#Chhattisgarhi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/87/Coat_of_arms_of_Chhattisgarh.svg/40px-Coat_of_arms_of_Chhattisgarh.svg.png');}
.ns-0 h2 #Chibcha::before, .ns-0 h2#Chibcha::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8d/Bandera_de_la_confederacion_muisca.png/33px-Bandera_de_la_confederacion_muisca.png');}
.ns-0 h2 #Chichewa::before, .ns-0 h2#Chichewa::before, .ns-0 h2 #Tumbuka::before, .ns-0 h2#Tumbuka::before, .ns-0 h2 #Yao_\(Africa\)::before, .ns-0 h2#Yao_\(Africa\)::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d1/Flag_of_Malawi.svg/40px-Flag_of_Malawi.svg.png');}
.ns-0 h2 #Chickasaw::before, .ns-0 h2#Chickasaw::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/74/Flag_of_the_Chickasaw_Nation.svg/40px-Flag_of_the_Chickasaw_Nation.svg.png');}
.ns-0 h2 #Chimwiini::before, .ns-0 h2#Chimwiini::before, .ns-0 h2 #Maay::before, .ns-0 h2#Maay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8b/Flag_of_South_West_State_of_Somalia.svg/40px-Flag_of_South_West_State_of_Somalia.svg.png');}
.ns-0 h2 #Chinese::before, .ns-0 h2#Chinese::before, .ns-0 h2 #Chinese_Pidgin_English::before, .ns-0 h2#Chinese_Pidgin_English::before, .ns-0 h2 #Mandarin::before, .ns-0 h2#Mandarin::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_the_People's_Republic_of_China.svg/40px-Flag_of_the_People's_Republic_of_China.svg.png");}
.ns-0 h2 #Chittagonian::before, .ns-0 h2#Chittagonian::before, .ns-0 h2 #Sylheti::before, .ns-0 h2#Sylheti::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f9/Flag_of_Bangladesh.svg/40px-Flag_of_Bangladesh.svg.png');}
.ns-0 h2 #Choctaw::before, .ns-0 h2#Choctaw::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a6/Choctaw_flag.svg/40px-Choctaw_flag.svg.png');}
.ns-0 h2 #Chukchi::before, .ns-0 h2#Chukchi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_Chukotka.svg/40px-Flag_of_Chukotka.svg.png');}
.ns-0 h2 #Church_Slavonic::before, .ns-0 h2#Church_Slavonic::before, .ns-0 h2 #Old_Church_Slavonic::before, .ns-0 h2#Old_Church_Slavonic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8e/Bulgarian_Orthodox_Cross_6.svg/33px-Bulgarian_Orthodox_Cross_6.svg.png');}
.ns-0 h2 #Chuukese::before, .ns-0 h2#Chuukese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Flag_of_Chuuk.svg/40px-Flag_of_Chuuk.svg.png');}
.ns-0 h2 #Chuvash::before, .ns-0 h2#Chuvash::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d7/Flag_of_Chuvashia.svg/40px-Flag_of_Chuvashia.svg.png');}
.ns-0 h2 #Cimbrian::before, .ns-0 h2#Cimbrian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_the_Province_of_Trento.svg/40px-Flag_of_the_Province_of_Trento.svg.png');}
.ns-0 h2 #Classical_Nahuatl::before, .ns-0 h2#Classical_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/87/Aztec_Triple_Alliance.png/40px-Aztec_Triple_Alliance.png');}
.ns-0 h2 #Coptic::before, .ns-0 h2#Coptic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/71/Coptic_cross.svg/35px-Coptic_cross.svg.png');}
.ns-0 h2 #Cornish::before, .ns-0 h2#Cornish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Cornwall.svg/40px-Flag_of_Cornwall.svg.png');}
.ns-0 h2 #Corsican::before, .ns-0 h2#Corsican::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7c/Flag_of_Corsica.svg/40px-Flag_of_Corsica.svg.png');}
.ns-0 h2 #Cree::before, .ns-0 h2#Cree::before, .ns-0 h2 #Dogrib::before, .ns-0 h2#Dogrib::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_the_Northwest_Territories.svg/40px-Flag_of_the_Northwest_Territories.svg.png');}
.ns-0 h2 #Creek::before, .ns-0 h2#Creek::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d4/State_of_Muskogee_(Florida,_1799-1803).svg/40px-State_of_Muskogee_(Florida,_1799-1803).svg.png');}
.ns-0 h2 #Crimean_Tatar::before, .ns-0 h2#Crimean_Tatar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Flag_of_the_Crimean_Tatar_people.svg/40px-Flag_of_the_Crimean_Tatar_people.svg.png');}
.ns-0 h2 #Croatian_Sign_Language::before, .ns-0 h2#Croatian_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Croatia.svg/40px-Flag_of_Croatia.svg.png');}
.ns-0 h2 #Cuban_Sign_Language::before, .ns-0 h2#Cuban_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bd/Flag_of_Cuba.svg/40px-Flag_of_Cuba.svg.png');}
.ns-0 h2 #Cubeo::before, .ns-0 h2#Cubeo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c0/Flag_of_Vaupés.svg/40px-Flag_of_Vaupés.svg.png');}
.ns-0 h2 #Cuyunon::before, .ns-0 h2#Cuyunon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Cuyo,_Palawan.png/40px-Flag_of_Cuyo,_Palawan.png');}
.ns-0 h2 #Cypriot_Arabic::before, .ns-0 h2#Cypriot_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Cyprus.svg/40px-Flag_of_Cyprus.svg.png');}
.ns-0 h2 #Czech::before, .ns-0 h2#Czech::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_Czech_Republic.svg/40px-Flag_of_the_Czech_Republic.svg.png');}
.ns-0 h2 #Dahalik::before, .ns-0 h2#Dahalik::before, .ns-0 h2 #Tigre::before, .ns-0 h2#Tigre::before, .ns-0 h2 #Tigrinya::before, .ns-0 h2#Tigrinya::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/29/Flag_of_Eritrea.svg/40px-Flag_of_Eritrea.svg.png');}
.ns-0 h2 #Dakota::before, .ns-0 h2#Dakota::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ee/Flag_of_North_Dakota.svg/40px-Flag_of_North_Dakota.svg.png');}
.ns-0 h2 #Dalmatian::before, .ns-0 h2#Dalmatian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Kingdom_of_Dalmatia_(1852-1860).svg/40px-Flag_of_Kingdom_of_Dalmatia_(1852-1860).svg.png');}
.ns-0 h2 #Danish::before, .ns-0 h2#Danish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9c/Flag_of_Denmark.svg/40px-Flag_of_Denmark.svg.png');}
.ns-0 h2 #Dhivehi::before, .ns-0 h2#Dhivehi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Maldives.svg/40px-Flag_of_Maldives.svg.png');}
.ns-0 h2 #Dhofari_Arabic::before, .ns-0 h2#Dhofari_Arabic::before, .ns-0 h2 #Omani_Arabic::before, .ns-0 h2#Omani_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_Oman.svg/40px-Flag_of_Oman.svg.png');}
.ns-0 h2 #Dinka::before, .ns-0 h2#Dinka::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1d/Flag_of_Dinka_people.svg/40px-Flag_of_Dinka_people.svg.png');}
.ns-0 h2 #Dutch::before, .ns-0 h2#Dutch::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/40px-Flag_of_the_Netherlands.svg.png');}
.ns-0 h2 #East_Circassian::before, .ns-0 h2#East_Circassian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d8/Flag_of_Kabardino-Balkaria.svg/40px-Flag_of_Kabardino-Balkaria.svg.png');}
.ns-0 h2 #East_Futuna::before, .ns-0 h2#East_Futuna::before, .ns-0 h2 #Wallisian::before, .ns-0 h2#Wallisian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d2/Flag_of_Wallis_and_Futuna.svg/40px-Flag_of_Wallis_and_Futuna.svg.png');}
.ns-0 h2 #Eastern_Durango_Nahuatl::before, .ns-0 h2#Eastern_Durango_Nahuatl::before, .ns-0 h2 #Western_Durango_Nahuatl::before, .ns-0 h2#Western_Durango_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4b/Coat_of_arms_of_Durango.svg/35px-Coat_of_arms_of_Durango.svg.png');}
.ns-0 h2 #Eastern_Maninkakan::before, .ns-0 h2#Eastern_Maninkakan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Guinea.svg/40px-Flag_of_Guinea.svg.png');}
.ns-0 h2 #Eastern_Mari::before, .ns-0 h2#Eastern_Mari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a7/Flag_of_Mari_El.svg/40px-Flag_of_Mari_El.svg.png');}
.ns-0 h2 #Edo::before, .ns-0 h2#Edo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ec/Edo_State_Flag.png/40px-Edo_State_Flag.png');}
.ns-0 h2 #Egyptian::before, .ns-0 h2#Egyptian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1c/Ancient_Egyptian_Culture_Flag.webp/40px-Ancient_Egyptian_Culture_Flag.webp');}
.ns-0 h2 #Egyptian_Arabic::before, .ns-0 h2#Egyptian_Arabic::before, .ns-0 h2 #Nobiin::before, .ns-0 h2#Nobiin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Egypt.svg/40px-Flag_of_Egypt.svg.png');}
.ns-0 h2 #Elfdalian::before, .ns-0 h2#Elfdalian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/ff/Älvdalen_vapen.svg/33px-Älvdalen_vapen.svg.png');}
.ns-0 h2 #Emilian::before, .ns-0 h2#Emilian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1f/Flag_of_Bologna_2.png/40px-Flag_of_Bologna_2.png');}
.ns-0 h2 #Erzya::before, .ns-0 h2#Erzya::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/28/Erzya_Flag.svg/40px-Erzya_Flag.svg.png');}
.ns-0 h2 #Ese::before, .ns-0 h2#Ese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5d/Flag_of_Flag_Oro_new.png/40px-Flag_of_Flag_Oro_new.png');}
.ns-0 h2 #Esperanto::before, .ns-0 h2#Esperanto::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f5/Flag_of_Esperanto.svg/40px-Flag_of_Esperanto.svg.png');}
.ns-0 h2 #Estonian::before, .ns-0 h2#Estonian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8f/Flag_of_Estonia.svg/40px-Flag_of_Estonia.svg.png');}
.ns-0 h2 #Evenki::before, .ns-0 h2#Evenki::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_Evenks.svg/40px-Flag_of_Evenks.svg.png');}
.ns-0 h2 #Ewe::before, .ns-0 h2#Ewe::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_the_Ewe_people.svg/40px-Flag_of_the_Ewe_people.svg.png');}
.ns-0 h2 #Extremaduran::before, .ns-0 h2#Extremaduran::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/13/Flag_of_Extremadura,_Spain_(with_coat_of_arms).svg/40px-Flag_of_Extremadura,_Spain_(with_coat_of_arms).svg.png');}
.ns-0 h2 #Fala::before, .ns-0 h2#Fala::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b7/Bandera_de_Valverde_del_Fresno_(Cáceres).svg/40px-Bandera_de_Valverde_del_Fresno_(Cáceres).svg.png');}
.ns-0 h2 #Fang_\(Bantu\)::before, .ns-0 h2#Fang_\(Bantu\)::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/04/Flag_of_Gabon.svg/40px-Flag_of_Gabon.svg.png');}
.ns-0 h2 #Faroese::before, .ns-0 h2#Faroese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_Faroe_Islands.svg/40px-Flag_of_the_Faroe_Islands.svg.png');}
.ns-0 h2 #Fiji_Hindi::before, .ns-0 h2#Fiji_Hindi::before, .ns-0 h2 #Fijian::before, .ns-0 h2#Fijian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Fiji.svg/40px-Flag_of_Fiji.svg.png');}
.ns-0 h2 #Fingallian::before, .ns-0 h2#Fingallian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/22/Flag_of_County_Limerick.svg/40px-Flag_of_County_Limerick.svg.png');}
.ns-0 h2 #Finnish::before, .ns-0 h2#Finnish::before, .ns-0 h2 #Finnish_Sign_Language::before, .ns-0 h2#Finnish_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Finland.svg/40px-Flag_of_Finland.svg.png');}
.ns-0 h2 #Fon::before, .ns-0 h2#Fon::before, .ns-0 h2 #Gun::before, .ns-0 h2#Gun::before, .ns-0 h2 #Ifè::before, .ns-0 h2#Ifè::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Benin.svg/40px-Flag_of_Benin.svg.png');}
.ns-0 h2 #Forest_Nenets::before, .ns-0 h2#Forest_Nenets::before, .ns-0 h2 #Tundra_Nenets::before, .ns-0 h2#Tundra_Nenets::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/15/Flag_of_Nenets_Autonomous_District.svg/40px-Flag_of_Nenets_Autonomous_District.svg.png');}
.ns-0 h2 #Franc-Comtois::before, .ns-0 h2#Franc-Comtois::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/96/Flag_of_Franche-Comté.svg/40px-Flag_of_Franche-Comté.svg.png');}
.ns-0 h2 #Franco-Provençal::before, .ns-0 h2#Franco-Provençal::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/9/90/Flag_of_Valle_d'Aosta.svg/40px-Flag_of_Valle_d'Aosta.svg.png");}
.ns-0 h2 #French::before, .ns-0 h2#French::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_France.svg/40px-Flag_of_France.svg.png');}
.ns-0 h2 #Friulian::before, .ns-0 h2#Friulian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/87/Bandiere_dal_Friûl.svg/40px-Bandiere_dal_Friûl.svg.png');}
.ns-0 h2 #Fula::before, .ns-0 h2#Fula::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/NE-CM-BF-GM_flag.svg/40px-NE-CM-BF-GM_flag.svg.png');}
.ns-0 h2 #Fur::before, .ns-0 h2#Fur::before, .ns-0 h2 #Sudanese_Arabic::before, .ns-0 h2#Sudanese_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Sudan.svg/40px-Flag_of_Sudan.svg.png');}
.ns-0 h2 #Futuna-Aniwa::before, .ns-0 h2#Futuna-Aniwa::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Tafea_Province_Flag.svg/40px-Tafea_Province_Flag.svg.png');}
.ns-0 h2 #Fyam::before, .ns-0 h2#Fyam::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/Plateau_State_Flag.jpg/40px-Plateau_State_Flag.jpg');}
.ns-0 h2 #Ga::before, .ns-0 h2#Ga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cd/Flag_of_Accra.svg/40px-Flag_of_Accra.svg.png');}
.ns-0 h2 #Gabadi::before, .ns-0 h2#Gabadi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Central_Province,_Papua_New_Guinea.svg/40px-Flag_of_Central_Province,_Papua_New_Guinea.svg.png');}
.ns-0 h2 #Gagauz::before, .ns-0 h2#Gagauz::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/69/Flag_of_Gagauzia.svg/40px-Flag_of_Gagauzia.svg.png');}
.ns-0 h2 #Galician::before, .ns-0 h2#Galician::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Galicia.svg/40px-Flag_of_Galicia.svg.png');}
.ns-0 h2 #Gallo-Italic_of_Basilicata::before, .ns-0 h2#Gallo-Italic_of_Basilicata::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_for_the_Lombards_of_Basilicata.png/40px-Flag_for_the_Lombards_of_Basilicata.png');}
.ns-0 h2 #Gallo-Italic_of_Sicily::before, .ns-0 h2#Gallo-Italic_of_Sicily::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/30/Flag_for_the_Lombards_of_Sicily.png/40px-Flag_for_the_Lombards_of_Sicily.png');}
.ns-0 h2 #Gamilaraay::before, .ns-0 h2#Gamilaraay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_New_South_Wales.svg/40px-Flag_of_New_South_Wales.svg.png');}
.ns-0 h2 #Garhwali::before, .ns-0 h2#Garhwali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7d/Flag_of_the_Princely_State_of_Tehri_Garhwal.svg/40px-Flag_of_the_Princely_State_of_Tehri_Garhwal.svg.png');}
.ns-0 h2 #Garifuna::before, .ns-0 h2#Garifuna::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_Garifuna.svg/40px-Flag_of_Garifuna.svg.png');}
.ns-0 h2 #Garo::before, .ns-0 h2#Garo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/81/Garo_hills.png/40px-Garo_hills.png');}
.ns-0 h2 #Ge\'ez::before, .ns-0 h2#Ge\'ez::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Lion_of_Judah_emblem_of_the_Ethiopian_Empire.svg/40px-Lion_of_Judah_emblem_of_the_Ethiopian_Empire.svg.png');}
.ns-0 h2 #Georgian::before, .ns-0 h2#Georgian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Georgia.svg/40px-Flag_of_Georgia.svg.png');}
.ns-0 h2 #German::before, .ns-0 h2#German::before, .ns-0 h2 #German_Sign_Language::before, .ns-0 h2#German_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/40px-Flag_of_Germany.svg.png');}
.ns-0 h2 #Ghadames::before, .ns-0 h2#Ghadames::before, .ns-0 h2 #Libyan_Arabic::before, .ns-0 h2#Libyan_Arabic::before, .ns-0 h2 #Nefusa::before, .ns-0 h2#Nefusa::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/05/Flag_of_Libya.svg/40px-Flag_of_Libya.svg.png');}
.ns-0 h2 #Gilbertese::before, .ns-0 h2#Gilbertese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kiribati.svg/40px-Flag_of_Kiribati.svg.png');}
.ns-0 h2 #Gorontalo::before, .ns-0 h2#Gorontalo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Coat_of_arms_of_Gorontalo.svg/35px-Coat_of_arms_of_Gorontalo.svg.png');}
.ns-0 h2 #Greek::before, .ns-0 h2#Greek::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Greece.svg/40px-Flag_of_Greece.svg.png');}
.ns-0 h2 #Green_Hmong::before, .ns-0 h2#Green_Hmong::before, .ns-0 h2 #White_Hmong::before, .ns-0 h2#White_Hmong::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0f/Hmong_Flag_(UNPO).svg/40px-Hmong_Flag_(UNPO).svg.png');}
.ns-0 h2 #Greenlandic::before, .ns-0 h2#Greenlandic::before, .ns-0 h2 #West_Greenlandic_Pidgin::before, .ns-0 h2#West_Greenlandic_Pidgin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Greenland.svg/40px-Flag_of_Greenland.svg.png');}
.ns-0 h2 #Grenadian_Creole_English::before, .ns-0 h2#Grenadian_Creole_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Grenada.svg/40px-Flag_of_Grenada.svg.png');}
.ns-0 h2 #Guajajára::before, .ns-0 h2#Guajajára::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Bandeira_do_Maranhão.svg/40px-Bandeira_do_Maranhão.svg.png');}
.ns-0 h2 #Guanche::before, .ns-0 h2#Guanche::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b0/Flag_of_the_Canary_Islands.svg/40px-Flag_of_the_Canary_Islands.svg.png');}
.ns-0 h2 #Guerrero_Amuzgo::before, .ns-0 h2#Guerrero_Amuzgo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Guerrero.svg/40px-Flag_of_Guerrero.svg.png');}
.ns-0 h2 #Guianese_Creole::before, .ns-0 h2#Guianese_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/29/Flag_of_French_Guiana.svg/40px-Flag_of_French_Guiana.svg.png');}
.ns-0 h2 #Guinea-Bissau_Creole::before, .ns-0 h2#Guinea-Bissau_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Guinea-Bissau.svg/40px-Flag_of_Guinea-Bissau.svg.png');}
.ns-0 h2 #Gulf_Arabic::before, .ns-0 h2#Gulf_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cb/Flag_of_the_United_Arab_Emirates.svg/40px-Flag_of_the_United_Arab_Emirates.svg.png');}
.ns-0 h2 #Gullah::before, .ns-0 h2#Gullah::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/ff/Black_American_Heritage_flag.svg/40px-Black_American_Heritage_flag.svg.png');}
.ns-0 h2 #Gurindji::before, .ns-0 h2#Gurindji::before, .ns-0 h2 #Warlpiri::before, .ns-0 h2#Warlpiri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b7/Flag_of_the_Northern_Territory.svg/40px-Flag_of_the_Northern_Territory.svg.png');}
.ns-0 h2 #Gutnish::before, .ns-0 h2#Gutnish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c4/Gotlands_län_vapenflagga.svg/37px-Gotlands_län_vapenflagga.svg.png');}
.ns-0 h2 #Guyanese_Creole_English::before, .ns-0 h2#Guyanese_Creole_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_Guyana.svg/40px-Flag_of_Guyana.svg.png');}
.ns-0 h2 #Hadza::before, .ns-0 h2#Hadza::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tanzania.svg/40px-Flag_of_Tanzania.svg.png');}
.ns-0 h2 #Haida::before, .ns-0 h2#Haida::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8f/CHN_Crest.png/33px-CHN_Crest.png');}
.ns-0 h2 #Haitian_Creole::before, .ns-0 h2#Haitian_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Haiti.svg/40px-Flag_of_Haiti.svg.png');}
.ns-0 h2 #Hakka::before, .ns-0 h2#Hakka::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Hakka_Party.svg/40px-Flag_of_Hakka_Party.svg.png');}
.ns-0 h2 #Halia::before, .ns-0 h2#Halia::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e4/Flag_of_Bougainville.svg/40px-Flag_of_Bougainville.svg.png');}
.ns-0 h2 #Harari::before, .ns-0 h2#Harari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6f/Harari_Flag.svg/40px-Harari_Flag.svg.png');}
.ns-0 h2 #Haryanvi::before, .ns-0 h2#Haryanvi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Haryana.svg/40px-Flag_of_Haryana.svg.png');}
.ns-0 h2 #Hassaniya_Arabic::before, .ns-0 h2#Hassaniya_Arabic::before, .ns-0 h2 #Zenaga::before, .ns-0 h2#Zenaga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/43/Flag_of_Mauritania.svg/40px-Flag_of_Mauritania.svg.png');}
.ns-0 h2 #Hausa::before, .ns-0 h2#Hausa::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5d/Flag_of_the_Hausa_people.svg/40px-Flag_of_the_Hausa_people.svg.png');}
.ns-0 h2 #Hawaiian::before, .ns-0 h2#Hawaiian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ef/Flag_of_Hawaii.svg/40px-Flag_of_Hawaii.svg.png');}
.ns-0 h2 #Hebrew::before, .ns-0 h2#Hebrew::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d4/Flag_of_Israel.svg/40px-Flag_of_Israel.svg.png');}
.ns-0 h2 #Herero::before, .ns-0 h2#Herero::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3b/Namibia,_Botswana_and_Angola.gif/40px-Namibia,_Botswana_and_Angola.gif');}
.ns-0 h2 #Higaonon::before, .ns-0 h2#Higaonon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4d/Ph_seal_misamis_oriental.2.png/40px-Ph_seal_misamis_oriental.2.png');}
.ns-0 h2 #Hijazi_Arabic::before, .ns-0 h2#Hijazi_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8f/Flag_of_Hejaz_(1920).svg/40px-Flag_of_Hejaz_(1920).svg.png');}
.ns-0 h2 #Hiligaynon::before, .ns-0 h2#Hiligaynon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0e/Flag_of_the_Province_of_Iloilo.svg/40px-Flag_of_the_Province_of_Iloilo.svg.png');}
.ns-0 h2 #Hiri_Motu::before, .ns-0 h2#Hiri_Motu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4d/Flag_of_Port_Moresby.png/40px-Flag_of_Port_Moresby.png');}
.ns-0 h2 #Hokkien::before, .ns-0 h2#Hokkien::before, .ns-0 h2 #Min_Nan::before, .ns-0 h2#Min_Nan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_the_Republic_of_China.svg/40px-Flag_of_the_Republic_of_China.svg.png');}
.ns-0 h2 #Hungarian::before, .ns-0 h2#Hungarian::before, .ns-0 h2 #Hungarian_Sign_Language::before, .ns-0 h2#Hungarian_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_Hungary.svg/40px-Flag_of_Hungary.svg.png');}
.ns-0 h2 #Hunsrik::before, .ns-0 h2#Hunsrik::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/63/Bandeira_do_Rio_Grande_do_Sul.svg/40px-Bandeira_do_Rio_Grande_do_Sul.svg.png');}
.ns-0 h2 #Iban::before, .ns-0 h2#Iban::before, .ns-0 h2 #Sarawak_Malay::before, .ns-0 h2#Sarawak_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7e/Flag_of_Sarawak.svg/40px-Flag_of_Sarawak.svg.png');}
.ns-0 h2 #Ibanag::before, .ns-0 h2#Ibanag::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/62/Flag_of_Cagayan.svg/40px-Flag_of_Cagayan.svg.png');}
.ns-0 h2 #Icelandic::before, .ns-0 h2#Icelandic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Iceland.svg/40px-Flag_of_Iceland.svg.png');}
.ns-0 h2 #Ido::before, .ns-0 h2#Ido::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f1/Flag_of_Ido.svg/40px-Flag_of_Ido.svg.png');}
.ns-0 h2 #Igala::before, .ns-0 h2#Igala::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0e/Kogi_State_Flag.svg/40px-Kogi_State_Flag.svg.png');}
.ns-0 h2 #Igbo::before, .ns-0 h2#Igbo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/82/Flag_of_Biafra.svg/40px-Flag_of_Biafra.svg.png');}
.ns-0 h2 #Ilocano::before, .ns-0 h2#Ilocano::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5d/PH-ILS_Flag.png/40px-PH-ILS_Flag.png');}
.ns-0 h2 #Indo-Portuguese::before, .ns-0 h2#Indo-Portuguese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/72/Flag_of_Portugal_(1640).svg/40px-Flag_of_Portugal_(1640).svg.png');}
.ns-0 h2 #Indonesian::before, .ns-0 h2#Indonesian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Indonesia.svg/40px-Flag_of_Indonesia.svg.png');}
.ns-0 h2 #Ingrian::before, .ns-0 h2#Ingrian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_igora.svg/40px-Flag_igora.svg.png');}
.ns-0 h2 #Ingush::before, .ns-0 h2#Ingush::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Ingushetia.svg/40px-Flag_of_Ingushetia.svg.png');}
.ns-0 h2 #Interlingua::before, .ns-0 h2#Interlingua::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9b/Bandiera_de_Interlingua.svg/40px-Bandiera_de_Interlingua.svg.png');}
.ns-0 h2 #Interlingue::before, .ns-0 h2#Interlingue::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5b/Flag_of_Interlingue.svg/40px-Flag_of_Interlingue.svg.png');}
.ns-0 h2 #Inuktitut::before, .ns-0 h2#Inuktitut::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/90/Flag_of_Nunavut.svg/40px-Flag_of_Nunavut.svg.png');}
.ns-0 h2 #Iranun::before, .ns-0 h2#Iranun::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Seal_of_Maguindanao_del_Norte.png/40px-Seal_of_Maguindanao_del_Norte.png');}
.ns-0 h2 #Iraqi_Arabic::before, .ns-0 h2#Iraqi_Arabic::before, .ns-0 h2 #North_Mesopotamian_Arabic::before, .ns-0 h2#North_Mesopotamian_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f6/Flag_of_Iraq.svg/40px-Flag_of_Iraq.svg.png');}
.ns-0 h2 #Iraqw::before, .ns-0 h2#Iraqw::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Iraqw_Flag.png/40px-Iraqw_Flag.png');}
.ns-0 h2 #Irish::before, .ns-0 h2#Irish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Ireland.svg/40px-Flag_of_Ireland.svg.png');}
.ns-0 h2 #Islander_Creole_English::before, .ns-0 h2#Islander_Creole_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_San_Andrés_y_Providencia.svg/40px-Flag_of_San_Andrés_y_Providencia.svg.png');}
.ns-0 h2 #Istriot::before, .ns-0 h2#Istriot::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/99/HRV_Rovinj_flag.svg/40px-HRV_Rovinj_flag.svg.png');}
.ns-0 h2 #Italian::before, .ns-0 h2#Italian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Italy.svg/40px-Flag_of_Italy.svg.png');}
.ns-0 h2 #Italiot_Greek::before, .ns-0 h2#Italiot_Greek::before, .ns-0 h2 #Tarantino::before, .ns-0 h2#Tarantino::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Apulia.svg/40px-Flag_of_Apulia.svg.png');}
.ns-0 h2 #Itsekiri::before, .ns-0 h2#Itsekiri::before, .ns-0 h2 #Olukumi::before, .ns-0 h2#Olukumi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/aa/Flag_of_Delta_State.gif/40px-Flag_of_Delta_State.gif');}
.ns-0 h2 #Jah_Hut::before, .ns-0 h2#Jah_Hut::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/aa/Flag_of_Pahang.svg/40px-Flag_of_Pahang.svg.png');}
.ns-0 h2 #Jamaican_Creole::before, .ns-0 h2#Jamaican_Creole::before, .ns-0 h2 #Maroon_Spirit_Language::before, .ns-0 h2#Maroon_Spirit_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0a/Flag_of_Jamaica.svg/40px-Flag_of_Jamaica.svg.png');}
.ns-0 h2 #Jamtish::before, .ns-0 h2#Jamtish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2c/Jämtlands_vapen.svg/35px-Jämtlands_vapen.svg.png');}
.ns-0 h2 #Japanese::before, .ns-0 h2#Japanese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9e/Flag_of_Japan.svg/40px-Flag_of_Japan.svg.png');}
.ns-0 h2 #Jaqaru::before, .ns-0 h2#Jaqaru::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/84/Bandera_Provincia_Yauyos.jpg/40px-Bandera_Provincia_Yauyos.jpg');}
.ns-0 h2 #Jaunsari::before, .ns-0 h2#Jaunsari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/99/Seal_of_Uttarakhand.svg/35px-Seal_of_Uttarakhand.svg.png');}
.ns-0 h2 #Javanese::before, .ns-0 h2#Javanese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_the_Mataram_Sultanate.svg/40px-Flag_of_the_Mataram_Sultanate.svg.png');}
.ns-0 h2 #Jeju::before, .ns-0 h2#Jeju::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Jeju_Province.svg/40px-Flag_of_Jeju_Province.svg.png');}
.ns-0 h2 #Jersey_Dutch::before, .ns-0 h2#Jersey_Dutch::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_New_Jersey.svg/40px-Flag_of_New_Jersey.svg.png');}
.ns-0 h2 #Jingpho::before, .ns-0 h2#Jingpho::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/47/Kachin_People_Flag.svg/40px-Kachin_People_Flag.svg.png');}
.ns-0 h2 #Juba_Arabic::before, .ns-0 h2#Juba_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7a/Flag_of_South_Sudan.svg/40px-Flag_of_South_Sudan.svg.png');}
.ns-0 h2 #Judeo-Italian::before, .ns-0 h2#Judeo-Italian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_Italian_Jews.svg/40px-Flag_of_Italian_Jews.svg.png');}
.ns-0 h2 #K\'iche\'::before, .ns-0 h2#K\'iche\'::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1e/El_Quiché_Flag_(GUATEMALA).png/40px-El_Quiché_Flag_(GUATEMALA).png');}
.ns-0 h2 #Kabiye::before, .ns-0 h2#Kabiye::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7a/Flag_of_Togo_(3-2).svg/40px-Flag_of_Togo_(3-2).svg.png');}
.ns-0 h2 #Kabuverdianu::before, .ns-0 h2#Kabuverdianu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/65/Flag_of_Cape_Verde_(10-17).svg/40px-Flag_of_Cape_Verde_(10-17).svg.png');}
.ns-0 h2 #Kabyle::before, .ns-0 h2#Kabyle::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_the_Republic_of_Kabylia.svg/40px-Flag_of_the_Republic_of_Kabylia.svg.png');}
.ns-0 h2 #Kaingang::before, .ns-0 h2#Kaingang::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/93/Bandeira_do_Paraná.svg/40px-Bandeira_do_Paraná.svg.png');}
.ns-0 h2 #Kaitag::before, .ns-0 h2#Kaitag::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_Dagestan.svg/40px-Flag_of_Dagestan.svg.png');}
.ns-0 h2 #Kalasha::before, .ns-0 h2#Kalasha::before, .ns-0 h2 #Khowar::before, .ns-0 h2#Khowar::before, .ns-0 h2 #Palula::before, .ns-0 h2#Palula::before, .ns-0 h2 #Ushojo::before, .ns-0 h2#Ushojo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Flag_of_Khyber_Pakhtunkhwa.svg/40px-Flag_of_Khyber_Pakhtunkhwa.svg.png');}
.ns-0 h2 #Kalmyk::before, .ns-0 h2#Kalmyk::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9f/Flag_of_Kalmykia.svg/40px-Flag_of_Kalmykia.svg.png');}
.ns-0 h2 #Kamayurá::before, .ns-0 h2#Kamayurá::before, .ns-0 h2 #Xavante::before, .ns-0 h2#Xavante::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0b/Bandeira_de_Mato_Grosso.svg/40px-Bandeira_de_Mato_Grosso.svg.png');}
.ns-0 h2 #Kankanaey::before, .ns-0 h2#Kankanaey::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/02/Flag_of_Mountain_Province.png/40px-Flag_of_Mountain_Province.png');}
.ns-0 h2 #Kannada::before, .ns-0 h2#Kannada::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0b/Flag_of_Karnataka,_India.svg/40px-Flag_of_Karnataka,_India.svg.png');}
.ns-0 h2 #Kanuri::before, .ns-0 h2#Kanuri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/95/Flag_of_the_Kanuri_people.svg/40px-Flag_of_the_Kanuri_people.svg.png');}
.ns-0 h2 #Kapampangan::before, .ns-0 h2#Kapampangan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/46/Pampanga_Flag.png/40px-Pampanga_Flag.png');}
.ns-0 h2 #Karachay-Balkar::before, .ns-0 h2#Karachay-Balkar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/59/Flag_of_Karachay-Cherkessia.svg/40px-Flag_of_Karachay-Cherkessia.svg.png');}
.ns-0 h2 #Karakalpak::before, .ns-0 h2#Karakalpak::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/16/Flag_of_Karakalpakstan.svg/40px-Flag_of_Karakalpakstan.svg.png');}
.ns-0 h2 #Karakhanid::before, .ns-0 h2#Karakhanid::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f4/Flag_of_the_Kara-Khanids.svg/40px-Flag_of_the_Kara-Khanids.svg.png');}
.ns-0 h2 #Karelian::before, .ns-0 h2#Karelian::before, .ns-0 h2 #Livvi::before, .ns-0 h2#Livvi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/78/Itäkarjalaisten_lippu.svg/40px-Itäkarjalaisten_lippu.svg.png');}
.ns-0 h2 #Karipúna_Creole_French::before, .ns-0 h2#Karipúna_Creole_French::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0c/Bandeira_do_Amapá.svg/40px-Bandeira_do_Amapá.svg.png');}
.ns-0 h2 #Kashmiri::before, .ns-0 h2#Kashmiri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/32/Flag_of_Jammu_and_Kashmir_(1936-1953).svg/40px-Flag_of_Jammu_and_Kashmir_(1936-1953).svg.png');}
.ns-0 h2 #Kashubian::before, .ns-0 h2#Kashubian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fa/POL_Kaszuby_flag.svg/40px-POL_Kaszuby_flag.svg.png');}
.ns-0 h2 #Kazakh::before, .ns-0 h2#Kazakh::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d3/Flag_of_Kazakhstan.svg/40px-Flag_of_Kazakhstan.svg.png');}
.ns-0 h2 #Kedah_Malay::before, .ns-0 h2#Kedah_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/67/Flag_of_Kedah_(18th_century_-_1821).svg/40px-Flag_of_Kedah_(18th_century_-_1821).svg.png');}
.ns-0 h2 #Kelantan_Peranakan_Hokkien::before, .ns-0 h2#Kelantan_Peranakan_Hokkien::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/61/Flag_of_Kelantan.svg/40px-Flag_of_Kelantan.svg.png');}
.ns-0 h2 #Ket::before, .ns-0 h2#Ket::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2d/Flag_of_Krasnoyarsk_Krai.svg/40px-Flag_of_Krasnoyarsk_Krai.svg.png');}
.ns-0 h2 #Khakas::before, .ns-0 h2#Khakas::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ec/Flag_of_Khakassia.svg/40px-Flag_of_Khakassia.svg.png');}
.ns-0 h2 #Khasi::before, .ns-0 h2#Khasi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7c/Seng-Khasi.png/40px-Seng-Khasi.png');}
.ns-0 h2 #Khmer::before, .ns-0 h2#Khmer::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_Cambodia.svg/40px-Flag_of_Cambodia.svg.png');}
.ns-0 h2 #Khoekhoe::before, .ns-0 h2#Khoekhoe::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Namibia.svg/40px-Flag_of_Namibia.svg.png');}
.ns-0 h2 #Kikuyu::before, .ns-0 h2#Kikuyu::before, .ns-0 h2 #Maasai::before, .ns-0 h2#Maasai::before, .ns-0 h2 #Swahili::before, .ns-0 h2#Swahili::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Kenya.svg/40px-Flag_of_Kenya.svg.png');}
.ns-0 h2 #Kimbundu::before, .ns-0 h2#Kimbundu::before, .ns-0 h2 #Umbundu::before, .ns-0 h2#Umbundu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9d/Flag_of_Angola.svg/40px-Flag_of_Angola.svg.png');}
.ns-0 h2 #Kiowa::before, .ns-0 h2#Kiowa::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6e/Flag_of_Oklahoma.svg/40px-Flag_of_Oklahoma.svg.png');}
.ns-0 h2 #Kituba::before, .ns-0 h2#Kituba::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/92/Flag_of_the_Republic_of_the_Congo.svg/40px-Flag_of_the_Republic_of_the_Congo.svg.png');}
.ns-0 h2 #Klingon::before, .ns-0 h2#Klingon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/02/Klingon_Empire_Flag.svg/40px-Klingon_Empire_Flag.svg.png');}
.ns-0 h2 #Kokborok::before, .ns-0 h2#Kokborok::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_the_National_Liberation_Front_of_Tripura.svg/40px-Flag_of_the_National_Liberation_Front_of_Tripura.svg.png');}
.ns-0 h2 #Komi-Permyak::before, .ns-0 h2#Komi-Permyak::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/02/Flag_of_Permyakia.svg/40px-Flag_of_Permyakia.svg.png');}
.ns-0 h2 #Komi-Zyrian::before, .ns-0 h2#Komi-Zyrian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Flag_of_Komi.svg/40px-Flag_of_Komi.svg.png');}
.ns-0 h2 #Kongo::before, .ns-0 h2#Kongo::before, .ns-0 h2 #Lingala::before, .ns-0 h2#Lingala::before, .ns-0 h2 #Luba-Kasai::before, .ns-0 h2#Luba-Kasai::before, .ns-0 h2 #Luba-Katanga::before, .ns-0 h2#Luba-Katanga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Democratic_Republic_of_the_Congo.svg/40px-Flag_of_the_Democratic_Republic_of_the_Congo.svg.png');}
.ns-0 h2 #Konzo::before, .ns-0 h2#Konzo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Rwenzururu.svg/40px-Flag_of_Rwenzururu.svg.png');}
.ns-0 h2 #Korean::before, .ns-0 h2#Korean::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8a/Unification_flag_of_Korea.svg/40px-Unification_flag_of_Korea.svg.png');}
.ns-0 h2 #Korlai_Creole_Portuguese::before, .ns-0 h2#Korlai_Creole_Portuguese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d3/Seal_of_Maharashtra.svg/35px-Seal_of_Maharashtra.svg.png');}
.ns-0 h2 #Koryak::before, .ns-0 h2#Koryak::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0d/Flag_of_Koryakia.svg/40px-Flag_of_Koryakia.svg.png');}
.ns-0 h2 #Kosraean::before, .ns-0 h2#Kosraean::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/23/Flag_of_Kosrae.svg/40px-Flag_of_Kosrae.svg.png');}
.ns-0 h2 #Krio::before, .ns-0 h2#Krio::before, .ns-0 h2 #Mende_\(Sierra_Leone\)::before, .ns-0 h2#Mende_\(Sierra_Leone\)::before, .ns-0 h2 #Temne::before, .ns-0 h2#Temne::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_Sierra_Leone.svg/40px-Flag_of_Sierra_Leone.svg.png');}
.ns-0 h2 #Kristang::before, .ns-0 h2#Kristang::before, .ns-0 h2 #Malaccan_Creole_Malay::before, .ns-0 h2#Malaccan_Creole_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/09/Flag_of_Malacca.svg/40px-Flag_of_Malacca.svg.png');}
.ns-0 h2 #Kumaoni::before, .ns-0 h2#Kumaoni::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a1/Flag_of_the_Kumaon_Kingdom.svg/40px-Flag_of_the_Kumaon_Kingdom.svg.png');}
.ns-0 h2 #Kumyk::before, .ns-0 h2#Kumyk::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_Kumyks.svg/40px-Flag_of_Kumyks.svg.png');}
.ns-0 h2 #Kuna::before, .ns-0 h2#Kuna::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3d/Bandera_de_la_Comarca_Guna_Yala.svg/40px-Bandera_de_la_Comarca_Guna_Yala.svg.png');}
.ns-0 h2 #Kunigami::before, .ns-0 h2#Kunigami::before, .ns-0 h2 #Miyako::before, .ns-0 h2#Miyako::before, .ns-0 h2 #Okinawan::before, .ns-0 h2#Okinawan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_Okinawa_Prefecture.svg/40px-Flag_of_Okinawa_Prefecture.svg.png');}
.ns-0 h2 #Kupang_Malay::before, .ns-0 h2#Kupang_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c6/Flag_of_Kupang_City.png/40px-Flag_of_Kupang_City.png');}
.ns-0 h2 #Kven::before, .ns-0 h2#Kven::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_the_Kven_people.svg/40px-Flag_of_the_Kven_people.svg.png');}
.ns-0 h2 #Kwanyama::before, .ns-0 h2#Kwanyama::before, .ns-0 h2 #Ndonga::before, .ns-0 h2#Ndonga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/46/Flag_of_Ovamboland.svg/40px-Flag_of_Ovamboland.svg.png');}
.ns-0 h2 #Kyrgyz::before, .ns-0 h2#Kyrgyz::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Kyrgyzstan.svg/40px-Flag_of_Kyrgyzstan.svg.png');}
.ns-0 h2 #Laboya::before, .ns-0 h2#Laboya::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e9/Coat_of_Arms_of_East_Nusa_Tenggara_NEW.png/35px-Coat_of_Arms_of_East_Nusa_Tenggara_NEW.png');}
.ns-0 h2 #Ladakhi::before, .ns-0 h2#Ladakhi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5e/Flag_of_the_Ladakh_Nationalist_Movement.svg/40px-Flag_of_the_Ladakh_Nationalist_Movement.svg.png');}
.ns-0 h2 #Ladin::before, .ns-0 h2#Ladin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/62/Flag_of_Ladinia.svg/40px-Flag_of_Ladinia.svg.png');}
.ns-0 h2 #Ladino::before, .ns-0 h2#Ladino::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3d/Spanish_Jewish_flag.png/40px-Spanish_Jewish_flag.png');}
.ns-0 h2 #Lahu::before, .ns-0 h2#Lahu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/17/Lahu_flag.svg/40px-Lahu_flag.svg.png');}
.ns-0 h2 #Lai::before, .ns-0 h2#Lai::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/af/Emblem_of_Lai_Autonomous_Council.png/40px-Emblem_of_Lai_Autonomous_Council.png');}
.ns-0 h2 #Lakota::before, .ns-0 h2#Lakota::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/77/Pine_Ridge_Flag.svg/40px-Pine_Ridge_Flag.svg.png');}
.ns-0 h2 #Lao::before, .ns-0 h2#Lao::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/56/Flag_of_Laos.svg/40px-Flag_of_Laos.svg.png');}
.ns-0 h2 #Latgalian::before, .ns-0 h2#Latgalian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7d/Official_flag_of_Latgale.svg/40px-Official_flag_of_Latgale.svg.png');}
.ns-0 h2 #Latin::before, .ns-0 h2#Latin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a6/Flag_of_Rome.svg/40px-Flag_of_Rome.svg.png');}
.ns-0 h2 #Latvian::before, .ns-0 h2#Latvian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Latvia.svg/40px-Flag_of_Latvia.svg.png');}
.ns-0 h2 #Leonese::before, .ns-0 h2#Leonese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/75/Bandera_del_País_Leonés.svg/40px-Bandera_del_País_Leonés.svg.png');}
.ns-0 h2 #Lepcha::before, .ns-0 h2#Lepcha::before, .ns-0 h2 #Sherpa::before, .ns-0 h2#Sherpa::before, .ns-0 h2 #Thulung::before, .ns-0 h2#Thulung::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c0/Seal_of_Sikkim.svg/40px-Seal_of_Sikkim.svg.png');}
.ns-0 h2 #Lezgi::before, .ns-0 h2#Lezgi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3f/Lezgian_flag.svg/40px-Lezgian_flag.svg.png');}
.ns-0 h2 #Ligurian::before, .ns-0 h2#Ligurian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/88/Flag_of_Liguria.svg/40px-Flag_of_Liguria.svg.png');}
.ns-0 h2 #Limbu::before, .ns-0 h2#Limbu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a2/Flag_of_Limbuwan.svg/40px-Flag_of_Limbuwan.svg.png');}
.ns-0 h2 #Limburgish::before, .ns-0 h2#Limburgish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d1/Flag_of_Limburg_(Netherlands).svg/40px-Flag_of_Limburg_(Netherlands).svg.png');}
.ns-0 h2 #Limos_Kalinga::before, .ns-0 h2#Limos_Kalinga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a9/Ph_seal_kalinga.png/40px-Ph_seal_kalinga.png');}
.ns-0 h2 #Lindu::before, .ns-0 h2#Lindu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/46/Coat_of_arms_of_Central_Sulawesi.svg/30px-Coat_of_arms_of_Central_Sulawesi.svg.png');}
.ns-0 h2 #Lithuanian::before, .ns-0 h2#Lithuanian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Lithuania.svg/40px-Flag_of_Lithuania.svg.png');}
.ns-0 h2 #Livonian::before, .ns-0 h2#Livonian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/42/Flag_of_the_Livonians.svg/40px-Flag_of_the_Livonians.svg.png');}
.ns-0 h2 #Lojban::before, .ns-0 h2#Lojban::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/48/Lojban_logo.svg/40px-Lojban_logo.svg.png');}
.ns-0 h2 #Lombard::before, .ns-0 h2#Lombard::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_Lombardy.svg/40px-Flag_of_Lombardy.svg.png');}
.ns-0 h2 #Louisiana_Creole::before, .ns-0 h2#Louisiana_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_Louisiana.svg/40px-Flag_of_Louisiana.svg.png');}
.ns-0 h2 #Lovono::before, .ns-0 h2#Lovono::before, .ns-0 h2 #Äiwoo::before, .ns-0 h2#Äiwoo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b3/Temotu_province_flag.svg/40px-Temotu_province_flag.svg.png');}
.ns-0 h2 #Lower_Sorbian::before, .ns-0 h2#Lower_Sorbian::before, .ns-0 h2 #Upper_Sorbian::before, .ns-0 h2#Upper_Sorbian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c0/Flag_of_Sorbs.svg/40px-Flag_of_Sorbs.svg.png');}
.ns-0 h2 #Lozi::before, .ns-0 h2#Lozi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/62/Flag_of_Barotseland.svg/40px-Flag_of_Barotseland.svg.png');}
.ns-0 h2 #Ludian::before, .ns-0 h2#Ludian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6c/Ludic_flag.svg/40px-Ludic_flag.svg.png');}
.ns-0 h2 #Luganda::before, .ns-0 h2#Luganda::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Uganda.svg/40px-Flag_of_Uganda.svg.png');}
.ns-0 h2 #Lushootseed::before, .ns-0 h2#Lushootseed::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Flag_of_Washington.svg/40px-Flag_of_Washington.svg.png');}
.ns-0 h2 #Lutuv::before, .ns-0 h2#Lutuv::before, .ns-0 h2 #Zou::before, .ns-0 h2#Zou::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/16/Flag_of_Chin_State.svg/40px-Flag_of_Chin_State.svg.png');}
.ns-0 h2 #Luxembourgish::before, .ns-0 h2#Luxembourgish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/da/Flag_of_Luxembourg.svg/40px-Flag_of_Luxembourg.svg.png');}
.ns-0 h2 #Macanese::before, .ns-0 h2#Macanese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/63/Flag_of_Macau.svg/40px-Flag_of_Macau.svg.png');}
.ns-0 h2 #Macedonian::before, .ns-0 h2#Macedonian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_North_Macedonia.svg/40px-Flag_of_North_Macedonia.svg.png');}
.ns-0 h2 #Maguindanao::before, .ns-0 h2#Maguindanao::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_Maguindanao.svg/40px-Flag_of_Maguindanao.svg.png');}
.ns-0 h2 #Makasar::before, .ns-0 h2#Makasar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_the_Sultanate_of_Gowa.svg/40px-Flag_of_the_Sultanate_of_Gowa.svg.png');}
.ns-0 h2 #Malagasy::before, .ns-0 h2#Malagasy::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_Madagascar.svg/40px-Flag_of_Madagascar.svg.png');}
.ns-0 h2 #Malay::before, .ns-0 h2#Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Malaysia_and_Indonesia.svg/40px-Flag_of_Malaysia_and_Indonesia.svg.png');}
.ns-0 h2 #Maltese::before, .ns-0 h2#Maltese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Malta.svg/40px-Flag_of_Malta.svg.png');}
.ns-0 h2 #Manado_Malay::before, .ns-0 h2#Manado_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ef/Lambang_Kota_Manado.png/30px-Lambang_Kota_Manado.png');}
.ns-0 h2 #Manchu::before, .ns-0 h2#Manchu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/86/Flag_of_China_(1862–1889).svg/40px-Flag_of_China_(1862–1889).svg.png');}
.ns-0 h2 #Mandinka::before, .ns-0 h2#Mandinka::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_The_Gambia.svg/40px-Flag_of_The_Gambia.svg.png');}
.ns-0 h2 #Manipuri::before, .ns-0 h2#Manipuri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Manipur.svg/40px-Flag_of_Manipur.svg.png');}
.ns-0 h2 #Mansaka::before, .ns-0 h2#Mansaka::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/94/Davao_De_Oro_Flag.jpg/40px-Davao_De_Oro_Flag.jpg');}
.ns-0 h2 #Manx::before, .ns-0 h2#Manx::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bc/Flag_of_the_Isle_of_Man.svg/40px-Flag_of_the_Isle_of_Man.svg.png');}
.ns-0 h2 #Maore_Comorian::before, .ns-0 h2#Maore_Comorian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bf/Coat_of_Arms_of_Mayotte.svg/40px-Coat_of_Arms_of_Mayotte.svg.png');}
.ns-0 h2 #Mapudungun::before, .ns-0 h2#Mapudungun::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Mapuches_(1992).svg/40px-Flag_of_the_Mapuches_(1992).svg.png');}
.ns-0 h2 #Maranao::before, .ns-0 h2#Maranao::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/PH-LAS_Flag.png/40px-PH-LAS_Flag.png');}
.ns-0 h2 #Margi::before, .ns-0 h2#Margi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1d/Borno_State_Flag.gif/40px-Borno_State_Flag.gif');}
.ns-0 h2 #Marshallese::before, .ns-0 h2#Marshallese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2e/Flag_of_the_Marshall_Islands.svg/40px-Flag_of_the_Marshall_Islands.svg.png');}
.ns-0 h2 #Masalit::before, .ns-0 h2#Masalit::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b0/Flag_of_the_Masalit.svg/40px-Flag_of_the_Masalit.svg.png');}
.ns-0 h2 #Masbatenyo::before, .ns-0 h2#Masbatenyo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dd/PH-MAS_Flag.png/40px-PH-MAS_Flag.png');}
.ns-0 h2 #Mauritian_Creole::before, .ns-0 h2#Mauritian_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Mauritius.svg/40px-Flag_of_Mauritius.svg.png');}
.ns-0 h2 #Maybrat::before, .ns-0 h2#Maybrat::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/43/Flag_of_Southwest_Papua.svg/40px-Flag_of_Southwest_Papua.svg.png');}
.ns-0 h2 #Mbya_Guarani::before, .ns-0 h2#Mbya_Guarani::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/24/Flag_of_Uruguay,_Brazil_and_Argentina.png/40px-Flag_of_Uruguay,_Brazil_and_Argentina.png');}
.ns-0 h2 #Media_Lengua::before, .ns-0 h2#Media_Lengua::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dc/Bandera_Provincia_Imbabura.svg/40px-Bandera_Provincia_Imbabura.svg.png');}
.ns-0 h2 #Megleno-Romanian::before, .ns-0 h2#Megleno-Romanian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1a/Flag_of_Greek_Macedonia.svg/40px-Flag_of_Greek_Macedonia.svg.png');}
.ns-0 h2 #Mehri::before, .ns-0 h2#Mehri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d8/Flag_of_the_Mahra_Sultanate.svg/40px-Flag_of_the_Mahra_Sultanate.svg.png');}
.ns-0 h2 #Meriam::before, .ns-0 h2#Meriam::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/37/Flag_of_Murray_Island_(Mer).svg/40px-Flag_of_Murray_Island_(Mer).svg.png');}
.ns-0 h2 #Meru::before, .ns-0 h2#Meru::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5c/Flag_of_Meru_County.png/40px-Flag_of_Meru_County.png');}
.ns-0 h2 #Meänkieli::before, .ns-0 h2#Meänkieli::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_Tornedalians_(2007).svg/40px-Flag_of_Tornedalians_(2007).svg.png');}
.ns-0 h2 #Mi\'kmaq::before, .ns-0 h2#Mi\'kmaq::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3f/Mikmaq_State_Flag.svg/40px-Mikmaq_State_Flag.svg.png');}
.ns-0 h2 #Michif::before, .ns-0 h2#Michif::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f4/Metis_Blue.svg/40px-Metis_Blue.svg.png');}
.ns-0 h2 #Michoacán_Nahuatl::before, .ns-0 h2#Michoacán_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cf/Coat_of_arms_of_Michoacan.svg/32px-Coat_of_arms_of_Michoacan.svg.png');}
.ns-0 h2 #Middle_Dutch::before, .ns-0 h2#Middle_Dutch::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_prince-bishopric_of_Utrecht.svg/36px-Flag_of_the_prince-bishopric_of_Utrecht.svg.png');}
.ns-0 h2 #Middle_English::before, .ns-0 h2#Middle_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/be/Flag_of_England.svg/40px-Flag_of_England.svg.png');}
.ns-0 h2 #Middle_French::before, .ns-0 h2#Middle_French::before, .ns-0 h2 #Old_French::before, .ns-0 h2#Old_French::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/82/Royal_flag_of_France.svg/40px-Royal_flag_of_France.svg.png');}
.ns-0 h2 #Middle_Irish::before, .ns-0 h2#Middle_Irish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8d/Flag_of_Leinster.svg/40px-Flag_of_Leinster.svg.png');}
.ns-0 h2 #Middle_Korean::before, .ns-0 h2#Middle_Korean::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Royal_flag_of_Goryeo_(Bong-gi).svg/40px-Royal_flag_of_Goryeo_(Bong-gi).svg.png');}
.ns-0 h2 #Middle_Mongol::before, .ns-0 h2#Middle_Mongol::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2f/Flag_of_the_Mongol_Empire_3.svg/40px-Flag_of_the_Mongol_Empire_3.svg.png');}
.ns-0 h2 #Middle_Norwegian::before, .ns-0 h2#Middle_Norwegian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/36/Royal_Banner_of_Norway_(14th_Century).svg/34px-Royal_Banner_of_Norway_(14th_Century).svg.png');}
.ns-0 h2 #Middle_Persian::before, .ns-0 h2#Middle_Persian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8f/Derafsh_kaviani.svg/38px-Derafsh_kaviani.svg.png');}
.ns-0 h2 #Middle_Scots::before, .ns-0 h2#Middle_Scots::before, .ns-0 h2 #Scottish_Gaelic::before, .ns-0 h2#Scottish_Gaelic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c5/Royal_Banner_of_Scotland.svg/40px-Royal_Banner_of_Scotland.svg.png');}
.ns-0 h2 #Mikasuki::before, .ns-0 h2#Mikasuki::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/34/Flag_of_the_Miccosukee_Tribe_of_Indians_of_Florida.svg/40px-Flag_of_the_Miccosukee_Tribe_of_Indians_of_Florida.svg.png');}
.ns-0 h2 #Minangkabau::before, .ns-0 h2#Minangkabau::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2a/Flag_of_Minang.svg/40px-Flag_of_Minang.svg.png');}
.ns-0 h2 #Mingrelian::before, .ns-0 h2#Mingrelian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fb/Flag_of_The_Principality_of_Mingrelia_(Portolan_1560).svg/40px-Flag_of_The_Principality_of_Mingrelia_(Portolan_1560).svg.png');}
.ns-0 h2 #Mirandese::before, .ns-0 h2#Mirandese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Bandeira-de-Miranda-do-Douro.png/36px-Bandeira-de-Miranda-do-Douro.png');}
.ns-0 h2 #Miskito::before, .ns-0 h2#Miskito::before, .ns-0 h2 #Nicaraguan_Creole::before, .ns-0 h2#Nicaraguan_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Nicaragua.svg/40px-Flag_of_Nicaragua.svg.png');}
.ns-0 h2 #Mohawk::before, .ns-0 h2#Mohawk::before, .ns-0 h2 #Oneida::before, .ns-0 h2#Oneida::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_the_Iroquois_Confederacy.svg/40px-Flag_of_the_Iroquois_Confederacy.svg.png');}
.ns-0 h2 #Mokilese::before, .ns-0 h2#Mokilese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Mwoakilloa.svg/40px-Flag_of_Mwoakilloa.svg.png');}
.ns-0 h2 #Moksha::before, .ns-0 h2#Moksha::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e1/Flag_of_the_Moksha_people.svg/40px-Flag_of_the_Moksha_people.svg.png');}
.ns-0 h2 #Mon::before, .ns-0 h2#Mon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/03/Flag_of_Mon_State_(2018).svg/40px-Flag_of_Mon_State_(2018).svg.png');}
.ns-0 h2 #Mongolian::before, .ns-0 h2#Mongolian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Mongolia.svg/40px-Flag_of_Mongolia.svg.png');}
.ns-0 h2 #Mongondow::before, .ns-0 h2#Mongondow::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d0/Lambang_Kabupaten_Bolaang_Mongondow.png/35px-Lambang_Kabupaten_Bolaang_Mongondow.png');}
.ns-0 h2 #Moore::before, .ns-0 h2#Moore::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Burkina_Faso.svg/40px-Flag_of_Burkina_Faso.svg.png');}
.ns-0 h2 #Morelos_Nahuatl::before, .ns-0 h2#Morelos_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Coat_of_arms_of_Morelos.svg/32px-Coat_of_arms_of_Morelos.svg.png');}
.ns-0 h2 #Moroccan_Amazigh::before, .ns-0 h2#Moroccan_Amazigh::before, .ns-0 h2 #Moroccan_Arabic::before, .ns-0 h2#Moroccan_Arabic::before, .ns-0 h2 #Tashelhit::before, .ns-0 h2#Tashelhit::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Morocco.svg/40px-Flag_of_Morocco.svg.png');}
.ns-0 h2 #Muong::before, .ns-0 h2#Muong::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/14/Flag_of_Muong_Autonomous_Region.svg/40px-Flag_of_Muong_Autonomous_Region.svg.png');}
.ns-0 h2 #Mwali_Comorian::before, .ns-0 h2#Mwali_Comorian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c2/Flag_of_Mohéli_(official).svg/40px-Flag_of_Mohéli_(official).svg.png');}
.ns-0 h2 #Mwani::before, .ns-0 h2#Mwani::before, .ns-0 h2 #Ronga::before, .ns-0 h2#Ronga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Mozambique.svg/40px-Flag_of_Mozambique.svg.png');}
.ns-0 h2 #Mòcheno::before, .ns-0 h2#Mòcheno::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/51/Flag_of_Comunità_Alta_Valsugana_e_Bersntol.png/40px-Flag_of_Comunità_Alta_Valsugana_e_Bersntol.png');}
.ns-0 h2 #Māori::before, .ns-0 h2#Māori::before, .ns-0 h2 #New_Zealand_Sign_Language::before, .ns-0 h2#New_Zealand_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_New_Zealand.svg/40px-Flag_of_New_Zealand.svg.png');}
.ns-0 h2 #Najdi_Arabic::before, .ns-0 h2#Najdi_Arabic::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/1/17/Flag_of_the_Emirate_of_Ha'il.svg/40px-Flag_of_the_Emirate_of_Ha'il.svg.png");}
.ns-0 h2 #Nauruan::before, .ns-0 h2#Nauruan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/30/Flag_of_Nauru.svg/40px-Flag_of_Nauru.svg.png');}
.ns-0 h2 #Navajo::before, .ns-0 h2#Navajo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/ce/Official_design_of_the_Navajo_Nation_flag_as_it_was_adopted_on_May_21,_1968.svg/40px-Official_design_of_the_Navajo_Nation_flag_as_it_was_adopted_on_May_21,_1968.svg.png');}
.ns-0 h2 #Ndzwani_Comorian::before, .ns-0 h2#Ndzwani_Comorian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a6/Flag_of_Anjouan_(official).svg/40px-Flag_of_Anjouan_(official).svg.png');}
.ns-0 h2 #Neapolitan::before, .ns-0 h2#Neapolitan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c5/Flag_of_Campania.svg/40px-Flag_of_Campania.svg.png');}
.ns-0 h2 #Negeri_Sembilan_Malay::before, .ns-0 h2#Negeri_Sembilan_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/db/Flag_of_Negeri_Sembilan.svg/40px-Flag_of_Negeri_Sembilan.svg.png');}
.ns-0 h2 #Nepali::before, .ns-0 h2#Nepali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9b/Flag_of_Nepal.svg/20px-Flag_of_Nepal.svg.png');}
.ns-0 h2 #Newar::before, .ns-0 h2#Newar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ea/Flag_of_Kathmandu,_Nepal.svg/40px-Flag_of_Kathmandu,_Nepal.svg.png');}
.ns-0 h2 #Ngazidja_Comorian::before, .ns-0 h2#Ngazidja_Comorian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Comoros.svg/40px-Flag_of_the_Comoros.svg.png');}
.ns-0 h2 #Nheengatu::before, .ns-0 h2#Nheengatu::before, .ns-0 h2 #Trió::before, .ns-0 h2#Trió::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/02/Bandeira_do_Pará.svg/40px-Bandeira_do_Pará.svg.png');}
.ns-0 h2 #Nias::before, .ns-0 h2#Nias::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c8/Coat_of_arms_of_North_Sumatra.svg/30px-Coat_of_arms_of_North_Sumatra.svg.png');}
.ns-0 h2 #Nigerian_Pidgin::before, .ns-0 h2#Nigerian_Pidgin::before, .ns-0 h2 #Nigerian_Sign_Language::before, .ns-0 h2#Nigerian_Sign_Language::before, .ns-0 h2 #Yoruba::before, .ns-0 h2#Yoruba::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/79/Flag_of_Nigeria.svg/40px-Flag_of_Nigeria.svg.png');}
.ns-0 h2 #Niuean::before, .ns-0 h2#Niuean::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/01/Flag_of_Niue.svg/40px-Flag_of_Niue.svg.png');}
.ns-0 h2 #Nivkh::before, .ns-0 h2#Nivkh::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/57/Flag_of_Sakhalin_Oblast.svg/40px-Flag_of_Sakhalin_Oblast.svg.png');}
.ns-0 h2 #Norman::before, .ns-0 h2#Norman::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_Normandie.svg/40px-Flag_of_Normandie.svg.png');}
.ns-0 h2 #North_Frisian::before, .ns-0 h2#North_Frisian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b2/Nordfriesischeflagge.svg/40px-Nordfriesischeflagge.svg.png');}
.ns-0 h2 #North_Moluccan_Malay::before, .ns-0 h2#North_Moluccan_Malay::before, .ns-0 h2 #West_Makian::before, .ns-0 h2#West_Makian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/73/Coat_of_arms_of_North_Maluku.svg/35px-Coat_of_arms_of_North_Maluku.svg.png');}
.ns-0 h2 #Northern_Altai::before, .ns-0 h2#Northern_Altai::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4b/Flag_of_Altai_Krai.svg/40px-Flag_of_Altai_Krai.svg.png');}
.ns-0 h2 #Northern_Catanduanes_Bikol::before, .ns-0 h2#Northern_Catanduanes_Bikol::before, .ns-0 h2 #Southern_Catanduanes_Bikol::before, .ns-0 h2#Southern_Catanduanes_Bikol::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/61/PH-CAT_Flag.png/40px-PH-CAT_Flag.png');}
.ns-0 h2 #Northern_Ndebele::before, .ns-0 h2#Northern_Ndebele::before, .ns-0 h2 #Shona::before, .ns-0 h2#Shona::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6a/Flag_of_Zimbabwe.svg/40px-Flag_of_Zimbabwe.svg.png');}
.ns-0 h2 #Northern_Sotho::before, .ns-0 h2#Northern_Sotho::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/52/Flag_of_Lebowa.svg/40px-Flag_of_Lebowa.svg.png');}
.ns-0 h2 #Northern_Thai::before, .ns-0 h2#Northern_Thai::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d4/Seal_of_Lanna_Kingdom.png/40px-Seal_of_Lanna_Kingdom.png');}
.ns-0 h2 #Norwegian::before, .ns-0 h2#Norwegian::before, .ns-0 h2 #Norwegian_Bokmål::before, .ns-0 h2#Norwegian_Bokmål::before, .ns-0 h2 #Norwegian_Nynorsk::before, .ns-0 h2#Norwegian_Nynorsk::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/40px-Flag_of_Norway.svg.png');}
.ns-0 h2 #Novial::before, .ns-0 h2#Novial::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ed/Flag_of_Novial.svg/40px-Flag_of_Novial.svg.png');}
.ns-0 h2 #Nubi::before, .ns-0 h2#Nubi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c2/Kenia-Uganda-Flagge.png/40px-Kenia-Uganda-Flagge.png');}
.ns-0 h2 #Nuosu::before, .ns-0 h2#Nuosu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9d/Proposed_Yi_flag.svg/40px-Proposed_Yi_flag.svg.png');}
.ns-0 h2 #Nupe::before, .ns-0 h2#Nupe::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a7/Niger_state_flag.png/40px-Niger_state_flag.png');}
.ns-0 h2 #Nyankole::before, .ns-0 h2#Nyankole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_Ankole.svg/40px-Flag_of_Ankole.svg.png');}
.ns-0 h2 #Nyoro::before, .ns-0 h2#Nyoro::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2a/Bunyoro-Kitara_Kingdom_Flag.png/40px-Bunyoro-Kitara_Kingdom_Flag.png');}
.ns-0 h2 #Nùng::before, .ns-0 h2#Nùng::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/75/Flag_of_the_Nùng_Autonomous_Territory.svg/40px-Flag_of_the_Nùng_Autonomous_Territory.svg.png');}
.ns-0 h2 #O\'odham::before, .ns-0 h2#O\'odham::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/0/05/O'odham_unofficial_flag.svg/40px-O'odham_unofficial_flag.svg.png");}
.ns-0 h2 #Occitan::before, .ns-0 h2#Occitan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6d/Flag_of_Occitania_(with_star).svg/40px-Flag_of_Occitania_(with_star).svg.png');}
.ns-0 h2 #Odia::before, .ns-0 h2#Odia::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5d/Flag_of_Mayurbhanj.png/40px-Flag_of_Mayurbhanj.png');}
.ns-0 h2 #Ojibwe::before, .ns-0 h2#Ojibwe::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Peguis_First_Nation.svg/40px-Flag_of_the_Peguis_First_Nation.svg.png');}
.ns-0 h2 #Old_Armenian::before, .ns-0 h2#Old_Armenian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b3/Standard_of_the_Artaxiad_dynasty.svg/40px-Standard_of_the_Artaxiad_dynasty.svg.png');}
.ns-0 h2 #Old_Catalan::before, .ns-0 h2#Old_Catalan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/58/Bandera_del_Principat_de_Catalunya_(1200_dC).svg/40px-Bandera_del_Principat_de_Catalunya_(1200_dC).svg.png');}
.ns-0 h2 #Old_Czech::before, .ns-0 h2#Old_Czech::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Banner_of_Přemyslid_family.svg/40px-Banner_of_Přemyslid_family.svg.png');}
.ns-0 h2 #Old_English::before, .ns-0 h2#Old_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e0/Flag_of_Wessex.svg/40px-Flag_of_Wessex.svg.png');}
.ns-0 h2 #Old_Galician-Portuguese::before, .ns-0 h2#Old_Galician-Portuguese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/25/PortugueseFlag1143.svg/40px-PortugueseFlag1143.svg.png');}
.ns-0 h2 #Old_Georgian::before, .ns-0 h2#Old_Georgian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cf/Kartli_-_drosha_jvari.svg/40px-Kartli_-_drosha_jvari.svg.png');}
.ns-0 h2 #Old_High_German::before, .ns-0 h2#Old_High_German::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_East_Francia_(843–962).png/40px-Flag_of_East_Francia_(843–962).png');}
.ns-0 h2 #Old_Irish::before, .ns-0 h2#Old_Irish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/42/Triskele-Symbol1.svg/40px-Triskele-Symbol1.svg.png');}
.ns-0 h2 #Old_Javanese::before, .ns-0 h2#Old_Javanese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/10/Naval_flag_of_Majapahit_Kingdom.svg/40px-Naval_flag_of_Majapahit_Kingdom.svg.png');}
.ns-0 h2 #Old_Korean::before, .ns-0 h2#Old_Korean::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/80/Military_Banner_of_Silla.svg/40px-Military_Banner_of_Silla.svg.png');}
.ns-0 h2 #Old_Leonese::before, .ns-0 h2#Old_Leonese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/73/Royal_Banner_of_Leon_(Variant).svg/40px-Royal_Banner_of_Leon_(Variant).svg.png');}
.ns-0 h2 #Old_Navarro-Aragonese::before, .ns-0 h2#Old_Navarro-Aragonese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Navarro-Aragonese_flag.png/40px-Navarro-Aragonese_flag.png');}
.ns-0 h2 #Old_Norse::before, .ns-0 h2#Old_Norse::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/10/Raven_Banner.svg/40px-Raven_Banner.svg.png');}
.ns-0 h2 #Old_Novgorodian::before, .ns-0 h2#Old_Novgorodian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/73/Banner_of_the_Novgorod_Republic_(c._1385).svg/40px-Banner_of_the_Novgorod_Republic_(c._1385).svg.png');}
.ns-0 h2 #Old_Nubian::before, .ns-0 h2#Old_Nubian::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/4/47/The_flag_of_the_'Kingdom_of_Dongola'_(Makuria)_in_the_%22Book_of_all_kingdoms%22_(C._1350).svg/40px-The_flag_of_the_'Kingdom_of_Dongola'_(Makuria)_in_the_%22Book_of_all_kingdoms%22_(C._1350).svg.png");}
.ns-0 h2 #Old_Occitan::before, .ns-0 h2#Old_Occitan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_Provence.svg/40px-Flag_of_Provence.svg.png');}
.ns-0 h2 #Old_Polish::before, .ns-0 h2#Old_Polish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/12/Flag_of_the_Kingdom_of_Poland.svg/40px-Flag_of_the_Kingdom_of_Poland.svg.png');}
.ns-0 h2 #Old_Ruthenian::before, .ns-0 h2#Old_Ruthenian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e1/Royal_banner_of_the_Grand_Duchy_of_Lithuania.svg/40px-Royal_banner_of_the_Grand_Duchy_of_Lithuania.svg.png');}
.ns-0 h2 #Old_Saxon::before, .ns-0 h2#Old_Saxon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3b/Flag_of_Old_Saxony.svg/40px-Flag_of_Old_Saxony.svg.png');}
.ns-0 h2 #Old_Spanish::before, .ns-0 h2#Old_Spanish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/71/Flag_of_Castile.svg/40px-Flag_of_Castile.svg.png');}
.ns-0 h2 #Old_Swedish::before, .ns-0 h2#Old_Swedish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/25/Royal_Banner_of_Sweden_(14th_Century).svg/30px-Royal_Banner_of_Sweden_(14th_Century).svg.png');}
.ns-0 h2 #Old_Welsh::before, .ns-0 h2#Old_Welsh::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_Gwynedd_(3-2).svg/40px-Flag_of_Gwynedd_(3-2).svg.png');}
.ns-0 h2 #Orizaba_Nahuatl::before, .ns-0 h2#Orizaba_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/57/Escudo_de_Armas_de_la_Ciudad_de_Orizaba.svg/35px-Escudo_de_Armas_de_la_Ciudad_de_Orizaba.svg.png');}
.ns-0 h2 #Oromo::before, .ns-0 h2#Oromo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_the_Oromia_Region.svg/40px-Flag_of_the_Oromia_Region.svg.png');}
.ns-0 h2 #Osage::before, .ns-0 h2#Osage::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_the_Osage_Nation.svg/40px-Flag_of_the_Osage_Nation.svg.png');}
.ns-0 h2 #Ossetian::before, .ns-0 h2#Ossetian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_North_Ossetia.svg/40px-Flag_of_North_Ossetia.svg.png');}
.ns-0 h2 #Ottoman_Turkish::before, .ns-0 h2#Ottoman_Turkish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_the_Ottoman_Empire_(Thicker_Crescent).svg/40px-Flag_of_the_Ottoman_Empire_(Thicker_Crescent).svg.png');}
.ns-0 h2 #Pa\'o_Karen::before, .ns-0 h2#Pa\'o_Karen::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_the_Pa-O_National_Organisation.svg/40px-Flag_of_the_Pa-O_National_Organisation.svg.png');}
.ns-0 h2 #Pahari-Potwari::before, .ns-0 h2#Pahari-Potwari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4d/Flag_of_Azad_Kashmir.svg/40px-Flag_of_Azad_Kashmir.svg.png');}
.ns-0 h2 #Palauan::before, .ns-0 h2#Palauan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Palau.svg/40px-Flag_of_Palau.svg.png');}
.ns-0 h2 #Palenquero::before, .ns-0 h2#Palenquero::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Colombia.svg/40px-Flag_of_Colombia.svg.png');}
.ns-0 h2 #Pali::before, .ns-0 h2#Pali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f1/Buddhism_dham_jak.svg/35px-Buddhism_dham_jak.svg.png');}
.ns-0 h2 #Panamanian_Sign_Language::before, .ns-0 h2#Panamanian_Sign_Language::before, .ns-0 h2 #San_Miguel_Creole_French::before, .ns-0 h2#San_Miguel_Creole_French::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/ab/Flag_of_Panama.svg/40px-Flag_of_Panama.svg.png');}
.ns-0 h2 #Pangasinan::before, .ns-0 h2#Pangasinan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a1/Flag_of_Pangasinan.svg/40px-Flag_of_Pangasinan.svg.png');}
.ns-0 h2 #Papiamentu::before, .ns-0 h2#Papiamentu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/ae/Flag_of_the_Netherlands_Antilles_(1986–2010).svg/40px-Flag_of_the_Netherlands_Antilles_(1986–2010).svg.png');}
.ns-0 h2 #Papuan_Malay::before, .ns-0 h2#Papuan_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/ea/Kerajaan_Kaimana_Papua.gif/40px-Kerajaan_Kaimana_Papua.gif');}
.ns-0 h2 #Paraguayan_Guarani::before, .ns-0 h2#Paraguayan_Guarani::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/27/Flag_of_Paraguay.svg/40px-Flag_of_Paraguay.svg.png');}
.ns-0 h2 #Parauk::before, .ns-0 h2#Parauk::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Wa_State.svg/40px-Flag_of_Wa_State.svg.png');}
.ns-0 h2 #Pashto::before, .ns-0 h2#Pashto::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d4/Pashto_Banner_flag_(Neutral).png/40px-Pashto_Banner_flag_(Neutral).png');}
.ns-0 h2 #Pennsylvania_German::before, .ns-0 h2#Pennsylvania_German::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f7/Flag_of_Pennsylvania.svg/40px-Flag_of_Pennsylvania.svg.png');}
.ns-0 h2 #Penrhyn::before, .ns-0 h2#Penrhyn::before, .ns-0 h2 #Pukapukan::before, .ns-0 h2#Pukapukan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/35/Flag_of_the_Cook_Islands.svg/40px-Flag_of_the_Cook_Islands.svg.png');}
.ns-0 h2 #Persian::before, .ns-0 h2#Persian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/ca/Flag_of_Iran.svg/40px-Flag_of_Iran.svg.png');}
.ns-0 h2 #Phuthi::before, .ns-0 h2#Phuthi::before, .ns-0 h2 #Sotho::before, .ns-0 h2#Sotho::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4a/Flag_of_Lesotho.svg/40px-Flag_of_Lesotho.svg.png');}
.ns-0 h2 #Picard::before, .ns-0 h2#Picard::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/50/Picardy_flag.png/40px-Picardy_flag.png');}
.ns-0 h2 #Pichinglis::before, .ns-0 h2#Pichinglis::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Equatorial_Guinea.svg/40px-Flag_of_Equatorial_Guinea.svg.png');}
.ns-0 h2 #Piedmontese::before, .ns-0 h2#Piedmontese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b9/Flag_of_Piedmont.svg/40px-Flag_of_Piedmont.svg.png');}
.ns-0 h2 #Pijin::before, .ns-0 h2#Pijin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/74/Flag_of_the_Solomon_Islands.svg/40px-Flag_of_the_Solomon_Islands.svg.png');}
.ns-0 h2 #Pitcairn-Norfolk::before, .ns-0 h2#Pitcairn-Norfolk::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/48/Flag_of_Norfolk_Island.svg/40px-Flag_of_Norfolk_Island.svg.png');}
.ns-0 h2 #Pitjantjatjara::before, .ns-0 h2#Pitjantjatjara::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_South_Australia.svg/40px-Flag_of_South_Australia.svg.png');}
.ns-0 h2 #Pnar::before, .ns-0 h2#Pnar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/87/Emblem_of_Jaintia_Hills_Autonomous_District_Council.png/40px-Emblem_of_Jaintia_Hills_Autonomous_District_Council.png');}
.ns-0 h2 #Pohnpeian::before, .ns-0 h2#Pohnpeian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d6/Flag_of_Pohnpei_(1977-1992).svg/40px-Flag_of_Pohnpei_(1977-1992).svg.png');}
.ns-0 h2 #Polabian::before, .ns-0 h2#Polabian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/36/Banner_of_Wends.png/40px-Banner_of_Wends.png');}
.ns-0 h2 #Polish::before, .ns-0 h2#Polish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/12/Flag_of_Poland.svg/40px-Flag_of_Poland.svg.png');}
.ns-0 h2 #Pontic_Greek::before, .ns-0 h2#Pontic_Greek::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Pontus.svg/40px-Flag_of_Pontus.svg.png');}
.ns-0 h2 #Portuguese::before, .ns-0 h2#Portuguese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Portuguese_language_(PT-BR).svg/40px-Flag_of_Portuguese_language_(PT-BR).svg.png');}
.ns-0 h2 #Principense::before, .ns-0 h2#Principense::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Príncipe_Autonomous_Region.svg/40px-Flag_of_Príncipe_Autonomous_Region.svg.png');}
.ns-0 h2 #Puerto_Rican_Sign_Language::before, .ns-0 h2#Puerto_Rican_Sign_Language::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Puerto_Rico.svg/40px-Flag_of_Puerto_Rico.svg.png');}
.ns-0 h2 #Punjabi::before, .ns-0 h2#Punjabi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/36/Flag_of_Punjab_(Paired).png/40px-Flag_of_Punjab_(Paired).png');}
.ns-0 h2 #Quechua::before, .ns-0 h2#Quechua::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8f/Quechuas_flag.svg/40px-Quechuas_flag.svg.png');}
.ns-0 h2 #Rakhine::before, .ns-0 h2#Rakhine::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Rakhine.svg/40px-Flag_of_Rakhine.svg.png');}
.ns-0 h2 #Rapa_Nui::before, .ns-0 h2#Rapa_Nui::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d8/Flag_of_Rapa_Nui,_Chile.svg/40px-Flag_of_Rapa_Nui,_Chile.svg.png');}
.ns-0 h2 #Ratagnon::before, .ns-0 h2#Ratagnon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2c/Province_of_Occidental_Mindoro_seal.svg/40px-Province_of_Occidental_Mindoro_seal.svg.png');}
.ns-0 h2 #Rennellese::before, .ns-0 h2#Rennellese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/83/Flag_of_Rennell_and_Bellona_Province.svg/40px-Flag_of_Rennell_and_Bellona_Province.svg.png');}
.ns-0 h2 #Rohingya::before, .ns-0 h2#Rohingya::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/83/Rohingya_flag.svg/40px-Rohingya_flag.svg.png');}
.ns-0 h2 #Romagnol::before, .ns-0 h2#Romagnol::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b1/Flag_of_San_Marino.svg/40px-Flag_of_San_Marino.svg.png');}
.ns-0 h2 #Romanian::before, .ns-0 h2#Romanian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/73/Flag_of_Romania.svg/40px-Flag_of_Romania.svg.png');}
.ns-0 h2 #Romansh::before, .ns-0 h2#Romansh::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/0f/Flag_of_Canton_of_Graubünden.svg/40px-Flag_of_Canton_of_Graubünden.svg.png');}
.ns-0 h2 #Rotuman::before, .ns-0 h2#Rotuman::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bb/Flag_of_Rotuma_(1987-1988).svg/40px-Flag_of_Rotuma_(1987-1988).svg.png');}
.ns-0 h2 #Russian::before, .ns-0 h2#Russian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f3/Flag_of_Russia.svg/40px-Flag_of_Russia.svg.png');}
.ns-0 h2 #Rutul::before, .ns-0 h2#Rutul::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/da/Flag_of_the_Rutul_People.svg/40px-Flag_of_the_Rutul_People.svg.png');}
.ns-0 h2 #Rwanda-Rundi::before, .ns-0 h2#Rwanda-Rundi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/81/Flag_of_Rwanda_and_Burundi.svg/40px-Flag_of_Rwanda_and_Burundi.svg.png');}
.ns-0 h2 #Réunion_Creole_French::before, .ns-0 h2#Réunion_Creole_French::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8e/Proposed_flag_of_Réunion_(VAR).svg/40px-Proposed_flag_of_Réunion_(VAR).svg.png');}
.ns-0 h2 #S\'gaw_Karen::before, .ns-0 h2#S\'gaw_Karen::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dd/Flag_of_the_Karen_National_Union.svg/40px-Flag_of_the_Karen_National_Union.svg.png');}
.ns-0 h2 #Saho::before, .ns-0 h2#Saho::before{padding-right:5px;
content:url("//thumb.wikimedia.org/wikipedia/commons/thumb/c/c4/Flag_of_the_Saho_People's_Democratic_Movement.svg/40px-Flag_of_the_Saho_People's_Democratic_Movement.svg.png");}
.ns-0 h2 #Sambali::before, .ns-0 h2#Sambali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/81/Seal_of_Zambales.svg/40px-Seal_of_Zambales.svg.png');}
.ns-0 h2 #Samoan::before, .ns-0 h2#Samoan::before, .ns-0 h2 #Samoan_Plantation_Pidgin::before, .ns-0 h2#Samoan_Plantation_Pidgin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/31/Flag_of_Samoa.svg/40px-Flag_of_Samoa.svg.png');}
.ns-0 h2 #Samogitian::before, .ns-0 h2#Samogitian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c4/Flag_of_Žemaitija.svg/40px-Flag_of_Žemaitija.svg.png');}
.ns-0 h2 #Sanaviron::before, .ns-0 h2#Sanaviron::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/aa/Bandera_de_la_Ciudad_de_Córdoba.svg/40px-Bandera_de_la_Ciudad_de_Córdoba.svg.png');}
.ns-0 h2 #Sango::before, .ns-0 h2#Sango::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_the_Central_African_Republic.svg/40px-Flag_of_the_Central_African_Republic.svg.png');}
.ns-0 h2 #Sanskrit::before, .ns-0 h2#Sanskrit::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8e/Red_om_symbol.png/35px-Red_om_symbol.png');}
.ns-0 h2 #Sardinian::before, .ns-0 h2#Sardinian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4e/Flag_of_Sardinia,_Italy.svg/40px-Flag_of_Sardinia,_Italy.svg.png');}
.ns-0 h2 #Sassarese::before, .ns-0 h2#Sassarese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fe/Flag_of_Sassari.svg/40px-Flag_of_Sassari.svg.png');}
.ns-0 h2 #Saterland_Frisian::before, .ns-0 h2#Saterland_Frisian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2f/DEU_Saterland_Flag.svg/40px-DEU_Saterland_Flag.svg.png');}
.ns-0 h2 #Scanian::before, .ns-0 h2#Scanian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1e/Banner_of_Arms_of_Scania.svg/35px-Banner_of_Arms_of_Scania.svg.png');}
.ns-0 h2 #Scots::before, .ns-0 h2#Scots::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/10/Flag_of_Scotland.svg/40px-Flag_of_Scotland.svg.png');}
.ns-0 h2 #Sedang::before, .ns-0 h2#Sedang::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/19/Flag_of_Sedang.svg/36px-Flag_of_Sedang.svg.png');}
.ns-0 h2 #Selk\'nam::before, .ns-0 h2#Selk\'nam::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/94/Bandera_de_la_Provincia_de_Tierra_del_Fuego.svg/40px-Bandera_de_la_Provincia_de_Tierra_del_Fuego.svg.png');}
.ns-0 h2 #Serbo-Croatian::before, .ns-0 h2#Serbo-Croatian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fb/HR-BA-ME-RS_flag.svg/40px-HR-BA-ME-RS_flag.svg.png');}
.ns-0 h2 #Serer::before, .ns-0 h2#Serer::before, .ns-0 h2 #Wolof::before, .ns-0 h2#Wolof::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Senegal.svg/40px-Flag_of_Senegal.svg.png');}
.ns-0 h2 #Seri::before, .ns-0 h2#Seri::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4c/Bandera_de_la_Nacion_Comcaac.svg/40px-Bandera_de_la_Nacion_Comcaac.svg.png');}
.ns-0 h2 #Seychellois_Creole::before, .ns-0 h2#Seychellois_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fc/Flag_of_Seychelles.svg/40px-Flag_of_Seychelles.svg.png');}
.ns-0 h2 #Shan::before, .ns-0 h2#Shan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/68/Flag_of_Shan_State.svg/40px-Flag_of_Shan_State.svg.png');}
.ns-0 h2 #Shihhi_Arabic::before, .ns-0 h2#Shihhi_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5d/Flag_of_Sharjah_and_Ras_Al_Khaimah.svg/40px-Flag_of_Sharjah_and_Ras_Al_Khaimah.svg.png');}
.ns-0 h2 #Sicilian::before, .ns-0 h2#Sicilian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7a/Flag_of_Sicily.svg/40px-Flag_of_Sicily.svg.png');}
.ns-0 h2 #Sidamo::before, .ns-0 h2#Sidamo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/59/Flag_of_Sidama.svg/40px-Flag_of_Sidama.svg.png');}
.ns-0 h2 #Sikkimese::before, .ns-0 h2#Sikkimese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6b/Flag_of_Sikkim_(1967-1975).svg/40px-Flag_of_Sikkim_(1967-1975).svg.png');}
.ns-0 h2 #Silesian::before, .ns-0 h2#Silesian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c1/Flag_of_Upper_Silesia.svg/40px-Flag_of_Upper_Silesia.svg.png');}
.ns-0 h2 #Sindhi::before, .ns-0 h2#Sindhi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c3/Flag_of_Sindh.svg/40px-Flag_of_Sindh.svg.png');}
.ns-0 h2 #Sinhalese::before, .ns-0 h2#Sinhalese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/11/Flag_of_Sri_Lanka.svg/40px-Flag_of_Sri_Lanka.svg.png');}
.ns-0 h2 #Slavomolisano::before, .ns-0 h2#Slavomolisano::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Molise.svg/40px-Flag_of_Molise.svg.png');}
.ns-0 h2 #Slovak::before, .ns-0 h2#Slovak::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e6/Flag_of_Slovakia.svg/40px-Flag_of_Slovakia.svg.png');}
.ns-0 h2 #Slovene::before, .ns-0 h2#Slovene::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f0/Flag_of_Slovenia.svg/40px-Flag_of_Slovenia.svg.png');}
.ns-0 h2 #Slovincian::before, .ns-0 h2#Slovincian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Wappen_Pommern.svg/35px-Wappen_Pommern.svg.png');}
.ns-0 h2 #Soga::before, .ns-0 h2#Soga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d8/Flag_of_Busoga_(royal_standard).png/40px-Flag_of_Busoga_(royal_standard).png');}
.ns-0 h2 #Solombala_English::before, .ns-0 h2#Solombala_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/20/Coat_of_Arms_of_Arkhangelsk.svg/32px-Coat_of_Arms_of_Arkhangelsk.svg.png');}
.ns-0 h2 #Somali::before, .ns-0 h2#Somali::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a0/Flag_of_Somalia.svg/40px-Flag_of_Somalia.svg.png');}
.ns-0 h2 #South_Levantine_Arabic::before, .ns-0 h2#South_Levantine_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/Flag_of_Palestine.svg/40px-Flag_of_Palestine.svg.png');}
.ns-0 h2 #Southern_Altai::before, .ns-0 h2#Southern_Altai::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/ff/Flag_of_Altai_Republic.svg/40px-Flag_of_Altai_Republic.svg.png');}
.ns-0 h2 #Southern_Ndebele::before, .ns-0 h2#Southern_Ndebele::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/93/Flag_of_Mpumalanga_Province.svg/40px-Flag_of_Mpumalanga_Province.svg.png');}
.ns-0 h2 #Spanish::before, .ns-0 h2#Spanish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Spanish_language_(ES-MX).svg/40px-Flag_of_Spanish_language_(ES-MX).svg.png');}
.ns-0 h2 #Sri_Lankan_Creole_Malay::before, .ns-0 h2#Sri_Lankan_Creole_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b3/Flag_of_the_Southern_Province_(Sri_Lanka).PNG/40px-Flag_of_the_Southern_Province_(Sri_Lanka).PNG');}
.ns-0 h2 #Sudovian::before, .ns-0 h2#Sudovian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Flag_of_Suvalkija.svg/40px-Flag_of_Suvalkija.svg.png');}
.ns-0 h2 #Sumerian::before, .ns-0 h2#Sumerian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3d/Cuneiform_sumer_dingir.svg/28px-Cuneiform_sumer_dingir.svg.png');}
.ns-0 h2 #Sundanese::before, .ns-0 h2#Sundanese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_West_Java_(vectorised).svg/40px-Flag_of_West_Java_(vectorised).svg.png');}
.ns-0 h2 #Surigaonon::before, .ns-0 h2#Surigaonon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Surigao_del_Norte.svg/40px-Flag_of_Surigao_del_Norte.svg.png');}
.ns-0 h2 #Swabian::before, .ns-0 h2#Swabian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/14/Flagge_Königreich_Württemberg.svg/40px-Flagge_Königreich_Württemberg.svg.png');}
.ns-0 h2 #Swazi::before, .ns-0 h2#Swazi::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fb/Flag_of_Eswatini.svg/40px-Flag_of_Eswatini.svg.png');}
.ns-0 h2 #Swedish::before, .ns-0 h2#Swedish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4c/Flag_of_Sweden.svg/40px-Flag_of_Sweden.svg.png');}
.ns-0 h2 #Tabasaran::before, .ns-0 h2#Tabasaran::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d0/Ethnic_flag_of_Tabasarans.svg/40px-Ethnic_flag_of_Tabasarans.svg.png');}
.ns-0 h2 #Tabasco_Nahuatl::before, .ns-0 h2#Tabasco_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b0/Coat_of_arms_of_Tabasco_(México).svg/32px-Coat_of_arms_of_Tabasco_(México).svg.png');}
.ns-0 h2 #Tachawit::before, .ns-0 h2#Tachawit::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6f/Flag_of_Chaouia.svg/40px-Flag_of_Chaouia.svg.png');}
.ns-0 h2 #Tagalog::before, .ns-0 h2#Tagalog::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/99/Flag_of_the_Philippines.svg/40px-Flag_of_the_Philippines.svg.png');}
.ns-0 h2 #Tahitian::before, .ns-0 h2#Tahitian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/db/Flag_of_French_Polynesia.svg/40px-Flag_of_French_Polynesia.svg.png');}
.ns-0 h2 #Tai_Dam::before, .ns-0 h2#Tai_Dam::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/93/Flag_of_the_Tai_Dam_People.svg/40px-Flag_of_the_Tai_Dam_People.svg.png');}
.ns-0 h2 #Tai_Dón::before, .ns-0 h2#Tai_Dón::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/86/Flag_of_Tay_Khao.png/40px-Flag_of_Tay_Khao.png');}
.ns-0 h2 #Taimyr_Pidgin_Russian::before, .ns-0 h2#Taimyr_Pidgin_Russian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4d/Flag_of_the_Siberian_Federal_District.png/40px-Flag_of_the_Siberian_Federal_District.png');}
.ns-0 h2 #Tajik::before, .ns-0 h2#Tajik::before, .ns-0 h2 #Tajiki_Arabic::before, .ns-0 h2#Tajiki_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d0/Flag_of_Tajikistan.svg/40px-Flag_of_Tajikistan.svg.png');}
.ns-0 h2 #Talysh::before, .ns-0 h2#Talysh::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/de/Flag_of_the_Talysh_National_Movement.svg/40px-Flag_of_the_Talysh_National_Movement.svg.png');}
.ns-0 h2 #Tarifit::before, .ns-0 h2#Tarifit::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/61/Flag_of_the_Republic_of_the_Rif.svg/40px-Flag_of_the_Republic_of_the_Rif.svg.png');}
.ns-0 h2 #Tarjumo::before, .ns-0 h2#Tarjumo::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/49/Kanem_flag_from_dulcerta_1339-pt.svg/40px-Kanem_flag_from_dulcerta_1339-pt.svg.png');}
.ns-0 h2 #Tatar::before, .ns-0 h2#Tatar::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/28/Flag_of_Tatarstan.svg/40px-Flag_of_Tatarstan.svg.png');}
.ns-0 h2 #Tausug::before, .ns-0 h2#Tausug::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/da/Late_19th_Century_Flag_of_Sulu.svg/40px-Late_19th_Century_Flag_of_Sulu.svg.png');}
.ns-0 h2 #Tayo::before, .ns-0 h2#Tayo::before, .ns-0 h2 #Xârâcùù::before, .ns-0 h2#Xârâcùù::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/66/Flag_of_FLNKS.svg/40px-Flag_of_FLNKS.svg.png');}
.ns-0 h2 #Tboli::before, .ns-0 h2#Tboli::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/7f/South_Cotabato_Flag.png/40px-South_Cotabato_Flag.png');}
.ns-0 h2 #Temascaltepec_Nahuatl::before, .ns-0 h2#Temascaltepec_Nahuatl::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/4b/TEMASCALTEPEC.svg/35px-TEMASCALTEPEC.svg.png');}
.ns-0 h2 #Terengganu_Malay::before, .ns-0 h2#Terengganu_Malay::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6b/Flag_of_Terengganu.svg/40px-Flag_of_Terengganu.svg.png');}
.ns-0 h2 #Ternate::before, .ns-0 h2#Ternate::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/61/Bendera_Ternate_-_Almulk_Buldan_Ternate.svg/40px-Bendera_Ternate_-_Almulk_Buldan_Ternate.svg.png');}
.ns-0 h2 #Tetum::before, .ns-0 h2#Tetum::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_East_Timor.svg/40px-Flag_of_East_Timor.svg.png');}
.ns-0 h2 #Thai::before, .ns-0 h2#Thai::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/a/a9/Flag_of_Thailand.svg/40px-Flag_of_Thailand.svg.png');}
.ns-0 h2 #Tibetan::before, .ns-0 h2#Tibetan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3c/Flag_of_Tibet.svg/40px-Flag_of_Tibet.svg.png');}
.ns-0 h2 #Ticuna::before, .ns-0 h2#Ticuna::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6b/Bandeira_do_Amazonas.svg/40px-Bandeira_do_Amazonas.svg.png');}
.ns-0 h2 #Tlingit::before, .ns-0 h2#Tlingit::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/94/Flag_of_the_Organized_Village_of_Kake.svg/40px-Flag_of_the_Organized_Village_of_Kake.svg.png');}
.ns-0 h2 #Toba_Batak::before, .ns-0 h2#Toba_Batak::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/5e/Flag_of_Batak_WRB.svg/40px-Flag_of_Batak_WRB.svg.png');}
.ns-0 h2 #Tobagonian_Creole_English::before, .ns-0 h2#Tobagonian_Creole_English::before, .ns-0 h2 #Trinidadian_Creole_English::before, .ns-0 h2#Trinidadian_Creole_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_Trinidad_and_Tobago.svg/40px-Flag_of_Trinidad_and_Tobago.svg.png');}
.ns-0 h2 #Tok_Pisin::before, .ns-0 h2#Tok_Pisin::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e3/Flag_of_Papua_New_Guinea.svg/40px-Flag_of_Papua_New_Guinea.svg.png');}
.ns-0 h2 #Tokelauan::before, .ns-0 h2#Tokelauan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8e/Flag_of_Tokelau.svg/40px-Flag_of_Tokelau.svg.png');}
.ns-0 h2 #Tongan::before, .ns-0 h2#Tongan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Tonga.svg/40px-Flag_of_Tonga.svg.png');}
.ns-0 h2 #Tooro::before, .ns-0 h2#Tooro::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Toro.gif/40px-Flag_of_Toro.gif');}
.ns-0 h2 #Transylvanian_Saxon::before, .ns-0 h2#Transylvanian_Saxon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8c/Flag_of_Transylvania_Saxons.svg/40px-Flag_of_Transylvania_Saxons.svg.png');}
.ns-0 h2 #Tsonga::before, .ns-0 h2#Tsonga::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/70/Flag_of_Tsonga_language.svg/40px-Flag_of_Tsonga_language.svg.png');}
.ns-0 h2 #Tsou::before, .ns-0 h2#Tsou::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_Chiayi_County.svg/40px-Flag_of_Chiayi_County.svg.png');}
.ns-0 h2 #Tswana::before, .ns-0 h2#Tswana::before, .ns-0 h2 #ǃXóõ::before, .ns-0 h2#ǃXóõ::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/fa/Flag_of_Botswana.svg/40px-Flag_of_Botswana.svg.png');}
.ns-0 h2 #Tuareg::before, .ns-0 h2#Tuareg::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Touareg_People_Flag.svg/40px-Touareg_People_Flag.svg.png');}
.ns-0 h2 #Tunisian_Arabic::before, .ns-0 h2#Tunisian_Arabic::before, .ns-0 h2 #Tunisian_Berber::before, .ns-0 h2#Tunisian_Berber::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/ce/Flag_of_Tunisia.svg/40px-Flag_of_Tunisia.svg.png');}
.ns-0 h2 #Turkana::before, .ns-0 h2#Turkana::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e8/Flag_of_Turkana_County.gif/40px-Flag_of_Turkana_County.gif');}
.ns-0 h2 #Turkish::before, .ns-0 h2#Turkish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Turkey.svg/40px-Flag_of_Turkey.svg.png');}
.ns-0 h2 #Turkmen::before, .ns-0 h2#Turkmen::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1b/Flag_of_Turkmenistan.svg/40px-Flag_of_Turkmenistan.svg.png');}
.ns-0 h2 #Tuvaluan::before, .ns-0 h2#Tuvaluan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/38/Flag_of_Tuvalu.svg/40px-Flag_of_Tuvalu.svg.png');}
.ns-0 h2 #Tuvan::before, .ns-0 h2#Tuvan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/7/77/Flag_of_Tuva.svg/40px-Flag_of_Tuva.svg.png');}
.ns-0 h2 #Tzotzil::before, .ns-0 h2#Tzotzil::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_the_Mayan_People.svg/40px-Flag_of_the_Mayan_People.svg.png');}
.ns-0 h2 #Tày::before, .ns-0 h2#Tày::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3d/Flag_of_the_Tay_people_(1947-1954).svg/40px-Flag_of_the_Tay_people_(1947-1954).svg.png');}
.ns-0 h2 #Tübatulabal::before, .ns-0 h2#Tübatulabal::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Seal_of_Kern_County,_California.png/40px-Seal_of_Kern_County,_California.png');}
.ns-0 h2 #Udmurt::before, .ns-0 h2#Udmurt::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c7/Flag_of_Udmurtia.svg/40px-Flag_of_Udmurtia.svg.png');}
.ns-0 h2 #Ukrainian::before, .ns-0 h2#Ukrainian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/49/Flag_of_Ukraine.svg/40px-Flag_of_Ukraine.svg.png');}
.ns-0 h2 #Umbrian::before, .ns-0 h2#Umbrian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cc/Flag_of_Umbria.svg/40px-Flag_of_Umbria.svg.png');}
.ns-0 h2 #Unserdeutsch::before, .ns-0 h2#Unserdeutsch::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/10/Flag_of_East_New_Britain.svg/40px-Flag_of_East_New_Britain.svg.png');}
.ns-0 h2 #Urdu::before, .ns-0 h2#Urdu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/32/Flag_of_Pakistan.svg/40px-Flag_of_Pakistan.svg.png');}
.ns-0 h2 #Uyghur::before, .ns-0 h2#Uyghur::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2c/Kokbayraq_flag.svg/40px-Kokbayraq_flag.svg.png');}
.ns-0 h2 #Uzbek::before, .ns-0 h2#Uzbek::before, .ns-0 h2 #Uzbeki_Arabic::before, .ns-0 h2#Uzbeki_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/84/Flag_of_Uzbekistan.svg/40px-Flag_of_Uzbekistan.svg.png');}
.ns-0 h2 #Vai::before, .ns-0 h2#Vai::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b8/Flag_of_Liberia.svg/40px-Flag_of_Liberia.svg.png');}
.ns-0 h2 #Veddah::before, .ns-0 h2#Veddah::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1c/Flag_of_the_Uva_Province_(Sri_Lanka).svg/40px-Flag_of_the_Uva_Province_(Sri_Lanka).svg.png');}
.ns-0 h2 #Venda::before, .ns-0 h2#Venda::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/21/Flag_of_Venda_(1973–1994).svg/40px-Flag_of_Venda_(1973–1994).svg.png');}
.ns-0 h2 #Venetan::before, .ns-0 h2#Venetan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d5/Flag_of_Veneto.svg/40px-Flag_of_Veneto.svg.png');}
.ns-0 h2 #Veps::before, .ns-0 h2#Veps::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Vepsia.svg/40px-Flag_of_Vepsia.svg.png');}
.ns-0 h2 #Vilamovian::before, .ns-0 h2#Vilamovian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/3/3d/POL_Wilamowice_COA.svg/35px-POL_Wilamowice_COA.svg.png');}
.ns-0 h2 #Vincentian_Creole_English::before, .ns-0 h2#Vincentian_Creole_English::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/6d/Flag_of_Saint_Vincent_and_the_Grenadines.svg/40px-Flag_of_Saint_Vincent_and_the_Grenadines.svg.png');}
.ns-0 h2 #Virgin_Islands_Creole::before, .ns-0 h2#Virgin_Islands_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f8/Flag_of_the_United_States_Virgin_Islands.svg/40px-Flag_of_the_United_States_Virgin_Islands.svg.png');}
.ns-0 h2 #Volapük::before, .ns-0 h2#Volapük::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/e3/Volapuk_symbol.svg/40px-Volapuk_symbol.svg.png');}
.ns-0 h2 #Volga_German::before, .ns-0 h2#Volga_German::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Flag_of_Volga_Germans_(version).svg/40px-Flag_of_Volga_Germans_(version).svg.png');}
.ns-0 h2 #Votic::before, .ns-0 h2#Votic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d1/Votic_Flag.svg/40px-Votic_Flag.svg.png');}
.ns-0 h2 #Võro::before, .ns-0 h2#Võro::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c1/Võrumaa_lipp.svg/40px-Võrumaa_lipp.svg.png');}
.ns-0 h2 #Walloon::before, .ns-0 h2#Walloon::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/42/Flag_of_Wallonia.svg/40px-Flag_of_Wallonia.svg.png');}
.ns-0 h2 #Wapishana::before, .ns-0 h2#Wapishana::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/9/98/Bandeira_de_Roraima.svg/40px-Bandeira_de_Roraima.svg.png');}
.ns-0 h2 #Waray-Waray::before, .ns-0 h2#Waray-Waray::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f2/Biliran_Provincial_Flag.png/40px-Biliran_Provincial_Flag.png');}
.ns-0 h2 #Wayuu::before, .ns-0 h2#Wayuu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/13/Panteera_Wayuu_Aumentado.png/40px-Panteera_Wayuu_Aumentado.png');}
.ns-0 h2 #Welsh::before, .ns-0 h2#Welsh::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/dc/Flag_of_Wales.svg/40px-Flag_of_Wales.svg.png');}
.ns-0 h2 #West_Circassian::before, .ns-0 h2#West_Circassian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/16/Flag_of_Adygea.svg/40px-Flag_of_Adygea.svg.png');}
.ns-0 h2 #West_Flemish::before, .ns-0 h2#West_Flemish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c2/Flag_of_West_Flanders.svg/40px-Flag_of_West_Flanders.svg.png');}
.ns-0 h2 #West_Frisian::before, .ns-0 h2#West_Frisian::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/ca/Frisian_flag.svg/40px-Frisian_flag.svg.png');}
.ns-0 h2 #West_Miraya_Bikol::before, .ns-0 h2#West_Miraya_Bikol::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/c2/Albay_Flag.png/40px-Albay_Flag.png');}
.ns-0 h2 #Western_Apache::before, .ns-0 h2#Western_Apache::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/8b/Coat_of_arms_of_Sonora.svg/35px-Coat_of_arms_of_Sonora.svg.png');}
.ns-0 h2 #Western_Cham::before, .ns-0 h2#Western_Cham::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Bandera_Front_Alliberament_Cham.svg/40px-Bandera_Front_Alliberament_Cham.svg.png');}
.ns-0 h2 #Western_Mari::before, .ns-0 h2#Western_Mari::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/24/Flag_of_Gornomariysky_rayon.svg/40px-Flag_of_Gornomariysky_rayon.svg.png');}
.ns-0 h2 #Wichí_Lhamtés_Güisnay::before, .ns-0 h2#Wichí_Lhamtés_Güisnay::before, .ns-0 h2 #Wichí_Lhamtés_Nocten::before, .ns-0 h2#Wichí_Lhamtés_Nocten::before, .ns-0 h2 #Wichí_Lhamtés_Vejoz::before, .ns-0 h2#Wichí_Lhamtés_Vejoz::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/66/Bandera_del_pueblo_Wichi.svg/40px-Bandera_del_pueblo_Wichi.svg.png');}
.ns-0 h2 #Woiwurrung::before, .ns-0 h2#Woiwurrung::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/08/Flag_of_Victoria_(Australia).svg/40px-Flag_of_Victoria_(Australia).svg.png');}
.ns-0 h2 #Wolio::before, .ns-0 h2#Wolio::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/55/Lambang_Kota_Bau-Bau.png/35px-Lambang_Kota_Bau-Bau.png');}
.ns-0 h2 #Xerénte::before, .ns-0 h2#Xerénte::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/ff/Bandeira_do_Tocantins.svg/40px-Bandeira_do_Tocantins.svg.png');}
.ns-0 h2 #Xhosa::before, .ns-0 h2#Xhosa::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/c/cc/Flag_of_Ciskei.svg/40px-Flag_of_Ciskei.svg.png');}
.ns-0 h2 #Xokleng::before, .ns-0 h2#Xokleng::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/1/1a/Bandeira_de_Santa_Catarina.svg/40px-Bandeira_de_Santa_Catarina.svg.png');}
.ns-0 h2 #Yakan::before, .ns-0 h2#Yakan::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/87/Flag_of_Basilan.svg/40px-Flag_of_Basilan.svg.png');}
.ns-0 h2 #Yakut::before, .ns-0 h2#Yakut::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/e/eb/Flag_of_Sakha.svg/40px-Flag_of_Sakha.svg.png');}
.ns-0 h2 #Yapese::before, .ns-0 h2#Yapese::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/2c/Flag_of_Yap.svg/40px-Flag_of_Yap.svg.png');}
.ns-0 h2 #Yaqui::before, .ns-0 h2#Yaqui::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/41/Flag_of_the_Pascua_Yaqui_Tribe_of_Arizona.svg/40px-Flag_of_the_Pascua_Yaqui_Tribe_of_Arizona.svg.png');}
.ns-0 h2 #Ye\'kwana::before, .ns-0 h2#Ye\'kwana::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/0/06/Flag_of_Venezuela.svg/40px-Flag_of_Venezuela.svg.png');}
.ns-0 h2 #Yemeni_Arabic::before, .ns-0 h2#Yemeni_Arabic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Yemen.svg/40px-Flag_of_Yemen.svg.png');}
.ns-0 h2 #Yiddish::before, .ns-0 h2#Yiddish::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/d/d6/Proposed_Yiddish_flag.svg/40px-Proposed_Yiddish_flag.svg.png');}
.ns-0 h2 #Yilan_Creole::before, .ns-0 h2#Yilan_Creole::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b4/Flag_of_Yilan_County.svg/40px-Flag_of_Yilan_County.svg.png');}
.ns-0 h2 #Yogad::before, .ns-0 h2#Yogad::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/bf/Flag_of_Echague,_Isabela_(2022-present).png/40px-Flag_of_Echague,_Isabela_(2022-present).png');}
.ns-0 h2 #Yola::before, .ns-0 h2#Yola::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/40/Flag_of_Yola.svg/40px-Flag_of_Yola.svg.png');}
.ns-0 h2 #Yonaguni::before, .ns-0 h2#Yonaguni::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/4/45/Flag_of_Yonaguni,_Okinawa.svg/40px-Flag_of_Yonaguni,_Okinawa.svg.png');}
.ns-0 h2 #Yucatec_Maya::before, .ns-0 h2#Yucatec_Maya::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/2/26/Flag_of_the_Republic_of_Yucatan.svg/40px-Flag_of_the_Republic_of_Yucatan.svg.png');}
.ns-0 h2 #Yuracare::before, .ns-0 h2#Yuracare::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f0/Flag_of_Cochabamba.svg/40px-Flag_of_Cochabamba.svg.png');}
.ns-0 h2 #Zaniza_Zapotec::before, .ns-0 h2#Zaniza_Zapotec::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/b/b2/Flag_of_Oaxaca.svg/40px-Flag_of_Oaxaca.svg.png');}
.ns-0 h2 #Zarma::before, .ns-0 h2#Zarma::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/f/f4/Flag_of_Niger.svg/40px-Flag_of_Niger.svg.png');}
.ns-0 h2 #Zazaki::before, .ns-0 h2#Zazaki::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/8/89/Flag_of_Zazaistan.svg/40px-Flag_of_Zazaistan.svg.png');}
.ns-0 h2 #Zealandic::before, .ns-0 h2#Zealandic::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/5/54/Flag_of_Zeeland.svg/40px-Flag_of_Zeeland.svg.png');}
.ns-0 h2 #Zhuang::before, .ns-0 h2#Zhuang::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/64/Flag_of_the_Zhuang_people.svg/40px-Flag_of_the_Zhuang_people.svg.png');}
.ns-0 h2 #Zulu::before, .ns-0 h2#Zulu::before{padding-right:5px;
content:url('//thumb.wikimedia.org/wikipedia/commons/thumb/6/60/Flag_of_the_KwaZulu-Natal_Province.png/40px-Flag_of_the_KwaZulu-Natal_Province.png');}
ea59ohnkl6grgf2641l56js8qmieuby
MediaWiki:Gadget-LogoTiles.css
8
17941
89287
88885
2026-11-02T23:08:14Z
Maintenance script
1536
Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup)
89287
css
text/css
#p-logo a {
background-image: url(//thumb.wikimedia.org/wikipedia/commons/thumb/f/ff/WiktionaryEn.svg/250px-WiktionaryEn.svg.png);
background-size: 136px;
background-repeat: no-repeat;
background-position-y: 0;
}
td0kds8zr8z326wt3ak5j6l3o0e4mtx
MediaWiki:Gadget-TargetedTranslations.css
8
17984
89288
88971
2026-11-02T23:08:15Z
Maintenance script
1536
Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup)
89288
css
text/css
.translationtargetstar {
background-image: url(https://thumb.wikimedia.org/wikipedia/commons/thumb/3/33/Watch-icon.svg/16px-Watch-icon.svg.png);
position: absolute;
margin-top: 3px;
margin-left: -17px;
cursor: pointer;
width: 16px;
height: 15px;
}
.translationtargetstar:hover {
background-image: url(https://thumb.wikimedia.org/wikipedia/commons/thumb/8/81/Watch-icon-hl.svg/16px-Watch-icon-hl.svg.png)
}
.translationtargetstarchecked {
background-image: url(https://thumb.wikimedia.org/wikipedia/commons/thumb/8/8a/Unwatch-icon.svg/16px-Unwatch-icon.svg.png);
position: absolute;
margin-top: 3px;
margin-left: -17px;
cursor: pointer;
width: 16px;
height: 15px;
}
.translationtargetstarchecked:hover {
background-image: url(https://thumb.wikimedia.org/wikipedia/commons/thumb/0/0d/Unwatch-icon-hl.svg/16px-Unwatch-icon-hl.svg.png);
}
qtlge071hyysl2oo36xiacc5zm6m4pi
MediaWiki:Gadget-HotCat.js
8
18003
89286
89010
2026-11-02T23:08:13Z
Maintenance script
1536
Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup)
89286
javascript
text/javascript
// {{documentation}}
// See also: MediaWiki:Gadget-HotCat.js/local defaults
//window.hotcat_translations_from_commons = true; // Make HotCat load its interface from the Commons (the default setting so no need to set it here)
/**
HotCat V2.43
en.wiktionary fork (with better support for en.wiktionary templates)
upstream: https://commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-HotCat.js&oldid=818790002
The original script is hosted at [https://commons.wikimedia.org/wiki/MediaWiki:Gadget-HotCat.js].
See it for more information.
License: Quadruple licensed, any of the following:
GFDL
GPL
LGPL
Creative Commons Attribution 3.0 (CC-BY-3.0)
Requires MediaWiki >= MW 1.27.
*/
// <nowiki>
/* eslint-disable vars-on-top, one-var, camelcase, no-alert, curly */
/* global jQuery, mediaWiki, UFUI, JSconfig, UploadForm */
/* jslint strict:false, nonew:false, bitwise:true */
( function ( $, mw ) {
// BEGINNING OF en.wiktionary EXTRA CODE
var EN_WIKTIONARY_CONTENT_NAMESPACE = [0, 100, 118].indexOf(mw.config.get("wgNamespaceNumber")) >= 0;
var EN_WIKTIONARY_TOPICS = ["C", "c", "topics", "top", "topic", "catlangcode"];
var EN_WIKTIONARY_CATLANGNAME = ["cln", "catlangname", "Cln"];
var EN_WIKTIONARY_CATEGORIZE = ["categorize", "cat"];
var EN_WIKTIONARY_PREFER_TOPICS_FOR_NEW_ADDITIONS = true;
var EN_WIKTIONARY_PREFER_CATLANGNAME_FOR_NEW_ADDITIONS = true;
function regexpEscape(string) {
return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function cleanUpText(wikitext) {
return wikitext
.replace( /<!--(\s|\S)*?-->/g, replaceByBlanks )
.replace( /<nowiki>(\s|\S)*?<\/nowiki>/g, replaceByBlanks );
}
function en_wiktionary_find_category_allMatches(regexp, wikitext, data_key, data) {
var copiedtext = cleanUpText(wikitext);
var result = [];
var curr_match = null;
while ((curr_match = regexp.exec(copiedtext)) !== null) {
var obj = { match: curr_match };
obj[data_key] = data;
result.push(obj);
}
result.re = regexp;
return result.length ? result : null;
}
function en_wiktionary_codeToCanonicalName(callback) {
$.get({
"url": mw.util.wikiScript('index'),
"data": {
"action": "raw",
"title": "Module:languages/code to canonical name.json"
},
"cache": true
}).then(function(r) {
var parsedData;
try {
parsedData = JSON.parse(r);
callback({ ok: true, data: parsedData });
} catch (e) {
console.error(e);
callback({ ok: false });
}
});
}
function en_wiktionary_populate_langdata(data) {
data.langnames = [];
data.name_to_code = {};
for (var key in data.code_to_name) {
if (data.code_to_name.hasOwnProperty(key)) {
var value = data.code_to_name[key];
data.langnames.push(value);
data.name_to_code[value] = key;
}
}
var escaped = data.langnames.map(regexpEscape);
// sort from longest to shortest to ensure greedy alternation
escaped.sort(function (a, b) { return b.length - a.length; });
data.catlangnameRegexp = "^(" + escaped.join("|") + ") (.+)";
}
var EN_WIKTIONARY_LANGUAGE_DATA_STORAGE_KEY = "HotCat-en-wiktionary-language-data";
function en_wiktionary_cache_langdata(callback) {
if (!window.sessionStorage) {
callback();
return;
}
if (window.sessionStorage.hasOwnProperty(EN_WIKTIONARY_LANGUAGE_DATA_STORAGE_KEY)) {
try {
var timeNow = new Date().getTime();
var data = JSON.parse(window.sessionStorage.getItem(EN_WIKTIONARY_LANGUAGE_DATA_STORAGE_KEY));
if (timeNow < data.expiry) {
EN_WIKTIONARY_LANGDATA = data.data;
EN_WIKTIONARY_LANGDATA_READY = true;
EN_WIKTIONARY_LANGDATA.catlangnameRegexpCompiled = null;
callback();
return;
}
} catch (e) { }
}
en_wiktionary_codeToCanonicalName(function (r) {
if (r.ok) {
EN_WIKTIONARY_LANGDATA = {};
EN_WIKTIONARY_LANGDATA.code_to_name = r.data;
en_wiktionary_populate_langdata(EN_WIKTIONARY_LANGDATA);
}
EN_WIKTIONARY_LANGDATA_READY = true;
if (window.sessionStorage)
window.sessionStorage.setItem(EN_WIKTIONARY_LANGUAGE_DATA_STORAGE_KEY, JSON.stringify({
expiry: new Date().getTime() + 30 * 60 * 1000, // expire in 30 minutes
data: EN_WIKTIONARY_LANGDATA
}));
callback();
});
}
var EN_WIKTIONARY_LANGDATA = null;
var EN_WIKTIONARY_LANGDATA_READY = false;
var EN_WIKTIONARY_LANGDATA_LOCK = false;
var EN_WIKTIONARY_LANGDATA_QUEUE = [];
function en_wiktionary_get_langdata(callback) {
if (EN_WIKTIONARY_LANGDATA_READY) {
callback();
} else {
if (!EN_WIKTIONARY_LANGDATA_LOCK) {
EN_WIKTIONARY_LANGDATA_LOCK = true;
en_wiktionary_cache_langdata(function() {
callback();
EN_WIKTIONARY_LANGDATA_QUEUE.forEach(function(fn) { fn(); });
});
return;
}
EN_WIKTIONARY_LANGDATA_QUEUE.push(callback);
}
}
function EN_WIKTIONARY_TOPICS_START(lang, bar_required) {
return "\\{\\{\\s*(?:" + EN_WIKTIONARY_TOPICS.join("|") + ")\\s*\\|\\s*" + lang + "\\s*\\|" + (bar_required ? "" : "?");
}
function EN_WIKTIONARY_CATLANGNAME_START(lang, bar_required) {
return "\\{\\{\\s*(?:" + EN_WIKTIONARY_CATLANGNAME.join("|") + ")\\s*\\|\\s*" + lang + "\\s*\\|" + (bar_required ? "" : "?");
}
function EN_WIKTIONARY_CATEGORIZE_START(lang, bar_required) {
return "\\{\\{\\s*(?:" + EN_WIKTIONARY_CATEGORIZE.join("|") + ")\\s*\\|\\s*" + (lang == true ? "(" : "") + "[a-z0-9-]+" + (lang == true ? ")" : "") + "\\s*\\|" + (bar_required ? "" : "?");
}
var EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS = "[^}]*";
var EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER = "?(?<=\\|)";
var EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER = "(?=\\s*[\|\}])";
var EN_WIKTIONARY_TEMPLATE_END = "\\}\\}";
var EN_WIKTIONARY_TEMPLATE_END_WITH_WHITESPACE = "\\s*\\}\\}\n?";
function en_wiktionary_category_name_detect(category) {
var topicsMatch = category.match(/^([a-z-]+):(.+)$/);
if (topicsMatch) {
return { type: "topics", lang: topicsMatch[1], topic: topicsMatch[2] };
}
if (EN_WIKTIONARY_LANGDATA) {
var data = EN_WIKTIONARY_LANGDATA;
if (!data.catlangnameRegexpCompiled) {
data.catlangnameRegexpCompiled = new RegExp(data.catlangnameRegexp);
}
var catlangnameMatch = category.match(data.catlangnameRegexpCompiled);
if (catlangnameMatch && data.name_to_code[catlangnameMatch[1]]) {
return { type: "catlangname",
lang: data.name_to_code[catlangnameMatch[1]],
topic: catlangnameMatch[2] };
}
}
return null;
}
function en_wiktionary_find_category(wikitext, category, once) {
if (!EN_WIKTIONARY_CONTENT_NAMESPACE) return null;
var catname = en_wiktionary_category_name_detect(category);
var data, matched;
if (catname) {
if (catname.type == "topics") {
var topicTemplateRegex = new RegExp(
EN_WIKTIONARY_TOPICS_START(catname.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER +
regexpEscape(catname.topic) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_END, "g");
data = { lang: catname.lang, name: catname.topic };
if (once) {
matched = topicTemplateRegex.exec(wikitext);
if (matched) {
matched.enWiktTopics = data;
}
return matched;
}
return en_wiktionary_find_category_allMatches(topicTemplateRegex, wikitext, "enWiktTopics", data);
} else if (catname.type == "catlangname") {
var clnTemplateRegex = new RegExp(
EN_WIKTIONARY_CATLANGNAME_START(catname.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER +
regexpEscape(catname.topic) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_END, "g");
data = { lang: catname.lang, name: catname.topic };
if (once) {
matched = clnTemplateRegex.exec(wikitext);
if (matched) {
matched.enWiktCatlangname = data;
}
return matched;
}
return en_wiktionary_find_category_allMatches(clnTemplateRegex, wikitext, "enWiktCatlangname", data);
}
}
var catTemplateRegex = new RegExp(EN_WIKTIONARY_CATEGORIZE_START(true, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER +
regexpEscape(category) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_END, "g");
var catTemplateMatches = wikitext.match(catTemplateRegex);
if (catTemplateMatches) {
data = { lang: catTemplateMatches[1], name: category };
if (once) {
if (catTemplateMatches) {
catTemplateMatches.enWiktCategorize = data;
}
return catTemplateMatches;
}
catTemplateRegex.lastIndex = 0;
return en_wiktionary_find_category_allMatches(catTemplateRegex, wikitext, "enWiktCategorize", data);
}
return null;
}
function en_wiktionary_is_special_match(match) {
return !!(match.enWiktTopics || match.enWiktCatlangname || match.enWiktCategorize);
}
function en_wiktionary_three_to_two_split(wikitext, match) {
var before, after, data, removeTopic;
if (match.enWiktTopics) { // {{topics}}?
data = match.enWiktTopics;
before = wikitext.substring(0, match.match.index);
after = wikitext.substring(match.match.index);
var topicTemplateRegex = new RegExp(
EN_WIKTIONARY_TOPICS_START(data.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER +
regexpEscape(data.name) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_END + "\\s*?\n?");
removeTopic = function(inner) {
// remove parameter from {{topics}}
var remaining = inner.replace(new RegExp("\\|" +
regexpEscape(data.name) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER), "");
// if it is now empty, remove it
remaining = remaining.replace(new RegExp(
EN_WIKTIONARY_TOPICS_START(data.lang, false) +
EN_WIKTIONARY_TEMPLATE_END_WITH_WHITESPACE), "");
return remaining;
};
return [before, after.replace(topicTemplateRegex, removeTopic)];
} else if (match.enWiktCatlangname) { // {{cln}}?
data = match.enWiktCatlangname;
before = wikitext.substring(0, match.match.index);
after = wikitext.substring(match.match.index);
var clnTemplateRegex = new RegExp(
EN_WIKTIONARY_CATLANGNAME_START(data.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER +
regexpEscape(data.name) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_END + "\\s*?\n?");
removeTopic = function(inner) {
// remove parameter from {{cln}}
var remaining = inner.replace(new RegExp("\\|" +
regexpEscape(data.name) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER), "");
// if it is now empty, remove it
remaining = remaining.replace(new RegExp(
EN_WIKTIONARY_CATLANGNAME_START(data.lang, false) +
EN_WIKTIONARY_TEMPLATE_END_WITH_WHITESPACE), "");
return remaining;
};
return [before, after.replace(clnTemplateRegex, removeTopic)];
} else if (match.enWiktCategorize) { // {{cat}}?
data = match.enWiktCategorize;
before = wikitext.substring(0, match.match.index);
after = wikitext.substring(match.match.index);
var catTemplateRegex = new RegExp(
EN_WIKTIONARY_CATEGORIZE_START(data.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_START_OF_PARAMETER +
regexpEscape(data.name) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
EN_WIKTIONARY_TEMPLATE_END + "\\s*?\n?");
removeTopic = function(inner) {
// remove parameter from {{cln}}
var remaining = inner.replace(new RegExp("\\|" +
regexpEscape(data.name) +
EN_WIKTIONARY_TEMPLATE_END_OF_PARAMETER), "");
// if it is now empty, remove it
remaining = remaining.replace(new RegExp(
EN_WIKTIONARY_CATEGORIZE_START(data.lang, false) +
EN_WIKTIONARY_TEMPLATE_END_WITH_WHITESPACE), "");
return remaining;
};
return [before, after.replace(catTemplateRegex, removeTopic)];
}
before = wikitext.substring(0, match.match.index);
after = wikitext.substring(match.match.index + match.match[0].length);
return [before, after];
}
function en_wiktionary_remove_category(wikitext, match) {
var before_after = en_wiktionary_three_to_two_split(wikitext, match);
return before_after[0] + before_after[1];
}
function en_wiktionary_find_insertionpoint(wikitext, category) {
var catname = en_wiktionary_category_name_detect(category);
if (catname) {
if (catname.lang) {
var langname = catname.langname || (EN_WIKTIONARY_LANGDATA ? EN_WIKTIONARY_LANGDATA.code_to_name[catname.lang] : null);
if (langname) {
// try to put category under the language L2
var l2_heading_this = "^==\\s*" + regexpEscape(langname) + "\\s*==$";
var end_of_l2 = "\\n*(?:^----$)?\\n*^==(?!=)\\s*.*\\s*==$";
var clean_wikitext = cleanUpText(wikitext);
var finalRegexp = "(" + l2_heading_this + "[\\s\\S]+?)" + end_of_l2;
var match = new RegExp(finalRegexp, "m").exec(clean_wikitext);
if (match) {
var rawPoint = match.index + match[1].length;
var noPreLine = false;
if (wikitext.substring(rawPoint - 2, rawPoint) == "]]") {
return {
idx: rawPoint,
onCat: true
};
}
var cookedPoint = rawPoint;
if (wikitext.substring(cookedPoint - 3, cookedPoint) == "}}\n") {
// if the preceding line has a topics/cln template, add noPreLine
var i = cookedPoint - 2;
while (i >= 0 && wikitext[i] !== '\n') {
i--;
}
i += 2;
var previousLine = wikitext.substring(i, cookedPoint - 1);
if (previousLine.match(new RegExp("^\\{\\{(?:" + EN_WIKTIONARY_TOPICS.join("|") + "|" + EN_WIKTIONARY_CATLANGNAME.join("|") + ")\\|"))) {
noPreLine = true;
}
}
// hotfix: fix newline placement
if (!noPreLine && wikitext.charAt(cookedPoint - 1) != "\n" && wikitext.substring(cookedPoint, cookedPoint + 2) == "\n\n") {
++cookedPoint;
}
return {
idx: cookedPoint,
onCat: false,
noPreLine: noPreLine
};
} else {
var l2match = new RegExp(l2_heading_this, "m").exec(clean_wikitext);
if (l2match) {
// assuming there are no more L2s...
var l2_regex = new RegExp("^==(?!=)\\s*.*\\s*==$", "gm");
l2_regex.lastIndex = l2match.index + l2match[0].length;
var l2nextmatch = l2_regex.exec(clean_wikitext);
if (!l2nextmatch) {
// no more L2s
return {
idx: -1,
onCat: false
};
}
}
}
}
}
}
return null; // fallback
}
function en_wiktionary_add_category_hook(wikitext, category, cat_point) {
var catname = en_wiktionary_category_name_detect(category);
if (catname) {
var match, splitPoint;
if (catname.type == "topics") {
// try to find the first language template that matches and
// add the category there
var topicTemplateRegex = new RegExp("(?:^|(?<=\\n))(" +
EN_WIKTIONARY_TOPICS_START(catname.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
")" + EN_WIKTIONARY_TEMPLATE_END);
match = topicTemplateRegex.exec(cleanUpText(wikitext));
if (match) {
splitPoint = match.index + match[1].length;
return wikitext.substring(0, splitPoint) + "|" + catname.topic + wikitext.substring(splitPoint);
}
}
if (catname.type == "catlangname") {
// try to find the first language template that matches and
// add the category there
var clnTemplateRegex = new RegExp("(?:^|(?<=\\n))(" +
EN_WIKTIONARY_CATLANGNAME_START(catname.lang, true) +
EN_WIKTIONARY_TEMPLATE_ANY_PARAMETERS +
")" + EN_WIKTIONARY_TEMPLATE_END);
match = clnTemplateRegex.exec(cleanUpText(wikitext));
if (match) {
splitPoint = match.index + match[1].length;
return wikitext.substring(0, splitPoint) + "|" + catname.topic + wikitext.substring(splitPoint);
}
}
}
return null; // fallback
}
function en_wiktionary_add_category_string(category, onCat) {
var catname = en_wiktionary_category_name_detect(category);
if (catname) {
if (catname.type == "topics" && EN_WIKTIONARY_PREFER_TOPICS_FOR_NEW_ADDITIONS && !onCat) {
return "{{" + EN_WIKTIONARY_TOPICS[0] + "|" + catname.lang + "|" + catname.topic + "}}";
}
if (catname.type == "catlangname" && EN_WIKTIONARY_PREFER_CATLANGNAME_FOR_NEW_ADDITIONS && !onCat) {
return "{{" + EN_WIKTIONARY_CATLANGNAME[0] + "|" + catname.lang + "|" + catname.topic + "}}";
}
}
return null; // fallback
}
// END OF en.wiktionary EXTRA CODE
// Don't use mw.config.get() as that takes a copy of the config, and so doesn't
// account for values changing, e.g. wgCurRevisionId after a VE edit
var
conf = mw.config.values,
// when running on mobile domain - do not use wgServer.
wgServer = window.location.host.indexOf('.m.') > -1 ?
'//' + window.location.host : mw.config.get( 'wgServer' );
// Guard against double inclusions (in old IE/Opera element ids become window properties)
if ( ( window.HotCat && !window.HotCat.nodeName ) ||
conf.wgAction === 'edit' ) // Not on edit mode
return;
// Configuration stuff.
var HC = window.HotCat = {
// Localize these messages to the main language of your wiki.
messages: {
cat_removed: 'removed [[Category:$1]]',
template_removed: 'removed {{[[Category:$1]]}}',
cat_added: 'added [[Category:$1]]',
cat_keychange: 'new key for [[Category:$1]]: "$2"', // $2 is the new key
cat_notFound: 'Category "$1" not found',
cat_exists: 'Category "$1" already exists; not added.',
cat_resolved: ' (redirect [[Category:$1]] resolved)',
uncat_removed: 'removed {{uncategorized}}',
separator: '; ',
// Some text to prefix to the edit summary.
prefix: '',
// Some text to append to the edit summary. Named 'using' for historical reasons. If you prefer
// to have a marker at the front, use prefix and set this to the empty string.
using: ' using [[Help:Gadget-HotCat|HotCat]]',
// $1 is replaced by a number. If your language has several plural forms (c.f. [[:en:Dual (grammatical form)]]),
// you can set this to an array of strings suitable for passing to mw.language.configPlural().
// If that function doesn't exist, HotCat will simply fall back to using the last
// entry in the array.
multi_change: '$1 categories',
// Button text. Localize to wgContentLanguage here; localize to wgUserLanguage in a subpage,
// see localization hook below.
commit: 'Save',
// Button text. Localize to wgContentLanguage here; localize to wgUserLanguage in a subpage,
// see localization hook below.
ok: 'OK',
// Button text. Localize to wgContentLanguage here; localize to wgUserLanguage in a subpage,
// see localization hook below.
cancel: 'Cancel',
// Localize to wgContentLanguage here; localize to wgUserLanguage in a subpage,
// see localization hook below.
multi_error: 'Could not retrieve the page text from the server. Therefore, your category changes ' +
'cannot be saved. We apologize for the inconvenience.',
// Defaults to '[[' + category_canonical + ':$1]]'. Can be overridden if in the short edit summaries
// not the standard category name should be used but, say, a shorter namespace alias. $1 is replaced
// by a category name.
short_catchange: null
},
// Plural of category_canonical.
categories: 'Categories',
// Any category in this category is deemed a disambiguation category; i.e., a category that should not contain
// any items, but that contains links to other categories where stuff should be categorized. If you don't have
// that concept on your wiki, set it to null. Use blanks, not underscores.
disambig_category: 'Disambiguation',
// Any category in this category is deemed a (soft) redirect to some other category defined by a link
// to another non-blacklisted category. If your wiki doesn't have soft category redirects, set this to null.
// If a soft-redirected category contains more than one link to another non-blacklisted category, it's considered
// a disambiguation category instead.
redir_category: 'Category redirects',
// The little modification links displayed after category names. U+2212 is a minus sign; U+2193 and U+2191 are
// downward and upward pointing arrows. Do not use ↓ and ↑ in the code!
links: {
change: '(±)',
remove: '(\u2212)',
add: '(+)',
restore: '(×)',
undo: '(×)',
down: '(\u2193)',
up: '(\u2191)'
},
changeTag: conf.wgUserName ? 'HotCat' : '', // if tag is missing, edit is rejected
// The tooltips for the above links
tooltips: {
change: 'Modify',
remove: 'Remove',
add: 'Add a new category',
restore: 'Undo changes',
undo: 'Undo changes',
down: 'Open for modifying and display subcategories',
up: 'Open for modifying and display parent categories'
},
// The HTML content of the "enter multi-mode" link at the front.
addmulti: '<span>+<sup>+</sup></span>',
// Tooltip for the "enter multi-mode" link
multi_tooltip: 'Modify several categories',
// Return true to disable HotCat.
disable: function () {
var ns = conf.wgNamespaceNumber;
var nsIds = conf.wgNamespaceIds;
return (
ns < 0 || // Special pages; Special:Upload is handled differently
ns === 10 || // Templates
ns === 828 || // Module (Lua)
ns === 8 || // MediaWiki
ns === 6 && !conf.wgArticleId || // Non-existing file pages
ns === 2 && /\.(js|css)$/.test( conf.wgTitle ) || // User scripts
nsIds &&
( ns === nsIds.creator ||
ns === nsIds.timedtext ||
ns === nsIds.institution ) );
},
// A regexp matching a templates used to mark uncategorized pages, if your wiki does have that.
// If not, set it to null.
uncat_regexp: /\{\{\s*[Uu]ncategorized\s*[^}]*\}\}\s*(<!--.*?-->\s*)?/g,
// The images used for the little indication icon. Should not need changing.
existsYes: '//thumb.wikimedia.org/wikipedia/commons/thumb/b/be/P_yes.svg/20px-P_yes.svg.png',
existsNo: '//thumb.wikimedia.org/wikipedia/commons/thumb/4/42/P_no.svg/20px-P_no.svg.png',
// a list of categories which can be removed by removing a template
// key: the category without namespace
// value: A regexp matching the template name, again without namespace
// If you don't have this at your wiki, or don't want this, set it to an empty object {}.
template_categories: {},
// Names for the search engines
engine_names: {
searchindex: 'Search index',
pagelist: 'Page list',
combined: 'Combined search',
subcat: 'Subcategories',
parentcat: 'Parent categories'
},
// Override the decision of whether HotCat should help users by automatically
// capitalising the title in the user input text if the wiki has case-sensitive page names.
// Basically, this will make an API query to check the MediaWiki configuration and HotCat then sets
// this to true for most wikis, and to false on Wiktionary.
//
// You can set this directly if there is a problem with it. For example, Georgian Wikipedia (kawiki),
// is known to have different capitalisation logic between MediaWiki PHP and JavaScript. As such, automatic
// case changes in JavaScript by HotCat would be wrong.
capitalizePageNames: null,
// If upload_disabled is true, HotCat will not be used on the Upload form.
upload_disabled: false,
// Single regular expression matching blacklisted categories that cannot be changed or
// added using HotCat. For instance /\bstubs?$/ (any category ending with the word "stub"
// or "stubs"), or /(\bstubs?$)|\bmaintenance\b/ (stub categories and any category with the
// word "maintenance" in its title.
blacklist: null,
// Stuff changeable by users:
// Background for changed categories in multi-edit mode. Default is a very light salmon pink.
bg_changed: '#FCA',
// If true, HotCat will never automatically submit changes. HotCat will only open an edit page with
// the changes; users must always save explicitly.
no_autocommit: false,
// If true, the "category deletion" link "(-)" will never save automatically but always show an
// edit page where the user has to save the edit manually. Is false by default because that's the
// traditional behavior. This setting overrides no_autocommit for "(-)" links.
del_needs_diff: false,
// Time, in milliseconds, that HotCat waits after a keystroke before making a request to the
// server to get suggestions.
suggest_delay: 100,
// Default width, in characters, of the text input field.
editbox_width: 40,
// One of the engine_names above, to be used as the default suggestion engine.
suggestions: 'combined',
// If true, always use the default engine, and never display a selector.
fixed_search: false,
// If false, do not display the "up" and "down" links
use_up_down: true,
// Default list size
listSize: 10,
// If true, single category changes are marked as minor edits. If false, they're not.
single_minor: true,
// If true, never add a page to the user's watchlist. If false, pages get added to the watchlist if
// the user has the "Add pages I edit to my watchlist" or the "Add pages I create to my watchlist"
// options in his or her preferences set.
dont_add_to_watchlist: false,
shortcuts: null,
addShortcuts: function ( map ) {
if ( !map ) return;
window.HotCat.shortcuts = window.HotCat.shortcuts || {};
for ( var k in map ) {
if ( !map.hasOwnProperty( k ) || typeof k !== 'string' ) continue;
var v = map[ k ];
if ( typeof v !== 'string' ) continue;
k = k.replace( /^\s+|\s+$/g, '' );
v = v.replace( /^\s+|\s+$/g, '' );
if ( !k.length || !v.length ) continue;
window.HotCat.shortcuts[ k ] = v;
}
}
};
// More backwards compatibility. We have a few places where we test for the browser: once for
// Safari < 3.0, and twice for WebKit (Chrome or Safari, any versions)
var ua = navigator.userAgent.toLowerCase();
var is_webkit = /applewebkit\/\d+/.test( ua ) && ua.indexOf( 'spoofer' ) < 0;
var cat_prefix = null;
var noSuggestions = false;
function LoadTrigger( needed ) {
// Define methods in a closure so that self reference is available,
// also allows method calls to be detached.
var self = this;
self.queue = [];
self.needed = needed;
self.register = function ( callback ) {
if ( self.needed <= 0 ) callback(); // Execute directly
else self.queue.push( callback );
};
self.loaded = function () {
self.needed--;
if ( self.needed === 0 ) {
// Run queued callbacks once
for ( var i = 0; i < self.queue.length; i++ ) self.queue[ i ]();
self.queue = [];
}
};
}
// Used to delay running the HotCat setup until /local_defaults and localizations have been loaded.
var loadTrigger = new LoadTrigger( 2 );
function load( uri, callback ) {
var s = document.createElement( 'script' );
s.src = uri;
var called = false;
s.onload = s.onerror = function () {
if ( !called && callback ) {
called = true;
callback();
}
if ( s.parentNode ) {
s.parentNode.removeChild( s );
}
};
document.head.appendChild( s );
}
function loadJS( page, callback ) {
load( wgServer + conf.wgScript + '?title=' + encodeURIComponent( page ) + '&action=raw&ctype=text/javascript', callback );
}
function loadURI( href, callback ) {
var url = href;
if ( url.substring( 0, 2 ) === '//' ) url = window.location.protocol + url; else if ( url.substring( 0, 1 ) === '/' ) url = wgServer + url;
load( url, callback );
}
// Load local configurations, overriding the pre-set default values in the HotCat object above. This is always loaded
// from the wiki where this script is executing, even if this script itself is hotlinked from Commons. This can
// be used to change the default settings, or to provide localized interface texts for edit summaries and so on.
loadJS( 'MediaWiki:Gadget-HotCat.js/local_defaults', loadTrigger.loaded );
// Load localized UI texts. These are the texts that HotCat displays on the page itself. Texts shown in edit summaries
// should be localized in /local_defaults above.
if ( conf.wgUserLanguage !== 'en' ) {
// Lupo: somebody thought it would be a good idea to add this. So the default is true, and you have to set it to false
// explicitly if you're not on Commons and don't want that.
if ( window.hotcat_translations_from_commons === undefined ) window.hotcat_translations_from_commons = true;
// Localization hook to localize HotCat messages, tooltips, and engine names for wgUserLanguage.
if ( window.hotcat_translations_from_commons && wgServer.indexOf( '//commons' ) < 0 ) {
loadURI( '//commons.wikimedia.org/w/index.php?title=' +
'MediaWiki:Gadget-HotCat.js/' + conf.wgUserLanguage +
'&action=raw&ctype=text/javascript', loadTrigger.loaded );
} else {
// Load translations locally
loadJS( 'MediaWiki:Gadget-HotCat.js/' + conf.wgUserLanguage, loadTrigger.loaded );
}
} else {
loadTrigger.loaded();
}
// No further changes should be necessary here.
// The following regular expression strings are used when searching for categories in wikitext.
var wikiTextBlank = '[\\t _\\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]+';
var wikiTextBlankRE = new RegExp( wikiTextBlank, 'g' );
// Regexp for handling blanks inside a category title or namespace name.
// See http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/Title.php?revision=104051&view=markup#l2722
// See also http://www.fileformat.info/info/unicode/category/Zs/list.htm
// MediaWiki collapses several contiguous blanks inside a page title to one single blank. It also replace a
// number of special whitespace characters by simple blanks. And finally, blanks are treated as underscores.
// Therefore, when looking for page titles in wikitext, we must handle all these cases.
// Note: we _do_ include the horizontal tab in the above list, even though the MediaWiki software for some reason
// appears to not handle it. The zero-width space \u200B is _not_ handled as a space inside titles by MW.
var wikiTextBlankOrBidi = '[\\t _\\xA0\\u1680\\u180E\\u2000-\\u200B\\u200E\\u200F\\u2028-\\u202F\\u205F\\u3000]*';
// Whitespace regexp for handling whitespace between link components. Including the horizontal tab, but not \n\r\f\v:
// a link must be on one single line.
// MediaWiki also removes Unicode bidi override characters in page titles (and namespace names) completely.
// This is *not* handled, as it would require us to allow any of [\u200E\u200F\u202A-\u202E] between any two
// characters inside a category link. It _could_ be done though... We _do_ handle strange spaces, including the
// zero-width space \u200B, and bidi overrides between the components of a category link (adjacent to the colon,
// or adjacent to and inside of "[[" and "]]").
// First auto-localize the regexps for the category and the template namespaces.
var formattedNamespaces = conf.wgFormattedNamespaces;
var namespaceIds = conf.wgNamespaceIds;
function autoLocalize( namespaceNumber, fallback ) {
function createRegexpStr( name ) {
if ( !name || !name.length ) return '';
var regex_name = '';
for ( var i = 0; i < name.length; i++ ) {
var initial = name.charAt( i ),
ll = initial.toLowerCase(),
ul = initial.toUpperCase();
if ( ll === ul ) regex_name += initial; else regex_name += '[' + ll + ul + ']';
}
return regex_name
.replace( /([\\^$.?*+()])/g, '\\$1' )
.replace( wikiTextBlankRE, wikiTextBlank );
}
fallback = fallback.toLowerCase();
var canonical = formattedNamespaces[ String( namespaceNumber ) ].toLowerCase();
var regexp = createRegexpStr( canonical );
if ( fallback && canonical !== fallback ) regexp += '|' + createRegexpStr( fallback );
if ( namespaceIds ) {
for ( var cat_name in namespaceIds ) {
if (
typeof cat_name === 'string' &&
cat_name.toLowerCase() !== canonical &&
cat_name.toLowerCase() !== fallback &&
namespaceIds[ cat_name ] === namespaceNumber
) {
regexp += '|' + createRegexpStr( cat_name );
}
}
}
return regexp;
}
HC.category_canonical = formattedNamespaces[ '14' ];
HC.category_regexp = autoLocalize( 14, 'category' );
if ( formattedNamespaces[ '10' ] ) HC.template_regexp = autoLocalize( 10, 'template' );
// Utility functions. Yes, this duplicates some functionality that also exists in other places, but
// to keep this whole stuff in a single file not depending on any other on-wiki JavaScripts, we re-do
// these few operations here.
function make( arg, literal ) {
if ( !arg ) return null;
return literal ? document.createTextNode( arg ) : document.createElement( arg );
}
function param( name, uri ) {
uri = uri || document.location.href;
var re = new RegExp( '[&?]' + name + '=([^&#]*)' );
var m = re.exec( uri );
if ( m && m.length > 1 ) return decodeURIComponent( m[ 1 ] );
return null;
}
function title( href ) {
if ( !href ) return null;
var script = conf.wgScript + '?';
if ( href.indexOf( script ) === 0 || href.indexOf( wgServer + script ) === 0 || wgServer.substring( 0, 2 ) === '//' && href.indexOf( document.location.protocol + wgServer + script ) === 0 ) {
// href="/w/index.php?title=..."
return param( 'title', href );
} else {
// href="/wiki/..."
var prefix = conf.wgArticlePath.replace( '$1', '' );
if ( href.indexOf( prefix ) ) prefix = wgServer + prefix; // Fully expanded URL?
if ( href.indexOf( prefix ) && prefix.substring( 0, 2 ) === '//' ) prefix = document.location.protocol + prefix; // Protocol-relative wgServer?
if ( href.indexOf( prefix ) === 0 ) return decodeURIComponent( href.substring( prefix.length ) );
}
return null;
}
function hasClass( elem, name ) {
return ( ' ' + elem.className + ' ' ).indexOf( ' ' + name + ' ' ) >= 0;
}
function capitalize( str ) {
if ( !str || !str.length ) return str;
return str.substr( 0, 1 ).toUpperCase() + str.substr( 1 );
}
function wikiPagePath( pageName ) {
// Note: do not simply use encodeURI, it doesn't encode '&', which might break if wgArticlePath actually has the $1 in
// a query parameter.
return conf.wgArticlePath.replace( '$1', encodeURIComponent( pageName ).replace( /%3A/g, ':' ).replace( /%2F/g, '/' ) );
}
function escapeRE( str ) {
return str.replace( /([\\^$.?*+()[\]])/g, '\\$1' );
}
function substituteFactory( options ) {
options = options || {};
var lead = options.indicator || '$';
var indicator = escapeRE( lead );
var lbrace = escapeRE( options.lbrace || '{' );
var rbrace = escapeRE( options.rbrace || '}' );
var re;
re = new RegExp(
// $$
'(?:' + indicator + '(' + indicator + '))|' +
// $0, $1
'(?:' + indicator + '(\\d+))|' +
// ${key}
'(?:' + indicator + '(?:' + lbrace + '([^' + lbrace + rbrace + ']+)' + rbrace + '))|' +
// $key (only if first char after $ is not $, digit, or { )
'(?:' + indicator + '(?!(?:[' + indicator + lbrace + ']|\\d))(\\S+?)\\b)',
'g'
);
// Replace $1, $2, or ${key1}, ${key2}, or $key1, $key2 by values from map. $$ is replaced by a single $.
return function ( str, map ) {
if ( !map ) return str;
return str.replace( re, function ( match, prefix, idx, key, alpha ) {
if ( prefix === lead ) return lead;
var k = alpha || key || idx;
var replacement = typeof map[ k ] === 'function' ? map[ k ]( match, k ) : map[ k ];
return typeof replacement === 'string' ? replacement : ( replacement || match );
} );
};
}
var substitute = substituteFactory();
var replaceShortcuts = ( function () {
var replaceHash = substituteFactory( {
indicator: '#',
lbrace: '[',
rbrace: ']'
} );
return function ( str, map ) {
var s = replaceHash( str, map );
return HC.capitalizePageNames ? capitalize( s ) : s;
};
}() );
// Text modification
var findCatsRE =
new RegExp( '\\[\\[' + wikiTextBlankOrBidi + '(?:' + HC.category_regexp + ')' + wikiTextBlankOrBidi + ':[^\\]]+\\]\\]', 'g' );
function replaceByBlanks( match ) {
return match.replace( /(\s|\S)/g, ' ' ); // /./ doesn't match linebreaks. /(\s|\S)/ does.
}
function find_category( wikitext, category, once ) {
var cat_regex = null;
var result_hook = en_wiktionary_find_category(wikitext, category, once);
if (result_hook) {
return result_hook;
}
if ( HC.template_categories[ category ] ) {
cat_regex = new RegExp(
'\\{\\{' + wikiTextBlankOrBidi + '(' + HC.template_regexp + '(?=' + wikiTextBlankOrBidi + ':))?' + wikiTextBlankOrBidi +
'(?:' + HC.template_categories[ category ] + ')' +
wikiTextBlankOrBidi + '(\\|.*?)?\\}\\}',
'g'
);
} else {
var cat_name = escapeRE( category );
var initial = cat_name.substr( 0, 1 );
cat_regex = new RegExp(
'\\[\\[' + wikiTextBlankOrBidi + '(' + HC.category_regexp + ')' + wikiTextBlankOrBidi + ':' + wikiTextBlankOrBidi +
( initial === '\\' || !HC.capitalizePageNames ?
initial :
'[' + initial.toUpperCase() + initial.toLowerCase() + ']' ) +
cat_name.substring( 1 ).replace( wikiTextBlankRE, wikiTextBlank ) +
wikiTextBlankOrBidi + '(\\|.*?)?\\]\\]',
'g'
);
}
if ( once ) return cat_regex.exec( wikitext );
var copiedtext = wikitext
.replace( /<!--(\s|\S)*?-->/g, replaceByBlanks )
.replace( /<nowiki>(\s|\S)*?<\/nowiki>/g, replaceByBlanks );
var result = [];
var curr_match = null;
while ( ( curr_match = cat_regex.exec( copiedtext ) ) !== null ) {
result.push( {
match: curr_match
} );
}
result.re = cat_regex;
return result; // An array containing all matches, with positions, in result[ i ].match
}
var interlanguageRE = null;
function change_category( wikitext, toRemove, toAdd, key, is_hidden ) {
function find_insertionpoint( wikitext, category ) {
var copiedtext = wikitext
.replace( /<!--(\s|\S)*?-->/g, replaceByBlanks )
.replace( /<nowiki>(\s|\S)*?<\/nowiki>/g, replaceByBlanks );
// Search in copiedtext to avoid that we insert inside an HTML comment or a nowiki "element".
var result = en_wiktionary_find_insertionpoint( wikitext, category );
if (result) {
return result;
}
var index = -1;
findCatsRE.lastIndex = 0;
while ( findCatsRE.exec( copiedtext ) !== null ) index = findCatsRE.lastIndex;
if ( index < 0 ) {
// Find the index of the first interlanguage link...
var match = null;
if ( !interlanguageRE ) {
// Approximation without API: interlanguage links start with 2 to 3 lower case letters, optionally followed by
// a sequence of groups consisting of a dash followed by one or more lower case letters. Exceptions are "simple"
// and "tokipona".
match = /((^|\n\r?)(\[\[\s*(([a-z]{2,3}(-[a-z]+)*)|simple|tokipona)\s*:[^\]]+\]\]\s*))+$/.exec( copiedtext );
} else {
match = interlanguageRE.exec( copiedtext );
}
if ( match ) index = match.index;
return {
idx: index,
onCat: false
};
}
return {
idx: index,
onCat: index >= 0
};
}
var summary = [],
nameSpace = HC.category_canonical,
cat_point = -1, // Position of removed category;
keyChange = ( toRemove && toAdd && toRemove === toAdd && toAdd.length ),
matches,
noOnCatOverride = false;
if ( key ) key = '|' + key;
// Remove
if ( toRemove && toRemove.length ) {
matches = find_category( wikitext, toRemove );
if ( !matches || !matches.length ) {
return {
text: wikitext,
summary: summary,
error: HC.messages.cat_notFound.replace( /\$1/g, toRemove )
};
} else {
var after = wikitext;
for (var i = matches.length - 1; i > 0; i--) {
after = en_wiktionary_remove_category(after, matches[i]);
}
var before_after = en_wiktionary_three_to_two_split(after, matches[0]);
noOnCatOverride = en_wiktionary_is_special_match(matches[0]);
var before = before_after[0];
after = before_after[1];
if ( toAdd ) {
// nameSpace = matches[ 0 ].match[ 1 ] || nameSpace; Canonical namespace should be always preferred
if ( key === null ) key = matches[ 0 ].match[ 2 ];
// Remember the category key, if any.
}
// Remove whitespace (properly): strip whitespace, but only up to the next line feed.
// If we then have two linefeeds in a row, remove one. Otherwise, if we have two non-
// whitespace characters, insert a blank.
var i = before.length - 1;
while ( i >= 0 && before.charAt( i ) !== '\n' && before.substr( i, 1 ).search( /\s/ ) >= 0 ) i--;
var j = 0;
while ( j < after.length && after.charAt( j ) !== '\n' && after.substr( j, 1 ).search( /\s/ ) >= 0 ) j++;
if ( i >= 0 && before.charAt( i ) === '\n' && ( !after.length || j < after.length && after.charAt( j ) === '\n' ) ) i--;
if ( i >= 0 ) before = before.substring( 0, i + 1 ); else before = '';
if ( j < after.length ) after = after.substring( j ); else after = '';
if (
before.length && before.substring( before.length - 1 ).search( /\S/ ) >= 0 &&
after.length && after.substr( 0, 1 ).search( /\S/ ) >= 0
) {
before += ' ';
}
cat_point = before.length;
if ( cat_point === 0 && after.length && after.substr( 0, 1 ) === '\n' ) after = after.substr( 1 );
wikitext = before + after;
if ( !keyChange ) {
if ( HC.template_categories[ toRemove ] ) { summary.push( HC.messages.template_removed.replace( /\$1/g, toRemove ) ); } else { summary.push( HC.messages.cat_removed.replace( /\$1/g, toRemove ) ); }
}
}
}
// Add
if ( toAdd && toAdd.length ) {
matches = find_category( wikitext, toAdd );
if ( matches && matches.length ) {
// Already exists
return {
text: wikitext,
summary: summary,
error: HC.messages.cat_exists.replace( /\$1/g, toAdd )
};
} else {
var hooked = en_wiktionary_add_category_hook( wikitext, toAdd, cat_point );
if (hooked) {
wikitext = hooked;
summary.push( HC.messages.cat_added.replace( /\$1/g, toAdd ) );
} else {
var onCat = false;
var noPreLine = false;
if ( cat_point < 0 ) {
var point = find_insertionpoint ( wikitext, toAdd );
cat_point = point.idx;
onCat = point.onCat;
noPreLine = point.noPreLine;
} else {
onCat = true;
}
var newcatstring = en_wiktionary_add_category_string(toAdd, onCat && !noOnCatOverride) || ('[[' + nameSpace + ':' + toAdd + ( key || '' ) + ']]');
if ( cat_point >= 0 ) {
var suffix = wikitext.substring( cat_point );
wikitext = wikitext.substring( 0, cat_point ) + ( cat_point > 0 && !noPreLine ? '\n' : '' ) + newcatstring + ( !onCat ? '\n' : '' );
if ( suffix.length && suffix.substr( 0, 1 ) !== '\n' ) wikitext += '\n' + suffix; else wikitext += suffix;
} else {
if ( wikitext.length && wikitext.substr( wikitext.length - 1, 1 ) !== '\n' ) wikitext += '\n';
wikitext += ( wikitext.length ? '\n' : '' ) + newcatstring;
}
if ( keyChange ) {
var k = key || '';
if ( k.length ) k = k.substr( 1 );
summary.push( substitute( HC.messages.cat_keychange, [ null, toAdd, k ] ) );
} else {
summary.push( HC.messages.cat_added.replace( /\$1/g, toAdd ) );
}
if ( HC.uncat_regexp && !is_hidden ) {
var txt = wikitext.replace( HC.uncat_regexp, '' ); // Remove "uncat" templates
if ( txt.length !== wikitext.length ) {
wikitext = txt;
summary.push( HC.messages.uncat_removed );
}
}
}
}
}
return {
text: wikitext,
summary: summary,
error: null
};
}
// The real HotCat UI
function evtKeys( e ) {
/* eslint-disable no-bitwise */
var code = 0;
if ( e.ctrlKey ) { // All modern browsers
// Ctrl-click seems to be overloaded in FF/Mac (it opens a pop-up menu), so treat cmd-click
// as a ctrl-click, too.
if ( e.ctrlKey || e.metaKey ) code |= 1;
if ( e.shiftKey ) code |= 2;
}
return code;
}
function evtKill( e ) {
if ( e.preventDefault ) {
e.preventDefault();
e.stopPropagation();
} else {
e.cancelBubble = true;
}
return false;
}
var catLine = null,
onUpload = false,
editors = [],
commitButton = null,
commitForm = null,
multiSpan = null,
pageText = null,
pageTime = null,
pageWatched = false,
watchCreate = false,
watchEdit = false,
minorEdits = false,
editToken = null,
is_rtl = false,
serverTime = null,
lastRevId = null,
pageTextRevId = null,
conflictingUser = null,
newDOM = false; // true if MediaWiki serves the new UL-LI DOM for categories
function CategoryEditor() {
this.initialize.apply( this, arguments );
}
function setPage( json ) {
var startTime = null;
if ( json && json.query ) {
if ( json.query.pages ) {
var page = json.query.pages[ !conf.wgArticleId ? '-1' : String( conf.wgArticleId ) ];
if ( page ) {
if ( page.revisions && page.revisions.length ) {
// Revisions are sorted by revision ID, hence [ 0 ] is the one we asked for, and possibly there's a [ 1 ] if we're
// not on the latest revision (edit conflicts and such).
pageText = page.revisions[ 0 ][ '*' ];
if ( page.revisions[ 0 ].timestamp ) pageTime = page.revisions[ 0 ].timestamp.replace( /\D/g, '' );
if ( page.revisions[ 0 ].revid ) pageTextRevId = page.revisions[ 0 ].revid;
if ( page.revisions.length > 1 ) conflictingUser = page.revisions[ 1 ].user;
}
if ( page.lastrevid ) lastRevId = page.lastrevid;
if ( page.starttimestamp ) startTime = page.starttimestamp.replace( /\D/g, '' );
pageWatched = typeof page.watched === 'string';
if ( json.query.tokens ) editToken = json.query.tokens.csrftoken;
if ( page.langlinks && ( !json[ 'query-continue' ] || !json[ 'query-continue' ].langlinks ) ) {
// We have interlanguage links, and we got them all.
var re = '';
for ( var i = 0; i < page.langlinks.length; i++ ) re += ( i > 0 ? '|' : '' ) + page.langlinks[ i ].lang.replace( /([\\^$.?*+()])/g, '\\$1' );
if ( re.length ) interlanguageRE = new RegExp( '((^|\\n\\r?)(\\[\\[\\s*(' + re + ')\\s*:[^\\]]+\\]\\]\\s*))+$' );
}
}
}
// Siteinfo
if ( json.query.general ) {
if ( json.query.general.time && !startTime ) startTime = json.query.general.time.replace( /\D/g, '' );
if ( HC.capitalizePageNames === null ) {
// ResourceLoader's JSParser doesn't like .case, so override eslint.
// eslint-disable-next-line dot-notation
HC.capitalizePageNames = ( json.query.general[ 'case' ] === 'first-letter' );
}
}
serverTime = startTime;
// Userinfo
if ( json.query.userinfo && json.query.userinfo.options ) {
watchCreate = !HC.dont_add_to_watchlist && json.query.userinfo.options.watchcreations === '1';
watchEdit = !HC.dont_add_to_watchlist && json.query.userinfo.options.watchdefault === '1';
minorEdits = json.query.userinfo.options.minordefault === 1;
// If the user has the "All edits are minor" preference enabled, we should honor that
// for single category changes, no matter what the site configuration is.
if ( minorEdits ) HC.single_minor = true;
}
}
}
var saveInProgress = false;
function initiateEdit( doEdit, failure ) {
if ( saveInProgress ) return;
saveInProgress = true;
var oldButtonState;
if ( commitButton ) {
oldButtonState = commitButton.disabled;
commitButton.disabled = true;
}
function fail() {
saveInProgress = false;
if ( commitButton ) commitButton.disabled = oldButtonState;
failure.apply( this, arguments );
}
// Must use Ajax here to get the user options and the edit token.
$.getJSON(
wgServer + conf.wgScriptPath + '/api.php?' +
'format=json&action=query&rawcontinue=&titles=' + encodeURIComponent( conf.wgPageName ) +
'&prop=info%7Crevisions%7Clanglinks&inprop=watched&rvprop=content%7Ctimestamp%7Cids%7Cuser&lllimit=500' +
'&rvlimit=2&rvdir=newer&rvstartid=' + conf.wgCurRevisionId + '&meta=siteinfo%7Cuserinfo%7Ctokens&type=csrf&uiprop=options',
function ( json ) {
setPage( json );
doEdit( fail );
}
).fail( function ( req ) {
fail( req.status + ' ' + req.statusText );
} );
}
function multiChangeMsg( count ) {
var msg = HC.messages.multi_change;
if ( typeof msg !== 'string' && msg.length )
if ( mw.language && mw.language.convertPlural ) { msg = mw.language.convertPlural( count, msg ); } else { msg = msg[ msg.length - 1 ]; }
return substitute( msg, [ null, String( count ) ] );
}
function currentTimestamp() {
var now = new Date();
var ts = String( now.getUTCFullYear() );
function two( s ) {
return s.substr( s.length - 2 );
}
ts +=
two( '0' + ( now.getUTCMonth() + 1 ) ) +
two( '0' + now.getUTCDate() ) +
two( '00' + now.getUTCHours() ) +
two( '00' + now.getUTCMinutes() ) +
two( '00' + now.getUTCSeconds() );
return ts;
}
function performChanges( failure, singleEditor ) {
if ( pageText === null ) {
failure( HC.messages.multi_error );
return;
}
// Backwards compatibility after message change (added $2 to cat_keychange)
if ( HC.messages.cat_keychange.indexOf( '$2' ) < 0 ) HC.messages.cat_keychange += '"$2"';
// More backwards-compatibility with earlier HotCat versions:
if ( !HC.messages.short_catchange ) HC.messages.short_catchange = '[[' + HC.category_canonical + ':$1]]';
// Create a form and submit it. We don't use the edit API (api.php?action=edit) because
// (a) sensibly reporting back errors like edit conflicts is always a hassle, and
// (b) we want to show a diff for multi-edits anyway, and
// (c) we want to trigger onsubmit events, allowing user code to intercept the edit.
// Using the form, we can do (b) and (c), and we get (a) for free. And, of course, using the form
// automatically reloads the page with the updated categories on a successful submit, which
// we would have to do explicitly if we used the edit API.
var action;
// Normally, we don't have to care about edit conflicts. If some other user edited the page in the meantime, the
// server will take care of it and merge the edit automatically or present an edit conflict screen. However, the
// server suppresses edit conflicts with oneself. Hence, if we have a conflict, and the conflicting user is the
// current user, then we set the "oldid" value and switch to diff, which gives the "you are editing an old version;
// if you save, any more recent changes will be lost" screen.
var selfEditConflict = ( lastRevId !== null && lastRevId !== conf.wgCurRevisionId || pageTextRevId !== null &&
pageTextRevId !== conf.wgCurRevisionId ) && conflictingUser && conflictingUser === conf.wgUserName;
if ( singleEditor && !singleEditor.noCommit && !HC.no_autocommit && editToken && !selfEditConflict ) {
// If we do have an edit conflict, but not with ourself, that's no reason not to attempt to save: the server side may actually be able to
// merge the changes. We just need to make sure that we do present a diff view if it's a self edit conflict.
commitForm.wpEditToken.value = editToken;
action = commitForm.wpDiff;
if ( action ) action.name = action.value = 'wpSave';
} else {
action = commitForm.wpSave;
if ( action ) action.name = action.value = 'wpDiff';
}
var result = {
text: pageText
},
changed = [],
added = [],
deleted = [],
changes = 0,
toEdit = singleEditor ? [ singleEditor ] : editors,
error = null,
edit,
i;
for ( i = 0; i < toEdit.length; i++ ) {
edit = toEdit[ i ];
if ( edit.state === CategoryEditor.CHANGED ) {
result = change_category(
result.text,
edit.originalCategory,
edit.currentCategory,
edit.currentKey,
edit.currentHidden );
if ( !result.error ) {
changes++;
if ( !edit.originalCategory || !edit.originalCategory.length ) {
added.push( edit.currentCategory );
} else {
changed.push( {
from: edit.originalCategory,
to: edit.currentCategory
} );
}
} else if ( error === null ) {
error = result.error;
}
} else if (
edit.state === CategoryEditor.DELETED && edit.originalCategory && edit.originalCategory.length ) {
result = change_category(
result.text,
edit.originalCategory,
null, null, false );
if ( !result.error ) {
changes++;
deleted.push( edit.originalCategory );
} else if ( error === null ) {
error = result.error;
}
}
}
if ( error !== null ) { // Do not commit if there were errors
action = commitForm.wpSave;
if ( action ) action.name = action.value = 'wpDiff';
}
// Fill in the form and submit it
commitForm.wpMinoredit.checked = minorEdits;
commitForm.wpWatchthis.checked = !conf.wgArticleId && watchCreate || watchEdit || pageWatched;
if ( conf.wgArticleId || !!singleEditor ) {
// Prepare change-tag save
if ( action && action.value === 'wpSave' ) {
if ( HC.changeTag ) {
commitForm.wpChangeTags.value = HC.changeTag;
HC.messages.using = '';
HC.messages.prefix = '';
}
} else {
commitForm.wpAutoSummary.value = HC.changeTag;
}
if ( changes === 1 ) {
if ( result.summary && result.summary.length ) commitForm.wpSummary.value = HC.messages.prefix + result.summary.join( HC.messages.separator ) + HC.messages.using;
commitForm.wpMinoredit.checked = HC.single_minor || minorEdits;
} else if ( changes ) {
var summary = [];
var shortSummary = [];
// Deleted
for ( i = 0; i < deleted.length; i++ ) summary.push( '−' + substitute( HC.messages.short_catchange, [ null, deleted[ i ] ] ) );
if ( deleted.length === 1 ) shortSummary.push( '−' + substitute( HC.messages.short_catchange, [ null, deleted[ 0 ] ] ) ); else if ( deleted.length ) shortSummary.push( '− ' + multiChangeMsg( deleted.length ) );
// Added
for ( i = 0; i < added.length; i++ ) summary.push( '+' + substitute( HC.messages.short_catchange, [ null, added[ i ] ] ) );
if ( added.length === 1 ) shortSummary.push( '+' + substitute( HC.messages.short_catchange, [ null, added[ 0 ] ] ) ); else if ( added.length ) shortSummary.push( '+ ' + multiChangeMsg( added.length ) );
// Changed
var arrow = is_rtl ? '\u2190' : '\u2192'; // left and right arrows. Don't use ← and → in the code.
for ( i = 0; i < changed.length; i++ ) {
if ( changed[ i ].from !== changed[ i ].to ) {
summary.push(
'±' + substitute( HC.messages.short_catchange, [ null, changed[ i ].from ] ) + arrow +
substitute( HC.messages.short_catchange, [ null, changed[ i ].to ] )
);
} else {
summary.push( '±' + substitute( HC.messages.short_catchange, [ null, changed[ i ].from ] ) );
}
}
if ( changed.length === 1 ) {
if ( changed[ 0 ].from !== changed[ 0 ].to ) {
shortSummary.push(
'±' + substitute( HC.messages.short_catchange, [ null, changed[ 0 ].from ] ) + arrow +
substitute( HC.messages.short_catchange, [ null, changed[ 0 ].to ] )
);
} else {
shortSummary.push( '±' + substitute( HC.messages.short_catchange, [ null, changed[ 0 ].from ] ) );
}
} else if ( changed.length ) {
shortSummary.push( '± ' + multiChangeMsg( changed.length ) );
}
if ( summary.length ) {
summary = summary.join( HC.messages.separator );
if ( summary.length > 200 - HC.messages.prefix.length - HC.messages.using.length ) summary = shortSummary.join( HC.messages.separator );
commitForm.wpSummary.value = HC.messages.prefix + summary + HC.messages.using;
}
}
}
commitForm.wpTextbox1.value = result.text;
commitForm.wpStarttime.value = serverTime || currentTimestamp();
commitForm.wpEdittime.value = pageTime || commitForm.wpStarttime.value;
if ( selfEditConflict ) commitForm.oldid.value = String( pageTextRevId || conf.wgCurRevisionId );
// Submit the form in a way that triggers onsubmit events: commitForm.submit() doesn't.
commitForm.hcCommit.click();
}
function resolveOne( page, toResolve ) {
var cats = page.categories,
lks = page.links,
is_dab = false,
is_redir = typeof page.redirect === 'string', // Hard redirect?
is_hidden = page.categoryinfo && typeof page.categoryinfo.hidden === 'string',
is_missing = typeof page.missing === 'string',
i;
for ( i = 0; i < toResolve.length; i++ ) {
if ( i && toResolve[ i ].dabInputCleaned !== page.title.substring( page.title.indexOf( ':' ) + 1 ) ) continue;
// Note: the server returns in page an NFC normalized Unicode title. If our input was not NFC normalized, we may not find
// any entry here. If we have only one editor to resolve (the most common case, I presume), we may simply skip the check.
toResolve[ i ].currentHidden = is_hidden;
toResolve[ i ].inputExists = !is_missing;
toResolve[ i ].icon.src = ( is_missing ? HC.existsNo : HC.existsYes );
}
if ( is_missing ) return;
if ( !is_redir && cats && ( HC.disambig_category || HC.redir_category ) ) {
for ( var c = 0; c < cats.length; c++ ) {
var cat = cats[ c ].title;
// Strip namespace prefix
if ( cat ) {
cat = cat.substring( cat.indexOf( ':' ) + 1 ).replace( /_/g, ' ' );
if ( cat === HC.disambig_category ) {
is_dab = true;
break;
} else if ( cat === HC.redir_category ) {
is_redir = true;
break;
}
}
}
}
if ( !is_redir && !is_dab ) return;
if ( !lks || !lks.length ) return;
var titles = [];
for ( i = 0; i < lks.length; i++ ) {
if (
// Category namespace -- always true since we ask only for the category links
lks[ i ].ns === 14 &&
// Name not empty
lks[ i ].title && lks[ i ].title.length
) {
// Internal link to existing thingy. Extract the page name and remove the namespace.
var match = lks[ i ].title;
match = match.substring( match.indexOf( ':' ) + 1 );
// Exclude blacklisted categories.
if ( !HC.blacklist || !HC.blacklist.test( match ) ) titles.push( match );
}
}
if ( !titles.length ) return;
for ( i = 0; i < toResolve.length; i++ ) {
if ( i && toResolve[ i ].dabInputCleaned !== page.title.substring( page.title.indexOf( ':' ) + 1 ) ) continue;
toResolve[ i ].inputExists = true; // Might actually be wrong if it's a redirect pointing to a non-existing category
toResolve[ i ].icon.src = HC.existsYes;
if ( titles.length > 1 ) {
toResolve[ i ].dab = titles;
} else {
toResolve[ i ].text.value =
titles[ 0 ] + ( toResolve[ i ].currentKey !== null ? '|' + toResolve[ i ].currentKey : '' );
}
}
}
function resolveRedirects( toResolve, params ) {
if ( !params || !params.query || !params.query.pages ) return;
for ( var p in params.query.pages ) resolveOne( params.query.pages[ p ], toResolve );
}
function resolveMulti( toResolve, callback ) {
var i;
for ( i = 0; i < toResolve.length; i++ ) {
toResolve[ i ].dab = null;
toResolve[ i ].dabInput = toResolve[ i ].lastInput;
}
if ( noSuggestions ) {
callback( toResolve );
return;
}
// Use %7C instead of |, otherwise Konqueror insists on re-encoding the arguments, resulting in doubly encoded
// category names. (That is a bug in Konqueror. Other browsers don't have this problem.)
var args = 'action=query&prop=info%7Clinks%7Ccategories%7Ccategoryinfo&plnamespace=14' +
'&pllimit=' + ( toResolve.length * 10 ) +
'&cllimit=' + ( toResolve.length * 10 ) +
'&format=json&titles=';
for ( i = 0; i < toResolve.length; i++ ) {
var v = toResolve[ i ].dabInput;
v = replaceShortcuts( v, HC.shortcuts );
toResolve[ i ].dabInputCleaned = v;
args += encodeURIComponent( 'Category:' + v );
if ( i + 1 < toResolve.length ) args += '%7C';
}
$.getJSON( wgServer + conf.wgScriptPath + '/api.php?' + args,
function ( json ) {
resolveRedirects( toResolve, json );
callback( toResolve );
} ).fail( function ( req ) {
if ( !req ) noSuggestions = true;
callback( toResolve );
} );
}
function makeActive( which ) {
if ( which.is_active ) return;
for ( var i = 0; i < editors.length; i++ )
if ( editors[ i ] !== which ) editors[ i ].inactivate();
which.is_active = true;
if ( which.dab ) {
// eslint-disable-next-line no-use-before-define
showDab( which );
} else {
// Check for programmatic value changes.
var expectedInput = which.lastRealInput || which.lastInput || '';
var actualValue = which.text.value || '';
if ( !expectedInput.length && actualValue.length || expectedInput.length && actualValue.indexOf( expectedInput ) ) {
// Somehow the field's value appears to have changed, and which.lastSelection therefore is no longer valid. Try to set the
// cursor at the end of the category, and do not display the old suggestion list.
which.showsList = false;
var v = actualValue.split( '|' );
which.lastRealInput = which.lastInput = v[ 0 ];
if ( v.length > 1 ) which.currentKey = v[ 1 ];
if ( which.lastSelection ) {
which.lastSelection = {
start: v[ 0 ].length,
end: v[ 0 ].length
};
}
}
if ( which.showsList ) which.displayList();
if ( which.lastSelection ) {
if ( is_webkit ) {
// WebKit (Safari, Chrome) has problems selecting inside focus()
// See http://code.google.com/p/chromium/issues/detail?id=32865#c6
window.setTimeout(
function () {
which.setSelection( which.lastSelection.start, which.lastSelection.end );
},
1 );
} else {
which.setSelection( which.lastSelection.start, which.lastSelection.end );
}
}
}
}
function showDab( which ) {
if ( !which.is_active ) {
makeActive( which );
} else {
which.showSuggestions( which.dab, false, null, null ); // do autocompletion, no key, no engine selector
which.dab = null;
}
}
function multiSubmit() {
var toResolve = [];
for ( var i = 0; i < editors.length; i++ )
if ( editors[ i ].state === CategoryEditor.CHANGE_PENDING || editors[ i ].state === CategoryEditor.OPEN ) toResolve.push( editors[ i ] );
if ( !toResolve.length ) {
initiateEdit( function ( failure ) {
performChanges( failure );
}, function ( msg ) {
alert( msg );
} );
return;
}
resolveMulti( toResolve, function ( resolved ) {
var firstDab = null;
var dontChange = false;
for ( var i = 0; i < resolved.length; i++ ) {
if ( resolved[ i ].lastInput !== resolved[ i ].dabInput ) {
// We didn't disable all the open editors, but we did asynchronous calls. It is
// theoretically possible that the user changed something...
dontChange = true;
} else {
if ( resolved[ i ].dab ) {
if ( !firstDab ) firstDab = resolved[ i ];
} else {
if ( resolved[ i ].acceptCheck( true ) ) resolved[ i ].commit();
}
}
}
if ( firstDab ) {
showDab( firstDab );
} else if ( !dontChange ) {
initiateEdit( function ( failure ) {
performChanges( failure );
}, function ( msg ) {
alert( msg );
} );
}
} );
}
function setMultiInput() {
if ( commitButton || onUpload ) return;
commitButton = make( 'input' );
commitButton.type = 'button';
commitButton.value = HC.messages.commit;
commitButton.onclick = multiSubmit;
if ( multiSpan ) multiSpan.parentNode.replaceChild( commitButton, multiSpan ); else catLine.appendChild( commitButton );
}
function checkMultiInput() {
if ( !commitButton ) return;
var hasChanges = false;
for ( var i = 0; i < editors.length; i++ ) {
if ( editors[ i ].state !== CategoryEditor.UNCHANGED ) {
hasChanges = true;
break;
}
}
commitButton.disabled = !hasChanges;
}
var suggestionEngines = {
opensearch: {
uri: '/api.php?format=json&action=opensearch&namespace=14&limit=30&search=Category:$1', // $1 = search term
// Function to convert result of uri into an array of category names
handler: function ( queryResult, queryKey ) {
if ( queryResult && queryResult.length >= 2 ) {
var key = queryResult[ 0 ].substring( queryResult[ 0 ].indexOf( ':' ) + 1 );
var titles = queryResult[ 1 ];
var exists = false;
if ( !cat_prefix ) cat_prefix = new RegExp( '^(' + HC.category_regexp + '):' );
for ( var i = 0; i < titles.length; i++ ) {
cat_prefix.lastIndex = 0;
var m = cat_prefix.exec( titles[ i ] );
if ( m && m.length > 1 ) {
titles[ i ] = titles[ i ].substring( titles[ i ].indexOf( ':' ) + 1 ); // rm namespace
if ( key === titles[ i ] ) exists = true;
} else {
titles.splice( i, 1 ); // Nope, it's not a category after all.
i--;
}
}
titles.exists = exists;
if ( queryKey !== key ) titles.normalized = key;
// Remember the NFC normalized key we got back from the server
return titles;
}
return null;
}
},
internalsearch: {
uri: '/api.php?format=json&action=query&list=allpages&apnamespace=14&aplimit=30&apfrom=$1&apprefix=$1',
handler: function ( queryResult ) {
if ( queryResult && queryResult.query && queryResult.query.allpages ) {
var titles = queryResult.query.allpages;
for ( var i = 0; i < titles.length; i++ ) titles[ i ] = titles[ i ].title.substring( titles[ i ].title.indexOf( ':' ) + 1 ); // rm namespace
return titles;
}
return null;
}
},
exists: {
uri: '/api.php?format=json&action=query&prop=info&titles=Category:$1',
handler: function ( queryResult, queryKey ) {
if ( queryResult && queryResult.query && queryResult.query.pages && !queryResult.query.pages[ -1 ] ) {
// Should have exactly 1
for ( var p in queryResult.query.pages ) {
var title = queryResult.query.pages[ p ].title;
title = title.substring( title.indexOf( ':' ) + 1 );
var titles = [ title ];
titles.exists = true;
if ( queryKey !== title ) titles.normalized = title;
// NFC
return titles;
}
}
return null;
}
},
subcategories: {
uri: '/api.php?format=json&action=query&list=categorymembers&cmtype=subcat&cmlimit=max&cmtitle=Category:$1',
handler: function ( queryResult ) {
if ( queryResult && queryResult.query && queryResult.query.categorymembers ) {
var titles = queryResult.query.categorymembers;
for ( var i = 0; i < titles.length; i++ ) titles[ i ] = titles[ i ].title.substring( titles[ i ].title.indexOf( ':' ) + 1 ); // rm namespace
return titles;
}
return null;
}
},
parentcategories: {
uri: '/api.php?format=json&action=query&prop=categories&titles=Category:$1&cllimit=max',
handler: function ( queryResult ) {
if ( queryResult && queryResult.query && queryResult.query.pages ) {
for ( var p in queryResult.query.pages ) {
if ( queryResult.query.pages[ p ].categories ) {
var titles = queryResult.query.pages[ p ].categories;
for ( var i = 0; i < titles.length; i++ ) titles[ i ] = titles[ i ].title.substring( titles[ i ].title.indexOf( ':' ) + 1 ); // rm namespace
return titles;
}
}
}
return null;
}
}
};
var suggestionConfigs = {
searchindex: {
name: 'Search index',
engines: [ 'opensearch' ],
cache: {},
show: true,
temp: false,
noCompletion: false
},
pagelist: {
name: 'Page list',
engines: [ 'internalsearch', 'exists' ],
cache: {},
show: true,
temp: false,
noCompletion: false
},
combined: {
name: 'Combined search',
engines: [ 'opensearch', 'internalsearch' ],
cache: {},
show: true,
temp: false,
noCompletion: false
},
subcat: {
name: 'Subcategories',
engines: [ 'subcategories' ],
cache: {},
show: true,
temp: true,
noCompletion: true
},
parentcat: {
name: 'Parent categories',
engines: [ 'parentcategories' ],
cache: {},
show: true,
temp: true,
noCompletion: true
}
};
CategoryEditor.UNCHANGED = 0;
CategoryEditor.OPEN = 1; // Open, but no input yet
CategoryEditor.CHANGE_PENDING = 2; // Open, some input made
CategoryEditor.CHANGED = 3;
CategoryEditor.DELETED = 4;
// Support: IE6
// IE6 sometimes forgets to redraw the list when editors are opened or closed.
// Adding/removing a dummy element helps, at least when opening editors.
var dummyElement = make( '\xa0', true );
function forceRedraw() {
if ( dummyElement.parentNode ) document.body.removeChild( dummyElement ); else document.body.appendChild( dummyElement );
}
// Event keyCodes that we handle in the text input field/suggestion list.
var BS = 8,
TAB = 9,
RET = 13,
ESC = 27,
SPACE = 32,
PGUP = 33,
PGDOWN = 34,
UP = 38,
DOWN = 40,
DEL = 46,
IME = 229;
CategoryEditor.prototype = {
initialize: function ( line, span, after, key, is_hidden ) {
// If a span is given, 'after' is the category title, otherwise it may be an element after which to
// insert the new span. 'key' is likewise overloaded; if a span is given, it is the category key (if
// known), otherwise it is a boolean indicating whether a bar shall be prepended.
if ( !span ) {
this.isAddCategory = true;
// Create add span and append to catLinks
this.originalCategory = '';
this.originalKey = null;
this.originalExists = false;
if ( !newDOM ) {
span = make( 'span' );
span.className = 'noprint';
if ( key ) {
span.appendChild( make( ' | ', true ) );
if ( after ) {
after.parentNode.insertBefore( span, after.nextSibling );
after = after.nextSibling;
} else if (line) {
line.appendChild( span );
}
} else if ( line && line.firstChild ) {
span.appendChild( make( ' ', true ) );
line.appendChild( span );
}
}
this.linkSpan = make( 'span' );
this.linkSpan.className = 'noprint nopopups hotcatlink';
var lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.open.bind( this );
lk.appendChild( make( HC.links.add, true ) );
lk.title = HC.tooltips.add;
this.linkSpan.appendChild( lk );
span = make( newDOM ? 'li' : 'span' );
span.className = 'noprint';
if ( is_rtl ) span.dir = 'rtl';
span.appendChild( this.linkSpan );
if ( after ) {
after.parentNode.insertBefore( span, after.nextSibling );
} else if ( line ) {
line.appendChild( span );
}
this.normalLinks = null;
this.undelLink = null;
this.catLink = null;
} else {
if ( is_rtl ) span.dir = 'rtl';
this.isAddCategory = false;
this.catLink = span.firstChild;
this.originalCategory = after;
this.originalKey = ( key && key.length > 1 ) ? key.substr( 1 ) : null; // > 1 because it includes the leading bar
this.originalExists = !hasClass( this.catLink, 'new' );
// Create change and del links
this.makeLinkSpan();
if ( !this.originalExists && this.upDownLinks ) this.upDownLinks.style.display = 'none';
span.appendChild( this.linkSpan );
}
this.originalHidden = is_hidden;
this.line = line;
this.engine = HC.suggestions;
this.span = span;
this.currentCategory = this.originalCategory;
this.currentExists = this.originalExists;
this.currentHidden = this.originalHidden;
this.currentKey = this.originalKey;
this.state = CategoryEditor.UNCHANGED;
this.lastSavedState = CategoryEditor.UNCHANGED;
this.lastSavedCategory = this.originalCategory;
this.lastSavedKey = this.originalKey;
this.lastSavedExists = this.originalExists;
this.lastSavedHidden = this.originalHidden;
if ( this.catLink && this.currentKey ) this.catLink.title = this.currentKey;
editors[ editors.length ] = this;
},
makeLinkSpan: function () {
this.normalLinks = make( 'span' );
var lk = null;
if ( this.originalCategory && this.originalCategory.length ) {
lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.remove.bind( this );
lk.appendChild( make( HC.links.remove, true ) );
lk.title = HC.tooltips.remove;
this.normalLinks.appendChild( make( ' ', true ) );
this.normalLinks.appendChild( lk );
}
if ( !HC.template_categories[ this.originalCategory ] ) {
lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.open.bind( this );
lk.appendChild( make( HC.links.change, true ) );
lk.title = HC.tooltips.change;
this.normalLinks.appendChild( make( ' ', true ) );
this.normalLinks.appendChild( lk );
if ( !noSuggestions && HC.use_up_down ) {
this.upDownLinks = make( 'span' );
lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.down.bind( this );
lk.appendChild( make( HC.links.down, true ) );
lk.title = HC.tooltips.down;
this.upDownLinks.appendChild( make( ' ', true ) );
this.upDownLinks.appendChild( lk );
lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.up.bind( this );
lk.appendChild( make( HC.links.up, true ) );
lk.title = HC.tooltips.up;
this.upDownLinks.appendChild( make( ' ', true ) );
this.upDownLinks.appendChild( lk );
this.normalLinks.appendChild( this.upDownLinks );
}
}
this.linkSpan = make( 'span' );
this.linkSpan.className = 'noprint nopopups hotcatlink';
this.linkSpan.appendChild( this.normalLinks );
this.undelLink = make( 'span' );
this.undelLink.className = 'nopopups hotcatlink';
this.undelLink.style.display = 'none';
lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.restore.bind( this );
lk.appendChild( make( HC.links.restore, true ) );
lk.title = HC.tooltips.restore;
this.undelLink.appendChild( make( ' ', true ) );
this.undelLink.appendChild( lk );
this.linkSpan.appendChild( this.undelLink );
},
invokeSuggestions: function ( dont_autocomplete ) {
if ( this.engine && suggestionConfigs[ this.engine ] && suggestionConfigs[ this.engine ].temp && !dont_autocomplete ) this.engine = HC.suggestions; // Reset to a search upon input
this.state = CategoryEditor.CHANGE_PENDING;
var self = this;
window.setTimeout( function () {
self.textchange( dont_autocomplete );
}, HC.suggest_delay );
},
makeForm: function () {
var form = make( 'form' );
form.method = 'POST';
form.onsubmit = this.accept.bind( this );
this.form = form;
var self = this;
var text = make( 'input' );
text.type = 'text';
text.size = HC.editbox_width;
if ( !noSuggestions ) {
// Be careful here to handle IME input. This is browser/OS/IME dependent, but basically there are two mechanisms:
// - Modern (DOM Level 3) browsers use compositionstart/compositionend events to signal composition; if the
// composition is not canceled, there'll be a textInput event following. During a composition key events are
// either all suppressed (FF/Gecko), or otherwise have keyDown === IME for all keys (Webkit).
// - Webkit sends a textInput followed by keyDown === IME and a keyUp with the key that ended composition.
// - Gecko doesn't send textInput but just a keyUp with the key that ended composition, without sending keyDown
// first. Gecko doesn't send any keydown while IME is active.
// - Older browsers signal composition by keyDown === IME for the first and subsequent keys for a composition. The
// first keyDown !== IME is certainly after the end of the composition. Typically, composition end can also be
// detected by a keyDown IME with a keyUp of space, tab, escape, or return.
text.onkeyup = function ( evt ) {
var key = evt.keyCode || 0;
if ( self.ime && self.lastKey === IME && !self.usesComposition && ( key === TAB || key === RET || key === ESC || key === SPACE ) ) self.ime = false;
if ( self.ime ) return true;
if ( key === UP || key === DOWN || key === PGUP || key === PGDOWN ) {
// In case a browser doesn't generate keypress events for arrow keys...
if ( self.keyCount === 0 ) return self.processKey( evt );
} else {
if ( key === ESC && self.lastKey !== IME ) {
if ( !self.resetKeySelection() ) {
// No undo of key selection: treat ESC as "cancel".
self.cancel();
return;
}
}
// Also do this for ESC as a workaround for Firefox bug 524360
// https://bugzilla.mozilla.org/show_bug.cgi?id=524360
self.invokeSuggestions( key === BS || key === DEL || key === ESC );
}
return true;
};
text.onkeydown = function ( evt ) {
var key = evt.keyCode || 0;
self.lastKey = key;
self.keyCount = 0;
// DOM Level < 3 IME input
if ( !self.ime && key === IME && !self.usesComposition ) {
// self.usesComposition catches browsers that may emit spurious keydown IME after a composition has ended
self.ime = true;
} else if ( self.ime && key !== IME && !( key >= 16 && key <= 20 || key >= 91 && key <= 93 || key === 144 ) ) {
// Ignore control keys: ctrl, shift, alt, alt gr, caps lock, windows/apple cmd keys, num lock. Only the windows keys
// terminate IME (apple cmd doesn't), but they also cause a blur, so it's OK to ignore them here.
// Note: Safari 4 (530.17) propagates ESC out of an IME composition (observed at least on Win XP).
self.ime = false;
}
if ( self.ime ) return true;
// Handle return explicitly, to override the default form submission to be able to check for ctrl
if ( key === RET ) return self.accept( evt );
// Inhibit default behavior of ESC (revert to last real input in FF: we do that ourselves)
return ( key === ESC ) ? evtKill( evt ) : true;
};
// And handle continued pressing of arrow keys
text.onkeypress = function ( evt ) {
self.keyCount++;
return self.processKey( evt );
};
$( text ).on( 'focus', function () {
makeActive( self );
} );
// On IE, blur events are asynchronous, and may thus arrive after the element has lost the focus. Since IE
// can get the selection only while the element is active (has the focus), we may not always get the selection.
// Therefore, use an IE-specific synchronous event on IE...
// Don't test for text.selectionStart being defined;
$( text ).on(
( text.onbeforedeactivate !== undefined && text.createTextRange ) ? 'beforedeactivate' : 'blur',
this.saveView.bind( this ) );
// DOM Level 3 IME handling
try {
// Setting lastKey = IME provides a fake keyDown for Gecko's single keyUp after a cmposition. If we didn't do this,
// cancelling a composition via ESC would also cancel and close the whole category input editor.
$( text ).on( 'compositionstart', function () {
self.lastKey = IME;
self.usesComposition = true;
self.ime = true;
} );
$( text ).on( 'compositionend', function () {
self.lastKey = IME;
self.usesComposition = true;
self.ime = false;
} );
$( text ).on( 'textInput', function () {
self.ime = false;
self.invokeSuggestions( false );
} );
} catch ( any ) {
// Just in case some browsers might produce exceptions with these DOM Level 3 events
}
$( text ).on( 'blur', function () {
self.usesComposition = false;
self.ime = false;
} );
}
this.text = text;
this.icon = make( 'img' );
var list = null;
if ( !noSuggestions ) {
list = make( 'select' );
list.onclick = function () {
if ( self.highlightSuggestion( 0 ) ) self.textchange( false, true );
};
list.ondblclick = function ( e ) {
if ( self.highlightSuggestion( 0 ) ) self.accept( e );
};
list.onchange = function () {
self.highlightSuggestion( 0 );
self.text.focus();
};
list.onkeyup = function ( evt ) {
if ( evt.keyCode === ESC ) {
self.resetKeySelection();
self.text.focus();
window.setTimeout( function () {
self.textchange( true );
}, HC.suggest_delay );
} else if ( evt.keyCode === RET ) {
self.accept( evt );
}
};
if ( !HC.fixed_search ) {
var engineSelector = make( 'select' );
for ( var key in suggestionConfigs ) {
if ( suggestionConfigs[ key ].show ) {
var opt = make( 'option' );
opt.value = key;
if ( key === this.engine ) opt.selected = true;
opt.appendChild( make( suggestionConfigs[ key ].name, true ) );
engineSelector.appendChild( opt );
}
}
engineSelector.onchange = function () {
self.engine = self.engineSelector.options[ self.engineSelector.selectedIndex ].value;
self.text.focus();
self.textchange( true, true ); // Don't autocomplete, force re-display of list
};
this.engineSelector = engineSelector;
}
}
this.list = list;
function button_label( id, defaultText ) {
var label = null;
if (
onUpload &&
window.UFUI !== undefined &&
window.UIElements !== undefined &&
UFUI.getLabel instanceof Function
) {
try {
label = UFUI.getLabel( id, true );
// Extract the plain text. IE doesn't know that Node.TEXT_NODE === 3
while ( label && label.nodeType !== 3 ) label = label.firstChild;
} catch ( ex ) {
label = null;
}
}
if ( !label || !label.data ) return defaultText;
return label.data;
}
// Do not use type 'submit'; we cannot detect modifier keys if we do
var OK = make( 'input' );
OK.type = 'button';
OK.value = button_label( 'wpOkUploadLbl', HC.messages.ok );
OK.onclick = this.accept.bind( this );
this.ok = OK;
var cancel = make( 'input' );
cancel.type = 'button';
cancel.value = button_label( 'wpCancelUploadLbl', HC.messages.cancel );
cancel.onclick = this.cancel.bind( this );
this.cancelButton = cancel;
var span = make( 'span' );
span.className = 'hotcatinput';
span.style.position = 'relative';
span.appendChild( text );
// Support: IE8, IE9
// Put some text into this span (a0 is nbsp) and make sure it always stays on the same
// line as the input field, otherwise, IE8/9 miscalculates the height of the span and
// then the engine selector may overlap the input field.
span.appendChild( make( '\xa0', true ) );
span.style.whiteSpace = 'nowrap';
if ( list ) span.appendChild( list );
if ( this.engineSelector ) span.appendChild( this.engineSelector );
if ( !noSuggestions ) span.appendChild( this.icon );
span.appendChild( OK );
span.appendChild( cancel );
form.appendChild( span );
form.style.display = 'none';
this.span.appendChild( form );
},
display: function ( evt ) {
if ( this.isAddCategory && !onUpload && this.line ) {
// eslint-disable-next-line no-new
new CategoryEditor( this.line, null, this.span, true ); // Create a new one
}
if ( !commitButton && !onUpload ) {
for ( var i = 0; i < editors.length; i++ ) {
if ( editors[ i ].state !== CategoryEditor.UNCHANGED ) {
setMultiInput();
break;
}
}
}
if ( !this.form ) this.makeForm();
if ( this.list ) this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
this.currentCategory = this.lastSavedCategory;
this.currentExists = this.lastSavedExists;
this.currentHidden = this.lastSavedHidden;
this.currentKey = this.lastSavedKey;
this.icon.src = ( this.currentExists ? HC.existsYes : HC.existsNo );
this.text.value = this.currentCategory + ( this.currentKey !== null ? '|' + this.currentKey : '' );
this.originalState = this.state;
this.lastInput = this.currentCategory;
this.inputExists = this.currentExists;
this.state = this.state === CategoryEditor.UNCHANGED ? CategoryEditor.OPEN : CategoryEditor.CHANGE_PENDING;
this.lastSelection = {
start: this.currentCategory.length,
end: this.currentCategory.length
};
this.showsList = false;
// Display the form
if ( this.catLink ) this.catLink.style.display = 'none';
this.linkSpan.style.display = 'none';
this.form.style.display = 'inline';
this.ok.disabled = false;
// Kill the event before focussing, otherwise IE will kill the onfocus event!
var result = evtKill( evt );
this.text.focus();
this.text.readOnly = false;
checkMultiInput();
return result;
},
show: function ( evt, engine, readOnly ) {
var result = this.display( evt );
var v = this.lastSavedCategory;
if ( !v.length ) return result;
this.text.readOnly = !!readOnly;
this.engine = engine;
this.textchange( false, true ); // do autocompletion, force display of suggestions
forceRedraw();
return result;
},
open: function ( evt ) {
return this.show( evt, ( this.engine && suggestionConfigs[ this.engine ].temp ) ? HC.suggestions : this.engine );
},
down: function ( evt ) {
return this.show( evt, 'subcat', true );
},
up: function ( evt ) {
return this.show( evt, 'parentcat' );
},
cancel: function () {
if ( this.isAddCategory && !onUpload ) {
this.removeEditor(); // We added a new adder when opening
return;
}
// Close, re-display link
this.inactivate();
this.form.style.display = 'none';
if ( this.catLink ) this.catLink.style.display = '';
this.linkSpan.style.display = '';
this.state = this.originalState;
this.currentCategory = this.lastSavedCategory;
this.currentKey = this.lastSavedKey;
this.currentExists = this.lastSavedExists;
this.currentHidden = this.lastSavedHidden;
if ( this.catLink )
if ( this.currentKey && this.currentKey.length ) { this.catLink.title = this.currentKey; } else { this.catLink.title = ''; }
if ( this.state === CategoryEditor.UNCHANGED ) {
if ( this.catLink ) this.catLink.style.backgroundColor = 'transparent';
} else {
if ( !onUpload ) {
try {
this.catLink.style.backgroundColor = HC.bg_changed;
} catch ( ex ) {}
}
}
checkMultiInput();
forceRedraw();
},
removeEditor: function () {
if ( !newDOM ) {
var next = this.span.nextSibling;
if ( next ) next.parentNode.removeChild( next );
}
if (this.span && this.span.parentNode) {
this.span.parentNode.removeChild( this.span );
}
for ( var i = 0; i < editors.length; i++ ) {
if ( editors[ i ] === this ) {
editors.splice( i, 1 );
break;
}
}
checkMultiInput();
},
rollback: function ( evt ) {
this.undoLink.parentNode.removeChild( this.undoLink );
this.undoLink = null;
this.currentCategory = this.originalCategory;
this.currentKey = this.originalKey;
this.currentExists = this.originalExists;
this.currentHidden = this.originalHidden;
this.lastSavedCategory = this.originalCategory;
this.lastSavedKey = this.originalKey;
this.lastSavedExists = this.originalExists;
this.lastSavedHidden = this.originalHidden;
this.state = CategoryEditor.UNCHANGED;
if ( !this.currentCategory || !this.currentCategory.length ) {
// It was a newly added category. Remove the whole editor.
this.removeEditor();
} else {
// Redisplay the link...
this.catLink.removeChild( this.catLink.firstChild );
this.catLink.appendChild( make( this.currentCategory, true ) );
this.catLink.href = wikiPagePath( HC.category_canonical + ':' + this.currentCategory );
this.catLink.title = this.currentKey || '';
this.catLink.className = this.currentExists ? '' : 'new';
this.catLink.style.backgroundColor = 'transparent';
if ( this.upDownLinks ) this.upDownLinks.style.display = this.currentExists ? '' : 'none';
checkMultiInput();
}
return evtKill( evt );
},
inactivate: function () {
if ( this.list ) this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
this.is_active = false;
},
acceptCheck: function ( dontCheck ) {
this.sanitizeInput();
var value = this.text.value.split( '|' );
var key = null;
if ( value.length > 1 ) key = value[ 1 ];
var v = value[ 0 ].replace( /_/g, ' ' ).replace( /^\s+|\s+$/g, '' );
if ( HC.capitalizePageNames ) v = capitalize( v );
this.lastInput = v;
v = replaceShortcuts( v, HC.shortcuts );
if ( !v.length ) {
this.cancel();
return false;
}
if ( !dontCheck && (
conf.wgNamespaceNumber === 14 && v === conf.wgTitle || HC.blacklist && HC.blacklist.test( v ) ) ) {
this.cancel();
return false;
}
this.currentCategory = v;
this.currentKey = key;
this.currentExists = this.inputExists;
return true;
},
accept: function ( evt ) {
// eslint-disable-next-line no-bitwise
this.noCommit = ( evtKeys( evt ) & 1 ) !== 0;
var result = evtKill( evt );
if ( this.acceptCheck() ) {
var toResolve = [ this ];
var original = this.currentCategory;
resolveMulti( toResolve, function ( resolved ) {
if ( resolved[ 0 ].dab ) {
showDab( resolved[ 0 ] );
} else {
if ( resolved[ 0 ].acceptCheck( true ) ) {
resolved[ 0 ].commit(
( resolved[ 0 ].currentCategory !== original ) ?
HC.messages.cat_resolved.replace( /\$1/g, original ) :
null );
}
}
} );
}
return result;
},
close: function () {
if ( !this.catLink ) {
// Create a catLink
this.catLink = make( 'a' );
this.catLink.appendChild( make( 'foo', true ) );
this.catLink.style.display = 'none';
this.span.insertBefore( this.catLink, this.span.firstChild.nextSibling );
}
this.catLink.removeChild( this.catLink.firstChild );
this.catLink.appendChild( make( this.currentCategory, true ) );
this.catLink.href = wikiPagePath( HC.category_canonical + ':' + this.currentCategory );
this.catLink.className = this.currentExists ? '' : 'new';
this.lastSavedCategory = this.currentCategory;
this.lastSavedKey = this.currentKey;
this.lastSavedExists = this.currentExists;
this.lastSavedHidden = this.currentHidden;
// Close form and redisplay category
this.inactivate();
this.form.style.display = 'none';
this.catLink.title = this.currentKey || '';
this.catLink.style.display = '';
if ( this.isAddCategory ) {
if ( onUpload && this.line ) {
// eslint-disable-next-line no-new
new CategoryEditor( this.line, null, this.span, true ); // Create a new one
}
this.isAddCategory = false;
this.linkSpan.parentNode.removeChild( this.linkSpan );
this.makeLinkSpan();
this.span.appendChild( this.linkSpan );
}
if ( !this.undoLink ) {
// Append an undo link.
var span = make( 'span' );
var lk = make( 'a' );
lk.href = '#catlinks';
lk.onclick = this.rollback.bind( this );
lk.appendChild( make( HC.links.undo, true ) );
lk.title = HC.tooltips.undo;
span.appendChild( make( ' ', true ) );
span.appendChild( lk );
this.normalLinks.appendChild( span );
this.undoLink = span;
if ( !onUpload ) {
try {
this.catLink.style.backgroundColor = HC.bg_changed;
} catch ( ex ) {}
}
}
if ( this.upDownLinks ) this.upDownLinks.style.display = this.lastSavedExists ? '' : 'none';
this.linkSpan.style.display = '';
this.state = CategoryEditor.CHANGED;
checkMultiInput();
forceRedraw();
},
commit: function () {
// Check again to catch problem cases after redirect resolution
if (
(
this.currentCategory === this.originalCategory &&
(
this.currentKey === this.originalKey ||
this.currentKey === null && !this.originalKey.length
)
) ||
conf.wgNamespaceNumber === 14 && this.currentCategory === conf.wgTitle ||
HC.blacklist && HC.blacklist.test( this.currentCategory )
) {
this.cancel();
return;
}
this.close();
if ( !commitButton && !onUpload ) {
var self = this;
initiateEdit( function ( failure ) {
performChanges( failure, self );
}, function ( msg ) {
alert( msg );
} );
}
},
remove: function ( evt ) {
// eslint-disable-next-line no-bitwise
this.doRemove( evtKeys( evt ) & 1 );
return evtKill( evt );
},
doRemove: function ( noCommit ) {
if ( this.isAddCategory ) { // Empty input on adding a new category
this.cancel();
return;
}
if ( !commitButton && !onUpload ) {
for ( var i = 0; i < editors.length; i++ ) {
if ( editors[ i ].state !== CategoryEditor.UNCHANGED ) {
setMultiInput();
break;
}
}
}
if ( commitButton ) {
this.catLink.title = '';
this.catLink.style.cssText += '; text-decoration : line-through !important;';
try {
this.catLink.style.backgroundColor = HC.bg_changed;
} catch ( ex ) {}
this.originalState = this.state;
this.state = CategoryEditor.DELETED;
this.normalLinks.style.display = 'none';
this.undelLink.style.display = '';
checkMultiInput();
} else {
if ( onUpload ) {
// Remove this editor completely
this.removeEditor();
} else {
this.originalState = this.state;
this.state = CategoryEditor.DELETED;
this.noCommit = noCommit || HC.del_needs_diff;
var self = this;
initiateEdit(
function ( failure ) {
performChanges( failure, self );
},
function ( msg ) {
self.state = self.originalState;
alert( msg );
} );
}
}
},
restore: function ( evt ) {
// Can occur only if we do have a commit button and are not on the upload form
this.catLink.title = this.currentKey || '';
this.catLink.style.textDecoration = '';
this.state = this.originalState;
if ( this.state === CategoryEditor.UNCHANGED ) {
this.catLink.style.backgroundColor = 'transparent';
} else {
try {
this.catLink.style.backgroundColor = HC.bg_changed;
} catch ( ex ) {}
}
this.normalLinks.style.display = '';
this.undelLink.style.display = 'none';
checkMultiInput();
return evtKill( evt );
},
// Internal operations
selectEngine: function ( engineName ) {
if ( !this.engineSelector ) return;
for ( var i = 0; i < this.engineSelector.options.length; i++ ) this.engineSelector.options[ i ].selected = this.engineSelector.options[ i ].value === engineName;
},
sanitizeInput: function () {
var v = this.text.value || '';
v = v.replace( /^(\s|_)+/, '' ); // Trim leading blanks and underscores
var re = new RegExp( '^(' + HC.category_regexp + '):' );
if ( re.test( v ) ) v = v.substring( v.indexOf( ':' ) + 1 ).replace( /^(\s|_)+/, '' );
v = v.replace(/\u200E$/, ''); // Trim ending left-to-right mark
if ( HC.capitalizePageNames ) v = capitalize( v );
// Update the input field if needed, manually restoring the cursor afterwards
// (but not the whole selection, so that further typing does not overwrite anything)
if ( this.text.value !== null && this.text.value !== v ) {
var cursorPos = this.text.selectionStart;
this.text.value = v;
this.text.setSelectionRange( cursorPos, cursorPos );
}
},
makeCall: function ( url, callbackObj, engine, queryKey, cleanKey ) {
var cb = callbackObj,
e = engine,
v = queryKey,
z = cleanKey,
thisObj = this;
function done() {
cb.callsMade++;
if ( cb.callsMade === cb.nofCalls ) {
if ( cb.exists ) cb.allTitles.exists = true;
if ( cb.normalized ) cb.allTitles.normalized = cb.normalized;
if ( !cb.dontCache && !suggestionConfigs[ cb.engineName ].cache[ z ] ) suggestionConfigs[ cb.engineName ].cache[ z ] = cb.allTitles;
thisObj.text.readOnly = false;
if ( !cb.cancelled ) thisObj.showSuggestions( cb.allTitles, cb.noCompletion, v, cb.engineName );
if ( cb === thisObj.callbackObj ) thisObj.callbackObj = null;
cb = undefined;
}
}
$.getJSON( url, function ( json ) {
var titles = e.handler( json, z );
if ( titles && titles.length ) {
if ( cb.allTitles === null ) cb.allTitles = titles; else cb.allTitles = cb.allTitles.concat( titles );
if ( titles.exists ) cb.exists = true;
if ( titles.normalized ) cb.normalized = titles.normalized;
}
done();
} ).fail( function ( req ) {
if ( !req ) noSuggestions = true;
cb.dontCache = true;
done();
} );
},
callbackObj: null,
textchange: function ( dont_autocomplete, force ) {
// Hide all other lists
makeActive( this );
// Get input value, omit sort key, if any
this.sanitizeInput();
var v = this.text.value;
// Disregard anything after a pipe.
var pipe = v.indexOf( '|' );
if ( pipe >= 0 ) {
this.currentKey = v.substring( pipe + 1 );
v = v.substring( 0, pipe );
} else {
this.currentKey = null;
}
if ( this.lastInput === v && !force ) return; // No change
if ( this.lastInput !== v ) checkMultiInput();
this.lastInput = v;
this.lastRealInput = v;
// Mark blacklisted inputs.
this.ok.disabled = v.length && HC.blacklist && HC.blacklist.test( v );
if ( noSuggestions ) {
// No Ajax: just make sure the list is hidden
if ( this.list ) this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
if ( this.icon ) this.icon.style.display = 'none';
return;
}
if ( !v.length ) {
this.showSuggestions( [] );
return;
}
var cleanKey = v.replace( /[\u200E\u200F\u202A-\u202E]/g, '' ).replace( wikiTextBlankRE, ' ' );
cleanKey = replaceShortcuts( cleanKey, HC.shortcuts );
cleanKey = cleanKey.replace( /^\s+|\s+$/g, '' );
if ( !cleanKey.length ) {
this.showSuggestions( [] );
return;
}
if ( this.callbackObj ) this.callbackObj.cancelled = true;
var engineName = suggestionConfigs[ this.engine ] ? this.engine : 'combined';
dont_autocomplete = dont_autocomplete || suggestionConfigs[ engineName ].noCompletion;
if ( suggestionConfigs[ engineName ].cache[ cleanKey ] ) {
this.showSuggestions( suggestionConfigs[ engineName ].cache[ cleanKey ], dont_autocomplete, v, engineName );
return;
}
var engines = suggestionConfigs[ engineName ].engines;
this.callbackObj = {
allTitles: null,
callsMade: 0,
nofCalls: engines.length,
noCompletion: dont_autocomplete,
engineName: engineName
};
this.makeCalls( engines, this.callbackObj, v, cleanKey );
},
makeCalls: function ( engines, cb, v, cleanKey ) {
for ( var j = 0; j < engines.length; j++ ) {
var engine = suggestionEngines[ engines[ j ] ];
var url = wgServer + conf.wgScriptPath + engine.uri.replace( /\$1/g, encodeURIComponent( cleanKey ) );
this.makeCall( url, cb, engine, v, cleanKey );
}
},
showSuggestions: function ( titles, dontAutocomplete, queryKey, engineName ) {
this.text.readOnly = false;
this.dab = null;
this.showsList = false;
if ( !this.list ) return;
if ( noSuggestions ) {
if ( this.list ) this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
if ( this.icon ) this.icon.style.display = 'none';
this.inputExists = true; // Default...
return;
}
this.engineName = engineName;
if ( engineName ) {
if ( !this.engineSelector ) this.engineName = null;
} else {
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
}
if ( queryKey ) {
if ( this.lastInput.indexOf( queryKey ) ) return;
if ( this.lastQuery && this.lastInput.indexOf( this.lastQuery ) === 0 && this.lastQuery.length > queryKey.length ) return;
}
this.lastQuery = queryKey;
// Get current input text
var v = this.text.value.split( '|' );
var key = v.length > 1 ? '|' + v[ 1 ] : '';
v = ( HC.capitalizePageNames ? capitalize( v[ 0 ] ) : v[ 0 ] );
var vNormalized = v;
var knownToExist = titles && titles.exists;
var i;
if ( titles ) {
if ( titles.normalized && v.indexOf( queryKey ) === 0 ) {
// We got back a different normalization than what is in the input field
vNormalized = titles.normalized + v.substring( queryKey.length );
}
var vLow = vNormalized.toLowerCase();
// Strip blacklisted categories
if ( HC.blacklist ) {
for ( i = 0; i < titles.length; i++ ) {
if ( HC.blacklist.test( titles[ i ] ) ) {
titles.splice( i, 1 );
i--;
}
}
}
titles.sort(
function ( a, b ) {
if ( a === b ) return 0;
if ( a.indexOf( b ) === 0 ) return 1;
// a begins with b: a > b
if ( b.indexOf( a ) === 0 ) return -1;
// b begins with a: a < b
// Opensearch may return stuff not beginning with the search prefix!
var prefixMatchA = ( a.indexOf( vNormalized ) === 0 ? 1 : 0 );
var prefixMatchB = ( b.indexOf( vNormalized ) === 0 ? 1 : 0 );
if ( prefixMatchA !== prefixMatchB ) return prefixMatchB - prefixMatchA;
// Case-insensitive prefix match!
var aLow = a.toLowerCase(),
bLow = b.toLowerCase();
prefixMatchA = ( aLow.indexOf( vLow ) === 0 ? 1 : 0 );
prefixMatchB = ( bLow.indexOf( vLow ) === 0 ? 1 : 0 );
if ( prefixMatchA !== prefixMatchB ) return prefixMatchB - prefixMatchA;
if ( a < b ) return -1;
if ( b < a ) return 1;
return 0;
} );
// Remove duplicates and self-references
for ( i = 0; i < titles.length; i++ ) {
if (
i + 1 < titles.length && titles[ i ] === titles[ i + 1 ] ||
conf.wgNamespaceNumber === 14 && titles[ i ] === conf.wgTitle
) {
titles.splice( i, 1 );
i--;
}
}
}
if ( !titles || !titles.length ) {
if ( this.list ) this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
if ( engineName && suggestionConfigs[ engineName ] && !suggestionConfigs[ engineName ].temp ) {
if ( this.icon ) this.icon.src = HC.existsNo;
this.inputExists = false;
}
return;
}
var firstTitle = titles[ 0 ];
var completed = this.autoComplete( firstTitle, v, vNormalized, key, dontAutocomplete );
var existing = completed || knownToExist || firstTitle === replaceShortcuts( v, HC.shortcuts );
if ( engineName && suggestionConfigs[ engineName ] && !suggestionConfigs[ engineName ].temp ) {
this.icon.src = ( existing ? HC.existsYes : HC.existsNo );
this.inputExists = existing;
}
if ( completed ) {
this.lastInput = firstTitle;
if ( titles.length === 1 ) {
this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
return;
}
}
// (Re-)fill the list
while ( this.list.firstChild ) this.list.removeChild( this.list.firstChild );
for ( i = 0; i < titles.length; i++ ) {
var opt = make( 'option' );
opt.appendChild( make( titles[ i ], true ) );
opt.selected = completed && ( i === 0 );
this.list.appendChild( opt );
}
this.displayList();
},
displayList: function () {
this.showsList = true;
if ( !this.is_active ) {
this.list.style.display = 'none';
if ( this.engineSelector ) this.engineSelector.style.display = 'none';
return;
}
var nofItems = ( this.list.options.length > HC.listSize ? HC.listSize : this.list.options.length );
if ( nofItems <= 1 ) nofItems = 2;
this.list.size = nofItems;
this.list.style.align = is_rtl ? 'right' : 'left';
this.list.style.zIndex = 5;
this.list.style.position = 'absolute';
// Compute initial list position. First the height.
var anchor = is_rtl ? 'right' : 'left';
var listh = 0;
if ( this.list.style.display === 'none' ) {
// Off-screen display to get the height
this.list.style.top = this.text.offsetTop + 'px';
this.list.style[ anchor ] = '-10000px';
this.list.style.display = '';
listh = this.list.offsetHeight;
this.list.style.display = 'none';
} else {
listh = this.list.offsetHeight;
}
// Approximate calculation of maximum list size
var maxListHeight = listh;
if ( nofItems < HC.listSize ) maxListHeight = ( listh / nofItems ) * HC.listSize;
function viewport( what ) {
if ( is_webkit && !document.evaluate ) {
// Safari < 3.0
return window[ 'inner' + what ];
}
var s = 'client' + what;
if ( window.opera ) return document.body[ s ];
return ( document.documentElement ? document.documentElement[ s ] : 0 ) || document.body[ s ] || 0;
}
function scroll_offset( what ) {
var s = 'scroll' + what;
var result = ( document.documentElement ? document.documentElement[ s ] : 0 ) || document.body[ s ] || 0;
if ( is_rtl && what === 'Left' ) {
// RTL inconsistencies.
// FF: 0 at the far right, then increasingly negative values.
// IE >= 8: 0 at the far right, then increasingly positive values.
// Webkit: scrollWidth - clientWidth at the far right, then down to zero.
// Opera: don't know...
if ( result < 0 ) result = -result;
if ( !is_webkit ) result = scroll_offset( 'Width' ) - viewport( 'Width' ) - result;
// Now all have webkit behavior, i.e. zero if at the leftmost edge.
}
return result;
}
function position( node ) {
// Stripped-down simplified position function. It's good enough for our purposes.
if ( node.getBoundingClientRect ) {
var box = node.getBoundingClientRect();
return {
x: Math.round( box.left + scroll_offset( 'Left' ) ),
y: Math.round( box.top + scroll_offset( 'Top' ) )
};
}
var t = 0,
l = 0;
do {
t += ( node.offsetTop || 0 );
l += ( node.offsetLeft || 0 );
node = node.offsetParent;
} while ( node );
return {
x: l,
y: t
};
}
var textPos = position( this.text ),
nl = 0,
nt = 0,
offset = 0,
// Opera 9.5 somehow has offsetWidth = 0 here?? Use the next best value...
textBoxWidth = this.text.offsetWidth || this.text.clientWidth;
if ( this.engineName ) {
this.engineSelector.style.zIndex = 5;
this.engineSelector.style.position = 'absolute';
this.engineSelector.style.width = textBoxWidth + 'px';
// Figure out the height of this selector: display it off-screen, then hide it again.
if ( this.engineSelector.style.display === 'none' ) {
this.engineSelector.style[ anchor ] = '-10000px';
this.engineSelector.style.top = '0';
this.engineSelector.style.display = '';
offset = this.engineSelector.offsetHeight;
this.engineSelector.style.display = 'none';
} else {
offset = this.engineSelector.offsetHeight;
}
this.engineSelector.style[ anchor ] = nl + 'px';
}
if ( textPos.y < maxListHeight + offset + 1 ) {
// The list might extend beyond the upper border of the page. Let's avoid that by placing it
// below the input text field.
nt = this.text.offsetHeight + offset + 1;
if ( this.engineName ) this.engineSelector.style.top = this.text.offsetHeight + 'px';
} else {
nt = -listh - offset - 1;
if ( this.engineName ) this.engineSelector.style.top = -( offset + 1 ) + 'px';
}
this.list.style.top = nt + 'px';
this.list.style.width = ''; // No fixed width (yet)
this.list.style[ anchor ] = nl + 'px';
if ( this.engineName ) {
this.selectEngine( this.engineName );
this.engineSelector.style.display = '';
}
this.list.style.display = 'block';
// Set the width of the list
if ( this.list.offsetWidth < textBoxWidth ) {
this.list.style.width = textBoxWidth + 'px';
return;
}
// If the list is wider than the textbox: make sure it fits horizontally into the browser window
var scroll = scroll_offset( 'Left' );
var view_w = viewport( 'Width' );
var w = this.list.offsetWidth;
var l_pos = position( this.list );
var left = l_pos.x;
var right = left + w;
if ( left < scroll || right > scroll + view_w ) {
if ( w > view_w ) {
w = view_w;
this.list.style.width = w + 'px';
if ( is_rtl ) left = right - w; else right = left + w;
}
var relative_offset = 0;
if ( left < scroll ) relative_offset = scroll - left; else if ( right > scroll + view_w ) relative_offset = -( right - scroll - view_w );
if ( is_rtl ) relative_offset = -relative_offset;
if ( relative_offset ) this.list.style[ anchor ] = ( nl + relative_offset ) + 'px';
}
},
autoComplete: function ( newVal, actVal, normalizedActVal, key, dontModify ) {
if ( newVal === actVal ) return true;
if ( dontModify || this.ime || !this.canSelect() ) return false;
// If we can't select properly or an IME composition is ongoing, autocompletion would be a major annoyance to the user.
if ( newVal.indexOf( actVal ) ) {
// Maybe it'll work with the normalized value (NFC)?
if ( normalizedActVal && newVal.indexOf( normalizedActVal ) === 0 ) {
if ( this.lastRealInput === actVal ) this.lastRealInput = normalizedActVal;
actVal = normalizedActVal;
} else {
return false;
}
}
// Actual input is a prefix of the new text. Fill in new text, selecting the newly added suffix
// such that it can be easily removed by typing backspace if the suggestion is unwanted.
this.text.focus();
this.text.value = newVal + key;
this.setSelection( actVal.length, newVal.length );
return true;
},
canSelect: function () {
return this.text.setSelectionRange ||
this.text.createTextRange ||
this.text.selectionStart !== undefined &&
this.text.selectionEnd !== undefined;
},
setSelection: function ( from, to ) {
// this.text must be focused (at least on IE)
if ( !this.text.value ) return;
if ( this.text.setSelectionRange ) { // e.g. khtml
this.text.setSelectionRange( from, to );
} else if ( this.text.selectionStart !== undefined ) {
if ( from > this.text.selectionStart ) {
this.text.selectionEnd = to;
this.text.selectionStart = from;
} else {
this.text.selectionStart = from;
this.text.selectionEnd = to;
}
} else if ( this.text.createTextRange ) { // IE
var new_selection = this.text.createTextRange();
new_selection.move( 'character', from );
new_selection.moveEnd( 'character', to - from );
new_selection.select();
}
},
getSelection: function () {
var from = 0,
to = 0;
// this.text must be focused (at least on IE)
if ( !this.text.value ) {
// No text.
} else if ( this.text.selectionStart !== undefined ) {
from = this.text.selectionStart;
to = this.text.selectionEnd;
} else if ( document.selection && document.selection.createRange ) { // IE
var rng = document.selection.createRange().duplicate();
if ( rng.parentElement() === this.text ) {
try {
var textRng = this.text.createTextRange();
textRng.move( 'character', 0 );
textRng.setEndPoint( 'EndToEnd', rng );
// We're in a single-line input box: no need to care about IE's strange
// handling of line ends
to = textRng.text.length;
textRng.setEndPoint( 'EndToStart', rng );
from = textRng.text.length;
} catch ( notFocused ) {
from = this.text.value.length;
to = from; // At end of text
}
}
}
return {
start: from,
end: to
};
},
saveView: function () {
this.lastSelection = this.getSelection();
},
processKey: function ( evt ) {
var dir = 0;
switch ( this.lastKey ) {
case UP:
dir = -1;
break;
case DOWN:
dir = 1;
break;
case PGUP:
dir = -HC.listSize;
break;
case PGDOWN:
dir = HC.listSize;
break;
case ESC: // Inhibit default behavior (revert to last real input in FF: we do that ourselves)
return evtKill( evt );
}
if ( dir ) {
if ( this.list.style.display !== 'none' ) {
// List is visible, so there are suggestions
this.highlightSuggestion( dir );
// Kill the event, otherwise some browsers (e.g., Firefox) may additionally treat an up-arrow
// as "place the text cursor at the front", which we don't want here.
return evtKill( evt );
} else if (
this.keyCount <= 1 &&
( !this.callbackObj || this.callbackObj.callsMade === this.callbackObj.nofCalls )
) {
// If no suggestions displayed, get them, unless we're already getting them.
this.textchange();
}
}
return true;
},
highlightSuggestion: function ( dir ) {
if ( noSuggestions || !this.list || this.list.style.display === 'none' ) return false;
var curr = this.list.selectedIndex;
var tgt = -1;
if ( dir === 0 ) {
if ( curr < 0 || curr >= this.list.options.length ) return false;
tgt = curr;
} else {
tgt = curr < 0 ? 0 : curr + dir;
tgt = tgt < 0 ? 0 : tgt;
if ( tgt >= this.list.options.length ) tgt = this.list.options.length - 1;
}
if ( tgt !== curr || dir === 0 ) {
if ( curr >= 0 && curr < this.list.options.length && dir !== 0 ) this.list.options[ curr ].selected = false;
this.list.options[ tgt ].selected = true;
// Get current input text
var v = this.text.value.split( '|' );
var key = v.length > 1 ? '|' + v[ 1 ] : '';
var completed = this.autoComplete( this.list.options[ tgt ].text, this.lastRealInput, null, key, false );
if ( !completed || this.list.options[ tgt ].text === this.lastRealInput ) {
this.text.value = this.list.options[ tgt ].text + key;
if ( this.canSelect() ) this.setSelection( this.list.options[ tgt ].text.length, this.list.options[ tgt ].text.length );
}
this.lastInput = this.list.options[ tgt ].text;
this.inputExists = true; // Might be wrong if from a dab list...
if ( this.icon ) this.icon.src = HC.existsYes;
this.state = CategoryEditor.CHANGE_PENDING;
}
return true;
},
resetKeySelection: function () {
if ( noSuggestions || !this.list || this.list.style.display === 'none' ) return false;
var curr = this.list.selectedIndex;
if ( curr >= 0 && curr < this.list.options.length ) {
this.list.options[ curr ].selected = false;
// Get current input text
var v = this.text.value.split( '|' );
var key = v.length > 1 ? '|' + v[ 1 ] : '';
// ESC is handled strangely by some browsers (e.g., FF); somehow it resets the input value before
// our event handlers ever get a chance to run.
var result = v[ 0 ] !== this.lastInput;
if ( v[ 0 ] !== this.lastRealInput ) {
this.text.value = this.lastRealInput + key;
result = true;
}
this.lastInput = this.lastRealInput;
return result;
}
return false;
}
}; // end CategoryEditor.prototype
function initialize() {
// User configurations: Do this here, called from the onload handler, so that users can
// override it easily in their own user script files by just declaring variables. JSconfig
// is some feature used at Wikimedia Commons.
var config = ( window.JSconfig !== undefined && JSconfig.keys ) ? JSconfig.keys : {};
HC.dont_add_to_watchlist = ( window.hotcat_dont_add_to_watchlist !== undefined ?
!!window.hotcat_dont_add_to_watchlist :
( config.HotCatDontAddToWatchlist !== undefined ? config.HotCatDontAddToWatchlist :
HC.dont_add_to_watchlist ) );
HC.no_autocommit = ( window.hotcat_no_autocommit !== undefined ?
!!window.hotcat_no_autocommit : ( config.HotCatNoAutoCommit !== undefined ?
config.HotCatNoAutoCommit :
// On talk namespace default autocommit off
( conf.wgNamespaceNumber % 2 ?
true : HC.no_autocommit ) ) );
HC.del_needs_diff = ( window.hotcat_del_needs_diff !== undefined ?
!!window.hotcat_del_needs_diff :
( config.HotCatDelNeedsDiff !== undefined ?
config.HotCatDelNeedsDiff :
HC.del_needs_diff ) );
HC.suggest_delay = window.hotcat_suggestion_delay || config.HotCatSuggestionDelay || HC.suggest_delay;
HC.editbox_width = window.hotcat_editbox_width || config.HotCatEditBoxWidth || HC.editbox_width;
HC.suggestions = window.hotcat_suggestions || config.HotCatSuggestions || HC.suggestions;
if ( typeof HC.suggestions !== 'string' || !suggestionConfigs[ HC.suggestions ] ) HC.suggestions = 'combined';
HC.fixed_search = ( window.hotcat_suggestions_fixed !== undefined ?
!!window.hotcat_suggestions_fixed : ( config.HotCatFixedSuggestions !== undefined ?
config.HotCatFixedSuggestions : HC.fixed_search ) );
HC.single_minor = ( window.hotcat_single_changes_are_minor !== undefined ?
!!window.hotcat_single_changes_are_minor :
( config.HotCatMinorSingleChanges !== undefined ?
config.HotCatMinorSingleChanges :
HC.single_minor ) );
HC.bg_changed = window.hotcat_changed_background || config.HotCatChangedBackground || HC.bg_changed;
HC.use_up_down = ( window.hotcat_use_category_links !== undefined ?
!!window.hotcat_use_category_links :
( config.HotCatUseCategoryLinks !== undefined ?
config.HotCatUseCategoryLinks :
HC.use_up_down ) );
HC.listSize = window.hotcat_list_size || config.HotCatListSize || HC.listSize;
if ( conf.wgDBname !== 'commonswiki' ) HC.changeTag = config.HotCatChangeTag || '';
// The next whole shebang is needed, because manual tags get not submitted except of save
if ( HC.changeTag ) {
var eForm = document.editform,
catRegExp = new RegExp( '^\\[\\[(' + HC.category_regexp + '):' ),
oldTxt;
// Returns true if minor change
var isMinorChange = function () {
var newTxt = eForm.wpTextbox1;
if ( !newTxt ) return;
newTxt = newTxt.value;
var oldLines = oldTxt.match( /^.*$/gm ),
newLines = newTxt.match( /^.*$/gm ),
cArr; // changes
var except = function ( aArr, bArr ) {
var result = [],
lArr, // larger
sArr; // smaller
if ( aArr.length < bArr.length ) {
lArr = bArr;
sArr = aArr;
} else {
lArr = aArr;
sArr = bArr;
}
for ( var i = 0; i < lArr.length; i++ ) {
var item = lArr[ i ];
var ind = $.inArray( item, sArr );
if ( ind === -1 ) result.push( item );
else sArr.splice( ind, 1 ); // don't check this item again
}
return result.concat( sArr );
};
cArr = except( oldLines, newLines );
if ( cArr.length ) {
cArr = $.grep( cArr, function ( c ) {
c = $.trim( c );
return ( c && !catRegExp.test( c ) );
} );
}
if ( !cArr.length ) {
oldTxt = newTxt;
return true;
}
};
if ( conf.wgAction === 'submit' && conf.wgArticleId && eForm && eForm.wpSummary && document.getElementById( 'wikiDiff' ) ) {
var sum = eForm.wpSummary,
sumA = eForm.wpAutoSummary;
if ( sum.value && sumA.value === HC.changeTag ) { // HotCat diff
// MD5 hash of the empty string, as HotCat edit is based on empty sum
sumA.value = sumA.value.replace( HC.changeTag, 'd41d8cd98f00b204e9800998ecf8427e' );
// Attr creation and event handling is not same in all (old) browsers so use $
var $ct = $( '<input type="hidden" name="wpChangeTags">' ).val( HC.changeTag );
$( eForm ).append( $ct );
oldTxt = eForm.wpTextbox1.value;
$( '#wpSave' ).one( 'click', function () {
if ( $ct.val() )
sum.value = sum.value.replace( ( HC.messages.using || HC.messages.prefix ), '' );
} );
var removeChangeTag = function () {
$( eForm.wpTextbox1 ).add( sum ).one( 'input', function () {
window.setTimeout( function () {
if ( !isMinorChange() ) $ct.val( '' );
else removeChangeTag();
}, 500 );
} );
};
removeChangeTag();
}
}
}
// Numeric input, make sure we have a numeric value
HC.listSize = parseInt( HC.listSize, 10 );
if ( isNaN( HC.listSize ) || HC.listSize < 5 ) HC.listSize = 5;
HC.listSize = Math.min( HC.listSize, 30 ); // Max size
// Localize search engine names
if ( HC.engine_names ) {
for ( var key in HC.engine_names )
if ( suggestionConfigs[ key ] && HC.engine_names[ key ] ) suggestionConfigs[ key ].name = HC.engine_names[ key ];
}
// Catch both native RTL and "faked" RTL through [[MediaWiki:Rtl.js]]
is_rtl = hasClass( document.body, 'rtl' );
if ( !is_rtl ) {
if ( document.defaultView && document.defaultView.getComputedStyle ) { // Gecko etc.
is_rtl = document.defaultView.getComputedStyle( document.body, null ).getPropertyValue( 'direction' );
} else if ( document.body.currentStyle ) { // IE, has subtle differences to getComputedStyle
is_rtl = document.body.currentStyle.direction;
} else { // Not exactly right, but best effort
is_rtl = document.body.style.direction;
}
is_rtl = ( is_rtl === 'rtl' );
}
}
function can_edit() {
var container = null;
switch ( mw.config.get( 'skin' ) ) {
case 'cologneblue':
container = document.getElementById( 'quickbar' );
/* fall through */
case 'standard':
case 'nostalgia':
if ( !container ) container = document.getElementById( 'topbar' );
var lks = container.getElementsByTagName( 'a' );
for ( var i = 0; i < lks.length; i++ ) {
if (
param( 'title', lks[ i ].href ) === conf.wgPageName &&
param( 'action', lks[ i ].href ) === 'edit'
) {
return true;
}
}
return false;
default:
// all modern skins:
return document.getElementById( 'ca-edit' ) !== null;
}
}
// Legacy stuff
function closeForm() {
// Close all open editors without redirect resolution and other asynchronous stuff.
for ( var i = 0; i < editors.length; i++ ) {
var edit = editors[ i ];
if ( edit.state === CategoryEditor.OPEN ) {
edit.cancel();
} else if ( edit.state === CategoryEditor.CHANGE_PENDING ) {
edit.sanitizeInput();
var value = edit.text.value.split( '|' );
var key = null;
if ( value.length > 1 ) key = value[ 1 ];
var v = value[ 0 ].replace( /_/g, ' ' ).replace( /^\s+|\s+$/g, '' );
if ( !v.length ) {
edit.cancel();
} else {
edit.currentCategory = v;
edit.currentKey = key;
edit.currentExists = this.inputExists;
edit.close();
}
}
}
}
function setup_upload() {
onUpload = true;
// Add an empty category bar at the end of the table containing the description, and change the onsubmit handler.
var ip = document.getElementById( 'mw-htmlform-description' ) || document.getElementById( 'wpDestFile' );
if ( !ip ) {
ip = document.getElementById( 'wpDestFile' );
while ( ip && ip.nodeName.toLowerCase() !== 'table' ) ip = ip.parentNode;
}
if ( !ip ) return;
var reupload = document.getElementById( 'wpForReUpload' );
var destFile = document.getElementById( 'wpDestFile' );
if (
( reupload && !!reupload.value ) ||
( destFile && ( destFile.disabled || destFile.readOnly ) )
) {
return; // re-upload form...
}
// Insert a table row with two fields (label and empty category bar)
var labelCell = make( 'td' );
var lineCell = make( 'td' );
// Create the category line
catLine = make( 'div' );
catLine.className = 'catlinks';
catLine.id = 'catlinks';
catLine.style.textAlign = is_rtl ? 'right' : 'left';
// We'll be inside a table row. Make sure that we don't have margins or strange borders.
catLine.style.margin = '0';
catLine.style.border = 'none';
lineCell.appendChild( catLine );
// Create the label
var label = null;
if ( window.UFUI && window.UIElements && UFUI.getLabel instanceof Function ) {
try {
label = UFUI.getLabel( 'wpCategoriesUploadLbl' );
} catch ( ex ) {
label = null;
}
}
if ( !label ) {
labelCell.id = 'hotcatLabel';
labelCell.appendChild( make( HC.categories, true ) );
} else {
labelCell.id = 'hotcatLabelTranslated';
labelCell.appendChild( label );
}
labelCell.className = 'mw-label';
labelCell.style.textAlign = 'right';
labelCell.style.verticalAlign = 'middle';
// Change the onsubmit handler
var form = document.getElementById( 'upload' ) || document.getElementById( 'mw-upload-form' );
if ( form && ip && ip.insertRow ) {
var newRow = ip.insertRow( -1 );
newRow.appendChild( labelCell );
newRow.appendChild( lineCell );
form.onsubmit = ( function ( oldSubmit ) {
return function () {
var do_submit = true;
if ( oldSubmit ) {
if ( typeof oldSubmit === 'string' ) {
// eslint-disable-next-line no-eval
do_submit = eval( oldSubmit );
} else if ( oldSubmit instanceof Function ) {
do_submit = oldSubmit.apply( form, arguments );
}
}
if ( !do_submit ) return false;
closeForm();
// Copy the categories
var eb = document.getElementById( 'wpUploadDescription' ) || document.getElementById( 'wpDesc' );
var addedOne = false;
for ( var i = 0; i < editors.length; i++ ) {
var t = editors[ i ].currentCategory;
if ( !t ) continue;
var key = editors[ i ].currentKey;
var new_cat = '[[' + HC.category_canonical + ':' + t + ( key ? '|' + key : '' ) + ']]';
// Only add if not already present
var cleanedText = eb.value
.replace( /<!--(\s|\S)*?-->/g, '' )
.replace( /<nowiki>(\s|\S)*?<\/nowiki>/g, '' );
if ( !find_category( cleanedText, t, true ) ) {
eb.value += '\n' + new_cat;
addedOne = true;
}
}
if ( addedOne ) {
// Remove "subst:unc" added by Flinfo if it didn't find categories
eb.value = eb.value.replace( /\{\{subst:unc\}\}/g, '' );
}
return true;
};
}( form.onsubmit ) );
}
}
var cleanedText = null;
function isOnPage( span ) {
if ( span.firstChild.nodeType !== Node.ELEMENT_NODE ) return null;
var catTitle = title( span.firstChild.getAttribute( 'href' ) );
if ( !catTitle ) return null;
catTitle = catTitle.substr( catTitle.indexOf( ':' ) + 1 ).replace( /_/g, ' ' );
if ( HC.blacklist && HC.blacklist.test( catTitle ) ) return null;
var result = {
title: catTitle,
match: [ '', '', '' ]
};
if ( pageText === null ) return result;
if ( cleanedText === null ) {
cleanedText = pageText
.replace( /<!--(\s|\S)*?-->/g, '' )
.replace( /<nowiki>(\s|\S)*?<\/nowiki>/g, '' );
}
result.match = find_category( cleanedText, catTitle, true );
return result;
}
var initialized = false;
var setupTimeout = null;
function findByClass( scope, tag, className ) {
var result = $( scope ).find( tag + '.' + className );
return ( result && result.length ) ? result[ 0 ] : null;
}
function errorAMC() {
alert( 'An error occurred. Unable to setup HotCat' );
}
function enableAMC() {
var api = new mw.Api();
return api.saveOption( 'mf_amc_optin', '1' ).then( function ( r ) {
if ( !r || r.options !== 'success' ) {
errorAMC();
return;
}
if ( window.confirm( 'Please reload your page to use hotcat.' ) ) {
location.reload();
}
}, function () {
errorAMC();
} );
}
function showWarning( text ) {
var warning = document.createElement( 'div' );
warning.setAttribute( 'style', 'padding: 20px; background: var(--wikt-palette-amber-0,orange); color: var(--wikt-palette-black,#333); font-weight: bold; margin-top: 20px;' );
warning.textContent = text;
var btn = document.createElement( 'button' );
btn.classList.add( 'mw-ui-button', 'cdx-button' );
btn.style.display = 'block';
btn.textContent = 'Enable HotCat and AMC mode on this page';
btn.addEventListener( 'click', function () {
enableAMC();
} );
warning.appendChild( btn );
document.getElementById( 'mw-content-text' ).appendChild( warning );
}
function setup( additionalWork ) {
if ( initialized ) return;
initialized = true;
if ( setupTimeout ) {
window.clearTimeout( setupTimeout );
setupTimeout = null;
}
// Find the category bar, or create an empty one if there isn't one. Then add -/+- links after
// each category, and add the + link.
catLine =
// Special:Upload
catLine ||
document.getElementById( 'mw-normal-catlinks' );
var hiddenCats = document.getElementById( 'mw-hidden-catlinks' );
if ( !catLine ) {
// Workaround for T24660
if ( mw.config.get('skin') === 'minerva' ) {
if ( document.body.classList.contains('mw-mf-amc-disabled') ) {
showWarning( 'HotCat requires AMC mode.' );
}
}
var footer = null;
if ( !hiddenCats ) {
footer = findByClass( document, 'div', 'printfooter' );
if ( !footer ) return; // Don't know where to insert the category line
}
catLine = make( 'div' );
catLine.id = 'mw-normal-catlinks';
catLine.style.textAlign = is_rtl ? 'right' : 'left';
// Add a label
var label = make( 'a' );
label.href = conf.wgArticlePath.replace( '$1', 'Special:Categories' );
label.title = HC.categories;
label.appendChild( make( HC.categories, true ) );
catLine.appendChild( label );
catLine.appendChild( make( ':', true ) );
// Insert the new category line
var container = ( hiddenCats ? hiddenCats.parentNode : document.getElementById( 'catlinks' ) );
if ( !container ) {
container = make( 'div' );
container.id = 'catlinks';
footer.parentNode.insertBefore( container, footer.nextSibling );
}
container.className = 'catlinks noprint';
container.style.display = '';
if ( !hiddenCats ) container.appendChild( catLine ); else container.insertBefore( catLine, hiddenCats );
} // end if catLine exists
if ( is_rtl ) catLine.dir = 'rtl';
// Create editors for all existing categories
function createEditors( line, is_hidden ) {
var i;
var cats = line.getElementsByTagName( 'li' );
if ( cats.length ) {
newDOM = true;
line = cats[ 0 ].parentNode;
} else {
cats = line.getElementsByTagName( 'span' );
}
// Copy cats, otherwise it'll also magically contain our added spans as it is a live collection!
var copyCats = new Array( cats.length );
for ( i = 0; i < cats.length; i++ ) copyCats[ i ] = cats[ i ];
for ( i = 0; i < copyCats.length; i++ ) {
var test = isOnPage( copyCats[ i ] );
if ( test !== null && test.match !== null && line ) {
// eslint-disable-next-line no-new
new CategoryEditor( line, copyCats[ i ], test.title, test.match[ 2 ], is_hidden );
}
}
return copyCats.length ? copyCats[ copyCats.length - 1 ] : null;
}
var lastSpan = createEditors( catLine, false );
// Create one to add a new category
// eslint-disable-next-line no-new
new CategoryEditor( newDOM ? catLine.getElementsByTagName( 'ul' )[ 0 ] : catLine, null, null, lastSpan !== null, false );
if ( !onUpload ) {
if ( pageText !== null && hiddenCats ) {
if ( is_rtl ) hiddenCats.dir = 'rtl';
createEditors( hiddenCats, true );
}
// And finally add the "multi-mode" span. (Do this at the end, otherwise it ends up in the list above.)
var enableMulti = make( 'span' );
enableMulti.className = 'noprint';
if ( is_rtl ) enableMulti.dir = 'rtl';
catLine.insertBefore( enableMulti, catLine.firstChild.nextSibling );
enableMulti.appendChild( make( '\xa0', true ) ); // nbsp
multiSpan = make( 'span' );
enableMulti.appendChild( multiSpan );
multiSpan.innerHTML = '(<a>' + HC.addmulti + '</a>)';
var lk = multiSpan.getElementsByTagName( 'a' )[ 0 ];
lk.onclick = function ( evt ) {
setMultiInput();
checkMultiInput();
return evtKill( evt );
};
lk.title = HC.multi_tooltip;
lk.style.cursor = 'pointer';
}
cleanedText = null;
if ( additionalWork instanceof Function ) additionalWork();
mw.hook( 'hotcat.ready' ).fire(); // Execute registered callback functions
$( 'body' ).trigger( 'hotcatSetupCompleted' );
}
function createCommitForm() {
if ( commitForm ) return;
var formContainer = make( 'div' );
formContainer.style.display = 'none';
document.body.appendChild( formContainer );
formContainer.innerHTML =
'<form id="hotcatCommitForm" method="post" enctype="multipart/form-data" action="' +
conf.wgScript + '?title=' + encodeURIComponent( conf.wgPageName ) + '&action=submit">' +
'<input type="hidden" name="wpTextbox1">' +
'<input type="hidden" name="model" value="' + conf.wgPageContentModel + '">' +
'<input type="hidden" name="format" value="text/x-wiki">' +
'<input type="hidden" name="wpSummary" value="">' +
'<input type="checkbox" name="wpMinoredit" value="1">' +
'<input type="checkbox" name="wpWatchthis" value="1">' +
'<input type="hidden" name="wpAutoSummary" value="d41d8cd98f00b204e9800998ecf8427e">' +
'<input type="hidden" name="wpEdittime">' +
'<input type="hidden" name="wpStarttime">' +
'<input type="hidden" name="wpDiff" value="wpDiff">' +
'<input type="hidden" name="oldid" value="0">' +
'<input type="hidden" name="wpIgnoreBlankSummary" value="1">' +
'<input type="submit" name="hcCommit" value="hcCommit">' +
'<input type="hidden" name="wpEditToken">' +
'<input type="hidden" name="wpUltimateParam" value="1">' +
'<input type="hidden" name="wpChangeTags">' +
'<input type="hidden" value="ℳ𝒲♥𝓊𝓃𝒾𝒸ℴ𝒹ℯ" name="wpUnicodeCheck">' +
'</form>';
commitForm = document.getElementById( 'hotcatCommitForm' );
}
function getPage() {
// We know we have an article here.
if ( !conf.wgArticleId ) {
// Doesn't exist yet. Disable on non-existing User pages -- might be a global user page.
if ( conf.wgNamespaceNumber === 2 ) return;
pageText = '';
pageTime = null;
setup( createCommitForm );
} else {
var url = wgServer + conf.wgScriptPath + '/api.php?format=json&callback=HotCat.start&action=query&rawcontinue=&titles=' +
encodeURIComponent( conf.wgPageName ) +
'&prop=info%7Crevisions&rvprop=content%7Ctimestamp%7Cids&meta=siteinfo&rvlimit=1&rvstartid=' +
conf.wgCurRevisionId;
var s = make( 'script' );
s.src = url;
HC.start = function ( json ) {
setPage( json );
setup( createCommitForm );
};
document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
setupTimeout = window.setTimeout( function () {
setup( createCommitForm );
}, 4000 ); // 4 sec, just in case getting the wikitext takes longer.
}
}
function setState( state ) {
var cats = state.split( '\n' );
if ( !cats.length ) return null;
if ( initialized && editors.length === 1 && editors[ 0 ].isAddCategory ) {
// Insert new spans and create new editors for them.
var newSpans = [];
var before = editors.length === 1 ? editors[ 0 ].span : null;
var i;
for ( i = 0; i < cats.length; i++ ) {
if ( !cats[ i ].length ) continue;
var cat = cats[ i ].split( '|' );
var key = cat.length > 1 ? cat[ 1 ] : null;
cat = cat[ 0 ];
var lk = make( 'a' );
lk.href = wikiPagePath( HC.category_canonical + ':' + cat );
lk.appendChild( make( cat, true ) );
lk.title = cat;
var span = make( 'span' );
span.appendChild( lk );
if ( !i ) catLine.insertBefore( make( ' ', true ), before );
catLine.insertBefore( span, before );
if ( before && i + 1 < cats.length ) parent.insertBefore( make( ' | ', true ), before );
newSpans.push( {
element: span,
title: cat,
key: key
} );
}
// And change the last one...
if ( before ) before.parentNode.insertBefore( make( ' | ', true ), before );
for ( i = 0; i < newSpans.length; i++ ) {
// eslint-disable-next-line no-new
new CategoryEditor( catLine, newSpans[ i ].element, newSpans[ i ].title, newSpans[ i ].key );
}
}
return null;
}
function getState() {
var result = null;
for ( var i = 0; i < editors.length; i++ ) {
var text = editors[ i ].currentCategory;
var key = editors[ i ].currentKey;
if ( text && text.length ) {
if ( key !== null ) text += '|' + key;
if ( result === null ) result = text; else result += '\n' + text;
}
}
return result;
}
function really_run() {
en_wiktionary_get_langdata(function() {
initialize();
if ( !HC.upload_disabled && conf.wgNamespaceNumber === -1 && conf.wgCanonicalSpecialPageName === 'Upload' && conf.wgUserName ) {
setup_upload();
setup( function () {
// Check for state restoration once the setup is done otherwise, but before signalling setup completion
if ( window.UploadForm && UploadForm.previous_hotcat_state ) UploadForm.previous_hotcat_state = setState( UploadForm.previous_hotcat_state );
} );
} else {
if ( !conf.wgIsArticle || conf.wgAction !== 'view' || param( 'diff' ) !== null || param( 'oldid' ) !== null || !can_edit() || HC.disable() ) return;
getPage();
}
});
}
function run() {
if ( HC.started ) return;
HC.started = true;
loadTrigger.register( really_run );
}
// Export legacy functions
window.hotcat_get_state = function () {
return getState();
};
window.hotcat_set_state = function ( state ) {
return setState( state );
};
window.hotcat_close_form = function () {
closeForm();
};
HC.runWhenReady = function ( callback ) {
// run user-registered code once HotCat is fully set up and ready.
mw.hook( 'hotcat.ready' ).add( callback );
};
// Make sure we don't get conflicts with AjaxCategories (core development that should one day
// replace HotCat).
mw.config.set( 'disableAJAXCategories', true );
// Run as soon as possible. This varies depending on MediaWiki version;
// window's 'load' event is always safe, but usually we can do better than that.
if ( conf.wgCanonicalSpecialPageName !== 'Upload' ) {
// Reload HotCat after (VE) edits (bug T103285)
mw.hook( 'postEdit' ).add( function () {
// Reset HotCat in case this is a soft reload (e.g. VisualEditor edit), unless the categories
// were not re-rendered and our interface is still there (e.g. DiscussionTools edit)
if ( document.querySelector( '#catlinks .hotcatlink' ) ) {
return;
}
catLine = null;
editors = [];
initialized = false;
HC.started = false;
run();
} );
}
// We can safely trigger just after user configuration is loaded.
// Use always() instead of then() to also start HotCat if the user module has problems.
$.when( mw.loader.using( 'user' ), $.ready ).always( run );
}( jQuery, mediaWiki ) );
// </nowiki>
3hmzjiyzir2a15k9glu703ig09c837r
MediaWiki:Gadget-DeveloperEditorTweaks.js
8
18008
89285
89020
2026-11-02T23:08:11Z
Maintenance script
1536
Use thumb.wikimedia.org for thumbnails ([[phab:T427465]], Operator: Ladsgroup)
89285
javascript
text/javascript
'use strict'; /*jshint undef:true */
// {{documentation}}
/*global mw, jQuery */
if ((mw.config.get('wgAction') === 'edit') || (mw.config.get('wgAction') === 'submit'))
jQuery(document).ready(function () {
var isCoding = { 'javascript': true, 'css': true, 'Scribunto': true };
var wgPageContentModel = mw.config.get('wgPageContentModel');
var wpTextbox1 = jQuery('#wpTextbox1');
if (!wpTextbox1.length) {
console.error("det: failed to find WikiEditor entry point");
return;
}
if (!wpTextbox1.wikiEditor) {
console.error("det: WikiEditor not loaded?");
return;
}
if (wgPageContentModel !== 'wikitext') {
// remove irrelevant buttons
// XXX: this should be reported to Bugzilla, really
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'main',
'group': 'insert'
});
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'main',
'group': 'format'
});
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'help'
});
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'advanced',
'group': 'heading'
});
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'advanced',
'group': 'format'
});
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'advanced',
'group': 'size'
});
wpTextbox1.wikiEditor('removeFromToolbar', {
'section': 'advanced',
'group': 'insert'
});
}
// workaround [[gerrit:118993]]
mw.util.addCSS(
".group-codeeditor-tools," +
".codeEditor-ui-toolbar .group-insert," +
".codeEditor-ui-toolbar .group-format," +
".codeEditor-ui-toolbar .tabs span.tab-advanced," +
".codeEditor-ui-toolbar .tabs span.tab-characters," +
".codeEditor-ui-toolbar .tabs span.tab-help," +
".codeEditor-ui-toolbar .sections {" +
" display: block !important;" +
"}");
if (isCoding[wgPageContentModel]) {
wpTextbox1.wikiEditor('addToToolbar', {
'section': 'main',
'groups': {
'codefmt': {
'tools': {
'normws': {
'type': 'button',
'label': 'Normalise whitespace',
'icon': '//thumb.wikimedia.org/wikipedia/commons/thumb/0/00/VisualEditor_-_Icon_-_Indent-list-ltr.svg/24px-VisualEditor_-_Icon_-_Indent-list-ltr.svg.png', // XXX
'action': {
'type': 'callback',
'execute': function (context) {
function normws(text, lineStart, lineEnd) {
text = text.replace(lineEnd ? /[ \t]+(\n|$)/g : /[ \t]+(\n)/g, '$1');
var step = 4; // XXX: guess it by inspecting the source?
text = text.replace(lineStart ? /(^|\n)([\t ]+)/g : /(\n)([\t ]+)/g, function (_, nl, indent) {
indent = indent.replace(/ /g, '\t').replace(/ +\t/g, '\t').replace(/\t/g, ' ');
var steps = Math.floor(indent.length / step); indent = '';
for (var i = 0; i < steps; ++i)
indent += '\t';
return nl + indent;
});
return text;
}
if (!context.$textarea.textSelection('getSelection')) {
if (context.codeEditor)
context.codeEditor.selectAll();
else
context.$textarea[0].select();
}
context.$textarea.textSelection('encapsulateSelection', {
replace: true, selectPeri: true,
peri: normws(context.$textarea[0].value, true, true)
});
}
}
}
}
}
}
});
}
if ((wgPageContentModel === 'javascript') || (mw.config.get('wgPageName') === 'MediaWiki:Gadgets-definition')) {
var moduleDescriptions = {
'mediawiki.Title': "<code>mw.Title</code> object",
'mediawiki.Uri' : "<code>mw.Uri</code> object",
'mediawiki.util' : "<code>mw.util</code>",
'mediawiki.user' : "<code>mw.user</code>",
'moment' : "Moment.js",
'site' : "Site-specific scripts: [[MediaWiki:Common.js]] and per-skin JS",
'es5-shim' : "ECMAScript 5 shim for older browsers",
'':""
};
wpTextbox1.wikiEditor('addToToolbar', {
'sections': {
'js': {
'type': 'booklet',
'label': "JavaScript reference",
'pages': {
'modules': {
'layout': 'table',
'label': "ResourceLoader modules",
'headings': [
{ 'text': "Identifier" },
{ 'text': "Description" }
],
'rows': mw.loader.getModuleNames().sort().filter(function (modname) {
// they are quite dull modules, but they are there
if (/^ext\.geshi\.language\./.test(modname))
return false;
if (/^ext\.math\.mathjax\.jax\.output\./.test(modname))
return false;
return true;
}).map(function (modname) {
return {
'id': {
'html': '<code>' + modname + '</code>',
},
'desc': {
'html': moduleDescriptions[modname] || '<small style="color:gray;">(no description)</small>'
}
};
})
}
}
}
}
});
}
if (wgPageContentModel === 'javascript') {
var jshintDescriptions = {
'bitwise' : "Prohibit bitwise operators",
'camelcase' : "Mandate <code>javaCamelCase</code> (deprecated)",
'curly' : "Mandate curly brackets in control structures",
'eqeqeq' : "Prohibit <code>==</code> and <code>!=</code>",
'es3' : "Mandate ECMAScript 3 compatibility (deprecated; use <code>esversion:3</code>)",
'es5' : "Mandate ECMAScript 5 compatibility (deprecated; use <code>esversion:5</code>)",
'esversion:<var>n</var>' : 'Mandate compatibility with an ECMAScript version (3, 5<span class="serial-comma">,</span> or 6)',
'forin' : "Mandate <code>hasOwnProperty</code> in <code>for..in</code> loops",
'freeze' : "Prohibit changing prototypes of built-in objects",
'futurehostile' : "Warn about identifiers defined in future versions of JavaScript",
'globals' : "Disable warnings for these globals",
'immed' : "Mandate parentheses around immediately-executed function expressions (deprecated)",
'indent:<var>n</var>' : "Set tab width (deprecated)",
'latedef' : "Prohibit using variables before their declaration",
'newcap' : "Mandate capitalisation of constructors (deprecated)",
'noarg' : "Prohibit use of <code>arguments.caller</code> and <code>arguments.callee</code>",
'noempty' : "Warn about empty blocks (deprecated)",
'nonbsp' : "Warn about non-breaking space",
'nonew' : "Prohibit constructor usage for side effects",
'plusplus' : "Prohibit unary increment and decrement operators",
'quotmark:true' : "Mandate consistency of quotation marks (deprecated)",
'quotmark:single' : "Mandate single quotation marks only (deprecated)",
'quotmark:double' : "Mandata double quotation marks only (deprecated)",
'undef' : "Prohibit use of variables not explicitly declared",
'unused' : "Warn about unused variables",
'varstmt' : "Prohibit <code>var</code> (use <code>let</code> or <code>const</code>)",
'strict' : "Mandate strict mode compatibility",
'maxparams:<var>n</var>' : "Enforce maximum number of formal parameters",
'maxdepth:<var>n</var>' : "Enforce maximum depth of nested blocks",
'maxstatements' : "Enforce maximum number of statements per function",
'maxcomplexity:<var>n</var>': "Enforce maximum cyclomatic complexity",
'maxlen' : "Enforce maximum length of a line (deprecated)",
'asi' : "Allow semicolon insertion",
'boss' : "Allow assignment-expressions",
'debug' : "Allow <code>debugger</code> statements",
'eqnull' : "Allow <code>== null</code> comparisons",
'esnext' : "Allow ES.next syntax (deprecated; use <code>esversion:6</code>)",
'evil' : "Allow <code>eval</code>",
'expr' : "Allow expressions where statements are expected",
'funcscope' : "Allow using variables outside the block where they are declared",
'globalstrict' : "Allow global strict mode (deprecated)",
'iterator' : "Allow using <code>__iterator__</code>",
'lastsemic' : "Allow omitting semicolons last statement",
'laxbreak' : "Allow lax line breaks (deprecated)",
'laxcomma' : "Allow comma-first coding style (deprecated)",
'loopfunc' : "Allow making functions within a loop",
'maxerr:<var>n</var>' : "Set maximum number of warnings",
'moz' : "Allow Mozilla extensions",
'multistr' : "Allow multi-line string literals (deprecated)",
'notypeof' : "Allow lax usage of <code>typeof</code>",
'proto' : "Allow using <code>__proto__</code>",
'scripturl' : "Allow <code>javascript:</code> URLs",
'shadow' : "Allow variable shadowing",
'sub' : "Allow bracket notation for object member access (deprecated)",
'supernew' : "Allow atypical constructor usage",
'validthis' : "<code>this</code> is valid in this function",
'noyield' : "Allow generators without <code>yield</code>",
'browser' : "Assume a browser environment",
'devel' : "Assume <code>console</code> is available",
'jquery' : "Assume jQuery is available",
'nonstandard' : "Assume non-standard global functions are available",
'worker' : "Assume Web Worker globals are available",
/* probably not useful: assume a framework is available
'couch' : "",
'dojo' : "",
'mootools' : "",
'node' : "",
'phantom' : "",
'prototypejs' : "",
'rhino' : "",
'wsh' : "",
'yui' : "",
*/
};
wpTextbox1.wikiEditor('addToToolbar', {
'section': 'js',
'pages': {
'jshint': {
'layout': 'table',
'label': "JSHint options",
'headings': [
{ 'text': "Option" },
{ 'text': "Description" }
],
'rows': Object.keys(jshintDescriptions).sort().map(function (option) {
return {
'option': {
'html': '<code>'
+ option.replace(
/^[^:]+/,
'<a href="https://jshint.com/docs/options/#$&" target="_blank">$&</a>')
+ '</code>'
},
'description': {
'html': jshintDescriptions[option]
}
};
})
}
}
});
}
if (wgPageContentModel === 'Scribunto') {
// XXX: move console upwards
}
});
iwhhu8gerwfkrjtiq2m87iegcsg6wf0