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