Wikispecies specieswiki https://species.wikimedia.org/wiki/Main_Page MediaWiki 1.47.0-wmf.24 first-letter Media Special Talk User User talk Wikispecies Wikispecies talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk TimedText TimedText talk Module Module talk Translations Translations talk Event Event talk Topic Cryptoprocta 0 660 11322475 11305232 2026-10-21T23:48:18Z Burmeister 9074 add+ 11322475 wikitext text/x-wiki {{Image|Cryptoprocta ferox 1 - Syracuse Zoo.jpg|''Cryptoprocta ferox''}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species (1 + †2): †{{sp|C|ryptoprocta|bevatabe}} {{sp|C|ryptoprocta|ferox}} †{{splast|C|ryptoprocta|spelea}} =={{int:Name}}== ''Cryptoprocta'' {{a|Edward Turner Bennett|Bennett}}, 1833 * {{int:Type species}}: ''Cryptoprocta ferox'' {{aut|Bennett}}, 1833, by monotypy. =={{int:References}}== ==={{int:Primary references}}=== {{Bennett, 1833d}} ==={{int:Additional references}}=== {{Lewis et al., 2026}} {{Taxonbar|from=Q141424}} [[Category:Edward Turner Bennett taxa]] plsexgib1vwsr7thu13ib6ji0xtvma3 11322490 11322475 2026-10-22T00:26:35Z Burmeister 9074 + 11322490 wikitext text/x-wiki {{Image|Cryptoprocta ferox 1 - Syracuse Zoo.jpg|''Cryptoprocta ferox''}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species (1 + †2): †{{sp|C|ryptoprocta|bevatabe}} {{sp|C|ryptoprocta|ferox}} †{{splast|C|ryptoprocta|spelea}} =={{int:Name}}== ''Cryptoprocta'' {{a|Edward Turner Bennett|Bennett}}, 1833: {{BHL|page/12859486|46}} * {{int:Type species}}: ''Cryptoprocta ferox'' {{aut|Bennett}}, 1833, by monotypy. =={{int:References}}== ==={{int:Primary references}}=== {{Bennett, 1833d}} ==={{int:Additional references}}=== {{Lewis et al., 2026}} {{Taxonbar|from=Q141424}} [[Category:Edward Turner Bennett taxa]] 0yvw9qww08zel153egy05h45k33ffnp Mustelinae 0 2977 11322291 11172202 2026-10-21T20:02:51Z The editor 2345 2915305 /* Taxonavigation */ 11322291 wikitext text/x-wiki {{image|Mustela nivalis -British Wildlife Centre-4.jpg|''[[Mustela nivalis]]''}} =={{int:Taxonavigation}}== {{Mustelinae}} Genera (2 + †1): {{g|Mustela}} {{g|Neogale}} †{{glast|Skopelogale}} =={{int:Name}}== Mustelinae {{a|August Johann Georg Karl Batsch|Batsch}}, 1788 ==={{int:Combinations}}=== * Mustelina {{aut|Batsch}}, 1788: 110 * Mustelini: {{a|Johann Gotthelf Fischer von Waldheim|Fischer}}, 1817: 372 * Mustelinae: {{a|William Swainson|Swainson}}, 1835: 362; {{a|Theodore Nicholas Gill|Gill}}, 1872: 64 =={{int:References}}== ==={{int:Primary references}}=== * {{a|August Johann Georg Karl Batsch|Batsch, A.J.G.C.}} 1788. ''Versuch einer Anleitung zur Kenntniss und Geschichte der Thiere und Mineralien. Erster Theil. Allgemeine Geschichte der Natur; besondre der Säugthiere, Vögel, Amphibien und Fische.'' Jena: Akademischen Buchandlung, 528 pp. {{doi|10.5962/bhl.title.79854}}. ==={{int:Additional references}}=== * {{a|Alain Dubois|Dubois, A.}} & {{a|Roger Bour|Bour, R.}} 2010. The distinction between family-series and class-series nomina in zoological nomenclature, with emphasis on the nomina created by Batsch (1788, 1789) and on the higher nomenclature of turtles. ''Bonn zoological Bulletin'' 57 (2): 149–171. {{Fischer, 1817}} {{Gill, 1872}} {{Gray, 1821b}} {{Swainson, 1835}} * {{MSW|14001134}} * {{ITIS|552334|Mustelinae Fischer, 1817}} =={{int:Vernacular names}}== {{VN |eo=Mustelenoj |es=Mustélido |fr=Mustélinés |sv=Järv |pl=Łasice właściwe |tr=Sansarlar |th=วงศ์ย่อยเพียงพอน, วงศ์ย่อยวีเซล }} {{Commons|Category:Mustelinae|Mustelinae}} {{Taxonbar|from=Q27888}} [[Category:August Johann Georg Karl Batsch taxa]] [[Category:Subfamilies]] 2gdus9bk0ewa64u94zm92yj6p7ktoap Cetoniinae 0 4738 11322386 11121273 2026-10-21T21:32:29Z Neferkheperre 947633 /* {{int:Additional references}} */ 11322386 wikitext text/x-wiki =={{int:Taxonavigation}}== [[Image:Cetonia aurata4.jpg|thumb|''[[Cetonia aurata]]'' of the tribe [[Cetoniini]]]] {{Cetoniinae}} Tribus (12): {{trib|Cetoniini}} {{trib|Cremastocheilini}} {{trib|Diplognathini}} {{trib|Goliathini}} {{trib|Gymnetini}} {{trib|Phaedimini}} {{trib|Schizorhinini}} {{trib|Stenotarsiini}} {{trib|Taenioderini}} {{trib|Trichiini}} {{trib|Valgini}} {{triblast|Xiphoscelidini}} ==={{int:Overview of genera}} (502 + 1†)=== {{TOC}} ===A=== {{g|Acanthovalgus}} {{g|Acrothyrea}} {{g|Aethiessa}} {{g|Agestrata}} {{g|Agnorimus}} {{g|Alleucosma}} {{g|Allorrhina}} {{g|Amaurina}} {{g|Amazula}} {{g|Amithao}} {{g|Anacamptorrhina}} {{g|Anagnathocera}} {{g|Analleucosma}} {{g|Anatona}} {{g|Anatonochilus}} {{g|Anelaphinis}} {{g|Anisorrhina}} {{g|Anochilia}} {{g|Anocoela}} {{g|Anoplocheilus}} {{g|Anthracophora}} {{g|Anthracophorides}} {{g|Apeltastes}} {{g|Aphanesthes}} {{g|Aphelinis}} {{g|Apocnosis}} {{g|Apocnosoides}} {{g|Aporecolpa}} {{g|Archedinus}} {{g|Argyripa}} {{g|Arielina}} {{g|Aspilochilus}} {{g|Aspilus}} {{g|Astenorella}} {{g|Asthenorhina}} {{g|Astoxenus}} {{g|Astroscara}} {{g|Atrichelaphinis}} {{glast|Atrichiana}} ===B=== {{g|Bacchusia}} {{g|Badelina}} {{g|Badizoblax}} {{g|Balsameda}} {{g|Basilewskynia}} {{g|Bietia}} {{g|Bisallardiana}} {{g|Bivalgus}} {{g|Blaesia}} {{g|Bombodes}} {{g|Bonoraella}} {{g|Bothrorrhina}} {{g|Brachagenius}} {{g|Brachymacroma}} {{g|Breviclypeus}} {{glast|Bricoptis}} ===C=== {{g|Caelorrhina}} {{g|Callipechis}} {{g|Callophylla}} {{g|Callynomes}} {{g|Calometopidius}} {{g|Calometopus}} {{g|Camapterus}} {{g|Campsiura}} {{g|Campulipes}} {{g|Campulipus}} {{g|Carneluttia}} {{g|Celidota}} {{g|Celidotella}} {{g|Centrantyx}} {{g|Centrochilus}} {{g|Centrognathus}} {{g|Cetonia}} {{g|Chaetodermina}} {{g|Chaetovalgus}} {{g|Chalcopharis}} {{g|Chalcothea}} {{g|Chalcotheomima}} {{g|Charadronota}} {{g|Charitovalgus}} {{g|Cheirolasia}} {{g|Chewia}} {{g|Chiloloba}} {{g|Chiriquibia}} {{g|Chloresthia}} {{g|Chlorixanthe}} {{g|Chlorobapta}} {{g|Chlorocala}} {{g|Chondropyga}} {{g|Chondrorrhina}} {{g|Chromoptilia}} {{g|Chromovalgus}} {{g|Chthonobius}} {{g|Clastocnemis}} {{g|Clerota}} {{g|Clinteria}} {{g|Clinterocera}} {{g|Clinteroides}} {{g|Clithria}} {{g|Coelocorynus}} {{g|Coelocratus}} {{g|Coenochilus}} {{g|Coilodera}} {{g|Compsocephalus}} {{g|Comythovalgus}} {{g|Conradtia}} {{g|Coptomia}} {{g|Coptomiopsis}} {{g|Corynotrichius}} {{g|Cosmesthes}} {{g|Cosmiomorpha}} {{g|Cosmiophaena}} {{g|Cosmovalgus}} {{g|Costinota}} {{g|Cotinis}} {{g|Cremastocheilus}} {{g|Cryptodontus}} {{g|Cyclidiellus}} {{g|Cyclidinus}} {{g|Cyclidius}} {{g|Cymophorus}} {{g|Cyphonocephalus}} {{g|Cyprolais}} {{g|Cyriodera}} {{glast|Cyrtothyrea}} ===D=== {{g|Dasyvalgoides}} {{g|Dasyvalgus}} {{g|Descarpentriesia}} {{g|Desfontainesia}} {{g|Desicasta}} {{g|Dialithus}} {{g|Diaphonia}} {{g|Dicellachilus}} {{g|Dicheros}} {{g|Dichrosoma}} {{g|Dicronocephalus}} {{g|Dicronorhina}} {{g|Digenethle}} {{g|Dilochrosis}} {{g|Diphrontis}} {{g|Diphyllomorpha}} {{g|Diploa}} {{g|Diploeida}} {{g|Diplognatha}} {{g|Dirrhina}} {{g|Dischista}} {{g|Discopeltis}} {{g|Dolichostethus}} {{g|Doryscelis}} {{glast|Dymusia}} ===E=== {{g|Eccoptomia}} {{g|Elaphinis}} {{g|Elpidus}} {{g|Endoxazus}} {{g|Enoplotarsus}} {{g|Epistalagma}} {{g|Epitrichius}} {{g|Epixanthis}} {{g|Eriopeltastes}} {{g|Eriulis}} {{g|Erlangeria}} {{g|Euchilia}} {{g|Euchloropus}} {{g|Euchroea}} {{g|Eudicella}} {{g|Eumacronota}} {{g|Euphoria}} {{g|Eupoecila}} {{g|Euremina}} {{g|Euryomia}} {{g|Euryvalgus}} {{g|Euselates}} {{g|Eutelesmus}} {{glast|Excisivalgus}} ===F=== {{glast|Fornasinius}} ===G=== {{g|Gametis}} {{g|Gametoides}} {{g|Gariep}} {{g|Genuchinus}} {{g|Genuchus}} {{g|Giesbertiolus}} {{g|Glaphyronyx}} {{g|Glycosia}} {{g|Glycyphana}} {{g|Glyptothea}} {{g|Glyptotheomima}} {{g|Gnathocera}} {{g|Gnorimella}} {{g|Gnorimidia}} {{g|Gnorimimelus}} {{g|Gnorimotrichius}} {{g|Gnorimus}} {{g|Goliathopsis}} {{g|Goliathus}} {{g|Golinca}} {{g|Grammopyga}} {{g|Grandaustralis}} {{g|Guatemalica}} {{g|Gymnetina}} {{g|Gymnetis}} {{glast|Gymnophana}} ===H=== {{g|Hadrodiplognatha}} {{g|Hadrosticta}} {{g|Halffterinetis}} {{g|Hegemus}} {{g|Hemiaspidius}} {{g|Hemichalcothea}} {{g|Hemichnoodes}} {{g|Hemiheterorrhina}} {{g|Hemilia}} {{g|Hemipharis}} {{g|Hemiprotaetia}} {{g|Herculaisia}} {{g|Heteralleucosma}} {{g|Heteroclita}} {{g|Heterocnemis Albers|Heterocnemis}} {{g|Heterocotinis}} {{g|Heterocranus}} {{g|Heterogenius}} {{g|Heterophana}} {{g|Heteropseudinca}} {{g|Heterorhina}} {{g|Heterosoma}} {{g|Heterotephraea}} {{g|Heterovalgus}} {{g|Hiberasta}} {{g|Hologymnetis}} {{g|Homothyrea}} {{g|Hoplitovalgus}} {{g|Hoplopyga}} {{g|Hoplopygothrix}} {{g|Howdenypa}} {{g|Hybovalgus}} {{g|Hyphelithia}} {{glast|Hypselogenia}} ===I=== {{g|Ichnestoma}} {{g|Idiovalgus}} {{g|Inca}} {{g|Incala}} {{g|Indognorimus}} {{g|Indotrichius}} {{g|Indovalgus}} {{g|Ingrisma}} {{g|Iridisoma}} {{g|Ischiopsopha}} {{g|Ischnoscelis}} {{g|Ischnostomiella}} {{g|Ischnotarsia}} {{g|Ischnovalgus}} {{glast|Ixorida}} ===J=== {{g|Jansonia}} {{glast|Jumnos}} ===K=== {{g|Kerowagia}} {{glast|Krikkenjanius}} ===L=== {{g|Lamellothyrea}} {{g|Lansbergia}} {{g|Lasiotrichius}} {{g|Laurentiana}} {{g|Lawangia}} {{g|Lecanoderus}} {{g|Lenosoma}} {{g|Lepivalgus}} {{g|Leucocelis}} {{g|Leucochilus}} {{g|Liostraca}} {{g|Liotrichius}} {{g|Lissogenius}} {{g|Lissomelas}} {{g|Lobovalgus}} {{g|Lomaptera}} {{g|Lonchothyrea}} {{g|Lophorrhina}} {{g|Lophorrhinides}} {{g|Lorkovitschia}} {{g|Lucassenia}} {{glast|Lyraphora}} ===M=== {{g|Macrocranius}} {{g|Macromina}} {{g|Macronotops}} {{g|Macrotina}} {{g|Macrotrigonophorus}} {{g|Maneschetocia}} {{g|Marmarina}} {{g|Marmylida}} {{g|Mausoleopsis}} {{g|Mawenzhena}} {{g|Mecaspidiellus}} {{g|Mecynorhina}} {{g|Megaphonia}} {{g|Melanchroea}} {{g|Meridioclita}} {{g|Meroloba}} {{g|Metallesthes}} {{g|Metallopseudinca}} {{g|Meurguesia}} {{g|Micreuchilia}} {{g|Microchalcothea}} {{g|Microdilochrosis}} {{g|Microlomaptera}} {{g|Micropeltus}} {{g|Micropoecila}} {{g|Microvalgus}} {{g|Miksicus}} {{g|Mimovalgus}} {{g|Mireia}} {{g|Molynoptera}} {{g|Molynopteroides}} {{g|Moriaphila}} {{g|Morokia}} {{g|Moseriana}} {{g|Motuotrichius}} {{g|Mycterophallus}} {{g|Mycterophalus}} {{g|Myodermides}} {{g|Myodermidius}} {{g|Myodermum}} {{g|Myrmecochilus}} {{glast|Mystroceros}} ===N=== {{g|Narycius}} {{g|Navigator}} {{g|Neoclithria}} {{g|Neocorvicoana}} {{g|Neomystroceros}} {{g|Neophaedimus}} {{g|Neorrhina}} {{g|Neoscelis}} {{g|Neovalgus}} {{g|Niphetophora}} {{g|Niphobleta}} {{g|Nipponovalgus}} {{g|Nyassinus}} ===O=== {{g|Octocollis}} {{g|Odontorrhina}} {{g|Oedipovalgus}} {{g|Oplostomus}} {{g|Oreoderus}} {{g|Oreovalgus}} {{g|Oroclita}} {{g|Osmoderma}} {{g|Oxypelta}} {{glast|Oxythyrea}} ===P=== {{g|Pachnoda}} {{g|Pachnodoides}} {{g|Paleira}} {{g|Paleopragma}} †{{g|Paleotrichius}} {{g|Panglaphyra}} {{g|Pantodinus}} {{g|Pantolia}} {{g|Parachilia}} {{g|Paracyclidius}} {{g|Paragnorimus}} {{g|Paralleucosma}} {{g|Paranelaphinis}} {{g|Parapilinurgus}} {{g|Paraplectrone}} {{g|Parapoecilophila}} {{g|Paraprotaetia}} {{g|Pararhabdotis}} {{g|Pararhynchocephala}} {{g|Parastraella}} {{g|Paratrichius}} {{g|Paraxeloma}} {{g|Parelaphinis}} {{g|Parepixanthis}} {{g|Pareuchilia}} {{g|Pedinorrhina}} {{g|Penthima}} {{g|Peotoxus}} {{g|Periphanesthes}} {{g|Petrovitzia}} {{g|Phaedimus}} {{g|Phaneresthes}} {{g|Philistina}} {{g|Phonopleurus}} {{g|Phonotaenia}} {{g|Phoxomela}} {{g|Phoxomeloides}} {{g|Pileotrichius}} {{g|Pilinopyga}} {{g|Pilinurgus}} {{g|Placodidus}} {{g|Platygenia}} {{g|Platygeniops}} {{g|Platynocephalus}} {{g|Platysodes}} {{g|Plectrone}} {{g|Pleuronota}} {{g|Plochilia}} {{g|Plochiliana}} {{g|Podopholis}} {{g|Podopogonus}} {{g|Podovalgus}} {{g|Poecilopharis}} {{g|Pogoniotarsus}} {{g|Pogonopus (Arrow)|Pogonopus}} {{g|Pogonotarsus}} {{g|Polyplastus}} {{g|Polystalactica}} {{g|Porphyronota}} {{g|Priscorrhina}} {{g|Problerhinus}} {{g|Protaetia}} {{g|Protaetiomorpha}} {{g|Protochilus}} {{g|Protoclita}} {{g|Pseudagenius}} {{g|Pseudalleucosma}} {{g|Pseudepixanthis}} {{g|Pseudinca}} {{g|Pseudochalcothea}} {{g|Pseudochalcotheomima}} {{g|Pseudoclinteria}} {{g|Pseudoclithria}} {{g|Pseudodiceros}} {{g|Pseudooxythyrea}} {{g|Pseudopilinurgus}} {{g|Pseudoscaptobius}} {{g|Pseudostegopterus}} {{g|Pseudotephraea}} {{g|Pseudotorynorrhina}} {{g|Psilocnemis}} {{g|Ptychodesthes}} {{g|Pygora}} {{g|Pygovalgus}} {{glast|Pyrrhopoda}} ===Q=== {{glast|Quititinus}} ===R=== {{g|Raceloma}} {{g|Reineria}} {{g|Rhabdotis}} {{g|Rhabdotops}} {{g|Rhadinotaenia}} {{g|Rhagopteryx}} {{g|Rhamphorrhina}} {{g|Rhinarion}} {{g|Rhinocoeta}} {{g|Rhomborhina}} {{g|Rhynchocephala}} {{g|Rhyxiphloea}} {{g|Ruteraetia}} {{glast|Ruteroides}} ===S=== {{g|Scaptobius}} {{g|Scheinia}} {{g|Schizorhina}} {{g|Schochidia}} {{g|Scythropesthes}} {{g|Simorrhina}} {{g|Smicorhina}} {{g|Somalibia}} {{g|Spelaiorrhina}} {{g|Sphinctovalgus}} {{g|Spilophorus}} {{g|Stalagmosoma}} {{g|Stegopterus}} {{g|Stenonota}} {{g|Stenopisthes}} {{g|Stenotarsia}} {{g|Stephanorrhina}} {{g|Sternoplus}} {{g|Stethodesma}} {{g|Stethopseudinca}} {{g|Storeyus}} {{g|Stripsipher}} {{g|Synistovalgus}} {{glast|Systellorrhina}} ===T=== {{g|Taeniodera}} {{g|Tafaia}} {{g|Tapinoschema}} {{g|Tarsovalgus}} {{g|Taurhina}} {{g|Telochilus}} {{g|Tephraea}} {{g|Tetragonorrhina}} {{g|Tetraodorhina}} {{g|Thaumastopeus}} {{g|Theodosia}} {{g|Thyreogonia}} {{g|Tiarocera}} {{g|Tibiotrichius}} {{g|Tibiovalgus}} {{g|Tmesorrhina}} {{g|Torynorrhina}} {{g|Trichaulax (Kraatz)|Trichaulax}} {{g|Trichiotinus}} {{g|Trichius}} {{g|Trichocephala}} {{g|Trichoneptunides}} {{g|Trichoplus}} {{g|Trichostetha}} {{g|Trigonopeltastes}} {{g|Trigonophorinus}} {{g|Trigonophorus}} {{g|Triplognatha}} {{g|Trogodes}} {{g|Tropinota}} {{glast|Trymodera}} ===U=== {{glast|Uloptera}} ===V=== {{g|Vadonidella}} {{g|Valgoides}} {{g|Valgus}} {{glast|Vieuella}} ===W=== {{glast|Widagdous}} ===X=== {{g|Xeloma}} {{g|Xenoloba}} {{g|Xenoreoderus}} {{g|Xiphoscelis}} {{glast|Xiphosceloides}} ===Y=== {{glast|Yanovalgus}} ===Z=== {{glast|Zebinus}} =={{int:Name}}== {{BASEPAGENAME}} {{a|William Elford Leach|Leach}}, 1815: {{BHL|page/17493589|99}} * '''Type genus''': ''[[Cetonia]]'' {{a|Johan Christian Fabricius|Fabricius}}, 1775. =={{int:References}}== ==={{int:Primary references}}=== {{Leach, 1815}} ==={{int:Additional references}}=== {{Zt3668.1.1}} {{Zt3790.2.3}} * {{aut|Drumont, A.}}, 1996: Description d’une nouvelle espèce de ''Brachymitra'' de Tanzanie (Coleoptera, Cetoniidae). ''Coléoptères'' '''2 (5)''': 48–51. * {{aut|Drumont, A.}}, 1996: Présentation et description d’une forme nouvelle entièrement mélanique de ''Dicellachillus woodi'' (Coleoptera, Scarabaeoidea, Cetoniidae). ''Lambillionea'' '''96 (3)''': 463–464. {{Jákl, 2011}} * {{aut|Krikken, J.}} 1984: A new key to the suprageneric taxa in the beetle family Cetoniidae, with annotated lists of the known genera. ''Zoologische verhandelingen'', (210) [https://www.repository.naturalis.nl/document/149064 PDF] * {{aut|Micó, E.}} ''et al''. 2008: Larval morphology enhances phylogenetic reconstruction in Cetoniidae (Coleoptera: Scarabaeoidea) and allows the interpretation of the evolution of larval feeding habits. ''Systematic entomology'', 33(1): 128–144. {{doi|10.1111/j.1365-3113.2007.00399.x}} [https://web.archive.org/web/20170809124633/http://www.scarabeidi.it/documenti/Mico_2007_Cetonid_phylogeny.pdf PDF] {{Moeseneder & Hutchinson, 2016}} * {{aut|Özdikmen, H.}}; {{aut|Turgut, S.}} 2009: ''Miksicus'' nom. nov., a replacement name for the preoccupied beetle genus ''Urbania'' Mikšic, 1963 (Coleoptera: Scarabaeoidea: Cetoniidae). ''Entomological news'', 120: 227–229. {{doi|10.3157/021.120.0217}} {{Perissinotto, Clennell & Beinhundner, 2019}} {{Serrano, 2022}} {{Serrano et al., 2020a}} {{Šípek & Král, 2012}} * {{aut|Smith, A.B.T.}} 2006: A review of the family-group names for the superfamily Scarabaeoidea (Coleoptera) with corrections to nomenclature and a current classification. ''Coleopterists Society monograph'', 5: 144–204.[https://www.zin.ru/ANIMALIA/COLEOPTERA/pdf/smith2006.pdf] * [https://www.zin.ru/ANIMALIA/COLEOPTERA/eng/cetonii.htm Subfamily Cetoniinae (Scarabaeidae) - atlas of scarab beetles of Russia] * [https://web.archive.org/web/20110101023340/http://www.apollobooks.com/PDF/IndexCatPalCol3.pdf Catalogue of Palearctic Coleoptera. Vol. 3 ed. {{aut|I. Lobl & A. Smetana}}, Apollo Books, Stenstrup, Denmark, 2006]<br />{{ISBN|87-88757-59-5}}, p.283 ==={{int:Links}}=== * [https://www.nhm.ac.uk/resources-rx/files/cetoniinae-nhm-collection-90694.xls NHM (London) collection holdings] =={{int:Vernacular names}}== {{VN |af=Vrugtetorre |be=Бронзаўкі |cs=Zlatohlávkovití |de=Rosenkäfer |en=Flower chafer |hu=Virágbogárformák |ja=ハナムグリ亜科 |ka=ბრინჯაოსნები |ko=꽃무지아과 |no=Gullbasser |ru=Бронзовки |sv=Guldbaggar |zh=花金龜亞科 }} {{commonscat}} {{Taxonbar}} [[Category: William Elford Leach taxa]] m3nb40rqj7loti1ylxr5x6a45arsriw Beijerinckiaceae 0 5147 11322931 11106680 2026-10-22T09:58:13Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322931 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Beijerinckiaceae}} Genera: {{g|Beijerinckia}} {{g|Camelimonas}} {{g|Chelatococcus}} {{g|Methylocapsa}} {{g|Methylocella}} {{g|Methyloferula}} {{g|Methylorosula}} {{g|Methylovirgula}} {{glast|Pseudochelatococcus}} =={{int:Name}}== Beijerinckiaceae =={{int:References}}== * {{NCBI|45404}} * [https://www.ebi.ac.uk/ena/data/view/Taxon:45404 European Nucleotide Archive] * {{WoRMS|id=571009}} {{Taxonbar|from=Q814707}} [[Category:Eponyms of Martinus Beijerinck]] fve4afazb5l0m733r4ksnkvqg6cttu1 Moschidae 0 6052 11322559 10981936 2026-10-22T03:37:51Z The editor 2345 2915305 /* Taxonavigation */ 11322559 wikitext text/x-wiki {{Image|Moschus moschiferus in Plzen zoo (12.02.2011).jpg|''[[Moschus moschiferus]]''}} =={{int:Taxonavigation}}== {{Moschidae}} Genera (1 + †2): †{{g|Hispanomeryx}} †{{g|Pomelomeryx}} †{{g|Micromeryx}} {{glast|Moschus}} =={{int:Name}}== Moschidae {{a|John Edward Gray|J. E. Gray}}, 1821 * {{int:Type genus}}: ''Moschus'' {{aut|Linnaeus}}, 1758 =={{int:References}}== ==={{int:Primary references}}=== {{Gray, 1821b}} ==={{int:Links}}=== *{{MSW|14200185}} =={{int:Vernacular names}}== {{VN |de=Moschushirsche |el=Μοσχίδες |en=Musk deer |fi=Myskihirvet |fr=Cerfs Porte-musc |frr=Moschusdiarten |he=איילי מושק |hu=Pézsmaszarvasfélék |ko=사향노루과 |pt=Cervos-almiscarados/Mosquídeos |ru=Кабарговые |sr=Мошусни јелени |sv=Myskhjortar |tr=Misk geyiğigiller |th=กวางชะมด |uk=Кабаргові }} {{Commons|Category:Moschidae|Moschidae}} {{Taxonbar|from=Q229084}} [[Category:John Edward Gray taxa]] 9ih2ndiwhk51vt8fts1dxi7oy65mooo 11322560 11322559 2026-10-22T03:37:58Z The editor 2345 2915305 11322560 wikitext text/x-wiki {{Image|Moschus moschiferus in Plzen zoo (12.02.2011).jpg|''[[Moschus moschiferus]]''}} =={{int:Taxonavigation}}== {{Moschidae}} Genera (1 + †2): †{{g|Hispanomeryx}} †{{g|Micromeryx}} {{glast|Moschus}} =={{int:Name}}== Moschidae {{a|John Edward Gray|J. E. Gray}}, 1821 * {{int:Type genus}}: ''Moschus'' {{aut|Linnaeus}}, 1758 =={{int:References}}== ==={{int:Primary references}}=== {{Gray, 1821b}} ==={{int:Links}}=== *{{MSW|14200185}} =={{int:Vernacular names}}== {{VN |de=Moschushirsche |el=Μοσχίδες |en=Musk deer |fi=Myskihirvet |fr=Cerfs Porte-musc |frr=Moschusdiarten |he=איילי מושק |hu=Pézsmaszarvasfélék |ko=사향노루과 |pt=Cervos-almiscarados/Mosquídeos |ru=Кабарговые |sr=Мошусни јелени |sv=Myskhjortar |tr=Misk geyiğigiller |th=กวางชะมด |uk=Кабаргові }} {{Commons|Category:Moschidae|Moschidae}} {{Taxonbar|from=Q229084}} [[Category:John Edward Gray taxa]] k14kt1lhq264xp43ucoeflburcbxsz3 Thuja 0 8047 11322232 10874220 2026-10-21T19:06:01Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322232 wikitext text/x-wiki {{image|Northern Whitecedar (Thuja occidentalis) - Algonquin Provincial Park, Ontario 2019-09-20.jpg|''[[Thuja occidentalis]]'', Algonquin Provincial Park, Ontario, Canada}} =={{int:Taxonavigation}}== {{Thuja}} Species: {{sp|T|huja|koraiensis}} {{sp|T|huja|occidentalis}} {{sp|T|huja|plicata}} {{sp|T|huja|standishii}} {{splast|T|huja|sutchuenensis}} =={{int:Name}}== ''Thuja'' {{a|Carolus Linnaeus|L.}}, Sp. Pl. 2: 1002. (1753) * {{int:Type species}}: ''Thuja occidentalis'' L., Sp. Pl. 2: 1002. (1753) =={{int:References}}== {{LSP1|1002}} {{WCSP|2017|Feb.|25}} {{IPNI||2017|Feb. 25}} {{MBG|2017|Feb.|25}} =={{int:Vernacular names}}== {{VN |be=Туя |de=Lebensbaum |en=Arborvitae, Thuja |et=Elupuu |eu=Tuia |fi=Tuijat |hu=Tuja |io=Tuyo |it=Tuia |mk=Туја |nl=Levensboom |pl=Żywotnik, Tuja |ro=Tuia |ru=Туя |tr=Mazı |zh=崖柏属 }} {{Commonscat|Thuja}} {{Taxonbar}} [[Category:Carolus Linnaeus taxa]] o3am1p8p5gvu70feh7gue52jrjvf64d Wilson 0 11076 11322253 11197900 2026-10-21T19:21:16Z Burmeister 9074 +1 11322253 wikitext text/x-wiki {{Refer|authority}} * [[Albert Wilson]] (1862–1949, '''A.Wilson'''), British {{int:bryologist}} {{int:and}} {{int:lichenologist}} * [[Alexander Wilson]] (1766–1813), Scottish-born U.S. illustrator, naturalist {{int:and}} ornithologist * [[Alfred Gurney Wilson]] (1878–1957, '''A.G.Wilson'''), botanist (Orchidaceae) * [[Alice Evelyn Wilson]] (1881–1964, '''A.E.Wilson'''), Canadian palaeontologist * [[Ann E. Wilson]], microbiologist * [[Andrew W. Wilson]] ([[Floruit|fl.]] 2004, '''A.W.Wilson'''), botanist * [[Annette Jane Gratton Wilson]] ({{int:born}} 1960, '''A.J.G.Wilson'''), botanist * [[Barbara Lynn Wilson]] ({{int:born}} 1951, '''B.L.Wilson'''), botanist * [[Barry Robert Wilson]] (1935–2017), Australian malacologist * [[Brent Wilson]], ostracodologist * [[Byron S. Wilson]], herpetologist * [[Carol Anne Wilson]] (fl. 2004, '''C.A.Wilson'''), U.S. botanist * [[Charles Branch Wilson]] (1861–1941), U.S. marine-biologist * [[Christine Elizabeth Wilson]] (fl. 2016, '''C.E.Wilson'''), U.S. botanist * [[Christopher A. Wilson]], Australian ornithologist * [[Christopher Grey-Wilson]] ({{int:born}} 1944, '''Grey-Wilson'''), English botanist * [[Don Ellis Wilson]] ({{int:born}} 1944), U.S. mammalogist * [[Edmund Beecher Wilson]] (1856–1939), U.S. zoologist * [[Edward Osborne Wilson]], U.S. biologist * [[Ernest Henry Wilson]] (1876–1930, '''E.H.Wilson'''), British botanist * [[F. Douglas Wilson]] (fl. 1963, '''F.D.Wilson'''), botanist * [[Francis Erasmus Wilson]] (1888–1960), Australian entomologist * [[Francis Robert Muter Wilson]] (1831–1903, '''F.Wilson'''), Australian lichenologist * [[G.B. Wilson]] ('''G.B.Wilson'''), mycologist * [[Gary Whittaker Wilson]] ('''Gary W.Wilson'''), Australian botanist * [[George D.F. Wilson]], carcinologist * [[George Fergusson Wilson]] (1822–1902, '''G.F.Wilson'''), British botanist * [[George Fox Wilson]] (1896–1951), English entomologist, botanist * [[Gregory Philip Wilson Mantilla]], palaeontologist * [[Hannah F. Wilson]] (fl. 2014), arachnologist * [[Harriet L. Wilson]] ('''H.L.Wilson'''), phycologist * [[Harley Frost Wilson]] (1883-?), U.S.entomologist * [[Henry Van Peters Wilson]] (1863–1939), U.S. invertebrate zoologist * [[Heather M. Wilson]], palaeontologist * [[Hugh Dale Wilson]] ('''H.D.Wilson'''), New Zealand botanist * [[Hugh Daniel Wilson]] (1943–2018, '''H.Dan.Wilson'''), U.S. botanist * [[Irene M. Wilson]] (fl. 1954, '''I.M.Wilson'''), mycologist * [[Jane Wilson]] (fl. 1990), collembologist * [[Jeffrey Alan Wilson Mantilla]] ('''Jeffrey A. Wilson'''), U.S. palaeontologist * [[Jeremy Dean Wilson]], Australian arachnologist * [[John Andrew Wilson]] (1914-2008), US palaeontologist * [[John Bracebridge Wilson]] (1828–1895, '''J.B.Wilson'''), Australian naturalist, phycologist * [[Joseph S. Wilson]], U.S. entomologist * [[K.S. Wilson]] (fl. 1960, '''K.S.Wilson'''), mycologist * [[Karen Louise Wilson]], '''K.L.Wilson''', Australian botanist * [[Keith Duncan Peter Wilson]], entomologist * [[Larry David Wilson]], U.S. herpetologist * [[Leonard Richard Wilson]] (1906–1998, '''L.R.Wilson'''), U.S. botanist * [[Lyle Wilson]] (fl. 2019), South African herpetologist * [[Mark Wilson]] ({{int:born}} 1964, '''Mark Wilson'''), botanist * [[Mark A. Wilson]], U.S. paleontologist and geologist * [[Mark V. H. Wilson]] ({{int:born}} 1946), Canadian palaeontologist {{int:and}} ichthyologist * [[Megan Mey Wilson]] ('''M.M.Wilson'''), U.S. entomologist and mycologist * [[Michael R. Wilson]], British entomologist (Hemiptera) * [[Nerida Gaye Wilson]], Australian malacologist * [[Oscar Edward Wilson]], Finish paleontologist * [[Paul Graham Wilson]] ({{int:born}} 1928, '''Paul G.Wilson'''), Australian botanist * [[Paul Siri Wilson]] ({{int:born}} 1965, '''P.S.Wilson'''), botanist * [[Percy Wilson]] (1879–1944, '''P.Wilson'''), U.S. botanist * [[Peter Gordon Wilson]] ({{int:born}} 1950, '''Peter G.Wilson'''), Australian botanist * [[Peter R. Wilson]] (fl. 2021), Australian entomologist * [[Robert Gardner Wilson]] (1911–?, '''R.G.Wilson'''), botanist * [[Robert Warren Wilson]], U.S. geologist {{int:and}} paleontologist * [[Robin S. Wilson]], Australian {{int:annelidologist}} * [[Rosemary Wilson]] ('''R.Wilson'''), botanist * [[Ruby K. Wilson]] (fl. 2014, '''R.K.Wilson'''), botanist * [[Sarah Marie Wilson]] ('''S.M.Wilson'''), phycologist * [[Scott Barchard Wilson]] (1865–1923), British ornithologist * [[Stephen W. Wilson]], U.S. entomologist * [[Steve K. Wilson]], Australian herpetologist * [[Trevor C. Wilson]] (fl. 2012, '''T.C.Wilson'''), botanist * [[William M. Wilson]] (1799–1871, '''Wilson'''), English botanist {{int:and}} {{int:bryologist}} {{Disambiguation|cat=people}} res1nh5wlq8dlj444s87c63toe4jrhj 11322290 11322253 2026-10-21T20:01:30Z The editor 2345 2915305 /* */ 11322290 wikitext text/x-wiki {{Refer|authority}} * [[Albert Wilson]] (1862–1949, '''A.Wilson'''), British {{int:bryologist}} {{int:and}} {{int:lichenologist}} * [[Alexander Wilson]] (1766–1813), Scottish-born U.S. illustrator, naturalist {{int:and}} ornithologist * [[Alfred Gurney Wilson]] (1878–1957, '''A.G.Wilson'''), botanist (Orchidaceae) * [[Alice Evelyn Wilson]] (1881–1964, '''A.E.Wilson'''), Canadian palaeontologist * [[Ann E. Wilson]], microbiologist * [[Andrew W. Wilson]] ([[Floruit|fl.]] 2004, '''A.W.Wilson'''), botanist * [[Annette Jane Gratton Wilson]] ({{int:born}} 1960, '''A.J.G.Wilson'''), botanist * [[Barbara Lynn Wilson]] ({{int:born}} 1951, '''B.L.Wilson'''), botanist * [[Barry Robert Wilson]] (1935–2017), Australian malacologist * [[Brent Wilson]], ostracodologist * [[Byron S. Wilson]], herpetologist * [[Carol Anne Wilson]] (fl. 2004, '''C.A.Wilson'''), U.S. botanist * [[Charles Branch Wilson]] (1861–1941), U.S. marine-biologist * [[Christine Elizabeth Wilson]] (fl. 2016, '''C.E.Wilson'''), U.S. botanist * [[Christopher A. Wilson]], Australian ornithologist * [[Christopher Grey-Wilson]] ({{int:born}} 1944, '''Grey-Wilson'''), English botanist * [[Don Ellis Wilson]] ({{int:born}} 1944), U.S. mammalogist * [[Edmund Beecher Wilson]] (1856–1939), U.S. zoologist * [[Edward Osborne Wilson]], U.S. biologist * [[Ernest Henry Wilson]] (1876–1930, '''E.H.Wilson'''), British botanist * [[F. Douglas Wilson]] (fl. 1963, '''F.D.Wilson'''), botanist * [[Francis Erasmus Wilson]] (1888–1960), Australian entomologist * [[Francis Robert Muter Wilson]] (1831–1903, '''F.Wilson'''), Australian lichenologist * [[G.B. Wilson]] ('''G.B.Wilson'''), mycologist * [[Gary Whittaker Wilson]] ('''Gary W.Wilson'''), Australian botanist * [[George D.F. Wilson]], carcinologist * [[George Fergusson Wilson]] (1822–1902, '''G.F.Wilson'''), British botanist * [[George Fox Wilson]] (1896–1951), English entomologist, botanist * [[Gregory Philip Wilson Mantilla]], palaeontologist * [[Hannah F. Wilson]] (fl. 2014), arachnologist * [[Harriet L. Wilson]] ('''H.L.Wilson'''), phycologist * [[Harley Frost Wilson]] (1883-?), U.S.entomologist * [[Henry Van Peters Wilson]] (1863–1939), U.S. invertebrate zoologist * [[Heather M. Wilson]], palaeontologist * [[Hugh Dale Wilson]] ('''H.D.Wilson'''), New Zealand botanist * [[Hugh Daniel Wilson]] (1943–2018, '''H.Dan.Wilson'''), U.S. botanist * [[Irene M. Wilson]] (fl. 1954, '''I.M.Wilson'''), mycologist * [[Jane Wilson]] (fl. 1990), collembologist * [[Jeffrey Alan Wilson Mantilla]] ('''Jeffrey A. Wilson'''), U.S. palaeontologist * [[Jeremy Dean Wilson]], Australian arachnologist * [[John Andrew Wilson]] (1914-2008), US palaeontologist * [[John Bracebridge Wilson]] (1828–1895, '''J.B.Wilson'''), Australian naturalist, phycologist * [[Joseph S. Wilson]], U.S. entomologist * [[K.S. Wilson]] (fl. 1960, '''K.S.Wilson'''), mycologist * [[Karen Louise Wilson]], '''K.L.Wilson''', Australian botanist * [[Keith Duncan Peter Wilson]], entomologist * [[Larry David Wilson]], U.S. herpetologist * [[Leonard Richard Wilson]] (1906–1998, '''L.R.Wilson'''), U.S. botanist * [[Lyle Wilson]] (fl. 2019), South African herpetologist * [[Mark Wilson]] ({{int:born}} 1964, '''Mark Wilson'''), botanist * [[Mark A. Wilson]], U.S. paleontologist and geologist * [[Mark V. H. Wilson]] ({{int:born}} 1946), Canadian palaeontologist {{int:and}} ichthyologist * [[Megan Mey Wilson]] ('''M.M.Wilson'''), U.S. entomologist and mycologist * [[Michael R. Wilson]], British entomologist (Hemiptera) * [[Nerida Gaye Wilson]], Australian malacologist * [[Oscar Edward Wilson]], paleontologist * [[Paul Graham Wilson]] ({{int:born}} 1928, '''Paul G.Wilson'''), Australian botanist * [[Paul Siri Wilson]] ({{int:born}} 1965, '''P.S.Wilson'''), botanist * [[Percy Wilson]] (1879–1944, '''P.Wilson'''), U.S. botanist * [[Peter Gordon Wilson]] ({{int:born}} 1950, '''Peter G.Wilson'''), Australian botanist * [[Peter R. Wilson]] (fl. 2021), Australian entomologist * [[Robert Gardner Wilson]] (1911–?, '''R.G.Wilson'''), botanist * [[Robert Warren Wilson]], U.S. geologist {{int:and}} paleontologist * [[Robin S. Wilson]], Australian {{int:annelidologist}} * [[Rosemary Wilson]] ('''R.Wilson'''), botanist * [[Ruby K. Wilson]] (fl. 2014, '''R.K.Wilson'''), botanist * [[Sarah Marie Wilson]] ('''S.M.Wilson'''), phycologist * [[Scott Barchard Wilson]] (1865–1923), British ornithologist * [[Stephen W. Wilson]], U.S. entomologist * [[Steve K. Wilson]], Australian herpetologist * [[Trevor C. Wilson]] (fl. 2012, '''T.C.Wilson'''), botanist * [[William M. Wilson]] (1799–1871, '''Wilson'''), English botanist {{int:and}} {{int:bryologist}} {{Disambiguation|cat=people}} ly061y1e46pjv42fgm8wjnplerqdwme 11322405 11322290 2026-10-21T22:01:40Z The editor 2345 2915305 11322405 wikitext text/x-wiki {{Refer|authority}} * [[Albert Wilson]] (1862–1949, '''A.Wilson'''), British {{int:bryologist}} {{int:and}} {{int:lichenologist}} * [[Alexander Wilson]] (1766–1813), Scottish-born U.S. illustrator, naturalist {{int:and}} ornithologist * [[Alfred Gurney Wilson]] (1878–1957, '''A.G.Wilson'''), botanist (Orchidaceae) * [[Alice Evelyn Wilson]] (1881–1964, '''A.E.Wilson'''), Canadian palaeontologist * [[Ann E. Wilson]], microbiologist * [[Andrew W. Wilson]] ([[Floruit|fl.]] 2004, '''A.W.Wilson'''), botanist * [[Annette Jane Gratton Wilson]] ({{int:born}} 1960, '''A.J.G.Wilson'''), botanist * [[Barbara Lynn Wilson]] ({{int:born}} 1951, '''B.L.Wilson'''), botanist * [[Barry Robert Wilson]] (1935–2017), Australian malacologist * [[Brent Wilson]], ostracodologist * [[Byron S. Wilson]], herpetologist * [[Carol Anne Wilson]] (fl. 2004, '''C.A.Wilson'''), U.S. botanist * [[Charles Branch Wilson]] (1861–1941), U.S. marine-biologist * [[Christine Elizabeth Wilson]] (fl. 2016, '''C.E.Wilson'''), U.S. botanist * [[Christopher A. Wilson]], Australian ornithologist * [[Christopher Grey-Wilson]] ({{int:born}} 1944, '''Grey-Wilson'''), English botanist * [[Don Ellis Wilson]] ({{int:born}} 1944), U.S. mammalogist * [[Edmund Beecher Wilson]] (1856–1939), U.S. zoologist * [[Edward Osborne Wilson]], U.S. biologist * [[Ernest Henry Wilson]] (1876–1930, '''E.H.Wilson'''), British botanist * [[F. Douglas Wilson]] (fl. 1963, '''F.D.Wilson'''), botanist * [[Francis Erasmus Wilson]] (1888–1960), Australian entomologist * [[Francis Robert Muter Wilson]] (1831–1903, '''F.Wilson'''), Australian lichenologist * [[G.B. Wilson]] ('''G.B.Wilson'''), mycologist * [[Gary Whittaker Wilson]] ('''Gary W.Wilson'''), Australian botanist * [[George D.F. Wilson]], carcinologist * [[George Fergusson Wilson]] (1822–1902, '''G.F.Wilson'''), British botanist * [[George Fox Wilson]] (1896–1951), English entomologist, botanist * [[Gregory Philip Wilson Mantilla]], palaeontologist * [[Hannah F. Wilson]] (fl. 2014), arachnologist * [[Harriet L. Wilson]] ('''H.L.Wilson'''), phycologist * [[Harley Frost Wilson]] (1883-?), U.S.entomologist * [[Henry Van Peters Wilson]] (1863–1939), U.S. invertebrate zoologist * [[Heather M. Wilson]], palaeontologist * [[Hugh Dale Wilson]] ('''H.D.Wilson'''), New Zealand botanist * [[Hugh Daniel Wilson]] (1943–2018, '''H.Dan.Wilson'''), U.S. botanist * [[Irene M. Wilson]] (fl. 1954, '''I.M.Wilson'''), mycologist * [[Jane Wilson]] (fl. 1990), collembologist * [[Jeffrey Alan Wilson Mantilla]] ('''Jeffrey A. Wilson'''), U.S. palaeontologist * [[Jeremy Dean Wilson]], Australian arachnologist * [[John Andrew Wilson]] (1914-2008), US palaeontologist * [[John Bracebridge Wilson]] (1828–1895, '''J.B.Wilson'''), Australian naturalist, phycologist * [[Joseph S. Wilson]], U.S. entomologist * [[K.S. Wilson]] (fl. 1960, '''K.S.Wilson'''), mycologist * [[Karen Louise Wilson]], '''K.L.Wilson''', Australian botanist * [[Keith Duncan Peter Wilson]], entomologist * [[Larry David Wilson]], U.S. herpetologist * [[Leonard Richard Wilson]] (1906–1998, '''L.R.Wilson'''), U.S. botanist * [[Lyle Wilson]] (fl. 2019), South African herpetologist * [[Mark Wilson]] ({{int:born}} 1964, '''Mark Wilson'''), botanist * [[Mark A. Wilson]], U.S. paleontologist and geologist * [[Mark V. H. Wilson]] ({{int:born}} 1946), Canadian palaeontologist {{int:and}} ichthyologist * [[Megan Mey Wilson]] ('''M.M.Wilson'''), U.S. entomologist and mycologist * [[Michael R. Wilson]], British entomologist (Hemiptera) * [[Nerida Gaye Wilson]], Australian malacologist * [[Oscar Edward Wilson]], English paleontologist * [[Paul Graham Wilson]] ({{int:born}} 1928, '''Paul G.Wilson'''), Australian botanist * [[Paul Siri Wilson]] ({{int:born}} 1965, '''P.S.Wilson'''), botanist * [[Percy Wilson]] (1879–1944, '''P.Wilson'''), U.S. botanist * [[Peter Gordon Wilson]] ({{int:born}} 1950, '''Peter G.Wilson'''), Australian botanist * [[Peter R. Wilson]] (fl. 2021), Australian entomologist * [[Robert Gardner Wilson]] (1911–?, '''R.G.Wilson'''), botanist * [[Robert Warren Wilson]], U.S. geologist {{int:and}} paleontologist * [[Robin S. Wilson]], Australian {{int:annelidologist}} * [[Rosemary Wilson]] ('''R.Wilson'''), botanist * [[Ruby K. Wilson]] (fl. 2014, '''R.K.Wilson'''), botanist * [[Sarah Marie Wilson]] ('''S.M.Wilson'''), phycologist * [[Scott Barchard Wilson]] (1865–1923), British ornithologist * [[Stephen W. Wilson]], U.S. entomologist * [[Steve K. Wilson]], Australian herpetologist * [[Trevor C. Wilson]] (fl. 2012, '''T.C.Wilson'''), botanist * [[William M. Wilson]] (1799–1871, '''Wilson'''), English botanist {{int:and}} {{int:bryologist}} {{Disambiguation|cat=people}} trenuyjdfv0hz29wlan29yytfforl6d 11322410 11322405 2026-10-21T22:03:26Z The editor 2345 2915305 /* */ 11322410 wikitext text/x-wiki {{Refer|authority}} * [[Albert Wilson]] (1862–1949, '''A.Wilson'''), Irish {{int:bryologist}} {{int:and}} {{int:lichenologist}} * [[Alexander Wilson]] (1766–1813), Scottish-born U.S. illustrator, naturalist {{int:and}} ornithologist * [[Alfred Gurney Wilson]] (1878–1957, '''A.G.Wilson'''), botanist (Orchidaceae) * [[Alice Evelyn Wilson]] (1881–1964, '''A.E.Wilson'''), Canadian palaeontologist * [[Ann E. Wilson]], microbiologist * [[Andrew W. Wilson]] ([[Floruit|fl.]] 2004, '''A.W.Wilson'''), botanist * [[Annette Jane Gratton Wilson]] ({{int:born}} 1960, '''A.J.G.Wilson'''), botanist * [[Barbara Lynn Wilson]] ({{int:born}} 1951, '''B.L.Wilson'''), botanist * [[Barry Robert Wilson]] (1935–2017), Australian malacologist * [[Brent Wilson]], ostracodologist * [[Byron S. Wilson]], herpetologist * [[Carol Anne Wilson]] (fl. 2004, '''C.A.Wilson'''), U.S. botanist * [[Charles Branch Wilson]] (1861–1941), U.S. marine-biologist * [[Christine Elizabeth Wilson]] (fl. 2016, '''C.E.Wilson'''), U.S. botanist * [[Christopher A. Wilson]], Australian ornithologist * [[Christopher Grey-Wilson]] ({{int:born}} 1944, '''Grey-Wilson'''), English botanist * [[Don Ellis Wilson]] ({{int:born}} 1944), U.S. mammalogist * [[Edmund Beecher Wilson]] (1856–1939), U.S. zoologist * [[Edward Osborne Wilson]], U.S. biologist * [[Ernest Henry Wilson]] (1876–1930, '''E.H.Wilson'''), British botanist * [[F. Douglas Wilson]] (fl. 1963, '''F.D.Wilson'''), botanist * [[Francis Erasmus Wilson]] (1888–1960), Australian entomologist * [[Francis Robert Muter Wilson]] (1831–1903, '''F.Wilson'''), Australian lichenologist * [[G.B. Wilson]] ('''G.B.Wilson'''), mycologist * [[Gary Whittaker Wilson]] ('''Gary W.Wilson'''), Australian botanist * [[George D.F. Wilson]], carcinologist * [[George Fergusson Wilson]] (1822–1902, '''G.F.Wilson'''), British botanist * [[George Fox Wilson]] (1896–1951), English entomologist, botanist * [[Gregory Philip Wilson Mantilla]], palaeontologist * [[Hannah F. Wilson]] (fl. 2014), arachnologist * [[Harriet L. Wilson]] ('''H.L.Wilson'''), phycologist * [[Harley Frost Wilson]] (1883-?), U.S.entomologist * [[Henry Van Peters Wilson]] (1863–1939), U.S. invertebrate zoologist * [[Heather M. Wilson]], palaeontologist * [[Hugh Dale Wilson]] ('''H.D.Wilson'''), New Zealand botanist * [[Hugh Daniel Wilson]] (1943–2018, '''H.Dan.Wilson'''), U.S. botanist * [[Irene M. Wilson]] (fl. 1954, '''I.M.Wilson'''), mycologist * [[Jane Wilson]] (fl. 1990), collembologist * [[Jeffrey Alan Wilson Mantilla]] ('''Jeffrey A. Wilson'''), U.S. palaeontologist * [[Jeremy Dean Wilson]], Australian arachnologist * [[John Andrew Wilson]] (1914-2008), US palaeontologist * [[John Bracebridge Wilson]] (1828–1895, '''J.B.Wilson'''), Australian naturalist, phycologist * [[Joseph S. Wilson]], U.S. entomologist * [[K.S. Wilson]] (fl. 1960, '''K.S.Wilson'''), mycologist * [[Karen Louise Wilson]], '''K.L.Wilson''', Australian botanist * [[Keith Duncan Peter Wilson]], entomologist * [[Larry David Wilson]], U.S. herpetologist * [[Leonard Richard Wilson]] (1906–1998, '''L.R.Wilson'''), U.S. botanist * [[Lyle Wilson]] (fl. 2019), South African herpetologist * [[Mark Wilson]] ({{int:born}} 1964, '''Mark Wilson'''), botanist * [[Mark A. Wilson]], U.S. paleontologist and geologist * [[Mark V. H. Wilson]] ({{int:born}} 1946), Canadian palaeontologist {{int:and}} ichthyologist * [[Megan Mey Wilson]] ('''M.M.Wilson'''), U.S. entomologist and mycologist * [[Michael R. Wilson]], British entomologist (Hemiptera) * [[Nerida Gaye Wilson]], Australian malacologist * [[Oscar Edward Wilson]], English paleontologist * [[Paul Graham Wilson]] ({{int:born}} 1928, '''Paul G.Wilson'''), Australian botanist * [[Paul Siri Wilson]] ({{int:born}} 1965, '''P.S.Wilson'''), botanist * [[Percy Wilson]] (1879–1944, '''P.Wilson'''), U.S. botanist * [[Peter Gordon Wilson]] ({{int:born}} 1950, '''Peter G.Wilson'''), Australian botanist * [[Peter R. Wilson]] (fl. 2021), Australian entomologist * [[Robert Gardner Wilson]] (1911–?, '''R.G.Wilson'''), botanist * [[Robert Warren Wilson]], U.S. geologist {{int:and}} paleontologist * [[Robin S. Wilson]], Australian {{int:annelidologist}} * [[Rosemary Wilson]] ('''R.Wilson'''), botanist * [[Ruby K. Wilson]] (fl. 2014, '''R.K.Wilson'''), botanist * [[Sarah Marie Wilson]] ('''S.M.Wilson'''), phycologist * [[Scott Barchard Wilson]] (1865–1923), British ornithologist * [[Stephen W. Wilson]], U.S. entomologist * [[Steve K. Wilson]], Australian herpetologist * [[Trevor C. Wilson]] (fl. 2012, '''T.C.Wilson'''), botanist * [[William M. Wilson]] (1799–1871, '''Wilson'''), English botanist {{int:and}} {{int:bryologist}} {{Disambiguation|cat=people}} dvrz9v58gyvan7bkjcild0nyly09ekg 11322412 11322410 2026-10-21T22:04:32Z The editor 2345 2915305 /* */ 11322412 wikitext text/x-wiki {{Refer|authority}} * [[Albert Wilson]] (1862–1949, '''A.Wilson'''), Irish {{int:bryologist}} {{int:and}} {{int:lichenologist}} * [[Alexander Wilson]] (1766–1813), Scottish-born U.S. illustrator, naturalist {{int:and}} ornithologist * [[Alfred Gurney Wilson]] (1878–1957, '''A.G.Wilson'''), botanist (Orchidaceae) * [[Alice Evelyn Wilson]] (1881–1964, '''A.E.Wilson'''), Canadian palaeontologist * [[Ann E. Wilson]], microbiologist * [[Andrew W. Wilson]] ([[Floruit|fl.]] 2004, '''A.W.Wilson'''), botanist * [[Annette Jane Gratton Wilson]] ({{int:born}} 1960, '''A.J.G.Wilson'''), botanist * [[Barbara Lynn Wilson]] ({{int:born}} 1951, '''B.L.Wilson'''), botanist * [[Barry Robert Wilson]] (1935–2017), Australian malacologist * [[Brent Wilson]], ostracodologist * [[Byron S. Wilson]], herpetologist * [[Carol Anne Wilson]] (fl. 2004, '''C.A.Wilson'''), U.S. botanist * [[Charles Branch Wilson]] (1861–1941), U.S. marine-biologist * [[Christine Elizabeth Wilson]] (fl. 2016, '''C.E.Wilson'''), U.S. botanist * [[Christopher A. Wilson]], Australian ornithologist * [[Christopher Grey-Wilson]] ({{int:born}} 1944, '''Grey-Wilson'''), English botanist * [[Don Ellis Wilson]] ({{int:born}} 1944), U.S. mammalogist * [[Edmund Beecher Wilson]] (1856–1939), U.S. zoologist * [[Edward Osborne Wilson]], U.S. biologist * [[Ernest Henry Wilson]] (1876–1930, '''E.H.Wilson'''), British botanist * [[F. Douglas Wilson]] (fl. 1963, '''F.D.Wilson'''), botanist * [[Francis Erasmus Wilson]] (1888–1960), Australian entomologist * [[Francis Robert Muter Wilson]] (1831–1903, '''F.Wilson'''), Australian lichenologist * [[G.B. Wilson]] ('''G.B.Wilson'''), mycologist * [[Gary Whittaker Wilson]] ('''Gary W.Wilson'''), Australian botanist * [[George D.F. Wilson]], carcinologist * [[George Fergusson Wilson]] (1822–1902, '''G.F.Wilson'''), British botanist * [[George Fox Wilson]] (1896–1951), English entomologist, botanist * [[Gregory Philip Wilson Mantilla]], palaeontologist * [[Hannah F. Wilson]] (fl. 2014), arachnologist * [[Harriet L. Wilson]] ('''H.L.Wilson'''), phycologist * [[Harley Frost Wilson]] (1883-?), U.S.entomologist * [[Henry Van Peters Wilson]] (1863–1939), U.S. invertebrate zoologist * [[Heather M. Wilson]], palaeontologist * [[Hugh Dale Wilson]] ('''H.D.Wilson'''), New Zealand botanist * [[Hugh Daniel Wilson]] (1943–2018, '''H.Dan.Wilson'''), U.S. botanist * [[Irene M. Wilson]] (fl. 1954, '''I.M.Wilson'''), mycologist * [[Jane Wilson]] (fl. 1990), collembologist * [[Jeffrey Alan Wilson Mantilla]] ('''Jeffrey A. Wilson'''), U.S. palaeontologist * [[Jeremy Dean Wilson]], Australian arachnologist * [[John Andrew Wilson]] (1914-2008), US palaeontologist * [[John Bracebridge Wilson]] (1828–1895, '''J.B.Wilson'''), Australian naturalist, phycologist * [[Joseph S. Wilson]], U.S. entomologist * [[K.S. Wilson]] (fl. 1960, '''K.S.Wilson'''), mycologist * [[Karen Louise Wilson]], '''K.L.Wilson''', Australian botanist * [[Keith Duncan Peter Wilson]], entomologist * [[Larry David Wilson]], U.S. herpetologist * [[Leonard Richard Wilson]] (1906–1998, '''L.R.Wilson'''), U.S. botanist * [[Lyle Wilson]] (fl. 2019), South African herpetologist * [[Mark Wilson]] ({{int:born}} 1964, '''Mark Wilson'''), botanist * [[Mark A. Wilson]], U.S. paleontologist and geologist * [[Mark V. H. Wilson]] ({{int:born}} 1946), Canadian palaeontologist {{int:and}} ichthyologist * [[Megan Mey Wilson]] ('''M.M.Wilson'''), U.S. entomologist and mycologist * [[Michael R. Wilson]], British entomologist (Hemiptera) * [[Nerida Gaye Wilson]], Australian malacologist * [[Oscar Edward Wilson]], English paleontologist * [[Paul Graham Wilson]] ({{int:born}} 1928, '''Paul G.Wilson'''), Australian botanist * [[Paul Siri Wilson]] ({{int:born}} 1965, '''P.S.Wilson'''), botanist * [[Percy Wilson]] (1879–1944, '''P.Wilson'''), U.S. botanist * [[Peter Gordon Wilson]] ({{int:born}} 1950, '''Peter G.Wilson'''), Australian botanist * [[Peter R. Wilson]] (fl. 2021), Australian entomologist * [[Robert Gardner Wilson]] (1911–?, '''R.G.Wilson'''), botanist * [[Robert Warren Wilson]], U.S. geologist {{int:and}} paleontologist * [[Robin S. Wilson]], Australian {{int:annelidologist}} * [[Rosemary Wilson]] ('''R.Wilson'''), botanist * [[Ruby K. Wilson]] (fl. 2014, '''R.K.Wilson'''), botanist * [[Sarah Marie Wilson]] ('''S.M.Wilson'''), phycologist * [[Scott Barchard Wilson]] (1865–1923), English ornithologist * [[Stephen W. Wilson]], U.S. entomologist * [[Steve K. Wilson]], Australian herpetologist * [[Trevor C. Wilson]] (fl. 2012, '''T.C.Wilson'''), botanist * [[William M. Wilson]] (1799–1871, '''Wilson'''), English botanist {{int:and}} {{int:bryologist}} {{Disambiguation|cat=people}} ecf1exnoiqa9j9l6b9ttgpofqi96z9o Juan Cristóbal Gundlach 0 20126 11322536 10877003 2026-10-22T03:29:08Z John Tann 703224 Added publications 11322536 wikitext text/x-wiki {{Image|Gundlach Juan 1810-1896.png|Juan Cristóbal Gundlach, ca.1864}} '''Juan Cristóbal Gundlach''' or '''Johannes Christoph Gundlach Redberg''' (1810–1896), German-Cuban {{int:naturalist}} {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{Inc}} ===1840=== {{Gundlach, 1840}} ===1852=== {{Gundlach, 1852}} ===1855=== {{Gundlach, 1855}} ===1858=== {{Gundlach, 1858}} ===1881=== {{Gundlach, 1881}} ===1886=== {{Gundlach, 1886}} ===1888=== {{Gundlach, 1888a}} =={{int:References}}== {{Cabanis, 1855}} {{Authority control}} {{DEFAULTSORT:Gundlach, Juan Cristobal}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Ornithologists]] h6wd6wv86zcmc81d7ccz2lrxtgtqdpr Brassicaceae 0 28003 11322010 11313517 2026-10-21T14:07:13Z Andyboorman 251907 needs an update 11322010 wikitext text/x-wiki {{Image|Brassica nigra.jpg|''[[Brassica nigra]]''}} =={{int:Taxonavigation}}== {{Brassicaceae}} Subfamiliae: {{subfam|Aethionemoideae}} {{subfamlast|Brassicoideae}} Tribus: {{trib|Aethionemeae}} {{trib|Alysseae}} {{trib|Alyssopsideae}} {{trib|Anastaticeae}} {{trib|Anchonieae}} {{trib|Aphragmeae}} {{trib|Arabideae}} {{trib|Arabidopsideae}} {{trib|Asperuginoideae}} {{trib|Asteae}} {{trib|Biscutelleae}} {{trib|Bivonaeeae}} {{trib|Boechereae}} {{trib|Brassiceae}} {{trib|Buniadeae}} {{trib|Calepineae}} {{trib|Camelineae}} {{trib|Cardamineae}} {{trib|Chamireae}} {{trib|Chorisporeae}} {{trib|Cochlearieae}} {{trib|Coluteocarpeae}} {{trib|Conringieae}} {{trib|Cremolobeae}} {{trib|Crucihimalayeae}} {{trib|Descurainieae}} {{trib|Dontostemoneae}} {{trib|Erysimeae}} {{trib|Euclidieae}} {{trib|Eudemeae}} {{trib|Eutremeae}} {{trib|Fourraeeae}} {{trib|Halimolobeae}} {{trib|Heliophileae}} {{trib|Hemilophieae}} {{trib|Hesperideae}} {{trib|Hillielleae}} {{trib|Iberideae}} {{trib|Isatideae}} {{trib|Kernereae}} {{trib|Lepidieae}} {{trib|Malcolmieae}} {{trib|Megacarpaeeae}} {{trib|Microlepidieae}} {{trib|Notothlaspideae}} {{trib|Oreophytoneae}} {{trib|Physarieae}} {{trib|Plagiolobeae}} {{trib|Schizopetaleae}} {{trib|Schrenkielleae}} {{trib|Scoliaxoneae}} {{trib|Sisymbrieae}} {{trib|Smelowskieae}} {{trib|Stevenieae}} {{trib|Subularieae}} {{trib|Thelypodieae}} {{trib|Thlaspideae}} {{trib|Turritideae}} {{triblast|Yinshanieae}} ==={{int:Overview of genera}}=== {{g|Abdra}} {{g|Acirostrum}} {{g|Acuston}} {{g|Aethionema}} {{g|Aimara}} {{g|Alliaria}} {{g|Alshehbazia}} {{g|Altriarabis}} {{g|Alyssoides}} {{g|Alyssopsis}} {{g|Alyssum}} {{g|Ammosperma}} {{g|Anastatica}} {{g|Ancashia}} {{g|Andrzeiowskia}} {{g|Anelsonia}} {{g|Anzhengxia}} {{g|Aphragmus}} {{g|Aplanodes (Brassicaceae)|Aplanodes}} {{g|Arabidella}} {{g|Arabidopsis}} {{g|Arabis}} {{g|Arcyosperma}} {{g|Armoracia}} {{g|Aschersoniodoxa}} {{g|Asperuginoides}} {{g|Asta}} {{g|Atacama}} {{g|Atelanthera}} {{g|Athysanus}} {{g|Aubrieta}} {{g|Aurinia}} {{g|Baimashania}} {{g|Ballantinia}} {{g|Barbarea}} {{g|Bengt-jonsellia}} {{g|Berteroa}} {{g|Biscutella}} {{g|Bivonaea}} {{g|Blennodia}} {{g|Boechera}} {{g|Borealandea}} {{g|Bornmuellera}} {{g|Borodinia (Brassicaceae)|Borodinia}} {{g|Botschantzevia}} {{g|Brachypus}} {{g|Brassica}} {{g|Braya (Brassicaceae)|Braya}} {{g|Bunias}} {{g|Cakile}} {{g|Calepina}} {{g|Calymmatium}} {{g|Camelina}} {{g|Camelinopsis}} {{g|Capsella (Brassicaceae)|Capsella}} {{g|Cardamine}} {{g|Carinavalva}} {{g|Carrichtera}} {{g|Catenulina}} {{g|Catolobus}} {{g|Ceratocnemum}} {{g|Chamira}} {{g|Chartoloma}} {{g|Chaunanthus}} {{g|Chilocardamum}} {{g|Chlorocrambe}} {{g|Chorispora}} {{g|Christolea}} {{g|Chrysochamela}} {{g|Cithareloma}} {{g|Clastopus}} {{g|Clausia (Brassicaceae)|Clausia}} {{g|Clypeola (Brassicaceae)|Clypeola}} {{g|Cochlearia}} {{g|Coincya}} {{g|Conringia}} {{g|Cordylocarpus}} {{g|Crambe}} {{g|Crambella}} {{g|Cremolobus}} {{g|Crucihimalaya}} {{g|Cryptospora}} {{g|Cuphonotus}} {{g|Cuprella}} {{g|Cusickiella}} {{g|Cymatocarpus (Brassicaceae)|Cymatocarpus}} {{g|Cyphocardamum}} {{g|Dactylocardamum}} {{g|Degenia}} {{g|Delpinophytum}} {{g|Dendroarabis}} {{g|Descurainia}} {{g|Diceratella}} {{g|Dichasianthus}} {{g|Dictyophragmus}} {{g|Didesmus}} {{g|Didymophysa (Brassicaceae)|Didymophysa}} {{g|Dielsiocharis}} {{g|Dilophia}} {{g|Dimorphocarpa}} {{g|Diplotaxis (Brassicaceae)|Diplotaxis}} {{g|Dipoma}} {{g|Diptychocarpus}} {{g|Dithyrea}} {{g|Dontostemon}} {{g|Douepea}} {{g|Draba}} {{g|Drabastrum}} {{g|Dryopetalon}} {{g|Eigia}} {{g|Enarthrocarpus}} {{g|Englerocharis}} {{g|Eremobium}} {{g|Eremoblastus}} {{g|Eremophyton}} {{g|Eruca (Brassicaceae)|Eruca}} {{g|Erucaria}} {{g|Erucastrum}} {{g|Erysimum}} {{g|Euclidium}} {{g|Eudema}} {{g|Eutrema}} {{g|Exhalimolobos}} {{g|Farsetia}} {{g|Fezia}} {{g|Fibigia}} {{g|Foleyola}} {{g|Fortuynia}} {{g|Fourraea}} {{g|Galitzkya}} {{g|Geococcus (Brassicaceae)|Geococcus}} {{g|Glastaria}} {{g|Goerkemia}} {{g|Goldbachia}} {{g|Gongylis}} {{g|Graellsia Boiss.|Graellsia}} {{g|Guiraoa}} {{g|Halimolobos}} {{g|Harmsiodoxa}} {{g|Hedinia}} {{g|Heldreichia}} {{g|Heliophila}} {{g|Hemicrambe}} {{g|Hemilophia}} {{g|Henophyton}} {{g|Hesperidanthus}} {{g|Hesperis}} {{g|Hilliella}} {{g|Hirschfeldia}} {{g|Hollermayera}} {{g|Hormathophylla}} {{g|Hornungia}} {{g|Horwoodia}} {{g|Hurkaea}} {{g|Ianhedgea}} {{g|Iberis}} {{g|Idahoa}} {{g|Iljinskaea}} {{g|Iodanthus}} {{g|Ionopsidium}} {{g|Irenepharsus}} {{g|Isatis}} {{g|Iskandera}} {{g|Iti}} {{g|Ivania}} {{g|Kernera}} {{g|Kremeriella}} {{g|Lachnocapsa}} {{g|Lachnoloma}} {{g|Ladakiella}} {{g|Leavenworthia}} {{g|Leiocarpaea}} {{g|Leiospora}} {{g|Lepidium}} {{g|Lepidostemon}} {{g|Lepidotrichum}} {{g|Leptaleum}} {{g|Lithodraba}} {{g|Litwinowia}} {{g|Lobularia (Brassicaceae)|Lobularia}} {{g|Lunaria}} {{g|Lutzia (Brassicaceae)|Lutzia}} {{g|Lyrocarpa}} {{g|Lysakia}} {{g|Macropodium}} {{g|Malcolmia}} {{g|Mancoa}} {{g|Marcus-kochia}} {{g|Maresia}} {{g|Mathewsia}} {{g|Matthiola}} {{g|Megacarpaea}} {{g|Megadenia}} {{g|Menkea}} {{g|Menonvillea}} {{g|Metashangrilaia}} {{g|Microlepidium}} {{g|Microstigma (Brassicaceae)|Microstigma}} {{g|Microthlaspi}} {{g|Morettia}} {{g|Moricandia (Brassicaceae)|Moricandia}} {{g|Morisia}} {{g|Mostacillastrum}} {{g|Mummenhoffia}} {{g|Murbeckiella}} {{g|Muricaria}} {{g|Myagrum}} {{g|Nasturtiopsis}} {{g|Nasturtium}} {{g|Neotorularia}} {{g|Nerisyrenia}} {{g|Neslia}} {{g|Neuontobotrys}} {{g|Noccaea}} {{g|Noccidium}} {{g|Notoceras}} {{g|Notothlaspi}} {{g|Ochthodium}} {{g|Octoceras}} {{g|Olimarabidopsis}} {{g|Onuris}} {{g|Oreophyton}} {{g|Ornithocarpa}} {{g|Orychophragmus}} {{g|Otocarpus}} {{g|Pachycladon}} {{g|Pachymitus}} {{g|Pachyneurum}} {{g|Pachyphragma}} {{g|Parlatoria (Brassicaceae)|Parlatoria}} {{g|Parodiodoxa}} {{g|Parolinia}} {{g|Parrya}} {{g|Parryodes}} {{g|Paysonia}} {{g|Peltaria}} {{g|Peltariopsis}} {{g|Pennellia}} {{g|Petrocallis}} {{g|Petroravenia}} {{g|Phlebolobium}} {{g|Phlegmatospermum}} {{g|Phoenicaulis}} {{g|Physaria}} {{g|Physoptychis}} {{g|Physorhynchus}} {{g|Plagioloba}} {{g|Planodes}} {{g|Polyctenium}} {{g|Polypsecadium}} {{g|Pringlea}} {{g|Pseuderucaria}} {{g|Pseudoarabidopsis}} {{g|Pseudocamelina}} {{g|Pseudoturritis}} {{g|Pseudovesicaria}} {{g|Psychine}} {{g|Pterygostemon}} {{g|Pugionium}} {{g|Pulvinatusia}} {{g|Pycnoplinthopsis}} {{g|Pycnoplinthus}} {{g|Quezeliantha}} {{g|Raffenaldia}} {{g|Raphanorhyncha}} {{g|Raphanus}} {{g|Rapistrum}} {{g|Resetnikia}} {{g|Rhammatophyllum}} {{g|Rhizobotrya}} {{g|Ricotia}} {{g|Robeschia}} {{g|Romanschulzia}} {{g|Rorippa}} {{g|Rudolf-kamelinia}} {{g|Rytidocarpus}} {{g|Sarcodraba}} {{g|Savignya}} {{g|Scambopus}} {{g|Schimpera}} {{g|Schizopetalon}} {{g|Schouwia}} {{g|Schrenkiella}} {{g|Scoliaxon}} {{g|Selenia (Brassicaceae)|Selenia}} {{g|Shangrilaia}} {{g|Sibara}} {{g|Sinalliaria}} {{g|Sinapidendron}} {{g|Sinapis}} {{g|Sisymbrella}} {{g|Sisymbriopsis}} {{g|Sisymbrium}} {{g|Smelowskia}} {{g|Sobolewskia}} {{g|Solms-laubachia}} {{g|Sphaerocardamum}} {{g|Spryginia}} {{g|Stanleya}} {{g|Stenodrabopsis}} {{g|Stenopetalum}} {{g|Sterigmostemum}} {{g|Stevenia (Brassicaceae)|Stevenia}} {{g|Straussiella}} {{g|Streptanthella}} {{g|Streptanthus}} {{g|Streptoloma}} {{g|Strigosella}} {{g|Subularia}} {{g|Succowia}} {{g|Synstemon}} {{g|Synthlipsis (Brassicaceae)|Synthlipsis}} {{g|Takhtajaniella}} {{g|Teesdalia}} {{g|Tetracme (Brassicaceae)|Tetracme}} {{g|Thelypodiopsis}} {{g|Thelypodium}} {{g|Thlaspi}} {{g|Thysanocarpus}} {{g|Transberingia}} {{g|Trichotolinum}} {{g|Tropidocarpum}} {{g|Turritis}} {{g|Vella}} {{g|Veselskya}} {{g|Warea}} {{g|Weberbauera}} {{g|Xerodraba}} {{g|Yinshania}} {{g|Yosemitea}} {{g|Zilla (Brassicaceae)|Zilla}} {{g|Zuloagocardamum}} {{glast|Zuvanda}} =={{int:Name}}== Brassicaceae {{a|Burnett}}, Outlines Bot.: 854, 1093, 1123 (1835), {{NC}} * {{TG|Brassica|{{a|L.}}, Sp. Pl. 2: 666 (1753).}} ==={{int:Synonyms}}=== {{HOT}} ** Cruciferae {{a|Juss.}}, Gen. Pl. 237 (1789), {{NC}} [[nom. alt.]] [https://www.iapt-taxon.org/nomen/pages/main/art_18.html#18.5 Art. 18.5.] ICN<br> Note: Circumscription [[emend.]] German et al. (2023) =={{int:References}}== ==={{int:Primary references}}=== {{Burnett, 1835}}: 854, 1093, (1123). {{German et al., 2023}} ==={{int:Additional references}}=== {{Al-Shehbaz et al., 2006}} {{Al-Shehbaz, 2012}} {{Al-Shehbaz, 2014}} {{Al-Shehbaz & German, 2016}} {{Al-Shehbaz et al., 2023}} {{Ali et al., 2016}} {{APG, 2016}} {{Chen et al., 2016f}} {{Esmailbegi et al., 2018}} {{Francis et al., 2021}} {{Iltis et al., 2011}} {{German & Al-Shehbaz, 2008}} {{German et al., 2009}} {{German et al., 2023}} * {{aut|Koch, M.A.}}, {{aut|Kiefer, M.}}, {{aut|German, D.A.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}} & {{aut|Schmickl, R.}} 2012. BrassiBase: Tools and biological resources to study characters and traits in the Brassicaceae - version 1.1. ''[[Taxon]]'' 61(5): 1001–1009. {{doi|10.1002/tax.615007}}{{JSTOR|41679346}} {{ResGate|259632408}} [https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. * {{aut|Kiefer, M.}}, {{aut|Schmickl, R.}}, {{aut|German, D.A.}}, {{aut|Lysak, M.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}}, {{aut|Stamatakis, A.}} & {{aut|Koch, M.A.}} 2014. ''BrassiBase'': Introduction to a novel database on Brassicaceae evolution. ''[[Plant and Cell Physiology]]'' 55(1): e3. {{doi|10.1093/pcp/pct158}} [https://web.archive.org/web/20190213025659/https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. {{Nikolov et al., 2019}} {{Warwick et al., 2006}} {{Warwick et al., 2010}} =={{int:Vernacular names}}== {{VN |ar=كرنبية |ast =Brasicacees, crucíferas |az=Kələmçiçəyikimilər |ba=Кәбеҫтә һымаҡтар |bar=Kreizbliatengwoxad |be=Капуставыя |bg=Кръстоцветни |ca=Brassicàcies |cs=Brukvovité |da=Korsblomst-familien |de=Kreuzblütengewächse |en=Cabbage Family, Mustard Family, Crucifers |eo=Brasikacoj, Kruciferoj |es=Brasicáceas, Crucíferas |et=Ristõielised |fa=شب‌بویان |fi=Ristikukkaiskasvit |fr=Brassicacées |frr=Krüsbloosen |gl=Brasicáceas |he=מצליבים |hi=ब्रैसिकेसी |hr=Krstašice |hsb=Křižnokwětne rostliny |hu=Káposztafélék |hy=Խաչածաղկավորներ, Կաղամբազգիներ |id=Suku kubis-kubisan |is=Krossblómaætt |it=Crocifere |ja=アブラナ科 |ka=კომბოსტოსებრნი, ჯვაროსნები |kk=Орамжапырақ тұқымдасы |ko=배추과, 십자화과 |ku=Famîleya selketûran |lt=Bastutiniai augalai |lv=Krustziežu (kāpostu) dzimta |mk=Зелки |ml=ബ്രാസ്സിക്കേസീ |nl=Kruisbloemenfamilie |nn=Krossblomfamilien |no=Korsblomstfamilien |pl=Kapustowate |pnb=سرھوں دا ٹبر, سروں دا ٹبر |pt=Brassicáceas, Crucíferas |qu=Chakana tuktuyuq rikch'aq ayllu |ro=Brassicaceele, cruciferele |ru=Капустные |sd=ڳاڙهي موري |sgs=Krīžmažėidē augalā |sh=Krstašice |sk=Kapustovité |sl=križnice |sr=Kupusnjače |sv=Korsblommiga växter |te=బ్రాసికేసి |th=วงศ์ผักกาด |tr=Turpgiller |uk=Капустяні |vi=Họ Cải |vls=Kruusblommign |wa=Cabutacêyes, Cabutreces |zh=十字花科 }} {{Commons|Category:Brassicaceae|Brassicaceae}} {{Taxonbar|from=Q156888}} [[Category:Gilbert Thomas Burnett taxa]] 82mt3gpmb99ihd3bnmqtpbghaiuu6jz 11322016 11322010 2026-10-21T14:18:00Z Andyboorman 251907 11322016 wikitext text/x-wiki {{Image|Brassica nigra.jpg|''[[Brassica nigra]]''}} =={{int:Taxonavigation}}== {{Brassicaceae}} Subfamiliae: {{subfam|Aethionemoideae}} {{subfamlast|Brassicoideae}} Tribus: {{trib|Aethionemeae}} {{trib|Alysseae}} {{trib|Alyssopsideae}} {{trib|Anastaticeae}} {{trib|Anchonieae}} {{trib|Aphragmeae}} {{trib|Arabideae}} {{trib|Arabidopsideae}} {{trib|Asperuginoideae}} {{trib|Asteae}} {{trib|Biscutelleae}} {{trib|Bivonaeeae}} {{trib|Boechereae}} {{trib|Brassiceae}} {{trib|Buniadeae}} {{trib|Calepineae}} {{trib|Camelineae}} {{trib|Cardamineae}} {{trib|Chamireae}} {{trib|Chorisporeae}} {{trib|Cochlearieae}} {{trib|Coluteocarpeae}} {{trib|Conringieae}} {{trib|Cremolobeae}} {{trib|Crucihimalayeae}} {{trib|Descurainieae}} {{trib|Dontostemoneae}} {{trib|Erysimeae}} {{trib|Euclidieae}} {{trib|Eudemeae}} {{trib|Eutremeae}} {{trib|Fourraeeae}} {{trib|Halimolobeae}} {{trib|Heliophileae}} {{trib|Hemilophieae}} {{trib|Hesperideae}} {{trib|Hillielleae}} {{trib|Iberideae}} {{trib|Isatideae}} {{trib|Kernereae}} {{trib|Lepidieae}} {{trib|Malcolmieae}} {{trib|Megacarpaeeae}} {{trib|Microlepidieae}} {{trib|Notothlaspideae}} {{trib|Oreophytoneae}} {{trib|Physarieae}} {{trib|Plagiolobeae}} {{trib|Schizopetaleae}} {{trib|Schrenkielleae}} {{trib|Scoliaxoneae}} {{trib|Sisymbrieae}} {{trib|Smelowskieae}} {{trib|Stevenieae}} {{trib|Subularieae}} {{trib|Thelypodieae}} {{trib|Thlaspideae}} {{trib|Turritideae}} {{triblast|Yinshanieae}} ==={{int:Overview of genera}}=== {{g|Abdra}} {{g|Acirostrum}} {{g|Acuston}} {{g|Aethionema}} {{g|Aimara}} {{g|Alliaria}} {{g|Alshehbazia}} {{g|Altriarabis}} {{g|Alyssoides}} {{g|Alyssopsis}} {{g|Alyssum}} {{g|Ammosperma}} {{g|Anastatica}} {{g|Ancashia}} {{g|Andrzeiowskia}} {{g|Anelsonia}} {{g|Anzhengxia}} {{g|Aphragmus}} {{g|Aplanodes (Brassicaceae)|Aplanodes}} {{g|Arabidella}} {{g|Arabidopsis}} {{g|Arabis}} {{g|Arcyosperma}} {{g|Armoracia}} {{g|Aschersoniodoxa}} {{g|Asperuginoides}} {{g|Asta}} {{g|Atacama}} {{g|Atelanthera}} {{g|Athysanus}} {{g|Aubrieta}} {{g|Aurinia}} {{g|Baimashania}} {{g|Ballantinia}} {{g|Barbarea}} {{g|Bengt-jonsellia}} {{g|Berteroa}} {{g|Biscutella}} {{g|Bivonaea}} {{g|Blennodia}} {{g|Boechera}} {{g|Borealandea}} {{g|Bornmuellera}} {{g|Borodinia (Brassicaceae)|Borodinia}} {{g|Botschantzevia}} {{g|Brachypus}} {{g|Brassica}} {{g|Braya (Brassicaceae)|Braya}} {{g|Bunias}} {{g|Cakile}} {{g|Calepina}} {{g|Calymmatium}} {{g|Camelina}} {{g|Camelinopsis}} {{g|Capsella (Brassicaceae)|Capsella}} {{g|Cardamine}} {{g|Carinavalva}} {{g|Carrichtera}} {{g|Catenulina}} {{g|Catolobus}} {{g|Ceratocnemum}} {{g|Chamira}} {{g|Chartoloma}} {{g|Chaunanthus}} {{g|Chilocardamum}} {{g|Chlorocrambe}} {{g|Chorispora}} {{g|Christolea}} {{g|Chrysochamela}} {{g|Cithareloma}} {{g|Clastopus}} {{g|Clausia (Brassicaceae)|Clausia}} {{g|Clypeola (Brassicaceae)|Clypeola}} {{g|Cochlearia}} {{g|Coincya}} {{g|Conringia}} {{g|Cordylocarpus}} {{g|Crambe}} {{g|Crambella}} {{g|Cremolobus}} {{g|Crucihimalaya}} {{g|Cryptospora}} {{g|Cuphonotus}} {{g|Cuprella}} {{g|Cusickiella}} {{g|Cymatocarpus (Brassicaceae)|Cymatocarpus}} {{g|Cyphocardamum}} {{g|Dactylocardamum}} {{g|Degenia}} {{g|Delpinophytum}} {{g|Dendroarabis}} {{g|Descurainia}} {{g|Diceratella}} {{g|Dichasianthus}} {{g|Dictyophragmus}} {{g|Didesmus}} {{g|Didymophysa (Brassicaceae)|Didymophysa}} {{g|Dielsiocharis}} {{g|Dilophia}} {{g|Dimorphocarpa}} {{g|Diplotaxis (Brassicaceae)|Diplotaxis}} {{g|Dipoma}} {{g|Diptychocarpus}} {{g|Dithyrea}} {{g|Dontostemon}} {{g|Douepea}} {{g|Draba}} {{g|Drabastrum}} {{g|Dryopetalon}} {{g|Eigia}} {{g|Enarthrocarpus}} {{g|Englerocharis}} {{g|Eremobium}} {{g|Eremoblastus}} {{g|Eremophyton}} {{g|Eruca (Brassicaceae)|Eruca}} {{g|Erucaria}} {{g|Erucastrum}} {{g|Erysimum}} {{g|Euclidium}} {{g|Eudema}} {{g|Eutrema}} {{g|Exhalimolobos}} {{g|Farsetia}} {{g|Fezia}} {{g|Fibigia}} {{g|Foleyola}} {{g|Fortuynia}} {{g|Fourraea}} {{g|Galitzkya}} {{g|Geococcus (Brassicaceae)|Geococcus}} {{g|Glastaria}} {{g|Goerkemia}} {{g|Goldbachia}} {{g|Gongylis}} {{g|Graellsia Boiss.|Graellsia}} {{g|Guiraoa}} {{g|Halimolobos}} {{g|Harmsiodoxa}} {{g|Hedinia}} {{g|Heldreichia}} {{g|Helicodraba}} {{g|Heliophila}} {{g|Hemicrambe}} {{g|Hemilophia}} {{g|Henophyton}} {{g|Hesperidanthus}} {{g|Hesperis}} {{g|Hilliella}} {{g|Hirschfeldia}} {{g|Hollermayera}} {{g|Hormathophylla}} {{g|Hornungia}} {{g|Horwoodia}} {{g|Hurkaea}} {{g|Ianhedgea}} {{g|Iberis}} {{g|Idahoa}} {{g|Iljinskaea}} {{g|Iodanthus}} {{g|Ionopsidium}} {{g|Irenepharsus}} {{g|Isatis}} {{g|Iskandera}} {{g|Iti}} {{g|Ivania}} {{g|Kernera}} {{g|Kremeriella}} {{g|Lachnocapsa}} {{g|Lachnoloma}} {{g|Ladakiella}} {{g|Leavenworthia}} {{g|Leiocarpaea}} {{g|Leiospora}} {{g|Lepidium}} {{g|Lepidostemon}} {{g|Lepidotrichum}} {{g|Leptaleum}} {{g|Lithodraba}} {{g|Litwinowia}} {{g|Lobularia (Brassicaceae)|Lobularia}} {{g|Lunaria}} {{g|Lutzia (Brassicaceae)|Lutzia}} {{g|Lyrocarpa}} {{g|Lysakia}} {{g|Macropodium}} {{g|Malcolmia}} {{g|Mancoa}} {{g|Marcus-kochia}} {{g|Maresia}} {{g|Mathewsia}} {{g|Matthiola}} {{g|Megacarpaea}} {{g|Megadenia}} {{g|Menkea}} {{g|Menonvillea}} {{g|Metashangrilaia}} {{g|Microlepidium}} {{g|Microstigma (Brassicaceae)|Microstigma}} {{g|Microthlaspi}} {{g|Morettia}} {{g|Moricandia (Brassicaceae)|Moricandia}} {{g|Morisia}} {{g|Mostacillastrum}} {{g|Mummenhoffia}} {{g|Murbeckiella}} {{g|Muricaria}} {{g|Myagrum}} {{g|Nasturtiopsis}} {{g|Nasturtium}} {{g|Neotorularia}} {{g|Nerisyrenia}} {{g|Neslia}} {{g|Neuontobotrys}} {{g|Noccaea}} {{g|Noccidium}} {{g|Notoceras}} {{g|Notothlaspi}} {{g|Ochthodium}} {{g|Octoceras}} {{g|Olimarabidopsis}} {{g|Onuris}} {{g|Oreophyton}} {{g|Ornithocarpa}} {{g|Orychophragmus}} {{g|Otocarpus}} {{g|Pachycladon}} {{g|Pachymitus}} {{g|Pachyneurum}} {{g|Pachyphragma}} {{g|Parlatoria (Brassicaceae)|Parlatoria}} {{g|Parodiodoxa}} {{g|Parolinia}} {{g|Parrya}} {{g|Parryodes}} {{g|Paysonia}} {{g|Peltaria}} {{g|Peltariopsis}} {{g|Pennellia}} {{g|Petrocallis}} {{g|Petroravenia}} {{g|Phlebolobium}} {{g|Phlegmatospermum}} {{g|Phoenicaulis}} {{g|Physaria}} {{g|Physoptychis}} {{g|Physorhynchus}} {{g|Plagioloba}} {{g|Planodes}} {{g|Polyctenium}} {{g|Polypsecadium}} {{g|Pringlea}} {{g|Pseuderucaria}} {{g|Pseudoarabidopsis}} {{g|Pseudocamelina}} {{g|Pseudoturritis}} {{g|Pseudovesicaria}} {{g|Psychine}} {{g|Pterygostemon}} {{g|Pugionium}} {{g|Pulvinatusia}} {{g|Pycnoplinthopsis}} {{g|Pycnoplinthus}} {{g|Quezeliantha}} {{g|Raffenaldia}} {{g|Raphanorhyncha}} {{g|Raphanus}} {{g|Rapistrum}} {{g|Resetnikia}} {{g|Rhammatophyllum}} {{g|Rhizobotrya}} {{g|Ricotia}} {{g|Robeschia}} {{g|Romanschulzia}} {{g|Rorippa}} {{g|Rudolf-kamelinia}} {{g|Rytidocarpus}} {{g|Sarcodraba}} {{g|Savignya}} {{g|Scambopus}} {{g|Schimpera}} {{g|Schizopetalon}} {{g|Schouwia}} {{g|Schrenkiella}} {{g|Scoliaxon}} {{g|Selenia (Brassicaceae)|Selenia}} {{g|Shangrilaia}} {{g|Sibara}} {{g|Sinalliaria}} {{g|Sinapidendron}} {{g|Sinapis}} {{g|Sisymbrella}} {{g|Sisymbriopsis}} {{g|Sisymbrium}} {{g|Smelowskia}} {{g|Sobolewskia}} {{g|Solms-laubachia}} {{g|Sphaerocardamum}} {{g|Spryginia}} {{g|Stanleya}} {{g|Stenodrabopsis}} {{g|Stenopetalum}} {{g|Sterigmostemum}} {{g|Stevenia (Brassicaceae)|Stevenia}} {{g|Straussiella}} {{g|Streptanthella}} {{g|Streptanthus}} {{g|Streptoloma}} {{g|Strigosella}} {{g|Subularia}} {{g|Succowia}} {{g|Synstemon}} {{g|Synthlipsis (Brassicaceae)|Synthlipsis}} {{g|Takhtajaniella}} {{g|Teesdalia}} {{g|Tetracme (Brassicaceae)|Tetracme}} {{g|Thelypodiopsis}} {{g|Thelypodium}} {{g|Thlaspi}} {{g|Thysanocarpus}} {{g|Transberingia}} {{g|Trichotolinum}} {{g|Tropidocarpum}} {{g|Turritis}} {{g|Vella}} {{g|Veselskya}} {{g|Warea}} {{g|Weberbauera}} {{g|Xerodraba}} {{g|Yinshania}} {{g|Yosemitea}} {{g|Zilla (Brassicaceae)|Zilla}} {{g|Zuloagocardamum}} {{glast|Zuvanda}} =={{int:Name}}== Brassicaceae {{a|Burnett}}, Outlines Bot.: 854, 1093, 1123 (1835), {{NC}} * {{TG|Brassica|{{a|L.}}, Sp. Pl. 2: 666 (1753).}} ==={{int:Synonyms}}=== {{HOT}} ** Cruciferae {{a|Juss.}}, Gen. Pl. 237 (1789), {{NC}} [[nom. alt.]] [https://www.iapt-taxon.org/nomen/pages/main/art_18.html#18.5 Art. 18.5.] ICN<br> Note: Circumscription [[emend.]] German et al. (2023) =={{int:References}}== ==={{int:Primary references}}=== {{Burnett, 1835}}: 854, 1093, (1123). {{German et al., 2023}} ==={{int:Additional references}}=== {{Al-Shehbaz et al., 2006}} {{Al-Shehbaz, 2012}} {{Al-Shehbaz, 2014}} {{Al-Shehbaz & German, 2016}} {{Al-Shehbaz et al., 2023}} {{Ali et al., 2016}} {{APG, 2016}} {{Chen et al., 2016f}} {{Esmailbegi et al., 2018}} {{Francis et al., 2021}} {{Iltis et al., 2011}} {{German & Al-Shehbaz, 2008}} {{German et al., 2009}} {{German et al., 2023}} * {{aut|Koch, M.A.}}, {{aut|Kiefer, M.}}, {{aut|German, D.A.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}} & {{aut|Schmickl, R.}} 2012. BrassiBase: Tools and biological resources to study characters and traits in the Brassicaceae - version 1.1. ''[[Taxon]]'' 61(5): 1001–1009. {{doi|10.1002/tax.615007}}{{JSTOR|41679346}} {{ResGate|259632408}} [https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. * {{aut|Kiefer, M.}}, {{aut|Schmickl, R.}}, {{aut|German, D.A.}}, {{aut|Lysak, M.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}}, {{aut|Stamatakis, A.}} & {{aut|Koch, M.A.}} 2014. ''BrassiBase'': Introduction to a novel database on Brassicaceae evolution. ''[[Plant and Cell Physiology]]'' 55(1): e3. {{doi|10.1093/pcp/pct158}} [https://web.archive.org/web/20190213025659/https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. {{Nikolov et al., 2019}} {{Warwick et al., 2006}} {{Warwick et al., 2010}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{IPNI||2026|Oct 21}} =={{int:Vernacular names}}== {{VN |ar=كرنبية |ast =Brasicacees, crucíferas |az=Kələmçiçəyikimilər |ba=Кәбеҫтә һымаҡтар |bar=Kreizbliatengwoxad |be=Капуставыя |bg=Кръстоцветни |ca=Brassicàcies |cs=Brukvovité |da=Korsblomst-familien |de=Kreuzblütengewächse |en=Cabbage Family, Mustard Family, Crucifers |eo=Brasikacoj, Kruciferoj |es=Brasicáceas, Crucíferas |et=Ristõielised |fa=شب‌بویان |fi=Ristikukkaiskasvit |fr=Brassicacées |frr=Krüsbloosen |gl=Brasicáceas |he=מצליבים |hi=ब्रैसिकेसी |hr=Krstašice |hsb=Křižnokwětne rostliny |hu=Káposztafélék |hy=Խաչածաղկավորներ, Կաղամբազգիներ |id=Suku kubis-kubisan |is=Krossblómaætt |it=Crocifere |ja=アブラナ科 |ka=კომბოსტოსებრნი, ჯვაროსნები |kk=Орамжапырақ тұқымдасы |ko=배추과, 십자화과 |ku=Famîleya selketûran |lt=Bastutiniai augalai |lv=Krustziežu (kāpostu) dzimta |mk=Зелки |ml=ബ്രാസ്സിക്കേസീ |nl=Kruisbloemenfamilie |nn=Krossblomfamilien |no=Korsblomstfamilien |pl=Kapustowate |pnb=سرھوں دا ٹبر, سروں دا ٹبر |pt=Brassicáceas, Crucíferas |qu=Chakana tuktuyuq rikch'aq ayllu |ro=Brassicaceele, cruciferele |ru=Капустные |sd=ڳاڙهي موري |sgs=Krīžmažėidē augalā |sh=Krstašice |sk=Kapustovité |sl=križnice |sr=Kupusnjače |sv=Korsblommiga växter |te=బ్రాసికేసి |th=วงศ์ผักกาด |tr=Turpgiller |uk=Капустяні |vi=Họ Cải |vls=Kruusblommign |wa=Cabutacêyes, Cabutreces |zh=十字花科 }} {{Commons|Category:Brassicaceae|Brassicaceae}} {{Taxonbar|from=Q156888}} [[Category:Gilbert Thomas Burnett taxa]] fnfjtsz2eg2wuulg50ncomlyd1b82n0 11322025 11322016 2026-10-21T14:42:48Z Andyboorman 251907 11322025 wikitext text/x-wiki {{Image|Brassica nigra.jpg|''[[Brassica nigra]]''}} =={{int:Taxonavigation}}== {{Brassicaceae}} Subfamiliae: {{subfam|Aethionemoideae}} {{subfamlast|Brassicoideae}} Tribus: {{trib|Aethionemeae}} {{trib|Alysseae}} {{trib|Alyssopsideae}} {{trib|Anastaticeae}} {{trib|Anchonieae}} {{trib|Aphragmeae}} {{trib|Arabideae}} {{trib|Arabidopsideae}} {{trib|Asperuginoideae}} {{trib|Asteae}} {{trib|Biscutelleae}} {{trib|Bivonaeeae}} {{trib|Boechereae}} {{trib|Brassiceae}} {{trib|Buniadeae}} {{trib|Calepineae}} {{trib|Camelineae}} {{trib|Cardamineae}} {{trib|Chamireae}} {{trib|Chorisporeae}} {{trib|Cochlearieae}} {{trib|Coluteocarpeae}} {{trib|Conringieae}} {{trib|Cremolobeae}} {{trib|Crucihimalayeae}} {{trib|Descurainieae}} {{trib|Dontostemoneae}} {{trib|Erysimeae}} {{trib|Euclidieae}} {{trib|Eudemeae}} {{trib|Eutremeae}} {{trib|Fourraeeae}} {{trib|Halimolobeae}} {{trib|Heliophileae}} {{trib|Hemilophieae}} {{trib|Hesperideae}} {{trib|Hillielleae}} {{trib|Iberideae}} {{trib|Isatideae}} {{trib|Kernereae}} {{trib|Lepidieae}} {{trib|Malcolmieae}} {{trib|Megacarpaeeae}} {{trib|Microlepidieae}} {{trib|Notothlaspideae}} {{trib|Oreophytoneae}} {{trib|Physarieae}} {{trib|Plagiolobeae}} {{trib|Schizopetaleae}} {{trib|Schrenkielleae}} {{trib|Scoliaxoneae}} {{trib|Sisymbrieae}} {{trib|Smelowskieae}} {{trib|Stevenieae}} {{trib|Subularieae}} {{trib|Thelypodieae}} {{trib|Thlaspideae}} {{trib|Turritideae}} {{triblast|Yinshanieae}} ==={{int:Overview of genera}}=== {{g|Abdra}} {{g|Acirostrum}} {{g|Acuston}} {{g|Aethionema}} {{g|Aimara}} {{g|Alliaria}} {{g|Alshehbazia}} {{g|Altriarabis}} {{g|Alyssoides}} {{g|Alyssopsis}} {{g|Alyssum}} {{g|Ammosperma}} {{g|Anastatica}} {{g|Ancashia}} {{g|Andrzeiowskia}} {{g|Anelsonia}} {{g|Anzhengxia}} {{g|Aphragmus}} {{g|Aplanodes (Brassicaceae)|Aplanodes}} {{g|Arabidella}} {{g|Arabidopsis}} {{g|Arabis}} {{g|Arcyosperma}} {{g|Armoracia}} {{g|Aschersoniodoxa}} {{g|Asperuginoides}} {{g|Asta}} {{g|Atacama}} {{g|Atelanthera}} {{g|Athysanus}} {{g|Aubrieta}} {{g|Aurinia}} {{g|Baimashania}} {{g|Ballantinia}} {{g|Barbarea}} {{g|Bengt-jonsellia}} {{g|Berteroa}} {{g|Biscutella}} {{g|Bivonaea}} {{g|Blennodia}} {{g|Boechera}} {{g|Borealandea}} {{g|Bornmuellera}} {{g|Borodinia (Brassicaceae)|Borodinia}} {{g|Botschantzevia}} {{g|Brachypus}} {{g|Brassica}} {{g|Braya (Brassicaceae)|Braya}} {{g|Bunias}} {{g|Cakile}} {{g|Calepina}} {{g|Calymmatium}} {{g|Camelina}} {{g|Camelinopsis}} {{g|Capsella (Brassicaceae)|Capsella}} {{g|Cardamine}} {{g|Carinavalva}} {{g|Carrichtera}} {{g|Catenulina}} {{g|Catolobus}} {{g|Ceratocnemum}} {{g|Chamira}} {{g|Chartoloma}} {{g|Chaunanthus}} {{g|Chilocardamum}} {{g|Chlorocrambe}} {{g|Chorispora}} {{g|Christolea}} {{g|Chrysochamela}} {{g|Cithareloma}} {{g|Clastopus}} {{g|Clausia (Brassicaceae)|Clausia}} {{g|Clypeola (Brassicaceae)|Clypeola}} {{g|Cochlearia}} {{g|Coincya}} {{g|Conringia}} {{g|Cordylocarpus}} {{g|Crambe}} {{g|Crambella}} {{g|Cremolobus}} {{g|Crucihimalaya}} {{g|Cryptospora}} {{g|Cuphonotus}} {{g|Cuprella}} {{g|Cusickiella}} {{g|Cymatocarpus (Brassicaceae)|Cymatocarpus}} {{g|Cyphocardamum}} {{g|Dactylocardamum}} {{g|Degenia}} {{g|Delpinophytum}} {{g|Dendroarabis}} {{g|Descurainia}} {{g|Diceratella}} {{g|Dichasianthus}} {{g|Dictyophragmus}} {{g|Didesmus}} {{g|Didymophysa (Brassicaceae)|Didymophysa}} {{g|Dielsiocharis}} {{g|Dilophia}} {{g|Dimorphocarpa}} {{g|Diplotaxis (Brassicaceae)|Diplotaxis}} {{g|Dipoma}} {{g|Diptychocarpus}} {{g|Dithyrea}} {{g|Dontostemon}} {{g|Douepea}} {{g|Draba}} {{g|Drabastrum}} {{g|Dryopetalon}} {{g|Eigia}} {{g|Enarthrocarpus}} {{g|Englerocharis}} {{g|Eremobium}} {{g|Eremoblastus}} {{g|Eremophyton}} {{g|Eruca (Brassicaceae)|Eruca}} {{g|Erucaria}} {{g|Erucastrum}} {{g|Erysimum}} {{g|Euclidium}} {{g|Eudema}} {{g|Eutrema}} {{g|Exhalimolobos}} {{g|Farsetia}} {{g|Fezia}} {{g|Fibigia}} {{g|Foleyola}} {{g|Fortuynia}} {{g|Fourraea}} {{g|Galitzkya}} {{g|Geococcus (Brassicaceae)|Geococcus}} {{g|Glastaria}} {{g|Goerkemia}} {{g|Goldbachia}} {{g|Gongylis}} {{g|Graellsia Boiss.|Graellsia}} {{g|Guiraoa}} {{g|Halimolobos}} {{g|Harmsiodoxa}} {{g|Hedinia}} {{g|Heldreichia}} {{g|Helicodraba}} {{g|Heliophila}} {{g|Hemicrambe}} {{g|Hemilophia}} {{g|Henophyton}} {{g|Hesperidanthus}} {{g|Hesperis}} {{g|Hilliella}} {{g|Hirschfeldia}} {{g|Hollermayera}} {{g|Hormathophylla}} {{g|Hornungia}} {{g|Horwoodia}} {{g|Hurkaea}} {{g|Ianhedgea}} {{g|Iberis}} {{g|Idahoa}} {{g|Iljinskaea}} {{g|Iodanthus}} {{g|Ionopsidium}} {{g|Irenepharsus}} {{g|Isatis}} {{g|Iskandera}} {{g|Ivania}} {{g|Kernera}} {{g|Kremeriella}} {{g|Lachnocapsa}} {{g|Lachnoloma}} {{g|Ladakiella}} {{g|Leavenworthia}} {{g|Leiocarpaea}} {{g|Leiospora}} {{g|Lepidium}} {{g|Lepidostemon}} {{g|Lepidotrichum}} {{g|Leptaleum}} {{g|Lithodraba}} {{g|Litwinowia}} {{g|Lobularia (Brassicaceae)|Lobularia}} {{g|Lunaria}} {{g|Lutzia (Brassicaceae)|Lutzia}} {{g|Lyrocarpa}} {{g|Lysakia}} {{g|Macropodium}} {{g|Malcolmia}} {{g|Mancoa}} {{g|Marcus-kochia}} {{g|Maresia}} {{g|Mathewsia}} {{g|Matthiola}} {{g|Megacarpaea}} {{g|Megadenia}} {{g|Menkea}} {{g|Menonvillea}} {{g|Metashangrilaia}} {{g|Microlepidium}} {{g|Microstigma (Brassicaceae)|Microstigma}} {{g|Microthlaspi}} {{g|Morettia}} {{g|Moricandia (Brassicaceae)|Moricandia}} {{g|Morisia}} {{g|Mostacillastrum}} {{g|Mummenhoffia}} {{g|Murbeckiella}} {{g|Muricaria}} {{g|Myagrum}} {{g|Nasturtiopsis}} {{g|Nasturtium}} {{g|Neotorularia}} {{g|Nerisyrenia}} {{g|Neslia}} {{g|Neuontobotrys}} {{g|Noccaea}} {{g|Noccidium}} {{g|Notoceras}} {{g|Notothlaspi}} {{g|Ochthodium}} {{g|Octoceras}} {{g|Olimarabidopsis}} {{g|Onuris}} {{g|Oreophyton}} {{g|Ornithocarpa}} {{g|Orychophragmus}} {{g|Otocarpus}} {{g|Pachycladon}} {{g|Pachymitus}} {{g|Pachyneurum}} {{g|Pachyphragma}} {{g|Parlatoria (Brassicaceae)|Parlatoria}} {{g|Parodiodoxa}} {{g|Parolinia}} {{g|Parrya}} {{g|Parryodes}} {{g|Paysonia}} {{g|Peltaria}} {{g|Peltariopsis}} {{g|Pennellia}} {{g|Petrocallis}} {{g|Petroravenia}} {{g|Phlebolobium}} {{g|Phlegmatospermum}} {{g|Phoenicaulis}} {{g|Physaria}} {{g|Physoptychis}} {{g|Physorhynchus}} {{g|Plagioloba}} {{g|Planodes}} {{g|Polyctenium}} {{g|Polypsecadium}} {{g|Pringlea}} {{g|Pseuderucaria}} {{g|Pseudoarabidopsis}} {{g|Pseudocamelina}} {{g|Pseudoturritis}} {{g|Pseudovesicaria}} {{g|Psychine}} {{g|Pterygostemon}} {{g|Pugionium}} {{g|Pulvinatusia}} {{g|Pycnoplinthopsis}} {{g|Pycnoplinthus}} {{g|Quezeliantha}} {{g|Raffenaldia}} {{g|Raphanorhyncha}} {{g|Raphanus}} {{g|Rapistrum}} {{g|Resetnikia}} {{g|Rhammatophyllum}} {{g|Rhizobotrya}} {{g|Ricotia}} {{g|Robeschia}} {{g|Romanschulzia}} {{g|Rorippa}} {{g|Rudolf-kamelinia}} {{g|Rytidocarpus}} {{g|Sarcodraba}} {{g|Savignya}} {{g|Scambopus}} {{g|Schimpera}} {{g|Schizopetalon}} {{g|Schouwia}} {{g|Schrenkiella}} {{g|Scoliaxon}} {{g|Selenia (Brassicaceae)|Selenia}} {{g|Shangrilaia}} {{g|Sibara}} {{g|Sinalliaria}} {{g|Sinapidendron}} {{g|Sinapis}} {{g|Sisymbrella}} {{g|Sisymbriopsis}} {{g|Sisymbrium}} {{g|Smelowskia}} {{g|Sobolewskia}} {{g|Solms-laubachia}} {{g|Sphaerocardamum}} {{g|Spryginia}} {{g|Stanleya}} {{g|Stenodrabopsis}} {{g|Stenopetalum}} {{g|Sterigmostemum}} {{g|Stevenia (Brassicaceae)|Stevenia}} {{g|Straussiella}} {{g|Streptanthella}} {{g|Streptanthus}} {{g|Streptoloma}} {{g|Strigosella}} {{g|Subularia}} {{g|Succowia}} {{g|Synstemon}} {{g|Synthlipsis (Brassicaceae)|Synthlipsis}} {{g|Takhtajaniella}} {{g|Teesdalia}} {{g|Tetracme (Brassicaceae)|Tetracme}} {{g|Thelypodiopsis}} {{g|Thelypodium}} {{g|Thlaspi}} {{g|Thysanocarpus}} {{g|Transberingia}} {{g|Trichotolinum}} {{g|Tropidocarpum}} {{g|Turritis}} {{g|Vella}} {{g|Veselskya}} {{g|Warea}} {{g|Weberbauera}} {{g|Xerodraba}} {{g|Yinshania}} {{g|Yosemitea}} {{g|Zilla (Brassicaceae)|Zilla}} {{g|Zuloagocardamum}} {{glast|Zuvanda}} Nothogenera: {{g|× Brassarda}} {{glast|× Rapistrosymbrium}} =={{int:Name}}== Brassicaceae {{a|Burnett}}, Outlines Bot.: 854, 1093, 1123 (1835), {{NC}} * {{TG|Brassica|{{a|L.}}, Sp. Pl. 2: 666 (1753).}} ==={{int:Synonyms}}=== {{HOT}} ** Cruciferae {{a|Juss.}}, Gen. Pl. 237 (1789), {{NC}} [[nom. alt.]] [https://www.iapt-taxon.org/nomen/pages/main/art_18.html#18.5 Art. 18.5.] ICN<br> Note: Circumscription [[emend.]] German et al. (2023) =={{int:References}}== ==={{int:Primary references}}=== {{Burnett, 1835}}: 854, 1093, (1123). {{German et al., 2023}} ==={{int:Additional references}}=== {{Al-Shehbaz et al., 2006}} {{Al-Shehbaz, 2012}} {{Al-Shehbaz, 2014}} {{Al-Shehbaz & German, 2016}} {{Al-Shehbaz et al., 2023}} {{Ali et al., 2016}} {{APG, 2016}} {{Chen et al., 2016f}} {{Esmailbegi et al., 2018}} {{Francis et al., 2021}} {{Iltis et al., 2011}} {{German & Al-Shehbaz, 2008}} {{German et al., 2009}} {{German et al., 2023}} * {{aut|Koch, M.A.}}, {{aut|Kiefer, M.}}, {{aut|German, D.A.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}} & {{aut|Schmickl, R.}} 2012. BrassiBase: Tools and biological resources to study characters and traits in the Brassicaceae - version 1.1. ''[[Taxon]]'' 61(5): 1001–1009. {{doi|10.1002/tax.615007}}{{JSTOR|41679346}} {{ResGate|259632408}} [https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. * {{aut|Kiefer, M.}}, {{aut|Schmickl, R.}}, {{aut|German, D.A.}}, {{aut|Lysak, M.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}}, {{aut|Stamatakis, A.}} & {{aut|Koch, M.A.}} 2014. ''BrassiBase'': Introduction to a novel database on Brassicaceae evolution. ''[[Plant and Cell Physiology]]'' 55(1): e3. {{doi|10.1093/pcp/pct158}} [https://web.archive.org/web/20190213025659/https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. {{Nikolov et al., 2019}} {{Warwick et al., 2006}} {{Warwick et al., 2010}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{IPNI||2026|Oct 21}} =={{int:Vernacular names}}== {{VN |ar=كرنبية |ast =Brasicacees, crucíferas |az=Kələmçiçəyikimilər |ba=Кәбеҫтә һымаҡтар |bar=Kreizbliatengwoxad |be=Капуставыя |bg=Кръстоцветни |ca=Brassicàcies |cs=Brukvovité |da=Korsblomst-familien |de=Kreuzblütengewächse |en=Cabbage Family, Mustard Family, Crucifers |eo=Brasikacoj, Kruciferoj |es=Brasicáceas, Crucíferas |et=Ristõielised |fa=شب‌بویان |fi=Ristikukkaiskasvit |fr=Brassicacées |frr=Krüsbloosen |gl=Brasicáceas |he=מצליבים |hi=ब्रैसिकेसी |hr=Krstašice |hsb=Křižnokwětne rostliny |hu=Káposztafélék |hy=Խաչածաղկավորներ, Կաղամբազգիներ |id=Suku kubis-kubisan |is=Krossblómaætt |it=Crocifere |ja=アブラナ科 |ka=კომბოსტოსებრნი, ჯვაროსნები |kk=Орамжапырақ тұқымдасы |ko=배추과, 십자화과 |ku=Famîleya selketûran |lt=Bastutiniai augalai |lv=Krustziežu (kāpostu) dzimta |mk=Зелки |ml=ബ്രാസ്സിക്കേസീ |nl=Kruisbloemenfamilie |nn=Krossblomfamilien |no=Korsblomstfamilien |pl=Kapustowate |pnb=سرھوں دا ٹبر, سروں دا ٹبر |pt=Brassicáceas, Crucíferas |qu=Chakana tuktuyuq rikch'aq ayllu |ro=Brassicaceele, cruciferele |ru=Капустные |sd=ڳاڙهي موري |sgs=Krīžmažėidē augalā |sh=Krstašice |sk=Kapustovité |sl=križnice |sr=Kupusnjače |sv=Korsblommiga växter |te=బ్రాసికేసి |th=วงศ์ผักกาด |tr=Turpgiller |uk=Капустяні |vi=Họ Cải |vls=Kruusblommign |wa=Cabutacêyes, Cabutreces |zh=十字花科 }} {{Commons|Category:Brassicaceae|Brassicaceae}} {{Taxonbar|from=Q156888}} [[Category:Gilbert Thomas Burnett taxa]] r5b3j08mzu1eqy8kr6momaiklwxypy1 11322032 11322025 2026-10-21T15:06:51Z Andyboorman 251907 11322032 wikitext text/x-wiki {{Image|Brassica nigra.jpg|''[[Brassica nigra]]''}} =={{int:Taxonavigation}}== {{Brassicaceae}} Subfamiliae: {{subfam|Aethionemoideae}} {{subfamlast|Brassicoideae}} Tribus: {{trib|Aethionemeae}} {{trib|Alysseae}} {{trib|Alyssopsideae}} {{trib|Anastaticeae}} {{trib|Anchonieae}} {{trib|Aphragmeae}} {{trib|Arabideae}} {{trib|Arabidopsideae}} {{trib|Asperuginoideae}} {{trib|Asteae}} {{trib|Biscutelleae}} {{trib|Bivonaeeae}} {{trib|Boechereae}} {{trib|Brassiceae}} {{trib|Buniadeae}} {{trib|Calepineae}} {{trib|Camelineae}} {{trib|Cardamineae}} {{trib|Chamireae}} {{trib|Chorisporeae}} {{trib|Cochlearieae}} {{trib|Coluteocarpeae}} {{trib|Conringieae}} {{trib|Cremolobeae}} {{trib|Crucihimalayeae}} {{trib|Descurainieae}} {{trib|Dontostemoneae}} {{trib|Erysimeae}} {{trib|Euclidieae}} {{trib|Eudemeae}} {{trib|Eutremeae}} {{trib|Fourraeeae}} {{trib|Halimolobeae}} {{trib|Heliophileae}} {{trib|Hemilophieae}} {{trib|Hesperideae}} {{trib|Hillielleae}} {{trib|Iberideae}} {{trib|Isatideae}} {{trib|Kernereae}} {{trib|Lepidieae}} {{trib|Malcolmieae}} {{trib|Megacarpaeeae}} {{trib|Microlepidieae}} {{trib|Notothlaspideae}} {{trib|Oreophytoneae}} {{trib|Physarieae}} {{trib|Plagiolobeae}} {{trib|Schizopetaleae}} {{trib|Schrenkielleae}} {{trib|Scoliaxoneae}} {{trib|Sisymbrieae}} {{trib|Smelowskieae}} {{trib|Stevenieae}} {{trib|Subularieae}} {{trib|Thelypodieae}} {{trib|Thlaspideae}} {{trib|Turritideae}} {{triblast|Yinshanieae}} ==={{int:Overview of genera}}=== {{g|Abdra}} {{g|Acirostrum}} {{g|Acuston}} {{g|Aethionema}} {{g|Aimara}} {{g|Alliaria}} {{g|Alshehbazia}} {{g|Altriarabis}} {{g|Alyssoides}} {{g|Alyssopsis}} {{g|Alyssum}} {{g|Ammosperma}} {{g|Anastatica}} {{g|Ancashia}} {{g|Andrzeiowskia}} {{g|Anelsonia}} {{g|Anzhengxia}} {{g|Aphragmus}} {{g|Aplanodes (Brassicaceae)|Aplanodes}} {{g|Arabidella}} {{g|Arabidopsis}} {{g|Arabis}} {{g|Arcyosperma}} {{g|Armoracia}} {{g|Aschersoniodoxa}} {{g|Asperuginoides}} {{g|Asta}} {{g|Atacama}} {{g|Atelanthera}} {{g|Athysanus}} {{g|Aubrieta}} {{g|Aurinia}} {{g|Baimashania}} {{g|Ballantinia}} {{g|Barbarea}} {{g|Bengt-jonsellia}} {{g|Berteroa}} {{g|Biscutella}} {{g|Bivonaea}} {{g|Blennodia}} {{g|Boechera}} {{g|Borealandea}} {{g|Bornmuellera}} {{g|Borodinia (Brassicaceae)|Borodinia}} {{g|Botschantzevia}} {{g|Brachypus}} {{g|Brassica}} {{g|Braya (Brassicaceae)|Braya}} {{g|Bunias}} {{g|Cakile}} {{g|Calepina}} {{g|Calymmatium}} {{g|Camelina}} {{g|Camelinopsis}} {{g|Capsella (Brassicaceae)|Capsella}} {{g|Cardamine}} {{g|Carinavalva}} {{g|Carrichtera}} {{g|Catenulina}} {{g|Catolobus}} {{g|Ceratocnemum}} {{g|Chamira}} {{g|Chartoloma}} {{g|Chaunanthus}} {{g|Chilocardamum}} {{g|Chlorocrambe}} {{g|Chorispora}} {{g|Christolea}} {{g|Chrysochamela}} {{g|Cithareloma}} {{g|Clastopus}} {{g|Clausia (Brassicaceae)|Clausia}} {{g|Clypeola (Brassicaceae)|Clypeola}} {{g|Cochlearia}} {{g|Coincya}} {{g|Conringia}} {{g|Cordylocarpus}} {{g|Crambe}} {{g|Crambella}} {{g|Cremolobus}} {{g|Crucihimalaya}} {{g|Cryptospora}} {{g|Cuphonotus}} {{g|Cuprella}} {{g|Cusickiella}} {{g|Cymatocarpus (Brassicaceae)|Cymatocarpus}} {{g|Cyphocardamum}} {{g|Dactylocardamum}} {{g|Degenia}} {{g|Delpinophytum}} {{g|Dendroarabis}} {{g|Descurainia}} {{g|Diceratella}} {{g|Dichasianthus}} {{g|Dictyophragmus}} {{g|Didesmus}} {{g|Didymophysa (Brassicaceae)|Didymophysa}} {{g|Dielsiocharis}} {{g|Dilophia}} {{g|Dimorphocarpa}} {{g|Diplotaxis (Brassicaceae)|Diplotaxis}} {{g|Dipoma}} {{g|Diptychocarpus}} {{g|Dithyrea}} {{g|Dontostemon}} {{g|Douepea}} {{g|Draba}} {{g|Drabastrum}} {{g|Dryopetalon}} {{g|Eigia}} {{g|Enarthrocarpus}} {{g|Englerocharis}} {{g|Eremobium}} {{g|Eremoblastus}} {{g|Eremophyton}} {{g|Eruca (Brassicaceae)|Eruca}} {{g|Erucaria}} {{g|Erucastrum}} {{g|Erysimum}} {{g|Euclidium}} {{g|Eudema}} {{g|Eutrema}} {{g|Exhalimolobos}} {{g|Farsetia}} {{g|Fezia}} {{g|Fibigia}} {{g|Foleyola}} {{g|Fortuynia}} {{g|Fourraea}} {{g|Galitzkya}} {{g|Geococcus (Brassicaceae)|Geococcus}} {{g|Glastaria}} {{g|Goerkemia}} {{g|Goldbachia}} {{g|Gongylis}} {{g|Graellsia Boiss.|Graellsia}} {{g|Guiraoa}} {{g|Halimolobos}} {{g|Harmsiodoxa}} {{g|Hedinia}} {{g|Heldreichia}} {{g|Helicodraba}} {{g|Heliophila}} {{g|Hemicrambe}} {{g|Hemilophia}} {{g|Henophyton}} {{g|Hesperidanthus}} {{g|Hesperis}} {{g|Hilliella}} {{g|Hirschfeldia}} {{g|Hollermayera}} {{g|Hormathophylla}} {{g|Hornungia}} {{g|Horwoodia}} {{g|Hurkaea}} {{g|Ianhedgea}} {{g|Iberis}} {{g|Idahoa}} {{g|Iljinskaea}} {{g|Iodanthus}} {{g|Ionopsidium}} {{g|Irenepharsus}} {{g|Isatis}} {{g|Iskandera}} {{g|Ivania}} {{g|Kernera}} {{g|Kremeriella}} {{g|Lachnocapsa}} {{g|Lachnoloma}} {{g|Ladakiella}} {{g|Leavenworthia}} {{g|Leiocarpaea}} {{g|Leiospora}} {{g|Lepidium}} {{g|Lepidostemon}} {{g|Lepidotrichum}} {{g|Leptaleum}} {{g|Lithodraba}} {{g|Litwinowia}} {{g|Lobularia (Brassicaceae)|Lobularia}} {{g|Lunaria}} {{g|Lutzia (Brassicaceae)|Lutzia}} {{g|Lyrocarpa}} {{g|Lysakia}} {{g|Macropodium}} {{g|Malcolmia}} {{g|Mancoa}} {{g|Marcus-kochia}} {{g|Maresia}} {{g|Mathewsia}} {{g|Matthiola}} {{g|Megacarpaea}} {{g|Megadenia}} {{g|Menkea}} {{g|Menonvillea}} {{g|Metashangrilaia}} {{g|Microlepidium}} {{g|Microstigma (Brassicaceae)|Microstigma}} {{g|Microthlaspi}} {{g|Morettia}} {{g|Moricandia (Brassicaceae)|Moricandia}} {{g|Morisia}} {{g|Mostacillastrum}} {{g|Mummenhoffia}} {{g|Murbeckiella}} {{g|Muricaria}} {{g|Mutarda}} {{g|Myagrum}} {{g|Nasturtiopsis}} {{g|Nasturtium}} {{g|Neotorularia}} {{g|Nerisyrenia}} {{g|Neslia}} {{g|Neuontobotrys}} {{g|Noccaea}} {{g|Noccidium}} {{g|Notoceras}} {{g|Notothlaspi}} {{g|Ochthodium}} {{g|Octoceras}} {{g|Olimarabidopsis}} {{g|Onuris}} {{g|Oreophyton}} {{g|Ornithocarpa}} {{g|Orychophragmus}} {{g|Otocarpus}} {{g|Pachycladon}} {{g|Pachymitus}} {{g|Pachyneurum}} {{g|Pachyphragma}} {{g|Parlatoria (Brassicaceae)|Parlatoria}} {{g|Parodiodoxa}} {{g|Parolinia}} {{g|Parrya}} {{g|Parryodes}} {{g|Paysonia}} {{g|Peltaria}} {{g|Peltariopsis}} {{g|Pennellia}} {{g|Petrocallis}} {{g|Petroravenia}} {{g|Phlebolobium}} {{g|Phlegmatospermum}} {{g|Phoenicaulis}} {{g|Physaria}} {{g|Physoptychis}} {{g|Physorhynchus}} {{g|Plagioloba}} {{g|Planodes}} {{g|Polyctenium}} {{g|Polypsecadium}} {{g|Pringlea}} {{g|Pseuderucaria}} {{g|Pseudoarabidopsis}} {{g|Pseudocamelina}} {{g|Pseudoturritis}} {{g|Pseudovesicaria}} {{g|Psychine}} {{g|Pterygostemon}} {{g|Pugionium}} {{g|Pulvinatusia}} {{g|Pycnoplinthopsis}} {{g|Pycnoplinthus}} {{g|Quezeliantha}} {{g|Raffenaldia}} {{g|Raphanorhyncha}} {{g|Raphanus}} {{g|Rapistrum}} {{g|Resetnikia}} {{g|Rhammatophyllum}} {{g|Rhizobotrya}} {{g|Ricotia}} {{g|Robeschia}} {{g|Romanschulzia}} {{g|Rorippa}} {{g|Rudolf-kamelinia}} {{g|Rytidocarpus}} {{g|Sarcodraba}} {{g|Savignya}} {{g|Scambopus}} {{g|Schimpera}} {{g|Schizopetalon}} {{g|Schouwia}} {{g|Schrenkiella}} {{g|Scoliaxon}} {{g|Selenia (Brassicaceae)|Selenia}} {{g|Shangrilaia}} {{g|Sibara}} {{g|Sinalliaria}} {{g|Sinapidendron}} {{g|Sinapis}} {{g|Sisymbrella}} {{g|Sisymbriopsis}} {{g|Sisymbrium}} {{g|Smelowskia}} {{g|Sobolewskia}} {{g|Solms-laubachia}} {{g|Sphaerocardamum}} {{g|Spryginia}} {{g|Stanleya}} {{g|Stenodrabopsis}} {{g|Stenopetalum}} {{g|Sterigmostemum}} {{g|Stevenia (Brassicaceae)|Stevenia}} {{g|Straussiella}} {{g|Streptanthella}} {{g|Streptanthus}} {{g|Streptoloma}} {{g|Strigosella}} {{g|Subularia}} {{g|Succowia}} {{g|Synstemon}} {{g|Synthlipsis (Brassicaceae)|Synthlipsis}} {{g|Takhtajaniella}} {{g|Teesdalia}} {{g|Tetracme (Brassicaceae)|Tetracme}} {{g|Thelypodiopsis}} {{g|Thelypodium}} {{g|Thlaspi}} {{g|Thysanocarpus}} {{g|Transberingia}} {{g|Trichotolinum}} {{g|Tropidocarpum}} {{g|Turritis}} {{g|Vella}} {{g|Veselskya}} {{g|Warea}} {{g|Weberbauera}} {{g|Xerodraba}} {{g|Yinshania}} {{g|Yosemitea}} {{g|Zilla (Brassicaceae)|Zilla}} {{g|Zuloagocardamum}} {{glast|Zuvanda}} Nothogenera: {{g|× Brassarda}} {{glast|× Rapistrosymbrium}} =={{int:Name}}== Brassicaceae {{a|Burnett}}, Outlines Bot.: 854, 1093, 1123 (1835), {{NC}} * {{TG|Brassica|{{a|L.}}, Sp. Pl. 2: 666 (1753).}} ==={{int:Synonyms}}=== {{HOT}} ** Cruciferae {{a|Juss.}}, Gen. Pl. 237 (1789), {{NC}} [[nom. alt.]] [https://www.iapt-taxon.org/nomen/pages/main/art_18.html#18.5 Art. 18.5.] ICN<br> Note: Circumscription [[emend.]] German et al. (2023) =={{int:References}}== ==={{int:Primary references}}=== {{Burnett, 1835}}: 854, 1093, (1123). {{German et al., 2023}} ==={{int:Additional references}}=== {{Al-Shehbaz et al., 2006}} {{Al-Shehbaz, 2012}} {{Al-Shehbaz, 2014}} {{Al-Shehbaz & German, 2016}} {{Al-Shehbaz et al., 2023}} {{Ali et al., 2016}} {{APG, 2016}} {{Chen et al., 2016f}} {{Esmailbegi et al., 2018}} {{Francis et al., 2021}} {{Iltis et al., 2011}} {{German & Al-Shehbaz, 2008}} {{German et al., 2009}} {{German et al., 2023}} * {{aut|Koch, M.A.}}, {{aut|Kiefer, M.}}, {{aut|German, D.A.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}} & {{aut|Schmickl, R.}} 2012. BrassiBase: Tools and biological resources to study characters and traits in the Brassicaceae - version 1.1. ''[[Taxon]]'' 61(5): 1001–1009. {{doi|10.1002/tax.615007}}{{JSTOR|41679346}} {{ResGate|259632408}} [https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. * {{aut|Kiefer, M.}}, {{aut|Schmickl, R.}}, {{aut|German, D.A.}}, {{aut|Lysak, M.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}}, {{aut|Stamatakis, A.}} & {{aut|Koch, M.A.}} 2014. ''BrassiBase'': Introduction to a novel database on Brassicaceae evolution. ''[[Plant and Cell Physiology]]'' 55(1): e3. {{doi|10.1093/pcp/pct158}} [https://web.archive.org/web/20190213025659/https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. {{Nikolov et al., 2019}} {{Warwick et al., 2006}} {{Warwick et al., 2010}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{IPNI||2026|Oct 21}} =={{int:Vernacular names}}== {{VN |ar=كرنبية |ast =Brasicacees, crucíferas |az=Kələmçiçəyikimilər |ba=Кәбеҫтә һымаҡтар |bar=Kreizbliatengwoxad |be=Капуставыя |bg=Кръстоцветни |ca=Brassicàcies |cs=Brukvovité |da=Korsblomst-familien |de=Kreuzblütengewächse |en=Cabbage Family, Mustard Family, Crucifers |eo=Brasikacoj, Kruciferoj |es=Brasicáceas, Crucíferas |et=Ristõielised |fa=شب‌بویان |fi=Ristikukkaiskasvit |fr=Brassicacées |frr=Krüsbloosen |gl=Brasicáceas |he=מצליבים |hi=ब्रैसिकेसी |hr=Krstašice |hsb=Křižnokwětne rostliny |hu=Káposztafélék |hy=Խաչածաղկավորներ, Կաղամբազգիներ |id=Suku kubis-kubisan |is=Krossblómaætt |it=Crocifere |ja=アブラナ科 |ka=კომბოსტოსებრნი, ჯვაროსნები |kk=Орамжапырақ тұқымдасы |ko=배추과, 십자화과 |ku=Famîleya selketûran |lt=Bastutiniai augalai |lv=Krustziežu (kāpostu) dzimta |mk=Зелки |ml=ബ്രാസ്സിക്കേസീ |nl=Kruisbloemenfamilie |nn=Krossblomfamilien |no=Korsblomstfamilien |pl=Kapustowate |pnb=سرھوں دا ٹبر, سروں دا ٹبر |pt=Brassicáceas, Crucíferas |qu=Chakana tuktuyuq rikch'aq ayllu |ro=Brassicaceele, cruciferele |ru=Капустные |sd=ڳاڙهي موري |sgs=Krīžmažėidē augalā |sh=Krstašice |sk=Kapustovité |sl=križnice |sr=Kupusnjače |sv=Korsblommiga växter |te=బ్రాసికేసి |th=วงศ์ผักกาด |tr=Turpgiller |uk=Капустяні |vi=Họ Cải |vls=Kruusblommign |wa=Cabutacêyes, Cabutreces |zh=十字花科 }} {{Commons|Category:Brassicaceae|Brassicaceae}} {{Taxonbar|from=Q156888}} [[Category:Gilbert Thomas Burnett taxa]] 9oo9gzcxh50iu33bs2nsnqb2fynfzff 11322132 11322032 2026-10-21T16:29:00Z Andyboorman 251907 11322132 wikitext text/x-wiki {{Image|Brassica nigra.jpg|''[[Mutarda nigra]]''}} =={{int:Taxonavigation}}== {{Brassicaceae}} Subfamiliae: {{subfam|Aethionemoideae}} {{subfamlast|Brassicoideae}} Tribus: {{trib|Aethionemeae}} {{trib|Alysseae}} {{trib|Alyssopsideae}} {{trib|Anastaticeae}} {{trib|Anchonieae}} {{trib|Aphragmeae}} {{trib|Arabideae}} {{trib|Arabidopsideae}} {{trib|Asperuginoideae}} {{trib|Asteae}} {{trib|Biscutelleae}} {{trib|Bivonaeeae}} {{trib|Boechereae}} {{trib|Brassiceae}} {{trib|Buniadeae}} {{trib|Calepineae}} {{trib|Camelineae}} {{trib|Cardamineae}} {{trib|Chamireae}} {{trib|Chorisporeae}} {{trib|Cochlearieae}} {{trib|Coluteocarpeae}} {{trib|Conringieae}} {{trib|Cremolobeae}} {{trib|Crucihimalayeae}} {{trib|Descurainieae}} {{trib|Dontostemoneae}} {{trib|Erysimeae}} {{trib|Euclidieae}} {{trib|Eudemeae}} {{trib|Eutremeae}} {{trib|Fourraeeae}} {{trib|Halimolobeae}} {{trib|Heliophileae}} {{trib|Hemilophieae}} {{trib|Hesperideae}} {{trib|Hillielleae}} {{trib|Iberideae}} {{trib|Isatideae}} {{trib|Kernereae}} {{trib|Lepidieae}} {{trib|Malcolmieae}} {{trib|Megacarpaeeae}} {{trib|Microlepidieae}} {{trib|Notothlaspideae}} {{trib|Oreophytoneae}} {{trib|Physarieae}} {{trib|Plagiolobeae}} {{trib|Schizopetaleae}} {{trib|Schrenkielleae}} {{trib|Scoliaxoneae}} {{trib|Sisymbrieae}} {{trib|Smelowskieae}} {{trib|Stevenieae}} {{trib|Subularieae}} {{trib|Thelypodieae}} {{trib|Thlaspideae}} {{trib|Turritideae}} {{triblast|Yinshanieae}} ==={{int:Overview of genera}}=== {{g|Abdra}} {{g|Acirostrum}} {{g|Acuston}} {{g|Aethionema}} {{g|Aimara}} {{g|Alliaria}} {{g|Alshehbazia}} {{g|Altriarabis}} {{g|Alyssoides}} {{g|Alyssopsis}} {{g|Alyssum}} {{g|Ammosperma}} {{g|Anastatica}} {{g|Ancashia}} {{g|Andrzeiowskia}} {{g|Anelsonia}} {{g|Anzhengxia}} {{g|Aphragmus}} {{g|Aplanodes (Brassicaceae)|Aplanodes}} {{g|Arabidella}} {{g|Arabidopsis}} {{g|Arabis}} {{g|Arcyosperma}} {{g|Armoracia}} {{g|Aschersoniodoxa}} {{g|Asperuginoides}} {{g|Asta}} {{g|Atacama}} {{g|Atelanthera}} {{g|Athysanus}} {{g|Aubrieta}} {{g|Aurinia}} {{g|Baimashania}} {{g|Ballantinia}} {{g|Barbarea}} {{g|Bengt-jonsellia}} {{g|Berteroa}} {{g|Biscutella}} {{g|Bivonaea}} {{g|Blennodia}} {{g|Boechera}} {{g|Borealandea}} {{g|Bornmuellera}} {{g|Borodinia (Brassicaceae)|Borodinia}} {{g|Botschantzevia}} {{g|Brachypus}} {{g|Brassica}} {{g|Braya (Brassicaceae)|Braya}} {{g|Bunias}} {{g|Cakile}} {{g|Calepina}} {{g|Calymmatium}} {{g|Camelina}} {{g|Camelinopsis}} {{g|Capsella (Brassicaceae)|Capsella}} {{g|Cardamine}} {{g|Carinavalva}} {{g|Carrichtera}} {{g|Catenulina}} {{g|Catolobus}} {{g|Ceratocnemum}} {{g|Chamira}} {{g|Chartoloma}} {{g|Chaunanthus}} {{g|Chilocardamum}} {{g|Chlorocrambe}} {{g|Chorispora}} {{g|Christolea}} {{g|Chrysochamela}} {{g|Cithareloma}} {{g|Clastopus}} {{g|Clausia (Brassicaceae)|Clausia}} {{g|Clypeola (Brassicaceae)|Clypeola}} {{g|Cochlearia}} {{g|Coincya}} {{g|Conringia}} {{g|Cordylocarpus}} {{g|Crambe}} {{g|Crambella}} {{g|Cremolobus}} {{g|Crucihimalaya}} {{g|Cryptospora}} {{g|Cuphonotus}} {{g|Cuprella}} {{g|Cusickiella}} {{g|Cymatocarpus (Brassicaceae)|Cymatocarpus}} {{g|Cyphocardamum}} {{g|Dactylocardamum}} {{g|Degenia}} {{g|Delpinophytum}} {{g|Dendroarabis}} {{g|Descurainia}} {{g|Diceratella}} {{g|Dichasianthus}} {{g|Dictyophragmus}} {{g|Didesmus}} {{g|Didymophysa (Brassicaceae)|Didymophysa}} {{g|Dielsiocharis}} {{g|Dilophia}} {{g|Dimorphocarpa}} {{g|Diplotaxis (Brassicaceae)|Diplotaxis}} {{g|Dipoma}} {{g|Diptychocarpus}} {{g|Dithyrea}} {{g|Dontostemon}} {{g|Douepea}} {{g|Draba}} {{g|Drabastrum}} {{g|Dryopetalon}} {{g|Eigia}} {{g|Enarthrocarpus}} {{g|Englerocharis}} {{g|Eremobium}} {{g|Eremoblastus}} {{g|Eremophyton}} {{g|Eruca (Brassicaceae)|Eruca}} {{g|Erucaria}} {{g|Erucastrum}} {{g|Erysimum}} {{g|Euclidium}} {{g|Eudema}} {{g|Eutrema}} {{g|Exhalimolobos}} {{g|Farsetia}} {{g|Fezia}} {{g|Fibigia}} {{g|Foleyola}} {{g|Fortuynia}} {{g|Fourraea}} {{g|Galitzkya}} {{g|Geococcus (Brassicaceae)|Geococcus}} {{g|Glastaria}} {{g|Goerkemia}} {{g|Goldbachia}} {{g|Gongylis}} {{g|Graellsia Boiss.|Graellsia}} {{g|Guiraoa}} {{g|Halimolobos}} {{g|Harmsiodoxa}} {{g|Hedinia}} {{g|Heldreichia}} {{g|Helicodraba}} {{g|Heliophila}} {{g|Hemicrambe}} {{g|Hemilophia}} {{g|Henophyton}} {{g|Hesperidanthus}} {{g|Hesperis}} {{g|Hilliella}} {{g|Hirschfeldia}} {{g|Hollermayera}} {{g|Hormathophylla}} {{g|Hornungia}} {{g|Horwoodia}} {{g|Hurkaea}} {{g|Ianhedgea}} {{g|Iberis}} {{g|Idahoa}} {{g|Iljinskaea}} {{g|Iodanthus}} {{g|Ionopsidium}} {{g|Irenepharsus}} {{g|Isatis}} {{g|Iskandera}} {{g|Ivania}} {{g|Kernera}} {{g|Kremeriella}} {{g|Lachnocapsa}} {{g|Lachnoloma}} {{g|Ladakiella}} {{g|Leavenworthia}} {{g|Leiocarpaea}} {{g|Leiospora}} {{g|Lepidium}} {{g|Lepidostemon}} {{g|Lepidotrichum}} {{g|Leptaleum}} {{g|Lithodraba}} {{g|Litwinowia}} {{g|Lobularia (Brassicaceae)|Lobularia}} {{g|Lunaria}} {{g|Lutzia (Brassicaceae)|Lutzia}} {{g|Lyrocarpa}} {{g|Lysakia}} {{g|Macropodium}} {{g|Malcolmia}} {{g|Mancoa}} {{g|Marcus-kochia}} {{g|Maresia}} {{g|Mathewsia}} {{g|Matthiola}} {{g|Megacarpaea}} {{g|Megadenia}} {{g|Menkea}} {{g|Menonvillea}} {{g|Metashangrilaia}} {{g|Microlepidium}} {{g|Microstigma (Brassicaceae)|Microstigma}} {{g|Microthlaspi}} {{g|Morettia}} {{g|Moricandia (Brassicaceae)|Moricandia}} {{g|Morisia}} {{g|Mostacillastrum}} {{g|Mummenhoffia}} {{g|Murbeckiella}} {{g|Muricaria}} {{g|Mutarda}} {{g|Myagrum}} {{g|Nasturtiopsis}} {{g|Nasturtium}} {{g|Neotorularia}} {{g|Nerisyrenia}} {{g|Neslia}} {{g|Neuontobotrys}} {{g|Noccaea}} {{g|Noccidium}} {{g|Notoceras}} {{g|Notothlaspi}} {{g|Ochthodium}} {{g|Octoceras}} {{g|Olimarabidopsis}} {{g|Onuris}} {{g|Oreophyton}} {{g|Ornithocarpa}} {{g|Orychophragmus}} {{g|Otocarpus}} {{g|Pachycladon}} {{g|Pachymitus}} {{g|Pachyneurum}} {{g|Pachyphragma}} {{g|Parlatoria (Brassicaceae)|Parlatoria}} {{g|Parodiodoxa}} {{g|Parolinia}} {{g|Parrya}} {{g|Parryodes}} {{g|Paysonia}} {{g|Peltaria}} {{g|Peltariopsis}} {{g|Pennellia}} {{g|Petrocallis}} {{g|Petroravenia}} {{g|Phlebolobium}} {{g|Phlegmatospermum}} {{g|Phoenicaulis}} {{g|Physaria}} {{g|Physoptychis}} {{g|Physorhynchus}} {{g|Plagioloba}} {{g|Planodes}} {{g|Polyctenium}} {{g|Polypsecadium}} {{g|Pringlea}} {{g|Pseuderucaria}} {{g|Pseudoarabidopsis}} {{g|Pseudocamelina}} {{g|Pseudoturritis}} {{g|Pseudovesicaria}} {{g|Psychine}} {{g|Pterygostemon}} {{g|Pugionium}} {{g|Pulvinatusia}} {{g|Pycnoplinthopsis}} {{g|Pycnoplinthus}} {{g|Quezeliantha}} {{g|Raffenaldia}} {{g|Raphanorhyncha}} {{g|Raphanus}} {{g|Rapistrum}} {{g|Resetnikia}} {{g|Rhammatophyllum}} {{g|Rhizobotrya}} {{g|Ricotia}} {{g|Robeschia}} {{g|Romanschulzia}} {{g|Rorippa}} {{g|Rudolf-kamelinia}} {{g|Rytidocarpus}} {{g|Sarcodraba}} {{g|Savignya}} {{g|Scambopus}} {{g|Schimpera}} {{g|Schizopetalon}} {{g|Schouwia}} {{g|Schrenkiella}} {{g|Scoliaxon}} {{g|Selenia (Brassicaceae)|Selenia}} {{g|Shangrilaia}} {{g|Sibara}} {{g|Sinalliaria}} {{g|Sinapidendron}} {{g|Sinapis}} {{g|Sisymbrella}} {{g|Sisymbriopsis}} {{g|Sisymbrium}} {{g|Smelowskia}} {{g|Sobolewskia}} {{g|Solms-laubachia}} {{g|Sphaerocardamum}} {{g|Spryginia}} {{g|Stanleya}} {{g|Stenodrabopsis}} {{g|Stenopetalum}} {{g|Sterigmostemum}} {{g|Stevenia (Brassicaceae)|Stevenia}} {{g|Straussiella}} {{g|Streptanthella}} {{g|Streptanthus}} {{g|Streptoloma}} {{g|Strigosella}} {{g|Subularia}} {{g|Succowia}} {{g|Synstemon}} {{g|Synthlipsis (Brassicaceae)|Synthlipsis}} {{g|Takhtajaniella}} {{g|Teesdalia}} {{g|Tetracme (Brassicaceae)|Tetracme}} {{g|Thelypodiopsis}} {{g|Thelypodium}} {{g|Thlaspi}} {{g|Thysanocarpus}} {{g|Transberingia}} {{g|Trichotolinum}} {{g|Tropidocarpum}} {{g|Turritis}} {{g|Vella}} {{g|Veselskya}} {{g|Warea}} {{g|Weberbauera}} {{g|Xerodraba}} {{g|Yinshania}} {{g|Yosemitea}} {{g|Zilla (Brassicaceae)|Zilla}} {{g|Zuloagocardamum}} {{glast|Zuvanda}} Nothogenera: {{g|× Brassarda}} {{glast|× Rapistrosymbrium}} =={{int:Name}}== Brassicaceae {{a|Burnett}}, Outlines Bot.: 854, 1093, 1123 (1835), {{NC}} * {{TG|Brassica|{{a|L.}}, Sp. Pl. 2: 666 (1753).}} ==={{int:Synonyms}}=== {{HOT}} ** Cruciferae {{a|Juss.}}, Gen. Pl. 237 (1789), {{NC}} [[nom. alt.]] [https://www.iapt-taxon.org/nomen/pages/main/art_18.html#18.5 Art. 18.5.] ICN<br> Note: Circumscription [[emend.]] German et al. (2023) =={{int:References}}== ==={{int:Primary references}}=== {{Burnett, 1835}}: 854, 1093, (1123). {{German et al., 2023}} ==={{int:Additional references}}=== {{Al-Shehbaz et al., 2006}} {{Al-Shehbaz, 2012}} {{Al-Shehbaz, 2014}} {{Al-Shehbaz & German, 2016}} {{Al-Shehbaz et al., 2023}} {{Ali et al., 2016}} {{APG, 2016}} {{Chen et al., 2016f}} {{Esmailbegi et al., 2018}} {{Francis et al., 2021}} {{Iltis et al., 2011}} {{German & Al-Shehbaz, 2008}} {{German et al., 2009}} {{German et al., 2023}} * {{aut|Koch, M.A.}}, {{aut|Kiefer, M.}}, {{aut|German, D.A.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}} & {{aut|Schmickl, R.}} 2012. BrassiBase: Tools and biological resources to study characters and traits in the Brassicaceae - version 1.1. ''[[Taxon]]'' 61(5): 1001–1009. {{doi|10.1002/tax.615007}}{{JSTOR|41679346}} {{ResGate|259632408}} [https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. * {{aut|Kiefer, M.}}, {{aut|Schmickl, R.}}, {{aut|German, D.A.}}, {{aut|Lysak, M.}}, {{aut|Al-Shehbaz, I.A.}}, {{aut|Franzke, A.}}, {{aut|Mummenhoff, K.}}, {{aut|Stamatakis, A.}} & {{aut|Koch, M.A.}} 2014. ''BrassiBase'': Introduction to a novel database on Brassicaceae evolution. ''[[Plant and Cell Physiology]]'' 55(1): e3. {{doi|10.1093/pcp/pct158}} [https://web.archive.org/web/20190213025659/https://brassibase.cos.uni-heidelberg.de/ BrassiBase Online]. {{Nikolov et al., 2019}} {{Warwick et al., 2006}} {{Warwick et al., 2010}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{IPNI||2026|Oct 21}} =={{int:Vernacular names}}== {{VN |ar=كرنبية |ast =Brasicacees, crucíferas |az=Kələmçiçəyikimilər |ba=Кәбеҫтә һымаҡтар |bar=Kreizbliatengwoxad |be=Капуставыя |bg=Кръстоцветни |ca=Brassicàcies |cs=Brukvovité |da=Korsblomst-familien |de=Kreuzblütengewächse |en=Cabbage Family, Mustard Family, Crucifers |eo=Brasikacoj, Kruciferoj |es=Brasicáceas, Crucíferas |et=Ristõielised |fa=شب‌بویان |fi=Ristikukkaiskasvit |fr=Brassicacées |frr=Krüsbloosen |gl=Brasicáceas |he=מצליבים |hi=ब्रैसिकेसी |hr=Krstašice |hsb=Křižnokwětne rostliny |hu=Káposztafélék |hy=Խաչածաղկավորներ, Կաղամբազգիներ |id=Suku kubis-kubisan |is=Krossblómaætt |it=Crocifere |ja=アブラナ科 |ka=კომბოსტოსებრნი, ჯვაროსნები |kk=Орамжапырақ тұқымдасы |ko=배추과, 십자화과 |ku=Famîleya selketûran |lt=Bastutiniai augalai |lv=Krustziežu (kāpostu) dzimta |mk=Зелки |ml=ബ്രാസ്സിക്കേസീ |nl=Kruisbloemenfamilie |nn=Krossblomfamilien |no=Korsblomstfamilien |pl=Kapustowate |pnb=سرھوں دا ٹبر, سروں دا ٹبر |pt=Brassicáceas, Crucíferas |qu=Chakana tuktuyuq rikch'aq ayllu |ro=Brassicaceele, cruciferele |ru=Капустные |sd=ڳاڙهي موري |sgs=Krīžmažėidē augalā |sh=Krstašice |sk=Kapustovité |sl=križnice |sr=Kupusnjače |sv=Korsblommiga växter |te=బ్రాసికేసి |th=วงศ์ผักกาด |tr=Turpgiller |uk=Капустяні |vi=Họ Cải |vls=Kruusblommign |wa=Cabutacêyes, Cabutreces |zh=十字花科 }} {{Commons|Category:Brassicaceae|Brassicaceae}} {{Taxonbar|from=Q156888}} [[Category:Gilbert Thomas Burnett taxa]] ahaeoyqsuci7b5g4dcxoy2b5z13xf1s Frederick John Jackson 0 32943 11322492 9274964 2026-10-22T00:44:33Z The editor 2345 2915305 11322492 wikitext text/x-wiki {{Image}} '''Frederick John Jackson''' (1859-1929), English explorer and ornithologist. {{Taxa authored}} {{Eponyms}} {{Authority control}} {{DEFAULTSORT:Jackson, Frederick John}} [[Category:Taxon authorities]] [[Category:Ornithologists]] aa0ld3fc5s6g5rny26h9rzvmdcchqtv Jackson 0 32944 11322494 11057156 2026-10-22T00:46:19Z The editor 2345 2915305 /* */ 11322494 wikitext text/x-wiki {{Refer|authority}} * [[Albert Bruce Jackson]] (1876–1947; '''A.B.Jacks.'''), British botanist * [[Arthur Keith Jackson]] (born 1914; '''A.K.Jacks.'''), British botanist * [[Arthur Randall Jackson]] (1877-1944) British arachnologist * [[Benjamin Daydon Jackson]] (1846–1927; '''B.D.Jacks.'''), British botanist * [[Emily A. Jackson]], South African herpetologist * [[Francis W. F. Jackson]] (1881–1936), English Army officer, major * [[Frederick John Jackson]] (1859–1929), English ornithologist * [[Gary L. Jackson]], palaeontologist * [[George Jackson]] (ca. 1780–1811; '''Jacks.'''), English botanist * [[Harold Gordon Jackson]], British isopodologist * [[Hartley Harrad Thompson Jackson]] (1881–1976), U.S. mammalogist * [[Herbert Spencer Jackson]] (1883–1951; '''H.S.Jacks.'''), mycologist * [[Hilery Desmond Jackson]] (1935–2022), ornithologist * [[James F. Jackson]], herpetologist * [[Jennifer A. Jackson]], British carcinologist * [[Jeremy B.C. Jackson]], U.S. bryozoologist * [[John D. Jackson]], ('''J.D.Jacks.'''), botanist * [[John Wilfrid Jackson]] (1880–1978), British conchologist and geologist * [[Kate Jackson]], U.S. herpetologist * [[Kathy Jo A. Jackson]], tardigradologist * [[Keith L. Jackson]], Canadian ichthyologist * [[Mary Jackson]], French microbiologist * [[Peter B. N. Jackson]], British ichthyologist * [[Raymond Carl Jackson]] (1928–2008; '''R.C.Jacks.'''), U.S. botanist * [[Stephen M. Jackson]], Australian zoologist * [[Thomas Herbert Elliot Jackson]] (1903–1968), English entomologist {{int Disambiguation |cat=people}} gdbpuf2zyp4if494ooqdbg1uc35bukh 11322496 11322494 2026-10-22T00:51:53Z The editor 2345 2915305 /* */ 11322496 wikitext text/x-wiki {{Refer|authority}} * [[Albert Bruce Jackson]] (1876–1947; '''A.B.Jacks.'''), British botanist * [[Arthur Keith Jackson]] (born 1914; '''A.K.Jacks.'''), British botanist * [[Arthur Randall Jackson]] (1877-1944) British arachnologist * [[Benjamin Daydon Jackson]] (1846–1927; '''B.D.Jacks.'''), English botanist * [[Emily A. Jackson]], South African herpetologist * [[Francis W. F. Jackson]] (1881–1936), English Army officer, major * [[Frederick John Jackson]] (1859–1929), English ornithologist * [[Gary L. Jackson]], palaeontologist * [[George Jackson]] (ca. 1780–1811; '''Jacks.'''), English botanist * [[Harold Gordon Jackson]], British isopodologist * [[Hartley Harrad Thompson Jackson]] (1881–1976), U.S. mammalogist * [[Herbert Spencer Jackson]] (1883–1951; '''H.S.Jacks.'''), mycologist * [[Hilery Desmond Jackson]] (1935–2022), ornithologist * [[James F. Jackson]], herpetologist * [[Jennifer A. Jackson]], British carcinologist * [[Jeremy B.C. Jackson]], U.S. bryozoologist * [[John D. Jackson]], ('''J.D.Jacks.'''), botanist * [[John Wilfrid Jackson]] (1880–1978), British conchologist and geologist * [[Kate Jackson]], U.S. herpetologist * [[Kathy Jo A. Jackson]], tardigradologist * [[Keith L. Jackson]], Canadian ichthyologist * [[Mary Jackson]], French microbiologist * [[Peter B. N. Jackson]], British ichthyologist * [[Raymond Carl Jackson]] (1928–2008; '''R.C.Jacks.'''), U.S. botanist * [[Stephen M. Jackson]], Australian zoologist * [[Thomas Herbert Elliot Jackson]] (1903–1968), English entomologist {{int Disambiguation |cat=people}} 51fy6igvmgmbtb5zq6al2gwlpzta44n 11322499 11322496 2026-10-22T01:03:10Z The editor 2345 2915305 /* */ 11322499 wikitext text/x-wiki {{Refer|authority}} * [[Albert Bruce Jackson]] (1876–1947; '''A.B.Jacks.'''), British botanist * [[Arthur Keith Jackson]] (born 1914; '''A.K.Jacks.'''), British botanist * [[Arthur Randall Jackson]] (1877-1944) British arachnologist * [[Benjamin Daydon Jackson]] (1846–1927; '''B.D.Jacks.'''), English botanist * [[Emily A. Jackson]], South African herpetologist * [[Francis W. F. Jackson]] (1881–1936), English Army officer, major * [[Frederick John Jackson]] (1859–1929), English ornithologist * [[Gary L. Jackson]], palaeontologist * [[George Jackson]] (ca. 1780–1811; '''Jacks.'''), English botanist * [[Harold Gordon Jackson]], British isopodologist * [[Hartley Harrad Thompson Jackson]] (1881–1976), U.S. mammalogist * [[Herbert Spencer Jackson]] (1883–1951; '''H.S.Jacks.'''), mycologist * [[Hilery Desmond Jackson]] (1935–2022), South African ornithologist * [[James F. Jackson]], herpetologist * [[Jennifer A. Jackson]], British carcinologist * [[Jeremy B.C. Jackson]], U.S. bryozoologist * [[John D. Jackson]], ('''J.D.Jacks.'''), botanist * [[John Wilfrid Jackson]] (1880–1978), British conchologist and geologist * [[Kate Jackson]], U.S. herpetologist * [[Kathy Jo A. Jackson]], tardigradologist * [[Keith L. Jackson]], Canadian ichthyologist * [[Mary Jackson]], French microbiologist * [[Peter B. N. Jackson]], British ichthyologist * [[Raymond Carl Jackson]] (1928–2008; '''R.C.Jacks.'''), U.S. botanist * [[Stephen M. Jackson]], Australian zoologist * [[Thomas Herbert Elliot Jackson]] (1903–1968), English entomologist {{int Disambiguation |cat=people}} rmidfy6iksebc4967czdoqbdrmqugvv 11323010 11322499 2026-10-22T10:58:59Z Tommy Kronkvist 596 Text formatting, localization tag, and Disambiguation template fix. 11323010 wikitext text/x-wiki {{Refer|authority}} * [[Albert Bruce Jackson]] (1876–1947, '''A.B.Jacks.'''), British botanist * [[Arthur Keith Jackson]] ({{int:born}} 1914, '''A.K.Jacks.'''), British botanist * [[Arthur Randall Jackson]] (1877–1944) British arachnologist * [[Benjamin Daydon Jackson]] (1846–1927, '''B.D.Jacks.'''), English botanist * [[Emily A. Jackson]], South African herpetologist * [[Francis W. F. Jackson]] (1881–1936), English Army officer, major * [[Frederick John Jackson]] (1859–1929), English ornithologist * [[Gary L. Jackson]], palaeontologist * [[George Jackson]] (ca. 1780–1811, '''Jacks.'''), English botanist * [[Harold Gordon Jackson]], British isopodologist * [[Hartley Harrad Thompson Jackson]] (1881–1976), U.S. mammalogist * [[Herbert Spencer Jackson]] (1883–1951, '''H.S.Jacks.'''), mycologist * [[Hilery Desmond Jackson]] (1935–2022), South African ornithologist * [[James F. Jackson]], herpetologist * [[Jennifer A. Jackson]], British carcinologist * [[Jeremy B.C. Jackson]], U.S. bryozoologist * [[John D. Jackson]], ('''J.D.Jacks.'''), botanist * [[John Wilfrid Jackson]] (1880–1978), British conchologist and geologist * [[Kate Jackson]], U.S. herpetologist * [[Kathy Jo A. Jackson]], tardigradologist * [[Keith L. Jackson]], Canadian ichthyologist * [[Mary Jackson]], French microbiologist * [[Peter B. N. Jackson]], British ichthyologist * [[Raymond Carl Jackson]] (1928–2008, '''R.C.Jacks.'''), U.S. botanist * [[Stephen M. Jackson]], Australian zoologist * [[Thomas Herbert Elliot Jackson]] (1903–1968), English entomologist {{Disambiguation|cat=people}} 01gu5cagbeqy5f7k0f21f52eo6ao699 Edmond de Selys Longchamps 0 34327 11322509 11319441 2026-10-22T01:53:08Z John Tann 703224 Added publication 11322509 wikitext text/x-wiki {{image}} Baron '''Michel Edmond de Selys Longchamps''' (1813–1900), Belgian ornithologist, entomologist and mammalogist. {{IPNI standard form|Sélys-Longch.}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1831=== * {{a|Edmond de Selys Longchamps|Selys Longchamps E. de}} 1831. Ornithologie de la province de Liége. Catalogue des oiseaux des environs de Liége (sédentaires ou de passage). In: ''van der Maelen, Philippe Marie Guillaume, Dictionnaire géographique de la Province de Liège''. Bruxelles, 27-48. [https://archive.org/details/dictionnairegog01vandgoog/page/n492/mode/1up] ===1840=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1840. ''Monographie des Libellulidées d'Europe''. Roret, Paris, 220 pp. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1840. {{lang|fr|Énumération des Libellulidées de la Belgique}}. ''{{lang|fr|[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]}}'' 7, pt.1(1840): 31-42. {{BHL|item/53788#page/45/mode/1up}} ===1841=== {{Selys, 1841}} ===1842=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1842. Faune belge. Première partie. Indication méthodique des mammifères, oiseaux, reptiles et poissons, observés jusqu’ici en Belgique. ''Faune belge'' i-xii + 1-310. {{BHL|item/215703#page/7/mode/1up}} ===1843=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1843. Nouvelles additions aux Libellulidées de la Belgique de 1840 à 1843. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' 10, pt.2(8): 149-162. {{BHL|item/20649#page/165/mode/1up}} ===1846=== * {{a|Edmond de Selys Longchamps|Selys Longchamps, E. de}} 1846. Revision of the British Libellulidae. ''[[ISSN 0374-5481|The Annals and Magazine of Natural History, including Zoology, Botany, and Geology]]''. 18(119): 217-227. {{BHL|item/19556#page/235/mode/1up}} ===1850=== {{Selys Longchamps & Hagen, 1850}} ===1853=== {{Selys, 1853}} ===1854=== {{Selys Longchamps & Hagen, 1854}} {{Selys, 1854}} ===1857=== {{Selys, 1857}} ===1858=== {{Selys Longchamps & Hagen, 1858}} ===1859=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1859. Additions au Synopsis des Caloptérygines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 7: 437–451. ===1860=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1860. Synopsis des Agrionines, 1<sup>re</sup> légion : ''Pseudostigma''. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2) 10: 9–27. {{BHL|page/36902419}} {{Selys, 1860a}} ===1862=== {{Selys, 1862}} {{Selys, 1862a}} {{Selys, 1862b}} ===1865=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1865. Synopsis des Agrionines. 5<sup>me</sup> légion – ''Agrion''. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 20: 377–417. {{BHL|page/36020687}} ===1868=== {{Selys, 1868}} ===1869=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Secondes additions au synopsis des Caloptérygines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 27: 645–680. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Secondes additions au synopsis des Gomphines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 28: 168–208. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Diagnose d'un nouveau genre d'Agrionine. pp. lxxii–lxxiii [lxxii] in: Comptes-rendus des séances de la société entomologique de Belgique: Assemblée mensuelle du 7 mars 1868. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 11: lxxi-lxxiv. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Les névroptères de Port Denison. In: Comptes-rendus des séances de la société entomologique de Belgique : Assemblée mensuelle du 4 avril 1868. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 11: lxxiv-lxxviii. ===1870=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1870. Sous-famille des Cordulines, Sélys (1). pp. iv–vii In Comptes-rendus des séances de la société entomologique de Belgique: Assemblée mensuelle du 5 novembre 1870. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 14: iii-vii. ===1871=== {{Sélys, 1871}} {{Sélys, 1871b}} ===1872=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1872. Notes on two new genera of Psocidae.'' [[ISSN 0013-8908|The Entomologist's Monthly Magazine]]'' 9: 145-146. {{BHL|item/36494#page/175/mode/1up}} ===1873=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1873. Troisièmes additions au Synopsis des Caloptérygines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 35: 469–519. {{BHL|page/5493071}} * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1873. Troisièmes additions au Synopsis des Gomphines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 35: 732–774. {{BHL|page/5493213}} * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1873. Appendice aux troisièmes Additions et liste des Gomphines, décrites dans le Synopsis et ses trois Additions. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 36: 492–531. {{BHL|page/5691964}} ===1874=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1874. Additions au synopsis des Cordulines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 37: 16–34. ===1876=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1876. Synopsis des Agrionines. (suite de la 5<sup>me</sup> légion: ''Agrion''). ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 41: 247–322. {{BHL|page/5699375}} {{Selys, 1876}} ===1878=== {{Selys, 1878}} {{Selys, 1878a}} {{Selys, 1878b}} ===1879=== {{Selys, 1879}} {{Selys, 1879b}} ===1881=== {{Selys, 1881}} ===1883=== {{Selys, 1883}} {{Selys, 1883b}} ===1884=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1884. Révision des ''Diplax'' paléarctiques. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 28: 29–45. ===1886=== {{Selys, 1886}} ===1887=== {{Selys, 1887a}} {{Selys, 1887b}} {{Selys, 1887c}} {{Selys, 1887d}} ===1888=== {{Selys-Lonchamps, 1888}} ===1891=== {{Selys-Longchamps, 1891}} {{Authority control}} {{DEFAULTSORT:Selys Longchamps, Edmond de}} [[Category:Taxon authorities]] [[Category:Ornithologists]] [[Category:Entomologists]] [[Category:Mammalogists]] 8tbh1ai9xmpcjgn8rh9po9h2i4xamqf 11322511 11322509 2026-10-22T01:57:07Z John Tann 703224 Added publication 11322511 wikitext text/x-wiki {{image}} Baron '''Michel Edmond de Selys Longchamps''' (1813–1900), Belgian ornithologist, entomologist and mammalogist. {{IPNI standard form|Sélys-Longch.}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1831=== * {{a|Edmond de Selys Longchamps|Selys Longchamps E. de}} 1831. Ornithologie de la province de Liége. Catalogue des oiseaux des environs de Liége (sédentaires ou de passage). In: ''van der Maelen, Philippe Marie Guillaume, Dictionnaire géographique de la Province de Liège''. Bruxelles, 27-48. [https://archive.org/details/dictionnairegog01vandgoog/page/n492/mode/1up] ===1840=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1840. ''Monographie des Libellulidées d'Europe''. Roret, Paris, 220 pp. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1840. {{lang|fr|Énumération des Libellulidées de la Belgique}}. ''{{lang|fr|[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]}}'' 7, pt.1(1840): 31-42. {{BHL|item/53788#page/45/mode/1up}} ===1841=== {{Selys, 1841}} ===1842=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1842. Faune belge. Première partie. Indication méthodique des mammifères, oiseaux, reptiles et poissons, observés jusqu’ici en Belgique. ''Faune belge'' i-xii + 1-310. {{BHL|item/215703#page/7/mode/1up}} ===1843=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1843. Nouvelles additions aux Libellulidées de la Belgique de 1840 à 1843. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' 10, pt.2(8): 149-162. {{BHL|item/20649#page/165/mode/1up}} ===1846=== * {{a|Edmond de Selys Longchamps|Selys Longchamps, E. de}} 1846. Revision of the British Libellulidae. ''[[ISSN 0374-5481|The Annals and Magazine of Natural History, including Zoology, Botany, and Geology]]''. 18(119): 217-227. {{BHL|item/19556#page/235/mode/1up}} ===1850=== {{Selys Longchamps & Hagen, 1850}} ===1853=== {{Selys, 1853}} ===1854=== {{Selys Longchamps & Hagen, 1854}} {{Selys, 1854}} ===1857=== {{Selys, 1857}} ===1858=== {{Selys Longchamps & Hagen, 1858}} ===1859=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1859. Additions au Synopsis des Caloptérygines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 7: 437–451. ===1860=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1860. Synopsis des Agrionines, 1<sup>re</sup> légion : ''Pseudostigma''. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2) 10: 9–27. {{BHL|page/36902419}} {{Selys, 1860a}} ===1862=== {{Selys, 1862}} {{Selys, 1862a}} {{Selys, 1862b}} ===1865=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1865. Synopsis des Agrionines. 5<sup>me</sup> légion – ''Agrion''. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 20: 377–417. {{BHL|page/36020687}} ===1868=== {{Selys, 1868}} ===1869=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Secondes additions au synopsis des Caloptérygines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 27: 645–680. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Secondes additions au synopsis des Gomphines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 28: 168–208. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Diagnose d'un nouveau genre d'Agrionine. pp. lxxii–lxxiii [lxxii] in: Comptes-rendus des séances de la société entomologique de Belgique: Assemblée mensuelle du 7 mars 1868. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 11: lxxi-lxxiv. * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1869. Les névroptères de Port Denison. In: Comptes-rendus des séances de la société entomologique de Belgique : Assemblée mensuelle du 4 avril 1868. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 11: lxxiv-lxxviii. ===1870=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1870. Sous-famille des Cordulines, Sélys (1). pp. iv–vii In Comptes-rendus des séances de la société entomologique de Belgique: Assemblée mensuelle du 5 novembre 1870. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 14: iii-vii. ===1871=== {{Sélys, 1871}} {{Sélys, 1871b}} ===1872=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1872. Notes on two new genera of Psocidae.'' [[ISSN 0013-8908|The Entomologist's Monthly Magazine]]'' 9: 145-146. {{BHL|item/36494#page/175/mode/1up}} ===1873=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1873. Troisièmes additions au Synopsis des Caloptérygines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 35: 469–519. {{BHL|page/5493071}} * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1873. Troisièmes additions au Synopsis des Gomphines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 35: 732–774. {{BHL|page/5493213}} * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1873. Appendice aux troisièmes Additions et liste des Gomphines, décrites dans le Synopsis et ses trois Additions. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 36: 492–531. {{BHL|page/5691964}} ===1874=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1874. Additions au synopsis des Cordulines. ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' Series (2) 37: 16–34. ===1876=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1876. Synopsis des Agrionines. (suite de la 5<sup>me</sup> légion: ''Agrion''). ''[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]]'' (2): 41: 247–322. {{BHL|page/5699375}} {{Selys, 1876}} ===1878=== {{Selys, 1878}} {{Selys, 1878a}} {{Selys, 1878b}} ===1879=== {{Selys, 1879}} {{Selys, 1879b}} ===1881=== {{Selys, 1881}} ===1883=== {{Selys, 1883}} {{Selys, 1883b}} ===1884=== * {{a|Edmond de Selys Longchamps|Selys-Longchamps, E. de}} 1884. Révision des ''Diplax'' paléarctiques. ''[[ISSN 0774-5915|Annales de la Société entomologique de Belgique]]'' 28: 29–45. ===1885=== {{Selys, 1885}} ===1886=== {{Selys, 1886}} ===1887=== {{Selys, 1887a}} {{Selys, 1887b}} {{Selys, 1887c}} {{Selys, 1887d}} ===1888=== {{Selys-Lonchamps, 1888}} ===1891=== {{Selys-Longchamps, 1891}} {{Authority control}} {{DEFAULTSORT:Selys Longchamps, Edmond de}} [[Category:Taxon authorities]] [[Category:Ornithologists]] [[Category:Entomologists]] [[Category:Mammalogists]] ow6wzligikht25r39spfiz2x2gs0btp Philip Powell Calvert 0 34329 11322510 11199692 2026-10-22T01:55:10Z John Tann 703224 Added publication 11322510 wikitext text/x-wiki {{image}} '''Philip Powell Calvert''' (1871–1961), American odonatologist. {{Taxa authored}} =={{int:Publications}}== {{Calvert, 1893}} {{Calvert, 1913}} {{Calvert, 1917}} {{Calvert, 1948}} =={{int:External links}}== * https://www.udel.edu/chem/white/Odonata/CalvertBio.html {{authority control}} {{DEFAULTSORT:Calvert, Philip Powell}} [[Category:Taxon authorities]] [[Category:Entomologists]] h69hx9xhzcqh8k3mm5gozxorh4ofdp2 Dicteriadidae 0 34532 11322355 11321926 2026-10-21T21:01:18Z John Tann 703224 Added synonymy 11322355 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Dicteriadidae}} Genera: {{g|Dicterias}} {{glast|Heliocharis}} =={{int:Name}}== Dicteriadidae {{a|Edmond de Selys Longchamps|Selys}}, 1853 ==={{int:Synonymy}}=== * Heliocharitidae {{a|Robin John Tillyard|Tillyard}} & {{a|Frederick Charles Fraser|Fraser}}, 1939 =={{int:References}}== ==={{int:Primary references}}=== {{Selys, 1853}} at {{BHL|page/2728767|p.54.}} {{Tillyard & Fraser, 1939}} at {{BHL|page/38926841|p.207.}} ==={{int:Additional references}}=== {{Bridges, 1994b}} at {{BHL|page/15106020|p.II.1.}} Treats Heliocharitidae as a subjectively invalid synonym of Dicteriadidae. {{Dijkstra et al., 2013}} {{WOL|1 July 2026}} {{Taxonbar|from=Q2488481}} [[Category:Edmond de Selys Longchamps taxa]] nvwt485ktkrz7myaulkp6tw69ic4aro Panthera pardus orientalis 0 35144 11323015 11321291 2026-10-22T11:07:47Z Tommy Kronkvist 596 Format and author names. 11323015 wikitext text/x-wiki {{Image|Panthera pardus orientalis Colchester Zoo (1).jpg}} =={{int:Taxonavigation}}== {{Panthera (Panthera)}} Species: ''[[Panthera pardus]]''<br /> Subspecies: ''[[Panthera pardus orientalis]]'' =={{int:Name}}== ''Panthera pardus orientalis'' ({{a|Hermann Schlegel|Schlegel}}, 1857) ==={{int:Synonymy}}=== * ''Panthera pardus amurensis'' * ''Felis villosa'' ({{a|John Lewis James Bonhote|Bonhote}}, 1903) per {{a|Reginald Innes Pocock|Pocock}} =={{int:References}}== * {{a|Hermann Schlegel|Schlegel, H.}} 1857. ''Felis pardus''. ''{{lang|de|Handleidung tot de oefenig der Dierkunde}}'' 1:23 {{Yang et al., 2016a}} ==={{int:Links}}=== * {{MSWsp|14000258}} * {{ITIS|726471|''Panthera pardus orientalis''}} * {{IUCN|CR|15957|Panthera pardus orientalis}}. [https://web.archive.org/web/20180820165515/http://www.iucnredlist.org/pdflink.5333757 PDF.] =={{int:Vernacular names}}== {{VN |cs=Levhart mandžuský |en=Amur Leopard |fr=Panthère de Chine |hu=Amuri leopárd |ja=アムールヒョウ |ko=아무르표범 |pl=lampart amurski |pt=Leopardo-de-Amur |ru=Дальневосточный леопард |tr=Amur parsı |uk=Амурський леопард |zh=遠東豹 |th=เสือดาวอามูร์ |fi=Amurinleopardi }} {{Commons}} {{Taxonbar|from=Q192967}} [[Category:Hermann Schlegel taxa]] cxlnq6cl320gciy2zyr6o8dkagzbg53 Primula 0 35737 11322370 11015411 2026-10-21T21:11:52Z TadejM 24665 /* {{int:Vernacular names}} */ +sl 11322370 wikitext text/x-wiki {{Image|Primula veris 0x.JPG|''[[Primula veris]]'' (Typus)}} =={{int:Taxonavigation}}== {{Primula}} Subgenera: (5)<br> {{subgplant|P|rimula|Aleuritia}} {{subgplant|P|rimula|Auganthus}} {{subgplant|P|rimula|Auriculastrum}} {{subgplant|P|rimula|Primula}} {{subgplantlast|P|rimula|Sphondylia}} ==== Species ==== {{TOCcompact1}} ==== a ==== {{sp|P|rimula|advena}} {{sp|P|rimula|aemula}} {{sp|P|rimula|aerinantha}} {{sp|P|rimula|afghanica}} {{sp|P|rimula|agleniana}} {{sp|P|rimula|albenensis}} {{sp|P|rimula|alcalina}} {{sp|P|rimula|algida}} {{sp|P|rimula|aliciae}} {{sp|P|rimula|allionii}} {{sp|P|rimula|alpicola}} {{sp|P|rimula|alsophila}} {{sp|P|rimula|ambita}} {{sp|P|rimula|amethystina}} {{sp|P|rimula|amoena}} {{sp|P|rimula|angustifolia}} {{sp|P|rimula|anisodora}} {{sp|P|rimula|annulata}} {{sp|P|rimula|anthemifolia}} {{sp|P|rimula|anvilensis}} {{sp|P|rimula|apicicallosa}} {{sp|P|rimula|aromatica}} {{sp|P|rimula|arunachalensis}} {{sp|P|rimula|asarifolia}} {{sp|P|rimula|assamica}} {{sp|P|rimula|atrodentata}} {{sp|P|rimula|aurantiaca}} {{sp|P|rimula|auricula}} {{splast|P|rimula|auriculata}} ==== b ==== {{sp|P|rimula|baileyana}} {{sp|P|rimula|baldshuanica}} {{sp|P|rimula|barbatula}} {{sp|P|rimula|barbicalyx}} {{sp|P|rimula|bathangensis}} {{sp|P|rimula|bayernii}} {{sp|P|rimula|bella}} {{sp|P|rimula|bellidifolia}} {{sp|P|rimula|bergenioides}} {{sp|P|rimula|bhutanica}} {{sp|P|rimula|blandula}} {{sp|P|rimula|blattariformis}} {{sp|P|rimula|blinii}} {{sp|P|rimula|bomiensis}} {{sp|P|rimula|boni-auxilii}} {{sp|P|rimula|boothii}} {{sp|P|rimula|borealis}} {{sp|P|rimula|boreiocalliantha}} {{sp|P|rimula|botschantzevii}} {{sp|P|rimula|boveana}} {{sp|P|rimula|brachystoma}} {{sp|P|rimula|bracteata}} {{sp|P|rimula|bracteosa}} {{sp|P|rimula|brevis}} {{sp|P|rimula|breviscapa}} {{sp|P|rimula|bryophylla}} {{sp|P|rimula|bukukunica}} {{sp|P|rimula|bullata}} {{sp|P|rimula|bulleyana}} {{sp|P|rimula|bungeana}} {{splast|P|rimula|buryana}} ==== c ==== {{sp|P|rimula|caldaria}} {{sp|P|rimula|calderiana}} {{sp|P|rimula|calliantha}} {{sp|P|rimula|calthifolia}} {{sp|P|rimula|calyptrata}} {{sp|P|rimula|candicans}} {{sp|P|rimula|capillaris}} {{sp|P|rimula|capitata}} {{sp|P|rimula|capitellata}} {{sp|P|rimula|cardioeides}} {{sp|P|rimula|carniolica}} {{sp|P|rimula|carolinehenryae}} {{sp|P|rimula|caulifera}} {{sp|P|rimula|cavaleriei}} {{sp|P|rimula|caveana}} {{sp|P|rimula|cawdoriana}} {{sp|P|rimula|celsiiformis}} {{sp|P|rimula|centellifolia}} {{sp|P|rimula|cerina}} {{sp|P|rimula|cernua}} {{sp|P|rimula|chamaedoron}} {{sp|P|rimula|chamaethauma}} {{sp|P|rimula|chapaensis}} {{sp|P|rimula|chartacea}} {{sp|P|rimula|chasmophila}} {{sp|P|rimula|chienii}} {{sp|P|rimula|chimingiana}} {{sp|P|rimula|chionantha}} {{sp|P|rimula|chionata}} {{sp|P|rimula|chionogenes}} {{sp|P|rimula|chrysochlora}} {{sp|P|rimula|chrysostoma}} {{sp|P|rimula|chumbiensis}} {{sp|P|rimula|chungensis}} {{sp|P|rimula|cicutariifolia}} {{sp|P|rimula|cinerascens}} {{sp|P|rimula|clarkei}} {{sp|P|rimula|clusiana}} {{sp|P|rimula|clutterbuckii}} {{sp|P|rimula|cockburniana}} {{sp|P|rimula|coerulea}} {{sp|P|rimula|comata}} {{sp|P|rimula|comberi}} {{sp|P|rimula|concholoba}} {{sp|P|rimula|concinna}} {{sp|P|rimula|conspersa}} {{sp|P|rimula|cooperi}} {{sp|P|rimula|cortusoides}} {{sp|P|rimula|crassa}} {{sp|P|rimula|crocifolia}} {{sp|P|rimula|cuneifolia}} {{sp|P|rimula|cunninghamii}} {{splast|P|rimula|cusickiana}} ==== d ==== {{sp|P|rimula|daonensis}} {{sp|P|rimula|darialica}} {{sp|P|rimula|davidii}} {{sp|P|rimula|davisii}} {{sp|P|rimula|deflexa}} {{sp|P|rimula|dejuniana}} {{sp|P|rimula|densa}} {{sp|P|rimula|denticulata}} {{sp|P|rimula|denticuloides}} {{sp|P|rimula|deorum}} {{sp|P|rimula|deuteronana}} {{sp|P|rimula|diantha}} {{sp|P|rimula|dickieana}} {{sp|P|rimula|dictyophylla}} {{sp|P|rimula|digenea}} {{sp|P|rimula|divaricata}} {{sp|P|rimula|drummondiana}} {{sp|P|rimula|dryadifolia}} {{sp|P|rimula|duclouxii}} {{sp|P|rimula|dueckelmannii}} {{sp|P|rimula|dumicola}} {{splast|P|rimula|duthieana}} ==== e ==== {{sp|P|rimula|eburnea}} {{sp|P|rimula|edelbergii}} {{sp|P|rimula|edgeworthii}} {{sp|P|rimula|efarinosa}} {{sp|P|rimula|effusa}} {{sp|P|rimula|egaliksensis}} {{sp|P|rimula|elatior}} {{sp|P|rimula|elizabethiae}} {{sp|P|rimula|elliptica}} {{sp|P|rimula|elongata}} {{sp|P|rimula|epilithica}} {{sp|P|rimula|epilosa}} {{sp|P|rimula|erosa}} {{sp|P|rimula|erratica}} {{sp|P|rimula|erythra}} {{sp|P|rimula|erythrocarpa}} {{sp|P|rimula|esquirolii}} {{sp|P|rimula|euchaites}} {{sp|P|rimula|eugeniae}} {{sp|P|rimula|euosma}} {{splast|P|rimula|eximia}} ==== f ==== {{sp|P|rimula|faberi}} {{sp|P|rimula|fagosa}} {{sp|P|rimula|falcifolia}} {{sp|P|rimula|fangii}} {{sp|P|rimula|fangingensis}} {{sp|P|rimula|farinifolia}} {{sp|P|rimula|farinosa}} {{sp|P|rimula|farreriana}} {{sp|P|rimula|fasciculata}} {{sp|P|rimula|fea}} {{sp|P|rimula|fedtschenkoi}} {{sp|P|rimula|fenghwaiana}} {{sp|P|rimula|fernaldiana}} {{sp|P|rimula|filchnerae}} {{sp|P|rimula|filipes}} {{sp|P|rimula|fimbriata}} {{sp|P|rimula|finmarchica}} {{sp|P|rimula|firmipes}} {{sp|P|rimula|fistulosa}} {{sp|P|rimula|flabellifera}} {{sp|P|rimula|flaccida}} {{sp|P|rimula|flagellaris}} {{sp|P|rimula|flava}} {{sp|P|rimula|flexuosa}} {{sp|P|rimula|floribunda}} {{sp|P|rimula|florindae}} {{sp|P|rimula|forbesii}} {{splast|P|rimula|frondosa}} ==== g ==== {{sp|P|rimula|gambeliana}} {{sp|P|rimula|garhwalica}} {{sp|P|rimula|gaubaeana}} {{sp|P|rimula|gemmifera}} {{sp|P|rimula|geraniifolia}} {{sp|P|rimula|geranophylla}} {{sp|P|rimula|giraldiana}} {{sp|P|rimula|glabra}} {{sp|P|rimula|glandulifera}} {{sp|P|rimula|glaucescens}} {{sp|P|rimula|glomerata}} {{sp|P|rimula|glutinosa}} {{sp|P|rimula|gracilenta}} {{sp|P|rimula|gracilipes}} {{sp|P|rimula|graminifolia}} {{sp|P|rimula|grandis}} {{sp|P|rimula|griffithii}} {{splast|P|rimula|grignensis}} ==== h ==== {{sp|P|rimula|halleri}} {{sp|P|rimula|handeliana}} {{sp|P|rimula|hazarica}} {{sp|P|rimula|helodoxa}} {{sp|P|rimula|heterochroma}} {{sp|P|rimula|heucherifolia}} {{sp|P|rimula|hidakana}} {{sp|P|rimula|hilaris}} {{sp|P|rimula|hirsuta}} {{sp|P|rimula|hoffmanniana}} {{sp|P|rimula|hoii}} {{sp|P|rimula|homogama}} {{sp|P|rimula|hongshanensis}} {{sp|P|rimula|hookeri}} {{sp|P|rimula|huashanensis}} {{sp|P|rimula|hubeiensis}} {{sp|P|rimula|hunanensis}} {{sp|P|rimula|hydrocotylifolia}} {{sp|P|rimula|hylobia}} {{splast|P|rimula|hypoleuca}} ==== i ==== {{sp|P|rimula|ianthina}} {{sp|P|rimula|iljinskii}} {{sp|P|rimula|inayatii}} {{sp|P|rimula|incana}} {{sp|P|rimula|inopinata}} {{sp|P|rimula|intanoensis}} {{sp|P|rimula|integrifolia}} {{sp|P|rimula|interjacens}} {{sp|P|rimula|intermedia}} {{sp|P|rimula|intricata}} {{sp|P|rimula|involucrata}} {{sp|P|rimula|ioessa}} {{splast|P|rimula|irregularis}} ==== j ==== {{sp|P|rimula|jaffreyana}} {{sp|P|rimula|japonica}} {{sp|P|rimula|jesoana}} {{sp|P|rimula|jigmediana}} {{sp|P|rimula|jiugongshanensis}} {{sp|P|rimula|jucunda}} {{splast|P|rimula|juliae}} ==== k ==== {{sp|P|rimula|kaufmanniana}} {{sp|P|rimula|kialensis}} {{sp|P|rimula|kingii}} {{sp|P|rimula|kisoana}} {{sp|P|rimula|kitaibeliana}} {{sp|P|rimula|klattii}} {{sp|P|rimula|klaveriana}} {{sp|P|rimula|knorringiana}} {{splast|P|rimula|knuthiana}} {{sp|P|rimula|kusnetzovii}} {{sp|P|rimula|kwangtungensis}} {{splast|P|rimula|kweichouensis}} ==== l ==== {{sp|P|rimula|lacerata}} {{sp|P|rimula|laciniata}} {{sp|P|rimula|lactiflora}} {{sp|P|rimula|lactucoides}} {{sp|P|rimula|latifolia}} {{sp|P|rimula|latisecta}} {{sp|P|rimula|laurentiana}} {{sp|P|rimula|laxiuscula}} {{sp|P|rimula|leptophylla}} {{sp|P|rimula|leskeniensis}} {{sp|P|rimula|levicalyx}} {{sp|P|rimula|lihengiana}} {{sp|P|rimula|lilacina}} {{sp|P|rimula|limbata}} {{sp|P|rimula|limnoica}} {{sp|P|rimula|listeri}} {{sp|P|rimula|lithophila}} {{sp|P|rimula|littledalei}} {{sp|P|rimula|longipes}} {{sp|P|rimula|longiscapa}} {{sp|P|rimula|lungchiensis}} {{splast|P|rimula|luteola}} ==== m ==== {{sp|P|rimula|macrocarpa}} {{sp|P|rimula|macrophylla}} {{sp|P|rimula|magellanica}} {{sp|P|rimula|malacoides}} {{sp|P|rimula|mallophylla}} {{sp|P|rimula|malvacea}} {{sp|P|rimula|marginata}} {{sp|P|rimula|matthioli}} {{sp|P|rimula|maximowiczii}} {{sp|P|rimula|mazurenkoae}} {{sp|P|rimula|megalocarpa}} {{sp|P|rimula|megaseifolia}} {{sp|P|rimula|meiotera}} {{sp|P|rimula|melanantha}} {{sp|P|rimula|melanodonta}} {{sp|P|rimula|merrilliana}} {{sp|P|rimula|mianyangensis}} {{sp|P|rimula|minima}} {{sp|P|rimula|minkwitziae}} {{sp|P|rimula|minor}} {{sp|P|rimula|minutissima}} {{sp|P|rimula|mistassinica}} {{sp|P|rimula|miyabeana}} {{sp|P|rimula|modesta}} {{sp|P|rimula|mollis}} {{sp|P|rimula|monticola}} {{sp|P|rimula|morissetii}} {{sp|P|rimula|moschophora}} {{sp|P|rimula|moupinensis}} {{sp|P|rimula|munroi}} {{sp|P|rimula|muscarioides}} {{splast|P|rimula|muscoides}} ==== n ==== {{sp|P|rimula|nanocapitata}} {{sp|P|rimula|neurocalyx}} {{sp|P|rimula|nghialoensis}} {{sp|P|rimula|ninguida}} {{sp|P|rimula|nipponica}} {{sp|P|rimula|nivalis}} {{sp|P|rimula|nutans}} {{splast|P|rimula|nutantiflora}} ==== o ==== {{sp|P|rimula|obconica}} {{sp|P|rimula|obliqua}} {{sp|P|rimula|obsessa}} {{sp|P|rimula|obtusifolia}} {{sp|P|rimula|occlusa}} {{sp|P|rimula|odontica}} {{sp|P|rimula|odontocalyx}} {{sp|P|rimula|optata}} {{sp|P|rimula|orbicularis}} {{sp|P|rimula|oreodoxa}} {{sp|P|rimula|ovalifolia}} {{splast|P|rimula|oxygraphidifolia}} ==== p ==== {{sp|P|rimula|palinuri}} {{sp|P|rimula|palmata}} {{sp|P|rimula|pamirica}} {{sp|P|rimula|parryi}} {{sp|P|rimula|partschiana}} {{sp|P|rimula|pauliana}} {{sp|P|rimula|pedemontana}} {{sp|P|rimula|pelargoniifolia}} {{sp|P|rimula|pellucida}} {{sp|P|rimula|pengzhouensis}} {{sp|P|rimula|persimilis}} {{sp|P|rimula|petelotii}} {{sp|P|rimula|petiolaris}} {{sp|P|rimula|petrocallis}} {{sp|P|rimula|pinnata}} {{sp|P|rimula|pinnatifida}} {{sp|P|rimula|poissonii}} {{sp|P|rimula|polonensis}} {{sp|P|rimula|poluninii}} {{sp|P|rimula|polyneura}} {{sp|P|rimula|praetermissa}} {{sp|P|rimula|prenantha}} {{sp|P|rimula|prevernalis}} {{sp|P|rimula|priflorens}} {{sp|P|rimula|primulina}} {{sp|P|rimula|prolifera}} {{sp|P|rimula|pseudodenticulata}} {{sp|P|rimula|pskemensis}} {{sp|P|rimula|pulchella}} {{sp|P|rimula|pulchra}} {{sp|P|rimula|pullulatrix}} {{sp|P|rimula|pulverulenta}} {{sp|P|rimula|pumilio}} {{sp|P|rimula|purdomii}} {{splast|P|rimula|pycnoloba}} ==== q ==== {{splast|P|rimula|qinghaiensis}} ==== r ==== {{sp|P|rimula|ramzanae}} {{sp|P|rimula|rebeccae}} {{sp|P|rimula|recubariensis}} {{sp|P|rimula|reflexa}} {{sp|P|rimula|reidii}} {{sp|P|rimula|reinii}} {{sp|P|rimula|renifolia}} {{sp|P|rimula|repentina}} {{sp|P|rimula|reptans}} {{sp|P|rimula|reticulata}} {{sp|P|rimula|rhodochroa}} {{sp|P|rimula|rimicola}} {{sp|P|rimula|rockii}} {{sp|P|rimula|rosea}} {{sp|P|rimula|rotundifolia}} {{sp|P|rimula|rubicunda}} {{sp|P|rimula|rubifolia}} {{sp|P|rimula|rugosa}} {{sp|P|rimula|runcinata}} {{sp|P|rimula|rupestris}} {{sp|P|rimula|rupicola}} {{sp|P|rimula|ruprechtii}} {{sp|P|rimula|rusbyi}} {{splast|P|rimula|russeola}} ==== s ==== {{sp|P|rimula|saguramica}} {{sp|P|rimula|sandemaniana}} {{sp|P|rimula|sapphirina}} {{sp|P|rimula|saturata}} {{sp|P|rimula|saxatilis}} {{sp|P|rimula|scandinavica}} {{sp|P|rimula|scapigera}} {{sp|P|rimula|schlagintweitiana}} {{sp|P|rimula|scopulicola}} {{sp|P|rimula|scotica}} {{sp|P|rimula|secundiflora}} {{sp|P|rimula|septemloba}} {{sp|P|rimula|serrata}} {{sp|P|rimula|serratifolia}} {{sp|P|rimula|sertulum}} {{sp|P|rimula|sessilis}} {{sp|P|rimula|sharmae}} {{sp|P|rimula|sherriffiae}} {{sp|P|rimula|siamensis}} {{sp|P|rimula|sieboldii}} {{sp|P|rimula|sikkimensis}} {{sp|P|rimula|silaensis}} {{sp|P|rimula|sinensis}} {{sp|P|rimula|sinoexscapa}} {{sp|P|rimula|sinolisteri}} {{sp|P|rimula|sinomollis}} {{sp|P|rimula|sinuata}} {{sp|P|rimula|siphonantha}} {{sp|P|rimula|smithiana}} {{sp|P|rimula|soldanelloides}} {{sp|P|rimula|sonchifolia}} {{sp|P|rimula|soongii}} {{sp|P|rimula|sorachiana}} {{sp|P|rimula|souliei}} {{sp|P|rimula|spathulifolia}} {{sp|P|rimula|spectabilis}} {{sp|P|rimula|specuicola}} {{sp|P|rimula|spicata}} {{sp|P|rimula|stenocalyx}} {{sp|P|rimula|stenodonta}} {{sp|P|rimula|stirtoniana}} {{sp|P|rimula|stricta}} {{sp|P|rimula|strumosa}} {{sp|P|rimula|stuartii}} {{sp|P|rimula|subpyrenaica}} {{sp|P|rimula|subularia}} {{sp|P|rimula|suffrutescens}} {{splast|P|rimula|szechuanica}} ==== t ==== {{sp|P|rimula|takedana}} {{sp|P|rimula|taliensis}} {{sp|P|rimula|tangutica}} {{sp|P|rimula|tanneri}} {{sp|P|rimula|tanupoda}} {{sp|P|rimula|tardiflora}} {{sp|P|rimula|tayloriana}} {{sp|P|rimula|tenella}} {{sp|P|rimula|tenuiloba}} {{sp|P|rimula|tenuipes}} {{sp|P|rimula|tenuituba}} {{sp|P|rimula|thearosa}} {{sp|P|rimula|tibetica}} {{sp|P|rimula|tongolensis}} {{sp|P|rimula|tosaensis}} {{sp|P|rimula|tournefortii}} {{sp|P|rimula|tridentifera}} {{sp|P|rimula|triloba}} {{sp|P|rimula|tsariensis}} {{sp|P|rimula|tschuktschorum}} {{sp|P|rimula|tsiangii}} {{sp|P|rimula|tsongpenii}} {{sp|P|rimula|tyrolensis}} {{splast|P|rimula|tzetsouensis}} ==== u ==== {{sp|P|rimula|umbratilis}} {{sp|P|rimula|urticifolia}} {{splast|P|rimula|uzungolensis}} ==== v ==== {{sp|P|rimula|vaginata}} {{sp|P|rimula|valentinae}} {{sp|P|rimula|valentiniana}} {{sp|P|rimula|veitchiana}} {{sp|P|rimula|veris}} {{sp|P|rimula|verticillata}} {{sp|P|rimula|vialii}} {{sp|P|rimula|villosa}} {{sp|P|rimula|vilmoriniana}} {{sp|P|rimula|violacea}} {{sp|P|rimula|violaris}} {{sp|P|rimula|virginis}} {{splast|P|rimula|vulgaris}} ==== w ==== {{sp|P|rimula|waddellii}} {{sp|P|rimula|walshii}} {{sp|P|rimula|waltonii}} {{sp|P|rimula|wangii}} {{sp|P|rimula|warshenewskiana}} {{sp|P|rimula|watsonii}} {{sp|P|rimula|wattii}} {{sp|P|rimula|wawushanica}} {{sp|P|rimula|wenshanensis}} {{sp|P|rimula|whitei}} {{sp|P|rimula|wigramiana}} {{sp|P|rimula|wilsonii}} {{sp|P|rimula|wollastonii}} {{sp|P|rimula|woodwardii}} {{sp|P|rimula|woonyoungiana}} {{sp|P|rimula|woronowii}} {{splast|P|rimula|wulfeniana}} ==== x ==== {{splast|P|rimula|xanthopa}} ==== y ==== {{sp|P|rimula|youngeriana}} {{sp|P|rimula|yunnanensis}} {{splast|P|rimula|yuparensis}} ==== z ==== {{sp|P|rimula|zeylanica}} {{splast|P|rimula|zhui}} {{Just|{{Catol-Hassler|2019|Aug|10}}}} ;Names in synonymy: {{sp|P|rimula|apennina}} {{sp|P|rimula|beesiana}} {{sp|P|rimula|ciliata}} {{sp|P|rimula|clevelandii}} {{sp|P|rimula|conjugens}} {{sp|P|rimula|forrestii}} {{sp|P|rimula|fragrans}} {{sp|P|rimula|kongboensis}} {{sp|P|rimula|maikhaensis}} {{sp|P|rimula|membranifolia}} {{sp|P|rimula|prattii}} {{sp|P|rimula|pseudoglabra}} {{sp|P|rimula|scopulorum}} {{splast|P|rimula|socialis}} ==== Nothospecies ==== {{sp|P|rimula|× coronata}} {{sp|P|rimula|× digenea}} {{sp|P|rimula|× media}} {{sp|P|rimula|× murbeckii}} {{sp|P|rimula|× muretiana}} {{sp|P|rimula|× polyantha}} {{sp|P|rimula|× pubescens}} {{sp|P|rimula|× steinii}} {{sp|P|rimula|× thomasinii}} {{splast|P|rimula|× uzungolensis}} =={{int:Name}}== ''Primula'' {{a|L.}}, Sp. Pl. 1: 142 (1753); Gen. Pl., ed. 5: 70 (1754). * Lectotype species: ''[[Primula veris]]'' {{aut|L.}}, designated by {{aut|N.L. Britton}} & {{aut|A. Brown}}, Ill. Fl. N.U.S. ed. 2. 2: 708 (1913), approved by {{aut|Hitchcock}}, Prop. Brit. Bot. 128 (Aug 1929). ==={{int:Synonyms}}=== {{HOT}} **''Paralysis'' {{a|John Hill|Hill}}, Brit. Herbal 68 (1756). {{HET}} **''Aleuritia'' ({{a|Duby}}) {{a|Opiz}} in {{aut|Bercht.}} & {{aut|Opiz}}, Oekon.-Tech. Fl. Böhmens 2(2): 4, 193 (1839). ***{{TS|P|rimula|farinosa|L.}} **''Auganthus'' {{a|Johann Heinrich Friedrich Link|Link}}, Handbuch 1: 415 (1829). ***{{TS|A|uganthus|praenitens|(Ker Gawl.) Link}} **''Cankrienia'' {{a|Willem Hendrik de Vriese|de Vriese}}, Jaarb. Kon Ned. Maatsch. Tuinb. 1850: 30 (1850). ***{{TS|C|ankrienia|chrysantha|De Vriese}}, {{NIL}} **''Dodecatheon'' {{aut|L.}}, Sp. Pl. 1: 144 (1753). ***{{TS|D|odecatheon|meadia|L.}} **''Evotrochis'' {{a|Raf.}}, Fl. Tell. 2: 76 (1836 publ. 1837). ***{{TSN}} **''Kablikia'' {{aut|Opiz}} in {{aut|Bercht.}} & {{aut|Opiz}}, Oekon.-Tech. Fl. Böhmens 2(2): 215–216 (1839). ***{{TS|K|ablikia|minima|(L.) Opiz}} **''Meadia'' {{a|Philip Miller|Mill.}}, Gard. Dict. Abr. ed. 4 (1754). ***{{TS|M|eadia|dodecatheon|Mill.}} =={{int:References}}== ==={{int:Primary references}}=== {{LSP1|142}} {{LGP5|70}} ==={{int:Additional references}}=== {{Britton & Brown, 1913|2|708}} {{Hitchcock & Green, 1929}} ==={{int:Links}}=== {{Catol-Hassler|2019|Aug|10}} {{PWO|2019|Aug|10}} {{MBG|2019|Aug|10}} {{ING|2019|Aug|10}} {{GRIN|gen|9834|07-Oct-06}} =={{int:Vernacular names}}== {{VN |ar=زهرة الربيع |az=Novruzçiçəyi |bg=Иглика |cs=prvosenka |cv=Сар пуç |cy=Briallen |da=Kodriver |de=Primeln |en=cowslip, primrose |eo=Primolo |es=Primavera |et=Nurmenukk |fa=پامچال (سرده) |fi=Esikot |frp=Peca-usél |fr=Primevère |he=בכור אביב |hr=jaglaci |hsb=Kropačk |hu=Kankalin |hy=Գնարբուկ |ja=サクラソウ属 |ka=ფურისულა |kk=Примула |ko=앵초속 |ky=Примула |lbe=Ччиккул тӀутӀи |li=Sjleutelbloom |lt=Raktažolė |nl=Sleutelbloem |no=Nøkleblomslekten |os=Æстъоппæлæ |pl=Pierwiosnek |ru=Первоцвет |sk=prvosienka |sl=jeglič |sr=Јагорчевина |sv=Vivesläktet |tr=Çuha çiçeği |uk=Первоцвіт |uz=Navroʻzgul |vi=Chi Anh thảo |zh=報春花屬 }} {{Commons}} {{Taxonbar|from=Q158974}} [[Category:Carolus Linnaeus taxa]] ak9rrirzekipshrgd8dx3346kiuwk9m Primula veris 0 35738 11322374 9450242 2026-10-21T21:13:37Z TadejM 24665 /* {{int:Vernacular names}} */ alternative sl name 11322374 wikitext text/x-wiki {{Image|Primula veris 170405.jpg|255|{{Taxon italics|Primula veris|linked=yes}}}} =={{int:Taxonavigation}}== {{Primula veris}} Subspecies: {{subspplant|P|rimula|v|eris|canescens}} {{subspplant|P|rimula|v|eris|columnae}} {{subspplant|P|rimula|v|eris|macrocalyx}} {{subspplantlast|P|rimula|v|eris|veris}} =={{int:Name}}== ''Primula veris'' {{a|Carolus Linnaeus|L.}} (1753). ==={{int:Synonyms}}=== * ''Primula veris'' {{a|Johann Georg Christian Lehmann|Lehm.}}, Monogr. Primul. 27 (1817), isonym. =={{int:Homonym}}== ''Primula veris'' {{a|Philip Miller|Mill.}}, Gard. Dict., ed. 8. n. 1 (1768), {{NIL}} non {{aut|L.}} (1753), is synonymous to ''[[Primula vulgaris]]''. =={{int:Hybrids}}== {{sp|P|rimula|× media}} {{Splast|P|rimula|× polyantha}} =={{int:References}}== {{LSP1|142}} {{GRIN|sp|400303|07-Oct-06}} =={{int:Distribution}}== Native throughout most of temperate Europe and Asia although absent from more northerly areas including northern Scotland. =={{int:Vernacular names}}== {{VN |an=Cuculetas,pan de cuculo |az=Dərman novruzgülü |be=Першацвет веснавы |be-tarask=Першацьвет веснавы |bg=Лечебна иглика |ca=Cucut |cs=Prvosenka jarní |csb=Kukówczé rãkawice |cy=Briallen Fair |da=Hulkravet Kodriver |de=Echte Schlüsselblume |en=Cowslip |eo=Printempa primolo |es=Primicia de amistades |et=Harilik nurmenukk |fa=پریمولا وریس |fi=Kevätesikko |fr=Primevère officinale |ga=Bainne bó bleachtáin |hsb=Wonjaty kropačk |hu=Tavaszi kankalin |io=Primulo |it=Primavera |ja=キバナノクリンザクラ |ko=황화구륜초 |kw=briallen an gog |lt=Pavasarinė raktažolė |lv=Gaiļbiksīte |nds-nl=Gullen sleutelbloeme |nl=Gulden Sleutelbloem |nn=Marianøkleblom |no=Marianøkleblom |oc=Cocut |pl=Pierwiosnek lekarski |ru=Первоцвет весенний |sk=Prvosienka jarná |sl=pomladanski jeglič, šmigovec |sv=Gullviva |uk=Первоцвіт весняний |zh=黄花九轮草 }} {{Commons}} {{Taxonbar}} [[Category:Carolus Linnaeus taxa]] 2l30q6zzdviasq43b5mjv9vcs6x7ljl Primula vulgaris 0 35739 11322371 10550994 2026-10-21T21:12:32Z TadejM 24665 /* {{int:Vernacular names}} */ alternative sl name 11322371 wikitext text/x-wiki {{Image|Primrose (3356633595).jpg|''Primula vulgaris'' subsp. ''vulgaris'', Kenchester, Herefordshire, England}} =={{int:Taxonavigation}}== {{Primula vulgaris}} Subspecies: {{subspplant|P|rimula|v|ulgaris|atlantica}} {{subspplant|P|rimula|v|ulgaris|balearica}} {{subspplant|P|rimula|v|ulgaris|rubra}} {{subspplantlast|P|rimula|v|ulgaris|vulgaris}} =={{int:Name}}== ''Primula vulgaris'' {{a|Huds.}}, Fl. Angl., ed. 1: {{BHL|page/52504671|70}}. 1762. ==={{int:Synonyms}}=== {{HOT}} ** ''Primula acaulis'' subsp. ''vulgaris'' ({{aut|Huds.}}) {{aut|O.Schwarz}}, Mitt. Thüring. Bot. Ges., n.s., 1 (1): 109. 1949. {{HET}} ** ''Primula veris'' var. ''acaulis'' {{a|L.}}, Sp. Pl. 1: 143. 1753. ** ''Primula acaulis'' ({{aut|L.}}) {{a|L.}}, Fl. Angl.: 12. 1754. {{NIN}}, sphalm. typogr. (vide {{aut|Brummitt}} & {{aut|Meikle}} 1993) ** ''Primula acaulis'' ({{aut|L.}}) {{a|Hill}}, Veg. Syst. 8: 25. 1765. ** ''Primula veris'' {{aut|Mill.}}, Gard. Dict., ed. 8. n. 1. 1768, {{NIL}}, non {{aut|L.}} (1753) =={{int:References}}== ==={{int:Primary references}}=== * {{Hudson, 1762}} * {{Linnaeus & Grufberg, 1754}} {{GB|THUZAAAAYAAJ|12}} ==={{int:Additional references}}=== * {{Brummitt & Meikle, 1993}} ==={{int:Links}}=== * {{GRIN|sp|29712|07-Oct-06}} * {{EMD|2017|6|13}} =={{int:Vernacular names}}== {{VN |ar=زهرة الربيع الشائعة |bs=Jagorčevina |ca=Prímula acaule |cs=Prvosenka bezlodyžná |cy=Briallen |da=Storblomstret kodriver |de=Stängellose Schlüsselblume |en=Primrose |es=Primavera |et=Varretu priimula |eu=Udaberri-lore goiztiar |fa=پامچال |fi=Kääpiöesikko |fo=Leggstutt fransagras |fr=Primevère commune |ga=Sabhaircín |gl=Cáncaro |he=בכור אביב מצוי |hr=Rani jaglac |hsb=Kuši kropačk |hu=Szártalan kankalin |hy=Գնարբուկ Կոմարովի |io=Primrozo |is=Laufeyjarlykill |it=Primula comune |ja=プリムローズ |kab=Iferr n wudi |ko=프림로즈 |lt=Paprastoji raktažolė |lv=Parastā prīmula |ml=പ്രിമുല വൾഗാരിസ് |mzn=بچا بچا |nap=Caciòla |nl=Stengelloze sleutelbloem |nn=Kusymre |no=Kusymre |pl=Pierwiosnek bezłodygowy |ru=Первоцвет обыкновенный |sh=Jaglac |sk=Prvosienka bezbyľová |sl=trobentica, navadni jeglič |sr=Јагорчевина |sv=Jordviva |uk=Первоцвіт звичайний |zh=歐報春 }} {{Commonscat}} {{Taxonbar|from=Q159537}} [[Category:William Hudson taxa]] 85fnpy4n9p6uc91knev23pzpj6eo9ka Primula elatior 0 35740 11322372 9848767 2026-10-21T21:13:04Z TadejM 24665 /* {{int:Vernacular names}} */ +sl 11322372 wikitext text/x-wiki {{Image|Primula elatior 170405a.jpg}} =={{int:Taxonavigation}}== {{Primula sect. Primula}} Species: ''[[Primula elatior]]'' <br/> Subspecies: {{subspplant|P|rimula|e|latior|elatior}} {{subspplant|P|rimula|e|latior|intricata}} {{subspplant|P|rimula|e|latior|leucophylla}} {{subspplant|P|rimula|e|latior|lofthousei}} {{subspplant|P|rimula|e|latior|pallasii}} {{subspplantlast|P|rimula|e|latior|pseudoelatior}} =={{int:Name}}== ''Primula elatior'' ([[L.]]) [[John Hill|Hill]] ==={{int:Synonyms}}=== * ''Primula veris'' var. ''elatior L.'' =={{int:References}}== * ''[[The Vegetable System]]'' 8:25 (1765) ==={{int:Links}}=== * {{IPNI||2017|Oct. 14}} * {{TPLF|2017|Oct.|14}} * {{TROPICOS|26400080|2017|Oct.|14}} * {{GRIN||400302|Primula elatior|(L.) Hill }} * {{ITIS|505952|''Primula elatior'' (L.) Hill }} * {{NCBI|175059|''Primula elatior'' }} =={{int:Vernacular names}}== {{VN |be=Першацвет высокі |bg=крилатолистна иглика |cs=prvosenka vyšší |cy=Briallen-Fair ddi-sawr |da=Fladkravet Kodriver |de=Hohe Schlüsselblume, Wald-Schlüsselblume |en=oxlip, true oxlip |es=lilicopa, bellorita, bellorita encarnada, bragas de cuco, gallos, hierba de San Pablo mayor, manguitos, nabo montés, papagalls de primavera, primavera, primavera común, primicias de la luna, primicias del buen día, yerba de San Pablo Mayor, yerba de San Pedro, yerba de San Pedro mayor |fa=پریمولا الاتیور |fi=Etelänkevätesikko |fr=Primevère élevée, Primevere elevee, Coucou des bois |hsb=Łučny kropačk |hu=Sugárkankalin, sugár kankalin, sudár kankalin |is=Huldulykill |it=Primula maggiore |nb=Hagenøkleblom |nl=Slanke Sleutelbloem |pl=Pierwiosnek wyniosły, Pierwiosnka wyniosła |ro=Ciuboțica cucului de munte, Ciuboțica cucului |ru=Первоцвет высокий |sk=prvosienka vyššia |sl=visoki jeglič |sv=Lundviva |tr=Hakiki çuha çiçeği }} {{Commonscat}} {{Taxonbar|from=Q157842}} rvtyyvjfe7fysf0vuxiuhfpxvhjq1s9 Abies alba 0 37207 11322926 11014382 2026-10-22T09:51:43Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322926 wikitext text/x-wiki {{Image|Abies alba Pyrenees-Orientales.jpg|''Abies alba'', Pyrenees-Orientales, France}} {{Image|Abies alba P26.jpg|''Abies alba'' strobili; Poland}} {{LC}} =={{int:Taxonavigation}}== {{Abies sect. Abies}} Species: ''[[Abies alba]]'' =={{int:Name}}== ''Abies alba'' {{a|Philip Miller|Mill.}}, Gard. Dict., ed. 8: {{BHL|page/394498|''Abies'' No. 1}} (1768). ==={{int:Synonyms}}=== {{REP}} ** ''Pinus picea'' {{a|L.}}, Sp. Pl. 2: 1001 (1753). *** Lectotypus: Herb. Clifford: 449, Abies 2 ([[BM]]-[https://www.nhm.ac.uk/resources/research-curation/projects/clifford-herbarium/lgimages/BM000647435.JPG 000647435]), designated by {{aut|Farjon}} & {{aut|Jarvis}} in {{aut|Greuter}} (ed.), Regnum Veg. 128: 110 (1993). {{HOT}} ** ''Abies picea'' ({{aut|L.}}) {{a|Lindl.}}, Penny Cyclop. 1: 29 (1833), {{NIL}}, non {{aut|Mill.}} (1768) ** ''Pinus alba'' ({{aut|Mill.}}) {{a|Münchh.}}, Hausvater 5 (1): 222 (1770) {{HET}} ** ''Abies taxifolia'' {{a|Duhamel}}, Traité Arbr. Arbust. 1: 3 (1755), {{OUO}} ** ''Pinus abies'' {{a|Du Roi}}, Diss. Inaug. Obs. Bot.: 39 (1771), {{NIL}}, non {{aut|L.}} (1753) ** ''Pinus pectinata'' {{a|Lam.}}, Fl. Franç. 2: 202 (1779). *** ''Abies pectinata'' ({{aut|Lam.}}) {{a|DC.}} in {{aut|J.B.A.M.de Lamarck}} & {{aut|A.P.de Candolle}}, Fl. Franç., ed. 3, 3: 276 (1805), {{NIL}}, non {{aut|Gilib.}} (1792) *** ''Picea pectinata'' ({{aut|Lam.}}) {{a|Loudon}}, Arbor. Frutic. Brit. 4: 2329 (1838). *** ''Pinus abies'' var. ''pectinata'' ({{aut|Lam.}}) {{a|Konrad Hermann Heinrich Christ|Christ}}, Verh. Naturf. Ges. Basel 3: 542 (1863). ** ''Abies minor'' {{a|Gilib.}}, Exerc. Phyt. 2: 412 (1792), {{OUO}} ** ''Pinus lucida'' {{a|Salisb.}}, Prodr. Stirp. Chap. Allerton: 399 (1796). ** ''Abies vulgaris'' {{a|Poir.}} in {{aut|J.B.A.M.de Lamarck}}, Encycl. 6: 514 (1804). ** ''Pinus baldensis'' {{a|Zuccagni}}, Cent. Observ. Pl. 1: 46 (1806). *** ''Abies baldensis'' ({{aut|Zuccagni}}) {{a|Zucc.}} ex {{a|Nyman}}, Consp. Fl. Eur.: 674 (1881). ** ''Abies taxifolia'' {{a|Desf.}}, Hort. Par. 3: 356 (1809). ** ''Peuce abies'' {{a|Rich.}}, Ann. Mus. Hist. Nat. 16: 298 (1810). ** ''Abies nobilis'' {{a|A.Dietr.}}, Fl. Berlin 2: 793 (1824). ** ''Abies excelsa'' {{a|Johann Heinrich Friedrich Link|Link}}, Abh. Königl. Akad. Wiss. Berlin 1827: 182 (1827), {{NIL}} ** ''Abies taxifolia'' {{a|Raf.}}, New Fl. 1: 38 (1836). ** ''Abies argentea'' {{a|Chambray}}, Traité Prat. Arbr. Résin. Conif.: 17 (1845). ** ''Abies candicans'' {{a|Fisch.}} ex {{a|Endl.}}, Syn. Conif.: 96 (1847). ** ''Pinus heterophylla'' {{a|K.Koch}}, Linnaea 22: 295 (1849). ** ''Picea excelsa'' {{a|Wender.}}, Pfl. Bot. Gärt. 1(Conif.): 11 (1851), {{NIL}} ** ''Picea kukunaria'' {{aut|Wender.}}, Pfl. Bot. Gärt.: 11 (1851). ** ''Picea metensis'' {{a|Gordon}}, Pinetum: 152 (1858). ** ''Picea rinzi'' {{aut|Gordon}} & {{a|Glend.}}, Pinetum: 152 (1858), [[pro syn.]] ** ''Abies rinzii'' {{aut|K.Koch}}, Dendrologie 2(2): 218 (1873). ** ''Abies metensis'' {{aut|Gordon}} & {{aut|Glend.}}, Pinetum, ed. 2: 211 (1875). ** ''Abies miniata'' {{a|Knight}} ex {{aut|Gordon}}, Pinetum, ed. 2: 8 (1875). ** ''Abies chlorocarpa'' {{a|Purk.}} ex {{aut|Nyman}}, Consp. Fl. Eur.: 674 (1881). ** ''Picea tenuifolia'' {{a|Beissn.}}, Handb. Nadelholzk.: 433 (1891). ** ''Abies abies'' {{a|Rusby}}, Bull. Pharm. (Paris), reimpr.: 16 (1892), {{NIN}} ** ''Abies alba'' var. ''podolica'' {{a|R.I.Schröd.}}, Mitt. Deutsch. Dendrol. Ges. 1899: 121 (1899). ** ''Abies tenuirifolia'' {{aut|Beissn.}}, Handb. Nadelholzk.: 121 (1909). ** ''Abies duplex'' {{a|Hormuz.}} ex {{aut|Beissn.}}, Handb. Nadelholzk., ed. 3: 110 (1930). ** ''Abies alba'' subsp. ''apennina'' {{a|Brullo}}, {{a|Scelsi}} & {{a|Spamp.}}, Veg. Aspromonte: 41 (2001). ** ''Abies alba'' var. ''glauca'' {{aut|Gordon}}, Pinetum: 3 (1855). ** ''Abies pectinata'' var. ''pendula'' {{a|Carrière}}, Traité Gén. Conif.: 207 (1855). *** ''Picea pectinata'' var. ''pendula'' ({{aut|Carrière}}) {{a|Godefroy}} ex {{aut|Gordon}} & {{a|Glend.}}, Pinetum: 153 (1858). *** ''Abies pectinata'' f. ''pendula'' ({{aut|Carrière}}) {{a|Conw.}}, Abh. Landesk. Prov. Westpreussen 9: 161 (1895). *** ''Abies alba'' lusus ''pendula'' ({{aut|Carrière}}) {{a|Asch.}} & {{a|Graebn.}}, Syn. Mitteleur. Fl. 1: 191 (1897). *** ''Pinus picea'' f. ''pendula'' ({{aut|Carrière}}) {{aut|Voss}} in {{aut|K.Putlitz}} & {{aut|L.Meyer}}, Landlexikon 4: 774 (1913). *** ''Abies alba'' f. ''pendula'' ({{aut|Carrière}}) {{aut|Rehder}}, Bibl. Cult. Trees: 11 (1949). ** ''Abies pectinata'' var. ''pyramidalis'' {{aut|Carrière}}, Traité Gén. Conif.: 207 (1855). *** ''Abies alba'' f. ''pyramidalis'' ({{aut|Carrière}}) {{a|Voss}}, Vilm. Blumengärtn. ed. 3, 1: 1237 (1896). *** ''Pinus picea'' f. ''pyramidalis'' ({{aut|Carrière}}) {{aut|Voss}} in {{aut|K.Putlitz}} & {{aut|L.Meyer}}, Landlexikon 4: 774 (1913). ** ''Abies pectinata'' var. ''columnaris'' {{aut|Carrière}}, Rev. Hort. (Paris), sér. 4, 8: 39 (1859). *** ''Abies alba'' var. ''columnaris'' ({{aut|Carrière}}) {{a|C.K.Schneid.}} in {{aut|E.E.Silva Tarouca}}, Uns. Freil.-Nadelhölzer: 151 (1913). *** ''Pinus picea'' f. ''columnaris'' ({{aut|Carrière}}) {{aut|Voss}} in {{aut|K.Putlitz}} & {{aut|L.Meyer}}, Landlexikon 4: 774 (1913). *** ''Abies alba'' f. ''columnaris'' ({{aut|Carrière}}) {{aut|Rehder}}, J. Arnold Arbor. 1: 55 (1919). ** ''Picea pyramidalis'' {{aut|Gordon}}, Pinetum, Suppl.: 49 (1862). ** ''Abies pectinata'' var. ''pendula-gracilis'' {{a|Sénécl.}}, Conifères: 14 (1868). ** ''Abies alba'' var. ''aurea'' {{a|auct.}}, Garden (London 1871-1927) 5: 231 (1874). ** ''Abies alba compacta'' {{a|Parsons}}, Cat. 1887: 65 (1887). *** ''Abies alba'' f. ''compacta'' ({{aut|Parsons}}) {{aut|Rehder}}, J. Arnold Arbor. 6: 204 (1925). *** ''Abies alba'' var. ''compacta'' ({{aut|Parsons}}) {{aut|Rehder}}, Man. Cult. Trees: 34 (1927). ** ''Abies alba'' var. ''brevifolia'' {{a|Mattf.}}, Mitt. Deutsch. Dendrol. Ges. 1925: 22 (1925). ** ''Abies pardei'' {{a|Gaussen}}, Bull. Soc. Hist. Nat. Toulouse 57: 358 (1928 publ. 1929). *** ''Abies alba'' var. ''pardei'' ({{aut|Gaussen}}) {{a|Silba}}, Phytologia 68: 9 (1990). *** ''Abies alba'' subsp. ''pardei'' ({{aut|Gaussen}}) {{a|Silba}}, J. Int. Conifer Preserv. Soc. 15: 36 (2008). ** ''Abies pardei'' subsp. ''pancicii'' {{a|M. Rac|Rac}} & {{a|Lovrić}}, Simpoz. Proucavanje Biljnog Zivotinjskog Sveta sa Aspekta Problema Zaštite i Unapredenja Zivotne Sredine Kragujevac: 80 (1988).<!-- I.Rácz? --> =={{int:Homonyms}}== * ''Abies alba'' ({{a|Castigl.}}) {{a|Michx.}}, Fl. Bor.-Amer. 2: 207 (1803), [[nom. illeg. hom.]] vide ''[[Picea laxa]]'' (Münchh.) Sarg., Gard. & Forest 2: 496. (1890) {{nadi| * '''Continental: Europe''' ** {{grey|'''Regional: Northern Europe'''}} *** {{grey|Denmark, Great Britain, Norway, Sweden (introduced).}} ** '''Regional: Middle Europe''' *** Austria, {{grey|Belgium (introduced),}} Czechoslovakia, Germany, Hungary, Poland, Switzerland. ** '''Regional: Southwestern Europe''' *** Corse, France, {{grey|Portugal (introduced),}} Spain. ** '''Regional: Southeastern Europe''' *** Albania, Bulgaria, Greece, Italy, Romania, Turkey-in-Europe, Yugoslavia. ** '''Regional: Eastern Europe''' *** Belarus, Ukraine. }} =={{int:References}}== ==={{int:Primary references}}=== {{Miller, 1768}} ==={{int:Additional references}}=== {{Greuter, 1993}} {{Jarvis, 2007|745|677300}} ==={{int:Links}}=== {{IUCN2|{{aut|Farjon, A.}} 2017|2017|Least Concern|10.2305/IUCN.UK.2017-2.RLTS.T42270A83978869.en}} {{POWO|2023|Feb|20}} {{MBG|2023|Feb|20}} {{IPNI|261448-1|2023|20 Feb}} {{World Plants|2023|Feb|20}} {{EMD|2023|Feb|20}} =={{int:Vernacular names}}== {{VN |als=Weisstanne |an=Abet común |ar=شوح أبيض |az=Avropa ağ şamı |azb=آوروپا آغ شامی |be=Піхта белая |be-x-old=Піхта белая |bg=Обикновена ела |ca=Avet blanc |co=Ghjaddicu |cs=Jedle bělokorá |csb=Zwëczajnô jedlëna |cy=Ffynidwydden arian |da=Almindelig Ædelgran |de=Weiß-Tanne |dsb=Běła jedła |el=Λευκή ελάτη |en=European Silver Fir |eo=Blanka abio |es=Abeto blanco |et=Euroopa nulg |eu=Izei zuri |fa=نراد نقره‌ای |fi=Saksanpihta |fr=Sapin blanc|frp=Vârnyo |ga=Giúis gheal |gl=Abeto branco |hr=Obična jela |hsb=Běła jědla |hu=Közönséges jegenyefenyő |is=Evrópuþinur |it=Abete bianco |ja=ヨーロッパモミ |koi=Чочком ньыв |ky=Аккарагай |lt=Europinis kėnis |mk=Сребрена ела |nl=Gewone Zilverspar |no=Vanlig Edelgran |io=Blanka abieto |oc=Avet blanc |pl=Jodła pospolita |ro=Brad argintiu |ru=Пихта белая |sh=Jela |sk=Jedľa biela |sl=bela jelka |sq=Bredhi i bardhë |sr=Европска јела |sv=Silvergran |tr=Orta Avrupa göknarı |udm=Тӧдьы ньылпу |uk=Ялиця біла |vec=Tana |yi=ווײַסיאָדלע |zh=銀冷杉 }} {{Commonscat}} {{Taxonbar}} [[Category:Philip Miller taxa]] tpqc9sl3suyv5tjig5jcwd4owugsfqz Laliostominae 0 37319 11323050 9914147 2026-10-22T11:50:58Z Burmeister 9074 revision update 11323050 wikitext text/x-wiki {{Image|Laliostoma labrosum.jpg|''[[Laliostoma labrosum]]''}} =={{int:Taxonavigation}}== {{Laliostominae}} Genera (2): {{g|Aglyptodactylus}} {{glast|Laliostoma}} =={{int:Name}}== Laliostominae {{a|Miguel Vences|Vences}} & {{a|Frank Glaw|Glaw}}, 2001 * {{int:Type genus}}: ''Laliostoma'' {{aut|Glaw, Vences & Böhme}}, 1998. ==={{int:Synonymy}}=== * Laliostominae {{aut|Vences & Glaw}}, 2001: 88 [original rank, as subfamilia] * Laliostomini — {{aut|Dubois}}, 2005 [subsequent rank, as tribus] =={{int:References}}== ==={{int:Primary references}}=== {{Vences & Glaw, 2001}} =={{int:Vernacular names}}== {{VN|en=Madagascar Jumping Frogs}} {{Taxonbar|from=Q2569289}} [[Category:Miguel Vences taxa]] [[Category:Frank Glaw taxa]] s9tgcib8p91s4jjsv2tl99jittqp91u Syntrichia norvegica 0 44898 11322644 11042066 2026-10-22T07:43:48Z MILEPRI 924668 nuevo taxón 11322644 wikitext text/x-wiki {{image|Syntrichia norvegica (c, 110233-471208) 4526.JPG}} {{image|Syntrichia norvegica (a, 145544-474322) 4225.JPG}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia norvegica]]'' =={{int:Name}}== ''Syntrichia norvegica'' [[Web.]], 1804 ==={{int:Synonyms}}=== *''Barbula norvegica'' (F. Weber) Lindb. *''Syntrichia ruralis var. norvegica'' (F. Weber) Steud. *''Tortula norvegica'' (F. Weber) Lindb. *''Tortula ruralis subsp. norvegica'' (F. Weber) Dixon *''Tortula ruralis var. norvegica'' (F. Weber) Kuc *''Barbula aciphylla'' Bruch & Schimp. *''Barbula ruralis subsp. aciphylla'' (Bruch & Schimp.) Boulay *''Syntrichia aciphylla'' (Bruch & Schimp.) Jur. *''Tortula aciphylla'' (Bruch & Schimp.) Hartm. (nomen *''Barbula brachyangia'' Müll. Hal. & Kindb. *''Tortula brachyangia'' (Müll. Hal. & Kindb.) Broth. *''Syntrichia aciphylla var. latipila'' J.J. Amann *''Syntrichia montana f. rufipila'' (J.J. Amann) J.J. Amann *''Syntrichia montana var. rufipila'' J.J. Amann *''Syntrichia ruralis f. compacta'' (Głow.) Podp. *''Tortula aciphylla var. compacta'' Głow. *''Syntrichia ruralis f. rufipila'' (Herzog) Podp. *''Syntrichia ruralis var. rufipila'' (Herzog) J.J. Amann *''Tortula ruralis var. rufipila'' Herzog *''Syntrichia ruralis var. pseudoaciphylla'' (H. Winter) Podp. *''Tortula ruralis var. pseudoaciphylla'' H. Winter *''Tortula alpina'' De Not. *''Tortula ruralis var. alpina'' De Not. *''Tortula norvegica var. norvegica'' *''Tortula remotifolia'' Takaki *''Tortula rubripila'' Dixon *''Tortula ruralis var. alpina'' Wahlenb. =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Weber, F.}} (1804). Plantae cryptogamae novae, vel minus cognitae. ''[[Archiv Für Die Systematische Naturgeschichte]]'', 1(1), 123–139. https://www.tropicos.org/reference/9028616 ==={{int:Additional references}}=== * Hodgetts, N. G., Söderström, L., Blockeel, T. L., Caspari, S., Ignatov, M. S., Konstantinova, N. A., Lockhart, N., Papp, B., Schröck, C., Sim-Sim, M., Bell, D., Bell, N. E., Blom, H. H., Bruggeman-Nannenga, M. A., Brugués, M., Enroth, J., Flatberg, K. I., Garilleti, R., Hedenäs, L., et al. (2020). An annotated checklist of bryophytes of Europe, Macaronesia and Cyprus. Journal of Bryology, 42(1), 1–116. https://www.tropicos.org/reference/100039553 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} =={{int:Vernacular names}}== {{VN |en=Norwegian Tortula Moss |fi=Lapinpartasammal }} {{Commonscat}} {{Taxonbar|from=Q15248678}} [[Category:Friedrich Weber taxa]] m1oelb7mro3y3z71x9mdau1e2nqk91g Syntrichia pagorum 0 44900 11322673 11042070 2026-10-22T08:02:54Z MILEPRI 924668 11322673 wikitext text/x-wiki {{Image|Syntrichia pagorum.jpg}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia pagorum]]'' =={{int:Name}}== ''Syntrichia pagorum'' ([[Milde]]) {{a|J.J.Amann}}, 1918 ==={{int:Synonyms}}=== * ''Tortula pagorum'' (Milde) [[De Not.]] ==={{int:Synonyms}}=== *''Barbula alpina subsp. pagorum'' (Milde) Kindb. *''Barbula laevipila f. pagorum'' (Milde) Molendo *''Barbula laevipila subsp. pagorum'' (Milde) Husn. *''Barbula laevipila var. pagorum'' (Milde) Husn. *''Barbula pagorum'' Milde *''Syntrichia laevipila var. pagorum'' (Milde) Mönk. *''Tortula laevipila var. pagorum'' (Milde) Warnst. *''Tortula pagorum'' (Milde) De Not. *''Barbula asperifolia'' Müll. Hal. DC *''Barbula crawfordii'' Paris *''Tortula crawfordii'' (Paris) Watts *''Barbula saccardoana'' (De Not.) Grav. *''Tortula laevipila var. saccardoana'' (De Not.) Barkman *''Tortula saccardoana'' De Not. *''Syntrichia laevipila var. propagulifera'' (Lindb.) Jur. *''Tortula alpina var. propagulifera (Lindb.) E.B. Bartram *''Tortula laevipila var. propagulifera'' Lindb. *''Syntrichia laevipila var. wachteri'' (Barkman) Düll *''Tortula laevipila var. wachteri'' Barkman *''Tortula asperifolia'' Broth. *''Tortula laevipila var. notarisii'' Barkman *''Tortula propagulata'' Laz. =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Amann, J., Meylan, C., & Culmann, P.}} (1918). In Flore des Mousses de la Suisse (Vol. 2). Herbier Bossier, Geneve. https://www.tropicos.org/reference/9010657 ==={{int:Additional references}}=== * Kramer, W. A. (2023). The genus Syntrichia Brid. (Pottiaceae, Bryophyta) in the Holarctic with special consideration of North America. Nova Hedwigia Beiheft, 154, 1–234. https://www.tropicos.org/reference/100054630 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} =={{int:Vernacular names}}== {{VN |en=tortula moss |nl= XRBroedbladsterretje |de= Brutblatt-Verbundzahnmoos, Brutblatt-Drehzahnmoos |ja= コモチネジレゴケ |es= Musgo epífito }} {{Commonscat}} {{Taxonbar|from=Q17265119}} [[Category:Jean Jules Amann taxa]] 4va007xehx3v77h1non01yyepw9rwvh 11322674 11322673 2026-10-22T08:03:13Z MILEPRI 924668 11322674 wikitext text/x-wiki {{Image|Syntrichia pagorum.jpg}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia pagorum]]'' =={{int:Name}}== ''Syntrichia pagorum'' ([[Milde]]) {{a|J.J.Amann}}, 1918 ==={{int:Synonyms}}=== *''Barbula alpina subsp. pagorum'' (Milde) Kindb. *''Barbula laevipila f. pagorum'' (Milde) Molendo *''Barbula laevipila subsp. pagorum'' (Milde) Husn. *''Barbula laevipila var. pagorum'' (Milde) Husn. *''Barbula pagorum'' Milde *''Syntrichia laevipila var. pagorum'' (Milde) Mönk. *''Tortula laevipila var. pagorum'' (Milde) Warnst. *''Tortula pagorum'' (Milde) De Not. *''Barbula asperifolia'' Müll. Hal. DC *''Barbula crawfordii'' Paris *''Tortula crawfordii'' (Paris) Watts *''Barbula saccardoana'' (De Not.) Grav. *''Tortula laevipila var. saccardoana'' (De Not.) Barkman *''Tortula saccardoana'' De Not. *''Syntrichia laevipila var. propagulifera'' (Lindb.) Jur. *''Tortula alpina var. propagulifera (Lindb.) E.B. Bartram *''Tortula laevipila var. propagulifera'' Lindb. *''Syntrichia laevipila var. wachteri'' (Barkman) Düll *''Tortula laevipila var. wachteri'' Barkman *''Tortula asperifolia'' Broth. *''Tortula laevipila var. notarisii'' Barkman *''Tortula propagulata'' Laz. =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Amann, J., Meylan, C., & Culmann, P.}} (1918). In Flore des Mousses de la Suisse (Vol. 2). Herbier Bossier, Geneve. https://www.tropicos.org/reference/9010657 ==={{int:Additional references}}=== * Kramer, W. A. (2023). The genus Syntrichia Brid. (Pottiaceae, Bryophyta) in the Holarctic with special consideration of North America. Nova Hedwigia Beiheft, 154, 1–234. https://www.tropicos.org/reference/100054630 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} =={{int:Vernacular names}}== {{VN |en=tortula moss |nl= XRBroedbladsterretje |de= Brutblatt-Verbundzahnmoos, Brutblatt-Drehzahnmoos |ja= コモチネジレゴケ |es= Musgo epífito }} {{Commonscat}} {{Taxonbar|from=Q17265119}} [[Category:Jean Jules Amann taxa]] 6ujzlk811bk5kysqb0ub81qkghihuxv Syntrichia papillosa 0 44901 11322701 11042072 2026-10-22T08:18:32Z MILEPRI 924668 11322701 wikitext text/x-wiki {{Image|Syntrichia papillosa 108229004.jpg}} {{Image|Syntrichia papillosa (b, 144719-474819) 4931.JPG}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia papillosa]]'' =={{int:Name}}== ''Syntrichia papillosa'' ([[Wils.]] in [[Spruce]]) [[Spruce]], 1867 ==={{int:Synonyms}}=== *''Barbula laevipila subsp. papillosa'' (Wilson ex Spruce) Bouvet *''Barbula papillosa'' (Wilson ex Spruce) Müll. Hal. *''Syntrichia papillosa'' (Wils.) Jur. *''Tortula papillosa'' Wilson ex Spruce (BAS) *''Barbula baileyi'' (Broth.) Kindb. *''Barbula baileyi'' (Broth.) Paris *''Syntrichia baileyi'' (Broth.) R.H. Zander *''Tortula baileyi'' Broth. *''Barbula reticularia'' Müll. Hal. *''Tortula reticularia'' (Müll. Hal.) Broth. *''Barbula rotundifolia'' (Hartm.) T. Jensen *''Tortula rotundifolia'' Hartm. *''Barbula streptopogoniacea'' Müll. Hal. *''Tortula streptopogoniacea'' (Müll. Hal.) Broth. *''Barbula vesiculosa'' Müll. Hal. *''Tortula vesiculosa'' (Müll. Hal.) Broth. *''Barbula vesiculosa var. involucrata'' Müll. Hal. *''Tortula involucrata'' (Müll.Hal.) Watts & Whitel. *''Tortula vesiculosa var. involucrata'' (Müll. Hal.) Watts & Whitel. *''Tortula vesiculosa var. involucrata'' (Müll.Hal.) Paris *''Syntrichia papillosa f. saxatilis'' (Warnst.) Podp. *''Syntrichia papillosa var. saxatilis'' (Warnst.) J.J. Amann *''Tortula papillosa var. saxatilis'' Warnst. *''Syntrichia papillosa var. chilensis'' (Thér.) R.H. Zander *''Tortula papillosa var. chilensis'' Thér. *''Syntrichia papillosa var. meridionalis'' (Warnst.) Podp. *''Tortula papillosa var. meridionalis'' Warnst. =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Spruce, R.}} (1867). In ''[[Catalogus Muscorum fere Omnium]] quos in Terris Amazonicus et Andinis, per Annos 1849–1860, legit Ricardus Spruceus. E. Newman'', London. https://www.tropicos.org/reference/9012754 ==={{int:Additional references}}=== * Gallego, M. T. (2005). A taxonomic study of the genus Syntrichia Brid. (Pottiaceae, Musci) in the Mediterranean region and Macaronesia. Journal of the Hattori Botanical Laboratory, 98, 47–122. https://www.tropicos.org/reference/9030445 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} =={{int:Vernacular names}}== {{VN |de=Papillen-Verbundzahnmoos |en=papillose tortula moss |nl=knikkersterretje }} {{Commonscat}} {{Taxonbar|from=Q15316790}} [[Category:Richard Spruce taxa]] gwbdup340aw78382spzpnorcjbu04wo Syntrichia princeps 0 44903 11322735 11042074 2026-10-22T08:31:07Z MILEPRI 924668 11322735 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia princeps]]'' =={{int:Name}}== ''Syntrichia princeps'' ({{a|De Not.}}) {{a|William Mitten|Mitten}}, 1859 ==={{int:Synonyms}}=== *''Barbula princeps'' (De Not.) Müll. Hal. *''Tortula princeps'' De Not. (BAS) *''Barbula chrysopila'' Müll. Hal. *''Tortula chrysopila'' (Müll. Hal.) Paris *''Barbula megalocarpa'' Kindb. *''Tortula megalocarpa'' (Kindb.) Broth. *''Barbula mollis'' Bruch & Schimp. ex Müll. Hal. *''Syntrichia mollis'' (Bruch & Schimp. ex Müll. Hal.) R.H. Zander *''Tortula mollis'' (Bruch & Schimp. ex Müll. Hal.) Broth. *''Barbula muelleri'' Bruch & Schimp. DC *''Barbula princeps var. brachycarpa'' (De Not.) Grav. *''Syntrichia princeps var. brachycarpa'' (De Not.) R.H. Zander *''Tortula princeps var. brachycarpa'' De Not. *''Barbula pseudoantarctica'' Müll. Hal. *''Tortula pseudoantarctica'' (Müll. Hal.) Broth. *''Barbula semirubra'' Müll. Hal. *''Tortula semirubra'' (Müll. Hal.) Broth. *''Grimmia muelleri'' Bruch & Schimp. ex Unger & Kotschy *''Syntrichia princeps var. parnassica'' (Schiffn.) Podp. *''Tortula muelleri var. parnassica'' Schiffn. *''Tortula princeps subsp. parnassica'' (Schiffn.) W.A. Kramer *''Tortula princeps var. parnassica'' (Schiffn.) Wijk & Margad. *''Syntrichia ruralis var. spiralis'' (Herzog) R.H. Zander *''Tortula ruralis var. spiralis'' Herzog *''Tortula spiralis'' (Herzog) Herzog *''Tortula muelleri'' Wilson & Hook. f. *''Tortula princeps subsp. princeps'' =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Mitten, W.}} (1859). Musci Indiae Orientalis, an enumeration of the mosses of the East Indies. ''[[Journal of the Proceedings of the Linnean Society, Botany]]'', Supplement, 1, 1–171. https://www.tropicos.org/reference/9004856 ==={{int:Additional references}}=== * Kramer, W. A. (2023). The genus Syntrichia Brid. (Pottiaceae, Bryophyta) in the Holarctic with special consideration of North America. Nova Hedwigia Beiheft, 154, 1–234. https://www.tropicos.org/reference/100054630 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} =={{int:Vernacular names}}== {{VN |en=tortula moss, brown screw-moss |de= XRZungenblättriges Drehzahnmoos |sv= stäppskruvmossa }} {{Commonscat}} {{Taxonbar|from=Q15317051}} [[Category:William Mitten taxa]] kbzdd7wgydnc72m4qia2g4bxphk570k Syntrichia ruralis 0 44905 11322783 11042076 2026-10-22T09:03:54Z MILEPRI 924668 11322783 wikitext text/x-wiki {{image}} {{Image|Syntrichia ruralis 116530896.jpg}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia ruralis]]'' =={{int:Name}}== ''Syntrichia ruralis'' ([[Hedw.]]) [[Friedrich Weber|Weber]] & [[D. Mohr]], 1803 ==={{int:Synonyms}}=== *''Barbula ruralis'' Hedw. (BAS) *''Bryum rurale'' (Hedw.) With. *''Syntrichia ruralis'' (Hedw.) Brid. *''Tortula ruralis'' (Hedw.) G. Gaertn., B. Mey. & Scherb. *''Barbula papillinervis'' Müll. Hal. & Kindb. DC *''Barbula pulvinata subsp. papillinervis'' (Müll. Hal. & Kindb.) Kindb. *''Tortula pulvinata subsp. papillinervis'' (Müll. Hal. & Kindb.) Paris *''Barbula pseudoaciphylla'' Kindb. *''Tortula pseudoaciphylla'' (Kindb.) Broth. *''Barbula rufipila'' Cardot & Thér. *''Tortula rufipila'' (Cardot & Thér.) Broth. *''Barbula ruralis subsp. alaskana'' Kindb. *''Tortula ruralis subsp. alaskana'' (Kindb.) Paris *''Barbula ruralis var. densiretis'' Venturi *''Syntrichia ruralis subvar. densiretis'' (Venturi) Podp. *''Syntrichia ruralis var. densiretis'' (Venturi) J.J. Amann *''Tortula ruralis var. densiretis'' (Venturi) Paris *''Barbula ruralis var. elongata'' Roum. *''Syntrichia densa'' (Velen.) J.-P. Frahm *''Tortula densa'' (Velen.) J.-P. Frahm *''Tortula ruralis var. densa'' Velen. *''Syntrichia reflexa'' R.H. Zander *''Syntrichia ruralis f. brevipila'' (Warnst.) Podp. *''Tortula ruralis var. brevipila'' Warnst. *''Syntrichia ruralis f. gracilis'' Podp. *''Syntrichia ruralis f. subrufa'' (Podp.) Podp. *''Tortula ruralis f. subrufa'' Podp. *''Syntrichia ruralis f. viridis'' (Matousch.) Podp. *''Tortula ruralis f. viridis'' Matousch. *''Syntrichia ruralis subvar. glacialis'' (J.J. Amann) Podp. *''Syntrichia ruralis var. glacialis'' J.J. Amann *''Syntrichia ruralis var. pontresinae'' (Geh. & Warnst.) Podp. *''Tortula pontresinae'' Geh. & Warnst. *''Tortula ruralis var. pontresinae'' (Geh. & Warnst.) Wijk & Margad. *''Tortula bullata'' Herzog *''Tortula reflexa'' X.J. Li *''Tortula ruralifomis'' (Besch.) Ingham *''Tortula ruraliformis'' *''Tortula ruraliformis var. ruraliformis'' *''Tortula ruralis f. fuscipila'' Herzog *''Tortula ruralis f. gracilis'' Meyl. *''Tortula ruralis f. pseudoruraliformis'' Tosco *''Tortula ruralis f. rhizinifera'' Tosco *''Tortula ruralis subsp. ruralis'' *''Tortula ruralis var. fulv''a Györffy *''Tortula ruralis var. montana'' De Not. *''Tortula ruralis var. ruralis'' =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Weber, F., & Mohr, D. M. H.}} (1803). In Index Musei Plantarum Cryptogamarum. Christianus Fridericus Mohr, Kiliae. https://www.tropicos.org/reference/9028611 ==={{int:Additional references}}=== * Cano, M. J., & Gallego, M. T. (2008). The genus Tortula (Pottiaceae, Bryophyta) in South America. Botanical Journal of the Linnean Society, 156, 173–220. https://www.tropicos.org/reference/9034397 ==={{int:Links}}=== {{Catol-Hassler|2026|October|20}} {{MBG|2026|October!20}} {{GBIF||2026|October|20}} =={{int:Vernacular names}}== {{VN |da=Tag-Hårstjerne |de=Dach-Drehzahnmoos |en=tortula moss, great hairy screw-moss |fi=Ketopartasammal }} {{Commonscat}} {{Taxonbar|from=Q1156618}} [[Category:Friedrich Weber taxa]] [[Category:Daniel Matthias Heinrich Mohr]] 7n60if1wi6mccvtmf0c21eetz2exmkk Syntrichia virescens 0 44910 11322858 11042080 2026-10-22T09:34:28Z MILEPRI 924668 11322858 wikitext text/x-wiki {{Image|Syntrichia virescens (a, 144657-481004) 8794.JPG}} {{Image|Syntrichia virescens (a, 144657-481004) 8799.JPG}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia virescens]]'' =={{int:Name}}== ''Syntrichia virescens'' ([[De Not.]]) [[Ryszard Ochyra|Ochyra]], 1992 ==={{int:Synonyms}}=== *''Barbula ruralis var. virescens'' (De Not.) Bertol. *''Barbula virescens'' (De Not.) Lorentz *''Tortula ruralis var. virescens'' De Not. (BAS) *''Tortula virescens'' (De Not.) De Not. *''Barbula danica'' M.T. Lange *''Tortula danica'' (M.T. Lange) Kindb. *''Tortula danica'' (M.T.Lange) Hartm. ex Limpr. *''Tortula ruralis subsp. danica'' (M.T. Lange) C. Hartm. *''Tortula ruralis var. danica'' (M.T. Lange) Lange *''Barbula intermedia var. pulvinata'' (Jur.) Milde *''Barbula pulvinata'' Jur. *''Barbula ruralis subsp. pulvinata'' (Jur.) Boulay *''Barbula ruralis var. pulvinata'' (Jur.) Limpr. *''Syntrichia pulvinata'' (Jur.) Jur. *''Tortula pulvinata'' (Jur.) Limpr. *''Barbula latoexcisa'' Müll. Hal. & Kindb. *''Barbula pulvinata subsp. latoexcisa'' (Müll. Hal. & Kindb.) Paris *''Barbula pulvinata var. latoexcisa'' (Müll. Hal. & Kindb.) Kindb. *''Tortula pulvinata var. latoexcisa'' (Müll. Hal. & Kindb.) Paris *''Barbula rotundoemarginata'' Müll. Hal. & Kindb. *''Tortula rotundoemarginata'' (Müll. Hal. & Kindb.) Broth. *''Barbula ruralis var. gracilis'' (C.E.O. Jensen) Paris *''Syntrichia ruralis var. gracilis'' (C.E.O. Jensen) R.H. Zander *''Tortula ruralis var. gracilis'' C.E.O. Jensen *''Syntrichia aciphylla var. densa'' J.J. Amann *''Syntrichia montana var. nivalis'' J.J. Amann *''Syntrichia pulvinata f. macrophylla'' (Warnst.) Podp *''Syntrichia pulvinata var. macrophylla'' (Warnst.) J.J. Amann *''Tortula pulvinata var. macrophylla'' Warnst. *''Syntrichia pulvinata f. microphylla'' (Warnst.) Podp. *''Syntrichia pulvinata var. microphylla'' (Warnst.) J.J. Amann *''Tortula pulvinata var. microphylla'' Warnst. *''Syntrichia pulvinata f. versispora'' (Warnst.) Podp. *''Tortula pulvinata var. versispora'' Warnst. *''Syntrichia rupicola'' B.H. Allen *''Syntrichia ruralis var. substereidosa'' (W.A. Kramer) R.H. Zander *''Syntrichia substereidosa'' (W.A. Kramer) Tsegmed *''Tortula ruralis var. substereidosa'' W.A. Kramer *''Syntrichia virescens var. iranica'' (W.A. Kramer) R.H. Zander *''Tortula virescens var. iranica'' W.A. Kramer *''Tortula virescens subsp. virescens'' *''Tortula virescens var. virescens'' =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Ochyra, R.}} (1992). New combinations in Syntrichia and Warnstorfia (Musci). ''[[Fragmenta Floristica et Geobotanica]]'', 37, 211–214. https://www.tropicos.org/reference/9011979 ==={{int:Additional references}}=== * Gallego, M. T. (2005). A taxonomic study of the genus Syntrichia Brid. (Pottiaceae, Musci) in the Mediterranean region and Macaronesia. Journal of the Hattori Botanical Laboratory, 98, 47–122. https://www.tropicos.org/reference/9030445 ==={{int:Links}}=== {{Catol-Hassler|2026|October|20}} {{MBG|2026|October!20}} {{GBIF||2026|October|20}} =={{int:Vernacular names}}== {{VN |en=tortula moss, lesser screw-moss |nl=uitgerand zodesterretje }} {{Commonscat}} {{Taxonbar|from=Q15316915}} [[Category:Ryszard Ochyra taxa]] ss8w9748k5vh16wz6qmk0sdy343epsa Pseudotsuga macrocarpa 0 45101 11322311 10683901 2026-10-21T20:18:53Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322311 wikitext text/x-wiki {{image|Pseudotsuga macrocarpa Big Santa Anita Canyon.jpg}} =={{int:Taxonavigation}}== {{Pseudotsuga}} Species: ''[[Pseudotsuga macrocarpa]]'' =={{int:Name}}== ''Pseudotsuga macrocarpa'' ([[Vasey]]) [[Mayr]] =={{int:References}}== * Waldungen von Nordamerika Ihre Holzarten, deren Anbaufahigkeit und Forstlicher Werth fur Europa... 278. 1890 * {{GRIN||316802|08-Apr-12}} =={{int:Vernacular names}}== {{VN |en=Bigcone Douglas-fir |io=Strobilego-pseudocugo }} {{Commonscat}} {{Taxonbar|from=Q1425070}} [[Category:Heinrich Mayr taxa]] ted97fsro5gc91ybvtpomx2ia27he7e Pseudotsuga menziesii 0 45102 11322307 11042671 2026-10-21T20:13:03Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322307 wikitext text/x-wiki {{Image|Pseudotsuga menziesii 7456.JPG|''Pseudotsuga menziesii'' subsp. ''menziesii'', Wenatchee Mountains, Washington, USA}} {{Image|DouglasFir 7491t.jpg|''Pseudotsuga menziesii'' subsp. ''menziesii'', strobilus, Cougar Mountain, Seattle, Washington, USA}} =={{int:Taxonavigation}}== {{Pseudotsuga}} Species: ''[[Pseudotsuga menziesii]]'' <br> Subspecies: {{subspplant|P|seudotsuga|m|enziesii|glauca}} {{subspplantlast|P|seudotsuga|m|enziesii|menziesii}} =={{int:Name}}== ''Pseudotsuga menziesii'' ({{a|Mirb.}}) {{a|Franco}}, Conif. Duarum Nominibus: 4 (1950). ==={{int:Synonyms}}=== {{BA}} ** ''Abies menziesii'' {{aut|Mirb.}}, Mém. Mus. Hist. Nat. 13: 63, 70 (1825). {{HET}} ** see {{Taxit|Pseudotsuga menziesii subsp. menziesii|linked=yes}} {{nadi| * {{grey|'''Continental: Europe''' (introduced)}} ** {{grey|'''Regional: Northern Europe'''}} *** {{grey|Denmark, Finland, Føroyar, Great Britain, Ireland, Norway, Sweden.}} ** {{grey|'''Regional: Middle Europe'''}} *** {{grey|Austria, Belgium, Czechoslovakia, Germany, Poland, Switzerland.}} ** {{grey|'''Regional: Southwestern Europe'''}} *** {{grey|France, Portugal, Spain.}} ** {{grey|'''Regional: Southeastern Europe'''}} *** {{grey|Bulgaria, Greece, Italy, Romania, Yugoslavia.}} * {{grey|'''Continental: Asia-Temperate''' (introduced)}} ** {{grey|'''Regional: Western Asia'''}} *** {{grey|Turkey.}} * '''Continental: Northern America''' ** '''Regional: Subarctic America''' *** Alaska. ** '''Regional: Western Canada''' *** Alberta, British Columbia. ** '''Regional: Northwestern U.S.A.''' *** Colorado, Idaho, Montana, Oregon, Washington, Wyoming. ** {{grey|'''Regional: Northeastern U.S.A.''' (introduced)}} *** {{grey|New York.}} ** '''Regional: Southwestern U.S.A.''' *** Arizona, California, Nevada, Utah. ** '''Regional: South-Central U.S.A.''' *** New Mexico, Texas. ** '''Regional: Mexico''' *** Mexico Central, Mexico Northeast, Mexico Northwest, Mexico Southwest. }} =={{int:References}}== ==={{int:Primary references}}=== * {{Franco}} 1950. ''Coniferarum Duarum Nominibus'': 4. ==={{int:Links}}=== * {{WCSP|2021|Sep|27}} * {{PWO|2021|Sep|27}} * {{GRIN|sp|30191}} =={{int:Vernacular names}}== {{VN |cs=Douglaska tisolistá |da=Grøn Douglasgran |de=Douglasie |en=Douglas fir |eo=Menzies-pseŭdocugo |es=Abeto de Douglas |et=Harilik ebatsuuga |eu=Douglas izei |fi=Lännendouglaskuusi |fr=Sapin de Douglas |gl=Abeto de Douglas |hr=Obična američka duglazija |hsb=Wšědna douglasija |hu=Amerikai duglászfenyő |io=Menzies-pseudocugo |it=Abete di Douglas |ja=ベイマツ |lt=Didžioji pocūgė |mk=Дуглазија |nl=Douglasspar |pl=Daglezja zielona |pt=Abeto de Douglas |ru=Псевдотсуга Мензиса |sl=duglazija |sr=Дуглазија |uk=Псевдотсуга Мензіса }} {{Commonscat}} {{Taxonbar}} [[Category:João Manuel Antonio do Amaral Franco taxa]] [[Category:Eponyms of Archibald Menzies]] 9ba4bf6mud2abqx12f6wtaratq6d00q Alsia 0 45172 11322979 8853306 2026-10-22T10:32:07Z Tommy Kronkvist 596 Author links. 11322979 wikitext text/x-wiki {{Image|Alsia californica (California alsia moss) (7149100085).jpg|''Alsia californica''}} =={{int:Taxonavigation}}== {{Alsia}} Species: ''[[Alsia californica]]'' =={{int:Name}}== ''Alsia'' {{a|William Starling Sullivant|Sull.}}, 1855 =={{int:References}}== ==={{int:Primary references}}=== * {{a|William Starling Sullivant|Sullivant, W.S.}} 1855. ''[[Notices of some new species of mosses, from the Pacific Islands, in the collection of the United States Exploring Expedition, under Captain Wilkes]]'' 16. ==={{int:Additional references}}=== * Flora of North America Editorial Committee. 2014. Bryophyta, part 2. 28: i–xxii, 1–702. In Fl. N. Amer.. Oxford University Press, New York. ==={{int:Links}}=== {{Catol-ELPT|2022|July|19}} {{MBG|2022|July|19}} =={{int:Vernacular names}}== {{VN |en=Alsia moss }} {{Taxonbar}} {{Commonscat}} [[Category:William Starling Sullivant taxa]] 5de1ns6f0ry20pbsr1moqrs1owlslrz Androsace chamaejasme 0 46135 11322367 10858473 2026-10-21T21:09:53Z TadejM 24665 /* {{int:Vernacular names}} */ +sl 11322367 wikitext text/x-wiki {{Image|Androsace chamaejasme (7833420602).jpg|''Androsace chamaejasme'', Denali National Park and Preserve, AK, USA.}} {{Image|Androsace chamaejasme - Flickr - aspidoscelis.jpg|''Androsace chamaejasme'', Sangre de Cristo Mountains, southeast of Latir Peak and south of the Latir Lakes, Taos County, New Mexico.}} =={{int:Taxonavigation}}== {{Androsace}} Species: ''[[Androsace chamaejasme]]'' =={{int:Name}}== ''Androsace chamaejasme'' {{a|Franz Xaver von Wulfen|Wulfen}} in {{aut|N.J.von Jacquin}}, Collectanea 1: 194 (1787). ==={{int:Synonyms}}=== {{HOT}} ** ''Primula chamaejasme'' ({{aut|Wulfen}}) {{a|Kuntze}}, Revis. Gen. Pl. 2: 400 (1891) ** ''Primula chamaejasme'' var. ''typica'' {{a|Derganc}}, Allg. Bot. Z. Syst. 10: 110 (1904), [[not validly publ.]] {{HET}} ** ''Androsace acutifolia'' {{a|Turcz.}} ex {{a|Steud.}}, Nomencl. Bot., ed. 2, 1: 93 (1840) ** ''Androsace longiscapa'' {{a|K.Koch}}, Linnaea 23: 611 (1850) ** ''Androsace obtusifolia'' {{a|Willd.}} ex {{a|Ledeb.}}, Fl. Ross. 3: 18 (1847), not validly publ. ** ''Androsace villosa'' {{a|Jacq.}}, Fl. Austriac. 4: t. 352 (1776), [[nom. illeg.]] ** ''Douglasia johnstonii'' {{a|A.Nelson}}, Proc. Biol. Soc. Washington 20: 37 (1907) ** ''Drosace chamaejasme'' ({{aut|Willd.}}) {{aut|A.Nelson}}, R.E.Ashton, Pl. Rocky Mt. Natl. Park: 90 (1933) ** ''Gregoria johnstonii'' ({{aut|A.Nelson}}) {{a|House}}, Bull. New York State Mus. Nat. Hist. 233-234: 69 (1920 publ. 1921) ** ''Primula androsacea'' {{a|Georgi}} ex {{aut|Ledeb.}}, Fl. Ross. 3: 18 (1847), not validly publ. {{Nadi| * '''Europe''' ** '''Middle Europe''' *** Austria, Czechia-Slovakia, Germany, Poland, Switzerland. ** '''Southwestern Europe''' *** France. ** '''Southeastern Europe''' *** Italy, Romania, Northwest Balkan Peninsula. ** '''Eastern Europe''' *** East European Russia, North European Russia. *'''Africa''' ** '''Northern Africa''' *** Morocco. ** '''Caucasus''' *** North Caucasus, Transcaucasus. }} =={{int:References}}== ==={{int:Primary references}}=== {{Jacquin, 1786}} ==={{int:Additional references}}=== {{Greuter, Burdet & Long, 1989}} {{Mirek et al., 2020}} ==={{int:Links}}=== {{PWO|2022|October|10}} {{IPNI|700224-1|2022|October 10}} {{World Plants|2022|October|10}} {{Catol-Hassler|2022|October|10}} =={{int:Vernacular names}}== {{VN |en=sweetflower rockjasmine |fr=Androsace petit jasmin |pl=Naradka włosista |sl=dlakavi oklep }} {{Commons category}} {{Taxonbar}} [[Category:Franz Xaver von Wulfen taxa]] 6194slmtfcj74q2xsfcglt4n6k734mn Lardizabalaceae 0 48816 11322005 8847071 2026-10-21T14:00:50Z Andyboorman 251907 /* {{int:Links}} */ 11322005 wikitext text/x-wiki {{image|Stauntonia hexaphylla RJB.jpg|''[[Stauntonia hexaphylla]]''}} =={{int:Taxonavigation}}== {{Lardizabalaceae}} Subfamiliae: {{subfam|Lardizabaloideae}} {{subfamlast|Sargentodoxoideae}} Genera: {{g|Akebia}} {{g|Boquila}} {{g|Decaisnea (Lardizabalaceae)|Decaisnea}} {{g|Lardizabala}} {{g|Sargentodoxa}} {{g|Sinofranchetia}} {{glast|Stauntonia}} =={{int:Name}}== Lardizabalaceae {{a|R.Br.}}, Trans. Linn. Soc. London 13: 212 (1821), [[nom. cons.]] *Type genus: ''Lardizabala'' {{a|Ruiz}} & {{a|Pav.}}, Fl. Peruv. Prodr. 143, t. 37. (1794) ==={{int:Synonyms}}=== *Decaisneaceae {{a|Loconte}}, Pl. Syst. Evol. Suppl. 9: 105 (1995) *Sinofranchetiaceae {{a|Alexander Borissovitch Doweld|Doweld}}, Byull. Moskovsk. Obshch. Isp. Prir. Biol. 105(5): 60 (2000) =={{int:References}}== ==={{int:Primary references}}=== *{{aut|Brown, R.}} 1821. ''[[Transactions of the Linnean Society of London]]'' 13: 212. {{Doweld, 2000b}} ==={{int:Additional references}}=== *{{Christenhusz, 2012a}} * {{WangW et al., 2009}} ==={{int:Links}}=== {{POWO|2026|Oct|10}} {{Catol-Hassler|2022|June|10}} {{IPNI||2022|June 10}} {{APW}} =={{int:Vernacular names}}== {{VN |ar=لرديزباليات |ca=Lardizabalàcies |cs=Kokylovité |da=Blåbælg-familien |de=Fingerfruchtgewächse |fi=Akebiakasvit |hr=Lardizabalevke |hu=Kékhüvelyfélék |ko=으름덩굴과 |ku=Famîleya akebiyayan |lt=Lardizabaliniai |pl=Krępieniowate |ru=Лардизабаловые |sv=Narrbuskeväxter |vi=Họ Mộc thông |zh=木通科 }} {{taxonbar}} {{Commonscat}} [[category:Robert Brown taxa]] st41bnqx55056zg3dt2wgnnlhvlzobu Heteragrion 0 54858 11322382 10897203 2026-10-21T21:28:26Z John Tann 703224 Added category 11322382 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Heteragrion}} Species: {{sp|H|eteragrion|aequatoriale}} {{sp|H|eteragrion|albifrons}} {{sp|H|eteragrion|alienum}} {{sp|H|eteragrion|angustipenne}} {{sp|H|eteragrion|archon}} {{sp|H|eteragrion|atrolineatum}} {{sp|H|eteragrion|aurantiacum}} {{sp|H|eteragrion|azulum}} {{sp|H|eteragrion|bariai}} {{sp|H|eteragrion|beschkii}} {{sp|H|eteragrion|bickorum}} {{sp|H|eteragrion|breweri}} {{sp|H|eteragrion|calendulum}} {{sp|H|eteragrion|chlorotaeniatum}} {{sp|H|eteragrion|chrysops}} {{sp|H|eteragrion|consors}} {{sp|H|eteragrion|cooki}} {{sp|H|eteragrion|demarmelsi}} {{sp|H|eteragrion|denisye}} {{sp|H|eteragrion|dorsale}} {{sp|H|eteragrion|eboratum}} {{sp|H|eteragrion|erythrogastrum}} {{sp|H|eteragrion|flavidorsum}} {{sp|H|eteragrion|flavovittatum}} {{sp|H|eteragrion|freddiemercuryi}} {{sp|H|eteragrion|gorbi}} {{sp|H|eteragrion|gracile}} {{sp|H|eteragrion|ictericum}} {{sp|H|eteragrion|icterops}} {{sp|H|eteragrion|inca}} {{sp|H|eteragrion|itacolomii}} {{sp|H|eteragrion|lencionii}} {{sp|H|eteragrion|luizfelipei}} {{sp|H|eteragrion|macilentum}} {{sp|H|eteragrion|majus}} {{sp|H|eteragrion|makiritare}} {{sp|H|eteragrion|mantiqueirae}} {{sp|H|eteragrion|melanurum}} {{sp|H|eteragrion|mitratum}} {{sp|H|eteragrion|muryense}} {{sp|H|eteragrion|obsoletum}} {{sp|H|eteragrion|ochraceum}} {{sp|H|eteragrion|palmichale}} {{sp|H|eteragrion|pemon}} {{sp|H|eteragrion|peregrinum}} {{sp|H|eteragrion|petiense}} {{sp|H|eteragrion|rubrifulvum}} {{sp|H|eteragrion|silvarum}} {{sp|H|eteragrion|simulatum}} {{sp|H|eteragrion|tatama}} {{sp|H|eteragrion|triangulare}} {{sp|H|eteragrion|tricellulare}} {{splast|H|eteragrion|valgum}} =={{int:Name}}== * ''Heteragrion'' [[Selys]], 1862 =={{int:References}}== {{Selys, 1862}} {{Ávila, Lencioni & Carneiro, 2020}} {{Bota-Sierra & Novelo-Gutiérrez, 2017}} {{Cezário & Guillermo-Ferreira, 2021}} {{Zt3685.1.1}} {{Zt3609.96}} {{Dijkstra et al., 2013}} {{Stand-Pérez, Bota Sierra & Pérez-Gutiérrez, 2019}} {{Vilela, Farias & Santos, 2021}} {{Vilela, Koroiva & Guillermo-Ferreira, 2019}} {{Taxonbar|from=Q1383683}} [[Category:Edmond de Selys Longchamps taxa]] 7asjktb53i6oju30mja0vtk491k2p5a 11322516 11322382 2026-10-22T02:08:35Z John Tann 703224 updated reference 11322516 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Heteragrion}} Species: {{sp|H|eteragrion|aequatoriale}} {{sp|H|eteragrion|albifrons}} {{sp|H|eteragrion|alienum}} {{sp|H|eteragrion|angustipenne}} {{sp|H|eteragrion|archon}} {{sp|H|eteragrion|atrolineatum}} {{sp|H|eteragrion|aurantiacum}} {{sp|H|eteragrion|azulum}} {{sp|H|eteragrion|bariai}} {{sp|H|eteragrion|beschkii}} {{sp|H|eteragrion|bickorum}} {{sp|H|eteragrion|breweri}} {{sp|H|eteragrion|calendulum}} {{sp|H|eteragrion|chlorotaeniatum}} {{sp|H|eteragrion|chrysops}} {{sp|H|eteragrion|consors}} {{sp|H|eteragrion|cooki}} {{sp|H|eteragrion|demarmelsi}} {{sp|H|eteragrion|denisye}} {{sp|H|eteragrion|dorsale}} {{sp|H|eteragrion|eboratum}} {{sp|H|eteragrion|erythrogastrum}} {{sp|H|eteragrion|flavidorsum}} {{sp|H|eteragrion|flavovittatum}} {{sp|H|eteragrion|freddiemercuryi}} {{sp|H|eteragrion|gorbi}} {{sp|H|eteragrion|gracile}} {{sp|H|eteragrion|ictericum}} {{sp|H|eteragrion|icterops}} {{sp|H|eteragrion|inca}} {{sp|H|eteragrion|itacolomii}} {{sp|H|eteragrion|lencionii}} {{sp|H|eteragrion|luizfelipei}} {{sp|H|eteragrion|macilentum}} {{sp|H|eteragrion|majus}} {{sp|H|eteragrion|makiritare}} {{sp|H|eteragrion|mantiqueirae}} {{sp|H|eteragrion|melanurum}} {{sp|H|eteragrion|mitratum}} {{sp|H|eteragrion|muryense}} {{sp|H|eteragrion|obsoletum}} {{sp|H|eteragrion|ochraceum}} {{sp|H|eteragrion|palmichale}} {{sp|H|eteragrion|pemon}} {{sp|H|eteragrion|peregrinum}} {{sp|H|eteragrion|petiense}} {{sp|H|eteragrion|rubrifulvum}} {{sp|H|eteragrion|silvarum}} {{sp|H|eteragrion|simulatum}} {{sp|H|eteragrion|tatama}} {{sp|H|eteragrion|triangulare}} {{sp|H|eteragrion|tricellulare}} {{splast|H|eteragrion|valgum}} =={{int:Name}}== * ''Heteragrion'' {{a|Edmond de Selys Longchamps|Selys}}, 1862 =={{int:References}}== ==={{int:Primary references}}=== {{Selys, 1862b}} at {{BHL|page/36014876|p.19.}} ==={{int:Additional references}}=== {{Ávila, Lencioni & Carneiro, 2020}} {{Bota-Sierra & Novelo-Gutiérrez, 2017}} {{Cezário & Guillermo-Ferreira, 2021}} {{Dijkstra et al., 2013}} {{Zt3685.1.1}} {{Zt3609.96}} {{Stand-Pérez, Bota Sierra & Pérez-Gutiérrez, 2019}} {{Vilela, Farias & Santos, 2021}} {{Vilela, Koroiva & Guillermo-Ferreira, 2019}} {{Taxonbar|from=Q1383683}} [[Category:Edmond de Selys Longchamps taxa]] c9c87osekgee7pppges4osa9eff7cm0 Hypolestes 0 54888 11322555 10412098 2026-10-22T03:34:57Z John Tann 703224 Added reference 11322555 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Hypolestes}} Species: {{sp|H|ypolestes|clara}} {{sp|H|ypolestes|hatuey}} {{splast|H|ypolestes|trinitatis}} =={{int:Name}}== ''Hypolestes'' {{a|Juan Cristóbal Gundlach|Gundlach}}, 1888 =={{int:References}}== ==={{int:Primary references}}=== {{Gundlach, 1888a}} at {{BHL|page/46357727|p.216.}} ==={{int:Additional references}}=== {{Torres-Cambas et al., 2015}} {{Taxonbar|from=Q1383673}} [[Category:Juan Cristóbal Gundlach taxa]] 5rxgn0cgl3x4spaaqzkmwx2qczvu6tq 11322607 11322555 2026-10-22T05:15:56Z John Tann 703224 Added synonymy 11322607 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Hypolestes}} Species: {{sp|H|ypolestes|clara}} {{sp|H|ypolestes|hatuey}} {{splast|H|ypolestes|trinitatis}} =={{int:Name}}== ''Hypolestes'' {{a|Juan Cristóbal Gundlach|Gundlach}}, 1888 ==={{int:Synonymy}}=== * ''Hypolestes'' {{a|Hermann August Hagen|Hagen}}, 1868. ''nomen nudum''; this earlier usage is unavailable and does not have priority. * ''Ortholestes'' {{a|Philip Powell Calvert|Calvert}}, 1891. Junior subjective synonym; proposed before Calvert knew of Gundlach's earlier name. ==={{int:Notes}}=== Gundlach's name appeared in a separately issued fascicle that was little known outside Cuba. Calvert therefore proposed ''Ortholestes'' before learning of Gundlach's earlier name; in 1919, he documented its priority. =={{int:References}}== ==={{int:Primary references}}=== {{Gundlach, 1888a}} at {{BHL|page/46357727|p.216.}} Describes ''Hypolestes'' as a subgenus of ''Lestes'' and names ''Lestes (Hypolestes) trinitatis''. {{Hagen, 1868}} at {{BHL|page/8059625|p.290.}} Earlier use of the name ''Hypolestes''; treated as a ''nomen nudum'' by Bridges (1994). {{Calvert, 1891}} at {{BHL|page/2566115|p.199.}} Establishes ''Ortholestes'' and describes ''Ortholestes clara''. ==={{int:Additional references}}=== {{Bridges, 1994b}} at {{BHL|page/15106088|p.IV.5.}} Catalogues the earlier name and the synonymy. {{Calvert, 1919}} at p.340. Shows that Gundlach's ''Hypolestes'' and ''trinitatis'' have priority over Calvert's later names. {{Torres-Cambas et al., 2015}}. Notes that ''Ortholestes clara'' was transferred to ''Hypolestes'' by Calvert (1919). {{Taxonbar|from=Q1383673}} [[Category:Juan Cristóbal Gundlach taxa]] d7x2dvv6bz8qhzii48ut5yxaveecnqy 11322608 11322607 2026-10-22T05:18:05Z John Tann 703224 Ordering 11322608 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Hypolestes}} Species: {{sp|H|ypolestes|clara}} {{sp|H|ypolestes|hatuey}} {{splast|H|ypolestes|trinitatis}} =={{int:Name}}== ''Hypolestes'' {{a|Juan Cristóbal Gundlach|Gundlach}}, 1888 ==={{int:Synonymy}}=== * ''Hypolestes'' {{a|Hermann August Hagen|Hagen}}, 1868. ''nomen nudum''; this earlier usage is unavailable and does not have priority. * ''Ortholestes'' {{a|Philip Powell Calvert|Calvert}}, 1891. Junior subjective synonym; proposed before Calvert knew of Gundlach's earlier name. ==={{int:Notes}}=== Gundlach's name appeared in a separately issued fascicle that was little known outside Cuba. Calvert therefore proposed ''Ortholestes'' before learning of Gundlach's earlier name; in 1919, he documented its priority. =={{int:References}}== ==={{int:Primary references}}=== {{Calvert, 1891}} at {{BHL|page/2566115|p.199.}} Establishes ''Ortholestes'' and describes ''Ortholestes clara''. {{Gundlach, 1888a}} at {{BHL|page/46357727|p.216.}} Describes ''Hypolestes'' as a subgenus of ''Lestes'' and names ''Lestes (Hypolestes) trinitatis''. {{Hagen, 1868}} at {{BHL|page/8059625|p.290.}} Earlier use of the name ''Hypolestes''; treated as a ''nomen nudum'' by Bridges (1994). ==={{int:Additional references}}=== {{Bridges, 1994b}} at {{BHL|page/15106088|p.IV.5.}} Catalogues the earlier name and the synonymy. {{Calvert, 1919}} at p.340. Shows that Gundlach's ''Hypolestes'' and ''trinitatis'' have priority over Calvert's later names. {{Torres-Cambas et al., 2015}}. Notes that ''Ortholestes clara'' was transferred to ''Hypolestes'' by Calvert (1919). {{Taxonbar|from=Q1383673}} [[Category:Juan Cristóbal Gundlach taxa]] qhftce3aagovknz416i04g7spd4it90 Mymaridae 0 58582 11322305 11152260 2026-10-21T20:12:11Z Neferkheperre 947633 11322305 wikitext text/x-wiki [[File:Mymar_female.jpg|thumb|''[[Mymar]]'' sp. (female)]] =={{int:Taxonavigation}}== {{Mymaridae}} Genera: {{g|Acmopolynema}} {{g|Acmotemnus}} {{g|Agalmopolynema}} {{g|Alaptus}} {{g|Allanagrus}} {{g|Allarescon}} {{g|Anagroidea}} {{g|Anagrus}} {{g|Anaphes}} {{g|Anneckia}} {{g|Apoxypteron}} {{g|Arescon}} {{g|Australomymar}} {{g|Boccacciomymar}} {{g|Borneomymar}} {{g|Boudiennyia}} {{g|Callodicopus}} {{g|Camptoptera}} {{g|Camptopteroides}} {{g|Caraphractus}} {{g|Ceratanaphes}} {{g|Chrysoctonoides}} {{g|Chrysoctonus}} {{g|Cleruchoides}} {{g|Cleruchus}} {{g|Cnecomymar}} {{g|Cosmocomoidea}} {{g|Cosmocomopsis}} {{g|Cremnomymar}} {{g|Cybomymar}} {{g|Dicopomorpha}} {{g|Dicopus}} {{g|Dorya}} {{g|Entrichopteris}} {{g|Eofoersteria}} {{g|Erdosiella}} {{g|Erythmelus}} {{g|Eubroncus}} {{g|Eucleruchus}} {{g|Eustochomorpha}} {{g|Eustochus}} {{g|Gahanopsis}} {{g|Ganomymar}} {{g|Gastrogonatocerus}} {{g|Gonatocerus}} {{g|Heptagonatocerus}} {{g|Himopolynema}} {{g|Ischiodasys}} {{g|Kalopolynema}} {{g|Kikiki}} {{g|Kompsomymar}} {{g|Krateriske}} {{g|Krokella}} {{g|Litus}} {{g|Lymaenon}} {{g|Macrocamptoptera}} {{g|Manlymymar}} {{g|Megamymar}} {{g|Mimalaptus}} {{g|Mymar}} {{g|Mymarilla}} {{g|Neomymar}} {{g|Neopolynemoidea}} {{g|Neostethynium}} {{g|Neotriadomerus}} {{g|Nepolynema}} {{g|Neserythmelus}} {{g|Nesomymar}} {{g|Nesopatasson}} {{g|Notomymar}} {{g|Omyomymar}} {{g|Octomicromeris}} {{g|Ooctonus}} {{g|Palaeoneura}} {{g|Paracmotemnus}} {{g|Paranaphoidea}} {{g|Parapolynema}} {{g|Parastethynium}} {{g|Platyfrons}} {{g|Platypolynema}} {{g|Platystethynium}} {{g|Polynema (Mymaridae)|Polynema}} {{g|Polynemoidea}} {{g|Polynemula}} {{g|Porcepicus}} {{g|Prionaphes}} {{g|Proarescon}} {{g|Progonatocerus}} {{g|Pseudanaphes}} {{g|Ptilomymar}} {{g|Schizophragma Ogloblin|Schizophragma}} {{g|Scleromymar}} {{g|Steganogaster}} {{g|Stephanocampta}} {{g|Stephanodes}} {{g|Stethynium}} {{g|Tanyostethium}} {{g|Tanyxiphium}} {{g|Tetrapolynema}} {{g|Tinkerbella}} {{g|Vladimir}} {{g|Xenopolynema}} {{g|Yoshimotoana}} {{g|Zelanaphes}} {{g|Zeyanus}} †{{g|Carpenteriana}} †{{g|Enneagmus}} †{{g|Eoanaphes}} †{{g|Eoeustochus}} †{{g|Macalpinia}} †{{g|Myanmymar}} †{{glast|Triadomerus}} In synonymy (3): {{g|Nesopolynema}} {{g|Oncomymar}} {{glast|Scolopsopteron}} =={{int:Name}}== * Mymaridae Haliday, 1833 =={{int:References}}== {{Haliday, 1833}} {{Aishan, Triapitsyn & Xu, 2016}} * {{aut|Albarracin, E.L.}}; {{aut|Triapitsyn, S.V.}}; {{aut|Virla, E.G.}} 2009: Annotated key to the genera of Mymaridae (Hymenoptera: Chalcidoidea) in Argentina. [http://www.mapress.com./zootaxa/index.html ''Zootaxa''], 2129: 1–28. [https://www.mapress.com./zootaxa/2009/f/z02129p028f.pdf Abstract & excerpt] {{Aquino, Triapitsyn & Huber, 2016}} * {{aut|Huber, J.T.}} 2005: The gender and derivation of genus-group names in Mymaridae and Mymarommatidae (Hymenoptera). ''Acta Societatis Zoologicae Bohemicae'', 69: 167–183. ISSN: 1211-376X [https://web.archive.org/web/20210227235507/http://www.canacoll.org/Hym/Staff/Huber/PDFs/51-Mymaridae_names.pdf PDF] * {{aut|Huber, J.T.}} 2009: The genus ''Dicopomorpha'' (Hymenoptera, Mymaridae) in Africa and a key to ''Alaptus''-group genera. ''In'': {{aut|Johnson, N.F.}} (ed.) Advances in the systematics of Hymenoptera. Festschrift in honour of Lubomír Masner. [https://web.archive.org/web/20100209202155/http://pensoftonline.net/zookeys/index.php/journal/index ''ZooKeys''], 20: 233–244. {{doi|10.3897/zookeys.20.116}} * {{aut|Huber, J.T.}} 2009: Introduction to the Mymaridae (Hymenoptera) of Fiji, with description of two new species and comparison with the fairyflies of other Pacific islands. ''In'': {{aut|Evenhuis, N.L.}} & {{aut|Bickel, D.J.}} (eds.), Fiji Arthropods XV. ''Bishop Museum occasional papers'', 106: 17–34. [https://hbs.bishopmuseum.org/fiji/fiji-arthropods/pdf/FA-XV-02.pdf PDF] {{Huber, 2015a}} {{Huber, 2017a}} {{Huber & Greenwalt, 2011}} * {{aut|Huber, J.T.}}; {{aut|Lin, N.-Q.}} 1999: World review of the ''Camptoptera'' group of genera (Hymenoptera: Mymaridae). ''Proceedings of the Entomological Society of Ontario'', 130: 21–65. {{Huber, Read & Triapitsyn, 2020}} {{Huber, Read & Triapitsyn, 2021}} {{Huber & Triapitsyn, 2017}} * {{aut|Lou, J.-X. ; T.-W. Cao & M. Lou}}, 1999: Two new species of ''Alaptus'' in Northeastern China (Hymenoptera: Chalcidoidea: Mymaridae). ''Acta Zootaxonomia Sinica'' '''24 (4)''': 429–432. {{Poinar & Huber, 2011}} ==={{int:Additional references}}=== {{Guzmán-Larralde, Huber & Martínez, 2017}} {{Huber & Islam, 2017}} {{Huber & Read, 2021}} {{Samková, Janšta & Huber, 2020}} {{Triapitsyn, Aishan & Huber, 2020}} {{Triapitsyn, Kim & Kang, 2026}} =={{int:Vernacular names}}== {{VN |de=Zwergwespen |en=Fairyfly |ja=ホソハネコバチ科 |sv=Dvärgsteklar }} {{Taxonbar}} {{Commons|Category:Mymaridae}} btr8q6lyr5l8po9hv0zpbks1235x71o Oxystigma (Heteragrionidae) 0 59439 11322462 10444589 2026-10-21T22:37:35Z John Tann 703224 Added reference 11322462 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Oxystigma (Heteragrionidae)}} Species: {{sp|O|xystigma|caerulans}} {{sp|O|xystigma|cyanofrons}} {{sp|O|xystigma|petiolatum}} {{splast|O|xystigma|williamsoni}} =={{int:Name}}== ''Oxystigma'' {{a|Edmond de Selys Longchamps|Selys}}, 1862 =={{int:References}}== ==={{int:Primary references}}=== {{Selys, 1862b}} at {{BHL|page/36014888|p.31.}} ==={{int:Additional references}}=== {{Dijkstra et al., 2013}} {{Zt3780.2.7}} {{Taxonbar|from=Q13652998}} [[Category:Edmond de Selys Longchamps taxa]] 3uz0do26geyhj0rwinto7zv31693jji 11322477 11322462 2026-10-21T23:52:51Z John Tann 703224 Added synonymy 11322477 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Oxystigma (Heteragrionidae)}} Species: {{sp|O|xystigma|caerulans}} {{sp|O|xystigma|cyanofrons}} {{sp|O|xystigma|petiolatum}} {{splast|O|xystigma|williamsoni}} =={{int:Name}}== ''Oxystigma'' {{a|Edmond de Selys Longchamps|Selys}}, 1862 ==={{int:Synonymy}}=== * ''Oxystigma'' {{aut|Selys}}, 1862: mentioned as a possible subgenus of ''Heteragrion'' (p. 31); Selys says he would have been tempted to establish it. * ''Oxystigma'' {{a|Edward Bruce Williamson|Williamson}}, 1919: treated as a separate genus for two species, with reference to Selys’s earlier suggestion (p. 3; key, p. 15). ==={{int:Notes}}=== * Selys (1862, p. 31) wrote: {{lang|fr|D'après ces caractères, j'aurais été tenté d'en faire un sous-genre sous le nom d'Oxystigma, si ce n'est que les autres espèces présentent aussi des nuances dans l'intensité des caractères cités, et si d'ailleurs le petiolatum, dans son ensemble, ne réunissait pas les caractères principaux, le faciès et la patrie des autres Heteragrion.}} Translation: “On the basis of these characters, I would have been tempted to make it a subgenus under the name ''Oxystigma'', were it not that the other species also show variations in the intensity of the characters mentioned, and that ''petiolatum'', taken as a whole, did not bring together the principal characters, appearance and geographic range of the other ''Heteragrion''.” * Williamson (1919, p. 3) recounts Selys's treatment of ''Heteragrion'' in four groups and says Selys proposed ''Oxystigma'' as a subgenus for the fourth. Williamson notes that Selys's 1886 work divided the groups into two sections but did not mention ''Oxystigma'' again. After discussing a second species in that group, Williamson placed the two species in a separate genus, ''Oxystigma'', “as originally proposed by de Selys”; he keyed the species on p. 15. * Davies & Tobin (1984) list the genus as ''Oxystigma'' Williamson, 1919. * Bridges (1994) lists it under Selys, 1862, while noting Cowley's view that the name should be attributed to Williamson, 1919. =={{int:References}}== ==={{int:Primary references}}=== {{Selys, 1862b}} at {{BHL|page/36014888|p.31.}} {{Williamson, 1919a}} at {{BHL|page/13944059|p.3}}, {{BHL|page/13944071|p.15.}} ==={{int:Additional references}}=== {{Bridges, 1994} at {{BHL|page/15106062|p.III.37.}} {{Davies & Tobin, 1984}} at p.42. {{Dijkstra et al., 2013}} {{Zt3780.2.7}} {{Taxonbar|from=Q13652998}} [[Category:Edmond de Selys Longchamps taxa]] 7wj9sdjgqkt3ris1zcmjp7ldl7tq8j0 11322478 11322477 2026-10-21T23:54:10Z John Tann 703224 Readability 11322478 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Oxystigma (Heteragrionidae)}} Species: {{sp|O|xystigma|caerulans}} {{sp|O|xystigma|cyanofrons}} {{sp|O|xystigma|petiolatum}} {{splast|O|xystigma|williamsoni}} =={{int:Name}}== ''Oxystigma'' {{a|Edmond de Selys Longchamps|Selys}}, 1862 ==={{int:Synonymy}}=== * ''Oxystigma'' {{aut|Selys}}, 1862: mentioned as a possible subgenus of ''Heteragrion'' (p. 31); Selys says he would have been tempted to establish it. * ''Oxystigma'' {{a|Edward Bruce Williamson|Williamson}}, 1919: treated as a separate genus for two species, with reference to Selys’s earlier suggestion (p. 3; key, p. 15). ==={{int:Notes}}=== * Selys (1862, p. 31) wrote: {{lang|fr|D'après ces caractères, j'aurais été tenté d'en faire un sous-genre sous le nom d'Oxystigma, si ce n'est que les autres espèces présentent aussi des nuances dans l'intensité des caractères cités, et si d'ailleurs le petiolatum, dans son ensemble, ne réunissait pas les caractères principaux, le faciès et la patrie des autres Heteragrion.}} Translation: “On the basis of these characters, I would have been tempted to make it a subgenus under the name ''Oxystigma'', were it not that the other species also show variations in the intensity of the characters mentioned, and that ''petiolatum'', taken as a whole, did not bring together the principal characters, appearance and geographic range of the other ''Heteragrion''.” * Williamson (1919, p. 3) recounts Selys's treatment of ''Heteragrion'' in four groups and says Selys proposed ''Oxystigma'' as a subgenus for the fourth. Williamson notes that Selys's 1886 work divided the groups into two sections but did not mention ''Oxystigma'' again. After discussing a second species in that group, Williamson placed the two species in a separate genus, ''Oxystigma'', “as originally proposed by de Selys”; he keyed the species on p. 15. * Davies & Tobin (1984) list the genus as ''Oxystigma'' Williamson, 1919. * Bridges (1994) lists ''Oxystigma'' under Selys, 1862, while noting Cowley's view that the name should be attributed to Williamson, 1919. =={{int:References}}== ==={{int:Primary references}}=== {{Selys, 1862b}} at {{BHL|page/36014888|p.31.}} {{Williamson, 1919a}} at {{BHL|page/13944059|p.3}}, {{BHL|page/13944071|p.15.}} ==={{int:Additional references}}=== {{Bridges, 1994} at {{BHL|page/15106062|p.III.37.}} {{Davies & Tobin, 1984}} at p.42. {{Dijkstra et al., 2013}} {{Zt3780.2.7}} {{Taxonbar|from=Q13652998}} [[Category:Edmond de Selys Longchamps taxa]] gknn53k8wpv00gn810o4swhgf6w4cr8 11322507 11322478 2026-10-22T01:49:09Z John Tann 703224 Typo 11322507 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Oxystigma (Heteragrionidae)}} Species: {{sp|O|xystigma|caerulans}} {{sp|O|xystigma|cyanofrons}} {{sp|O|xystigma|petiolatum}} {{splast|O|xystigma|williamsoni}} =={{int:Name}}== ''Oxystigma'' {{a|Edmond de Selys Longchamps|Selys}}, 1862 ==={{int:Synonymy}}=== * ''Oxystigma'' {{aut|Selys}}, 1862: mentioned as a possible subgenus of ''Heteragrion'' (p. 31); Selys says he would have been tempted to establish it. * ''Oxystigma'' {{a|Edward Bruce Williamson|Williamson}}, 1919: treated as a separate genus for two species, with reference to Selys’s earlier suggestion (p. 3; key, p. 15). ==={{int:Notes}}=== * Selys (1862, p. 31) wrote: {{lang|fr|D'après ces caractères, j'aurais été tenté d'en faire un sous-genre sous le nom d'Oxystigma, si ce n'est que les autres espèces présentent aussi des nuances dans l'intensité des caractères cités, et si d'ailleurs le petiolatum, dans son ensemble, ne réunissait pas les caractères principaux, le faciès et la patrie des autres Heteragrion.}} Translation: “On the basis of these characters, I would have been tempted to make it a subgenus under the name ''Oxystigma'', were it not that the other species also show variations in the intensity of the characters mentioned, and that ''petiolatum'', taken as a whole, did not bring together the principal characters, appearance and geographic range of the other ''Heteragrion''.” * Williamson (1919, p. 3) recounts Selys's treatment of ''Heteragrion'' in four groups and says Selys proposed ''Oxystigma'' as a subgenus for the fourth. Williamson notes that Selys's 1886 work divided the groups into two sections but did not mention ''Oxystigma'' again. After discussing a second species in that group, Williamson placed the two species in a separate genus, ''Oxystigma'', “as originally proposed by de Selys”; he keyed the species on p. 15. * Davies & Tobin (1984) list the genus as ''Oxystigma'' Williamson, 1919. * Bridges (1994) lists ''Oxystigma'' under Selys, 1862, while noting Cowley's view that the name should be attributed to Williamson, 1919. =={{int:References}}== ==={{int:Primary references}}=== {{Selys, 1862b}} at {{BHL|page/36014888|p.31.}} {{Williamson, 1919a}} at {{BHL|page/13944059|p.3}}, {{BHL|page/13944071|p.15.}} ==={{int:Additional references}}=== {{Bridges, 1994b}} at {{BHL|page/15106062|p.III.37.}} {{Davies & Tobin, 1984}} at p.42. {{Dijkstra et al., 2013}} {{Zt3780.2.7}} {{Taxonbar|from=Q13652998}} [[Category:Edmond de Selys Longchamps taxa]] rbzejwmpz2idwcdyvmc2ic405k0qbd1 Harrison Gray Dyar 0 67026 11322210 11296645 2026-10-21T18:34:29Z FrankB157 2872707 /* 1893 */ Neumoegen & Dyar, 1893b 11322210 wikitext text/x-wiki {{image}} '''Harrison Gray Dyar Jr.''' (1866–1929), U.S. entomologist (Lepidoptera, Diptera). {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1891=== {{Dyar, 1891}} ===1893=== {{Dyar, 1893}} {{Neumoegen & Dyar, 1893}} {{Neumoegen & Dyar, 1893a}} {{Neumoegen & Dyar, 1893b}} ===1894=== {{Dyar, 1894}} ===1895=== {{Dyar, 1895}} ===1898=== {{Dyar, 1898}} {{Dyar, 1898a}} ===1899=== {{Dyar, 1899}} {{Dyar, 1899a}} ===1902=== {{Dyar, 1902}} ===1903=== {{Dyar,HG, 1903}} ===1904=== {{Dyar, 1904}} {{Dyar, 1904a}} {{Dyar, 1904b}} {{Dyar, 1904c}} ===1905=== {{Dyar, 1905}} {{Dyar, 1905a}} {{Dyar, 1905b}} ===1906=== {{Dyar, 1906}} {{Dyar,HG, 1906}} ===1907=== {{Dyar,HG, 1907}} {{Dyar, 1907}} ===1908=== {{Dyar, 1908}} ===1909=== {{Dyar, 1909}} ===1910=== {{Dyar, 1910}} {{Dyar, 1910a}} {{Dyar, 1910b}} {{Dyar, 1910c}} ===1912=== {{Dyar,HG, 1912}} ===1913=== {{Dyar, 1913}} {{Dyar, 1913a}} {{Dyar,HG, 1913}} {{Dyar, 1913b}} ===1914=== {{Dyar, 1914d}} {{Dyar, 1914}} {{Dyar, 1914a}} {{Dyar, 1914b}} {{Dyar, 1914c}} {{Dyar,HG,1914}} ===1915=== {{Dyar,HG, 1915}} {{Dyar,HG, 1915a}} {{Dyar,HG, 1915b}} ===1916=== {{Dyar,HG, 1916}} ===1917=== {{Dyar,HG,1917}} {{Dyar, 1917a}} ===1918=== {{Dyar, 1918}} {{Dyar,HG, 1918a}} ===1920=== {{Dyar,HG,1920}} ===1921=== {{Dyar, 1921}} {{Dyar,HG,1921}} {{Dyar, 1921a}} ===1922=== {{Dyar, 1922a}} {{Dyar, 1922b}} {{Dyar, 1922c}} {{Dyar, 1922d}} {{Dyar, 1922e}} {{Dyar, 1922f}} {{Dyar, 1922g}} {{Dyar, 1922h}} {{Dyar, 1922i}} {{Dyar, 1922j}} {{Dyar, 1922k}} {{Dyar, 1922l}} {{Dyar, 1922m}} ===1923=== {{Dyar,HG,1923}} ===1924=== {{Dyar, 1924}} {{Dyar,HG,1924}} ===1925=== {{Dyar, 1925}} ===1926=== {{Dyar,HG, 1926}} ===1927=== {{Dyar & Heinrich, 1927}} {{Dyar,1927}} ===1928=== {{Dyar, 1928}} {{Dyar,HG,1928}} ===1940=== {{Dyar, 1940}} {{Authority control}} {{DEFAULTSORT:Dyar, Harrison Gray}} [[Category:Taxon authorities]] [[Category:Entomologists]] 7qdhx8i5932y458f9i2dhep7w92jh4r 11322220 11322210 2026-10-21T18:43:33Z FrankB157 2872707 /* 1893 */ 1893a 11322220 wikitext text/x-wiki {{image}} '''Harrison Gray Dyar Jr.''' (1866–1929), U.S. entomologist (Lepidoptera, Diptera). {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1891=== {{Dyar, 1891}} ===1893=== {{Dyar, 1893}} {{Dyar, 1893a}} {{Neumoegen & Dyar, 1893}} {{Neumoegen & Dyar, 1893a}} {{Neumoegen & Dyar, 1893b}} ===1894=== {{Dyar, 1894}} ===1895=== {{Dyar, 1895}} ===1898=== {{Dyar, 1898}} {{Dyar, 1898a}} ===1899=== {{Dyar, 1899}} {{Dyar, 1899a}} ===1902=== {{Dyar, 1902}} ===1903=== {{Dyar,HG, 1903}} ===1904=== {{Dyar, 1904}} {{Dyar, 1904a}} {{Dyar, 1904b}} {{Dyar, 1904c}} ===1905=== {{Dyar, 1905}} {{Dyar, 1905a}} {{Dyar, 1905b}} ===1906=== {{Dyar, 1906}} {{Dyar,HG, 1906}} ===1907=== {{Dyar,HG, 1907}} {{Dyar, 1907}} ===1908=== {{Dyar, 1908}} ===1909=== {{Dyar, 1909}} ===1910=== {{Dyar, 1910}} {{Dyar, 1910a}} {{Dyar, 1910b}} {{Dyar, 1910c}} ===1912=== {{Dyar,HG, 1912}} ===1913=== {{Dyar, 1913}} {{Dyar, 1913a}} {{Dyar,HG, 1913}} {{Dyar, 1913b}} ===1914=== {{Dyar, 1914d}} {{Dyar, 1914}} {{Dyar, 1914a}} {{Dyar, 1914b}} {{Dyar, 1914c}} {{Dyar,HG,1914}} ===1915=== {{Dyar,HG, 1915}} {{Dyar,HG, 1915a}} {{Dyar,HG, 1915b}} ===1916=== {{Dyar,HG, 1916}} ===1917=== {{Dyar,HG,1917}} {{Dyar, 1917a}} ===1918=== {{Dyar, 1918}} {{Dyar,HG, 1918a}} ===1920=== {{Dyar,HG,1920}} ===1921=== {{Dyar, 1921}} {{Dyar,HG,1921}} {{Dyar, 1921a}} ===1922=== {{Dyar, 1922a}} {{Dyar, 1922b}} {{Dyar, 1922c}} {{Dyar, 1922d}} {{Dyar, 1922e}} {{Dyar, 1922f}} {{Dyar, 1922g}} {{Dyar, 1922h}} {{Dyar, 1922i}} {{Dyar, 1922j}} {{Dyar, 1922k}} {{Dyar, 1922l}} {{Dyar, 1922m}} ===1923=== {{Dyar,HG,1923}} ===1924=== {{Dyar, 1924}} {{Dyar,HG,1924}} ===1925=== {{Dyar, 1925}} ===1926=== {{Dyar,HG, 1926}} ===1927=== {{Dyar & Heinrich, 1927}} {{Dyar,1927}} ===1928=== {{Dyar, 1928}} {{Dyar,HG,1928}} ===1940=== {{Dyar, 1940}} {{Authority control}} {{DEFAULTSORT:Dyar, Harrison Gray}} [[Category:Taxon authorities]] [[Category:Entomologists]] rfgsqbhkjwp2ciizks40zem0v0axgyn Phyllocnistis 0 68282 11322518 11299895 2026-10-22T02:25:02Z Neferkheperre 947633 11322518 wikitext text/x-wiki =={{int:Taxonavigation}}== [[File:Phyllocnistis citrella adult1.jpg|thumb|''Phyllocnistis citrella'']] {{Phyllocnistis}} Species: {{sp|P|hyllocnistis|abatiae}} {{sp|P|hyllocnistis|acmias}} {{sp|P|hyllocnistis|allisonae}} {{sp|P|hyllocnistis|alma-atensis}} {{sp|P|hyllocnistis|ampelopsiella}} {{sp|P|hyllocnistis|amydropa}} {{sp|P|hyllocnistis|argentella}} {{sp|P|hyllocnistis|argothea}} {{sp|P|hyllocnistis|asiatica}} {{sp|P|hyllocnistis|atractias}} {{sp|P|hyllocnistis|atranota}} {{sp|P|hyllocnistis|auriinea}} {{sp|P|hyllocnistis|aurilinea}} {{sp|P|hyllocnistis|baccharidis}} {{sp|P|hyllocnistis|bourquini}} {{sp|P|hyllocnistis|breynilla}} {{sp|P|hyllocnistis|canariensis}} {{sp|P|hyllocnistis|canta}} {{sp|P|hyllocnistis|cassiella}} {{sp|P|hyllocnistis|chlorantica}} {{sp|P|hyllocnistis|chrysophthalma}} {{sp|P|hyllocnistis|cirrhophanes}} {{sp|P|hyllocnistis|citrella}} {{sp|P|hyllocnistis|citricola}} {{sp|P|hyllocnistis|citronympha}} {{sp|P|hyllocnistis|cornella}} {{sp|P|hyllocnistis|diaugella}} {{sp|P|hyllocnistis|dichotoma}} {{sp|P|hyllocnistis|diplomochla}} {{sp|P|hyllocnistis|diversifoliella}} {{sp|P|hyllocnistis|dorcas}} {{sp|P|hyllocnistis|drimiphaga}} {{sp|P|hyllocnistis|echinodes}} {{sp|P|hyllocnistis|elongata}} {{sp|P|hyllocnistis|embeliella}} {{sp|P|hyllocnistis|enchalcoa}} {{sp|P|hyllocnistis|endoxa}} {{sp|P|hyllocnistis|ephimera}} {{sp|P|hyllocnistis|erechtitisella}} {{sp|P|hyllocnistis|eurymochla}} {{sp|P|hyllocnistis|exaeta}} {{sp|P|hyllocnistis|exiguella}} {{sp|P|hyllocnistis|extrematrix}} {{sp|P|hyllocnistis|faureae}} {{sp|P|hyllocnistis|finitima}} {{sp|P|hyllocnistis|furcata}} {{sp|P|hyllocnistis|gracilistylella}} {{sp|P|hyllocnistis|habrochroa}} {{sp|P|hyllocnistis|hagnopa}} {{sp|P|hyllocnistis|hapalodes}} {{sp|P|hyllocnistis|helicodes}} {{sp|P|hyllocnistis|helios}} {{sp|P|hyllocnistis|humiliella}} {{sp|P|hyllocnistis|hyperpersea}} {{sp|P|hyllocnistis|immaculatella}} {{sp|P|hyllocnistis|indistincta}} {{sp|P|hyllocnistis|innupta}} {{sp|P|hyllocnistis|insignis}} {{sp|P|hyllocnistis|intermediella}} {{sp|P|hyllocnistis|iodocella}} {{sp|P|hyllocnistis|jupiter}} {{sp|P|hyllocnistis|kawakitai}} {{sp|P|hyllocnistis|labyrinthella}} {{sp|P|hyllocnistis|leptomianta}} {{sp|P|hyllocnistis|liriodendronella}} {{sp|P|hyllocnistis|longipalpa}} {{sp|P|hyllocnistis|loxosticha}} {{sp|P|hyllocnistis|lucernifera}} {{sp|P|hyllocnistis|magalismontani}} {{sp|P|hyllocnistis|magnatella}} {{sp|P|hyllocnistis|magnoliella}} {{sp|P|hyllocnistis|maxberryi}} {{sp|P|hyllocnistis|meliacella}} {{sp|P|hyllocnistis|micrographa}} {{sp|P|hyllocnistis|minimella}} {{sp|P|hyllocnistis|minutella}} {{sp|P|hyllocnistis|nebulella}} {{sp|P|hyllocnistis|nepenthae}} {{sp|P|hyllocnistis|norak}} {{sp|P|hyllocnistis|nymphidia}} {{sp|P|hyllocnistis|ohshimai}} {{sp|P|hyllocnistis|ourea}} {{sp|P|hyllocnistis|oxycopa}} {{sp|P|hyllocnistis|pachyscia}} {{sp|P|hyllocnistis|perseafolia}} {{sp|P|hyllocnistis|petronellii}} {{sp|P|hyllocnistis|pharetrucha}} {{sp|P|hyllocnistis|phoebus}} {{sp|P|hyllocnistis|phrixopa}} {{sp|P|hyllocnistis|podocarpa}} {{sp|P|hyllocnistis|populiella}} {{sp|P|hyllocnistis|psychina}} {{sp|P|hyllocnistis|puyehuensis}} {{sp|P|hyllocnistis|rotans}} {{sp|P|hyllocnistis|saepta}} {{sp|P|hyllocnistis|salicifoliella}} {{sp|P|hyllocnistis|saligna}} {{sp|P|hyllocnistis|sciophanta}} {{sp|P|hyllocnistis|selene}} {{sp|P|hyllocnistis|selenopa}} {{sp|P|hyllocnistis|sexangula}} {{sp|P|hyllocnistis|shizukagozen}} {{sp|P|hyllocnistis|signata}} {{sp|P|hyllocnistis|smilaocisella}} {{sp|P|hyllocnistis|sorhageniella}} {{sp|P|hyllocnistis|spatulata}} {{sp|P|hyllocnistis|spilota}} {{sp|P|hyllocnistis|stereograpta}} {{sp|P|hyllocnistis|subpersea}} {{sp|P|hyllocnistis|suffusella}} {{sp|P|hyllocnistis|symphanes}} {{sp|P|hyllocnistis|synglypta}} {{sp|P|hyllocnistis|tectonivora}} {{sp|P|hyllocnistis|temperatior}} {{sp|P|hyllocnistis|tethys}} {{sp|P|hyllocnistis|titania}} {{sp|P|hyllocnistis|toparcha}} {{sp|P|hyllocnistis|tremulella}} {{sp|P|hyllocnistis|triandricola}} {{sp|P|hyllocnistis|triortha}} {{sp|P|hyllocnistis|triploca}} {{sp|P|hyllocnistis|tropaeolicola}} {{sp|P|hyllocnistis|unipunctella}} {{sp|P|hyllocnistis|valentinensis}} {{sp|P|hyllocnistis|verae}} {{sp|P|hyllocnistis|vitella}} {{sp|P|hyllocnistis|vitifoliella}} {{sp|P|hyllocnistis|vitigenella}} {{sp|P|hyllocnistis|voutei}} {{sp|P|hyllocnistis|wampella}} {{sp|P|hyllocnistis|wygodzinskyi}} {{sp|P|hyllocnistis|xenia}} {{sp|P|hyllocnistis|xylopiella}} {{splast|P|hyllocnistis|zophosema}} =={{int:Name}}== ''{{BASEPAGENAME}}'' [[Zeller]], 1848 {{int:Type species}}: =={{int:References}}== {{Zeller, 1848}} ==={{int:Additional references}}=== {{Brito et al., 2012}} {{Brito et al., 2017}} {{Brito et al., 2019}} {{Cerdena et al., 2020}} {{Cerdeña et al., 2022}} * {{aut|Davis, D.R.}}; {{aut|Wagner, D.L.}} 2011: Biology and systematics of the New World ''Phyllocnistis'' Zeller leafminers of the avocado genus ''Persea'' (Lepidoptera, Gracillariidae). [[ISSN 1313-2989|''ZooKeys'']], 97: 39–73. {{doi|10.3897/zookeys.97.753}} {{Kawahara, Nishida & Davis, 2009}} {{Kirichenko et al., 2018}} * {{aut|Kobayashi, S. & T. Hirowatari}}, 2011: Two Chloranthaceae leafminers of the genus ''Phyllocnistis'' (Lepidoptera: Gracillariidae: Phyllocnistinae) from Japan, with descriptions of new species and pupal morphology. ''Lepidoptera Science'' '''62 (4)''': 156–165. * {{aut|Kobayashi, S. ; Y. Sakamoto ; U. Jinbo & A. Nakamura}}, 2011: A new willow leaf blotch miner of the genus ''Phyllocnistis'' (Lepidoptera: Gracillariidae: Phyllocnistinae) from Japan, with pupal morphology and genetic comparison of Salicaceae mining species using DNA barcodes. ''Transactions of the Lepidopterological Society of Japan'' '''62(2)''': 75–93. Abstract and full article: [https://ci.nii.ac.jp/naid/110008686836/en]. {{Liu et al., 2018}} * {{aut|Liu, S.-K. & R.-G. Zeng}}, 1985: A new species of Phyllocnisstidae from China. ''Acta Entomologica Sinica'' '''28 (4)''': 412–416. * {{aut|Liu, S.-K. & R.-G. Zeng}}, 1989: Two new species of Phyllocnistidae from South China. ''Acta Entomologica Sinica'' '''32 (1)''': 85–89. {{Triberti et al., 2024}} {{Voith et al., 2023}} {{Commonscat}} {{Taxonbar|from=Q7188676}} gd1ogmno95592iu7o7l2bsnnv2ejtjh Cosmopterix 0 68694 11322038 11116089 2026-10-21T15:33:56Z Mitsingh 2920462 typo 11322038 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Cosmopterix}} Species: {{TOC}} ==A== {{sp|C|osmopterix|aarviki}} {{sp|C|osmopterix|abdita}} {{sp|C|osmopterix|abnormalis}} {{sp|C|osmopterix|aculeata}} {{sp|C|osmopterix|agassizi}} {{sp|C|osmopterix|ahornerella}} {{sp|C|osmopterix|albicaudis}} {{sp|C|osmopterix|anadoxa}} {{sp|C|osmopterix|ancalodes}} {{sp|C|osmopterix|ancistraea}} {{sp|C|osmopterix|antemidora}} {{sp|C|osmopterix|antichorda}} {{sp|C|osmopterix|antila}} {{sp|C|osmopterix|aphranassa}} {{sp|C|osmopterix|apiculata}} {{sp|C|osmopterix|argentitegulella}} {{sp|C|osmopterix|ariel}} {{sp|C|osmopterix|artifica}} {{sp|C|osmopterix|asiatica}} {{sp|C|osmopterix|astrapias}} {{sp|C|osmopterix|athesiae}} {{sp|C|osmopterix|attenuatella}} {{splast|C|osmopterix|aurella}} ==B== {{sp|C|osmopterix|bacata}} {{sp|C|osmopterix|bactrophora}} {{sp|C|osmopterix|baihashanella}} {{sp|C|osmopterix|bambusae}} {{sp|C|osmopterix|barbertonensis}} {{sp|C|osmopterix|basilisca}} {{sp|C|osmopterix|belinda}} {{sp|C|osmopterix|belonacma}} {{sp|C|osmopterix|bendidia}} {{sp|C|osmopterix|bianca}} {{sp|C|osmopterix|bifidiguttata}} {{sp|C|osmopterix|brachyclina}} {{splast|C|osmopterix|brevicaudella}} ==C== {{sp|C|osmopterix|caliban}} {{sp|C|osmopterix|callinympha}} {{sp|C|osmopterix|calliochroa}} {{sp|C|osmopterix|calypso}} {{sp|C|osmopterix|chalcelata}} {{sp|C|osmopterix|chalybaeella}} {{sp|C|osmopterix|chisosensis}} {{sp|C|osmopterix|chlorochalca}} {{sp|C|osmopterix|chrysobela}} {{sp|C|osmopterix|chrysocrates}} {{sp|C|osmopterix|circe}} {{sp|C|osmopterix|clandestinella}} {{sp|C|osmopterix|clemensella}} {{sp|C|osmopterix|cleophanes}} {{sp|C|osmopterix|cognita}} {{sp|C|osmopterix|cordelia}} {{sp|C|osmopterix|coryphaea}} {{sp|C|osmopterix|crassicervicella}} {{sp|C|osmopterix|cressida}} {{sp|C|osmopterix|cupid}} {{sp|C|osmopterix|cuprea}} {{splast|C|osmopterix|cyclopaea}} ==D== {{sp|C|osmopterix|dacryodes}} {{sp|C|osmopterix|dalii}} {{sp|C|osmopterix|damnosa}} {{sp|C|osmopterix|dapifera}} {{sp|C|osmopterix|delicatella}} {{sp|C|osmopterix|deprinsorum}} {{sp|C|osmopterix|derrai}} {{sp|C|osmopterix|desdemona}} {{sp|C|osmopterix|dianae}} {{sp|C|osmopterix|diaphora}} {{sp|C|osmopterix|dicacula}} {{sp|C|osmopterix|diplozona}} {{sp|C|osmopterix|donatellae}} {{splast|C|osmopterix|dulcivora}} ==E== {{sp|C|osmopterix|ebriola}} {{sp|C|osmopterix|emmolybda}} {{sp|C|osmopterix|epismaragda}} {{sp|C|osmopterix|epizona}} {{sp|C|osmopterix|erasmia}} {{sp|C|osmopterix|erethista}} {{sp|C|osmopterix|exiguella}} {{splast|C|osmopterix|eximia}} ==F== {{sp|C|osmopterix|facunda}} {{sp|C|osmopterix|feminella}} {{sp|C|osmopterix|ferdinand}} {{sp|C|osmopterix|fernaldella}} {{sp|C|osmopterix|fibigeri}} {{sp|C|osmopterix|flavidella}} {{sp|C|osmopterix|flavipes}} {{sp|C|osmopterix|flavofasciata}} {{sp|C|osmopterix|floridanella}} {{sp|C|osmopterix|formosa}} {{sp|C|osmopterix|francisco}} {{sp|C|osmopterix|fulminella}} {{splast|C|osmopterix|furcatis}} ==G== {{sp|C|osmopterix|geminella}} {{sp|C|osmopterix|gemmiferella}} {{sp|C|osmopterix|glaucogramma}} {{sp|C|osmopterix|gloriosa}} {{splast|C|osmopterix|gracilens}} ==H== {{sp|C|osmopterix|hamifera}} {{sp|C|osmopterix|heckfordi}} {{sp|C|osmopterix|heliactis}} {{sp|C|osmopterix|helike}} {{sp|C|osmopterix|hermodora}} {{sp|C|osmopterix|hermsiella}} {{sp|C|osmopterix|hieraspis}} {{sp|C|osmopterix|hierochloae}} {{splast|C|osmopterix|holophracta}} ==I== {{sp|C|osmopterix|inaugurata}} {{sp|C|osmopterix|ingeniosa}} {{sp|C|osmopterix|inopis}} {{sp|C|osmopterix|interfracta}} {{sp|C|osmopterix|iphigona}} {{sp|C|osmopterix|irrubricata}} {{sp|C|osmopterix|isoteles}} {{sp|C|osmopterix|isotoma}} {{splast|C|osmopterix|issikiella}} ==J== {{sp|C|osmopterix|jansei}} {{sp|C|osmopterix|japonica}} {{sp|C|osmopterix|javanica}} {{sp|C|osmopterix|jiangxiella}} {{splast|C|osmopterix|juliet}} ==K== {{splast|C|osmopterix|kruegeri}} ==L== {{sp|C|osmopterix|labathiella}} {{sp|C|osmopterix|laetifica}} {{sp|C|osmopterix|latilineata}} {{sp|C|osmopterix|lautissimella}} {{sp|C|osmopterix|lepidezae}} {{sp|C|osmopterix|licnura}} {{sp|C|osmopterix|lienigiella}} {{sp|C|osmopterix|ligyrodes}} {{sp|C|osmopterix|longivalvella}} {{sp|C|osmopterix|lungsuana}} {{splast|C|osmopterix|luteoapicalis}} ==M== {{sp|C|osmopterix|mab}} {{sp|C|osmopterix|macroglossa}} {{sp|C|osmopterix|macrula}} {{sp|C|osmopterix|magnaevalvae}} {{sp|C|osmopterix|magophila}} {{sp|C|osmopterix|margaret}} {{sp|C|osmopterix|margaritae}} {{sp|C|osmopterix|marshalli}} {{sp|C|osmopterix|manipularis}} {{sp|C|osmopterix|melanarches}} {{sp|C|osmopterix|meyi}} {{sp|C|osmopterix|mimetis}} {{sp|C|osmopterix|minutella}} {{sp|C|osmopterix|miranda}} {{sp|C|osmopterix|molybdina}} {{sp|C|osmopterix|mongoliella}} {{sp|C|osmopterix|montisella}} {{sp|C|osmopterix|morogorensis}} {{sp|C|osmopterix|mufindensis}} {{sp|C|osmopterix|mulanjensis}} {{splast|C|osmopterix|mystica}} ==N== {{sp|C|osmopterix|nanshanella}} {{sp|C|osmopterix|neodesma}} {{sp|C|osmopterix|nigrapunctella}} {{sp|C|osmopterix|nitens}} {{sp|C|osmopterix|nyctiphanes}} {{splast|C|osmopterix|nyikensis}} ==O== {{sp|C|osmopterix|oberon}} {{sp|C|osmopterix|obsoleta}} {{sp|C|osmopterix|ochleria}} {{sp|C|osmopterix|omurambensis}} {{sp|C|osmopterix|ophelia}} {{sp|C|osmopterix|opulenta}} {{sp|C|osmopterix|orachalcea}} {{sp|C|osmopterix|orichalciella}} {{sp|C|osmopterix|ornithognathosella}} {{splast|C|osmopterix|oxyglossa}} ==P== {{sp|C|osmopterix|pallidorsalis}} {{sp|C|osmopterix|pallifasciella}} {{sp|C|osmopterix|paltophanes}} {{sp|C|osmopterix|panayella}} {{sp|C|osmopterix|panopla}} {{sp|C|osmopterix|pararufella}} {{sp|C|osmopterix|paratrilopha}} {{sp|C|osmopterix|pentachorda}} {{sp|C|osmopterix|perdita}} {{sp|C|osmopterix|phaeogastra}} {{sp|C|osmopterix|phaesphora}} {{sp|C|osmopterix|phengitella}} {{sp|C|osmopterix|phragmitidis}} {{sp|C|osmopterix|phyllostachysea}} {{sp|C|osmopterix|plesiasta}} {{sp|C|osmopterix|portia}} {{sp|C|osmopterix|pretoriensis}} {{sp|C|osmopterix|prospero}} {{sp|C|osmopterix|puck}} {{sp|C|osmopterix|pulcherrimella}} {{sp|C|osmopterix|pustulatella}} {{splast|C|osmopterix|pyrozela}} ==Q== {{splast|C|osmopterix|quadrilineella}} ==R== {{sp|C|osmopterix|rhabdophanes}} {{sp|C|osmopterix|rhynchognathosella}} {{sp|C|osmopterix|rosalind}} {{splast|C|osmopterix|rufella}} ==S== {{sp|C|osmopterix|salahinella}} {{sp|C|osmopterix|sancti-vincentii}} {{sp|C|osmopterix|scaligera}} {{sp|C|osmopterix|schmidiella}} {{sp|C|osmopterix|scirpicola}} {{sp|C|osmopterix|scribaiella}} {{sp|C|osmopterix|semnota}} {{sp|C|osmopterix|setebos}} {{sp|C|osmopterix|sichuanella}} {{sp|C|osmopterix|similis}} {{sp|C|osmopterix|sinelinea}} {{sp|C|osmopterix|singularis}} {{sp|C|osmopterix|soutpansbergensis}} {{sp|C|osmopterix|spiculata}} {{sp|C|osmopterix|stephano}} {{sp|C|osmopterix|sublaetifica}} {{sp|C|osmopterix|superba}} {{splast|C|osmopterix|sycorax}} ==T== {{sp|C|osmopterix|tabellaria}} {{sp|C|osmopterix|teligera}} {{sp|C|osmopterix|tenax}} {{sp|C|osmopterix|tetragramma}} {{sp|C|osmopterix|tetrophthalma}} {{sp|C|osmopterix|thrasyzela}} {{sp|C|osmopterix|titania}} {{sp|C|osmopterix|toraula}} {{sp|C|osmopterix|transcissa}} {{sp|C|osmopterix|trilopha}} {{sp|C|osmopterix|trinculo}} {{sp|C|osmopterix|tsavensis}} {{sp|C|osmopterix|turbidella}} {{splast|C|osmopterix|turensis}} ==U== {{sp|C|osmopterix|ulleungensis}} {{sp|C|osmopterix|umbriel}} {{splast|C|osmopterix|unicolorella}} ==V== {{sp|C|osmopterix|vandenbergi}} {{sp|C|osmopterix|varii}} {{sp|C|osmopterix|venefica}} {{sp|C|osmopterix|vexillaris}} {{sp|C|osmopterix|victor}} {{sp|C|osmopterix|villella}} {{sp|C|osmopterix|violenta}} {{splast|C|osmopterix|viridilineata}} ==X== {{sp|C|osmopterix|xanthura}} {{splast|C|osmopterix|xuthogastra}} ==Y== {{splast|C|osmopterix|yangambensis}} ==Z== {{sp|C|osmopterix|zathea}} {{sp|C|osmopterix|zenobia}} {{splast|C|osmopterix|zieglerella}} =={{int:Name}}== ''Cosmopterix'' [[Hübner]], 1825 {{int:Type species}}: ''Tinea zieglerella'' [[Hübner]], 1810 by subsequent designation by Int. Commn zool. Nom. , 1969. ==={{int:Synonyms}}=== * ''[[Cosmopteryx]]'' [[Zeller]], 1839 An unjustified emendation of Cosmopterix Hübner, [1825]. * ''[[Cosmopteryx]]'' [[Agassiz]], 1847 An unjustified emendation of Cosmopterix Hübner, [1825] and a junior objective synonym and junior homonym of Cosmopteryx Zeller, 1839. =={{int:References}}== * {{aut|Busck, A.}}, 1904.Tineid moths from British Columbia, with descriptions of new species. ''Proceedings of the United States National Museum''. 27: 745–778. {{Koster, 2015}} {{Koster et al., 2019}} * {{aut|Kuroko, H.}}, 2011: A new species of the genus ''Cosmopterix'' Hübner (Lepidoptera: Cosmopterigidae) from Indonesia. ''Transactions of the Lepidopterological Society of Japan'' '''63 (3)''': 103–104. Abstract: [https://ci.nii.ac.jp/naid/110008750213/en]. * {{aut|Kuroko, H.}}, 2011: Two new species of the genus ''Cosmopterix'' Hübner (Lepidoptera: Cosmopterigidae) from Japan and neighbouring countries. ''Transactions of the Lepidopterological Society of Japan'' '''63 (3)''': 107–110. Abstract: [https://ci.nii.ac.jp/naid/110008750215/en]. * {{aut|Kuroko, H. & Y.-Q. Liu}}, 2005: A study of Chinese ''Cosmopterix'' Hübner (Lepidoptera: Cosmopterigidae), with descriptions of new species. ''Transactions of the Lepidopterological Society of Japan'' '''56(2)''': 131–144. Abstract and full article: [https://ci.nii.ac.jp/naid/110007138343/en]. * {{aut|Mey, W.}}, 1998: New records of ''Cosmopterix'' Hübner, [1825] from the Philippines (Lepidoptera: Cosmopterigidae). ''Nachrichten des Entomologischen Vereins Apollo'' '''Supplement 17''': 529–536. {{Taxonbar|from=Q146874}} [[Category:Jacob Hübner taxa]] qoxdtp5u919fv52tw0nfie21r1lt2md Afrolimnophila 0 71406 11322434 11231094 2026-10-21T22:21:57Z Harlock81 398030 /* {{int:References}} */ I'm adding pieces of information about the reference of Alexander 11322434 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Afrolimnophila}} Species: {{sp|A|frolimnophila|abludens}} {{sp|A|frolimnophila|abyssinica}} {{sp|A|frolimnophila|aino}} {{sp|A|frolimnophila|amabilis}} {{sp|A|frolimnophila|antimena}} {{sp|A|frolimnophila|antimenoides}} {{sp|A|frolimnophila|apicifusca}} {{sp|A|frolimnophila|asura}} {{sp|A|frolimnophila|basispina}} {{sp|A|frolimnophila|bicoloripes}} {{sp|A|frolimnophila|dichroica}} {{sp|A|frolimnophila|dicranophragmoides}} {{sp|A|frolimnophila|erhanae}} {{sp|A|frolimnophila|euglena}} {{sp|A|frolimnophila|fenestrella}} {{sp|A|frolimnophila|ghesquierei}} {{sp|A|frolimnophila|guttularis}} {{sp|A|frolimnophila|hartwigi}} {{sp|A|frolimnophila|irrorata}} {{sp|A|frolimnophila|joana}} {{sp|A|frolimnophila|melampodia}} {{sp|A|frolimnophila|minima}} {{sp|A|frolimnophila|murudensis}} {{sp|A|frolimnophila|namwambae}} {{sp|A|frolimnophila|pakkana}} {{sp|A|frolimnophila|pendleburyi}} {{sp|A|frolimnophila|perdelecta}} {{sp|A|frolimnophila|petulans}} {{sp|A|frolimnophila|piceipes}} {{sp|A|frolimnophila|pterosticta}} {{sp|A|frolimnophila|pusan}} {{sp|A|frolimnophila|raoana}} {{sp|A|frolimnophila|scabristyla}} {{sp|A|frolimnophila|stenacris}} {{sp|A|frolimnophila|unijuga}} {{sp|A|frolimnophila|urundiana}} {{splast|A|frolimnophila|vansomereni}} =={{int:Name}}== ''Afrolimnophila'' {{a|Charles Paul Alexander|Alexander}}, 1956 =={{int:References}}== * {{a|Edward Johnston Alexander|Alexander, E. J.}}, 1956. Ruwenzori Exped. 1934-35, 1: 284. {{Starý & Kolcsár, 2021}} {{Taxonbar|from=Q2229033}} [[Category:Charles Paul Alexander taxa]] oud50gk5b1w96o7dgtxm4t9815bgmts Pseudotsuga 0 73830 11322288 11014386 2026-10-21T20:01:06Z Forstbirdo 71370 11322288 wikitext text/x-wiki {{Image|Pseudotsuga menziesii 28022.JPG|''[[Pseudotsuga menziesii]]''}} =={{int:Taxonavigation}}== {{Pseudotsuga}} Species: {{sp|P|seudotsuga|japonica}} {{sp|P|seudotsuga|lindleyana}} {{sp|P|seudotsuga|macrocarpa}} {{sp|P|seudotsuga|menziesii}} {{splast|P|seudotsuga|sinensis}} =={{int:Name}}== ''Pseudotsuga'' {{a|Carrière}}, Traité Gén. Conif., ed. 2: {{BHL|page/34147111|256}} (1867). * {{Tysp|Pseudotsuga douglasii}} ({{aut|Sabine}} ex {{aut|D.Don}}) {{aut|Carrière}} = ''[[Pseudotsuga menziesii]]'' ({{aut|Mirbel}}) {{aut|Franco}} ==={{int:Synonyms}}=== {{HET}} **''Abietia'' {{a|A.H.Kent}} in {{aut|H.J.Veitch}}, Man. Conif., new ed.: 474 (1900). =={{int:References}}== ==={{int:Primary references}}=== {{Carrière, 1867}} ==={{int:Links}}=== {{WCSP|2021|March|7}} {{IPNI|30005513-2|2021|7 March}} =={{int:Vernacular names}}== {{VN |ar=تنوب دوغلاس |be=Дугласія |be-x-old=Дугласія |bg=Дугласка ела |cs=Douglaska |da=Douglasgran |de=Douglasien |el=Ψευδοτσούγκα |en=Douglas-fir |eo=Pseŭdocugo |es=Douglasia |et=Ebatsuuga |fa=سرخ‌نرادها |fi=Douglaskuuset |fr=Douglas |he=צוגנית |hr=Duglazija |hsb=Douglasija |hu=Duglászfenyő |io=Pseudocugo |it=Douglasie |ja=トガサワラ属 |ka=ცრუცუგა |ko=미송속 |lb=Douglasdännen |lt=Pocūgė |mk=Дуглазија |nl=Douglasspar |no=Douglasgranslekten |pl=Daglezja |pnb=ڈگلس فر |ru=Псевдотсуга |sl=duglazija |sv=Douglasgranssläktet |uk=Псевдотсуга |vls=Doeglas |zh=黄杉属 }} {{Commonscat}} {{Taxonbar|from=Q158771}} [[Category:Élie-Abel Carrière taxa]] jj3zv0ccmdtrrf6q90xicnyzdd4f5fa Pseudotsuga japonica 0 73831 11322316 10551615 2026-10-21T20:25:13Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322316 wikitext text/x-wiki {{image|Pseudotsuga japonica togasawara04.jpg|Tanabe City, Wakayama Prefecture, Japan}} =={{int:Taxonavigation}}== {{Pseudotsuga}} Species ''[[Pseudotsuga japonica]]'' =={{int:Name}}== ''Pseudotsuga japonica'' ({{a|Shiras.}}) {{a|Beissn.}}, Mitt. Deutsch. Dendrol. Ges. 5: {{BHL|page/42927709|62}} (1896). ==={{int:Synonyms}}=== {{BA}} ** ''Tsuga japonica'' {{aut|Shiras.}}, Bot. Mag. (Tokyo) 9: 84 (1895). =={{int:References}}== ==={{int:Primary references}}=== {{Beissner, 1896}} ==={{int:Links}}=== {{PWO|2021|Sep|27}} {{MBG|2021|Sep|27}} {{IPNI|677138-1|2021|27 Sep}} {{World Plants|2021|Sep|27}} {{Catol-Hassler|2021|Sep|27}} {{GRIN||30190|08-Apr-12}} =={{int:Vernacular names}}== {{VN |de=Japanische Douglasie |en=Japanese Douglas-fir |io=Japoniana pseudocugo |ja=トガサワラ |lt=Japoninė pocūgė }} {{Commonscat}} {{Taxonbar|from=Q1683278}} [[Category:Ludwig Beissner taxa]] eang60etbl3r1d6d9fjopmjnaux8j4p Pseudotsuga sinensis 0 73834 11322299 9810933 2026-10-21T20:07:09Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322299 wikitext text/x-wiki {{image|Pseudotsuga sinsensis var. sinensis.JPG}} =={{int:Taxonavigation}}== {{Pseudotsuga}} Species ''[[Pseudotsuga sinensis]]'' =={{int:Name}}== ''Pseudotsuga sinensis'' [[Dode]] =={{int:References}}== * ''Bulletin da la Société Dendrologique de France'' 23-24: 58 (1912) * {{GRIN||451755|08-Apr-12}} =={{int:Vernacular names}}== {{VN |de=Chinesische Douglasie |en=Chinese Douglas-fir |io=Chiniana pseudocugo |lt=Kininė pocūgė |no=Kinesisk douglasgran }} {{Commonscat}} {{Taxonbar|from=Q1073867}} [[Category:Louis-Albert Dode taxa]] l6awnjg1awy5s092y3p9gxlifwkri5y Sciadopitys 0 76677 11322323 11004072 2026-10-21T20:33:31Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322323 wikitext text/x-wiki {{image|Sciadopitys verticillata (leaf).jpg|''[[Sciadopitys verticillata]]'', Mount Futatsumori, Nakatsugawa, Gifu Prefecture, Japan}} =={{int:Taxonavigation}}== {{Sciadopitys}} Species: †{{sp|S|ciadopitys|tertiaria}}{{sp|S|ciadopitys|verticillata}} †{{splast|S|ciadopitys|yezo-koshizakae}} =={{int:Name}}== ''Sciadopitys'' {{a|Siebold}} & {{a|Zucc.}}, Fl. Jap. 2: [https://gallica.bnf.fr/ark:/12148/bpt6k976005/f3.item 1], [https://gallica.bnf.fr/ark:/12148/bpt6k976005/f93.item t. 101] (1842). * Type species: ''[[Sciadopitys verticillata]]'' {{aut|Siebold}} & {{aut|Zucc.}} {{nadi| * '''Continental: Asia-Temperate''' ** '''Regional: Eastern Asia''' *** Japan. }} =={{int:References}}== ==={{int:Primary references}}=== {{Siebold & Zuccarini, 1842}} ==={{int:Links}}=== {{POWO|2023|Jul|6}} {{World Plants|2023|Jul|6}} {{IPNI|11700-1|2023|6 Jul}} {{MBG|2023|Jul|6}} =={{int:Vernacular names}}== {{VN |cs=Pajehličník přeslenatý |da=Parasoltræ |de=Japanische Schirmtanne |et=Sirmokas |fi=Varjostinkuuset |hu=Japán ernyőfenyő |io=Sciadopitiso |ja=コウヤマキ |ko=금송 |koi=Сциадопитис |lv=Japānas širmegle |mk=Чадорест бор |mrj=Сциадопитис |nl=Japanse parasolden |no=Koyamaki |pl=Sośnica japońska |ru=Сциадопитис |se=Suoivanastiguossašattut |udm=Сциадопитис |vi=Thông dù Nhật Bản |zh=金松科 }} {{Commonscat}} {{Taxonbar}} [[Category:Philipp Franz von Siebold taxa]] [[Category:Joseph Gerhard Zuccarini taxa]] rr670xapj4vw7oewnp4u5know3f8p14 Sciadopitys verticillata 0 76678 11322851 9266132 2026-10-22T09:27:00Z Forstbirdo 71370 /* {{int:Vernacular names}} */ 11322851 wikitext text/x-wiki {{Image|Sekiunji Koyamaki, Osaki.jpg|''Sciadopitys verticillata'' 'Sekiunji Koyamaki', Sekiunji, Ōsaki, Miyagi Prefecture, Japan}} {{Image|Sciadopitys verticillata (cone).jpg|''Sciadopitys verticillata'' strobilus, Futatsumori, Nkatsugawa, Gifu Prefecture, Japan}} =={{int:Taxonavigation}}== {{Sciadopitys}} Species: ''[[Sciadopitys verticillata]]'' =={{int:Name}}== ''Sciadopitys verticillata'' ({{a|Thunb.}}) {{a|Philipp Franz von Siebold|Siebold}} & {{a|Joseph Gerhard Zuccarini|Zucc.}}, Fl. Jap. 2(1): [https://gallica.bnf.fr/ark:/12148/bpt6k976005/f5.item 3] (1842) ==={{int:Synonyms}}=== {{BAS}} ** ''Taxus verticillata'' {{aut|Thunb.}} in {{aut|J.A.Murray}} (ed.), Syst. Veg. ed. 14: 895 (1784) {{HOT}} ** ''Pinus verticillata'' ({{aut|Thunb.}}) {{aut|Siebold}}, Verh. Batav. Genootsch. Kunsten 12: 12 (1830) ** ''Podocarpus verticillatus'' ({{aut|Thunb.}}) {{a|Jacques}}, Ann. Fl. Pomone 5: 227 (1837), [[nom. illeg.]] {{HET}} ** ''Sciadopitys verticillata'' var. ''variegata'' {{a|Gordon}}, Pinetum, Suppl.: 96 (1862) ** ''Sciadopitys verticillata'' var. ''pendula'' {{a|Bean}}, Trees & Shrubs Brit. Isles 2: 507 (1914) {{nadi| * '''Continental: Asia-Temperate''' ** '''Regional: Eastern Asia''' *** Japan. }} =={{int:References}}== ==={{int:Primary references}}=== {{Siebold & Zuccarini, 1842}} ==={{int:Links}}=== {{POWO|2023|Jul|6}} {{MBG|2023|Jul|6}} {{IPNI|263735-1|2023|6 Jul}} {{World Plants|2023|Jul|6}} =={{int:Vernacular names}}== {{VN |cs=Pajehličník přeslenatý |da=Parasoltræ |de=Schirmtanne |en=Koyamaki |et=Sirmokas |fa=کاج چتری ژاپنی |fi=Varjostinkuusi |hsb=Wšědna sćinowa jědla |hu=Japán ernyőfenyő |io=Koyamako |it=Koyamaki |ja=コウヤマキ |koi=Сциадопитис |ko=금송 |kv=Сциадопитис |lv=Japānas širmegle |mk=Чадорест бор |mrj=Сциадопитис |nl=Japanse parasolden |no=Koyamaki |pl=Sośnica japońska |pnb=جپانی چھتری چیڑ |ru=Сциадопитис |sv=Solfjädertall |udm=Сциадопитис |vi=Thông dù Nhật Bản |zh=日本金松 }} {{Commonscat}} {{Taxonbar}} [[Category:Philipp Franz von Siebold taxa]] [[Category:Joseph Gerhard Zuccarini taxa]] 47z8hfzl5rc80t151auw1baaheexofr 11322904 11322851 2026-10-22T09:44:13Z RLJ 134478 11322904 wikitext text/x-wiki {{Image|Sekiunji Koyamaki, Osaki.jpg|''Sciadopitys verticillata'' 'Sekiunji Koyamaki', Sekiunji, Ōsaki, Miyagi Prefecture, Japan}} {{Image|Sciadopitys verticillata (cone).jpg|''Sciadopitys verticillata'' strobilus, Futatsumori, Nkatsugawa, Gifu Prefecture, Japan}} =={{int:Taxonavigation}}== {{Sciadopitys}} Species: ''[[Sciadopitys verticillata]]'' =={{int:Name}}== ''Sciadopitys verticillata'' ({{a|Thunb.}}) {{a|Philipp Franz von Siebold|Siebold}} & {{a|Joseph Gerhard Zuccarini|Zucc.}}, Fl. Jap. 2(1): [https://gallica.bnf.fr/ark:/12148/bpt6k976005/f5.item 3] (1842) ==={{int:Synonyms}}=== {{BAS}} ** ''Taxus verticillata'' {{aut|Thunb.}} in {{aut|J.A.Murray}} (ed.), Syst. Veg. ed. 14: 895 (1784) {{HOT}} ** ''Pinus verticillata'' ({{aut|Thunb.}}) {{aut|Siebold}}, Verh. Batav. Genootsch. Kunsten 12: 12 (1830) ** ''Podocarpus verticillatus'' ({{aut|Thunb.}}) {{a|Henri Antoine Jacques|Jacques}}, Ann. Fl. Pomone 5: 227 (1837), [[nom. illeg.]] {{HET}} ** ''Sciadopitys verticillata'' var. ''variegata'' {{a|George Gordon|Gordon}}, Pinetum, Suppl.: 96 (1862) ** ''Sciadopitys verticillata'' var. ''pendula'' {{a|William Jackson Bean|Bean}}, Trees & Shrubs Brit. Isles 2: 507 (1914) {{nadi| * '''Continental: Asia-Temperate''' ** '''Regional: Eastern Asia''' *** Japan. }} =={{int:References}}== ==={{int:Primary references}}=== {{Siebold & Zuccarini, 1842}} ==={{int:Links}}=== {{POWO|2023|Jul|6}} {{MBG|2023|Jul|6}} {{IPNI|263735-1|2023|6 Jul}} {{World Plants|2023|Jul|6}} =={{int:Vernacular names}}== {{VN |cs=Pajehličník přeslenatý |da=Parasoltræ |de=Schirmtanne |en=Koyamaki |et=Sirmokas |fa=کاج چتری ژاپنی |fi=Varjostinkuusi |hsb=Wšědna sćinowa jědla |hu=Japán ernyőfenyő |io=Koyamako |it=Koyamaki |ja=コウヤマキ |koi=Сциадопитис |ko=금송 |kv=Сциадопитис |lv=Japānas širmegle |mk=Чадорест бор |mrj=Сциадопитис |nl=Japanse parasolden |no=Koyamaki |pl=Sośnica japońska |pnb=جپانی چھتری چیڑ |ru=Сциадопитис |sv=Solfjädertall |udm=Сциадопитис |vi=Thông dù Nhật Bản |zh=日本金松 }} {{Commonscat}} {{Taxonbar}} [[Category:Philipp Franz von Siebold taxa]] [[Category:Joseph Gerhard Zuccarini taxa]] 4i1z9whmmh5ocq9x9mg2t0b2vkbkah3 11322954 11322904 2026-10-22T10:21:50Z Andyboorman 251907 /* {{int:Vernacular names}} */ 11322954 wikitext text/x-wiki {{Image|Sekiunji Koyamaki, Osaki.jpg|''Sciadopitys verticillata'' 'Sekiunji Koyamaki', Sekiunji, Ōsaki, Miyagi Prefecture, Japan}} {{Image|Sciadopitys verticillata (cone).jpg|''Sciadopitys verticillata'' strobilus, Futatsumori, Nkatsugawa, Gifu Prefecture, Japan}} =={{int:Taxonavigation}}== {{Sciadopitys}} Species: ''[[Sciadopitys verticillata]]'' =={{int:Name}}== ''Sciadopitys verticillata'' ({{a|Thunb.}}) {{a|Philipp Franz von Siebold|Siebold}} & {{a|Joseph Gerhard Zuccarini|Zucc.}}, Fl. Jap. 2(1): [https://gallica.bnf.fr/ark:/12148/bpt6k976005/f5.item 3] (1842) ==={{int:Synonyms}}=== {{BAS}} ** ''Taxus verticillata'' {{aut|Thunb.}} in {{aut|J.A.Murray}} (ed.), Syst. Veg. ed. 14: 895 (1784) {{HOT}} ** ''Pinus verticillata'' ({{aut|Thunb.}}) {{aut|Siebold}}, Verh. Batav. Genootsch. Kunsten 12: 12 (1830) ** ''Podocarpus verticillatus'' ({{aut|Thunb.}}) {{a|Henri Antoine Jacques|Jacques}}, Ann. Fl. Pomone 5: 227 (1837), [[nom. illeg.]] {{HET}} ** ''Sciadopitys verticillata'' var. ''variegata'' {{a|George Gordon|Gordon}}, Pinetum, Suppl.: 96 (1862) ** ''Sciadopitys verticillata'' var. ''pendula'' {{a|William Jackson Bean|Bean}}, Trees & Shrubs Brit. Isles 2: 507 (1914) {{nadi| * '''Continental: Asia-Temperate''' ** '''Regional: Eastern Asia''' *** Japan. }} =={{int:References}}== ==={{int:Primary references}}=== {{Siebold & Zuccarini, 1842}} ==={{int:Links}}=== {{POWO|2023|Jul|6}} {{MBG|2023|Jul|6}} {{IPNI|263735-1|2023|6 Jul}} {{World Plants|2023|Jul|6}} =={{int:Vernacular names}}== {{VN |cs=Pajehličník přeslenatý |da=Parasoltræ |de=Schirmtanne |en=Umbrella Pine, Koyamaki |et=Sirmokas |fa=کاج چتری ژاپنی |fi=Varjostinkuusi |hsb=Wšědna sćinowa jědla |hu=Japán ernyőfenyő |io=Koyamako |it=Koyamaki |ja=コウヤマキ |koi=Сциадопитис |ko=금송 |kv=Сциадопитис |lv=Japānas širmegle |mk=Чадорест бор |mrj=Сциадопитис |nl=Japanse parasolden |no=Koyamaki |pl=Sośnica japońska |pnb=جپانی چھتری چیڑ |ru=Сциадопитис |sv=Solfjädertall |udm=Сциадопитис |vi=Thông dù Nhật Bản |zh=日本金松 }} {{Commonscat}} {{Taxonbar}} [[Category:Philipp Franz von Siebold taxa]] [[Category:Joseph Gerhard Zuccarini taxa]] smo38qyqgq3ll2idru4j6lhtupx4mb4 Hu 0 85465 11322015 11242160 2026-10-21T14:17:58Z Neferkheperre 947633 11322015 wikitext text/x-wiki {{for|the museum acronym '''HU'''|HU (Museum)}} {{refer|authority}} * [[Ben-Jin Hu]], entomologist * [[Bing-Bing Hu]] ('''B.B. Hu'''), Chinese entomologist * [[Bing-Yi Hu]], Chinese entomologist * [[Chang-Hao Hu]], arachnologist * [[Chao-Yi Hu]], Chinese geneticist * [[Cheng Hua Hu]] (born 1933, '''C.H.Hu'''), botanist * [[Cheng-Zhi Hu]], Chinese entomologist * [[Chi Ming Hu]] (born 1935, '''C.M.Hu'''), Chinese botanist * [[Chia Chi Hu]] (born 1932; '''C.C.Hu'''), botanist * [[Chun-Lin Hu]], Chinese entomologist (Hemiptera) * [[Chung-Hung Hu]], ostracodologist * [[Da-Shih Hu]], ornithologist * [[Dian-Ming Hu]] ('''D.M.Hu'''), mycologist * [[Fa-Xiang Hu]], ichthyologist * [[Fang-Shuo Hu]], Taiwanese entomologist * [[Fei Hu]], herpetologist * [[Feng Hu]], Chinese entomologist * [[Fu Mei Hu]] (fl. 1988, '''F.M.Hu'''), mycologist * [[Guang-Rong Hu]] ('''G.R. Hu'''), Chinese lichenologist * [[Hsen Hsu Hu]] (1894–1968, '''Hu'''), Chinese botanist (also transcribed as Hu Xiansu and Xiansu Hu) * [[Hai-Qing Hu]] ('''H.Q. Hu'''), Chinese entomologist * [[Hao-Yuan Hu]], entomologist * [[Hong Jun Hu]] ('''H.J.Hu'''), phycologist * [[Hong-Ying Hu]], Chinese entomologist * [[Hua-Li Hu]], batrachologist * [[Hung Chuen Hu]] ('''H.C.Hu'''), phycologist * [[Hung-Tao Hu]] ('''H.T.Hu'''), mycologist * [[Jia-Hao Hu]], Chinese zoologist * [[Jia-Hui Hu]], Chinese paleoentomologist * [[Jia-Yao Hu]], Chinese entomologist * [[Jian-Sheng Hu]], herpetologist * [[Jian-Tao Hu]], ichthyologist * [[Jin-Chu Hu]], zoologist * [[Jin-Lin Hu]], Chinese arachnologist * [[Jun-Fang Hu]], entomologist * [[Jun-Jie Hu]], helminthologist * [[Ke Hu]], herpetologist * [[Kun-Jie Hu]], Chinese entomologist * [[Lan-Lan Hu]], Chinese arachnologist * [[Li-Sha Hu]], Chinese malacologist * [[Ling Cheng Hu]] (born 1925; '''L.C.Hu'''), botanist * [[Ling-Ling Hu]] * [[Mei-Ling Hu]], malacologist * [[Neng Hu]], entomologist * [[Peng-Hui Hu]], entomologist * [[Qixiong Hu]], herpetologist * [[Quanan Hu]], nematologist * [[Ren Chuan Hu]] ('''R.C.Hu'''), botanist * [[Ren-Liang Hu]] (1932–2009, '''R.L.Hu'''), Chinese bryologist * [[Rong Hu]], Chinese entomologist * [[Sha Hu]], Chinese entomologist * [[Shang-Mi Hu]], Chinese entomologist * [[Shao-Ji Hu]], Chinese entomologist, Lepidopterist * [[Sheng-Hao Hu]], Chinese arachnologist * [[Shi-Xue Hu]], Chinese palaeontologist * [[Shiu-Ying Hu]] (1910–2012, '''S.Y.Hu'''), Chinese botanist * [[Shu-Qin Hu]], Chinese herpetologist * [[Tian-Hao Hu]], entomologist * [[Ting-Ting Zhu]], Chinese ichthyologist * [[Xia-Oyu Hu]], Chinese malacologist * [[Xiao-Zhong Hu]], protistologist * [[Xiao-Zhou Hu]], Chinese helminthologist * [[Ya-Hui Hu]], entomologist * [[Yan-Li Hu]], entomologist * [[Yue-Gao Hu]], Chinese nematologist * [[Yu-Lin Hu]], Chinese entomologist * [[Yun-Jin Hu]], Chinese arachnologist * [[Yuxin Hu]], phycologist * [[Yan-Ping Hu]], Chinese ichthyologist * [[Yan-Qing Hu]] ('''Y.Q. Hu'''), Chinese entomologist * [[Yao-Guang Hu]], entomologist, Japan * [[Yu-Qi Hu]], Chinese entomologist * [[Ze Hu]], Chinese entomologist * [[Zhang-Li Hu]], Chinese helminthologist * [[Zheng-Kun Hu]], entomologist * [[Zhengyu Hu]] ('''Z.-Y.Hu'''), phycologist * [[Zhi-Gang Hu]], geneticist * [[Zhi Hao Hu]] (born 1937; '''Z.H.Hu'''), botanist * [[Zhu-Rong Hu]], Chinese entomologist * [[Zi-Qiang Hu]], arachnologist {{Disambiguation |cat=people}} t5w291bydyrhy5ry0joe2u7afzf0n5j × Brassarda juncea 0 88429 11322670 10931891 2026-10-22T07:52:22Z Andyboorman 251907 Andyboorman moved page [[Brassica juncea]] to [[× Brassarda juncea]]: Move to the valid combination: see references 10931891 wikitext text/x-wiki {{image|Brassica_juncea_-_Köhler–s_Medizinal-Pflanzen-168.jpg}} {{image|Starr-150328-0641-Brassica juncea-flowering habit-Northwest Eastern Island-Midway Atoll (25242640436).jpg}} =={{int:Taxonavigation}}== {{Brassica}} Species: ''[[Brassica juncea]]'' =={{int:Name}}== ''Brassica juncea'' ({{a|L.}}) {{a|Czern.}}, Conspect. Pl. Charc. 8. (1859) ==={{int:Synonyms}}=== {{BA}} **''Sinapis juncea'' L., Sp. Pl. 2: 668 (1753) {{HOT}} **''Brassica arvensis var. juncea'' (L.) Kuntze, Trudy Imp. S.-Peterburgsk. Bot. Sada 10: 164 (1887) **''Brassica juncea subsp. eujuncea'' Thell., Verh. Bot. Vereins Prov. Brandenburg 50(2): 152 (1908), not validly publ. **''Crucifera juncea'' (L.) E.H.L.Krause in J.W.Sturm, Deutschl. Fl. Abbild., ed. 2. 6: 133 (1902) **''Raphanus junceus'' (L.) Crantz, Cl. Crucif. Emend.: 110 (1769) **''Sinabraca juncea'' (L.) G.H.Loos, Florist. Rundbr., Beih. 7: 131 (2004) {{HET}} **''Brassica argyi'' H.Lév. in Repert. Spec. Nov. Regni Veg. 4: 227 (1907) **''Brassica besseriana'' Andrz. ex Trautv. in Bull. Soc. Imp. Naturalistes Moscou 33(I): 134 (1860) **''Brassica cernua'' (Thunb.) F.B.Forbes & Hemsl. in J. Linn. Soc., Bot. 23: 47 (1886) **''Brassica cernua var. chirimenna'' Makino in Y.Iinuma, Somoku-Dzusetsu, ed. 3, 3: 906 (1912) **''Brassica chenopodiifolia'' Sennen & Pau in Bol. Soc. Aragonesa Ci. Nat. 15: 95 (1916), pro syn. **''Brassica chinensis f. japonica'' (Thunb.) M.Hiroe in Pl. Basho's & Buson's Hokku Lit. 8(1): 143 (1971) **''Brassica integrifolia'' (H.West) Rupr. in Fl. Ingrica: 96 (1860) **''Brassica integrifolia var. timoriana'' (DC.) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 58 (1919) **''Brassica japonica'' (Thunb.) Siebold ex Miq. in Ann. Mus. Bot. Lugduno-Batavi 2: 74 (1865) **''Brassica juncea var. aspera'' (Prain) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 56 (1919) **''Brassica juncea subproles aspera'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea var. chinensis'' (L.) N.Busch in Fl. Sibir. Orient. Extremi 1: 166 (1913) **''Brassica juncea var. crispifolia'' L.H.Bailey in Gentes Herbarum 1: 91 (1922) **''Brassica juncea var. elata'' (Prain) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 56 (1919) **''Brassica juncea subproles elata'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea var. foliosa'' L.H.Bailey in Gentes Herbarum 2: 263 (1930) **''Brassica juncea var. gracilis'' Tsen & S.H.Lee in Hortus Sinicus 2: 26 (1942) **''Brassica juncea subsp. integrifolia'' (H.West) Thell. in Verh. Bot. Vereins Prov. Brandenburg 50(2): 157 (1908) **''Brassica juncea var. integrifolia'' (H.West) Sinskaya in Trudy Prikl. Bot. 19: 339 (1928) **''Brassica juncea var. japonica'' (Thunb.) L.H.Bailey in Gentes Herbarum 1: 93 (1922) **''Brassica juncea subproles laevis'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea var. laevis'' (Prain) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 56 (1919) **''Brassica juncea var. longidens'' L.H.Bailey in Gentes Herbarum 2: 263 (1930) **''Brassica juncea var. megarrhiza'' Tsen & S.H.Lee in Hortus Sinicus 2: 21 (1942) **''Brassica juncea var. multiceps'' Tsen & S.H.Lee in Hortus Sinicus 2: 20 (1942) **''Brassica juncea var. multisecta'' L.H.Bailey in Gentes Herbarum 1: 93 (1922) **''Brassica juncea var. napiformis'' (Pailleux & Bois) Kitam. in Mem. Coll. Sci. Kyoto Imp. Univ., Ser. B, Biol. 19: 76 (1950) **''Brassica juncea subsp. napiformis'' (Pailleux & Bois) Gladis in Feddes Repert. 103: 474 (1992) **''Brassica juncea var. oleifera'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea subsp. rugosa'' (Roxb.) Prain in Agric. Ledger 5: 47 (1898) **''Brassica juncea var. rugosa'' (Roxb.) Tsen & S.H.Lee in Hort. Sin. 2: 19 (1942) **''Brassica juncea subsp. tsatsai'' (Z.I.Mao) Gladis in Feddes Repert. 103: 474 (1992) **''Brassica juncea var. tsatsai'' Z.I.Mao in Hortus Sinicus 2: 690 (1936) **''Brassica juncea var. tumida'' Tsen & S.H.Lee in Hort. Sin. 2: 23 (1942) **''Brassica juncea subsp. urbaniana'' (O.E.Schulz) Thell. in Verh. Bot. Vereins Prov. Brandenburg 50(2): 158 (1908) **''Brassica lanceolata'' (DC.) Lange in G.C.Oeder & auct. suc. (eds.), Fl. Dan.: t. 2658 (1861) **''Brassica napiformis'' (Pailleux & Bois) L.H.Bailey in Cornell Univ. Agric. Exp. Sta. Bull. 67: 189 (1894) **''Brassica napiformis var. multisecta'' A.I.Baranov in Feddes Repert. Spec. Nov. Regni Veg. 63: 286 (1960) **''Brassica nigra var. japonica'' (Thunb.) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 79 (1919) **''Brassica oleracea var. taquetii'' H.Lév. & Vaniot in Repert. Spec. Nov. Regni Veg. 8: 259 (1910) **''Brassica richeri'' Lange in G.C.Oeder & auct. suc. (eds.), Fl. Dan.: t. 2658 (1861) **''Brassica rugosa'' (Roxb.) Prain in Bengal Pl. 1: 220 (1903) **''Brassica taquetii'' (H.Lév. & Vaniot) H.Lév. in Repert. Spec. Nov. Regni Veg. 10: 349 (1912) **''Brassica urbaniana'' O.E.Schulz in I.Urban, Symb. Antill. 3: 511 (1903) **''Brassica willdenovii'' Boiss. in Ann. Sci. Nat., Bot., sér. 2, 17: 88 (1842) **''Rhamphospermum volgense'' Andrz. ex Rupr. in Fl. Ingrica: 97 (1860) **''Sinapis cernua'' Thunb. in J.A.Murray (ed.), Syst. Veg., ed. 14.: 602 (1784) **''Sinapis chinensis'' L. in Mant. Pl.: 95 (1767) **''Sinapis cuneifolia'' Roxb. in Fl. Ind., ed. 1832. 3: 121 (1832) **''Sinapis integrifolia'' H.West in Bidr. Beskr. Ste Croix: 296 (1793) **''Sinapis integrifolia var. chevalieri'' Portères in Rev. Bot. Appl. Agric. Trop. 15: 1120 (1935) **''Sinapis japonica'' Thunb. in J.A.Murray (ed.), Syst. Veg., ed. 14.: 602 (1784) **''Sinapis juncea var. napiformis'' Pailleux & Bois in Potag. Cur., ed. 2: 372 (1892) **''Sinapis lanceolata'' DC. in Syst. Nat. 2: 611 (1821) **''Sinapis oleracea'' C.Presl in J.S.Presl & C.B.Presl, Delic. Prag.: 18 (1822) **''Sinapis patens'' Roxb. in Fl. Ind., ed. 1832. 3: 124 (1832) **''Sinapis ramosa'' Roxb. in Asiat. Res. 11: 179 (1810) **''Sinapis rugosa'' Roxb. in Fl. Ind., ed. 1832. 3: 122 (1832) **''Sinapis sinensis'' J.F.Gmel. in Syst. Nat., ed. 13[bis].: 989 (1792) **''Sinapis tenella'' Moench in Methodus: 253 (1794) **''Sinapis timoriana'' DC. in Syst. Nat. 2: 616 (1821)<br> Note: This species is a common cultigen and wildflower found in many countries (see POWO), but whose genetic origins is the Caucasus. =={{int:References}}== * {{Czern.}}, 1859. ''[[Conspectus Plantarum circa Charcoviam et in Ucrania sponte cresentium et vulgo cultarum]]'' 8. 1859 Mar (E. Cosson, Bull. Soc. Bot. France 6(8):609. 1860 Jan) ==={{int:Links}}=== {{PWO|2023|Dec.|2}} * {{Catol-Hassler|2019|Oct.|24}} * {{BRBA|2019|May|20}} * {{IPNI||2019|May 20}} * {{MBG|2019|May|20}} * {{ITIS|23059|''Brassica juncea'' (L.) Czern.}} =={{int:Vernacular names}}== {{VN |de=Brauner Senf, Indischer Senf, Sareptasenf, Ruten-Kohl |en=Indian Mustard, Mustard Greens, Leaf Mustard |fi=Sareptansinappi |fr=Moutarde Brune, Moutarde Chinoise |it= Senape indiana |nl=Sareptamosterd |ja=カラシナ(芥子菜), セイヨウカラシナ(西洋芥子菜) |pl=Kapusta Sitowata |ru=Горчица сарептская, или Горчица русская, или Горчица сизая |sv=Sarepsasenap |tr=Hint hardalı |te=ఆవాలు |uk=Гірчиця салатна, Гірчиця листова, Гірчиця сарепська |zh=芥菜 |pa=ਸਰ੍ਹੋਂ }} {{Commonscat}} {{Taxonbar|from=Q504781}} [[Category:Vassiliĭ Matveievitch Czernajew taxa]] rf9z7irx97aafztq31q1vgnn3q7c84p 11322672 11322670 2026-10-22T08:00:30Z Andyboorman 251907 11322672 wikitext text/x-wiki {{image|Brassica_juncea_-_Köhler–s_Medizinal-Pflanzen-168.jpg|× ''Brassarda juncea''}} {{image|Starr-150328-0641-Brassica juncea-flowering habit-Northwest Eastern Island-Midway Atoll (25242640436).jpg|× ''Brassarda juncea''}} =={{int:Taxonavigation}}== {{× Brassarda}} Species: ''[[× Brassarda juncea]]'' =={{int:Name}}== ''× Brassarda juncea'' ({{a|L.}}) {{a|Su Liu}} & {{a|Z.H.Feng}}, Phytoneuron 2024-85: 10 (2024) ==={{int:Synonyms}}=== {{BA}} **''Sinapis juncea'' L., Sp. Pl. 2: 668 (1753) {{HOT}} **''Brassica arvensis var. juncea'' (L.) Kuntze, Trudy Imp. S.-Peterburgsk. Bot. Sada 10: 164 (1887) **''Brassica juncea'' ({{a|L.}}) {{a|Czern.}}, Conspect. Pl. Charc. 8. (1859) **''Brassica juncea subsp. eujuncea'' Thell., Verh. Bot. Vereins Prov. Brandenburg 50(2): 152 (1908), not validly publ. **''Crucifera juncea'' (L.) E.H.L.Krause in J.W.Sturm, Deutschl. Fl. Abbild., ed. 2. 6: 133 (1902) **''Raphanus junceus'' (L.) Crantz, Cl. Crucif. Emend.: 110 (1769) **''Sinabraca juncea'' (L.) G.H.Loos, Florist. Rundbr., Beih. 7: 131 (2004) {{HET}} **''Brassica argyi'' H.Lév. in Repert. Spec. Nov. Regni Veg. 4: 227 (1907) **''Brassica besseriana'' Andrz. ex Trautv. in Bull. Soc. Imp. Naturalistes Moscou 33(I): 134 (1860) **''Brassica cernua'' (Thunb.) F.B.Forbes & Hemsl. in J. Linn. Soc., Bot. 23: 47 (1886) **''Brassica cernua var. chirimenna'' Makino in Y.Iinuma, Somoku-Dzusetsu, ed. 3, 3: 906 (1912) **''Brassica chenopodiifolia'' Sennen & Pau in Bol. Soc. Aragonesa Ci. Nat. 15: 95 (1916), pro syn. **''Brassica chinensis f. japonica'' (Thunb.) M.Hiroe in Pl. Basho's & Buson's Hokku Lit. 8(1): 143 (1971) **''Brassica integrifolia'' (H.West) Rupr. in Fl. Ingrica: 96 (1860) **''Brassica integrifolia var. timoriana'' (DC.) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 58 (1919) **''Brassica japonica'' (Thunb.) Siebold ex Miq. in Ann. Mus. Bot. Lugduno-Batavi 2: 74 (1865) **''Brassica juncea var. aspera'' (Prain) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 56 (1919) **''Brassica juncea subproles aspera'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea var. chinensis'' (L.) N.Busch in Fl. Sibir. Orient. Extremi 1: 166 (1913) **''Brassica juncea var. crispifolia'' L.H.Bailey in Gentes Herbarum 1: 91 (1922) **''Brassica juncea var. elata'' (Prain) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 56 (1919) **''Brassica juncea subproles elata'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea var. foliosa'' L.H.Bailey in Gentes Herbarum 2: 263 (1930) **''Brassica juncea var. gracilis'' Tsen & S.H.Lee in Hortus Sinicus 2: 26 (1942) **''Brassica juncea subsp. integrifolia'' (H.West) Thell. in Verh. Bot. Vereins Prov. Brandenburg 50(2): 157 (1908) **''Brassica juncea var. integrifolia'' (H.West) Sinskaya in Trudy Prikl. Bot. 19: 339 (1928) **''Brassica juncea var. japonica'' (Thunb.) L.H.Bailey in Gentes Herbarum 1: 93 (1922) **''Brassica juncea subproles laevis'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea var. laevis'' (Prain) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 56 (1919) **''Brassica juncea var. longidens'' L.H.Bailey in Gentes Herbarum 2: 263 (1930) **''Brassica juncea var. megarrhiza'' Tsen & S.H.Lee in Hortus Sinicus 2: 21 (1942) **''Brassica juncea var. multiceps'' Tsen & S.H.Lee in Hortus Sinicus 2: 20 (1942) **''Brassica juncea var. multisecta'' L.H.Bailey in Gentes Herbarum 1: 93 (1922) **''Brassica juncea var. napiformis'' (Pailleux & Bois) Kitam. in Mem. Coll. Sci. Kyoto Imp. Univ., Ser. B, Biol. 19: 76 (1950) **''Brassica juncea subsp. napiformis'' (Pailleux & Bois) Gladis in Feddes Repert. 103: 474 (1992) **''Brassica juncea var. oleifera'' Prain in Agric. Ledger 1: 47 (1898) **''Brassica juncea subsp. rugosa'' (Roxb.) Prain in Agric. Ledger 5: 47 (1898) **''Brassica juncea var. rugosa'' (Roxb.) Tsen & S.H.Lee in Hort. Sin. 2: 19 (1942) **''Brassica juncea subsp. tsatsai'' (Z.I.Mao) Gladis in Feddes Repert. 103: 474 (1992) **''Brassica juncea var. tsatsai'' Z.I.Mao in Hortus Sinicus 2: 690 (1936) **''Brassica juncea var. tumida'' Tsen & S.H.Lee in Hort. Sin. 2: 23 (1942) **''Brassica juncea subsp. urbaniana'' (O.E.Schulz) Thell. in Verh. Bot. Vereins Prov. Brandenburg 50(2): 158 (1908) **''Brassica lanceolata'' (DC.) Lange in G.C.Oeder & auct. suc. (eds.), Fl. Dan.: t. 2658 (1861) **''Brassica napiformis'' (Pailleux & Bois) L.H.Bailey in Cornell Univ. Agric. Exp. Sta. Bull. 67: 189 (1894) **''Brassica napiformis var. multisecta'' A.I.Baranov in Feddes Repert. Spec. Nov. Regni Veg. 63: 286 (1960) **''Brassica nigra var. japonica'' (Thunb.) O.E.Schulz in H.G.A.Engler (ed.), Pflanzenr., IV, 105(70): 79 (1919) **''Brassica oleracea var. taquetii'' H.Lév. & Vaniot in Repert. Spec. Nov. Regni Veg. 8: 259 (1910) **''Brassica richeri'' Lange in G.C.Oeder & auct. suc. (eds.), Fl. Dan.: t. 2658 (1861) **''Brassica rugosa'' (Roxb.) Prain in Bengal Pl. 1: 220 (1903) **''Brassica taquetii'' (H.Lév. & Vaniot) H.Lév. in Repert. Spec. Nov. Regni Veg. 10: 349 (1912) **''Brassica urbaniana'' O.E.Schulz in I.Urban, Symb. Antill. 3: 511 (1903) **''Brassica willdenovii'' Boiss. in Ann. Sci. Nat., Bot., sér. 2, 17: 88 (1842) **''Rhamphospermum volgense'' Andrz. ex Rupr. in Fl. Ingrica: 97 (1860) **''Sinapis cernua'' Thunb. in J.A.Murray (ed.), Syst. Veg., ed. 14.: 602 (1784) **''Sinapis chinensis'' L. in Mant. Pl.: 95 (1767) **''Sinapis cuneifolia'' Roxb. in Fl. Ind., ed. 1832. 3: 121 (1832) **''Sinapis integrifolia'' H.West in Bidr. Beskr. Ste Croix: 296 (1793) **''Sinapis integrifolia var. chevalieri'' Portères in Rev. Bot. Appl. Agric. Trop. 15: 1120 (1935) **''Sinapis japonica'' Thunb. in J.A.Murray (ed.), Syst. Veg., ed. 14.: 602 (1784) **''Sinapis juncea var. napiformis'' Pailleux & Bois in Potag. Cur., ed. 2: 372 (1892) **''Sinapis lanceolata'' DC. in Syst. Nat. 2: 611 (1821) **''Sinapis oleracea'' C.Presl in J.S.Presl & C.B.Presl, Delic. Prag.: 18 (1822) **''Sinapis patens'' Roxb. in Fl. Ind., ed. 1832. 3: 124 (1832) **''Sinapis ramosa'' Roxb. in Asiat. Res. 11: 179 (1810) **''Sinapis rugosa'' Roxb. in Fl. Ind., ed. 1832. 3: 122 (1832) **''Sinapis sinensis'' J.F.Gmel. in Syst. Nat., ed. 13[bis].: 989 (1792) **''Sinapis tenella'' Moench in Methodus: 253 (1794) **''Sinapis timoriana'' DC. in Syst. Nat. 2: 616 (1821)<br> Note: This species is a common cultigen and wildflower found in many countries (see POWO), but whose genetic origins is the Caucasus. =={{int:References}}== ==={{int:Primary references}}=== {{Z.H.Feng et al., 2024}} ==={{int:Additional references}}=== * {{Czern.}}, 1859. ''[[Conspectus Plantarum circa Charcoviam et in Ucrania sponte cresentium et vulgo cultarum]]'' 8. 1859 Mar (E. Cosson, Bull. Soc. Bot. France 6(8):609. 1860 Jan) ==={{int:Links}}=== {{POWO|2026|Oct|22}} {{Catol-Hassler|2026|Oct.|22}} {{BRBA|2026|May|20}} {{IPNI||2026|May 20}} {{MBG|2026|May|20}} {{ITIS|23059|''Brassica juncea'' (L.) Czern.}} =={{int:Vernacular names}}== {{VN |de=Brauner Senf, Indischer Senf, Sareptasenf, Ruten-Kohl |en=Indian Mustard, Mustard Greens, Leaf Mustard |fi=Sareptansinappi |fr=Moutarde Brune, Moutarde Chinoise |it= Senape indiana |nl=Sareptamosterd |ja=カラシナ(芥子菜), セイヨウカラシナ(西洋芥子菜) |pl=Kapusta Sitowata |ru=Горчица сарептская, или Горчица русская, или Горчица сизая |sv=Sarepsasenap |tr=Hint hardalı |te=ఆవాలు |uk=Гірчиця салатна, Гірчиця листова, Гірчиця сарепська |zh=芥菜 |pa=ਸਰ੍ਹੋਂ }} {{Commonscat}} {{Taxonbar|from=Q504781}} [[Category:Vassiliĭ Matveievitch Czernajew taxa]] b2hw1tv3c50ohinb00iv40m1d7aytnw Benjamin Daydon Jackson 0 88797 11322495 10399294 2026-10-22T00:51:45Z The editor 2345 2915305 11322495 wikitext text/x-wiki {{Image}} '''Benjamin Daydon Jackson''' (1846–1927), English botanist. {{IPNI standard form|B.D.Jacks.}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Jackson, 1893}} {{Jackson, 1893a}} {{Jackson, 1894}} {{Jackson, 1895}} {{Durand & Jackson, 1906}} {{Authority control}} {{DEFAULTSORT:Jackson, Benjamin Daydon}} [[Category:Taxon authorities]] [[Category:Botanists]] 9d3d5psax619tr2yfeterlgypef5nh2 Juglans australis 0 93203 11322157 10197393 2026-10-21T17:57:45Z RLJ 134478 11322157 wikitext text/x-wiki {{Image|Walnut-tree 20041012 2599.JPG}} =={{int:Taxonavigation}}== {{Juglans}} Species: ''[[Juglans australis]]'' =={{int:Name}}== ''Juglans australis'' {{a|Griseb.}}, Abh. Königl. Ges. Wiss. Göttingen 24: 97 (1879). ==={{int:Synonyms}}=== {{HET}} ** ''Juglans brasiliensis'' {{a|Dode}}, Bull. Soc. Dendr. France, 209 (1909). {{Nadi| * '''Continental: Southern America ''' ** '''Regional: Southern South America ''' *** Argentina (Jujuy, Salta) ** '''Regional: Western South America ''' *** Bolivia (Chuquisaca, Santa Cruz, Tarija) }} =={{int:References}}== ==={{int:Primary references}}=== {{Grisebach, 1879}} ==={{int:Additional references}}=== {{Zuloaga & Belgrano, 2017}} ==={{int:Links}}=== {{POWO|2022|Mar|02}} {{Catol-Hassler|2022|Mar|02}} {{MBG|2022|Mar|02}} {{IPNI||2022|Mar 02}} {{GRIN||20724|2022 Mar 02}} =={{int:Vernacular names}}== {{VN |en=Nogal austral |es=Nogal de monte }} {{Taxonbar|from=Q668879}} [[Category:August Heinrich Rudolf Grisebach taxa]] rfqhg7t8pd2044f0g5yjxdl61kcwabc Juglans californica 0 93206 11322314 9386363 2026-10-21T20:21:12Z RLJ 134478 11322314 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Juglans}} Species: ''[[Juglans californica]]'' =={{int:Name}}== ''Juglans californica'' {{a|S.Watson}}, Proc. Amer. Acad. Arts 10: {{BHL|page/3077042|349}} (1875). {{nadi| * {{grey|'''Continental: Asia-Temperate''' (introduced)}} ** {{grey|'''Regional: Middle Asia'''}} *** {{grey|Tadzhikistan.}} ** {{grey|'''Regional: Caucasus'''}} *** {{grey|North Caucasus, Transcaucasus.}} * '''Continental: Northern America''' ** '''Regional: Southwestern U.S.A.''' *** California. ** {{grey|'''Regional: Mexico'''}} *** {{grey|Mexico Northwest (introduced).}} }} =={{int:References}}== ==={{int:Primary references}}=== {{Watson, 1875}} ==={{int:Additional references}}=== {{FNA, 1997}} ==={{int:Links}}=== {{POWO|2022|Mar|02}} {{Catol-Hassler|2022|Mar|02}} {{MBG|2022|Mar|02}} {{IPNI||2022|Mar 02}} {{GRIN||20728|2022 Mar 02}} =={{int:Vernacular names}}== {{VN |en=California Walnut |uk=Горіх каліфорнійський }} {{Commonscat}} {{Taxonbar}} [[Category:Sereno Watson taxa]] 3cedmxedu9hvr7d64wu0m8xnzsi08fo 11322960 11322314 2026-10-22T10:23:51Z RLJ 134478 11322960 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Juglans}} Species: ''[[Juglans californica]]'' =={{int:Name}}== ''Juglans californica'' {{a|S.Watson}}, Proc. Amer. Acad. Arts 10: {{BHL|page/3077042|349}} (1875). {{nadi| * {{grey|'''Continental: Asia-Temperate''' (introduced)}} ** {{grey|'''Regional: Middle Asia'''}} *** {{grey|Tadzhikistan.}} ** {{grey|'''Regional: Caucasus'''}} *** {{grey|North Caucasus, Transcaucasus.}} * '''Continental: Northern America''' ** '''Regional: Southwestern U.S.A.''' *** California. ** {{grey|'''Regional: Mexico'''}} *** {{grey|Mexico Northwest (introduced).}} }} =={{int:References}}== ==={{int:Primary references}}=== {{Watson, 1875}} ==={{int:Additional references}}=== {{FNA, 1997|{{Whittem.}} & {{D.E.Stone}}|Juglans|425–428|116860}} ==={{int:Links}}=== {{POWO|2022|Mar|02}} {{Catol-Hassler|2022|Mar|02}} {{MBG|2022|Mar|02}} {{IPNI||2022|Mar 02}} {{GRIN||20728|2022 Mar 02}} =={{int:Vernacular names}}== {{VN |en=California Walnut |uk=Горіх каліфорнійський }} {{Commonscat}} {{Taxonbar}} [[Category:Sereno Watson taxa]] tqiifn8ph79sz68g7zhztg103r97510 Natalianira 0 94300 11322218 10058877 2026-10-21T18:41:36Z Neferkheperre 947633 11322218 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Natalianira}} Species: {{sp|N|atalianira|bicornuta}} {{sp|N|atalianira|megalocera}} {{splast|N|atalianira|spinosa}} =={{int:Name}}== ''Natalianira'' {{a|Brian Frederick Kensley|Kensley}}, 1984 {{int:Type species}}: ''[[Natalianira spinosa]]'' {{aut|Kensley}}, 1984, by original designation =={{int:References}}== *{{aut|Kensley, B.}} (1984) The South African Museum's Meiring Naude cruises. Part 15. Marine Isopoda of the 1977, 1978, 1979 cruises. ''Annals of the South African Museum'' 93 (4): 213–301. {{López, Roccatagliata & Doti, 2026}} {{Taxonbar|from=Q15941932}} [[Category:Brian Frederick Kensley taxa]] 1zvcsrr0zjdknstnd9pztrsbufmqug7 Cyperus 0 102245 11321992 11043302 2026-10-21T13:08:34Z ~2026-56281-11 3040660 /* {{int:Name}} */ Klammer zugefügt 11321992 wikitext text/x-wiki {{Image|Cyperus odoratus 2.jpg|300|''[[Cyperus odoratus]]''}} =={{int:Taxonavigation}}== {{Cyperus}} === Species === {{TOCcompact1}} ====a==== {{sp|C|yperus|abietinus}} {{sp|C|yperus|absconditicoronatus}} {{sp|C|yperus|acaulescens}} {{sp|C|yperus|acholiensis}} {{sp|C|yperus|acuminatus}} {{sp|C|yperus|acuticarinatus}} {{sp|C|yperus|aethiops}} {{sp|C|yperus|affinis}} {{sp|C|yperus|africanus}} {{sp|C|yperus|afro-occidentalis}} {{sp|C|yperus|afroalpinus}} {{sp|C|yperus|afrodunensis}} {{sp|C|yperus|afromontanus}} {{sp|C|yperus|afropumilus}} {{sp|C|yperus|afrorobustus}} {{sp|C|yperus|afrovaricus}} {{sp|C|yperus|aggregatus}} {{sp|C|yperus|ajax}} {{sp|C|yperus|alaticaulis}} {{sp|C|yperus|alatus}} {{sp|C|yperus|albescens}} {{sp|C|yperus|albopilosus}} {{sp|C|yperus|albopurpureus}} {{sp|C|yperus|albosanguineus}} {{sp|C|yperus|albostriatus}} {{sp|C|yperus|albus}} {{sp|C|yperus|algeriensis}} {{sp|C|yperus|almensis}} {{sp|C|yperus|alopecuroides}} {{sp|C|yperus|alterniflorus}} {{sp|C|yperus|alternifolius}} {{sp|C|yperus|altochrysocephalus}} {{sp|C|yperus|altomicroglumis}} {{sp|C|yperus|altsonii}} {{sp|C|yperus|alulatus}} {{sp|C|yperus|alvesii}} {{sp|C|yperus|amabilis}} {{sp|C|yperus|amauropus}} {{sp|C|yperus|amuricus}} {{sp|C|yperus|anderssonii}} {{sp|C|yperus|angolensis}} {{sp|C|yperus|angustatus}} {{sp|C|yperus|anisitsii}} {{sp|C|yperus|ankaizinensis}} {{sp|C|yperus|ankaratrensis}} {{sp|C|yperus|antillanus}} {{sp|C|yperus|appendiculatus}} {{sp|C|yperus|appendiculatus}} {{sp|C|yperus|appendiculatus}} {{sp|C|yperus|appendiculatus}} {{sp|C|yperus|aquatilis}} {{sp|C|yperus|arenarius}} {{sp|C|yperus|aristulatus}} {{sp|C|yperus|armstrongii}} {{sp|C|yperus|aromaticus}} {{sp|C|yperus|arsenei}} {{sp|C|yperus|articulatus}} {{sp|C|yperus|assimilis}} {{sp|C|yperus|astartodes}} {{sp|C|yperus|aster}} {{sp|C|yperus|aterrimus}} {{sp|C|yperus|atkinsonii}} {{sp|C|yperus|atractocarpus}} {{sp|C|yperus|atriceps}} {{sp|C|yperus|aucheri}} {{sp|C|yperus|aureoalatus}} {{sp|C|yperus|aureobrunneus}} {{sp|C|yperus|auriculatus}} {{sp|C|yperus|aurifer}} {{sp|C|yperus|austroafricanus}} {{splast|C|yperus|austrochrysanthus}} ====b==== {{sp|C|yperus|babakan}} {{sp|C|yperus|balfourii}} {{sp|C|yperus|baobab}} {{sp|C|yperus|baoulensis}} {{sp|C|yperus|baronii}} {{sp|C|yperus|bellus}} {{sp|C|yperus|benadirensis}} {{sp|C|yperus|bernieri}} {{sp|C|yperus|berroi}} {{sp|C|yperus|betafensis}} {{sp|C|yperus|betchei}} {{sp|C|yperus|beyrichii}} {{sp|C|yperus|bifolius}} {{sp|C|yperus|bipartitus}} {{sp|C|yperus|blakeanus}} {{sp|C|yperus|blepharoleptos}} {{sp|C|yperus|blysmoides}} {{sp|C|yperus|boreobellus}} {{sp|C|yperus|boreochrysocephalus}} {{sp|C|yperus|boreohemisphaericus}} {{sp|C|yperus|bowmanni}} {{sp|C|yperus|bracheilema}} {{sp|C|yperus|breedlovei}} {{sp|C|yperus|breviculmis}} {{sp|C|yperus|brevifolioides}} {{sp|C|yperus|brevifolius}} {{sp|C|yperus|brumadoi}} {{sp|C|yperus|brunneofibrosus}} {{sp|C|yperus|brunnescens}} {{sp|C|yperus|brunneus}} {{sp|C|yperus|bulbosus}} {{splast|C|yperus|burkartii}} ====c==== {{sp|C|yperus|caesius}} {{sp|C|yperus|calderoniae}} {{sp|C|yperus|camphoratus}} {{sp|C|yperus|cancrorum}} {{sp|C|yperus|canus}} {{sp|C|yperus|capensis}} {{sp|C|yperus|capitatus}} {{sp|C|yperus|carinatus}} {{sp|C|yperus|castaneobellus}} {{sp|C|yperus|castaneus}} {{sp|C|yperus|cearaensis}} {{sp|C|yperus|celans}} {{sp|C|yperus|cellulosoreticulatus}} {{sp|C|yperus|centralis}} {{sp|C|yperus|cephalanthus}} {{sp|C|yperus|cephalotes}} {{sp|C|yperus|chaetophyllus}} {{sp|C|yperus|chalaranthus}} {{sp|C|yperus|chamaecephalus}} {{sp|C|yperus|chermezonianus}} {{sp|C|yperus|chersinus}} {{sp|C|yperus|chevalieri}} {{sp|C|yperus|chinsalensis}} {{sp|C|yperus|chionocephalus}} {{sp|C|yperus|chlorocephalus}} {{sp|C|yperus|chordorrhizus}} {{sp|C|yperus|chorisanthus}} {{sp|C|yperus|chrysocephalus}} {{sp|C|yperus|ciliatus}} {{sp|C|yperus|cinereobrunneus}} {{sp|C|yperus|clandestinus}} {{sp|C|yperus|clarkei}} {{sp|C|yperus|clarus}} {{sp|C|yperus|clavinux}} {{sp|C|yperus|columbiensis}} {{sp|C|yperus|colymbetes}} {{sp|C|yperus|commixtus}} {{sp|C|yperus|compactus}} {{sp|C|yperus|compressus}} {{sp|C|yperus|concinnus}} {{sp|C|yperus|confertus}} {{sp|C|yperus|congensis}} {{sp|C|yperus|congestus}} {{sp|C|yperus|conglomeratus}} {{sp|C|yperus|conicus}} {{sp|C|yperus|consors}} {{sp|C|yperus|constanzae}} {{sp|C|yperus|coriifolius}} {{sp|C|yperus|cornelii-ostenii}} {{sp|C|yperus|correllii}} {{sp|C|yperus|corymbosus}} {{sp|C|yperus|costaricensis}} {{sp|C|yperus|cracens}} {{sp|C|yperus|crassipes}} {{sp|C|yperus|cremeomariscus}} {{sp|C|yperus|crispulus}} {{sp|C|yperus|cristulatus}} {{sp|C|yperus|croceus}} {{sp|C|yperus|cruentus}} {{sp|C|yperus|crypsoides}} {{sp|C|yperus|cundudoensis}} {{sp|C|yperus|cunninghamii}} {{sp|C|yperus|cunninghamii}} {{sp|C|yperus|cunninghamii}} {{sp|C|yperus|cunninghamii}} {{sp|C|yperus|curvistylis}} {{sp|C|yperus|cuspidatus}} {{sp|C|yperus|cylindrostachyus}} {{sp|C|yperus|cymulosus}} {{sp|C|yperus|cyperinus}} {{sp|C|yperus|cyperoides}} {{splast|C|yperus|cyprius}} ====d==== {{sp|C|yperus|dactyliformis}} {{sp|C|yperus|dactylotes}} {{sp|C|yperus|davidsei}} {{sp|C|yperus|debilis}} {{sp|C|yperus|debilissimus}} {{sp|C|yperus|deciduus}} {{sp|C|yperus|decompositus}} {{sp|C|yperus|decurvatus}} {{sp|C|yperus|densibulbosus}} {{sp|C|yperus|dentatus}} {{sp|C|yperus|dentoniae}} {{sp|C|yperus|denudatus}} {{sp|C|yperus|derreilema}} {{sp|C|yperus|diamantinus}} {{sp|C|yperus|diandrus}} {{sp|C|yperus|diaphanus}} {{sp|C|yperus|dichromeniformis}} {{sp|C|yperus|dichromus}} {{sp|C|yperus|dichrostachyus}} {{sp|C|yperus|dietrichiae}} {{sp|C|yperus|difformis}} {{sp|C|yperus|diffusus}} {{sp|C|yperus|digitatus}} {{sp|C|yperus|dilatatus}} {{sp|C|yperus|dioicus}} {{sp|C|yperus|dipsaceus}} {{sp|C|yperus|disjunctus}} {{sp|C|yperus|distans}} {{sp|C|yperus|distinctus}} {{sp|C|yperus|diurensis}} {{sp|C|yperus|dives}} {{sp|C|yperus|diwakarii}} {{sp|C|yperus|drakensbergensis}} {{sp|C|yperus|dregeanus}} {{sp|C|yperus|drummondii}} {{sp|C|yperus|dubius}} {{sp|C|yperus|duclouxii}} {{sp|C|yperus|dunensis}} {{sp|C|yperus|duripes}} {{splast|C|yperus|durus}} ====e==== {{sp|C|yperus|eboracensis}} {{sp|C|yperus|echinatus}} {{sp|C|yperus|eglobosus}} {{sp|C|yperus|ekmanii}} {{sp|C|yperus|elatus}} {{sp|C|yperus|elegans}} {{sp|C|yperus|elegantulus}} {{sp|C|yperus|elephantinus}} {{sp|C|yperus|engelmannii}} {{sp|C|yperus|endlichii}} {{sp|C|yperus|enervis}} {{sp|C|yperus|entrerianus}} {{sp|C|yperus|ephemerus}} {{sp|C|yperus|eragrostis}} {{sp|C|yperus|erectus}} {{sp|C|yperus|eremicus}} {{sp|C|yperus|erinaceus}} {{sp|C|yperus|erythrorhizos}} {{sp|C|yperus|esculentus}} {{sp|C|yperus|exaltatus}} {{splast|C|yperus|expansus}} ====f==== {{sp|C|yperus|fastigiatus}} {{sp|C|yperus|fauriei}} {{sp|C|yperus|feani}} {{sp|C|yperus|felipponei}} {{sp|C|yperus|fendlerianus}} {{sp|C|yperus|ferrugineoviridis}} {{sp|C|yperus|fertilis}} {{sp|C|yperus|filicinus}} {{sp|C|yperus|filiculmis}} {{sp|C|yperus|filifolius}} {{sp|C|yperus|filiformis}} {{sp|C|yperus|filipes}} {{sp|C|yperus|fischerianus}} {{sp|C|yperus|fissus}} {{sp|C|yperus|flaccidus}} {{sp|C|yperus|flavescens}} {{sp|C|yperus|flavidus}} {{sp|C|yperus|flavoculmis}} {{sp|C|yperus|flexuosus}} {{sp|C|yperus|floribundus}} {{sp|C|yperus|floridanus}} {{sp|C|yperus|foliaceus}} {{sp|C|yperus|forskalianus}} {{sp|C|yperus|friburgensis}} {{sp|C|yperus|fucosus}} {{sp|C|yperus|fulgens}} {{sp|C|yperus|fuligineus}} {{sp|C|yperus|fulvoalbescens}} {{sp|C|yperus|fulvus}} {{sp|C|yperus|fuscescens}} {{sp|C|yperus|fuscovaginatus}} {{splast|C|yperus|fuscus}} ====g==== {{sp|C|yperus|gardneri}} {{sp|C|yperus|gayi}} {{sp|C|yperus|giganteus}} {{sp|C|yperus|gigantobulbes}} {{sp|C|yperus|gilesii}} {{sp|C|yperus|glaber}} {{sp|C|yperus|glaucophyllus}} {{sp|C|yperus|glomeratus}} {{sp|C|yperus|graciliculmis}} {{sp|C|yperus|gracilis}} {{sp|C|yperus|granatensis}} {{sp|C|yperus|grandibulbosus}} {{sp|C|yperus|grandifolius}} {{sp|C|yperus|grandis}} {{sp|C|yperus|grandisimplex}} {{sp|C|yperus|granitophilus}} {{sp|C|yperus|grayi}} {{sp|C|yperus|grayioides}} {{sp|C|yperus|grossianus}} {{sp|C|yperus|guatemalensis}} {{sp|C|yperus|gubanii}} {{sp|C|yperus|guianensis}} {{sp|C|yperus|gunnii}} {{sp|C|yperus|gymnocaulos}} {{sp|C|yperus|gypsophilus}} {{splast|C|yperus|gyraudinii}} ====h==== {{sp|C|yperus|haematocephalus}} {{sp|C|yperus|hainanensis}} {{sp|C|yperus|hakonensis}} {{sp|C|yperus|hamulosus}} {{sp|C|yperus|harrisii}} {{sp|C|yperus|haspan}} {{sp|C|yperus|hayesii}} {{sp|C|yperus|helferi}} {{sp|C|yperus|hemisphaericus}} {{sp|C|yperus|hensii}} {{sp|C|yperus|hermaphroditus}} {{sp|C|yperus|hesperius}} {{sp|C|yperus|heterocladus}} {{sp|C|yperus|hieronymi}} {{sp|C|yperus|hilairenus}} {{sp|C|yperus|hilgendorfianus}} {{sp|C|yperus|hillebrandii}} {{sp|C|yperus|hirtellus}} {{sp|C|yperus|holoschoenus}} {{sp|C|yperus|holostigma}} {{sp|C|yperus|holstii}} {{sp|C|yperus|hortensis}} {{sp|C|yperus|houghtonii}} {{sp|C|yperus|humilis}} {{sp|C|yperus|hyalinus}} {{sp|C|yperus|hypochlorus}} {{sp|C|yperus|hypopitys}} {{splast|C|yperus|hystricinus}} ====i==== {{sp|C|yperus|imbecillis}} {{sp|C|yperus|imbricatus}} {{sp|C|yperus|impolitus}} {{sp|C|yperus|impubes}} {{sp|C|yperus|inaequalis}} {{sp|C|yperus|incompressus}} {{sp|C|yperus|incomtus}} {{sp|C|yperus|indecorus}} {{sp|C|yperus|indecorus}} {{sp|C|yperus|indecorus}} {{sp|C|yperus|indecorus}} {{sp|C|yperus|infucatus}} {{sp|C|yperus|inops}} {{sp|C|yperus|insularis}} {{sp|C|yperus|intricatus}} {{sp|C|yperus|iria}} {{sp|C|yperus|isabellinus}} {{sp|C|yperus|ischnos}} {{sp|C|yperus|ivohibensis}} {{splast|C|yperus|ixiocarpus}} ====j==== {{sp|C|yperus|javanicus}} {{sp|C|yperus|jeminicus}} {{splast|C|yperus|juncelliformis}} ====k==== {{sp|C|yperus|kabarensis}} {{sp|C|yperus|kaessneri}} {{sp|C|yperus|kamtschaticus}} {{sp|C|yperus|kappleri}} {{sp|C|yperus|karisimbiensis}} {{sp|C|yperus|karlschumannii}} {{sp|C|yperus|karthikeyanii}} {{sp|C|yperus|kasamensis}} {{sp|C|yperus|kerstenii}} {{sp|C|yperus|kibweanus}} {{sp|C|yperus|kilimandscharicus}} {{sp|C|yperus|kipasensis}} {{sp|C|yperus|kirkii}} {{sp|C|yperus|kituiensis}} {{sp|C|yperus|koyaliensis}} {{sp|C|yperus|kurzii}} {{sp|C|yperus|kwaleensis}} {{sp|C|yperus|kyllingiella}} {{splast|C|yperus|kyllingiformis}} ====l==== {{sp|C|yperus|lacunosus}} {{sp|C|yperus|lacustris}} {{sp|C|yperus|laeteflorens}} {{sp|C|yperus|laetus}} {{sp|C|yperus|laevigatus}} {{sp|C|yperus|laevis}} {{sp|C|yperus|lancastriensis}} {{sp|C|yperus|lanceolatus}} {{sp|C|yperus|lateriticus}} {{sp|C|yperus|latifolius}} {{sp|C|yperus|latzii}} {{sp|C|yperus|laxiflorus}} {{sp|C|yperus|laxispicatus}} {{sp|C|yperus|laxus}} {{sp|C|yperus|lecontei}} {{sp|C|yperus|leiocaulon}} {{sp|C|yperus|lentiginosus}} {{sp|C|yperus|leptocarpus}} {{sp|C|yperus|leptocladus}} {{sp|C|yperus|leucocephalus}} {{sp|C|yperus|lhotskyanus}} {{sp|C|yperus|ligularis}} {{sp|C|yperus|limiticola}} {{sp|C|yperus|limosus}} {{sp|C|yperus|linearispiculatus}} {{sp|C|yperus|lipocarphioides}} {{sp|C|yperus|locuples}} {{sp|C|yperus|longi-involucratus}} {{sp|C|yperus|longifolius}} {{sp|C|yperus|longispicula}} {{sp|C|yperus|longistylus}} {{sp|C|yperus|longus}} {{sp|C|yperus|lucidus}} {{sp|C|yperus|luerssenii}} {{sp|C|yperus|lundellii}} {{sp|C|yperus|lupulinus}} {{sp|C|yperus|luteus}} {{splast|C|yperus|luzulae}} ====m==== {{sp|C|yperus|macer}} {{sp|C|yperus|macropachycephalus}} {{sp|C|yperus|macrophyllus}} {{sp|C|yperus|macrorrhizus}} {{sp|C|yperus|maculatus}} {{sp|C|yperus|maderaspatanus}} {{sp|C|yperus|majungensis}} {{sp|C|yperus|malaccensis}} {{sp|C|yperus|malawicus}} {{sp|C|yperus|mangorensis}} {{sp|C|yperus|manimae}} {{sp|C|yperus|mapanioides}} {{sp|C|yperus|maranguensis}} {{sp|C|yperus|margaritaceus}} {{sp|C|yperus|marginatus}} {{sp|C|yperus|marlothii}} {{sp|C|yperus|marojejyensis}} {{sp|C|yperus|marquisensis}} {{sp|C|yperus|matagoroensis}} {{sp|C|yperus|matudae}} {{sp|C|yperus|mauretaniensis}} {{sp|C|yperus|medusaeus}} {{sp|C|yperus|meeboldii}} {{sp|C|yperus|megalanthus}} {{sp|C|yperus|meistostylus}} {{sp|C|yperus|melanospermus}} {{sp|C|yperus|meridionalis}} {{sp|C|yperus|meyenianus}} {{sp|C|yperus|meyerianus}} {{sp|C|yperus|michelianus}} {{sp|C|yperus|michoacanensis}} {{sp|C|yperus|micrantherus}} {{sp|C|yperus|microaureus}} {{sp|C|yperus|microbolbos}} {{sp|C|yperus|microbrunneus}} {{sp|C|yperus|microcephalus}} {{sp|C|yperus|microcristatus}} {{sp|C|yperus|microglumis}} {{sp|C|yperus|microiria}} {{sp|C|yperus|micromariscus}} {{sp|C|yperus|micromedusaeus}} {{sp|C|yperus|micropelophilus}} {{sp|C|yperus|microumbellatus}} {{sp|C|yperus|miliifolius}} {{sp|C|yperus|mindorensis}} {{sp|C|yperus|mirus}} {{sp|C|yperus|mitis}} {{sp|C|yperus|mogadoxensis}} {{sp|C|yperus|molliglumis}} {{sp|C|yperus|mollipes}} {{sp|C|yperus|monospermus}} {{sp|C|yperus|moutona}} {{sp|C|yperus|mudugensis}} {{sp|C|yperus|multifolius}} {{sp|C|yperus|multinervatus}} {{sp|C|yperus|multispicatus}} {{sp|C|yperus|multispiceus}} {{sp|C|yperus|mundulus}} {{sp|C|yperus|muniziae}} {{sp|C|yperus|mutisii}} {{sp|C|yperus|mwinilungensis}} {{splast|C|yperus|myrmecias}} ====n==== {{sp|C|yperus|nanellus}} {{sp|C|yperus|nanus}} {{sp|C|yperus|natalensis}} {{sp|C|yperus|nayaritensis}} {{sp|C|yperus|nduru}} {{sp|C|yperus|nemoralis}} {{sp|C|yperus|neoguinensis}} {{sp|C|yperus|neokunthianus}} {{sp|C|yperus|neotropicalis}} {{sp|C|yperus|nervosostriatus}} {{sp|C|yperus|niger}} {{sp|C|yperus|nigrofuscus}} {{sp|C|yperus|niigatensis}} {{sp|C|yperus|nipponicus}} {{sp|C|yperus|niveoides}} {{sp|C|yperus|niveus}} {{sp|C|yperus|noeanus}} {{sp|C|yperus|nutans}} {{sp|C|yperus|nyasensis}} {{splast|C|yperus|nyererei}} ====o==== {{sp|C|yperus|obbiadensis}} {{sp|C|yperus|oblongoincrassatus}} {{sp|C|yperus|obtusatus}} {{sp|C|yperus|obtusus}} {{sp|C|yperus|ochraceus}} {{sp|C|yperus|odoratus}} {{sp|C|yperus|ohwii}} {{sp|C|yperus|okavangensis}} {{sp|C|yperus|onerosus}} {{sp|C|yperus|orgadophilus}} {{sp|C|yperus|ornatus}} {{sp|C|yperus|orthostachyus}} {{sp|C|yperus|ossicaulis}} {{sp|C|yperus|ovatus}} {{sp|C|yperus|owanii}} {{sp|C|yperus|oxycarpus}} {{splast|C|yperus|oxylepis}} ====p==== {{sp|C|yperus|pachycephalus}} {{sp|C|yperus|pachyrhizus}} {{sp|C|yperus|pacificus}} {{sp|C|yperus|palianparaiensis}} {{sp|C|yperus|pallidicolor}} {{sp|C|yperus|palmatus}} {{sp|C|yperus|panamensis}} {{sp|C|yperus|pandanophyllum}} {{sp|C|yperus|pangorei}} {{sp|C|yperus|paniceus}} {{sp|C|yperus|pannonicus}} {{sp|C|yperus|paolii}} {{sp|C|yperus|papyrus}} {{sp|C|yperus|parishii}} {{sp|C|yperus|pearcei}} {{sp|C|yperus|pectinatus}} {{sp|C|yperus|pedunculatus}} {{sp|C|yperus|pedunculosus}} {{sp|C|yperus|pendulus}} {{sp|C|yperus|penicillatus}} {{sp|C|yperus|pennatiformis}} {{sp|C|yperus|pennellii}} {{sp|C|yperus|pentabracteatus}} {{sp|C|yperus|penzoanus}} {{sp|C|yperus|perangustus}} {{sp|C|yperus|perennis}} {{sp|C|yperus|permacer}} {{sp|C|yperus|pernambucensis}} {{sp|C|yperus|perrieri}} {{sp|C|yperus|pertenuis}} {{sp|C|yperus|phaeolepis}} {{sp|C|yperus|phillipsiae}} {{sp|C|yperus|phleoides}} {{sp|C|yperus|picardae}} {{sp|C|yperus|pilosulus}} {{sp|C|yperus|pilosus}} {{sp|C|yperus|pinetorum}} {{sp|C|yperus|planifolius}} {{sp|C|yperus|plantaginifolius}} {{sp|C|yperus|plateilema}} {{sp|C|yperus|platycaulis}} {{sp|C|yperus|platyphyllus}} {{sp|C|yperus|platystylis}} {{sp|C|yperus|plukenetii}} {{sp|C|yperus|pluribracteatus}} {{sp|C|yperus|pluricephalus}} {{sp|C|yperus|plurinervosus}} {{sp|C|yperus|podocarpus}} {{sp|C|yperus|poecilus}} {{sp|C|yperus|poeppigii}} {{sp|C|yperus|pohlii}} {{sp|C|yperus|polyanthelus}} {{sp|C|yperus|polystachyos}} {{sp|C|yperus|portae-tartari}} {{sp|C|yperus|praemorsus}} {{sp|C|yperus|pratensis}} {{sp|C|yperus|procerus}} {{sp|C|yperus|prolifer}} {{sp|C|yperus|prolixus}} {{sp|C|yperus|psammophilus}} {{sp|C|yperus|pseuderemicus}} {{sp|C|yperus|pseudobrunneus}} {{sp|C|yperus|pseudodistans}} {{sp|C|yperus|pseudokyllingioides}} {{sp|C|yperus|pseudopetiolatus}} {{sp|C|yperus|pseudopilosus}} {{sp|C|yperus|pseudosomaliensis}} {{sp|C|yperus|pseudothyrsiflorus}} {{sp|C|yperus|pseudovegetus}} {{sp|C|yperus|pseudovestitus}} {{sp|C|yperus|pubens}} {{sp|C|yperus|pulchellus}} {{sp|C|yperus|pulcher}} {{sp|C|yperus|pulcherrimus}} {{sp|C|yperus|pulguerensis}} {{sp|C|yperus|pulicaris}} {{sp|C|yperus|purpureoviridis}} {{sp|C|yperus|pustulatus}} {{splast|C|yperus|pycnostachyus}} ====r==== {{sp|C|yperus|radians}} {{sp|C|yperus|ramosus}} {{sp|C|yperus|rapensis}} {{sp|C|yperus|recurvispicatus}} {{sp|C|yperus|redolens}} {{sp|C|yperus|reduncus}} {{sp|C|yperus|reflexus}} {{sp|C|yperus|refractus}} {{sp|C|yperus|regiomontanus}} {{sp|C|yperus|rehmii}} {{sp|C|yperus|remotispicatus}} {{sp|C|yperus|remotus}} {{sp|C|yperus|renschii}} {{sp|C|yperus|retroflexus}} {{sp|C|yperus|retrofractus}} {{sp|C|yperus|retrorsus}} {{sp|C|yperus|rheophyticus}} {{sp|C|yperus|rhynchosporoides}} {{sp|C|yperus|rigens}} {{sp|C|yperus|rigidellus}} {{sp|C|yperus|rigidifolius}} {{sp|C|yperus|robinsonii}} {{sp|C|yperus|rockii}} {{sp|C|yperus|rohlfsii}} {{sp|C|yperus|rotundus}} {{sp|C|yperus|rubicundus}} {{sp|C|yperus|rufostriatus}} {{sp|C|yperus|rupestris}} {{splast|C|yperus|rupicola}} ====s==== {{sp|C|yperus|sahelii}} {{sp|C|yperus|sandwicensis}} {{sp|C|yperus|sanguineoater}} {{sp|C|yperus|sanguinolentus}} {{sp|C|yperus|sartorii}} {{sp|C|yperus|scaber}} {{sp|C|yperus|scabricaulis}} {{sp|C|yperus|scariosus}} {{sp|C|yperus|schaffneri}} {{sp|C|yperus|schimperianus}} {{sp|C|yperus|schinzii}} {{sp|C|yperus|schlechteri}} {{sp|C|yperus|schomburgkianus}} {{sp|C|yperus|schweinfurthii}} {{sp|C|yperus|schweinitzii}} {{sp|C|yperus|sciaphilus}} {{sp|C|yperus|scleropodus}} {{sp|C|yperus|sculptus}} {{sp|C|yperus|secubans}} {{sp|C|yperus|seemannianus}} {{sp|C|yperus|semifertilis}} {{sp|C|yperus|semiochraceus}} {{sp|C|yperus|semitrifidus}} {{sp|C|yperus|sensilis}} {{sp|C|yperus|serotinus}} {{sp|C|yperus|seslerioides}} {{sp|C|yperus|sesquiflorus}} {{sp|C|yperus|setigerus}} {{sp|C|yperus|sexangularis}} {{sp|C|yperus|sexflorus}} {{sp|C|yperus|sharonensis}} {{sp|C|yperus|sharpei}} {{sp|C|yperus|sieberianus}} {{sp|C|yperus|sikkimensis}} {{sp|C|yperus|silletensis}} {{sp|C|yperus|simaoensis}} {{sp|C|yperus|simplex}} {{sp|C|yperus|simpsonii}} {{sp|C|yperus|solidifolius}} {{sp|C|yperus|solidus}} {{sp|C|yperus|somalidunensis}} {{sp|C|yperus|somaliensis}} {{sp|C|yperus|soongoricus}} {{sp|C|yperus|sordidus}} {{sp|C|yperus|soyauxii}} {{sp|C|yperus|spectabilis}} {{sp|C|yperus|sphacelatus}} {{sp|C|yperus|sphaerocephalus}} {{sp|C|yperus|sphaeroideus}} {{sp|C|yperus|sphaerolepis}} {{sp|C|yperus|sphaerospermus}} {{sp|C|yperus|spicigerus}} {{sp|C|yperus|splendens}} {{sp|C|yperus|sporobolus}} {{sp|C|yperus|squarrosus}} {{sp|C|yperus|steadii}} {{sp|C|yperus|stenophyllus}} {{sp|C|yperus|stoloniferus}} {{sp|C|yperus|stradbrokensis}} {{sp|C|yperus|stramineoferrugineus}} {{sp|C|yperus|strigosus}} {{sp|C|yperus|subaequalis}} {{sp|C|yperus|subbadius}} {{sp|C|yperus|subcaracasanus}} {{sp|C|yperus|subcastaneus}} {{sp|C|yperus|subfuscus}} {{sp|C|yperus|submicrolepis}} {{sp|C|yperus|subpapuanus}} {{sp|C|yperus|subparadoxus}} {{sp|C|yperus|subsquarrosus}} {{sp|C|yperus|subtenax}} {{sp|C|yperus|subtenuis}} {{sp|C|yperus|subtilis}} {{sp|C|yperus|subulatus}} {{sp|C|yperus|surinamensis}} {{sp|C|yperus|svensonii}} {{sp|C|yperus|swartzii}} {{splast|C|yperus|szechuanensis}} ====t==== {{sp|C|yperus|tabina}} {{sp|C|yperus|tabularis}} {{sp|C|yperus|tacnensis}} {{sp|C|yperus|tanganyicanus}} {{sp|C|yperus|tanyphyllus}} {{sp|C|yperus|tatandaensis}} {{sp|C|yperus|tempeae}} {{sp|C|yperus|tenax}} {{sp|C|yperus|tenerrimus}} {{sp|C|yperus|tenuiculmis}} {{sp|C|yperus|tenuis}} {{sp|C|yperus|tenuispica}} {{sp|C|yperus|tenuispiculatus}} {{sp|C|yperus|tetracarpus}} {{sp|C|yperus|tetragonus}} {{sp|C|yperus|tetraphyllus}} {{sp|C|yperus|textilis}} {{sp|C|yperus|thomsonii}} {{sp|C|yperus|thorelii}} {{sp|C|yperus|thorncroftii}} {{sp|C|yperus|thunbergii}} {{sp|C|yperus|thyrsiflorus}} {{sp|C|yperus|tomaiophyllus}} {{sp|C|yperus|tonkinensis}} {{sp|C|yperus|trachysanthos}} {{sp|C|yperus|trailii}} {{sp|C|yperus|trialatus}} {{sp|C|yperus|trichodes}} {{sp|C|yperus|trigonellus}} {{sp|C|yperus|trigynus}} {{sp|C|yperus|trinervis}} {{sp|C|yperus|trisulcus}} {{sp|C|yperus|turrialbanus}} {{sp|C|yperus|turrillii}} {{splast|C|yperus|tweediei}} ====u==== {{sp|C|yperus|uitenhagensis}} {{sp|C|yperus|uncinulatus}} {{sp|C|yperus|undulatus}} {{sp|C|yperus|unicolor}} {{sp|C|yperus|unifolius}} {{sp|C|yperus|unispicatus}} {{sp|C|yperus|urbanii}} {{sp|C|yperus|usitatus}} {{splast|C|yperus|ustulatus}} ====v==== {{sp|C|yperus|vaginatus}} {{sp|C|yperus|vandervekenii}} {{sp|C|yperus|varicus}} {{sp|C|yperus|vatkeanus}} {{sp|C|yperus|ventricosus}} {{sp|C|yperus|vestitus}} {{sp|C|yperus|victoriensis}} {{sp|C|yperus|virens}} {{sp|C|yperus|viscidulus}} {{sp|C|yperus|volckmannii}} {{sp|C|yperus|volodia}} {{splast|C|yperus|vorsteri}} ====w==== {{sp|C|yperus|wallichianus}} {{sp|C|yperus|whitmeei}} {{sp|C|yperus|wilburii}} {{splast|C|yperus|wissmannii}} ====x==== {{sp|C|yperus|xanthostachyus}} {{splast|C|yperus|xerophilus}} ====y==== {{splast|C|yperus|yadavii}} ====z==== {{sp|C|yperus|zollingeri}} {{splast|C|yperus|zollingerioides}} ==== Nothospecies: ==== {{sp|C|yperus|× amuricocompressus}} {{sp|C|yperus|× deamii}} {{sp|C|yperus|× insidiosus}} {{sp|C|yperus|× mesochorus}} {{splast|C|yperus|× turbatus}} =={{int:Name}}== ''Cyperus'' {{a|L.}}, Sp. Pl. 1: 44. (1753) * {{tysp|Cyperus esculentus|{{aut|L.}} Sp. Pl. 1: 45. (1753)}} ** Designated by {{aut|Britton}} (1907, ''Bull. Dept. Agric. Jamaica'' 5 (Suppl. 1): 6) ==={{int:Synonyms}}=== {{HET}} ** ''Kyllinga'' Rottb., Descr. Icon. Rar. Pl.: 12 (1773), [[nom. cons.]] ** ''Remirea'' Aubl., Hist. Pl. Guiane 1: 44 (1775) ** ''Thryocephalon'' J.R.Forst. & {{aut|G.Forst.}}, Char. Gen. Pl.: 129 (1776) ** ''Mariscus'' Gaertn., Fruct. Sem. Pl. 1: 11 (1788), [[{{NIL}}]] ** ''Opetiola'' Gaertn., Fruct. Sem. Pl. 1: 14 (1788) ** ''Adupla'' {{aut|Bosc}} ex Juss. in G.-F.Cuvier, Dict. Sci. Nat. 1: 263 (1804) ** ''Hypaelyptum'' Vahl, Enum. Pl. Obs. 2: 283 (1805), [[nom. rej.]] ** ''Mariscus'' Vahl, Enum. Pl. Obs. 2: 372 (1805), [[nom. cons.]] ** ''Papyrus'' {{aut|Willd.}}, Abh. Königl. Akad. Wiss. Berlin 1812-1813: 70 (1812) ** ''Pycreus'' P.Beauv., Fl. Oware 2: 48 (1816) ** ''Lipocarpha'' {{aut|R.Br.}} in J.H.Tuckey, Narr. Exped. Zaire: 459 (1818) ** ''Distimus'' {{aut|Raf.}}, J. Phys. Chim. Hist. Nat. Arts 89: 105 (1819) ** ''Killinga'' T.Lestib., Essai Cypér.: 28 (1819) ** ''Torreya'' {{aut|Raf.}}, J. Phys. Chim. Hist. Nat. Arts 89: 105 (1819), [[{{NIL}}]] ** ''Epiphystis'' Trin., Fund. Agrost.: 97 (1820) ** ''Torulinium'' {{aut|Desv.}} ex Ham., Prodr. Pl. Ind. Occid.: 15 (1825) ** ''Anosporum'' Nees, Linnaea 9: 287 (1834) ** ''Courtoisia'' Nees, Linnaea 9: 286 (1834), [[{{NIL}}]] ** ''Hemicarpha'' Nees, Linnaea 9: 287 (1834) ** ''Platylepis'' {{aut|Kunth}}, Enum. Pl. 2: 269 (1837), [[{{NIL}}]] ** ''Diclidium'' Schrad. ex Nees in {{aut|C.F.P.von Martius}} & auct. suc. (eds.), Fl. Bras. 2(1): 51 (1842) ** ''Oxycaryum'' Nees in {{aut|C.F.P.von Martius}} & auct. suc. (eds.), Fl. Bras. 2(1): 90 (1842) ** ''Pterachne'' Schrad. ex Nees in {{aut|C.F.P.von Martius}} & auct. suc. (eds.), Fl. Bras. 2(1): 62 (1842), [[nom. inval.]] ** ''Pterogyne'' Schrad. ex Nees in {{aut|C.F.P.von Martius}} & auct. suc. (eds.), Fl. Bras. 2(1): nota (1842), [[nom. inval.]] ** ''Galilea'' Parl., Fl. Palerm. 1: 297 (1845) ** ''Hydroschoenus'' Zoll. & Moritzi, Syst. Verz.: 95 (1846) ** ''Atomostylis'' {{aut|Steud.}}, Flora 33: 229 (1850) ** ''Cyprolepis'' {{aut|Steud.}}, Flora 33: 229 (1850), [[{{NN}}]] ** ''Pterocyperus'' Opiz, Seznam: 80 (1852) ** ''Sorostachys'' {{aut|Steud.}}, Syn. Pl. Glumac. 2: 71 (1854) ** ''Ascolepis'' Nees ex {{aut|Steud.}}, Syn. Pl. Glumac. 2: 105 (1855). ** ''Borabora'' {{aut|Steud.}}, Syn. Pl. Glumac. 2: 71 (1855) ** ''Lyprolepis'' {{aut|Steud.}}, Syn. Pl. Glumac. 2: 130 (1855) ** ''Trentepohlia'' Boeckeler, Bot. Zeitung (Berlin) 16: 249 (1858) ** ''Crepidocarpus'' {{aut|Klotzsch}} ex Boeckeler, Linnaea 36: 414 (1870) ** ''Ungeria'' Nees ex C.B.Clarke, J. Linn. Soc., Bot. 21: 34 (1884) ** ''Didymia'' Phil., Bot. Jahrb. Syst. 8: 57 (1886) ** ''Cylindrolepis'' Boeckeler, Bot. Centralbl. 39: 75 (1889) ** ''Juncellus'' C.B.Clarke in J.D.Hooker, Fl. Brit. India 6: 594 (1893) ** ''Chlorocyperus'' Rikli, Jahrb. Wiss. Bot. 27: 563 (1895) ** ''Eucyperus'' Rikli, Jahrb. Wiss. Bot. 27: 568 (1895) ** ''Acorellus'' {{aut|Palla}} ex Kneuck., Allg. Bot. Z. Syst. 9: 68 (1903) ** ''Duval-jouvea'' {{aut|Palla}} in W.D.J.Koch, Syn. Deut. Schweiz. Fl., ed. 3, 3: 2555 (1905) ** ''Sphaeromariscus'' E.G.Camus, Notul. Syst. (Paris) 1: 239 (1910) ** ''Queenslandiella'' Domin, Biblioth. Bot. 85: 415 (1915) ** ''Mariscopsis'' Cherm., Bull. Mus. Natl. Hist. Nat. 25: 60 (1919) ** ''Ascopholis'' C.E.C.Fisch., Bull. Misc. Inform. Kew 1931: 104 (1931) ** ''Volkiella'' Merxm. & Czech, Mitt. Bot. Staatssamml. München 8: 317 (1953). ** ''Sphaerocyperus'' Lye, Bot. Not. 125: 214 (1972) ** ''Aliniella'' J.Raynal, Adansonia, n.s., 13: 157 (1973), [[{{NIL}}]] ** ''Rikliella'' J.Raynal, Adansonia, n.s., 13: 154 (1973). ** ''Alinula'' J.Raynal, Adansonia, n.s., 17: 43 (1977) ** ''Marisculus'' Goetgh., Bull. Jard. Bot. Natl. Belg. 47: 444 (1977) ** ''Kyllingiella'' R.W.Haines & Lye, Bot. Not. 131: 176 (1978) ** ''Courtoisina'' Soják, Cas. Nár. Mus., Odd. Prír. 148: 193 (1979 publ. 1980) ** ''Raynalia'' Soják, Cas. Nár. Mus., Odd. Prír. 148: 193 (1979 publ. 1980) ** ''Indocourtoisia'' Bennet & Raizada, Indian Forester 107: 432 (1981), [[{{NIL}}]] ** ''Pseudomariscus'' Rauschert, Taxon 31: 559 (1982), [[{{NIL}}]]<br /> Note: The above circumscription is ''Cyperus'' [[s.l.]] and is not accepted by all authorities, for example eMonocot Team, (2015). =={{int:References}}== * {{LSP1|44}} {{WCSP|2015|June|7}} {{IPNI||2015|June 7}} {{MBG|2015|June|7}} =={{int:Vernacular names}}== {{VN |af=Biesies, Uintjies |ar=سعد |az=Topalaq |be=Сыць |cs=Šáchor |de=Zypergräser |en=Papyrus Sedges, Umbrella Sedges |et=Lõikhein |fi=Sädekaislat |he=גומא |hsb=Cachor |ja=カヤツリグサ属 |ko=사초속 |lt=Viksvuolė |pl=Cibora |ru=Сыть, Циперус |qu=Runtuma |sv=Skärmagssläktet |te=సైపరస్ }} {{Commonscat}} {{Taxonbar|from=Q161224}} rq48qdsorswjremu43gnwrwrl8skx57 Vallonia 0 104671 11322359 9925048 2026-10-21T21:06:15Z Isfisk 2639 11322359 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Vallonia}} Species: {{sp|V|allonia|asiatica}} {{sp|V|allonia|berryi}} {{sp|V|allonia|chimaira}} {{sp|V|allonia|chinensis}} {{sp|V|allonia|costata}} {{sp|V|allonia|cyclophorella}} {{sp|V|allonia|declivis}} {{sp|V|allonia|eiapopeia}} {{sp|V|allonia|enniensis}} {{sp|V|allonia|excentrica}} {{sp|V|allonia|gigantea}} {{sp|V|allonia|girauxae}} {{sp|V|allonia|gracilicosta}} {{sp|V|allonia|hoppla}} {{sp|V|allonia|kamtschatica}} {{sp|V|allonia|ladacensis}} {{sp|V|allonia|laxa}} {{sp|V|allonia|lepida}} {{sp|V|allonia|major}} {{sp|V|allonia|mionecton}} {{sp|V|allonia|parvula}} {{sp|V|allonia|patens}} {{sp|V|allonia|persica}} {{sp|V|allonia|perspectiva}} {{sp|V|allonia|peteri}} {{sp|V|allonia|pulchella}} {{sp|V|allonia|pulchellula}} {{sp|V|allonia|sandbergi}} {{sp|V|allonia|sparnacensis}} {{sp|V|allonia|subcyclophorella}} {{sp|V|allonia|suevica}} {{sp|V|allonia|tenuilabris}} {{sp|V|allonia|terraenovae}} {{sp|V|allonia|tokunagai}} {{splast|V|allonia|zaru}} =={{int:Name}}== ''Vallonia'' {{a|Antoine Risso|Risso}}, 1826 {{int:Type species}}: ''Helix (Vallonia) rosalia'' Risso, 1826 [=''Vallonia pulchella''] =={{int:References}}== {{Risso, 1826a}} * {{aut|Gerber, J.}} 1996. Revision der Gattung ''Vallonia'' Risso 1826 (Mollusca: Gastropoda: Valloniidae. ''Schriften zur Malakozoologie aus dem Haus der Natur - Cismar'' 8: 1. {{Taxonbar|from=Q3173891}} [[Category:Antoine Risso taxa]] 1yq47brjhbh2334kzchiuy3ctrvd9qd Daniel Roccatagliata 0 105825 11322222 11016663 2026-10-21T18:45:11Z Neferkheperre 947633 /* 2021 */ 11322222 wikitext text/x-wiki '''Daniel Roccatagliata''', biologist Departamento de Biodiversidad y Biología Experimental, Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1981=== {{Roccatagliata, 1981}} ===1987=== {{Roccatagliata & Moreira, 1987}} ===2008=== * {{aut|Alberico, N.A. & D. Roccatagliata}}, 2008. ''Diastylis fabrizioi'', a new species and brief redescription of D. planifrons Calman, 1912 (Crustacea: Cumacea: Diastylidae) from South America. ''Journal of Natural History'' '''42 (13-14)''': 1039–1063. Abstract: {{doi|10.1080/00222930701858359}} ===2011=== * Alberico, N.A. & D. Roccatagliata, 2011. On Two Species of ''Diastylis'' (Cumacea) from the Southwestern Atlantic: ''D. sexpectinata'' n. sp. and ''D. hammoniae'' Zimmer, 1902. ''Journal of Crustacean Biology'' '''31(1)''': 192–208. Abstract: {{doi|10.1651/09-3267.1}}. ===2014=== {{Alberico, Roccatagliata & Mühlenhardt-Siegel, 2014}} ===2021=== {{Pereira, Doti & Roccatagliata, 2021}} ===2026=== {{López, Roccatagliata & Doti, 2026}} {{Authority control}} {{DEFAULTSORT:Roccatagliata, Daniel}} [[Category:Taxon authorities]] [[Category:Biologists]] 8s8lsfseztetmk7crv21iph6ofsm35r Cryptoprocta ferox 0 109713 11322479 10979196 2026-10-21T23:54:58Z Burmeister 9074 revision update I. 11322479 wikitext text/x-wiki {{Image|Cryptoprocta Ferox.JPG}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species: ''[[Cryptoprocta ferox]]'' =={{int:Name}}== ''Cryptoprocta ferox'' {{a|Edward Turner Bennett|Bennett}}, 1833: {{BHL|page/12859486|46}} * {{int:Holotype}}: {{rl|BMNH}} 1855.12.24.222/BMNH 1855.12.26.230, collected by Charles Telfair. * {{int:Type locality}}: “Madagascar”. ==={{int:Synonyms}}=== * ''Cryptoprocta typicus'' {{a|Andrew Smith|A. Smith}}, 1834: {{BHL|page/15968364|246}} [''nomen novum'' ''pro'' ''Cryptoprocta ferox'' {{aut|Bennett}}, 1833] =={{int:References}}== ==={{int:Primary references}}=== {{Bennett, 1833d}} ==={{int:Links}}=== * {{aut|Hawkins, F.}} 2016. {{IUCN|VU|5760}}. The IUCN Red List of Threatened Species 2016: e.T5760A45197189. {{doi|10.2305/IUCN.UK.2016-1.RLTS.T5760A45197189.en}}. Accessed on 20 October 2026. =={{int:Vernacular names}}== {{VN |br=Fosa |cs=Fosa |da=Fossa |de=Fossa |el=Φόσα |en=Fossa |es=Fosa |eo=Foso |fi=Fossa |fr=Fossa |ga=Fosa |he=פוסה |hu=Fossza |it=Fossa |ja=フォッサ |ko=포사 |lt=Fosa |mg=Fosa |nl=Fretkat |no=Fossa |nn=Fossa |pl=Fossa madagaskarska |pt=Fossa |ru=Фосса |sv=Fossa |tr=Fossa |zh=馬島長尾狸貓 |zh-yue=馬島狸 }} {{Taxonbar|from=Q183330}} [[Category:Edward Turner Bennett taxa]] ar0s9iy9p3by0ijejflxaixnaghrd2o Smith 0 109736 11322414 11321421 2026-10-21T22:05:31Z The editor 2345 2915305 /* */ 11322414 wikitext text/x-wiki {{Refer|authority}} {{columns-list|colwidth=30em|class=plainlist| * [[A.M. Smith]] ([[Floruit|fl.]] 1972, '''A.M.Sm.bis'''), mycologist * [[Aaron Dennis Smith]], U.S. entomologist * [[Abigail M. Smith]], New Zealand bryozoologist * [[Adam Stuart Smith]], British paleontologist * [[Alan Reid Smith]] ({{int:born}} 1943, '''A.R.Smith'''), U.S. botanist * [[Albert Charles Smith]] (1906–1999, '''A.C.Sm.'''), U.S. botanist * [[Allen John Smith]] (1863–1926, '''A.J.Sm.'''), U.S. parasitologist * [[Alexander Hanchett Smith]] ('''A.H.Sm.'''), U.S. mycologist * [[Andrew B. Smith]], British echinodermologist * [[Andrew B.T. Smith]], Canadian entomologist * [[Andrew Martin Smith]] ({{int:born}} 1955), arachnologist * [[Andrew Smith]] (1797–1872), Scottish naturalist * [[Angela L. Smith]], UK mammalogist * [[Annie Lorrain Smith]] (1854–1937, '''A.L.Sm.'''), British lichenologist * [[Annie Morrill Smith]] (1856–1946, '''A.M.Sm.'''), U.S. botanist * [[Anthony John Edwin Smith]] ({{int:born}} 1935, '''A.J.E.Sm.'''), botanist * [[Ashton B. Smith]], U.S. entomologist * [[Benjamin Harrison Smith]] (1892–?, '''B.Harr.Sm.'''), phycologist * [[Bennett Holly Smith]], U.S. biological anthropologist * [[Bradley Philip Smith]], mammalogist * [[Brendan J. Smith]] ('''B.J.Sm.''') * [[Brian A. Smith]] ('''B.A.Sm.'''), botanist * [[Brian J. Smith]], New Zealander entomologist * [[Brian John Smith]], Australian malacologist * [[Brian Tilston Smith]], U.S. ornithologist * [[C. Lavett Smith]], U.S. ichthyologist * [[Carroll Newton Smith]] (1909–1992), U.S. entomologist * [[Catherine E. Smith]], U.S. ornithologist * [[Cecil N. Smith]] (fl. 2024), U.S. entomologist * [[Charles Culberson Smith]] (1938–2024, '''C.C.Sm.'''), U.S. palaeontologist and palaeobotanist * [[Charles Eastwick Smith]] (1820–1900, '''C.E.Sm.'''), U.S. botanist * [[Charles Hamilton Smith]] (1776–1859), English naturalist * [[Charles Leonard Smith]] (1866–1923, '''C.L.Sm.'''), botanist * [[Charles Piper Smith]] (1877–1955, '''C.P.Sm.''') * [[Chase H. Smith]], malacologist * [[Christen Smith]] (1785–1816, '''C.Sm.'''), Norwegian botanist * [[Christina M. Smith]] (fl. 2010, '''C.M.Sm.'''), botanist * [[Christo Albertyn Smith]] (1898–1956, '''C.A.Sm.'''), South African botanist * [[Claude Earle Smith]] (1922–1987, '''Earle Sm.'''), botanist * [[Clayton Orville Smith]] (1871–1955, '''C.O.Sm.'''), U.S. botanist * [[Clifford W. Smith]] ({{int:born}} 1938, '''C.W.Sm.'''), lichenologist and botanist * [[Clyde Fuhriman Smith]], U.S. entomologist * [[Colin Smith]] (fl. 1993), British lepidopterist * [[Craig R. Smith]], U.S. marine biologist * [[Dale Metz Smith]] (1928–2011, '''D.M.Sm.'''), botanist * [[Damon A. Smith]] (fl. 1996, '''Dam.A.Sm.'''), botanist * [[Daniel J. Smith]], U.S. herpetologist * [[Darlan J.B. Smith]], carcinologist * [[David G. Smith]] (1942–2024), U.S. ichthyologist * [[David Nelson Smith]] (1945–1991, '''D.N.Sm.'''), U.S. botanist * [[David R. Smith]] (1937–2024), U.S. entomologist * [[David Spencer Smith]] (1934–2005), English entomologist * [[Deborah Smith]], U.S. arachnologist * [[Dena M. Smith]] (fl. 2005), paleozoologist * [[Donald A. Smith]], mammalogist * [[Donald J. Smith]] ('''D.J.Sm.''') * [[Douglas G. Smith]], US zoologist * [[Edgar Albert Smith]] (1847–1916), British malacologist * [[Edwin Burnell Smith]] (1936–2017, '''E.B.Sm.'''), U.S. botanist * [[Elsie Smith]], malacologist * [[Elizabeth Hight Smith]] ('''E.H.Sm.''') * [[Elizabeth T. Smith]], Australian palaeontologist * [[Elmer William Smith]] (1920–1981, '''E.W.Sm.'''), botanist * [[Eric Howard Smith]] ({{int:born}} 1943), U.S. entomologist * [[Eric Nelson Smith]], U.S. herpetologist * [[Erwin Frink Smith]] (1854–1927, '''E.F.Sm.'''), U.S. plant pathologist * [[Essie M. Smith]], ostracodologist * [[Eugene Allen Smith]] (1841–1927, '''E.A.Sm.'''), U.S. geologist * [[F.E.V. Smith]] ('''F.E.V.Sm.''') * [[Frank Smith]] (1857–1942), American zoologist, annelidologist * [[Frank Joseph Smith]] ({{int:born}} 1951, '''F.J.Sm.'''), botanist * [[Frank Percy Smith]] (1880–1945), British arachnologist * [[Frederick Porter Smith]] (1833–1888, '''F.P.Sm.'''), British botanist * [[Frederick Smith]] (1805–1879), British entomologist * [[Gary L. Smith Merrill]] ({{int:born}} 1939, '''G.L.Sm.'''), U.S. bryologist * [[Gavin J.D. Smith]] ('''G.J.D.Sm.'''), U.S. mycologist and botanist * [[Geoffrey R. Smith]], U.S. herpetologist * [[Geoffrey W. Smith]], British carcinologist * [[George Smith]] (1895–1967, '''G.Sm.'''), English mycologist * [[George Alexander Smith]] (fl. 1896–1927, died 1932), British biologist * [[George S. Smith]] ('''G.S.Sm.'''), U.S. mycologist * [[Gerald Graham Smith]] (1892–1976, '''G.G.Sm.'''), botanist * [[Gerald Lomax Smith]] ({{int:born}} 1949, fl. 2009, '''G.Lom.Sm.'''), botanist * [[Gideon Francois Smith]] ('''Gideon F.Sm.'''), South African botanist * [[Gilbert Morgan Smith]] (1885–1959, '''G.M.Sm.'''), U.S. botanist and phycologist * [[Gordon Smith]] ({{int:born}} 1942, '''Gord.Sm.'''), botanist * [[Graeme B. Smith]], Australian entomologist * [[Hamilton Lanphere Smith]] (1819–1903, '''H.L.Sm.'''), U.S. botanist * [[Helen M. Smith]], Australian arachnologist * [[Helen Vandervort Smith]] ('''H.V.Sm.''') * [[Hendrik Smith]] ('''H.Sm.ter''') * [[Henry George Smith]] (1852–1924, '''H.G.Sm.'''), Australian botanist and chemist * [[Hobart Muir Smith]] (1912–2013), U.S. herpetologist * [[Hugh McCormick Smith]] (1865–1941), U.S. ichthyologist * [[Ian M. Smith]], Canadian arachnologist * [[Jacob Smith]], U.S. zoologist * [[James Dale Smith]], U.S. mammalogist * [[James Edward Smith]] (1759–1828, '''Sm.'''), British botanist and entomologist * [[James Foley Smith]] ('''J.F.Sm.'''), botanist * [[James Keith Smith]], ostracodologist * [[James Leonard Brierley Smith]] (1897–1968), South African ichthyologist * [[James Payne Smith]] ({{int:born}} 1941, '''J.P.Sm.'''), botanist * [[James Perrin Smith]] (1864–1931), U.S. geologist and paleontologist * [[James Smith]] (1760–1840, '''Js.Sm.'''), botanist * [[James Smith (diatomist)|James Smith]] (?–1950), U.S. diatomist * [[Jane E. Smith]], British entomologist * [[Jeffrey Drew Smith]] ('''J.D.Sm.''') * [[Jennifer E. Smith]], U.S. marine biologist * [[Johannes Jacobus Smith]] (1867–1947, '''J.J.Sm.'''), Dutch botanist * [[John Alexander Smith]], ornithologist and ichthyologist * [[John Arthur Creasey Smith]] (1873–1929, '''J. A. C. Smith'''), British traveler. * [[John Bernhard Smith]] (1858–1912), entomologist * [[John Macalister Burns Smith]] (1937–2007, '''J.M.B.Sm.'''), New Zealand mycologist and microbiologist * [[John Smith]] (1798–1888, '''J.Sm.'''), British botanist * [[John Smith (geologist)]] (1845–1930, '''J.Sm.bis'''), British geologist * [[John W. Smith]], Canadian nematologist * [[Jon Jay Smith]], U.S. geologist * [[Joshua B. Smith]], paleontologist * [[Julian P.S. Smith III]], U.S. helminthologist * [[Julie W. Smith]], ornithologist * [[Karl August Harald Smith]] (1889–1971, '''Harry Sm.'''), botanist * [[Kenneth George Valentine Smith]] (1929–2017), British entomologist * [[Kenneth Manley Smith]] ('''K.M.Sm.''') * [[Lawrence A. Smith]] ({{int:born}} 1944), Australian herpetologist * [[Leslie Malcom Smith]] (1903–1976), U.S. entomologist * [[Lewis MacCuen Smith]] (1902–1976), U.S. entomologist * [[Lisa Smith]], British malacologist * [[Lois K. Smith]], entomologist * [[Loren M. Smith]], U.S. entomologist * [[Lucy T. Smith]] (fl. 2021, '''L.T.Sm.'''), botanist * [[Lydia L. Smith]] (fl. 2009), ichthyologist * [[Lydia Rosie Jyoti Smith]], British entomologist * [[M. Alex Smith]], Canadian entomologist * [[M. Paul Smith]], British paleontologist * [[Malcolm Arthur Smith]] (1875–1958), British herpetologist working in Malay Peninsula * [[Margaret Mary Smith]] (1916–1987), South African ichthyologist * [[Marion Ashton Smith]] ('''M.A.Sm.''') * [[Marion Estelle Smith]] (1913–1988), U.S. entomologist * [[Marion Russell Smith]] (1894–1981), U.S. entomologist * [[Matilda Smith]] (1854–1926, '''M.Sm.'''), British botanist * [[Matthew Edward Smith]] ('''M.E.Sm.'''), U.S. mycologist * [[Maudy T. Smith]] ({{int:born}} 1940, '''M.T.Sm.'''), mycologist * [[Megan L. Smith]], U.S. herpetologist * [[Meredith Joan Smith]], mammalogist * [[Michael J. Smith]], U.S. entomologist * [[Michael Leonard Smith]], U.S. ichthyologist * [[Moya Meredith Smith]], paleontologist * [[Nathan D. Smith]], US paleontologist * [[Nathan P. Smith]] ('''N.P.Sm.'''), botanist * [[Nigel Jeremy Trendell-Smith]], microbiologist * [[Patrick M. Smith]], U.S. paleontologist * [[Paul G. Smith]] (fl. 1958, '''P.G.Sm.'''), botanist * [[Paul Hamilton Smith]] ('''P.H.Sm.''') * [[Paul Smith]], Paraguayan ornithologist * [[Peter J. Smith (zoologist)]], Australian zoologist * [[Peter John Smith (botanist)]], ({{int:born}} 1931, fl. 1976–1992, '''P.J.Sm.'''), Australian botanist * [[Peter R. Smith]] ('''P.R.Sm.''') * [[Philip Morgans Smith]] (1941–2004, '''P.M.Sm.'''), botanist * [[Philip Wayne Smith]], entomologist * [[R.B. Smith]] ('''R.B.Sm.''') * [[R.J. Smith]] ('''R.J.Sm.''') * [[Rachel R. Smith]], U.S. entomologist * [[Ralph Elliott Smith]] (1874–1953, '''R.E.Sm.'''), botanist * [[Ray Fred Smith]] (1919–1999), U.S. entomologist * [[Raymond Vaughan Smith]] ({{int:born}} 1923, '''R.V.Sm.'''), botanist * [[Richard Gordon Smith]], British naturalist * [[Richard L. Smith]] ('''R.L.Sm.'''), phycologist * [[Richard Smith (paleontologist)|Richard Smith]], Belgian paleontologist * [[Richard Smith (Botanist)|Richard Smith]] (fl. 1862, '''R.Sm.'''), botanist * [[Richard Smith]], British ichthyologist * [[Robert Roy Smith]] (1934–1993), '''R.R.Sm.''', botanist * [[Robin James Smith]], ostracodologist * [[Robin Y. Smith]], Canadian paleobotanist * [[Roger Malcolm Harris Smith]], South African palaeontologist * [[Ronald Ian Lewis-Smith]] ({{int:born}} 1942, '''R.I.L.Sm.'''), lichenologist and bryologist * [[Rosa Smith Eigenmann]] (1858–1947), U.S. ichthyologist * [[Roy E. Smith]], British paleontologist * [[Rozella Blood Smith]] (1911–1987), U.S. herpetologist * [[Ruth C. Smith]] (1908–1982, '''R.C.Sm.'''), botanist * [[Sarah A. Smith]], Australian herpetologist * [[Sarah M. Smith]], U.S. entomologist * [[Selena Y. Smith]] ('''S.Y.Sm.'''), palaeobotanist * [[Shannon S. Smith]], entomologist * [[Sheri L. Smith]], entomologist * [[Sidney Irving Smith]] (1843–1926), U.S. entomologist and zoologist * [[Stacey D. Smith]] (fl. 2011, '''S.D.Sm.'''), botanist * [[Stanley G. Smith]], cytogeneticist * [[Stanley Galen Smith]] (1926–2015, '''S.G.Sm.'''), U.S. botanist * [[Stanley Jay Smith]] ('''S.J.Sm.''') * [[Stephen David Anthony Smith]], Australian marine biologist * [[Tarleton F. Smith]] (1916–2012), U.S. herpetologist * [[Tessa R. Smith]], Australian entomologist * [[Theobald Smith]] (1859–1938, '''Th.Sm.'''), U.S. parasitologist. * [[Thierry Smith]] ('''Thierry Sm.'''), Belgian palaeontologist * [[Trevor Randall Smith]], U.S. entomologist * [[Verna Z. Smith]], ostracodologist * [[William Smith]] (1808–1857, '''W.Sm.'''), phycologist, botanist. * [[William Gardner Smith]] (1866–1928, '''Wm.G.Sm.'''), Scottish botanist and mycologist * [[William Henry Smith]], U.S. herpetologist * [[William Leo Smith]], U.S. ichthyologist * [[Worthington George Smith]] (1835–1917, '''W.G.Sm.'''), English plant pathologist and mycologist }} {{Disambiguation|cat=people}} 21t0nff95oped9sv1rm6rghk73nugpg 11322416 11322414 2026-10-21T22:06:46Z The editor 2345 2915305 /* */ 11322416 wikitext text/x-wiki {{Refer|authority}} {{columns-list|colwidth=30em|class=plainlist| * [[A.M. Smith]] ([[Floruit|fl.]] 1972, '''A.M.Sm.bis'''), mycologist * [[Aaron Dennis Smith]], U.S. entomologist * [[Abigail M. Smith]], New Zealand bryozoologist * [[Adam Stuart Smith]], British paleontologist * [[Alan Reid Smith]] ({{int:born}} 1943, '''A.R.Smith'''), U.S. botanist * [[Albert Charles Smith]] (1906–1999, '''A.C.Sm.'''), U.S. botanist * [[Allen John Smith]] (1863–1926, '''A.J.Sm.'''), U.S. parasitologist * [[Alexander Hanchett Smith]] ('''A.H.Sm.'''), U.S. mycologist * [[Andrew B. Smith]], British echinodermologist * [[Andrew B.T. Smith]], Canadian entomologist * [[Andrew Martin Smith]] ({{int:born}} 1955), arachnologist * [[Andrew Smith]] (1797–1872), Scottish naturalist * [[Angela L. Smith]], UK mammalogist * [[Annie Lorrain Smith]] (1854–1937, '''A.L.Sm.'''), British lichenologist * [[Annie Morrill Smith]] (1856–1946, '''A.M.Sm.'''), U.S. botanist * [[Anthony John Edwin Smith]] ({{int:born}} 1935, '''A.J.E.Sm.'''), botanist * [[Ashton B. Smith]], U.S. entomologist * [[Benjamin Harrison Smith]] (1892–?, '''B.Harr.Sm.'''), phycologist * [[Bennett Holly Smith]], U.S. biological anthropologist * [[Bradley Philip Smith]], mammalogist * [[Brendan J. Smith]] ('''B.J.Sm.''') * [[Brian A. Smith]] ('''B.A.Sm.'''), botanist * [[Brian J. Smith]], New Zealander entomologist * [[Brian John Smith]], Australian malacologist * [[Brian Tilston Smith]], U.S. ornithologist * [[C. Lavett Smith]], U.S. ichthyologist * [[Carroll Newton Smith]] (1909–1992), U.S. entomologist * [[Catherine E. Smith]], U.S. ornithologist * [[Cecil N. Smith]] (fl. 2024), U.S. entomologist * [[Charles Culberson Smith]] (1938–2024, '''C.C.Sm.'''), U.S. palaeontologist and palaeobotanist * [[Charles Eastwick Smith]] (1820–1900, '''C.E.Sm.'''), U.S. botanist * [[Charles Hamilton Smith]] (1776–1859), English naturalist * [[Charles Leonard Smith]] (1866–1923, '''C.L.Sm.'''), botanist * [[Charles Piper Smith]] (1877–1955, '''C.P.Sm.''') * [[Chase H. Smith]], malacologist * [[Christen Smith]] (1785–1816, '''C.Sm.'''), Norwegian botanist * [[Christina M. Smith]] (fl. 2010, '''C.M.Sm.'''), botanist * [[Christo Albertyn Smith]] (1898–1956, '''C.A.Sm.'''), South African botanist * [[Claude Earle Smith]] (1922–1987, '''Earle Sm.'''), botanist * [[Clayton Orville Smith]] (1871–1955, '''C.O.Sm.'''), U.S. botanist * [[Clifford W. Smith]] ({{int:born}} 1938, '''C.W.Sm.'''), lichenologist and botanist * [[Clyde Fuhriman Smith]], U.S. entomologist * [[Colin Smith]] (fl. 1993), British lepidopterist * [[Craig R. Smith]], U.S. marine biologist * [[Dale Metz Smith]] (1928–2011, '''D.M.Sm.'''), botanist * [[Damon A. Smith]] (fl. 1996, '''Dam.A.Sm.'''), botanist * [[Daniel J. Smith]], U.S. herpetologist * [[Darlan J.B. Smith]], carcinologist * [[David G. Smith]] (1942–2024), U.S. ichthyologist * [[David Nelson Smith]] (1945–1991, '''D.N.Sm.'''), U.S. botanist * [[David R. Smith]] (1937–2024), U.S. entomologist * [[David Spencer Smith]] (1934–2005), English entomologist * [[Deborah Smith]], U.S. arachnologist * [[Dena M. Smith]] (fl. 2005), paleozoologist * [[Donald A. Smith]], mammalogist * [[Donald J. Smith]] ('''D.J.Sm.''') * [[Douglas G. Smith]], US zoologist * [[Edgar Albert Smith]] (1847–1916), British malacologist * [[Edwin Burnell Smith]] (1936–2017, '''E.B.Sm.'''), U.S. botanist * [[Elsie Smith]], malacologist * [[Elizabeth Hight Smith]] ('''E.H.Sm.''') * [[Elizabeth T. Smith]], Australian palaeontologist * [[Elmer William Smith]] (1920–1981, '''E.W.Sm.'''), botanist * [[Eric Howard Smith]] ({{int:born}} 1943), U.S. entomologist * [[Eric Nelson Smith]], U.S. herpetologist * [[Erwin Frink Smith]] (1854–1927, '''E.F.Sm.'''), U.S. plant pathologist * [[Essie M. Smith]], ostracodologist * [[Eugene Allen Smith]] (1841–1927, '''E.A.Sm.'''), U.S. geologist * [[F.E.V. Smith]] ('''F.E.V.Sm.''') * [[Frank Smith]] (1857–1942), American zoologist, annelidologist * [[Frank Joseph Smith]] ({{int:born}} 1951, '''F.J.Sm.'''), botanist * [[Frank Percy Smith]] (1880–1945), British arachnologist * [[Frederick Porter Smith]] (1833–1888, '''F.P.Sm.'''), British botanist * [[Frederick Smith]] (1805–1879), British entomologist * [[Gary L. Smith Merrill]] ({{int:born}} 1939, '''G.L.Sm.'''), U.S. bryologist * [[Gavin J.D. Smith]] ('''G.J.D.Sm.'''), U.S. mycologist and botanist * [[Geoffrey R. Smith]], U.S. herpetologist * [[Geoffrey W. Smith]], British carcinologist * [[George Smith]] (1895–1967, '''G.Sm.'''), English mycologist * [[George Alexander Smith]] (fl. 1896–1927, died 1932), British biologist * [[George S. Smith]] ('''G.S.Sm.'''), U.S. mycologist * [[Gerald Graham Smith]] (1892–1976, '''G.G.Sm.'''), botanist * [[Gerald Lomax Smith]] ({{int:born}} 1949, fl. 2009, '''G.Lom.Sm.'''), botanist * [[Gideon Francois Smith]] ('''Gideon F.Sm.'''), South African botanist * [[Gilbert Morgan Smith]] (1885–1959, '''G.M.Sm.'''), U.S. botanist and phycologist * [[Gordon Smith]] ({{int:born}} 1942, '''Gord.Sm.'''), botanist * [[Graeme B. Smith]], Australian entomologist * [[Hamilton Lanphere Smith]] (1819–1903, '''H.L.Sm.'''), U.S. botanist * [[Helen M. Smith]], Australian arachnologist * [[Helen Vandervort Smith]] ('''H.V.Sm.''') * [[Hendrik Smith]] ('''H.Sm.ter''') * [[Henry George Smith]] (1852–1924, '''H.G.Sm.'''), Australian botanist and chemist * [[Hobart Muir Smith]] (1912–2013), U.S. herpetologist * [[Hugh McCormick Smith]] (1865–1941), U.S. ichthyologist * [[Ian M. Smith]], Canadian arachnologist * [[Jacob Smith]], U.S. zoologist * [[James Dale Smith]], U.S. mammalogist * [[James Edward Smith]] (1759–1828, '''Sm.'''), British botanist and entomologist * [[James Foley Smith]] ('''J.F.Sm.'''), botanist * [[James Keith Smith]], ostracodologist * [[James Leonard Brierley Smith]] (1897–1968), South African ichthyologist * [[James Payne Smith]] ({{int:born}} 1941, '''J.P.Sm.'''), botanist * [[James Perrin Smith]] (1864–1931), U.S. geologist and paleontologist * [[James Smith]] (1760–1840, '''Js.Sm.'''), botanist * [[James Smith (diatomist)|James Smith]] (?–1950), U.S. diatomist * [[Jane E. Smith]], British entomologist * [[Jeffrey Drew Smith]] ('''J.D.Sm.''') * [[Jennifer E. Smith]], U.S. marine biologist * [[Johannes Jacobus Smith]] (1867–1947, '''J.J.Sm.'''), Dutch botanist * [[John Alexander Smith]], ornithologist and ichthyologist * [[John Arthur Creasey Smith]] (1873–1929, '''J. A. C. Smith'''), British traveler. * [[John Bernhard Smith]] (1858–1912), entomologist * [[John Macalister Burns Smith]] (1937–2007, '''J.M.B.Sm.'''), New Zealand mycologist and microbiologist * [[John Smith]] (1798–1888, '''J.Sm.'''), British botanist * [[John Smith (geologist)]] (1845–1930, '''J.Sm.bis'''), British geologist * [[John W. Smith]], Canadian nematologist * [[Jon Jay Smith]], U.S. geologist * [[Joshua B. Smith]], paleontologist * [[Julian P.S. Smith III]], U.S. helminthologist * [[Julie W. Smith]], ornithologist * [[Karl August Harald Smith]] (1889–1971, '''Harry Sm.'''), botanist * [[Kenneth George Valentine Smith]] (1929–2017), British entomologist * [[Kenneth Manley Smith]] ('''K.M.Sm.''') * [[Lawrence A. Smith]] ({{int:born}} 1944), Australian herpetologist * [[Leslie Malcom Smith]] (1903–1976), U.S. entomologist * [[Lewis MacCuen Smith]] (1902–1976), U.S. entomologist * [[Lisa Smith]], British malacologist * [[Lois K. Smith]], entomologist * [[Loren M. Smith]], U.S. entomologist * [[Lucy T. Smith]] (fl. 2021, '''L.T.Sm.'''), botanist * [[Lydia L. Smith]] (fl. 2009), ichthyologist * [[Lydia Rosie Jyoti Smith]], British entomologist * [[M. Alex Smith]], Canadian entomologist * [[M. Paul Smith]], British paleontologist * [[Malcolm Arthur Smith]] (1875–1958), British herpetologist working in Malay Peninsula * [[Margaret Mary Smith]] (1916–1987), South African ichthyologist * [[Marion Ashton Smith]] ('''M.A.Sm.''') * [[Marion Estelle Smith]] (1913–1988), U.S. entomologist * [[Marion Russell Smith]] (1894–1981), U.S. entomologist * [[Matilda Smith]] (1854–1926, '''M.Sm.'''), British botanist * [[Matthew Edward Smith]] ('''M.E.Sm.'''), U.S. mycologist * [[Maudy T. Smith]] ({{int:born}} 1940, '''M.T.Sm.'''), mycologist * [[Megan L. Smith]], U.S. herpetologist * [[Meredith Joan Smith]], mammalogist * [[Michael J. Smith]], U.S. entomologist * [[Michael Leonard Smith]], U.S. ichthyologist * [[Moya Meredith Smith]], paleontologist * [[Nathan D. Smith]], US paleontologist * [[Nathan P. Smith]] ('''N.P.Sm.'''), botanist * [[Nigel Jeremy Trendell-Smith]], microbiologist * [[Patrick M. Smith]], U.S. paleontologist * [[Paul G. Smith]] (fl. 1958, '''P.G.Sm.'''), botanist * [[Paul Hamilton Smith]] ('''P.H.Sm.''') * [[Paul Smith]], Paraguayan ornithologist * [[Peter J. Smith (zoologist)]], Australian zoologist * [[Peter John Smith (botanist)]], ({{int:born}} 1931, fl. 1976–1992, '''P.J.Sm.'''), Australian botanist * [[Peter R. Smith]] ('''P.R.Sm.''') * [[Philip Morgans Smith]] (1941–2004, '''P.M.Sm.'''), botanist * [[Philip Wayne Smith]], entomologist * [[R.B. Smith]] ('''R.B.Sm.''') * [[R.J. Smith]] ('''R.J.Sm.''') * [[Rachel R. Smith]], U.S. entomologist * [[Ralph Elliott Smith]] (1874–1953, '''R.E.Sm.'''), botanist * [[Ray Fred Smith]] (1919–1999), U.S. entomologist * [[Raymond Vaughan Smith]] ({{int:born}} 1923, '''R.V.Sm.'''), botanist * [[Richard Gordon Smith]], British naturalist * [[Richard L. Smith]] ('''R.L.Sm.'''), phycologist * [[Richard Smith (paleontologist)|Richard Smith]], Belgian paleontologist * [[Richard Smith (Botanist)|Richard Smith]] (fl. 1862, '''R.Sm.'''), botanist * [[Richard Smith]], British ichthyologist * [[Robert Roy Smith]] (1934–1993), '''R.R.Sm.''', botanist * [[Robin James Smith]], ostracodologist * [[Robin Y. Smith]], Canadian paleobotanist * [[Roger Malcolm Harris Smith]], South African palaeontologist * [[Ronald Ian Lewis-Smith]] ({{int:born}} 1942, '''R.I.L.Sm.'''), lichenologist and bryologist * [[Rosa Smith Eigenmann]] (1858–1947), U.S. ichthyologist * [[Roy E. Smith]], English paleontologist * [[Rozella Blood Smith]] (1911–1987), U.S. herpetologist * [[Ruth C. Smith]] (1908–1982, '''R.C.Sm.'''), botanist * [[Sarah A. Smith]], Australian herpetologist * [[Sarah M. Smith]], U.S. entomologist * [[Selena Y. Smith]] ('''S.Y.Sm.'''), palaeobotanist * [[Shannon S. Smith]], entomologist * [[Sheri L. Smith]], entomologist * [[Sidney Irving Smith]] (1843–1926), U.S. entomologist and zoologist * [[Stacey D. Smith]] (fl. 2011, '''S.D.Sm.'''), botanist * [[Stanley G. Smith]], cytogeneticist * [[Stanley Galen Smith]] (1926–2015, '''S.G.Sm.'''), U.S. botanist * [[Stanley Jay Smith]] ('''S.J.Sm.''') * [[Stephen David Anthony Smith]], Australian marine biologist * [[Tarleton F. Smith]] (1916–2012), U.S. herpetologist * [[Tessa R. Smith]], Australian entomologist * [[Theobald Smith]] (1859–1938, '''Th.Sm.'''), U.S. parasitologist. * [[Thierry Smith]] ('''Thierry Sm.'''), Belgian palaeontologist * [[Trevor Randall Smith]], U.S. entomologist * [[Verna Z. Smith]], ostracodologist * [[William Smith]] (1808–1857, '''W.Sm.'''), phycologist, botanist. * [[William Gardner Smith]] (1866–1928, '''Wm.G.Sm.'''), Scottish botanist and mycologist * [[William Henry Smith]], U.S. herpetologist * [[William Leo Smith]], U.S. ichthyologist * [[Worthington George Smith]] (1835–1917, '''W.G.Sm.'''), English plant pathologist and mycologist }} {{Disambiguation|cat=people}} 5grzbjhq854706vk1b6wu96nb0e4sid 11322419 11322416 2026-10-21T22:08:48Z The editor 2345 2915305 /* */ 11322419 wikitext text/x-wiki {{Refer|authority}} {{columns-list|colwidth=30em|class=plainlist| * [[A.M. Smith]] ([[Floruit|fl.]] 1972, '''A.M.Sm.bis'''), mycologist * [[Aaron Dennis Smith]], U.S. entomologist * [[Abigail M. Smith]], New Zealand bryozoologist * [[Adam Stuart Smith]], British paleontologist * [[Alan Reid Smith]] ({{int:born}} 1943, '''A.R.Smith'''), U.S. botanist * [[Albert Charles Smith]] (1906–1999, '''A.C.Sm.'''), U.S. botanist * [[Allen John Smith]] (1863–1926, '''A.J.Sm.'''), U.S. parasitologist * [[Alexander Hanchett Smith]] ('''A.H.Sm.'''), U.S. mycologist * [[Andrew B. Smith]], British echinodermologist * [[Andrew B.T. Smith]], Canadian entomologist * [[Andrew Martin Smith]] ({{int:born}} 1955), arachnologist * [[Andrew Smith]] (1797–1872), Scottish naturalist * [[Angela L. Smith]], English zoologist * [[Annie Lorrain Smith]] (1854–1937, '''A.L.Sm.'''), British lichenologist * [[Annie Morrill Smith]] (1856–1946, '''A.M.Sm.'''), U.S. botanist * [[Anthony John Edwin Smith]] ({{int:born}} 1935, '''A.J.E.Sm.'''), botanist * [[Ashton B. Smith]], U.S. entomologist * [[Benjamin Harrison Smith]] (1892–?, '''B.Harr.Sm.'''), phycologist * [[Bennett Holly Smith]], U.S. biological anthropologist * [[Bradley Philip Smith]], mammalogist * [[Brendan J. Smith]] ('''B.J.Sm.''') * [[Brian A. Smith]] ('''B.A.Sm.'''), botanist * [[Brian J. Smith]], New Zealander entomologist * [[Brian John Smith]], Australian malacologist * [[Brian Tilston Smith]], U.S. ornithologist * [[C. Lavett Smith]], U.S. ichthyologist * [[Carroll Newton Smith]] (1909–1992), U.S. entomologist * [[Catherine E. Smith]], U.S. ornithologist * [[Cecil N. Smith]] (fl. 2024), U.S. entomologist * [[Charles Culberson Smith]] (1938–2024, '''C.C.Sm.'''), U.S. palaeontologist and palaeobotanist * [[Charles Eastwick Smith]] (1820–1900, '''C.E.Sm.'''), U.S. botanist * [[Charles Hamilton Smith]] (1776–1859), English naturalist * [[Charles Leonard Smith]] (1866–1923, '''C.L.Sm.'''), botanist * [[Charles Piper Smith]] (1877–1955, '''C.P.Sm.''') * [[Chase H. Smith]], malacologist * [[Christen Smith]] (1785–1816, '''C.Sm.'''), Norwegian botanist * [[Christina M. Smith]] (fl. 2010, '''C.M.Sm.'''), botanist * [[Christo Albertyn Smith]] (1898–1956, '''C.A.Sm.'''), South African botanist * [[Claude Earle Smith]] (1922–1987, '''Earle Sm.'''), botanist * [[Clayton Orville Smith]] (1871–1955, '''C.O.Sm.'''), U.S. botanist * [[Clifford W. Smith]] ({{int:born}} 1938, '''C.W.Sm.'''), lichenologist and botanist * [[Clyde Fuhriman Smith]], U.S. entomologist * [[Colin Smith]] (fl. 1993), British lepidopterist * [[Craig R. Smith]], U.S. marine biologist * [[Dale Metz Smith]] (1928–2011, '''D.M.Sm.'''), botanist * [[Damon A. Smith]] (fl. 1996, '''Dam.A.Sm.'''), botanist * [[Daniel J. Smith]], U.S. herpetologist * [[Darlan J.B. Smith]], carcinologist * [[David G. Smith]] (1942–2024), U.S. ichthyologist * [[David Nelson Smith]] (1945–1991, '''D.N.Sm.'''), U.S. botanist * [[David R. Smith]] (1937–2024), U.S. entomologist * [[David Spencer Smith]] (1934–2005), English entomologist * [[Deborah Smith]], U.S. arachnologist * [[Dena M. Smith]] (fl. 2005), paleozoologist * [[Donald A. Smith]], mammalogist * [[Donald J. Smith]] ('''D.J.Sm.''') * [[Douglas G. Smith]], US zoologist * [[Edgar Albert Smith]] (1847–1916), British malacologist * [[Edwin Burnell Smith]] (1936–2017, '''E.B.Sm.'''), U.S. botanist * [[Elsie Smith]], malacologist * [[Elizabeth Hight Smith]] ('''E.H.Sm.''') * [[Elizabeth T. Smith]], Australian palaeontologist * [[Elmer William Smith]] (1920–1981, '''E.W.Sm.'''), botanist * [[Eric Howard Smith]] ({{int:born}} 1943), U.S. entomologist * [[Eric Nelson Smith]], U.S. herpetologist * [[Erwin Frink Smith]] (1854–1927, '''E.F.Sm.'''), U.S. plant pathologist * [[Essie M. Smith]], ostracodologist * [[Eugene Allen Smith]] (1841–1927, '''E.A.Sm.'''), U.S. geologist * [[F.E.V. Smith]] ('''F.E.V.Sm.''') * [[Frank Smith]] (1857–1942), American zoologist, annelidologist * [[Frank Joseph Smith]] ({{int:born}} 1951, '''F.J.Sm.'''), botanist * [[Frank Percy Smith]] (1880–1945), British arachnologist * [[Frederick Porter Smith]] (1833–1888, '''F.P.Sm.'''), British botanist * [[Frederick Smith]] (1805–1879), British entomologist * [[Gary L. Smith Merrill]] ({{int:born}} 1939, '''G.L.Sm.'''), U.S. bryologist * [[Gavin J.D. Smith]] ('''G.J.D.Sm.'''), U.S. mycologist and botanist * [[Geoffrey R. Smith]], U.S. herpetologist * [[Geoffrey W. Smith]], British carcinologist * [[George Smith]] (1895–1967, '''G.Sm.'''), English mycologist * [[George Alexander Smith]] (fl. 1896–1927, died 1932), British biologist * [[George S. Smith]] ('''G.S.Sm.'''), U.S. mycologist * [[Gerald Graham Smith]] (1892–1976, '''G.G.Sm.'''), botanist * [[Gerald Lomax Smith]] ({{int:born}} 1949, fl. 2009, '''G.Lom.Sm.'''), botanist * [[Gideon Francois Smith]] ('''Gideon F.Sm.'''), South African botanist * [[Gilbert Morgan Smith]] (1885–1959, '''G.M.Sm.'''), U.S. botanist and phycologist * [[Gordon Smith]] ({{int:born}} 1942, '''Gord.Sm.'''), botanist * [[Graeme B. Smith]], Australian entomologist * [[Hamilton Lanphere Smith]] (1819–1903, '''H.L.Sm.'''), U.S. botanist * [[Helen M. Smith]], Australian arachnologist * [[Helen Vandervort Smith]] ('''H.V.Sm.''') * [[Hendrik Smith]] ('''H.Sm.ter''') * [[Henry George Smith]] (1852–1924, '''H.G.Sm.'''), Australian botanist and chemist * [[Hobart Muir Smith]] (1912–2013), U.S. herpetologist * [[Hugh McCormick Smith]] (1865–1941), U.S. ichthyologist * [[Ian M. Smith]], Canadian arachnologist * [[Jacob Smith]], U.S. zoologist * [[James Dale Smith]], U.S. mammalogist * [[James Edward Smith]] (1759–1828, '''Sm.'''), British botanist and entomologist * [[James Foley Smith]] ('''J.F.Sm.'''), botanist * [[James Keith Smith]], ostracodologist * [[James Leonard Brierley Smith]] (1897–1968), South African ichthyologist * [[James Payne Smith]] ({{int:born}} 1941, '''J.P.Sm.'''), botanist * [[James Perrin Smith]] (1864–1931), U.S. geologist and paleontologist * [[James Smith]] (1760–1840, '''Js.Sm.'''), botanist * [[James Smith (diatomist)|James Smith]] (?–1950), U.S. diatomist * [[Jane E. Smith]], British entomologist * [[Jeffrey Drew Smith]] ('''J.D.Sm.''') * [[Jennifer E. Smith]], U.S. marine biologist * [[Johannes Jacobus Smith]] (1867–1947, '''J.J.Sm.'''), Dutch botanist * [[John Alexander Smith]], ornithologist and ichthyologist * [[John Arthur Creasey Smith]] (1873–1929, '''J. A. C. Smith'''), British traveler. * [[John Bernhard Smith]] (1858–1912), entomologist * [[John Macalister Burns Smith]] (1937–2007, '''J.M.B.Sm.'''), New Zealand mycologist and microbiologist * [[John Smith]] (1798–1888, '''J.Sm.'''), British botanist * [[John Smith (geologist)]] (1845–1930, '''J.Sm.bis'''), British geologist * [[John W. Smith]], Canadian nematologist * [[Jon Jay Smith]], U.S. geologist * [[Joshua B. Smith]], paleontologist * [[Julian P.S. Smith III]], U.S. helminthologist * [[Julie W. Smith]], ornithologist * [[Karl August Harald Smith]] (1889–1971, '''Harry Sm.'''), botanist * [[Kenneth George Valentine Smith]] (1929–2017), British entomologist * [[Kenneth Manley Smith]] ('''K.M.Sm.''') * [[Lawrence A. Smith]] ({{int:born}} 1944), Australian herpetologist * [[Leslie Malcom Smith]] (1903–1976), U.S. entomologist * [[Lewis MacCuen Smith]] (1902–1976), U.S. entomologist * [[Lisa Smith]], British malacologist * [[Lois K. Smith]], entomologist * [[Loren M. Smith]], U.S. entomologist * [[Lucy T. Smith]] (fl. 2021, '''L.T.Sm.'''), botanist * [[Lydia L. Smith]] (fl. 2009), ichthyologist * [[Lydia Rosie Jyoti Smith]], British entomologist * [[M. Alex Smith]], Canadian entomologist * [[M. Paul Smith]], British paleontologist * [[Malcolm Arthur Smith]] (1875–1958), British herpetologist working in Malay Peninsula * [[Margaret Mary Smith]] (1916–1987), South African ichthyologist * [[Marion Ashton Smith]] ('''M.A.Sm.''') * [[Marion Estelle Smith]] (1913–1988), U.S. entomologist * [[Marion Russell Smith]] (1894–1981), U.S. entomologist * [[Matilda Smith]] (1854–1926, '''M.Sm.'''), British botanist * [[Matthew Edward Smith]] ('''M.E.Sm.'''), U.S. mycologist * [[Maudy T. Smith]] ({{int:born}} 1940, '''M.T.Sm.'''), mycologist * [[Megan L. Smith]], U.S. herpetologist * [[Meredith Joan Smith]], mammalogist * [[Michael J. Smith]], U.S. entomologist * [[Michael Leonard Smith]], U.S. ichthyologist * [[Moya Meredith Smith]], paleontologist * [[Nathan D. Smith]], US paleontologist * [[Nathan P. Smith]] ('''N.P.Sm.'''), botanist * [[Nigel Jeremy Trendell-Smith]], microbiologist * [[Patrick M. Smith]], U.S. paleontologist * [[Paul G. Smith]] (fl. 1958, '''P.G.Sm.'''), botanist * [[Paul Hamilton Smith]] ('''P.H.Sm.''') * [[Paul Smith]], Paraguayan ornithologist * [[Peter J. Smith (zoologist)]], Australian zoologist * [[Peter John Smith (botanist)]], ({{int:born}} 1931, fl. 1976–1992, '''P.J.Sm.'''), Australian botanist * [[Peter R. Smith]] ('''P.R.Sm.''') * [[Philip Morgans Smith]] (1941–2004, '''P.M.Sm.'''), botanist * [[Philip Wayne Smith]], entomologist * [[R.B. Smith]] ('''R.B.Sm.''') * [[R.J. Smith]] ('''R.J.Sm.''') * [[Rachel R. Smith]], U.S. entomologist * [[Ralph Elliott Smith]] (1874–1953, '''R.E.Sm.'''), botanist * [[Ray Fred Smith]] (1919–1999), U.S. entomologist * [[Raymond Vaughan Smith]] ({{int:born}} 1923, '''R.V.Sm.'''), botanist * [[Richard Gordon Smith]], British naturalist * [[Richard L. Smith]] ('''R.L.Sm.'''), phycologist * [[Richard Smith (paleontologist)|Richard Smith]], Belgian paleontologist * [[Richard Smith (Botanist)|Richard Smith]] (fl. 1862, '''R.Sm.'''), botanist * [[Richard Smith]], British ichthyologist * [[Robert Roy Smith]] (1934–1993), '''R.R.Sm.''', botanist * [[Robin James Smith]], ostracodologist * [[Robin Y. Smith]], Canadian paleobotanist * [[Roger Malcolm Harris Smith]], South African palaeontologist * [[Ronald Ian Lewis-Smith]] ({{int:born}} 1942, '''R.I.L.Sm.'''), lichenologist and bryologist * [[Rosa Smith Eigenmann]] (1858–1947), U.S. ichthyologist * [[Roy E. Smith]], English paleontologist * [[Rozella Blood Smith]] (1911–1987), U.S. herpetologist * [[Ruth C. Smith]] (1908–1982, '''R.C.Sm.'''), botanist * [[Sarah A. Smith]], Australian herpetologist * [[Sarah M. Smith]], U.S. entomologist * [[Selena Y. Smith]] ('''S.Y.Sm.'''), palaeobotanist * [[Shannon S. Smith]], entomologist * [[Sheri L. Smith]], entomologist * [[Sidney Irving Smith]] (1843–1926), U.S. entomologist and zoologist * [[Stacey D. Smith]] (fl. 2011, '''S.D.Sm.'''), botanist * [[Stanley G. Smith]], cytogeneticist * [[Stanley Galen Smith]] (1926–2015, '''S.G.Sm.'''), U.S. botanist * [[Stanley Jay Smith]] ('''S.J.Sm.''') * [[Stephen David Anthony Smith]], Australian marine biologist * [[Tarleton F. Smith]] (1916–2012), U.S. herpetologist * [[Tessa R. Smith]], Australian entomologist * [[Theobald Smith]] (1859–1938, '''Th.Sm.'''), U.S. parasitologist. * [[Thierry Smith]] ('''Thierry Sm.'''), Belgian palaeontologist * [[Trevor Randall Smith]], U.S. entomologist * [[Verna Z. Smith]], ostracodologist * [[William Smith]] (1808–1857, '''W.Sm.'''), phycologist, botanist. * [[William Gardner Smith]] (1866–1928, '''Wm.G.Sm.'''), Scottish botanist and mycologist * [[William Henry Smith]], U.S. herpetologist * [[William Leo Smith]], U.S. ichthyologist * [[Worthington George Smith]] (1835–1917, '''W.G.Sm.'''), English plant pathologist and mycologist }} {{Disambiguation|cat=people}} o9mudkzfohh5ym33rb7fdvoohq03r8n Rossi 0 117789 11322262 11040912 2026-10-21T19:36:00Z The editor 2345 2915305 /* */ 11322262 wikitext text/x-wiki {{refer|authority}} * [[André Linhares Rossi]], Brazilian spongiologist * [[Andrea Rossi]], Italian arachnologist * [[Anna Rita Rossi]], Italian ichthyologist * [[Catalina di Rossi]], Argentine carcinologist * [[Chiara Rossi]], Italian carcinologist * [[Elisabetta Rossi]], Italian entomologist * [[Friedrich W. Rossi]], entomologist and arachnologist * [[Giullia de F. Rossi]], arachnologist * [[Graziano Rossi]] (born 1960; '''G.Rossi'''), botanist * [[Gustav de Rossi]], entomologist * [[Ilana Rossi]], helminthologist * [[Mariana Fonseca Rossi]] - protozoologist * [[Natália Rossi]], carcinologist * [[Nelida H. Rossi]], entomologist * [[Pietro Rossi]] (1738–1804), Italian entomologist and arachnologist * [[Raphaela Horti Campos Rossi]], Brazilian annelidologist * [[Rogério V. Rossi]], Brazilian mammalogist * [[Valeria Rossi]] (born 1959), Italian zoologist {{int disambiguation |cat=people}} 68gl5qbfy49bqdvqipyn048zmfs45qz 11322263 11322262 2026-10-21T19:36:27Z The editor 2345 2915305 /* */ 11322263 wikitext text/x-wiki {{refer|authority}} * [[André Linhares Rossi]], Brazilian spongiologist * [[Andrea Rossi]], Italian arachnologist * [[Anna Rita Rossi]], Italian ichthyologist * [[Catalina di Rossi]], Argentine carcinologist * [[Chiara Rossi]], Italian carcinologist * [[Elisabetta Rossi]], Italian entomologist * [[Friedrich W. Rossi]], entomologist and arachnologist * [[Giullia de F. Rossi]], arachnologist * [[Graziano Rossi]] (born 1960; '''G.Rossi'''), Italian botanist * [[Gustav de Rossi]], German entomologist * [[Ilana Rossi]], Brazilian helminthologist * [[Mariana Fonseca Rossi]], protozoologist * [[Natália Rossi]], carcinologist * [[Nelida H. Rossi]], entomologist * [[Pietro Rossi]] (1738–1804), Italian entomologist and arachnologist * [[Raphaela Horti Campos Rossi]], Brazilian annelidologist * [[Rogério V. Rossi]], Brazilian mammalogist * [[Valeria Rossi]] (born 1959), Italian zoologist {{int disambiguation |cat=people}} ok6pyoj7jjbz69oh4ctxeot3kad0waa 11322264 11322263 2026-10-21T19:36:44Z The editor 2345 2915305 /* */ 11322264 wikitext text/x-wiki {{refer|authority}} * [[André Linhares Rossi]], Brazilian spongiologist * [[Andrea Rossi]], Italian arachnologist * [[Anna Rita Rossi]], Italian ichthyologist * [[Catalina di Rossi]], Argentine carcinologist * [[Chiara Rossi]], Italian carcinologist * [[Elisabetta Rossi]], Italian entomologist * [[Friedrich W. Rossi]], entomologist and arachnologist * [[Giullia de F. Rossi]], arachnologist * [[Graziano Rossi]] (born 1960; '''G.Rossi'''), Italian botanist * [[Gustav de Rossi]], German entomologist * [[Ilana Rossi]], Brazilian helminthologist * [[Mariana Fonseca Rossi]], protozoologist * [[Natália Rossi]], Brazilian carcinologist * [[Nelida H. Rossi]], entomologist * [[Pietro Rossi]] (1738–1804), Italian entomologist and arachnologist * [[Raphaela Horti Campos Rossi]], Brazilian annelidologist * [[Rogério V. Rossi]], Brazilian mammalogist * [[Valeria Rossi]] (born 1959), Italian zoologist {{int disambiguation |cat=people}} 95o036jvxxj93nad0fa57iqfer4yekl Lagurus ovatus 0 120276 11322285 10876587 2026-10-21T19:55:13Z RLJ 134478 11322285 wikitext text/x-wiki {{image|Lagurus ovatus.jpg|''Lagurus ovatus'', Calvi, Corsica, France}} =={{int:Taxonavigation}}== {{Lagurus (Poaceae)}} Species: ''[[Lagurus ovatus]]'' =={{int:Name}}== ''Lagurus ovatus'' {{a|Carolus Linnaeus|L.}}, Sp. Pl. 1: {{BHL|page/358100|81}} (1753) ==={{int:Synonyms}}=== {{HET}} ** ''Imperata ovata'' {{a|Leopold Trattinnick|Tratt.}}, Fl. Österr. Kaiserth.: 80 (1816), pro syn. ** ''Lagurus dalmaticus'' {{a|Michel Gandoger|Gand.}}, Contr. Fl. Terr. Slav. Merid. 1: 33 (1883) ** ''Lagurus dimorphus'' {{aut|Gand.}}, Contr. Fl. Terr. Slav. Merid. 1: 34 (1883) ** ''Lagurus freynii'' {{aut|Gand.}}, Contr. Fl. Terr. Slav. Merid. 1: 34 (1883) ** ''Lagurus humilis'' {{aut|Gand.}}, Contr. Fl. Terr. Slav. Merid. 1: 33 (1883) ** ''Lagurus longifolius'' {{aut|Gand.}}, Contr. Fl. Terr. Slav. Merid. 1: 33 (1883) ** ''Lagurus nitens'' {{a|Michele Lojacono Pojero|Lojac.}}, Fl. Sicul. 3: 286 (1909) ** ''Lagurus ovatus'' var. ''glabrilemmis'' {{a|René Charles Joseph Ernest Maire|Maire}}, Bull. Soc. Hist. Nat. Afrique N. 32: 222 (1941) ** ''Lagurus ovatus'' var. ''globosus'' {{a|Michael Zohary|Zohary}}, Beih. Bot. Centralbl. 51(2): 294 (1933) ** ''Lagurus ovatus'' var. ''nanus'' {{a|Giovanni Gussone|Guss.}}, Fl. Sicul. Syn. 1: 127 (1842) *** ''Lagurus ovatus'' subsp. ''nanus'' ({{aut|Guss.}}) {{a|Albina Messeri|Messeri}}, Nuovo Giorn. Bot. Ital., n.s., 49: 185 (1942) ** ''Lagurus ovatus'' var. ''subglaber'' {{a|Hildemar Wolfgang Scholz|H.Scholz}}, Willdenowia 19: 405 (1990) ** ''Lagurus ovatus'' var. ''vestitus'' {{a|Albina Messeri|Messeri}}, Nuovo Giorn. Bot. Ital., n.s., 47: 234 (1940) *** ''Lagurus ovatus'' subsp. ''vestitus'' ({{aut|Messeri}}) {{a|Salvatore Brullo|Brullo}}, Colloqu. Phytosoc. 12: 81 (1985) ** ''Lagurus ovatus'' var. ''villilemmis'' {{aut|Maire}}, Bull. Soc. Hist. Nat. Afrique N. 32: 222 (1941) ** ''Lagurus siculus'' {{aut|Lojac.}}, Fl. Sicul. 3: 286 (1909), pro syn. {{nadi| * '''Continental: Europe''' ** {{grey|'''Regional: Northern Europe'''}} *** {{grey|Great Britain, Ireland (introduced).}} ** {{grey|'''Regional: Middle Europe'''}} *** {{grey|Austria, Czechia-Slovakia, Germany (introduced).}} ** '''Regional: Southwestern Europe''' *** Baleares, Corse, France, Portugal, Sardegna, Spain. ** '''Regional: Southeastern Europe''' *** Albania, Bulgaria, Greece, Italy, Kriti, Sicilia, Türkiye-in-Europe, Northwest Balkan Peninsula. ** '''Regional: Eastern Europe''' *** Krym. * '''Continental: Africa''' ** '''Regional: Northern Africa''' *** Algeria, Egypt, Libya, Morocco, Tunisia. ** '''Regional: Macaronesia''' *** Azores, Canary Islands, Madeira. ** {{grey|'''Regional: Southern Africa'''}} *** {{grey|Cape Provinces, Northern Provinces (introduced).}} * '''Continental: Asia-Temperate''' ** {{grey|'''Regional: Russian Far East'''}} *** {{grey|Primorye (introduced).}} ** '''Regional: Caucasus''' *** Transcaucasus. ** '''Regional: Western Asia''' *** Cyprus, East Aegean Islands, Lebanon-Syria, Palestine, Türkiye. ** '''Regional: Arabian Peninsula''' *** Saudi Arabia. * {{grey|'''Continental: Asia-Tropical''' (introduced)}} ** {{grey|'''Regional: Indian Subcontinent'''}} *** {{grey|West Himalaya.}} ** {{grey|'''Regional: Malesia'''}} *** {{grey|Jawa.}} * {{grey|'''Continental: Australasia''' (introduced)}} ** {{grey|'''Regional: Australia'''}} *** {{grey|Norfolk Islands, New South Wales, Queensland, South Australia, Tasmania, Victoria, Western Australia.}} ** {{grey|'''Regional: New Zealand'''}} *** {{grey|Chatham Islands, New Zealand North, New Zealand South.}} * {{grey|'''Continental: Northern America''' (introduced)}} ** {{grey|'''Regional: Western Canada'''}} *** {{grey|Alberta.}} ** {{grey|'''Regional: Eastern Canada'''}} *** {{grey|Ontario, Québec.}} ** {{grey|'''Regional: Northwestern U.S.A.'''}} *** {{grey|Oregon.}} ** {{grey|'''Regional: Northeastern U.S.A.'''}} *** {{grey|Connecticut, New Jersey.}} ** {{grey|'''Regional: Southwestern U.S.A.'''}} *** {{grey|California.}} ** {{grey|'''Regional: South-Central U.S.A.'''}} *** {{grey|New Mexico.}} ** {{grey|'''Regional: Southeastern U.S.A.'''}} *** {{grey|Florida, North Carolina.}} ** {{grey|'''Regional: Mexico'''}} *** {{grey|Mexico Southwest.}} * {{grey|'''Continental: Southern America''' (introduced)}} ** {{grey|'''Regional: Western South America'''}} *** {{grey|Ecuador.}} ** {{grey|'''Regional: Brazil'''}} *** {{grey|Brazil South.}} ** {{grey|'''Regional: Southern South America'''}} *** {{grey|Argentina Northeast, Chile Central, Chile South, Uruguay.}} }} =={{int:References}}== ==={{int:Primary references}}=== {{Linnaeus, 1753}} ==={{int:Links}}=== {{PWO|2024|Sept.|10}} {{IPNI||2024|10. Sept}} == {{int:Vernacular names}} == {{VN |de=Samtgras |el=''Λάγουρος ο ωοειδής'', βουτόμι |en=Hare's-tail |fi=Jänönhäntä |it=Coda di lepre |ja=ウサギノオ(兎の尾), ラグラス |nl=Hazenstaart |tr=Tavşankuyruğu }} {{Commonscat}} {{Taxonbar}} [[Category:Carolus Linnaeus taxa]] b64jy5fy9u7ieo8jec6857zd00o40ix Osvaldo Alfredo Reig 0 120824 11322197 11312335 2026-10-21T18:25:15Z The editor 2345 2915305 /* Publications */ 11322197 wikitext text/x-wiki {{image}} '''Osvaldo Alfredo Reig''' (1929–1992), Argentine palaeontologist. * Departamento de Ciencias Biológicas, Universidad de Buenos Aires, Pabellón II, 4to, Piso, Ciudad Universitaria, Núñez, 1428 Buenos Aires, Argentina. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===1955=== {{Reig, 1955}} {{Stipanicic & Reig, 1955}} ===1956=== {{Reig, 1956}} ===1957=== {{Reig, 1957}} {{Stipanicic & Reig, 1957}} ===1958=== {{Reig, 1958}} ===1960=== * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1960. Las relaciones genéricas del anuro chileno ''Calyptocephalella gayi'' ({{aut|Dum. & Bibr.}}). In ''Actas y trabajos del Primer Congreso Sudamericano de Zoología (La Plata, 12–24 Octubre 1959)'', 4: 113–147. La Plata: Comisión de Investigación Científica de la Provincia de Buenos Aires y Consejo Nacional de Investigaciones Científicas y Técnicas. ===1961=== * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1961. Noticia sobre un nuevo anuro fosil del Jurasico de Santa Cruz (Patagonia). ''[[ISSN 0002-7014|Ameghiniana]]'' 2(5): 73–78. * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1961. Las integraciones cenogeneticas en el desarrollo e la fauna de vertebrados tetrapodos de America del sur. ''[[ISSN 0002-7014|Ameghiniana]]'' 2(8): 131–140. * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1961. Elucidacion de las relaciones de los tecodontes desmatosuquios. ''[[ISSN 0002-7014|Ameghiniana]]'' 2(11): 210. * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1961. Acerca de la posición sistemática de la familia Rauisucidae y del género "''Saurosuchus''". (Reptilia, Thecodontia). ''[[ISSN 0327-7356|Revista del Museo Municipal de Ciencias Naturales y Tradicional de Mar del Plata.]]'' 1: 73–114. ===1963=== {{Reig, 1963}} {{Reig & Limeses, 1963}} ===1972=== {{Reig & Simpson, 1972}} ===1978=== {{Reig, 1978}} ===1984=== {{Reig, 1984}} ===1991=== {{Reig & Quintana, 1991}} {{Authority control}} {{DEFAULTSORT:Reig, Osvaldo Alfredo}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] hpa8qo3ue14d98cjyr115x6yiyqh7ts Albert Wilson 0 123635 11322409 9761159 2026-10-21T22:03:20Z The editor 2345 2915305 11322409 wikitext text/x-wiki {{image}} '''Albert Wilson''' (1862-1949), Irish field-bryologist and lichenologist {{IPNI standard form|A.Wilson}} {{Taxa authored}} =={{int:Publications}}== {{inc}} =={{int:External links}}== *[https://web.archive.org/web/20060924204051/http://ralph.cs.cf.ac.uk/HOB/Wilson.pdf Biography of Albert Wilson] {{Authority control}} {{DEFAULTSORT:Wilson, Albert}} [[Category:Taxon authorities]] [[Category:Bryologists]] [[Category:Lichenologists]] 1x13o46i8q0591egx3kvapqzyu2c7sk Riddell 0 130262 11322429 309498 2026-10-21T22:17:42Z The editor 2345 2915305 /* */ 11322429 wikitext text/x-wiki {{Refer|authority}} * [[Jill Riddell]], U.S. mycologist * [[John Leonard Riddell]] (1807–1865), U.S. botanist {{Disambiguation|cat=people}} egjbcdp5gw7noi8t9rdcmylna90gbjz Pseudomonas beijerinckii 0 133363 11322935 788835 2026-10-22T10:00:06Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322935 wikitext text/x-wiki #REDIRECT [[Chromohalobacter beijerinckii]] [[Category:Eponyms of Martinus Beijerinck]] 1a3u8sjiqm52dcx7l1jw6zjn0dliwak Chromohalobacter beijerinckii 0 133365 11322934 10171261 2026-10-22T09:59:56Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322934 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Chromohalobacter}} Species: '''''Chromohalobacter beijerinckii''''' =={{int:Name}}== ''Chromohalobacter beijerinckii'' ([[Hof]], 1935) [[Peçonek]] et al., 2006 =={{int:Synonyms}}== ''Pseudomonas beijerinckii'' [[Hof]], 1935 =={{int:References}}== * {{NCBI|86179}} {{Taxonbar|from=Q5113884}} [[Category:Eponyms of Martinus Beijerinck]] 45q3mbw3rzgfi4e4hsjbi9ofsykfqox William Schaus 0 133920 11322014 11317322 2026-10-21T14:14:29Z FrankB157 2872707 Schaus, 1914 11322014 wikitext text/x-wiki {{Image}} '''William Schaus''' (1858–1942), U.S. entomologist and botanist. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1889=== {{Schaus, 1889}} ===1890=== {{Schaus,W, 1890}} ===1892=== {{Schaus, 1892}} {{Schaus, 1892a}} {{Schaus, 1892b}} ===1893=== {{Schaus & Clements, 1893}} ===1894=== {{Schaus, 1894}} {{Schaus, 1894a}} ===1895=== {{Schaus, 1895}} ===1896=== {{Schaus, 1896}} {{Schaus, 1896a}} {{Schaus, 1896b}} {{Schaus, 1896c}} ===1897=== {{Schaus, 1897}} ===1898=== {{Schaus, 1898}} ===1899=== {{Schaus, 1899}} ===1900=== {{Schaus, 1900}} ===1901=== {{Schaus,W, 1901}} {{Schaus, 1901a}} {{Schaus, 1901b}} {{Schaus, 1901c}} (Volume date 1900/1901, but article with footer "June 1901" on p.241). {{Schaus, 1901d}} {{Schaus, 1901e}} ===1902=== {{Schaus,W, 1902}} ===1904=== {{Schaus, 1904}} ===1905=== {{Schaus, 1905}} ===1906=== {{Schaus, 1906}} ===1910=== {{Schaus, 1910}} {{Schaus, 1910a}} {{Schaus, 1910c}} ===1911=== {{Schaus, 1911c}} {{Schaus, 1911a}} {{Schaus, 1911d}} {{Schaus, 1911b}} {{Schaus, 1911e}} {{Schaus, 1911f}} {{Schaus, 1911}} {{Schaus, 1911g}} === 1912 === {{Schaus, 1912b}} {{Schaus, 1912a}} {{Schaus, 1912c}} {{Schaus, 1912d}} {{Schaus, 1912e}} {{Schaus, 1912f}} {{Schaus, 1912}} {{Schaus, 1912g}} {{Schaus, 1912h}} ===1913=== {{Schaus,W, 1913}} {{Schaus,W, 1913a}} {{Schaus,W, 1913b}} {{Schaus, 1913e}} {{Schaus, 1913f}} {{Schaus,W, 1913c}} {{Schaus,W, 1913d}} ===1914=== {{Schaus, 1914}} ===1915=== {{Schaus, 1915}} {{Schaus, 1915a}} ===1916=== {{Schaus, 1916}} ===1919=== {{Schaus, 1919}} ===1920=== {{Schaus, 1920}} ===1921=== {{Schaus, 1921a}} {{Schaus, 1921}} ===1922=== {{Schaus, 1922}} ===1924=== {{Schaus, 1924}} ===1927=== {{Schaus, 1927}} {{Schaus, 1927b}} {{Schaus, 1927c}} ===1928=== {{Schaus, 1928}} {{Schaus, 1928a}} {{Schaus, 1928b}} ===1929=== {{Schaus, 1929}} {{Schaus, 1929b}} ===1933=== {{Schaus, 1933}} {{Schaus, 1933a}} {{Schaus, 1933b}} ===1934=== {{Schaus, 1934}} ===1936=== {{Schaus, 1936}} ===1937=== {{Schaus, 1937}} ===1938=== {{Schaus, 1938}} ===1939=== {{Schaus, 1939}} {{Schaus, 1939a}} ===1940=== {{Schaus, 1940}} {{Schaus, 1940a}} ===1941=== {{Schaus, 1941}} =={{int:References}}== ==={{int:Links}}=== * [http://siarchives.si.edu/findingaids/FARU7100.htm William Schaus Papers] {{Authority control}} {{DEFAULTSORT:Schaus, William}} [[Category:Taxon authorities]] [[Category:Botanists]] [[Category:Entomologists]] nkifjwj2cmskllmxavm410lkrx7siwd Androsace helvetica 0 136988 11322366 8956944 2026-10-21T21:09:29Z TadejM 24665 /* {{int:Vernacular names}} */ +sl 11322366 wikitext text/x-wiki {{Image|AndrosaceHelvetica.jpg}} =={{int:Taxonavigation}}== {{Androsace}} Species: ''[[Androsace helvetica]]'' =={{int:Name}}== ''Androsace helvetica'' ({{a|L.}}) {{a|All.}}, Fl. Pedem. 1: 91 (1785). ==={{int:Synonyms}}=== {{HOT}} ** ''Diapensia helvetica'' {{aut|L.}}, Sp. Pl.: 141 (1753). ** ''Androsace aretia'' {{a|Lapeyr.}}, Hist. Pl. Pyrénées: 91 (1813), [[nom. illeg.]] ** ''Androsace diapensia'' {{a|Vill.}}, Hist. Pl. Dauphiné 2: 472 (1787), [[nom. superfl.]] ** ''Androsace imbricata'' {{a|Lam.}}, Fl. Franç. 2: 253 (1779), nom. superfl. ** ''Aretia helvetica'' ({{aut|L.}}) {{aut|L.}}, J.A.Murray (ed.), Syst. Veg. ed. 13: 162 (1774). ** ''Primula helvetica'' ({{aut|L.}}) {{a|Kuntze}}, Revis. Gen. Pl. 2: 400 (1891). ** ''Primula imbricata'' {{aut|Kuntze}}, Revis. Gen. Pl. 2: 400 (1891), nom. superfl. {{HET}} ** ''Androsace bryoides'' {{a|DC.}}, J.B.A.M.de Lamarck & A.P.de Candolle, Fl. Franç., éd. 3, 3: 440 (1805). ** ''Aretia bryoides'' ({{aut|DC.}}) {{a|Loisel.}}, Fl. Gall. 1: 111 (1806). ** ''Primula bryoides'' ({{aut|DC.}}) {{aut|Kuntze}}, Revis. Gen. Pl. 2: 400 (1891). ** ''Primula willkommii'' {{a|Derganc}}, Allg. Bot. Z. Syst. 10: 111 (1904). =={{int:References}}== ==={{int:Links}}=== {{PWO|2022|October|9}} {{IPNI|700308-1|2022|October 9}} {{World Plants|2022|October|9}} {{Catol-Hassler|2022|October|9}} =={{int:Vernacular names}}== {{VN |de=Schweizer Mannsschild |sl=švicarski oklep }} {{Commons category}} {{Taxonbar}} [[Category:Carlo Allioni taxa]] 786p47199cvhazkyw8p9eb7ez6zrse1 Scott Barchard Wilson 0 141897 11322411 10500731 2026-10-21T22:04:20Z The editor 2345 2915305 11322411 wikitext text/x-wiki '''Scott Barchard Wilson''' (1865–1923), English {{int:ornithologist}}. {{Taxa authored}} {{Eponyms}} {{Authority control}} {{DEFAULTSORT:Wilson, Scott Barchard}} [[Category:Taxon authorities]] [[Category:Ornithologists]] ex8cahw88pdy9tk7clz3du5qa8tfsky John Smith 0 145567 11322422 9207856 2026-10-21T22:09:50Z The editor 2345 2915305 11322422 wikitext text/x-wiki {{Image}} '''John Smith''' (1798–1888), British botanist. {{IPNI standard form|J.Sm.}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Smith, 1841}} {{Smith, 1842}} {{Smith, 1842a}} {{Smith, 1842b}} {{Smith, 1845}} {{Smith, 1866}} {{Smith, 1875}} {{Smith, 1877}} =={{int:External links}}== *[https://doi.org/10.1093/ref:odnb/59325 Index to Oxford Dictionary of National Biography] {{Authority control}} {{DEFAULTSORT:Smith, John}} [[Category:Taxon authorities]] [[Category:Botanists]] cj1mpicixn5knllmddvjc0sz788hvmi Truncatella 0 145849 11322358 11158325 2026-10-21T21:04:38Z Isfisk 2639 11322358 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Truncatella}} Subgenera: {{subg|T|runcatella|Tomlinitella}} {{subglast|T|runcatella|Truncatella}} =={{int:Name}}== ''Truncatella'' {{a|Antoine Risso|Risso}}, 1826 {{int:Type species}}: ''Truncatella laevigata'' Risso, 1826, = ''Truncatella subcylindrica'' (Linnaeus, 1758) ==={{int:Synonyms}}=== * ''Acmea'' Hartmann, 1821 * ''Fidelis'' Risso, 1826 * ''Truncatella'' Lowe, 1832 * ''Erpetometra'' Lowe, 1832 * ''Choristoma'' de Cristophori & Jan, 1832 * ''Truncatula'' Leach, 1847 * ''Zeanoë'' Leach, 1852 * ''Glaucothoë'' Leach, 1852 * ''Herpetometra'' "Lowe" Gray, 1856 * ''Albertisia'' Issel, 1880 * ''Truncatula'' "Risso" Caziot, 1910 * ''Truncatella (Blandiella)'' Guppy, 1871 * ''Albertisia'' Issel, 1880 * ''Blandiella'' Guppy, 1871 =={{int:References}}== {{Risso, 1826a}} * {{aut|Clench, W.J. & Turner, R.D.}} 1948. A catalogue of the family Trunctatellidae with notes and descriptions of new species. ''[[Occasional Papers on Mollusks]]'' 1(13): 157–212. [[Category:Antoine Risso taxa]] 3zhu918h06bq09btsk4ykrnj4lexkm7 Frank Glaw 0 146109 11322402 11304633 2026-10-21T22:00:57Z Burmeister 9074 +4 11322402 wikitext text/x-wiki {{Image}} '''Frank Glaw''' ({{int:born}} 1966), German herpetologist. * Zoologische Staatssammlung München, München, Germany. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1991=== {{Vences & Glaw, 1991}} {{Glaw & Vences, 1991a}} ===1992=== {{Glaw & Vences, 1992}} ===1994=== {{Glaw & Vences, 1994}} ===1997=== {{Lötters et al., 1997}} {{Ziegler et al., 1997}} ===1998=== {{Vallan et al., 1998}} ===2000=== {{Glaw, Vences & Gossmann, 2000}} ===2001=== {{Glaw, Vences & Schmidt, 2001}} {{Vences et al., 2001}} ===2002=== {{Glaw & Vences, 2002}} ===2003=== {{Vallan, Vences & Glaw, 2003}} {{Nagy et al., 2003}} ===2004=== {{Glaw & Vences, 2004}} {{Schönecker, Bach & Glaw, 2004}} ===2005=== {{Glaw & Vences, 2005}} {{Glaw, Franzen & Vences, 2005}} {{Glaw, Vences & Nussbaum, 2005}} {{Glos, Glaw & Vences, 2005}} {{Vences, Andreone & Glaw, 2005}} ===2006=== {{Glaw & Franzen, 2006}} {{Glaw & Vences, 2006}} {{Glaw, Hoegg & Vences, 2006}} {{Glaw et al., 2006}} ===2007=== {{Glaw, Nagy & Vences, 2007}} {{Glaw & Vences, 2007}} {{Glaw et al., 2007a}} {{Glaw et al., 2007b}} * {{aut|Greenbaum, Eli, Aaron M. Bauer, Todd R. Jackman, Miguel Vences & Frank Glaw.}} 2007. A phylogeny of the enigmatic Madagascan geckos of the genus ''Uroplatus'' (Squamata: Gekkonidae). ''Zootaxa'' 1493: 41–51. {{Köhler, Glaw & Vences, 2007}} {{Nagy et al., 2007}} ===2008=== {{Jackman et al., 2008}} {{Köhler, Glaw & Vences, 2008}} {{Kurabayashi et al., 2008}} {{Rösler & Glaw, 2008}} * {{aut|D’Cruze, N., Köhler, J.,. Franzen, M & Glaw, F.}} 2008. A conservation assessment of the amphibians and reptiles of the Forêt d’Ambre Special Reserve, north Madagascar. ''Madagascar Conservation & Development'' 3(1): 44–54. ===2009=== {{Glaw, Köhler & Vences, 2009}} {{Franzen et al., 2009}} {{Glaw et al., 2009}} {{Köhler et al., 2009b}} {{Puente et al., 2009}} {{Wagner et al., 2009a}} {{Wallach & Glaw, 2009}} ===2010=== * {{aut|Gehring, P.-S., A. Crottini, F. Glaw, S. Hauswaldt & F. M. Ratsoavina}} 2010. Notes on the natural history, distribution and malformations of day geckos (''Phelsuma'') from Madagascar ''Herpetology Notes'' 3: 321–327. {{Vences et al., 2010d}} {{Vences et al., 2010c}} {{Glaw, Köhler & Vences, 2010}} {{Gehring et al., 2010a}} {{Köhler et al., 2010a}} {{Köhler et al., 2010b}} * {{aut|Rödder, D., O. Hawlitschek & F. Glaw}} 2010. Environmental niche plasticity of the endemic gecko ''Phelsuma parkeri'' {{aut|Loveridge}} 1941 from Pemba Island, Tanzania: a case study of extinction risk on flat islands by climate change. ''Tropical Zoology'' 23(1): 35–49 * {{aut|Köhler, J., M. Vences, N. D'Cruze & F. Glaw}} 2010. Giant dwarfs: discovery of a radiation of large-bodied 'stump-toed frogs' from karstic cave environments of northern Madagascar. ''Journal of Zoology'' 282: 21–38 {{Nagy, Glaw & Vences, 2010}} {{Vences et al., 2010b}} {{Rösler & Glaw, 2010}} * {{aut|Vargas-Ramírez, M., M. Vences, W. R. Branch, S. R. Daniels, F. Glaw, M. D. Hofmeyr, G. Kuchling, J. Maran, T. J. Papenfuss, P. Široký, D. R. Vieites & U. Fritz}} 2010. Deep genealogical lineages in the widely distributed African helmeted terrapin: Evidence from mitochondrial and nuclear DNA (Testudines: Pelomedusidae: Pelomedusa subrufa). ''Molecular Phylogenetics and Evolution'' 56: 428–440. {{Glaw et al., 2010b}} * {{aut|D'Cruze, N., J. Köhler, M. Vences & F. Glaw}} 2010. A new fat fossorial frog (Microhylidae: Cophylinae: Rhombophryne) from rainforest of the Forêt d'Ambre Special Reserve, northern Madagascar. ''Herpetologica'' 66(2): 182–191. * {{aut|Bora, P., J. C. Randrianantoandro, R. Randrianavelona, E. F. Hantalalaina, R. R. Andriantsimanarilafy, D. Rakotondravony, O. R. Ramilijaona, M. Vences, R. K. B. Jenkins, F. Glaw & J. Köhler}} 2010. Amphibians and reptiles of the Tsingy de Bemaraha plateau, western Madagascar: checklist, biogeography and conservation. ''Herpetological Conservation and Biology'' 5(1): 111–125. * {{aut|Rocha, S., H. Rösler, P.-S. Gehring, F. Glaw, D. Posada, D. J. Harris & M. Vences}} 2010. Phylogenetic systematics of day geckos, genus Phelsuma, based on molecular and morphological data (Squamata: Gekkonidae). ''Zootaxa'' 2429: 1–28. {{Glaw et al., 2010a}} {{Vieites et al., 2010}} {{Vences et al., 2010a}} {{Vallan, Vences & Glaw, 2010}} ===2011=== {{Bauer et al., 2011}} {{Crottini et al., 2011}} {{Gehring et al., 2011}} {{Köhler et al., 2011}} {{Lehtinen, Glaw & Vences, 2011}} {{Miralles et al., 2011}} {{Miralles et al., 2011a}} {{Pabijan et al., 2011}} {{Ratsoavina et al., 2011}} {{Wollenberg et al., 2011}} * {{aut|Glaw, F., J. Köhler & M. Vences}} 2011. New species of ''Gephyromantis'' from Marojejy National Park, Northeast Madagascar. ''Journal of Herpetology'' 45(2): 155–160. * {{aut|Vences, M., J. Köhler, D. R. Vieites & F. Glaw}} 2011. Molecular and bioacoustic differentiation of deep conspecific lineages of the Malagasy treefrogs ''Boophis tampoka'' and ''B.&nbsp;luteus''. ''Herpetology Notes'' 4: 239–246. * {{aut|Randrianiaina, R.-D., J. Köhler, J. Glos, M. Vences & F. Glaw}} 2011. Where to grow in the Tsingy? Limestone rock pools as breeding habitats of the relict frog ''Tsingymantis antitra'' from Madagascar and description of its tadpole. ''Salamandra'' 47(2): 77–89. * {{aut|Irisarri, I., M. Vences, D. San Mauro, F. Glaw & R. Zardoya}} 2011. Reversal to air-driven sound production revealed by a molecular phylogeny of tongueless frogs, family Pipidae. ''BMC Evolutionary Biology'' 2011, 11: 114. * {{aut|Townsend, T. M., K. A. Tolley, F. Glaw, W. Böhme & M. Vences}} 2011. Eastward from Africa: palaeocurrent-mediated chameleon dispersal to the Seychelles islands. ''Biology Letters'' 7(2): 225–228. * {{aut|Crottini, A., F. Glaw, M. Casiraghi, R. K. B. Jenkins, V. Mercurio, C. Randrianantoandro, J. E. Randrianirina & F. Andreone}} 2011. A new ''Gephyromantis (Phylacomantis)'' frog species from the pinnacle karst of Bemaraha, western Madagascar. ''Zookeys'' 81: 51–71. * {{aut|Randrianiaina, R.-D., A. Strauß, J. Glos, F. Glaw & M. Vences}} 2011. Diversity, external morphology and "reverse taxonomy" in the specialized tadpoles of Malagasy river bank frogs of the subgenus ''Ochthomantis'' (genus ''Mantidactylus''). ''Contributions to Zoology'' 80(1): 17–65. * {{aut|Reeve, E., S. H. Ndriantsoa, A. Strauß, R.-D. Randrianiaina, T. Rasolonjatovo Hiobiarilanto, F. Glaw, J. Glos & M. Vences}} 2011. Acoustic underwater signals with a probable function during competitive feeding in a tadpole. ''Naturwissenschaften'' 98: 135–143. ===2012=== {{Crottini et al., 2012}} {{Glaw, Köhler & Vences, 2012}} {{Glaw et al., 2012}} {{Hawlitschek, Nagy & Glaw, 2012}} {{Kaffenberger et al., 2012}} {{Lehtinen et al., 2012}} {{Miralles et al., 2012}} {{Rakotoarison et al., 2012}} {{Vences et al., 2012}} {{Wollenberg, Glaw & Vences, 2012}} ===2013=== {{Glaw et al., 2013}} {{Hawlitschek & Glaw, 2013}} {{Klages et al., 2013}} {{Ratsoavina et al., 2013}} {{Vences et al., 2013a}} {{Wegener et al., 2013}} ===2014=== {{Crottini et al., 2014}} {{Gehara et al., 2014}} {{Glaw et al., 2014}} {{Glaw et al., 2014a}} {{Kucharzewski et al., 2014}} {{Raselimanana et al., 2014}} {{Scherz et al., 2014}} {{Vences et al., 2014}} ===2015=== {{Glaw & Rösler, 2015}} {{Glaw et al., 2015}} {{Köhler et al., 2015a}} {{Miralles et al., 2015}} {{Nagy et al., 2015}} {{Prötzel et al., 2015}} {{Rakotoarison et al., 2015}} {{Ratsoavina et al., 2015}} {{Miralles et al., 2015a}} {{Rhodin et al., 2015}} {{Scherz et al., 2015}} {{Scherz et al., 2015a}} {{Vences et al., 2015}} ===2016=== {{Hawlitschek et al., 2016}} {{Ineich, Glaw & Vences, 2016}} {{Miralles et al., 2016a}} {{Miralles et al., 2016b}} {{Scherz et al., 2016}} {{Scherz et al., 2016a}} {{Prötzel, Ruthensteiner & Glaw, 2016}} ===2017=== {{Erens et al., 2017}} {{Köhler et al., 2017}} {{Mezzasalma et al., 2017}} {{Scherz et al., 2017}} {{Scherz et al., 2017a}} {{Vences et al., 2017}} {{Vences, Köhler & Glaw, 2017}} {{Ratsoavina et al., 2017}} {{Prötzel et al., 2017}} {{Scherz et al., 2017b}} {{Scherz et al., 2017c}} {{Scherz et al., 2017d}} ===2018=== {{Bellati et al., 2018}} {{Bletz et al., 2018}} {{Glaw, Köhler & Vences, 2018}} {{Glaw et al., 2018}} {{Hawlitschek et al., 2018}} {{Lehtinen et al., 2018}} {{Prötzel et al., 2018a}} {{Prötzel et al., 2018}} {{Scherz et al., 2018}} {{Scherz et al., 2018a}} {{Sentís et al., 2018}} {{Vences et al., 2018}} ===2019=== {{Glaw et al., 2019}} {{Köhler et al., 2019}} {{Rakotoarison et al., 2019}} {{Ratsoavina et al., 2019}} {{Ratsoavina et al., 2019a}} {{Sabino-Pinto et al., 2019}} {{Scherz et al., 2019}} {{Scherz et al., 2019a}} {{Scherz et al., 2019b}} {{Scherz et al., 2019c}} {{Uetz et al., 2019}} ===2020=== {{Cocca et al., 2020}} {{Glaw et al., 2020}} {{Prötzel et al., 2020}} {{Rakotoarison et al., 2020}} {{Ratsoavina et al., 2020}} {{Rancilhac et al., 2020}} {{Réjaud et al., 2020}} {{Scherz et al., 2020}} ===2021=== {{Castillo-Urbina et al., 2021}} {{Gippner et al., 2021}} {{Glaw et al., 2021}} {{Glaw et al., 2021a}} {{Hawlitschek et al., 2021}} {{Miralles et al., 2021}} {{Scherz et al., 2021}} {{Vences et al., 2021}} ===2022=== {{Belluardo et al., 2022}} {{Mullin et al., 2022}} {{Köhler et al., 2022}} {{Mullin et al., 2022}} {{Scherz et al., 2022}} {{Vences et al., 2022}} {{Vences et al., 2022a}} ===2023=== {{Castillo-Urbina et al., 2023}} {{Glaw et al., 2023}} {{Köhler et al., 2023a}} {{Koppetsch et al., 2023}} {{Miralles et al., 2023}} {{Röll et al., 2023}} {{Vences et al., 2023}} {{Vences et al., 2023a}} {{Vences et al., 2023b}} ===2024=== {{Gabriel et al., 2024}} {{Köhler et al., 2024}} {{Rakotoarison et al., 2024a}} {{Vences et al., 2024}} {{Vences et al., 2024a}} {{Vences et al., 2024b}} ===2025=== {{Castillo-Urbina et al., 2025}} {{Glaw et al., 2025}} {{Hutter et al., 2025}} {{Martínez del Mármol et al., 2025}} {{Miralles et al., 2025}} {{Petzold et al., 2025}} {{Rakotoarison et al., 2025}} {{Rakotoarison et al., 2025a}} {{Vences et al., 2025}} {{Vences et al., 2025a}} {{Vences et al., 2025b}} ===2026=== {{Basham et al., 2026}} {{Glaw et al., 2026}} {{Miralles et al., 2026}} {{Miralles et al., 2026a}} {{Scherz et al., 2026}} {{Vences et al., 2026}} {{Vences et al., 2026a}} {{Vences et al., 2026b}} {{Authority control}} {{DEFAULTSORT:Glaw, Frank}} [[Category:Taxon authorities]] [[Category:Herpetologists]] 5pn0030140a5fo7znymg27qdl2nl2oc Miguel Vences 0 146117 11322406 11302273 2026-10-21T22:01:59Z Burmeister 9074 +4 11322406 wikitext text/x-wiki {{Image}} '''Miguel Vences''' ({{int:born}} 1969), German herpetologist. * Zoological Institute, Technical University of Braunschweig, Braunschweig, Germany. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1992=== {{Glaw & Vences, 1992}} ===1994=== {{Glaw & Vences, 1994}} ===1997=== {{Ziegler et al., 1997}} ===2000=== {{Glaw, Vences & Gossmann, 2000}} ===2001=== {{Kosuch et al., 2001}} {{Vences et al., 2001}} ===2002=== {{Glaw & Vences, 2002}} ===2003=== {{Nagy et al., 2003}} ===2004=== {{Fromhage, Vences & Veith, 2004}} ===2005=== {{Glos, Glaw & Vences, 2005}} ===2007=== {{Glaw & Vences, 2007}} ===2009=== {{Glaw, Köhler & Vences, 2009}} ===2010=== {{Preez et al., 2010}} {{Ratsoavina et al., 2010}} ===2011=== {{Crottini et al., 2011}} {{Gehring et al., 2011}} {{Miralles et al., 2011}} {{Miralles et al., 2011b}} ===2012=== {{Crottini et al., 2012}} {{Vieites, Wollenberg & Vences, 2012}} {{Glaw, Köhler & Vences, 2012}} {{Miralles et al., 2012}} {{Rakotoarison et al., 2012}} {{Wollenberg, Glaw & Vences, 2012}} ===2013=== {{Glaw et al., 2013}} {{Klages et al., 2013}} {{Lemme et al., 2013}} {{Ndriantsoa et al., 2013}} {{Ratsoavina et al., 2013}} {{Vences et al., 2013}} ===2014=== {{Crottini et al., 2014}} {{Gehara et al., 2014}} {{Raselimanana et al., 2014}} {{Scherz et al., 2014}} {{Vences et al., 2014}} ===2015=== {{Glaw et al., 2015}} {{Hutter et al., 2015}} {{Köhler et al., 2015a}} {{Miralles et al., 2015}} {{Nagy et al., 2015}} {{Rakotoarison et al., 2015}} {{Ratsoavina et al., 2015}} {{Vences et al., 2015}} {{Miralles et al., 2015a}} ===2016=== {{Ineich, Glaw & Vences, 2016}} {{Miralles et al., 2016a}} {{Miralles et al., 2016b}} {{Scherz et al., 2016}} ===2017=== {{Díaz-Rodríguez et al., 2017}} {{Köhler et al., 2017}} {{Miralles et al., 2017}} {{Rodríguez et al., 2017a}} {{Scherz et al., 2017}} {{Scherz et al., 2017a}} {{Vences et al., 2017}} {{Vences, Köhler & Glaw, 2017}} {{Ratsoavina et al., 2017}} {{Prötzel et al., 2017}} {{Scherz et al., 2017b}} {{Scherz et al., 2017c}} ===2018=== {{Glaw, Köhler & Vences, 2018}} {{Scherz et al., 2018}} {{Prötzel et al., 2018}} {{Vences, Rasoloariniaina & Riemann, 2018}} {{Lourenço-de-Moraes et al., 2018}} {{Sanchez et al., 2018}} {{Vences et al., 2018}} ===2019=== {{Glaw et al., 2019}} {{Ratsoavina et al., 2019}} {{Rakotoarison et al., 2019}} {{Sabino-Pinto et al., 2019}} {{Scherz et al., 2019}} {{Scherz et al., 2019a}} {{Scherz et al., 2019b}} {{Scherz et al., 2019c}} ===2020=== {{Rakotoarison et al., 2020}} ===2021=== {{Glaw et al., 2021}} {{Miralles et al., 2021}} {{Rivera-Correa et al., 2021a}} ===2022=== {{Köhler et al., 2022}} {{Vences et al., 2022}} ===2023=== {{Köhler et al., 2023a}} {{Kehlmaier et al., 2023}} ===2024=== {{Rakotoarison et al., 2024a}} {{Vences et al., 2024}} {{Vences et al., 2024a}} {{Vences et al., 2024b}} ===2025=== {{Castillo-Urbina et al., 2025}} {{Glaw et al., 2025}} {{Hutter et al., 2025}} {{Hutter et al., 2025a}} {{Miralles et al., 2025}} {{Moravec et al., 2025}} {{Rakotoarison et al., 2025}} {{Rakotoarison et al., 2025a}} {{Vences et al., 2025}} {{Vences et al., 2025a}} {{Vences et al., 2025b}} {{Venegas et al., 2025}} {{Zamani et al., 2025a}} ===2026=== {{Basham et al., 2026}} {{Gamboa-Yupanqui et al., 2026}} {{Glaw et al., 2026}} {{Miralles et al., 2026}} {{Miralles et al., 2026a}} {{Scherz et al., 2026}} {{Vences et al., 2026}} {{Vences et al., 2026a}} {{Vences et al., 2026b}} =={{int:References}}== ==={{int:Links}}=== * [https://www.mvences.de/cv.html CV] {{Authority control}} {{DEFAULTSORT:Vences, Miguel}} [[Category:Taxon authorities]] [[Category:Herpetologists]] [[Category:Parasitologists]] 6wg1k9rim6k7iqkkhij2sqqa6rlxf9b Martinus Beijerinck 0 146682 11322933 9884025 2026-10-22T09:59:32Z Thiotrix 61739 eponyms in category 11322933 wikitext text/x-wiki {{Image|Martinus Willem Beijerinck.jpg|Martinus Willem Beijerinck}} '''Martinus Willem Beijerinck''' (1851–1931), Dutch microbiologist and botanist. {{IPNI standard form|Beij.}} {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{Inc}} {{Beijerinck, 1890}} {{Beijerinck, 1904}} {{Commonscat|Martinus Willem Beijerinck}} {{Authority control}} {{DEFAULTSORT:Beijerinck, Martinus}} [[Category:Taxon authorities]] [[Category:Microbiologists]] [[Category:Botanists]] 2yrqmsdvrmzbanrotmkh8l40ync03x6 Psiloteredo 0 160932 11322202 10153148 2026-10-21T18:29:02Z Wikiklaas 159888 /* {{int:Name}} */ spelling error 11322202 wikitext text/x-wiki {{Psiloteredo}} Species: {{sp|P|siloteredo|healdi}} {{sp|P|siloteredo|megotara}} {{splast|P|siloteredo|senegalensis}} =={{int:Name}}== ''Psiloteredo'' [[Bartsch]], 1922: 36 {{int:Type species}}: ''Teredo dilatata'' Stimpson, 1851 by original designation, = ''[[Psiloteredo megotara]]'' Hanley, 1848 ==={{int:Synonymy}}=== * ''Dactyloteredo'' [[Moll]], 1941 =={{int:References}}== * {{aut|Bartsch, P.}} 1922. Monograph of the American shipworms. ''Bulletin of the United States National Museum'' 122: 1–48, pl. 1-37. * {{aut|Turner, R.D.}} 1966. A survey and illustrated catalogue of the Teredinidae (Mollusca: Bivalvia). Museum of Comparative Zoology, Harvard University. 263 pp. {{Taxonbar|from=Q3806733}} es1vibm26bt2dbw4qwcu9uvrx0mfxnr Hai-Li Yu 0 177659 11322154 9465096 2026-10-21T17:23:19Z Neferkheperre 947633 /* 2023 */ 11322154 wikitext text/x-wiki '''Hai-Li Yu''' ('''H.L.Yu'''), Entomologist, China * College of Life Sciences, Northwest University, Xi’an, Shaanxi Province, 710069, P. R. China. * Key Laboratory of Resource Biology and Biotechnology in Western China (Northwest University), Ministry of Education, Xi’an, Shaanxi Province, 710069, China {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2013=== {{Yu & Li, 2013}} ===2014=== {{Liu & Yu, 2014}} ===2015=== {{Luo, Fei & Yu, 2015}} ===2017=== {{Zhao, Bai & Yu, 2017}} ===2018=== {{Fei et al., 2018}} ===2019=== {{Feng, Zhuang & Yu, 2019}} ===2021=== {{Yang et al., 2021a}} ===2023=== {{Li et al., 2023l}} ===2026=== {{Hu et al., 2026c}} {{Authority control}} {{DEFAULTSORT:Yu, Hai-Li}} [[Category:Taxon authorities]] [[Category:Entomologists]] 6kdmx6vqt3etpg84v0m545u7cq1sgu4 Sorolopha 0 178421 11322152 9833975 2026-10-21T17:19:46Z Neferkheperre 947633 11322152 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Sorolopha}} Species (74): {{sp|S|orolopha|aeolochlora}} {{sp|S|orolopha|agalma}} {{sp|S|orolopha|agana}} {{sp|S|orolopha|agathopis}} {{sp|S|orolopha|angustorbis}} {{sp|S|orolopha|archimedias}} {{sp|S|orolopha|arctosceles}} {{sp|S|orolopha|argyropa}} {{sp|S|orolopha|artocincta}} {{sp|S|orolopha|asphaeropa}} {{sp|S|orolopha|asymmetrana}} {{sp|S|orolopha|atmochlora}} {{sp|S|orolopha|auribasis}} {{sp|S|orolopha|authadis}} {{sp|S|orolopha|autoberylla}} {{sp|S|orolopha|baribaris}} {{sp|S|orolopha|bathysema}} {{sp|S|orolopha|bruneiregalis}} {{sp|S|orolopha|brunnorbis}} {{sp|S|orolopha|bryana}} {{sp|S|orolopha|callichlora}} {{sp|S|orolopha|camarotis}} {{sp|S|orolopha|caryochlora}} {{sp|S|orolopha|cervicata}} {{sp|S|orolopha|chiangmaiensis}} {{sp|S|orolopha|chlorotica}} {{sp|S|orolopha|chortodes}} {{sp|S|orolopha|compsitis}} {{sp|S|orolopha|cucphuongensis}} {{sp|S|orolopha|cyclotoma}} {{sp|S|orolopha|dactyloidea}} {{sp|S|orolopha|delochlora}} {{sp|S|orolopha|dictyonophora}} {{sp|S|orolopha|dorsichlora}} {{sp|S|orolopha|doryphora}} {{sp|S|orolopha|dyspeista}} {{sp|S|orolopha|elaeodes}} {{sp|S|orolopha|englyptopa}} {{sp|S|orolopha|epichares}} {{sp|S|orolopha|euochropa}} {{sp|S|orolopha|eurychlora}} {{sp|S|orolopha|ferruginosa}} {{sp|S|orolopha|ghilarovi}} {{sp|S|orolopha|herbifera}} {{sp|S|orolopha|homalopa}} {{sp|S|orolopha|hydrargyra}} {{sp|S|orolopha|identaeolochloca}} {{sp|S|orolopha|irirectangulata}} {{sp|S|orolopha|johngreeni}} {{sp|S|orolopha|karsholti}} {{sp|S|orolopha|khaoyaiensis}} {{sp|S|orolopha|latiuscula}} {{sp|S|orolopha|leptochlora}} {{sp|S|orolopha|liochlora}} {{sp|S|orolopha|longurus}} {{sp|S|orolopha|margaritopa}} {{sp|S|orolopha|melanocycla}} {{sp|S|orolopha|metastena}} {{sp|S|orolopha|micheliacola}} {{sp|S|orolopha|mniochlora}} {{sp|S|orolopha|muscida}} {{sp|S|orolopha|nagaii}} {{sp|S|orolopha|nanlingica}} {{sp|S|orolopha|nucleata}} {{sp|S|orolopha|phyllochlora}} {{sp|S|orolopha|plinthograpta}} {{sp|S|orolopha|plumboviridis}} {{sp|S|orolopha|prasinias}} {{sp|S|orolopha|rubescens}} {{sp|S|orolopha|satoi}} {{sp|S|orolopha|semiculta}} {{sp|S|orolopha|semifulva}} {{sp|S|orolopha|singularis}} {{sp|S|orolopha|specialis}} {{sp|S|orolopha|sphaerocopa}} {{sp|S|orolopha|stygiaula}} {{sp|S|orolopha|sugiurai}} {{sp|S|orolopha|suthepensis}} {{sp|S|orolopha|tenuirurus}} {{sp|S|orolopha|timiochlora}} {{sp|S|orolopha|undula}} {{splast|S|orolopha|viridis}} =={{int:Name}}== ''Sorolopha'' [[Template:Lower, 1901|{{aut|Lower}}, 1901]]: [http://biodiversitylibrary.org/page/16140763 73] * {{int:Type species}}: ''[[Sorolopha cyclotoma]]'' [[Template:Lower, 1901|{{aut|Lower}}, 1901]] =={{int:Synonyms}}== * ''[[Acanthothyspoda]]'' [[Lower]], 1908, Trans. R. S. Austral. 32: 319. {{int:Type species}}: Acanthothyspoda elaeodes Lower, 1908. * ''[[Alypeta]]'' [[Turner]], 1916, Trans. R. S. Austral. 40: 528. {{int:Type species}}: Alypeta delochlora Turner, 1916. * ''[[Alytopeta]]'' [[Fletcher]], 1929, Mem. Dep. Agric. India (Ent.) 11: 10. [misspelling of Alypeta] * ''[[Choganhia]]'' [[Razowski]], 1960, Polskie Pismo Ent. 30: 30:. {{int:Type species}}: Argyroploce sphaerocopa Meyrick, 1930. =={{int:References}}== {{Lower, 1901}} * {{aut|Brown, J.W.}}, 2005: ''World catalogue of insects'' '''volume 5''' ''Tortricidae''. * {{aut|Horak}}, 2006, ''Monographs on Australian Lepidoptera'' '''Volume 10'''. {{Hu et al., 2026c}} {{Le et al., 2013a}} * {{aut|Liu, Y.-q. & J.-w. Bai}}, 1982: Three new species of Sorolophae Diakonoff 1973 from China. ''Entomotaxonomia'' '''4 (3)''': 167–172. * {{aut|Liu, Y.-q. & J.-w. Bai}}, 1985: A study on the subtribe sorolophae in Yunnan Province (Lepidoptera:Tortricidae). ''Sinozoologia'' 3: 135–138. Full article: [http://www.liu6.sakura.ne.jp/youqiao/hp/thesis/Thesis028.pdf]. {{Patibhakyothin, Pinkaew & Sukprakob, 2015}} * {{aut|Razowski, J.}}, 2009, ''Tortricidae'' from Vietnam in the collection of the Berlin Museum.6.''Olethreutinae'' (Lepidoptera: Tortricidae). ''Shilap revista de Lepidopterologia'' '''37 (145)''': 115–143. {{Sakagami, 2023}} {{Sun, Sun & Heppner, 2017}} * {{aut|Tuck, K.R. & G.S. Robinson}}, 1994: A new species of ''Sorolopha'' (Lepidoptera, Olethreutinae) from Borneo and Sulawesi. ''Tinea'' '''14(1)''':65-68. * {{aut|Yu, H.}}; {{aut|Li, H.}} 2009: Review of the genus ''Sorolopha'' Lower (Lepidoptera: Tortricidae, Olethreutinae) from Mainland China, with descriptions of two new species. ''Zootaxa'', 2062: 1–14. {{Zhao, Bai & Yu, 2017}} {{Commonscat}} {{Taxonbar|from=Q7563619}} 0m20gfdulnb9puaqd1l76v88bfiwsee Melogale personata 0 186417 11322211 11177728 2026-10-21T18:34:31Z The editor 2345 2915305 /* */ 11322211 wikitext text/x-wiki {{image|Melogale personata wild cam.jpg}} =={{int:Taxonavigation}}== {{Melogale}} Species: ''[[Melogale personata]]''<br /> Subspecies: {{ssp|M|elogale|p|ersonata|laotum}} {{ssp|M|elogale|p|ersonata|nipalensis}} {{ssp|M|elogale|p|ersonata|personata}} {{ssp|M|elogale|p|ersonata|pierrei}} {{ssplast|M|elogale|p|ersonata|tonquinia}} =={{int:Name}}== ''Melogale personata'' [[I. Geoffroy Saint-Hilaire]], 1831 {{int:Type locality}}: "environs de Rangoun" [Burma]. =={{int:References}}== * ''In'' Bélanger (ed.) Voy. Indes Orient., 3(Zoologie): 137, pl. 5.[issued 13 March 1831]. * {{MSWsp|14001319}} * {{IUCN|DD|41627/0|Melogale personata|I. Geoffroy Saint-Hilaire, 1831}} * {{ITIS|621926|''Melogale personata'' I. Geoffroy Saint-Hilaire, 1831}} =={{int:Vernacular names}}== {{VN |de=Burma-Sonnendachs |en=Burmese Ferret-badger, Large-toothed Ferret-badger |fr=Mélogale masquée |es=Tejón Birmano |pl=Ryjonos |th=หมาหริ่ง, หมาหริ่งพม่า |tr=Güney Asya güneş porsuğu }} {{Taxonbar|from=Q844662}} [[Category:Isidore Geoffroy Saint-Hilaire taxa]] h6fcyj05955xqrsplgt5f6trz8lrvzo Gerhard Storch 0 187014 11322427 11294110 2026-10-21T22:16:05Z The editor 2345 2915305 /* Publications */ 11322427 wikitext text/x-wiki {{Image}} '''Gerhard Storch''' (1939–2017), German paleontologist and zoologist. * Professor Emeritus at the Department of Mammalog 2, Forschungsinstitut Senckenberg, Frankfurt, Germany. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1963=== {{Malec & Storch, 1963}} ===1978=== {{Storch, 1978}} ===1981=== {{Storch, 1981}} {{Smith & Storch, 1981}} ===1983=== {{Koenigswald & Storch, 1983}} ===1987=== {{Habersetzer & Storch, 1987}} ===1994=== {{Storch & Martin, 1994}} ===1995=== {{Storch, 1995}} ===1996=== {{Kock & Storch, 1996}} ===2000=== {{Qiu & Storch, 2000}} ===2002=== {{Storch, Sigé & Habersetzer, 2002}} ===2003=== {{Gunnell et al., 2003}} ===2004=== {{Storch & Qiu, 2004}} ===2006=== {{Fejfar, Storch & Tobien, 2006}} {{Authority control}} {{DEFAULTSORT:Storch, Gerhard}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] awyv9u85wvk1ywwk086y2x2itiuonmd Scaphiophryne menabensis 0 192007 11322393 9922285 2026-10-21T21:52:30Z Burmeister 9074 revision update 11322393 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Scaphiophryne}} Species: ''[[Scaphiophryne menabensis]]'' =={{int:Name}}== ''Scaphiophryne menabensis'' {{a|Julian Glos|Glos}}, {{a|Frank Glaw|Glaw}} & {{a|Miguel Vences|Vences}}, 2005: 253 * {{int:Holotype}}: {{rl|ZSM}} 186.2003. * {{int:Type locality}}: “western Madagascar, province of Toliara, district of Morandava, in the Kirindy Forest C.F.P.F. (forest pond CS5), 44°39′E, 20°03′S, 18-40 m elevation”. =={{int:References}}== ==={{int:Primary references}}=== {{Glos, Glaw & Vences, 2005}} ==={{int:Links}}=== * {{smallcaps|IUCN SSC Amphibian Specialist Group}}. 2016. {{IUCN|LC|61859}}. The IUCN Red List of Threatened Species 2016: e.T61859A84184167. {{doi|10.2305/IUCN.UK.2016-3.RLTS.T61859A84184167.en}}. Accessed on 20 October 2026. =={{int:Vernacular names}}== {{VN|en=Toliara Rain Frog}} {{Taxonbar|from=Q3005472}} [[Category:Julian Glos taxa]] [[Category:Frank Glaw taxa]] [[Category:Miguel Vences taxa]] [[Category:New species 2005]] cel4sppnimz4xp8eexig808c0j11psh Shikamainosorex 0 218937 11322351 11029947 2026-10-21T20:56:31Z The editor 2345 2915305 11322351 wikitext text/x-wiki {{Image}} =={{int:Taxonavigation}}== {{Shikamainosorex}} Species: †{{splast|S|hikamainosorex|densicingulata}} =={{int:Name}}== ''Shikamainosorex'' {{a|Yoshikazu Hasegawa|Hasegawa}}, 1957: 65 * {{int:Type species}}: ''Shikamainosorex densicingulata'' * {{int:Eponymy}}: [[Tokio Shikama|T. Shikama]] [{{a|Yoshikazu Hasegawa|Hasegawa}}, 1957: 65] =={{int:References}}== ==={{int:Primary references}}=== {{Hasegawa, 1957}} ==={{int:Additional references}}=== * {{aut|Rzebik-Kowalska, B.}} & {{aut|Hasegawa, Y.}}: ''New Materials to the Knowledge of the Genus Shikamainosorex Hasegawa 1957'' (Insect. Mammalia). Krakow, Acta Zoologica, 1976,lst ed. ill.w/2 fig.& 2 tab., 341-357p, 8vo PB. Fine. ==={{int:Links}}=== {{Fossilworks|253424}} {{Taxonbar|from=Q21364082}} [[Category:Yoshikazu Hasegawa taxa]] [[Category:Eponyms of Tokio Shikama]] 557wqk5rmkv5fh3u7nuluye3m02geax Amblycoptus 0 218940 11322345 10904506 2026-10-21T20:53:33Z The editor 2345 2915305 11322345 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Amblycoptus}} Species (2): †{{sp|A|mblycoptus|jessiae}} †{{splast|A|mblycoptus|oligodon}} =={{int:Name}}== ''Amblycoptus'' {{a|Tivadar Kormos|Kormos}}, 1926 * {{int:Type species}}: ''Amblycoptus oligodon'' {{aut|Kormos}}, 1926. =={{int:References}}== ==={{int:Primary references}}=== {{Kormos, 1926}} {{Taxonbar|from=Q21364094}} [[Category:Tivadar Kormos taxa]] is43jhan76posv8gobuolyaav23m4jz Héctor Andrés Vargas Ortiz 0 219268 11322565 11198310 2026-10-22T03:41:14Z Neferkheperre 947633 /* 2022 */ 11322565 wikitext text/x-wiki {{Image|}} '''Héctor Andrés Vargas Ortiz''', Chilean entomologist. * Departamento de Recursos Ambientales, Facultad de Ciencias Agronómicas, Universidad de Tarapacá, Casilla 6-D, Arica, Chile * E-mail: lepvargas@gmail.com {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2005=== {{Vargas & Landry, 2005}} {{Vargas & Parra, 2005}} ===2012=== {{Vargas & Moreira, 2012}} {{Brito et al., 2012}} ===2013=== {{Brito et al., 2013}} {{Mundaca, Parra & Vargas, 2013}} ===2015=== {{Vargas et al., 2015}} ===2017=== {{Parra et al., 2017}} {{Pereira et al., 2017}} ===2018=== {{Brito & Vargas, 2018}} {{Espinoza-Donoso et al., 2018}} {{Moreira et al., 2018}} {{Pereira et al., 2018a}} {{Silva et al., 2018a}} {{Vargas, 2018}} {{Vargas-Ortiz & Vargas, 2018}} ===2019=== {{De Prins et al., 2019}} {{Vargas, 2019}} {{Vargas, 2019a}} {{Vargas-Ortiz et al., 2019}} ===2020=== {{Cerdena et al., 2020}} {{Davis et al., 2020}} {{Espinoza-Donoso et al., 2020}} {{Palacios et al., 2020}} {{Vargas, 2020}} {{Vargas, 2020a}} {{Vargas, Hausmann & Parra, 2020}} {{Vargas, Vargas-Ortiz & Gielis, 2020}} ===2021=== {{Vargas, 2021}} {{Vargas, 2021a}} ===2022=== {{Cerdeña et al., 2022}} {{Espinoza-Donoso et al., 2022}} {{Farfán et al., 2022}} {{Vargas, 2022}} {{Vargas, 2022a}} {{Vargas, Solis & Vargas-Ortiz, 2022}} ===2023=== {{Vargas, 2023}} ===2024=== {{Vargas, 2024}} {{Vargas, 2024a}} {{Vargas, 2024b}} {{Vargas, 2024c}} ===2025=== {{Vargas, 2025}} ===2026=== {{Ampuero-Vega, Campos-Soto & Vargas, 2026}} {{Vargas, 2026}} {{Authority control}} {{DEFAULTSORT:Vargas Ortiz, Hector Andres}} [[Category:Taxon authorities]] [[Category:Entomologists]] j6ycmz3okjvdvsbgbht5dv9vw1kqwpi Crusafontina 0 219837 11322339 11304126 2026-10-21T20:47:20Z The editor 2345 2915305 /* Name */ 11322339 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Crusafontina}} Species (6): †{{sp|C|rusafontina|endemica}} †{{sp|C|rusafontina|fastigata}} †{{sp|C|rusafontina|kormosi}} †{{sp|C|rusafontina|magna}} †{{sp|C|rusafontina|minima}} †{{splast|C|rusafontina|vendeweerdi}} =={{int:Name}}== ''Crusafontina'' {{a|José Ernesto Gibert|Gibert}}, 1975 * {{int:Type species}}: ''Crusafontina endemica'' {{aut|Gibert}}, 1975. =={{int:References}}== The Paleobiology Database [https://web.archive.org/web/20080430003236/http://paleodb.org/cgi-bin/bridge.pl?action=checkTaxonInfo ''Crusafontina''] =={{int:Vernacular names}}== {{Taxonbar|from=Q21364224}} [[Category:José Ernesto Gibert taxa]] [[Category:Eponyms of Miquel Crusafont i Pairó]] ku9avoz5gpa5wveefgeulbve72a3j2l Neomysorex 0 220303 11322313 10904549 2026-10-21T20:20:58Z The editor 2345 2915305 11322313 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Neomysorex}} Species (1): †{{splast|N|eomysorex|alpinoides}} =={{int:Name}}== ''Neomysorex'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 1981 =={{int:References}}== ==={{int:References}}=== {{Rzebik-Kowalska, 1981}} {{Taxonbar|from=Q21364323}} [[Category:Barbara Rzebik-Kowalska taxa]] rzofoy8ijcmcl0rr2yvnmndmwpnrw7a 11322319 11322313 2026-10-21T20:28:21Z The editor 2345 2915305 11322319 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Neomysorex}} Species (1): †{{splast|N|eomysorex|alpinoides}} =={{int:Name}}== ''Neomysorex'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 1981 * {{int:Type species}}: ''Sorex alpinoides'' {{aut|Kowalski}}, 1956. =={{int:References}}== ==={{int:References}}=== {{Rzebik-Kowalska, 1981}} {{Taxonbar|from=Q21364323}} [[Category:Barbara Rzebik-Kowalska taxa]] oqrqiy3c8pxu6u3vcdbc01ovnalfxus Paranourosorex 0 220592 11322329 10904510 2026-10-21T20:41:52Z The editor 2345 2915305 11322329 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Paranourosorex}} Species (3): †{{sp|P|aranourosorex|gigas}} †{{sp|P|aranourosorex|inexspectatus}} †{{splast|P|aranourosorex|seletiensis}} =={{int:Name}}== ''Paranourosorex'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 1975 * {{int:Type species}}: ''Paranourosorex gigas'' {{aut|Rzebik-Kowalska}}, 1975. =={{int:References}}== ==={{int:Primary references}}=== {{Rzebik-Kowalska, 1975}} {{Taxonbar|from=Q21364380}} [[Category:Barbara Rzebik-Kowalska taxa]] iklyc4te57do5ql36cn0jix63b3cv54 Alloblarinella 0 220595 11322431 11008312 2026-10-21T22:20:24Z The editor 2345 2915305 11322431 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Alloblarinella}} Species (1): †{{splast|A|lloblarinella|europaea}} =={{int:Name}}== ''Alloblarinella'' {{a|Gerhard Storch|Storch}}, 1995 * {{int:Type species}}: ''Blarinella europaea'' {{aut|Reumer}}, 1985. =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar|from=Q21364386}} [[Category:Gerhard Storch taxa]] 89k33zr2l60h3vwckz2escl51tr89ft Ixodinae 0 221766 11322615 9652532 2026-10-22T07:05:24Z Hiouf 2107144 11322615 wikitext text/x-wiki {{image|Ixodus ricinus 5x.jpg|''[[Ixodes ricinus]]''}} =={{int:Taxonavigation}}== {{Ixodinae}} Tribes: {{trib|Australixodini}} {{triblast|Ixodini}} Genera: {{g|Ixodes}} †{{glast|Cornupalpatum}} =={{int:Name}}== Ixodinae {{aut|Murray}}, 1877 ({{aut|van der Hammen}}, 1968) =={{int:References}}== ==={{int:Primary references}}=== ==={{int:Additional references}}=== {{Barker, 2026}} {{Leonovich, 2020}} ==={{int:Links}}=== {{Biolib|id618667|Ixodinae}} {{Commons}} {{Taxonbar}} eb6r6hcvlxiifz5lrofp2vrue27mhfe Kaomud Tyagi 0 235376 11322777 11316163 2026-10-22T08:52:51Z Hiouf 2107144 /* 2026 */ 11322777 wikitext text/x-wiki '''Kaomud Tyagi''', Indian entomologist * Centre for DNA Taxonomy (CDT), Zoological Survey of India, Kolkata, India {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2014=== {{Kumar et al., 2014}} {{Tyagi, Ghosh & Kumar, 2014}} ===2015=== {{Tyagi & Kumar, 2015}} {{Tyagi, Kumar & Chauhan, 2015}} {{Tyagi & Kumar, 2015a}} ===2016=== {{Tyagi & Kumar, 2016}} {{Tyagi et al., 2016}} {{Tyagi, Mound & Kumar, 2016}} ===2017=== {{Caleb et al., 2017b}} {{Tyagi et al., 2017}} {{Tyagi, Singha & Kumar, 2017}} ===2018=== {{Caleb et al., 2018}} {{Tyagi et al., 2018}} ===2019=== {{Prasad et al., 2019}} ===2020=== {{Tyagi et al., 2020a}} {{Tyagi et al., 2020}} ===2021=== {{Singha et al., 2021}} {{Singha et al., 2021a}} ===2026=== {{Datta et al., 2026}} {{Dey et al., 2026a}} {{Dey et al., 2026}} {{Kour et al., 2026}} {{Sarma et al., 2026}} {{Authority control}} {{DEFAULTSORT:Tyagi, Kaomud}} [[Category:Taxon authorities]] [[Category:Entomologists]] 1e6egtcal8s56jqbkjjnktxj2obfqss Rosser W. Garrison 0 236703 11322514 11114664 2026-10-22T02:03:26Z John Tann 703224 Added publication 11322514 wikitext text/x-wiki {{image}} '''Rosser W. Garrison''', entomologist. * Plant Pest Diagnostics Center California Department of Food & Agriculture 3294 Meadowview Road, Sacramento, CA 95832-1448, USA {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2008=== {{Ellenrieder & Garrison, 2008}} ===2013=== {{Dijkstra et al., 2013a}} ===2014=== {{Garrison, 2014}} ===2015=== {{Garrison & von Ellenrieder, 2015}} {{Garrison et al., 2015}} ===2017=== {{Garrison & von Ellenrieder, 2017}} ===2018=== {{Garrison & von Ellenrieder, 2018}} ===2019=== {{Garrison, 2019}} {{Garrison & Cabrera, 2019}} {{Kosterin et al., 2019}} =={{int:External links}}== * [https://www.cdfa.ca.gov/phpps/ppd/staff/rgarrison.html Rosser Garrison CV] {{Authority control}} {{DEFAULTSORT:Garrison, Rosser}} [[Category:Taxon authorities]] [[Category:Entomologists]] 9f4gyd8fa39a263o479y07nhuhnefgv Alucita 0 245695 11322529 10556933 2026-10-22T03:27:19Z PeterR 7354 11322529 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Alucita}} Species: {{sp|A|lucita|aarviki}} {{sp|A|lucita|abenahoensis}} {{sp|A|lucita|acalles}} {{sp|A|lucita|acalyptra}} {{sp|A|lucita|acascaea}} {{sp|A|lucita|acutata}} {{sp|A|lucita|adriendenisi}} {{sp|A|lucita|adzharica}} {{sp|A|lucita|agapeta}} {{sp|A|lucita|agassizi}} {{sp|A|lucita|amalopis}} {{sp|A|lucita|ancalopa}} {{sp|A|lucita|anemolia}} {{sp|A|lucita|angustestriata}} {{sp|A|lucita|anna}} {{sp|A|lucita|anticoma}} {{sp|A|lucita|aramsolkiensis}} {{sp|A|lucita|araxella}} {{sp|A|lucita|argyrospodia}} {{sp|A|lucita|armstrongi}} {{sp|A|lucita|arriguttii}} {{sp|A|lucita|atomoclasta}} {{sp|A|lucita|baihua}} {{sp|A|lucita|bakingili}} {{sp|A|lucita|bakweri}} {{sp|A|lucita|baliochlora}} {{sp|A|lucita|balioxantha}} {{sp|A|lucita|belfragei}} {{sp|A|lucita|beinongdai}} {{sp|A|lucita|besongi}} {{sp|A|lucita|bidentata}} {{sp|A|lucita|bokwango}} {{sp|A|lucita|brachyphimus}} {{sp|A|lucita|brachyzona}} {{sp|A|lucita|bridarollii}} {{sp|A|lucita|brunnea}} {{sp|A|lucita|budashkini}} {{sp|A|lucita|bulgaria}} {{sp|A|lucita|butleri}} {{sp|A|lucita|canariensis}} {{sp|A|lucita|cancellata}} {{sp|A|lucita|capensis}} {{sp|A|lucita|caucasica}} {{sp|A|lucita|certifica}} {{sp|A|lucita|chloracta}} {{sp|A|lucita|cinnerethella}} {{sp|A|lucita|coffeina}} {{sp|A|lucita|compsoxantha}} {{sp|A|lucita|crococyma}} {{sp|A|lucita|cyanophanes}} {{sp|A|lucita|cymatodactyla}} {{sp|A|lucita|cymographa}} {{sp|A|lucita|danunciae}} {{sp|A|lucita|debilella}} {{sp|A|lucita|deboeri}} {{sp|A|lucita|decaryella}} {{sp|A|lucita|deja}} {{sp|A|lucita|dejongi}} {{sp|A|lucita|desmodactyla}} {{sp|A|lucita|devosi}} {{sp|A|lucita|dohertyi}} {{sp|A|lucita|ectomesa}} {{sp|A|lucita|entoprocta}} {{sp|A|lucita|erzayi}} {{sp|A|lucita|escobari}} {{sp|A|lucita|eteoxantha}} {{sp|A|lucita|eudactyla}} {{sp|A|lucita|eudasys}} {{sp|A|lucita|eumorphodactyla}} {{sp|A|lucita|eurynephela}} {{sp|A|lucita|euscripta}} {{sp|A|lucita|fako}} {{sp|A|lucita|ferruginea}} {{sp|A|lucita|flavicincta}} {{sp|A|lucita|flaviserta}} {{sp|A|lucita|flavofascia}} {{sp|A|lucita|fletcheriana}} {{sp|A|lucita|fokami}} {{sp|A|lucita|fumosa}} {{sp|A|lucita|grammodactyla}} {{sp|A|lucita|granata}} {{sp|A|lucita|habrophila}} {{sp|A|lucita|helena}} {{sp|A|lucita|hendriki}} {{sp|A|lucita|hemicyclus}} {{sp|A|lucita|hexadactyla}} {{sp|A|lucita|hirsuta}} {{sp|A|lucita|hofmanni}} {{sp|A|lucita|homotrocha}} {{sp|A|lucita|huebneri}} {{sp|A|lucita|hypocosma}} {{sp|A|lucita|iberica}} {{sp|A|lucita|idiocrossa}} {{sp|A|lucita|illuminatrix}} {{sp|A|lucita|imbrifera}} {{sp|A|lucita|iranensis}} {{sp|A|lucita|iringiensis}} {{sp|A|lucita|ischalea}} {{sp|A|lucita|isodina}} {{sp|A|lucita|ithycypha}} {{sp|A|lucita|jana}} {{sp|A|lucita|janeceki}} {{sp|A|lucita|japonica}} {{sp|A|lucita|jujuyensis}} {{sp|A|lucita|karadagica}} {{sp|A|lucita|katanga}} {{sp|A|lucita|kazachstanica}} {{sp|A|lucita|klimeschi}} {{sp|A|lucita|kosterini}} {{sp|A|lucita|lackneri}} {{sp|A|lucita|lalannei}} {{sp|A|lucita|libraria}} {{sp|A|lucita|lidiya}} {{sp|A|lucita|longipalpella}} {{sp|A|lucita|longipenis}} {{sp|A|lucita|loxoschista}} {{sp|A|lucita|ludmila}} {{sp|A|lucita|lyristis}} {{sp|A|lucita|mabilabolensis}} {{sp|A|lucita|magadis}} {{sp|A|lucita|major}} {{sp|A|lucita|malawica}} {{sp|A|lucita|manneringi}} {{sp|A|lucita|maxima}} {{sp|A|lucita|mayri}} {{sp|A|lucita|megaphimus}} {{sp|A|lucita|melanodactyla}} {{sp|A|lucita|meloui}} {{sp|A|lucita|melpa}} {{sp|A|lucita|mesolychna}} {{sp|A|lucita|microdesma}} {{sp|A|lucita|micrographa}} {{sp|A|lucita|microscopica}} {{sp|A|lucita|mischenini}} {{sp|A|lucita|molliflua}} {{sp|A|lucita|montana}} {{sp|A|lucita|montigena}} {{sp|A|lucita|mulciber}} {{sp|A|lucita|murphy}} {{sp|A|lucita|murzini}} {{sp|A|lucita|myriodesma}} {{sp|A|lucita|nannodactyla}} {{sp|A|lucita|nasuta}} {{sp|A|lucita|nephelotoxa}} {{sp|A|lucita|niphadosema}} {{sp|A|lucita|niphostrota}} {{sp|A|lucita|nipsana}} {{sp|A|lucita|nubifera}} {{sp|A|lucita|nyasa}} {{sp|A|lucita|ochraspis}} {{sp|A|lucita|ochriprota}} {{sp|A|lucita|ochrobasalis}} {{sp|A|lucita|ochrozona}} {{sp|A|lucita|olga}} {{sp|A|lucita|ordubadi}} {{sp|A|lucita|palodactyla}} {{sp|A|lucita|panduris}} {{sp|A|lucita|panolbia}} {{sp|A|lucita|papuaensis}} {{sp|A|lucita|patria}} {{sp|A|lucita|pectinata}} {{sp|A|lucita|pepperella}} {{sp|A|lucita|phanerarcha}} {{sp|A|lucita|philomela}} {{sp|A|lucita|photaula}} {{sp|A|lucita|phricodes}} {{sp|A|lucita|pinalea}} {{sp|A|lucita|pliginskii}} {{sp|A|lucita|plumigera}} {{sp|A|lucita|pluvialis}} {{sp|A|lucita|poecilodactyla}} {{sp|A|lucita|postfasciata}} {{sp|A|lucita|potockyi}} {{sp|A|lucita|priona}} {{sp|A|lucita|proseni}} {{sp|A|lucita|pselioxantha}} {{sp|A|lucita|pseudohuebneri}} {{sp|A|lucita|pterochroma}} {{sp|A|lucita|punctiferella}} {{sp|A|lucita|pusilla}} {{sp|A|lucita|pygmaea}} {{sp|A|lucita|pyrczi}} {{sp|A|lucita|rhaptica}} {{sp|A|lucita|rhymotoma}} {{sp|A|lucita|riggii}} {{sp|A|lucita|romieuxi}} {{sp|A|lucita|ruens}} {{sp|A|lucita|rutteni}} {{sp|A|lucita|safi}} {{sp|A|lucita|sakhalinica}} {{sp|A|lucita|sailtavica}} {{sp|A|lucita|sedlaceki}} {{sp|A|lucita|semophantis}} {{sp|A|lucita|sertifera}} {{sp|A|lucita|seychellensis}} {{sp|A|lucita|sikkima}} {{sp|A|lucita|snezhinka}} {{sp|A|lucita|sochivkoi}} {{sp|A|lucita|sokolovi}} {{sp|A|lucita|spicifera}} {{sp|A|lucita|spilodesma}} {{sp|A|lucita|sroczki}} {{sp|A|lucita|stephanopis}} {{sp|A|lucita|straminea}} {{sp|A|lucita|syncophanta}} {{sp|A|lucita|synnephodactyla}} {{sp|A|lucita|tandilensis}} {{sp|A|lucita|tanzanica}} {{sp|A|lucita|tatjana}} {{sp|A|lucita|tesserata}} {{sp|A|lucita|thapsina}} {{sp|A|lucita|tonda}} {{sp|A|lucita|toxophila}} {{sp|A|lucita|trachydesma}} {{sp|A|lucita|trachyptera}} {{sp|A|lucita|tricausta}} {{sp|A|lucita|tridentata}} {{sp|A|lucita|tropeki}} {{sp|A|lucita|udovichenkoi}} {{sp|A|lucita|ussurica}} {{sp|A|lucita|vanmastrigti}} {{sp|A|lucita|varirata}} {{sp|A|lucita|wahgi}} {{sp|A|lucita|walmakensis}} {{sp|A|lucita|wamenaensis}} {{sp|A|lucita|withaari}} {{sp|A|lucita|xanthodes}} {{sp|A|lucita|xanthosticta}} {{sp|A|lucita|xanthozona}} {{sp|A|lucita|zinovievi}} {{sp|A|lucita|zonodactyla}} {{sp|A|lucita|zumkehri}} {{sp|A|lucita|zuza}} {{splast|A|lucita|zwieri}} =={{int:Name}}== ''Alucita'' {{a|Carolus Linnaeus|Linnaeus}}, 1758 {{int:Type species}}: ''Phalaena Alucita hexadactyla'' {{a|Carolus Linnaeus|Linnaeus}}, 1758, by subsequent designation by Tutt, 1906 ==={{int:Synonyms}}=== * ''Phalaena Alucita'' {{a|Carolus Linnaeus|Linnaeus}}, 1758 * ''[[Orneodes]]'' {{a|Pierre André Latreille|Latreille}}, 1797 * ''Euchiradia'' [[Hübner]], 1826, TS: Orneodes hexadactyla Linnaeus, 1758, by original designation. * ''Orneodus'' [[Meyrick]], 1909, misspelling. =={{int:References}}== ==={{int:Primary references}}=== {{Latreille, 1796}} {{Linnaeus, 1758}} ==={{int:Additional references}}=== * {{aut|Byun, B.K.}}, 2006, ''Alucitidae'' (Lepidoptera) of Korea: Description of a new species and records of two previously unrecorded species, ''Zootaxa'' 1188: 37–47. {{Gielis, 2003}} {{Kovtunovich & Ustjuzhanin, 2016}} {{Kovtunovich, Ustjuzhanin & Streltzov, 2019}} {{Kovtunovich et al., 2021}} * {{aut|Landry, Bernard & Jean-François Landry}}, 2004, The genus ''Alucita'' in North America, with description of two new species (Lepidoptera: Alucitidae), ''The Canadian Entomologist'' 136 553-579. * {{aut|Mastrigt van, H. & C. Gielis}}, 2009: Some important notes on Alucitidae (Lepidoptera) of Papua, Indonesia, with description of a new species. ''SUGAPA (Suara Serangga Papua)'' '''4(2)''': 34–39. * {{aut|Ustjuzhanin, P. Ya.}}, 1999: New and little-known Palaearctic species of ''Alucitidae'' (Lepidoptera). ''Far Eastern Entomologist'' 68: 1–7. Full article: [https://web.archive.org/web/20131020074854/http://www.biosoil.ru/fee/1999/N-068/N-068.pdf]. {{Ustjuzhanin & Kovtunovich, 2016}} {{Ustjuzhanin & Kovtunovich, 2016b}} {{Ustjuzhanin et al., 2024}} {{Ustjuzhanin et al., 2020}} {{Ustjuzhanin et al., 2018}} {{Ustjuzhanin, Kovtunovich & Prozorov, 2024}} {{Ustjuzhanin, Kovtunovich & Streltzov, 2020b}} {{Ustjuzhanin, Kovtunovich & Streltzov, 2020d}} {{Ustjuzhanin, Kovtunovich & Ustjuzhanina, 2018}} * {{aut|Vargas, H.A.}}, 2011: A New Species of ''Alucita'' L. (Lepidoptera: Alucitidae) from Northern Chile. ''Neotropical Entomology'' '''40 (1)''': 85–88. Full article: [http://www.scielo.br/pdf/ne/v40n1/12.pdf]. * {{aut|Zagulajev, A.K.}}, 2000: New species of the multiplumed moth family Alucitidae (Lepidoptera) from Russia and adjacent territories: XII. ''Entomological Review'' '''80 (7)''': 813–821. {{Taxonbar|from=Q4737118}} [[Category:Carolus Linnaeus taxa]] l8a42wiclc7ktyue1ubprelfyii2atm Herbert Druce 0 250873 11322042 11215538 2026-10-21T15:53:33Z FrankB157 2872707 some copy-paste error 11322042 wikitext text/x-wiki '''Herbert Druce''' (1846–1913), British entomologist. * {{int:Child}}: [[Hamilton Herbert Druce]]. * Collection in [[BMNH]]. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1872=== {{Butler,Druce, 1872}} ===1873=== {{Druce, 1873}} ===1874=== {{Druce, 1874}} {{Druce, 1874a}} {{Druce,H,1874}} {{Butler,Druce,1874}} ===1875=== {{Druce, 1875}} {{Druce, 1875a}} ===1876=== {{Druce,H,1876}} ===1877=== {{Druce,H,1877}} ===1878=== {{Druce,H, 1878}} ===1881-1900=== {{Druce, 1881-1900}} [See below for divided parts using dates from Lyal, 2011 "The dating of the Biologia Centrali‐Americana" in ''Opera Zoologica''. The introductory material and errata i‐xxxii released as conclusion in March 1900]. ===1881=== {{Druce, 1881}} ===1882=== {{Druce, 1882}} ===1883=== {{Druce, 1883}} {{Druce, 1883a}} ===1884=== {{Druce, 1884}} {{Druce,H, 1884a}} ===1885=== <!-- See paper by son {{Druce, 1885}}--> {{Druce, 1885a}} {{Druce, 1885b}} ===1886=== {{Druce, 1886}} {{Druce, 1886a}} ===1887=== <!-- See paper by son H.H.{{Druce, 1887}}--> {{Druce, 1887a}} <!-- See redirect {{Druce, 1887b}}, Dated, "Dec.20", "1887" in volume from 1887, but likely printed 1888--> ===1888=== {{Druce, 1888}} {{Druce,H, 1888a}} <!-- See paper by son H.H.{{Druce, 1888a}}--> <!-- See paper by son H.H.{{Druce, 1888b}}--> ===1889=== {{Druce, 1889}} {{Druce, 1889a}} ===1890=== <!-- See paper by son {{Druce, 1890}}--> {{Druce,H, 1890a}} {{Druce, 1890b}} {{Druce, 1890c}} {{Druce, 1890d}} ===1891-1900=== {{Druce, 1891-1900}} [See below for divided parts using dates from Lyal, 2011 "The dating of the Biologia Centrali‐Americana" in ''Opera Zoologica'']. {{Druce, 1891-1900a}} [As for series of plates, this is not here divided in parts, but if required see Lyal, 2011 "The dating of the Biologia Centrali‐Americana" in ''Opera Zoologica'']. ===1891=== {{Druce, 1891}} {{Druce,H, 1891a}} ===1892=== {{Druce,H, 1892}} ===1893=== {{Druce, 1893}} {{Druce,H, 1893a}} ===1894=== {{Druce, 1894d}} {{Druce, 1894e}} ===1895=== {{Druce, 1895a}} {{Druce, 1895b}} {{Druce,H, 1895a}} ===1896=== {{Druce,H, 1896a}} {{Druce, 1896d}} ===1897=== {{Druce, 1897a}} {{Druce,H, 1897a}} ===1898=== {{Druce, 1898}} {{Druce, 1898a}} {{Druce, 1898b}} {{Druce, 1898c}} {{Druce,H, 1898a}} ===1899=== {{Druce, 1899}} {{Druce, 1899a}} {{Druce, 1899b}} {{Druce,H, 1899a}} ===1900=== {{Druce, 1900}} {{Druce, 1900a}} {{Druce, 1900b}} {{Druce, 1900c}} {{Druce,H, 1900a}} ===1901=== {{Druce, 1901}} {{Druce, 1901a}} ===1902=== {{Druce, 1902a}} ===1903=== {{Druce, 1903a}} {{Druce, 1903b}} ===1904=== {{Druce, 1904a}} {{Druce, 1904b}} ===1905=== {{Druce, 1905a}} ===1906=== {{Druce, 1906}} {{Druce, 1906a}} ===1907=== {{Druce, 1907b}} {{Druce, 1907d}} {{Druce, 1907e}} ===1908=== {{Druce, 1908}} {{Druce, 1908c}} ===1909=== {{Druce, 1909a}} ===1910=== {{Druce, 1910c}} ===1911=== {{Druce, 1911}} {{Druce, 1911a}} {{Druce, 1911b}} {{Authority control}} {{DEFAULTSORT:Druce, Herbert}} [[Category:Taxon authorities]] [[Category:Entomologists]] n8t2feaxexskv87zarrwj1i1g293n67 Li 0 262304 11322138 11320455 2026-10-21T16:40:55Z Neferkheperre 947633 11322138 wikitext text/x-wiki {{Refer|authority}} {{columns-list|colwidth=20em|class=plainlist| * [[A.D. Li]] ({{int:born}} 1922, '''A.D.Li'''), botanist * [[Ai-Hua Li]], arachnologist * [[Ai-Min Li]], entomologist * [[Ai-Ming Li]], entomologist * [[An Li]], ichthyologist * [[Bao-Guo Li]], entomologist * [[Bao-Ping Li]], entomologist * [[Baoquan Li]], malacologist * [[Bi-Jun Li]], entomologist * [[Bian-Lun Li]], entomologist * [[Bin Li]], entomologist * [[Bin Li (botanist)]] ('''B.Li'''), botanist * [[Bing Li]], arachnologist * [[Bing-Xue Li]], entomologist * [[Bo Li (ornithologist)|Bo Li]], ornithologist * [[Bo-Liang Li]], entomologist * [[Bo-Yan Li]], entomologist * [[Cai Li]], ornithologist * [[Cai-Feng Li]], entomologist * [[Cai-Yun Li]], Chinese researcher * [[Can Li]], entomologist (Hemiptera) * [[Cao Li]], herpetologist * [[Chang-Chun Li]], arachnologist * [[Chao-Da Li]], entomologist * [[Chao-Qun Li]], entomologist * [[Chao-Yang Li]], ichthyologist * [[Chen-Hong Li]], ichthyologist * [[Chen-Liang Li]], entomologist * [[Cheng Li]], herpetologist * [[Cheng-De Li]], entomologist * [[Cheng-Fang Li]], entomologist * [[Cheng-Gong Li]], arachnologist * [[Cheng-Hua Li]], protozoologist * [[Chia Wei Li]] ('''C.W.Li'''), phycologist * [[Ching-Sing Li]], entomologist * [[Chong-Yang Li]], entomologist * [[Chun-Hou Li]], ichthyologist * [[Chun-Lin Li]], entomologist * [[Chun-Qiao Li]], entomologist * [[Chun-Qing Li]], ichthyologist * [[Chun-Sheng Li]], ichthyologist * [[Chun-Xiao Li]], zoologist * [[Cong-Hu Li]], entomologist * [[Cong-Qiao Li]], entomologist * [[Dai-Qin Li]], arachnologist * [[Dan Li]], arachnologist * [[Dao-Hong Li]], arachnologist * [[Dee Li]], entomologist * [[Deng-Qing Li]], arachnologist * [[Deng-Xu Li]], carcinologist * [[De-wei Li]], acarologist * [[De-Wei Li]] ('''D.W.Li'''), mycologist * [[Di Li]], entomologist * [[Dong-Dong Li]], acarologist * [[Dong-Mei Li]], acarologist * [[Er-Shuai Li]], entomologist * [[Fang Li]], Chinese entomologist * [[Fang-Ting Li]], entomologist * [[Fasheng Li]] ('''F.Li'''), entomologist * [[Fa Zeng Li]] ([[Floruit|fl.]] 1982–1988, '''F.Z.Li'''), botanist * [[Fay Wei Li]] (fl. 2010, '''Fay W.Li'''), botanist * [[Fei Li (arachnologist)|Fei Li]], Chinese arachnologist * [[Fei Li (zoologist)|Fei Li]], Chinese zoologist * [[Feng-E Li]], entomologist * [[Feng-Lian Li]], ichthyologist * [[Feng-Ming Li]], entomologist * [[Feng-Ping Li]], malacologist * [[Feng-Yuan Li]], arachnologist * [[Gang Li]], zoologist * [[Guang Li]], acarologist * [[Guang-Rong Li]], herpetologist * [[Guang-Yun Li]], acarologist * [[Gui-Hua Li]], entomologist * [[Gui-Yuan Li]], ornithologist * [[Guo-Chao Li]], entomologist * [[Guo-Feng Li]], entomologist * [[Guo Feng Li]] (fl. 2011, '''G.F.Li'''), botanist * [[Guo-Gang Li]], geneticist * [[Guoxiang Li]], Chinese paleontologist * [[Hai Li]], ichthyologist * [[Hai-Bin Li]], entomologist * [[Hai-Jun Li]], entomologist * [[Hai-Tao Li]], Chinese researcher * [[Han-Chao Li]], arachnologist * [[Han-Yan Li]], Chinese entomologist * [[Hao Li]], arachnologist * [[Hao-Sen Li]], acarologist * [[Hao-Tian Li]], mammalogist * [[Hao-Yuan Li]], entomologist * [[He-Nan Li]], entomologist * [[Hong Li]], Chinese geneticist * [[Hong-Liang Li]], entomologist * [[Hong-Xing Li]], entomologist * [[Hong-Wei Li]], entomologist * [[Hong-Yu Li]], entomologist * [[Hongqun Li]] (fl. 2008), zoologist * [[Hou-Feng Li]], entomologist * [[Hou-Hun Li]] ('''H.H.Li'''), entomologist * [[Hsi Wen Li]] ({{int:born}} 1931, '''H.W.Li''') * [[Hsing-Hui Li]], ichthyologist * [[Hu Li (disambiguation)]]: ** [[Hu Li (China Agricultural University)]], Chinese entomologist ** [[Hu Li (Shaanxi University of Technology)]], Chinese entomologist * [[Hua-Feng Li]], entomologist * [[Hua-Zhao Li]], entomologist * [[Huan Li]], entomologist * [[Hui Li]], herpetologist * [[Hui-Lin Li]] (1911–2002, '''H.L.Li''') * [[Jheng-Jhang Li]], Taiwan carcinologist * [[Ji-Gang Li]], entomologist * [[Ji-Min Li]], entomologist * [[Ji-Yao Li]], Chinese malacologist * [[Jia-Hua Li]], malacologist * [[Jia-Hui Li]], entomologist * [[Jia-Jin Li]], entomologist * [[Jia-Li Li]], annelidologist * [[Jia-Ling Li]], entomologist * [[Jia-Mei Li]], botanist * [[Jia-Tang Li]], herpetologist * [[Jian Li]], Chinese entomologist * [[Jian-Cheng Li]], helminthologist * [[Jian-Chuan Li]], zoologist * [[Jianhua Li]] ('''Jian H.Li''') * [[Jian-Nan Li]], herpetologist * [[Jian Xiu Li]] (fl. 1983–1988, '''J.X.Li'''), botanist * [[Jian X. Li]] (fl. 2014), Chinese herpetologist * [[Jian-Yong Li]], arachnologist * [[Jianyou Li]], ichthyologist * [[Jian-Wen Li]], lichenologist * [[Jian-Wen Li (ornithologist)|Jian-Wen Li]], ornithologist * [[Jiang-Yu Li]], batrachologist * [[Jie Li]] ('''J.Li'''), botanist * [[Jing-Bo Li]], entomologist * [[Jing-Fang Li]], Chinese herpetologist * [[Jing-Hong Li]], arachnologist * [[Jing-Ke Li]], entomologist * [[Jin-Lei Li]], entomologist * [[Jing-Lin Li (arachnologist)]] * [[Jinlu Li]], Chinese palaeontologist * [[Ji-Wei Li]], acarologist * [[Jin-Wei Li]], herpetologist * [[Jin-Yue Li]], Chinese ichthyologist * [[Jing-Chun Li]], malacologist * [[Jing-Hong Li]], entomologist * [[Jun Li]], ichthyologist * [[Jun Li (phycologist)]], phycologist * [[Jun Li (Guangzhou)]], entomologist * [[Junbing Li]], ichthyologist * [[Jun-Jian Li]], entomologist * [[Jun-Lan Li]], Chinese entomologist * [[Kai-Qin Li]], entomologist * [[Ke-Fan Li]], entomologist * [[Kun-Yuan Li]], entomologist * [[Kuo-Rong Li]], annelidologist * [[Lan-Bing Li]], entomologist * [[Lang-Lang Li]], arachnologist * [[Lao-Da Li]], arachnologist * [[Li Li]], herpetologist * [[Li-Jian Li]], Chinese herpetologist * [[Li-Mei Li]], entomologist * [[Liang Ching Li]] ('''L.Ching Li'''), phycologist * [[Liang-Tao Li]], arachnologist * [[Lin Li (botanist)]], botanist * [[Lin Li]], entomologist * [[Ling Li]], herpetologist * [[Ling-Hui Li]], entomologist * [[Ling-Zhen Li]], ichthyologist * [[Li-Xia Li]] ('''L.X. Li'''), Chinese entomologist * [[Li-Zhen Li]], entomologist * [[Liu-Kang Li]], entomologist * [[M.-H. Li]] * [[Mei-Fu Li]], entomologist * [[Mei-Lin Li]], entomologist * [[Meng Li]], entomologist * [[Meng-Di Li]], entomologist * [[Meng-Yu Li]], entomologist * [[Miao Li]], entomologist * [[Ming He Li]] (''' M.He Li'''), botanist * [[Ming-Hui Li]], arachnologist * [[Ming-Rui Li]],entomologist * [[Mingting Li]], Chinese marine biologist * [[Ming-Yang Li]], entomologist * [[Nan Li]], entomologist * [[Nan-Nan Li]], entomologist * [[Naoyosi Li]], carcinologist * [[Neng-Ping Li]], zoologist * [[Ni Li]], acarologist * [[Ning-Hon Li]] ('''N.H.Li'''), botanist * [[Ning Li]], entomologist * [[Ning Li (ornithologist)|Ning Li]], ornithologist * [[Pan Li]] (fl. 2011, '''P.Li'''), botanist * [[Pan-Pan Li]], entomologist * [[Peng Li]], entomologist * [[Peng-Ying Li]], batrachologist * [[Ping Li]], entomologist * [[Pi-Peng Li]], herpetologist * [[Qian Li]], palaeontologist * [[Qian-Qian Li]], entomologist * [[Qiang Li]] ('''Q.Li'''), entomologist * [[Qiao Li]], entomologist * [[Qi Li]], malacologist * [[Qi-Li Li]], entomologist * [[Qi-Sheng Li]], zoologist * [[Qin Li]], entomologist * [[Qing Li]], myriapodologist * [[Qing-Hua Li]], entomologist * [[Qing-Qing Li]], entomologist * [[Quan Li]], zoologist * [[Rui Gao Li]] (fl. 2002, '''R.G.Li'''), botanist * [[Rui Li]], zoologist * [[Rui-Qi Li]], malacologist * [[Ruo-Tong Li]], entomologist * [[Sen Li]], protozoologist * [[Sha Li]], entomologist * [[Shan Li]], ichthyologist * [[Shao-Hua Li]], entomologist * [[Sheng-Bin Li]], ornithologist * [[Sheng-Cai Li]], acarologist * [[Sheng-Quan Li]], Chinese zoologist * [[Shi-Yang Li]], ichthyologist * [[Shi-Jie Li]], zoologist * [[Shi-Jin Li]], botanist * [[Shi-Kai Li]], arachnologist * [[Shi-Min Li]], herpetologist * [[Shou-Hsien Li]], ornithologist * [[Shu Li]], entomologist * [[Shu-Hui Li]], arachnologist * [[Shu-Juan Li]], entomologist * [[Shu-Qiang Li]] ('''S.Q.Li'''), arachnologist * [[Shu-Shen Li]], zoologist * [[Shuang-Fei Li]], helminthologist * [[Shuang-Shuang Li]], entomologist * [[Shuyin Li]], phycologist * [[Si-Min Li]] ({{int:born}} 1946), Chinese herpetologist * [[Si-quan Li]], mammalogist * [[Si-Yuan Li]], herpetologist * [[Sizhong Li]], ichthyologist, also published as Sze-Chung Li * [[Song Li]], herpetologist * [[Song-Lin Li]], arachnologist * [[Sizhong Li|Sze-Chung Li]], ichthyologist, also published as Sizhong Li * [[Su-Ran Li]], entomologist * [[Tao Li]], entomologist * [[Tian-Shan Li]], entomologist * [[Ting-Jing Li]], entomologist * [[Ting-Ting Li]], entomologist * [[Tong Li]], entomologist * [[W. Li]], phycologist * [[Wan Li]], malacologist * [[Wei Li (bryologist)|Wei Li]] ({{int:born}} 1981, '''W.Li'''), bryologist * [[Wei Li (entomologist)|Wei Li]], entomologist * [[Wei Li (mycologist, fl. 2006)|Wei Li]] (fl. 2006, '''Wei Li'''), mycologist * [[Wei Li (mycologist, fl. 2013)|Wei Li]] (fl. 2013, '''Wei Li bis'''), mycologist * [[Wei Li (mycologist, fl. 2014)|Wei Li]] (fl. 2014, '''Wei Li ter'''), mycologist * [[Wei-Chun Li]] ('''W.C. Li'''), entomologist * [[Wei-Dong Li]], mammalogist * [[Wei-Hai Li]] ('''W.H.Li'''), entomologist * [[Wei-Qiong Li]], Chinese entomologist * [[Wei-Xian Li]], ichthyologist * [[Wei-Xuan Li]], helminthologist * [[Wen-Bo Li]], entomologist * [[Wen-Hui Li]], arachnologist * [[Wen-Hong Li]], Chinese isopodologist * [[Wen-Jian Li]], entomologist * [[Wen-Jing Li (e)|Wen-Jing Li]], entomologist * [[Wen-Jing Li (i)|Wen-Jing Li]], ichthyologist * [[Wen-Jing Li (mycologist)|Wen-Jing Li]], mycologist * [[Wen-Juan Li]], entomologist * [[Wei-Jun Li]], entomologist * [[Wei-Xin Li]], Chinese phycologist * [[Wen-Liang Li]], entomologist * [[Wen-Rong Li]], entomologist * [[Wen-Qi Li]], paleontologist * [[Wen-Tao Li]], entomologist * [[Wen-Xiang Li]], parasitologist * [[Wen-Zhu Li]] ('''W.Z.Li'''), entomologist * [[Xi-Ying Li]], entomologist * [[Xian-Fu Li]], entomologist * [[Xiang-Chuan Li]], entomologist * [[Xiang-Ping Li]], entomologist * [[Xiao-Chen Li (botanist)|Xiao-Chen Li]] ('''Xiao C.Li'''), Chinese botanist * [[Xiao-Chen Li (tardigradologist)|Xiao-Chen Li]], Chinese tardigradologist * [[Xiao-Dong Li]], entomologist * [[Xiao-Fei Li]], entomologist * [[Xiao-Jing Li]], malacologist * [[Xiao-Juan Li]], entomologist * [[Xiao-Meng Li]], Chinese marine biologist * [[Xiao-Ming Li]], entomologist * [[Xiao-Qiang Li]], entomologist * [[Xiao-Song Li]], Chinese malacologist * [[Xiao-Yan Li]], entomologist * [[Xiao-Yu Li]], entomologist * [[Xin Li]], entomologist * [[Xin-Jiang Li]], entomologist * [[Xin-Jin Li]], entomologist * [[Xin-Long Li]], echinodermologist * [[Xing-Jun Li]], zoologist * [[Xing-Peng Li]], entomologist * [[Xin-Ran Li]], entomologist * [[Xin-Xin Li]], entomologist * [[Xin-Yu Li]], entomologist * [[Xin-Zheng Li]], marine biologist * [[Xiu-Min Li]], entomologist * [[Xu Li]], ichthyologist * [[Xuan-Kun Li]] ({{int:born}} 1991), entomologist * [[Xue-Juan Li]], ornithologist * [[Xue-Qing Li]], entomologist * [[Xue-Yan Li]], entomologist * [[Xue-You Li]], zoologist * [[Ya-Jin Li]], entomologist * [[Ya-Nan Li]], echinodermologist * [[Yaya Li]], entomologist * [[Yan-Chun Li]] ('''Y.C.Li'''), mycologist * [[Yan-Da Li]], entomologist * [[Yan-Fei Li]], Chinese entomologist * [[Yan-Ge Li]], entomologist * [[Yan Hui Li]] ({{int:born}} 1930, '''Y.H.Li'''), botanist * [[Yan-Nan Li]], mammalogist * [[Yan-Qiao Li]], entomologist * [[Yan-Qing Li]], entomologist * [[Yang Li]], cnidariologist * [[Yang-Xin Li]], arachnologist * [[Yao Li]], herpetologist * [[Yao-Yao Li]], mammalogist * [[Ya Ru Li]] (fl. 1979, '''Y.R.Li'''), botanist * [[Ya-Zhe Li]], entomologist * [[Ya Zhuo Li]], phycologist * [[Yan-Kuo Li]], zoologist * [[Yi Li (disambiguation)]] (several authors) * [[Yi-Cheng Li]], entomologist * [[Yi-Han Li]], entomologist * [[Yi-Hang Li]], entomologist * [[Yi-Jing Li]], arachnologist * [[Yi-Kui Li]], entomologist * [[Yin Li]] (fl. 1974, '''Yin Li'''), botanist * [[Yi-Peng Li]], zoologist * [[Yinxian Li]], Chinese palaeontologist * [[Ying-Bin Li]], nematologist * [[Ying-Chun Li]], entomologist * [[Ying-Zhu Li]], myriapodologist * [[Yi-Qun Li]], entomologist * [[Yi-Xian Li]], mammalogist * [[Yi-Xuan Li]], entomologist * [[Yong Li]], entomologist * [[Yong-Fu Li]] (fl. 2020, '''Yong F.Li'''), Chinese botanist * [[Yong-Hui Li]], herpetologist * [[Yong-Jun Li (disambiguation)]] (several authors) * [[Yong Kang Li]] (fl. 1986, '''Y.K.Li'''), Chinese botanist * [[Yong-Xiang Li]], nematologist * [[You Li]], entomologist * [[You-Bang Li]], entomologist * [[You-Wen Joe Li]], entomologist * [[You-Zhi Li]], Chinese helminthologist * [[Yu Li (disambiguation)]] (several authors) * [[Yu-Ang Li]], Chinese entomologist * [[Yu-Chun Li]], mammalogist * [[Yu-Fei Li]], entomologist * [[Yu-Jie Li]], entomologist * [[Yu-Jian Li]], entomologist (Hemiptera) * [[Yu-Peng Li]], entomologist * [[Yuan Li (herpetologist)]], Chinese herpetologist * [[Yuan Li (ichthyologist)]], Chinese ichthyologist * [[Yuan-Hang Li]], herpetologist * [[Yuan-Sen-Yu Li]], entomologist * [[Yue Li (disambiguation)]] (several authors) * [[Yue-Mei Li]], entomologist * [[Yun Li]], entomologist * [[Yun-Chun Li]], entomologist * [[Yun-Chun Li (arachnologist)]], arachnologist * [[Yun-Peng Li]], herpetologist * [[Yun-Yao Li]], entomologist * [[Yun-Xia Li]], Chinese pharmacologist * [[Z.F. Li]], (fl. 2002), entomologist (Hemiptera) * [[Z.Y. Li]] (fl. 1976, '''Z.Y.Li'''), mycologist * [[Zai-Ping Li]], palaeontologist, phycologist * [[Zai-Yun Li]], ichthyologist * [[Ze-Chuan Li]], Chinese entomologist * [[Ze-Jian Li]], entomologist * [[Zhang-hong Li]], mammalogist * [[Zhao-Hui Li]], entomologist * [[Zhao-Quan Li]], entomologist * [[Zhe Li]] ('''Z.Li'''), entomologist * [[Zhen-Yu Li (disambiguation)]] (several authors) * [[Zheng Li]] (fl. 2020), Chinese zoologist * [[Zheng-Yue Li]], entomologist * [[Zhi-Gang Li]], entomologist * [[Zhi-Hong Li]], entomologist * [[Zhi-Min Li]], entomologist * [[Zhi-Qiang Li]], entomologist * [[Zhi-Ying Li]], zoologist * [[Zhiyong Li]], phycologist * [[Zhi-Yue Li]], arachnologist * [[Zhong-Shan Li]], arachnologist * [[Zhu-Jie Li]], entomologist * [[Zhu Li]], Chinese entomologist * [[Zhuo-Miao Li]], entomologist * [[Zi Li]], entomologist * [[Zi-Juan Li]], entomologist * [[Zi-Xuaan Li]], entomologist * [[Zi-Zhong Li]] (1937–), Chinese entomologist (Hemiptera) * [[Zong-Xu Li]], arachnologist }} =={{int:see also}}== * [[Liu]] {{Disambiguation|people}} 0nng2zfnnbs2l60v3ma3sj6zmnzyokk Cantareus 0 269067 11322341 10422268 2026-10-21T20:49:37Z Isfisk 2639 11322341 wikitext text/x-wiki [[Image:Helix aspersa-Nl.jpg|thumb|right|350px|''Cantareus aspersus'']] =={{int:Taxonavigation}}== {{Cantareus}} Species: {{sp|C|antareus|aperta}} {{splast|C|antareus|aspersus}} ... =={{int:Name}}== ''Cantareus'' {{a|Antoine Risso|Risso}}, 1826 ==={{int:Type species}}=== * ''[[Helix aperta]]'' {{aut|Born}}, 1778 =={{int:References}}== {{Risso, 1826a}} {{Bouaziz-Yahiatene et al., 2019}} {{Taxonbar|from=Q2936564}} [[Category:Antoine Risso taxa]] 1tvvqsmckjbvwe328a6xhx07iw0qy8q Danio 0 276556 11322502 11152767 2026-10-22T01:08:38Z Tommy Kronkvist 596 /* Taxonavigation */ Added Danio dichromatus. 11322502 wikitext text/x-wiki {{Image|Danio_rerio_port.jpg|''Danio rerio''}} =={{int:Taxonavigation}}== {{Danio}} Species (25): {{sp|D|anio|absconditus}} {{sp|D|anio|aesculapii}} {{sp|D|anio|albolineatus}} {{sp|D|anio|annulosus}} {{sp|D|anio|assamila}} {{sp|D|anio|catenatus}} {{sp|D|anio|choprae}} {{sp|D|anio|concatenatus}} {{sp|D|anio|dangila}} {{sp|D|anio|dichromatus}} {{sp|D|anio|erythromicron}} {{sp|D|anio|feegradei}} {{sp|D|anio|flagrans}} {{sp|D|anio|htamanthinus}} {{sp|D|anio|jaintianensis}} {{sp|D|anio|kerri}} {{sp|D|anio|kyathit}} {{sp|D|anio|margaritatus}} {{sp|D|anio|muongthanhensis}} {{sp|D|anio|nigrofasciatus}} {{sp|D|anio|quagga}} {{sp|D|anio|rerio}} {{sp|D|anio|roseus}} {{sp|D|anio|sysphigmatus}} {{splast|D|anio|tinwini}} =={{int:Name}}== ''Danio'' {{a|Francis Buchanan-Hamilton|Hamilton}}, 1822: 321, 390 * {{int:Type}}: ''Cyprinus (Danio) dangila'' {{aut|Hamilton}}, 1822 * {{int:Typification}} {{int:by subsequent designation of}} {{a|Pieter Bleeker|Bleeker}}, 1863: {{BHL|page/12575376|203}} * {{int:Gender}}: masculine ==={{int:Synonymy}}=== * ''Allodanio'' {{a|Hugh McCormick Smith|H. M. Smith}}, 1945 * ''Brachydanio'' {{a|Max Wilhelm Carl Weber|Weber}} & {{a|Lieven Ferdinand de Beaufort|de Beaufort}}, 1916 * ''Celestichthys'' {{a|Tyson R. Roberts|Roberts}}, 2007 =={{int:References}}== ==={{int:Primary references}}=== {{Hamilton, 1822}} {{Bleeker, 1863c}} [{{int:See pages}} {{BHL|page/12575376|203–204}}.] ==={{int:Additional references}}=== {{Kullander & Britz, 2015}} * {{a|Sven O. Kullander|Kullander, S.O.}} & {{a|Fang Fang Kullander|Fang, F.}} 2009. ''Danio aesculapii'', a new species of danio from south-western Myanmar (Teleostei: Cyprinidae). ''[[ISSN 1175-5326|Zootaxa]]'' 2164: 41–48. [https://www.mapress.com./zootaxa/2009/f/z02164p048f.pdf Abstract & excerpt (PDF).] [https://www.mapress.com./zootaxa/2009/f/zt02164p048.pdf PDF.] {{Kullander & Norén, 2016}} {{Kullander et al., 2015a}} ==={{int:Links}}=== {{FishBase}} {{CoF|gen|1040}} =={{int:Vernacular names}}== {{VN |pl=Danio }} {{Commonscat}} {{Taxonbar|from=Q901804}} [[Category:Francis Buchanan-Hamilton taxa]] rbnzzmn96g5ruon36slfckgvx7027ta Clostridium beijerinckii 0 295602 11322936 10151473 2026-10-22T10:00:15Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322936 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Clostridium_beijerinckii}} Strain: {{glast|Clostridium beijerinckii NCIMB 8052}} =={{int:References}}== * {{NCBI|1520}} {{Taxonbar|from=Q3681018}} [[Category:Eponyms of Martinus Beijerinck]] abjcmnq38iwzhgk0ug3ugk4mbtefkbw Edward Johnston Alexander 0 320483 11322404 8919917 2026-10-21T22:01:32Z Harlock81 398030 /* {{int:Publications}} */ + Alexander, 1940 11322404 wikitext text/x-wiki '''Edward Johnston Alexander''' (1901–1985), U.S. botanist. {{IPNI standard form|Alexander}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Alexander, 1940}} {{Authority control}} {{DEFAULTSORT:Alexander, Edward Johnston}} [[Category:Taxon authorities]] [[Category:Botanists]] p0amlay5h1i6pcp57w563tnf23rvyjc 11322439 11322404 2026-10-21T22:22:40Z Harlock81 398030 /* {{int:Publications}} */ +1 11322439 wikitext text/x-wiki '''Edward Johnston Alexander''' (1901–1985), U.S. botanist. {{IPNI standard form|Alexander}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Alexander, 1940}} {{Alexander, 1956}} {{Authority control}} {{DEFAULTSORT:Alexander, Edward Johnston}} [[Category:Taxon authorities]] [[Category:Botanists]] hby2urui90g5dej408bmn11cgbwayz8 Androsace villosa 0 324436 11322368 9576290 2026-10-21T21:10:25Z TadejM 24665 vernacular names: +sl 11322368 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Androsace}} Species: ''[[Androsace villosa]]''<BR> Subspecies: {{subspplant|A|ndrosace|v|illosa|koso-poljanskii}} {{subspplant|A|ndrosace|v|illosa|taurica}} {{subspplantlast|A|ndrosace|v|illosa|villosa}}<br> Varietates: {{var|A|ndrosace|v|illosa|arachnoidea}} {{varlast|A|ndrosace|v|illosa|congesta}} =={{int:Name}}== ''Androsace villosa'' {{a|L.}}, Sp. Pl.: 142 (1753). ==={{int:Synonyms}}=== {{HOT}} ** ''Aretia villosa'' ({{aut|L.}}) {{a|Bubani}}, Fl. Pyren. 1: 217 (1897), [[nom. illeg.]] ** ''Primula villosa'' ({{aut|L.}}) {{a|Lam.}}, Fl. Franç. 2: 250 (1779), nom. illeg. == {{int:Homonyms}} == * ''Androsace villosa'' {{a|Jacq.}}, Fl. Austriac. 4: t. 352 (1776), nom. illeg. = ''[[Androsace chamaejasme]]'' {{a|Wulfen}}, N.J.von Jacquin, Collectanea 1: 194 (1787). * ''Androsace villosa'' {{a|Hook.f.}} & {{a|Thomson}} in {{aut|J.D.Hooker}}, Fl. Brit. India 3: 498 (1882), nom. illeg. = ''[[Androsace mucronifolia]]'' {{a|G.Watt}}, J. Linn. Soc., Bot. 20: 17 (1882). {{Nadi| * '''Europe''' ** '''Middle Europe''' *** Austria, Switzerland. ** '''Southwestern Europe''' *** France, Spain. ** '''Southeastern Europe''' *** Albania, Bulgaria, Greece, Italy, Romania, former Yugoslavia. ** '''Eastern Europe''' *** Central European Russia, Krym, Northwest European Russia, South European Russia, Ukraine. *'''Africa''' **'''Northern Africa''' *** Morocco. * '''Asia-Temperate''' ** '''Caucasus''' *** North Caucasus, Transcaucasus. ** '''Western Asia''' *** Afghanistan, Iran, Lebanon-Syria, Turkey. ** '''Mongolia''' *** Mongolia. *'''Asia-Tropical''' **'''Indian Subcontinent''' *** Pakistan, West Himalaya. }} =={{int:References}}== ==={{int:Additional references}}=== {{Flora Iranica 9}} {{Güner et al., 2012}} {{Takhtajan, 2012}} {{Dobignard & Chatelain, 2013}} {{Litvinskaya & Murtazaliev, 2013}} ==={{int:Links}}=== {{PWO|2022|October|7}} {{IPNI|700470-1|2022|October 7}} {{World Plants|2022|October|7}} {{Catol-Hassler|2022|October|7}} =={{int:Vernacular names}}== {{VN |sl=kuštravi oklep }} {{Commonscat}} {{Taxonbar}} [[Category:Carolus Linnaeus taxa]] l3urgfl6y5ow4bp86cl8pqc7q2g5aie Pygomeles trivittatus 0 346949 11322043 9103417 2026-10-21T16:06:23Z Burmeister 9074 revision update 11322043 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Pygomeles}} Species: ''[[Pygomeles trivittatus]]'' <br> Subspecies (2): {{ssp|P|ygomeles|t|rivittatus|trilineatus}} {{ssplast|P|ygomeles|t|rivittatus|trivittatus}} =={{int:Name}}== ''Pygomeles trivittatus'' ({{a|George Albert Boulenger|Boulenger}}, 1896) * {{int:Lectotype}}: {{rl|BMNH}} 1946.8.13.66 (formerly 95.10.29.29), collected by Rev. Baron. * {{int:Type locality}}: “Imerina”, Madagascar. ==={{int:Combinations}}=== * ''Pygomeles trivittatus'' {{aut|Boulenger}}, 1896: {{BHL|page/16007321|449}} [original combination] * ''Scelotes trivittatus'' — {{aut|Brygoo}}, 1979 [subsequent combination] * ''Androngo trivittatus'' — {{aut|Brygoo}}, 1981 [subsequent combination] =={{int:References}}== ==={{int:Primary references}}=== * {{a|George Albert Boulenger|Boulenger, G.A.}} 1896. Descriptions of new lizards from Madagascar. ''[[ISSN 0374-5481|Annals and Magazine of Natural History. Series 6]]'' 17: 444–449. {{BHL|page/16007316}} ==={{int:Additional references}}=== {{Miralles et al., 2015a}} ==={{int:Links}}=== * {{aut|Ramanamanjato, J.-B. & Raxworthy, C.J.}} 2011. {{IUCN|LC|172938}}. The IUCN Red List of Threatened Species 2011: e.T172938A6944895. {{doi|10.2305/IUCN.UK.2011-2.RLTS.T172938A6944895.en}}. Accessed on 20 October 2026. {{Taxonbar}} [[Category:George Albert Boulenger taxa]] liroke2v93sy7llqkbc4j46kwwgosrp Rapistrum 0 351686 11322031 11312131 2026-10-21T15:06:10Z Andyboorman 251907 /* {{int:Links}} */ 11322031 wikitext text/x-wiki {{Image|Bolletjesraket 19-05-2006 12.33.52.JPG|''[[Rapistrum rugosum]]''}} =={{int:Taxonavigation}}== {{Rapistrum}} Species: {{sp|R|apistrum|perenne}} {{splast|R|apistrum|rugosum}} =={{int:Name}}== ''Rapistrum'' {{a|Crantz}}, 1769 * {{tysp|Rapistrum hispanicum|(L.) Crantz}} ==={{int:Synonyms}}=== * ''Schrankia'' Medik. * ''Stylocarpum'' Noulet =={{int:References}}== * {{Crantz}} 1769. ''[[Classis Cruciformium Emendata]]'' 105–107. ==={{int:Links}}=== * {{BRBA|2019|May|25}} {{POWO|2026|Oct|21}} {{IPNI||2019|May 25}} {{World Plants|2019|May|25}} {{MBG|2019|May|25}} == {{int:Vernacular names}} == {{VN |sl=repnica |fi=Saksanretikat }} {{Commonscat}} {{Taxonbar|from=Q162891}} [[Category:Heinrich Johann Nepomuk von Crantz taxa]] cfbe779trboj2blkq4mwcj5at576y6y 11322726 11322031 2026-10-22T08:21:46Z Andyboorman 251907 11322726 wikitext text/x-wiki {{Image|Bolletjesraket 19-05-2006 12.33.52.JPG|''[[Rapistrum rugosum]]''}} =={{int:Taxonavigation}}== {{Rapistrum}} Species: {{sp|R|apistrum|perenne}} {{splast|R|apistrum|rugosum}} =={{int:Name}}== ''Rapistrum'' {{a|Crantz}}, Cl. Crucif. Emend.: 62 (1769), [[nom. cons.]] * Type species: ''Rapistrum hispanicum'' (L.) Crantz (1769) = ''Rapistrum rugosum'' (L.) All., Fl. Pedem. 1: 257 (1785) ==={{int:Synonyms}}=== {{HET}} **''Arthrolobus'' Andrz. ex DC. in Syst. Nat. 2: 430 (1821) ** ''Schrankia Medik., Pfl.-Gatt.: 42 (1792), non ''Schranckia'' J.F.Gmel. * ''Stylocarpum'' Noulet =={{int:References}}== * {{Crantz}} 1769. ''[[Classis Cruciformium Emendata]]'' 105–107. ==={{int:Links}}=== * {{BRBA|2019|May|25}} {{POWO|2026|Oct|21}} {{IPNI||2019|May 25}} {{World Plants|2019|May|25}} {{MBG|2019|May|25}} == {{int:Vernacular names}} == {{VN |en=Bastard Cabbage |sl=repnica |fi=Saksanretikat }} {{Commonscat}} {{Taxonbar|from=Q162891}} [[Category:Heinrich Johann Nepomuk von Crantz taxa]] dr8ph3r305vswjtcc13cf309qkjy7mq Rapistrum rugosum 0 351687 11322976 11312134 2026-10-22T10:30:06Z Andyboorman 251907 /* {{int:Links}} */ 11322976 wikitext text/x-wiki {{image|Bolletjesraket 19-05-2006 12.34.12.JPG}} =={{int:Taxonavigation}}== {{Rapistrum}} Species: '''''Rapistrum rugosum''''' =={{int:Name}}== ''Rapistrum rugosum'' ({{a|L.}}) {{a|All.}}, 1785 ==={{int:Synonyms}}=== *''Cakile rugosa'' (L.) L'Hér. ex DC. *''Cochlearia rugosa'' (L.) Crantz *''Hirschfeldia hispanica'' (L.) Linding. *''Myagrum hispanicum'' L. *''Myagrum orientale'' L. *''Myagrum rugosum'' L. *''Myagrum venosum'' Pers. *''Rapistrum clavatum'' (Poir.) DC. *''Rapistrum confusum'' Pomel *''Rapistrum conoideum'' Pomel *''Rapistrum glabrum'' Host *''Rapistrum hirsutum'' Host *''Rapistrum hirtum'' Host *''Rapistrum hispanicum'' (L.) Crantz *''Rapistrum hispidum'' Godr. *''Rapistrum linnaeanum'' Boiss. & Reut. *''Rapistrum longeramosum'' Sennen *''Rapistrum microcarpum'' Jord. *''Rapistrum orientale'' (L.) Crantz *''Rapistrum rugosum'' subsp. ''linnaeanum'' Rouy & Foucaud *''Rapistrum rugosum'' subsp. ''orientale'' (L.) Arcang. *''Rapistrum rugosum'' subsp. ''rugosum'' *''Rapistrum rugosum'' var. ''rugosum'' *''Rapistrum strictissimum'' Pomel =={{int:References}}== * {{All.}} 1785. ''[[Flora Pedemontana sive Enumeratio Methodica Stirpium Indigenarum Pedemontii]]'' 1:257. ==={{int:Links}}=== {{BRBA|2019|May|25}} {{IPNI||2019|May 25}} {{POWO|2019|May|25}} {{MBG|2019|May|25}} {{GRIN||30874|09-Oct-10}} =={{int:Vernacular names}}== {{VN |af=Wilde mosterd |en=Annual bastard cabbage, Common giant mustard, Turnipweed |fi=Kurttusaksanretikka |hsb=Zamoršćeny rěpisk |nl=Bolletjesraket |sl=grbasta repnica }} {{Commons}} {{Taxonbar|from=Q159826}} [[Category:Carlo Allioni taxa]] jknaidtc7kdkmhmbyixh6ax0fb5i56k 11322984 11322976 2026-10-22T10:33:08Z Andyboorman 251907 11322984 wikitext text/x-wiki {{image|Bolletjesraket 19-05-2006 12.34.12.JPG}} =={{int:Taxonavigation}}== {{Rapistrum}} Species: '''''Rapistrum rugosum''''' =={{int:Name}}== ''Rapistrum rugosum'' ({{a|L.}}) {{a|All.}}, Fl. Pedem. i. 257. (1785) ==={{int:Synonyms}}=== *''Cakile rugosa'' (L.) L'Hér. ex DC. *''Cochlearia rugosa'' (L.) Crantz *''Hirschfeldia hispanica'' (L.) Linding. *''Myagrum hispanicum'' L. *''Myagrum orientale'' L. *''Myagrum rugosum'' L. *''Myagrum venosum'' Pers. *''Rapistrum clavatum'' (Poir.) DC. *''Rapistrum confusum'' Pomel *''Rapistrum conoideum'' Pomel *''Rapistrum glabrum'' Host *''Rapistrum hirsutum'' Host *''Rapistrum hirtum'' Host *''Rapistrum hispanicum'' (L.) Crantz *''Rapistrum hispidum'' Godr. *''Rapistrum linnaeanum'' Boiss. & Reut. *''Rapistrum longeramosum'' Sennen *''Rapistrum microcarpum'' Jord. *''Rapistrum orientale'' (L.) Crantz *''Rapistrum rugosum'' subsp. ''linnaeanum'' Rouy & Foucaud *''Rapistrum rugosum'' subsp. ''orientale'' (L.) Arcang. *''Rapistrum rugosum'' subsp. ''rugosum'' *''Rapistrum rugosum'' var. ''rugosum'' *''Rapistrum strictissimum'' Pomel =={{int:References}}== {{Allioni, 1785}} ==={{int:Links}}=== {{BRBA|2019|May|25}} {{IPNI||2019|May 25}} {{POWO|2019|May|25}} {{MBG|2019|May|25}} {{GRIN||30874|09-Oct-10}} =={{int:Vernacular names}}== {{VN |af=Wilde mosterd |en=Annual bastard cabbage, Common giant mustard, Turnipweed |fi=Kurttusaksanretikka |hsb=Zamoršćeny rěpisk |nl=Bolletjesraket |sl=grbasta repnica }} {{Commons}} {{Taxonbar|from=Q159826}} [[Category:Carlo Allioni taxa]] 3wbpnfohguvpn52u6jx0s9bx8q3blmo Nibedita Sen 0 360314 11322944 11149492 2026-10-22T10:13:51Z Tommy Kronkvist 596 /* 2007 */ Added a publication. 11322944 wikitext text/x-wiki '''Nibedita Sen''', Indian herpetologist and ichthyologist. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1982=== {{Singh et al., 1982}} ===1985=== {{Sen & Dey, 1985}} ===2007=== * {{a|Rosamma Mathew|Mathew, R.}} & {{a|Nibedita Sen|Sen, N.}} 2007. Description of two new species of ''Xenophrys'' (Amphibia: Anura: Megophryidae) from North-east India. ''Cobra'' 1(2): 18–28. Printed in Chennai. {{Sen, 2007}} ===2008=== * {{a|Rosamma Mathew|Mathew, R.}} & {{a|Nibedita Sen|Sen, N.}} 2008. Bibliographical Notes on the Amphibians of North East India. ''Records of the Zoological Survey of India, Occasional Paper'' 291: 1–58. [https://web.archive.org/web/20100113122441/http://www.vedamsbooks.com/no60545.htm Abstract.] ===2009=== * {{a|Rosamma Mathew|Mathew, R.}} & {{a|Nibedita Sen|Sen, N.}} 2009. Studies on caecilians (Amphibia: Gymnophiona: Ichthyophiidae) of North East India with description of three new species of ''Ichthyophis'' from Garo Hills, Meghalaya and additional information on ''Ichthyophis garoensis'' {{aut|Pillai & Ravichandran}}, 1999. ''Records of the Zoological Survey of India, Occasional Paper'' 309: 1–56. * {{a|Rosamma Mathew|Mathew, R.}} & {{a|Nibedita Sen|Sen, N.}} 2009. Studies on little known amphibians of Northeast India. ''Records of the Zoological Survey of India. Occasional Papers'' 293: 1–64, 23 pls. {{Authority control}} {{DEFAULTSORT:Sen, Nibedita}} [[Category:Taxon authorities]] [[Category:Herpetologists]] ed8gt1gdx1v4fgfzcu0hvho6ceof9v3 Brenda Lía Doti 0 372098 11322221 10990283 2026-10-21T18:44:31Z Neferkheperre 947633 /* 2021 */ 11322221 wikitext text/x-wiki {{image}} '''Brenda Lía Doti''', carcinologist. Departamento de Biodiversidad y Biología Experimental, Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires, Ciudad Universitaria, C1428EHA, Buenos Aires, Argentina {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2009=== {{Doti, Choudhury & Brandt, 2009}} ===2021=== {{Pereira, Doti & Roccatagliata, 2021}} ===2026=== {{López, Roccatagliata & Doti, 2026}} {{Authority control}} {{DEFAULTSORT:Doti, Brenda Lia}} [[Category:Taxon authorities]] [[Category:carcinologists]] g62eqlqm444vsarxni9y4dtycsyngf8 Grey 0 398447 11322498 10697154 2026-10-22T00:54:04Z The editor 2345 2915305 /* */ 11322498 wikitext text/x-wiki {{Refer|authority}} * [[Charles Hervey Grey]] (1875–1955, '''Grey'''), English botanist * [[Christopher Grey-Wilson]] ({{int:born}} 1944, '''Grey-Wilson'''), English botanist * [[Lionel Paul Grey]], entomologist * [[Luna Grey]], U.S. entomologist * [[Marion Griswold Grey]] (1911–1964), ichthyologist * [[Robert Melrose Grey]] ([[Floruit|fl.]] 1893, '''R.M.Grey'''), botanist * [[William Grey]] (circa 1827 – 1864/1896), entomologist ==See also== * [[Gray]] {{Disambiguation|cat=people}} p3yk81xzc8f61uynjljt9q1ol35d3hw David A. Ebert 0 399375 11322618 10820528 2026-10-22T07:11:30Z Hiouf 2107144 /* 2024 */ 11322618 wikitext text/x-wiki {{Distinguish|David A. Eberth}} '''David A. Ebert''', US ichthyologist * Pacific Shark Research Center, Moss Landing Marine Laboratories, Moss Landing, CA 95039, USA. * Research Associate, Department of Ichthyology, California Academy of Sciences, 55 Music Concourse Drive, San Francisco, CA 94118, USA * Research Associate, South African Institute for Aquatic Biodiversity, Private Bag 1015, Grahamstown, 6140, South Africa * E-mail: debert@mlml.calstate.edu {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2006 === {{Barnett et al., 2006}} {{Quaranta et al., 2006}} * {{a|Jayna Schaaf-Da Silva|Schaaf-Da Silva, J.}} & {{a|David A. Ebert|Ebert, D.A.}} 2006. ''Etmopterus burgessi'' sp. nov., a new species of lanternshark (Squaliformes: Etmopteridae) from Taiwan. ''[[ISSN 1175-5326|Zootaxa]]'' 1373: 53–64. ===2009=== {{James et al., 2009}} {{Ebert & Compagno, 2009}} ===2010=== {{Ebert et al., 2010}} {{Kemper et al., 2010}} ===2013=== {{Zt3752.1}} {{Ebert et al., 2013}} {{Ebert, White & Ho, 2013}} {{Zt3752.1.5}} {{Theiss & Ebert, 2013}} {{Ebert & Wilms, 2013}} {{Hsu et al., 2013}} {{Ebert et al., 2013a}} ===2015=== * {{Ebert, Haas & Carvalho, 2015}} * {{Walovich et al., 2015}} * {{Vásquez et al., 2015}} ===2016=== {{Concha, Ebert & Long, 2016}} {{Weigmann et al., 2016}} ===2017=== {{Clerkin, Ebert & Kemper, 2017}} {{Ebert et al., 2017}} {{Ebert & Gon, 2017}} {{Walovich, Ebert & Kemper, 2017}} {{Weigmann et al., 2017}} {{White, Ebert & Naylor, 2017}} {{White et al., 2017}} ===2018=== {{Ebert & van Hees, 2018}} {{Fahmi & Ebert, 2018}} ===2019=== {{Concha et al., 2019}} {{Ebert & Leslie, 2019}} {{Fernando et al., 2019}} ===2021=== {{Ebert, Wintner & Kyne, 2021}} {{Weigmann, Ebert & Séret, 2021}} ===2023=== {{Rezaie-Atagholipour et al., 2023}} {{Van Staden et al., 2023}} ===2024=== {{Aitchison et al., 2024}} {{Ebert et al., 2024}} {{Finucci et al., 2024}} {{Kumar et al., 2024}} ===2026=== {{Bineesh, Kasinath & Ebert, 2026}} {{DEFAULTSORT:Ebert, David}} {{Authority control}} [[Category:Taxon authorities]] [[Category:Ichthyologists]] 19ctky69veceavv5q7x23n8xqmwyq07 Blommersia dejongi 0 402791 11322361 11319727 2026-10-21T21:08:40Z Burmeister 9074 revision update 11322361 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Blommersia}} Species: ''[[Blommersia dejongi]]'' =={{int:Name}}== ''Blommersia dejongi'' {{a|Miguel Vences|Vences}}, {{a|Jörn Köhler|Köhler}}, {{a|Maciej Pabijan|Pabijan}} & {{a|Frank Glaw|Glaw}}, 2010: 147 * {{int:Holotype}}: {{rl|ZSM}} 455/2006. * {{int:Type locality}}: “Maromandia village, 16°54.536′ S, 49°52.068′ E, 20 m a.s.l., Nosy Boraha island (= Ile Sante Marie), eastern Madagascar”. =={{int:References}}== ==={{int:Primary references}}=== {{Vences et al., 2010c}} ==={{int:Links}}=== * {{smallcaps|IUCN SSC Amphibian Specialist Group}}. 2015. {{IUCN|LC|48964580}}. The IUCN Red List of Threatened Species 2015: e.T48964580A48964601. {{doi|10.2305/IUCN.UK.2015-4.RLTS.T48964580A48964601.en}}. Accessed on 20 October 2026. {{Taxonbar}} [[Category:Miguel Vences taxa]] [[Category:Jörn Köhler taxa]] [[Category:Maciej Pabijan taxa]] [[Category:Frank Glaw taxa]] [[Category:New species 2010]] 889zsogmxpl5r0egrobhf1opfjn50o7 Blommersia galani 0 402792 11322360 11319726 2026-10-21T21:06:55Z Burmeister 9074 revision update 11322360 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Blommersia}} Species: ''[[Blommersia galani]]'' =={{int:Name}}== ''Blommersia galani'' {{a|Miguel Vences|Vences}}, {{a|Jörn Köhler|Köhler}}, {{a|Maciej Pabijan|Pabijan}} & {{a|Frank Glaw|Glaw}}, 2010: 143 * {{int:Holotype}}: {{rl|ZSM}} 453/2006. * {{int:Type locality}}: “Maromandia village, 16° 54.536′ S, 49° 52.068′ E, 20 m a.s.l., Nosy Boraha island (= Ile Sante Marie), eastern Madagascar”. =={{int:References}}== ==={{int:Primary references}}=== {{Vences et al., 2010c}} ==={{int:Links}}=== * {{smallcaps|IUCN SSC Amphibian Specialist Group}}. 2015. {{IUCN|LC|48964583}}. The IUCN Red List of Threatened Species 2015: e.T48964583A48964607. {{doi|10.2305/IUCN.UK.2015-4.RLTS.T48964583A48964607.en}}. Accessed on 20 October 2026. {{Taxonbar}} [[Category:Miguel Vences taxa]] [[Category:Jörn Köhler taxa]] [[Category:Maciej Pabijan taxa]] [[Category:Frank Glaw taxa]] [[Category:New species 2010]] 0h3hj13ha4xsjbwzh3iaozkocwnhgkb Alexander Fyodorovich Emeljanov 0 424712 11322985 10991794 2026-10-22T10:33:11Z Hiouf 2107144 /* 2021 */ 11322985 wikitext text/x-wiki {{image}} '''Alexander Fyodorovich Emeljanov''' (15 June 1936–), Russian (Soviet) entomologist. {{ru|Александр Федорович Емельянов}} Alternative unaccepted transliterations: '''Emelyanov''', '''Alexander Fedorovich Emeljanov''' * Zoological institute, Russian Academy of Sciences, Universitetskaya nab., 1, Saint-Petersburg, 199034, Russian Federation. {{Taxa authored|g=m}} =={{int:Publications}}== {{inc}} ===1959=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1959. (New genera and species of leafhoppers (Auchenorrhyncha) from Kazakhstan.) ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 38: 833–839. ===1960=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1960. Order Homoptera. ''Nasekomye vrediashthshie kukuruze v SSSR [Insects injurious of corn in USSR]''. Pp. 172–177 ===1961=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1961. About food specialization of Cicadina. ''Materialy Kazakhstanskoy konferencii po probleme biokompleksov [Materials of Kazakhstan Conference to problem of biocomplexes, theses of reports]'': . Pp. 90–91. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Loginova, M.M.}} 1961. Preliminary information on entomofauna of Chenopodiaceae in Central Kazakhstan. ''Materialy Kasakhstanskoy konferencii po probleme biokompleksov [Materials of Kazakhstan Conference to problem of biocomplexes, theses of reports]''. Pp. 151–155. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1961. New genera and species of leafhoppers (Auchenorrhyncha, Jassidae) from the USSR. [Новые роды и виды цикадок (Auchenorrhyncha, Jassidae) из СССР]. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 40(1): 120–130. [in Russian; translated into English in ''Entomological Review'', Washington, 40(1): 57-62] ===1962=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}}, {{a|Izyaslav Moiseyevich Kerzhner|Kerzhner, I.M.}} & {{aut|Loginova, M.M.}} 1962. Methods and principal preliminary results of biocomplex investigation of Rhynchota in steppe and semidesert biocoenoses of Kazakhstan. ''Tezisy doklada na 3 dushanbinskoy konferentsii po problemam biokomplexov [Materials of 3 Dushanb. Conference to problem of biocomplex, theses of reports]''. 2: 72–75. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1962. Materials on taxonomy of Palaearctic leafhoppers (Auchenorrhyncha, Euscelinae). ''Trudy Zoologicheskogo Instituta Akademii Nauk SSSR'' 30: 156–184. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1962. A new leafhopper genus ''[[Selachina]]'' (Cicadellidae, Auchenorrhyncha). ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 41(5): 769–770. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1962. New tribes of leafhoppers of the subfamily Euscelinae (Auchenorrhyncha. Cicadellidae). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 41: 388–397. ===1963=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1963. (A new leafhopper genus from the subfamily Ulopinae (Auchenorrhyncha, Cicadellidae).) ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 42: 1581–1582. ===1964=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. Suborder Cicadinea (Auchenorrhyncha). Bei-Bienko, G. Y., ed. ''Keys to the Insects of the European USSR: Apterygota, Palaeoptera, Hemimetabola'' 1: 337–437 * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. (A new species of Macropsis Lewis (Homoptera: Cicadellidae) found on eleaster (Eleagnus).) ''[[ISSN 0002-3469|Doklady Akademii Nauk Tadzhikskoi SSR]]'' 7(1): 47–48. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. (New genera and species of Cicadellidae from Central Asia (Homoptera).) ''[[ISSN 0002-3469|Doklady Akademii Nauk Tadzhikskoi SSR]]'' Dushanbe 7(2): 52–56. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. New Auchenorrhyncha from Kazakhstan (Homoptera). ''Trudy Zoologicheskogo Instituta Akademii Nauk SSSR'' 34: 3–51. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. New Cicadina from Kazakhstan (Homoptera, Auchenorrhyncha). [New species of insects of the fauna of Kazakhstan.] ''Trudy Zoologicheskogo Instituta Akademii Nauk SSSR''. 34: 3–51. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. (Food specialization of cicadellids based on material about the fauna of central Kazakhstan.) ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 43(7): 1000–1010. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. Food specialization of Cicadina based on material about the fauna of Central Kazakhstan. ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 43(7): 1000–1010. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1964. New species of steppe leafhoppers (Homoptera, Cicadellidae) from Transbaikalia and other eastern regions of the USSR. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 43: 626–632. ===1965=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1965. About essential difference of dominant and assectator consortions, to be displayed on assignment cicadina oligophages into plants. ''[[ISSN 0006-8136|Botanicheskii Zhurnal]]'' [Botanical Journal]. 50(2): 221–223. ===1966=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1966. (The genus ''[[Coulinus]]'' Beirne in the Palearctic (Homoptera, Cicadellidae).) ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 45(2): 299–300. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1966. (On the tribe Stirellini trib. n. and its taxonomic position (Homoptera, Cicadellidae).) ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 45: 609–610. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1966. New palaearctic and certain nearctic cicadina (Homoptera, Auchenorrhyncha). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 45(1): 95-133. ===1967=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1967. (Some features of the distribution of oligophagous insects on food plants.) ''Chteniya pamyati N.A. Cholodkovskovo [Lectures in memory of N.A.Cholodkovskiy]''. 19: 28–65. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1967. Suborder cicadinea (Auchenorrhyncha). Bei-Bienko, G. Y., ed ''Keys to the insects of the European U.S.S.R I. Apterygota, Palaeoptera, Hemimetabola''. Pp. 421–551. Israel Program for Scientific Translations, Jerusalem. ===1968=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1968. (Notes on the tribe Stirellini (Homoptera, Cicadellidae).) ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 47: 249–253. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1968. Two new genera of leafhoppers (Homoptera, Cicadellidae) from Mongolia. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 47: 147–150. ===1969=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1969. New Palaearctic leafhoppers of the tribe Opsiini (Homoptera, Cicadellidae, Deltocephalinae). ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 48: 1100–1104. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1969. Reclassification of planthoppers of the subfamily Orgeriinae (Homoptera, Dictyopharidae) of the palaearctic fauna. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 48(2): 324-339. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1969. ''[[ISSN 1868-3592|Cicadina]]'' (Homoptera, Auchenorrhyncha) of Central Kazachstan. Phytocoenoses and Fauna of the Steppes and Deserts of Central Kazachstan. Pt. 3. Composition and Analysis of the Fauna of the Western Part of Central Kazachstan. ) Pp. 358–381. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1969. Systematics and phylogeny of planthoppers of the subfamily Orgeriinae (Homoptera, Dictyopharidae). ''Materialy Otchetnoy nauchnoy sessii Zoologicheskogo Instituta Akademii Nauk SSSR [Annual Reports of the Zoological Institute of the Academy of Sciences of the USSR]''. 1969: 21–22. ===1970=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1970. (Palaearctic leafhoppers of the genus ''[[Athysanella]]'' Baker (Homoptera, Cicadellidae).) ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 49(1): 161–164. ===1971=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1971. New genera of leafhoppers of the families Cixiidae and Issidae (Homoptera, Auchenorrhyncha) in the USSR. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 50: 619–627. [in Russian]. ===1972=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. Review of viewpoints on origin of desert biota of Central Asia. Mongol Omy Shavizh. I-r Tsuvral. Otdelnyi Ottisk. ''Nasekomye Mongolii Vypusk'' 1: 11–49. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. Новые Цикадовые из Монголыской Народной Республики [New leafhoppers from the Mongolian People's Republic] (Homoptera, Auchenorrhyncha). In Insects of Mongolia. Nauka, 1: 199-260. {{PDF|https://flow.hemiptera-databases.org/flowpdf/2211.pdf}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. (Short note.) ''Insects and Acari: pests of agricultural crops''. 1: 283. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. New genera of Cicadina of Delphacidae family (Homoptera, Auchenorrhyncha) from Kazakhstan. ''[[ISSN 0084-5604|Vestnik Zoologii]]'' 2: 79–81. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. Auchenorrhyncha. Narchuk, E., et al., eds. ''Insects and Arachnids. Pests of Agricultural Crops. I. Insects with Incomplete Metamorphosis''. Pp. 117–138. Nasekomye i kleshchi: vrediteli sel-skokhozyaistvennykh kul'tur. Leningrad. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. (New Palaearctic leafhoppers of the subfamily Deltocephalinae (Homoptera, Cicadellidae).) ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 51(1): 102–111. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1972. New species of the subfamily Orgeriinae of palaearctic fauna (Homoptera, Dictyopharidae). ''[[ISSN 0373-1278|Trudy Vsesoyuznoge Entomologicheskogo Obshchestva]]'' 55: 14–38. ===1973=== ===1974=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1974. Proposal on the classification and nomenclature of areals. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 53(3): 497–522. ===1975=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1975. Homology of wing structures in Blattida and Cicadina. ''Materialy Otchetnoy nauchnoy sessii Zoologicheskogo Instituta Akademii Nauk SSSR 10–12.03.1975. Tez. dokl. [Annual Reports of the Zoological Institute of the Academy of Sciences of the USSR]''. Pp. 11–12. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1975. Revision of the tribe Adelungiini (Homoptera, Cicadellidae). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 54(2): 383–390. ===1977=== {{Emeljanov, Kerzhner & Kozlov, 1977}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1977. Leaf-hoppers (Homoptera, Auchenorrhyncha) from the Mongolian People's Republic based mainly on materials fo the Soviet-Mongolian zoological expeditions (1967–1969. ''Insects of Mongolia''. V. 5. Leningrad: Nauka. 96–195. ===1978=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1978. New genera and species of leafhoppers (Homoptera, Auchenorrhyncha) from the USSR and Mongolia. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 57: 316–332. ===1979=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1979. [The problem of family distinction between the Fulgoridae and the Dictyopharidae (Homoptera, Auchenorrhyncha)] ''Trudy Zoologicheskogo Instituta Akademii Nauk SSSR'' 82: 3–22. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1979. New species of the leafhoppers (Homoptera, Auchenorrhyncha) from the Asiatic part of the USSR. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 58(2): 322–332. ( in Russian, translated into English in ''[[ISSN 0013-8738|Entomological Review]]'' (Washington) 58(2): 66–77.) * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1979. [A new species of the genus ''[[Sphenocratus]]'' Horv. (Homoptera, Dictyopharidae) from Tadzhikistan.] ''[[ISSN 0373-1278|Trudy Vsesoyuznoge Entomologicheskogo Obshchestva]]'' 61: 21–24. ===1980=== {{Emeljanov & Kozlov, 1980}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1980. Phylogeny and evolution of subfamily Orgeriinae (Homoptera, Dictyopharidae). ''Tshtenija pamjati Cholodkovskovo [Lectures in memory of Cholodkovsky]''. 32: 3–96. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1980. An attempt of subgeneric division of the genus ''[[Tettigometra]]'' Latr. (Homoptera, Tettigometridae). ''[[ISSN 0084-5604|Vestnik Zoologii]]'' 2: 51–55. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1980. Review: F. Ossiannilsson. The Auchenorrhyncha (Homoptera) of Fennoscandia and Denmark. Introduction, infraorder Fulgoromorpha. ''[[ISSN 0106-8377|Fauna Entomologica Scandinavica]]'' 1978. Vol. 7, part 1. Entomologicheskoe Obozrenie (Moscow). 9(3): 703–704. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1980. Suborder Auchenorrhyncha. ''Opredelitel vrednykh i poleznykh nasekomykh i kleshtshey zernovykh kultur v SSSR. [Keys for identification of injurious and useful insects and mites on corn in USSR]''. Leningrad, "Kolos". 1980: 70–73. ===1981=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1981. Structure and origin of the endopleural formations in the metathorax of the Auchenorrhyncha (Homoptera). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 60: 732–744. ===1982=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1982. Fulgoroidea (Homoptera) collected in the Mongolian People's Republic by the entomofaunistical group of the Soviet Mongolian complex biological expedition in 1970–1975. ''Nasekomye Mongolii (Insects of Mongolia)'' 8: 69–122. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1982. Two new species of the genus ''[[Nymphorgerius]]'' (Homoptera, Auchenorrhyncha, Dictyopharidae) from a south part of the Middle Asia. ''Trudy Zoologicheskogo Instituta Akademii Nauk SSSR'' 105: 3–6. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1982. Structure and evolution of the tarsi in Dictyopharidae (Homoptera). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 61, 3: 501–516. ( in Russian, translated into English in ''[[ISSN 0013-8738|Entomological Review]]'' (Washington) 61(3): 44–59.) * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1982. Suborder Cicadinea - Auchenorrhyncha. ''Opredelitel vredn. i polezn. nasek. i kleshchey ovoshchnykh kultur i kartofelja v SSSR. [Keys for identification of injurious and useful insects and mites on vegetable cultures and potato in USSR]'' Leningrad, "Kolos". 1982: 48–49. ===1983=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1983. Nosatka iz mela Taïmyra (Insecta, Homoptera) [Dictyopharidae from the Cretaceous deposits on the Taïmyr Peninsula (Insecta, Homoptera)]. ''Paleontologicheskii Zhurnal'' 17(3): 79-85. {{Emeljanov & Kuznetsova, 1983}} {{Emeljanov & Kerzhner, 1983}} ===1984=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1984. A contribution to knowledge of the families Kinnaridae and Meenoplidae (Homoptera, Fulgoroidea). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 1984(3): 468-483 [51]. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1984. Suborder Cicadinea - Auchenorrhyncha. Pages 56–57 in V.S. Velikan, ed. ''[Keys to the identification of harmful and useful insects and mites of fruit and berry plantations in the USSR.]'' Kolos, Leningrad. ===1986=== {{Emeljanov, Kerzhner & Kozlov, 1986}} ===1987=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1987. A new species of planthoppers of the genus ''[[Perkinsiella]]'' Kirkaldy (Homoptera, Delphacidae) from Vietnam. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 66(2): 338–341. ( in Russian, translated into English in ''[[ISSN 0013-8738|Entomological Review]]'' (Washington). 1988. 67(1): 108–111.) * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1987. Phylogeny of Cicadina (Homoptera) on comparative morphological data. ''[[ISSN 0373-1278|Trudy Vsesoyuznoge Entomologicheskogo Obshchestva]]'' 69: 19–109. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1987. Suborder Cicadinea - Auchenorrhyncha. ''Opredelitel vredn. i polezn. nasek. i kleshtshey khlopchatnika v SSSR. [Keys for identification of injurious and useful insects and mites of cotton in USSR]''. Leningrad, "Kolos". 1987: 34–35. ===1989=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Kirillova, V.I.}} 1989. Trends and modes of the karyotype evolution in the Cicadina. I. Peculiarities and evolutionary changes of the karyotypes in the superfamily Cicadelloidea (Homptera). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 68(3): 587–603. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1989. On the problem of division of the family Cixiidae (Homoptera, Cicadina). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 68: 93–106 ===1990=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1990. A new species of the genus ''[[Bashgultala]]'' (Homoptera, Kinnaridae) from Tadjikistan. ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 69(4): 137–139. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1990. A new genus and a new tribe of the family Achilidae (Homoptera, Cicadina) from the Baltic Amber. ''[[ISSN 0084-5604|Vestnik Zoologii]]'' 1: 6–10. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1990. Phylogeny, classification and system. ''Trudy Zoologicheskogo Instituta Akademii Nauk SSSR'' 206: 152–170. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1990. Novyj rod i triba semeïstva Achilidae (Homoptera, Cicadina) iz baltiïskogo yantarya. ''Vestnik Zoologii'' (1990(1): 6-10. ===1991=== {{Emeljanov & Rasnitsyn, 1991}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1991. An attempt to construct a phylogenetic tree for planthoppers (Homoptera, Cicadina). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 69: 353–356. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1991. To the problem of the limits and subdivisions of the family Achilidae (Homoptera, Cicadina). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 70(2): 373-393. ===1992=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1992. A new species of the genus ''[[Ulopa]]'' (Homoptera, Ulopidae) from Altai. ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 2: 140–142. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Kirillova, V.I.}} 1992. Trends and modes of the karyotype evolution in Cicadina: II. Peculiarities and evolutionary changes of karyotypes in the superfamilies Cercopoidea, Cicadoidea, Fulgoridea and the Cicadina as a whole (Homoptera). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 70: 796–817. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1992. Description of tribes of the subfamily Achilinae (Homoptera, Achilidae) and revision of their composition. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 71(3): 574–594. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1992. Two New Tribes, a New Genus and a New Species of the Family Derbidae (Homoptera, Fulgoroidea). ''Vestnik Zoologii'' 1992(4): 19-23 [19]. ===1993=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Kirillova, V.I.}} 1993. General characteristic and main modes of the karyotype evolution in the Cicadina (Homoptera, Auchenorrhyncha). G. S. Medvedev and B. A. Korotyaev, (eds.). ''Uspekhi entomologii v SSSR: zhestkokrylye nasekomye. Materialy X s'ezda Vsesojuznogo Entomologicheskogo Obshchestva, 11–15 sentyabrya 1989''. Leningrad. Pp. 120–121.. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1993. A new genus of planthoppers of the family Delphacidae from Ethiopia (Homoptera, Cicadina). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 2(1): 93–96. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1993. Planthoppers of the family Cixiidae from vicinity of Ambo, Ethiopia (Homoptera, Cicadina). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 1992. 1(1): 20–36. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Kirillova, V.I.}} 1993. Karyotypes and evolutionary changes of the karyotypes in the suborder Cicadina (Homoptera). ''Kariosistematica besposvonochnykh zhivotnych [Karyosystematic of invertebrate animals]''. Self-Published. 1993, 2. ===1994=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1994. The first find of fossil Derbidae, and a redescription of Paleogene achilid Hooleya Cockerell (Insecta: Homoptera, Fulgoroidea). ''[[ISSN 0031-031X|Paleontologicheskii Zhurnal]]'' 3: 76–82. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1994. Pervaya iskopaemaya nakhodka semeïstva Derbide i pereopisanie paleogenogo roda Hooleya Cockerell (Achilidae) (Insecta: Homoptera, Fulgoroidea) [The first find of fossil Derbidae and a redescription of Paleogene achilid Hooleya Cockerell (Insecta: Homoptera). ''[[ISSN 0031-0301|Paleontological Journal]]'' 28(3): 92–101. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1994. Gular sclerotization of some Cicadina (Insecta, Homoptera). ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 73(10): 130–134. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1994. The species of Perkinsiella introduced into Florida is the genuine P. saccharicida Kirkaldy (Homoptera: Delphacidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 3(1): 18. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1994. Morphological peculiarities of the larvae of the family Dictyopharidae (Homoptera). I. General characteristic and a key to genera of the palaearctic fauna. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 72(4): 794–811. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1994. Morphological peculiarities of the larvae of the family Dictyopharidae (Homoptera). II. Developmental changes. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 73(3): 645–665. ===1995=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1995. New taxa of the tribe Pentastirini (Homoptera, Cixiidae) from the Palearctic Region. ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 74(9): 73–89. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1995. A new genus of the family Delphacidae (Homoptera, Cicadina) from the steppe regions of the Palaearctics. ''[[ISSN 0084-5604|Vestnik Zoologii]]'' 1995(2–3): 86–88. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1995. On the system and phylogeny of the family Derbidae (Homoptera, Cicadina). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 73: 783–811, * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1995. On the question of the classification and phylogeny of the Delphacidae (Homoptera, Cicadina), with reference to larval characters. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 74: 780-794. ===1996=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1996. Two new Cicadidae species similar to ''Cicadetta tibialis'' (Homoptera, Cicadidae). ''[[ISSN 0044-5134|Zoologicheskiy Zhurnal]]'' 75: 1897–1900. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1996. A new genus of the family Delphacidae (Homoptera, Cicadina) from the steppe region of the Palaearctics. ''[[ISSN 0084-5604|Vestnik Zoologii]]'' 1995. 2–3: 86–88. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1996. First record of ''Hyalesthes mlokosiewiczi'' Signoret from Middle Asia and some other new data on its distribution (Homoptera: Cixiidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 5(1): 28. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1996. Contribution to the knowledge of leafhoppers of the family Ulopidae (Homoptera, Cicadina). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 75(2): 278–293. ===1997=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1997. The ways of developing classification and reconstructing phylogeny in the family Cixiidae. ''Program and Abstract Book, 9th International Auchenorrhyncha Congress'' Pp. 38–39. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1997. A new subgenus of the genus ''[[Paramesus]]'' Fieber (Homoptera: Cicadellidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 6(1–2): 76. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1997. A new genus and species of the Dictyopharidae from Australia belonging to a new tribe (Homoptera, Cicadina). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 6(1–2): 77–82. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1997. New species and new data on the distribution of the subfamily Orgeriinae in the Palaearctic Region (Homoptera: Dictyopharidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 6(1–2): 83–90. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1997. Two new species of leafhoppers from Caucasus (Homoptera: Cicadellidae. ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 6(1–2): 91–93. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1997. A new genus, ''Chirodisca'' gen. n., and new subgenera of the genus ''Aphelonema'' Uhl. (Homoptera, Fulgoroidea, Issidae). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 75(4): 834–835. ===1998=== {{Emeljanov & Kerzhner, 1998}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1998. Contribution to the knowledge of the genus ''[[Kuvera]]'' Distant (Homoptera: Cixiidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 7(1): 133–137. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1998. New species of the genus ''[[Ranissus]]'' Fieb. (Homoptera: Dictyopharidae) from Greece. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 77(2): 327–330. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1998. A new genus of the family Issidae (Homoptera, Auchenorrhyncha) from Vietnam. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 77(3): 534–536. ===1999=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1999. A new species of the genus ''[[Anoplotettix]]'' Ribaut (Hemiptera: Auchenorrhyncha: Cicadomorpha: Cicadellidae: Delthoceohalinae). ''[[ISSN 0070-7279|Reichenbachia]]'' 30(20): 147–150. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1999. A new genus for ''Heronax candidus'' Anufriev and some other taxonomic remarks concerning the Far East Derbidae (Homoptera, Cicadina). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 8(1): 120. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1999. Notes on delimitation of families of the Issidae group with description of a new species of Caliscelidae belonging to a new genus and tribe (Homoptera, Fulgoroidea). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 8: 61–72. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1999. A key to the genera of the subfamily Dellocephalinae s.l. (Homoptera, Cicadellidae) from Kazakstan. Middle Asia and Mongolia with description of new genera and subgenera. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 78(3): 589–609. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 1999. A new genus of planthoppers of the subfamily Orgeriinae (Homoptera, Dictyopharidae) from the Mediterranean. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 78(4): 825–827. ===2000=== {{Emeljanov & Shcherbakov, 2000}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2000. Some macroevolutional modes, concerned with repeated and new use of once acquired structures. Theoretical problems of ecology and evolution. ''3rd Lyubischevskie chteniya (3rd Meeting in memory of A.A. Lyubischev)'', Tol'yatti, Institute of Volga basin RAS. Pp. 60–64 * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2000. New records of planthoppers and leafhoppers from Russia and Kazakhstan (Homoptera, Cicadina). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 8(2): 256. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2000. New genera of the family Cixiidae (Homoptera, Fulgoroidea) from Australia and neighbouring Territories. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 79(1): 12–34. [in Russian, English translation in ''Entomological review'' 80(3): 251–270.] * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2000. A new species of the genus ''[[Pithyotettix]]'' Rib. (Homoptera, Cicadellidae) from the Caucasus, with comments on the genus as a whole. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 79(4): 831–834. ===2001=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Drosopoulos, S.}} 2001. Dictyopharinae of Greece: imagines and nymphs (Homoptera: Dictyopharidae). ''2nd European Hemiptera Congress, Fiesa, 2001. Program and book of abstracts''. Pp. 13–14. {{Emeljanov, Gnezdilov & Gjonov, 2000}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2001. Fixation of the type species for the genus ''[[Latilica]]'' Emeljanov, 1971, with description of a new genus of issids (Homoptera, Cicadina: Issidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 9(1): 99–100. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2001. Larval characters and their ontogenetic development in Fulgoroidea (Homoptera, Cicadina). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 9(1): 101- 121. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2001. The generic position of some Nearctic Pentastirini (Homoptera: Fulgoroidea: Cixiidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 9: 122. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2001. Two new species of the genus ''[[Monorachis]]'' Uhler from Mexico and some new replacement names in Cixiidae (Homoptera: Cixiidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 10(1): 67–70. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2001. The genus ''[[Oliarus]]'' s.str. and related genera from the Oriental Region (Homoptera: Cixiidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 10: 71–72. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2001. New genus of the family Issidae from Tajikistan (Homoptera, Auchenorrhyncha). ''[[ISSN 1680-1024|Tethys Entomological Research]]'' 3: 61–62. ===2002=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2002. Contribution to classification and phylogeny of the family Cixiidae (Hemiptera, Fulgoromorpha). ''Denisia'' 4: 103–112. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2002. A record of Derbidae (Insecta, Homoptera, Fulgoroidea) in the miocene of the Northern Caucasus. ''[[ISSN 0031-031X|Paleontologicheskii Zhurnal]]'' 3: 49–50. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2002. Nakhodka predstavitelya semeïstva Derbidae (Insecta, Homoptera, Fulgoroidea) v miotsene Severnogo Kavkaza, [A record of Derbidae (Insecta, Homoptera, Fulgoroidea) in the Miocene of the Northern Caucasus]. ''[[ISSN 0031-0301|Paleontological Journal]]'' 36(3): 277–278. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2002. The distribution and evolution of land organisms in the view of biogeography. ''XII Congress of Russian Entomological Society: St. Petersburg, August 19–24, 2002. Abstracts''. 112–113. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2002. A new genus and a new species of the tribe Doraturini (Homoptera, Cicadellidae, Deltocephalinae) from Mali. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 81(3): 662–665, 780. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2002. Evolutionary scenario of the forming of rostrum in the Rhynchota. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 81(4): 795–807. {{Emeljanov, Gnezdilov & Gjonov, 2002}} ===2003=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2003. New taxa and new data on distribution of the subfamily Orgeriinae in the Mediterranean (Homoptera, Dictyopharidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 11(2): 311–319. ===2004=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2004. The subgeneric division of the genus ''[[Dictyophara]]'' Germar, 1833 (Homoptera: Dictyopharidae). ''[[ISSN 0132-8069|Russian Entomological Journal]]'' 12(4): 357–358. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2004. Book review. Herbert Nickel. The leafhoppers and planthoppers of Germany (Hemiptera, Auchenorrhyncha): patterns and strategies a highly diverse group of phytophagous insects. Co-published by Pensoft Publishers, Sofia-Moscow and Goecke and Evers, Keltern. ''[[ISSN 0132-8069|Russian Entomological Journal]]'' 13(1–2): 97–99. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2004. Evolution of the terrestrial biota from the standpoint of biogeography. ''Fundamental zoological researches, Theory and Methods''. KMK Scientific Press Ltd. Moscow, St.Petersburg. Pp. 216–242 * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2004. A new genus and tribe of Strongylodematinae (Homoptera: Fulgoridae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 13(1): 52. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Drosopoulos, S.}} 2004. A new species of the genus ''[[Bursinia]]'' A. Costa (Homoptera, Dictyopharidae) from Southern Portugal. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 83(3): 521–522. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Fletcher, M.J.}} 2004. Hemielissum evansi, a new genus and species of Breddiniolini (Hemiptera: Fulgoromorpha), being the first Australian record of the tribe, with a discussion of the taxonomic position of the Breddiniolini. ''[[ISSN 1326-6756|Australian Journal of Entomology]]'' 43: 38–42. ===2005=== {{Emeljanov et al., 2005}} {{Emeljanov & Shcherbakov, 2005}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2005 - New genera and species of the family Achilidae (Homoptera). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 84(1): 10-45 [30]. ===2006=== {{Emeljanov, 2006a}} {{Emeljanov, 2006b}} ===2007=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2007. A new species of Capocles Emeljanov from South Africa (Homoptera: Fulgoridae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 16(1): 23–24. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2007. A new species of the genus ''[[Acrometopum]]'' Stål from South Africa (Homoptera: Gengidae). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 16: 25–26. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2007. A new genus of Caliscelidae from Northern India (Homoptera, Fulgoroidea). ''[[ISSN 0320-9180|Zoosystematica Rossica]]'' 2006.15(2): 236. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2007. New and little known taxa of the family Cixiidae (Homoptera, Fulgoroidea). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 86(1): 107–131 (Translated into English in ''[[ISSN 0013-8738|Entomological Review]]'' 2007. 87(3): 287–308). {{Emeljanov & Hayashi, 2007}} {{Emeljanov, 2007}} ===2008=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2008. Two new genera of the family Derbidae from the New World, with description of recent and an extinct Miocene new species (Homoptera: Fulgoroidea). ''Entomological review'' 88(8): 910–915. {{doi|10.1134/S0013873808080046}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2008. New genera and species of the family Dictyopharidae (Homoptera), with notes on the systematics of the subfamily Dictyopharinae. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 87(2): 360–396. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2008. Two new genera of the family Derbidae from the New World, with description of recent and an extinct Miocene New Species (Homoptera, Fulgoroidea). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 88(8): 910–915. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2008. New species of the genus ''[[Peltonotellus]]'' Puton (Homoptera, Caliscelidae) from Kazakhstan, Middle and Central Asia. ''[[ISSN 1680-1024|Tethys Entomological Research]]'' 16: 5–12. ===2009=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2009. Evolutionary transformations of abdominal wax-plates in the larvae of the Fulgoroidea (Homoptera, Cicadina). ''[[ISSN 0013-8738|Entomological Review]]'' (Washington). 89(9): 1035–1054. {{Emeljanov & Shcherbakov, 2009}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2009. Subgeneric division of some genera of the family Orgeriinae, with description of new subgenera (Homoptera: Dictyopharidae). ''[[ISSN 0132-8069|Russian Entomological Journal]]'' 18(1): 47–50. {{Emeljanov & Gnezdilov, 2009}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2009. A new species of the planthopper genus ''[[Nymphorgerius]]'' Oshanin (Homoptera, Dictyopharidae) from Iran [in Russian]. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 88(2): 383–385. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{aut|Wilson, M.R.}} 2009. First record of the family Dictyopharidae (Hemiptera, Fulgoromorpha) from Fiji, with the description of a new species of the genus ''[[Anasta]]'' Emeljanov. ''[[ISSN 0893-1348|Bernice P. Bishop Museum Occasional Papers]]'' 106: 35–41. ===2010=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2010. A new genus of the family Dictyopharidae (Homoptera) from Argentina. ''[[ISSN 0013-8738|Entomological Review]]'' (Washington). 90(6): 724–726. {{Guglielmino, Bückle & Emeljanov, 2010}} ===2011=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2011. A new genus and a new species of lanternflies of the subfamily Cladyphinae (Homoptera, Fulgoridae). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 90(1): 159–165. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2011. Improved tribal delimitation of the subfamily Dictyopharinae and description of new genera and new species (Homoptera, Fulgoroidea, Dictyopharidae). ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 90: 299–328. {{Emeljanov & Shcherbakov, 2011}} ===2012=== {{Emeljanov & Mozaffarian, 2012}} {{Emeljanov, Stern & Freidberg, 2012}} {{Emeljanov & Tishechkin, 2012}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2012. A new subgenus and new species of the planthopper family Lophopidae (Homoptera, Fulgoroidea) from Papua-NewGuinea. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 91(4): 775–780. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2012. [Reviews and Scientific Discussions: Kuntz, H. R. Nickel, R Niedringhaus, Fotoatlas der Zikaden Deutschlands]. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 91(4): 889–890.. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2012. New species of the genus ''[[Dudanus]]'' Dlabola, 1956 from Transcaucasia and Middle Asia (Homoptera: Cicadellidae: Deltocephalinae). ''[[ISSN 1814-3326|Caucasian Entomological Bulletin]]'' 8(1): 3–6. ===2013=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2013. A new genus and species of the planthopper tribe Eucarpiini (Homoptera, Cixiidae) from South Vietnam. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). XCII(4): 716–719. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2013. A new species of the genus ''[[Pibrocha]]'' Kirkaldy (Homoptera, Fulgoridae) with notes on the systematics of the subfamily Dichopterinae and with description of a new tribe. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 92(1): 123–129. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2013. A new genus and a new species of the planthopper tribe Eucarpiini (Homoptera, Cixiidae) from Southern Vietnam. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 92(4): 716–719. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2013. On the subdivision of the family Lophopidae (Homoptera, Auchenorrhyncha: Fulgoroidea) on the subfamilies and tribes with description of two new tribes. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 92(4): 720–723. {{Emeljanov, 2013}} ===2014=== {{Emeljanov & Gnezdilov, 2014}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2014. A New Tribe, a New Genus, and a New Species of the Subfamily Dictyopharinae (Homoptera, Dictyopharidae) from Chile. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' 93(3): 646-652 [647]. ===2015=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2015. Planthoppers of the family Cixiidae of russia and adjacent territories. ''Keys to the fauna of Russia'' 177: 1–252. * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2015. A new genus of Dictyopharidae (Homoptera) from Chile. ''[[ISSN 0367-1445|Entomologicheskoe Obozrenie]]'' (Moscow). 94(1): 138–142. {{Emeljanov, 2015}} ===2016=== * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2016. First Record of the Planthopper Family Kinnaridae (Homoptera, Fulgoroidea) in Chile. ''[[ISSN 0013-8738|Entomological Review]]'' 96(9): 1203–1208. (Originally submitted in Russian, but is first published in translation). ===2017=== {{Emeljanov, Özgen & Gnezdilov, 2017}} * {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} 2017. First record of the planthopper family Kinnaridae (Homoptera, Fulgoroidea) in Chile. ''Entomological Review'' (2016) 96(9): 1203-1208 [1203]. {{Emeljanov & Saryglar, 2017}} ===2018=== {{Emeljanov & Shcherbakov, 2018}} ===2019=== {{Emeljanov, 2019}} ===2020=== {{Emeljanov, 2020}} {{Gnezdilov & Emeljanov, 2020}} ===2021=== {{Gnezdilov et al., 2021}} ===2026=== {{Shcherbakov, Emeljanov & Perkovsky, 2026}} {{Authority control}} {{DEFAULTSORT:Emeljanov, Alexander Fyodorovich}} [[Category:Taxon authorities]] [[Category:Hemipterists]] [[Category:Entomologists]] [[Category:Zoologists]] bbl57xuafdz4cd8s2p88x1kgduk046e Ma 0 430961 11322020 11263174 2026-10-21T14:25:31Z Neferkheperre 947633 11322020 wikitext text/x-wiki {{refer|authority}} * [[Chao Ma]], malacologist * [[Cheng-Cheng Ma]], Chinese zoologist * [[Chun-Yan Ma]], entomologist * [[En-Bo Ma]], Chinese entomologist * [[En-Pei Ma]], Chinese entomologist * [[Fang-Zhou Ma]], Chinese entomologist * [[Feng-Lin Ma]], Chinese entomologist * [[Ge Ma]], Chinese entomologist * [[Hong-Gang Ma]], Chinese parasitologist * [[Hong-Ye Ma]], Chinese entomologist * [[Hui-Qin Ma]], Chinese myriapodologist * [[Jian-Zhang Ma]], Chinese herpetologist * [[Jiaxin Ma]], Chinese paleontologist * [[Ji-Shun Ma]], Chinese carcinologist * [[Ka Yan Ma]], ichthyologist * [[Ke-Ping Ma]] ('''K.P.Ma'''), Chinese botanist * [[Li Ma]], Chinese entomologist * [[Li Ma (Lishui University)]], Chinese zoologist * [[Li-Bin Ma]], Chinese entomologist * [[Li-Ming Ma]], Chinese acarologist * [[Li-Jun Ma]], Chinese entomologist * [[Lin Ma]], Chinese ichthyologist * [[Lue Ma]], Chinese batrachologist * [[Min Ma]], Chinese acarologist * [[Na Ma]], Chinese entomologist * [[Ning Ma]], Chinese arachnologist * [[Qi Sheng Ma]] ('''Q.S.Ma'''), botanist * [[Shao-Bo Ma]], ichthyologist * [[Shi-Lai Ma]], Chinese zoologist * [[Shuai Ma]], phycologist * [[Shuang-Chun Ma]], Chinese arachnologist * [[Shun Ma]], Chinese herpetologist * [[Shun-Xin Ma]], Chinese ostracodologist * [[Wei Ma]], Chinese ichthyologist * [[Wei Liang Ma]] (born 1936; '''W.L.Ma'''), botanist * [[Wen-Chun Ma]], Taiwanese ichthyologist * [[Wen-Jing Ma]], Chinese entomologist * [[Wen-Tao]], Chinese entomologist * [[Wen-Ya Ma]], Chinese entomologist * [[Wen-Zhen Ma]], Chinese entomologist * [[Xiao Ma]], ichthyologist * [[Xiao-Li Ma]], Chinese arachnologist * [[Xiao-Wan Ma]], Chinese isopodologist * [[Xiaoya Ma]], multiple people * [[Xing-Tao Ma]], entomologist * [[Yan Ma]], entomologist * [[Yan-Yan Ma]], Chinese arachnologist * [[Yao Ma]], Chinese entomologist * [[Yi-Ming Ma]], Chinese entomologist * [[Yi-Tong Ma]], Chinese entomologist * [[Yong Ma]], Chinese mammalogist * [[Yu-Chuan Ma]] (1916–2008; '''Ma'''), Chinese botanist * [[Yu-Xuan Ma]], Chinese entomologist * [[Yun-Long Ma]], Chinese entomologist * [[Zhen-Xia Ma]], Chinese entomologist * [[Zhen-Xing Ma]], Chinese entomologist * [[Zheng-Xu Ma]] ('''Z.X.Ma'''), botanist * [[Zhi-Chun Ma]], Chinese entomologist * [[Zhi-Ning Ma]], Chinese arachnologist * [[Zhiheng Ma]], Chinese paleontologist * [[Zhong-Yu Ma]], Chinese entomologist {{disambiguation |cat=people}} bv7s92kpc844htq1oqj7m3i3v4rvp7c Androsace lactea 0 440548 11322369 9574596 2026-10-21T21:11:22Z TadejM 24665 /* {{int:Vernacular names}} */ +sl 11322369 wikitext text/x-wiki {{Image|Androsace lactea.jpg}} =={{int:Taxonavigation}}== {{Androsace}} Species: ''[[Androsace lactea]]'' =={{int:Name}}== ''Androsace lactea'' {{a|Fisch.}} ex {{a|Willd.}}, Enum. Pl.: 190 (1809). ==={{int:Synonyms}}=== {{HOT}} ** ''Primula lactea'' ({{a|L.}}) {{a|Lam.}}, Fl. Franç. 2: 250 (1779). {{HET}} ** ''Androsace pauciflora'' {{a|Vill.}}, Hist. Pl. Dauphiné 2: 477 (1787). {{Nadi| * '''Europe''' ** '''Middle Europe''' *** Austria, former Czechoslovakia, Germany, Poland, Switzerland. ** '''Southwestern Europe''' *** France. ** '''Southeastern Europe''' *** Italy, Romania, former Yugoslavia. }} =={{int:References}}== ==={{int:Additional references}}=== {{Mirek et al., 2020}} ==={{int:Links}}=== {{PWO|2022|October|8}} {{IPNI|700327-1|2022|October 8}} {{World Plants|2022|October|8}} {{Catol-Hassler|2022|October|8}} =={{int:Vernacular names}}== {{VN |de=Milchweißer Mannsschild |fi=Valkonukki |fr=Androsace lactée |pl=Naradka mlecznobiała |sl=mlečnobeli oklep }} {{Commons category}} {{Taxonbar}} [[Category:Carl Ludwig Willdenow taxa]] hklht12aodpfj93zwv2jkmsff5t18j1 Chang 0 443614 11322017 11288710 2026-10-21T14:20:20Z Neferkheperre 947633 11322017 wikitext text/x-wiki {{refer|authority}} * [[Ao Luo Chang]] (fl. 1982), '''A.L.Chang''' – botanist * [[Bao-Shin Chang]] (1932–1992), entomologist * [[Ben-Neng Chang]] (1938–2010, fl. 1980s), '''B.N.Chang''' – botanist * [[C.I. Chang]] (fl. 1981), '''C.I.Chang''' – botanist * [[C.L. Chang]] (fl. 1980), '''C.L.Chang''' – botanist * [[Chang Qing Chang]] (fl. 2005), '''C.Q.Chang''' – botanist * [[Chao Chien Chang]] (1900-1972) ('''C.C.Chang'''), botanist * [[Che Tseng Chang]] (fl. 1974). '''C.T.Chang''' – botanist * [[Che Yung Chang]] (1932– ) ('''C.Y.Chang'''), botanist * [[Chen-Wan Chang]] (1924–1997) ('''C.W.Chang'''), botanist * [[Chen-Xi Chang]] entomologist * [[Cheon Young Chang]], carcinologist * [[Chia-Hao Chang]] * [[Chih-Han Chang]], annelidologist * [[Chih-Han Chang (arachnologist)]], Taiwanese arachnologist * [[Chih-Wei Chang]] - ichthyologist * [[Chun-Wen Chang]] - herpetologist * [[En-Ming Chang]], entomologist * [[F. Hoe Chang]] ('''F.H.Chang'''), phycologist. * [[Gyudong Chang]], entomologist * [[Ho Tseng Chang]] (1898– ) ('''H.T.Chang'''), botanist * [[Hseuh-Wen Chang]] entomologist * [[Hsiao-Yun Chang]] * [[Hui-Hui Chang]] - entomologist * [[Hui-Qun Chang]] - acarologist * [[Hung-Ta Chang]] ('''Hung T.Chang'''), botanist * [[Jian Chang]] - arachnologist * [[Jiang Chang]], ornithologist * [[Jin-Kang Chang]], entomologist * [[Jui-Sheng Chang]], phycologist * [[Kai Chang]], Taiwanese carcinologist and echinodermologist * [[Kaijun Chang]], phycologist * [[Kwang-Hyeon Chang]], carcinologist * [[Li-Ming Chang]], herpetologist * [[Ling-Xiao Chang]], entomologist * [[Mangven L.Y. Chang]], herpetologist * [[Mee-Mann Chang]], paleontologist * [[Mei Chen Chang]] (1933-, '''M.C.Chang'''), botanist * [[Min Ho Chang]], herpetologist * [[Patricia Corro Chang]], entomologist * [[Qiong-Qiong Chang]], entomologist * [[Roh Hwei Chang]] (1931- ) ('''R.H.Chang'''), botanist * [[Shih-Wei Chang]], Chinese geneticist * [[Siu Shih Chang]] (1918-; '''S.S.Chang'''), botanist * [[Su-Ching Chang]], carcinologist * [[Tong Chang]], entomologist * [[Tso-Chia Chang]], carcinologist * [[Tso-kan Chang]], herpetologist * [[Tun Tschu Chang]] or ''Te-Tzu Chang'' (1927–2006; '''T.T.Chang'''), mycologist * [[Wan-Jin Chang]], arachnologist * [[Wei-Chun Chang]], entomologist * [[Wen-Cheng Chang]], entomologist * [[Wen-Hsien Chang]], herpetologist * [[Wen Jin Chang]] (fl. 1979; '''W.J.Chang'''), botanist * [[Xiao-Dong Chang]] - myriapodologist * [[Xin Chang]], entomologist * [[Xiu-Ping Chang]], Chinese entomologist * [[Yage Chang]], entomologist * [[Yan Chang]], entomologist * [[Yan-Lin Chang]] ('''Y.L.Chang'''), entomologist * [[Yang Chang]], mammalogist * [[Yen-Wei Chang]], carcinologist * [[Yi-Fang Chang]], helminthologist * [[Yi Han Chang]] (fl. 2014; '''Y.H.Chang'''), botanist * [[Yi-Yin Chang]], entomologist * [[Yong-Hsu Chang]], ichthyologist * [[Yu Chang]] - entomologist * [[Yu-Cheng Chang]], entomologist * [[Yuan Chang]], entomologist * [[Yui Liang Chang]] (1923-1977; '''Y.L.Chang'''), botanist * [[Yung-Hsu Chang]], ichthyologist * [[Zhao Yang Chang]] (fl. 2005; '''Zhao Y.Chang'''), botanist * [[Zhi-Min Chang]], entomologist {{disambiguation|cat=people}} 7cb3ut5uev9u2f4nhtzehyq7jga4p5g Angela L. Smith 0 452108 11322418 10872797 2026-10-21T22:08:33Z The editor 2345 2915305 11322418 wikitext text/x-wiki '''Angela L. Smith''', English zoologist. * 4 Layton Avenue, Malvern, Worcestershire, WR14 2ND, United Kingdom. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===1995=== {{Jenkins & Smith, 1995}} ===2005=== {{Musser et al., 2005}} {{DEFAULTSORT:Smith, Angela}} {{Authority control}} [[Category:Taxon authorities]] [[Category:Zoologists]] 2krv5v1zdukvuc5fab0937nsso8lavi Sisymbrium irio 0 459333 11322763 9819051 2026-10-22T08:35:03Z Andyboorman 251907 /* {{int:Links}} */ 11322763 wikitext text/x-wiki {{image|Sisymbrium irio flower.JPG}} =={{int:Taxonavigation}}== {{Sisymbrium}} Species: ''[[Sisymbrium irio]]'' =={{int:Name}}== ''Sisymbrium irio'' [[L.]] ==={{int:Synonyms}}=== *''Arabis charbonnelii'' H. Lév. *''Descurainia irio'' (L.) Webb & Berthel. *''Erysimum irio'' (L.) Farw. *''Norta irio'' (L.) Britton *''Sisymbrium irio var. dasycarpum'' O.E. Schulz *''Sisymbrium irio var. leiocarpum'' Maire *''Sisymbrium irioides'' Boiss. *''Sisymbrium maximum'' Hochst. ex E. Fourn. *''Sisymbrium multisiliquosum'' Hoffm. *''Sisymbrium pinnatifidum'' Forssk. =={{int:References}}== * {{LSP1|659}} ==={{int:Links}}=== * {{BRBA|2019|Jun|13}} * {{IPNI||2019|Jun 13}} * {{POWO|2019|Jun|13}} * {{MBG|2019|Jun|13}} * {{GRIN||34456|09-Oct-10}} =={{int:Vernacular names}}== {{VN |ca=Matallums |cy=Roced Llundain |de=Glanz-Rauke |en=London rocket |es=Matacandil |fa=خاکشیر لندنی |fr=Sisymbre vélaret |fi=Kiiltopernaruoho |hsb=Banćikata rukej |nl=brede raket |pa=ਖੂਬਕਲਾਂ |sv=Vallsenap |zh=水蒜芥 }} {{Commonscat}} {{Taxonbar|from=Q163223}} [[Category:Carolus Linnaeus taxa]] thfpgsc62rnpb8kl6owcc4o65yri8ax Friedrich W. Rossi 0 464387 11322260 8191165 2026-10-21T19:34:11Z The editor 2345 2915305 /* */ 11322260 wikitext text/x-wiki '''Friedrich W. Rossi''', entomologist and arachnologist. {{Taxa authored}} {{publications}} {{DEFAULTSORT:Rossi, Friedrich W.}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Arachnologists]] ct7q6o3u4oa9k266ee0bg04hocwgler Kim 0 466613 11322266 11231781 2026-10-21T19:42:02Z Neferkheperre 947633 11322266 wikitext text/x-wiki {{refer|authority}} * [[A-Young Kim]], entomologist * [[Byeongseok Kim]] ('''B.Kim'''), phycologist * [[Byung-Jin Kim]], entomologist * [[Byung-Woo Kim]], arachnologist * [[Chang-Bae Kim]], malacologist * [[Chang-Jun Kim]], entomologist * [[Chang-Whan Kim]], entomologist * [[Changkyun Kim]] ('''C.Kim'''), botanist * [[Cheolhak Kim]], entomologist * [[Chul Hwan Kim]] (fl. 2000; '''C.H.Kim'''), botanist * [[Dae-Hun Kim]], Korean annelidologist * [[Daemin Kim]], ichthyologist * [[Da-Hee Kim]] - acarologist * [[Daniel H. Kim]] * [[Da-Som Kim]], entomologist * [[Dong Ho Kim]] ('''D.H.Kim'''), phycologist * [[Dongmin Kim]], Korean entomologist * [[Donguk Kim]] - entomologist * [[Dongsung Kim]], parasitologist * [[Dongwoo Kim]], nematologist * [[Eliah Kim]] (fl. 2012) * [[Eunji Kim (disambiguation)]] (several authors) * [[Gwang Hoon Kim]], phycologist * [[Haang-Mook Kim]], palaeontologist * [[Han-Ul Kim]], entomologist * [[Hana Kim]], annelidologist * [[Heung-Chul Kim]], entomologist * [[Hoon Soo Kim]] (1923–2015), Korean carcinologist * [[Hyeon-Su Kim]], ichthyologist * [[Hyeong-Kyu Kim]], entomologist * [[Hyeong-Su Kim]], zoologist * [[Hye Seon Kim]], ichthyologist * [[Hyojoong Kim]] - entomologist * [[Hyun Kyong Kim]], carcinologist * [[Hyun-Woo Kim]], carcinologist * [[Hyung June Kim]], entomologist * [[Hyung-Seop Kim]] ('''Hy.S.Kim'''), phycologist * [[Ik Soo Kim]], ichthyologist * [[Il-Hoi Kim]], parasitologist * [[Il-Hun Kim]] - herpetologist * [[Il-Kwon Kim]], entomologist * [[Irina Aleksandrovna Kim]] (1946–2023, '''I.A.Kim'''), Korean (Soviet) palaeontologist * [[Jae-Dong Kim]], entomologist * [[Jaehyun Kim]], Korean biologist * [[Jaynee R. Kim]], malacologist * [[Jee Hwan Kim]], phycologist * [[Jeongho Kim]], Korean carcinologist * [[Jeong-Hoon Kim]], acarologist * [[Jeong-Kyu Kim]], Korean entomologist * [[Jeong-Nam Kim]], Korean entomologist * [[Ji Hee Kim]], phycologist * [[Ji Hyung Kim]], carcinologist * [[Jihoon Kim]] - entomologist * [[Jiseung Kim]] - entomologist * [[Jisoo Kim]] - entomologist * [[Jin-Koo Kim]], ichthyologist * [[Jin Ill Kim]], entomologist * [[Jong-Bum Kim]], herpetologist * [[Jong-Heon Kim]], Korean paleontologist * [[Jong Im Kim]] ('''J.I.Kim'''), phycologist * [[Jong-Rae Kim]], Korean annelidologist * [[Joo-Pil Kim]], arachnologist * [[Ju-Hee Kim]], ichthyologist * [[Jun Hyung Kim]], ichthyologist * [[June Kim]], carcinologist * [[Jung-Gon Kim]], entomologist * [[Jung-Lark Kim]], entomologist * [[Jung Yeon Kim]], phycologist * [[Kang-San Kim]], protistologist * [[Ke Chung Kim]], entomologist * [[Kichoon Kim]], carcinologist * [[Kil Won Kim]], Korean entomologist * [[Kwang-Ho Kim]], entomologist * [[Kwang Young Kim]], phycologist * [[Kyeong Mi Kim]], phycologist * [[Leonid V. Kim]], arachnologist * [[Kyung-Won Kim]] - carcinologist * [[Mi-Lyang Kim]], entomologist * [[Min Jee Kim]], entomologist * [[Min Seok Kim]], protistologist * [[Min-Seop Kim]], carcinologist * [[Myoung Hee Kim]], Korean entomologist * [[Myung Kyum Kim]] ('''M.K.Kim'''), phycologist. * [[Myung Sook Kim]] ('''M.S.Kim'''), phycologist * [[Myung-Soon Kim]], entomologist * [[Nang-Hee Kim]], entomologist * [[Paulo Miguel M. Kim]], Philippino batrachologist * [[Philjae Kim]], echinodermologist * [[Sam-Kyu Kim]], entomologist * [[Sang-Hee Kim]], entomologist * [[Sang-Jin Kim]], microbiologist * [[Sang Ki Kim]], Korean entomologist * [[Sangil Kim]], entomologist * [[Sang-Yoon Kim]], South Korean entomologist * [[Se-Joo Kim]], carcinologist * [[Seok Kim]], entomologist * [[Seong-Hyun Kim]], carcinologist * [[Seong Yong Kim]], ichthyologist * [[Seung-Tae Kim]], arachnologist * [[Soen Yi Kim]], entomologist * [[Soohyun Kim]], Koran entomologist * [[Sora Kim]], entomologist * [[Su-Hwan Kim]], ichthyologist * [[Su Yeon Kim]], phycologist * [[Sukyung Kim]], acarologist * [[Sun-Mi Kim]], phycologist * [[Sung-Hoon Kim]], carcinologist * [[Sung-Hyun Kim]], carcinologist * [[Tae Heung Kim]], arachnologist * [[Tae-Kyu Kim]], entomologist * [[Tae-Woo Kim]], entomologist * [[Won Kim]], carcinologist * [[Won-Gun Kim]], entomologist * [[Won-Kyung Kim]], annelidologist * [[Won-Woong Kim]], entomologist * [[Woong-Seo Kim]], carcinologist * [[Yang-Hee Kim]], palaeontologist * [[Yong Jun Kim]], phycologist * [[Yong-Ki Kim]], entomologist * [[Young-Kun Kim]], Korean entomologist * [[Yong-Nam Kim]], entomologist * [[Yoon-Ho Kim]], entomologist * [[Young-Dong Kim]] (fl. 2005; '''Y.D.Kim'''), botanist * [[Young-Hyo Kim]], carcinologist * [[Young Jin Kim]], entomologist * [[Yu-Jin Kim]], carcinologist {{disambiguation |cat=people}} n12e6xt49iwrjz91y86ihk9t8khr6ps Demecquenemia 0 484614 11322602 10901873 2026-10-22T05:12:50Z The editor 2345 2915305 11322602 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Demecquenemia}} Species (1): †{{splast|D|emecquenemia|rodleri}} =={{int:Name}}== ''Demecquenemia'' {{a|Dimitris S. Kostopoulos|Kostopoulos}} & {{a|Raymond L. Bernor|Bernor}}, 2011 =={{int:References}}== ==={{int:Primary references}}=== {{Kostopoulos & Bernor, 2011}} {{Taxonbar|from=Q21364418}} [[Category:Dimitris S. Kostopoulos taxa]] [[Category:Raymond L. Bernor taxa]] 98vx8jlaywd7h7l4ru4lj0zus9fpk6q Tivadar Kormos 0 487266 11322340 10937444 2026-10-21T20:48:20Z The editor 2345 2915305 11322340 wikitext text/x-wiki {{image}} '''Tivadar Kormos''' (1881–1946), Hungarian geologist and paleontologist. Also known as '''Theodor Kormos'''. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1926=== {{Kormos, 1926}} ===1932=== {{Kormos, 1932}} ===1934=== {{Kormos, 1934}} ===1935=== {{Kormos, 1935}} {{Authority control}} {{DEFAULTSORT:Kormos, Tivadar}} [[Category:Taxon authorities]] [[Category:Geologists]] [[Category:Palaeontologists]] [[Category:Chiropterologists]] pudmw9te4pz3p7uh1gz6qg9eisfvdvg Hygromia 0 517340 11322350 10187209 2026-10-21T20:55:24Z Isfisk 2639 11322350 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Hygromia}} Species (4 + 1†}: {{sp|H|ygromia|cinctella}} {{sp|H|ygromia|limbata}} {{sp|H|ygromia|odeca}} {{sp|H|ygromia|tassyi}} †{{splast|H|ygromia|carinatissima}} =={{int:Name}}== ''Hygromia'' {{a|Antoine Risso|Risso}}, 1826 ==={{int:Synonyms}}=== * ''Cinctelliana'' Caziot, 1908 * ''Helix (Hygromia)'' Risso, 1826 * ''Hygromane'' Moquin-Tandon, 1855 * ''Hygromia (Hygromia)'' Risso, 1826· accepted, alternate representation * ''Hygromia (Riedelia)'' Schileyko, 1972· accepted, alternate representation * ''Limbatiana'' Caziot, 1910 * ''Sciaphila'' Westerlund, 1903 =={{int:References}}== {{Risso, 1826a}} ==={{int:Links}}=== * {{WoRMS||882571}} {{Taxonbar|from=Q5955904}} [[Category:Antoine Risso taxa]] rbtzy3w91rhsr567ttju4adsxpf3lhk × Graptosedum 0 535048 11322449 10896264 2026-10-21T22:26:44Z Harlock81 398030 /* {{int:References}} */ complete reference, Rowley, 1980 11322449 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Sedinae}} Nothogenus: '''''× Graptosedum''''' <br/> =={{int:Name}}== ''× Graptosedum'' {{a|Gordon Douglas Rowley|G.D.Rowley}} Name Succ. 153 1980. *{{Fohy|Graptopetalum|Rose|Sedum|L.}} **An artificial Hybrid out of scope =={{int:References}}== {{Rowley, 1980}} ==={{int:Links}}=== * {{APG, 2016|2025|Dec|04}} * {{IPNI||2025|Dec 04}} * {{PWO|2025|Dec|04}} {{Commonscat}} {{Taxonbar|from=Q21400157}} [[Category:Gordon Douglas Rowley taxa]] sp06xctf0djo6wcup95ousc2ize63iw Template:Scabrethia 10 536409 11322388 11095958 2026-10-21T21:46:32Z Esculapio 3329 11322388 wikitext text/x-wiki {{Engelmanniinae}} Genus: ''[[Scabrethia]]'' <br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> djzj6tw9cuabn5wgi8ulv8ql566v20k Tetrastigma 0 539371 11322549 9825735 2026-10-22T03:33:42Z Newone 3910 /* {{int:Taxonavigation}} */ 11322549 wikitext text/x-wiki {{image|Starr 000530-1268 Tetrastigma pubinerve.jpg|''[[Tetrastigma pubinerve]]''}} =={{int:Taxonavigation}}== {{Tetrastigma}} Species: {{sp|T|etrastigma|affine}} {{sp|T|etrastigma|andamanica}} {{sp|T|etrastigma|angustifolium}} {{sp|T|etrastigma|apiculatum}} {{sp|T|etrastigma|aplinianum}} {{sp|T|etrastigma|assimile}} {{sp|T|etrastigma|bracteolatum}} {{sp|T|etrastigma|burmanicum}} {{sp|T|etrastigma|calcicola}} {{sp|T|etrastigma|campylocarpum}} {{sp|T|etrastigma|canarense}} {{sp|T|etrastigma|caobangense}} {{sp|T|etrastigma|caudatum}} {{sp|T|etrastigma|cauliflorum}} {{sp|T|etrastigma|ceratopetalum}} {{sp|T|etrastigma|coriaceum}} {{sp|T|etrastigma|cruciatum}} {{sp|T|etrastigma|curtisii}} {{sp|T|etrastigma|delavayi}} {{sp|T|etrastigma|dubium}} {{sp|T|etrastigma|erubescens}} {{sp|T|etrastigma|formosanum}} {{sp|T|etrastigma|funingense}} {{sp|T|etrastigma|harmandii}} {{sp|T|etrastigma|hemsleyanum}} {{sp|T|etrastigma|henryi}} {{sp|T|etrastigma|hookeri}} {{sp|T|etrastigma|hypoglaucum}} {{sp|T|etrastigma|jaichagunii}} {{sp|T|etrastigma|jingdongense}} {{sp|T|etrastigma|jinghongense}} {{sp|T|etrastigma|jinxiuense}} {{sp|T|etrastigma|kunstleri}} {{sp|T|etrastigma|kwangsiense}} {{sp|T|etrastigma|laevigatum}} {{sp|T|etrastigma|lanceolarium}} {{sp|T|etrastigma|lanyuense}} {{sp|T|etrastigma|lenticellatum}} {{sp|T|etrastigma|leucostaphylum}} {{sp|T|etrastigma|lincangense}} {{sp|T|etrastigma|lineare}} {{sp|T|etrastigma|longipedunculatum}} {{sp|T|etrastigma|macrocorymbum}} {{sp|T|etrastigma|muricatum}} {{sp|T|etrastigma|nilagiricum}} {{sp|T|etrastigma|nitens}} {{sp|T|etrastigma|obovatum}} {{sp|T|etrastigma|obtectum}} {{sp|T|etrastigma|pachyphyllum}} {{sp|T|etrastigma|papillatum}} {{sp|T|etrastigma|pedunculare}} {{sp|T|etrastigma|planicaule}} {{sp|T|etrastigma|pseudocruciatum}} {{sp|T|etrastigma|pubiflorum}} {{sp|T|etrastigma|pubinerve}} {{sp|T|etrastigma|pycnanthum}} {{sp|T|etrastigma|rumicispermum}} {{sp|T|etrastigma|scariosum}} {{sp|T|etrastigma|scortechinii}} {{sp|T|etrastigma|serrulatum}} {{sp|T|etrastigma|sichouense}} {{sp|T|etrastigma|subtetragonum}} {{sp|T|etrastigma|sulcatum}} {{sp|T|etrastigma|tamilnadense}} {{sp|T|etrastigma|tonkinense}} {{sp|T|etrastigma|triphyllum}} {{sp|T|etrastigma|tsaianum}} {{sp|T|etrastigma|venulosum}} {{sp|T|etrastigma|voinierianum}} {{sp|T|etrastigma|wrayi}} {{sp|T|etrastigma|xishuangbannaense}} {{sp|T|etrastigma|xizangense}} {{sp|T|etrastigma|yiwuense}} {{splast|T|etrastigma|yunnanense}} =={{int:Name}}== ''Tetrastigma'' ([[Miq.]]) [[Planch.]] Monogr. Phan. 5: 320, 423. (1887) *Type species: ''Tetrastigma lanceolarium'' (Roxb.) Planch. Monogr. Phan. 5: 320, 423. (1887) =={{int:References}}== *{{aut|Planchon, J.E.}} 1887. ''Monographiae Phanerogamarum'' 5: 320, 423. *{{PWO|2014|Feb.|3}} *{{IPNI||2022|Jan. 7}} *{{MBG|2014|Feb.|3}} * {{GRIN|gen|12008|08-Apr-12}} {{Commonscat}} {{Taxonbar|from=Q2981583}} pc11xq9rjwp7c74erhylbm5kvbp3jsk 11322557 11322549 2026-10-22T03:35:25Z Newone 3910 /* {{int:Taxonavigation}} */ 11322557 wikitext text/x-wiki {{image|Starr 000530-1268 Tetrastigma pubinerve.jpg|''[[Tetrastigma pubinerve]]''}} =={{int:Taxonavigation}}== {{Tetrastigma}} Species: {{sp|T|etrastigma|affine}} {{sp|T|etrastigma|andamanica}} {{sp|T|etrastigma|angustifolium}} {{sp|T|etrastigma|apiculatum}} {{sp|T|etrastigma|aplinianum}} {{sp|T|etrastigma|assimile}} {{sp|T|etrastigma|bracteolatum}} {{sp|T|etrastigma|burmanicum}} {{sp|T|etrastigma|calcicola}} {{sp|T|etrastigma|campylocarpum}} {{sp|T|etrastigma|canarense}} {{sp|T|etrastigma|caobangense}}<ref>[https://phytotaxa.mapress.com/pt/article/view/phytotaxa.780.1.7 ''Tetrastigma caobangense'' (Vitaceae), a new species from Vietnam] Vol. 780 No. 1: 14 Oct. 2026 Page range: 91-97 {{DOI|10.11646/phytotaxa.780.1.7}}</ref> {{sp|T|etrastigma|caudatum}} {{sp|T|etrastigma|cauliflorum}} {{sp|T|etrastigma|ceratopetalum}} {{sp|T|etrastigma|coriaceum}} {{sp|T|etrastigma|cruciatum}} {{sp|T|etrastigma|curtisii}} {{sp|T|etrastigma|delavayi}} {{sp|T|etrastigma|dubium}} {{sp|T|etrastigma|erubescens}} {{sp|T|etrastigma|formosanum}} {{sp|T|etrastigma|funingense}} {{sp|T|etrastigma|harmandii}} {{sp|T|etrastigma|hemsleyanum}} {{sp|T|etrastigma|henryi}} {{sp|T|etrastigma|hookeri}} {{sp|T|etrastigma|hypoglaucum}} {{sp|T|etrastigma|jaichagunii}} {{sp|T|etrastigma|jingdongense}} {{sp|T|etrastigma|jinghongense}} {{sp|T|etrastigma|jinxiuense}} {{sp|T|etrastigma|kunstleri}} {{sp|T|etrastigma|kwangsiense}} {{sp|T|etrastigma|laevigatum}} {{sp|T|etrastigma|lanceolarium}} {{sp|T|etrastigma|lanyuense}} {{sp|T|etrastigma|lenticellatum}} {{sp|T|etrastigma|leucostaphylum}} {{sp|T|etrastigma|lincangense}} {{sp|T|etrastigma|lineare}} {{sp|T|etrastigma|longipedunculatum}} {{sp|T|etrastigma|macrocorymbum}} {{sp|T|etrastigma|muricatum}} {{sp|T|etrastigma|nilagiricum}} {{sp|T|etrastigma|nitens}} {{sp|T|etrastigma|obovatum}} {{sp|T|etrastigma|obtectum}} {{sp|T|etrastigma|pachyphyllum}} {{sp|T|etrastigma|papillatum}} {{sp|T|etrastigma|pedunculare}} {{sp|T|etrastigma|planicaule}} {{sp|T|etrastigma|pseudocruciatum}} {{sp|T|etrastigma|pubiflorum}} {{sp|T|etrastigma|pubinerve}} {{sp|T|etrastigma|pycnanthum}} {{sp|T|etrastigma|rumicispermum}} {{sp|T|etrastigma|scariosum}} {{sp|T|etrastigma|scortechinii}} {{sp|T|etrastigma|serrulatum}} {{sp|T|etrastigma|sichouense}} {{sp|T|etrastigma|subtetragonum}} {{sp|T|etrastigma|sulcatum}} {{sp|T|etrastigma|tamilnadense}} {{sp|T|etrastigma|tonkinense}} {{sp|T|etrastigma|triphyllum}} {{sp|T|etrastigma|tsaianum}} {{sp|T|etrastigma|venulosum}} {{sp|T|etrastigma|voinierianum}} {{sp|T|etrastigma|wrayi}} {{sp|T|etrastigma|xishuangbannaense}} {{sp|T|etrastigma|xizangense}} {{sp|T|etrastigma|yiwuense}} {{splast|T|etrastigma|yunnanense}} =={{int:Name}}== ''Tetrastigma'' ([[Miq.]]) [[Planch.]] Monogr. Phan. 5: 320, 423. (1887) *Type species: ''Tetrastigma lanceolarium'' (Roxb.) Planch. Monogr. Phan. 5: 320, 423. (1887) =={{int:References}}== *{{aut|Planchon, J.E.}} 1887. ''Monographiae Phanerogamarum'' 5: 320, 423. *{{PWO|2014|Feb.|3}} *{{IPNI||2022|Jan. 7}} *{{MBG|2014|Feb.|3}} * {{GRIN|gen|12008|08-Apr-12}} {{Commonscat}} {{Taxonbar|from=Q2981583}} 4wv1mxyqq4a91d2y09h6cvm92pnewsb Kinattumkara K. Bineesh 0 548718 11322617 11246760 2026-10-22T07:11:19Z Hiouf 2107144 /* 2026 */ 11322617 wikitext text/x-wiki '''K. K. Bineesh''', Indian ichthyologist. * Marine Biology Regional Centre, Zoological Survey of India, Chennai {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2014=== {{Bineesh et al., 2014}} {{Randall et al., 2014}} ===2016=== {{Akhilesh et al., 2016}} {{Ho, Meleppura & Bineesh, 2016}} ===2018=== {{Bineesh, Russell & Chandra, 2018}} ===2019=== {{Bineesh et al., 2019}} {{Sumod et al., 2019}} ===2020=== {{Nashad et al., 2020}} ===2024=== {{Kumar et al., 2024}} ===2026=== {{Beura, Bineesh & Banerjee, 2026}} {{Bineesh, Kasinath & Ebert, 2026}} {{Rozario & Bineesh, 2026}} {{Authority control}} {{DEFAULTSORT:Bineesh, K.K.}} [[Category:Taxon authorities]] [[Category:Ichthyologists]] pqdqqa3ev3mbmz6bvw06jtl4uh84biv Cyrtosia (Orchidaceae) 0 566672 11322150 11319970 2026-10-21T17:15:54Z YourLocalUSBport 3035355 from 6 species to 7 cus I forgot :D 11322150 wikitext text/x-wiki {{DISPLAYTITLE:''Cyrtosia'' <small>(Orchidaceae)</small>}} {{image|Cyrtosia septentrionalis 2.JPG|255|'''''[[Cyrtosia septentrionalis]]'''''}} == {{int:Taxonavigation}} == {{Cyrtosia (Orchidaceae)}} === {{int:Overview of species}} (7) === {{sp|C|yrtosia|falconeri}} {{sp|C|yrtosia|integra}} {{sp|C|yrtosia|javanica}} {{sp|C|yrtosia|lindleyana}} {{sp|C|yrtosia|nana}} {{sp|C|yrtosia|septentrionalis}} {{splast|C|yrtosia|taiwanica}} == {{int:Name}} == ''Cyrtosia'' {{a|Carl Ludwig Blume|Blume}}, Bijdr. (8): {{BHL|page/6100458|396}} (1825) * {{tysp|Cyrtosia javanica|{{aut|Blume}}, Bijdr.: 396 (1825)}} === {{int:Synonymy}} === {{HET}} ** ''Conchoglossum'' {{a|Jacob Gijsbert Samuel van Breda|Breda}}, Gen. Sp. Orchid. Asclep. 4: t. 17 (1830) {{nadi| * '''Asia-Temperate''' ** '''China''' *** China South-Central, China Southeast. ** '''Eastern Asia''' *** Japan, Korea, Nansei-shoto, Taiwan. * '''Asia-Tropical''' ** '''Indian Subcontinent''' *** Assam, East Himalaya, Sri Lanka. ** '''Indo-China''' *** Cambodia, Laos, Thailand, Vietnam. **'''Malesia''' ***Borneo, Jawa, Malaya, Philippines, Sulawesi, Sumatera. **'''Papuasia''' ***New Guinea. }} == {{int:References}} == === {{int:Primary references}} === {{Blume, 1825j}} === {{int:Additional references}} === * {{Genorch 3|302}} === {{int:Links}} === * {{FOC25|109096|Cyrtosia}} {{GBIF|{{#property:P846}}|2023|Jan|29}} {{PWO|2023|Jan|29|Cyrtosia}} {{Catol-Hassler|2023|Jan|29|Cyrtosia}} {{IPNI|{{#property:P961}}|2023|29 Jan|Cyrtosia}} {{MBG|2023|Jan|29|Cyrtosia}} =={{int:Vernacular names}}== {{#invoke:VN|main}}{{VN}} {{Commons}} {{Taxonbar}} [[Category:Carl Ludwig Blume taxa]] mxru0rml70hfqgvbwp2hsujcabkimrj Aeolothrips 0 584455 11322779 9421280 2026-10-22T08:56:16Z Hiouf 2107144 11322779 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Aeolothrips}} Species (55): {{sp|A|eolothrips|albicinctus}} {{sp|A|eolothrips|aureus}} {{sp|A|eolothrips|auricestus}} {{sp|A|eolothrips|bhattii}} {{sp|A|eolothrips|bicolor}} {{sp|A|eolothrips|brevicauda}} {{sp|A|eolothrips|brevicornis}} {{sp|A|eolothrips|brunneipictus}} {{sp|A|eolothrips|bucheti}} {{sp|A|eolothrips|clarus}} {{sp|A|eolothrips|collaris}} {{sp|A|eolothrips|conjunctus}} {{sp|A|eolothrips|crassus}} {{sp|A|eolothrips|crucifer}} {{sp|A|eolothrips|deserticola}} {{sp|A|eolothrips|duvali}} {{sp|A|eolothrips|eremicola}} {{sp|A|eolothrips|ericae}} {{sp|A|eolothrips|fasciatus}} {{sp|A|eolothrips|fukusimensis}} {{sp|A|eolothrips|fuscus}} {{sp|A|eolothrips|gundeliae}} {{sp|A|eolothrips|hartleyi}} {{sp|A|eolothrips|hesperus}} {{sp|A|eolothrips|intermedius}} {{sp|A|eolothrips|interruptus}} {{sp|A|eolothrips|kuwanaii}} {{sp|A|eolothrips|laurencei}} {{sp|A|eolothrips|linarius}} {{sp|A|eolothrips|melaleucus}} {{sp|A|eolothrips|metacrucifer}} {{sp|A|eolothrips|montanus}} {{sp|A|eolothrips|neyrizi}} {{sp|A|eolothrips|naderii}} {{sp|A|eolothrips|nasturtii}} {{sp|A|eolothrips|nitidus}} {{sp|A|eolothrips|occidentalis}} {{sp|A|eolothrips|oculatus}} {{sp|A|eolothrips|oregonus}} {{sp|A|eolothrips|pallidicornis}} {{sp|A|eolothrips|patharsahibensis}} {{sp|A|eolothrips|persiae}} {{sp|A|eolothrips|romanruizi}} {{sp|A|eolothrips|sambuci}} {{sp|A|eolothrips|scabiosatibia}} {{sp|A|eolothrips|setosus}} {{sp|A|eolothrips|surcalifornianus}} {{sp|A|eolothrips|tatari}} {{sp|A|eolothrips|tenuicornis}} {{sp|A|eolothrips|terrestris}} {{sp|A|eolothrips|vehemens}} {{sp|A|eolothrips|vittatus}} {{sp|A|eolothrips|vittipennis}} {{sp|A|eolothrips|wetmorei}} {{splast|A|eolothrips|zurstrasseni}} =={{int:Name}}== ''Aeolothrips'' {{aut|Haliday}}, 1836 =={{int:References}}== ==={{int:Primary references}}=== * Haliday 1836. Entom. Mag., 3 (5), 451. ==={{int:Additional references}}=== {{Alavi et al., 2015}} {{Alavi et al., 2016}} {{Alavi & Minaei, 2018}} {{Datta et al., 2026}} * {{aut|de la Cruz, J.R.}}, et al. 2013: A New Species of Aeolothrips (Thysanoptera: Aeolothripidae) from Mango Crops in Oaxaca, Mexico. ''Florida Entomologist'', '''96 (1)''': 29–35. Full article: Full article: [https://web.archive.org/web/20180519200717/http://journals.fcla.edu/flaent/article/view/82150/79251]. {{Matsumoto & Okajima, 2019}} {{Minaei & Alavi, 2017}} {{Minaei & Mound, 2019}} {{Taxonbar}} nu0uqhk8xm5498d95vaux38vkbp6z80 Anemoclema 0 599405 11322039 11309996 2026-10-21T15:36:15Z Andyboorman 251907 11322039 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Anemoclema}} Species: {{splast|A|nemoclema|glaucifolium}} =={{int:Name}}== ''Anemoclema'' ({{a|Franch.}}) {{a|Wen-Cai Wang|W.T.Wang}}, Acta Phytotax. Sin. 9(2): 105 (1964) ==={{int:Synonyms}}=== {{BA}} ** ''Anemone'' sect. ''Anemoclema'' {{aut|Franch.}}, Bull. Soc. Bot. France 33: 363 (1886). *** Typus: ''[[Anemoclema glaucifolium]]'' ({{aut|Franch.}}) {{aut|W.T.Wang}} {{HOT}} ** ''Anemone'' subg. ''Anemoclema'' ({{aut|Franch.}}) {{a|Tamura}}, Acta Phytotax. Geobot. 42(2): 179 (1991). {{HET}} ** ''Anemone'' sect. ''Pulsatilloides'' {{a|DC.}}, Syst. Nat. 1: 195 (1817) =={{int:References}}== ==={{int:Primary references}}=== {{Wang, 1964}} ==={{int:Links}}=== {{PWO|2026|Oct|5}} {{Catol-Hassler|2026|Oct|5}} as a synonym of ''[[Anemone]]'' {{IPNI||2020|Feb. 5}} {{Taxonbar|from=Q15938573}} [[Category:Wen-Cai Wang taxa]] 3jvs57qau8n9xcu9kbgvpcuvzdhblw7 Cryptoprocta spelea 0 609109 11322474 11305230 2026-10-21T23:46:51Z Burmeister 9074 revision update 11322474 wikitext text/x-wiki {{Image|Fossa de les cavernes.png}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species: †''[[Cryptoprocta spelea]]'' =={{int:Name}}== ''Cryptoprocta spelea'' {{a|Guillaume Grandidier|Grandidier}}, 1902 * {{int:Neotype}}: {{rl|MNHN}}-ZM-MO-1977-755. [designated by {{aut|Goodman, Rasoloarison & Ganzhorn}} (2004: 136)] * {{int:Type locality}}: “{{lang|fr|la caverne d'Andrahomana}}” redesigned to “from the subfossil sites of Ambolisatra (23°03'S, 43°24'E) to the north of Toliara in the southwest and the cave of Andrahomana (25°50'S, 46°40'E) to the west of Tolagnaro in the extreme southeast” via neotype designation. ==={{int:Combinations}}=== * ''Cryptoprocta ferox var. spelea'' {{aut|Grandidier}}, 1902: {{BHL|page/42896877|592}} [original combination, as subspecies] * ''Cryptoprocta spelea'': {{aut|Lamberton}}, 1939 [subsequent combination, elevated to species] =={{int:References}}== ==={{int:Primary references}}=== * {{a|Guillaume Grandidier|Grandidier, G.}} 1902. Observations sur les iemuriens disparus de Madagascar: collections Alluaud, Gaubert, Grandidier. [[ISSN 0181-0626|''Bulletin du Muséum national d'histoire naturelle'' (A)]] 8(7): 497–502. ==={{int:Additional references}}=== {{Lewis et al., 2026}} {{Taxonbar|from=Q1716674}} [[Category:Guillaume Grandidier taxa]] rcwd53s1igkp3mz8v9pk7tc7e1dd5vt Crowley 0 624469 11322491 10924107 2026-10-22T00:40:10Z The editor 2345 2915305 11322491 wikitext text/x-wiki {{refer|authority}} *[[Louise M. Crowley]], U.S. arachnologist *[[Lucy Elizabeth Lillian Mary Crowley]], Australian ichthyologist *[[Philip Crowley]] (1837–1900), British lepidopterist {{disambig|cat=people}} 8mahmugny61pvhlyyusgzlu0a3o2hya Altriarabis amplexicaulis 0 633558 11322215 9180219 2026-10-21T18:40:01Z Andyboorman 251907 Andyboorman moved page [[Arabis amplexicaulis]] to [[Altriarabis amplexicaulis]]: Move to the valid combination 9180219 wikitext text/x-wiki {{image|¿ Arabis amplexicaulis ? (7886791568).jpg}} =={{int:Taxonavigation}}== {{Arabis}} Species: '''''{{BASEPAGENAME}}''''' =={{int:Name}}== ''{{BASEPAGENAME}}'' [[Edgew.]], 1851 ==={{int:Synonyms}}=== *''Arabis alticola'' O.E.Schulz *''Erysimum amplexicaule'' (Edgew.) Kuntze =={{int:References}}== ==={{int:Links}}=== {{BRBA|2023|April|13}} {{PWO|2023|April|13}} {{IPNI|277996-1|2023|April 13}} {{World Plants|2023|April|13}} {{Catol-Hassler|2023|April|13}} {{Commons category}} {{Taxonbar}} [[Category:Michael Pakenham Edgeworth taxa]] d6zhv87avo4zm7nj62j54usvig8o1ew 11322223 11322215 2026-10-21T18:46:49Z Andyboorman 251907 11322223 wikitext text/x-wiki {{image|¿ Arabis amplexicaulis ? (7886791568).jpg|''Altriarabis amplexicaulis''}} =={{int:Taxonavigation}}== {{Altriarabis}} Species: ''[[Altriarabis amplexicaulis]]'' =={{int:Name}}== ''Altriarabis amplexicaulis'' ({{a|Edgew.}}) {{a|Y.Z.Zhao}}, Collect. Works Zhao Yizhi: 209 (2018) ==={{int:Synonyms}}=== ==={{int:Synonyms}}=== {{BA}} **''Arabis amplexicaulis'' Edgew., Trans. Linn. Soc. London 20: 31 (1846) {{HOT}} **''Erysimum amplexicaule'' (Edgew.) Kuntze, Revis. Gen. Pl. 2: 933 (1891), {{NIHP}} {{HET}} **''Arabis alticola'' O.E.Schulz, Notizbl. Bot. Gart. Berlin-Dahlem 9: 1062 (1927) **''Arabis kanawarensis'' Royle ex Hook.f. & Thomson, J. Proc. Linn. Soc., Bot. 5: 142 (1861) **''Arabis patens'' Royle ex Hook.f. & Thomson, J. Proc. Linn. Soc., Bot. 5: 142 (1861), {{NIHP}} =={{int:References}}== ==={{int:Links}}=== {{BRBA|2023|April|13}} {{World Plants|2026|April|13}} as ''Arabis amplexicaulis'' {{PWO|2026|April|13}} {{IPNI||2026|April 13}} {{Commons category}} {{Taxonbar}} [[Category:Yi-Zhi Zhao taxa]] 548ykz3lzyaw528rb7hdk4ypy1cymnu Template:Garrison, 2014 10 667231 11322461 8765975 2026-10-21T22:36:40Z John Tann 703224 closed access 11322461 wikitext text/x-wiki * {{aut|Garrison, R.W.}} 2014: Review of ''Oxystigma'' Selys with the synonymy of ''Oxystigma williamsoni'' Geijskes (Odonata: Heteragrionidae). {{zootaxa|2014|3780|2|347|364|7}} {{access|closed}} <includeonly>[[Template:Zt3780.2.7|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** {{int:Date of publication}}: 21 March 2014 ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{ZooBankRef|72C52670-4454-46D3-8D71-9BC8E8A98434}} * nil [[Category:Reference templates]]</noinclude> dj8zso19gz3gzjrocncrgl5qycr2vor 11322513 11322461 2026-10-22T02:02:22Z John Tann 703224 added author template 11322513 wikitext text/x-wiki * {{a|Rosser W. Garrison|Garrison, R.W.}} 2014: Review of ''Oxystigma'' Selys with the synonymy of ''Oxystigma williamsoni'' Geijskes (Odonata: Heteragrionidae). {{zootaxa|2014|3780|2|347|364|7}} {{access|closed}} <includeonly>[[Template:Zt3780.2.7|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** {{int:Date of publication}}: 21 March 2014 ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{ZooBankRef|72C52670-4454-46D3-8D71-9BC8E8A98434}} * nil [[Category:Reference templates]]</noinclude> 4bnty9xf4431jjhiup6q3lpdt34tqr8 11323000 11322513 2026-10-22T10:43:00Z Tommy Kronkvist 596 Text formatting, author templates, and ZooBank template fix. 11323000 wikitext text/x-wiki * {{a|Rosser W. Garrison|Garrison, R.W.}} 2014. Review of ''Oxystigma'' {{aut|Selys}} with the synonymy of ''Oxystigma williamsoni'' {{aut|Geijskes}} (Odonata: Heteragrionidae). {{Zootaxa|2014|3780|2|347|364|7}} {{Access|closed}} <includeonly>[[Template:Zt3780.2.7|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** {{int:Date of publication}}: 21 March 2014 ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{ZooBank|72C52670-4454-46D3-8D71-9BC8E8A98434}} * nil [[Category:Reference templates]]</noinclude> 03yjdqcl51ul56jqs4brdhopqa02ts5 Arabideae 0 695050 11322023 9179620 2026-10-21T14:39:48Z Andyboorman 251907 11322023 wikitext text/x-wiki {{image|Arabis alpina a3.jpg|''[[Arabis alpina]]''}} =={{int:Taxonavigation}}== {{Arabideae}} Genera: {{g|Abdra}} {{g|Acirostrum}} {{g|Altriarabis}} {{g|Arabis}} {{g|Arcyosperma}} {{g|Athysanus}} {{g|Aubrieta}} {{g|Baimashania}} {{g|Botschantzevia}} {{g|Dendroarabis}} {{g|Draba}} {{g|Drabella}} {{g|Helicodraba}} {{g|Pachyneurum}} {{g|Parryodes}} {{g|Pseudodraba}} {{g|Scapiarabis}} {{g|Sinoarabis}} {{glast|Tomostima}} =={{int:Name}}== Arabideae {{a|DC.}}, Mémoires du Muséum d'Histoire Naturelle 7(1): 229 (1821). *Type genus: ''[[Arabis]]'' {{a|L.}}, Sp. Pl. 2: 664 (1753). =={{int:References}}== ==={{int:Primary references}}=== * {{DC.}} 1821. ''[[Mémoires du Museum d'Histoire Naturelle]]''. Paris 7(1): 229. 20. ==={{int:Additional references}}=== {{Jordon-Thaden et al., 2010}} {{Al-Shehbaz et al., 2011}} ==={{int:Links}}=== {{BRBA|2023|April|13}} {{Taxonbar}} [[Category:Augustin Pyrame de Candolle taxa]] 1x14geszy5bknmaa1n6xkimmiv0ryou Géza Horváth 0 718335 11322770 10887027 2026-10-22T08:47:07Z Hiouf 2107144 /* 1904 */ 11322770 wikitext text/x-wiki {{image}} '''Géza Horváth''' (23 November 1847 – 8 September 1937), Hungarian entomologist. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1871=== {{Horváth, 1871}} ===1877=== {{Horváth, 1877}} {{Horváth, 1877a}} ===1879=== {{Horváth, 1879}} ===1881=== {{Horváth, 1881}} {{Horváth, 1881a}} ===1883=== {{Horváth, 1883}} {{Horváth, 1883a}} {{Horváth, 1883b}} {{Horváth, 1883c}} ===1887=== {{Horváth, 1887}} ===1888=== {{Horváth, 1888}} ===1889=== {{Horváth, 1889}} {{Horváth, 1889a}} {{Horváth, 1889b}} ===1891=== {{Horváth, 1891}} ===1892=== {{Horváth, 1892}} {{Horváth, 1892a}} ===1894=== {{Horváth, 1894}} ===1895=== {{Horváth, 1895}} {{Horváth, 1895a}} ===1896=== {{Horváth, 1896}} {{Horváth, 1896a}} ===1897=== {{Horváth, 1897}} ===1898=== {{Horváth, 1898}} {{Horváth, 1898a}} ===1899=== {{Horváth, 1899}} {{Horváth, 1899a}} {{Horváth, 1899b}} ===1900=== {{Horváth, 1900}} ===1901=== {{Horváth, 1901}} ===1903=== {{Horváth, 1903}} {{Horváth, 1903a}} {{Horváth, 1903b}} ===1904=== {{Horváth, 1904a}} {{Horváth, 1904}} ===1905=== {{Horváth, 1905}} ===1907=== {{Horváth, 1907}} ===1908=== {{Horváth, 1908}} ===1909=== {{Horváth, 1909}} {{Horváth, 1909a}} {{Horváth, 1909b}} ===1911=== {{Horváth, 1911}} {{Horváth, 1911a}} ===1914=== {{Horváth, 1914}} ===1915=== {{Horváth, 1915}} ===1916=== {{Horváth, 1916}} {{Horváth, 1916a}} ===1917=== {{Horváth, 1917}} ===1923=== {{Horváth, 1923}} ===1925=== {{Horváth, 1925}} {{Authority control}} {{DEFAULTSORT:Horvath, Geza}} <!-- No diacritics in DEFAULTSORT, please. --> [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Heteropterists]] 32lpzqm4kdiqrqxhvxutypdfmfq8s8g Heteragrionidae 0 719839 11322381 11303063 2026-10-21T21:27:12Z John Tann 703224 Added synonymy 11322381 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Heteragrionidae}} Genera: {{g|Dimeragrion}} {{g|Heteragrion}} {{g|Heteropodagrion}} {{glast|Oxystigma (Heteragrionidae)|Oxystigma}} =={{int:Name}}== Heteragrionidae {{a|Rácenis}}, 1959 ==={{int:Synonymy}}=== * Heteragrionini {{aut|Rácenis}}, 1959. Originally established as a tribe within Megapodagrionidae; raised to family rank by Dijkstra et al. (2014). == {{int:References}} == ==={{int:Primary references}}=== {{Rácenis, 1959}} at p.339. ==={{int:Additional references}}=== {{Dijkstra et al., 2013}} {{Bybee et al., 2021}} {{WOL|1 October 2026}} {{Taxonbar|from=Q20722288}} [[Category:Janis Rácenis taxa]] q0l64qqtga06udnfq0xb2i75303rtkd Hypolestidae 0 719847 11322519 11200680 2026-10-22T03:02:26Z John Tann 703224 Added synonymy 11322519 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Hypolestidae}} Genera: {{glast|Hypolestes}} =={{int:Name}}== Hypolestidae {{a|Robin John Tillyard|Tillyard}} & {{a|F.C. Fraser|Fraser}}, 1938 ==={{int:Synonymy}}=== * Hypolestinae {{aut|Tillyard}} & {{aut|Fraser}}, 1938. Orignal family-group name. =={{int:References}}== ==={{int:Primary references}}=== {{Tillyard & Fraser, 1938}} at {{BHL|page/38926770 p.156}} ==={{int:Additional references}}=== {{Dijkstra et al., 2013}} {{Carter et al., 2026}} {{WOL|1 July 2026}} {{Taxonbar|from=Q19375075}} [[Category:Robin John Tillyard taxa]] [[Category:Frederick Charles Fraser taxa]] cij3r4gprd2k95et4i3ya2735iya5di Thomas Herbert Elliot Jackson 0 719979 11322493 8523074 2026-10-22T00:46:02Z The editor 2345 2915305 11322493 wikitext text/x-wiki '''Thomas Herbert Elliot Jackson''' (1903–1968), English entomologist. About 65,000 of his specimens in the British Museum [[BMNH]]. The other at the National Museum of Kenya [[NMK]]. {{Taxa authored}} {{Eponyms}} {{publications}} ===1950=== {{Carpenter,Jackson, 1950}} ===1952=== {{Van Someren & Jackson, 1952}} ===1956=== {{Jackson, 1956}} ===1957=== {{Van Someren & Jackson, 1957}} ===1962=== {{Stempffer,Jackson, 1962}} {{Jackson,THE, 1962b}} ===1964=== {{Jackson,THE, 1964b}} {{Jackson,THE, 1964c}} ===1966=== {{Jackson,THE, 1966}} ===1967=== {{Jackson,THE, 1967}} ===1968=== {{Jackson,THE, 1968}} ===1969=== {{Jackson,THE, 1969b}} {{Authority control}} {{DEFAULTSORT:Jackson, Thomas Herbert Elliot}} [[Category:Entomologists]] [[Category:Taxon authorities]] ea3xv7cr5itdiajflmkizev8uqoin6e Spilarctia mollis 0 736901 11322040 6674980 2026-10-21T15:36:29Z Sjl197 1805579 11322040 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Spilarctia (Praephragmatobia)}} Species: ''[[Spilarctia mollis]]'' =={{int:Name}}== ''Spilarctia mollis'' ({{a|Karel Černý|Černý}}, 2011) {{int:Type locality}}: Philippines, Mindanao-Bukidnon, 40km NW Maramag, Dalongdong, 1200 m, Waldrand. {{int:Type material}}: {{int:Holotype}}male ♂, {{R|MWM}}, ''legit'' Černý & Schintlmeister, 1-3.X.1988. ==={{int:Synonyms}}=== * ''Spilosoma mollis'' {{a|Karel Černý|Černý}}, 2011: 44, Pl. 3, fig. 7 * [?] ''Spilarctia (Praephragmatobia) mollis'' ({{aut|Černý}}, 2011) [See {{a|Vladimir Viktorovitch Dubatolov|Dubatolov}}, 2012: (Online listing, possibly unpublished)]; Bolotov, Kondakov & Spitsyn, 2018: 10 (Ambiguous on genus but presents in comparision to other ''Spilarctia'' spp, and here has authorship "({{aut|Černý}}, 2011)" in recombination) (Note, recombination not published in {{a|Vladimir Viktorovitch Dubatolov|Dubatolov}} & {{a|Yasunori Kishida|Kishida}} 2010 as for other "''Praephragmatobia'' spp". ) =={{int:References}}== ==={{int:Primary references}}=== *Bolotov, I.N., Kondakov, A. & Spitsyn, V.M, 2018. A review of tiger moths (Lepidoptera: Erebidae: Arctiinae: Arctiini) from Flores Island, Lesser Sunda Archipelago, with description of a new species and new subspecies ''Ecol. Montenegrina'' 16: 1–15. {{Černý, 2011a}} ==={{int:Additional references}}=== ==={{int:Links}}=== *[Nothing Lepindex] *[http://szmn.eco.nsc.ru/Arctiidae/ArctiinaeOriental.htm Dubatolov, 2012] "Tiger Moths (Lepidoptera, Arctiidae) of the Oriental Region, Australia and Oceania " {{Taxonbar}} {{Commons category}} [[Category:MWM]] [[Category:Karel Černý taxa]] 57ijzx7i8j9c70rw5krabn6tj5xsg6s Androsace hausmannii 0 738807 11322363 8957901 2026-10-21T21:09:03Z TadejM 24665 vernacular names: +sl 11322363 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Androsace}} Species: ''[[Androsace hausmannii]]'' =={{int:Name}}== ''Androsace hausmannii'' {{a|Leyb.}}, Flora 35: 401 (1852). ==={{int:Synonyms}}=== {{HOT}} ** ''Primula hausmannii'' ({{a|Leyb.}}) {{a|Kuntze}}, Revis. Gen. Pl. 2: 400 (1891). {{HET}} ** ''Androsace heeri'' {{a|Hegetschw.}} ex {{a|Hausm.}}, Fl. Tirol 3: 1474 (1854), [[nom. illeg.]] ** ''Aretia hausmannii'' {{a|Nyman}}, Consp. Fl. Eur.: 607 (1881). ** ''Aretia heeri'' {{aut|Hegetschw.}}, Fl. Schweiz: 188 (1839). {{Nadi| }} =={{int:References}}== ==={{int:Links}}=== {{PWO|2022|October|10}} {{IPNI|700304-1|2022|October 10}} {{World Plants|2022|October|10}} {{Catol-Hassler|2022|October|10}} =={{int:Vernacular names}}== {{VN |sl=Hausmannov oklep }} {{Taxonbar}} [[Category:Friedrich Leybold taxa]] kiexw0y421lr6m18rwze0hwqlqiqu2z Vikas Kumar 0 751035 11322778 11316162 2026-10-22T08:53:00Z Hiouf 2107144 /* 2026 */ 11322778 wikitext text/x-wiki '''Vikas Kumar''', Indian entomologist and botanist. * Centre for DNA Taxonomy (CDT), Zoological Survey of India, Kolkata, India. {{Author abbreviation|S}}: * {{IPNI standard form|Vik.Kumar}} * {{Author abbreviation|Zoological}}: '''Kumar''' {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2014=== {{Kumar et al., 2014}} {{Tyagi, Ghosh & Kumar, 2014}} ===2015=== {{Tyagi & Kumar, 2015}} {{Tyagi & Kumar, 2015a}} {{Tyagi, Kumar & Chauhan, 2015}} ===2016=== {{Tyagi & Kumar, 2016}} {{Tyagi & Kumar, 2016a}} {{Tyagi et al., 2016}} {{Tyagi, Mound & Kumar, 2016}} {{Tyagi, Singha & Kumar, 2017}} ===2017=== {{Caleb et al., 2017b}} {{Tyagi et al., 2017}} ===2018=== {{Caleb et al., 2018}} {{Caleb, Sajan & Kumar, 2018}} {{Tyagi et al., 2018}} ===2019=== {{Caleb et al., 2019}} {{Caleb, Ghosh & Kumar, 2018}} {{Chandra et al., 2019}} {{Prasad et al., 2019}} ===2020=== {{Tyagi et al., 2020a}} {{Tyagi et al., 2020}} ===2021=== {{Bandyopadhyay et al., 2021}} {{Singha et al., 2021a}} {{Singha et al., 2021}} ===2026=== {{Datta et al., 2026}} {{Dey et al., 2026}} {{Dey et al., 2026a}} {{Sarma et al., 2026}} {{Authority control}} {{DEFAULTSORT:Kumar, Vikas}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Botanists]] awfdjwalj95ji5he8fxpjxg4egdx9vc Artur Raposo Moniz Serrano 0 763145 11322387 10558598 2026-10-21T21:32:53Z Neferkheperre 947633 /* 2020 */ 11322387 wikitext text/x-wiki '''Artur Raposo Moniz Serrano''', Portuguese entomologist (Coleoptera) * cE3c - Centre for Ecology, Evolution and Environmental Changes / PEERS, Departamento de Biologia Animal, Faculdade de Ciências da Universidade de Lisboa, R. Ernesto de Vasconcelos, Ed. C2, 1749-016 Lisboa, Portugal {{taxa authored}} =={{int:Publications}}== {{inc}} ===1993=== {{Borges & Serrano, 1993}} ===2006=== {{Serrano & Aguiar, 2006}} ===2008=== {{Serrano, 2008}} * {{a|Artur Raposo Moniz Serrano|Serrano, A.R.M.}} & {{a|Carlos A.S. Aguiar|Aguiar, C.A.S.}} 2008. A new species of the genus ''Geocharis'' Ehlers, 1883 and some faunistic data on endogean carabids from Portugal (Coleoptera: Carabidae). ''[[ISSN 0035-418X|Revue suisse de zoologie]]'' 115(4): 779–788. {{BHL|page/41185003}} ===2011=== * {{a|Artur Raposo Moniz Serrano|Serrano, A.R.M.}} & {{a|Carlos A.S. Aguiar|Aguiar, C.A.S.}} 2011. Two new species of the genus ''Geocharis'' Ehlers, 1883 and new data on Anillina species from Portugal (Coleoptera: Carabidae). [[ISSN 1175-5326|''Zootaxa'']], 3116: 33–46. [http://mapress.com/zootaxa/2011/f/z03116p046f.pdf Preview] ===2013=== {{Zt3731.4.1}} ===2014=== {{Serrano & Aguiar, 2014}} ===2015=== {{Serrano et al., 2015}} {{Serrano, Capela & Oesterle, 2015}} ===2016=== {{Prado e Castro et al., 2016a}} ===2017=== {{Borges et al., 2017}} {{Serrano, Capela & Santos, 2017}} ===2019=== {{Serrano, Capela & Santos, 2019}} ===2020=== {{Serrano et al., 2020a}} ===2022=== {{Serrano, 2022}} {{Authority control}} {{DEFAULTSORT:Serrano, Artur}} [[Category:Taxon authorities]] [[Category:Entomologists]] hpxzg1q6e9vmo3ked0kekzsbr4ccbex Tetronarce 0 764245 11322619 10077778 2026-10-22T07:13:08Z Hiouf 2107144 11322619 wikitext text/x-wiki {{Tetronarce}} Species: {{sp|T|etronarce|californica}} {{sp|T|etronarce|cowleyi}} {{sp|T|etronarce|fairchildi}} {{sp|T|etronarce|formosa}} {{sp|T|etronarce|macneilli}} {{sp|T|etronarce|nobiliana}} {{sp|T|etronarce|peruana}} {{sp|T|etronarce|puelcha}} {{sp|T|etronarce|ramanamurthyi}} {{sp|T|etronarce|tokionis}} {{splast|T|etronarce|tremens}} =={{int:Name}}== ''{{BASEPAGENAME}}'' {{a|Theodore Nicholas Gill|Gill}}, 1862 * {{int:Type species}}: ''[[Torpedo occidentalis]]'' {{aut|Storer}}, 1843 * {{int:Etymology}}: ''tetra''- (= four), referring, according to {{aut|Gill}} (1895), to “four-sided form” of ''T. occidentalis'' (= ''nobiliana''), perhaps an allusion to how the ray’s disc (two pectoral fins) and two pelvic fins appear as four sides (or lobes) when seen from above ({{aut|Marcelo R. de Carvalho}}, pers. comm.); ''narce'', from ''narke'' (= numbness), an ancient Greek word used for any electric fish, based on their ability to cause a numbing sensation [{{aut|Gill}} attempted to change spelling to ''Tetranarke'' in 1895, saying ''Tetronarke'' was “purely a printer’s blunder,” but original spelling is retained]. From [https://web.archive.org/web/20160512165410/http://www.etyfish.org/torpediniformes/ The ETYFish Project]. =={{int:References}}== ==={{int:Primary references}}=== {{Gill, 1862a}} ==={{int:Additional references}}=== {{Bineesh, Kasinath & Ebert, 2026}} {{Commons}} {{Taxonbar|from=Q20721261}} [[Category:Theodore Nicholas Gill taxa]] ocqu49o8qkkws5hs18w7xsvs093p24m Jung-Gon Kim 0 766326 11322767 11307014 2026-10-22T08:41:18Z Hiouf 2107144 /* 2026 */ 11322767 wikitext text/x-wiki '''Junggon Kim''', South Korean entomologist (Entomology; Hemiptera: Miridae) * Private office, Gyebaek-ro, Jung-gu, Daejeon, Korea {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2015=== {{Jung et al., 2015}} {{Kim et al., 2015c}} ===2016=== {{Jung & Kim, 2016}} {{Kim & Jung, 2016}} {{Kim & Jung, 2016a}} {{Kim, Lee & Jung, 2016}} ===2017=== {{Kim et al., 2017}} ===2018=== {{Kim, Roca-Cusachs & Jung, 2018}} {{Kim et al., 2018a}} {{Roca-Cusachs et al., 2018}} {{Roca-Cusachs et al., 2018a}} ===2019=== {{Kim et al., 2019d}} {{Kim et al., 2019c}} {{Kim et al., 2019e}} {{Kim et al., 2019b}} {{Roca-Cusachs et al., 2019a}} ===2020=== {{Kim, Park & Jung, 2020}} {{Kim et al., 2020a}} {{Kim et al., 2020b}} {{Taszakowski et al., 2020}} {{Roca-Cusachs, et al., 2020}} {{Kim, Roca-Cusachs & Jung, 2020}} ===2021=== {{Kim, Chérot & Jung, 2012}} {{Kim & Jung, 2021}} {{Roca-Cusachs et al., 2021}} {{Kim et al, 2021}} {{Kim et al., 2021a}} {{Kim, Roca-Cusachs & Jung, 2021}} {{Kim et al., 2021c}} {{Taszakowski et al., 2021}} {{Taszakowski et al., 2021a}} ===2023=== {{Kim, Cassis & Jung, 2023}} ===2024=== {{Kim et al, 2024b}} ===2025=== {{Kim et al., 2025b}} {{Kim et al., 2025g}} {{Kim et al., 2025}} {{Kim et al., 2025c}} {{Kim et al., 2025f}} {{Kim et al., 2025a}} {{Kim et al., 2025e}} {{Taszakowski, Kim & Jindra, 2025}} {{Taszakowski et al., 2025a}} ===2026=== {{Kim et al., 2026}} {{Kim, Gim & Hartung, 2026}} {{Kim, Taszakowski & Bartkowski, 2026}} {{Taszakowski et al., 2026b}} {{Taszakowski et al., 2026}} {{Taszakowski et al., 2026a}} {{Authority control}} {{DEFAULTSORT:Kim, Jung-Gon}} [[Category:Taxon authorities]] [[Category:Entomologists]] pnscqisbzcfokl1np36r4e6z5qxs3d8 López 0 770460 11322168 11302651 2026-10-21T18:08:26Z Neferkheperre 947633 11322168 wikitext text/x-wiki {{refer|authority|'''López''' or '''Lopez'''}} * [[André Lopez]], French arachnologist * [[Anna Amélia Ancona Lopez]], Brazilian echinodermologist * [[Benjamín López]], Mexican marine biologist * [[Benoit Lopez]], French arachnologist * [[Bernardo López Godinez]], entomologist * [[Carlos López]], zoologist, rotifers * [[Carlos Mario López-Orozco]], carcinologist * [[Celeste M. López]], mammalogist * [[Christian López]] (fl. 2014, '''C.López'''), botanist * [[Cuauhtémoc D. López]], entomologist * [[Daniel A. López-Sánchez]], Mexican annelidologist * [[Dayron Manuel Lopez]], mammalogist * [[Eduardo López]], Spanish annelidologist * [[Enrique Alvarez López]] (fl. 1951; '''E.A.López'''), botanist * [[Eusebio López Nieto]] (born 1978; '''E.López'''), botanist * [[Gemma López Vélez]] (born 1955; '''López Vélez'''), Spanish botanist * [[Germán López Iborra]], Spanish arachnologist * [[Ginés Alejandro López González]] (born 1950, '''G.López'''), Spanish botanist * [[Guilherme E.L. López]], Brazilian entomologist * [[Guillermo López-Guillén]], Mexican entomologist * [[Guillermo M. López]], Argentine paleontologist * [[Guzmán López]], Uruguayan marine biologist * [[Heriberto López]], Spanish entomologist * [[Hipólito Ruiz López]] (1754–1815; '''Ruiz'''), Spanish botanist * [[Hugo L. López]] (fl. 2006), ichthyologist * [[J. Andrés López]], ichthyologist * [[José Ángel López Rodríguez]] (born 1956; '''López Rodr.'''), botanist * [[José Antonio López]], entomologist * [[José Ignacio López-Colón]], Spanish entomologist * [[José Manuel López]], Argentine zoologist * [[Juan Manuel Perilla López]], U.S. entomologist * [[Juan Pablo López-O.]], Colombian ornithologist * [[Lázaro Willian Viñola López]], Cuban mammalogist and paleontologist * [[Lilián G. López Chávez]] (fl. 2000; '''L.G.López'''), botanist * [[M. Gabriela López]] (fl. 1996; '''M.G.López'''), botanist * [[María José López Pacheco]] (born 1950; '''López Pach.'''), botanist * [[Mercedes López]], Spanish entomologist * Myrna I. López, ichthyologist; see [[Myrna I. Bussing]] * [[Nicolás López Carrión]], Argentine arachnologist * [[Paula Lopez]], Argentine paleontologist * [[Ramón Margalef López]] (1919–2004; '''Margalef'''), Spanish zoologist (Ostracoda) * [[Rogelio Bartolomé López]] (1915–1981), Argentinian ichthyologist * [[Silvia López Udias]] (born 1964; '''López Udias'''), botanist * [[Sofía Calderón López]], Argentine carcinologist * [[Vinicius Marques Lopez]], Brazilian entomologist * [[Víctor Hugo Grande López]], entomologist * [[William López-Forment C.]], Mexican herpetologist and mammalogist * [[Yaara López]], batrachologist * [[Yeny Rocio López-Perilla]] - herpetologist =={{int:See also}}== * [[Lopes]] {{int Disambiguation |cat=people}} 448bogmq86cpm5nqa65pv3msw5xr3fz Guo 0 785077 11322141 11283212 2026-10-21T16:47:09Z Neferkheperre 947633 11322141 wikitext text/x-wiki {{refer|authority}} * [[Chang-Chang Guo]], ichthyologist * [[Chang-Yi Guo]], entomologist * [[Cheng Guo]], entomologist * [[Dong-Hui Guo]], entomologist * [[Dong-Ming Guo]], ichthyologist * [[Fu-xian Guo]], paleontologist * [[Ge Guo]], malacologist * [[Guo-Cai Guo]], carcinologist * [[Guo-Xin Guo]], herpetologist * [[Hong-Wei Guo]], ([[Floruit|fl.]] 2007), Chinese entomologist (Hemiptera) * [[Hui-Fang Guo]], entomologist * [[Ji-Min Guo]], Chinese zoologist * [[Jia-Ming Guo]], entomologist * [[Jia-Sen Guo]], Chinese isopodologist * [[Jian-Jun Guo]], entomologist * [[Jian-Yang Guo]], entomologist * [[Jiang-Li Guo]], entomologist * [[Jin Guo]], Chinese palaeontologist * [[Jing Guo]], arachnologist * [[Jing-Jing Guo]], entomologist * [[Juan Guo]], entomologist * [[Jun-Feng Guo]], zoologist * [[Jun-Ru Guo]], zoologist * [[Junyao Guo]], zoologist * [[Ke-Ji Guo]], mammalogist * [[Kun Guo]], entomologist * [[Kun Guo (Wenzhou University)|Kun Guo]], zoologist * [[Lei Guo]], entomologist * [[Liang Guo]], entomologist * [[Liang-Zhen Guo]], entomologist * [[Lin Guo]] (1949–; '''L.Guo'''), botanist * [[Li-Ying Guo]], entomologist * [[Ming-Yi Guo]], entomologist * [[Pei-Kun Guo]], entomologist * [[Peng Guo]], herpetologist * [[Peng-Fei Guo]], entomologist * [[Qi Guo]], entommologist * [[Qiang Guo]], herpetologist * [[Qin Guo]], entomologist * [[Qiu-Hong Guo]], entomologist * [[Rong Fa Guo]], botanist * [[Rui Guo]], entomologist * [[Sen Guo]], entomologist * [[Shao-Kun Guo]], entomologist * [[Shilong Guo]], Chinese zoologist * [[Shou Yu Guo]], lichenologist * [[Shu-Han Guo]], entomologist * [[Shu-Jie Guo]], ichthyologist * [[Tong-Yang Guo]], entomologist * [[Wan-Ru Guo]], myriapodologist * [[Wan-Yue Guo]], entomologist * [[Wei Guo]], entomologist * [[Wei-Bo Guo]], herpetologist * [[Wei-Jian Guo]], zoologist * [[Wen Guo]], nematologist * [[Xian-Guang Guo]], Chinese zoologist * [[Xiang-Bo Guo]], entomologist * [[Xiao-Jiang Guo]], entomologist * [[Xiao-Yu Guo]], entomologist * [[Xin Hu Guo]] (fl. 1988; '''X.H.Guo'''), botanist * [[Xin-Yan Guo]] * [[Xing Guo]] (fl. 2011, '''X.Guo'''), botanist * [[Xing-Chen Guo]], malacologist * [[Xu-Sheng Guo]], entomologist * [[Xuan Guo]], arachnologist * [[Ya-Xin Guo]], zoologist * [[Yan Ping Guo]], botanist * [[Yan-Shu Guo]], ichthyologist * [[Yang Guo]], Chinese mammalogist * [[Yi-Da Guo]], entomologist * [[Yi-Hong Guo]], entomologist * [[Ying-Cheng Guo]], entomologist * [[Yu-Qing Guo]], nematologist * [[Yuan-Yuan Guo]], paleoentomologist * [[Yun Guo]], carcinologist * [[Zhao-Liang Guo]], carcinologist * [[Zheng-Fu Guo]], entomologist * [[Zi-Sheng Guo]], entomologist {{Disambiguation |cat=people}} gl906mbuprxmk8tvfczot7rjh0uqcxt Ecliptinae 0 787836 11322391 11095959 2026-10-21T21:51:12Z Esculapio 3329 11322391 wikitext text/x-wiki {{image|Angadipuram 7922.jpg|''[[Sphagneticola calendulacea]]''}} =={{int:Taxonavigation}}== {{Ecliptinae}} Genera: {{g|Acunniana}} {{g|Apowollastonia}} {{g|Aspilia}} {{g|Baltimora}} {{g|Blainvillea}} {{g|Calyptocarpus}} {{g|Clibadium}} {{g|Damnxanthodium}} {{g|Delilia}} {{g|Dimerostemma}} {{g|Eclipta (Asteraceae)|Eclipta}} {{g|Elaphandra}} {{g|Eleutheranthera}} {{g|Exomiocarpon}} {{g|Fenixia (Asteraceae)|Fenixia}} {{g|Hoffmanniella}} {{g|Idiopappus}} {{g|Indocypraea}} {{g|Iogeton}} {{g|Jefea}} {{g|Kingianthus}} {{g|Lantanopsis}} {{g|Lasianthaea}} {{g|Leptocarpha}} {{g|Lipoblepharis}} {{g|Lipochaeta}} {{g|Lipotriche}} {{g|Lundellianthus}} {{g|Melanthera}} {{g|Monactis}} {{g|Oblivia}} {{g|Otopappus}} {{g|Oyedaea}} {{g|Pascalia}} {{g|Pentalepis}} {{g|Perymeniopsis}} {{g|Perymenium}} {{g|Plagiolophus}} {{g|Podanthus}} {{g|Quadribractea}} {{g|Rensonia}} {{g|Riencourtia}} {{g|Schizoptera (Asteraceae)|Schizoptera}} {{g|Sphagneticola}} {{g|Steiractinia}} {{g|Synedrella}} {{g|Synedrellopsis}} {{g|Tilesia (Asteraceae)|Tilesia}} {{g|Trigonopterum}} {{g|Tuberculocarpus}} {{g|Tuxtla}} {{g|Wamalchitamia}} {{g|Wedelia}} {{g|Wollastonia (Asteraceae)|Wollastonia}} {{g|Zexmenia}} {{glast|Zyzyxia}} =={{int:Name}}== Ecliptinae {{a|Less.}}, Linnaea 6: 153. (1831) *Type genus: ''[[Eclipta (Asteraceae)|Eclipta]]'' {{a|L.}}, Mant. Pl. Altera 157 (286). (1771) =={{int:References}}== ==={{int:Primary references}}=== *{{Less.}} 1831. ''[[Linnaea; Ein Journal für die Botanik in ihrem ganzen Umfange]]'' 6: [https://www.biodiversitylibrary.org/item/10850#page/156 153]. ==={{int:Additional references}}=== *{{Orchard, 2013}} *{{aut|Panero, J.L., Jansen, R.K. & Clevinger, J.A.}} 1999. Phylogenetic relationships of subtribe Ecliptinae (Asteraceae: Heliantheae) based on chloroplast DNA restriction site data. ''American Journal of Botany'' 86(3): 413–427. {{doi|10.2307/2656762}} *{{Strother, 1991}} =={{int:Vernacular names}}== {{VN |ru=Эклиптовые }} {{taxonbar}} {{Commonscat}} [[category:Christian Friedrich Lessing taxa]] 7vm53vj7s5wzhlw7ijbep0i7trbeocw Gilson Rudinei Pires Moreira 0 795121 11322558 11226250 2026-10-22T03:37:32Z Neferkheperre 947633 /* 2022 */ 11322558 wikitext text/x-wiki '''Gilson Rudinei Pires Moreira''', Brazilian entomologist. * Departamento de Zoologia, Universidade Federal do Rio Grande do Sul, Porto Alegre, RS, Brazil {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2010=== {{Moreira,Mielke,2010}} ===2012=== {{Brito et al., 2012}} {{Moreira et al., 2012}} {{Vargas & Moreira, 2012}} ===2013=== {{Brito et al., 2013}} ===2024=== {{Fochezato et al., 2024}} ===2015=== {{Basilio et al., 2015}} {{Vargas et al., 2015}} ===2016=== {{De Prins, Brito & Moreira, 2016}} ===2017=== {{Moreira et al., 2017}} {{Pereira et al., 2017}} ===2018=== {{Moreira et al., 2018}} {{Pereira et al., 2018a}} {{Silva et al., 2018a}} ===2019=== {{Brito et al., 2019}} {{Brito et al., 2019a}} {{Moreira et al., 2019}} {{Moreira et al., 2019a}} {{Pereira et al., 2019a}} {{De Prins et al., 2019}} {{Vargas-Ortiz et al., 2019}} ===2020=== {{Cerdena et al., 2020}} {{Davis et al., 2020}} ===2022=== {{Cerdeña et al., 2022}} {{Espinoza-Donoso et al., 2022}} {{Farfán et al., 2022}} {{Fochezato et al., 2022}} ===2023=== {{Urra, Araneda & Moreira, 2023}} ===2026=== {{Maestri et al., 2026}} {{Authority control}} {{DEFAULTSORT:Moreira, Gilson Rudinei Pires}} [[Category:Taxon authorities]] [[Category:Entomologists]] dmwpkqrpcr64fef21lrybv85aw1kbkd Anna Rita Rossi 0 807248 11322261 6899611 2026-10-21T19:35:42Z The editor 2345 2915305 11322261 wikitext text/x-wiki '''Anna Rita Rossi''', Italian ichthyologist. *Department of Biology and Biotechnology C. Darwin, Sapienza University of Rome, Rome, Italy. =={{int:Publications}}== {{Inc}} {{Angiulli et al., 2015}} {{Nirchio et al., 2016}} {{Authority control}} {{DEFAULTSORT:Rossi, Anna Rita}} [[Category:Taxon authorities]] [[Category:Ichthyologists]] qa3vg1hf46e72rt97kvdrm3eo8k0s7x Graptopetalum ser. Stolonifera 0 818451 11322469 11320251 2026-10-21T23:04:12Z RLJ 134478 11322469 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Graptopetalum sect. Graptopetalum}} Series: {{Taxit|Graptopetalum ser. Stolonifera|linked=yes}} <br /> Species: {{sp|G|raptopetalum|irmasoniae}} {{splast|G|raptopetalum|macdougallii}} =={{int:Name}}== ''Graptopetalum'' ser. ''Stolonifera'' {{a|V.V.Byalt}}, Novosti Sist. Vyssh. Rast. 43: 77. (2012). * {{tysp|Graptopetalum macdougallii|Alexander}} =={{int:References}}== ==={{int:Primary references}}=== * {{V.V.Byalt}} 2012. ''[[ISSN 0568-5443|Novosti Sistematiki Vysshikh Rastenii]]'' 43: 77, as ''Stoloniferae'' ==={{int:Additional references}}=== {{García-Mendoza et al., 2023}} {{Taxonbar|from=Q22223858}} 8onjzhxf85ykqt27w1bmm6400o5xrvd 11322470 11322469 2026-10-21T23:04:29Z RLJ 134478 added [[Category:Vyacheslav Vyacheslavovich Byalt taxa]] using [[Help:Gadget-HotCat|HotCat]] 11322470 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Graptopetalum sect. Graptopetalum}} Series: {{Taxit|Graptopetalum ser. Stolonifera|linked=yes}} <br /> Species: {{sp|G|raptopetalum|irmasoniae}} {{splast|G|raptopetalum|macdougallii}} =={{int:Name}}== ''Graptopetalum'' ser. ''Stolonifera'' {{a|V.V.Byalt}}, Novosti Sist. Vyssh. Rast. 43: 77. (2012). * {{tysp|Graptopetalum macdougallii|Alexander}} =={{int:References}}== ==={{int:Primary references}}=== * {{V.V.Byalt}} 2012. ''[[ISSN 0568-5443|Novosti Sistematiki Vysshikh Rastenii]]'' 43: 77, as ''Stoloniferae'' ==={{int:Additional references}}=== {{García-Mendoza et al., 2023}} {{Taxonbar|from=Q22223858}} [[Category:Vyacheslav Vyacheslavovich Byalt taxa]] ae3jwtyt7869z70gg2p5phxc0965ji1 Graptopetalum macdougallii 0 818496 11322400 11063792 2026-10-21T21:59:06Z Harlock81 398030 /* {{int:References}} */ adding references 11322400 wikitext text/x-wiki {{Image|Graptopetalum macdougallii 2.jpg}} {{Image|Graptopetalum macdougallii 3.jpg|flower}} =={{int:Taxonavigation}}== {{Graptopetalum ser. Stolonifera}} Species: ''[[Graptopetalum macdougallii]]'' =={{int:Name}}== ''Graptopetalum macdougallii'' {{a|Edward Johnston Alexander|Alexander}}, Cact. Succ. J. (Los Angeles) 12: 161, fig. 1940. =={{int:References}}== ==={{int:Primary references}}=== {{Alexander, 1940}} ==={{int:Additional references}}=== {{García-Mendoza et al., 2023}} ==={{int:Links}}=== * {{Catol-Hassler|2026|Oct|21}} * {{IPNI||2026|Oct 21}} * {{PWO|2026|Oct|21}} * {{MBG|2026|Oct|21}} {{Commonscat|Graptopetalum macdougallii|''Graptopetalum macdougallii''}} {{Taxonbar|from=Q12631782}} [[Category:Edward Johnston Alexander taxa]] [[Category:Eponyms of Thomas Baillie MacDougall]] ny93pp1tbl59qt18apjsejs1rgw3fdn 11322401 11322400 2026-10-21T22:00:45Z Harlock81 398030 /* {{int:Name}} */ + nadi. Garcia is the best source for it, today 11322401 wikitext text/x-wiki {{Image|Graptopetalum macdougallii 2.jpg}} {{Image|Graptopetalum macdougallii 3.jpg|flower}} =={{int:Taxonavigation}}== {{Graptopetalum ser. Stolonifera}} Species: ''[[Graptopetalum macdougallii]]'' =={{int:Name}}== ''Graptopetalum macdougallii'' {{a|Edward Johnston Alexander|Alexander}}, Cact. Succ. J. (Los Angeles) 12: 161, fig. 1940. {{nadi| * '''Continental: Northern America''' ** '''Regional: Mexico''' *** Mexico Southwest **** Oaxaca }} =={{int:References}}== ==={{int:Primary references}}=== {{Alexander, 1940}} ==={{int:Additional references}}=== {{García-Mendoza et al., 2023}} ==={{int:Links}}=== * {{Catol-Hassler|2026|Oct|21}} * {{IPNI||2026|Oct 21}} * {{PWO|2026|Oct|21}} * {{MBG|2026|Oct|21}} {{Commonscat|Graptopetalum macdougallii|''Graptopetalum macdougallii''}} {{Taxonbar|from=Q12631782}} [[Category:Edward Johnston Alexander taxa]] [[Category:Eponyms of Thomas Baillie MacDougall]] nbq9bxoaw7jjgzqfapostg6ghohq4j6 11322609 11322401 2026-10-22T05:22:59Z Harlock81 398030 /* Collegamenti */ Typo 11322609 wikitext text/x-wiki {{Image|Graptopetalum macdougallii 2.jpg}} {{Image|Graptopetalum macdougallii 3.jpg|flower}} =={{int:Taxonavigation}}== {{Graptopetalum ser. Stolonifera}} Species: ''[[Graptopetalum macdougallii]]'' =={{int:Name}}== ''Graptopetalum macdougallii'' {{a|Edward Johnston Alexander|Alexander}}, Cact. Succ. J. (Los Angeles) 12: 161, fig. 1940. {{nadi| * '''Continental: Northern America''' ** '''Regional: Mexico''' *** Mexico Southwest **** Oaxaca }} =={{int:References}}== ==={{int:Primary references}}=== {{Alexander, 1940}} ==={{int:Additional references}}=== {{García-Mendoza et al., 2023}} ==={{int:Links}}=== * {{Catol-Hassler|2026|Oct|21}} * {{IPNI||2026|Oct 21}} * {{POWO|2026|Oct|21}} * {{MBG|2026|Oct|21}} {{Commonscat|Graptopetalum macdougallii|''Graptopetalum macdougallii''}} {{Taxonbar|from=Q12631782}} [[Category:Edward Johnston Alexander taxa]] [[Category:Eponyms of Thomas Baillie MacDougall]] e6303arz1piqszc0gomr0269dh120tf 11322610 11322609 2026-10-22T05:26:15Z Harlock81 398030 /* Nome */ Fix parentheses 11322610 wikitext text/x-wiki {{Image|Graptopetalum macdougallii 2.jpg}} {{Image|Graptopetalum macdougallii 3.jpg|flower}} =={{int:Taxonavigation}}== {{Graptopetalum ser. Stolonifera}} Species: ''[[Graptopetalum macdougallii]]'' =={{int:Name}}== ''Graptopetalum macdougallii'' {{a|Edward Johnston Alexander|Alexander}}, Cact. Succ. J. (Los Angeles) 12: 161, fig. (1940). {{nadi| * '''Continental: Northern America''' ** '''Regional: Mexico''' *** Mexico Southwest (Oaxaca) }} =={{int:References}}== ==={{int:Primary references}}=== {{Alexander, 1940}} ==={{int:Additional references}}=== {{García-Mendoza et al., 2023}} ==={{int:Links}}=== * {{Catol-Hassler|2026|Oct|21}} * {{IPNI||2026|Oct 21}} * {{POWO|2026|Oct|21}} * {{MBG|2026|Oct|21}} {{Commonscat|Graptopetalum macdougallii|''Graptopetalum macdougallii''}} {{Taxonbar|from=Q12631782}} [[Category:Edward Johnston Alexander taxa]] [[Category:Eponyms of Thomas Baillie MacDougall]] mopwnrr1sw35ejocgxp9ygttbjidhvi Wikispecies:Localization 4 873563 11322938 11318527 2026-10-22T10:02:03Z Tommy Kronkvist 596 Added "PDF available". 11322938 wikitext text/x-wiki <languages/> <translate> <!--T:1--> '''Localization''' is a process of adapting Wikispecies user interface for native languages of users. You can help us with translation to a language which you know. Please post any questions or requests on the [[Wikispecies talk:Localization|talk page]] to alert an admin. <!--T:53--> You can also post translations on the talk page if the translation-page you wish to create is protected and you cannot edit it directly. <!--T:51--> If you believe this page is displaying outdated contents even after you refresh the page in your browser, please <span class="plainlinks">[<tvar name="1">{{fullurl:Wikispecies:Localization|action=purge}}</tvar> '''purge this page's server cache''']</span> to show an up-to-date version. It will only take a second or two, and you will be automatically returned to this page.</translate> <translate> ==Taxon pages== <!--T:3--> </translate> {| class="wikitable sortable" width="100%" |+ <translate><!--T:38--> Inputs for taxon pages</translate> ! scope="col" align="center" | <translate><!--T:9--> English</translate> ! scope="col" align="center" | <translate><!--T:10--> Other languages</translate> ! scope="col" align="center" | <translate><!--T:11--> You will see</translate> |- {{Wikispecies:Localization/row|Taxonavigation}} {{Wikispecies:Localization/row|Name}} {{Wikispecies:Localization/row|Tribus}} {{Wikispecies:Localization/row|Subtribus}} {{Wikispecies:Localization/row|References}} {{Wikispecies:Localization/row|Primary references}} {{Wikispecies:Localization/row|Additional references}} {{Wikispecies:Localization/row|Vernacular names}} {{Wikispecies:Localization/row|Synonym}} {{Wikispecies:Localization/row|Synonyms}} {{Wikispecies:Localization/row|Synonymy}} {{Wikispecies:Localization/row|In synonymy}} {{Wikispecies:Localization/row|junior synonym}} {{Wikispecies:Localization/row|junior objective synonym}} {{Wikispecies:Localization/row|junior subjective synonym}} {{Wikispecies:Localization/row|Synonymised by}} {{Wikispecies:Localization/row|Synonymized by}} {{Wikispecies:Localization/row|Reinstated by}} {{Wikispecies:Localization/row|Reinstated within}} {{Wikispecies:Localization/row|Basionym}} {{Wikispecies:Localization/row|Basonym}} {{Wikispecies:Localization/row|Eponym}} {{Wikispecies:Localization/row|Heterotypic}} {{Wikispecies:Localization/row|Homotypic}} {{Wikispecies:Localization/row|Monotypic}} {{Wikispecies:Localization/row|also monotypic}} {{Wikispecies:Localization/row|Original status}} {{Wikispecies:Localization/row|Status}} {{Wikispecies:Localization/row|preoccupied by}} {{Wikispecies:Localization/row|replacement name for}} {{Wikispecies:Localization/row|Replaced synonym}} {{Wikispecies:Localization/row|Replaced}} {{Wikispecies:Localization/row|Replaced by}} {{Wikispecies:Localization/row|Misapplied names}} {{Wikispecies:Localization/row|Misapplied}} {{Wikispecies:Localization/row|Alternative combinations}} {{Wikispecies:Localization/row|not verified}} {{Wikispecies:Localization/row|Unresolved names}} {{Wikispecies:Localization/row|monotypy}} {{Wikispecies:Localization/row|by monotypy}} {{Wikispecies:Localization/row|Type by monotypy}} {{Wikispecies:Localization/row|Type by original designation}} {{Wikispecies:Localization/row|by original designation}} {{Wikispecies:Localization/row|fixed by original designation}} {{Wikispecies:Localization/row|subsequent designation}} {{Wikispecies:Localization/row|Type by subsequent designation}} {{Wikispecies:Localization/row|Type by subsequent designation by}} {{Wikispecies:Localization/row|Type by subsequent designation of}} {{Wikispecies:Localization/row|Designated by}} {{Wikispecies:Localization/row|designated by}} {{Wikispecies:Localization/row|Designation by}} {{Wikispecies:Localization/row|designation by}} {{Wikispecies:Localization/row|Selected by}} {{Wikispecies:Localization/row|selected by}} {{Wikispecies:Localization/row|by subsequent designation}} {{Wikispecies:Localization/row|by subsequent designation of}} {{Wikispecies:Localization/row|by subsequent designation by}} {{Wikispecies:Localization/row|Eponym of}} {{Wikispecies:Localization/row|Original designation}} {{Wikispecies:Localization/row|original designation}} {{Wikispecies:Localization/row|Original description}} {{Wikispecies:Localization/row|original description}} {{Wikispecies:Localization/row|Original combination}} {{Wikispecies:Localization/row|original combination}} {{Wikispecies:Localization/row|Original genus}} {{Wikispecies:Localization/row|valid genus}} {{Wikispecies:Localization/row|Subsequent combination}} {{Wikispecies:Localization/row|subsequent combination}} {{Wikispecies:Localization/row|Combinations}} {{Wikispecies:Localization/row|Original name}} {{Wikispecies:Localization/row|Current name}} {{Wikispecies:Localization/row|Disputed}} {{Wikispecies:Localization/row|Disputed taxon}} {{Wikispecies:Localization/row|Disputed taxa}} {{Wikispecies:Localization/row|Protonym}} {{Wikispecies:Localization/row|Homonym}} {{Wikispecies:Localization/row|Homonyms}} {{Wikispecies:Localization/row|Hemihomonym}} {{Wikispecies:Localization/row|Hemihomonyms}} {{Wikispecies:Localization/row|Junior homonym}} {{Wikispecies:Localization/row|Isonym}} {{Wikispecies:Localization/row|Hybrids}} {{Wikispecies:Localization/row|Gender}} {{Wikispecies:Localization/row|Editors}} {{Wikispecies:Localization/row|Type data}} {{Wikispecies:Localization/row|Typification}} {{Wikispecies:Localization/row|Typification details}} {{Wikispecies:Localization/row|Type genus}} {{Wikispecies:Localization/row|Type species}} {{Wikispecies:Localization/row|Type strain}} {{Wikispecies:Localization/row|Type strains}} {{Wikispecies:Localization/row|Ichnotaxon}} {{Wikispecies:Localization/row|Ichnotaxa}} {{Wikispecies:Localization/row|Type ichnospecies}} {{Wikispecies:Localization/row|Type ichnogenus}} {{Wikispecies:Localization/row|Type specimen}} {{Wikispecies:Localization/row|Primary type}} {{Wikispecies:Localization/row|Typus}} {{Wikispecies:Localization/row|Type}} {{Wikispecies:Localization/row|Types}} {{Wikispecies:Localization/row|Type locality}} {{Wikispecies:Localization/row|Type localities}} {{Wikispecies:Localization/row|Type host}} {{Wikispecies:Localization/row|Known hosts}} {{Wikispecies:Localization/row|Host}} {{Wikispecies:Localization/row|Hosts}} {{Wikispecies:Localization/row|Locus typicus}} {{Wikispecies:Localization/row|Locality}} {{Wikispecies:Localization/row|Localities}} {{Wikispecies:Localization/row|No locality}} {{Wikispecies:Localization/row|No localities}} {{Wikispecies:Localization/row|Type material}} {{Wikispecies:Localization/row|No types known}} {{Wikispecies:Localization/row|Type catalog}} {{Wikispecies:Localization/row|Type catalogs}} {{Wikispecies:Localization/row|Type catalogue}} {{Wikispecies:Localization/row|Type catalogues}} {{Wikispecies:Localization/row|Source}} {{Wikispecies:Localization/row|Sources}} {{Wikispecies:Localization/row|Host-substratum}} {{Wikispecies:Localization/row|Host-substrate}} {{Wikispecies:Localization/row|Bionomy}} {{Wikispecies:Localization/row|Type horizon}} {{Wikispecies:Localization/row|Type horizon and locality}} {{Wikispecies:Localization/row|Holotype}} {{Wikispecies:Localization/row|Holotype (unique)}} {{Wikispecies:Localization/row|Holotypus}} {{Wikispecies:Localization/row|Holotypes}} {{Wikispecies:Localization/row|Hapantotype}} {{Wikispecies:Localization/row|Hapantotypus}} {{Wikispecies:Localization/row|Hapantotypes}} {{Wikispecies:Localization/row|Lectotype}} {{Wikispecies:Localization/row|Lectotypus}} {{Wikispecies:Localization/row|Lectotypes}} {{Wikispecies:Localization/row|Isolectotype}} {{Wikispecies:Localization/row|Isolectotypus}} {{Wikispecies:Localization/row|Isolectotypes}} {{Wikispecies:Localization/row|Syntype}} {{Wikispecies:Localization/row|Syntypus}} {{Wikispecies:Localization/row|Syntypes}} {{Wikispecies:Localization/row|Isosyntype}} {{Wikispecies:Localization/row|Isosyntypus}} {{Wikispecies:Localization/row|Isosyntypes}} {{Wikispecies:Localization/row|Paratype}} {{Wikispecies:Localization/row|Paratypus}} {{Wikispecies:Localization/row|Paratypes}} {{Wikispecies:Localization/row|Allotype}} {{Wikispecies:Localization/row|Allotypus}} {{Wikispecies:Localization/row|Allotypes}} {{Wikispecies:Localization/row|Epitype}} {{Wikispecies:Localization/row|Isotype}} {{Wikispecies:Localization/row|Isotypus}} {{Wikispecies:Localization/row|Isotypes}} {{Wikispecies:Localization/row|Neotype}} {{Wikispecies:Localization/row|Isoneotype}} {{Wikispecies:Localization/row|Iconotype}} {{Wikispecies:Localization/row|Iconotypus}} {{Wikispecies:Localization/row|Iconotypes}} {{Wikispecies:Localization/row|Topotype}} {{Wikispecies:Localization/row|Topotypus}} {{Wikispecies:Localization/row|Topotypes}} {{Wikispecies:Localization/row|Overview of species}} {{Wikispecies:Localization/row|Conspectus specierum}} {{Wikispecies:Localization/row|Overview of genera}} {{Wikispecies:Localization/row|Conspectus generum}} {{Wikispecies:Localization/row|Overview of familiae}} {{Wikispecies:Localization/row|Overview of familiarum}} {{Wikispecies:Localization/row|Conspectus familiarum}} {{Wikispecies:Localization/row|Overview of ordines}} {{Wikispecies:Localization/row|Conspectus ordinum}} {{Wikispecies:Localization/row|Alternative classifications}} {{Wikispecies:Localization/row|Conservation status}} {{Wikispecies:Localization/row|Distribution}} {{Wikispecies:Localization/row|Native distribution areas}} {{Wikispecies:Localization/row|Distribution map}} {{Wikispecies:Localization/row|Mentions}} {{Wikispecies:Localization/row|Fossil range}} {{Wikispecies:Localization/row|Geological range}} {{Wikispecies:Localization/row|Other taxon names}} {{Wikispecies:Localization/row|Species transferred to other genera}} {{Wikispecies:Localization/row|Taxa transferred to other genera}} {{Wikispecies:Localization/row|Transferred to other genera}} {{Wikispecies:Localization/row|Species group}} {{Wikispecies:Localization/row|Genus group}} {{Wikispecies:Localization/row|Etymology}} {{Wikispecies:Localization/row|Named after}} {{Wikispecies:Localization/row|egg}} {{Wikispecies:Localization/row|ovum}} {{Wikispecies:Localization/row|Extinct}} {{Wikispecies:Localization/row|Extinctus}} {{Wikispecies:Localization/row|Extant}} {{Wikispecies:Localization/row|Nonextinct}} {{Wikispecies:Localization/row|Living}} |} <translate> === Commonly used conjunctions etc. === <!--T:46--> </translate> {| class="wikitable sortable" width="100%" |+ <translate><!--T:47--> Inputs for generic interface items</translate> ! align="center" | <translate><!--T:48--> English</translate> ! align="center" | <translate><!--T:49--> Other languages</translate> ! align="center" | <translate><!--T:50--> You will see</translate> |- {{Wikispecies:Localization/row|accepted as}} {{Wikispecies:Localization/row|and}} {{Wikispecies:Localization/row|Excerpt}} {{Wikispecies:Localization/row|Excerpt from}} {{Wikispecies:Localization/row|Excerpt in}} {{Wikispecies:Localization/row|Extract}} {{Wikispecies:Localization/row|Extract from}} {{Wikispecies:Localization/row|Extract in}} {{Wikispecies:Localization/row|female}} {{Wikispecies:Localization/row|feminine}} {{Wikispecies:Localization/row|male}} {{Wikispecies:Localization/row|masculine}} {{Wikispecies:Localization/row|neuter}} {{Wikispecies:Localization/row|or}} {{Wikispecies:Localization/row|unique}} {{Wikispecies:Localization/row|unknown}} |} <translate> <!--T:52--> Note that "female" and "male" above are nouns. ==Author pages== <!--T:4--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:39--> Inputs for author pages</translate> ! scope="col" align="center" | <translate><!--T:12--> English</translate> ! scope="col" align="center" | <translate><!--T:13--> Other languages</translate> ! scope="col" align="center" | <translate><!--T:14--> You will see</translate> |- {{Wikispecies:Localization/row|Name}} {{Wikispecies:Localization/row|full name}} {{Wikispecies:Localization/row|Alias}} {{Wikispecies:Localization/row|born}} {{Wikispecies:Localization/row|died}} {{Wikispecies:Localization/row|née}} {{Wikispecies:Localization/row|Also published as}} {{Wikispecies:Localization/row|Author abbreviation}} {{Wikispecies:Localization/row|Author abbreviations}} {{Wikispecies:Localization/row|Author name abbreviation}} {{Wikispecies:Localization/row|Author name abbreviations}} {{Wikispecies:Localization/row|Botanist name abbreviation}} {{Wikispecies:Localization/row|Zoologist name abbreviation}} {{Wikispecies:Localization/row|Zoologist name abbreviations}} {{Wikispecies:Localization/row|Standard abbreviation}} {{Wikispecies:Localization/row|Standard abbreviations}} {{Wikispecies:Localization/row|Standard author abbreviation}} {{Wikispecies:Localization/row|Standard author abbreviations}} {{Wikispecies:Localization/row|IPNI ID}} {{Wikispecies:Localization/row|IPNI standard form}} {{Wikispecies:Localization/row|Standard IPNI form}} {{Wikispecies:Localization/row|Outdated}} {{Wikispecies:Localization/row|Child}} {{Wikispecies:Localization/row|Parent}} {{Wikispecies:Localization/row|Spouse}} {{Wikispecies:Localization/row|Sibling}} {{Wikispecies:Localization/row|Zoobank ID}} {{Wikispecies:Localization/row|taxon names authored by}} {{Wikispecies:Localization/row|Wikispecies user page}} {{Wikispecies:Localization/row|Link}} {{Wikispecies:Localization/row|Links}} {{Wikispecies:Localization/row|External links}} {{Wikispecies:Localization/row|Authored taxa}} {{Wikispecies:Localization/row|Eponyms}} {{Wikispecies:Localization/row|Eponymy}} {{Wikispecies:Localization/row|Patronyms}} {{Wikispecies:Localization/row|Publication}} {{Wikispecies:Localization/row|Publications}} {{Wikispecies:Localization/row|Abbreviation}} {{Wikispecies:Localization/row|Acarologist}} {{Wikispecies:Localization/row|Acarologists}} {{Wikispecies:Localization/row|Agrostologist}} {{Wikispecies:Localization/row|Agrostologists}} {{Wikispecies:Localization/row|Annelidologist}} {{Wikispecies:Localization/row|Annelidologists}} {{Wikispecies:Localization/row|Arachnologist}} {{Wikispecies:Localization/row|Arachnologists}} {{Wikispecies:Localization/row|Archaeozoologist}} {{Wikispecies:Localization/row|Archaeozoologists}} {{Wikispecies:Localization/row|Arthropodologist}} {{Wikispecies:Localization/row|Arthropodologists}} {{Wikispecies:Localization/row|Bacteriologist}} {{Wikispecies:Localization/row|Bacteriologists}} {{Wikispecies:Localization/row|Biologist}} {{Wikispecies:Localization/row|Biologists}} {{Wikispecies:Localization/row|Botanist}} {{Wikispecies:Localization/row|Botanists}} {{Wikispecies:Localization/row|Brachiopodologist}} {{Wikispecies:Localization/row|Brachiopodologists}} {{Wikispecies:Localization/row|Bryologist}} {{Wikispecies:Localization/row|Bryologists}} {{Wikispecies:Localization/row|Bryozoologist}} {{Wikispecies:Localization/row|Bryozoologists}} {{Wikispecies:Localization/row|Carcinologist}} {{Wikispecies:Localization/row|Carcinologists}} {{Wikispecies:Localization/row|Chiropterologist}} {{Wikispecies:Localization/row|Chiropterologists}} {{Wikispecies:Localization/row|Chiropterist}} {{Wikispecies:Localization/row|Chiropterists}} {{Wikispecies:Localization/row|Cirripedologist}} {{Wikispecies:Localization/row|Cirripedologists}} {{Wikispecies:Localization/row|Cnidariologist}} {{Wikispecies:Localization/row|Cnidariologists}} {{Wikispecies:Localization/row|Coleopterist}} {{Wikispecies:Localization/row|Coleopterists}} {{Wikispecies:Localization/row|Dipterist}} {{Wikispecies:Localization/row|Dipterists}} {{Wikispecies:Localization/row|Echinodermologist}} {{Wikispecies:Localization/row|Echinodermologists}} {{Wikispecies:Localization/row|Entomologist}} {{Wikispecies:Localization/row|Entomologists}} {{Wikispecies:Localization/row|Geneticist}} {{Wikispecies:Localization/row|Geneticists}} {{Wikispecies:Localization/row|Geologist}} {{Wikispecies:Localization/row|Geologists}} {{Wikispecies:Localization/row|Helminthologist}} {{Wikispecies:Localization/row|Hemipterist}} {{Wikispecies:Localization/row|Herpetologist}} {{Wikispecies:Localization/row|Ichnologist}} {{Wikispecies:Localization/row|Ichthyologist}} {{Wikispecies:Localization/row|Lepidopterist}} {{Wikispecies:Localization/row|Lichenologist}} {{Wikispecies:Localization/row|Malacologist}} {{Wikispecies:Localization/row|Mammalogist}} {{Wikispecies:Localization/row|Microbiologist}} {{Wikispecies:Localization/row|Micropalaeontologist}} {{Wikispecies:Localization/row|Mycologist}} {{Wikispecies:Localization/row|Mycologists}} {{Wikispecies:Localization/row|Myriapodologist}} {{Wikispecies:Localization/row|Myrmecologist}} {{Wikispecies:Localization/row|Naturalist}} {{Wikispecies:Localization/row|Naturalists}} {{Wikispecies:Localization/row|Nematologist}} {{Wikispecies:Localization/row|Ophiologist}} {{Wikispecies:Localization/row|Ornithologist}} {{Wikispecies:Localization/row|Ostracodologist}} {{Wikispecies:Localization/row|Palaeontologist}} {{Wikispecies:Localization/row|Palaeontologists}} {{Wikispecies:Localization/row|Paleontologist}} {{Wikispecies:Localization/row|Paleontologists}} {{Wikispecies:Localization/row|Paleobotanist}} {{Wikispecies:Localization/row|Paleoentomologist}} {{Wikispecies:Localization/row|Paleoichthyologist}} {{Wikispecies:Localization/row|Paleomalacologist}} {{Wikispecies:Localization/row|Paleomammalogist}} {{Wikispecies:Localization/row|Paleornithologist}} {{Wikispecies:Localization/row|Paleozoologist}} {{Wikispecies:Localization/row|Parasitologist}} {{Wikispecies:Localization/row|Phycologist}} {{Wikispecies:Localization/row|Primatologist}} {{Wikispecies:Localization/row|Protozoologist}} {{Wikispecies:Localization/row|Pteridologist}} {{Wikispecies:Localization/row|Spongiologist}} {{Wikispecies:Localization/row|Tardigradologist}} {{Wikispecies:Localization/row|Unaffiliated}} {{Wikispecies:Localization/row|Zoologist}} {{Wikispecies:Localization/row|Zoologists}} |} <translate> ==Repository pages== <!--T:5--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:40--> Inputs for repository pages</translate> ! scope="col" align="center" | <translate><!--T:15--> English</translate> ! scope="col" align="center" | <translate><!--T:16--> Other languages</translate> ! scope="col" align="center" | <translate><!--T:17--> You will see</translate> |- {{Wikispecies:Localization/row|Name}} {{Wikispecies:Localization/row|Repository}} |} <translate> ==Publication pages== <!--T:6--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:41--> Inputs for publication pages</translate> ! scope="col" align="center" | <translate><!--T:18--> English</translate> ! scope="col" align="center" | <translate><!--T:19--> Other languages</translate> ! scope="col" align="center" | <translate><!--T:20--> You will see</translate> |- {{Wikispecies:Localization/row|Name}} {{Wikispecies:Localization/row|Title}} {{Wikispecies:Localization/row|Journal title}} {{Wikispecies:Localization/row|Original title}} {{Wikispecies:Localization/row|ISSN}} {{Wikispecies:Localization/row|Publisher}} {{Wikispecies:Localization/row|Published by}} {{Wikispecies:Localization/row|Author}} {{Wikispecies:Localization/row|Authors}} {{Wikispecies:Localization/row|Place of publication}} {{Wikispecies:Localization/row|Place published}} {{Wikispecies:Localization/row|City}} {{Wikispecies:Localization/row|Publication frequency}} {{Wikispecies:Localization/row|Frequency}} {{Wikispecies:Localization/row|Language}} {{Wikispecies:Localization/row|Languages}} {{Wikispecies:Localization/row|Issues}} {{Wikispecies:Localization/row|Volume}} {{Wikispecies:Localization/row|Volumes}} {{Wikispecies:Localization/row|Series title}} {{Wikispecies:Localization/row|Alternative title}} {{Wikispecies:Localization/row|Alternative titles}} {{Wikispecies:Localization/row|Abbreviated title}} {{Wikispecies:Localization/row|Year of publication}} {{Wikispecies:Localization/row|Years of publication}} {{Wikispecies:Localization/row|Year of activity}} {{Wikispecies:Localization/row|Years of activity}} {{Wikispecies:Localization/row|Inception}} {{Wikispecies:Localization/row|Dissolved}} {{Wikispecies:Localization/row|Preceded by}} {{Wikispecies:Localization/row|Succeeded by}} {{Wikispecies:Localization/row|Open access status}} {{Wikispecies:Localization/row|Access}} {{Wikispecies:Localization/row|In press}} {{Wikispecies:Localization/row|not seen}} {{Wikispecies:Localization/row|Nomenclatural acts}} {{Wikispecies:Localization/row|No nomenclatural acts}} {{Wikispecies:Localization/row|Nomenclatural note}} {{Wikispecies:Localization/row|Nomenclatural notes}} {{Wikispecies:Localization/row|Date of publication}} {{Wikispecies:Localization/row|Publication date}} {{Wikispecies:Localization/row|Online edition}} {{Wikispecies:Localization/row|PDF available}} {{Wikispecies:Localization/row|Reprint}} {{Wikispecies:Localization/row|Reprinted}} {{Wikispecies:Localization/row|New Taxa}} {{Wikispecies:Localization/row|New taxa}} {{Wikispecies:Localization/row|New names}} {{Wikispecies:Localization/row|New ranks}} {{Wikispecies:Localization/row|New combination}} {{Wikispecies:Localization/row|New combinations}} {{Wikispecies:Localization/row|New synonyms}} {{Wikispecies:Localization/row|Other names}} {{Wikispecies:Localization/row|No new names}} {{Wikispecies:Localization/row|No new taxa}} {{Wikispecies:Localization/row|Fixation}} {{Wikispecies:Localization/row|Primary type fixation}} {{Wikispecies:Localization/row|Primary type fixations}} {{Wikispecies:Localization/row|Primary type designation}} {{Wikispecies:Localization/row|Primary type designations}} {{Wikispecies:Localization/row|Correction}} {{Wikispecies:Localization/row|Corrections}} {{Wikispecies:Localization/row|Corrigendum}} {{Wikispecies:Localization/row|Corrigenda}} {{Wikispecies:Localization/row|Erratum}} {{Wikispecies:Localization/row|Errata}} {{Wikispecies:Localization/row|Abstract}} {{Wikispecies:Localization/row|Website}} {{Wikispecies:Localization/row|Merged titles}} |} <translate> == Site interface localization (custom messages) == <!--T:21--> === Sidebar === <!--T:22--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:42--> Inputs for the sidebar</translate> ! align="center" | <translate><!--T:23--> English</translate> ! align="center" | <translate><!--T:24--> Other languages</translate> ! align="center" | <translate><!--T:25--> You will see</translate> |- {{Wikispecies:Localization/row|pump-description}} {{Wikispecies:Localization/row|templates-description}} {{Wikispecies:Localization/row|charter-description}} {{Wikispecies:Localization/row|rfc-description}} {{Wikispecies:Localization/row|coverage-description}} |} <translate> === Templates === <!--T:26--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:43--> Inputs for templates</translate> ! align="center" | <translate><!--T:27--> English </translate> ! align="center" | <translate><!--T:28--> Other languages </translate> ! align="center" | <translate><!--T:29--> You will see </translate> |- {{Wikispecies:Localization/row|blocked}} {{Wikispecies:Localization/row|blocks}} {{Wikispecies:Localization/row|documentation}} {{Wikispecies:Localization/row|Documentation subpage}} {{Wikispecies:Localization/row|indefinite}} {{Wikispecies:Localization/row|indefinitely}} {{Wikispecies:Localization/row|overview}} {{Wikispecies:Localization/row|Parameter}} {{Wikispecies:Localization/row|Parameters}} {{Wikispecies:Localization/row|parameter}} {{Wikispecies:Localization/row|parameters}} {{Wikispecies:Localization/row|sandbox}} {{Wikispecies:Localization/row|similar groups}} {{Wikispecies:Localization/row|sockpuppet}} {{Wikispecies:Localization/row|sockpuppets}} {{Wikispecies:Localization/row|sockpuppeteer}} {{Wikispecies:Localization/row|sockpuppeteers}} {{Wikispecies:Localization/row|vandalism}} {{Wikispecies:Localization/row|vandalizing}} {{Wikispecies:Localization/row|day}} {{Wikispecies:Localization/row|week}} {{Wikispecies:Localization/row|Taxa by author}} {{Wikispecies:Localization/row|Types by repository}} |} <translate> === Preferences === <!--T:30--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:44--> Inputs for preferences</translate> ! align="center" | <translate><!--T:31--> English </translate> ! align="center" | <translate><!--T:32--> Other languages </translate> ! align="center" | <translate><!--T:33--> You will see </translate> |- {{Wikispecies:Localization/row|gadget-section-MoreMenu}} {{Wikispecies:Localization/row|gadget-section-Categories}} |} <translate> === Generic interface items === <!--T:34--> </translate> {| class="wikitable sortable" width="100%" |+<translate><!--T:45--> Inputs for generic interface items</translate> ! align="center" | <translate><!--T:35--> English </translate> ! align="center" | <translate><!--T:36--> Other languages </translate> ! align="center" | <translate><!--T:37--> You will see </translate> |- {{Wikispecies:Localization/row|Blocks}} {{Wikispecies:Localization/row|Contents}} {{Wikispecies:Localization/row|Directory}} {{Wikispecies:Localization/row|Example}} {{Wikispecies:Localization/row|Examples}} {{Wikispecies:Localization/row|Find all Wikispecies pages which cite this reference}} {{Wikispecies:Localization/row|List may be incomplete}} {{Wikispecies:Localization/row|None}} {{Wikispecies:Localization/row|Notes}} {{Wikispecies:Localization/row|Remarks}} {{Wikispecies:Localization/row|page}} {{Wikispecies:Localization/row|pages}} {{Wikispecies:Localization/row|Possible}} {{Wikispecies:Localization/row|present}} {{Wikispecies:Localization/row|Purpose}} {{Wikispecies:Localization/row|Reference page}} {{Wikispecies:Localization/row|Reference item}} {{Wikispecies:Localization/row|See also}} {{Wikispecies:Localization/row|Seealso}} {{Wikispecies:Localization/row|See page}} {{Wikispecies:Localization/row|See pages}} {{Wikispecies:Localization/row|See page(s)}} {{Wikispecies:Localization/row|Syntax}} {{Wikispecies:Localization/row|Template}} {{Wikispecies:Localization/row|Templates}} {{Wikispecies:Localization/row|Usage}} {{Wikispecies:Localization/row|Archive}} {{Wikispecies:Localization/row|Archived}} {{Wikispecies:Localization/row|web archive}} {{Wikispecies:Localization/row|Online}} {{Wikispecies:Localization/row|Offline}} |} [[Category:Wikispecies{{#translation:}}|{{PAGENAME}}]] 2j6tnzni2n6qaz78ijpop8d774rxcuz Dmitry Alexandrovich German 0 882770 11322229 11058025 2026-10-21T19:03:09Z Andyboorman 251907 11322229 wikitext text/x-wiki {{Image}} '''Dmitry Alexandrovich German''' (born 1972), Russian botanist. Alias: '''Dmitri A. German'''. {{ru|Дмитрий Александрович Герман}} * Department of Biodiversity and Plant Systematics, Centre for Organismal Studies, Heidelberg University, Im Neuenheimer Feld 345, D-69120 Heidelberg, Germany (in 2016) * South-Siberian Botanical Garden, Altai State University, Lenina Street 61, 656049 Barnau, Russia (in 2016) {{IPNI standard form|D.A.German}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{German & Al-Shehbaz, 2008}} {{Klimeš & German, 2008}} {{German et al., 2009}} {{German & Al-Shehbaz, 2010}} {{Al-Shehbaz et al., 2011}} {{German, 2012}} {{German, 2014}} {{Al-Shehbaz et al., 2014}} {{Al-Shehbaz & German, 2014}} {{Moazzeni, Zarre, Assadi, Joharchi & German, 2014}} {{Španiel et al., 2015}} {{German, 2016}} {{Al-Shehbaz & German, 2016}} {{German et al., 2016}} {{Koch et al., 2017}} {{German & Al-Shehbaz, 2017}} {{Koch, Karl & German, 2017}} {{German & Al-Shehbaz, 2018}} {{Al-Shehbaz, Özüdoğru & German, 2021}} {{Koch et al., 2022}} {{German et al., 2023}} {{German & Koch, 2025}} {{Authority control}} {{DEFAULTSORT:German, Dmitry Alexandrovich}} [[Category:Taxon authorities]] [[Category:Botanists]] m47q9j0snlmd6itanhy6hh9xp2amkir Template:Dyar,HG, 1916 10 886719 11322158 9718252 2026-10-21T18:00:58Z FrankB157 2872707 11322158 wikitext text/x-wiki *{{a|Harrison Gray Dyar|Dyar, H.G.}} 1916. Descriptions of new lepidoptera from Mexico. ''[[ISSN 0096-3801|Proceedings of the United States National Museum]]'' 51(2139): 1–37. {{BHL|page/7764047}} <includeonly>[[Template:Dyar,HG, 1916|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 16 October 1916 ==={{int:New names}} (121)=== * ''[[Achatia dogmatica]]'' * ''[[Agrotis rosifunda]]'' * ''[[Amblyscirtes catahorma]]'' * ''[[Amphidasys antennatissima]]'' * ''[[Anacraga gugelmanni]]'' * ''[[Anapalta baptopennis]]'' * ''[[Apicia anadis]]'' * ''[[Apicia commota]]'' * ''[[Apicia mesenterica]]'' * ''[[Apicia porrigaria]]'' * ''[[Apicia volcanica]]'' * ''[[Apicia yssone]]'' * ''[[Araeoptera vilhelmina]]'' * ''[[Baniana lodeber]]'' * ''[[Boeotarcha lithocymalis]]'' * ''[[Bryomima continentis]]'' * ''[[Bryomima oziphona]]'' * ''[[Caenocharis rhadinaria]]'' * ''[[Calidota clarcana]]'' * ''[[Callopsiodes thinballa]]'' * ''[[Caria rabatta]]'' * ''[[Casbia alteraria]]'' * ''[[Cerathosia opisthochra]]'' * ''[[Chalcamistis]]'' * ''[[Chalcamistis autoplusia]]'' * ''[[Chalia zacualpania]]'' * ''[[Charadra oligarchia]]'' * ''[[Charadra patafex]]'' * ''[[Chloropteryx jalapata]]'' * ''[[Chrostosoma tabascensis]]'' * ''[[Clemensia holocerna]]'' * ''[[Cnemodes maculimargo]]'' * ''[[Cobubatha ipilla]]'' * ''[[Cobubatha munna]]'' * ''[[Coenipeta endopolia]]'' * ''[[Coenocalpe agapetica]]'' * ''[[Crambus chalcostomus]]'' * ''[[Crambus harpipterus]]'' * ''[[Cymatophora specifica]]'' * ''[[Cymatophora sudella]]'' * ''[[Datana holoporphyra]]'' * ''[[Dysodia hypothyris]]'' * ''[[Eois panerema]]'' * ''[[Episilia pyrsogramma]]'' * ''[[Eriopyga complexens]]'' * ''[[Eriopyga desiota]]'' * ''[[Eriopyga milio]]'' * ''[[Eriopyga nisio]]'' * ''[[Eriopyga ratelusia]]'' * ''[[Eriopyga rea]]'' * ''[[Eriopyga rhodohoria]]'' * ''[[Eriopyga rubifer]]'' * ''[[Eriopyga simplex]]'' * ''[[Eriopyga tebota]]'' * ''[[Eriopyga umbrifer]]'' * ''[[Eriphioides fastidiosa]]'' * ''[[Euacidalia nitipennis]]'' * ''[[Euclea immundara]]'' * ''[[Eudamus hyster]]'' * ''[[Eumichtis chlorosticta]]'' * ''[[Eustroma phylaca]]'' * ''[[Euxoa tetratopis]]'' * ''[[Exelis mundaria]]'' * ''[[Grucia]]'' * ''[[Grucia monacheicauda]]'' * ''[[Hemihyalea euornithia]]'' * ''[[Hemihyalea nimbipicta]]'' * ''[[Hemihyalea rhoda hidalgonis.]]'' * ''[[Heterolocha authades]]'' * ''[[Heterolocha parathesa]]'' * ''[[Homolagoa tritogramma]]'' * ''[[Hydroeciodes cirramela]]'' * ''[[Hydroeciodes pexinella]]'' * ''[[Hydroeciodes ruxis]]'' * ''[[Hylesia omeva]]'' * ''[[Hymenomima dogninana]]'' * ''[[Iesta adulcia]]'' * ''[[Iesta morobe]]'' * ''[[Ipidecla]]'' * ''[[Ipidecla miadora]]'' * ''[[Ischnurges microchroia]]'' * ''[[Jocara ban]]'' * ''[[Lobopola plicata]]'' * ''[[Macaria da]]'' * ''[[Mannina]]'' * ''[[Mannina hagnoleuca]]'' * ''[[Megastes romula]]'' * ''[[Melinodes iobarris]]'' * ''[[Metacrisiodes]]'' * ''[[Metacrisiodes pua]]'' * ''[[Metalectra viridescens]]'' * ''[[Metalectra vividifer]]'' * ''[[Metanema marilacta]]'' * ''[[Miselia dima]]'' * ''[[Nagidusa mycomba]]'' * ''[[Nephelistis oomae]]'' * ''[[Nesalcis nebetta]]'' * ''[[Pleonectyptera consolata]]'' * ''[[Psaliodes ewplaneta]]'' * ''[[Psaliodes monapo]]'' * ''[[Psilacron hidalgoa]]'' * ''[[Ribaldia]]'' * ''[[Ribaldia amatame]]'' * ''[[Roeselia clarciana]]'' * ''[[Scevesia]]'' * ''[[Scevesia broidricci]]'' * ''[[Schizura tomaea]]'' * ''[[Selenia agatha]]'' * ''[[Selenia giavor]]'' * ''[[Talara synnephela]]'' * ''[[Tephrina caliposis]]'' * ''[[Tephrina calliope]]'' * ''[[Thecla arindela rinde]]'' * ''[[Thecla minniles]]'' * ''[[Thecla syncellus sierrae]]'' * ''[[Thecla syvix]]'' * ''[[Therina blandaria]]'' * ''[[Thorybes paucipuncta]]'' * ''[[Trichorthosia aselenograpta]]'' * ''[[Trichorthosia clarcana]]'' * ''[[Turuptiana panoezys]]'' ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> 3wu7nafb1zsus5k5eymdxuuf8z3l6uj Syntrichia montana 0 890148 11322620 10041623 2026-10-22T07:29:24Z MILEPRI 924668 11322620 wikitext text/x-wiki {{Image|Syntrichia montana (a, 164114-475524) 9263.JPG}} {{Image|Syntrichia montana (a, 164114-475524) 9264.JPG}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia montana]]'' =={{int:Name}}== ''Syntrichia montana'' {{a|Christian Gottfried Daniel Nees von Esenbeck|Nees}}, 1819 ==={{int:Synonyms}}=== *''Barbula montana'' (Nees) Corb. *''Tortula montana'' (Nees) Lindb. *''Barbula intermedia'' (Brid.) A.W.H. Walther & Molendo *''Barbula ruralis subsp. intermedia'' (Brid.) Boulay *''Barbula ruralis var. intermedia'' (Brid.) Limpr. *''Syntrichia intermedia'' Brid. *''Tortula intermedia'' (Brid.) Berk. DC *''Barbula intermedia var. planifolia'' (Warnst. & M. Fleisch.) Paris *''Syntrichia montana var. planifolia'' (Warnst. & M. Fleisch.) Podp. *''Tortula intermedia var. planifolia'' (Warnst. & M. Fleisch.) Wijk & Margad. *''Tortula montana var. planifolia'' Warnst. & M. Fleisch. *''Barbula intermedia var. rupestris'' Milde *''Barbula pulvinata var. rupestris'' Milde *''Barbula ruralis var. rupestris'' Bruch & Schimp. *''Syntrichia montana'' Brid. *''Syntrichia montana subsp. subcalcicola'' Giacom. *''Syntrichia montana var. subcalcicola'' (Giacom.) Podp. *''Tortula intermedia var. subcalcicola'' (Giacom.) Wijk & Margad. *''Tortula crinita'' (De Not.) De Not. *''Tortula ruralis var. crinita'' De Not. *''Tortula intermedia var. intermedia'' *''Tortula montana var. paludosa'' Röll *''Tortula ruralis var. minor'' Wilson *''Tortula ruralis var. rupestris'' Wilson =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Raab, C. W.}} (1819). Excursion in die Gegend von Muggendorf von Herrn Präsidenten und Pofessor Nees von Esenbeck und seinen Zuhörern aus Erlangen. Flora, 2(19), 289–304. https://www.tropicos.org/reference/100052464 ==={{int:Additional references}}=== * Kramer, W. A. (2023). The genus Syntrichia Brid. (Pottiaceae, Bryophyta) in the Holarctic with special consideration of North America. Nova Hedwigia Beiheft, 154, 1–234. https://www.tropicos.org/reference/100054630 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} =={{int:Vernacular names}}== {{VN |en=tortula moss, Intermediate Screw-moss |da= Bjerg-hårstjerne |nl= Vioolsterretje |no= midjehårstjerne |sv= midjeskruvmossa }} {{Commonscat}} {{Taxonbar|from=Q15316624}} [[Category:Christian Gottfried Daniel Nees von Esenbeck taxa]] ay2b0863sbuzki9qtcsh1l9umkhue76 Evgeny Eduardovich Perkovsky 0 891139 11322983 11304482 2026-10-22T10:32:56Z Hiouf 2107144 /* 2026 */ 11322983 wikitext text/x-wiki '''Evgeny Eduardovich Perkovsky''' (born 1961), Ukrainian zoologist, entomologist and paleontologist * E-mail: perkovsk@gmail.com {{ru|Евгений Эдуардович Перковский}} {{uk|Євген Едуардович Перковський}} * Borissiak Paleontological Institute, Russian Academy of Sciences, Moscow, Russia * Schmalhausen Institute of Zoology, National Academy of Sciences of Ukraine, Bogdana Khmel'nitskogo 15, Kiev, 01601, Ukraine. {{IPNI standard form|Perkovsky}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2001=== * {{a|Viktor Borisovich Semenov|Semenov, V.B.}}, {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} & {{aut|Petrenko, A.A.}} 2001. [The first finding of aleocharines (Coleoptera, Staphylinidae, Aleocharinae) from the Rovno amber.] ''Reports of the National Academy of Sciences Ukraine'' 7: 155–158 [in Russian] ===2004=== {{Polilov & Perkovsky, 2004}} ===2007=== * {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} 2007. [On the find of adult ''Micromalthus'' (Coleoptera, Micromalthidae) in Dominican amber.] ''[[ISSN 0031-031X|Paleontologicheskii Zhurnal]]'' 2007(6): 36–38. [in Russian, English translation in ''[[ISSN 0031-0301|Paleontological Journal]]'' 41(6): 626–628. {{doi|10.1134/S0031030107060068}} {{access|closed}}. [https://web.archive.org/web/20140221023556/http://fossilinsects.net/pdfs/Perkovsky_2007_PalJ_MicromalthusDominican.pdf PDF].] ===2009=== {{Antropov & Perkovsky, 2009}} {{Nazarenko & Perkovsky, 2009}} ===2010=== {{Nadein & Perkovsky, 2010}} ===2011=== {{Lyubarsky & Perkovsky, 2011}} ===2015=== {{Drohojowska, Perkovsky & Szwedo, 2015}} {{Nadein, Perkovsky & Moseyko, 2015}} {{Simutnik & Perkovsky, 2015}} ===2016=== {{Baranov, Kvifte & Perkovsky, 2016}} {{Jałoszyński & Perkovsky, 2016}} * {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} 2016. [A new species of Micromalthidae (Coleoptera) from the Rovno amber: 1. Adult morphology]. ''[[ISSN 0031-031X|Paleontologicheskii Zhurnal]]'' 2016(3): 83–87. (in Russian). [English translation: ''[[ISSN 0031-0301|Paleontological Journal]]'' 50(3): 293–296. {{doi|10.1134/S0031030116030047}} {{access|closed}}.] ===2017=== {{Lyubarsky & Perkovsky, 2017}} {{Simutnik & Perkovsky, 2017}} ===2018=== * {{a|Vladimir Grigoryevich Kaplin|Kaplin, V.G.}} & {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} 2018. [On the Fauna of Bristletails (Zygentoma, Microcoryphia) of the Rovno Amber]. ''[[ISSN 0031-031X|Paleontologicheskii Zhurnal]]'' 2018(5): 68–72. (in Russian). [English translation: ''[[ISSN 0031-0301|Paleontological Journal]]'' 52(5): 541–545. {{doi|10.1134/S0031030118050052}} {{access|closed}}.] {{Nadein & Perkovsky, 2018}} {{Perkovsky & Olmi, 2018}} {{Simutnik & Perkovsky, 2018}} ===2019=== {{Dietrich & Perkovsky, 2019}} {{Jałoszyński & Perkovsky, 2019}} {{Jałoszyński & Perkovsky, 2019a}} {{Legalov, Nazarenko & Perkovsky, 2019}} {{Lyubarsky & Perkovsky, 2019}} {{Makarkin, Perkovsky & Gröhn, 2019}} {{Nadein & Perkovsky, 2019}} {{Perkovsky & Makarkin, 2019}} ===2020=== {{Balashov, Perkovsky & Vasilenko, 2020}} {{Kazantsev & Perkovsky, 2020}} {{Kolibáč & Perkovsky, 2020}} {{Makarkin & Perkovsky, 2020}} {{Perkovsky et al., 2020}} {{Sokolov & Perkovsky, 2020}} ===2021=== {{Giłka, Harbach & Perkovsky, 2021}} {{Golub, Perkovsky & Vasilenko, 2021}} {{Jaloszyński & Perkovsky, 2021}} {{Legalov, Nazarenko & Perkovsky, 2021}} {{Matalin, Perkovsky & Vasilenko, 2021}} {{Melnitsky, Ivanoy & Perkovsky, 2021}} {{Mitov, Perkovsky & Dunlop, 2021}} {{Nazarenko, Perkovsky & Vasilenko, 2021}} {{Olmi et al., 2021a}} {{Telnov et al., 2021}} {{Tshernyshev & Perkovsky, 2021}} ===2022=== {{Kupryjanowicz, Lyubarsky & Perkovsky, 2022}} * {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} 2022. [''Anancites'' nom. nov., a replacement name for ''Adamas'' Chen et Wang, 2020 (Coleoptera, Lymexylidae)]. ''[[ISSN 0031-031X|Paleontologicheskii Zhurnal]]'' 2022(3): 92. (in Russian). [English translation: ''[[ISSN 0031-0301|Paleontological Journal]]'' 56(3): 327. {{doi|10.1134/S003103012203011X}} {{access|open}}.] {{Shamshev & Perkovsky, 2022}} {{Yamamoto et al., 2022}} ===2023=== {{Nabozhenko & Perkovsky, 2023}} {{Nabozhenko, Perkovsky & Nazarenko, 2023}} ===2024=== {{Anisyutkin, Vassilenko & Perkovsky, 2024}} {{Perkovsky, Vasilenko & Storozhenko, 2024}} {{Vilhelmsen, Perkovsky & Jenkins Shaw, 2024}} ===2026=== {{Makarkin, Simonsen, & Perkovsky, 2026}} {{Kazantsev et al., 2026}} {{Shcherbakov, Emeljanov & Perkovsky, 2026}} ==={{int:Links}}=== {{Authority control}} {{DEFAULTSORT:Perkovsky, Evgeny Eduardovich}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Zoologists]] [[Category:Palaeontologists]] svn8xs5r9f0fgwizyvl5vi611f5dpf0 Serguei Vladimirovich Triapitsyn 0 898264 11322310 11120813 2026-10-21T20:17:07Z Neferkheperre 947633 /* 2025 */ 11322310 wikitext text/x-wiki '''Serguei Vladimirovich Triapitsyn''' (19..—), US entomologist {{ru|Сергей Владимирович Тряпицын}} * Entomology Research Museum, Department of Entomology, University of California, Riverside, California, 92521, USA. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2007=== * {{aut|Triapitsyn, S.V.}} & {{aut|Berezovskiy, V.V.}} 2007. Review of the Oriental and Australasian species of ''Acmopolynema'', with taxonomic notes on ''Palaeoneura'' and ''Xenopolynema'' stat. rev. and description of a new genus (Hymenoptera: Mymaridae). ''Zootaxa'' 1455: 1–68. [Abstract & excerpt: [https://mapress.com/zootaxa/2007f/z01455p068f.pdf] ] ===2010=== {{Triapitsyn et al., 2010}} ===2011=== {{Huber et al., 2011}} ===2013=== {{Triapitsyn, 2013}} {{Triapitsyn, Donev & Huber, 2013}} ===2015=== {{Aishan, Triapitsyn & Hu, 2015}} {{Guzmán-Larralde et al., 2015}} {{Palanivel, Manickavasagam & Triapitsyn, 2015}} {{Triapitsyn et al., 2015}} ===2016=== {{Aishan, Triapitsyn & Xu, 2016}} {{Aquino, Triapitsyn & Huber, 2016}} {{Hu & Triapitsyn, 2016}} {{Huber & Triapitsyn, 2017}} {{Triapitsyn, 2016}} {{Triapitsyn, Aguirre & Logarzo, 2016}} ===2017=== {{Triapitsyn, 2017}} {{Triapitsyn, Kwadjo & Rosete, 2017}} ===2018=== {{Li et al., 2018}} {{Manickavasagam, Triapitsyn & Palanivel, 2018}} {{Van Noort & Triapitsyn, 2018}} {{Noyes & Triapitsyn, 2018}} ===2019=== {{Triapitsyn et al., 2019}} {{Triapitsyn et al., 2019a}} ===2020=== {{Aishan, Triapitsyn & Xu, 2020}} {{Huber, Read & Triapitsyn, 2020}} {{Sankararaman et al., 2020}} {{Triapitsyn et al., 2020}} {{Triapitsyn, Aishan & Huber, 2020}} ===2021=== {{Huber, Read & Triapitsyn, 2021}} {{Triapitsyn, 2021}} {{Triapitsyn, Baquero & Rugman-Jones, 2021}} {{Triapitsyn, Rugman-Jones & Perring, 2021}} ===2023=== {{Ortis, Triapitsyn & Mazzon, 2023}} ===2024=== {{Cruaud et al., 2024}} ===2025=== {{Aishan et al., 2025}} ===2026=== {{Triapitsyn, Kim & Kang, 2026}} {{Authority control}} {{DEFAULTSORT:Triapitysn, Serguei Vladimirovich}} [[Category:Taxon authorities]] [[Category:Entomologists]] 6r3t72hkink1g9grtwuqcmnirt1bn7r Thalictroideae 0 905991 11322002 11321927 2026-10-21T13:55:27Z Andyboorman 251907 /* {{int:Synonyms}} */ 11322002 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Thalictroideae}} Genera: {{g|Aquilegia}} {{g|Cymatenemion}} {{g|Dichocarpum}} {{g|Enemion}} {{g|Isopyrum L.|Isopyrum}} {{g|Leptopyrum}} {{g|Neoenemion}} {{g|Paraquilegia}} {{g|Paropyrum}} {{g|Semiaquilegia}} {{g|Thalictrum}} {{glast|Urophysa}} =={{int:Name}}== Thalictroideae {{a|Raf.}} Anal. Nat.: [http://www.biodiversitylibrary.org/item/188066#page/186 176]. (1815) * {{TG|Thalictrum|{{a|L.}} (1753)}} ==={{int:Synonyms}}=== * Aquilegiaceae {{a|Lilja}}, Skånes Fl., ed. 2: 375, 861, 979. (1870) * Thalictraceae {{aut|Raf.}} Anal. Nat.: 176. (1815) * Isopyroideae {{a|Schrödinger}} Abh. K. K. Zool.-Bot. Ges. Wien 4(5): 59. (1909) ** {{TG|Isopyrum L.}} * Isopyreae {{aut|Schrödinger}} Abh. K. K. Zool.-Bot. Ges. Wien 4(5): 59. (1909) * Isopyrineae {{a|Benth.}} & {{a|Hook.f.}}, Gen. Pl. 1: 2.(1862) * Thalictreae {{aut|Langlet ex D.Z. Fu}} in Cathaya 2: 188. (1990) * Thalictrinae {{aut|Tamura}} (1995)<br /> Note: Thalictroideae Raf. Anal. Nat.: 176. (1815) has priority over Isopyroideae {{a|Schrödinger}} Abh. K. K. Zool.-Bot. Ges. Wien 4(5): 59. (1909) [https://www.iapt-taxon.org/nomen/pages/main/art_11.html ICN Art. 11.3]. =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Rafinesque, C.S.}} 1815. ''Analyse de la Nature'' [http://www.biodiversitylibrary.org/item/188066#page/186 176] (Thalictrinia) validated by a diagnosis in French. ==={{int:Additional references}}=== {{Cossard et al., 2016}} {{Wang & Chen, 2007}} {{Xiang et al., 2026}} ==={{int:Links}}=== {{MBG|2036|Aug.|7}} {{APW}} {{Taxonbar|from=Q3985474}} dgrg4oa0a89pwkavdqxvyn3bw8m3wvf Beijerinckia 0 909553 11322932 11129801 2026-10-22T09:58:26Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322932 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Beijerinckiaceae}} Genus: ''[[Beijerinckia]]'' =={{int:Name}}== ''Beijerinckia'' =={{int:References}}== * {{NCBI|532|''Beijerinckia''}} * [https://www.ebi.ac.uk/ena/data/view/Taxon:532 European Nucleotide Archive] {{Taxonbar|from=Q15787457}} [[Category:Eponyms of Martinus Beijerinck]] 7kt4mkowcfqjp8me4794kzpgkxdr7cn Marcus A. Koch 0 910279 11322230 11058030 2026-10-21T19:03:19Z Andyboorman 251907 11322230 wikitext text/x-wiki '''Marcus A. Koch''' (born 1967), German botanist. *Biodiversity and Plant Systematics, Universität Heidelberg, Deutschland {{IPNI standard form|M.Koch}} (outdated: M.A.Koch) {{Taxa authored}} == {{int: Publications}} == {{Inc}} {{Koch et al., 1999}} {{Koch & Mummenhoff, 2001}} {{Warwick et al., 2010}} {{Al-Shehbaz et al., 2011}} {{Koch, 2012}} {{Yüzbaşıoğlu, Koch & Al-Shehbaz, 2015}} {{Kadereit et al., 2016}} {{Koch et al., 2017}} {{Dönmez, Uğurlu & Koch, 2017}} {{Koch, Karl & German, 2017}} {{Uğurlu, Koch & Dönmez, 2020}} {{Koch et al., 2022}} {{Fassou et al., 2022}} {{German et al., 2023}} {{German & Koch, 2025}} {{Authority control}} {{DEFAULTSORT:Koch, Marcus A}} [[Category:Taxon authorities]] [[Category:Botanists]] 48j835wm6l4hexv4s16u6nr8ltkjl6a Brassiceae 0 912193 11322029 9867478 2026-10-21T15:04:50Z Andyboorman 251907 11322029 wikitext text/x-wiki {{image|Brassica juncea (2145501783).jpg|''[[Brassica juncea]]''}} =={{int:Taxonavigation}}== {{Brassiceae}} Genera: {{g|Ammosperma}} {{g|Brassica}} {{g|Cakile}} {{g|Carrichtera}} {{g|Ceratocnemum}} {{g|Coincya}} {{g|Cordylocarpus}} {{g|Crambe}} {{g|Crambella}} {{g|Didesmus}} {{g|Diplotaxis (Brassicaceae)|Diplotaxis}} {{g|Douepea}} {{g|Enarthrocarpus}} {{g|Eremophyton}} {{g|Eruca (Brassicaceae)|Eruca}} {{g|Erucaria}} {{g|Erucastrum}} {{g|Fezia}} {{g|Foleyola}} {{g|Fortuynia (Brassicaceae)|Fortuynia}} {{g|Guiraoa}} {{g|Hemicrambe}} {{g|Henophyton}} {{g|Hirschfeldia}} {{g|Horwoodia}} {{g|Kremeriella}} {{g|Moricandia (Brassicaceae)|Moricandia}} {{g|Morisia}} {{g|Muricaria}} {{g|Mutarda}} {{g|Nasturtiopsis}} {{g|Orychophragmus}} {{g|Otocarpus}} {{g|Physorhynchus}} {{g|Pseuderucaria}} {{g|Psychine}} {{g|Quezeliantha}} {{g|Quidproquo}} {{g|Raffenaldia}} {{g|Raphanus}} {{g|Rapistrum}} {{g|Rytidocarpus}} {{g|Savignya}} {{g|Schouwia}} {{g|Sinapidendron}} {{g|Sinapis}} {{g|Succowia}} {{g|Vella}} {{glast|Zilla (Brassicaceae)|Zilla}} Nothogenera: {{glast|× Brassarda}} =={{int:Name}}== Brassiceae {{a|DC.}} Mém. Mus. Hist. Nat. 7: 242. (1821) *Type genus: ''Brassica'' {{a|L.}} Sp. Pl. 2: 666. (1753) =={{int:References}}== *{{DC.}} 1821. ''[[Mémoires du Muséum d'Histoire Naturelle]]'' 7(1): [http://www.biodiversitylibrary.org/page/34817984#page/264 242]. {{Al-Shehbaz, 2021}} *{{Arias & Pires, 2012}} *{{BRBA|2020|Aug.|3}} {{German, 2022}} *{{Warwick & Sauder, 2005}} *{{Ziffer-Berger et al., 2015}} {{Commonscat}} {{Taxonbar|from=Q15054388}} [[Category:Augustin Pyrame de Candolle taxa]] qwf09sb0xhtg9icoro2kidgcx7w8pd4 Gislene Lopes Gonçalves 0 1001559 11322562 11226253 2026-10-22T03:39:14Z Neferkheperre 947633 /* 2022 */ 11322562 wikitext text/x-wiki '''Gislene Lopes Gonçalves''', Brazilian biologist. * Facultad de Ciencias Agronómicas, Departamento de Recursos Ambientales, Universidad de Tarapacá, Arica, Chile. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2012=== {{Brito et al., 2012}} {{Moreira et al., 2012}} ===2013=== {{Brito et al., 2013}} ===2014=== {{Quintela et al., 2014}} {{Fochezato et al., 2024}} ===2015=== {{Luz et al., 2015a}} {{Vargas et al., 2015}} ===2017=== {{Moreira et al., 2017}} {{Pereira et al., 2017}} {{Quintela et al., 2017}} ===2018=== {{Moreira et al., 2018}} {{Silva et al., 2018a}} ===2019=== {{Brito et al., 2019}} {{Brito et al., 2019a}} {{Moreira et al., 2019}} {{Moreira et al., 2019a}} {{Pereira et al., 2019a}} {{Vargas-Ortiz et al., 2019}} ===2020=== {{Cerdena et al., 2020}} {{Davis et al., 2020}} ===2022=== {{Cerdeña et al., 2022}} {{Espinoza-Donoso et al., 2022}} {{Farfán et al., 2022}} {{Fochezato et al., 2022}} ===2026=== {{Maestri et al., 2026}} {{Authority control}} {{DEFAULTSORT:Goncalves, Gislene Lopes}} [[Category:Taxon authorities]] [[Category:Entomologists]] pan17mevbs5frz0aknxz4whmcxozjh8 Édouard Armand Isidore Hippolyte Lartet 0 1003154 11322563 9621904 2026-10-22T03:39:53Z The editor 2345 2915305 11322563 wikitext text/x-wiki {{Image|Edouard Lartet.jpg|Édouard Lartet (1801–1871)}} '''Édouard Armand Isidore Hippolyte Lartet''' (1801–1871), French palaeontologist. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1851=== {{Lartet, 1851}} ===1856=== {{Gaudry & Lartet, 1856}} {{Authority control}} {{DEFAULTSORT:Lartet, Edouard Armand Isidore Hippolyte}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] fy9pytrkjurunwz69rhcjihd35946is Hypoglossum dendroides 0 1029133 11323038 11295356 2026-10-22T11:28:51Z Thiotrix 61739 image added 11323038 wikitext text/x-wiki {{image|Hypoglossum dendroides als Delesseria dendroides in Harvey 1860.jpg}} =={{int:Taxonavigation}}== {{Hypoglossum}} Species: ''[[Hypoglossum dendroides]]'' =={{int:Name}}== ''Hypoglossum dendroides'' ({{a|William Henry Harvey|Harvey}}) {{a|Jakob Georg Agardh|J.Agardh}}, 1898: {{BHL|page/1414952|186}} * {{int:Type locality}}: Fremantle, Western Australia. * {{int:Holotype}}: Clifton; {{Rl|TCD}}, Herb. Harvey Trav. Set 269. ==={{int:Synonyms}}=== {{BA}} ** ''Delesseria dendroides'' {{a|William Henry Harvey|Harvey}}, 1855: {{BHL|page/13248612|548}} {{HOT}} ** ''Membranoptera dendroides'' ({{aut|Harvey}}) {{a|Carl Ernst Otto Kuntze|Kuntze}}, 1891 ** ''Hydrolapatha dendroides'' ({{aut|Harvey}}) {{aut|Kuntze}}, 1898 {{HET}} ** ''Delesseria dendroides'' var. ''oblongifolia'' {{aut|Harvey}}, 1860 ** ''Delesseria dendroides'' var. ''lancifolia'' {{aut|Harvey}}, 1860 =={{int:References}}== ==={{int:Primary references}}=== {{Agardh, 1898}} {{Harvey, 1855a}} {{Taxonbar|from=Q42173916}} [[Category:Jakob Georg Agardh taxa]] dwsbw9njsjxr4408vy8ztf5u1m610kv Hypoglossum involvens 0 1029139 11323047 11295569 2026-10-22T11:48:04Z Thiotrix 61739 better image 11323047 wikitext text/x-wiki {{image|Hypoglossum involvens as Delesseria involvens in Harvey 1853.jpg}} =={{int:Taxonavigation}}== {{Hypoglossum}} Species: ''[[Hypoglossum involvens]]'' =={{int:Name}}== ''Hypoglossum involvens'' ({{a|William Henry Harvey|Harvey}}) {{a|Jakob Georg Agardh|J.Agardh}}, 1898: {{BHL|page/1415050|185}} * {{int:Type locality}}: Key West. * {{int:Type}}: W.H.Harvey, Dr. Blodgett; Feb. 1850. ==={{int:Synonyms}}=== {{BA}} ** ''Delesseria involvens'' {{a|William Henry Harvey|Harvey}}, 1853: {{BHL|page/9050166|97}}, {{BHL|page/9050348|pl. XXIIA: figs. 1–4}} {{HOT}} ** ''Membranoptera involvens'' ({{aut|Harvey}}) {{a|Carl Ernst Otto Kuntze|Kuntze}}, 1891 ** ''Hydrolapatha involvens'' ({{aut|Harvey}}) {{aut|Kuntze}}, 1898 =={{int:References}}== ==={{int:Primary references}}=== {{Agardh, 1898}} {{Harvey, 1853}} {{Commonscat}} {{Taxonbar|from=Q21169811}} [[Category:Jakob Georg Agardh taxa]] jplkvgdx695d7lqv7e5rzmzuk7h0fdi 11323048 11323047 2026-10-22T11:49:13Z Thiotrix 61739 11323048 wikitext text/x-wiki {{image|Hypoglossum involvens as Delesseria involvens in Harvey 1853.jpg}} {{Image|Hypoglossum involvens.png}} =={{int:Taxonavigation}}== {{Hypoglossum}} Species: ''[[Hypoglossum involvens]]'' =={{int:Name}}== ''Hypoglossum involvens'' ({{a|William Henry Harvey|Harvey}}) {{a|Jakob Georg Agardh|J.Agardh}}, 1898: {{BHL|page/1415050|185}} * {{int:Type locality}}: Key West. * {{int:Type}}: W.H.Harvey, Dr. Blodgett; Feb. 1850. ==={{int:Synonyms}}=== {{BA}} ** ''Delesseria involvens'' {{a|William Henry Harvey|Harvey}}, 1853: {{BHL|page/9050166|97}}, {{BHL|page/9050348|pl. XXIIA: figs. 1–4}} {{HOT}} ** ''Membranoptera involvens'' ({{aut|Harvey}}) {{a|Carl Ernst Otto Kuntze|Kuntze}}, 1891 ** ''Hydrolapatha involvens'' ({{aut|Harvey}}) {{aut|Kuntze}}, 1898 =={{int:References}}== ==={{int:Primary references}}=== {{Agardh, 1898}} {{Harvey, 1853}} {{Commonscat}} {{Taxonbar|from=Q21169811}} [[Category:Jakob Georg Agardh taxa]] kauh99k8fy5u88b1ayog1fm9wgw7t3b Hypoglossum revolutum 0 1029145 11323043 11295592 2026-10-22T11:41:08Z Thiotrix 61739 image added 11323043 wikitext text/x-wiki {{image|Hypoglossum revolutum als Delesseria revoluta in Harvey 1860.jpg}} =={{int:Taxonavigation}}== {{Hypoglossum}} Species: ''[[Hypoglossum revolutum]]'' =={{int:Name}}== ''Hypoglossum revolutum'' ({{a|William Henry Harvey|Harvey}}) {{a|Jakob Georg Agardh|J.Agardh}}, 1898: {{BHL|page/1414954|188}} * {{int:Type locality}} ({{int:Lectotype}}): King George Sound, Western Australia. * {{int:Lectotype}}: {{Rl|TCD}}, Herb. Harvey Trav. Set 311 (Womersley 2003: 43). ==={{int:Synonyms}}=== {{BA}} ** ''Delesseria revoluta'' {{a|William Henry Harvey|Harvey}}, 1855: 548 {{HET}} ** ''Placophora cucullata'' {{aut|J.Agardh}}, 1892 ** ''Delesseria denticulata'' {{aut|J.Agardh}}, 1894, [[nom. illeg.]] (later homonym of ''[[Delesseria denticulata]]'' {{aut|Montagne}}, 1849) ** ''Hypoglossum denticulatum'' {{aut|J.Agardh}}, 1898, [[nom. illeg.]] (later homonym of ''[[Hypoglossum denticulatum]]'' {{aut|(Montagne) Kützing}}, 1866) =={{int:References}}== ==={{int:Primary references}}=== {{Agardh, 1898}} {{Harvey, 1855a}} {{Taxonbar|from=Q42173927}} [[Category:Jakob Georg Agardh taxa]] 6uv2dttc47ooaq0pezk5k83bqppcu56 Hypoglossum tenuifolium 0 1029151 11323052 11295617 2026-10-22T11:53:06Z Thiotrix 61739 image added 11323052 wikitext text/x-wiki {{image|Hypoglossum tenuifolium as Delesseria tenuifolia in Harvey 1853.jpg}} =={{int:Taxonavigation}}== {{Hypoglossum}} Species: ''[[Hypoglossum tenuifolium]]'' =={{int:Name}}== ''Hypoglossum tenuifolium'' ({{a|William Henry Harvey|Harvey}}) {{a|Jakob Georg Agardh|J.Agardh}}, 1898: {{BHL|page/1415050|186}} * {{int:Type locality}}: Key West, Florida, U.S.A. * {{int:Type}}: W.H. Harvey; Feb. 1850. ==={{int:Synonyms}}=== {{BA}} ** ''Delesseria tenuifolia'' {{a|William Henry Harvey|Harvey}}, 1853: {{BHL|page/9050166|97}}, {{BHL|page/9050348|pl. 22B}} {{HET}} ** ''Zellera boekei'' {{a|Carel Philip Sluiter|Sluiter}}, 1908 =={{int:References}}== ==={{int:Primary references}}=== {{Agardh, 1898}} {{Harvey, 1853}} {{Taxonbar|from=Q42173933}} [[Category:Jakob Georg Agardh taxa]] 2ivpo8aeai5k3g52mu1nxoju08w249q Herposiphonia versicolor 0 1032408 11322041 9828330 2026-10-21T15:39:27Z Thiotrix 61739 type, primary reference, BHL, better image 11322041 wikitext text/x-wiki {{Image|Herposiphonia versicolor as Polysiphonia versicolor in Harvey 1847-49.jpg}} == {{int:Taxonavigation}} == {{Herposiphonia}} Species: ''[[Herposiphonia versicolor]]'' == {{int:Name}} == ''Herposiphonia versicolor'' ({{a|Joseph Dalton Hooker|Hooker f.}} & {{a|William Henry Harvey|Harvey}}) {{a|Theodor Reinbold|Reinbold}}, 1899: {{BHL|page/507032|50}} * {{int:Type locality}}: "Parasitical on the larger Algae, Tasmania, R. Gunn, Esq. (v. s . in Herb. T. C. D. comm. cl. Hooker)". Tasmania (probably N coast). * {{int:Lectotype}} (designated by Womersley 2003: 292): R.C. Gunn sine numero; {{Rl|BM}}. === {{int:Synonyms}} === {{BA}} ** ''Polysiphonia versicolor'' {{a|Joseph Dalton Hooker|Hooker f.}} & {{a|William Henry Harvey|Harvey}}, 1847: {{BHL|page/46200969|48}}, {{BHL|page/46201097|pl. XVI (upper)}} {{HET}} ** ''Polysiphonia argus'' {{a|Friedrich Traugott Kützing|Kützing}}, 1864 == {{int:References}} == ==={{int:Primary references}}=== {{Reinbold, 1899b}} {{Harvey, 1847-1849}} {{Commonscat|Herposiphonia versicolor}} {{Taxonbar|from=Q42335607}} [[Category:Theodor Reinbold taxa]] j8n5nabls853d2yumdhmm4sio7ulh68 Herposiphonia monilifera 0 1032411 11322037 11318200 2026-10-21T15:26:50Z Thiotrix 61739 type, primary reference, BHL, better image 11322037 wikitext text/x-wiki {{Image|Herposiphonia monilifera as Polysiphonia monilifera in Harvey 1847-49.jpg}} == {{int:Taxonavigation}} == {{Herposiphonia}} Species: ''[[Herposiphonia monilifera]]'' == {{int:Name}} == ''Herposiphonia monilifera'' ({{a|Joseph Dalton Hooker|Hooker f.}} & {{a|William Henry Harvey|Harvey}}) {{a|Paul Falkenberg|Falkenberg}}, 1901: 315 * {{int:Type locality}}: Tasmania (probably near Georgetown). * {{int:Holotype}}: R.C. Gunn sine numero; [[TCD]]. === {{int:Synonyms}} === {{BA}} ** ''Polysiphonia monilifera'' {{a|Joseph Dalton Hooker|Hooker f.}} & {{a|William Henry Harvey|Harvey}}, 1847: {{BHL|page/46200970|49}}, {{BHL|page/46201097|pl. XVI (lower)}} == {{int:References}} == ==={{int:Primary references}}=== {{Falkenberg, 1901}} {{Harvey, 1847-1849}} {{Commonscat|Herposiphonia monilifera}} {{Taxonbar|from=Q42335603}} [[Category:Paul Falkenberg taxa]] f3mw6l4yw403y0keqbg6ycibxfld4z3 Herposiphonia fissidentoides 0 1033887 11322030 11292454 2026-10-21T15:05:48Z Thiotrix 61739 image added, commons 11322030 wikitext text/x-wiki {{image|Herposiphonia fissidentoides as Polyzonia fissidentoides in Holmes 1896.jpg}} {{Image|Herposiphonia fissidentoides in Okamura 1899.jpg|150}} =={{int:Taxonavigation}}== {{Herposiphonia}} Species: ''[[Herposiphonia fissidentoides]]'' =={{int:Name}}== ''Herposiphonia fissidentoides'' ({{a|Edward Morell Holmes|Holmes}}) {{a|Kintarô Okamura|Okamura}}, 1899: {{BHL|page/41670315|36}}, {{BHL|page/41670270|pl. I: figs. 9–11}} * {{int:Type locality}}: Enoshima, Japan. * {{int:Type}}: Ohkubo, no. 16. ==={{int:Synonyms}}=== {{BA}} ** ''Polyzonia fissidentoides'' {{a|Edward Morell Holmes|Holmes}}, 1896: {{BHL|page/168121|257}}, {{BHL|page/168130|pl. 12: fig. 2 a-b}} =={{int:References}}== ==={{int:Primary references}}=== {{Okamura, 1899}} {{Holmes, 1896}} {{Commonscat}} {{Taxonbar|from=Q42550403}} [[Category:Kintarô Okamura taxa]] rkgm5kg07d6g61c16eo6olhzr61v6pe Template:Vences et al., 2010c 10 1037501 11322331 8765754 2026-10-21T20:42:44Z Burmeister 9074 + 11322331 wikitext text/x-wiki * {{a|Miguel Vences|Vences, M.}}, {{a|Jörn Köhler|Köhler, J.}}, {{a|Maciej Pabijan|Pabijan, M.}} & {{a|Frank Glaw|Glaw, F.}} 2010. Two syntopic and microendemic new frogs of the genus ''Blommersia'' from the east coast of Madagascar. ''[[ISSN 2156-4574|African Journal of Herpetology]]'' 59(2): 133–156. {{doi|10.1080/21564574.2010.512961}} {{Access|closed}} <includeonly>[[Template:Vences et al., 2010c|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: October 2010 ==={{int:New names}} (2)=== * ''[[Blommersia galani]]'' [p. 143] * ''[[Blommersia dejongi]]'' [p. 147] [[Category:Reference templates]]</noinclude> ssr5y6tu9rsxpe4z4dou3eoe3vk0vix Julian Glos 0 1037575 11322399 11037809 2026-10-21T21:56:15Z Burmeister 9074 +1 11322399 wikitext text/x-wiki '''Julian Glos''', German herpetologist. * University of Hamburg, Martin-Luther-King Platz 3, Hamburg, Germany. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===2005=== {{Glos, Glaw & Vences, 2005}} ===2010=== {{Vences et al., 2010b}} ===2013=== {{Ndriantsoa et al., 2013}} ===2017=== {{Rakotoarison et al., 2017}} ===2019=== {{Rödel & Glos, 2019}} {{Rödel et al., 2019}} {{Scherz et al., 2019b}} ===2020=== {{Griep & Glos, 2020}} ===2023=== {{Griesbaum et al., 2023}} ===2026=== {{Rödel et al., 2026}} {{DEFAULTSORT:Glos, Julian}} {{Authority control}} [[Category:Taxon authorities]] [[Category:Herpetologists]] b59rt7hjtezjd5xjhkh6xo89k39n87y Ilgoo Kang 0 1048384 11322309 10930036 2026-10-21T20:13:58Z Neferkheperre 947633 /* 2024 */ 11322309 wikitext text/x-wiki '''Ilgoo Kang''', U.S. entomologist. * University of Kentucky, Lexington, United States of America {{taxa authored}} =={{int:Publications}}== {{inc}} ===2017=== {{Kang et al., 2017}} ===2020=== {{Kang et al., 2020}} {{Kang, Shaw & Lord, 2020}} ===2022=== {{Kang, 2022}} ===2023=== {{Kang et al., 2023}} ===2024=== {{Kang & Sharkey, 2024}} ===2026=== {{Triapitsyn, Kim & Kang, 2026}} {{Authority control}} {{DEFAULTSORT:Kang, Ilgoo}} [[Category:Taxon authorities]] [[Category:entomologists]] jerwkjnbkpc7dpevzzbxt3s2zqmbpqb Engelmanniinae 0 1058165 11322390 9226630 2026-10-21T21:48:07Z Esculapio 3329 /* {{int:Taxonavigation}} */ 11322390 wikitext text/x-wiki {{image|Balsamorhiza careyana - Flickr - brewbooks (1).jpg|''[[Balsamorhiza careyana]]''}} =={{int:Taxonavigation}}== {{Engelmanniinae}} Genera: {{g|Agnorhiza}} {{g|Balsamorhiza}} {{g|Berlandiera}} {{g|Borrichia}} {{g|Chrysogonum}} {{g|Engelmannia}} {{g|Lindheimera}} {{g|Scabrethia}} {{g|Silphium}} {{g|Vigethia}} {{glast|Wyethia}} =={{int:Name}}== Engelmanniinae {{a|Stuessy}}, Biol. Chem. Compositae [ed. V.H. Heywood et al.] 2: 645. (1977) *Type genus: ''Engelmannia'' {{a|A.Gray}} ex {{a|Nutt.}}, Descr. Sp. & Gen. Pl. Compos. Coll. (1834 & 1835) == {{int:References}} == ==={{int:Primary references}}=== *{{aut|Stuessy, T.F.}} 1977. ''[[The biology and chemistry of the Compositae]]'' 2: 645. ==={{int:Additional references}}=== *{{Clevinger & Panero, 2000}} ==={{int:Links}}=== *{{IPNI||2918|Jan. 17|77-1|Engelmanniinae}} =={{int:Vernacular names}}== {{VN |ru=Энгельманниевые }} {{taxonbar}} {{Commonscat}} [[Category:Tod Falor Stuessy taxa]] [[Category:Eponyms of George Engelmann]] m8p8bzs0g6589inn4bukjndl2bht155 Dermocorynus dichotomus 0 1079146 11322001 9829812 2026-10-21T13:51:52Z Thiotrix 61739 primary reference, BHL, synonyms, better image 11322001 wikitext text/x-wiki {{Image|Dermocorynus dichotomus 19880601a.jpg}} == {{Int:Taxonavigation}} == {{Dermocorynus}} Species: ''[[Dermocorynus dichotomus]]'' == {{Int:Name}} == ''Dermocorynus dichotomus'' ({{aut|J.Agardh}}) {{a|Gaetano M. Gargiulo|Gargiulo}}, {{a|Marina Morabito|M.Morabito}} & {{a|Antonio Manghisi|Manghisi}}, 2013: 31 (as 'dichotoma') * {{int:Type locality}} ({{int:Syntypes}}): "Ad littora Galloprovinciae et Niceae". * {{int:Type}}: [Golfe de] St. Hospice, 1841, {{Rl|LD}} herb. alg. Agardh no. 22637. === {{Int:Synonyms}} === {{BA}} ** ''Grateloupia dichotoma'' {{a|Jakob Georg Agardh|J.Agardh}}, 1842: {{BHL|page/31138348|103}} {{HET}} ** ''Grateloupia dichotoma'' f. ''nana'' {{a|Francesco Ardissone|Ardissone}}, 1883 ** ''Grateloupia dichotoma'' f. ''repens'' {{a|Francesco Ardissone|Ardissone}}, 1883 ** ''Grateloupia dichotoma'' f. {{a|Mazza}}, 1902 == {{Int:References}} == ==={{int:Primary references}}=== {{Gargiulo, Morabito & Manghisi, 2013}} {{Agardh, 1842}} {{Commonscat|Dermocorynus dichotomus}} {{Taxonbar|from=Q50463437}} [[Category:Gaetano M. Gargiulo taxa]] [[Category:Marina Morabito taxa]] [[Category:Antonio Manghisi taxa]] hyklprjl5dgro8gt2fq8x8sz6nj1n30 Grateloupia gelatinosa 0 1081473 11322026 11283271 2026-10-21T14:52:14Z Thiotrix 61739 image added 11322026 wikitext text/x-wiki {{Image|Grateloupia gelatinosa in Holmes 1896.jpg}} == {{Int:Taxonavigation}} == {{Grateloupia}} Species: ''[[Grateloupia gelatinosa]]'' == {{Int:Name}} == ''Grateloupia gelatinosa'' {{a|Albert Grunow|Grunow}} in Holmes, 1896: {{BHL|page/168122|258}}, {{BHL|page/168130|pl. 12: fig. 3}} * {{int:Type locality}}: ad litora Japoniae. * {{int:Type}}: Tanaka, nos. 7, 20, 37; Herb. Mus. Vindob. == {{Int:References}} == ==={{int:Primary references}}=== {{Holmes, 1896}} {{Taxonbar|from=Q50593625}} [[Category:Albert Grunow taxa]] tak2s4lj9zfew25xv6ytmuke3f0vf4z Prionitis imbricata 0 1081483 11322033 11284103 2026-10-21T15:12:19Z Thiotrix 61739 image added 11322033 wikitext text/x-wiki {{Image|Prionitis imbricata as Grateloupia imbricata in Holmes 1896.jpg}} == {{Int:Taxonavigation}} == {{Prionitis}} Species: ''[[Prionitis imbricata]]'' == {{Int:Name}} == ''Prionitis imbricata'' ({{a|Edward Morell Holmes|Holmes}}) {{a|Showe-Mei Lin|Showe M.Lin}} & {{a|Conxi Rodríguez-Prieto|Rodríguez-Prieto}}, 2024: 5, 8, figs. 26–41 * {{int:Type locality}}: Shimoda, Japan. * {{int:Type}}: Saida no. 46; March 1894: {{Rl|BM}} (BM000530484). ==={{int:Synonyms}}=== {{BA}} ** ''Grateloupia imbricata'' {{a|Edward Morell Holmes|Holmes}}, 1896: {{BHL|page/168119|255}}, {{BHL|page/168126|pl. 8: fig. 2}} == {{Int:References}} == ==={{int:Primary references}}=== {{Rodríguez-Prieto & Lin, 2025}} {{Holmes, 1896}} {{Taxonbar|from=Q141525963}} [[Category:Showe-Mei Lin taxa]] [[Category:Conxi Rodríguez-Prieto taxa]] put81xbc90j324svknz39knm07yrwph Grateloupia japonica 0 1081486 11322027 11284097 2026-10-21T14:54:25Z Thiotrix 61739 image added 11322027 wikitext text/x-wiki {{Image|Grateloupia japonica in Holmes 1896.jpg}} == {{Int:Taxonavigation}} == {{Grateloupia}} Species: ''[[Grateloupia japonica]]'' == {{Int:Name}} == ''Grateloupia japonica'' {{a|Albert Grunow|Grunow}} in Holmes, 1896: {{BHL|page/168123|259}}, {{BHL|page/168130|pl. XII, fig. 4}} * {{int:Type locality}}: ad litora Japoniae. * {{int:Type}}: Tanaka; Mus. Vindob. 25. == {{Int:References}} == ==={{int:Primary references}}=== {{Holmes, 1896}} {{Taxonbar|from=Q50593641}} [[Category:Albert Grunow taxa]] 0oosenxobbemsb8zw7mdtnnl2uncpjg Anuromyzus 0 1093311 11323009 11321287 2026-10-22T10:52:16Z Hiouf 2107144 11323009 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Macrosiphini}} Genus: {{gbr|Anuromyzus}} Species: {{sp|A|nuromyzus|acantholimonis}} {{splast|A|nuromyzus|cotoneasteris}} =={{int:Name}}== ''Anuromyzus'' {{a|Georgy Khristoforovich Shaposhnikov|Shaposhnikov}}, 1959 * {{int:Type species}}: ''Dysaphis cotoneasteris'' {{a|Georgy Khristoforovich Shaposhnikov|Shaposhnikov}}, 1959 =={{int:References}}== ==={{int:Additional references}}=== {{Kök, Barjadze & Stekolshchikov, 2026}} {{Taxonbar|from=Q18102451}} [[Category:Georgy Khristoforovich Shaposhnikov taxa]] 1a87b3i34gz9uoigidb8qvfixg1y4f0 José Alfredo Cerdeña 0 1137227 11322572 10953020 2026-10-22T03:43:42Z Neferkheperre 947633 /* 2022 */ 11322572 wikitext text/x-wiki '''José Alfredo Cerdeña''', Peruvian entomologist. * Museo de Historia Natural, Universidad Nacional de San Agustín, Calle Loreto 104, Cercado Arequipa, Peru * PPG Biologia Animal, Departamento de Zoologia, Instituto de Biociências, Universidade Federal do Rio Grande do Sul, Av. Bento Gonçalves, 9500, Porto Alegre, RS 91501-970, Brazil * E-mail: cerdenajoseal@yahoo.es {{Taxa authored}} {{publications}} ===2013=== * {{aut|Cerdeña, J.}} ; {{aut|Pyrcz, T.W.}} & {{aut|Villalobos, E.H.}}, 2013: Systematics, bionomics and zoogeography of high Andean pedaliodines. Part 14: Two new species of Pedaliodes Butler from the Huancabamba Deflection in southern Ecaudor and northern Peru (Lepidoptera: Nymphalidae: Satyrinae). ''Genus'' '''24 (2)''': 131–141. Full article: [http://www.biol.uni.wroc.pl/cassidae/Pyrcz%20et%20al_Andean%20pedaliodines%2014.pdf]. ===2014=== {{Cerdeña, Pyrcz & Zacca, 2014}} ===2017=== {{Zubek et al., 2017}} ===2020=== {{Cerdena et al., 2020}} {{Davis et al., 2020}} {{Farfán, Lamas & Cerdeña, 2020}} {{Palacios et al., 2020}} ===2021=== {{Bálint et al., 2021}} {{Mahecha-Jiménez et al., 2021a}} {{Farfan,Cadena,Balint,2021}} ===2022=== {{Cerdeña et al., 2022}} {{Farfán et al., 2022}} ===2024=== {{Pyrcz et al., 2024a}} {{Authority control}} {{DEFAULTSORT:Cerdeña, José Alfredo}} [[Category:Taxon authorities]] [[Category:Entomologists]] 47rap9ozwk0qa1hocyuq2e1yrg1vcgs Richard Harold Madden 0 1150441 11322239 11309290 2026-10-21T19:12:43Z Burmeister 9074 +1 11322239 wikitext text/x-wiki '''Richard Harold Madden''', U.S. paleontologist and anthropologist. * Department of Organismal Biology and Anatomy, Chicago University, Chicago, Illinois, United States. {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{inc}} ===1997=== {{Kay et al., 1997}} {{Kay et al., 1997|{{a|Richard Harold Madden|Madden, R.H.}}|A new toxodontid notoungulate|335–354}} {{Kay et al., 1997|{{a|Steven Carl Johnson|Johnson, S.C.}} & {{a|Richard Harold Madden|Madden, R.H.}}|Uruguaytheriine astrapotheres of tropical South America|355–382}} ===2014=== {{Carlini et al., 2014}} {{Vucetich et al., 2014}} ===2019=== {{Gelfo et al., 2019}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Madden, Richard Harold}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] [[Category:Anthropologists]] 4jl1cnalyburvj8b7ru2htvtnqtnhoa Erato (Eratoidae) 0 1162778 11322342 9968674 2026-10-21T20:50:50Z Isfisk 2639 11322342 wikitext text/x-wiki {{Image|Erato sandwicensis.jpg|''[[Erato sandwicensis]]''}} =={{int:Taxonavigation}}== {{Erato (Eratoidae)|Eratoidae}} Species: {{sp|E|rato|albescens}} † {{sp|E|rato|cypraeola}} {{sp|E|rato|edentula}} {{sp|E|rato|inhanbanensis}} {{sp|E|rato|nana}} {{sp|E|rato|oligostata}} {{sp|E|rato|panamensis}} {{sp|E|rato|praiensis}} {{sp|E|rato|sandwicensis}} † {{sp|E|rato|transiens}} {{splast|E|rato|voluta}} =={{int:Name}}== ''Erato'' {{a|Antoine Risso|Risso}}, 1826 Homonym: ''[[Erato (Asteraceae)|Erato]]'' (Asteraceae) =={{int:References}}== ==={{int:Primary references}}=== {{Risso, 1826a}} ==={{int:Links}}=== * {{WoRMS||137953}} {{Taxonbar|from=Q11843192}} [[Category:Antoine Risso taxa]] qt3rpxqxm2vp7geyamms8s9qecv2q8t Pogonus meridionalis 0 1216105 11322160 9997239 2026-10-21T18:05:55Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322160 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus meridionalis'' {{aut|Dejean}}, 1828 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14140984}} [[Category:Accepted species names]] [[Category:Extant species]] mk1z6o0rxrcffolpassjcfjq3k17imx Pogonus punctulatus 0 1216106 11322172 9997244 2026-10-21T18:09:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322172 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus punctulatus'' {{aut|Dejean}}, 1828 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141176}} [[Category:Accepted species names]] [[Category:Extant species]] dkv9mhme498chy9wfr0eb5awl2m4iij Pogonus turkestanicus 0 1216107 11322185 10260428 2026-10-21T18:12:50Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322185 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus turkestanicus'' {{aut|Lutshnik}}, 1935 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141381}} [[Category:Accepted species names]] [[Category:Extant species]] 6901m9azknwogq4ahptf2krssnu0mxf Pogonus matthewsi 0 1216131 11322159 9882544 2026-10-21T18:05:44Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322159 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus matthewsi'' {{aut|Baehr & Hudson}}, 2001 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14140968}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Eponyms of Eric G. Matthews]] r0p97h7fh5cle3f639retba77vggxx8 Pogonus micans 0 1216132 11322161 10260422 2026-10-21T18:06:07Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322161 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus micans'' {{aut|Chaudoir}}, 1842 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14140998}} [[Category:Accepted species names]] [[Category:Extant species]] aywe431bmmk7kemhkuyo5wa1opv0t7v Pogonus minutus 0 1216133 11322162 10260423 2026-10-21T18:06:16Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322162 wikitext text/x-wiki {{image|Pogonus senegalensis Dejean, 1831 (27002568115).png}} =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus minutus'' {{aut|Dejean}}, 1828 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141014}} [[Category:Accepted species names]] [[Category:Extant species]] 94mgc8g932ixgiu7gs7e0i387iziwqs Pogonus olivaceus 0 1216134 11322163 9997240 2026-10-21T18:07:19Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322163 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus olivaceus'' {{aut|Carret}}, 1903 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141046}} [[Category:Accepted species names]] [[Category:Extant species]] 26betl3we7kel3pfjqp7m6zvszw3mcs Pogonus ordossicus 0 1216135 11322164 10260424 2026-10-21T18:07:33Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322164 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus ordossicus'' {{aut|Semenov}}, 1889 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141062}} [[Category:Accepted species names]] [[Category:Extant species]] 11qj9wa6ybt939h2i99l2r2gi9l7x19 Pogonus orientalis 0 1216136 11322165 9997241 2026-10-21T18:07:49Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322165 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus orientalis'' {{aut|Dejean}}, 1828 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141077}} [[Category:Accepted species names]] [[Category:Extant species]] czpptmq4aug7yucuv8lrei6voar1ms3 Pogonus pallidipennis 0 1216137 11322166 9840289 2026-10-21T18:08:06Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322166 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus pallidipennis'' {{aut|Dejean}}, 1828 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Commonscat}} {{Taxonbar|from=Q14141093}} [[Category:Accepted species names]] [[Category:Extant species]] rjox8ryi8s85enre7pu8jb4ca9iyca7 Pogonus peisonis 0 1216138 11322167 9997242 2026-10-21T18:08:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322167 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus peisonis'' {{aut|Ganglbauer}}, 1891 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141110}} [[Category:Accepted species names]] [[Category:Extant species]] 4ymyohhnxig846fjuj81l7vdgn6e1bz Pogonus perovalis 0 1216139 11322169 9882545 2026-10-21T18:08:36Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322169 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus perovalis'' {{aut|Baehr & Hudson}}, 2001 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141126}} [[Category:Accepted species names]] [[Category:Extant species]] 2xuh67ox502t7nfqvrpd2fh3hwvjqq0 Pogonus pueli 0 1216140 11322170 10260425 2026-10-21T18:08:51Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322170 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus pueli'' {{aut|Lutshnik}}, 1935 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141142}} [[Category:Accepted species names]] [[Category:Extant species]] fswo3mfegm9gceqfge2c150dq2cm404 Pogonus punctifrons 0 1216141 11322171 9997243 2026-10-21T18:09:04Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322171 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus punctifrons'' {{aut|Reitter}}, 1908 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141158}} [[Category:Accepted species names]] [[Category:Extant species]] knuevyrot8u5ypklluoym0b4c4tdh23 Pogonus reticulatus 0 1216142 11322173 9997245 2026-10-21T18:09:52Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322173 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus reticulatus'' {{aut|Schaum}}, 1857 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141192}} [[Category:Accepted species names]] [[Category:Extant species]] 23zltfz1lnjhf2ty0khvuc6ubsbma14 Pogonus riparius 0 1216143 11322175 9997246 2026-10-21T18:10:02Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322175 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus riparius'' {{aut|Dejean}}, 1828 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141209}} [[Category:Accepted species names]] [[Category:Extant species]] 0g866lieowwmgbfgsxn8hykia3z7yo3 Pogonus rodolphi 0 1216144 11322176 10260426 2026-10-21T18:10:12Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322176 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus rodolphi'' {{aut|Alluaud}}, 1939 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141226}} [[Category:Accepted species names]] [[Category:Extant species]] f5qd5qh0p1lmt0bo8lyefwhs9hdoljx Pogonus saskiae 0 1216145 11322177 9882546 2026-10-21T18:10:26Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322177 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus saskiae'' {{aut|Baehr}}, 1997 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141241}} [[Category:Accepted species names]] [[Category:Extant species]] 9heaiqg5dw2l9vqgpnee2194fcyvji3 Pogonus sauteri 0 1216146 11322178 10260427 2026-10-21T18:10:36Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322178 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus sauteri'' {{aut|Jedlicka}}, 1956 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141256}} [[Category:Accepted species names]] [[Category:Extant species]] 0gbf7dz9u51tzcm0pgaywr29o4ldjqs Pogonus smaragdinus 0 1216148 11322179 9997248 2026-10-21T18:10:59Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322179 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus smaragdinus'' {{aut|Waltl}}, 1835 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141289}} [[Category:Accepted species names]] [[Category:Extant species]] 8c7nah3nrk27hrb5cplddjuzs52m9kz Pogonus submarginatus 0 1216149 11322180 9997249 2026-10-21T18:11:12Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322180 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus submarginatus'' {{aut|Reitter}}, 1908 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141304}} [[Category:Accepted species names]] [[Category:Extant species]] s4cpp6byx2sdew5w5pu3ijz84ei1qco Pogonus sumlini 0 1216150 11322181 9882547 2026-10-21T18:12:08Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322181 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus sumlini'' {{aut|Baehr}}, 1999 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141318}} [[Category:Accepted species names]] [[Category:Extant species]] nj8wv6l0oqllxjws0mh04zhk6vmxir9 Pogonus syriacus 0 1216151 11322182 9997250 2026-10-21T18:12:16Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322182 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus syriacus'' {{aut|Chaudoir}}, 1872 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141332}} [[Category:Accepted species names]] [[Category:Extant species]] 2q178c22nuqp8lc383y8cy8p2yikamj Pogonus texanus 0 1216152 11322183 9840290 2026-10-21T18:12:32Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322183 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus texanus'' {{aut|Chaudoir}}, 1868 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Commonscat}} {{Taxonbar|from=Q14141347}} [[Category:Accepted species names]] [[Category:Extant species]] 1fvkut1dlgxmdfqc6u0x24gy8crkghk Pogonus transfuga 0 1216153 11322184 9997251 2026-10-21T18:12:41Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322184 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus transfuga'' {{aut|Chaudoir}}, 1872 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141364}} [[Category:Accepted species names]] [[Category:Extant species]] 3zedcj150ggifup92048l31z8mplsgo Pogonus variabilis 0 1216154 11322186 9882548 2026-10-21T18:12:58Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322186 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus variabilis'' {{aut|Moore}}, 1991 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141396}} [[Category:Accepted species names]] [[Category:Extant species]] a7ajv51fynb6tecxw1grq6lh6tjejm1 Pogonus vicinus 0 1216155 11322187 9882549 2026-10-21T18:13:06Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322187 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus vicinus'' {{aut|Baehr & Hudson}}, 2001 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141412}} [[Category:Accepted species names]] [[Category:Extant species]] k1w3lyry7cczdjjnu8ho2ywqndjyofy Pogonus virens 0 1216156 11322188 6100726 2026-10-21T18:13:17Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322188 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus virens'' {{aut|Ménétriés}}, 1839 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] [[Category:Accepted species names]] [[Category: Extant species]] iez1zn81suhuk00sd0k2bvf195oi8b9 Pogonus zietzi 0 1216157 11322189 9882550 2026-10-21T18:13:27Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322189 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pogonus}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pogonus zietzi'' {{aut|Sloane}}, 1895 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14141429}} [[Category:Accepted species names]] [[Category:Extant species]] ag2vklwmerowt7bdkly7wqmiu8b6mc0 Polyrhanis oceanica 0 1216197 11322907 10260455 2026-10-22T09:45:19Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322907 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis oceanica'' ({{aut|Cassola}}, 1983) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154587}} [[Category:Accepted species names]] [[Category:Extant species]] og3p7j1y3v33860b67noj9554a3qlks Polyrhanis ancorifera 0 1216198 11322831 9997297 2026-10-22T09:16:03Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322831 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis ancorifera'' ({{aut|W.Horn}}, 1897) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154259}} [[Category:Accepted species names]] [[Category:Extant species]] hcfq8hlnf4rb7zriuhgferbih1na5j5 Polyrhanis arfakensis 0 1216199 11322832 9840299 2026-10-22T09:16:20Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322832 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis arfakensis'' {{aut|Matalin & Wiesner}}, 2008 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Commonscat}} {{Taxonbar|from=Q14154270}} [[Category:Accepted species names]] [[Category:Extant species]] j89az6zxmsw5488b6ksn1sm6e4isldi Polyrhanis aruana 0 1216200 11322833 9997298 2026-10-22T09:16:56Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322833 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis aruana'' ({{a|Dokhtouroff}}, 1887) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154282}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Vladimir Serghyeevich Dokhtouroff taxa]] 9079vye21nsqyibnfvzg3fzxfpezmmp Polyrhanis barbata 0 1216201 11322834 9997299 2026-10-22T09:17:42Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322834 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis barbata'' ({{aut|W.Horn}}, 1895) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154292}} [[Category:Accepted species names]] [[Category:Extant species]] 3ubwqhxoq7387iefb18vtjl7ki1hwdk Polyrhanis bennigsenia 0 1216202 11322835 9997300 2026-10-22T09:18:37Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322835 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis bennigsenia'' ({{aut|W.Horn}}, 1901) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154302}} [[Category:Accepted species names]] [[Category:Extant species]] 34ix1zl29s1t4zf77r3inf76iguh03h Polyrhanis boisduvali 0 1216203 11322836 9997301 2026-10-22T09:20:00Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322836 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis boisduvali'' ({{aut|W.Horn}}, 1896) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154314}} [[Category:Accepted species names]] [[Category:Extant species]] c8xmhfymfxkjsuze6qx9uj44udpqabu Polyrhanis cheesmanae 0 1216204 11322837 9997302 2026-10-22T09:20:13Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322837 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis cheesmanae'' ({{aut|Brouerius van Nidek}}, 1954) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154325}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Christiaan Matheus Constant Brouerius van Nidek taxa]] fdpetb1b5tb3jbkd0118pf2aivcjne4 Polyrhanis cristobalica 0 1216205 11322838 9997303 2026-10-22T09:20:45Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322838 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis cristobalica'' {{aut|Cassola}}, 1987 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154336}} [[Category:Accepted species names]] [[Category:Extant species]] gt331rp5tokb09lrbk6dqqxraa6jx5c Polyrhanis declivis 0 1216206 11322840 9997305 2026-10-22T09:22:14Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322840 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis declivis'' ({{aut|W.Horn}}, 1900) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154346}} [[Category:Accepted species names]] [[Category:Extant species]] or27xt1djswkwatwl80fxqdablsh25t Polyrhanis delicata 0 1216207 11322841 9997306 2026-10-22T09:22:26Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322841 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis delicata'' ({{aut|Bates}}, 1874) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154355}} [[Category:Accepted species names]] [[Category:Extant species]] axm1fmulp6qtupuzpw7mtgxsct2rhwa Polyrhanis denudata 0 1216208 11322842 9997307 2026-10-22T09:23:43Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322842 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis denudata'' ({{aut|W.Horn}}, 1935) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154367}} [[Category:Accepted species names]] [[Category:Extant species]] hub1k6lfbw4ws9wbfu8jvaqwbooa793 Polyrhanis deuvei 0 1216209 11322843 9997308 2026-10-22T09:23:55Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322843 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis deuvei'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154375}} [[Category:Accepted species names]] [[Category:Extant species]] qsbprksk8nnqm35dssewkftg4l9ztjk Polyrhanis excisilabris 0 1216210 11322844 9997309 2026-10-22T09:24:06Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322844 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis excisilabris'' ({{aut|W.Horn}}, 1905) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154379}} [[Category:Accepted species names]] [[Category:Extant species]] 75wnj84o3527pv953i9k3ntwl60u758 Polyrhanis fakfakensis 0 1216211 11322845 9997310 2026-10-22T09:24:28Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322845 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis fakfakensis'' {{aut|Cassola & Werner}}, 1996 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154389}} [[Category:Accepted species names]] [[Category:Extant species]] oru7b53x7hf6xxejmma8zc7ntavh2te Polyrhanis funerata 0 1216212 11322846 9997311 2026-10-22T09:24:53Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322846 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis funerata'' ({{aut|Boisduval}}, 1835) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154400}} [[Category:Accepted species names]] [[Category:Extant species]] p1p1xkvsi6be9qdh8icnbrltkegw3gw Polyrhanis gressitti 0 1216213 11322847 9997312 2026-10-22T09:25:11Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322847 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis gressitti'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154409}} [[Category:Accepted species names]] [[Category:Extant species]] osv2bi5sa9jonvbhr2xpsk3h52r29l5 Polyrhanis guineensis 0 1216214 11322848 9997313 2026-10-22T09:25:22Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322848 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis guineensis'' ({{aut|W.Horn}}, 1892) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154417}} [[Category:Accepted species names]] [[Category:Extant species]] ta7d2qxi03o3mhj654essfmw8nx60xc Polyrhanis holgeri 0 1216215 11322849 9997314 2026-10-22T09:25:32Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322849 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis holgeri'' {{aut|Schüle}}, 1998 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154428}} [[Category:Accepted species names]] [[Category:Extant species]] gd1uk32aqn6n8t4wrmvvqo8f7gn35fj Polyrhanis holynskii 0 1216216 11322850 9997315 2026-10-22T09:25:44Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322850 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis holynskii'' {{aut|Wiesner}}, 2000 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154439}} [[Category:Accepted species names]] [[Category:Extant species]] rg8elc0lozfpkw4fz1j3xh5ifqhqge4 Polyrhanis innocens 0 1216217 11322853 9997316 2026-10-22T09:29:57Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322853 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis innocens'' ({{aut|W.Horn}}, 1893) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154450}} [[Category:Accepted species names]] [[Category:Extant species]] 0nmrnhdggq5h16i4pginvg8480mcvqf Polyrhanis innocentior 0 1216218 11322854 9997318 2026-10-22T09:30:07Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322854 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis innocentior'' ({{aut|W.Horn}}, 1904) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154461}} [[Category:Accepted species names]] [[Category:Extant species]] ikra9fwh4od4tcujkr4aoaewoar6kjo Polyrhanis jo 0 1216219 11322855 9997319 2026-10-22T09:30:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322855 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis jo'' ({{aut|W.Horn}}, 1900) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154472}} [[Category:Accepted species names]] [[Category:Extant species]] 4jgjftwsitg71tu1ld1irya84xpgkbb Polyrhanis kampeni 0 1216220 11322856 9997320 2026-10-22T09:30:27Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322856 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis kampeni'' ({{aut|W.Horn}}, 1913) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154482}} [[Category:Accepted species names]] [[Category:Extant species]] 1hpbw6xyzx51khmvx93p9chtl37ra92 Polyrhanis kibbyi 0 1216221 11322899 9997321 2026-10-22T09:41:39Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322899 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis kibbyi'' {{aut|Cassola}}, 1987 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154494}} [[Category:Accepted species names]] [[Category:Extant species]] kjcp3mabvvowkog37x13q91jcd5w0lc Polyrhanis klynstrai 0 1216222 11322900 9997322 2026-10-22T09:41:53Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322900 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis klynstrai'' ({{aut|Brouerius van Nidek}}, 1954) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154503}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Christiaan Matheus Constant Brouerius van Nidek taxa]] 597g8xx0j4zx97ix0oyhdqhlf2wj5y4 Polyrhanis korupuncola 0 1216223 11322901 9997323 2026-10-22T09:43:04Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322901 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis korupuncola'' {{aut|Wiesner}}, 1999 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154516}} [[Category:Accepted species names]] [[Category:Extant species]] 2jvy5xd9az2gxxhalucw4ort6aooy91 Polyrhanis latipalpis 0 1216224 11322902 9997324 2026-10-22T09:43:21Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322902 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis latipalpis'' {{aut|Cassola}}, 1987 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154543}} [[Category:Accepted species names]] [[Category:Extant species]] hh7vmcmcye42imnwdddl1129xq4nwb2 Polyrhanis loriai 0 1216225 11322903 9997325 2026-10-22T09:43:30Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322903 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis loriai'' ({{aut|W.Horn}}, 1897) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154553}} [[Category:Accepted species names]] [[Category:Extant species]] 6jdtegoemveylysqm6mz4d53oo1rc70 Polyrhanis microgemmea 0 1216226 11322905 9997326 2026-10-22T09:44:33Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322905 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis microgemmea'' ({{aut|W.Horn}}, 1932) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154564}} [[Category:Accepted species names]] [[Category:Extant species]] 5wbx0kkmwc58onpszrhx1gkcwqren8l Polyrhanis neopupilligera 0 1216227 11322906 9997327 2026-10-22T09:44:48Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322906 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis neopupilligera'' {{aut|Cassola & Werner}}, 2001 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154575}} [[Category:Accepted species names]] [[Category:Extant species]] r83su4g5a3edu97mwri67st8q89hlsr Polyrhanis olthofi 0 1216228 11322908 10006793 2026-10-22T09:45:37Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322908 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis olthofi'' ({{aut|Brouerius van Nidek}}, 1959) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14667688}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Christiaan Matheus Constant Brouerius van Nidek taxa]] kffd0t3fn94udv8o1oy6hb1wt257b31 Polyrhanis paulae 0 1216229 11322909 9997328 2026-10-22T09:45:55Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322909 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis paulae'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154604}} [[Category:Accepted species names]] [[Category:Extant species]] 0uc0ttevq3g0edtmdd57rjnb7zo9hwf Polyrhanis perrinae 0 1216230 11322910 9997329 2026-10-22T09:46:07Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322910 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis perrinae'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154615}} [[Category:Accepted species names]] [[Category:Extant species]] e0q8iqx9875fxe0n7u7kz9fg0cv5d10 Polyrhanis placida 0 1216231 11322911 9997330 2026-10-22T09:46:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322911 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis placida'' ({{aut|Schaum}}, 1863) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154625}} [[Category:Accepted species names]] [[Category:Extant species]] ff5iqy3qjqo1n0mytfrjb370ktx8zct Polyrhanis plurigemmosa 0 1216232 11322912 9997332 2026-10-22T09:46:31Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322912 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis plurigemmosa'' ({{aut|W.Horn}}, 1937) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154636}} [[Category:Accepted species names]] [[Category:Extant species]] ot9r144eqs8m3vkm9kxja31pa4qyt69 Polyrhanis postmarginata 0 1216233 11322913 9997333 2026-10-22T09:46:44Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322913 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis postmarginata'' {{aut|Cassola}}, 1987 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154647}} [[Category:Accepted species names]] [[Category:Extant species]] 0a88fh911c63u0151rj453sw4auya82 Polyrhanis pseudopupillata 0 1216234 11322914 9997334 2026-10-22T09:46:53Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322914 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis pseudopupillata'' ({{aut|W.Horn}}, 1938) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154658}} [[Category:Accepted species names]] [[Category:Extant species]] lusgm57o0dxsg2re3a0ptoieyrrrkj8 Polyrhanis pseudopupilligera 0 1216235 11322915 9997335 2026-10-22T09:47:13Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322915 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis pseudopupilligera'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154668}} [[Category:Accepted species names]] [[Category:Extant species]] jilm89o8zjyqu1q6iuexmq3cvd3iulh Polyrhanis pupillata 0 1216236 11322916 9997336 2026-10-22T09:47:21Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322916 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis pupillata'' ({{aut|Schaum}}, 1863) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154678}} [[Category:Accepted species names]] [[Category:Extant species]] qos5bre1i3aalzn22e1cs8gj2t767ci Polyrhanis pupilligera 0 1216237 11322917 9997337 2026-10-22T09:48:10Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322917 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis pupilligera'' ({{aut|Chaudoir}}, 1865) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154689}} [[Category:Accepted species names]] [[Category:Extant species]] qc9zmncozmaxk9lv8z0942apt6pdkaz Polyrhanis ribbei 0 1216238 11322918 9997338 2026-10-22T09:48:23Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322918 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis ribbei'' ({{aut|W.Horn}}, 1895) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154700}} [[Category:Accepted species names]] [[Category:Extant species]] pyy5zfohp86rgnuu80925ny5os5sqbj Polyrhanis riedeli 0 1216239 11322919 9997339 2026-10-22T09:48:43Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322919 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis riedeli'' {{aut|Cassola & Werner}}, 1996 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154711}} [[Category:Accepted species names]] [[Category:Extant species]] 0ds6p6gw7pegykc6xglqlolu6ccwkrh Polyrhanis samuelsoni 0 1216240 11322920 9997340 2026-10-22T09:48:59Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322920 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis samuelsoni'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154723}} [[Category:Accepted species names]] [[Category:Extant species]] 5y7f68ytzfxnw1d8z6e2hjpkbax0x6k Polyrhanis sedlaceki 0 1216241 11322921 9997341 2026-10-22T09:49:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322921 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis sedlaceki'' {{aut|Cassola}}, 1987 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154733}} [[Category:Accepted species names]] [[Category:Extant species]] f924vl7enxz34fos5qjxg3c86xb3ui2 Polyrhanis toxopeusi 0 1216242 11322922 9997342 2026-10-22T09:49:23Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322922 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis toxopeusi'' ({{aut|Brouerius van Nidek}}, 1959) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154743}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Christiaan Matheus Constant Brouerius van Nidek taxa]] b7dy05enjscjksujoov2sx1fnhibd13 Polyrhanis tuberculifera 0 1216243 11322923 9997343 2026-10-22T09:49:32Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322923 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis tuberculifera'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154755}} [[Category:Accepted species names]] [[Category:Extant species]] jtn0t24v5crx04xzxoc0h9lrdxzxhe4 Polyrhanis vannideki 0 1216244 11322924 9997344 2026-10-22T09:49:41Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322924 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis vannideki'' {{aut|Cassola}}, 1986 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154766}} [[Category:Accepted species names]] [[Category:Extant species]] io9angbki18uwqpi05sixnjtd1e1sw6 Polyrhanis waigeoensis 0 1216245 11322925 9997346 2026-10-22T09:49:49Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322925 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis waigeoensis'' {{aut|Cassola & Werner}}, 2001 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14154796}} [[Category:Accepted species names]] [[Category:Extant species]] czrt6ttak5vc9l1f8ovuafyc9mcryvv Polyrhanis dabraensis 0 1216246 11322839 10188514 2026-10-22T09:21:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322839 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Polyrhanis}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Polyrhanis dabraensis'' {{aut|Matalin & Cassola}}, 2012 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940341}} [[Category:Accepted species names]] [[Category:Extant species]] grtw5kj5h788vq1a5w2atxufqglonvy Pristosia abaensis 0 1216313 11322945 10314037 2026-10-22T10:17:51Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322945 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia abaensis'' {{aut|Lassalle}}, 2012 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940371}} [[Category:Accepted species names]] [[Category:Extant species]] f3fgk5iagitkdchqhqxz9t09jneejy9 Pristosia acalathusoides 0 1216314 11322946 10314038 2026-10-22T10:18:01Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322946 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia acalathusoides'' {{aut|Lassalle}}, 2012 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940372}} [[Category:Accepted species names]] [[Category:Extant species]] 5u6qowykolzi5viu6mh454xwjxendxf Pristosia acraea 0 1216315 11322947 10260472 2026-10-22T10:18:11Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322947 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia acraea'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166353}} [[Category:Accepted species names]] [[Category:Extant species]] 5xmno6b5p5kp7wpqfel2zb0vwesxx1j Pristosia aeneocuprea 0 1216316 11322948 10260473 2026-10-22T10:18:20Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322948 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia aeneocuprea'' ({{aut|Fairmaire}}, 1886) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166360}} [[Category:Accepted species names]] [[Category:Extant species]] 4vcfrbdnnl11tmch04gsq77knyege20 Pristosia aeneola 0 1216317 11322949 10221766 2026-10-22T10:18:43Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322949 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia aeneola'' ({{aut|Bates}}, 1873) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166365}} [[Category:Accepted species names]] [[Category:Extant species]] bce5cnoxixelzaex5grjvt9vhy13ka0 Pristosia aereipennis 0 1216318 11322950 10260474 2026-10-22T10:18:52Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322950 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia aereipennis'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166370}} [[Category:Accepted species names]] [[Category:Extant species]] ss8oscnxyr5umya5hjk1vmpu6g869ml Pristosia alesi 0 1216319 11322956 10260475 2026-10-22T10:22:30Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322956 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia alesi'' ({{aut|Jedlicka}}, 1937) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166375}} [[Category:Accepted species names]] [[Category:Extant species]] bpcr1wtdbhntes0orr2gc79twvtyba4 Pristosia amaroides 0 1216320 11322958 10260476 2026-10-22T10:23:33Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322958 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia amaroides'' ({{aut|Putzeys}}, 1877) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166380}} [[Category:Accepted species names]] [[Category:Extant species]] 4kk07aocb1x7fuzd137lcxbvtzp7myg Pristosia aquilo 0 1216321 11322966 10260477 2026-10-22T10:27:18Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322966 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia aquilo'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166386}} [[Category:Accepted species names]] [[Category:Extant species]] smpyefdxiastmpjllezdh1iz3uclm3j Pristosia atrema 0 1216322 11322965 10239304 2026-10-22T10:27:08Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322965 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia atrema'' ({{aut|Andrewes}}, 1926) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q7245913}} [[Category:Accepted species names]] [[Category:Extant species]] aow52ffe4ci9kdbfp6qi3p1kvwd6g6k Pristosia bastai 0 1216323 11322967 10314039 2026-10-22T10:27:32Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322967 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia bastai'' {{aut|Lassalle}}, 2012 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940373}} [[Category:Accepted species names]] [[Category:Extant species]] g9ldpk5n28bw6gpi70z5q6xpupx83aj Pristosia braccata 0 1216324 11322969 10260478 2026-10-22T10:28:18Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322969 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia braccata'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166392}} [[Category:Accepted species names]] [[Category:Extant species]] pemmr6u49jlrixh30ymd03l2fkpfo8d Pristosia brancuccii 0 1216325 11322971 10260479 2026-10-22T10:28:35Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322971 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia brancuccii'' {{aut|Deuve, Lassalle & Queinnec}}, 1985 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166398}} [[Category:Eponyms of Michel Brancucci]] [[Category:Accepted species names]] [[Category:Extant species]] 73m7thnyd79b4t9x71g9gf86rjwaw0q Pristosia bulirschi 0 1216326 11322972 10314040 2026-10-22T10:28:44Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322972 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia bulirschi'' {{aut|Lassalle}}, 2009 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940374}} [[Category:Accepted species names]] [[Category:Extant species]] 568skpya5gnqmij5n3vyq18rdlbbivy Pristosia chambae 0 1216327 11322973 10260480 2026-10-22T10:29:12Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322973 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia chambae'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166403}} [[Category:Accepted species names]] [[Category:Extant species]] bhrzvghtdivxi9cl9p7l6algb4xi2ym Pristosia championi 0 1216328 11322974 10260481 2026-10-22T10:29:30Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322974 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia championi'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166407}} [[Category:Accepted species names]] [[Category:Extant species]] ffwietqv4t80c8z67yys3oz8c9rf6ze Pristosia chlorodes 0 1216329 11322977 10260482 2026-10-22T10:30:08Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322977 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia chlorodes'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166417}} [[Category:Accepted species names]] [[Category:Extant species]] gu9jbhw7o5tlft9fyp5617ldv4tw168 Pristosia clara 0 1216330 11322978 10260483 2026-10-22T10:30:18Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322978 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia clara'' ({{aut|Andrewes}}, 1924) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166424}} [[Category:Accepted species names]] [[Category:Extant species]] ksg95tkwmccrha2txqwdn8xkckayaiv Pristosia colasi 0 1216331 11322989 10314041 2026-10-22T10:35:55Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322989 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia colasi'' {{aut|Lassalle}}, 2012 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940375}} [[Category:Accepted species names]] [[Category:Extant species]] q80q2o56owh1mw8aky6a6s760pbf8ca Pristosia crenata 0 1216332 11322993 10260484 2026-10-22T10:36:35Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322993 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia crenata'' ({{aut|Putzeys}}, 1873) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166429}} [[Category:Accepted species names]] [[Category:Extant species]] fmiamqw4nn13sfz5727ojv0psff4zsu Pristosia cupreata 0 1216333 11322994 10260485 2026-10-22T10:36:45Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11322994 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia cupreata'' ({{aut|Jedlicka}}, 1940) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166436}} [[Category:Accepted species names]] [[Category:Extant species]] 998nzlonps6ywl1dacwx0yohfv608o8 Pristosia dahud 0 1216334 11323011 10260486 2026-10-22T11:06:35Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323011 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia dahud'' {{aut|Morvan}}, 1994 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166441}} [[Category:Accepted species names]] [[Category:Extant species]] ckpd2smy0megcq0w7fcx514ngcnuphc Pristosia delavayi 0 1216335 11323012 10260487 2026-10-22T11:06:44Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323012 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia delavayi'' ({{aut|Fairmaire}}, 1887) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166447}} [[Category:Accepted species names]] [[Category:Extant species]] fav3tcgrb3kkh94a1b9t1zmne611v3u Pristosia deqenensis 0 1216336 11323013 10314042 2026-10-22T11:07:13Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323013 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia deqenensis'' {{aut|Lassalle}}, 2009 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940376}} [[Category:Accepted species names]] [[Category:Extant species]] dtogrta3srzi0043i2vypeifmdgge5f Pristosia dodensis 0 1216337 11323014 10260488 2026-10-22T11:07:26Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323014 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia dodensis'' {{aut|Deuve, Lassalle & Queinnec}}, 1985 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166452}} [[Category:Accepted species names]] [[Category:Extant species]] nnfj16cwuo9hbkhbymd2qvm3uzk5kgm Pristosia dongziensis 0 1216338 11323016 10314043 2026-10-22T11:09:19Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323016 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia dongziensis'' {{aut|Lassalle}}, 2012 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940377}} [[Category:Accepted species names]] [[Category:Extant species]] 95xlmd1gzf0xsnt4gwnero1wfdagjc4 Pristosia elevata 0 1216339 11323017 10260489 2026-10-22T11:09:52Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323017 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia elevata'' {{aut|Lindroth}}, 1956 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166458}} [[Category:Accepted species names]] [[Category:Extant species]] tvae1ah40pxc28pusf63daqnrnqyer8 Pristosia falsicolor 0 1216340 11323018 10260490 2026-10-22T11:10:05Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323018 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia falsicolor'' ({{aut|Fairmaire}}, 1886) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166464}} [[Category:Accepted species names]] [[Category:Extant species]] ca3js5zdge7os5lhw9awt6lxue68j0a Pristosia flava 0 1216341 11323019 10260491 2026-10-22T11:10:13Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323019 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia flava'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166468}} [[Category:Accepted species names]] [[Category:Extant species]] 00g0absj3upxz09qb0s8q2kaj0kqe66 Pristosia glabella 0 1216342 11323020 10260492 2026-10-22T11:10:51Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323020 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia glabella'' {{aut|J.Schmidt & Hartmann}}, 2009 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166474}} [[Category:Accepted species names]] [[Category:Extant species]] dykfqj21yzdx0umqrtliqr0f7w0xciy Pristosia glacialis 0 1216343 11323021 10260493 2026-10-22T11:11:21Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323021 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia glacialis'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166479}} [[Category:Accepted species names]] [[Category:Extant species]] sf75cjob7s0e8754hi1qxa3flz6n504 Pristosia hauseri 0 1216344 11323022 10260494 2026-10-22T11:11:44Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323022 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia hauseri'' ({{aut|Jedlicka}}, 1931) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166484}} [[Category:Accepted species names]] [[Category:Extant species]] cchukp7tjn1k45y2hyad2ydfbzdqvxe Pristosia heinzi 0 1216345 11323023 10260495 2026-10-22T11:12:13Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323023 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia heinzi'' {{aut|F.Battoni}}, 1985 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166490}} [[Category:Accepted species names]] [[Category:Extant species]] [[Category:Fabrizio Battoni taxa]] p6p049a9z3vn66chkj7cxyt0y5d22od Pristosia heyrovskyi 0 1216346 11323024 10260496 2026-10-22T11:12:32Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323024 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia heyrovskyi'' ({{aut|Jedlicka}}, 1932) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166496}} [[Category:Accepted species names]] [[Category:Extant species]] tjo553bz85py4bdp1fm1n1n63j2jlqg Pristosia hweisiensis 0 1216347 11323025 10262612 2026-10-22T11:12:41Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323025 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia hweisiensis'' ({{aut|Jedlicka}}, 1937) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14671250}} [[Category:Accepted species names]] [[Category:Extant species]] as7cb60d0zzjwf3az101i1cbeoefc3w Pristosia illustris 0 1216348 11323026 10260497 2026-10-22T11:12:52Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323026 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia illustris'' ({{aut|Andrewes}}, 1947) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166507}} [[Category:Accepted species names]] [[Category:Extant species]] sdllq871q171mw1wvx0oiy246k7beie Pristosia impunctata 0 1216349 11323027 10260498 2026-10-22T11:13:01Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323027 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia impunctata'' {{aut|Sasakawa, Kim & Kubota}}, 2006 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166510}} [[Category:Accepted species names]] [[Category:Extant species]] rwlfbtxyh48yqqek8k3m3stnybpxwn0 Pristosia jedlickai 0 1216350 11323028 10260499 2026-10-22T11:13:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323028 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia jedlickai'' {{aut|Hovorka & Sciaky in Löbl & Smetana}}, 2003 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166516}} [[Category:Accepted species names]] [[Category:Extant species]] qanvgdw75ni72r4xt2usfv7n6fsf8t1 Pristosia jureceki 0 1216351 11323029 10260500 2026-10-22T11:13:22Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323029 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia jureceki'' ({{aut|Jedlicka}}, 1931) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166522}} [[Category:Accepted species names]] [[Category:Extant species]] 76zjbrxpk487zb6ch091cjy9l877ozo Pristosia lacerans 0 1216352 11323030 10260501 2026-10-22T11:13:36Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323030 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia lacerans'' ({{aut|Bates}}, 1889) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166529}} [[Category:Accepted species names]] [[Category:Extant species]] qb3o8hn17933ksp8uhpk7cfx578z1z4 Pristosia lateritia 0 1216353 11323031 10260502 2026-10-22T11:13:45Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323031 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia lateritia'' ({{aut|Fairmaire}}, 1886) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166534}} [[Category:Accepted species names]] [[Category:Extant species]] qttxcx48da1mzh72vt6sqdgdqt8rk6s Pristosia lateritioides 0 1216354 11323032 10314044 2026-10-22T11:13:53Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323032 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia lateritioides'' {{aut|Lassalle}}, 2009 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940379}} [[Category:Accepted species names]] [[Category:Extant species]] 8revb1gsprbh4dk4vpec0j08tfgsui1 Pristosia latistoma 0 1216355 11323033 10260503 2026-10-22T11:14:06Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323033 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia latistoma'' {{aut|Sasakawa, Kim & Kubota}}, 2006 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166541}} [[Category:Accepted species names]] [[Category:Extant species]] o3msfpgjhgr6cwxdio3mk0qh329p5sd Pristosia ledouxi 0 1216356 11323034 10260504 2026-10-22T11:14:15Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323034 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia ledouxi'' {{aut|Deuve, Lassalle & Queinnec}}, 1985 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166546}} [[Category:Accepted species names]] [[Category:Extant species]] a6yus3p9o7o8saae1csik2dr3behr0p Pristosia leptodes 0 1216357 11323035 10260505 2026-10-22T11:15:50Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323035 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia leptodes'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166551}} [[Category:Accepted species names]] [[Category:Extant species]] p29ss3odt4lmkfl6p57p6adn4jclaz0 Pristosia leurops 0 1216358 11323036 10260506 2026-10-22T11:16:01Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323036 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia leurops'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166575}} [[Category:Accepted species names]] [[Category:Extant species]] p6jfntxhu7s9i4lwhtopkcgq5vb51oq Pristosia litangensis 0 1216359 11323037 10314045 2026-10-22T11:16:10Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323037 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia litangensis'' {{aut|Lassalle}}, 2009 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940381}} [[Category:Accepted species names]] [[Category:Extant species]] f2a0kghzijeuh6wj82l5l3fiytltlpb Pristosia macra 0 1216360 11323039 10260507 2026-10-22T11:29:54Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323039 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia macra'' ({{aut|Andrewes}}, 1934) =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q14166581}} [[Category:Accepted species names]] [[Category:Extant species]] 53mm7e64gf9g8xr2bsvcvxw3mggdf19 Pristosia magna 0 1216361 11323040 10314046 2026-10-22T11:30:03Z Lavalizard101 2671355 removed [[Category:Accepted species name]]; added [[Category:Accepted species names]] using [[Help:Gadget-HotCat|HotCat]] 11323040 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pristosia}} Species: ''[[{{BASEPAGENAME}}]]'' =={{int:Name}}== ''Pristosia magna'' {{aut|Lassalle}}, 2009 =={{int:References}}== ==={{int:Links}}=== {{CarabCat}} [accessed on December 19, 2018] {{Taxonbar|from=Q59940382}} [[Category:Accepted species names]] [[Category:Extant species]] t2uxgz6lgu40rqd4iu5r3hgi60iqxc4 Sen 0 1258351 11322927 11294706 2026-10-22T09:51:58Z Tommy Kronkvist 596 Added tag for automatic localization. 11322927 wikitext text/x-wiki {{Refer|authority|'''Sen''' / '''Şen'''}} * [[Chen Sen Ding]] ({{int:born}} 1933, '''C.S.Ding'''), botanist * [[Fazıl Şen]], Turkish ichthyologist * [[Hao-Sen Li]], Chinese acarologist * [[Kai-Sen Ma]], Chinese entomologist * [[Nibedita Sen]], Indian herpetologist and ichthyologist * [[Sen Guo]], Chinese entomologist * [[Sen Li]], Chinese protozoologist * [[Sen Takenaka]], herpetologist * [[Şevket Şen]], Turkish paleontologist * [[Shu-Sen Gao]], entomologist * [[Shu-Sen Shu]], Chinese carcinologist * [[Souvik Sen]], Indian arachnologist * [[Tapan Sengupta]], Indian coleopterist * [[Zheng-Sen Yu]], Chinese ichthyologist {{Disambiguation|cat=people}} sc99bo6tklmawtqyw52hamn0kdoez7c Draconarius xishuiensis 0 1268589 11322700 10192974 2026-10-22T08:17:54Z PeterR 7354 Redirected page to [[Dolabocoelotes xishuiensis]] 11322700 wikitext text/x-wiki #REDIRECT: [[Dolabocoelotes xishuiensis]] [[Category:MHBU]] [[Category:Zhi-Sheng Zhang taxa]] [[Category:Ming-Sheng Zhu taxa]] [[Category:Xin-Ping Wang taxa]] lmmued7vph7g6exfwm8xl104842e1wc Draconarius jiangyongensis 0 1268856 11322734 10113773 2026-10-22T08:29:02Z PeterR 7354 Redirected page to [[Dolabocoelotes jiangyongensis]] 11322734 wikitext text/x-wiki #REDIRECT: [[Dolabocoelotes jiangyongensis]] 33idkyceubrbjk48duptu1i94xpn1uk Olea europaea subsp. europaea 0 1275258 11322265 10458277 2026-10-21T19:41:05Z RLJ 134478 11322265 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Olea sect. Olea}} Species: ''[[Olea europaea]]'' <br /> Subspecies: {{Taxit|Olea europaea subsp. europaea|linked=yes}} =={{int:Name}}== ''Olea europaea'' {{a|L.}} subsp. ''europaea'', {{AN}} ==={{int:Synonyms}}=== {{HET}} ** ''Olea officinarum'' {{a|Crantz}}, Inst. Rei Herb. 2: 379 (1766). ** ''Olea gallica'' {{a|Philip Miller|Mill.}}, Gard. Dict. ed. 8: n.º 1 (1768). ** ''Olea hispanica'' {{aut|Mill.}}, Gard. Dict. ed. 8: n.º 2 (1768). ** ''Olea sylvestris'' {{aut|Mill.}}, Gard. Dict. ed. 8: n.º 3 (1768). *** ''Olea europaea'' var. ''sylvestris'' ({{aut|Mill.}}) {{a|Lehr}}, Diss. Bot.-Med. Olea europaea: 20 (1779). *** ''Olea europaea'' subsp. ''sylvestris'' ({{aut|Mill.}}) {{a|Rouy}} ex {{a|Hegi}}, Ill. Fl. Mitt.-Eur. 5: 1936 (1927). ** ''Olea sativa'' {{a|Richard Weston|Weston}}, Bot. Univ. 1: 191 (1770). *** ''Olea europaea'' var. ''sativa'' ({{aut|Weston}}) {{aut|Lehr}}, Diss. Bot.-Med. Olea europaea: 21 (1779). *** ''Olea europaea'' subsp. ''sativa'' ({{aut|Weston}}) {{a|Arcang.}}, Comp. Fl. Ital.: 465 (1882). ** ''Olea cajetana'' {{a|Petagna}}, Inst. Bot. 2: 19 (1787). ** ''Olea europaea'' var. ''buxifolia'' {{a|Aiton}}, Hort. Kew. 1: 13 (1789). *** ''Olea buxifolia'' ({{aut|Aiton}}) {{aut|Steud.}}, Nomencl. Bot.: 562 (1821), {{NIL}} ** ''Olea europaea'' var. ''communis'' {{aut|Aiton}}, Hort. Kew. 1: 13 (1789). ** ''Olea europaea'' var. ''ferruginea'' {{aut|Aiton}}, Hort. Kew. 1: 13 (1789). *** ''Olea ferruginea'' ({{aut|Aiton}}) {{aut|Steud.}}, Nomencl. Bot.: 563 (1821). ** ''Olea europaea'' var. ''latifolia'' {{aut|Aiton}}, Hort. Kew. 1: 13 (1789). ** ''Olea europaea'' var. ''longifolia'' {{aut|Aiton}}, Hort. Kew. 1: 13 (1789). ** ''Olea europaea'' var. ''obliqua'' {{aut|Aiton}}, Hort. Kew. 1: 13 (1789). ** ''Olea lancifolia'' {{a|Moench}}, Methodus: 478 (1794). ** ''Olea amygdalina'' {{a|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea angulosa'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea atrorubens'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea craniomorpha'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea oblonga'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea praecox'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea racemosa'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea sphaerica'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea variegata'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea viridula'' {{aut|Gouan}}, Herbor. Montpellier: 264 (1796). ** ''Olea odorata'' {{a|Rozier}} ex {{a|Roem.}} & {{a|Josef August Schultes|Schult.}}, Syst. Veg., ed. 15 bis 1: 69 (1817). ** ''Olea regia'' {{aut|Rozier}} ex {{aut|Roem.}} & {{aut|Schult.}}, Syst. Veg., ed. 15 bis 1: 69 (1817). ** ''Olea oleaster'' {{a|Hoffmanns.}} & {{a|Johann Heinrich Friedrich Link|Link}}, Fl. Portug. 1: 387 (1820). *** ''Olea europaea'' var. ''oleaster'' ({{aut|Hoffmanns.}} & {{aut|Link}}) {{a|Alphonse Louis Pierre Pyrame de Candolle|A.DC.}} in {{aut|A.P.de Candolle}}, Prodr. 8: 284 (1844). *** ''Olea europaea'' subsp. ''oleaster'' ({{aut|Hoffmanns.}} & {{aut|Link}}) {{aut|Negodi}}, Arch. Bot. Sist. 3: 79 (1927). ** ''Olea alba'' {{a|Lam.}} ex {{a|Steud.}}, Nomencl. Bot.: 562 (1821). ** ''Olea communis'' {{aut|Steud.}}, Nomencl. Bot.: 562 (1821), pro syn. ** ''Olea latifolia'' (Aiton) {{aut|Steud.}}, Nomencl. Bot.: 563 (1821), {{NIL}} ** ''Olea longifolia'' (Aiton) {{aut|Steud.}}, Nomencl. Bot.: 563 (1821). ** ''Olea obliqua'' (Aiton) {{aut|Steud.}}, Nomencl. Bot.: 563 (1821). ** ''Olea polymorpha'' {{a|Risso}} ex {{aut|Schult.}}, Mant. 1: 75 (1822). ** ''Olea europaea'' var. ''alba'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 22 (1826). ** ''Olea europaea'' var. ''amygdalina'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 31 (1826). ** ''Olea europaea'' var. ''araban'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 9 (1826). ** ''Olea europaea'' var. ''atrorubens'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 26 (1826). ** ''Olea europaea'' var. ''atroviolacea'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 11 (1826). ** ''Olea europaea'' var. ''bifera'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 24 (1826). ** ''Olea europaea'' var. ''celina'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 9 (1826). ** ''Olea europaea'' var. ''columballa'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 18 (1826). ** ''Olea europaea'' var. ''conditiva'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 30 (1826). ** ''Olea europaea'' var. ''corniola'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 28 (1826). ** ''Olea europaea'' var. ''crispa'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 15 (1826). ** ''Olea europaea'' var. ''curvifolia'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 25 (1826). ** ''Olea europaea'' var. ''dulcis'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 29 (1826). ** ''Olea europaea'' var. ''fragilis'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 30 (1826). ** ''Olea europaea'' var. ''guttata'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 23 (1826). ** ''Olea europaea'' var. ''hermaphrodita'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 25 (1826). ** ''Olea europaea'' var. ''hispanica'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 31 (1826). ** ''Olea europaea'' var. ''laurifolia'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 21 (1826). ** ''Olea europaea'' var. ''macrocarpa'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 16 (1826). ** ''Olea europaea'' var. ''minima'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 12 (1826). ** ''Olea europaea'' var. ''nigerrima'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 32 (1826). ** ''Olea europaea'' var. ''oblonga'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 10 (1826). ** ''Olea europaea'' var. ''papillata'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 26 (1826). ** ''Olea europaea'' var. ''pendulina'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 17 (1826). ** ''Olea europaea'' var. ''pignola'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 20 (1826). ** ''Olea europaea'' var. ''polymorpha'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 16 (1826). ** ''Olea europaea'' var. ''praecox'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 11 (1826). ** ''Olea europaea'' var. ''racemosa'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 13 (1826). ** ''Olea europaea'' var. ''regalis'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 27 (1826). ** ''Olea europaea'' var. ''rostrata'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 28 (1826). ** ''Olea europaea'' var. ''rotundata'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 8 (1826). ** ''Olea europaea'' var. ''rubra'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 18 (1826). ** ''Olea europaea'' var. ''rufa'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 19 (1826). ** ''Olea europaea'' var. ''saurina'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 12 (1826). ** ''Olea europaea'' var. ''serotina'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 15 (1826). ** ''Olea europaea'' var. ''steudelii'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 21 (1826). ** ''Olea europaea'' var. ''umbraculata'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 14 (1826). ** ''Olea europaea'' var. ''uvaria'' {{aut|Risso}}, Hist. Nat. Prod. Eur. Mérid. 2: 14 (1826). ** ''Olea subrotunda'' {{a|Vilm.}}, Bon Jard. 1837: 417 (1837). ** ''Olea angustifolia'' {{aut|Raf.}}, Sylva Tellur.: 9 (1838), {{NIL}} ** ''Olea bifera'' {{aut|Raf.}}, Sylva Tellur.: 8 (1838). ** ''Olea brevifolia'' {{aut|Raf.}}, Sylva Tellur.: 9 (1838). ** ''Olea cayana'' {{aut|Raf.}}, Sylva Tellur.: 9 (1838). ** ''Olea argentata'' {{a|Clemente}} ex {{a|Steud.}}, Nomencl. Bot., ed. 2, 2: 209 (1841). ** ''Olea arolensis'' Clemente ex Steud., Nomencl. Bot., ed. 2, 2: 209 (1841), pro syn. ** ''Olea lorentii'' {{a|Hochst.}} in J.A.Lorent, Wanderungen: 322 (1845). ** ''Phillyrea lorentii'' {{a|Walp.}}, Repert. Bot. Syst. 6: 461 (1847). ** ''Olea europaea'' var. ''rissoi'' {{a|Alef.}}, Landw. Fl.: 265 (1866), {{NS}} ** ''Olea europaea'' var. ''strobilina'' {{aut|Alef.}}, Landw. Fl.: 263 (1866), {{NS}} ** ''Olea europaea'' var. ''violacea'' {{aut|Alef.}}, Landw. Fl.: 262 (1866), {{NS}} ** ''Olea europaea'' var. ''angustifolia'' {{a|Alleiz.}}, Bull. Soc. Hist. Nat. Afrique N. 12: 122 (1921). =={{int:References}}== ==={{int:Additional references}}=== {{Green, 2002}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} s6et8kvshbjukt0ltk0n21tdm4xtk6k Phaenacantha (Phaenacantha) 0 1335562 11322772 6308985 2026-10-22T08:47:26Z Hiouf 2107144 11322772 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Colobathristinae}} Genus: {{glast|Phaenacantha}}<br/> Subgenus: {{subglast|P|haenacantha|Phaenacantha}}</br> Species: {{sp|P|haenacantha|ambigua}} {{sp|P|haenacantha|antennalis}} {{sp|P|haenacantha|australiae}} {{sp|P|haenacantha|biroi}} {{sp|P|haenacantha|confusa}} {{sp|P|haenacantha|consobrina}} {{sp|P|haenacantha|conviva}} {{sp|P|haenacantha|dignota}} {{sp|P|haenacantha|discrepans}} {{sp|P|haenacantha|distincta}} {{sp|P|haenacantha|femoralis}} {{sp|P|haenacantha|gestroi}} {{sp|P|haenacantha|krugeri}} {{sp|P|haenacantha|marcida}} {{sp|P|haenacantha|mehelyi}} {{sp|P|haenacantha|pacifica}} {{sp|P|haenacantha|pectoralis}} {{sp|P|haenacantha|pilosella}} {{sp|P|haenacantha|sedula}} {{sp|P|haenacantha|soror}} {{sp|P|haenacantha|strenua}} {{sp|P|haenacantha|suturalis}} {{sp|P|haenacantha|trilineata}} {{splast|P|haenacantha|unicolor}} =={{int:Name}}== ''Phaenacantha'' {{a|Géza Horváth|Horváth}}, 1904: {{BHL|page/56376101|120}} =={{int:References}}== ==={{int:Primary references}}=== {{Horváth, 1904a}} [p. {{BHL|page/56376099|118}}, {{BHL|page/56376101|120}}] {{Commons}} {{Taxonbar}} [[Category:Géza Horváth taxa]] mauejwvkeu0d2qbqdzbg342xyz32eok Wilson Huanca-Mamani 0 1361450 11322564 10892611 2026-10-22T03:39:59Z Neferkheperre 947633 /* 2020 */ 11322564 wikitext text/x-wiki '''Wilson Huanca-Mamani''', entomologist * Faculty of Agronomic Sciences, Department of Agricultural Production, University of Tarapacá, Arica, Chile. {{Taxa authored}} {{publications}} ===2019=== {{Vargas-Ortiz et al., 2019}} ===2020=== {{Cerdena et al., 2020}} {{Cerdeña et al., 2022}} {{Davis et al., 2020}} {{Espinoza-Donoso et al., 2020}} {{Authority control}} {{DEFAULTSORT:Huanca-Mamani, Wilson}} [[Category:Taxon authorities]] [[Category:Entomologists]] 0zsdq1okbfr8h1kn4h3p0t92t0txxxs Template:FNA, 1997/doc 10 1370817 11322951 10785527 2026-10-22T10:19:07Z RLJ 134478 11322951 wikitext text/x-wiki {{Documentation subpage}} <!-- PLEASE ADD CATEGORIES AND INTERWIKIS AT THE BOTTOM OF THIS PAGE --> == Usage == The template can optionally be used for separate contributions of different authorship within this publication. In this case use as <code><nowiki>{{FNA, 1997|1|2|3|4}}</nowiki></code> ; Parameters&#58; * the first one: author(s) of contribution. * the second one: title of contribution. * the third one: page or range of pages of this contribution. * the fourth one: the FNA-ID from [www.efloras.org]. If the parameter is empty, it is automatically filled with the FNA-ID in Property 1727 of Wikidata, if there exists a record. Otherwise the link will lead to the title page of FNA. So for example, <code><nowiki>{{FNA, 1997|{{a|Kevin C. Nixon|Nixon, K.C.}}|Quercus|445–506|127839}}</nowiki></code> will produce the following reference: {{FNA, 1997|{{a|Kevin C. Nixon|Nixon, K.C.}}|Quercus|445–506|127839}} == Contributions == <code><nowiki>{{FNA, 1997|{{Wiersema}} & {{Hellq.}}|Nuphar|67–71|122507}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{FNA, 1997|{{Whittem.}}|Ranunculus|88–135|127971}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{a|Bryan Eugene Dutton|Dutton, B.E.}}, {{Keener}} & {{a|Bruce A. Ford|Ford, B.A.}}|Anemone|139–158|101733}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{Whittem.}}|Aquilegia|249-258|102388}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{K.R.Stern}}|Corydalis|348–355|108085}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{a|Susan L. Sherman-Broyles|Sherman-Broyles, S.L.|nolink=y}}|Ulmus|369–375|134116}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{a|Kevin C. Nixon|Nixon, K.C.}}|Quercus|445–506|127839}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{Whittem.}} & {{D.E.Stone}}|Juglans|425–428|116860}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{Furlow}}|Alnus|511–516|101157}}</nowiki></code><br/> <code><nowiki>{{FNA, 1997|{{Furlow}}|Ostrya|533–535|123370}}</nowiki></code><br/> <includeonly> <!-- CATEGORIES AND INTERWIKIS HERE, THANKS --> </includeonly> f0ia8a280k2v94i37i2bqrrzn6z6eeo Lepidopleurus Risso 0 1376991 11322352 10080043 2026-10-21T20:56:50Z Isfisk 2639 11322352 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Lepidopleurus}} Species: {{sp|L|epidopleurus|cajetanus}} {{sp|L|epidopleurus|gallicus}} {{splast|L|epidopleurus|pseudobenoisti}} =={{int:Name}}== ''Lepidopleurus'' {{a|Antoine Risso|Risso}}, 1826 =={{int:References}}== {{Risso, 1826a}} {{Colomba et al., 2022}} {{Dell'Angelo et al., 2018}} {{Taxonbar|from=Q2118778}} [[Category:Antoine Risso taxa]] {{DISPLAYTITLE:''Lepidopleurus'' <small>Risso</small>|noerror}} lm1sz1hwuoz85islhnolain4m8pwm1r Dmitry Evgenievich Shcherbakov 0 1391014 11322987 11128356 2026-10-22T10:33:50Z Hiouf 2107144 /* 2025 */ 11322987 wikitext text/x-wiki {{Image|Members of the Laboratory of Arthropods, Borissiak Palaeontological Institute, Russian Academy of Sciences, Moscow.JPG|[[Elena Dmitrievna Lukashevich]], [[Alexander Georgievich Ponomarenko]], Dmitry Evgenievich Shcherbakov and [[Alexey Semenovich Bashkuev]] in front of Mespelbrunn Castle in April 2013}} '''Dmitry Evgenievich Shcherbakov''' ({{int:born}} 1957), Russian (Soviet) entomologist. {{ru|Дмитрий Евгеньевич Щербаков}} * Borissiak Paleontological Institute, Russian Academy of Sciences, Moscow, Russia * E-mail: dshh@narod.ru {{IPNI standard form|Shcherb.}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1988=== {{Shcherbakov, 1988}} ===1995=== {{Shcherbakov, 1995}} {{Shcherbakov, Lukashevich & Blagoderov, 1995}} ===1999=== {{Lukashevich & Shcherbakov, 1999}} ===2000=== {{Shcherbakov, 2000}} {{Shcherbakov, 2000a}} {{Emeljanov & Shcherbakov, 2000}} ===2002=== {{Shcherbakov, 2002}} {{Shcherbakov & Popov, 2002}} ===2005=== {{Emeljanov & Shcherbakov, 2005}} ===2006=== {{Shcherbakov, 2006a}} ===2007=== {{Shcherbakov, 2007}} ===2009=== {{Shcherbakov et al., 2009}} {{Emeljanov & Shcherbakov, 2009}} ===2011=== * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2011. The alleged Triassic palaeodictyopteran is a member of Titanoptera. ''[[ISSN 1175-5326|Zootaxa]]'' 3044: 65–68. {{doi|10.11646/zootaxa.3044.1.4}} {{Access|closed}} [https://mapress.com/zootaxa/2011/f/z03044p068f.pdf Preview (PDF).] {{ResearchGate|281767435}} {{access|open}}. {{Emeljanov & Shcherbakov, 2011}} ===2013=== {{Shcherbakov, 2013}} ===2015=== {{Shcherbakov, 2015}} ===2019=== {{Shcherbakov & Azar, 2019}} ===2020=== {{Shcherbakov, 2020}} {{Shcherbakov, Drohojowska & Szwedo, 2020}} ===2023=== {{Shcherbakov & Ponomarenko, 2023}} ===2024=== * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2024. The Main Line of the Evolution of Articulata—From Polychaetes to Insects. ''[[ISSN 0031-0301|Paleontological Journal]]'' 57(11): 1286–1297 (2023). {{Doi|10.1134/S0031030123110126}} {{Access|closed}} ===2025=== {{Shcherbakov, 2025}} {{Shcherbakov, 2025a}} * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2025. The Headless Hexapod—on the Identity of ''Planocephalus aselloides'' {{aut|Scudder}}, 1885 (Trichoptera, Hydropsychidae; New Placement) from the Eocene of Florissant. ''[[ISSN 0013-8738|Entomological Review]]'' 104(4): 302–304 (2024). {{Doi|10.1134/S0013873824040079}} {{Access|closed}} * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2025. Ecdysozoa are descendants of Articulata. ''[[ISSN 1812-9250|Invertebrate Zoology]]'' 22(1): 168–177. {{Doi|10.15298/invertzool.22.1.11}} {{Access|broken}} [https://kmkjournals.com/upload/PDF/IZ/IZ%20Vol%2022/22_1_168_177_Shcherbakov_for_Inet.pdf PDF.] ===2026=== {{Shcherbakov, Emeljanov & Perkovsky, 2026}} {{Authority control}} {{DEFAULTSORT:Shcherbakov, Dmitry Evgenievich}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Palaeontologists]] [[Category:Paleobotanists]] eigc703tz9cs1bep79rkjmxn6b9xqn0 11323002 11322987 2026-10-22T10:43:57Z Hiouf 2107144 /* 2025 */ 11323002 wikitext text/x-wiki {{Image|Members of the Laboratory of Arthropods, Borissiak Palaeontological Institute, Russian Academy of Sciences, Moscow.JPG|[[Elena Dmitrievna Lukashevich]], [[Alexander Georgievich Ponomarenko]], Dmitry Evgenievich Shcherbakov and [[Alexey Semenovich Bashkuev]] in front of Mespelbrunn Castle in April 2013}} '''Dmitry Evgenievich Shcherbakov''' ({{int:born}} 1957), Russian (Soviet) entomologist. {{ru|Дмитрий Евгеньевич Щербаков}} * Borissiak Paleontological Institute, Russian Academy of Sciences, Moscow, Russia * E-mail: dshh@narod.ru {{IPNI standard form|Shcherb.}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1988=== {{Shcherbakov, 1988}} ===1995=== {{Shcherbakov, 1995}} {{Shcherbakov, Lukashevich & Blagoderov, 1995}} ===1999=== {{Lukashevich & Shcherbakov, 1999}} ===2000=== {{Shcherbakov, 2000}} {{Shcherbakov, 2000a}} {{Emeljanov & Shcherbakov, 2000}} ===2002=== {{Shcherbakov, 2002}} {{Shcherbakov & Popov, 2002}} ===2005=== {{Emeljanov & Shcherbakov, 2005}} ===2006=== {{Shcherbakov, 2006a}} ===2007=== {{Shcherbakov, 2007}} ===2009=== {{Shcherbakov et al., 2009}} {{Emeljanov & Shcherbakov, 2009}} ===2011=== * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2011. The alleged Triassic palaeodictyopteran is a member of Titanoptera. ''[[ISSN 1175-5326|Zootaxa]]'' 3044: 65–68. {{doi|10.11646/zootaxa.3044.1.4}} {{Access|closed}} [https://mapress.com/zootaxa/2011/f/z03044p068f.pdf Preview (PDF).] {{ResearchGate|281767435}} {{access|open}}. {{Emeljanov & Shcherbakov, 2011}} ===2013=== {{Shcherbakov, 2013}} ===2015=== {{Shcherbakov, 2015}} ===2019=== {{Shcherbakov & Azar, 2019}} ===2020=== {{Shcherbakov, 2020}} {{Shcherbakov, Drohojowska & Szwedo, 2020}} ===2023=== {{Shcherbakov & Ponomarenko, 2023}} ===2024=== * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2024. The Main Line of the Evolution of Articulata—From Polychaetes to Insects. ''[[ISSN 0031-0301|Paleontological Journal]]'' 57(11): 1286–1297 (2023). {{Doi|10.1134/S0031030123110126}} {{Access|closed}} ===2025=== {{Shcherbakov, 2025}} {{Shcherbakov, 2025a}} {{Shcherbakov, 2025b}} {{Shcherbakov, 2025c}} ===2026=== {{Shcherbakov, Emeljanov & Perkovsky, 2026}} {{Authority control}} {{DEFAULTSORT:Shcherbakov, Dmitry Evgenievich}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Palaeontologists]] [[Category:Paleobotanists]] jf33044z8o49y2tto3cmib037wg6ok2 Blommersia transmarina 0 1444234 11322328 9688871 2026-10-21T20:38:14Z Burmeister 9074 add+IUCN 11322328 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Blommersia}} Species: ''[[Blommersia transmarina]]'' =={{int:Name}}== ''Blommersia transmarina'' {{a|Frank Glaw|Glaw}}, {{a|Oliver Hawlitschek|Hawlitschek}}, {{a|Kathrin Glaw|Glaw}} & {{a|Miguel Vences|Vences}}, 2019: 3 * {{int:Holotype}}: {{rl|ZSM}} 677/2000 (field number FG/MV 2000-877), adult ♂, collected by F. Glaw and K. Glaw on 23 February 2000. * {{int:Type locality}}: “Mont Combani (12°48′26″S, 45°09′17″E, 300 m a.s.l.), Mayotte Island, French Overseas Department, Comoros Archipelago”. =={{int:References}}== ==={{int:Primary references}}=== {{Glaw et al., 2019}} ==={{int:Links}}=== * {{smallcaps|IUCN SSC Amphibian Specialist Group}}. 2021. {{IUCN|NT|152355660}}. The IUCN Red List of Threatened Species 2021: e.T152355660A152355673. {{doi|10.2305/IUCN.UK.2021-1.RLTS.T152355660A152355673.en}}. Accessed on 20 October 2026. {{Taxonbar}} [[Category:Frank Glaw taxa]] [[Category:Oliver Hawlitschek taxa]] [[Category:Kathrin Glaw taxa]] [[Category:Miguel Vences taxa]] [[Category:New species 2019]] i8mpnq6093dfxsom3xdxujv8j9erwnc Template:Dyar, 1891 10 1446485 11322174 8857969 2026-10-21T18:09:54Z FrankB157 2872707 11322174 wikitext text/x-wiki * {{a|Harrison Gray Dyar|Dyar, H.G.}} 1891. A revision of the species of ''[[Euclea]]'', ''[[Parasa]]'' and ''[[Packardia]]'', with notes on ''[[Adoneta]]'', ''[[Monoleuca]]'' and ''[[Varina ornata]]'' {{aut|Neum}}. ''[[ISSN 0002-8320|Transactions of the American Entomological Society]]'' 18(2/3): {{BHL|page/7524574|149–158}}. <includeonly>[[Template:Dyar, 1891|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> rf6gkcyr8jfys7s48um3gfcnjwdrswf Pleurococcus beijerinckii 0 1466744 11322929 7512002 2026-10-22T09:57:15Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322929 wikitext text/x-wiki #REDIRECT [[Chlorella vulgaris]] [[Category:Alexander Petrovich Artari taxa]] [[Category:Eponyms of Martinus Beijerinck]] 8g9qeg6s8ynsf6eryu35dtpun0lgnji Parachlorella beijerinckii 0 1471623 11322937 9946115 2026-10-22T10:00:32Z Thiotrix 61739 added [[Category:Eponyms of Martinus Beijerinck]] using [[Help:Gadget-HotCat|HotCat]] 11322937 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Parachlorella}} Species: ''[[Parachlorella beijerinckii]]'' =={{int:Name}}== ''Parachlorella beijerinckii'' {{a|Lothar Krienitz|Krienitz}}, {{a|Eberhard Heinz Hegewald|E.Hegewald}}, {{a|Dominik Hepperle|Hepperle}}, {{a|Volker A.R. Huss|V.Huss}}, {{a|Thomas Rohr|T.Rohr}} & {{a|Matthias Wolf|M.Wolf}}, 2004 * {{int:Type locality}}: Nonnenbach brook, a tributary of Tollensesee lake, Mecklenburg, West Pomerania, Germany. * {{int:Holotype}}: Herbarium at the Botanical Museum at Berlin, Dahlem, Germany B Algae 39866. Studied culture strain SAG 2046 isolated by {{aut|L. Krienitz}} in 1999. * Iconotype: Fig. 1. =={{int:References}}== {{Krienitz et al., 2004}}: 532, figs 1–6 * {{aut|Guiry, M.D. & Guiry, G.M.}} 2020. [http://www.algaebase.org/search/species/detail/?species_id=68172 ''Parachlorella beijerinckii'']. AlgaeBase. World-wide electronic publication, National University of Ireland, Galway. Accessed 2020-05-03. {{Taxonbar|from=Q69680080}} [[Category:Lothar Krienitz taxa]] [[Category:Eberhard Heinz Hegewald taxa]] [[Category:Dominik Hepperle taxa]] [[Category:Volker A.R. Huss taxa]] [[Category:Thomas Rohr taxa]] [[Category:Matthias Wolf taxa]] [[Category:Eponyms of Martinus Beijerinck]] 5hq42zr6mztbbx8g9ehkbm0jccie1dy Gregory Michael Mueller 0 1476840 11321996 11320625 2026-10-21T13:30:48Z Lichenes 716444 /* {{int:Publications}} */ 11321996 wikitext text/x-wiki '''Gregory M. Mueller''' (1953– ), American mycologist. {{IPNI standard form}} {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{He et al., 2019b}} {{Authority control}} {{DEFAULTSORT:Mueller, Gregory Michael}} [[Category:Taxon authorities]] [[Category:Mycologists]] hdz8mtuiqg48v2ljyj71ce1g2w4z80r 11322463 11321996 2026-10-21T22:43:55Z The editor 2345 2915305 11322463 wikitext text/x-wiki '''Gregory M. Mueller''' (1953– ), U.S. mycologist. {{IPNI standard form}} {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{He et al., 2019b}} {{Authority control}} {{DEFAULTSORT:Mueller, Gregory Michael}} [[Category:Taxon authorities]] [[Category:Mycologists]] ricp0kdhj9ahmkcuazy8eld56fzat0c Laurie R. Godfrey 0 1484813 11322446 9624498 2026-10-21T22:25:15Z Burmeister 9074 +1 11322446 wikitext text/x-wiki '''Laurie R. Godfrey''' (born August 27, 1945), US paleontologist and physical anthropologist. * Department of Anthropology, University of Massachusetts, Amherst, Massachusetts 01003, United States. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1990=== * {{a|Laurie R. Godfrey|Godfrey, L.R.}}, {{a|Elwyn LaVerne Simons|Simons, E.L.}}, {{a|Prithijit Chatrath|Chatrath, P.J.}}, {{a|Berthe Rakotosamimanana|Rakotosamimanana, B.}} 1990. A new fossil lemur (''Babakotia'', Primates) from northern Madagascar. ''Comptes Rendus de l'Académie des Sciences'' 2 81: 81–87. ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Godfrey, Laurie}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] [[Category:Anthropologists]] 58piu73pdgov7o128dh8vb1kciyqgad Mutarda 0 1493251 11322028 9542165 2026-10-21T15:01:06Z Andyboorman 251907 11322028 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mutarda}} Species: {{sp|M|utarda|allionii}} {{sp|M|utarda|arvensis}} {{sp|M|utarda|carinata}} {{splast|M|utarda|nigra}} =={{int:Name}}== ''Mutarda'' {{a|Bernh.}}, Syst. Verz. Erf.: 184 (1800). *Type species: ''Mutarda nigra'' ({{a|L.}}) {{aut|Bernh.}}, Syst. Verz. Erf.: 197 (1800). ==={{int:Synonyms}}=== {{HET}} **''Agrosinapis'' Fourr., Ann. Soc. Linn. Lyon, n.s., 16: 329 (1868) **''Melanosinapis'' K.F.Schimp. & Spenn. in F.C.L.Spenner, Fl. Friburg. 3: 944 (1829) **''Rhamphospermum'' Andrz. in W.S.J.von Besser, Enum. Pl. Volh.: 83 (1822) **''Sinapistrum'' Spach, Hist. Nat. Vég. 6: 343 (1838), {{NIHP}} =={{int:References}}== ==={{int:Primary references}}=== {{Bernhardi, 1800}} p. 184. ==={{int:Additional references}}=== {{Al-Shehbaz, 2021}} {{German, 2022}} ==={{int:Links}}=== {{POWO|2026|Oct.|21}} {{IPNI||2023|Dec. 3}} {{MBG|2023|Feb.|3}} {{vn |en=Mustards }} {{Taxonbar}} [[Category:Johann Jakob Bernhardi taxa]] rjqekm3qck6jihr6d2yv3v42l2tydah Coelotes sinuolatus 0 1495537 11322579 9961153 2026-10-22T03:47:12Z PeterR 7354 Redirected page to [[Cucullicoelotes sinuolatus]] 11322579 wikitext text/x-wiki #REDIRECT: [[Cucullicoelotes sinuolatus]] [[Category:MHBU]] [[Category:Zhi-Sheng Zhang taxa]] [[Category:Ming-Sheng Zhu taxa]] [[Category:Xin-Ping Wang taxa]] hzm5nb9xplvjdamjojrvx43696dxski Toxodontidae 0 1513400 11322235 11265350 2026-10-21T19:09:48Z Burmeister 9074 +Andinotoxodon 11322235 wikitext text/x-wiki {{Image|Toxodon.jpg|''[[Toxodon]]''}} =={{int:Taxonavigation}}== {{Toxodontidae}} Subfamiliae (5): †{{subfam|Altiplaniinae}} †{{subfam|Haplodontheriinae}}†{{subfam|Mixodontinae}} †{{subfam|Toxodontinae}} †{{subfamlast|Xotodontinae}} Genera ''incertae sedis'' (7): †{{g|Adinotherium}} †{{g|Andinotoxodon}} †{{g|Hyperoxotodon}} †{{g|Nesodon}} †{{g|Palyeidodon}} †{{g|Pericotoxodon}} †{{glast|Proadinotherium}} =={{int:Name}}== Toxodontidae {{a|Richard Owen|Owen}}, 1845 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Richard Owen|Owen, R.}} 1845a. Descriptive and illustrated catalogue of the fossil organic remains of Mammalia and Aves contained in the Museum of the Royal College of Surgeons of England. Pags. vii + 1-391, lams. 1-10. R. & J. E. Taylor, London. ==={{int:Additional references}}=== {{McKenna & Bell, 1997}} {{Armella & Deforel, 2026}} {{Taxonbar}} [[Category:Richard Owen taxa]] dvzkt7o636b0r52c9r1nqb9mid30dv0 William Gardner Smith 0 1522307 11322413 10814938 2026-10-21T22:05:17Z The editor 2345 2915305 11322413 wikitext text/x-wiki {{image}} '''William Gardner Smith''' (1866-1928), Scottish botanist, mycologist. {{IPNI standard form|Wm.G.Sm.}} =={{int:Publications}}== {{Authority control}} {{DEFAULTSORT:Smith, William Gardner}} [[Category:Taxon authorities]] [[Category:Mycologists]] oij8hdqt8ea9pp7atxp4nh55p300i0g Sonerila 0 1530740 11322533 10567441 2026-10-22T03:28:33Z Newone 3910 /* {{int:Taxonavigation}} */ 11322533 wikitext text/x-wiki {{image|Sonerila rotundifolia4.jpg|''[[Sonerila rotundifolia]]''}} =={{int:Taxonavigation}}== {{Sonerila}} Species: {{sp|S|onerila|affinis}} {{sp|S|oneila|aiensis}} {{sp|S|onerila|albiflora}} {{sp|S|onerila|amoena}} {{sp|S|onerila|anaimudica}} {{sp|S|onerila|anisophylla}} {{sp|S|onerila|annamica}} {{sp|S|onerila|arguta}} {{sp|S|onerila|arnottiana}} {{sp|S|onerila|arunachalensis}} {{sp|S|onerila|banthatensis}} {{sp|S|onerila|barbata}} {{sp|S|onerila|barnesii}} {{sp|S|onerila|beccariana}} {{sp|S|onerila|belluta}} {{sp|S|onerila|bensonii}} {{sp|S|onerila|betongensis}} {{sp|S|onerila|bicolor}} {{sp|S|onerila|biflora}} {{sp|S|onerila|bokorense}} {{sp|S|onerila|borneensis}} {{sp|S|onerila|bracteata}} {{sp|S|onerila|brandisiana}} {{sp|S|onerila|brunonis}} {{sp|S|onerila|buruensis}} {{sp|S|onerila|calaminthifolia}} {{sp|S|onerila|calophylla}} {{sp|S|onerila|calycula}} {{sp|S|onerila|cannanorensis}} {{sp|S|onerila|cantonensis}} {{sp|S|onerila|cardamomensis}} {{sp|S|onerila|celebica}} {{sp|S|onerila|clarkei}} {{sp|S|onerila|cordifolia}} {{sp|S|onerila|coriacea}} {{sp|S|onerila|corneri}} {{sp|S|onerila|costulata}} {{sp|S|onerila|crassicaulis}} {{sp|S|onerila|crassiuscula}} {{sp|S|onerila|daalenii}} {{sp|S|onerila|decipiens}} {{sp|S|onerila|devicolamensis}} {{sp|S|onerila|dharii}} {{sp|S|onerila|dongnathamensis}} {{sp|S|onerila|elatostemoides}} {{sp|S|onerila|elegans}} {{sp|S|onerila|elliptica}} {{sp|S|onerila|epeduncula}} {{sp|S|onerila|epiphytica}} {{sp|S|onerila|erecta}} {{sp|S|onerila|exacoides}} {{sp|S|onerila|finetii}} {{sp|S|onerila|firma}} {{sp|S|onerila|fraseri}} {{sp|S|onerila|froidevilleana}} {{sp|S|onerila|gadgiliana}} {{sp|S|onerila|gamblei}} {{sp|S|onerila|gardneri}} {{sp|S|onerila|gimlettei}} {{sp|S|onerila|glaberrima}} {{sp|S|onerila|glabricaulis}} {{sp|S|onerila|glabriflora}} {{sp|S|onerila|grandiflora}} {{sp|S|onerila|grandis}} {{sp|S|onerila|griffithii}} {{sp|S|onerila|guneratnei}} {{sp|S|onerila|hainanensis}} {{sp|S|onerila|harmandii}} {{sp|S|onerila|harveyi}} {{sp|S|onerila|helferi}} {{sp|S|onerila|heterophylla}} {{sp|S|onerila|hirsuta}} {{sp|S|onerila|hirsutula}} {{sp|S|onerila|hirtella}} {{sp|S|onerila|hirtiflora}} {{sp|S|onerila|hookeriana}} {{sp|S|onerila|impatiens}} {{sp|S|onerila|inaequalis}} {{sp|S|onerila|insignis}} {{sp|S|onerila|integrifolia}} {{sp|S|onerila|janakiana}} {{sp|S|onerila|junghuhniana}} {{sp|S|onerila|kanniyakumariana}} {{sp|S|onerila|khasiana}} {{sp|S|onerila|kinabaluensis}} {{sp|S|onerila|laeviuscula}} {{sp|S|onerila|lanceolata}} {{sp|S|onerila|lateritica}} {{sp|S|onerila|lecomtei}} {{sp|S|onerila|linearis}} {{sp|S|onerila|longipetiolata}} {{sp|S|onerila|macrantha}} {{sp|S|onerila|maculata}} {{sp|S|onerila|malabarica}} {{sp|S|onerila|margaritacea}} {{sp|S|onerila|metallica}} {{sp|S|onerila|microcarpa}} {{sp|S|onerila|minima}} {{sp|S|onerila|mollis}} {{sp|S|onerila|moluccana}} {{sp|S|onerila|montana}} {{sp|S|onerila|nagyana}} {{sp|S|onerila|nairii}} {{sp|S|onerila|nana}} {{sp|S|onerila|nayariana}} {{sp|S|onerila|neglecta}} {{sp|S|onerila|nemakadensis}} {{sp|S|onerila|neodriessenioides}} {{sp|S|onerila|nervulosa}} {{sp|S|onerila|nidularia}} {{sp|S|onerila|nodosa}} {{sp|S|onerila|nodulosa}} {{sp|S|onerila|nudiscapa}} {{sp|S|onerila|obliqua}} {{sp|S|onerila|obovata}} {{sp|S|onerila|pallida}} {{sp|S|onerila|papuana}} {{sp|S|onerila|parameswaranii}} {{sp|S|onerila|parviflora}} {{sp|S|onerila|pedunculata}} {{sp|S|onerila|pedunculosa}} {{sp|S|onerila|peninsularis}} {{sp|S|onerila|phuhinrongklaensis}} {{sp|S|onerila|phuphanensis}} {{sp|S|onerila|pilosula}} {{sp|S|onerila|plagiocardia}} {{sp|S|onerila|plenasicola}}<ref>[https://phytotaxa.mapress.com/pt/article/view/phytotaxa.781.2.1 ''Sonerila plenasicola'' (Melastomataceae, Sonerileae), a new species from Central Vietnam, with nomenclatural notes including a new combination, ''S. strigosa'', and the resurrection of ''S. yunnanensis''] Phytotaxa Issue: Vol. 781 No. 2: 21 Oct. 2026 pages 101-115{{DOI|10.11646/phytotaxa.781.2.1}}</ref> {{sp|S|onerila|primuloides}} {{sp|S|onerila|prostrata}} {{sp|S|onerila|pulchella}} {{sp|S|onerila|pulneyensis}} {{sp|S|onerila|pumila}} {{sp|S|onerila|purpurascens}} {{sp|S|onerila|pusilla}} {{sp|S|onerila|raghaviana}} {{sp|S|onerila|ramosa}} {{sp|S|onerila|repens}} {{sp|S|onerila|reptans}} {{sp|S|onerila|rheedei}} {{sp|S|onerila|rhombifolia}} {{sp|S|onerila|robusta}} {{sp|S|onerila|rotundifolia}} {{sp|S|onerila|rubro-villosa}} {{sp|S|onerila|rudis}} {{sp|S|onerila|rufidula}} {{sp|S|onerila|ruttenii}} {{sp|S|onerila|ruttneri}} {{sp|S|onerila|sadasivanii}} {{sp|S|onerila|sahyadrica}} {{sp|S|onerila|saxosa}} {{sp|S|onerila|scapigera}} {{sp|S|onerila|secunda}} {{sp|S|onerila|silvatica}} {{sp|S|onerila|speciosa}} {{sp|S|onerila|spectabilis}} {{sp|S|onerila|squarrosa}} {{sp|S|onerila|sreenarayaniana}} {{sp|S|onerila|stricta}} {{sp|S|onerila|subumbellata}} {{sp|S|onerila|sulpheyi}} {{sp|S|onerila|succulenta}} {{sp|S|onerila|suffruticosa}} {{sp|S|onerila|talbotii}} {{sp|S|onerila|tenasserimensis}} {{sp|S|onerila|tenera}} {{sp|S|onerila|tenue}} {{sp|S|onerila|tenuifolia}} {{sp|S|onerila|tetraptera}} {{sp|S|onerila|tinnevelliensis}} {{sp|S|onerila|tomentella}} {{sp|S|onerila|travancorica}} {{sp|S|onerila|trianae}} {{sp|S|onerila|triflora}} {{sp|S|onerila|trinervis}} {{sp|S|onerila|tuberculifera}} {{sp|S|onerila|tuberosa}} {{sp|S|onerila|urceolata}} {{sp|S|onerila|vatphouensis}} {{sp|S|onerila|veldkampiana}} {{sp|S|onerila|velutina}} {{sp|S|onerila|versicolor}} {{sp|S|onerila|verticillata}} {{sp|S|onerila|victoriae}} {{sp|S|onerila|villosa}} {{sp|S|onerila|violifolia}} {{sp|S|onerila|virgata}} {{sp|S|onerila|wallichii}} {{sp|S|onerila|wightiana}} {{sp|S|onerila|woodii}} {{sp|S|onerila|wynaadensis}} {{splast|S|onerila|zeylanica}} =={{int:Name}}== ''Sonerila'' {{a|Roxb.}}, Fl. Ind. (Carey & Wallich ed.) 1: 180. (1820), [[nom. et typ. cons.]] *Type species: ''Sonerila maculata'' {{aut|Roxb.}}, Fl. Ind. (Carey & Wallich ed.) 1: 180. (1820) ==={{int:Synonyms}}=== {{HET}} **''Cassebeeria'' Dennst. ex Kuntze {{Nadi| * '''Continental: Asia-tropical ''' *^* '''Regional: Tropical Asia''' *** Assam, Bangladesh, Borneo, Cambodia, China South-Central, China Southeast, East Himalaya, Hainan, India, Jawa, Laos, Malaya, Maluku, Myanmar, Nepal, New Guinea, Philippines, Sri Lanka, Sulawesi, Sumatera, Thailand, Tibet, Vietnam, West Himalaya }} =={{int:References}}== ==={{int:Primary references}}=== *{{aut|Roxburgh, W.}} 1820. ''[[Flora Indica; or Descriptions of Indian Plants]]'' 1: {{BHL|page/787457|180}}. ==={{int:Additional references}}=== * Roskov Y. & al. (eds.) (2018). Species 2000 & ITIS Catalogue of Life Naturalis, Leiden, the Netherlands. ==={{int:Links}}=== *{{PWO|2020|Sept.|24}} *{{IPNI||2020|Sept. 24}} *{{MBG|2020|Sept.|24}} =={{int:Vernacular names}}== {{VN |fa= سونریلا |fi=Korulehdet |vi=Chi Sơn linh |zh= 蜂斗草属 }} {{taxonbar}} {{Commonscat}} [[category:William Roxburgh taxa]] 3orn1rapmv6ltiqn9mj5cfj9zuw0hp6 Andrew W. Wilson 0 1536884 11321994 10399124 2026-10-21T13:24:14Z Lichenes 716444 11321994 wikitext text/x-wiki {{image}} '''Andrew W. Wilson''' ([[fl.]] 2004), mycologist. {{IPNI standard form}} {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Wilson, Andrew W.}} [[Category:Taxon authorities]] [[Category:Mycologists]] bf4ce7h0nqs9sy4zhl2zfix5q8arjbw Matthew Robert Borths 0 1542163 11322444 11283550 2026-10-21T22:24:41Z Burmeister 9074 +1 11322444 wikitext text/x-wiki {{Image}} '''Matthew Robert Borths''' ([[Floruit|fl.]] 2015), U.S. paleontologist. * Duke Lemur Center, Duke University, Durham, North Carolina 27705, United States. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2015=== {{Solé et al., 2015}} ===2016=== {{Borths, Holroyd & Seiffert, 2016}} ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Borths, Matthew Robert}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] d9uowjmb66ozgcxqoqt2vbqjx86f2g1 Ruben Arthur Stirton 0 1549493 11322500 11293550 2026-10-22T01:06:28Z The editor 2345 2915305 /* Publications */ 11322500 wikitext text/x-wiki {{image}} '''Ruben Arthur Stirton''' (1901–1966), US paleontologist. {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{Inc}} ===1930=== {{Stirton, 1930}} ===1947=== {{Stirton, 1947}} ===1953=== {{Stirton, 1953}} ===1955=== {{Stirton, 1955}} ===1961=== {{Burt & Stirton, 1961}} ===1964=== {{Stirton & Rensberger, 1964}} ===1967=== {{Stirton, Tedford & Woodburne, 1967}} {{Authority control}} {{DEFAULTSORT:Stirton, Ruben Arthur}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 4uf5be2w7o83ml7yp4b9700cqxc0h3a Template:Cite Q 10 1557106 11322044 8089507 2020-12-14T23:49:02Z en>RexxS 0 test 11322044 wikitext text/x-wiki <includeonly>{{#invoke:Cite Q|cite_q|qid={{{1|{{{qid|}}}}}} }}</includeonly><noinclude> {{documentation}} </noinclude> 31r8c6dbxzs4zvgqeap88a2j8vlm85g 11322045 11322044 2020-12-14T23:51:13Z en>RexxS 0 Undid revision 994291744 by [[Special:Contributions/RexxS|RexxS]] ([[User talk:RexxS|talk]]) rv test 11322045 wikitext text/x-wiki <includeonly>{{#invoke:Cite Q|cite_q|qid={{{1}}} }}</includeonly><noinclude> {{documentation}} </noinclude> 024pb13zlk0gfuvqbp5bpz3oj73l6u4 11322046 11322045 2021-08-21T09:26:39Z en>Mike Peel 0 ah, no, bug was here not in the module - enabling qid parameter 11322046 wikitext text/x-wiki <includeonly>{{#invoke:Cite Q|cite_q|qid={{{1|{{{qid|}}}}}} }}</includeonly><noinclude> {{documentation}} </noinclude> 31r8c6dbxzs4zvgqeap88a2j8vlm85g 11322047 11322046 2026-10-21T16:11:38Z Pigsonthewing 1048 3 revisions imported from [[:en:Template:Cite_Q]] 11322046 wikitext text/x-wiki <includeonly>{{#invoke:Cite Q|cite_q|qid={{{1|{{{qid|}}}}}} }}</includeonly><noinclude> {{documentation}} </noinclude> 31r8c6dbxzs4zvgqeap88a2j8vlm85g Template:Cite Q/doc 10 1557108 11322130 10743261 2026-10-21T16:19:57Z Pigsonthewing 1048 /* Examples */ ce 11322130 wikitext text/x-wiki {{Documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Lua|Module:Cite Q|Module:WikidataIB|Module:Wd|Module:String}} {{Uses Wikidata}} == Usage == A wrapper for {{Tl|Citation}}, which calls available values from [[Wikidata]]. An example of an article using this template for ''all'' of its references is [[:en:South Pole Telescope]]; an example using Harvard style citations is [[:en:Suffix automaton]]. By default, if there are more than eight author names, the template displays three, followed by "et al". This can be changed using {{para|display-authors}}; using that parameter with no value displays them all. The same applies to multiple editors - see the test-case pages. === Future developments === * Once robust the functionality should be merged into {{Tl|Citation}} * Eventually, each signed-in reader should be able to set, under their "Preferences", the style in which they wish to see citations rendered. * We should have a [[:mediawiki:|Global templates|lobal template repository]], so the code can be used by multiple wikis, without having to manually copy it after every update.g ===Parameters === * {{para|1}} = Wikidata QID for the article Additionally, any named parameter used in {{tl|citation}} may be entered and will overwrite the value in Wikidata. Using such parameters, with a value of <code>unset</code>, will suppress display of data from Wikidata. === Blank === :<code><nowiki><ref name="">{{Cite Q| XXQIDXX }}</ref></nowiki></code> === Reference naming === For ease of use, you may wish to name your references to reflect the cited work, for example: :<code><nowiki><ref name="Williams-2010">{{Cite Q|Q15625490}}</ref></nowiki></code> ===Parameter / entity map=== This section lists where each of the template's supported parameters gets its data. P734}} {{Columns-start}} ====Bibliographic parameters==== *{{para|author''n''}} = {{Wikidata entity link|P50}}; {{Wikidata entity link|P2093}} *{{para|chapter}} = {{Wikidata entity link|P792}} *{{para|date}} = {{Wikidata entity link|P577}} *{{para|editor''n''}} = {{Wikidata entity link|P98}} *{{para|issue}} = {{Wikidata entity link|P433}} *{{para|journal}} = {{Wikidata entity link|P1433}} *{{para|language}} = {{Wikidata entity link|P407}} *{{para|others}} = {{Wikidata entity link|P86}}, {{Wikidata entity link|P110}} *{{para|place}} = {{Wikidata entity link|P291}} *{{para|publisher}} = {{Wikidata entity link|P123}} *{{para|series}} = {{Wikidata entity link|P179}} *{{para|title}} = {{Wikidata entity link|P1476}} *{{para|title}} = Wikidata label *{{para|url}} = {{Wikidata entity link|P953}}, {{Wikidata entity link|P856}}, {{Wikidata entity link|P2699}} *{{para|volume}} = {{Wikidata entity link|P478}} {{Column}} ====Identifier parameters==== *{{para|arxiv}} = {{Wikidata entity link|P818}} *{{para|bibcode}} = {{Wikidata entity link|P819}} *{{para|biorxiv}} = {{Wikidata entity link|P3951}} *{{para|citeseerx}} = {{Wikidata entity link|P3784}} *{{para|doi}} = {{Wikidata entity link|P356}} *{{para|hdl}} = {{Wikidata entity link|P1184}} *{{para|isbn}} = {{Wikidata entity link|P212}} *{{para|isbn}} = {{Wikidata entity link|P957}} *{{para|ismn}} = {{Wikidata entity link|P1208}} *{{para|jstor}} = {{Wikidata entity link|P888}} *{{para|lccn}} = {{Wikidata entity link|P1144}} *{{para|mr}} = {{Wikidata entity link|P889}} *{{para|oclc}} = {{Wikidata entity link|P243}} *{{para|ol}} = {{Wikidata entity link|P648}} *{{para|osti}} = {{Wikidata entity link|P3894}} *{{para|pmc}} = {{Wikidata entity link|P932}} *{{para|pmid}} = {{Wikidata entity link|P698}} *{{para|ssrn}} = {{Wikidata entity link|P893}} {{Columns-end}} === Examples === ;<code><nowiki>{{Cite Q|Q15625490}}</nowiki></code> :{{Cite Q|Q15625490|}} ;<code><nowiki>{{Cite Q|Q15625490|page=42}}</nowiki></code> :{{Cite Q|Q15625490|page=42}} ;<code><nowiki>{{Cite Q|Q15625490|access-date=18 May 2017}}</nowiki></code> :{{Cite Q|Q15625490|access-date=18 May 2017}} ;<code><nowiki>{{Cite Q|Q15625490|quote=lorem ipsum}}</nowiki></code> :{{Cite Q|Q15625490|quote=lorem ipsum}} ;<code><nowiki>{{Cite Q|Q25766745}}</nowiki></code> :{{Cite Q|Q25766745}} ;<code><nowiki>{{Cite Q|Q25766745 |chapter=The Final Cut}}</nowiki></code> (with chapter specified) :{{Cite Q|Q25766745 |chapter=The Final Cut}} ;<code><nowiki>{{Cite Q|Q25766745 |pages=48-52}}</nowiki></code> (with pages) :{{Cite Q|Q25766745 |pages=48-52}} ;<code><nowiki>{{Cite Q|Q15625490|access-date=18 May 2017}}</nowiki></code> :{{Cite Q|Q15625490|access-date=18 May 2017}} ;<code><nowiki>{{Cite Q|Q25766745|mode=cs1}}</nowiki></code> :{{Cite Q|Q25766745|mode=cs1}} ;<code><nowiki>{{Cite Q|Q25766745|mode=cs2}}</nowiki></code> :{{Cite Q|Q25766745|mode=cs2}} ;<code><nowiki>{{Cite Q|Q25766745|author-mask=1}}</nowiki></code> :{{Cite Q|Q25766745|author-mask=1}} For additional examples, see [[:en:Template:Cite Q/testcases|testcases]]. == Module:Wd == [[Module:Wd]] can automatically cause this template to be invoked, e.g., ;<code><nowiki>{{Wikidata|references|raw|Q2978|P2046}}</nowiki></code> :{{Wikidata|references|raw|Q2978|P2046}} currently causes the following to be invoked: ;<code><nowiki>{{Cite Q|Q15707237|pages=242}}</nowiki></code> :{{Cite Q|Q15707237|pages=242}} because an {{wikidata entity link|P2046}} statement on {{wikidata entity link|Q2978}} is referenced to be {{wikidata entity link|P248}} {{wikidata entity link|Q15707237}} with {{wikidata entity link|P304}} = 242. {{hatnote|See [[d:Q2978#P2046]]}} == Issues == See [[:en:Template:Cite Q/doc#Issues]] <includeonly>{{sandbox other|| <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Templates that wrap Citation]] [[Category:Templates using data from Wikidata]] }}</includeonly> t7ag9q2jqcwkxesrucxapejnu9gnn1h 11322153 11322130 2026-10-21T17:22:54Z Pigsonthewing 1048 see [[:en:Template:Cite Q]] 11322153 wikitext text/x-wiki {{Documentation subpage}} <!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) --> {{Lua|Module:Cite Q|Module:WikidataIB|Module:Wd|Module:String}} {{Uses Wikidata}} '''For latest changes and technical discussion, see [[:en:Template:Cite Q]].''' == Usage == A wrapper for {{Tl|Citation}}, which calls available values from [[Wikidata]]. An example of an article using this template for ''all'' of its references is [[:en:South Pole Telescope]]; an example using Harvard style citations is [[:en:Suffix automaton]]. By default, if there are more than eight author names, the template displays three, followed by "et al". This can be changed using {{para|display-authors}}; using that parameter with no value displays them all. The same applies to multiple editors - see the test-case pages. === Future developments === * Once robust the functionality should be merged into {{Tl|Citation}} * Eventually, each signed-in reader should be able to set, under their "Preferences", the style in which they wish to see citations rendered. * We should have a [[:mediawiki:|Global templates|lobal template repository]], so the code can be used by multiple wikis, without having to manually copy it after every update.g ===Parameters === * {{para|1}} = Wikidata QID for the article Additionally, any named parameter used in {{tl|citation}} may be entered and will overwrite the value in Wikidata. Using such parameters, with a value of <code>unset</code>, will suppress display of data from Wikidata. === Blank === :<code><nowiki><ref name="">{{Cite Q| XXQIDXX }}</ref></nowiki></code> === Reference naming === For ease of use, you may wish to name your references to reflect the cited work, for example: :<code><nowiki><ref name="Williams-2010">{{Cite Q|Q15625490}}</ref></nowiki></code> ===Parameter / entity map=== This section lists where each of the template's supported parameters gets its data. P734}} {{Columns-start}} ====Bibliographic parameters==== *{{para|author''n''}} = {{Wikidata entity link|P50}}; {{Wikidata entity link|P2093}} *{{para|chapter}} = {{Wikidata entity link|P792}} *{{para|date}} = {{Wikidata entity link|P577}} *{{para|editor''n''}} = {{Wikidata entity link|P98}} *{{para|issue}} = {{Wikidata entity link|P433}} *{{para|journal}} = {{Wikidata entity link|P1433}} *{{para|language}} = {{Wikidata entity link|P407}} *{{para|others}} = {{Wikidata entity link|P86}}, {{Wikidata entity link|P110}} *{{para|place}} = {{Wikidata entity link|P291}} *{{para|publisher}} = {{Wikidata entity link|P123}} *{{para|series}} = {{Wikidata entity link|P179}} *{{para|title}} = {{Wikidata entity link|P1476}} *{{para|title}} = Wikidata label *{{para|url}} = {{Wikidata entity link|P953}}, {{Wikidata entity link|P856}}, {{Wikidata entity link|P2699}} *{{para|volume}} = {{Wikidata entity link|P478}} {{Column}} ====Identifier parameters==== *{{para|arxiv}} = {{Wikidata entity link|P818}} *{{para|bibcode}} = {{Wikidata entity link|P819}} *{{para|biorxiv}} = {{Wikidata entity link|P3951}} *{{para|citeseerx}} = {{Wikidata entity link|P3784}} *{{para|doi}} = {{Wikidata entity link|P356}} *{{para|hdl}} = {{Wikidata entity link|P1184}} *{{para|isbn}} = {{Wikidata entity link|P212}} *{{para|isbn}} = {{Wikidata entity link|P957}} *{{para|ismn}} = {{Wikidata entity link|P1208}} *{{para|jstor}} = {{Wikidata entity link|P888}} *{{para|lccn}} = {{Wikidata entity link|P1144}} *{{para|mr}} = {{Wikidata entity link|P889}} *{{para|oclc}} = {{Wikidata entity link|P243}} *{{para|ol}} = {{Wikidata entity link|P648}} *{{para|osti}} = {{Wikidata entity link|P3894}} *{{para|pmc}} = {{Wikidata entity link|P932}} *{{para|pmid}} = {{Wikidata entity link|P698}} *{{para|ssrn}} = {{Wikidata entity link|P893}} {{Columns-end}} === Examples === ;<code><nowiki>{{Cite Q|Q15625490}}</nowiki></code> :{{Cite Q|Q15625490|}} ;<code><nowiki>{{Cite Q|Q15625490|page=42}}</nowiki></code> :{{Cite Q|Q15625490|page=42}} ;<code><nowiki>{{Cite Q|Q15625490|access-date=18 May 2017}}</nowiki></code> :{{Cite Q|Q15625490|access-date=18 May 2017}} ;<code><nowiki>{{Cite Q|Q15625490|quote=lorem ipsum}}</nowiki></code> :{{Cite Q|Q15625490|quote=lorem ipsum}} ;<code><nowiki>{{Cite Q|Q25766745}}</nowiki></code> :{{Cite Q|Q25766745}} ;<code><nowiki>{{Cite Q|Q25766745 |chapter=The Final Cut}}</nowiki></code> (with chapter specified) :{{Cite Q|Q25766745 |chapter=The Final Cut}} ;<code><nowiki>{{Cite Q|Q25766745 |pages=48-52}}</nowiki></code> (with pages) :{{Cite Q|Q25766745 |pages=48-52}} ;<code><nowiki>{{Cite Q|Q15625490|access-date=18 May 2017}}</nowiki></code> :{{Cite Q|Q15625490|access-date=18 May 2017}} ;<code><nowiki>{{Cite Q|Q25766745|mode=cs1}}</nowiki></code> :{{Cite Q|Q25766745|mode=cs1}} ;<code><nowiki>{{Cite Q|Q25766745|mode=cs2}}</nowiki></code> :{{Cite Q|Q25766745|mode=cs2}} ;<code><nowiki>{{Cite Q|Q25766745|author-mask=1}}</nowiki></code> :{{Cite Q|Q25766745|author-mask=1}} For additional examples, see [[:en:Template:Cite Q/testcases|testcases]]. == Module:Wd == [[Module:Wd]] can automatically cause this template to be invoked, e.g., ;<code><nowiki>{{Wikidata|references|raw|Q2978|P2046}}</nowiki></code> :{{Wikidata|references|raw|Q2978|P2046}} currently causes the following to be invoked: ;<code><nowiki>{{Cite Q|Q15707237|pages=242}}</nowiki></code> :{{Cite Q|Q15707237|pages=242}} because an {{wikidata entity link|P2046}} statement on {{wikidata entity link|Q2978}} is referenced to be {{wikidata entity link|P248}} {{wikidata entity link|Q15707237}} with {{wikidata entity link|P304}} = 242. {{hatnote|See [[d:Q2978#P2046]]}} == Issues == See [[:en:Template:Cite Q/doc#Issues]] <includeonly>{{sandbox other|| <!-- Categories below this line, please; interwikis at Wikidata --> [[Category:Templates that wrap Citation]] [[Category:Templates using data from Wikidata]] }}</includeonly> 6schqpwxzt0fqae5rbap2cqv4nkgn5l Module:Cite Q 828 1557116 11322048 8126290 2020-12-26T21:38:57Z en>RexxS 0 multiple minor fixes from sandbox 11322048 Scribunto text/plain -- Version: 2020-12-26 local citeq = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, url = {id = "P953", maxvals = 1}, -- full work available at pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == ''); end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false; end for n, v in ipairs( haystack ) do if v == needle then return n; end end return false; end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end -- of local function makelink --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50'; -- for authors fallbackID = 'P2093'; -- author-string elseif nl_type =="editor" then propertyID = 'P5769'; -- "editor-in-chief" fallbackID = 'P98'; -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655'; -- for translators fallbackID = nil; -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P'; -- for contributors -- fallbackID = nil; else return; -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. ]] -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end function citeq.cite_q (frame) local citeq_args = {}; local expand = '' -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> for k, v in pairs(frame:getParent().args) do if in_array (k, {'expand', '_debug'}) then if is_set(v) then expand = v -- record setting but don't pass |expand= to {{citation}} end else if v ~= "" then citeq_args[k] = v end end end for k, v in pairs(frame.args) do if v ~= "" then citeq_args[k] = v end end -- parameters that don't get passed to Citation local qid = citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil local titleforced = (citeq_args.title ~= nil) local oth = {} citeq_args.language = citeq_args.language or getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if citeq_args.language == '' then -- is this needed now? citeq_args.language = nil end if not citeq_args.language then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) citeq_args.language = journal_qid and getPropOfProp( {qid = journal_qid, prop1 = "P407", prop2 = "P218", ps = 1} ) end for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then citeq_args[name] = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = citeq_args[name] or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = citeq_args.language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_language = getPropOfProp( {qid = citeq_args[name], prop1 = "P407", prop2 = "P218", ps = 1} ) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 0, citeq_args.isbn } ) -- try ISBN 10 citeq_args.url = getValue( {"P856", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try official website citeq_args.url = getValue( {"P2699", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try url local slink = mw.wikibase.getSitelink(qid) local label = mw.wikibase.getLabel(qid) or citeq_args.language and mw.wikibase.getLabelByLang(qid, citeq_args.language) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then citeq_args.url = nil wrap_title = wrap_nowiki(citeq_args.title, titleforced) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title, titleforced) end else if slink then citeq_args.url = nil if slink:lower() == label:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", ""), titleforced) slink_flag = true end else citeq_args.title = wrap_nowiki(label, titleforced) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl); -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl); -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl); -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = "book" elseif citeq_args.journal then template = "journal" elseif citeq_args.website then template = "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. '; if citeq_args.mode ~= 'cs1' then list_sep = ', '; end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]'; -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id; if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]'; -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id; -- append to user-specified contents else citeq_args.id = id; end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if is_set(expand) then local expand_args = { '{{' .. template }; -- init with citation template if expand == "self" then citeq_args.id = old_id; -- restore original |id= parameter expand_args = {'{{cite Q|' .. qid}; -- expand to itself end for p, v in pairs (citeq_args) do -- spin through citeq_args and table.insert (expand_args, p .. '=' .. v); -- add parameter name = value end -- make the nowiki'd string and done return table.concat ({'<code>', frame:callParserFunction ('#tag:nowiki', table.concat (expand_args, ' |') .. '}}'), '</code>'}) end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]' end return frame:expandTemplate{title = template, args = citeq_args} .. opt_cat -- render the template end return citeq 0j5j697lomgy2udenhx8joe2fvyp6x8 11322049 11322048 2021-01-11T18:20:19Z en>RexxS 0 make function exportable; improve title linking; minor bugfix 11322049 Scribunto text/plain -- Version: 2021-01-09 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, url = {id = "P953", maxvals = 1}, -- full work available at pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == ''); end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false; end for n, v in ipairs( haystack ) do if v == needle then return n; end end return false; end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50'; -- for authors fallbackID = 'P2093'; -- author-string elseif nl_type =="editor" then propertyID = 'P5769'; -- "editor-in-chief" fallbackID = 'P98'; -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655'; -- for translators fallbackID = nil; -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P'; -- for contributors -- fallbackID = nil; else return; -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. ]] -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} citeq_args.language = citeq_args.language or getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if citeq_args.language == '' then -- is this needed now? citeq_args.language = nil end if not citeq_args.language then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) citeq_args.language = journal_qid and getPropOfProp( {qid = journal_qid, prop1 = "P407", prop2 = "P218", ps = 1} ) end for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = citeq_args.language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_language = getPropOfProp( {qid = citeq_args[name], prop1 = "P407", prop2 = "P218", ps = 1} ) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 0, citeq_args.isbn } ) -- try ISBN 10 citeq_args.url = getValue( {"P856", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try official website citeq_args.url = getValue( {"P2699", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try url if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (citeq_args.language and mw.wikibase.getLabelByLang(qid, citeq_args.language)) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl); -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl); -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl); -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. '; if citeq_args.mode ~= 'cs1' then list_sep = ', '; end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]'; -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id; if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]'; -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id; -- append to user-specified contents else citeq_args.id = id; end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id; -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end for p, v in pairs (citeq_args) do -- spin through citeq_args and table.insert (expand_args, p .. '=' .. v) -- add parameter name = value end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]' end return frame:expandTemplate{title = template, args = citeq_args} .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end return p._cite_q(args) end return p 2d0efa0i4mgq1azj7h5w56gckwjpymb 11322050 11322049 2021-01-12T20:18:13Z en>DrKay 0 restoring to check line feed error 11322050 Scribunto text/plain -- Version: 2020-12-26 local citeq = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, url = {id = "P953", maxvals = 1}, -- full work available at pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == ''); end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false; end for n, v in ipairs( haystack ) do if v == needle then return n; end end return false; end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end -- of local function makelink --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50'; -- for authors fallbackID = 'P2093'; -- author-string elseif nl_type =="editor" then propertyID = 'P5769'; -- "editor-in-chief" fallbackID = 'P98'; -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655'; -- for translators fallbackID = nil; -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P'; -- for contributors -- fallbackID = nil; else return; -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. ]] -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end function citeq.cite_q (frame) local citeq_args = {}; local expand = '' -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> for k, v in pairs(frame:getParent().args) do if in_array (k, {'expand', '_debug'}) then if is_set(v) then expand = v -- record setting but don't pass |expand= to {{citation}} end else if v ~= "" then citeq_args[k] = v end end end for k, v in pairs(frame.args) do if v ~= "" then citeq_args[k] = v end end -- parameters that don't get passed to Citation local qid = citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil local titleforced = (citeq_args.title ~= nil) local oth = {} citeq_args.language = citeq_args.language or getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if citeq_args.language == '' then -- is this needed now? citeq_args.language = nil end if not citeq_args.language then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) citeq_args.language = journal_qid and getPropOfProp( {qid = journal_qid, prop1 = "P407", prop2 = "P218", ps = 1} ) end for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then citeq_args[name] = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = citeq_args[name] or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = citeq_args.language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_language = getPropOfProp( {qid = citeq_args[name], prop1 = "P407", prop2 = "P218", ps = 1} ) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 0, citeq_args.isbn } ) -- try ISBN 10 citeq_args.url = getValue( {"P856", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try official website citeq_args.url = getValue( {"P2699", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try url local slink = mw.wikibase.getSitelink(qid) local label = mw.wikibase.getLabel(qid) or citeq_args.language and mw.wikibase.getLabelByLang(qid, citeq_args.language) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then citeq_args.url = nil wrap_title = wrap_nowiki(citeq_args.title, titleforced) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title, titleforced) end else if slink then citeq_args.url = nil if slink:lower() == label:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", ""), titleforced) slink_flag = true end else citeq_args.title = wrap_nowiki(label, titleforced) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl); -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl); -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl); -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = "book" elseif citeq_args.journal then template = "journal" elseif citeq_args.website then template = "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. '; if citeq_args.mode ~= 'cs1' then list_sep = ', '; end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]'; -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id; if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]'; -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id; -- append to user-specified contents else citeq_args.id = id; end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if is_set(expand) then local expand_args = { '{{' .. template }; -- init with citation template if expand == "self" then citeq_args.id = old_id; -- restore original |id= parameter expand_args = {'{{cite Q|' .. qid}; -- expand to itself end for p, v in pairs (citeq_args) do -- spin through citeq_args and table.insert (expand_args, p .. '=' .. v); -- add parameter name = value end -- make the nowiki'd string and done return table.concat ({'<code>', frame:callParserFunction ('#tag:nowiki', table.concat (expand_args, ' |') .. '}}'), '</code>'}) end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]' end return frame:expandTemplate{title = template, args = citeq_args} .. opt_cat -- render the template end return citeq 0j5j697lomgy2udenhx8joe2fvyp6x8 11322051 11322050 2021-01-21T21:08:51Z en>RexxS 0 update from sandbox 11322051 Scribunto text/plain -- Version: 2021-01-20 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, url = {id = "P953", maxvals = 1}, -- full work available at pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == ''); end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false; end for n, v in ipairs( haystack ) do if v == needle then return n; end end return false; end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50'; -- for authors fallbackID = 'P2093'; -- author-string elseif nl_type =="editor" then propertyID = 'P5769'; -- "editor-in-chief" fallbackID = 'P98'; -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655'; -- for translators fallbackID = nil; -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P'; -- for contributors -- fallbackID = nil; else return; -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. ]] -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} citeq_args.language = citeq_args.language or getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if citeq_args.language == '' then -- is this needed now? citeq_args.language = nil end if not citeq_args.language then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) citeq_args.language = journal_qid and getPropOfProp( {qid = journal_qid, prop1 = "P407", prop2 = "P218", ps = 1} ) end for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = citeq_args.language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_language = getPropOfProp( {qid = citeq_args[name], prop1 = "P407", prop2 = "P218", ps = 1} ) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_language } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 0, citeq_args.isbn } ) -- try ISBN 10 citeq_args.url = getValue( {"P856", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try official website citeq_args.url = getValue( {"P2699", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try url if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (citeq_args.language and mw.wikibase.getLabelByLang(qid, citeq_args.language)) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl); -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl); -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl); -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. '; if citeq_args.mode ~= 'cs1' then list_sep = ', '; end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]'; -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id; if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]'; -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id; -- append to user-specified contents else citeq_args.id = id; end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id; -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end for p, v in pairs (citeq_args) do -- spin through citeq_args and table.insert (expand_args, p .. '=' .. v) -- add parameter name = value end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]' end return frame:expandTemplate{title = template, args = citeq_args} .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end return p._cite_q(args) end return p d98trzi731kz28bviuqishfr1a8gdt1 11322052 11322051 2021-02-16T17:37:26Z en>RexxS 0 Version: 2021-02-06 sync from sandbox 11322052 Scribunto text/plain -- Version: 2021-02-06 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, url = {id = "P953", maxvals = 1}, -- full work available at pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) citeq_args.url = getValue( {"P856", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try official website citeq_args.url = getValue( {"P2699", ps = 1, qid = qid, maxvals = 0, citeq_args.url } ) -- try url if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p hip7gucv1z3ixpfy6rpvcaprr8jwejr 11322053 11322052 2021-02-28T21:07:31Z en>Pigsonthewing 0 Syncing; Version: 2021-02-21 11322053 Scribunto text/plain -- Version: 2021-02-21 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p or6dgau4jcs63p02ahlv73nuzdba8l4 11322054 11322053 2021-05-10T13:34:05Z en>Pigsonthewing 0 sync from sandbox (adds Wikisource link, if available - see talk) 11322054 Scribunto text/plain -- Version: 2021-02-21 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p rt38p3bs2pudglzqxj5tysniei0ez2z 11322055 11322054 2021-05-10T13:36:45Z en>Pigsonthewing 0 Undid revision 1022430615 by [[Special:Contributions/Pigsonthewing|Pigsonthewing]] ([[User talk:Pigsonthewing|talk]]) bug found 11322055 Scribunto text/plain -- Version: 2021-02-21 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p or6dgau4jcs63p02ahlv73nuzdba8l4 11322056 11322055 2021-05-10T13:38:21Z en>Pigsonthewing 0 stet; bug was at source 11322056 Scribunto text/plain -- Version: 2021-02-21 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local entity = mw.wikibase.getEntity(qid) local props = nil local fallback = nil if entity and entity.claims then props = entity.claims[propertyID] if fallbackID then fallback = entity.claims[fallbackID] end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p rt38p3bs2pudglzqxj5tysniei0ez2z 11322057 11322056 2021-06-05T22:03:11Z en>GKFX 0 Carry out edit request from [[User:Snævar]] with some further optimization 11322057 Scribunto text/plain -- Version: 2021-02-21 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args[1] or citeq_args.qid local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then citeq_args.mode = citeq_args.mode or "cs1" template = "Cite " .. template else citeq_args.mode = citeq_args.mode or "cs2" template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p fy0h8ie63tiap8aatvpjut6wkf9pynx 11322058 11322057 2021-08-21T09:24:32Z en>Mike Peel 0 minor tweak so that the qid parameter works 11322058 Scribunto text/plain -- Version: 2021-08-21 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p 0nustfu2zr3qzypzchmsanfy38gict9 11322059 11322058 2021-10-20T05:34:55Z en>Paine Ellsworth 0 per edit request on talk page - enable subtitles as stated in the [[Template:Cite Q#To do list|to do list]] and depicted at [[Template:Cite Q/testcases#Subtitle|test cases page]] 11322059 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-authors'] = citeq_args['display-authors'] or 3 end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? citeq_args['display-editors'] = citeq_args['display-editors'] or 3 end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p sex56kw0c0pu4j1pis8tzfsgsk81e0o 11322060 11322059 2022-01-29T21:54:01Z en>Tol 0 sync from [[/sandbox|sandbox]]: add `display-authors=all` and `display-editors=all` to suppress "et al" with >8 authors 11322060 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, "%((.*)%)" ) if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p q0z8gbfv6ye4780p80hx4bq2db0lrew 11322061 8974970 2022-10-21T16:12:44Z en>Trappist the monk 0 11322061 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('Module:No globals') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p orpa9xy6ok1iz19684gqsgfj0eiws00 11322062 11322061 2022-10-22T09:07:18Z en>WOSlinker 0 use require('strict') instead of require('Module:No globals') 11322062 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value elseif v.qualifiers and v.qualifiers.P1810 then label = v.qualifiers.P1810[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p oanfs14bmj2p09frxf7raxk42nvvrb4 11322063 11322062 2023-06-28T19:11:48Z en>Tol 0 sync from [[Module:Cite Q/sandbox|sandbox]] ([[Special:Permalink/1160670742|permalink]]): remove incorrect fallback to [[:d:Property:P1810|P1810]] for author names ([[Template talk:Cite Q#Removing fallback to P1810|details]] ([[Special:Permalink/1162135808#Removing fallback to P1810|permalink]])) 11322063 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return "<code>" .. table.concat (expand_args, ' |') .. "}}</code>" end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p 8fqpp22yi0snj81yhsl07xvlcabsa83 11322064 11322063 2024-07-05T13:32:14Z en>Trappist the monk 0 11322064 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "[[Category:Cite Q - author unknown]]", ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p gs3mbxmbk7fka5q6zjnw9c8ub9k1ngt 11322065 11322064 2025-03-16T12:58:13Z en>Jonesey95 0 rm misplaced tracking category 11322065 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) return a[1] < b[1] end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p duvnr23l5pfblcugtfmi5cnkp219s96 11322066 11322065 2025-10-03T23:58:03Z en>Trappist the monk 0 when expanding, sort enumerated parameters by their enumerators; 11322066 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p mr2fftv4b8qkgt49c80bwmhoyzgdakn 11322067 11322066 2025-11-14T16:00:01Z en>Ahecht 0 Make callable from other modules 11322067 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q_main (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p._cite_q (args, frame) frame = frame or mw.getCurrentFrame() args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q_main(newargs), name = q } } -- expand like this: args = { p._cite_q_main(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q_main(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end return p._cite_q (args, frame) end return p a24hqcv8a958qwheqvzekp2ogq1jm7c 11322068 11322067 2025-11-14T16:58:48Z en>Ahecht 0 Undid revision [[Special:Diff/1322144655|1322144655]] by [[Special:Contributions/Ahecht|Ahecht]] ([[User talk:Ahecht|talk]]) 11322068 Scribunto text/plain -- Version: 2021-10-19 local p = {} require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local i18n = { ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["unknown-author-trackingcat"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, } ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with the above i18n -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- p.makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = i18n.ordinal.default if card % 10 == 1 then ordsuffix = i18n.ordinal[1] elseif card % 10 == 2 then ordsuffix = i18n.ordinal[2] elseif card % 10 == 3 then ordsuffix = i18n.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = i18n.ordinal.default end return card .. ordsuffix end -- Table of simple properties that can be fetched in roughly the same way: -- id = PXXX -- maxvals = maximum number of multiple values (0 for all) -- linked = "no" suppresses linking -- populate_from_journal = true/false determines whether to look in a journal where the source is published -- rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated -- others = true - the value for the property goes to "others" section local simple_properties = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]&nbsp;<span title='" .. i18n["errors"]["local-article-not-found"] .. "'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>" else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = i18n["unknown-author"] .. (i18n["unknown-author-trackingcat"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table function p._getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end function p.getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(p._getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return p._getLangOfProp(qid, "P1476") end function p.lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug function p.getPropOfProp(frame) return getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] function p._cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(simple_properties) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find('[[Category:Articles with missing Wikidata information]]', 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. i18n.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or ("No label or title -- debug: " .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, "enwikisource") or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and p.makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- template is CS1 designator: journal, web, news, etc. if template then -- citeq_args.mode = citeq_args.mode or "cs1" -- a cs1 template already knows that it is cs1 so this line is superfluous template = "Cite " .. template else -- citeq_args.mode = citeq_args.mode or "cs2" -- a cs2 template already knows that it is cs2 so this line is superfluous template = "Citation" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = '[[WDQ (identifier)|Wikidata]]&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. template } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { "{{cite Q|" .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|(erratum)]]" .. "[[Category:Cite Q - cites a work with an erratum]]" else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = '[[Category:Cite Q - cites a retracted work]]<!-- retracted -->' end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. '[[Category:Cite Q - cites a replaced work]]<!-- replaced -->' end return frame:expandTemplate{title = template, args = citeq_args} .. erratumid .. opt_cat -- render the template end function p.cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { p._cite_q(newargs), name = q } } -- expand like this: args = { p._cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = p._cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end return p mr2fftv4b8qkgt49c80bwmhoyzgdakn 11322069 11322068 2025-11-15T02:45:51Z en>Ahecht 0 Use [[Module:Citation/CS1]] instead of expanding templates where possible, split configuration to [[Module:Cite Q/config]] 11322069 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = cfg.i18n_t["unknown-author"] .. (cfg.i18n_t.trackingcat["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find(cfg.i18n_t.trackingcat["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) or (cfg.i18n_t.errors["no-label-or-title"] .. qid) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcat.erratum else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = cfg.i18n_t.trackingcat.retracted end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcat.replaced end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcat["unknown-template"] end return output .. erratumid .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } okvi7twxwhxwhtc15zt4num3sf9aizz 11322070 11322069 2026-02-01T15:57:31Z en>Trappist the monk 0 synch from sandbox; 11322070 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed ------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. ------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >-------------------------------------------------------------- Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = cfg.i18n_t["unknown-author"] .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do maxpos = makelink(v, out, link, maxpos, wdl) end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do maxpos = makelink(v, out, link, maxpos, wdl) end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcats.erratum else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = cfg.i18n_t.trackingcats.retracted end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 6jqihn7kwocpgijk8xq7vua0i6fklzq 11322071 11322070 2026-04-26T18:39:44Z en>Trappist the monk 0 synch from sandbox; 11322071 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config/sandbox') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = cfg.i18n_t["unknown-author"] .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcats.erratum else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = cfg.i18n_t.trackingcats.retracted end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } kiwg0h7wout4s3j2c8uu1sthskvotdh 11322072 11322071 2026-04-27T03:27:09Z en>Pppery 0 - 11322072 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = cfg.i18n_t["unknown-author"] .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcats.erratum else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = cfg.i18n_t.trackingcats.retracted end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } jk9i2n41ahl8lkgt8371yhwj7m8xb36 11322073 11322072 2026-08-23T14:08:56Z en>Trappist the monk 0 force |doi= value to be lower case; 11322073 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = cfg.i18n_t["unknown-author"] .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcats.erratum else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = cfg.i18n_t.trackingcats.retracted end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } m746tv80iu1sdl2rtxbodtsj9ve4iys 11322074 11322073 2026-08-27T11:15:43Z en>Pigsonthewing 0 apply "unknown-author" fix per sandbox and talk 11322074 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcats.erratum else erratumid = "" end local opt_cat = '' if getValue( {"P5824", ps = 1, qid = qid} ) then opt_cat = cfg.i18n_t.trackingcats.retracted end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } e58hqjnsxnqgg0px1g7a553085hk76y 11322075 11322074 2026-09-01T18:39:39Z en>Pigsonthewing 0 sync from sandbox, per talk 11322075 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID = "P50" local fallbackID = "P2093" -- author name string if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif is_thesis then template = template or "thesis" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_qid = followQid({qid = qid, props = "P5824"}) local retract_id = string.gsub(retract_qid, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = retract_qid}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = retract_qid}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = retract_qid}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = retract_qid}) or nil if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end local erratumid = getPropertyIDs( { "P2507", qid = qid, fwd = "ALL", osd = "no", rank = "best", maxvals = 1 } ) if erratumid then erratumid = " [[d:" .. erratumid .. "|" .. cfg.i18n_t.erratum .. "]]" .. cfg.i18n_t.trackingcats.erratum else erratumid = "" end if getValue( {"P1366", ps = 1, qid = qid} ) then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } bkj5dkajoqkahcvbt797yqkdgxh59vs 11322076 11322075 2026-09-04T20:24:14Z en>Jonathanischoice 0 Sandbox sync: move qidonly lookups to config, use erratum template, disable deprecated CiteSeerX IDs 11322076 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) if citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists elseif citeq_args.journal then template = template or "journal" elseif is_thesis then template = template or "thesis" elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } sh7ac7300kdk4iqls5y010msqspdgif 11322077 11322076 2026-09-12T23:11:04Z en>Jonathanischoice 0 Fix publisher and publicaiton date for journal articles and books, use 'Cite news' based on instance of 11322077 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- object named as else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically if we're citing a news article local function isNewsArticle(qid, args) local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return true end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return true end end end end return false end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local is_news = isNewsArticle(qid, citeq_args) if is_news then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 0be4wk08u86e5uro3bv1a6pmj0nltnl 11322078 11322077 2026-09-16T03:06:39Z en>Jonathanischoice 0 Determine identifier xxx-access=free from P6954 qualifier values, free DOI registrants in CS1 config 11322078 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = 'Module:Citation/CS1/Configuration' -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- object named as else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically if we're citing a news article local function isNewsArticle(qid, args) local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return true end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return true end end end end return false end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local cs1 = require(cs1_cfg) local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local is_news = isNewsArticle(qid, citeq_args) if is_news then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 4csr9z95tevtogcqqfz6ghgrjmlidqz 11322079 11322078 2026-09-20T21:35:22Z en>Jonathanischoice 0 Tweak CS1 config load (once per page) 11322079 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- object named as else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically if we're citing a news article local function isNewsArticle(qid, args) local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return true end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return true end end end end return false end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local is_news = isNewsArticle(qid, citeq_args) if is_news then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } e2jbkttkh2pz1hc6f7b5ufqgr2wmvft 11322080 11322079 2026-09-22T11:42:32Z en>Jonathanischoice 0 Sandbox sync: Show expression of concern errors, only show ISSN when there are no article IDs 11322080 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- object named as else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index out[position] = label link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label out[position] = label end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v["qualifiers"] and v.qualifiers["P1545"] and v.qualifiers["P1545"][1] then position = tonumber(v.qualifiers["P1545"][1].datavalue.value) end maxpos = math.max(maxpos, position) out[position] = v.mainsnak.datavalue.value else -- not a wikibase-item or a string! end else -- code here if we want to return something when author is "unknown" if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do out[k] = out[k]:gsub ('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. (out[k])) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == out[k]) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD args[nl_type .. i] = out[k] if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically if we're citing a news article local function isNewsArticle(qid, args) local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return true end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return true end end end end return false end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local is_news = isNewsArticle(qid, citeq_args) if is_news then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 1zxugmojuzm90osrh2uo364lkvtnrjm 11322081 11322080 2026-10-03T02:00:20Z en>Jonathanischoice 0 Sandbox sync: support for first/last names when found on author items or author name string qualifiers, better chapter and support, use name-list-style=apa for initials 11322081 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials local function getInitials(str) local initials = {} for _, word in pairs(mw.text.split(str, ' ', true)) do local initial = mw.text.trim(word) if #initial > 0 then table.insert(initials, initial:sub(1, 1):upper()) end end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl, namestyle) local label if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) if first_names then first_names = getStyledNames(first_names, namestyle) end if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) if sitelink then -- just the plain name, -- but keep a record of the links, using the same index if last_name and first_names then out[position] = { label = label, last = last_name or nil, first = first_names or nil, } else out[position] = label end link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label if last_name and first_names then out[position] = { label = label, last = last_name or nil, first = first_names or nil, } else out[position] = label end end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end if last_name and first_names then out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else out[position] = v.mainsnak.datavalue.value end else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end if last_name and first_names then label = { label = label, last = last_name or nil, first = first_names or nil, } end else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do local label if out[k].label then label = out[k].label else label = out[k] end label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = label end if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } lrcagwv8n3m2v89y0e57k4vvj8wnfi6 11322082 11322081 2026-10-05T08:27:25Z en>Jonathanischoice 0 Fix too many item lookups (items with ludicrously large numbers of authors - we only need to look up the first few up to the Cite Q/CS1 display limit) 11322082 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials local function getInitials(str) local initials = {} for _, word in pairs(mw.text.split(str, ' ', true)) do local initial = mw.text.trim(word) if #initial > 0 then table.insert(initials, initial:sub(1, 1):upper()) end end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl, namestyle) local label local max_authors_displayed = 10 -- TODO: this is probably in CS1 config somewhere local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if sitelink then -- just the plain name, -- but keep a record of the links, using the same index if last_name and first_names then out[position] = { label = label, last = last_name or nil, first = first_names or nil, } else out[position] = label end link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label if last_name and first_names then out[position] = { label = label, last = last_name or nil, first = first_names or nil, } else out[position] = label end end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end if last_name and first_names then out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else out[position] = v.mainsnak.datavalue.value end else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end if last_name and first_names then label = { label = label, last = last_name or nil, first = first_names or nil, } end else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do local label if out[k].label then label = out[k].label else label = out[k] end label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = label end if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end local opt_cat = '' -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } t1cxxtkxxk5u4kxgq4f7qleooa995xf 11322083 11322082 2026-10-05T19:59:33Z en>Jonathanischoice 0 missing first/last names tracking category 11322083 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials local function getInitials(str) local initials = {} for _, word in pairs(mw.text.split(str, ' ', true)) do local initial = mw.text.trim(word) if #initial > 0 then table.insert(initials, initial:sub(1, 1):upper()) end end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- function to fetch a value to display local function makelink(v, out, link, maxpos, wdl, namestyle) local label local max_authors_displayed = 10 -- TODO: this is probably in CS1 config somewhere local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if sitelink then -- just the plain name, -- but keep a record of the links, using the same index if last_name and first_names then out[position] = { label = label, last = last_name or nil, first = first_names or nil, } else out[position] = label end link[position] = sitelink else if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else -- no Wikidata links wanted, so just give the plain label if last_name and first_names then out[position] = { label = label, last = last_name or nil, first = first_names or nil, } else out[position] = label end end end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end if last_name and first_names then out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else out[position] = v.mainsnak.datavalue.value end else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end if last_name and first_names then label = { label = label, last = last_name or nil, first = first_names or nil, } end else label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or "") end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns nothing; modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the names(s): -- and table 'link' will store any links to the name's article local out = {} local link = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, link, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do local label if out[k].label then label = out[k].label else label = out[k] end label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if link[k] and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end else -- name does not get overwritten, so pull name from WD if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = label opt_cat = opt_cat .. cfg.i18n_t.trackingcats['missing-author-first-last-names']; end if link[k] then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or link[k] -- author-linkn or editor-linkn end end end end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local pubyear = yearFromDate(citeq_args['publication-date']) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 7sa5lr92m6rlvzkf6ooi8y1twbnul7z 11322084 11322083 2026-10-17T18:55:17Z en>Jonathanischoice 0 Sandbox sync: restore author and editor count behaviour, handle ref and avoid cs1 dup default, emit hopefully useful error messages with help links to docs 11322084 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do refs[i] = mw.text.trim(v.last) or mw.text.trim(v.label) or '' if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (citeq_args['display-authors'] or author_count) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (citeq_args['display-editors'] or editor_count) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } p4jgoy13505m6j02uy589j1nge15mlp 11322085 11322084 2026-10-17T19:33:17Z en>Jonathanischoice 0 fix citeref trim bug 11322085 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (citeq_args['display-authors'] or author_count) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (citeq_args['display-editors'] or editor_count) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } tgoyfdo8kvho20wd6yphtct4nigjul9 11322086 11322085 2026-10-18T15:01:38Z en>Trappist the monk 0 compare numbers to numbers; 11322086 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber (citeq_args['display-authors']) or tonumber (author_count)) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (citeq_args['display-editors'] or editor_count) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } da5c23nmbth84erywcz9xrkelswd7un 11322087 11322086 2026-10-18T15:57:09Z en>Trappist the monk 0 |ref=none is legitimate; 11322087 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber (citeq_args['display-authors']) or tonumber (author_count)) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (citeq_args['display-editors'] or editor_count) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if citeq_args.ref and 'none' ~= citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } qzpm4n0docz1rkqkrhp0knqfg09mz70 11322088 11322087 2026-10-18T16:00:44Z en>Trappist the monk 0 compare numbers to numbers; 11322088 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber (citeq_args['display-authors']) or tonumber (author_count)) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber (citeq_args['display-editors']) or tonumber (editor_count)) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if citeq_args.ref and 'none' ~= citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:1em"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 86x1v2nzyob3qzxlpkye3endlkfwkhj 11322089 11322088 2026-10-19T00:02:48Z en>Trappist the monk 0 should not use fixed font size; 11322089 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) -- modify citeq_args table with authors from Wikidata end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) -- modify citeq_args table with editors from Wikidata end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) -- modify citeq_args table with translators from Wikidata end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber (citeq_args['display-authors']) or tonumber (author_count)) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber (citeq_args['display-editors']) or tonumber (editor_count)) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if citeq_args.ref and 'none' ~= citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 9cquv6rrzc52ppt68iqn7larxqvcisy 11322090 11322089 2026-10-19T04:29:25Z en>Jonathanischoice 0 Skip ref parameter handling when authors and editors are supplied as parameters to Cite Q 11322090 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) or {} -- modify citeq_args table with authors from Wikidata else names.authors = {} names.authors_overridden = true end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) or {} -- modify citeq_args table with editors from Wikidata else names.editors = {} names.editors_overridden = true end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) or {} -- modify citeq_args table with translators from Wikidata else names.translators = {} names.translators_overridden = true end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber (citeq_args['display-authors']) or tonumber (author_count)) then if author.qid then -- ignore anonymous if author.qid ~= 'Q4233718' then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber (citeq_args['display-editors']) or tonumber (editor_count)) then if editor.qid then -- ignore anonymous if editor.qid ~= 'Q4233718' then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous if translator.qid ~= 'Q4233718' then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if names.authors_overridden or (#names.authors == 0 and names.editors_overridden) then -- if names are supplied manually, then don't mess with supplied ref parameter elseif citeq_args.ref and 'none' ~= citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } doll1r816rfeqhv73eotcw20yrmyski 11322091 11322090 2026-10-19T13:55:17Z en>Jonathanischoice 0 Ignore first/last name errors with non-human authors 11322091 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local human_instance = false local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) -- check if P31 "instance of" Q5 "human" local instance_of = mw.wikibase.getBestStatements(qnumber, 'P31') if instance_of and instance_of[1] then for k, vi in pairs(instance_of) do if vi.mainsnak.snaktype == "value" and vi.mainsnak.datatype == "wikibase-item" and vi.mainsnak.datavalue.value.id == 'Q5' then human_instance = true end end end end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, human = human_instance, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil names[i].human = out[k].human or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) or {} -- modify citeq_args table with authors from Wikidata else names.authors = {} names.authors_overridden = true end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) or {} -- modify citeq_args table with editors from Wikidata else names.editors = {} names.editors_overridden = true end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) or {} -- modify citeq_args table with translators from Wikidata else names.translators = {} names.translators_overridden = true end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber(citeq_args['display-authors']) or author_count) then if author.qid then -- ignore anonymous or non-humans if author.human then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber(citeq_args['display-editors']) or editor_count) then if editor.qid then -- ignore anonymous or non-humans if editor.human then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous or non-humans if translator.human then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if names.authors_overridden or (#names.authors == 0 and names.editors_overridden) then -- if names are supplied manually, then don't mess with supplied ref parameter elseif citeq_args.ref and 'none' ~= citeq_args.ref then local citeref = make_citeref(names.authors or names.editors, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } f7h7cne6zn8vdmnqj0xco93xuvw78wi 11322092 11322091 2026-10-19T22:47:28Z en>Jonathanischoice 0 Fix bug in supplied ref=CITEREF error when item has editors but no authors 11322092 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local human_instance = false local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) -- check if P31 "instance of" Q5 "human" local instance_of = mw.wikibase.getBestStatements(qnumber, 'P31') if instance_of and instance_of[1] then for k, vi in pairs(instance_of) do if vi.mainsnak.snaktype == "value" and vi.mainsnak.datatype == "wikibase-item" and vi.mainsnak.datavalue.value.id == 'Q5' then human_instance = true end end end end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, human = human_instance, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper) .. (cfg.i18n_t.trackingcats["unknown-author"] or ""), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil names[i].human = out[k].human or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) or {} -- modify citeq_args table with authors from Wikidata else names.authors = {} names.authors_overridden = true end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) or {} -- modify citeq_args table with editors from Wikidata else names.editors = {} names.editors_overridden = true end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) or {} -- modify citeq_args table with translators from Wikidata else names.translators = {} names.translators_overridden = true end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber(citeq_args['display-authors']) or author_count) then if author.qid then -- ignore anonymous or non-humans if author.human then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber(citeq_args['display-editors']) or editor_count) then if editor.qid then -- ignore anonymous or non-humans if editor.human then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous or non-humans if translator.human then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found local name_cat = cfg.i18n_t.trackingcats['missing-author-first-last-names'] if #missing_names > 0 and not string.find(opt_cat, name_cat, 1, true) then opt_cat = opt_cat .. name_cat -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if names.authors_overridden or (#names.authors == 0 and names.editors_overridden) then -- if names are supplied manually, then don't mess with supplied ref parameter elseif citeq_args.ref and 'none' ~= citeq_args.ref then local refnames if #names.authors > 0 then refnames = names.authors else refnames = names.editors end local citeref = make_citeref(refnames, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string opt_cat = opt_cat .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.retracted local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.erratum local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then opt_cat = opt_cat .. cfg.i18n_t.trackingcats['expression-of-concern'] local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then opt_cat = opt_cat .. cfg.i18n_t.trackingcats.replaced citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title opt_cat = opt_cat .. cfg.i18n_t.trackingcats['no-label-or-title']; end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } .. cfg.i18n_t.trackingcats["unknown-template"] end return output .. erratumid .. eoc .. retract .. opt_cat end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 4hvt8oelggr18uazajvxqps9jsqrcvg 11322093 11322092 2026-10-19T23:33:03Z en>Jonathanischoice 0 Refactor tracking categories to a set-like table, separate from error output 11322093 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = {} local cq_errors = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< T A B L E S E T _ A D D >------------------------------------------------------ Add needle to the haystack if it's not already there. ]] local function tableset_add(haystack, needle) if needle == nil or in_array(needle, haystack) then return false end table.insert(haystack, needle) return true end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local human_instance = false local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) -- check if P31 "instance of" Q5 "human" local instance_of = mw.wikibase.getBestStatements(qnumber, 'P31') if instance_of and instance_of[1] then for k, vi in pairs(instance_of) do if vi.mainsnak.snaktype == "value" and vi.mainsnak.datatype == "wikibase-item" and vi.mainsnak.datavalue.value.id == 'Q5' then human_instance = true end end end end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, human = human_instance, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-author"]) label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil names[i].human = out[k].human or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) or {} -- modify citeq_args table with authors from Wikidata else names.authors = {} names.authors_overridden = true end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) or {} -- modify citeq_args table with editors from Wikidata else names.editors = {} names.editors_overridden = true end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) or {} -- modify citeq_args table with translators from Wikidata else names.translators = {} names.translators_overridden = true end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber(citeq_args['display-authors']) or author_count) then if author.qid then -- ignore anonymous or non-humans if author.human then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber(citeq_args['display-editors']) or editor_count) then if editor.qid then -- ignore anonymous or non-humans if editor.human then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous or non-humans if translator.human then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found if #missing_names > 0 and not in_array('missing-author-first-last-names', opt_cat) then tableset_add(opt_cat, cfg.i18n_t.trackingcats['missing-author-first-last-names']) -- TODO: format and i18n this string cq_errors = cq_errors .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if names.authors_overridden or (#names.authors == 0 and names.editors_overridden) then -- if names are supplied manually, then don't mess with supplied ref parameter elseif citeq_args.ref and 'none' ~= citeq_args.ref then local refnames if #names.authors > 0 then refnames = names.authors else refnames = names.editors end local citeref = make_citeref(refnames, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string cq_errors = cq_errors .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then tableset_add(opt_cat, cfg.i18n_t.trackingcats.retracted) local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then tableset_add(opt_cat, cfg.i18n_t.trackingcats.erratum) local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then tableset_add(opt_cat, cfg.i18n_t.trackingcats['expression-of-concern']) local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then tableset_add(opt_cat, cfg.i18n_t.trackingcats.replaced) citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title tableset_add(opt_cat, cfg.i18n_t.trackingcats['no-label-or-title']) end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-template"]) end return output .. erratumid .. eoc .. retract .. table.concat(opt_cat, ' ') .. cq_errors end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } 7z7rxn6g2w89158bsn4eewww06ruzpi 11322094 11322093 2026-10-19T23:38:32Z en>Jonathanischoice 0 Add tracking category for supplied ref mismatch 11322094 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = {} local cq_errors = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< T A B L E S E T _ A D D >------------------------------------------------------ Add needle to the haystack if it's not already there. ]] local function tableset_add(haystack, needle) if needle == nil or in_array(needle, haystack) then return false end table.insert(haystack, needle) return true end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local human_instance = false local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) -- check if P31 "instance of" Q5 "human" local instance_of = mw.wikibase.getBestStatements(qnumber, 'P31') if instance_of and instance_of[1] then for k, vi in pairs(instance_of) do if vi.mainsnak.snaktype == "value" and vi.mainsnak.datatype == "wikibase-item" and vi.mainsnak.datavalue.value.id == 'Q5' then human_instance = true end end end end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, human = human_instance, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-author"]) label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil names[i].human = out[k].human or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) or {} -- modify citeq_args table with authors from Wikidata else names.authors = {} names.authors_overridden = true end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) or {} -- modify citeq_args table with editors from Wikidata else names.editors = {} names.editors_overridden = true end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) or {} -- modify citeq_args table with translators from Wikidata else names.translators = {} names.translators_overridden = true end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber(citeq_args['display-authors']) or author_count) then if author.qid then -- ignore anonymous or non-humans if author.human then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber(citeq_args['display-editors']) or editor_count) then if editor.qid then -- ignore anonymous or non-humans if editor.human then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous or non-humans if translator.human then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found if #missing_names > 0 and not in_array('missing-author-first-last-names', opt_cat) then tableset_add(opt_cat, cfg.i18n_t.trackingcats['missing-author-first-last-names']) -- TODO: format and i18n this string cq_errors = cq_errors .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if names.authors_overridden or (#names.authors == 0 and names.editors_overridden) then -- if names are supplied manually, then don't mess with supplied ref parameter elseif citeq_args.ref and 'none' ~= citeq_args.ref then local refnames if #names.authors > 0 then refnames = names.authors else refnames = names.editors end local citeref = make_citeref(refnames, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else tableset_add(opt_cat, cfg.i18n_t.trackingcats['supplied-ref']) local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string cq_errors = cq_errors .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then tableset_add(opt_cat, cfg.i18n_t.trackingcats.retracted) local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then tableset_add(opt_cat, cfg.i18n_t.trackingcats.erratum) local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then tableset_add(opt_cat, cfg.i18n_t.trackingcats['expression-of-concern']) local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then tableset_add(opt_cat, cfg.i18n_t.trackingcats.replaced) citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title tableset_add(opt_cat, cfg.i18n_t.trackingcats['no-label-or-title']) end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-template"]) end return output .. erratumid .. eoc .. retract .. table.concat(opt_cat, ' ') .. cq_errors end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } ftkui20zp6o5iaxs5ghs6d2yriatb5y 11322095 11322094 2026-10-21T16:12:09Z Pigsonthewing 1048 47 revisions imported from [[:en:Module:Cite_Q]] 11322094 Scribunto text/plain require('strict') local wdib = require('Module:WikidataIB') local getValue = wdib._getValue local _getPropOfProp = wdib._getPropOfProp local followQid = wdib._followQid --local getPropertyIDs = wdib._getPropertyIDs local cite_cfg = mw.loadData ('Module:Cite/config') local cfg = mw.loadData ('Module:Cite_Q/config') local cs1_module = 'Module:Citation/CS1' -- don't load the module yet, may not be needed local cs1_cfg = mw.loadData('Module:Citation/CS1/Configuration') local opt_cat = {} local cq_errors = '' local max_authors_displayed = 10 -- Don't look up all 500+ author items (is this in CS1 config somewhere?) -------------------------------------------------------------------------------- -- makeOrdinal needs to be internationalised along with cfg.i18n_t -- takes cardinal number as a numeric and returns the ordinal as a string -- we need three exceptions in English for 1st, 2nd, 3rd, 21st, .. 31st, etc. -------------------------------------------------------------------------------- local makeOrdinal = function(cardinal) local card = tonumber(cardinal) if not card then return cardinal end local ordsuffix = cfg.i18n_t.ordinal.default if card % 10 == 1 then ordsuffix = cfg.i18n_t.ordinal[1] elseif card % 10 == 2 then ordsuffix = cfg.i18n_t.ordinal[2] elseif card % 10 == 3 then ordsuffix = cfg.i18n_t.ordinal[3] end -- In English, 1, 21, 31, etc. use 'st', but 11, 111, etc. use 'th' -- similarly for 12 and 13, etc. if (card % 100 == 11) or (card % 100 == 12) or (card % 100 == 13) then ordsuffix = cfg.i18n_t.ordinal.default end return card .. ordsuffix end --[[--------------------------< I S _ S E T >------------------------------------------------------------------ Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. ]] local function is_set( var ) return not (var == nil or var == '') end --[[--------------------------< I N _ A R R A Y >-------------------------------------------------------------- Whether needle is in haystack (taken from Module:Citation/CS1/Utilities) ]] local function in_array( needle, haystack ) if needle == nil then return false end for n, v in ipairs( haystack ) do if v == needle then return n end end return false end --[[--------------------------< T A B L E S E T _ A D D >------------------------------------------------------ Add needle to the haystack if it's not already there. ]] local function tableset_add(haystack, needle) if needle == nil or in_array(needle, haystack) then return false end table.insert(haystack, needle) return true end --[[--------------------------< A C C E P T _ V A L U E >------------------------------------------------------- Accept WD value by framing in ((...)) if param_val is equal to keyword; else pass-through WD value as is. ]] local function accept_value( param_val, wd_val ) local val = param_val if val then if in_array (val, {'accept', '))((', ':d:'}) then val = '((' .. wd_val .. '))' elseif '((accept))' == val then val = 'accept' elseif '(())(())' == val then val = '))((' elseif '((:d:))' == val then val = ':d:' else val = wd_val end end return val end -- Split string of comma-separated first names into a table of initials -- 2026-10-10: corrected for UTF-8 by [[User:Pengo]]. local function getInitials(str) local initials = {} for word in mw.ustring.gmatch(str, '[^%s%.]+') do table.insert(initials, mw.ustring.upper(mw.ustring.sub(word, 1, 1))) end return initials end -- Return initials given a first name string and a name-list-style value -- (e.g. 'vanc' for Vancouver, or APA) local function getStyledNames(names, style) -- Vancouver style (vanc) is handled by CS1: Doe JQ if style == 'apa' then -- APA: Doe, J. Q. return table.concat(getInitials(names), '. ') .. '.' else -- Otherwise, just remove any trailing commas from names return mw.text.trim(names:gsub(', ', ' ')) end end -- Concatenate up to the first four names, and the year, into a CITEREF and return it local function make_citeref(names, year) local refs = {} for i, v in ipairs(names) do local name = v.last or v.label or '' refs[i] = mw.text.trim(name) if i == 4 then break end end table.insert(refs, year) local id = table.concat(refs) or '' if id == '' then return '' else return "CITEREF" .. id end end -- function to fetch a value to display local function makelink(v, out, maxpos, wdl, namestyle) local label local item_lookup = false if v.mainsnak.snaktype == "value" then if v.mainsnak.datatype == "wikibase-item" then local qnumber = v.mainsnak.datavalue.value.id local human_instance = false local sitelink = mw.wikibase.getSitelink(qnumber) if qnumber == "Q2818964" then sitelink = nil end -- suppress link to "Various authors" -- Last name, first name(s) from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = v.qualifiers.P9687[1].datavalue.value end -- Otherwise, get last name, first name(s) from author item properties -- but this requires a getValue WD item lookup for each author, and -- lookups are limited to 500 per page, so do this after we have the -- "series ordinal" order, then only do the first few since there are -- article items out there with 400+ authors(!) if not last_name or not first_names then item_lookup = true end -- use object named as for the label if v.qualifiers and v.qualifiers.P1932 then label = v.qualifiers.P1932[1].datavalue.value -- "object named as" else label = mw.wikibase.getLabel(qnumber) if label then label = mw.text.nowiki(label) else label = qnumber -- should add tracking category end end local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- now try determining first/last names with item lookup, if needed if item_lookup and position <= max_authors_displayed then last_name = last_name or getValue({"P734", qid=qnumber, maxvals=1, ps=2}) first_names = first_names or getValue({"P735", qid=qnumber, maxvals=0, ps=2}) -- check if P31 "instance of" Q5 "human" local instance_of = mw.wikibase.getBestStatements(qnumber, 'P31') if instance_of and instance_of[1] then for k, vi in pairs(instance_of) do if vi.mainsnak.snaktype == "value" and vi.mainsnak.datatype == "wikibase-item" and vi.mainsnak.datavalue.value.id == 'Q5' then human_instance = true end end end end if first_names then first_names = getStyledNames(first_names, namestyle) end if wdl then -- show that there's a Wikidata entry available out[position] = string.format( "[[:d:Q%s|%s]]&nbsp;<span title='%s'>[[File:Wikidata-logo.svg|16px|alt=|link=]]</span>", v.mainsnak.datavalue.value["numeric-id"], label, cfg.i18n_t["errors"]["local-article-not-found"] ) else out[position] = { label = label, last = last_name or nil, first = first_names or nil, link = sitelink or nil, qid = qnumber, human = human_instance, } end elseif v.mainsnak.datatype == "string" then local position = maxpos + 1 -- Default to 'next' author. -- use P1545 (series ordinal) instead of default position. if v.qualifiers and v.qualifiers.P1545 and v.qualifiers.P1545[1] then position = tonumber(v.qualifiers.P1545[1].datavalue.value) end maxpos = math.max(maxpos, position) -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end out[position] = { label = v.mainsnak.datavalue.value, last = last_name or nil, first = first_names or nil, } else -- not a wikibase-item or a string! end else -- try the "object named as" qualifier, otherwise use the unknown author item if v.qualifiers and v.qualifiers.P1932 then -- Names from "author given names" and "author last names" qualifiers local last_name local first_names if v.qualifiers and v.qualifiers.P9688 and v.qualifiers.P9688[1] then last_name = v.qualifiers.P9688[1].datavalue.value end if v.qualifiers and v.qualifiers.P9687 and v.qualifiers.P9687[1] then first_names = getStyledNames(v.qualifiers.P9687[1].datavalue.value, namestyle) end label = { label = v.qualifiers.P1932[1].datavalue.value, -- "object named as" last = last_name or nil, first = first_names or nil, } else -- use anonymous tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-author"]) label = { label = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), qid = 'Q4233718', } end maxpos = maxpos + 1 out[maxpos] = label end return maxpos end --[=[-------------------------< G E T _ N A M E _ L I S T >---------------------------------------------------- get_name_list -- adapted from getAuthors code taken from Module:RexxS arguments: nl_type - type of name list to fetch: nl_type = 'author' for authors; 'editor' for editors; 'translator' for translators args - pointer to the parameter arguments table from the template call qid - value from |qid= parameter; the Q-id of the source (book, etc.) in qid wdl - value from the |wdl= parameter; a Boolean passed to enable links to Wikidata when no article exists returns name data found in Wikidata (label, first, last, link, qid); modifies the args table ]=] local function get_name_list (nl_type, args, qid, wdl) local propertyID local fallbackID local names = {} if nl_type =="author" then propertyID = 'P50' -- for authors fallbackID = 'P2093' -- author-string elseif nl_type =="editor" then propertyID = 'P5769' -- "editor-in-chief" fallbackID = 'P98' -- for editors - So-called "fallbacks" are actually a second set of properties processed -- TBD. Take book series editors into account as well (if they have a separate P code as well)? elseif nl_type == "translator" then propertyID = 'P655' -- for translators fallbackID = nil -- elseif 'contributor' == nl_type then -- f.e. author of forewords (P2679) and afterwords (P2680); requires |contribution=, |title= and |author= -- propertyID = 'P' -- for contributors -- fallbackID = nil else return -- not specified so return end -- wdl is a Boolean passed to enable links to Wikidata when no article exists -- if "false" or "no" or "0" is passed set it false -- if nothing or an empty string is passed set it false if wdl and (#wdl > 0) then wdl = wdl:lower() wdl = in_array (wdl, {"false", "no", "0"}) else -- wdl is empty, so wdl = false end local props = nil local fallback = nil if mw.wikibase.entityExists(qid) then props = mw.wikibase.getAllStatements(qid, propertyID) if props and fallbackID then fallback = mw.wikibase.getAllStatements(qid, fallbackID) end end -- Make sure it actually has at least one of the properties requested if not (props and props[1]) and not (fallback and fallback[1]) then return nil end -- So now we have something to return: -- table 'out' is going to store the name label, qid, first/last names, and link to the name's article local out = {} local maxpos = 0 if props and props[1] then for k, v in pairs(props) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end if fallback and fallback[1] then -- second properties for k, v in pairs(fallback) do if 'deprecated' ~= v.rank then -- ignore deprecated names maxpos = makelink(v, out, maxpos, wdl, args['name-list-style']) end end end -- if there's anything to return, then insert the additions in the template arguments table -- in the form |author1=firstname secondname |author2= ... -- Renumber, in case we have inconsistent numbering local keys = {} for k, v in pairs(out) do keys[#keys + 1] = k end table.sort(keys) -- as they might be out of order for i, k in ipairs(keys) do names[i] = {} local label = out[k].label label = label:gsub('&#39;', '\''); -- prevent cs1|2 multiple names categorization; replace html entity with the actual character names[i].label = label names[i].qid = out[k].qid or nil names[i].human = out[k].human or nil mw.log(i .. " " .. k .. " " .. label) if args[nl_type .. i] then -- name gets overwritten -- pull corresponding -link only if overwritten name is same as WD name if out[k].link and (args[nl_type .. i] == label) then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end else -- name does not get overwritten, so pull name from WD names[i].last = out[k].last or nil names[i].first = out[k].first or nil if out[k].first and out[k].last then -- First/last names were found, so add them args[nl_type .. '-last' .. i] = args[nl_type .. '-last' .. i] or out[k].last args[nl_type .. '-first' .. i] = args[nl_type .. '-first' .. i] or out[k].first else args[nl_type .. i] = out[k].label end if out[k].link then args[nl_type .. '-link' .. i] = args[nl_type .. '-link' .. i] or out[k].link -- author-linkn or editor-linkn names[i].link = out[k].link end end end return names end -- gets language codes used for a monolingual text property as a table local function _getLangOfProp(qid, pid) if not pid then return {} end local out = {} local props = mw.wikibase.getAllStatements(qid, pid) for i, v in ipairs(props) do if v.mainsnak.datatype == "monolingualtext" and v.mainsnak.datavalue then out[#out + 1] = v.mainsnak.datavalue.value.language end end return out end local function getLangOfProp(frame) local pid = frame.args.pid or mw.text.trim(frame.args[1] or "") if pid == "" then return end local qid = frame.args.qid if qid == "" then qid = nil end return table.concat(_getLangOfProp(qid, pid), ", ") end -- gets the language codes of a Wikidata entry as a table local function _lang_code(qid) -- P407 "language of work or name" local lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P424", ps = 1} ) -- "Wikimedia language code" if lc then return mw.text.split( lc, "[, ]+" ) end lc = _getPropOfProp( {qid = qid, prop1 = "P407", prop2 = "P218", ps = 1} ) -- "ISO 639-1 code" if lc then return mw.text.split( lc, "[, ]+" ) end return _getLangOfProp(qid, "P1476") -- "title" end local function lang_code(frame) return table.concat(_lang_code(frame.args.qid or mw.text.trim(frame.args[1] or "")), ", ") end -- export for debug local function getPropOfProp(frame) return _getPropOfProp(frame.args) end -- wraps a string in nowiki unless disable flag is set local function wrap_nowiki(str, disable) if disable then return str or '' end return mw.text.nowiki(str or '') end -- returns the first string sequence of 3 or more digits in a date string, or nil local function yearFromDate(datestr) if datestr then return string.match(datestr, '%d%d%d+') end return datestr end -- Attempt to determine heuristically what we're citing local function getTemplateFromInstance(qid, args) local chapteritems = { 'Q1980247', -- chapter } local newsitems = { 'Q5707594', -- news article 'Q30070590', -- magazine article -- TODO: somehow use WHERE {?item (wdt:P31|wdt:P31/wdt:P279*) wd:Q5707594.} -- main subclasses of news article: 'Q87849013', -- AP article 'Q2144639', -- feature story 'Q139172839', -- top story 'Q18339884', -- cover story 'Q3326038', -- critical review 'Q4202018', -- interview 'Q309481', -- obituary 'Q108970988', -- column 'Q2602337', -- op-ed 'Q59908', -- opinion piece } -- most of the time a cheap lookup to a single value will work if args['instance-of'] and in_array(args['instance-of'], newsitems) then return 'news' elseif args['instance-of'] and in_array(args['instance-of'], chapteritems) then return 'chapter' end -- otherwise check multiple non-deprecated values local instance_of = mw.wikibase.getBestStatements(qid, 'P31') if instance_of and instance_of[1] then for k, v in pairs(instance_of) do if v.mainsnak.snaktype == "value" and v.mainsnak.datatype == "wikibase-item" then if in_array(v.mainsnak.datavalue.value.id, newsitems) then return 'news' elseif in_array(v.mainsnak.datavalue.value.id, chapteritems) then return 'chapter' end end end end return '' end -- Figure out a URL access value, from the "online access status" (P6954) qualifier of an identifier -- The [[Template:Cite journal]] docs state these should only allow "free" -- e.g. DOI = P356 local function getIdentifierAccess(qid, args, identifier) if not args[identifier] then return nil end -- check DOI registrant is known free, using CS1 config -- TODO: this should also be modelled in Wikidata if identifier == 'doi' then local registrant, suffix = mw.ustring.match(args.doi:lower(), '^10%.([^/]+)/([^%s–]+)$'); if registrant and suffix and cs1_cfg.known_free_doi_registrants_t[registrant] then return 'free' elseif registrant and suffix and cs1_cfg.extended_registrants_t[registrant] then for _, incipit in ipairs(cs1_cfg.extended_registrants_t[registrant]) do if mw.ustring.find (suffix, '^' .. incipit:lower()) then return 'free' end end end end -- fetch statement values to examine qualifiers local ids = mw.wikibase.getBestStatements(qid, cfg.simple_properties_t[identifier]['id']) if not ids or not ids[1] then return nil end if not ids[1].qualifiers or not ids[1].qualifiers.P6954 then return nil end -- Check property constraints (P2302) in definition of online access status (P6954) -- Q66439598 = 'limited', -- partial open access -- Q107459441 = 'registration', -- registration required -- Q910845 = 'subscription', -- paywall -- Q16572632 = 'subscription', -- login (see note on P6954) local free_status = { 'Q24707952', -- free to read 'Q232932', -- open access } local access = ids[1].qualifiers.P6954[1] if access.datatype == "wikibase-item" then local accessQID = access.datavalue.value.id if in_array(accessQID, free_status) then return 'free' end end return nil end -- sort sequence table whose values are key-value pairs by key local function comp_key(a, b) local param_a, enum_a = a[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <a> local param_b, enum_b = b[1]:match ('(%D+)(%d+)$'); -- get param name and enumerator from <b> if enum_a and enum_b then -- if both parameters have neumerators if param_a == param_b then -- are parameter names the same? return tonumber (enum_a) < tonumber (enum_b); -- yes: compare enumerators end end return a[1] < b[1]; -- alpha sort if here end -- sort sequence table whose values are key-value pairs by value local function comp_val(a, b) return a[2] < b[2] end --[[-------------------------< C I T E _ Q >------------------------------------------------------------------ Takes standard CS1|2 template parameters and passes all to {{citation}}. If neither of |author= and |author1= are set, calls get_authors() to try to get an author name-list from Wikidata. The result is passed to {{citation}} for rendering. --]] local function _cite_q (citeq_args) local frame = mw.getCurrentFrame() -- parameters that don't get passed to Citation local expand = citeq_args.expand -- when set to anything, causes {{cite q}} to render <code><nowiki>{{citation|...}}</nowiki></code> local qid = citeq_args.qid or citeq_args[1] local wdl = citeq_args.wdl local template = citeq_args.template citeq_args.expand = nil citeq_args[1] = nil citeq_args.qid = nil citeq_args.wdl = nil citeq_args.template = nil -- if title supplied, flag to not read html title local titleforced = (citeq_args.title ~= nil) local oth = {} -- put the language codes into a sequential table langcodes[] local langcodes = {} if citeq_args.language then -- check these are a supported language codes for lc in mw.text.gsplit( citeq_args.language, "[, ]+", false ) do langcodes[#langcodes+1] = mw.language.isSupportedLanguage(citeq_args.language) and citeq_args.language end end if not langcodes[1] then -- try to find language of work langcodes = _lang_code(qid) end if not langcodes[1] then -- try fallback to journal's language local journal_qid = followQid({qid = qid, props = "P1433"}) langcodes = journal_qid and _lang_code(journal_qid) end citeq_args.language = citeq_args.language or table.concat(langcodes, ", ") -- loop through list of simple properties and get their values in citeq_args for name, data in pairs(cfg.simple_properties_t) do if data.qidonly then citeq_args[name] = followQid({qid = qid, props = data.id}) if citeq_args[name] == qid then citeq_args[name] = nil end end if not citeq_args[name] then citeq_args[name] = getValue( {data.id, fwd = "ALL", osd = "no", noicon = "true", qid = qid, maxvals = data.maxvals, linked = data.linked, rank = data.rank or "best", citeq_args[name] } ) end if data.populate_from_journal then local publishedin = getValue( {"P1433", ps = 1, qid = qid, maxvals = 0, citeq_args[name], qual = data.id, qualsonly = 'yes'} ) citeq_args[name] = publishedin or _getPropOfProp({qid = qid, prop1 = "P1433", prop2 = data.id, maxvals = data.maxvals, ps = 1}) end if citeq_args[name] and citeq_args[name]:find (cfg.i18n_t.trackingcats["missing-wikidata"], 1, true) then -- try fallback to work's native language citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = langcodes[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned -- try fallback to qid's native language local qid_languages = _lang_code(citeq_args[name]) citeq_args[name] = getValue( {data.id, ps = 1, qid = qid, maxvals = data.maxvals, linked = "no", lang = qid_languages[1] } ) if citeq_args[name]:find('^Q%d+$') then -- qid was returned again citeq_args[name] = nil else -- record the language found if no lang specified citeq_args.language = citeq_args.language or qid_languages[1] end end end if data.others then oth[#oth + 1] = citeq_args[name] and (name:gsub("^%l", string.upper) .. ": " .. citeq_args[name]) citeq_args[name] = nil end end citeq_args.doi = citeq_args.doi and citeq_args.doi:lower() or nil; -- force |doi= value to be lower case -- URL access for identifiers, from P6954 online access status -- The [[Template:Cite journal]] docs state these should only allow "free" citeq_args['bibcode-access'] = citeq_args['bibcode-access'] or getIdentifierAccess(qid, citeq_args, 'bibcode'); citeq_args['doi-access'] = citeq_args['doi-access'] or getIdentifierAccess(qid, citeq_args, 'doi'); citeq_args['hdl-access'] = citeq_args['hdl-access'] or getIdentifierAccess(qid, citeq_args, 'hdl'); citeq_args['jstor-access'] = citeq_args['jstor-access'] or getIdentifierAccess(qid, citeq_args, 'jstor'); -- citeq_args['ol-access'] = citeq_args['ol-access'] or getIdentifierAccess(qid, citeq_args, 'ol'); citeq_args['osti-access'] = citeq_args['osti-access'] or getIdentifierAccess(qid, citeq_args, 'osti'); citeq_args['ssrn-access'] = citeq_args['ssrn-access'] or getIdentifierAccess(qid, citeq_args, 'ssrn'); citeq_args['s2cid-access'] = citeq_args['s2cid-access'] or getIdentifierAccess(qid, citeq_args, 's2cid'); citeq_args.others = citeq_args.others or table.concat(oth, ". ") if citeq_args.others == "" then citeq_args.others = nil end citeq_args.journal = citeq_args.journal and citeq_args.journal:gsub("^''", ""):gsub("''$", ""):gsub("|''", "|"):gsub("'']]", "]]") citeq_args.ol = (getValue( {"P648", ps = 1, qid = qid, maxvals = 1, citeq_args.ol } ) or ''):gsub("^OL(.+)$", "%1") if citeq_args.ol == "" then citeq_args.ol = nil end -- TBD. Take care of |ol-access=? citeq_args.biorxiv = citeq_args.biorxiv and ("10.1101/" .. citeq_args.biorxiv) citeq_args.isbn = getValue( {"P957", ps = 1, qid = qid, maxvals = 1, rank="best", citeq_args.isbn } ) -- try ISBN 10 (only one value accepted) -- if url then see if there's an archive: citeq_args.url local url if not citeq_args.url then for i, pr in ipairs( {"P953", "P856", "P2699"} ) do url = getValue( {pr, ps = 1, qid = qid, maxvals = 1, qual="P1065" } ) if url then citeq_args.url = mw.text.split( url, " (", true )[1] local arcurl = mw.ustring.match( url, " %((.*)%)" ) -- when there is an archive url, <url> holds: url<space>(archive url); here extract the archive url if present if arcurl then local arcy, arcm, arcd = arcurl:match("(20%d%d)%p?(%d%d)%p?(%d%d)") if arcy and arcm and arcd then citeq_args["archive-url"] = arcurl citeq_args["archive-date"] = tonumber(arcd) .. " " .. cfg.i18n_t.months[tonumber(arcm)] .. " " .. arcy end end break end end end if citeq_args.publisher == "Unknown" then -- look for "stated as" (P1932) local stated_as = getValue( {"P123", ps = 1, qid = qid, maxvals = 1, qual="P1932", qo="y"} ) if stated_as then citeq_args.publisher = stated_as end end -- Handle thesis args - degree, supervising institution local is_thesis = false if citeq_args.thesis_degree then is_thesis = true citeq_args.degree = citeq_args.thesis_degree citeq_args.thesis_degree = nil end if citeq_args.thesis_submitted_to then is_thesis = true citeq_args.publisher = citeq_args.thesis_submitted_to citeq_args.thesis_submitted_to = nil end if not titleforced then -- Handle subtitle. if citeq_args.title then local subtitle = mw.wikibase.getBestStatements (qid, 'P1680'); if 0 ~= #subtitle then subtitle = subtitle[1].mainsnak.datavalue.value.text; citeq_args.title = citeq_args.title .. ": " .. subtitle end end local htmltitle = getValue( {"P1476", qual = "P6833", ps = 1, qid = qid, maxvals = 1, qo = "y"} ) if htmltitle then citeq_args.title = htmltitle:gsub("</?i>", "''") else local title_display = citeq_args.title or mw.wikibase.getLabel(qid) or (langcodes[1] and mw.wikibase.getLabelByLang(qid, langcodes[1])) if citeq_args.url then citeq_args.title = wrap_nowiki(title_display) else local slink = mw.wikibase.getSitelink(qid) local slink_flag = false local wrap_title = '' local wslink = false if not slink then -- See if we have wikisource if not citeq_args.url then local wikisource_sitelink = mw.wikibase.getSitelink(qid, cfg.i18n_t.wikisource) or nil if wikisource_sitelink then slink = ':s:'..wikisource_sitelink wslink = true end end end if citeq_args.title then if slink then wrap_title = wrap_nowiki(citeq_args.title) slink_flag = true else citeq_args.title = wrap_nowiki(citeq_args.title) end else if slink and not wslink then if slink:lower() == title_display:lower() then citeq_args.title = '[[' .. slink .. ']]' else wrap_title = wrap_nowiki(slink:gsub("%s%(.+%)$", ""):gsub(",.+$", "")) slink_flag = true end elseif wslink then wrap_title = wrap_nowiki(title_display) slink_flag = true else citeq_args.title = wrap_nowiki(title_display) end end if slink_flag then if slink == wrap_title and not wslink then -- direct link citeq_args.title = '[[' .. slink .. ']]' else -- piped link citeq_args.title = '[[' .. slink .. '|' .. wrap_title .. ']]' end end end end end -- TBD: incorporate |at, |sheets= and |sheet= here as well -- Sort out what should happen if several of them are given at the same time if citeq_args.page or citeq_args.p then -- let single take precedence over multiple citeq_args.pages = nil citeq_args.pp = nil end if citeq_args.pages then local _, count = string.gsub(citeq_args.pages, "[,;%s]%d+", "") if count == 1 then citeq_args.page = citeq_args.pages citeq_args.pages = nil end end local names = {} if is_set (qid) then if not is_set (citeq_args.author) and not is_set (citeq_args.author1) and not is_set (citeq_args.subject) and not is_set (citeq_args.subject1) and not is_set (citeq_args.host) and not is_set (citeq_args.host1) and not is_set (citeq_args.last) and not is_set (citeq_args.last1) and not is_set (citeq_args.surname) and not is_set (citeq_args.surname1) and not is_set (citeq_args['author-last']) and not is_set (citeq_args['author-last1']) and not is_set (citeq_args['author1-last']) and not is_set (citeq_args['author-surname']) and not is_set (citeq_args['author-surname1']) and not is_set (citeq_args['author1-surname1']) then -- if neither are set, try to get authors from Wikidata names.authors = get_name_list ('author', citeq_args, qid, wdl) or {} -- modify citeq_args table with authors from Wikidata else names.authors = {} names.authors_overridden = true end if not is_set (citeq_args.editor) and not is_set (citeq_args.editor1) and not is_set (citeq_args['editor-last']) and not is_set (citeq_args['editor-last1']) and not is_set (citeq_args['editor1-last']) and not is_set (citeq_args['editor-surname']) and not is_set (citeq_args['editor-surname1']) and not is_set (citeq_args['editor1-surname']) then -- if neither are set, try to get editors from Wikidata names.editors = get_name_list ('editor', citeq_args, qid, wdl) or {} -- modify citeq_args table with editors from Wikidata else names.editors = {} names.editors_overridden = true end if not is_set (citeq_args.translator) and not is_set (citeq_args.translator1) and not is_set (citeq_args['translator-last']) and not is_set (citeq_args['translator-last1']) and not is_set (citeq_args['translator1-last']) and not is_set (citeq_args['translator-surname']) and not is_set (citeq_args['translator-surname1']) and not is_set (citeq_args['translator1-surname']) then -- if neither are set, try to get translators from Wikidata names.translators = get_name_list ('translator', citeq_args, qid, wdl) or {} -- modify citeq_args table with translators from Wikidata else names.translators = {} names.translators_overridden = true end end for k, v in pairs(citeq_args) do if in_array (v, {'(())', 'unset', 'ignore'}) or 'string' ~= type(k) then -- empty accept-as-is-written (()) markup to indicate an empty/unused parameter value, other ((...)) markups are deliberately passed down to {{citation}} citeq_args[k] = nil elseif in_array (v, {'((unset))', '((ignore))'}) then -- strip off markup for free-text values clashing with local keywords citeq_args[k] = 'unset' end end local author_count = 0 for k, v in pairs(citeq_args) do if k:find("^author%d+$") or k:find("^author%-last%d+$") then author_count = author_count + 1 end end if author_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-authors'] then citeq_args['display-authors'] = nil; -- unset because no longer needed else citeq_args['display-authors'] = citeq_args['display-authors'] or 3 -- limit to three displayed names end end local editor_count = 0 for k, v in pairs(citeq_args) do if k:find("^editor%d+$") or k:find("editor%-last%d+$") then editor_count = editor_count + 1 end end if editor_count > 8 then -- convention in astronomy journals, optional mode for this? if 'all' == citeq_args['display-editors'] then citeq_args['display-editors'] = nil; -- unset because no longer needed else citeq_args['display-editors'] = citeq_args['display-editors'] or 3 -- limit to three displayed names end end -- check only the names being displayed for missing first/last name errors local missing_names = {} for i, author in pairs(names.authors or {}) do -- mw.logObject(author) if not author.last and i <= (tonumber(citeq_args['display-authors']) or author_count) then if author.qid then -- ignore anonymous or non-humans if author.human then table.insert(missing_names, author.label .. "&nbsp;<span title='edit author in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. author.qid .. "]] ]]</span>") end else table.insert(missing_names, author.label) end end end for i, editor in pairs(names.editors or {}) do if not editor.last and i <= (tonumber(citeq_args['display-editors']) or editor_count) then if editor.qid then -- ignore anonymous or non-humans if editor.human then table.insert(missing_names, editor.label .. "&nbsp;<span title='edit editor in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. editor.qid .. "]] ]]</span>") end else table.insert(missing_names, editor.label) end end end for i, translator in pairs(names.translators or {}) do if not translator.last then if translator.qid then -- ignore anonymous or non-humans if translator.human then table.insert(missing_names, translator.label .. "&nbsp;<span title='edit translator in Wikidata'>[[File:Edit icon on Wikisite.svg|14px|alt=|link=[[:d:" .. translator.qid .. "]] ]]</span>") end else table.insert(missing_names, translator.label) end end end -- add category and display error if name errors found if #missing_names > 0 and not in_array('missing-author-first-last-names', opt_cat) then tableset_add(opt_cat, cfg.i18n_t.trackingcats['missing-author-first-last-names']) -- TODO: format and i18n this string cq_errors = cq_errors .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: Missing first/last names in Wikidata for ' .. table.concat(missing_names, ', ') .. ' ([[Template:Cite Q#Error messages|help]])</span> ' end -- change edition to ordinal if it's set and numeric citeq_args.edition = citeq_args.edition and makeOrdinal(citeq_args.edition) -- handle supplied {{para|ref}} for readable ID, avoid CS1 duplicate default error local pubyear = yearFromDate(citeq_args['publication-date']) if names.authors_overridden or (#names.authors == 0 and names.editors_overridden) then -- if names are supplied manually, then don't mess with supplied ref parameter elseif citeq_args.ref and 'none' ~= citeq_args.ref then local refnames if #names.authors > 0 then refnames = names.authors else refnames = names.editors end local citeref = make_citeref(refnames, pubyear) if citeq_args.ref == citeref then citeq_args.ref = nil -- avoid CS1 maint: ref duplicates default else tableset_add(opt_cat, cfg.i18n_t.trackingcats['supplied-ref']) local tpara = frame:expandTemplate{ title = 'para', args = {'ref', citeq_args.ref} } -- TODO: format and i18n this string cq_errors = cq_errors .. ' <span class="error" style="font-size:inherit"><code class="cs1-code">{{[[Template:Cite Q|Cite Q]]}}</code>: supplied ' .. tpara .. ' does not match value generated from Wikidata: <code class="cs1-code">' .. citeref .. '</code> ([[Template:Cite Q#Error messages|help]])</span> ' end end -- code to make a guess what template to use from the supplied parameters -- (first draft for proof-of-concept) local guessedType = getTemplateFromInstance(qid, citeq_args) if guessedType == 'news' then template = template or "news" -- some items use P123 (publisher) as the newspaper instead of P1433 (published in) if citeq_args.publisher and not citeq_args.journal then citeq_args.journal = citeq_args.publisher citeq_args.publisher = nil end elseif guessedType == 'chapter' then template = template or "book" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] citeq_args.chapter = citeq_args.title citeq_args.title = citeq_args.journal citeq_args.journal = nil elseif citeq_args.journal then template = template or "journal" citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] -- articles can be published in books/proceedings, otherwise suppress publisher if not citeq_args.isbn then citeq_args.publisher = nil end -- only display ISSN if there are no article identifiers if citeq_args.issn then if citeq_args.doi or citeq_args.pmid or citeq_args.pmc or citeq_args.arxiv or citeq_args.bibcode or citeq_args.jstor or citeq_args.ssrn or citeq_args.s2cid or citeq_args.hdl or citeq_args.biorxiv or citeq_args.osti or citeq_args.zbl or citeq_args.jfm or citeq_args.mr then citeq_args.issn = nil end end elseif is_thesis then template = template or "thesis" elseif citeq_args.isbn then template = template or "book" citeq_args.asin = nil -- suppress ASIN if ISBN exists citeq_args['publication-date'] = pubyear or citeq_args['publication-date'] elseif citeq_args.website then template = template or "web" end -- |id= could hold more than one identifier pulled from Wikidata not supported by {{citation}}, right now only add our qid to the list local list_sep = '. ' if citeq_args.mode ~= 'cs1' then list_sep = ', ' end local id = cfg.i18n_t.wdq.. '&nbsp;[[:d:' .. qid .. '|' .. qid .. ']]' local old_id = citeq_args.id if wdl then -- show WD logo id = id .. '[[File:Wikidata-logo.svg|16px|alt=|link=]]' -- possibly replace by WD edit icon? end if is_set (old_id) then citeq_args.id = old_id .. list_sep .. id -- append to user-specified contents else citeq_args.id = id end -- Indicator if item has been retracted local retract = '' if citeq_args.retracted_by then tableset_add(opt_cat, cfg.i18n_t.trackingcats.retracted) local retract_id = string.gsub(citeq_args.retracted_by, 'Q', '') local retr_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = retract_id} } } retr_params.doi = getValue({"P356", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.doi = retr_params.doi and retr_params.doi:lower() or nil retr_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.retracted_by}) or nil retr_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.retracted_by}) or nil -- check qualifiers for access=free retr_params['doi-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'doi') retr_params['bibcode-access'] = getIdentifierAccess(citeq_args.retracted_by, retr_params, 'bibcode') if 'yes' == citeq_args['retracted-intentional'] then retr_params.intentional = 'yes' end retract = ' ' .. frame:expandTemplate{ title = "Retracted", args = retr_params } end -- remove non-CS1 retraction properties citeq_args.retracted_by = nil citeq_args['retracted-intentional'] = nil -- clean up any blank parameters for k, v in pairs(citeq_args) do if v == "" then citeq_args[k] = nil end end -- if |expand=<anything>, write a nowiki'd version to see what the {{citation}} template call looks like if expand then local expand_args = { "{{" .. (template and ("Cite "..template) or "Citation") } -- init with citation template if expand == "self" then citeq_args.id = old_id -- restore original |id= parameter expand_args = { cfg.i18n_t.cite_q .. qid } -- expand to itself end -- make a sortable table and sort it by param name local sorttable = {} for param, val in pairs (citeq_args) do table.insert(sorttable, {param, val}) end table.sort(sorttable, comp_key) -- add contents to expand_args for idx, val in ipairs(sorttable) do table.insert(expand_args, val[1] .. '=' .. val[2]) end -- make the nowiki'd string and done return frame:preprocess (table.concat ({'<syntaxhighlight lang="wikitext" inline="1">', table.concat (expand_args, ' |') .. '}}', '</syntaxhighlight>'})); end -- Indicator if item has corrigendum/erratum local erratumid = "" if citeq_args.erratum then tableset_add(opt_cat, cfg.i18n_t.trackingcats.erratum) local erratum_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args.erratum, 'Q', '')} } } erratum_params.doi = getValue({"P356", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.doi = erratum_params.doi and erratum_params.doi:lower() or nil erratum_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmc = getValue({"P932", ps = 1, qid = citeq_args.erratum}) or nil erratum_params.pmid = getValue({"P698", ps = 1, qid = citeq_args.erratum}) or nil -- check qualifiers for access=free erratum_params['doi-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'doi') erratum_params['bibcode-access'] = getIdentifierAccess(citeq_args.erratum, erratum_params, 'bibcode') if 'yes' == citeq_args['erratum-checked'] then erratum_params.checked = 'yes' end erratumid = ' ' .. frame:expandTemplate{ title = "Erratum", args = erratum_params } end citeq_args.erratum = nil citeq_args['erratum-checked'] = nil -- Indicator if item has an expression of concern notice (P14891) local eoc = "" if citeq_args['expression-of-concern'] then tableset_add(opt_cat, cfg.i18n_t.trackingcats['expression-of-concern']) local eoc_params = { citeq = 'yes', id = frame:expandTemplate{ title = 'QID', args = {qid = string.gsub(citeq_args['expression-of-concern'], 'Q', '')} } } eoc_params.doi = getValue({"P356", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.doi = eoc_params.doi and eoc_params.doi:lower() or nil eoc_params.bibcode = getValue({"P819", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmc = getValue({"P932", ps = 1, qid = citeq_args['expression-of-concern']}) or nil eoc_params.pmid = getValue({"P698", ps = 1, qid = citeq_args['expression-of-concern']}) or nil -- check qualifiers for access=free eoc_params['doi-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'doi') eoc_params['bibcode-access'] = getIdentifierAccess(citeq_args['expression-of-concern'], eoc_params, 'bibcode') if 'yes' == citeq_args['eoc-intentional'] then eoc_params.intentional = 'yes' end eoc = ' ' .. frame:expandTemplate{ title = "Expression of concern", args = eoc_params } end citeq_args['expression-of-concern'] = nil citeq_args['eoc-intentional'] = nil if citeq_args.replaced_by then tableset_add(opt_cat, cfg.i18n_t.trackingcats.replaced) citeq_args.replaced_by = nil end if not citeq_args.title then -- emit category link if missing title tableset_add(opt_cat, cfg.i18n_t.trackingcats['no-label-or-title']) end -- Disable CiteSeerX IDs for now citeq_args.citeseerx = nil -- remove any remaining non-CS1 fields citeq_args['instance-of'] = nil if citeq_args['name-list-style'] and citeq_args['name-list-style'] == 'apa' then citeq_args['name-list-style'] = nil end -- render the template local lc_template = template and template:lower() or "citation" local output if cite_cfg.known_templates_t[lc_template] then local config_t = {['CitationClass'] = cite_cfg.citation_classes_t[lc_template] or lc_template}; -- set CitationClass value output = require (cs1_module)._citation (nil, citeq_args, config_t) -- go render the citation else output = frame:expandTemplate{ -- render the template title = "Cite "..template, args = citeq_args } tableset_add(opt_cat, cfg.i18n_t.trackingcats["unknown-template"]) end return output .. erratumid .. eoc .. retract .. table.concat(opt_cat, ' ') .. cq_errors end local function cite_q (frame) local args = {} for k, v in pairs(frame:getParent().args) do if v ~= "" then args[k] = v end end for k, v in pairs(frame.args) do if v ~= "" then args[k] = v end end args.qid = args.qid or args[1] or "" if args.qid == "" then return nil end args[1] = nil local citesep = (args.citesep or "") if citesep == "" then citesep = ", " end citesep = citesep:gsub('"', '') -- strip double quotes after setting default to allow |citesep="" as a blank separator args.citesep = nil local tag = args.tag or "" if tag == "" then tag = nil end args.tag = nil local list = args.list or "" if list == "" then list = nil end args.list = nil args.language = args.language or args.lang args.lang = nil local cites = {} for q in args.qid:gmatch("Q%d+") do -- make a new copy of the arguments local newargs = {} for k, v in pairs(args) do if k ~= "qid" then newargs[k] = v end end newargs.qid = q if tag == "ref" then cites[#cites + 1] = frame:callParserFunction{ name = "#tag:ref", args = { _cite_q(newargs), name = q } } -- expand like this: args = { _cite_q(newargs), name = 'foo', group = 'bar' } else cites[#cites + 1] = _cite_q(newargs) end end if list then return frame:expandTemplate{ title = list, args = cites } else return table.concat(cites, citesep) end end --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------ ]] return { makeOrdinal = makeOrdinal, _getLangOfProp = _getLangOfProp, getLangOfProp = getLangOfProp, lang_code = lang_code, getPropOfProp = getPropOfProp, _cite_q = _cite_q, cite_q = cite_q } ftkui20zp6o5iaxs5ghs6d2yriatb5y Blommersia nataliae 0 1561222 11322327 9070606 2026-10-21T20:36:41Z Burmeister 9074 add+IUCN 11322327 wikitext text/x-wiki {{image|Blommersia nataliae (10.3897-zookeys.994.57012) Figure 2.jpg}} =={{int:Taxonavigation}}== {{Blommersia}} Species: ''[[Blommersia nataliae]]'' =={{int:Name}}== ''Blommersia nataliae'' {{a|David R. Vieites|Vieites}}, {{a|Sandra Nieto-Román|Nieto-Román}}, {{a|Marcos Peso Fernández|Peso Fernández}} & {{a|Javier H. Santos-Santos|Santos-Santos}}, 2020: 155 * {{int:Holotype}}: {{rl|MNCN}} 50456 (original field number: DRV6867), adult ♂, collected by D. Vieites and M. Peso Fernández on 25 November 2012. * {{int:Type locality}}: “in a degraded forest with giant bamboo, in forest leaf litter at the Mont M’Sapere, island of Mayotte (French Overseas Department), Comoros archipelago, -12.7656°S, 45.1852°E 500 m a.s.l.” =={{int:References}}== ==={{int:Primary references}}=== {{Vieites et al., 2020}} ==={{int:Links}}=== * {{smallcaps|IUCN SSC Amphibian Specialist Group 2023. {{IUCN|VU|193422404}} (amended version of 2021 assessment). The IUCN Red List of Threatened Species 2023: e.T193422404A234995402. {{doi|10.2305/IUCN.UK.2023-1.RLTS.T193422404A234995402.en}}. Accessed on 20 October 2026. {{Taxonbar}} [[Category:David R. Vieites taxa]] [[Category:Sandra Nieto-Román taxa]] [[Category:Marcos Peso Fernández taxa]] [[Category:Javier H. Santos-Santos taxa]] [[Category:New species 2020]] 16bishloicn3yoxll4ucpj6fu1ksmb7 Template:Lafontaine & Walsh, 2010 10 1585898 11322774 8239132 2026-10-22T08:51:18Z FrankB157 2872707 Nomenclatural acts 11322774 wikitext text/x-wiki * {{a|J. Donald Lafontaine|Lafontaine, J.D.}} & {{a|J. Bruce Walsh|Walsh, J.B.}} 2010. A review of the subfamily Anobinae with the description of a new species of ''Baniana'' {{aut|Walker}} from North and Central America (Lepidoptera, Erebidae, Anobinae). [[ISSN 1313-2989|''Zookeys'']] 39: 3–11. {{Doi|10.3897/zookeys.39.428}} [https://www.researchgate.net/publication/43121805 Full article] <includeonly>[[Template:Lafontaine &#38; Walsh, 2010|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 18 March 2010 * {{ZooBank|7949C108-5A98-4A06-8BDD-F4D42EA95E52}} ==={{int:New names}} (1)=== * ''[[Baniana minor]]'' {{aut|Lafontaine}} & {{aut|Walsh}} [[Category:Reference templates]]</noinclude> 2uyrbyje58s0d0q58wsbhy0rcdfjljh 11323008 11322774 2026-10-22T10:50:34Z Tommy Kronkvist 596 Replaced inline HTML link with a ResearchGate Publication template. 11323008 wikitext text/x-wiki * {{a|J. Donald Lafontaine|Lafontaine, J.D.}} & {{a|J. Bruce Walsh|Walsh, J.B.}} 2010. A review of the subfamily Anobinae with the description of a new species of ''Baniana'' {{aut|Walker}} from North and Central America (Lepidoptera, Erebidae, Anobinae). [[ISSN 1313-2989|''Zookeys'']] 39: 3–11. {{Doi|10.3897/zookeys.39.428}} {{ResearchGate Publication|43121805}} <includeonly>[[Template:Lafontaine &#38; Walsh, 2010|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 18 March 2010 * {{ZooBank|7949C108-5A98-4A06-8BDD-F4D42EA95E52}} ==={{int:New names}} (1)=== * ''[[Baniana minor]]'' {{aut|Lafontaine}} & {{aut|Walsh}} [[Category:Reference templates]]</noinclude> g3vwpfuot0pyt1v1bbe0shs1mzrycke Altriarabis pterosperma 0 1606642 11322212 10040777 2026-10-21T18:35:30Z Andyboorman 251907 Andyboorman moved page [[Arabis pterosperma]] to [[Altriarabis pterosperma]]: Move to the valid combination: not accepted by all 10040777 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Arabis}} Species: ''[[Arabis pterosperma]]'' =={{int:Name}}== ''Arabis pterosperma'' {{a|Edgew.}}, Trans. Linn. Soc. London 20: 33 (1846). =={{int:References}}== ==={{int:Links}}=== {{BRBA|2021|April|9}} {{POWO|2021|April|9}} {{IPNI||2021|9 April}} {{Taxonbar|from=Q15239145}} [[Category:Michael Pakenham Edgeworth taxa]] rfd530rzadc9lkb7hpa31l9t3bl1nxz 11322214 11322212 2026-10-21T18:39:17Z Andyboorman 251907 11322214 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Altriarabis}} Species: ''[[Altriarabis pterosperma]]'' =={{int:Name}}== ''Altriarabis pterosperma'' (Edgew.) Y.Z.Zhao, Collect. Works Zhao Yizhi: 209 (2018) ==={{int:Synonyms}}=== {{BA}} **''Arabis pterosperma'' {{a|Edgew.}}, Trans. Linn. Soc. London 20: 33 (1846). {{HET}} **''Arabidopsis yadungensis'' K.C.Kuan & Z.X.An, Fl. Xizang. 2: 375 (1985) **''Arabis alpina var. purpurea'' W.W.Sm., Notes Roy. Bot. Gard. Edinburgh 11: 195 (1919) **''Arabis latialata'' Y.Z.Lan & T.Y.Cheo, Bull. Bot. Lab. N. E. Forest. Inst., Harbin 6: 79 (1980) =={{int:References}}== ==={{int:Links}}=== {{BRBA|2026|Oct|9}} {{POWO|2026|Oct|9}} {{IPNI||2026|9 Oct}} {{Taxonbar|from=Q15239145}} [[Category:Yi-Zhi Zhao taxa]] 9s9zya8oemgf58gm45od957mtsuj44j Jackie Farfán Larico 0 1609414 11322571 10876971 2026-10-22T03:43:12Z Neferkheperre 947633 /* 2022 */ 11322571 wikitext text/x-wiki {{image}} '''Jannete Jackie Farfán Larico''', Peruvian lepidopterist. * Museo de Historia Natural, Universidad Nacional de San Agustín de Arequipa, Av. Alcides Carrión s/n, Arequipa, Peru. * PPG Biologia Animal, Departamento de Zoologia, Instituto de Biociências, Universidade Federal do Rio Grande do Sul, Av. Bento Gonçalves, 9500, Porto Alegre, RS 91501-970, Brazil. * Universidad Nacional de San Agustín de Arequipa, Museo de Historia Natural, Av. Alcides Carrión s/n, Arequipa, Peru. * E-mail: cerdenajoseal{{@}}yahoo.es * E-mail: jjackie4u{{@}}gmail.com; {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2020=== {{Cerdena et al., 2020}} {{Davis et al., 2020}} {{Farfán, Lamas & Cerdeña, 2020}} {{Palacios et al., 2020}} ===2021=== {{Mahecha-Jiménez et al., 2021a}} {{Farfan,Cadena,Balint,2021}} {{Bálint et al., 2021}} ===2022=== {{Cerdeña et al., 2022}} {{Farfán et al., 2022}} ===2024=== {{Pyrcz et al., 2024a}} {{Authority control}} {{DEFAULTSORT:Farfan Larico, Jackie}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Lepidopterists]] 5iwhj4uwg333c6uewyc9cd8d4g0a8vx Margaret E. Lewis 0 1629401 11322443 8398557 2026-10-21T22:24:09Z Burmeister 9074 +1 11322443 wikitext text/x-wiki '''Margaret E. Lewis''' ([[Floruit|fl.]] 1992–), U.S. palaeontologist. * Biology, Stockton University, Galloway, New Jersey 08205, United States. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2001=== {{Werdelin & Lewis, 2001}} ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Lewis, Margaret E.}} [[Category:Palaeontologists]] [[Category:Taxon authorities]] k4gk7yeanyqbqx3qezpn8ms3zulksgo Charles Hervey Grey 0 1658782 11322497 10399519 2026-10-22T00:53:44Z The editor 2345 2915305 11322497 wikitext text/x-wiki {{image}} '''Charles Hervey Grey''' (1875–1955), English botanist. {{IPNI standard form|Grey}} {{Taxa authored}} <!-- == {{int:Publications}} == {{Inc}} --> {{Authority control}} {{DEFAULTSORT:}} [[Category:Taxon authorities]] [[Category:Botanists]] 0uqin3ts8jr6fq7ehjmbwwlieqjookx Jorge Morales Romero 0 1669050 11322594 11321747 2026-10-22T04:00:20Z The editor 2345 2915305 11322594 wikitext text/x-wiki {{Image}} '''Jorge Morales Romero''' (1951–), Spanish palaeontologist. Known as '''Jorge Morales'''. * [[MNCN|Museo Nacional de Ciencias Naturales]] {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{Inc}} ===1981=== {{Morales, Moyà-Solà & Soria, 1981}} ===1982=== {{Thomas, Morales & Heintz, 1982}} ===1987=== {{Morales, Soria & Thomas, 1987}} {{Astibia & Morales, 1987}} ===1991=== {{Montoya & Morales, 1991}} ===1992=== {{Ginsburg & Morales, 1992}} ===1995=== {{Köhler-López, Moyà-Solà & Morales, 1995}} ===1997=== {{Alcalá & Morales, 1997}} {{Bonaparte & Morales, 1997}} ===1998=== {{Morales et al., 1998}} {{Astibia, Morales & Moyà-Solà, 1998}} ===2001=== {{Morales et al., 2001}} ===2003=== {{Morales et al., 2003}} {{Morales et al., 2003b}} {{Morales et al., 2003a}} ===2005=== {{Morales, Pickford & Soria, 2005}} ===2008=== {{Morales et al., 2008}} {{Pickford et al., 2008}} ===2010=== {{Salesa et al., 2010}} {{Sánchez et al., 2010}} {{Sánchez, Domingo & Morales, 2010}} ===2011=== {{Sánchez et al., 2011}} ===2012=== {{Abella et al., 2012}} {{Salesa et al., 2012}} ===2015=== {{Sánchez et al., 2015a}} ===2017=== {{Morales & Pickford, 2017}} {{Salesa et al., 2017}} {{Ríos, Sánchez & Morales, 2017}} ===2018=== {{Morales & Pickford, 2018}} {{Sánchez et al., 2018}} ===2019=== {{Sánchez et al., 2019c}} ===2022=== {{Valenciano et al., 2022}} ===2023=== {{Salesa et al., 2023}} {{Authority control}} {{DEFAULTSORT:Morales, Jorge}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] dnwpov2t3jycnp7gr3cmtcest00xxe4 Category:Cite Q - author unknown 14 1696728 11322134 8608389 2026-10-21T16:39:38Z Pigsonthewing 1048 removed [[Category:Wikispecies maintenance]]; added [[Category:Cite Q tracking categories]] using [[Help:Gadget-HotCat|HotCat]] 11322134 wikitext text/x-wiki [[Category:Cite Q tracking categories]] __HIDDENCAT__ 4lv13sz82ez7qcdvthy31b1jm1u4k4h Wedelphus 0 1704216 11322982 11244677 2026-10-22T10:32:43Z Hiouf 2107144 11322982 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Wedelphus}} Species (2): † {{sp|W|edelphus|dichopteroides}} † {{splast|W|edelphus|nielseni}} =={{int:Name}}== ''Wedelphus'' † {{a|Szwedo}} & {{a|Wappler}}, 2006 * {{int:Type species}}: ''Wedelphus dichopteroides'' † {{a|Jacek Szwedo|Szwedo}} & {{a|Torsten Wappler|Wappler}}, 2006 =={{int:References}}== ==={{int:Primary references}}=== * Szwedo J. & Wappler T. 2006 - New planthoppers (Insecta: Hemiptera: Fulgoromorpha) from the Middle Eocene Messel maar. Annales Zoologici 56(3): 555-566 [556]. ==={{int:Additional references}}=== {{Shcherbakov, Emeljanov & Perkovsky, 2026}} ==={{int:Links}}=== * [https://web.archive.org/web/20240304093206/https://flow.hemiptera-databases.org/flow/?page=explorer&db=flow&lang=en&card=taxon&rank=genus&id=20902 ''Wedelphus''] - Taxon details in FLOW - Hemiptera data bases <!-- * [3i web address ''GENUS''] - Taxon details in World Auchenorrhyncha Database --> {{Taxonbar}} [[Category:Jacek Szwedo taxa]] [[Category:Torsten Wappler taxa]] n2yxj8t8nf6rnqmwb17d6e5smulpgtt Edward Bruce Williamson 0 1712766 11322506 11149345 2026-10-22T01:47:20Z John Tann 703224 Added publications 11322506 wikitext text/x-wiki '''Edward Bruce Williamson''' (1877–1933), U.S. entomologist. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1915=== {{Williamson, 1915}} ===1916=== {{Williamson, 1916}} ===1919=== {{Williamson, 1919}} {{Williamson, 1919a}} ===1922=== {{Williamson, 1922}} ===1924=== {{Williamson & Williamson, 1924}} {{Authority control}} {{DEFAULTSORT:Williamson, Edward Bruce}} [[Category:Taxon authorities]] [[Category:Entomologists]] h7mxqw29z9yxjefg6szs8rb6fifhxnj Stephen C. Barker 0 1712948 11322612 10801864 2026-10-22T06:57:22Z Hiouf 2107144 /* 2025 */ 11322612 wikitext text/x-wiki '''Stephen C. Barker''', Australian parasitologist * Department of Parasitology, School of Chemistry and Molecular Biosciences, University of Queensland, Brisbane, 4072, Australia. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2002=== {{Klompen, Dobson & Barker, 2002}} ===2003=== {{Murrell & Barker, 2003}} ===2004=== {{Cameron et al., 2004}} {{Barker & Murrell, 2004}} ===2008=== {{Barker & Murrell, 2008}} ===2010=== {{Guglielmone et al., 2010}} ===2014=== {{Mey & Barker, 2014}} ===2018=== {{Barker & Burger, 2018}} ===2024=== {{Kelava et al., 2024}} {{Uribe et al., 2024}} ===2025=== {{Apanaskevich et al., 2025}} {{Barker et al., 2025}} {{Barker et al., 2025a}} {{Mans et al., 2025}} ===2026=== {{Barker, 2026}} {{Authority control}} {{DEFAULTSORT:Barker, Stephen}} [[Category:Taxon authorities]] [[Category:parasitologists]] i1rl23dtccb583ttlfltddaw083vc06 Jon Alan Baskin 0 1723661 11322292 11321725 2026-10-21T20:03:40Z The editor 2345 2915305 11322292 wikitext text/x-wiki {{image}} '''Jon Alan Baskin''', U.S. palaeontologist. * Department of Geosciences, Texas A&I University, Kingsville, Texas, 78363. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===1981=== {{Baskin, 1981}} ===1982=== {{Baskin, 1982}} ===2020=== {{Baskin, 2020}} ===2022=== {{Valenciano & Baskin, 2022}} {{Authority control}} {{DEFAULTSORT:Baskin, Jon Alan}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] kvcqawgia99phxmaxvwoht5vxnjdvnm Israel M. Sánchez 0 1724454 11322586 11247291 2026-10-22T03:55:28Z The editor 2345 2915305 /* Publications */ 11322586 wikitext text/x-wiki {{image}} '''Israel M. Sánchez''', Spanish palaeontologist. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2008=== {{Pickford et al., 2008}} ===2010=== {{Sánchez et al., 2010}} {{Sánchez, Domingo & Morales, 2010}} ===2011=== {{Sánchez at al., 2011}} ===2015=== {{Sánchez et al., 2015a}} ===2017=== {{Ríos, Sánchez & Morales, 2017}} ===2018=== {{Sánchez et al., 2018}} ===2019=== {{Sánchez et al., 2019c}} {{Authority control}} {{DEFAULTSORT:Sanchez, Israel M.}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 55bv8nsm1di2uuki0hml4kkholf1g5x 11322587 11322586 2026-10-22T03:55:40Z The editor 2345 2915305 11322587 wikitext text/x-wiki {{image}} '''Israel M. Sánchez''', Spanish palaeontologist. * Departamento de Paleobiología, Museo Nacional de Ciencias Naturales-CSIC, C/ José Gutiérrez Abascal 2, 28006, Madrid, Spain. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2008=== {{Pickford et al., 2008}} ===2010=== {{Sánchez et al., 2010}} {{Sánchez, Domingo & Morales, 2010}} ===2011=== {{Sánchez at al., 2011}} ===2015=== {{Sánchez et al., 2015a}} ===2017=== {{Ríos, Sánchez & Morales, 2017}} ===2018=== {{Sánchez et al., 2018}} ===2019=== {{Sánchez et al., 2019c}} {{Authority control}} {{DEFAULTSORT:Sanchez, Israel M.}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] f6ednq4l8k8cy16a1dn3w2gfj95hcyr 11322591 11322587 2026-10-22T03:59:06Z The editor 2345 2915305 11322591 wikitext text/x-wiki {{image}} '''Israel M. Sánchez''', Spanish palaeontologist. * Departamento de Paleobiología, Museo Nacional de Ciencias Naturales-CSIC, C/ José Gutiérrez Abascal 2, 28006, Madrid, Spain. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2008=== {{Pickford et al., 2008}} ===2010=== {{Sánchez et al., 2010}} {{Sánchez, Domingo & Morales, 2010}} ===2011=== {{Sánchez et al., 2011}} ===2015=== {{Sánchez et al., 2015a}} ===2017=== {{Ríos, Sánchez & Morales, 2017}} ===2018=== {{Sánchez et al., 2018}} ===2019=== {{Sánchez et al., 2019c}} {{Authority control}} {{DEFAULTSORT:Sanchez, Israel M.}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 96hp2jf4w0ft28jrvncaio5iyefatw4 Template:Dyar, 1898 10 1725515 11322190 9862483 2026-10-21T18:15:42Z FrankB157 2872707 11322190 wikitext text/x-wiki *{{a|Harrison Gray Dyar|Dyar, H. G.}} 1898. New American moths and synonymical notes. [[ISSN 0028-7199|''Journal of the New York Entomological Society'']] 6: 33–44. {{BHL|page/30375082}}. <includeonly>[[Template:Dyar, 1898|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> tupvijrjp6g14046zi4r8vxtj4hmcpg Brachynema germarii 0 1821684 11322145 11202292 2026-10-21T16:57:26Z Hiouf 2107144 /* {{int:Additional references}} */ 11322145 wikitext text/x-wiki {{image|228421086 Brachynema germarii.jpg|''Brachynema germarii'' (Kazakhstan)}} =={{int:Taxonavigation}}== {{Brachynema (Pentatomidae)}} Species: ''[[Brachynema germarii]]'' =={{int:Name}}== ''Brachynema germarii'' ({{a|Friedrich Anton Kolenati|Kolenati}}, 1846) ==={{int:synonyms}}=== *''Cimex virens'' {{a|Johann Christoph Friedrich Klug|Klug}}, 1845 [Junior primary homonym of ''Cimex virens'' {{a|Carolus Linnaeus|Linnaeus}}, 1767 (now ''Stenodema virens'', Miridae); synonymized by {{a|Étienne Mulsant|Mulsant}} & {{a|Claudius Rey|Rey}}, 1866:209] *''Raphigaster [sic] germarii'' {{a|Friedrich Anton Kolenati|Kolenati}}, 1846:56 ** {{int:Type locality}}: Azerbaijan, Karabagh *''Oncoma germarii'' {{a|Franz Xaver Fieber|Fieber}}, 1861:333 [Synonymized by {{a|Étienne Mulsant|Mulsant}} & {{a|Claudius Rey|Rey}}, 1866:209] *''Pentatoma anabasis'' {{a|Alexander K. Becker|Becker}}, 1867:110 [Synonymized by {{a|Vasiliy Ewgrafowitsch Jakovlev|Jakovlev}}, 1871:14] ** {{int:Type locality}}: Russia, Astrakhan *''Pentatoma tetrastigma'' {{a|Francis Walker|Walker}}, 1867:311 [non {{a|Gottlieb August Wilhelm Herrich-Schäffer|Herrich-Schäffer}}, 1851 ; misidentification see {{a|William Lucas Distant|Distant}}, 1900:390] *''Rhaphigaster biplaga'' {{a|Francis Walker|Walker}}, 1867:373 [Synonymized by {{a|Jordi Ribes|Ribes}} & {{aut|Schmitz}}, 1992:134] *''Brachynema virens'' {{a|Auguste Puton|Puton}}, 1869:13 *''Ocoma germarii'' var. ''flavomarginatus'' {{a|Vasiliy Ewgrafowitsch Jakovlev|Jakovlev}}, 1871:14 [New name for ''Pentatoma anabasis'' {{a|Alexander K. Becker|Becker}}, 1867] *''Ocoma germarii'' var. ''grisea'' {{a|Vasiliy Ewgrafowitsch Jakovlev|Jakovlev}}, 1871:32 ** {{int:Type locality}}: Russia, Astrakhan *''Brachynema melanota'' {{a|Vasiliy Ewgrafowitsch Jakovlev|Jakovlev}}, 1874:240 [Synonymized by {{a|Aleksandr Nikolaevich Kiritshenko|Kiritshenko}}, 1951:340] ** {{int:Type locality}}: Russia, Astrakhan *''Brachynema virens'' var. ''alternatum'' {{a|Géza Horváth|Horváth}}, 1899:444 ** {{int:Type locality}}: Algeria, Oran =={{int:References}}== ==={{int:Primary references}}=== {{Kolenati, 1846}} [p. {{BHL|page/35093259|56}}] ==={{int:Additional references}}=== {{Fieber, 1860}} [p. {{BHL|page/14999521|333}}] {{Horváth, 1899}} [p. {{BHL|page/13454105|444}}] {{Jakovlev, 1871}} [p. {{BHL|page/47974378|14}}] {{Jakovlev, 1874}} [p. {{BHL|page/34273880|240}}] {{Klug,JCF, 1829}} {{Mulsant & Rey, 1866a}} [p. {{BHL|page/54574401|209}}] {{Ribes & Pagola-Carte, 2013}} [p. 144] {{Ribes & Schmitz, 1992}} {{Rider, 2006}} [p. 270] {{Van der Heyden, 2026d}} {{Walker, 1867a}} [p. {{BHL|page/13305199|373}}] ==={{int:Links}}=== {{BioLib|id72045|''Brachynema germarii'' ({{aut|Kolenati}}, 1846)}} {{faunaeur2|972843df-4f0b-4db6-ae76-ee06e17b93c4|''Brachynema germarii'' ({{aut|Kolenati}}, 1846)}} {{GBIF|157658942}} * [http://www.organismnames.com/details.htm?lsid=972390 ION] * [https://web.archive.org/web/20210806114729/https://www.ndsu.edu/faculty/rider/Pentatomoidea/Genus_Nezarini/Brachynema.htm ''Brachynema''] Classification of Pentatomoidea, North Dakota State University. {{Commons}} {{Taxonbar|from=Q31836666}} [[Category:Friedrich Anton Kolenati taxa]] bq7555e8ou1pzfcogndkkqmteqwhbkr Template:Davies & Tobin, 1984 10 1851148 11322508 10637619 2026-10-22T01:50:54Z John Tann 703224 open access 11322508 wikitext text/x-wiki * {{a|David Allen Lewis Davies|Davies, D.A.L.}} & {{a|Pamela Tobin|Tobin, P.}} 1984. The dragonflies of the world: A systematic list of the extant species of Odonata. Vol. 1. Zygoptera, Anisozygoptera. ''[[ISSN 0926-3551|Rapid Communications. Societas Internationalis Odonatologica. Supplements]]'' 3: 127 pp. [https://natuurtijdschriften.nl/pub/593140 PDF download] {{access|open}} <includeonly>[[Template:Davies &#38; Tobin, 1984|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 1mkfle71yp4m3nqy5we7f8czus3zgo0 Celaenorrhinus ruficornis fusca 0 1853385 11322008 11302519 2026-10-21T14:06:29Z Sjl197 1805579 11322008 wikitext text/x-wiki {{Celaenorrhinus ruficornis}} Subspeciesː ''[[Celaenorrhinus ruficornis fusca]]'' =={{int:Name}}== ''Celaenorrhinus ruficornis fusca'' ({{a|George Francis Hampson|Hampson}}, 1889). {{int:Type locality}}: India, Nilgiri Hills. {{int:Typus}}: {{int:Holotype}} [?], {{Rl|NHMUK}} [=BMNH] ==={{int:Synonymy}}=== * ''Plesioneura fusca'' {{a|George Francis Hampson|Hampson}}, 1889ː {{BHL|page/35550147|367}}. *(See =''Celaenorrhinus spilothyrus area'' Plötz; Seitz, [1927]: {{BHL|page/56106000|1037}}, but not adopted later, ''e.g.'' contra Evans, 1949, etc.). * ''Celaenorrhinus ruficornis fusca'' ({{aut|Hampson}}, 1889); Evans, 1949: {{BHL|page/48224016 |102}}; Bridges, 1994ː {{BHL|page/15680564|VIII.88}}, {{BHL|page/15680740|IX.14}}; {{aut|Varshney}} & {{a|Peter Smetacek|Smetacek}} (Eds.) 2015: 37; {{a|Peter Smetacek|Smetacek}}, 2025: 37. * ''Celaenorrhinus fusca'' ({{aut|Hampson}}, 1889); {{a|Kalesh Sadasivan|Sadasivan}} & {{a|Ashok Sengupta|Sengupta}} 2024: Appendix I [Checklist] [See also Nitin et al. 2018] =={{int:References}}== ==={{int:Primary references}}=== {{Bridges,1994a}} {{Evans,WH, 1949}} {{Hampson, 1889}} *Nitin et al. 2018. Larval host plants of the butterflies of the Western Ghats, India. JoTT. {{Seitz,A, 1912b}} {{Smetacek, 2025}} {{Sadasivan & Sengupta, 2024}} *{{aut|Varshney, R.K.}} & {{a|Peter Smetacek|Smetacek, P.}} (Eds.) 2015. ''A Synoptic Catalogue of the Butterflies of India.'' Butterfly Research Centre, Bhimtal and Indinov Publishing, New Delhi, ii + 261 pp., 8 pl. {{ResearchGate|287980260}} ==={{int:Additional references}}=== ==={{int:Links}}=== *[https://www.nhm.ac.uk/our-science/data/lepindex/detail?taxonno=182186 Lepindex] {{Taxonbar}} {{Commons category}} [[Category:BMNH]] [[Category:George Francis Hampson taxa]] c7jx1cw0ck8b498h2eh10fuxgz45327 11322009 11322008 2026-10-21T14:07:06Z Sjl197 1805579 /* {{int:Name}} */ 11322009 wikitext text/x-wiki {{Celaenorrhinus ruficornis}} Subspeciesː ''[[Celaenorrhinus ruficornis fusca]]'' =={{int:Name}}== ''Celaenorrhinus ruficornis fusca'' ({{a|George Francis Hampson|Hampson}}, 1889). {{int:Type locality}}: India, Nilgiri Hills. {{int:Typus}}: {{int:Holotype}} [?], {{Rl|NHMUK}} [=BMNH] ==={{int:Synonymy}}=== * ''Plesioneura fusca'' {{a|George Francis Hampson|Hampson}}, 1889ː {{BHL|page/35550147|367}}. *(See =''Celaenorrhinus spilothyrus area'' Plötz; Seitz, [1927]: {{BHL|page/56106000|1037}}, but not adopted later, ''e.g.'' contra Evans, 1949, etc.). * ''Celaenorrhinus ruficornis fusca'' ({{aut|Hampson}}, 1889); Evans, 1949: {{BHL|page/48224016 |102}}; Bridges, 1994: {{BHL|page/15680564|VIII.88}}, {{BHL|page/15680740|IX.14}}; {{aut|Varshney}} & {{a|Peter Smetacek|Smetacek}} (Eds.) 2015: 37; {{a|Peter Smetacek|Smetacek}}, 2025: 37. * ''Celaenorrhinus fusca'' ({{aut|Hampson}}, 1889); {{a|Kalesh Sadasivan|Sadasivan}} & {{a|Ashok Sengupta|Sengupta}} 2024: Appendix I [Checklist] [See also Nitin et al. 2018] =={{int:References}}== ==={{int:Primary references}}=== {{Bridges,1994a}} {{Evans,WH, 1949}} {{Hampson, 1889}} *Nitin et al. 2018. Larval host plants of the butterflies of the Western Ghats, India. JoTT. {{Seitz,A, 1912b}} {{Smetacek, 2025}} {{Sadasivan & Sengupta, 2024}} *{{aut|Varshney, R.K.}} & {{a|Peter Smetacek|Smetacek, P.}} (Eds.) 2015. ''A Synoptic Catalogue of the Butterflies of India.'' Butterfly Research Centre, Bhimtal and Indinov Publishing, New Delhi, ii + 261 pp., 8 pl. {{ResearchGate|287980260}} ==={{int:Additional references}}=== ==={{int:Links}}=== *[https://www.nhm.ac.uk/our-science/data/lepindex/detail?taxonno=182186 Lepindex] {{Taxonbar}} {{Commons category}} [[Category:BMNH]] [[Category:George Francis Hampson taxa]] fpw160x9c0q2sc06b00m1tz769dkzyx 11322034 11322009 2026-10-21T15:13:46Z Sjl197 1805579 11322034 wikitext text/x-wiki {{Celaenorrhinus ruficornis}} Subspeciesː ''[[Celaenorrhinus ruficornis fusca]]'' =={{int:Name}}== ''Celaenorrhinus ruficornis fusca'' ({{a|George Francis Hampson|Hampson}}, 1889). {{int:Type locality}}: India, Nilgiri Hills. {{int:Typus}}: {{int:Holotype}} [?], {{Rl|NHMUK}} [=BMNH] ==={{int:Synonymy}}=== * ''Plesioneura fusca'' {{a|George Francis Hampson|Hampson}}, 1889ː {{BHL|page/35550147|367}}. *(See =''Celaenorrhinus spilothyrus area'' Plötz; Seitz, [1927]: {{BHL|page/56106000|1037}}, but not adopted later, ''e.g.'' contra Evans, 1949, etc.). * ''Celaenorrhinus ruficornis fusca'' ({{aut|Hampson}}, 1889); Evans, 1949: {{BHL|page/48224016 |102}}; Bridges, 1994: {{BHL|page/15680564|VIII.88}}, {{BHL|page/15680740|IX.14}}; {{aut|Varshney}} & {{a|Peter Smetacek|Smetacek}} (Eds.), 2015: 37; {{a|Peter Smetacek|Smetacek}}, 2025: 37. * ''Celaenorrhinus fusca'' ({{aut|Hampson}}, 1889); Nitin ''et al.,'' 2018: 11503; {{a|Kalesh Sadasivan|Sadasivan}} & {{a|Ashok Sengupta|Sengupta}}, 2024: Appendix I [Checklist] =={{int:References}}== ==={{int:Primary references}}=== {{Bridges,1994a}} {{Evans,WH, 1949}} {{Hampson, 1889}} *Nitin, R. ''et al.'' 2018. Larval host plants of the butterflies of the Western Ghats, India. ''Journal of Threatened Taxa'' 10(4): 11495–11550 {{Seitz,A, 1912b}} {{Smetacek, 2025}} {{Sadasivan & Sengupta, 2024}} *{{aut|Varshney, R.K.}} & {{a|Peter Smetacek|Smetacek, P.}} (Eds.) 2015. ''A Synoptic Catalogue of the Butterflies of India.'' Butterfly Research Centre, Bhimtal and Indinov Publishing, New Delhi, ii + 261 pp., 8 pl. {{ResearchGate|287980260}} ==={{int:Additional references}}=== ==={{int:Links}}=== *[https://www.nhm.ac.uk/our-science/data/lepindex/detail?taxonno=182186 Lepindex] {{Taxonbar}} {{Commons category}} [[Category:BMNH]] [[Category:George Francis Hampson taxa]] r5qv9iiycur3x0ed9xpr1q9qdo77ppd 11322035 11322034 2026-10-21T15:14:58Z Sjl197 1805579 11322035 wikitext text/x-wiki {{Celaenorrhinus ruficornis}} Subspeciesː ''[[Celaenorrhinus ruficornis fusca]]'' =={{int:Name}}== ''Celaenorrhinus ruficornis fusca'' ({{a|George Francis Hampson|Hampson}}, 1889). {{int:Type locality}}: India, Nilgiri Hills. {{int:Typus}}: {{int:Holotype}} [?], {{Rl|NHMUK}} [=BMNH] ==={{int:Synonymy}}=== * ''Plesioneura fusca'' {{a|George Francis Hampson|Hampson}}, 1889ː {{BHL|page/35550147|367}}. *(See =''Celaenorrhinus spilothyrus area'' Plötz; Seitz, [1927]: {{BHL|page/56106000|1037}}, but not adopted later, ''e.g.'' contra Evans, 1949, etc.). * ''Celaenorrhinus ruficornis fusca'' ({{aut|Hampson}}, 1889); Evans, 1949: {{BHL|page/48224016 |102}}; Bridges, 1994: {{BHL|page/15680564|VIII.88}}, {{BHL|page/15680740|IX.14}}; {{aut|Varshney}} & {{a|Peter Smetacek|Smetacek}} (Eds.), 2015: 37; {{a|Peter Smetacek|Smetacek}}, 2025: 37. * ''Celaenorrhinus fusca'' ({{aut|Hampson}}, 1889); Nitin ''et al.,'' 2018: 11503; {{a|Kalesh Sadasivan|Sadasivan}} & {{a|Ashok Sengupta|Sengupta}}, 2024: Appendix I [Checklist] =={{int:References}}== ==={{int:Primary references}}=== {{Bridges,1994a}} {{Evans,WH, 1949}} {{Hampson, 1889}} *Nitin, R. ''et al.'' 2018. Larval host plants of the butterflies of the Western Ghats, India. ''Journal of Threatened Taxa'' 10(4): 11495–11550. {{ResearchGate|325699582}} {{Sadasivan & Sengupta, 2024}} {{Seitz,A, 1912b}} {{Smetacek, 2025}} *{{aut|Varshney, R.K.}} & {{a|Peter Smetacek|Smetacek, P.}} (Eds.) 2015. ''A Synoptic Catalogue of the Butterflies of India.'' Butterfly Research Centre, Bhimtal and Indinov Publishing, New Delhi, ii + 261 pp., 8 pl. {{ResearchGate|287980260}} ==={{int:Additional references}}=== ==={{int:Links}}=== *[https://www.nhm.ac.uk/our-science/data/lepindex/detail?taxonno=182186 Lepindex] {{Taxonbar}} {{Commons category}} [[Category:BMNH]] [[Category:George Francis Hampson taxa]] ljexus54nlso89909m0ehav78418sf2 Richard Gordon Smith 0 1930986 11322426 9308404 2026-10-21T22:11:59Z The editor 2345 2915305 /* */ 11322426 wikitext text/x-wiki {{Image}} '''Richard Gordon Smith''' (1858–1918), British traveler, sportsman, naturalist and collector. {{Eponyms}} =={{int:Publications}}== {{Inc}} {{DEFAULTSORT:Smith, Richard Gordon}} [[Category:Researchers]] 35m06qcnte6zqnn6jinxn9ft7x0qc7h User:Junglenut/RFKlist 2 1972969 11322395 10655373 2026-10-21T21:54:21Z Junglenut 2394078 /* Meliaceae */ 11322395 wikitext text/x-wiki ==Acanthaceae== {{div col|colwidth=18em}} *''[[Acanthus ilicifolius]]'' *''[[Asystasia sp. Newcastle Bay (L.J.Brass 18671)]]'' *''[[Dicliptera ciliata]]'' *''[[Dicliptera spicata]]'' *''[[Dipteracanthus australasicus]]'' *''[[Graptophyllum excelsum]]'' *''[[Graptophyllum spinigerum]]'' *''[[Harnieria hygrophiloides]]'' *''[[Hypoestes floribunda]]'' *''[[Justicia sp. Marr Creek (B.Hyland 16069)]]'' *''[[Peristrophe brassii]]'' *''[[Pseuderanthemum variabile]]'' *''[[Rhaphidospora cavernarum]]'' *''[[Rhaphidospora platyphylla]]'' *''[[Rostellularia adscendens]]'' *''[[Ruellia tuberosa]]'' *''[[Thunbergia arnhemica]]'' *''[[Thunbergia laurifolia]]'' {{div col end}} ==Achariaceae== *''[[Baileyoxylon lanceolatum]]'' *''[[Ryparosa kurrangii]]'' ==Actinidiaceae== *''[[Saurauia andreana]]'' ==Adoxaceae== *''[[Sambucus australasica]]'' *''[[Sambucus canadensis]]'' ==Alseuosmiaceae== *''[[Crispiloba disperma]]'' ==Amaranthaceae== {{div col|colwidth=24em}} *''[[Achyranthes aspera]]'' *''[[Alternanthera ficoidea]]'' *''[[Alternanthera nana]]'' *''[[Amaranthus hybridus]]'' *''[[Amaranthus interruptus]]'' *''[[Amaranthus rhombeus]]'' *''[[Amaranthus spinosus]]'' *''[[Cyathula prostrata]]'' *''[[Deeringia amaranthoides]]'' *''[[Deeringia arborescens]]'' *''[[Pupalia micrantha]]'' {{div col end}} ==Amaryllidaceae== *''[[Crinum pedunculatum]]'' *''[[Proiphys amboinensis]]'' *''[[Proiphys infundibularis]]'' ==Anacardiaceae== {{div col|colwidth=24em}} *''[[Blepharocarya involucrigera]]'' *''[[Buchanania arborescens]]'' *''[[Buchanania mangoides]]'' *''[[Buchanania obovata]]'' *''[[Euroschinus falcatus]]'' - stub *''[[Mangifera indica]]'' *''[[Pleiogynium timoriense]]'' *''[[Rhus taitensis]]'' <!-- *''[[Schinus terebinthifolius]]'' introduced --> *''[[Semecarpus australiensis]]'' {{div col end}} ==Annonaceae== {{div col|colwidth=18em}} *''[[Annona glabra]]'' *''[[Annona squamosa]]'' *''[[Artabotrys carnosipetalus]]'' CYP *''[[Cananga odorata]]'' *''[[Desmos goezeanus]]'' *''[[Desmos polycarpus]]'' *''[[Desmos wardianus]]'' CYP, NT *''[[Goniothalamus australis]]'' *''[[Huberantha nitidissima]]'' *''[[Meiogyne bidwillii]]'' *''[[Meiogyne cylindrocarpa]]'' *''[[Meiogyne heteropetala]]'' *''[[Meiogyne hirsuta]]'' *''[[Meiogyne trichocarpa]]'' *''[[Meiogyne verrucosa]]'' *''[[Miliusa brahei]]'' *''[[Miliusa horsfieldii ]]'' *''[[Miliusa traceyi]]'' *''[[Mitrella tiwiensis]]'' *''[[Mitrephora diversifolia]]'' *''[[Monoon australe]]'' *''[[Monoon michaelii]]'' *''[[Monoon patinatum]]'' *''[[Polyalthia fruticosa]]'' *''[[Polyalthia hispida]]'' *''[[Polyalthia johnsonii]]'' *''[[Polyalthia submontana]]'' *''[[Polyalthia xanthocarpa]]'' *''[[Pseuduvaria froggattii]]'' *''[[Pseuduvaria hylandii]]'' *''[[Pseuduvaria mulgraveana]]'' *''[[Pseuduvaria villosa]]'' *''[[Uvaria concava]]'' *''[[Uvaria glabra]]'' *''[[Uvaria holtzei]]'' *''[[Uvaria leichhardtii ]]'' *''[[Uvaria micrantha]]'' *''[[Uvaria rufa]]'' *''[[Uvaria rupestre]]'' *''[[Uvaria sankowskyi]]'' *''[[Uvaria scabridula]]'' *''[[Uvaria topazensis]]'' *''[[Uvaria uhrii]]'' *''[[Uvaria unguiculata]]'' *''[[Xylopia maccreae]]'' *''[[Xylopia monosperma]]'' {{div col end}} ==Apiaceae== *''[[Centella asiatica]]'' *''[[Mackinlaya confusa]]'' *''[[Mackinlaya macrosciadea ]]'' ==Apocynaceae== {{div col|colwidth=18em}} *''[[Allamanda cathartica]]'' *''[[Alstonia actinophylla]]'' *''[[Alstonia constricta]]'' *''[[Alstonia linearis]]'' *''[[Alstonia muelleriana]]'' *''[[Alstonia scholaris]]'' *''[[Alstonia spectabilis]]'' *''[[Alyxia grandis]]'' *''[[Alyxia ilicifolia]]'' *''[[Alyxia magnifolia]]'' *''[[Alyxia oblongata]]'' *''[[Alyxia orophila]]'' *''[[Alyxia ruscifolia]]'' *''[[Alyxia spicata]]'' *''[[Alyxia stellata]]'' *''[[Asclepias curassavica]]'' *''[[Calotropis procera]]'' *''[[Carissa lanceolata]]'' *''[[Carissa laxiflora]]'' *''[[Carissa ovata]]'' *''[[Carissa scabra]]'' *''[[Cascabela thevetia]]'' *''[[Catharanthus roseus]]'' *''[[Cerbera floribunda]]'' *''[[Cerbera inflata]]'' *''[[Cerbera manghas]]'' *''[[Ceropegia cumingiana ]]'' *''[[Cryptostegia grandiflora]]'' *''[[Cynanchum bowmanii]]'' *''[[Cynanchum carnosum]]'' *''[[Cynanchum leptolepis]]'' *''[[Cynanchum ovalifolium]]'' *''[[Cynanchum pedunculatum]]'' *''[[Cynanchum viminale]]'' *''[[Dischidia litoralis]]'' *''[[Dischidia major]]'' *''[[Dischidia nummularia ]]'' *''[[Dischidia ovata]]'' *''[[Gomphocarpus physocarpus]]'' *''[[Gunnessia pepo]]'' *''[[Gymnanthera oblonga ]]'' *''[[Heterostemma acuminatum]]'' *''[[Hoya anulata]]'' *''[[Hoya australis]]'' *''[[Hoya macgillivrayi]]'' *''[[Hoya pottsii]]'' *''[[Hoya sussuela]]'' *''[[Ichnocarpus frutescens]]'' *''[[Ichnocarpus rhombifolius]]'' *''[[Kopsia arborea]]'' *''[[Marsdenia connivens ]]'' *''[[Marsdenia cymulosa]]'' *''[[Marsdenia geminata]]'' *''[[Marsdenia glandulifera]]'' *''[[Marsdenia hemiptera]]'' *''[[Marsdenia jensenii]]'' *''[[Marsdenia longipedicellata]]'' *''[[Marsdenia micradenia]]'' *''[[Marsdenia microlepis]]'' *''[[Marsdenia paludicola]]'' *''[[Marsdenia pleiadenia]]'' *''[[Marsdenia rostrata]]'' *''[[Marsdenia straminea]]'' *''[[Marsdenia tricholepis]]'' *''[[Marsdenia velutina]]'' *''[[Marsdenia viridiflora]]'' *''[[Melodinus acutiflorus]]'' *''[[Melodinus australis]]'' *''[[Melodinus baccellianus]]'' *''[[Melodinus forbesii]]'' *''[[Neisosperma kilneri]]'' *''[[Neisosperma poweri]]'' *''[[Ochrosia elliptica]]'' *''[[Ochrosia minima]]'' *''[[Parsonsia alboflavescens]]'' *''[[Parsonsia bartlensis]]'' *''[[Parsonsia blakeana]]'' *''[[Parsonsia densivestita]]'' *''[[Parsonsia eucalyptophylla]]'' *''[[Parsonsia ferruginea]]'' *''[[Parsonsia grayana]]'' *''[[Parsonsia lanceolata]]'' *''[[Parsonsia langiana]]'' *''[[Parsonsia larcomensis]]'' *''[[Parsonsia latifolia]]'' *''[[Parsonsia lenticellata]]'' *''[[Parsonsia longipetiolata]]'' *''[[Parsonsia plaesiophylla]]'' *''[[Parsonsia rotata]]'' *''[[Parsonsia straminea]]'' *''[[Parsonsia velutina]]'' *''[[Parsonsia ventricosa]]'' *''[[Parsonsia wildensis]]'' *''[[Parsonsia wongabelensis]]'' *''[[Phyllanthera grayi]]'' *''[[Sarcolobus hullsii]]'' *''[[Sarcolobus vittatus]]'' *''[[Secamone elliptica]]'' *''[[Secamone lineata]]'' *''[[Secamone timorensis]]'' *''[[Tabernaemontana orientalis]]'' *''[[Tabernaemontana pandacaqui]]'' *''[[Tylophora benthamii]]'' *''[[Tylophora cinerascens]]'' *''[[Tylophora colorata]]'' *''[[Tylophora flexuosa]]'' *''[[Tylophora grandiflora]]'' *''[[Tylophora williamsii]]'' *''[[Voacanga grandifolia]]'' *''[[Wrightia laevis]]'' *''[[Wrightia pubescens]]'' *''[[Wrightia saligna]]'' *''[[Wrightia versicolor]]'' {{div col end}} ==Aquifoliaceae== *''[[Ilex arnhemensis]]'' *''[[Ilex sp. Gadgarra (B.P.Hyland RFK 2011) ]]'' ==Araceae== {{div col|colwidth=18em}} *''[[Alocasia brisbanensis]]'' *''[[Amorphophallus galbra]]'' *''[[Amorphophallus paeoniifolius]]'' *''[[Colocasia esculenta]]'' *''[[Epipremnum amplissimum]]'' *''[[Epipremnum pinnatum]]'' *''[[Epipremnum pinnatum cv. Aureum]]'' *''[[Gymnostachys anceps]]'' *''[[Pothos brassii]]'' *''[[Pothos longipes]]'' *''[[Remusatia vivipara]]'' *''[[Rhaphidophora australasica]]'' *''[[Rhaphidophora hayi]]'' *''[[Rhaphidophora petrieana ]]'' *''[[Scindapsus altissimus]]'' *''[[Syngonium podophyllum]]'' *''[[Typhonium alismifolium]]'' *''[[Typhonium brownii]]'' *''[[Typhonium flagelliforme]]'' *''[[Typhonium peltandroides]]'' *''[[Typhonium wilbertii]]'' {{div col end}} ==Araliaceae== {{div col|colwidth=18em}} *''[[Cephalaralia cephalobotrys]]'' *''[[Hydrocotyle acutiloba]]'' *''[[Hydrocotyle digitata]]'' *''[[Hydrocotyle miranda]]'' *''[[Hydrocotyle pedicellosa]]'' *''[[Hydrocotyle peduncularis]]'' *''[[Hydrocotyle tripartita]]'' *''[[Motherwellia haplosciadea]]'' *''[[Polyscias australiana]]'' *''[[Polyscias bellendenkerensis]]'' *''[[Polyscias elegans]]'' *''[[Polyscias macgillivrayi]]'' *''[[Polyscias mollis]]'' *''[[Polyscias murrayi]]'' *''[[Polyscias nodosa]]'' *''[[Polyscias purpurea]]'' *''[[Polyscias spectabilis]]'' *''[[Polyscias willmottii]]'' *''[[Polyscias zippeliana]]'' *''[[Schefflera actinophylla]]'' *''[[Schefflera bractescens]]'' *''[[Schefflera elliptica]]'' *''[[Trachymene geraniifolia]]'' *''[[Trachymene tenuifolia]]'' {{div col end}} ==Araucariaceae== *''[[Agathis atropurpurea]]'' *''[[Agathis microstachya]]'' *''[[Agathis robusta]]'' *''[[Araucaria bidwillii]]'' *''[[Araucaria cunninghamii]]'' ==Arecaceae== {{div col|colwidth=18em}} *''[[Archontophoenix alexandrae]]'' *''[[Archontophoenix cunninghamiana]]'' *''[[Archontophoenix maxima]]'' *''[[Archontophoenix myolensis]]'' *''[[Archontophoenix purpurea]]'' *''[[Archontophoenix tuckeri]]'' *''[[Arenga australasica]]'' *''[[Arenga microcarpa]]'' *''[[Calamus aruensis]]'' *''[[Calamus australis]]'' *''[[Calamus caryotoides]]'' *''[[Calamus moti]]'' *''[[Calamus radicalis ]]'' *''[[Calamus vitiensis]]'' *''[[Calamus warburgii]]'' *''[[Carpentaria acuminata]]'' *''[[Caryota albertii]]'' *''[[Cocos nucifera]]'' *''[[Corypha utan]]'' *''[[Hydriastele costata]]'' *''[[Hydriastele wendlandiana]]'' *''[[Laccospadix australasicus]]'' *''[[Licuala ramsayi]]'' *''[[Linospadix apetiolatus]]'' *''[[Linospadix microcaryus]]'' *''[[Linospadix minor]]'' *''[[Linospadix palmerianus]]'' *''[[Livistona australis]]'' *''[[Livistona benthamii]]'' *''[[Livistona concinna]]'' *''[[Livistona decora]]'' *''[[Livistona drudei]]'' *''[[Livistona muelleri]]'' *''[[Livistona rigida]]'' *''[[Livistona victoriae]]'' *''[[Normanbya normanbyi]]'' *''[[Oraniopsis appendiculata ]]'' *''[[Ptychosperma elegans]]'' *''[[Ptychosperma macarthurii]]'' *''[[Wodyetia bifurcata]]'' {{div col end}} ==Argophyllaceae== {{div col|colwidth=24em}} *''[[Argophyllum cryptophlebum]]'' *''[[Argophyllum curtum]]'' *''[[Argophyllum ferrugineum]]'' *''[[Argophyllum heterodontum]]'' *''[[Argophyllum iridescens]]'' *''[[Argophyllum jagonis]]'' *''[[Argophyllum lejourdanii]]'' *''[[Argophyllum loxotrichum]]'' *''[[Argophyllum nullumense]]'' *''[[Argophyllum verae]]'' 🚫 {{div col end}} ==Aristolochiaceae== {{div col|colwidth=24em}} *''[[Aristolochia acuminata ]]'' *''[[Aristolochia australopithecurus]]'' *''[[Aristolochia chalmersii]]'' *''[[Aristolochia deltantha]]'' *''[[Aristolochia elegans]]'' *''[[Aristolochia indica]]'' *''[[Aristolochia peninsulensis]]'' *''[[Aristolochia praevenosa]]'' *''[[Aristolochia pubera]]'' *''[[Aristolochia sparusifolia]]'' *''[[Aristolochia thozetii]]'' {{div col end}} ==Asparagaceae== {{div col|colwidth=24em}} *''[[Asparagus aethiopicus]]'' *''[[Asparagus plumosus]]'' *''[[Asparagus racemosus]]'' *''[[Cordyline cannifolia]]'' *''[[Cordyline fruticosa]]'' *''[[Cordyline manners-suttoniae]]'' *''[[Cordyline murchisoniae]]'' *''[[Cordyline petiolaris]]'' *''[[Eustrephus latifolius]]'' *''[[Lomandra banksii]]'' *''[[Lomandra hystrix]]'' *''[[Lomandra longifolia]]'' *''[[Lomandra tropica]]'' *''[[Pleomele angustifolia ]]'' *''[[Romnalda grallata]]'' *''[[Romnalda ophiopogonoides]]'' {{div col end}} ==Asteraceae== {{div col|colwidth=18em}} *''[[Acanthospermum hispidum]]'' *''[[Adenostemma lavenia]]'' *''[[Adenostemma macrophyllum ]]'' *''[[Ageratina riparia]]'' *''[[Ageratum conyzoides]]'' *''[[Apowollastonia longipes]]'' *''[[Bidens alba]]'' *''[[Bidens bipinnata]]'' *''[[Bidens pilosa]]'' *''[[Bidens subalternans]]'' *''[[Blainvillea cunninghamii]]'' *''[[Blumea riparia]]'' *''[[Blumea sylvatica]]'' *''[[Calyptocarpus vialis]]'' *''[[Cassinia subtropica]]'' *''[[Centratherum punctatum]]'' *''[[Chromolaena odorata]]'' *''[[Cirsium vulgare]]'' *''[[Coronidium rupicola]]'' *''[[Cosmos caudatus]]'' *''[[Crassocephalum crepidioides]]'' *''[[Cyanthillium cinereum]]'' *''[[Cyanthillium patulum]]'' *''[[Dichrocephala integrifolia]]'' *''[[Eclipta prostrata]]'' *''[[Elephantopus scaber]]'' *''[[Eleutheranthera ruderalis]]'' *''[[Emilia sonchifolia]]'' *''[[Erechtites valerianifolius]]'' *''[[Erigeron canadensis]]'' *''[[Erigeron sumatrensis]]'' *''[[Eschenbachia leucantha]]'' *''[[Gynura drymophila]]'' *''[[Mikania micrantha]]'' *''[[Montanoa hibiscifolia]]'' *''[[Olearia canescens]]'' *''[[Ozothamnus cassinioides]]'' *''[[Ozothamnus diosmifolius]]'' *''[[Phacellothrix cladochaeta]]'' *''[[Praxelis clematidea]]'' *''[[Pseudelephantopus spicatus]]'' *''[[Senecio bipinnatisectus]]'' *''[[Senecio tamoides]]'' *''[[Sigesbeckia orientalis]]'' *''[[Sphagneticola trilobata]]'' *''[[Synedrella nodiflora]]'' *''[[Tagetes minuta]]'' *''[[Tithonia diversifolia]]'' *''[[Tridax procumbens]]'' *''[[Vittadinia bicolor]]'' *''[[Vittadinia scabra]]'' *''[[Wollastonia biflora]]'' *''[[Youngia japonica]]'' {{div col end}} ==Atherospermataceae== *''[[Daphnandra apatela]]'' *''[[Daphnandra repandula]]'' *''[[Doryphora aromatica]]'' *''[[Dryadodaphne trachyphloia]]'' ==Austrobaileyaceae== *''[[Austrobaileya scandens]]'' ==Balanopaceae== *''[[Balanops australiana]]'' ==Balanophoraceae== *''[[Balanophora fungosa]]'' ==Balsaminaceae== *''[[Impatiens walleriana]]'' ==Basellaceae== *''[[Anredera cordifolia]]'' ==Begoniaceae== *''[[Begonia hirtella]]'' ==Bignoniaceae== {{div col|colwidth=24em}} *''[[Deplanchea tetraphylla]]'' *''[[Dolichandrone spathacea]]'' *''[[Macfadyena unguis-cati]]'' *''[[Neosepicaea jucunda]]'' *''[[Neosepicaea viticoides]]'' *''[[Pandorea jasminoides]]'' *''[[Pandorea nervosa]]'' *''[[Pandorea pandorana]]'' *''[[Parmentiera aculeata]]'' *''[[Spathodea campanulata]]'' *''[[Tecomanthe burungu]]'' {{div col end}} ==Bixaceae== *''[[Cochlospermum gillivraei]]'' ==Boraginaceae== {{div col|colwidth=24em}} *''[[Cordia aspera]]'' *''[[Cordia dichotoma]]'' *''[[Cordia myxa]]'' *''[[Cordia subcordata]]'' *''[[Cynoglossum australe]]'' *''[[Ehretia acuminata]]'' *''[[Ehretia grahamii]]'' *''[[Ehretia microphylla]]'' *''[[Ehretia saligna]]'' *''[[Ehretia sp. Whitfield Range (R.Jago 17)]]'' *''[[Heliotropium foertherianum]]'' *''[[Heliotropium muelleri]]'' *''[[Heliotropium sarmentosum]]'' *''[[Heliotropium tenuifolium]]'' *''[[Trichodesma zeylanicum]]'' {{div col end}} ==Brassicaceae== *''[[Cardamine flexuosa]]'' ==Burseraceae== *''[[Canarium acutifolium]]'' *''[[Canarium australasicum]]'' *''[[Canarium australianum]]'' *''[[Canarium muelleri]]'' *''[[Canarium vitiense]]'' *''[[Garuga floribunda]]'' ==Cactaceae== *''[[Opuntia stricta]]'' *''[[Opuntia tomentosa]]'' ==Calycanthaceae== *''[[Idiospermum australiense]]'' ==Campanulaceae== *''[[Lobelia trigonocaulis]]'' ==Cannabaceae== {{div col|colwidth=24em}} *''[[Aphananthe philippinensis]]'' *''[[Celtis hildebrandii]]'' *''[[Celtis paniculata]]'' *''[[Celtis philippensis]]'' *''[[Celtis strychnoides]]'' *''[[Celtis timorensis]]'' *''[[Trema cannabina]]'' *''[[Trema orientalis]]'' *''[[Trema tomentosa]]'' {{div col end}} ==Cannaceae== *''[[Canna indica]]'' ==Capparaceae== {{div col|colwidth=24em}} *''[[Cadaba capparoides]]'' *''[[Capparis arborea]]'' *''[[Capparis batianoffii]]'' *''[[Capparis jacobsii]]'' *''[[Capparis lanceolaris]]'' *''[[Capparis lasiantha]]'' *''[[Capparis lucida]]'' *''[[Capparis ornans]]'' *''[[Capparis quiniflora]]'' *''[[Capparis sepiaria]]'' *''[[Capparis shanesiana]]'' *''[[Capparis sp. Iron Range (B.Hyland 16395)]]'' *''[[Crateva religiosa]]'' {{div col end}} ==Cardiopteridaceae== *''[[Cardiopteris moluccana]]'' ==Caryophyllaceae== *''[[Drymaria cordata]]'' ==Casuarinaceae== *''[[Allocasuarina torulosa]]'' *''[[Casuarina cristata]]'' *''[[Casuarina cunninghamiana]]'' *''[[Casuarina equisetifolia]]'' *''[[Gymnostoma australianum]]'' ==Celastraceae== {{div col|colwidth=18em}} *''[[Brassiantha hedraiantheroides]]'' *''[[Celastrus subspicatus]]'' *''[[Denhamia bilocularis]]'' *''[[Denhamia cunninghamii]]'' *''[[Denhamia disperma]]'' *''[[Denhamia fasciculiflora]]'' *''[[Denhamia obscura]]'' *''[[Denhamia oleaster]]'' *''[[Denhamia peninsularis]]'' *''[[Denhamia pittosporoides]]'' *''[[Denhamia viridissima]]'' *''[[Dinghoua globularis]]'' *''[[Elaeodendron australe]]'' *''[[Elaeodendron melanocarpum]]'' *''[[Euonymus australiana]]'' *''[[Gymnosporia inermis]]'' *''[[Hedraianthera porphyropetala]]'' *''[[Hexaspora pubescens]]'' *''[[Hippocratea barbata]]'' *''[[Hypsophila dielsiana]]'' *''[[Hypsophila halleyana]]'' *''[[Lophopetalum arnhemicum]]'' *''[[Perrottetia arborescens]]'' *''[[Pleurostylia opposita]]'' *''[[Salacia chinensis]]'' *''[[Salacia disepala]]'' *''[[Salacia erythrocarpa]]'' *''[[Siphonodon australis]]'' *''[[Siphonodon membranaceus]]'' {{div col end}} ==Chenopodiaceae== *''[[Dysphania carinata]]'' *''[[Einadia hastata]]'' ==Chrysobalanaceae== *''[[Maranthes corymbosa]]'' *''[[Parinari nonda]]'' ==Cleomaceae== *''[[Cleome aculeata]]'' *''[[Cleome viscosa]]'' ==Clusiaceae== {{div col|colwidth=18em}} *''[[Calophyllum australianum]]'' *''[[Calophyllum bicolor]]'' *''[[Calophyllum costatum]]'' *''[[Calophyllum inophyllum]]'' *''[[Calophyllum sil]]'' *''[[Calophyllum soulattri]]'' *''[[Garcinia brassii]]'' *''[[Garcinia dulcis]]'' *''[[Garcinia gibbsiae]]'' *''[[Garcinia jensenii]]'' *''[[Garcinia leggeae]]'' *''[[Garcinia mestonii]]'' *''[[Garcinia russellii]]'' *''[[Garcinia warrenii]]'' *''[[Garcinia xanthochymus]]'' *''[[Garcinia zichii]]'' *''[[Mammea touriga]]'' *''[[Mesua larnachiana]]'' *''[[Mesua sp. Boonjee (A.K.Irvine 1218)]]'' {{div col end}} ==Colchicaceae== *''[[Kuntheria pedunculata]]'' *''[[Schelhammera multiflora]]'' ==Combretaceae== {{div col|colwidth=18em}} *''[[Combretum trifoliatum]]'' *''[[Dansiea elliptica]]'' *''[[Macropteranthes fitzalanii]]'' *''[[Macropteranthes leiocaulis]]'' *''[[Macropteranthes montana]]'' *''[[Quisqualis indica]]'' *''[[Terminalia arenicola]]'' *''[[Terminalia aridicola]]'' *''[[Terminalia catappa]]'' *''[[Terminalia complanata]]'' *''[[Terminalia erythrocarpa]]'' *''[[Terminalia melanocarpa]]'' *''[[Terminalia microcarpa]]'' *''[[Terminalia muelleri]]'' *''[[Terminalia oblongata]]'' *''[[Terminalia petiolaris]]'' *''[[Terminalia platyphylla]]'' *''[[Terminalia porphyrocarpa]]'' *''[[Terminalia subacroptera]]'' *''[[Terminalia volucris]]'' {{div col end}} ==Commelinaceae== {{div col|colwidth=18em}} *''[[Aneilema acuminatum]]'' *''[[Aneilema papuanum]]'' *''[[Aneilema siliculosum]]'' *''[[Commelina diffusa]]'' *''[[Commelina ensifolia]]'' *''[[Cyanotis axillaris]]'' *''[[Floscopa scandens]]'' *''[[Pollia crispata]]'' *''[[Pollia macrophylla]]'' *''[[Tradescantia zebrina]]'' {{div col end}} ==Connaraceae== *''[[Connarus conchocarpus]]'' *''[[Rourea brachyandra]]'' ==Convolvulaceae== {{div col|colwidth=18em}} *''[[Argyreia nervosa]]'' *''[[Bonamia dietrichiana]]'' *''[[Camonea pilosa]]'' *''[[Decalobanthus peltatus]]'' *''[[Distimake dissectus]]'' *''[[Distimake quinquefolius]]'' *''[[Distimake tuberosus]]'' *''[[Erycibe coccinea]]'' *''[[Ipomoea abrupta]]'' *''[[Ipomoea aculeata]]'' *''[[Ipomoea cairica]]'' *''[[Ipomoea eriocarpa]]'' *''[[Ipomoea gracilis]]'' *''[[Ipomoea hederifolia]]'' *''[[Ipomoea indica]]'' *''[[Ipomoea littoralis]]'' *''[[Ipomoea mauritiana]]'' *''[[Ipomoea muelleri]]'' *''[[Ipomoea nil]]'' *''[[Ipomoea obscura]]'' *''[[Ipomoea pes-caprae]]'' *''[[Ipomoea plebeia]]'' *''[[Ipomoea quamoclit]]'' *''[[Ipomoea saintronanensis]]'' *''[[Ipomoea sp. Merluna (B.Hyland 21374V)]]'' *''[[Ipomoea trichosperma]]'' *''[[Ipomoea triloba]]'' *''[[Ipomoea velutina]]'' *''[[Ipomoea violacea]]'' *''[[Jacquemontia paniculata]]'' *''[[Lepistemon urceolatus]]'' *''[[Merremia gemella]]'' *''[[Merremia hederacea]]'' *''[[Operculina riedeliana]]'' *''[[Stictocardia queenslandica ]]'' *''[[Turbina corymbosa]]'' *''[[Xenostegia tridentata]]'' {{div col end}} ==Cornaceae== *''[[Alangium polyosmoides]]'' *''[[Alangium solomonense]]'' ==Corsiaceae== *''[[Corsia dispar]]'' ==Corynocarpaceae== *''[[Corynocarpus cribbianus]]'' ==Costaceae== *''[[Cheilocostus potierae]]'' *''[[Costus dubius]]'' *''[[Tapeinochilos ananassae]]'' ==Crassulaceae== *''[[Bryophyllum pinnatum]]'' ==Cucurbitaceae== {{div col|colwidth=18em}} *''[[Cucumis althaeoides]]'' *''[[Cucumis anguria]]'' *''[[Cucumis costatus]]'' *''[[Cucumis melo]]'' *''[[Cucumis queenslandicus]]'' *''[[Cucumis umbellatus]]'' *''[[Diplocyclos palmatus]]'' *''[[Luffa aegyptiaca]]'' *''[[Momordica charantia]]'' *''[[Momordica cochinchinensis]]'' *''[[Muellerargia timorensis]]'' *''[[Neoalsomitra capricornica]]'' *''[[Neoalsomitra clavigera]]'' *''[[Sicyos australis]]'' *''[[Sicyos undara]]'' *''[[Trichosanthes cucumerina]]'' *''[[Trichosanthes morrisii]]'' *''[[Trichosanthes odontosperma]]'' *''[[Trichosanthes pentaphylla]]'' *''[[Trichosanthes pilosa]]'' *''[[Zehneria cunninghamii]]'' {{div col end}} ==Cunoniaceae== {{div col|colwidth=18em}} *''[[Ackama australiensis]]'' *''[[Ackama paniculosa]]'' *''[[Ceratopetalum corymbosum]]'' *''[[Ceratopetalum hylandii]]'' *''[[Ceratopetalum iugumensis]]'' *''[[Ceratopetalum macrophyllum]]'' *''[[Ceratopetalum succirubrum]]'' *''[[Ceratopetalum virchowii]]'' *''[[Davidsonia pruriens]]'' *''[[Eucryphia wilkiei]]'' *''[[Gillbeea adenopetala]]'' *''[[Gillbeea whypallana]]'' *''[[Karrabina biagiana]]'' *''[[Pseudoweinmannia apetala]]'' *''[[Pullea stutzeri]]'' *''[[Schizomeria ovata]]'' *''[[Schizomeria whitei]]'' *''[[Spiraeanthemum davidsonii]]'' {{div col end}} ==Cupressaceae== *''[[Callitris intratropica]]'' *''[[Callitris macleayana]]'' ==Cycadaceae== *''[[Cycas media]]'' *''[[Cycas silvestris]]'' ==Cyperaceae== {{div col|colwidth=18em}} *''[[Arthrostylis aphylla]]'' *''[[Bulbostylis barbata]]'' *''[[Carex brunnea]]'' *''[[Carex cryptostachys]]'' *''[[Carex horsfieldii]]'' *''[[Carex maculata]]'' *''[[Carex rafflesiana]]'' *''[[Cyperus aquatilis]]'' *''[[Cyperus brevifolius]]'' *''[[Cyperus bulbosus]]'' *''[[Cyperus decompositus]]'' *''[[Cyperus dietrichiae]]'' *''[[Cyperus enervis]]'' *''[[Cyperus gracilis]]'' *''[[Cyperus gunnii]]'' *''[[Cyperus haspan]]'' *''[[Cyperus hyalinus]]'' *''[[Cyperus involucratus]]'' *''[[Cyperus javanicus]]'' *''[[Cyperus laxus]]'' *''[[Cyperus mirus]]'' *''[[Cyperus multispiceus]]'' *''[[Cyperus paniceus]]'' *''[[Cyperus pedunculosus]]'' *''[[Cyperus pilosus]]'' *''[[Cyperus polystachyos ]]'' *''[[Cyperus sulcinux]]'' *''[[Cyperus tetraphyllus]]'' *''[[Cyperus triceps]]'' *''[[Cyperus trinervis]]'' *''[[Cyperus zollingeri]]'' *''[[Eleocharis ochrostachys ]]'' *''[[Exocarya scleroides]]'' *''[[Fimbristylis depauperata ]]'' *''[[Fimbristylis dichotoma]]'' *''[[Fimbristylis microcarya]]'' *''[[Fimbristylis pauciflora]]'' *''[[Fuirena ciliaris]]'' *''[[Fuirena umbellata]]'' *''[[Gahnia aspera]]'' *''[[Gahnia sieberiana]]'' *''[[Hypolytrum compactum]]'' *''[[Hypolytrum nemorum]]'' *''[[Hypolytrum proliferum]]'' *''[[Isolepis humillima]]'' *''[[Rhynchospora corymbosa]]'' *''[[Rhynchospora leae]]'' *''[[Scirpodendron ghaeri]]'' *''[[Scleria brownii]]'' *''[[Scleria ciliaris]]'' *''[[Scleria levis]]'' *''[[Scleria lingulata]]'' *''[[Scleria lithosperma]]'' *''[[Scleria novae-hollandiae]]'' *''[[Scleria polycarpa]]'' *''[[Scleria rugosa]]'' *''[[Scleria sphacelata]]'' *''[[Scleria sumatrensis]]'' *''[[Scleria terrestris]]'' *''[[Thoracostachyum sumatranum]]'' {{div col end}} ==Datiscaceae== *''[[Tetrameles nudiflora]]'' ==Dichapetalaceae== *''[[Dichapetalum papuanum]]'' *''[[Dichapetalum timoriense]]'' ==Dilleniaceae== *''[[Dillenia alata]]'' *''[[Hibbertia banksii]]'' *''[[Hibbertia melhanioides ]]'' *''[[Hibbertia scandens]]'' *''[[Tetracera daemeliana]]'' *''[[Tetracera nordtiana]]'' ==Dioscoreaceae== *''[[Dioscorea alata]]'' *''[[Dioscorea bulbifera]]'' *''[[Dioscorea transversa]]'' ==Droseraceae== *''[[Drosera adelae]]'' *''[[Drosera lunata]]'' *''[[Drosera prolifera]]'' *''[[Drosera schizandra]]'' ==Ebenaceae== {{div col|colwidth=18em}} *''[[Diospyros areolifolia]]'' *''[[Diospyros australis]]'' *''[[Diospyros calycantha]]'' *''[[Diospyros compacta]]'' *''[[Diospyros fasciculosa]]'' *''[[Diospyros geminata]]'' *''[[Diospyros granitica]]'' *''[[Diospyros hebecarpa]]'' *''[[Diospyros hemicycloides]]'' *''[[Diospyros humilis]]'' *''[[Diospyros laurina]]'' *''[[Diospyros littorea]]'' *''[[Diospyros maritima]]'' *''[[Diospyros peninsularis]]'' *''[[Diospyros pentamera]]'' *''[[Diospyros pluviatilis]]'' *''[[Diospyros rheophila]]'' *''[[Diospyros rugosula]]'' *''[[Diospyros sp. Ham Hill (B.Hyland 2941RFK)]]'' *''[[Diospyros uvida]]'' {{div col end}} ==Elaeagnaceae== *''[[Elaeagnus triflora]]'' ==Elaeocarpaceae== {{div col|colwidth=18em}} *''[[Aceratium concinnum]]'' *''[[Aceratium doggrellii]]'' *''[[Aceratium ferrugineum]]'' *''[[Aceratium megalospermum]]'' *''[[Aceratium sericoleopsis]]'' *''[[Elaeocarpus angustifolius]]'' *''[[Elaeocarpus arnhemicus]]'' *''[[Elaeocarpus bancroftii]]'' *''[[Elaeocarpus carbinensis]]'' *''[[Elaeocarpus carolinae]]'' *''[[Elaeocarpus coorangooloo]]'' *''[[Elaeocarpus culminicola]]'' *''[[Elaeocarpus elliffii]]'' *''[[Elaeocarpus eumundi]]'' *''[[Elaeocarpus ferruginiflorus]]'' *''[[Elaeocarpus foveolatus]]'' *''[[Elaeocarpus grahamii]]'' *''[[Elaeocarpus grandis]]'' *''[[Elaeocarpus hylobroma]]'' *''[[Elaeocarpus johnsonii]]'' *''[[Elaeocarpus kirtonii]]'' *''[[Elaeocarpus largiflorens]]'' *''[[Elaeocarpus linsmithii]]'' *''[[Elaeocarpus miegei]]'' *''[[Elaeocarpus obovatus]]'' *''[[Elaeocarpus ruminatus]]'' *''[[Elaeocarpus sericopetalus]]'' *''[[Elaeocarpus sp. Mt Bellenden Ker (L.J.Brass 18336)]]'' *''[[Elaeocarpus sp. Windsor Tableland (B.Hyland 5541)]]'' *''[[Elaeocarpus stellaris]]'' *''[[Elaeocarpus thelmae]]'' *''[[Peripentadenia mearsii]]'' *''[[Peripentadenia phelpsii]]'' *''[[Sloanea australis]]'' *''[[Sloanea langii]]'' *''[[Sloanea macbrydei]]'' {{div col end}} ==Ericaceae== {{div col|colwidth=18em}} *''[[Acrothamnus spathaceus]]'' *''[[Acrotriche aggregata]]'' *''[[Acrotriche baileyana]]'' *''[[Dracophyllum sayeri]]'' *''[[Leucopogon malayanus]]'' *''[[Leucopogon ruscifolius]]'' *''[[Leucopogon yorkensis]]'' *''[[Paphia meiniana]]'' *''[[Rhododendron lochiae ]]'' *''[[Rhododendron viriosum]]'' *''[[Trochocarpa bellendenkerensis]]'' {{div col end}} ==Erythroxylaceae== *''[[Erythroxylum australe]]'' *''[[Erythroxylum sp. Brewer LA (B.Hyland 13373)]]'' *''[[Erythroxylum sp. Mosquito Point (J.R.Clarkson 9991)]]'' ==Escalloniaceae== {{div col|colwidth=24em}} *''[[Polyosma alangiacea]]'' *''[[Polyosma hirsuta]]'' *''[[Polyosma reducta]]'' *''[[Polyosma rhytophloia]]'' *''[[Polyosma rigidiuscula]]'' *''[[Polyosma sp. Mt Bellenden Ker (B.Hyland 2524RFK)]]'' *''[[Polyosma sp. Mt Lewis (B.Hyland 25241RFK)]]'' {{div col end}} ==Euphorbiaceae== {{div col|colwidth=18em}} *''[[Acalypha eremorum]]'' *''[[Acalypha lanceolata]]'' *''[[Acalypha lyonsii]]'' *''[[Acalypha nemorum]]'' *''[[Acalypha pubiflora]]'' *''[[Alchornea ilicifolia]]'' *''[[Alchornea rugosa]]'' *''[[Alchornea thozetiana]]'' *''[[Aleurites moluccanus]]'' *''[[Aleurites rockinghamensis ]]'' *''[[Baloghia inophylla]]'' *''[[Baloghia parviflora]]'' *''[[Bertya polystigma]]'' *''[[Claoxylon angustifolium]]'' *''[[Claoxylon hillii]]'' *''[[Claoxylon tenerifolium]]'' *''[[Cleidion javanicum]]'' *''[[Codiaeum membranaceum]]'' *''[[Codiaeum variegatum]]'' *''[[Croton acronychioides]]'' *''[[Croton arnhemicus]]'' *''[[Croton brachypus]]'' *''[[Croton capitis-york]]'' *''[[Croton caudatus]]'' *''[[Croton densivestitus]]'' *''[[Croton dockrillii]]'' *''[[Croton habrophyllus]]'' *''[[Croton insularis]]'' *''[[Croton mutabilis]]'' *''[[Croton phebalioides]]'' *''[[Croton simulans]]'' *''[[Croton stockeri]]'' *''[[Croton tomentellus]]'' *''[[Croton triacros]]'' *''[[Dimorphocalyx australiensis]]'' *''[[Endospermum myrmecophilum]]'' *''[[Euphorbia cyathophora]]'' *''[[Euphorbia hirta]]'' *''[[Euphorbia hyssopifolia]]'' *''[[Euphorbia plumerioides]]'' *''[[Euphorbia tannensis]]'' *''[[Excoecaria agallocha]]'' *''[[Excoecaria dallachyana]]'' *''[[Fontainea picrosperma]]'' *''[[Homalanthus novo-guineensis]]'' *''[[Homalanthus populifolius]]'' *''[[Hylandia dockrillii]]'' *''[[Macaranga dallachyana]]'' *''[[Macaranga inamoena]]'' *''[[Macaranga involucrata]]'' *''[[Macaranga polyadenia]]'' *''[[Macaranga subdentata]]'' *''[[Macaranga tanarius]]'' *''[[Mallotus claoxyloides]]'' *''[[Mallotus discolor]]'' *''[[Mallotus dispersus]]'' *''[[Mallotus ficifolius]]'' *''[[Mallotus mollissimus]]'' *''[[Mallotus nesophilus]]'' *''[[Mallotus paniculatus]]'' *''[[Mallotus philippensis]]'' *''[[Mallotus polyadenos]]'' *''[[Mallotus repandus]]'' *''[[Mallotus resinosus]]'' *''[[Mallotus surculosus]]'' *''[[Manihot glaziovii]]'' *''[[Microstachys chamaelea ]]'' *''[[Omphalea celata]]'' *''[[Omphalea papuana]]'' *''[[Omphalea queenslandiae]]'' *''[[Pimelodendron amboinicum]]'' *''[[Ricinocarpos ledifolius]]'' *''[[Ricinus communis]]'' *''[[Rockinghamia angustifolia]]'' *''[[Rockinghamia brevipes]]'' *''[[Shonia tristigma]]'' *''[[Suregada glomerulata]]'' *''[[Tragia finalis]]'' *''[[Tragia novae-hollandiae]]'' *''[[Trigonostemon inopinatus]]'' *''[[Wetria australiensis]]'' {{div col end}} ==Eupomatiaceae== *''[[Eupomatia barbata]]'' *''[[Eupomatia laurina]]'' ==Fabaceae== {{div col|colwidth=18em}} *''[[Abrus precatorius]]'' *''[[Acacia aulacocarpa]]'' *''[[Acacia auriculiformis]]'' *''[[Acacia celsa]]'' *''[[Acacia cincinnata ]]'' *''[[Acacia crassicarpa]]'' *''[[Acacia fasciculifera]]'' *''[[Acacia flavescens]]'' *''[[Acacia fleckeri]]'' *''[[Acacia harpophylla]]'' *''[[Acacia holosericea]]'' *''[[Acacia hylonoma]]'' *''[[Acacia lamprocarpa]]'' *''[[Acacia leptocarpa]]'' *''[[Acacia maidenii]]'' *''[[Acacia mangium]]'' *''[[Acacia melanoxylon]]'' *''[[Acacia midgleyi]]'' *''[[Acacia oraria]]'' *''[[Acacia polystachya ]]'' *''[[Acacia shirleyi]]'' *''[[Acacia solenota]]'' *''[[Acacia spirorbis]]'' *''[[Acacia ulicifolia]]'' *''[[Adenanthera pavonina]]'' *''[[Aeschynomene americana]]'' *''[[Albizia canescens]]'' *''[[Albizia lebbeck]]'' *''[[Albizia procera]]'' *''[[Albizia retusa]]'' *''[[Albizia sp. Sir Charles Hardy Is (B.Hyland 25849RFK)]]'' *''[[Albizia sp. Windsor Tableland (B.Gray 2181)]]'' *''[[Archidendron grandiflorum]]'' *''[[Archidendron hendersonii]]'' *''[[Archidendron hirsutum]]'' *''[[Archidendron kanisii]]'' *''[[Archidendron lucyi]]'' *''[[Archidendron ramiflorum ]]'' *''[[Archidendron vaillantii]]'' *''[[Archidendron whitei]]'' *''[[Archidendropsis thozetiana]]'' *''[[Archidendropsis xanthoxylon]]'' *''[[Austrocallerya australis]]'' *''[[Austrocallerya pilipes]]'' *''[[Austrosteenisia blackii]]'' *''[[Austrosteenisia mollitricha]]'' *''[[Austrosteenisia stipularis]]'' *''[[Bauhinia binata]]'' *''[[Bauhinia cunninghamii]]'' *''[[Bauhinia hookeri]]'' *''[[Bauhinia malabarica]]'' *''[[Bauhinia monandra]]'' *''[[Biancaea decapetala]]'' *''[[Bossiaea arenicola]]'' *''[[Caesalpinia crista]]'' *''[[Caesalpinia major]]'' *''[[Caesalpinia robusta]]'' *''[[Cajanus acutifolius]]'' *''[[Cajanus reticulatus]]'' *''[[Calopogonium mucunoides]]'' *''[[Canavalia cathartica]]'' *''[[Canavalia papuana]]'' *''[[Canavalia rosea]]'' *''[[Cassia brewsteri]]'' *''[[Cassia queenslandica]]'' *''[[Cassia sp. Kalpowar (D.G.Fell DF2769)]]'' *''[[Cassia sp. Paluma Range (G.Sankowsky 450)]]'' *''[[Castanospermum australe]]'' *''[[Cathormion umbellatum]]'' *''[[Centrosema molle]]'' *''[[Clitoria ternatea]]'' *''[[Crotalaria laburnifolia]]'' *''[[Crotalaria lanceolata]]'' *''[[Crotalaria pallida]]'' *''[[Crotalaria verrucosa]]'' *''[[Crudia abbreviata]]'' *''[[Cynometra iripa]]'' *''[[Cynometra ramiflora]]'' *''[[Cynometra roseiflora]]'' *''[[Dalbergia candenatensis]]'' *''[[Dalbergia densa]]'' *''[[Dalbergia ferruginea]]'' *''[[Delonix regia]]'' *''[[Dendrolobium arbuscula]]'' *''[[Dendrolobium umbellatum]]'' *''[[Derris sp. Claudie River (L.J.Webb 8348)]]'' *''[[Derris sp. Daintree (D.E.Boyland 469)]]'' *''[[Derris sp. Wenlock River (B.Hyland 21082V) ]]'' *''[[Derris trifoliata]]'' *''[[Desmodium gangeticum]]'' *''[[Desmodium gunnii]]'' *''[[Desmodium heterocarpon]]'' *''[[Desmodium intortum]]'' *''[[Desmodium macrocarpum]]'' *''[[Desmodium nemorosum]]'' *''[[Desmodium tenax]]'' *''[[Desmodium tortuosum]]'' *''[[Desmodium trichostachyum ]]'' *''[[Dioclea hexandra]]'' *''[[Entada phaseoloides]]'' *''[[Entada rheedei]]'' *''[[Erythrina insularis ]]'' *''[[Erythrina variegata ]]'' *''[[Erythrina vespertilio]]'' *''[[Erythrophleum chlorostachys]]'' *''[[Falcataria toona]]'' *''[[Galactia sp. Laura (J.C.Tothill JT53A)]]'' *''[[Galactia tenuiflora]]'' *''[[Glycine cyrtoloba]]'' *''[[Guilandina bonduc]]'' *''[[Ibatiria furfuracea]]'' *''[[Hanslia ormocarpoides]]'' *''[[Hardenbergia violacea]]'' *''[[Hovea longipes]]'' *''[[Hovea nitida]]'' *''[[Indigofera colutea]]'' *''[[Indigofera linnaei]]'' *''[[Indigofera suffruticosa]]'' *''[[Intsia bijuga]]'' *''[[Kennedia rubicunda]]'' *''[[Labichea nitida]]'' *''[[Leucaena leucocephala]]'' *''[[Macroptilium atropurpureum]]'' *''[[Macrotyloma axillare]]'' *''[[Macrotyloma uniflorum]]'' *''[[Maniltoa lenticellata]]'' *''[[Mezoneuron erythrocarpum]]'' *''[[Mezoneuron hymenocarpum]]'' *''[[Mezoneuron nitens]]'' *''[[Mezoneuron scortechinii]]'' *''[[Mimosa pudica]]'' *''[[Mucuna gigantea]]'' *''[[Neonotonia wightii]]'' *''[[Ormosia ormondii]]'' *''[[Pachyrhizus erosus]]'' *''[[Pararchidendron pruinosum]]'' *''[[Parkinsonia aculeata]]'' *''[[Peltophorum pterocarpum]]'' *''[[Phylacium bracteosum]]'' *''[[Pongamia pinnata]]'' *''[[Pueraria lobata]]'' *''[[Pueraria phaseoloides]]'' *''[[Rhynchosia acuminatissima]]'' *''[[Rhynchosia minima]]'' *''[[Samanea saman]]'' *''[[Senegalia albizioides]]'' *''[[Senegalia pennata]]'' *''[[Senna clavigera]]'' *''[[Senna coronilloides]]'' *''[[Senna gaudichaudii]]'' *''[[Senna hirsuta]]'' *''[[Senna obtusifolia]]'' *''[[Senna occidentalis]]'' *''[[Senna pendula]]'' *''[[Senna septemtrionalis]]'' *''[[Senna siamea]]'' *''[[Senna sophera]]'' *''[[Senna surattensis]]'' *''[[Senna timoriensis]]'' *''[[Senna tora]]'' *''[[Sesbania cannabina]]'' *''[[Sesbania formosa]]'' *''[[Solori involuta]]'' *''[[Solori koolgibberah]]'' *''[[Sophora tomentosa]]'' *''[[Storckiella australiensis]]'' *''[[Strongylodon lucidus]]'' *''[[Stylosanthes scabra]]'' *''[[Tamarindus indica]]'' *''[[Tephrosia brachyodon]]'' *''[[Tephrosia dietrichiae]]'' *''[[Tephrosia oblongata]]'' *''[[Tephrosia purpurea]]'' *''[[Tephrosia rosea]]'' *''[[Vandasina retusa]]'' *''[[Vigna marina]]'' *''[[Vigna sp. Station Creek (R.J.Lawn CQ3284)]]'' {{div col end}} ==Flagellariaceae== *''[[Flagellaria indica]]'' ==Gentianaceae== *''[[Canscora diffusa]]'' *''[[Fagraea berteroana]]'' *''[[Fagraea cambagei]]'' *''[[Fagraea fagraeacea]]'' *''[[Fagraea racemosa]]'' ==Gesneriaceae== *''[[Boea hygroscopica]]'' *''[[Boea kinnearii]]'' *''[[Cyrtandra baileyi]]'' *''[[Lenbrassia australiana]]'' ==Goodeniaceae== *''[[Scaevola enantophylla]]'' *''[[Scaevola taccada]]'' ==Gyrostemonaceae== *''[[Codonocarpus attenuatus]]'' ==Haloragaceae== *''[[Gonocarpus acanthocarpus]]'' ==Hamamelidaceae== *''[[Neostrearia fleckeri]]'' *''[[Noahdendron nicholasii]]'' *''[[Ostrearia australiana]]'' ==Hanguanaceae== *''[[Hanguana malayana]]'' ==Hemerocallidaceae== {{div col|colwidth=24em}} *''[[Dianella atraxis]]'' *''[[Dianella bambusifolia]]'' *''[[Dianella caerulea]]'' *''[[Dianella longifolia]]'' *''[[Dianella odorata]]'' *''[[Dianella pavopennacea]]'' *''[[Geitonoplesium cymosum]]'' {{div col end}} ==Hernandiaceae== *''[[Gyrocarpus americanus]]'' *''[[Hernandia albiflora]]'' *''[[Hernandia bivalvis]]'' *''[[Hernandia nymphaeifolia ]]'' ==Himantandraceae== *''[[Galbulimima baccata]]'' ==Hypericaceae== *''[[Harungana madagascariensis]]'' *''[[Hypericum gramineum]]'' ==Hypoxidaceae== *''[[Molineria capitulata]]'' ==Icacinaceae== *''[[Apodytes brachystylis]]'' *''[[Citronella moorei]]'' *''[[Citronella smythii]]'' *''[[Gomphandra australiana]]'' *''[[Irvingbaileya australis]]'' *''[[Ryticaryum longifolium]]'' ==Iridaceae== *''[[Geosiris australiensis]]'' *''[[Sisyrinchium micranthum]]'' ==Juncaceae== *''[[Juncus usitatus]]'' ==Lamiaceae== {{div col|colwidth=18em}} *''[[Anisomeles inodora]]'' *''[[Anisomeles macdonaldii]]'' *''[[Anisomeles moschata]]'' *''[[Basilicum polystachyon]]'' *''[[Callicarpa candicans]]'' *''[[Callicarpa caudata]]'' *''[[Callicarpa longifolia]]'' *''[[Callicarpa pedunculata]]'' *''[[Clerodendrum costatum]]'' *''[[Clerodendrum floribundum]]'' *''[[Clerodendrum grayi]]'' *''[[Clerodendrum inerme]]'' *''[[Clerodendrum longiflorum]]'' *''[[Clerodendrum paniculatum]]'' *''[[Clerodendrum tomentosum]]'' *''[[Clerodendrum tracyanum]]'' *''[[Coleus amicorum]]'' *''[[Coleus apreptus]]'' *''[[Coleus australis]]'' *''[[Coleus congestus]]'' *''[[Coleus diversus]]'' *''[[Coleus dumicola]]'' *''[[Coleus excelsus]]'' *''[[Coleus foetidus]]'' *''[[Coleus gratus]]'' *''[[Coleus graveolens]]'' *''[[Coleus magnificus]]'' *''[[Coleus scutellarioides]]'' *''[[Coleus thalassoscopicus]]'' *''[[Glossocarya calcicola]]'' *''[[Glossocarya hemiderma]]'' *''[[Gmelina australis]]'' *''[[Gmelina dalrympleana]]'' *''[[Gmelina fasciculiflora]]'' *''[[Gmelina leichhardtii]]'' *''[[Hyptis capitata]]'' *''[[Leonotis nepetifolia ]]'' *''[[Leucas decemdentata]]'' *''[[Mesosphaerum pectinatum]]'' *''[[Mesosphaerum suaveolens]]'' *''[[Orthosiphon aristatus]]'' *''[[Oxera splendida]]'' *''[[Petraeovitex multiflora]]'' *''[[Pityrodia salviifolia]]'' *''[[Platostoma longicorne]]'' *''[[Premna acuminata]]'' *''[[Premna dallachyana]]'' *''[[Premna hylandiana]]'' *''[[Premna limbata]]'' *''[[Premna odorata]]'' *''[[Premna serratifolia ]]'' *''[[Salvia plebeia]]'' *''[[Salvia reflexa]]'' *''[[Spartothamnella juncea]]'' *''[[Vitex acuminata]]'' *''[[Vitex glabrata]]'' *''[[Vitex helogiton]]'' *''[[Vitex lignum-vitae]]'' *''[[Vitex melicopea]]'' *''[[Vitex queenslandica]]'' *''[[Vitex rotundifolia]]'' *''[[Vitex trifolia]]'' {{div col end}} ==Lauraceae== {{div col|colwidth=18em}} *''[[Beilschmiedia bancroftii]]'' *''[[Beilschmiedia brunnea]]'' *''[[Beilschmiedia castrisinensis]]'' *''[[Beilschmiedia collina]]'' *''[[Beilschmiedia obtusifolia]]'' *''[[Beilschmiedia oligandra]]'' *''[[Beilschmiedia peninsularis]]'' *''[[Beilschmiedia recurva]]'' *''[[Beilschmiedia tooram]]'' *''[[Beilschmiedia volckii]]'' *''[[Cassytha capillaris]]'' *''[[Cassytha filiformis]]'' *''[[Cinnamomum baileyanum]]'' *''[[Cinnamomum camphora]]'' *''[[Cinnamomum laubatii]]'' *''[[Cinnamomum oliveri]]'' *''[[Cinnamomum propinquum]]'' *''[[Cryptocarya angulata]]'' *''[[Cryptocarya bamagana]]'' *''[[Cryptocarya bellendenkerana]]'' *''[[Cryptocarya bidwillii]]'' *''[[Cryptocarya brassii]]'' *''[[Cryptocarya burckiana]]'' *''[[Cryptocarya cercophylla]]'' *''[[Cryptocarya clarksoniana]]'' *''[[Cryptocarya claudiana]]'' *''[[Cryptocarya cocosoides]]'' *''[[Cryptocarya corrugata]]'' *''[[Cryptocarya cunninghamii]]'' *''[[Cryptocarya densiflora]]'' *''[[Cryptocarya endiandrifolia]]'' *''[[Cryptocarya exfoliata]]'' *''[[Cryptocarya glaucescens]]'' *''[[Cryptocarya glaucocarpa]]'' *''[[Cryptocarya grandis]]'' *''[[Cryptocarya hypospodia]]'' *''[[Cryptocarya laevigata]]'' *''[[Cryptocarya leucophylla]]'' *''[[Cryptocarya lividula]]'' *''[[Cryptocarya macdonaldii]]'' *''[[Cryptocarya mackinnoniana]]'' *''[[Cryptocarya melanocarpa]]'' *''[[Cryptocarya murrayi]]'' *''[[Cryptocarya oblata]]'' *''[[Cryptocarya onoprienkoana]]'' *''[[Cryptocarya pleurosperma]]'' *''[[Cryptocarya putida]]'' *''[[Cryptocarya rhodosperma]]'' *''[[Cryptocarya saccharata]]'' *''[[Cryptocarya smaragdina]]'' *''[[Cryptocarya triplinervis]]'' *''[[Cryptocarya vulgaris]]'' *''[[Cryptocarya whiffiniana]]'' *''[[Endiandra acuminata]]'' *''[[Endiandra anthropophagorum]]'' *''[[Endiandra bellendenkerana]]'' *''[[Endiandra bessaphila]]'' *''[[Endiandra collinsii]]'' *''[[Endiandra compressa]]'' *''[[Endiandra cooperana]]'' *''[[Endiandra cowleyana]]'' *''[[Endiandra dichrophylla]]'' *''[[Endiandra dielsiana]]'' *''[[Endiandra discolor]]'' *''[[Endiandra glauca]]'' *''[[Endiandra globosa]]'' *''[[Endiandra grayi]]'' *''[[Endiandra hypotephra]]'' *''[[Endiandra impressicosta]]'' *''[[Endiandra inopinata]]'' *''[[Endiandra insignis]]'' *''[[Endiandra jonesii]]'' *''[[Endiandra leptodendron]]'' *''[[Endiandra limnophila]]'' *''[[Endiandra longipedicellata]]'' *''[[Endiandra microneura]]'' *''[[Endiandra monothyra]]'' *''[[Endiandra montana]]'' *''[[Endiandra muelleri]]'' *''[[Endiandra palmerstonii]]'' *''[[Endiandra phaeocarpa]]'' *''[[Endiandra sankeyana]]'' *''[[Endiandra sideroxylon]]'' *''[[Endiandra wolfei]]'' *''[[Endiandra xanthocarpa ]]'' *''[[Lindera queenslandica]]'' *''[[Litsea bennettii]]'' *''[[Litsea bindoniana]]'' *''[[Litsea breviumbellata]]'' *''[[Litsea connorsii]]'' *''[[Litsea fawcettiana]]'' *''[[Litsea glutinosa]]'' *''[[Litsea granitica]]'' *''[[Litsea leefeana]]'' *''[[Litsea macrophylla]]'' *''[[Neolitsea brassii]]'' *''[[Neolitsea dealbata]]'' *''[[Persea americana]]'' {{div col end}} ==Lecythidaceae== *''[[Barringtonia acutangula]]'' *''[[Barringtonia asiatica]]'' *''[[Barringtonia calyptrata]]'' *''[[Barringtonia racemosa]]'' *''[[Planchonia careya]]'' *''[[Planchonia rupestris]]'' ==Lentibulariaceae== *''[[Utricularia uliginosa]]'' ==Linaceae== *''[[Hugonia jenkinsii]]'' ==Linderniaceae== *''[[Artanema fimbriatum]]'' *''[[Lindernia crustacea]]'' ==Loganiaceae== {{div col|colwidth=24em}} *''[[Geniostoma rupestre]]'' *''[[Mitrasacme oasena]]'' *''[[Mitrasacme paludosa]]'' *''[[Mitrasacme polymorpha]]'' *''[[Mitrasacme pygmaea]]'' *''[[Strychnos lucida]]'' *''[[Strychnos minor]]'' *''[[Strychnos psilosperma]]'' {{div col end}} ==Loranthaceae== {{div col|colwidth=18em}} *''[[Amyema bifurcata]]'' *''[[Amyema congener]]'' *''[[Amyema conspicua]]'' *''[[Amyema dolichopoda]]'' *''[[Amyema friesiana]]'' *''[[Amyema glabra]]'' *''[[Amyema plicatula]]'' *''[[Amyema quandang]]'' *''[[Amyema quaternifolia ]]'' *''[[Amyema queenslandica]]'' *''[[Amyema seemeniana]]'' *''[[Amyema villiflora]]'' *''[[Amyema whitei]]'' *''[[Amylotheca dictyophleba]]'' *''[[Cecarria obtusifolia]]'' *''[[Dactyliophora novae-guineae]]'' *''[[Decaisnina angustata]]'' *''[[Decaisnina brittenii]]'' *''[[Decaisnina congesta]]'' *''[[Decaisnina hollrungii]]'' *''[[Decaisnina signata]]'' *''[[Dendrophthoe acacioides]]'' *''[[Dendrophthoe curvata]]'' *''[[Dendrophthoe glabrescens]]'' *''[[Dendrophthoe vitellina]]'' *''[[Diplatia furcata]]'' *''[[Diplatia tomentosa]]'' *''[[Lysiana maritima]]'' *''[[Lysiana spathulata]]'' *''[[Lysiana subfalcata]]'' {{div col end}} ==Lythraceae== *''[[Lagerstroemia archeriana]]'' *''[[Pemphis acidula]]'' ==Malpighiaceae== *''[[Hiptage benghalensis ]]'' *''[[Stigmaphyllon australiense]]'' *''[[Stigmaphyllon timoriense]]'' *''[[Tristellateia australasiae]]'' ==Malvaceae== {{div col|colwidth=18em}} *''[[Abelmoschus moschatus]]'' *''[[Abroma molle]]'' *''[[Abutilon auritum]]'' *''[[Abutilon hannii]]'' *''[[Abutilon indicum]]'' *''[[Abutilon micropetalum]]'' *''[[Abutilon oxycarpum]]'' *''[[Abutilon sp. Mataranka (R.M.Barker 877)]]'' *''[[Adansonia gregorii]]'' *''[[Argyrodendron actinophyllum]]'' *''[[Argyrodendron peralatum]]'' *''[[Argyrodendron polyandrum]]'' *''[[Argyrodendron sp. Boonjee (B.Hyland 2139RFK)]]'' *''[[Argyrodendron sp. Mt Haig ( L.S.Smith 14307)]]'' *''[[Argyrodendron sp. Penta Tulip Oak (B.Hyland 2565RFK)]]'' *''[[Argyrodendron sp. Whitsundays (W.J.McDonald+ 5831)]]'' *''[[Argyrodendron sp. Whyanbeel (B.Hyland 1106RFK)]]'' *''[[Argyrodendron trifoliolatum]]'' *''[[Azanza thespesioides]]'' *''[[Berrya javanica]]'' *''[[Bombax ceiba]]'' *''[[Brachychiton acerifolius]]'' *''[[Brachychiton albidus]]'' *''[[Brachychiton australis]]'' *''[[Brachychiton bidwillii]]'' *''[[Brachychiton chillagoensis]]'' *''[[Brachychiton compactus]]'' *''[[Brachychiton discolor]]'' *''[[Brachychiton diversifolius]]'' *''[[Brachychiton garrawayae]]'' *''[[Brachychiton grandiflorus]]'' *''[[Brachychiton paradoxus]]'' *''[[Brachychiton rupestris]]'' *''[[Brachychiton tridentatus]]'' *''[[Brachychiton velutinosus]]'' *''[[Brachychiton viridiflorus]]'' *''[[Brachychiton xanthophyllus]]'' *''[[Commersonia bartramia]]'' *''[[Commersonia macrostipulata ]]'' *''[[Corchorus aestuans]]'' *''[[Firmiana papuana]]'' *''[[Franciscodendron laurifolium]]'' *''[[Grewia australis]]'' *''[[Grewia breviflora]]'' *''[[Grewia glabra]]'' *''[[Grewia mesomischa]]'' *''[[Grewia oxyphylla]]'' *''[[Grewia papuana]]'' *''[[Grewia retusifolia]]'' *''[[Grewia scabrella]]'' *''[[Helicteres hirsuta]]'' *''[[Helicteres isora]]'' *''[[Helicteres semiglabra ]]'' *''[[Herissantia crispa]]'' *''[[Heritiera littoralis]]'' *''[[Hibiscus diversifolius]]'' *''[[Hibiscus geranioides]]'' *''[[Hibiscus heterophyllus]]'' *''[[Hibiscus krichauffianus]]'' *''[[Hibiscus macilwraithensis]]'' *''[[Hibiscus meraukensis]]'' *''[[Hibiscus normanii]]'' *''[[Hibiscus peralbus]]'' *''[[Hibiscus propulsator]]'' *''[[Hibiscus sankowskyorum]]'' *''[[Hibiscus tiliaceus]]'' *''[[Hibiscus tozerensis]]'' *''[[Hibiscus vitifolius]]'' *''[[Indagator fordii]]'' *''[[Kleinhovia hospita]]'' *''[[Lagunaria queenslandica]]'' *''[[Malvastrum americanum]]'' *''[[Malvastrum chillagoense]]'' *''[[Melhania brachycarpa]]'' *''[[Melhania oblongifolia]]'' *''[[Melochia umbellata]]'' *''[[Pavonia calycina]]'' *''[[Schoutenia ovata]]'' *''[[Sida acuta]]'' *''[[Sida atherophora]]'' *''[[Sida cordifolia]]'' *''[[Sida hackettiana]]'' *''[[Sida rhombifolia]]'' *''[[Sida rohlenae]]'' *''[[Sida sp. Small Flower (B.Gray 5657)]]'' *''[[Sida spinosa]]'' *''[[Sterculia holtzei ]]'' *''[[Sterculia quadrifida]]'' *''[[Sterculia shillinglawii]]'' *''[[Thespesia populnea]]'' *''[[Thespesia populneoides]]'' *''[[Trichospermum pleiostigma]]'' *''[[Triumfetta bradshawii]]'' *''[[Triumfetta micracantha]]'' *''[[Triumfetta pilosa]]'' *''[[Triumfetta rhomboidea]]'' *''[[Urena lobata]]'' *''[[Waltheria indica]]'' {{div col end}} ==Martyniaceae== *''[[Martynia annua]]'' ==Melastomataceae== {{div col|colwidth=24em}} *''[[Dissotis rotundifolia]]'' *''[[Medinilla balls-headleyi]]'' *''[[Melastoma cyanoides]]'' *''[[Melastoma malabathricum]]'' *''[[Memecylon hylandii]]'' *''[[Memecylon pauciflorum]]'' *''[[Miconia calvescens]]'' *''[[Miconia nervosa]]'' *''[[Osbeckia australiana ]]'' *''[[Pternandra coerulescens]]'' *''[[Tristemma mauritianum]]'' {{div col end}} ==Meliaceae== {{div col|colwidth=18em}} *''[[Aglaia argentea]]'' *''[[Aglaia australiensis]]'' *''[[Aglaia brassii]]'' *''[[Aglaia brownii]]'' *''[[Aglaia cooperae]]'' *''[[Aglaia elaeagnoidea]]'' *''[[Aglaia euryanthera]]'' *''[[Aglaia ferruginea]]'' *''[[Aglaia meridionalis]]'' *''[[Aglaia sapindina]]'' *''[[Aglaia silvestris]]'' *''[[Aglaia spectabilis]]'' *''[[Anthocarapa nitidula]]'' *''[[Chisocheton longistipitatus]]'' *''[[Chukrasia tabularis]]'' *''[[Dysoxylum acutangulum]]'' *''[[Dysoxylum alliaceum]]'' *''[[Dysoxylum arborescens]]'' *''[[Dysoxylum gaudichaudianum]]'' *''[[Prasoxylon klanderi]]'' *''[[Dysoxylum latifolium]]'' *''[[Dysoxylum mollissimum]]'' *''[[Dysoxylum oppositifolium]]'' *''[[Didymocheton papuanum]]'' *''[[Dysoxylum parasiticum]]'' *''[[Dysoxylum pettigrewianum]]'' *''[[Dysoxylum pumilum]]'' *''[[Dysoxylum rufum]]'' *''[[Dysoxylum setosum]]'' *''[[Melia azedarach]]'' *''[[Owenia venosa]]'' *''[[Synoum glandulosum]]'' *''[[Toona ciliata]]'' *''[[Turraea pubescens]]'' *''[[Vavaea amicorum]]'' {{div col end}} ==Menispermaceae== {{div col|colwidth=18em}} *''[[Carronia pedicellata]]'' *''[[Carronia protensa]]'' *''[[Cissampelos pareira]]'' *''[[Hypserpa decumbens]]'' *''[[Hypserpa laurina]]'' *''[[Hypserpa polyandra]]'' *''[[Hypserpa smilacifolia]]'' *''[[Legnephora moorei]]'' *''[[Pachygone ovata]]'' *''[[Parapachygone longifolia]]'' *''[[Pleogyne australis]]'' *''[[Pycnarrhena novoguineensis]]'' *''[[Pycnarrhena ozantha]]'' *''[[Sarcopetalum harveyanum]]'' *''[[Stephania bancroftii]]'' *''[[Stephania japonica]]'' *''[[Stephania tuberosa]]'' *''[[Tiliacora australiana]]'' *''[[Tinospora esiangkara]]'' *''[[Tinospora smilacina]]'' {{div col end}} ==Monimiaceae== {{div col|colwidth=18em}} *''[[Austromatthaea elegans]]'' *''[[Hedycarya loxocarya]]'' *''[[Hemmantia webbii]]'' *''[[Levieria acuminata]]'' *''[[Palmeria coriacea]]'' *''[[Palmeria hypotephra]]'' *''[[Palmeria scandens]]'' *''[[Pendressia wardellii]]'' *''[[Steganthera australiana]]'' *''[[Steganthera cooperorum]]'' *''[[Steganthera laxiflora]]'' *''[[Steganthera macooraia]]'' *''[[Wilkiea angustifolia]]'' *''[[Wilkiea cordata]]'' *''[[Wilkiea hylandii]]'' *''[[Wilkiea kaarruana]]'' *''[[Wilkiea longipes]]'' *''[[Wilkiea macrophylla]]'' *''[[Wilkiea pubescens]]'' *''[[Wilkiea rigidifolia]]'' *''[[Wilkiea smithii]]'' *''[[Wilkiea sp. McDowall Range (J.G.Tracey 14552)]]'' {{div col end}} ==Moraceae== {{div col|colwidth=18em}} *''[[Antiaris toxicaria]]'' *''[[Artocarpus glaucus]]'' *''[[Artocarpus heterophyllus]]'' *''[[Castilla elastica]]'' *''[[Fatoua villosa]]'' *''[[Ficus aculeata]]'' *''[[Ficus adenosperma]]'' *''[[Ficus albipila]]'' *''[[Ficus atricha]]'' *''[[Ficus benjamina]]'' *''[[Ficus brachypoda]]'' *''[[Ficus congesta]]'' *''[[Ficus copiosa]]'' *''[[Ficus coronata]]'' *''[[Ficus coronulata]]'' *''[[Ficus crassipes]]'' *''[[Ficus destruens]]'' *''[[Ficus drupacea]]'' *''[[Ficus fraseri]]'' *''[[Ficus henneana]]'' *''[[Ficus hispida]]'' *''[[Ficus leptoclada]]'' *''[[Ficus melinocarpa]]'' *''[[Ficus microcarpa]]'' *''[[Ficus mollior]]'' *''[[Ficus nodosa]]'' *''[[Ficus obliqua]]'' *''[[Ficus opposita]]'' *''[[Ficus pantoniana]]'' *''[[Ficus platypoda]]'' *''[[Ficus pleurocarpa]]'' *''[[Ficus podocarpifolia]]'' *''[[Ficus racemosa]]'' *''[[Ficus rubiginosa]]'' *''[[Ficus scobina]]'' *''[[Ficus septica]]'' *''[[Ficus subnervosa]]'' *''[[Ficus subpuberula]]'' *''[[Ficus tinctoria]]'' *''[[Ficus triradiata]]'' *''[[Ficus variegata]]'' *''[[Ficus virens]]'' *''[[Ficus virgata]]'' *''[[Ficus watkinsiana]]'' *''[[Maclura cochinchinensis]]'' *''[[Streblus brunonianus]]'' *''[[Streblus glaber]]'' *''[[Trophis scandens]]'' {{div col end}} ==Moringaceae== *''[[Moringa oleifera]]'' ==Musaceae== *''[[Musa banksii]]'' *''[[Musa jackeyi]]'' ==Myodocarpaceae== *''[[Delarbrea michieana]]'' ==Myristicaceae== *''[[Horsfieldia australiana]]'' *''[[Myristica globosa]]'' *''[[Myristica insipida]]'' *''[[Myristica lancifolia]]'' ==Myrtaceae== {{div col|colwidth=18em}} *''[[Allosyncarpia ternata]]'' *''[[Archirhodomyrtus beckleri]]'' *''[[Asteromyrtus angustifolia]]'' *''[[Asteromyrtus brassii]]'' *''[[Backhousia angustifolia]]'' *''[[Backhousia bancroftii]]'' *''[[Backhousia citriodora]]'' *''[[Backhousia enata]]'' *''[[Backhousia gundarara]]'' *''[[Backhousia hughesii]]'' *''[[Backhousia kingii]]'' *''[[Backhousia tetraptera]]'' *''[[Barongia lophandra]]'' *''[[Corymbia intermedia]]'' *''[[Corymbia tessellaris]]'' *''[[Corymbia torelliana]]'' *''[[Decaspermum humile]]'' *''[[Eucalyptus crebra]]'' *''[[Eucalyptus grandis]]'' *''[[Eucalyptus houseana]]'' *''[[Eucalyptus pellita]]'' *''[[Eucalyptus resinifera]]'' *''[[Eucalyptus tereticornis]]'' *''[[Eugenia reinwardtiana]]'' *''[[Gossia bamagensis]]'' *''[[Gossia bidwillii]]'' *''[[Gossia dallachiana]]'' *''[[Gossia floribunda]]'' *''[[Gossia grayi]]'' *''[[Gossia hillii]]'' *''[[Gossia lewisensis]]'' *''[[Gossia lucida]]'' *''[[Gossia macilwraithensis]]'' *''[[Gossia myrsinocarpa]]'' *''[[Gossia pubiflora]]'' *''[[Gossia retusa]]'' *''[[Gossia sankowskyorum]]'' *''[[Gossia shepherdii]]'' *''[[Gossia sp. Green Bark (B.Hyland 25370RFK)]]'' *''[[Lenwebbia lasioclada]]'' *''[[Leptospermum wooroonooran ]]'' *''[[Lindsayomyrtus racemoides]]'' *''[[Lithomyrtus obtusa]]'' *''[[Lophostemon confertus]]'' *''[[Lophostemon grandiflorus]]'' *''[[Lophostemon lactifluus]]'' *''[[Lophostemon suaveolens]]'' *''[[Melaleuca argentea]]'' *''[[Melaleuca bracteata]]'' *''[[Melaleuca dealbata]]'' *''[[Melaleuca leucadendra]]'' *''[[Melaleuca recurva]]'' *''[[Melaleuca viminalis]]'' *''[[Melaleuca viridiflora]]'' *''[[Mitrantia bilocularis]]'' *''[[Neofabricia myrtifolia]]'' *''[[Pilidiostigma papuanum]]'' *''[[Pilidiostigma tetramerum]]'' *''[[Pilidiostigma tropicum]]'' *''[[Rhodamnia acuminata]]'' *''[[Rhodamnia arenaria]]'' *''[[Rhodamnia australis]]'' *''[[Rhodamnia blairiana]]'' *''[[Rhodamnia costata]]'' *''[[Rhodamnia fordii]]'' *''[[Rhodamnia glabrescens ]]'' *''[[Rhodamnia hylandii]]'' *''[[Rhodamnia longisepala]]'' *''[[Rhodamnia pauciovulata]]'' *''[[Rhodamnia sessiliflora]]'' *''[[Rhodamnia sharpeana]]'' *''[[Rhodamnia spongiosa]]'' *''[[Rhodomyrtus canescens]]'' *''[[Rhodomyrtus effusa]]'' *''[[Rhodomyrtus macrocarpa]]'' *''[[Rhodomyrtus pervagata]]'' *''[[Rhodomyrtus sericea]]'' *''[[Rhodomyrtus trineura]]'' *''[[Ristantia gouldii]]'' *''[[Ristantia pachysperma]]'' *''[[Ristantia waterhousei]]'' *''[[Sphaerantia chartacea]]'' *''[[Sphaerantia discolor]]'' *''[[Stockwellia quadrifida]]'' *''[[Syncarpia glomulifera]]'' *''[[Syzygium alatoramulum]]'' *''[[Syzygium alliiligneum]]'' *''[[Syzygium angophoroides]]'' *''[[Syzygium apodophyllum]]'' *''[[Syzygium aqueum]]'' *''[[Syzygium argyropedicum]]'' *''[[Syzygium armstrongii]]'' *''[[Syzygium australe]]'' *''[[Syzygium bamagense]]'' *''[[Syzygium banksii]]'' *''[[Syzygium boonjee]]'' *''[[Syzygium branderhorstii]]'' *''[[Syzygium buettnerianum]]'' *''[[Syzygium bungadinnia]]'' *''[[Syzygium canicortex]]'' *''[[Syzygium claviflorum]]'' *''[[Syzygium cormiflorum]]'' *''[[Syzygium corynanthum]]'' *''[[Syzygium cryptophlebium]]'' *''[[Syzygium dansiei]]'' *''[[Syzygium divaricatum]]'' *''[[Syzygium endophloium]]'' *''[[Syzygium erythrocalyx]]'' *''[[Syzygium erythrodoxum]]'' *''[[Syzygium fibrosum]]'' *''[[Syzygium floribundum]]'' *''[[Syzygium forte]]'' *''[[Syzygium fratris]]'' *''[[Syzygium glenum]]'' *''[[Syzygium graveolens]]'' *''[[Syzygium gustavioides]]'' *''[[Syzygium hedraiophyllum]]'' *''[[Syzygium hemilamprum]]'' *''[[Syzygium johnsonii]]'' *''[[Syzygium kuranda]]'' *''[[Syzygium luehmannii]]'' *''[[Syzygium macilwraithianum]]'' *''[[Syzygium mackinnonianum]]'' *''[[Syzygium malaccense]]'' *''[[Syzygium maraca]]'' *''[[Syzygium minutuliflorum]]'' *''[[Syzygium monimioides]]'' *''[[Syzygium monospermum]]'' *''[[Syzygium mulgraveanum]]'' *''[[Syzygium nervosum]]'' *''[[Syzygium oleosum]]'' *''[[Syzygium papyraceum]]'' *''[[Syzygium pringlei]]'' *''[[Syzygium pseudofastigiatum]]'' *''[[Syzygium puberulum]]'' *''[[Syzygium resa]]'' *''[[Syzygium sayeri]]'' *''[[Syzygium sharoniae]]'' *''[[Syzygium smithii]]'' *''[[Syzygium suborbiculare]]'' *''[[Syzygium tierneyanum]]'' *''[[Syzygium trachyphloium]]'' *''[[Syzygium unipunctatum]]'' *''[[Syzygium velarum]]'' *''[[Syzygium wesa]]'' *''[[Syzygium wilsonii]]'' *''[[Syzygium xerampelinum]]'' *''[[Thaleropia queenslandica]]'' *''[[Thryptomene oligandra]]'' *''[[Tristaniopsis exiliflora]]'' *''[[Uromyrtus metrosideros]]'' *''[[Uromyrtus tenella]]'' *''[[Welchiodendron longivalve]]'' *''[[Xanthostemon arenarius]]'' *''[[Xanthostemon chrysanthus]]'' *''[[Xanthostemon crenulatus]]'' *''[[Xanthostemon eucalyptoides]]'' *''[[Xanthostemon formosus]]'' *''[[Xanthostemon graniticus]]'' *''[[Xanthostemon paradoxus]]'' *''[[Xanthostemon umbrosus]]'' *''[[Xanthostemon verticillatus]]'' *''[[Xanthostemon whitei]]'' *''[[Xanthostemon xerophilus]]'' *''[[Xanthostemon youngii]]'' {{div col end}} ==Nepenthaceae== *''[[Nepenthes mirabilis]]'' ==Nyctaginaceae== *''[[Boerhavia dominii]]'' *''[[Commicarpus chinensis]]'' *''[[Mirabilis jalapa]]'' *''[[Pisonia aculeata]]'' *''[[Pisonia grandis]]'' *''[[Pisonia umbellifera]]'' ==Ochnaceaee== *''[[Brackenridgea australiana]]'' *''[[Ochna serrulata]]'' ==Olacaceae== *''[[Anacolosa papuana]]'' *''[[Olax imbricata]]'' *''[[Olax pendula]]'' *''[[Ximenia americana]]'' ==Oleaceae== {{div col|colwidth=18em}} *''[[Chionanthus acuminiger]]'' *''[[Chionanthus axillaris]]'' *''[[Chionanthus ramiflorus]]'' *''[[Chionanthus sleumeri]]'' *''[[Chionanthus sp. Little Pine L.A. (B.Hyland 2520RFK)]]'' *''[[Jasminum dallachii]]'' *''[[Jasminum didymum]]'' *''[[Jasminum elongatum]]'' *''[[Jasminum kajewskii]]'' *''[[Jasminum longipetalum]]'' *''[[Jasminum molle]]'' *''[[Jasminum simplicifolium]]'' *''[[Ligustrum australianum]]'' *''[[Ligustrum lucidum]]'' *''[[Ligustrum sinense]]'' *''[[Notelaea microcarpa]]'' *''[[Notelaea sp. Elcho Island (C.R.Dunlop 7597)]]'' *''[[Olea paniculata]]'' {{div col end}} ==Onagraceae== *''[[Ludwigia hyssopifolia]]'' *''[[Ludwigia octovalvis]]'' ==Opiliaceae== *''[[Cansjera leptostachya]]'' *''[[Opilia amentacea]]'' ==Orchidaceae== {{div col|colwidth=18em}} *''[[Aphyllorchis anomala]]'' *''[[Aphyllorchis queenslandica]]'' *''[[Calanthe triplicata]]'' *''[[Corymborkis veratrifolia]]'' *''[[Dipodium pictum]]'' *''[[Epipogium roseum]]'' *''[[Eulophia zollingeri]]'' *''[[Phaius australis]]'' *''[[Pseudovanilla foliata]]'' {{div col end}} ==Oxalidaceae== *''[[Biophytum petersianum]]'' *''[[Oxalis chnoodes]]'' *''[[Oxalis corniculata]]'' ==Pandanaceae== {{div col|colwidth=18em}} *''[[Benstonea lauterbachii]]'' *''[[Benstonea monticola]]'' *''[[Freycinetia excelsa]]'' *''[[Freycinetia marginata]]'' *''[[Freycinetia percostata]]'' *''[[Freycinetia scandens]]'' *''[[Freycinetia sp. Claudie River (RT 286)]]'' *''[[Pandanus conicus]]'' *''[[Pandanus cookii]]'' *''[[Pandanus dammannii]]'' *''[[Pandanus gemmifer]]'' *''[[Pandanus oblatus]]'' *''[[Pandanus solmslaubachii]]'' *''[[Pandanus grayorum]]'' (as ''Pandanus'' sp. Russell River) *''[[Pandanus tectorius]]'' *''[[Pandanus zea]]'' {{div col end}} ==Paracryphiaceae== *''[[Quintinia fawkneri]]'' *''[[Quintinia quatrefagesii]]'' *''[[Sphenostemon lobosporus]]'' ==Passifloraceae== {{div col|colwidth=18em}} *''[[Adenia heterophylla]]'' *''[[Passiflora aurantia]]'' *''[[Passiflora aurantioides]]'' *''[[Passiflora edulis]]'' *''[[Passiflora foetida]]'' *''[[Passiflora herbertiana]]'' *''[[Passiflora kuranda]]'' *''[[Passiflora suberosa]]'' *''[[Passiflora subpeltata]]'' {{div col end}} ==Pedaliaceae== *''[[Josephinia eugeniae]]'' *''[[Josephinia imperatricis]]'' ==Pennantiaceae== *''[[Pennantia cunninghamii]]'' ==Pentaphylacaceae== *''[[Ternstroemia cherryi]]'' ==Philydraceae== *''[[Helmholtzia acorifolia]]'' *''[[Philydrum lanuginosum]]'' ==Phyllanthaceae== {{div col|colwidth=18em}} *''[[Actephila bella]]'' *''[[Actephila championiae]]'' *''[[Actephila foetida]]'' *''[[Actephila forsteri]]'' *''[[Actephila latifolia]]'' *''[[Actephila lindleyi]]'' *''[[Actephila petiolaris]]'' *''[[Actephila plicata]]'' *''[[Actephila sessilifolia]]'' *''[[Actephila traceyi]]'' *''[[Actephila venusta]]'' *''[[Actephila vernicosa]]'' *''[[Antidesma bunius]]'' *''[[Antidesma erostre]]'' *''[[Antidesma ghaesembilla]]'' *''[[Antidesma hylandii]]'' *''[[Antidesma parvifolium]]'' *''[[Bischofia javanica]]'' *''[[Breynia cernua]]'' *''[[Breynia macrantha]]'' *''[[Breynia oblongifolia]]'' *''[[Breynia sp. Black Mountain (B.Hyland 25658RFK)]]'' *''[[Breynia stipitata]]'' *''[[Bridelia insulana]]'' *''[[Bridelia leichhardtii]]'' *''[[Bridelia tomentosa]]'' *''[[Cleistanthus apodus]]'' *''[[Cleistanthus cunninghamii]]'' *''[[Cleistanthus dallachyanus]]'' *''[[Cleistanthus discolor]]'' *''[[Cleistanthus hylandii]]'' *''[[Cleistanthus myrianthus]]'' *''[[Cleistanthus peninsularis]]'' *''[[Cleistanthus semiopacus]]'' *''[[Cleistanthus xerophilus]]'' *''[[Flueggea leucopyrus]]'' *''[[Flueggea virosa]]'' *''[[Glochidion apodogynum]]'' *''[[Glochidion benthamianum]]'' *''[[Glochidion disparipes]]'' *''[[Glochidion ferdinandi]]'' *''[[Glochidion harveyanum]]'' *''[[Glochidion hylandii]]'' *''[[Glochidion lobocarpum]]'' *''[[Glochidion philippicum]]'' *''[[Glochidion pungens]]'' *''[[Glochidion sessiliflorum]]'' *''[[Glochidion sumatranum]]'' *''[[Glochidion xerocarpum]]'' *''[[Margaritaria dubium-traceyi]]'' *''[[Margaritaria indica]]'' *''[[Phyllanthus brassii]]'' *''[[Phyllanthus clamboides]]'' *''[[Phyllanthus cuscutiflorus]]'' *''[[Phyllanthus gunnii]]'' *''[[Phyllanthus hypospodius]]'' *''[[Phyllanthus lamprophyllus]]'' *''[[Phyllanthus microcladus]]'' *''[[Phyllanthus novae-hollandiae]]'' *''[[Phyllanthus praelongipes]]'' *''[[Phyllanthus subcrenulatus]]'' *''[[Phyllanthus tenellus]]'' *''[[Poranthera microphylla]]'' *''[[Synostemon albiflorus]]'' *''[[Synostemon sphenophyllus]]'' {{div col end}} ==Phytolaccaceae== *''[[Monococcus echinophorus]]'' *''[[Phytolacca octandra]]'' *''[[Rivina humilis]]'' ==Picrodendraceae== {{div col|colwidth=18em}} *''[[Austrobuxus megacarpus]]'' *''[[Choriceras majus]]'' *''[[Choriceras tricorne]]'' *''[[Dissiliaria baloghioides]]'' *''[[Dissiliaria indistincta]]'' *''[[Dissiliaria laxinervis]]'' *''[[Dissiliaria surculosa]]'' *''[[Dissiliaria tuckeri]]'' *''[[Neoroepera banksii]]'' *''[[Neoroepera buxifolia]]'' *''[[Petalostigma banksii]]'' *''[[Sankowskya stipularis]]'' *''[[Whyanbeelia terrae-reginae]]'' {{div col end}} ==Piperaceae== {{div col|colwidth=18em}} *''[[Peperomia bellendenkerensis]]'' *''[[Peperomia blanda]]'' *''[[Peperomia enervis]]'' *''[[Peperomia hunteriana]]'' *''[[Peperomia pellucida]]'' *''[[Peperomia tetraphylla]]'' *''[[Piper caninum]]'' *''[[Piper fungiforme]]'' *''[[Piper hederaceum]]'' *''[[Piper interruptum]]'' *''[[Piper macropiper]]'' *''[[Piper mestonii]]'' *''[[Piper umbellatum]]'' {{div col end}} ==Pittosporaceae== {{div col|colwidth=18em}} *''[[Auranticarpa edentata]]'' *''[[Auranticarpa ilicifolia]]'' *''[[Auranticarpa papyracea]]'' *''[[Auranticarpa rhombifolia]]'' *''[[Bursaria incana]]'' *''[[Bursaria spinosa]]'' *''[[Bursaria tenuifolia]]'' *''[[Hymenosporum flavum]]'' *''[[Pittosporum angustifolium]]'' *''[[Pittosporum ferrugineum]]'' *''[[Pittosporum moluccanum]]'' *''[[Pittosporum revolutum]]'' *''[[Pittosporum rubiginosum]]'' *''[[Pittosporum spinescens]]'' *''[[Pittosporum trilobum]]'' *''[[Pittosporum venulosum]]'' *''[[Pittosporum wingii]]'' {{div col end}} ==Plantaginaceae== {{div col|colwidth=24em}} *''[[Callitriche muelleri]]'' *''[[Lophospermum erubescens]]'' *''[[Mecardonia procumbens]]'' *''[[Plantago lanceolata]]'' *''[[Plantago major]]'' *''[[Scoparia dulcis]]'' *''[[Stemodia lythrifolia]]'' *''[[Veronica plebeia]]'' {{div col end}} ==Plumbaginaceae== *''[[Plumbago zeylanica]]'' ==Poaceae== {{div col|colwidth=18em}} *''[[Ancistrachne uncinulata]]'' *''[[Aristida exserta]]'' *''[[Aristida queenslandica]]'' *''[[Aristida superpendens]]'' *''[[Arthragrostis deschampsioides]]'' *''[[Arundinella nepalensis]]'' *''[[Axonopus compressus]]'' *''[[Axonopus fissifolius]]'' *''[[Bothriochloa pertusa]]'' *''[[Cenchrus brevisetosus]]'' *''[[Cenchrus echinatus]]'' *''[[Centotheca lappacea]]'' *''[[Centotheca philippinensis]]'' *''[[Cymbopogon ambiguus]]'' *''[[Cymbopogon procerus]]'' *''[[Cymbopogon refractus]]'' *''[[Cynodon dactylon]]'' *''[[Cyrtococcum accrescens]]'' *''[[Cyrtococcum oxyphyllum]]'' *''[[Cyrtococcum patens]]'' *''[[Dactyloctenium aegyptium]]'' *''[[Eragrostis cumingii]]'' *''[[Eriachne pallescens]]'' *''[[Garnotia stricta]]'' *''[[Heteropogon contortus]]'' *''[[Isachne confusa]]'' *''[[Isachne sharpii]]'' *''[[Leptaspis banksii]]'' *''[[Lophatherum gracile]]'' *''[[Mullerochloa moreheadiana]]'' *''[[Neololeba atra]]'' *''[[Oplismenus burmanni]]'' *''[[Oplismenus compositus]]'' *''[[Oplismenus hirtellus]]'' *''[[Oplismenus mollis]]'' *''[[Ottochloa nodosa]]'' *''[[Panicum chillagoanum]]'' *''[[Panicum incomtum]]'' *''[[Panicum mindanaense]]'' *''[[Panicum trichoides]]'' *''[[Paspalum conjugatum]]'' *''[[Paspalum dilatatum]]'' *''[[Paspalum paniculatum]]'' *''[[Paspalum scrobiculatum]]'' *''[[Perotis rara]]'' *''[[Phragmites karka]]'' *''[[Pogonatherum crinitum]]'' *''[[Scrotochloa tararaensis]]'' *''[[Scrotochloa urceolata]]'' *''[[Setaria apiculata]]'' *''[[Setaria oplismenoides]]'' *''[[Setaria palmifolia]]'' *''[[Triodia procera]]'' *''[[Urochloa pubigera]]'' *''[[Urochloa reptans]]'' *''[[Urochloa subquadripara]]'' {{div col end}} ==Podocarpaceae== {{div col|colwidth=24em}} *''[[Podocarpus dispermus]]'' *''[[Podocarpus elatus]]'' *''[[Podocarpus grayae]]'' *''[[Podocarpus smithii]]'' *''[[Prumnopitys amara]]'' *''[[Prumnopitys ladei]]'' {{div col end}} ==Polygalaceae== *''[[Polygala paniculata]]'' *''[[Xanthophyllum fragrans]]'' *''[[Xanthophyllum octandrum]]'' ==Polygonaceae== *''[[Muehlenbeckia zippelii]]'' *''[[Persicaria hydropiper]]'' *''[[Persicaria orientalis]]'' *''[[Triplaris americana]]'' ==Portulacaceae== *''[[Portulaca pilosa]]'' ==Primulaceae== {{div col|colwidth=18em}} *''[[Ardisia brevipedata]]'' *''[[Ardisia crenata]]'' *''[[Ardisia elliptica]]'' *''[[Ardisia fasciculata]]'' *''[[Ardisia hylandii]]'' *''[[Ardisia pachyrrhachis]]'' *''[[Embelia australiana]]'' *''[[Embelia caulialata]]'' *''[[Embelia curvinervia]]'' *''[[Embelia grayi]]'' *''[[Maesa dependens]]'' *''[[Maesa haplobotrys]]'' *''[[Myrsine achradifolia]]'' *''[[Myrsine benthamiana]]'' *''[[Myrsine crassifolia]]'' *''[[Myrsine ireneae]]'' *''[[Myrsine kimberleyensis]]'' *''[[Myrsine maculata]]'' *''[[Myrsine oreophila]]'' *''[[Myrsine porosa]]'' *''[[Myrsine rubiginosa]]'' *''[[Myrsine serpenticola]]'' *''[[Myrsine smithii]]'' *''[[Myrsine subsessilis]]'' *''[[Myrsine urceolata]]'' *''[[Myrsine variabilis]]'' *''[[Tapeinosperma pallidum]]'' *''[[Tapeinosperma pseudojambosa]]'' *''[[Tetrardisia bifaria]]'' {{div col end}} ==Proteaceae== {{div col|colwidth=18em}} *''[[Alloxylon flammeum]]'' *''[[Alloxylon wickhamii]]'' *''[[Athertonia diversifolia]]'' *''[[Austromuellera trinervia]]'' *''[[Austromuellera valida]]'' *''[[Banksia aquilonia]]'' *''[[Banksia integrifolia]]'' *''[[Bleasdalea bleasdalei]]'' *''[[Buckinghamia celsissima]]'' *''[[Buckinghamia ferruginiflora]]'' *''[[Cardwellia sublimis]]'' *''[[Carnarvonia araliifolia]]'' *''[[Catalepidia heyana]]'' *''[[Darlingia darlingiana]]'' *''[[Darlingia ferruginea]]'' *''[[Eidothea zoexylocarya]]'' *''[[Grevillea agrifolia]]'' *''[[Grevillea baileyana]]'' *''[[Grevillea heliosperma]]'' *''[[Grevillea helmsiae]]'' *''[[Grevillea hilliana]]'' *''[[Grevillea pteridifolia]]'' *''[[Grevillea robusta]]'' *''[[Helicia australasica]]'' *''[[Helicia blakei]]'' *''[[Helicia grayi]]'' *''[[Helicia lamingtoniana]]'' *''[[Helicia lewisensis]]'' *''[[Helicia nortoniana]]'' *''[[Helicia recurva]]'' *''[[Hicksbeachia pilosa]]'' *''[[Hollandaea diabolica]]'' *''[[Hollandaea porphyrocarpa]]'' *''[[Hollandaea riparia]]'' *''[[Hollandaea sayeriana]]'' *''[[Lasjia claudiensis]]'' *''[[Lasjia grandis]]'' *''[[Lasjia whelanii]]'' *''[[Lomatia milnerae]]'' *''[[Megahertzia amplexicaulis]]'' *''[[Musgravea heterophylla]]'' *''[[Musgravea stenostachya]]'' *''[[Neorites kevedianus]]'' *''[[Nothorites megacarpus]]'' *''[[Opisthiolepis heterophylla]]'' *''[[Orites excelsus]]'' *''[[Persoonia amaliae]]'' *''[[Placospermum coriaceum]]'' *''[[Sphalmium racemosum]]'' *''[[Stenocarpus cryptocarpus]]'' *''[[Stenocarpus cunninghamii]]'' *''[[Stenocarpus davallioides]]'' *''[[Stenocarpus reticulatus]]'' *''[[Stenocarpus sinuatus]]'' *''[[Stenocarpus sp. Hinchinbrook Is. (F.D.Hocking AQ229860)]]'' *''[[Stenocarpus verticis]]'' *''[[Triunia erythrocarpa]]'' *''[[Triunia montana]]'' {{div col end}} ==Putranjivaceae== *''[[Drypetes acuminata]]'' *''[[Drypetes deplanchei]]'' *''[[Drypetes iodoformis]]'' *''[[Drypetes vernicosa]]'' ==Ranunculaceae== *''[[Clematis pickeringii]]'' ==Rhamnaceae== {{div col|colwidth=18em}} *''[[Alphitonia excelsa]]'' *''[[Alphitonia oblata]]'' *''[[Alphitonia petriei]]'' *''[[Alphitonia whitei]]'' *''[[Colubrina asiatica]]'' *''[[Emmenosperma alphitonioides]]'' *''[[Emmenosperma cunninghamii]]'' *''[[Gouania australiana]]'' *''[[Gouania exilis]]'' *''[[Pomaderris argyrophylla]]'' *''[[Rhamnella vitiensis]]'' *''[[Rhamnus napalensis]]'' *''[[Sageretia hamosa]]'' *''[[Schistocarpaea johnsonii]]'' *''[[Ventilago ecorollata]]'' *''[[Ventilago pubiflora]]'' *''[[Ventilago viminalis]]'' *''[[Ziziphus mauritiana]]'' *''[[Ziziphus oenopolia]]'' *''[[Ziziphus quadrilocularis]]'' *''[[Ziziphus timoriensis]]'' {{div col end}} ==Rhizophoraceae== *''[[Carallia brachiata]]'' ==Ripogonaceae== *''[[Ripogonum album]]'' *''[[Ripogonum brevifolium]]'' *''[[Ripogonum discolor]]'' *''[[Ripogonum elseyanum]]'' ==Rosaceae== {{div col|colwidth=24em}} *''[[Prunus brachystachya]]'' *''[[Prunus turneriana]]'' *''[[Rubus alceifolius]]'' *''[[Rubus moluccanus]]'' *''[[Rubus parvifolius]]'' *''[[Rubus probus]]'' *''[[Rubus queenslandicus]]'' {{div col end}} ==Rousseaceae== *''[[Abrophyllum ornans]]'' ==Rubiaceae== {{div col|colwidth=18em}} *''[[Aidia cowleyi]]'' *''[[Aidia racemosa]]'' *''[[Amaracarpus nematopodus]]'' *''[[Antirhea ovatifolia]]'' *''[[Antirhea putaminosa]]'' *''[[Antirhea sp. Mt Lewis (B.Gray 5733)]]'' *''[[Antirhea tenuiflora]]'' *''[[Atractocarpus fitzalanii]]'' *''[[Atractocarpus hirtus]]'' *''[[Atractocarpus merikin]]'' *''[[Atractocarpus sessilis]]'' *''[[Bobea myrtoides]]'' *''[[Coelospermum dasylobum]]'' *''[[Coelospermum decipiens]]'' *''[[Coelospermum paniculatum]]'' *''[[Coelospermum purpureum]]'' *''[[Coffea arabica]]'' *''[[Coffea brassii]]'' *''[[Coffea liberica]]'' *''[[Cyclophyllum coprosmoides]]'' *''[[Cyclophyllum costatum]]'' *''[[Cyclophyllum maritimum]]'' *''[[Cyclophyllum multiflorum]]'' *''[[Cyclophyllum protractum]]'' *''[[Cyclophyllum rostellatum]]'' *''[[Cyclophyllum schultzii]]'' *''[[Eumachia frutescens]]'' *''[[Everistia vacciniifolia]]'' *''[[Gardenia actinocarpa]]'' *''[[Gardenia ovularis]]'' *''[[Gardenia psidioides]]'' *''[[Gardenia scabrella]]'' *''[[Gardenia vilhelmii]]'' *''[[Gen. (AQ520454) sp. Shute Harbour (D.A.Halford Q811)]]'' *''[[Geophila repens]]'' *''[[Guettarda speciosa]]'' *''[[Gynochthodes ammitia]]'' *''[[Gynochthodes australiensis]]'' *''[[Gynochthodes canthoides]]'' *''[[Gynochthodes constipata]]'' *''[[Gynochthodes jasminoides]]'' *''[[Gynochthodes oresbia]]'' *''[[Gynochthodes podistra]]'' *''[[Gynochthodes retropila]]'' *''[[Gynochthodes sessilis]]'' *''[[Gynochthodes sp. Iron Range (B.Hyland 11587)]]'' *''[[Gynochthodes umbellata]]'' *''[[Hedyotis auricularia]]'' *''[[Hedyotis novoguineensis]]'' *''[[Hedyotis radicans]]'' *''[[Hodgkinsonia ovatiflora]]'' *''[[Ixora baileyana]]'' *''[[Ixora biflora]]'' *''[[Ixora oreogena]]'' *''[[Ixora queenslandica]]'' *''[[Ixora timorensis]]'' *''[[Larsenaikia jardinei]]'' *''[[Larsenaikia ochreata]]'' *''[[Lasianthus chlorocarpus]]'' *''[[Lasianthus hirsutus]]'' *''[[Mitracarpus hirtus]]'' *''[[Morinda bracteata]]'' *''[[Morinda citrifolia]]'' *''[[Nauclea orientalis]]'' *''[[Neolamarckia cadamba]]'' *''[[Neonauclea glabra]]'' *''[[Oldenlandia biflora]]'' *''[[Oldenlandia galioides]]'' *''[[Oldenlandia polyclada]]'' *''[[Ophiorrhiza australiana]]'' *''[[Pavetta australiensis]]'' *''[[Pavetta brownii]]'' *''[[Pavetta granitica]]'' *''[[Pavetta kimberleyana]]'' *''[[Pavetta muelleri]]'' *''[[Psychotria coelosperma]]'' *''[[Psychotria dallachiana]]'' *''[[Psychotria daphnoides]]'' *''[[Psychotria fitzalanii]]'' *''[[Psychotria hebecarpa]]'' *''[[Psychotria loniceroides]]'' *''[[Psychotria nesophila]]'' *''[[Psychotria poliostemma]]'' *''[[Psychotria sp. Danbulla (S.T.Blake 15262)]]'' *''[[Psychotria sp. Mt Lewis (V.K.Moriarty 2445)]]'' *''[[Psychotria sp. Pinnacle Rock (B.Gray 6555)]]'' *''[[Psychotria sp. Shute Harbour (L.J.Webb 7916)]]'' *''[[Psychotria sp. Utchee Creek (H.Flecker NGNC5313)]]'' *''[[Psychotria submontana]]'' *''[[Psydrax attenuata]]'' *''[[Psydrax banksii]]'' *''[[Psydrax graciliflora]]'' *''[[Psydrax johnsonii]]'' *''[[Psydrax lamprophylla]]'' *''[[Psydrax laxiflorens]]'' *''[[Psydrax montigena]]'' *''[[Psydrax odorata]]'' *''[[Psydrax tropica]]'' *''[[Randia audasii]]'' *''[[Randia sp. Peninsula (G.Stocker 1321)]]'' *''[[Randia tuberculosa]]'' *''[[Richardia brasiliensis]]'' *''[[Spermacoce brachystema]]'' *''[[Spermacoce exilis]]'' *''[[Spermacoce latifolia]]'' *''[[Spermacoce membranacea]]'' *''[[Spermacoce ocymifolia]]'' *''[[Spermacoce prostrata]]'' *''[[Spermacoce remota]]'' *''[[Tarenna dallachiana]]'' *''[[Tarenna monticola]]'' *''[[Tarenna pentamera]]'' *''[[Tarennoidea wallichii]]'' *''[[Timonius singularis]]'' *''[[Timonius sp. Claudie River (B.Hyland 21096V)]]'' *''[[Timonius timon]]'' *''[[Triflorensia australis]]'' *''[[Triflorensia ixoroides]]'' *''[[Uncaria callophylla]]'' *''[[Uncaria cordata]]'' *''[[Uncaria lanosa]]'' *''[[Wendlandia basistaminea]]'' *''[[Wendlandia connata]]'' *''[[Wendlandia inclusa]]'' *''[[Wendlandia urceolata]]'' {{div col end}} ==Rutaceae== {{div col|colwidth=18em}} *''[[Acronychia aberrans]]'' *''[[Acronychia acidula]]'' *''[[Acronychia acronychioides]]'' *''[[Acronychia acuminata]]'' *''[[Acronychia chooreechillum]]'' *''[[Acronychia crassipetala]]'' *''[[Acronychia eungellensis]]'' *''[[Acronychia imperforata]]'' *''[[Acronychia laevis]]'' *''[[Acronychia parviflora]]'' *''[[Acronychia pauciflora]]'' *''[[Acronychia peninsularis]]'' *''[[Acronychia vestita]]'' *''[[Boronia alulata]]'' *''[[Boronia excelsa]]'' *''[[Boronia lanceolata]]'' *''[[Bosistoa medicinalis]]'' *''[[Bosistoa pentacocca]]'' *''[[Bouchardatia neurococca]]'' *''[[Brombya platynema]]'' *''[[Brombya smithii]]'' *''[[Citrus garrawayi]]'' *''[[Citrus inodora]]'' *''[[Citrus reticulata]]'' *''[[Citrus x aurantium]]'' *''[[Citrus x jambhiri]]'' *''[[Clausena brevistyla]]'' *''[[Clausena excavata]]'' *''[[Coatesia paniculata]]'' *''[[Dinosperma erythrococcum]]'' *''[[Dinosperma longifolium]]'' *''[[Dinosperma melanophloium]]'' *''[[Dinosperma stipitatum]]'' *''[[Eriostemon banksii]]'' *''[[Euodia hylandii]]'' *''[[Euodia pubifolia]]'' *''[[Flindersia acuminata]]'' *''[[Flindersia australis]]'' *''[[Flindersia bourjotiana]]'' *''[[Flindersia brassii]]'' *''[[Flindersia brayleyana]]'' *''[[Flindersia collina]]'' *''[[Flindersia ifflana]]'' *''[[Flindersia laevicarpa]]'' *''[[Flindersia oppositifolia]]'' *''[[Flindersia pimenteliana]]'' *''[[Flindersia schottiana]]'' *''[[Geijera parviflora]]'' *''[[Geijera salicifolia]]'' *''[[Glycosmis trifoliata]]'' *''[[Halfordia kendack]]'' *''[[Harrisonia brownii]]'' *''[[Leionema ellipticum]]'' *''[[Lunasia amara]]'' *''[[Luvunga monophylla]]'' *''[[Medicosma fareana]]'' *''[[Medicosma glandulosa]]'' *''[[Medicosma heterophylla]]'' *''[[Medicosma mulgraveana]]'' *''[[Medicosma obovata]]'' *''[[Medicosma riparia]]'' *''[[Medicosma sessiliflora]]'' *''[[Melicope affinis]]'' *''[[Melicope bonwickii]]'' *''[[Melicope broadbentiana]]'' *''[[Melicope elleryana]]'' *''[[Melicope fellii]]'' *''[[Melicope jonesii]]'' *''[[Melicope peninsularis]]'' *''[[Melicope rubra]]'' *''[[Melicope vitiflora]]'' *''[[Melicope xanthoxyloides]]'' *''[[Micromelum minutum]]'' *''[[Murraya paniculata]]'' *''[[Phebalium longifolium]]'' *''[[Pitaviaster haplophyllus]]'' *''[[Sarcomelicope simplicifolia]]'' *''[[Zanthoxylum brachyacanthum]]'' *''[[Zanthoxylum nitidum]]'' *''[[Zanthoxylum ovalifolium]]'' *''[[Zanthoxylum rhetsa]]'' *''[[Zieria alata]]'' *''[[Zieria eungellaensis]]'' *''[[Zieria insularis]]'' *''[[Zieria madida]]'' *''[[Zieria robertsiorum]]'' *''[[Zieria smithii]]'' {{div col end}} ==Salicaceae== {{div col|colwidth=18em}} *''[[Casearia costulata]]'' *''[[Casearia dallachii]]'' *''[[Casearia grayi]]'' *''[[Casearia grewiifolia]]'' *''[[Casearia sp. Mission Beach (B.P.Hyland 773)]]'' *''[[Flacourtia jangomas]]'' *''[[Flacourtia sp. Shiptons Flat (L.W.Jessup GJ.D3200)]]'' *''[[Flacourtia territorialis]]'' *''[[Homalium alnifolium]]'' *''[[Homalium brachybotrys]]'' *''[[Homalium circumpinnatum]]'' *''[[Homalium sp. South Molle Island (J.A.Gresty AQ208995)]]'' *''[[Scolopia braunii]]'' *''[[Xylosma ovata]]'' *''[[Xylosma sp. Mt Lewis (G.Sankowsky 1108)]]'' *''[[Xylosma sp. Temple Bay (P.I.Forster PIF8980)]]'' {{div col end}} ==Santalaceae== {{div col|colwidth=18em}} *''[[Anthobolus filifolius]]'' *''[[Dendromyza reinwardtiana]]'' *''[[Dendrotrophe varians]]'' *''[[Exocarpos latifolius]]'' *''[[Korthalsella grayi]]'' *''[[Korthalsella japonica]]'' *''[[Korthalsella papuana]]'' *''[[Korthalsella rubra]]'' *''[[Notothixos cornifolius]]'' *''[[Notothixos leiophyllus]]'' *''[[Notothixos subaureus]]'' *''[[Santalum lanceolatum]]'' *''[[Viscum articulatum]]'' *''[[Viscum ovalifolium]]'' {{div col end}} ==Sapindaceae== {{div col|colwidth=18em}} *''[[Alectryon connatus]]'' *''[[Alectryon diversifolius]]'' *''[[Alectryon kimberleyanus]]'' *''[[Alectryon oleifolius]]'' *''[[Alectryon reticulatus]]'' *''[[Alectryon semicinereus]]'' *''[[Alectryon subdentatus]]'' *''[[Alectryon tomentosus]]'' *''[[Alectryon tropicus]]'' *''[[Allophylus cobbe]]'' *''[[Arytera bifoliolata]]'' *''[[Arytera divaricata]]'' *''[[Arytera pauciflora]]'' *''[[Arytera pseudofoveolata]]'' *''[[Arytera sp. Dryander Creek (P.R.Sharpe 4184)]]'' *''[[Atalaya angustifolia]]'' *''[[Atalaya australiana]]'' *''[[Atalaya calcicola]]'' *''[[Atalaya hemiglauca]]'' *''[[Atalaya multiflora]]'' *''[[Atalaya rigida]]'' *''[[Atalaya salicifolia]]'' *''[[Atalaya sericopetala]]'' *''[[Atalaya variifolia]]'' *''[[Cardiospermum grandiflorum]]'' *''[[Cardiospermum halicacabum]]'' *''[[Castanospora alphandii]]'' *''[[Cnesmocarpon dasyantha]]'' *''[[Cossinia australiana]]'' *''[[Cupaniopsis anacardioides]]'' *''[[Cupaniopsis cooperorum]]'' *''[[Cupaniopsis dallachyi]]'' *''[[Cupaniopsis diploglottoides]]'' *''[[Cupaniopsis flagelliformis]]'' *''[[Cupaniopsis fleckeri]]'' *''[[Cupaniopsis foveolata]]'' *''[[Cupaniopsis papillosa]]'' *''[[Cupaniopsis simulata]]'' *''[[Cupaniopsis wadsworthii]]'' *''[[Dictyoneura obtusa]]'' *''[[Dimocarpus australianus]]'' *''[[Dimocarpus longan]]'' *''[[Diploglottis alaticarpa]]'' *''[[Diploglottis bernieana]]'' *''[[Diploglottis bracteata]]'' *''[[Diploglottis diphyllostegia]]'' *''[[Diploglottis harpullioides]]'' *''[[Diploglottis macrantha]]'' *''[[Diploglottis obovata]]'' *''[[Diploglottis pedleyi]]'' *''[[Diploglottis smithii]]'' *''[[Dodonaea lanceolata]]'' *''[[Dodonaea platyptera]]'' *''[[Dodonaea polyandra]]'' *''[[Dodonaea triquetra]]'' *''[[Dodonaea viscosa]]'' *''[[Elattostachys megalantha]]'' *''[[Elattostachys microcarpa]]'' *''[[Elattostachys xylocarpa]]'' *''[[Ganophyllum falcatum]]'' *''[[Guioa acutifolia]]'' *''[[Guioa lasioneura]]'' *''[[Guioa montana]]'' *''[[Guioa sarcopterifructa]]'' *''[[Guioa semiglauca]]'' *''[[Harpullia arborea]]'' *''[[Harpullia frutescens]]'' *''[[Harpullia hillii]]'' *''[[Harpullia pendula]]'' *''[[Harpullia ramiflora]]'' *''[[Harpullia rhyticarpa]]'' *''[[Jagera madida]]'' *''[[Jagera pseudorhus]]'' *''[[Lepiderema hirsuta]]'' *''[[Lepiderema ixiocarpa]]'' *''[[Lepiderema largiflorens]]'' *''[[Lepiderema punctulata]]'' *''[[Lepiderema sericolignis]]'' *''[[Lepiderema sp. Impulse Creek (A.B.Pollock 73)]]'' *''[[Lepidopetalum fructoglabrum]]'' *''[[Lepisanthes rubiginosa]]'' *''[[Lepisanthes senegalensis]]'' *''[[Mischarytera lautereriana]]'' *''[[Mischarytera macrobotrys]]'' *''[[Mischarytera megaphylla]]'' *''[[Mischocarpus anodontus]]'' *''[[Mischocarpus exangulatus]]'' *''[[Mischocarpus grandissimus]]'' *''[[Mischocarpus lachnocarpus]]'' *''[[Mischocarpus macrocarpus]]'' *''[[Mischocarpus montanus]]'' *''[[Mischocarpus pyriformis]]'' *''[[Mischocarpus stipitatus]]'' *''[[Rhysotoechia bifoliolata]]'' *''[[Rhysotoechia flavescens]]'' *''[[Rhysotoechia florulenta]]'' *''[[Rhysotoechia mortoniana]]'' *''[[Rhysotoechia robertsonii]]'' *''[[Sarcopteryx acuminata]]'' *''[[Sarcopteryx martyana]]'' *''[[Sarcopteryx montana]]'' *''[[Sarcopteryx reticulata]]'' *''[[Sarcopteryx sp. McIlwraith Range (B.Hyland 3261RFK)]]'' *''[[Sarcotoechia cuneata]]'' *''[[Sarcotoechia heterophylla]]'' *''[[Sarcotoechia lanceolata]]'' *''[[Sarcotoechia protracta]]'' *''[[Sarcotoechia serrata]]'' *''[[Sarcotoechia villosa]]'' *''[[Synima cordierorum]]'' *''[[Synima macrophylla]]'' *''[[Synima reynoldsiae]]'' *''[[Toechima daemelianum]]'' *''[[Toechima erythrocarpum]]'' *''[[Toechima monticola]]'' *''[[Toechima pterocarpum]]'' *''[[Tristiropsis acutangula]]'' {{div col end}} ==Sapotaceae== {{div col|colwidth=18em}} *''[[Amorphospermum antilogum]]'' *''[[Donella lanceolata]]'' *''[[Manilkara kauki]]'' *''[[Mimusops elengi]]'' *''[[Niemeyera discolor]]'' *''[[Niemeyera prunifera]]'' *''[[Palaquium galactoxylon]]'' *''[[Planchonella asterocarpon]]'' *''[[Planchonella chartacea]]'' *''[[Planchonella cotinifolia]]'' *''[[Planchonella euphlebia]]'' *''[[Planchonella myrsinifolia]]'' *''[[Planchonella myrsinodendron]]'' *''[[Planchonella obovata]]'' *''[[Planchonella pohlmaniana]]'' *''[[Planchonella xylocarpa]]'' *''[[Pleioluma brownlessiana]]'' *''[[Pleioluma ferruginea]]'' *''[[Pleioluma laurifolia]]'' *''[[Pleioluma macrocarpa]]'' *''[[Pleioluma papyracea]]'' *''[[Pleioluma pilosa]]'' *''[[Pleioluma queenslandica]]'' *''[[Pleioluma singuliflora]]'' *''[[Pleioluma xerocarpa]]'' *''[[Sersalisia obpyriformis]]'' *''[[Sersalisia sericea]]'' *''[[Sersalisia sessiliflora]]'' *''[[Sersalisia unmackiana]]'' *''[[Vanroyena castanosperma]]'' {{div col end}} ==Scrophulariaceae== *''[[Myoporum montanum]]'' ==Simaroubaceae== {{div col|colwidth=24em}} *''[[Ailanthus integrifolia]]'' *''[[Ailanthus triphysa]]'' *''[[Brucea javanica]]'' *''[[Quassia amara]]'' *''[[Samadera baileyana]]'' *''[[Samadera bidwillii]]'' *''[[Samadera sp. Barong (B.Gray 742)]]'' *''[[Samadera sp. Tozer Range (L.J.Brass 19393)]]'' {{div col end}} ==Smilacaceae== {{div col|colwidth=24em}} *''[[Smilax aculeatissima]]'' *''[[Smilax australis]]'' *''[[Smilax blumei]]'' *''[[Smilax calophylla]]'' *''[[Smilax glyciphylla]]'' *''[[Smilax kaniensis]]'' *''[[Smilax sp. aff. S. elliptica]]'' {{div col end}} ==Solanaceae== {{div col|colwidth=18em}} *''[[Capsicum annuum]]'' *''[[Cestrum nocturnum]]'' *''[[Duboisia myoporoides]]'' *''[[Lycianthes shanesii]]'' *''[[Nicandra physalodes]]'' *''[[Nicotiana forsteri]]'' *''[[Nicotiana tabacum]]'' *''[[Nicotiana wuttkei]]'' *''[[Physalis angulata]]'' *''[[Physalis peruviana]]'' *''[[Solanum aviculare]]'' *''[[Solanum betaceum]]'' *''[[Solanum capsicoides]]'' *''[[Solanum cookii]]'' *''[[Solanum defensum]]'' *''[[Solanum dimorphispinum]]'' *''[[Solanum discolor]]'' *''[[Solanum dunalianum]]'' *''[[Solanum ellipticum]]'' *''[[Solanum eminens]]'' *''[[Solanum erianthum]]'' *''[[Solanum fervens]]'' *''[[Solanum francisii]]'' *''[[Solanum furfuraceum]]'' *''[[Solanum hamulosum]]'' *''[[Solanum intonsum]]'' *''[[Solanum lasiocarpum]]'' *''[[Solanum macoorai]]'' *''[[Solanum magnifolium]]'' *''[[Solanum mauritianum]]'' *''[[Solanum nigrum]]'' *''[[Solanum nodiflorum]]'' *''[[Solanum parvifolium]]'' *''[[Solanum pseudocapsicum]]'' *''[[Solanum seaforthianum]]'' *''[[Solanum sporadotrichum]]'' *''[[Solanum tetrandrum]]'' *''[[Solanum torvum]]'' *''[[Solanum viridifolium]]'' {{div col end}} ==Stemonaceae== *''[[Stemona australiana]]'' *''[[Stemona lucida]]'' ==Surianaceae== *''[[Cadellia pentastylis]]'' *''[[Guilfoylia monostylis]]'' *''[[Suriana maritima]]'' ==Symplocaceae== {{div col|colwidth=18em}} *''[[Symplocos ampulliformis]]'' *''[[Symplocos boonjee]]'' *''[[Symplocos bullata]]'' *''[[Symplocos crassiramifera]]'' *''[[Symplocos cyanocarpa]]'' *''[[Symplocos gittinsii]]'' *''[[Symplocos glabra]]'' *''[[Symplocos graniticola]]'' *''[[Symplocos hayesii]]'' *''[[Symplocos hylandii]]'' *''[[Symplocos oresbia]]'' *''[[Symplocos paucistaminea]]'' *''[[Symplocos puberula]]'' *''[[Symplocos stawellii]]'' *''[[Symplocos thwaitesii]]'' *''[[Symplocos wooroonooran]]'' {{div col end}} ==Taccaceae== *''[[Tacca leontopetaloides]]'' ==Theaceae== *''[[Camellia sinensis]]'' ==Thismiaceae== *''[[Thismia hawkesii]]'' *''[[Thismia lanternata]]'' *''[[Thismia tectipora]]'' *''[[Thismia yorkensis]]'' ==Thymelaeaceae== {{div col|colwidth=24em}} *''[[Lethedon setosa]]'' *''[[Phaleria biflora]]'' *''[[Phaleria chermsideana]]'' *''[[Phaleria clerodendron]]'' *''[[Phaleria octandra]]'' *''[[Pimelea aquilonia]]'' *''[[Pimelea chlorina]]'' *''[[Pimelea latifolia]]'' *''[[Pimelea linifolia]]'' *''[[Pimelea sericostachya]]'' *''[[Wikstroemia indica]]'' {{div col end}} ==Triuridaceae== *''[[Sciaphila arfakiana]]'' *''[[Sciaphila tenella]]'' ==Urticaceae== {{div col|colwidth=18em}} *''[[Cecropia peltata]]'' *''[[Debregeasia australis]]'' *''[[Dendrocnide corallodesme]]'' *''[[Dendrocnide cordifolia]]'' *''[[Dendrocnide moroides]]'' *''[[Dendrocnide photinophylla]]'' *''[[Elatostema reticulatum]]'' *''[[Laportea interrupta]]'' *''[[Nothocnide repanda]]'' *''[[Pipturus argenteus]]'' *''[[Pouzolzia zeylanica]]'' *''[[Procris pedunculata]]'' *''[[Urtica incisa]]'' {{div col end}} ==Verbenaceae== {{div col|colwidth=24em}} *''[[Duranta erecta]]'' *''[[Lantana camara]]'' *''[[Stachytarpheta cayennensis]]'' *''[[Stachytarpheta jamaicensis]]'' *''[[Stachytarpheta mutabilis]]'' *''[[Verbena bonariensis]]'' *''[[Verbena litoralis]]'' {{div col end}} ==Violaceae== *''[[Afrohybanthus enneaspermus]]'' *''[[Afrohybanthus stellarioides]]'' *''[[Rinorea bengalensis]]'' *''[[Viola perreniformis]]'' ==Vitaceae== {{div col|colwidth=18em}} *''[[Ampelocissus acetosa]]'' *''[[Ampelocissus gardineri]]'' *''[[Causonis clematidea]]'' *''[[Causonis japonica]]'' *''[[Causonis maritima]]'' *''[[Causonis trifolia]]'' *''[[Cayratia cardiophylla]]'' *''[[Cayratia saponaria]]'' *''[[Cissus adnata]]'' *''[[Cissus antarctica]]'' *''[[Cissus cardiophylla]]'' *''[[Cissus hastata]]'' *''[[Cissus hypoglauca]]'' *''[[Cissus oblonga]]'' *''[[Cissus penninervis]]'' *''[[Cissus pentaclada]]'' *''[[Cissus reniformis]]'' *''[[Cissus repens]]'' *''[[Cissus sterculiifolia]]'' *''[[Cissus vinosa]]'' *''[[Clematicissus opaca]]'' *''[[Leea novoguineensis]]'' *''[[Leea rubra]]'' *''[[Tetrastigma crenatum]]'' *''[[Tetrastigma nitens]]'' *''[[Tetrastigma petraeum]]'' *''[[Tetrastigma pisicarpum]]'' *''[[Tetrastigma thorsborneorum]]'' {{div col end}} ==Winteraceae== {{div col|colwidth=24em}} *''[[Bubbia queenslandiana]]'' *''[[Bubbia semecarpoides]]'' *''[[Bubbia whiteana]]'' *''[[Tasmannia insipida]]'' *''[[Tasmannia membranea]]'' *''[[Tasmannia sp. Mt Bellenden Ker (J.R.Clarkson 6571)]]'' {{div col end}} ==Zamiaceae== *''[[Bowenia serrulata]]'' *''[[Bowenia spectabilis]]'' *''[[Lepidozamia hopei]]'' ==Zingiberaceae== {{div col|colwidth=18em}} *''[[Alpinia arctiflora]]'' *''[[Alpinia caerulea]]'' *''[[Alpinia hylandii]]'' *''[[Alpinia modesta]]'' *''[[Amomum queenslandicum]]'' *''[[Curcuma australasica]]'' *''[[Curcuma longa]]'' *''[[Etlingera australasica]]'' *''[[Hedychium coronarium]]'' *''[[Hornstedtia scottiana]]'' *''[[Meistera dallachyi]]'' *''[[Pleuranthodium racemigerum]]'' *''[[Zingiber zerumbet]]'' {{div col end}} ==Zygophyllaceae== *''[[Tribulopis homalococca]]'' *''[[Tribulopis solandri]]'' sp0u4lq4mgafybve1t0d9umfxke81xj 11322397 11322395 2026-10-21T21:55:25Z Junglenut 2394078 /* Meliaceae */ 11322397 wikitext text/x-wiki ==Acanthaceae== {{div col|colwidth=18em}} *''[[Acanthus ilicifolius]]'' *''[[Asystasia sp. Newcastle Bay (L.J.Brass 18671)]]'' *''[[Dicliptera ciliata]]'' *''[[Dicliptera spicata]]'' *''[[Dipteracanthus australasicus]]'' *''[[Graptophyllum excelsum]]'' *''[[Graptophyllum spinigerum]]'' *''[[Harnieria hygrophiloides]]'' *''[[Hypoestes floribunda]]'' *''[[Justicia sp. Marr Creek (B.Hyland 16069)]]'' *''[[Peristrophe brassii]]'' *''[[Pseuderanthemum variabile]]'' *''[[Rhaphidospora cavernarum]]'' *''[[Rhaphidospora platyphylla]]'' *''[[Rostellularia adscendens]]'' *''[[Ruellia tuberosa]]'' *''[[Thunbergia arnhemica]]'' *''[[Thunbergia laurifolia]]'' {{div col end}} ==Achariaceae== *''[[Baileyoxylon lanceolatum]]'' *''[[Ryparosa kurrangii]]'' ==Actinidiaceae== *''[[Saurauia andreana]]'' ==Adoxaceae== *''[[Sambucus australasica]]'' *''[[Sambucus canadensis]]'' ==Alseuosmiaceae== *''[[Crispiloba disperma]]'' ==Amaranthaceae== {{div col|colwidth=24em}} *''[[Achyranthes aspera]]'' *''[[Alternanthera ficoidea]]'' *''[[Alternanthera nana]]'' *''[[Amaranthus hybridus]]'' *''[[Amaranthus interruptus]]'' *''[[Amaranthus rhombeus]]'' *''[[Amaranthus spinosus]]'' *''[[Cyathula prostrata]]'' *''[[Deeringia amaranthoides]]'' *''[[Deeringia arborescens]]'' *''[[Pupalia micrantha]]'' {{div col end}} ==Amaryllidaceae== *''[[Crinum pedunculatum]]'' *''[[Proiphys amboinensis]]'' *''[[Proiphys infundibularis]]'' ==Anacardiaceae== {{div col|colwidth=24em}} *''[[Blepharocarya involucrigera]]'' *''[[Buchanania arborescens]]'' *''[[Buchanania mangoides]]'' *''[[Buchanania obovata]]'' *''[[Euroschinus falcatus]]'' - stub *''[[Mangifera indica]]'' *''[[Pleiogynium timoriense]]'' *''[[Rhus taitensis]]'' <!-- *''[[Schinus terebinthifolius]]'' introduced --> *''[[Semecarpus australiensis]]'' {{div col end}} ==Annonaceae== {{div col|colwidth=18em}} *''[[Annona glabra]]'' *''[[Annona squamosa]]'' *''[[Artabotrys carnosipetalus]]'' CYP *''[[Cananga odorata]]'' *''[[Desmos goezeanus]]'' *''[[Desmos polycarpus]]'' *''[[Desmos wardianus]]'' CYP, NT *''[[Goniothalamus australis]]'' *''[[Huberantha nitidissima]]'' *''[[Meiogyne bidwillii]]'' *''[[Meiogyne cylindrocarpa]]'' *''[[Meiogyne heteropetala]]'' *''[[Meiogyne hirsuta]]'' *''[[Meiogyne trichocarpa]]'' *''[[Meiogyne verrucosa]]'' *''[[Miliusa brahei]]'' *''[[Miliusa horsfieldii ]]'' *''[[Miliusa traceyi]]'' *''[[Mitrella tiwiensis]]'' *''[[Mitrephora diversifolia]]'' *''[[Monoon australe]]'' *''[[Monoon michaelii]]'' *''[[Monoon patinatum]]'' *''[[Polyalthia fruticosa]]'' *''[[Polyalthia hispida]]'' *''[[Polyalthia johnsonii]]'' *''[[Polyalthia submontana]]'' *''[[Polyalthia xanthocarpa]]'' *''[[Pseuduvaria froggattii]]'' *''[[Pseuduvaria hylandii]]'' *''[[Pseuduvaria mulgraveana]]'' *''[[Pseuduvaria villosa]]'' *''[[Uvaria concava]]'' *''[[Uvaria glabra]]'' *''[[Uvaria holtzei]]'' *''[[Uvaria leichhardtii ]]'' *''[[Uvaria micrantha]]'' *''[[Uvaria rufa]]'' *''[[Uvaria rupestre]]'' *''[[Uvaria sankowskyi]]'' *''[[Uvaria scabridula]]'' *''[[Uvaria topazensis]]'' *''[[Uvaria uhrii]]'' *''[[Uvaria unguiculata]]'' *''[[Xylopia maccreae]]'' *''[[Xylopia monosperma]]'' {{div col end}} ==Apiaceae== *''[[Centella asiatica]]'' *''[[Mackinlaya confusa]]'' *''[[Mackinlaya macrosciadea ]]'' ==Apocynaceae== {{div col|colwidth=18em}} *''[[Allamanda cathartica]]'' *''[[Alstonia actinophylla]]'' *''[[Alstonia constricta]]'' *''[[Alstonia linearis]]'' *''[[Alstonia muelleriana]]'' *''[[Alstonia scholaris]]'' *''[[Alstonia spectabilis]]'' *''[[Alyxia grandis]]'' *''[[Alyxia ilicifolia]]'' *''[[Alyxia magnifolia]]'' *''[[Alyxia oblongata]]'' *''[[Alyxia orophila]]'' *''[[Alyxia ruscifolia]]'' *''[[Alyxia spicata]]'' *''[[Alyxia stellata]]'' *''[[Asclepias curassavica]]'' *''[[Calotropis procera]]'' *''[[Carissa lanceolata]]'' *''[[Carissa laxiflora]]'' *''[[Carissa ovata]]'' *''[[Carissa scabra]]'' *''[[Cascabela thevetia]]'' *''[[Catharanthus roseus]]'' *''[[Cerbera floribunda]]'' *''[[Cerbera inflata]]'' *''[[Cerbera manghas]]'' *''[[Ceropegia cumingiana ]]'' *''[[Cryptostegia grandiflora]]'' *''[[Cynanchum bowmanii]]'' *''[[Cynanchum carnosum]]'' *''[[Cynanchum leptolepis]]'' *''[[Cynanchum ovalifolium]]'' *''[[Cynanchum pedunculatum]]'' *''[[Cynanchum viminale]]'' *''[[Dischidia litoralis]]'' *''[[Dischidia major]]'' *''[[Dischidia nummularia ]]'' *''[[Dischidia ovata]]'' *''[[Gomphocarpus physocarpus]]'' *''[[Gunnessia pepo]]'' *''[[Gymnanthera oblonga ]]'' *''[[Heterostemma acuminatum]]'' *''[[Hoya anulata]]'' *''[[Hoya australis]]'' *''[[Hoya macgillivrayi]]'' *''[[Hoya pottsii]]'' *''[[Hoya sussuela]]'' *''[[Ichnocarpus frutescens]]'' *''[[Ichnocarpus rhombifolius]]'' *''[[Kopsia arborea]]'' *''[[Marsdenia connivens ]]'' *''[[Marsdenia cymulosa]]'' *''[[Marsdenia geminata]]'' *''[[Marsdenia glandulifera]]'' *''[[Marsdenia hemiptera]]'' *''[[Marsdenia jensenii]]'' *''[[Marsdenia longipedicellata]]'' *''[[Marsdenia micradenia]]'' *''[[Marsdenia microlepis]]'' *''[[Marsdenia paludicola]]'' *''[[Marsdenia pleiadenia]]'' *''[[Marsdenia rostrata]]'' *''[[Marsdenia straminea]]'' *''[[Marsdenia tricholepis]]'' *''[[Marsdenia velutina]]'' *''[[Marsdenia viridiflora]]'' *''[[Melodinus acutiflorus]]'' *''[[Melodinus australis]]'' *''[[Melodinus baccellianus]]'' *''[[Melodinus forbesii]]'' *''[[Neisosperma kilneri]]'' *''[[Neisosperma poweri]]'' *''[[Ochrosia elliptica]]'' *''[[Ochrosia minima]]'' *''[[Parsonsia alboflavescens]]'' *''[[Parsonsia bartlensis]]'' *''[[Parsonsia blakeana]]'' *''[[Parsonsia densivestita]]'' *''[[Parsonsia eucalyptophylla]]'' *''[[Parsonsia ferruginea]]'' *''[[Parsonsia grayana]]'' *''[[Parsonsia lanceolata]]'' *''[[Parsonsia langiana]]'' *''[[Parsonsia larcomensis]]'' *''[[Parsonsia latifolia]]'' *''[[Parsonsia lenticellata]]'' *''[[Parsonsia longipetiolata]]'' *''[[Parsonsia plaesiophylla]]'' *''[[Parsonsia rotata]]'' *''[[Parsonsia straminea]]'' *''[[Parsonsia velutina]]'' *''[[Parsonsia ventricosa]]'' *''[[Parsonsia wildensis]]'' *''[[Parsonsia wongabelensis]]'' *''[[Phyllanthera grayi]]'' *''[[Sarcolobus hullsii]]'' *''[[Sarcolobus vittatus]]'' *''[[Secamone elliptica]]'' *''[[Secamone lineata]]'' *''[[Secamone timorensis]]'' *''[[Tabernaemontana orientalis]]'' *''[[Tabernaemontana pandacaqui]]'' *''[[Tylophora benthamii]]'' *''[[Tylophora cinerascens]]'' *''[[Tylophora colorata]]'' *''[[Tylophora flexuosa]]'' *''[[Tylophora grandiflora]]'' *''[[Tylophora williamsii]]'' *''[[Voacanga grandifolia]]'' *''[[Wrightia laevis]]'' *''[[Wrightia pubescens]]'' *''[[Wrightia saligna]]'' *''[[Wrightia versicolor]]'' {{div col end}} ==Aquifoliaceae== *''[[Ilex arnhemensis]]'' *''[[Ilex sp. Gadgarra (B.P.Hyland RFK 2011) ]]'' ==Araceae== {{div col|colwidth=18em}} *''[[Alocasia brisbanensis]]'' *''[[Amorphophallus galbra]]'' *''[[Amorphophallus paeoniifolius]]'' *''[[Colocasia esculenta]]'' *''[[Epipremnum amplissimum]]'' *''[[Epipremnum pinnatum]]'' *''[[Epipremnum pinnatum cv. Aureum]]'' *''[[Gymnostachys anceps]]'' *''[[Pothos brassii]]'' *''[[Pothos longipes]]'' *''[[Remusatia vivipara]]'' *''[[Rhaphidophora australasica]]'' *''[[Rhaphidophora hayi]]'' *''[[Rhaphidophora petrieana ]]'' *''[[Scindapsus altissimus]]'' *''[[Syngonium podophyllum]]'' *''[[Typhonium alismifolium]]'' *''[[Typhonium brownii]]'' *''[[Typhonium flagelliforme]]'' *''[[Typhonium peltandroides]]'' *''[[Typhonium wilbertii]]'' {{div col end}} ==Araliaceae== {{div col|colwidth=18em}} *''[[Cephalaralia cephalobotrys]]'' *''[[Hydrocotyle acutiloba]]'' *''[[Hydrocotyle digitata]]'' *''[[Hydrocotyle miranda]]'' *''[[Hydrocotyle pedicellosa]]'' *''[[Hydrocotyle peduncularis]]'' *''[[Hydrocotyle tripartita]]'' *''[[Motherwellia haplosciadea]]'' *''[[Polyscias australiana]]'' *''[[Polyscias bellendenkerensis]]'' *''[[Polyscias elegans]]'' *''[[Polyscias macgillivrayi]]'' *''[[Polyscias mollis]]'' *''[[Polyscias murrayi]]'' *''[[Polyscias nodosa]]'' *''[[Polyscias purpurea]]'' *''[[Polyscias spectabilis]]'' *''[[Polyscias willmottii]]'' *''[[Polyscias zippeliana]]'' *''[[Schefflera actinophylla]]'' *''[[Schefflera bractescens]]'' *''[[Schefflera elliptica]]'' *''[[Trachymene geraniifolia]]'' *''[[Trachymene tenuifolia]]'' {{div col end}} ==Araucariaceae== *''[[Agathis atropurpurea]]'' *''[[Agathis microstachya]]'' *''[[Agathis robusta]]'' *''[[Araucaria bidwillii]]'' *''[[Araucaria cunninghamii]]'' ==Arecaceae== {{div col|colwidth=18em}} *''[[Archontophoenix alexandrae]]'' *''[[Archontophoenix cunninghamiana]]'' *''[[Archontophoenix maxima]]'' *''[[Archontophoenix myolensis]]'' *''[[Archontophoenix purpurea]]'' *''[[Archontophoenix tuckeri]]'' *''[[Arenga australasica]]'' *''[[Arenga microcarpa]]'' *''[[Calamus aruensis]]'' *''[[Calamus australis]]'' *''[[Calamus caryotoides]]'' *''[[Calamus moti]]'' *''[[Calamus radicalis ]]'' *''[[Calamus vitiensis]]'' *''[[Calamus warburgii]]'' *''[[Carpentaria acuminata]]'' *''[[Caryota albertii]]'' *''[[Cocos nucifera]]'' *''[[Corypha utan]]'' *''[[Hydriastele costata]]'' *''[[Hydriastele wendlandiana]]'' *''[[Laccospadix australasicus]]'' *''[[Licuala ramsayi]]'' *''[[Linospadix apetiolatus]]'' *''[[Linospadix microcaryus]]'' *''[[Linospadix minor]]'' *''[[Linospadix palmerianus]]'' *''[[Livistona australis]]'' *''[[Livistona benthamii]]'' *''[[Livistona concinna]]'' *''[[Livistona decora]]'' *''[[Livistona drudei]]'' *''[[Livistona muelleri]]'' *''[[Livistona rigida]]'' *''[[Livistona victoriae]]'' *''[[Normanbya normanbyi]]'' *''[[Oraniopsis appendiculata ]]'' *''[[Ptychosperma elegans]]'' *''[[Ptychosperma macarthurii]]'' *''[[Wodyetia bifurcata]]'' {{div col end}} ==Argophyllaceae== {{div col|colwidth=24em}} *''[[Argophyllum cryptophlebum]]'' *''[[Argophyllum curtum]]'' *''[[Argophyllum ferrugineum]]'' *''[[Argophyllum heterodontum]]'' *''[[Argophyllum iridescens]]'' *''[[Argophyllum jagonis]]'' *''[[Argophyllum lejourdanii]]'' *''[[Argophyllum loxotrichum]]'' *''[[Argophyllum nullumense]]'' *''[[Argophyllum verae]]'' 🚫 {{div col end}} ==Aristolochiaceae== {{div col|colwidth=24em}} *''[[Aristolochia acuminata ]]'' *''[[Aristolochia australopithecurus]]'' *''[[Aristolochia chalmersii]]'' *''[[Aristolochia deltantha]]'' *''[[Aristolochia elegans]]'' *''[[Aristolochia indica]]'' *''[[Aristolochia peninsulensis]]'' *''[[Aristolochia praevenosa]]'' *''[[Aristolochia pubera]]'' *''[[Aristolochia sparusifolia]]'' *''[[Aristolochia thozetii]]'' {{div col end}} ==Asparagaceae== {{div col|colwidth=24em}} *''[[Asparagus aethiopicus]]'' *''[[Asparagus plumosus]]'' *''[[Asparagus racemosus]]'' *''[[Cordyline cannifolia]]'' *''[[Cordyline fruticosa]]'' *''[[Cordyline manners-suttoniae]]'' *''[[Cordyline murchisoniae]]'' *''[[Cordyline petiolaris]]'' *''[[Eustrephus latifolius]]'' *''[[Lomandra banksii]]'' *''[[Lomandra hystrix]]'' *''[[Lomandra longifolia]]'' *''[[Lomandra tropica]]'' *''[[Pleomele angustifolia ]]'' *''[[Romnalda grallata]]'' *''[[Romnalda ophiopogonoides]]'' {{div col end}} ==Asteraceae== {{div col|colwidth=18em}} *''[[Acanthospermum hispidum]]'' *''[[Adenostemma lavenia]]'' *''[[Adenostemma macrophyllum ]]'' *''[[Ageratina riparia]]'' *''[[Ageratum conyzoides]]'' *''[[Apowollastonia longipes]]'' *''[[Bidens alba]]'' *''[[Bidens bipinnata]]'' *''[[Bidens pilosa]]'' *''[[Bidens subalternans]]'' *''[[Blainvillea cunninghamii]]'' *''[[Blumea riparia]]'' *''[[Blumea sylvatica]]'' *''[[Calyptocarpus vialis]]'' *''[[Cassinia subtropica]]'' *''[[Centratherum punctatum]]'' *''[[Chromolaena odorata]]'' *''[[Cirsium vulgare]]'' *''[[Coronidium rupicola]]'' *''[[Cosmos caudatus]]'' *''[[Crassocephalum crepidioides]]'' *''[[Cyanthillium cinereum]]'' *''[[Cyanthillium patulum]]'' *''[[Dichrocephala integrifolia]]'' *''[[Eclipta prostrata]]'' *''[[Elephantopus scaber]]'' *''[[Eleutheranthera ruderalis]]'' *''[[Emilia sonchifolia]]'' *''[[Erechtites valerianifolius]]'' *''[[Erigeron canadensis]]'' *''[[Erigeron sumatrensis]]'' *''[[Eschenbachia leucantha]]'' *''[[Gynura drymophila]]'' *''[[Mikania micrantha]]'' *''[[Montanoa hibiscifolia]]'' *''[[Olearia canescens]]'' *''[[Ozothamnus cassinioides]]'' *''[[Ozothamnus diosmifolius]]'' *''[[Phacellothrix cladochaeta]]'' *''[[Praxelis clematidea]]'' *''[[Pseudelephantopus spicatus]]'' *''[[Senecio bipinnatisectus]]'' *''[[Senecio tamoides]]'' *''[[Sigesbeckia orientalis]]'' *''[[Sphagneticola trilobata]]'' *''[[Synedrella nodiflora]]'' *''[[Tagetes minuta]]'' *''[[Tithonia diversifolia]]'' *''[[Tridax procumbens]]'' *''[[Vittadinia bicolor]]'' *''[[Vittadinia scabra]]'' *''[[Wollastonia biflora]]'' *''[[Youngia japonica]]'' {{div col end}} ==Atherospermataceae== *''[[Daphnandra apatela]]'' *''[[Daphnandra repandula]]'' *''[[Doryphora aromatica]]'' *''[[Dryadodaphne trachyphloia]]'' ==Austrobaileyaceae== *''[[Austrobaileya scandens]]'' ==Balanopaceae== *''[[Balanops australiana]]'' ==Balanophoraceae== *''[[Balanophora fungosa]]'' ==Balsaminaceae== *''[[Impatiens walleriana]]'' ==Basellaceae== *''[[Anredera cordifolia]]'' ==Begoniaceae== *''[[Begonia hirtella]]'' ==Bignoniaceae== {{div col|colwidth=24em}} *''[[Deplanchea tetraphylla]]'' *''[[Dolichandrone spathacea]]'' *''[[Macfadyena unguis-cati]]'' *''[[Neosepicaea jucunda]]'' *''[[Neosepicaea viticoides]]'' *''[[Pandorea jasminoides]]'' *''[[Pandorea nervosa]]'' *''[[Pandorea pandorana]]'' *''[[Parmentiera aculeata]]'' *''[[Spathodea campanulata]]'' *''[[Tecomanthe burungu]]'' {{div col end}} ==Bixaceae== *''[[Cochlospermum gillivraei]]'' ==Boraginaceae== {{div col|colwidth=24em}} *''[[Cordia aspera]]'' *''[[Cordia dichotoma]]'' *''[[Cordia myxa]]'' *''[[Cordia subcordata]]'' *''[[Cynoglossum australe]]'' *''[[Ehretia acuminata]]'' *''[[Ehretia grahamii]]'' *''[[Ehretia microphylla]]'' *''[[Ehretia saligna]]'' *''[[Ehretia sp. Whitfield Range (R.Jago 17)]]'' *''[[Heliotropium foertherianum]]'' *''[[Heliotropium muelleri]]'' *''[[Heliotropium sarmentosum]]'' *''[[Heliotropium tenuifolium]]'' *''[[Trichodesma zeylanicum]]'' {{div col end}} ==Brassicaceae== *''[[Cardamine flexuosa]]'' ==Burseraceae== *''[[Canarium acutifolium]]'' *''[[Canarium australasicum]]'' *''[[Canarium australianum]]'' *''[[Canarium muelleri]]'' *''[[Canarium vitiense]]'' *''[[Garuga floribunda]]'' ==Cactaceae== *''[[Opuntia stricta]]'' *''[[Opuntia tomentosa]]'' ==Calycanthaceae== *''[[Idiospermum australiense]]'' ==Campanulaceae== *''[[Lobelia trigonocaulis]]'' ==Cannabaceae== {{div col|colwidth=24em}} *''[[Aphananthe philippinensis]]'' *''[[Celtis hildebrandii]]'' *''[[Celtis paniculata]]'' *''[[Celtis philippensis]]'' *''[[Celtis strychnoides]]'' *''[[Celtis timorensis]]'' *''[[Trema cannabina]]'' *''[[Trema orientalis]]'' *''[[Trema tomentosa]]'' {{div col end}} ==Cannaceae== *''[[Canna indica]]'' ==Capparaceae== {{div col|colwidth=24em}} *''[[Cadaba capparoides]]'' *''[[Capparis arborea]]'' *''[[Capparis batianoffii]]'' *''[[Capparis jacobsii]]'' *''[[Capparis lanceolaris]]'' *''[[Capparis lasiantha]]'' *''[[Capparis lucida]]'' *''[[Capparis ornans]]'' *''[[Capparis quiniflora]]'' *''[[Capparis sepiaria]]'' *''[[Capparis shanesiana]]'' *''[[Capparis sp. Iron Range (B.Hyland 16395)]]'' *''[[Crateva religiosa]]'' {{div col end}} ==Cardiopteridaceae== *''[[Cardiopteris moluccana]]'' ==Caryophyllaceae== *''[[Drymaria cordata]]'' ==Casuarinaceae== *''[[Allocasuarina torulosa]]'' *''[[Casuarina cristata]]'' *''[[Casuarina cunninghamiana]]'' *''[[Casuarina equisetifolia]]'' *''[[Gymnostoma australianum]]'' ==Celastraceae== {{div col|colwidth=18em}} *''[[Brassiantha hedraiantheroides]]'' *''[[Celastrus subspicatus]]'' *''[[Denhamia bilocularis]]'' *''[[Denhamia cunninghamii]]'' *''[[Denhamia disperma]]'' *''[[Denhamia fasciculiflora]]'' *''[[Denhamia obscura]]'' *''[[Denhamia oleaster]]'' *''[[Denhamia peninsularis]]'' *''[[Denhamia pittosporoides]]'' *''[[Denhamia viridissima]]'' *''[[Dinghoua globularis]]'' *''[[Elaeodendron australe]]'' *''[[Elaeodendron melanocarpum]]'' *''[[Euonymus australiana]]'' *''[[Gymnosporia inermis]]'' *''[[Hedraianthera porphyropetala]]'' *''[[Hexaspora pubescens]]'' *''[[Hippocratea barbata]]'' *''[[Hypsophila dielsiana]]'' *''[[Hypsophila halleyana]]'' *''[[Lophopetalum arnhemicum]]'' *''[[Perrottetia arborescens]]'' *''[[Pleurostylia opposita]]'' *''[[Salacia chinensis]]'' *''[[Salacia disepala]]'' *''[[Salacia erythrocarpa]]'' *''[[Siphonodon australis]]'' *''[[Siphonodon membranaceus]]'' {{div col end}} ==Chenopodiaceae== *''[[Dysphania carinata]]'' *''[[Einadia hastata]]'' ==Chrysobalanaceae== *''[[Maranthes corymbosa]]'' *''[[Parinari nonda]]'' ==Cleomaceae== *''[[Cleome aculeata]]'' *''[[Cleome viscosa]]'' ==Clusiaceae== {{div col|colwidth=18em}} *''[[Calophyllum australianum]]'' *''[[Calophyllum bicolor]]'' *''[[Calophyllum costatum]]'' *''[[Calophyllum inophyllum]]'' *''[[Calophyllum sil]]'' *''[[Calophyllum soulattri]]'' *''[[Garcinia brassii]]'' *''[[Garcinia dulcis]]'' *''[[Garcinia gibbsiae]]'' *''[[Garcinia jensenii]]'' *''[[Garcinia leggeae]]'' *''[[Garcinia mestonii]]'' *''[[Garcinia russellii]]'' *''[[Garcinia warrenii]]'' *''[[Garcinia xanthochymus]]'' *''[[Garcinia zichii]]'' *''[[Mammea touriga]]'' *''[[Mesua larnachiana]]'' *''[[Mesua sp. Boonjee (A.K.Irvine 1218)]]'' {{div col end}} ==Colchicaceae== *''[[Kuntheria pedunculata]]'' *''[[Schelhammera multiflora]]'' ==Combretaceae== {{div col|colwidth=18em}} *''[[Combretum trifoliatum]]'' *''[[Dansiea elliptica]]'' *''[[Macropteranthes fitzalanii]]'' *''[[Macropteranthes leiocaulis]]'' *''[[Macropteranthes montana]]'' *''[[Quisqualis indica]]'' *''[[Terminalia arenicola]]'' *''[[Terminalia aridicola]]'' *''[[Terminalia catappa]]'' *''[[Terminalia complanata]]'' *''[[Terminalia erythrocarpa]]'' *''[[Terminalia melanocarpa]]'' *''[[Terminalia microcarpa]]'' *''[[Terminalia muelleri]]'' *''[[Terminalia oblongata]]'' *''[[Terminalia petiolaris]]'' *''[[Terminalia platyphylla]]'' *''[[Terminalia porphyrocarpa]]'' *''[[Terminalia subacroptera]]'' *''[[Terminalia volucris]]'' {{div col end}} ==Commelinaceae== {{div col|colwidth=18em}} *''[[Aneilema acuminatum]]'' *''[[Aneilema papuanum]]'' *''[[Aneilema siliculosum]]'' *''[[Commelina diffusa]]'' *''[[Commelina ensifolia]]'' *''[[Cyanotis axillaris]]'' *''[[Floscopa scandens]]'' *''[[Pollia crispata]]'' *''[[Pollia macrophylla]]'' *''[[Tradescantia zebrina]]'' {{div col end}} ==Connaraceae== *''[[Connarus conchocarpus]]'' *''[[Rourea brachyandra]]'' ==Convolvulaceae== {{div col|colwidth=18em}} *''[[Argyreia nervosa]]'' *''[[Bonamia dietrichiana]]'' *''[[Camonea pilosa]]'' *''[[Decalobanthus peltatus]]'' *''[[Distimake dissectus]]'' *''[[Distimake quinquefolius]]'' *''[[Distimake tuberosus]]'' *''[[Erycibe coccinea]]'' *''[[Ipomoea abrupta]]'' *''[[Ipomoea aculeata]]'' *''[[Ipomoea cairica]]'' *''[[Ipomoea eriocarpa]]'' *''[[Ipomoea gracilis]]'' *''[[Ipomoea hederifolia]]'' *''[[Ipomoea indica]]'' *''[[Ipomoea littoralis]]'' *''[[Ipomoea mauritiana]]'' *''[[Ipomoea muelleri]]'' *''[[Ipomoea nil]]'' *''[[Ipomoea obscura]]'' *''[[Ipomoea pes-caprae]]'' *''[[Ipomoea plebeia]]'' *''[[Ipomoea quamoclit]]'' *''[[Ipomoea saintronanensis]]'' *''[[Ipomoea sp. Merluna (B.Hyland 21374V)]]'' *''[[Ipomoea trichosperma]]'' *''[[Ipomoea triloba]]'' *''[[Ipomoea velutina]]'' *''[[Ipomoea violacea]]'' *''[[Jacquemontia paniculata]]'' *''[[Lepistemon urceolatus]]'' *''[[Merremia gemella]]'' *''[[Merremia hederacea]]'' *''[[Operculina riedeliana]]'' *''[[Stictocardia queenslandica ]]'' *''[[Turbina corymbosa]]'' *''[[Xenostegia tridentata]]'' {{div col end}} ==Cornaceae== *''[[Alangium polyosmoides]]'' *''[[Alangium solomonense]]'' ==Corsiaceae== *''[[Corsia dispar]]'' ==Corynocarpaceae== *''[[Corynocarpus cribbianus]]'' ==Costaceae== *''[[Cheilocostus potierae]]'' *''[[Costus dubius]]'' *''[[Tapeinochilos ananassae]]'' ==Crassulaceae== *''[[Bryophyllum pinnatum]]'' ==Cucurbitaceae== {{div col|colwidth=18em}} *''[[Cucumis althaeoides]]'' *''[[Cucumis anguria]]'' *''[[Cucumis costatus]]'' *''[[Cucumis melo]]'' *''[[Cucumis queenslandicus]]'' *''[[Cucumis umbellatus]]'' *''[[Diplocyclos palmatus]]'' *''[[Luffa aegyptiaca]]'' *''[[Momordica charantia]]'' *''[[Momordica cochinchinensis]]'' *''[[Muellerargia timorensis]]'' *''[[Neoalsomitra capricornica]]'' *''[[Neoalsomitra clavigera]]'' *''[[Sicyos australis]]'' *''[[Sicyos undara]]'' *''[[Trichosanthes cucumerina]]'' *''[[Trichosanthes morrisii]]'' *''[[Trichosanthes odontosperma]]'' *''[[Trichosanthes pentaphylla]]'' *''[[Trichosanthes pilosa]]'' *''[[Zehneria cunninghamii]]'' {{div col end}} ==Cunoniaceae== {{div col|colwidth=18em}} *''[[Ackama australiensis]]'' *''[[Ackama paniculosa]]'' *''[[Ceratopetalum corymbosum]]'' *''[[Ceratopetalum hylandii]]'' *''[[Ceratopetalum iugumensis]]'' *''[[Ceratopetalum macrophyllum]]'' *''[[Ceratopetalum succirubrum]]'' *''[[Ceratopetalum virchowii]]'' *''[[Davidsonia pruriens]]'' *''[[Eucryphia wilkiei]]'' *''[[Gillbeea adenopetala]]'' *''[[Gillbeea whypallana]]'' *''[[Karrabina biagiana]]'' *''[[Pseudoweinmannia apetala]]'' *''[[Pullea stutzeri]]'' *''[[Schizomeria ovata]]'' *''[[Schizomeria whitei]]'' *''[[Spiraeanthemum davidsonii]]'' {{div col end}} ==Cupressaceae== *''[[Callitris intratropica]]'' *''[[Callitris macleayana]]'' ==Cycadaceae== *''[[Cycas media]]'' *''[[Cycas silvestris]]'' ==Cyperaceae== {{div col|colwidth=18em}} *''[[Arthrostylis aphylla]]'' *''[[Bulbostylis barbata]]'' *''[[Carex brunnea]]'' *''[[Carex cryptostachys]]'' *''[[Carex horsfieldii]]'' *''[[Carex maculata]]'' *''[[Carex rafflesiana]]'' *''[[Cyperus aquatilis]]'' *''[[Cyperus brevifolius]]'' *''[[Cyperus bulbosus]]'' *''[[Cyperus decompositus]]'' *''[[Cyperus dietrichiae]]'' *''[[Cyperus enervis]]'' *''[[Cyperus gracilis]]'' *''[[Cyperus gunnii]]'' *''[[Cyperus haspan]]'' *''[[Cyperus hyalinus]]'' *''[[Cyperus involucratus]]'' *''[[Cyperus javanicus]]'' *''[[Cyperus laxus]]'' *''[[Cyperus mirus]]'' *''[[Cyperus multispiceus]]'' *''[[Cyperus paniceus]]'' *''[[Cyperus pedunculosus]]'' *''[[Cyperus pilosus]]'' *''[[Cyperus polystachyos ]]'' *''[[Cyperus sulcinux]]'' *''[[Cyperus tetraphyllus]]'' *''[[Cyperus triceps]]'' *''[[Cyperus trinervis]]'' *''[[Cyperus zollingeri]]'' *''[[Eleocharis ochrostachys ]]'' *''[[Exocarya scleroides]]'' *''[[Fimbristylis depauperata ]]'' *''[[Fimbristylis dichotoma]]'' *''[[Fimbristylis microcarya]]'' *''[[Fimbristylis pauciflora]]'' *''[[Fuirena ciliaris]]'' *''[[Fuirena umbellata]]'' *''[[Gahnia aspera]]'' *''[[Gahnia sieberiana]]'' *''[[Hypolytrum compactum]]'' *''[[Hypolytrum nemorum]]'' *''[[Hypolytrum proliferum]]'' *''[[Isolepis humillima]]'' *''[[Rhynchospora corymbosa]]'' *''[[Rhynchospora leae]]'' *''[[Scirpodendron ghaeri]]'' *''[[Scleria brownii]]'' *''[[Scleria ciliaris]]'' *''[[Scleria levis]]'' *''[[Scleria lingulata]]'' *''[[Scleria lithosperma]]'' *''[[Scleria novae-hollandiae]]'' *''[[Scleria polycarpa]]'' *''[[Scleria rugosa]]'' *''[[Scleria sphacelata]]'' *''[[Scleria sumatrensis]]'' *''[[Scleria terrestris]]'' *''[[Thoracostachyum sumatranum]]'' {{div col end}} ==Datiscaceae== *''[[Tetrameles nudiflora]]'' ==Dichapetalaceae== *''[[Dichapetalum papuanum]]'' *''[[Dichapetalum timoriense]]'' ==Dilleniaceae== *''[[Dillenia alata]]'' *''[[Hibbertia banksii]]'' *''[[Hibbertia melhanioides ]]'' *''[[Hibbertia scandens]]'' *''[[Tetracera daemeliana]]'' *''[[Tetracera nordtiana]]'' ==Dioscoreaceae== *''[[Dioscorea alata]]'' *''[[Dioscorea bulbifera]]'' *''[[Dioscorea transversa]]'' ==Droseraceae== *''[[Drosera adelae]]'' *''[[Drosera lunata]]'' *''[[Drosera prolifera]]'' *''[[Drosera schizandra]]'' ==Ebenaceae== {{div col|colwidth=18em}} *''[[Diospyros areolifolia]]'' *''[[Diospyros australis]]'' *''[[Diospyros calycantha]]'' *''[[Diospyros compacta]]'' *''[[Diospyros fasciculosa]]'' *''[[Diospyros geminata]]'' *''[[Diospyros granitica]]'' *''[[Diospyros hebecarpa]]'' *''[[Diospyros hemicycloides]]'' *''[[Diospyros humilis]]'' *''[[Diospyros laurina]]'' *''[[Diospyros littorea]]'' *''[[Diospyros maritima]]'' *''[[Diospyros peninsularis]]'' *''[[Diospyros pentamera]]'' *''[[Diospyros pluviatilis]]'' *''[[Diospyros rheophila]]'' *''[[Diospyros rugosula]]'' *''[[Diospyros sp. Ham Hill (B.Hyland 2941RFK)]]'' *''[[Diospyros uvida]]'' {{div col end}} ==Elaeagnaceae== *''[[Elaeagnus triflora]]'' ==Elaeocarpaceae== {{div col|colwidth=18em}} *''[[Aceratium concinnum]]'' *''[[Aceratium doggrellii]]'' *''[[Aceratium ferrugineum]]'' *''[[Aceratium megalospermum]]'' *''[[Aceratium sericoleopsis]]'' *''[[Elaeocarpus angustifolius]]'' *''[[Elaeocarpus arnhemicus]]'' *''[[Elaeocarpus bancroftii]]'' *''[[Elaeocarpus carbinensis]]'' *''[[Elaeocarpus carolinae]]'' *''[[Elaeocarpus coorangooloo]]'' *''[[Elaeocarpus culminicola]]'' *''[[Elaeocarpus elliffii]]'' *''[[Elaeocarpus eumundi]]'' *''[[Elaeocarpus ferruginiflorus]]'' *''[[Elaeocarpus foveolatus]]'' *''[[Elaeocarpus grahamii]]'' *''[[Elaeocarpus grandis]]'' *''[[Elaeocarpus hylobroma]]'' *''[[Elaeocarpus johnsonii]]'' *''[[Elaeocarpus kirtonii]]'' *''[[Elaeocarpus largiflorens]]'' *''[[Elaeocarpus linsmithii]]'' *''[[Elaeocarpus miegei]]'' *''[[Elaeocarpus obovatus]]'' *''[[Elaeocarpus ruminatus]]'' *''[[Elaeocarpus sericopetalus]]'' *''[[Elaeocarpus sp. Mt Bellenden Ker (L.J.Brass 18336)]]'' *''[[Elaeocarpus sp. Windsor Tableland (B.Hyland 5541)]]'' *''[[Elaeocarpus stellaris]]'' *''[[Elaeocarpus thelmae]]'' *''[[Peripentadenia mearsii]]'' *''[[Peripentadenia phelpsii]]'' *''[[Sloanea australis]]'' *''[[Sloanea langii]]'' *''[[Sloanea macbrydei]]'' {{div col end}} ==Ericaceae== {{div col|colwidth=18em}} *''[[Acrothamnus spathaceus]]'' *''[[Acrotriche aggregata]]'' *''[[Acrotriche baileyana]]'' *''[[Dracophyllum sayeri]]'' *''[[Leucopogon malayanus]]'' *''[[Leucopogon ruscifolius]]'' *''[[Leucopogon yorkensis]]'' *''[[Paphia meiniana]]'' *''[[Rhododendron lochiae ]]'' *''[[Rhododendron viriosum]]'' *''[[Trochocarpa bellendenkerensis]]'' {{div col end}} ==Erythroxylaceae== *''[[Erythroxylum australe]]'' *''[[Erythroxylum sp. Brewer LA (B.Hyland 13373)]]'' *''[[Erythroxylum sp. Mosquito Point (J.R.Clarkson 9991)]]'' ==Escalloniaceae== {{div col|colwidth=24em}} *''[[Polyosma alangiacea]]'' *''[[Polyosma hirsuta]]'' *''[[Polyosma reducta]]'' *''[[Polyosma rhytophloia]]'' *''[[Polyosma rigidiuscula]]'' *''[[Polyosma sp. Mt Bellenden Ker (B.Hyland 2524RFK)]]'' *''[[Polyosma sp. Mt Lewis (B.Hyland 25241RFK)]]'' {{div col end}} ==Euphorbiaceae== {{div col|colwidth=18em}} *''[[Acalypha eremorum]]'' *''[[Acalypha lanceolata]]'' *''[[Acalypha lyonsii]]'' *''[[Acalypha nemorum]]'' *''[[Acalypha pubiflora]]'' *''[[Alchornea ilicifolia]]'' *''[[Alchornea rugosa]]'' *''[[Alchornea thozetiana]]'' *''[[Aleurites moluccanus]]'' *''[[Aleurites rockinghamensis ]]'' *''[[Baloghia inophylla]]'' *''[[Baloghia parviflora]]'' *''[[Bertya polystigma]]'' *''[[Claoxylon angustifolium]]'' *''[[Claoxylon hillii]]'' *''[[Claoxylon tenerifolium]]'' *''[[Cleidion javanicum]]'' *''[[Codiaeum membranaceum]]'' *''[[Codiaeum variegatum]]'' *''[[Croton acronychioides]]'' *''[[Croton arnhemicus]]'' *''[[Croton brachypus]]'' *''[[Croton capitis-york]]'' *''[[Croton caudatus]]'' *''[[Croton densivestitus]]'' *''[[Croton dockrillii]]'' *''[[Croton habrophyllus]]'' *''[[Croton insularis]]'' *''[[Croton mutabilis]]'' *''[[Croton phebalioides]]'' *''[[Croton simulans]]'' *''[[Croton stockeri]]'' *''[[Croton tomentellus]]'' *''[[Croton triacros]]'' *''[[Dimorphocalyx australiensis]]'' *''[[Endospermum myrmecophilum]]'' *''[[Euphorbia cyathophora]]'' *''[[Euphorbia hirta]]'' *''[[Euphorbia hyssopifolia]]'' *''[[Euphorbia plumerioides]]'' *''[[Euphorbia tannensis]]'' *''[[Excoecaria agallocha]]'' *''[[Excoecaria dallachyana]]'' *''[[Fontainea picrosperma]]'' *''[[Homalanthus novo-guineensis]]'' *''[[Homalanthus populifolius]]'' *''[[Hylandia dockrillii]]'' *''[[Macaranga dallachyana]]'' *''[[Macaranga inamoena]]'' *''[[Macaranga involucrata]]'' *''[[Macaranga polyadenia]]'' *''[[Macaranga subdentata]]'' *''[[Macaranga tanarius]]'' *''[[Mallotus claoxyloides]]'' *''[[Mallotus discolor]]'' *''[[Mallotus dispersus]]'' *''[[Mallotus ficifolius]]'' *''[[Mallotus mollissimus]]'' *''[[Mallotus nesophilus]]'' *''[[Mallotus paniculatus]]'' *''[[Mallotus philippensis]]'' *''[[Mallotus polyadenos]]'' *''[[Mallotus repandus]]'' *''[[Mallotus resinosus]]'' *''[[Mallotus surculosus]]'' *''[[Manihot glaziovii]]'' *''[[Microstachys chamaelea ]]'' *''[[Omphalea celata]]'' *''[[Omphalea papuana]]'' *''[[Omphalea queenslandiae]]'' *''[[Pimelodendron amboinicum]]'' *''[[Ricinocarpos ledifolius]]'' *''[[Ricinus communis]]'' *''[[Rockinghamia angustifolia]]'' *''[[Rockinghamia brevipes]]'' *''[[Shonia tristigma]]'' *''[[Suregada glomerulata]]'' *''[[Tragia finalis]]'' *''[[Tragia novae-hollandiae]]'' *''[[Trigonostemon inopinatus]]'' *''[[Wetria australiensis]]'' {{div col end}} ==Eupomatiaceae== *''[[Eupomatia barbata]]'' *''[[Eupomatia laurina]]'' ==Fabaceae== {{div col|colwidth=18em}} *''[[Abrus precatorius]]'' *''[[Acacia aulacocarpa]]'' *''[[Acacia auriculiformis]]'' *''[[Acacia celsa]]'' *''[[Acacia cincinnata ]]'' *''[[Acacia crassicarpa]]'' *''[[Acacia fasciculifera]]'' *''[[Acacia flavescens]]'' *''[[Acacia fleckeri]]'' *''[[Acacia harpophylla]]'' *''[[Acacia holosericea]]'' *''[[Acacia hylonoma]]'' *''[[Acacia lamprocarpa]]'' *''[[Acacia leptocarpa]]'' *''[[Acacia maidenii]]'' *''[[Acacia mangium]]'' *''[[Acacia melanoxylon]]'' *''[[Acacia midgleyi]]'' *''[[Acacia oraria]]'' *''[[Acacia polystachya ]]'' *''[[Acacia shirleyi]]'' *''[[Acacia solenota]]'' *''[[Acacia spirorbis]]'' *''[[Acacia ulicifolia]]'' *''[[Adenanthera pavonina]]'' *''[[Aeschynomene americana]]'' *''[[Albizia canescens]]'' *''[[Albizia lebbeck]]'' *''[[Albizia procera]]'' *''[[Albizia retusa]]'' *''[[Albizia sp. Sir Charles Hardy Is (B.Hyland 25849RFK)]]'' *''[[Albizia sp. Windsor Tableland (B.Gray 2181)]]'' *''[[Archidendron grandiflorum]]'' *''[[Archidendron hendersonii]]'' *''[[Archidendron hirsutum]]'' *''[[Archidendron kanisii]]'' *''[[Archidendron lucyi]]'' *''[[Archidendron ramiflorum ]]'' *''[[Archidendron vaillantii]]'' *''[[Archidendron whitei]]'' *''[[Archidendropsis thozetiana]]'' *''[[Archidendropsis xanthoxylon]]'' *''[[Austrocallerya australis]]'' *''[[Austrocallerya pilipes]]'' *''[[Austrosteenisia blackii]]'' *''[[Austrosteenisia mollitricha]]'' *''[[Austrosteenisia stipularis]]'' *''[[Bauhinia binata]]'' *''[[Bauhinia cunninghamii]]'' *''[[Bauhinia hookeri]]'' *''[[Bauhinia malabarica]]'' *''[[Bauhinia monandra]]'' *''[[Biancaea decapetala]]'' *''[[Bossiaea arenicola]]'' *''[[Caesalpinia crista]]'' *''[[Caesalpinia major]]'' *''[[Caesalpinia robusta]]'' *''[[Cajanus acutifolius]]'' *''[[Cajanus reticulatus]]'' *''[[Calopogonium mucunoides]]'' *''[[Canavalia cathartica]]'' *''[[Canavalia papuana]]'' *''[[Canavalia rosea]]'' *''[[Cassia brewsteri]]'' *''[[Cassia queenslandica]]'' *''[[Cassia sp. Kalpowar (D.G.Fell DF2769)]]'' *''[[Cassia sp. Paluma Range (G.Sankowsky 450)]]'' *''[[Castanospermum australe]]'' *''[[Cathormion umbellatum]]'' *''[[Centrosema molle]]'' *''[[Clitoria ternatea]]'' *''[[Crotalaria laburnifolia]]'' *''[[Crotalaria lanceolata]]'' *''[[Crotalaria pallida]]'' *''[[Crotalaria verrucosa]]'' *''[[Crudia abbreviata]]'' *''[[Cynometra iripa]]'' *''[[Cynometra ramiflora]]'' *''[[Cynometra roseiflora]]'' *''[[Dalbergia candenatensis]]'' *''[[Dalbergia densa]]'' *''[[Dalbergia ferruginea]]'' *''[[Delonix regia]]'' *''[[Dendrolobium arbuscula]]'' *''[[Dendrolobium umbellatum]]'' *''[[Derris sp. Claudie River (L.J.Webb 8348)]]'' *''[[Derris sp. Daintree (D.E.Boyland 469)]]'' *''[[Derris sp. Wenlock River (B.Hyland 21082V) ]]'' *''[[Derris trifoliata]]'' *''[[Desmodium gangeticum]]'' *''[[Desmodium gunnii]]'' *''[[Desmodium heterocarpon]]'' *''[[Desmodium intortum]]'' *''[[Desmodium macrocarpum]]'' *''[[Desmodium nemorosum]]'' *''[[Desmodium tenax]]'' *''[[Desmodium tortuosum]]'' *''[[Desmodium trichostachyum ]]'' *''[[Dioclea hexandra]]'' *''[[Entada phaseoloides]]'' *''[[Entada rheedei]]'' *''[[Erythrina insularis ]]'' *''[[Erythrina variegata ]]'' *''[[Erythrina vespertilio]]'' *''[[Erythrophleum chlorostachys]]'' *''[[Falcataria toona]]'' *''[[Galactia sp. Laura (J.C.Tothill JT53A)]]'' *''[[Galactia tenuiflora]]'' *''[[Glycine cyrtoloba]]'' *''[[Guilandina bonduc]]'' *''[[Ibatiria furfuracea]]'' *''[[Hanslia ormocarpoides]]'' *''[[Hardenbergia violacea]]'' *''[[Hovea longipes]]'' *''[[Hovea nitida]]'' *''[[Indigofera colutea]]'' *''[[Indigofera linnaei]]'' *''[[Indigofera suffruticosa]]'' *''[[Intsia bijuga]]'' *''[[Kennedia rubicunda]]'' *''[[Labichea nitida]]'' *''[[Leucaena leucocephala]]'' *''[[Macroptilium atropurpureum]]'' *''[[Macrotyloma axillare]]'' *''[[Macrotyloma uniflorum]]'' *''[[Maniltoa lenticellata]]'' *''[[Mezoneuron erythrocarpum]]'' *''[[Mezoneuron hymenocarpum]]'' *''[[Mezoneuron nitens]]'' *''[[Mezoneuron scortechinii]]'' *''[[Mimosa pudica]]'' *''[[Mucuna gigantea]]'' *''[[Neonotonia wightii]]'' *''[[Ormosia ormondii]]'' *''[[Pachyrhizus erosus]]'' *''[[Pararchidendron pruinosum]]'' *''[[Parkinsonia aculeata]]'' *''[[Peltophorum pterocarpum]]'' *''[[Phylacium bracteosum]]'' *''[[Pongamia pinnata]]'' *''[[Pueraria lobata]]'' *''[[Pueraria phaseoloides]]'' *''[[Rhynchosia acuminatissima]]'' *''[[Rhynchosia minima]]'' *''[[Samanea saman]]'' *''[[Senegalia albizioides]]'' *''[[Senegalia pennata]]'' *''[[Senna clavigera]]'' *''[[Senna coronilloides]]'' *''[[Senna gaudichaudii]]'' *''[[Senna hirsuta]]'' *''[[Senna obtusifolia]]'' *''[[Senna occidentalis]]'' *''[[Senna pendula]]'' *''[[Senna septemtrionalis]]'' *''[[Senna siamea]]'' *''[[Senna sophera]]'' *''[[Senna surattensis]]'' *''[[Senna timoriensis]]'' *''[[Senna tora]]'' *''[[Sesbania cannabina]]'' *''[[Sesbania formosa]]'' *''[[Solori involuta]]'' *''[[Solori koolgibberah]]'' *''[[Sophora tomentosa]]'' *''[[Storckiella australiensis]]'' *''[[Strongylodon lucidus]]'' *''[[Stylosanthes scabra]]'' *''[[Tamarindus indica]]'' *''[[Tephrosia brachyodon]]'' *''[[Tephrosia dietrichiae]]'' *''[[Tephrosia oblongata]]'' *''[[Tephrosia purpurea]]'' *''[[Tephrosia rosea]]'' *''[[Vandasina retusa]]'' *''[[Vigna marina]]'' *''[[Vigna sp. Station Creek (R.J.Lawn CQ3284)]]'' {{div col end}} ==Flagellariaceae== *''[[Flagellaria indica]]'' ==Gentianaceae== *''[[Canscora diffusa]]'' *''[[Fagraea berteroana]]'' *''[[Fagraea cambagei]]'' *''[[Fagraea fagraeacea]]'' *''[[Fagraea racemosa]]'' ==Gesneriaceae== *''[[Boea hygroscopica]]'' *''[[Boea kinnearii]]'' *''[[Cyrtandra baileyi]]'' *''[[Lenbrassia australiana]]'' ==Goodeniaceae== *''[[Scaevola enantophylla]]'' *''[[Scaevola taccada]]'' ==Gyrostemonaceae== *''[[Codonocarpus attenuatus]]'' ==Haloragaceae== *''[[Gonocarpus acanthocarpus]]'' ==Hamamelidaceae== *''[[Neostrearia fleckeri]]'' *''[[Noahdendron nicholasii]]'' *''[[Ostrearia australiana]]'' ==Hanguanaceae== *''[[Hanguana malayana]]'' ==Hemerocallidaceae== {{div col|colwidth=24em}} *''[[Dianella atraxis]]'' *''[[Dianella bambusifolia]]'' *''[[Dianella caerulea]]'' *''[[Dianella longifolia]]'' *''[[Dianella odorata]]'' *''[[Dianella pavopennacea]]'' *''[[Geitonoplesium cymosum]]'' {{div col end}} ==Hernandiaceae== *''[[Gyrocarpus americanus]]'' *''[[Hernandia albiflora]]'' *''[[Hernandia bivalvis]]'' *''[[Hernandia nymphaeifolia ]]'' ==Himantandraceae== *''[[Galbulimima baccata]]'' ==Hypericaceae== *''[[Harungana madagascariensis]]'' *''[[Hypericum gramineum]]'' ==Hypoxidaceae== *''[[Molineria capitulata]]'' ==Icacinaceae== *''[[Apodytes brachystylis]]'' *''[[Citronella moorei]]'' *''[[Citronella smythii]]'' *''[[Gomphandra australiana]]'' *''[[Irvingbaileya australis]]'' *''[[Ryticaryum longifolium]]'' ==Iridaceae== *''[[Geosiris australiensis]]'' *''[[Sisyrinchium micranthum]]'' ==Juncaceae== *''[[Juncus usitatus]]'' ==Lamiaceae== {{div col|colwidth=18em}} *''[[Anisomeles inodora]]'' *''[[Anisomeles macdonaldii]]'' *''[[Anisomeles moschata]]'' *''[[Basilicum polystachyon]]'' *''[[Callicarpa candicans]]'' *''[[Callicarpa caudata]]'' *''[[Callicarpa longifolia]]'' *''[[Callicarpa pedunculata]]'' *''[[Clerodendrum costatum]]'' *''[[Clerodendrum floribundum]]'' *''[[Clerodendrum grayi]]'' *''[[Clerodendrum inerme]]'' *''[[Clerodendrum longiflorum]]'' *''[[Clerodendrum paniculatum]]'' *''[[Clerodendrum tomentosum]]'' *''[[Clerodendrum tracyanum]]'' *''[[Coleus amicorum]]'' *''[[Coleus apreptus]]'' *''[[Coleus australis]]'' *''[[Coleus congestus]]'' *''[[Coleus diversus]]'' *''[[Coleus dumicola]]'' *''[[Coleus excelsus]]'' *''[[Coleus foetidus]]'' *''[[Coleus gratus]]'' *''[[Coleus graveolens]]'' *''[[Coleus magnificus]]'' *''[[Coleus scutellarioides]]'' *''[[Coleus thalassoscopicus]]'' *''[[Glossocarya calcicola]]'' *''[[Glossocarya hemiderma]]'' *''[[Gmelina australis]]'' *''[[Gmelina dalrympleana]]'' *''[[Gmelina fasciculiflora]]'' *''[[Gmelina leichhardtii]]'' *''[[Hyptis capitata]]'' *''[[Leonotis nepetifolia ]]'' *''[[Leucas decemdentata]]'' *''[[Mesosphaerum pectinatum]]'' *''[[Mesosphaerum suaveolens]]'' *''[[Orthosiphon aristatus]]'' *''[[Oxera splendida]]'' *''[[Petraeovitex multiflora]]'' *''[[Pityrodia salviifolia]]'' *''[[Platostoma longicorne]]'' *''[[Premna acuminata]]'' *''[[Premna dallachyana]]'' *''[[Premna hylandiana]]'' *''[[Premna limbata]]'' *''[[Premna odorata]]'' *''[[Premna serratifolia ]]'' *''[[Salvia plebeia]]'' *''[[Salvia reflexa]]'' *''[[Spartothamnella juncea]]'' *''[[Vitex acuminata]]'' *''[[Vitex glabrata]]'' *''[[Vitex helogiton]]'' *''[[Vitex lignum-vitae]]'' *''[[Vitex melicopea]]'' *''[[Vitex queenslandica]]'' *''[[Vitex rotundifolia]]'' *''[[Vitex trifolia]]'' {{div col end}} ==Lauraceae== {{div col|colwidth=18em}} *''[[Beilschmiedia bancroftii]]'' *''[[Beilschmiedia brunnea]]'' *''[[Beilschmiedia castrisinensis]]'' *''[[Beilschmiedia collina]]'' *''[[Beilschmiedia obtusifolia]]'' *''[[Beilschmiedia oligandra]]'' *''[[Beilschmiedia peninsularis]]'' *''[[Beilschmiedia recurva]]'' *''[[Beilschmiedia tooram]]'' *''[[Beilschmiedia volckii]]'' *''[[Cassytha capillaris]]'' *''[[Cassytha filiformis]]'' *''[[Cinnamomum baileyanum]]'' *''[[Cinnamomum camphora]]'' *''[[Cinnamomum laubatii]]'' *''[[Cinnamomum oliveri]]'' *''[[Cinnamomum propinquum]]'' *''[[Cryptocarya angulata]]'' *''[[Cryptocarya bamagana]]'' *''[[Cryptocarya bellendenkerana]]'' *''[[Cryptocarya bidwillii]]'' *''[[Cryptocarya brassii]]'' *''[[Cryptocarya burckiana]]'' *''[[Cryptocarya cercophylla]]'' *''[[Cryptocarya clarksoniana]]'' *''[[Cryptocarya claudiana]]'' *''[[Cryptocarya cocosoides]]'' *''[[Cryptocarya corrugata]]'' *''[[Cryptocarya cunninghamii]]'' *''[[Cryptocarya densiflora]]'' *''[[Cryptocarya endiandrifolia]]'' *''[[Cryptocarya exfoliata]]'' *''[[Cryptocarya glaucescens]]'' *''[[Cryptocarya glaucocarpa]]'' *''[[Cryptocarya grandis]]'' *''[[Cryptocarya hypospodia]]'' *''[[Cryptocarya laevigata]]'' *''[[Cryptocarya leucophylla]]'' *''[[Cryptocarya lividula]]'' *''[[Cryptocarya macdonaldii]]'' *''[[Cryptocarya mackinnoniana]]'' *''[[Cryptocarya melanocarpa]]'' *''[[Cryptocarya murrayi]]'' *''[[Cryptocarya oblata]]'' *''[[Cryptocarya onoprienkoana]]'' *''[[Cryptocarya pleurosperma]]'' *''[[Cryptocarya putida]]'' *''[[Cryptocarya rhodosperma]]'' *''[[Cryptocarya saccharata]]'' *''[[Cryptocarya smaragdina]]'' *''[[Cryptocarya triplinervis]]'' *''[[Cryptocarya vulgaris]]'' *''[[Cryptocarya whiffiniana]]'' *''[[Endiandra acuminata]]'' *''[[Endiandra anthropophagorum]]'' *''[[Endiandra bellendenkerana]]'' *''[[Endiandra bessaphila]]'' *''[[Endiandra collinsii]]'' *''[[Endiandra compressa]]'' *''[[Endiandra cooperana]]'' *''[[Endiandra cowleyana]]'' *''[[Endiandra dichrophylla]]'' *''[[Endiandra dielsiana]]'' *''[[Endiandra discolor]]'' *''[[Endiandra glauca]]'' *''[[Endiandra globosa]]'' *''[[Endiandra grayi]]'' *''[[Endiandra hypotephra]]'' *''[[Endiandra impressicosta]]'' *''[[Endiandra inopinata]]'' *''[[Endiandra insignis]]'' *''[[Endiandra jonesii]]'' *''[[Endiandra leptodendron]]'' *''[[Endiandra limnophila]]'' *''[[Endiandra longipedicellata]]'' *''[[Endiandra microneura]]'' *''[[Endiandra monothyra]]'' *''[[Endiandra montana]]'' *''[[Endiandra muelleri]]'' *''[[Endiandra palmerstonii]]'' *''[[Endiandra phaeocarpa]]'' *''[[Endiandra sankeyana]]'' *''[[Endiandra sideroxylon]]'' *''[[Endiandra wolfei]]'' *''[[Endiandra xanthocarpa ]]'' *''[[Lindera queenslandica]]'' *''[[Litsea bennettii]]'' *''[[Litsea bindoniana]]'' *''[[Litsea breviumbellata]]'' *''[[Litsea connorsii]]'' *''[[Litsea fawcettiana]]'' *''[[Litsea glutinosa]]'' *''[[Litsea granitica]]'' *''[[Litsea leefeana]]'' *''[[Litsea macrophylla]]'' *''[[Neolitsea brassii]]'' *''[[Neolitsea dealbata]]'' *''[[Persea americana]]'' {{div col end}} ==Lecythidaceae== *''[[Barringtonia acutangula]]'' *''[[Barringtonia asiatica]]'' *''[[Barringtonia calyptrata]]'' *''[[Barringtonia racemosa]]'' *''[[Planchonia careya]]'' *''[[Planchonia rupestris]]'' ==Lentibulariaceae== *''[[Utricularia uliginosa]]'' ==Linaceae== *''[[Hugonia jenkinsii]]'' ==Linderniaceae== *''[[Artanema fimbriatum]]'' *''[[Lindernia crustacea]]'' ==Loganiaceae== {{div col|colwidth=24em}} *''[[Geniostoma rupestre]]'' *''[[Mitrasacme oasena]]'' *''[[Mitrasacme paludosa]]'' *''[[Mitrasacme polymorpha]]'' *''[[Mitrasacme pygmaea]]'' *''[[Strychnos lucida]]'' *''[[Strychnos minor]]'' *''[[Strychnos psilosperma]]'' {{div col end}} ==Loranthaceae== {{div col|colwidth=18em}} *''[[Amyema bifurcata]]'' *''[[Amyema congener]]'' *''[[Amyema conspicua]]'' *''[[Amyema dolichopoda]]'' *''[[Amyema friesiana]]'' *''[[Amyema glabra]]'' *''[[Amyema plicatula]]'' *''[[Amyema quandang]]'' *''[[Amyema quaternifolia ]]'' *''[[Amyema queenslandica]]'' *''[[Amyema seemeniana]]'' *''[[Amyema villiflora]]'' *''[[Amyema whitei]]'' *''[[Amylotheca dictyophleba]]'' *''[[Cecarria obtusifolia]]'' *''[[Dactyliophora novae-guineae]]'' *''[[Decaisnina angustata]]'' *''[[Decaisnina brittenii]]'' *''[[Decaisnina congesta]]'' *''[[Decaisnina hollrungii]]'' *''[[Decaisnina signata]]'' *''[[Dendrophthoe acacioides]]'' *''[[Dendrophthoe curvata]]'' *''[[Dendrophthoe glabrescens]]'' *''[[Dendrophthoe vitellina]]'' *''[[Diplatia furcata]]'' *''[[Diplatia tomentosa]]'' *''[[Lysiana maritima]]'' *''[[Lysiana spathulata]]'' *''[[Lysiana subfalcata]]'' {{div col end}} ==Lythraceae== *''[[Lagerstroemia archeriana]]'' *''[[Pemphis acidula]]'' ==Malpighiaceae== *''[[Hiptage benghalensis ]]'' *''[[Stigmaphyllon australiense]]'' *''[[Stigmaphyllon timoriense]]'' *''[[Tristellateia australasiae]]'' ==Malvaceae== {{div col|colwidth=18em}} *''[[Abelmoschus moschatus]]'' *''[[Abroma molle]]'' *''[[Abutilon auritum]]'' *''[[Abutilon hannii]]'' *''[[Abutilon indicum]]'' *''[[Abutilon micropetalum]]'' *''[[Abutilon oxycarpum]]'' *''[[Abutilon sp. Mataranka (R.M.Barker 877)]]'' *''[[Adansonia gregorii]]'' *''[[Argyrodendron actinophyllum]]'' *''[[Argyrodendron peralatum]]'' *''[[Argyrodendron polyandrum]]'' *''[[Argyrodendron sp. Boonjee (B.Hyland 2139RFK)]]'' *''[[Argyrodendron sp. Mt Haig ( L.S.Smith 14307)]]'' *''[[Argyrodendron sp. Penta Tulip Oak (B.Hyland 2565RFK)]]'' *''[[Argyrodendron sp. Whitsundays (W.J.McDonald+ 5831)]]'' *''[[Argyrodendron sp. Whyanbeel (B.Hyland 1106RFK)]]'' *''[[Argyrodendron trifoliolatum]]'' *''[[Azanza thespesioides]]'' *''[[Berrya javanica]]'' *''[[Bombax ceiba]]'' *''[[Brachychiton acerifolius]]'' *''[[Brachychiton albidus]]'' *''[[Brachychiton australis]]'' *''[[Brachychiton bidwillii]]'' *''[[Brachychiton chillagoensis]]'' *''[[Brachychiton compactus]]'' *''[[Brachychiton discolor]]'' *''[[Brachychiton diversifolius]]'' *''[[Brachychiton garrawayae]]'' *''[[Brachychiton grandiflorus]]'' *''[[Brachychiton paradoxus]]'' *''[[Brachychiton rupestris]]'' *''[[Brachychiton tridentatus]]'' *''[[Brachychiton velutinosus]]'' *''[[Brachychiton viridiflorus]]'' *''[[Brachychiton xanthophyllus]]'' *''[[Commersonia bartramia]]'' *''[[Commersonia macrostipulata ]]'' *''[[Corchorus aestuans]]'' *''[[Firmiana papuana]]'' *''[[Franciscodendron laurifolium]]'' *''[[Grewia australis]]'' *''[[Grewia breviflora]]'' *''[[Grewia glabra]]'' *''[[Grewia mesomischa]]'' *''[[Grewia oxyphylla]]'' *''[[Grewia papuana]]'' *''[[Grewia retusifolia]]'' *''[[Grewia scabrella]]'' *''[[Helicteres hirsuta]]'' *''[[Helicteres isora]]'' *''[[Helicteres semiglabra ]]'' *''[[Herissantia crispa]]'' *''[[Heritiera littoralis]]'' *''[[Hibiscus diversifolius]]'' *''[[Hibiscus geranioides]]'' *''[[Hibiscus heterophyllus]]'' *''[[Hibiscus krichauffianus]]'' *''[[Hibiscus macilwraithensis]]'' *''[[Hibiscus meraukensis]]'' *''[[Hibiscus normanii]]'' *''[[Hibiscus peralbus]]'' *''[[Hibiscus propulsator]]'' *''[[Hibiscus sankowskyorum]]'' *''[[Hibiscus tiliaceus]]'' *''[[Hibiscus tozerensis]]'' *''[[Hibiscus vitifolius]]'' *''[[Indagator fordii]]'' *''[[Kleinhovia hospita]]'' *''[[Lagunaria queenslandica]]'' *''[[Malvastrum americanum]]'' *''[[Malvastrum chillagoense]]'' *''[[Melhania brachycarpa]]'' *''[[Melhania oblongifolia]]'' *''[[Melochia umbellata]]'' *''[[Pavonia calycina]]'' *''[[Schoutenia ovata]]'' *''[[Sida acuta]]'' *''[[Sida atherophora]]'' *''[[Sida cordifolia]]'' *''[[Sida hackettiana]]'' *''[[Sida rhombifolia]]'' *''[[Sida rohlenae]]'' *''[[Sida sp. Small Flower (B.Gray 5657)]]'' *''[[Sida spinosa]]'' *''[[Sterculia holtzei ]]'' *''[[Sterculia quadrifida]]'' *''[[Sterculia shillinglawii]]'' *''[[Thespesia populnea]]'' *''[[Thespesia populneoides]]'' *''[[Trichospermum pleiostigma]]'' *''[[Triumfetta bradshawii]]'' *''[[Triumfetta micracantha]]'' *''[[Triumfetta pilosa]]'' *''[[Triumfetta rhomboidea]]'' *''[[Urena lobata]]'' *''[[Waltheria indica]]'' {{div col end}} ==Martyniaceae== *''[[Martynia annua]]'' ==Melastomataceae== {{div col|colwidth=24em}} *''[[Dissotis rotundifolia]]'' *''[[Medinilla balls-headleyi]]'' *''[[Melastoma cyanoides]]'' *''[[Melastoma malabathricum]]'' *''[[Memecylon hylandii]]'' *''[[Memecylon pauciflorum]]'' *''[[Miconia calvescens]]'' *''[[Miconia nervosa]]'' *''[[Osbeckia australiana ]]'' *''[[Pternandra coerulescens]]'' *''[[Tristemma mauritianum]]'' {{div col end}} ==Meliaceae== {{div col|colwidth=18em}} *''[[Aglaia argentea]]'' *''[[Aglaia australiensis]]'' *''[[Aglaia brassii]]'' *''[[Aglaia brownii]]'' *''[[Aglaia cooperae]]'' *''[[Aglaia elaeagnoidea]]'' *''[[Aglaia euryanthera]]'' *''[[Aglaia ferruginea]]'' *''[[Aglaia meridionalis]]'' *''[[Aglaia sapindina]]'' *''[[Aglaia silvestris]]'' *''[[Aglaia spectabilis]]'' *''[[Anthocarapa nitidula]]'' *''[[Chisocheton longistipitatus]]'' *''[[Chukrasia tabularis]]'' *''[[Dysoxylum acutangulum]]'' *''[[Dysoxylum alliaceum]]'' *''[[Dysoxylum arborescens]]'' *''[[Dysoxylum gaudichaudianum]]'' *''[[Prasoxylon klanderi]]'' *''[[Dysoxylum latifolium]]'' *''[[Dysoxylum mollissimum]]'' *''[[Dysoxylum oppositifolium]]'' *''[[Didymocheton papuanus]]'' *''[[Dysoxylum parasiticum]]'' *''[[Dysoxylum pettigrewianum]]'' *''[[Dysoxylum pumilum]]'' *''[[Dysoxylum rufum]]'' *''[[Dysoxylum setosum]]'' *''[[Melia azedarach]]'' *''[[Owenia venosa]]'' *''[[Synoum glandulosum]]'' *''[[Toona ciliata]]'' *''[[Turraea pubescens]]'' *''[[Vavaea amicorum]]'' {{div col end}} ==Menispermaceae== {{div col|colwidth=18em}} *''[[Carronia pedicellata]]'' *''[[Carronia protensa]]'' *''[[Cissampelos pareira]]'' *''[[Hypserpa decumbens]]'' *''[[Hypserpa laurina]]'' *''[[Hypserpa polyandra]]'' *''[[Hypserpa smilacifolia]]'' *''[[Legnephora moorei]]'' *''[[Pachygone ovata]]'' *''[[Parapachygone longifolia]]'' *''[[Pleogyne australis]]'' *''[[Pycnarrhena novoguineensis]]'' *''[[Pycnarrhena ozantha]]'' *''[[Sarcopetalum harveyanum]]'' *''[[Stephania bancroftii]]'' *''[[Stephania japonica]]'' *''[[Stephania tuberosa]]'' *''[[Tiliacora australiana]]'' *''[[Tinospora esiangkara]]'' *''[[Tinospora smilacina]]'' {{div col end}} ==Monimiaceae== {{div col|colwidth=18em}} *''[[Austromatthaea elegans]]'' *''[[Hedycarya loxocarya]]'' *''[[Hemmantia webbii]]'' *''[[Levieria acuminata]]'' *''[[Palmeria coriacea]]'' *''[[Palmeria hypotephra]]'' *''[[Palmeria scandens]]'' *''[[Pendressia wardellii]]'' *''[[Steganthera australiana]]'' *''[[Steganthera cooperorum]]'' *''[[Steganthera laxiflora]]'' *''[[Steganthera macooraia]]'' *''[[Wilkiea angustifolia]]'' *''[[Wilkiea cordata]]'' *''[[Wilkiea hylandii]]'' *''[[Wilkiea kaarruana]]'' *''[[Wilkiea longipes]]'' *''[[Wilkiea macrophylla]]'' *''[[Wilkiea pubescens]]'' *''[[Wilkiea rigidifolia]]'' *''[[Wilkiea smithii]]'' *''[[Wilkiea sp. McDowall Range (J.G.Tracey 14552)]]'' {{div col end}} ==Moraceae== {{div col|colwidth=18em}} *''[[Antiaris toxicaria]]'' *''[[Artocarpus glaucus]]'' *''[[Artocarpus heterophyllus]]'' *''[[Castilla elastica]]'' *''[[Fatoua villosa]]'' *''[[Ficus aculeata]]'' *''[[Ficus adenosperma]]'' *''[[Ficus albipila]]'' *''[[Ficus atricha]]'' *''[[Ficus benjamina]]'' *''[[Ficus brachypoda]]'' *''[[Ficus congesta]]'' *''[[Ficus copiosa]]'' *''[[Ficus coronata]]'' *''[[Ficus coronulata]]'' *''[[Ficus crassipes]]'' *''[[Ficus destruens]]'' *''[[Ficus drupacea]]'' *''[[Ficus fraseri]]'' *''[[Ficus henneana]]'' *''[[Ficus hispida]]'' *''[[Ficus leptoclada]]'' *''[[Ficus melinocarpa]]'' *''[[Ficus microcarpa]]'' *''[[Ficus mollior]]'' *''[[Ficus nodosa]]'' *''[[Ficus obliqua]]'' *''[[Ficus opposita]]'' *''[[Ficus pantoniana]]'' *''[[Ficus platypoda]]'' *''[[Ficus pleurocarpa]]'' *''[[Ficus podocarpifolia]]'' *''[[Ficus racemosa]]'' *''[[Ficus rubiginosa]]'' *''[[Ficus scobina]]'' *''[[Ficus septica]]'' *''[[Ficus subnervosa]]'' *''[[Ficus subpuberula]]'' *''[[Ficus tinctoria]]'' *''[[Ficus triradiata]]'' *''[[Ficus variegata]]'' *''[[Ficus virens]]'' *''[[Ficus virgata]]'' *''[[Ficus watkinsiana]]'' *''[[Maclura cochinchinensis]]'' *''[[Streblus brunonianus]]'' *''[[Streblus glaber]]'' *''[[Trophis scandens]]'' {{div col end}} ==Moringaceae== *''[[Moringa oleifera]]'' ==Musaceae== *''[[Musa banksii]]'' *''[[Musa jackeyi]]'' ==Myodocarpaceae== *''[[Delarbrea michieana]]'' ==Myristicaceae== *''[[Horsfieldia australiana]]'' *''[[Myristica globosa]]'' *''[[Myristica insipida]]'' *''[[Myristica lancifolia]]'' ==Myrtaceae== {{div col|colwidth=18em}} *''[[Allosyncarpia ternata]]'' *''[[Archirhodomyrtus beckleri]]'' *''[[Asteromyrtus angustifolia]]'' *''[[Asteromyrtus brassii]]'' *''[[Backhousia angustifolia]]'' *''[[Backhousia bancroftii]]'' *''[[Backhousia citriodora]]'' *''[[Backhousia enata]]'' *''[[Backhousia gundarara]]'' *''[[Backhousia hughesii]]'' *''[[Backhousia kingii]]'' *''[[Backhousia tetraptera]]'' *''[[Barongia lophandra]]'' *''[[Corymbia intermedia]]'' *''[[Corymbia tessellaris]]'' *''[[Corymbia torelliana]]'' *''[[Decaspermum humile]]'' *''[[Eucalyptus crebra]]'' *''[[Eucalyptus grandis]]'' *''[[Eucalyptus houseana]]'' *''[[Eucalyptus pellita]]'' *''[[Eucalyptus resinifera]]'' *''[[Eucalyptus tereticornis]]'' *''[[Eugenia reinwardtiana]]'' *''[[Gossia bamagensis]]'' *''[[Gossia bidwillii]]'' *''[[Gossia dallachiana]]'' *''[[Gossia floribunda]]'' *''[[Gossia grayi]]'' *''[[Gossia hillii]]'' *''[[Gossia lewisensis]]'' *''[[Gossia lucida]]'' *''[[Gossia macilwraithensis]]'' *''[[Gossia myrsinocarpa]]'' *''[[Gossia pubiflora]]'' *''[[Gossia retusa]]'' *''[[Gossia sankowskyorum]]'' *''[[Gossia shepherdii]]'' *''[[Gossia sp. Green Bark (B.Hyland 25370RFK)]]'' *''[[Lenwebbia lasioclada]]'' *''[[Leptospermum wooroonooran ]]'' *''[[Lindsayomyrtus racemoides]]'' *''[[Lithomyrtus obtusa]]'' *''[[Lophostemon confertus]]'' *''[[Lophostemon grandiflorus]]'' *''[[Lophostemon lactifluus]]'' *''[[Lophostemon suaveolens]]'' *''[[Melaleuca argentea]]'' *''[[Melaleuca bracteata]]'' *''[[Melaleuca dealbata]]'' *''[[Melaleuca leucadendra]]'' *''[[Melaleuca recurva]]'' *''[[Melaleuca viminalis]]'' *''[[Melaleuca viridiflora]]'' *''[[Mitrantia bilocularis]]'' *''[[Neofabricia myrtifolia]]'' *''[[Pilidiostigma papuanum]]'' *''[[Pilidiostigma tetramerum]]'' *''[[Pilidiostigma tropicum]]'' *''[[Rhodamnia acuminata]]'' *''[[Rhodamnia arenaria]]'' *''[[Rhodamnia australis]]'' *''[[Rhodamnia blairiana]]'' *''[[Rhodamnia costata]]'' *''[[Rhodamnia fordii]]'' *''[[Rhodamnia glabrescens ]]'' *''[[Rhodamnia hylandii]]'' *''[[Rhodamnia longisepala]]'' *''[[Rhodamnia pauciovulata]]'' *''[[Rhodamnia sessiliflora]]'' *''[[Rhodamnia sharpeana]]'' *''[[Rhodamnia spongiosa]]'' *''[[Rhodomyrtus canescens]]'' *''[[Rhodomyrtus effusa]]'' *''[[Rhodomyrtus macrocarpa]]'' *''[[Rhodomyrtus pervagata]]'' *''[[Rhodomyrtus sericea]]'' *''[[Rhodomyrtus trineura]]'' *''[[Ristantia gouldii]]'' *''[[Ristantia pachysperma]]'' *''[[Ristantia waterhousei]]'' *''[[Sphaerantia chartacea]]'' *''[[Sphaerantia discolor]]'' *''[[Stockwellia quadrifida]]'' *''[[Syncarpia glomulifera]]'' *''[[Syzygium alatoramulum]]'' *''[[Syzygium alliiligneum]]'' *''[[Syzygium angophoroides]]'' *''[[Syzygium apodophyllum]]'' *''[[Syzygium aqueum]]'' *''[[Syzygium argyropedicum]]'' *''[[Syzygium armstrongii]]'' *''[[Syzygium australe]]'' *''[[Syzygium bamagense]]'' *''[[Syzygium banksii]]'' *''[[Syzygium boonjee]]'' *''[[Syzygium branderhorstii]]'' *''[[Syzygium buettnerianum]]'' *''[[Syzygium bungadinnia]]'' *''[[Syzygium canicortex]]'' *''[[Syzygium claviflorum]]'' *''[[Syzygium cormiflorum]]'' *''[[Syzygium corynanthum]]'' *''[[Syzygium cryptophlebium]]'' *''[[Syzygium dansiei]]'' *''[[Syzygium divaricatum]]'' *''[[Syzygium endophloium]]'' *''[[Syzygium erythrocalyx]]'' *''[[Syzygium erythrodoxum]]'' *''[[Syzygium fibrosum]]'' *''[[Syzygium floribundum]]'' *''[[Syzygium forte]]'' *''[[Syzygium fratris]]'' *''[[Syzygium glenum]]'' *''[[Syzygium graveolens]]'' *''[[Syzygium gustavioides]]'' *''[[Syzygium hedraiophyllum]]'' *''[[Syzygium hemilamprum]]'' *''[[Syzygium johnsonii]]'' *''[[Syzygium kuranda]]'' *''[[Syzygium luehmannii]]'' *''[[Syzygium macilwraithianum]]'' *''[[Syzygium mackinnonianum]]'' *''[[Syzygium malaccense]]'' *''[[Syzygium maraca]]'' *''[[Syzygium minutuliflorum]]'' *''[[Syzygium monimioides]]'' *''[[Syzygium monospermum]]'' *''[[Syzygium mulgraveanum]]'' *''[[Syzygium nervosum]]'' *''[[Syzygium oleosum]]'' *''[[Syzygium papyraceum]]'' *''[[Syzygium pringlei]]'' *''[[Syzygium pseudofastigiatum]]'' *''[[Syzygium puberulum]]'' *''[[Syzygium resa]]'' *''[[Syzygium sayeri]]'' *''[[Syzygium sharoniae]]'' *''[[Syzygium smithii]]'' *''[[Syzygium suborbiculare]]'' *''[[Syzygium tierneyanum]]'' *''[[Syzygium trachyphloium]]'' *''[[Syzygium unipunctatum]]'' *''[[Syzygium velarum]]'' *''[[Syzygium wesa]]'' *''[[Syzygium wilsonii]]'' *''[[Syzygium xerampelinum]]'' *''[[Thaleropia queenslandica]]'' *''[[Thryptomene oligandra]]'' *''[[Tristaniopsis exiliflora]]'' *''[[Uromyrtus metrosideros]]'' *''[[Uromyrtus tenella]]'' *''[[Welchiodendron longivalve]]'' *''[[Xanthostemon arenarius]]'' *''[[Xanthostemon chrysanthus]]'' *''[[Xanthostemon crenulatus]]'' *''[[Xanthostemon eucalyptoides]]'' *''[[Xanthostemon formosus]]'' *''[[Xanthostemon graniticus]]'' *''[[Xanthostemon paradoxus]]'' *''[[Xanthostemon umbrosus]]'' *''[[Xanthostemon verticillatus]]'' *''[[Xanthostemon whitei]]'' *''[[Xanthostemon xerophilus]]'' *''[[Xanthostemon youngii]]'' {{div col end}} ==Nepenthaceae== *''[[Nepenthes mirabilis]]'' ==Nyctaginaceae== *''[[Boerhavia dominii]]'' *''[[Commicarpus chinensis]]'' *''[[Mirabilis jalapa]]'' *''[[Pisonia aculeata]]'' *''[[Pisonia grandis]]'' *''[[Pisonia umbellifera]]'' ==Ochnaceaee== *''[[Brackenridgea australiana]]'' *''[[Ochna serrulata]]'' ==Olacaceae== *''[[Anacolosa papuana]]'' *''[[Olax imbricata]]'' *''[[Olax pendula]]'' *''[[Ximenia americana]]'' ==Oleaceae== {{div col|colwidth=18em}} *''[[Chionanthus acuminiger]]'' *''[[Chionanthus axillaris]]'' *''[[Chionanthus ramiflorus]]'' *''[[Chionanthus sleumeri]]'' *''[[Chionanthus sp. Little Pine L.A. (B.Hyland 2520RFK)]]'' *''[[Jasminum dallachii]]'' *''[[Jasminum didymum]]'' *''[[Jasminum elongatum]]'' *''[[Jasminum kajewskii]]'' *''[[Jasminum longipetalum]]'' *''[[Jasminum molle]]'' *''[[Jasminum simplicifolium]]'' *''[[Ligustrum australianum]]'' *''[[Ligustrum lucidum]]'' *''[[Ligustrum sinense]]'' *''[[Notelaea microcarpa]]'' *''[[Notelaea sp. Elcho Island (C.R.Dunlop 7597)]]'' *''[[Olea paniculata]]'' {{div col end}} ==Onagraceae== *''[[Ludwigia hyssopifolia]]'' *''[[Ludwigia octovalvis]]'' ==Opiliaceae== *''[[Cansjera leptostachya]]'' *''[[Opilia amentacea]]'' ==Orchidaceae== {{div col|colwidth=18em}} *''[[Aphyllorchis anomala]]'' *''[[Aphyllorchis queenslandica]]'' *''[[Calanthe triplicata]]'' *''[[Corymborkis veratrifolia]]'' *''[[Dipodium pictum]]'' *''[[Epipogium roseum]]'' *''[[Eulophia zollingeri]]'' *''[[Phaius australis]]'' *''[[Pseudovanilla foliata]]'' {{div col end}} ==Oxalidaceae== *''[[Biophytum petersianum]]'' *''[[Oxalis chnoodes]]'' *''[[Oxalis corniculata]]'' ==Pandanaceae== {{div col|colwidth=18em}} *''[[Benstonea lauterbachii]]'' *''[[Benstonea monticola]]'' *''[[Freycinetia excelsa]]'' *''[[Freycinetia marginata]]'' *''[[Freycinetia percostata]]'' *''[[Freycinetia scandens]]'' *''[[Freycinetia sp. Claudie River (RT 286)]]'' *''[[Pandanus conicus]]'' *''[[Pandanus cookii]]'' *''[[Pandanus dammannii]]'' *''[[Pandanus gemmifer]]'' *''[[Pandanus oblatus]]'' *''[[Pandanus solmslaubachii]]'' *''[[Pandanus grayorum]]'' (as ''Pandanus'' sp. Russell River) *''[[Pandanus tectorius]]'' *''[[Pandanus zea]]'' {{div col end}} ==Paracryphiaceae== *''[[Quintinia fawkneri]]'' *''[[Quintinia quatrefagesii]]'' *''[[Sphenostemon lobosporus]]'' ==Passifloraceae== {{div col|colwidth=18em}} *''[[Adenia heterophylla]]'' *''[[Passiflora aurantia]]'' *''[[Passiflora aurantioides]]'' *''[[Passiflora edulis]]'' *''[[Passiflora foetida]]'' *''[[Passiflora herbertiana]]'' *''[[Passiflora kuranda]]'' *''[[Passiflora suberosa]]'' *''[[Passiflora subpeltata]]'' {{div col end}} ==Pedaliaceae== *''[[Josephinia eugeniae]]'' *''[[Josephinia imperatricis]]'' ==Pennantiaceae== *''[[Pennantia cunninghamii]]'' ==Pentaphylacaceae== *''[[Ternstroemia cherryi]]'' ==Philydraceae== *''[[Helmholtzia acorifolia]]'' *''[[Philydrum lanuginosum]]'' ==Phyllanthaceae== {{div col|colwidth=18em}} *''[[Actephila bella]]'' *''[[Actephila championiae]]'' *''[[Actephila foetida]]'' *''[[Actephila forsteri]]'' *''[[Actephila latifolia]]'' *''[[Actephila lindleyi]]'' *''[[Actephila petiolaris]]'' *''[[Actephila plicata]]'' *''[[Actephila sessilifolia]]'' *''[[Actephila traceyi]]'' *''[[Actephila venusta]]'' *''[[Actephila vernicosa]]'' *''[[Antidesma bunius]]'' *''[[Antidesma erostre]]'' *''[[Antidesma ghaesembilla]]'' *''[[Antidesma hylandii]]'' *''[[Antidesma parvifolium]]'' *''[[Bischofia javanica]]'' *''[[Breynia cernua]]'' *''[[Breynia macrantha]]'' *''[[Breynia oblongifolia]]'' *''[[Breynia sp. Black Mountain (B.Hyland 25658RFK)]]'' *''[[Breynia stipitata]]'' *''[[Bridelia insulana]]'' *''[[Bridelia leichhardtii]]'' *''[[Bridelia tomentosa]]'' *''[[Cleistanthus apodus]]'' *''[[Cleistanthus cunninghamii]]'' *''[[Cleistanthus dallachyanus]]'' *''[[Cleistanthus discolor]]'' *''[[Cleistanthus hylandii]]'' *''[[Cleistanthus myrianthus]]'' *''[[Cleistanthus peninsularis]]'' *''[[Cleistanthus semiopacus]]'' *''[[Cleistanthus xerophilus]]'' *''[[Flueggea leucopyrus]]'' *''[[Flueggea virosa]]'' *''[[Glochidion apodogynum]]'' *''[[Glochidion benthamianum]]'' *''[[Glochidion disparipes]]'' *''[[Glochidion ferdinandi]]'' *''[[Glochidion harveyanum]]'' *''[[Glochidion hylandii]]'' *''[[Glochidion lobocarpum]]'' *''[[Glochidion philippicum]]'' *''[[Glochidion pungens]]'' *''[[Glochidion sessiliflorum]]'' *''[[Glochidion sumatranum]]'' *''[[Glochidion xerocarpum]]'' *''[[Margaritaria dubium-traceyi]]'' *''[[Margaritaria indica]]'' *''[[Phyllanthus brassii]]'' *''[[Phyllanthus clamboides]]'' *''[[Phyllanthus cuscutiflorus]]'' *''[[Phyllanthus gunnii]]'' *''[[Phyllanthus hypospodius]]'' *''[[Phyllanthus lamprophyllus]]'' *''[[Phyllanthus microcladus]]'' *''[[Phyllanthus novae-hollandiae]]'' *''[[Phyllanthus praelongipes]]'' *''[[Phyllanthus subcrenulatus]]'' *''[[Phyllanthus tenellus]]'' *''[[Poranthera microphylla]]'' *''[[Synostemon albiflorus]]'' *''[[Synostemon sphenophyllus]]'' {{div col end}} ==Phytolaccaceae== *''[[Monococcus echinophorus]]'' *''[[Phytolacca octandra]]'' *''[[Rivina humilis]]'' ==Picrodendraceae== {{div col|colwidth=18em}} *''[[Austrobuxus megacarpus]]'' *''[[Choriceras majus]]'' *''[[Choriceras tricorne]]'' *''[[Dissiliaria baloghioides]]'' *''[[Dissiliaria indistincta]]'' *''[[Dissiliaria laxinervis]]'' *''[[Dissiliaria surculosa]]'' *''[[Dissiliaria tuckeri]]'' *''[[Neoroepera banksii]]'' *''[[Neoroepera buxifolia]]'' *''[[Petalostigma banksii]]'' *''[[Sankowskya stipularis]]'' *''[[Whyanbeelia terrae-reginae]]'' {{div col end}} ==Piperaceae== {{div col|colwidth=18em}} *''[[Peperomia bellendenkerensis]]'' *''[[Peperomia blanda]]'' *''[[Peperomia enervis]]'' *''[[Peperomia hunteriana]]'' *''[[Peperomia pellucida]]'' *''[[Peperomia tetraphylla]]'' *''[[Piper caninum]]'' *''[[Piper fungiforme]]'' *''[[Piper hederaceum]]'' *''[[Piper interruptum]]'' *''[[Piper macropiper]]'' *''[[Piper mestonii]]'' *''[[Piper umbellatum]]'' {{div col end}} ==Pittosporaceae== {{div col|colwidth=18em}} *''[[Auranticarpa edentata]]'' *''[[Auranticarpa ilicifolia]]'' *''[[Auranticarpa papyracea]]'' *''[[Auranticarpa rhombifolia]]'' *''[[Bursaria incana]]'' *''[[Bursaria spinosa]]'' *''[[Bursaria tenuifolia]]'' *''[[Hymenosporum flavum]]'' *''[[Pittosporum angustifolium]]'' *''[[Pittosporum ferrugineum]]'' *''[[Pittosporum moluccanum]]'' *''[[Pittosporum revolutum]]'' *''[[Pittosporum rubiginosum]]'' *''[[Pittosporum spinescens]]'' *''[[Pittosporum trilobum]]'' *''[[Pittosporum venulosum]]'' *''[[Pittosporum wingii]]'' {{div col end}} ==Plantaginaceae== {{div col|colwidth=24em}} *''[[Callitriche muelleri]]'' *''[[Lophospermum erubescens]]'' *''[[Mecardonia procumbens]]'' *''[[Plantago lanceolata]]'' *''[[Plantago major]]'' *''[[Scoparia dulcis]]'' *''[[Stemodia lythrifolia]]'' *''[[Veronica plebeia]]'' {{div col end}} ==Plumbaginaceae== *''[[Plumbago zeylanica]]'' ==Poaceae== {{div col|colwidth=18em}} *''[[Ancistrachne uncinulata]]'' *''[[Aristida exserta]]'' *''[[Aristida queenslandica]]'' *''[[Aristida superpendens]]'' *''[[Arthragrostis deschampsioides]]'' *''[[Arundinella nepalensis]]'' *''[[Axonopus compressus]]'' *''[[Axonopus fissifolius]]'' *''[[Bothriochloa pertusa]]'' *''[[Cenchrus brevisetosus]]'' *''[[Cenchrus echinatus]]'' *''[[Centotheca lappacea]]'' *''[[Centotheca philippinensis]]'' *''[[Cymbopogon ambiguus]]'' *''[[Cymbopogon procerus]]'' *''[[Cymbopogon refractus]]'' *''[[Cynodon dactylon]]'' *''[[Cyrtococcum accrescens]]'' *''[[Cyrtococcum oxyphyllum]]'' *''[[Cyrtococcum patens]]'' *''[[Dactyloctenium aegyptium]]'' *''[[Eragrostis cumingii]]'' *''[[Eriachne pallescens]]'' *''[[Garnotia stricta]]'' *''[[Heteropogon contortus]]'' *''[[Isachne confusa]]'' *''[[Isachne sharpii]]'' *''[[Leptaspis banksii]]'' *''[[Lophatherum gracile]]'' *''[[Mullerochloa moreheadiana]]'' *''[[Neololeba atra]]'' *''[[Oplismenus burmanni]]'' *''[[Oplismenus compositus]]'' *''[[Oplismenus hirtellus]]'' *''[[Oplismenus mollis]]'' *''[[Ottochloa nodosa]]'' *''[[Panicum chillagoanum]]'' *''[[Panicum incomtum]]'' *''[[Panicum mindanaense]]'' *''[[Panicum trichoides]]'' *''[[Paspalum conjugatum]]'' *''[[Paspalum dilatatum]]'' *''[[Paspalum paniculatum]]'' *''[[Paspalum scrobiculatum]]'' *''[[Perotis rara]]'' *''[[Phragmites karka]]'' *''[[Pogonatherum crinitum]]'' *''[[Scrotochloa tararaensis]]'' *''[[Scrotochloa urceolata]]'' *''[[Setaria apiculata]]'' *''[[Setaria oplismenoides]]'' *''[[Setaria palmifolia]]'' *''[[Triodia procera]]'' *''[[Urochloa pubigera]]'' *''[[Urochloa reptans]]'' *''[[Urochloa subquadripara]]'' {{div col end}} ==Podocarpaceae== {{div col|colwidth=24em}} *''[[Podocarpus dispermus]]'' *''[[Podocarpus elatus]]'' *''[[Podocarpus grayae]]'' *''[[Podocarpus smithii]]'' *''[[Prumnopitys amara]]'' *''[[Prumnopitys ladei]]'' {{div col end}} ==Polygalaceae== *''[[Polygala paniculata]]'' *''[[Xanthophyllum fragrans]]'' *''[[Xanthophyllum octandrum]]'' ==Polygonaceae== *''[[Muehlenbeckia zippelii]]'' *''[[Persicaria hydropiper]]'' *''[[Persicaria orientalis]]'' *''[[Triplaris americana]]'' ==Portulacaceae== *''[[Portulaca pilosa]]'' ==Primulaceae== {{div col|colwidth=18em}} *''[[Ardisia brevipedata]]'' *''[[Ardisia crenata]]'' *''[[Ardisia elliptica]]'' *''[[Ardisia fasciculata]]'' *''[[Ardisia hylandii]]'' *''[[Ardisia pachyrrhachis]]'' *''[[Embelia australiana]]'' *''[[Embelia caulialata]]'' *''[[Embelia curvinervia]]'' *''[[Embelia grayi]]'' *''[[Maesa dependens]]'' *''[[Maesa haplobotrys]]'' *''[[Myrsine achradifolia]]'' *''[[Myrsine benthamiana]]'' *''[[Myrsine crassifolia]]'' *''[[Myrsine ireneae]]'' *''[[Myrsine kimberleyensis]]'' *''[[Myrsine maculata]]'' *''[[Myrsine oreophila]]'' *''[[Myrsine porosa]]'' *''[[Myrsine rubiginosa]]'' *''[[Myrsine serpenticola]]'' *''[[Myrsine smithii]]'' *''[[Myrsine subsessilis]]'' *''[[Myrsine urceolata]]'' *''[[Myrsine variabilis]]'' *''[[Tapeinosperma pallidum]]'' *''[[Tapeinosperma pseudojambosa]]'' *''[[Tetrardisia bifaria]]'' {{div col end}} ==Proteaceae== {{div col|colwidth=18em}} *''[[Alloxylon flammeum]]'' *''[[Alloxylon wickhamii]]'' *''[[Athertonia diversifolia]]'' *''[[Austromuellera trinervia]]'' *''[[Austromuellera valida]]'' *''[[Banksia aquilonia]]'' *''[[Banksia integrifolia]]'' *''[[Bleasdalea bleasdalei]]'' *''[[Buckinghamia celsissima]]'' *''[[Buckinghamia ferruginiflora]]'' *''[[Cardwellia sublimis]]'' *''[[Carnarvonia araliifolia]]'' *''[[Catalepidia heyana]]'' *''[[Darlingia darlingiana]]'' *''[[Darlingia ferruginea]]'' *''[[Eidothea zoexylocarya]]'' *''[[Grevillea agrifolia]]'' *''[[Grevillea baileyana]]'' *''[[Grevillea heliosperma]]'' *''[[Grevillea helmsiae]]'' *''[[Grevillea hilliana]]'' *''[[Grevillea pteridifolia]]'' *''[[Grevillea robusta]]'' *''[[Helicia australasica]]'' *''[[Helicia blakei]]'' *''[[Helicia grayi]]'' *''[[Helicia lamingtoniana]]'' *''[[Helicia lewisensis]]'' *''[[Helicia nortoniana]]'' *''[[Helicia recurva]]'' *''[[Hicksbeachia pilosa]]'' *''[[Hollandaea diabolica]]'' *''[[Hollandaea porphyrocarpa]]'' *''[[Hollandaea riparia]]'' *''[[Hollandaea sayeriana]]'' *''[[Lasjia claudiensis]]'' *''[[Lasjia grandis]]'' *''[[Lasjia whelanii]]'' *''[[Lomatia milnerae]]'' *''[[Megahertzia amplexicaulis]]'' *''[[Musgravea heterophylla]]'' *''[[Musgravea stenostachya]]'' *''[[Neorites kevedianus]]'' *''[[Nothorites megacarpus]]'' *''[[Opisthiolepis heterophylla]]'' *''[[Orites excelsus]]'' *''[[Persoonia amaliae]]'' *''[[Placospermum coriaceum]]'' *''[[Sphalmium racemosum]]'' *''[[Stenocarpus cryptocarpus]]'' *''[[Stenocarpus cunninghamii]]'' *''[[Stenocarpus davallioides]]'' *''[[Stenocarpus reticulatus]]'' *''[[Stenocarpus sinuatus]]'' *''[[Stenocarpus sp. Hinchinbrook Is. (F.D.Hocking AQ229860)]]'' *''[[Stenocarpus verticis]]'' *''[[Triunia erythrocarpa]]'' *''[[Triunia montana]]'' {{div col end}} ==Putranjivaceae== *''[[Drypetes acuminata]]'' *''[[Drypetes deplanchei]]'' *''[[Drypetes iodoformis]]'' *''[[Drypetes vernicosa]]'' ==Ranunculaceae== *''[[Clematis pickeringii]]'' ==Rhamnaceae== {{div col|colwidth=18em}} *''[[Alphitonia excelsa]]'' *''[[Alphitonia oblata]]'' *''[[Alphitonia petriei]]'' *''[[Alphitonia whitei]]'' *''[[Colubrina asiatica]]'' *''[[Emmenosperma alphitonioides]]'' *''[[Emmenosperma cunninghamii]]'' *''[[Gouania australiana]]'' *''[[Gouania exilis]]'' *''[[Pomaderris argyrophylla]]'' *''[[Rhamnella vitiensis]]'' *''[[Rhamnus napalensis]]'' *''[[Sageretia hamosa]]'' *''[[Schistocarpaea johnsonii]]'' *''[[Ventilago ecorollata]]'' *''[[Ventilago pubiflora]]'' *''[[Ventilago viminalis]]'' *''[[Ziziphus mauritiana]]'' *''[[Ziziphus oenopolia]]'' *''[[Ziziphus quadrilocularis]]'' *''[[Ziziphus timoriensis]]'' {{div col end}} ==Rhizophoraceae== *''[[Carallia brachiata]]'' ==Ripogonaceae== *''[[Ripogonum album]]'' *''[[Ripogonum brevifolium]]'' *''[[Ripogonum discolor]]'' *''[[Ripogonum elseyanum]]'' ==Rosaceae== {{div col|colwidth=24em}} *''[[Prunus brachystachya]]'' *''[[Prunus turneriana]]'' *''[[Rubus alceifolius]]'' *''[[Rubus moluccanus]]'' *''[[Rubus parvifolius]]'' *''[[Rubus probus]]'' *''[[Rubus queenslandicus]]'' {{div col end}} ==Rousseaceae== *''[[Abrophyllum ornans]]'' ==Rubiaceae== {{div col|colwidth=18em}} *''[[Aidia cowleyi]]'' *''[[Aidia racemosa]]'' *''[[Amaracarpus nematopodus]]'' *''[[Antirhea ovatifolia]]'' *''[[Antirhea putaminosa]]'' *''[[Antirhea sp. Mt Lewis (B.Gray 5733)]]'' *''[[Antirhea tenuiflora]]'' *''[[Atractocarpus fitzalanii]]'' *''[[Atractocarpus hirtus]]'' *''[[Atractocarpus merikin]]'' *''[[Atractocarpus sessilis]]'' *''[[Bobea myrtoides]]'' *''[[Coelospermum dasylobum]]'' *''[[Coelospermum decipiens]]'' *''[[Coelospermum paniculatum]]'' *''[[Coelospermum purpureum]]'' *''[[Coffea arabica]]'' *''[[Coffea brassii]]'' *''[[Coffea liberica]]'' *''[[Cyclophyllum coprosmoides]]'' *''[[Cyclophyllum costatum]]'' *''[[Cyclophyllum maritimum]]'' *''[[Cyclophyllum multiflorum]]'' *''[[Cyclophyllum protractum]]'' *''[[Cyclophyllum rostellatum]]'' *''[[Cyclophyllum schultzii]]'' *''[[Eumachia frutescens]]'' *''[[Everistia vacciniifolia]]'' *''[[Gardenia actinocarpa]]'' *''[[Gardenia ovularis]]'' *''[[Gardenia psidioides]]'' *''[[Gardenia scabrella]]'' *''[[Gardenia vilhelmii]]'' *''[[Gen. (AQ520454) sp. Shute Harbour (D.A.Halford Q811)]]'' *''[[Geophila repens]]'' *''[[Guettarda speciosa]]'' *''[[Gynochthodes ammitia]]'' *''[[Gynochthodes australiensis]]'' *''[[Gynochthodes canthoides]]'' *''[[Gynochthodes constipata]]'' *''[[Gynochthodes jasminoides]]'' *''[[Gynochthodes oresbia]]'' *''[[Gynochthodes podistra]]'' *''[[Gynochthodes retropila]]'' *''[[Gynochthodes sessilis]]'' *''[[Gynochthodes sp. Iron Range (B.Hyland 11587)]]'' *''[[Gynochthodes umbellata]]'' *''[[Hedyotis auricularia]]'' *''[[Hedyotis novoguineensis]]'' *''[[Hedyotis radicans]]'' *''[[Hodgkinsonia ovatiflora]]'' *''[[Ixora baileyana]]'' *''[[Ixora biflora]]'' *''[[Ixora oreogena]]'' *''[[Ixora queenslandica]]'' *''[[Ixora timorensis]]'' *''[[Larsenaikia jardinei]]'' *''[[Larsenaikia ochreata]]'' *''[[Lasianthus chlorocarpus]]'' *''[[Lasianthus hirsutus]]'' *''[[Mitracarpus hirtus]]'' *''[[Morinda bracteata]]'' *''[[Morinda citrifolia]]'' *''[[Nauclea orientalis]]'' *''[[Neolamarckia cadamba]]'' *''[[Neonauclea glabra]]'' *''[[Oldenlandia biflora]]'' *''[[Oldenlandia galioides]]'' *''[[Oldenlandia polyclada]]'' *''[[Ophiorrhiza australiana]]'' *''[[Pavetta australiensis]]'' *''[[Pavetta brownii]]'' *''[[Pavetta granitica]]'' *''[[Pavetta kimberleyana]]'' *''[[Pavetta muelleri]]'' *''[[Psychotria coelosperma]]'' *''[[Psychotria dallachiana]]'' *''[[Psychotria daphnoides]]'' *''[[Psychotria fitzalanii]]'' *''[[Psychotria hebecarpa]]'' *''[[Psychotria loniceroides]]'' *''[[Psychotria nesophila]]'' *''[[Psychotria poliostemma]]'' *''[[Psychotria sp. Danbulla (S.T.Blake 15262)]]'' *''[[Psychotria sp. Mt Lewis (V.K.Moriarty 2445)]]'' *''[[Psychotria sp. Pinnacle Rock (B.Gray 6555)]]'' *''[[Psychotria sp. Shute Harbour (L.J.Webb 7916)]]'' *''[[Psychotria sp. Utchee Creek (H.Flecker NGNC5313)]]'' *''[[Psychotria submontana]]'' *''[[Psydrax attenuata]]'' *''[[Psydrax banksii]]'' *''[[Psydrax graciliflora]]'' *''[[Psydrax johnsonii]]'' *''[[Psydrax lamprophylla]]'' *''[[Psydrax laxiflorens]]'' *''[[Psydrax montigena]]'' *''[[Psydrax odorata]]'' *''[[Psydrax tropica]]'' *''[[Randia audasii]]'' *''[[Randia sp. Peninsula (G.Stocker 1321)]]'' *''[[Randia tuberculosa]]'' *''[[Richardia brasiliensis]]'' *''[[Spermacoce brachystema]]'' *''[[Spermacoce exilis]]'' *''[[Spermacoce latifolia]]'' *''[[Spermacoce membranacea]]'' *''[[Spermacoce ocymifolia]]'' *''[[Spermacoce prostrata]]'' *''[[Spermacoce remota]]'' *''[[Tarenna dallachiana]]'' *''[[Tarenna monticola]]'' *''[[Tarenna pentamera]]'' *''[[Tarennoidea wallichii]]'' *''[[Timonius singularis]]'' *''[[Timonius sp. Claudie River (B.Hyland 21096V)]]'' *''[[Timonius timon]]'' *''[[Triflorensia australis]]'' *''[[Triflorensia ixoroides]]'' *''[[Uncaria callophylla]]'' *''[[Uncaria cordata]]'' *''[[Uncaria lanosa]]'' *''[[Wendlandia basistaminea]]'' *''[[Wendlandia connata]]'' *''[[Wendlandia inclusa]]'' *''[[Wendlandia urceolata]]'' {{div col end}} ==Rutaceae== {{div col|colwidth=18em}} *''[[Acronychia aberrans]]'' *''[[Acronychia acidula]]'' *''[[Acronychia acronychioides]]'' *''[[Acronychia acuminata]]'' *''[[Acronychia chooreechillum]]'' *''[[Acronychia crassipetala]]'' *''[[Acronychia eungellensis]]'' *''[[Acronychia imperforata]]'' *''[[Acronychia laevis]]'' *''[[Acronychia parviflora]]'' *''[[Acronychia pauciflora]]'' *''[[Acronychia peninsularis]]'' *''[[Acronychia vestita]]'' *''[[Boronia alulata]]'' *''[[Boronia excelsa]]'' *''[[Boronia lanceolata]]'' *''[[Bosistoa medicinalis]]'' *''[[Bosistoa pentacocca]]'' *''[[Bouchardatia neurococca]]'' *''[[Brombya platynema]]'' *''[[Brombya smithii]]'' *''[[Citrus garrawayi]]'' *''[[Citrus inodora]]'' *''[[Citrus reticulata]]'' *''[[Citrus x aurantium]]'' *''[[Citrus x jambhiri]]'' *''[[Clausena brevistyla]]'' *''[[Clausena excavata]]'' *''[[Coatesia paniculata]]'' *''[[Dinosperma erythrococcum]]'' *''[[Dinosperma longifolium]]'' *''[[Dinosperma melanophloium]]'' *''[[Dinosperma stipitatum]]'' *''[[Eriostemon banksii]]'' *''[[Euodia hylandii]]'' *''[[Euodia pubifolia]]'' *''[[Flindersia acuminata]]'' *''[[Flindersia australis]]'' *''[[Flindersia bourjotiana]]'' *''[[Flindersia brassii]]'' *''[[Flindersia brayleyana]]'' *''[[Flindersia collina]]'' *''[[Flindersia ifflana]]'' *''[[Flindersia laevicarpa]]'' *''[[Flindersia oppositifolia]]'' *''[[Flindersia pimenteliana]]'' *''[[Flindersia schottiana]]'' *''[[Geijera parviflora]]'' *''[[Geijera salicifolia]]'' *''[[Glycosmis trifoliata]]'' *''[[Halfordia kendack]]'' *''[[Harrisonia brownii]]'' *''[[Leionema ellipticum]]'' *''[[Lunasia amara]]'' *''[[Luvunga monophylla]]'' *''[[Medicosma fareana]]'' *''[[Medicosma glandulosa]]'' *''[[Medicosma heterophylla]]'' *''[[Medicosma mulgraveana]]'' *''[[Medicosma obovata]]'' *''[[Medicosma riparia]]'' *''[[Medicosma sessiliflora]]'' *''[[Melicope affinis]]'' *''[[Melicope bonwickii]]'' *''[[Melicope broadbentiana]]'' *''[[Melicope elleryana]]'' *''[[Melicope fellii]]'' *''[[Melicope jonesii]]'' *''[[Melicope peninsularis]]'' *''[[Melicope rubra]]'' *''[[Melicope vitiflora]]'' *''[[Melicope xanthoxyloides]]'' *''[[Micromelum minutum]]'' *''[[Murraya paniculata]]'' *''[[Phebalium longifolium]]'' *''[[Pitaviaster haplophyllus]]'' *''[[Sarcomelicope simplicifolia]]'' *''[[Zanthoxylum brachyacanthum]]'' *''[[Zanthoxylum nitidum]]'' *''[[Zanthoxylum ovalifolium]]'' *''[[Zanthoxylum rhetsa]]'' *''[[Zieria alata]]'' *''[[Zieria eungellaensis]]'' *''[[Zieria insularis]]'' *''[[Zieria madida]]'' *''[[Zieria robertsiorum]]'' *''[[Zieria smithii]]'' {{div col end}} ==Salicaceae== {{div col|colwidth=18em}} *''[[Casearia costulata]]'' *''[[Casearia dallachii]]'' *''[[Casearia grayi]]'' *''[[Casearia grewiifolia]]'' *''[[Casearia sp. Mission Beach (B.P.Hyland 773)]]'' *''[[Flacourtia jangomas]]'' *''[[Flacourtia sp. Shiptons Flat (L.W.Jessup GJ.D3200)]]'' *''[[Flacourtia territorialis]]'' *''[[Homalium alnifolium]]'' *''[[Homalium brachybotrys]]'' *''[[Homalium circumpinnatum]]'' *''[[Homalium sp. South Molle Island (J.A.Gresty AQ208995)]]'' *''[[Scolopia braunii]]'' *''[[Xylosma ovata]]'' *''[[Xylosma sp. Mt Lewis (G.Sankowsky 1108)]]'' *''[[Xylosma sp. Temple Bay (P.I.Forster PIF8980)]]'' {{div col end}} ==Santalaceae== {{div col|colwidth=18em}} *''[[Anthobolus filifolius]]'' *''[[Dendromyza reinwardtiana]]'' *''[[Dendrotrophe varians]]'' *''[[Exocarpos latifolius]]'' *''[[Korthalsella grayi]]'' *''[[Korthalsella japonica]]'' *''[[Korthalsella papuana]]'' *''[[Korthalsella rubra]]'' *''[[Notothixos cornifolius]]'' *''[[Notothixos leiophyllus]]'' *''[[Notothixos subaureus]]'' *''[[Santalum lanceolatum]]'' *''[[Viscum articulatum]]'' *''[[Viscum ovalifolium]]'' {{div col end}} ==Sapindaceae== {{div col|colwidth=18em}} *''[[Alectryon connatus]]'' *''[[Alectryon diversifolius]]'' *''[[Alectryon kimberleyanus]]'' *''[[Alectryon oleifolius]]'' *''[[Alectryon reticulatus]]'' *''[[Alectryon semicinereus]]'' *''[[Alectryon subdentatus]]'' *''[[Alectryon tomentosus]]'' *''[[Alectryon tropicus]]'' *''[[Allophylus cobbe]]'' *''[[Arytera bifoliolata]]'' *''[[Arytera divaricata]]'' *''[[Arytera pauciflora]]'' *''[[Arytera pseudofoveolata]]'' *''[[Arytera sp. Dryander Creek (P.R.Sharpe 4184)]]'' *''[[Atalaya angustifolia]]'' *''[[Atalaya australiana]]'' *''[[Atalaya calcicola]]'' *''[[Atalaya hemiglauca]]'' *''[[Atalaya multiflora]]'' *''[[Atalaya rigida]]'' *''[[Atalaya salicifolia]]'' *''[[Atalaya sericopetala]]'' *''[[Atalaya variifolia]]'' *''[[Cardiospermum grandiflorum]]'' *''[[Cardiospermum halicacabum]]'' *''[[Castanospora alphandii]]'' *''[[Cnesmocarpon dasyantha]]'' *''[[Cossinia australiana]]'' *''[[Cupaniopsis anacardioides]]'' *''[[Cupaniopsis cooperorum]]'' *''[[Cupaniopsis dallachyi]]'' *''[[Cupaniopsis diploglottoides]]'' *''[[Cupaniopsis flagelliformis]]'' *''[[Cupaniopsis fleckeri]]'' *''[[Cupaniopsis foveolata]]'' *''[[Cupaniopsis papillosa]]'' *''[[Cupaniopsis simulata]]'' *''[[Cupaniopsis wadsworthii]]'' *''[[Dictyoneura obtusa]]'' *''[[Dimocarpus australianus]]'' *''[[Dimocarpus longan]]'' *''[[Diploglottis alaticarpa]]'' *''[[Diploglottis bernieana]]'' *''[[Diploglottis bracteata]]'' *''[[Diploglottis diphyllostegia]]'' *''[[Diploglottis harpullioides]]'' *''[[Diploglottis macrantha]]'' *''[[Diploglottis obovata]]'' *''[[Diploglottis pedleyi]]'' *''[[Diploglottis smithii]]'' *''[[Dodonaea lanceolata]]'' *''[[Dodonaea platyptera]]'' *''[[Dodonaea polyandra]]'' *''[[Dodonaea triquetra]]'' *''[[Dodonaea viscosa]]'' *''[[Elattostachys megalantha]]'' *''[[Elattostachys microcarpa]]'' *''[[Elattostachys xylocarpa]]'' *''[[Ganophyllum falcatum]]'' *''[[Guioa acutifolia]]'' *''[[Guioa lasioneura]]'' *''[[Guioa montana]]'' *''[[Guioa sarcopterifructa]]'' *''[[Guioa semiglauca]]'' *''[[Harpullia arborea]]'' *''[[Harpullia frutescens]]'' *''[[Harpullia hillii]]'' *''[[Harpullia pendula]]'' *''[[Harpullia ramiflora]]'' *''[[Harpullia rhyticarpa]]'' *''[[Jagera madida]]'' *''[[Jagera pseudorhus]]'' *''[[Lepiderema hirsuta]]'' *''[[Lepiderema ixiocarpa]]'' *''[[Lepiderema largiflorens]]'' *''[[Lepiderema punctulata]]'' *''[[Lepiderema sericolignis]]'' *''[[Lepiderema sp. Impulse Creek (A.B.Pollock 73)]]'' *''[[Lepidopetalum fructoglabrum]]'' *''[[Lepisanthes rubiginosa]]'' *''[[Lepisanthes senegalensis]]'' *''[[Mischarytera lautereriana]]'' *''[[Mischarytera macrobotrys]]'' *''[[Mischarytera megaphylla]]'' *''[[Mischocarpus anodontus]]'' *''[[Mischocarpus exangulatus]]'' *''[[Mischocarpus grandissimus]]'' *''[[Mischocarpus lachnocarpus]]'' *''[[Mischocarpus macrocarpus]]'' *''[[Mischocarpus montanus]]'' *''[[Mischocarpus pyriformis]]'' *''[[Mischocarpus stipitatus]]'' *''[[Rhysotoechia bifoliolata]]'' *''[[Rhysotoechia flavescens]]'' *''[[Rhysotoechia florulenta]]'' *''[[Rhysotoechia mortoniana]]'' *''[[Rhysotoechia robertsonii]]'' *''[[Sarcopteryx acuminata]]'' *''[[Sarcopteryx martyana]]'' *''[[Sarcopteryx montana]]'' *''[[Sarcopteryx reticulata]]'' *''[[Sarcopteryx sp. McIlwraith Range (B.Hyland 3261RFK)]]'' *''[[Sarcotoechia cuneata]]'' *''[[Sarcotoechia heterophylla]]'' *''[[Sarcotoechia lanceolata]]'' *''[[Sarcotoechia protracta]]'' *''[[Sarcotoechia serrata]]'' *''[[Sarcotoechia villosa]]'' *''[[Synima cordierorum]]'' *''[[Synima macrophylla]]'' *''[[Synima reynoldsiae]]'' *''[[Toechima daemelianum]]'' *''[[Toechima erythrocarpum]]'' *''[[Toechima monticola]]'' *''[[Toechima pterocarpum]]'' *''[[Tristiropsis acutangula]]'' {{div col end}} ==Sapotaceae== {{div col|colwidth=18em}} *''[[Amorphospermum antilogum]]'' *''[[Donella lanceolata]]'' *''[[Manilkara kauki]]'' *''[[Mimusops elengi]]'' *''[[Niemeyera discolor]]'' *''[[Niemeyera prunifera]]'' *''[[Palaquium galactoxylon]]'' *''[[Planchonella asterocarpon]]'' *''[[Planchonella chartacea]]'' *''[[Planchonella cotinifolia]]'' *''[[Planchonella euphlebia]]'' *''[[Planchonella myrsinifolia]]'' *''[[Planchonella myrsinodendron]]'' *''[[Planchonella obovata]]'' *''[[Planchonella pohlmaniana]]'' *''[[Planchonella xylocarpa]]'' *''[[Pleioluma brownlessiana]]'' *''[[Pleioluma ferruginea]]'' *''[[Pleioluma laurifolia]]'' *''[[Pleioluma macrocarpa]]'' *''[[Pleioluma papyracea]]'' *''[[Pleioluma pilosa]]'' *''[[Pleioluma queenslandica]]'' *''[[Pleioluma singuliflora]]'' *''[[Pleioluma xerocarpa]]'' *''[[Sersalisia obpyriformis]]'' *''[[Sersalisia sericea]]'' *''[[Sersalisia sessiliflora]]'' *''[[Sersalisia unmackiana]]'' *''[[Vanroyena castanosperma]]'' {{div col end}} ==Scrophulariaceae== *''[[Myoporum montanum]]'' ==Simaroubaceae== {{div col|colwidth=24em}} *''[[Ailanthus integrifolia]]'' *''[[Ailanthus triphysa]]'' *''[[Brucea javanica]]'' *''[[Quassia amara]]'' *''[[Samadera baileyana]]'' *''[[Samadera bidwillii]]'' *''[[Samadera sp. Barong (B.Gray 742)]]'' *''[[Samadera sp. Tozer Range (L.J.Brass 19393)]]'' {{div col end}} ==Smilacaceae== {{div col|colwidth=24em}} *''[[Smilax aculeatissima]]'' *''[[Smilax australis]]'' *''[[Smilax blumei]]'' *''[[Smilax calophylla]]'' *''[[Smilax glyciphylla]]'' *''[[Smilax kaniensis]]'' *''[[Smilax sp. aff. S. elliptica]]'' {{div col end}} ==Solanaceae== {{div col|colwidth=18em}} *''[[Capsicum annuum]]'' *''[[Cestrum nocturnum]]'' *''[[Duboisia myoporoides]]'' *''[[Lycianthes shanesii]]'' *''[[Nicandra physalodes]]'' *''[[Nicotiana forsteri]]'' *''[[Nicotiana tabacum]]'' *''[[Nicotiana wuttkei]]'' *''[[Physalis angulata]]'' *''[[Physalis peruviana]]'' *''[[Solanum aviculare]]'' *''[[Solanum betaceum]]'' *''[[Solanum capsicoides]]'' *''[[Solanum cookii]]'' *''[[Solanum defensum]]'' *''[[Solanum dimorphispinum]]'' *''[[Solanum discolor]]'' *''[[Solanum dunalianum]]'' *''[[Solanum ellipticum]]'' *''[[Solanum eminens]]'' *''[[Solanum erianthum]]'' *''[[Solanum fervens]]'' *''[[Solanum francisii]]'' *''[[Solanum furfuraceum]]'' *''[[Solanum hamulosum]]'' *''[[Solanum intonsum]]'' *''[[Solanum lasiocarpum]]'' *''[[Solanum macoorai]]'' *''[[Solanum magnifolium]]'' *''[[Solanum mauritianum]]'' *''[[Solanum nigrum]]'' *''[[Solanum nodiflorum]]'' *''[[Solanum parvifolium]]'' *''[[Solanum pseudocapsicum]]'' *''[[Solanum seaforthianum]]'' *''[[Solanum sporadotrichum]]'' *''[[Solanum tetrandrum]]'' *''[[Solanum torvum]]'' *''[[Solanum viridifolium]]'' {{div col end}} ==Stemonaceae== *''[[Stemona australiana]]'' *''[[Stemona lucida]]'' ==Surianaceae== *''[[Cadellia pentastylis]]'' *''[[Guilfoylia monostylis]]'' *''[[Suriana maritima]]'' ==Symplocaceae== {{div col|colwidth=18em}} *''[[Symplocos ampulliformis]]'' *''[[Symplocos boonjee]]'' *''[[Symplocos bullata]]'' *''[[Symplocos crassiramifera]]'' *''[[Symplocos cyanocarpa]]'' *''[[Symplocos gittinsii]]'' *''[[Symplocos glabra]]'' *''[[Symplocos graniticola]]'' *''[[Symplocos hayesii]]'' *''[[Symplocos hylandii]]'' *''[[Symplocos oresbia]]'' *''[[Symplocos paucistaminea]]'' *''[[Symplocos puberula]]'' *''[[Symplocos stawellii]]'' *''[[Symplocos thwaitesii]]'' *''[[Symplocos wooroonooran]]'' {{div col end}} ==Taccaceae== *''[[Tacca leontopetaloides]]'' ==Theaceae== *''[[Camellia sinensis]]'' ==Thismiaceae== *''[[Thismia hawkesii]]'' *''[[Thismia lanternata]]'' *''[[Thismia tectipora]]'' *''[[Thismia yorkensis]]'' ==Thymelaeaceae== {{div col|colwidth=24em}} *''[[Lethedon setosa]]'' *''[[Phaleria biflora]]'' *''[[Phaleria chermsideana]]'' *''[[Phaleria clerodendron]]'' *''[[Phaleria octandra]]'' *''[[Pimelea aquilonia]]'' *''[[Pimelea chlorina]]'' *''[[Pimelea latifolia]]'' *''[[Pimelea linifolia]]'' *''[[Pimelea sericostachya]]'' *''[[Wikstroemia indica]]'' {{div col end}} ==Triuridaceae== *''[[Sciaphila arfakiana]]'' *''[[Sciaphila tenella]]'' ==Urticaceae== {{div col|colwidth=18em}} *''[[Cecropia peltata]]'' *''[[Debregeasia australis]]'' *''[[Dendrocnide corallodesme]]'' *''[[Dendrocnide cordifolia]]'' *''[[Dendrocnide moroides]]'' *''[[Dendrocnide photinophylla]]'' *''[[Elatostema reticulatum]]'' *''[[Laportea interrupta]]'' *''[[Nothocnide repanda]]'' *''[[Pipturus argenteus]]'' *''[[Pouzolzia zeylanica]]'' *''[[Procris pedunculata]]'' *''[[Urtica incisa]]'' {{div col end}} ==Verbenaceae== {{div col|colwidth=24em}} *''[[Duranta erecta]]'' *''[[Lantana camara]]'' *''[[Stachytarpheta cayennensis]]'' *''[[Stachytarpheta jamaicensis]]'' *''[[Stachytarpheta mutabilis]]'' *''[[Verbena bonariensis]]'' *''[[Verbena litoralis]]'' {{div col end}} ==Violaceae== *''[[Afrohybanthus enneaspermus]]'' *''[[Afrohybanthus stellarioides]]'' *''[[Rinorea bengalensis]]'' *''[[Viola perreniformis]]'' ==Vitaceae== {{div col|colwidth=18em}} *''[[Ampelocissus acetosa]]'' *''[[Ampelocissus gardineri]]'' *''[[Causonis clematidea]]'' *''[[Causonis japonica]]'' *''[[Causonis maritima]]'' *''[[Causonis trifolia]]'' *''[[Cayratia cardiophylla]]'' *''[[Cayratia saponaria]]'' *''[[Cissus adnata]]'' *''[[Cissus antarctica]]'' *''[[Cissus cardiophylla]]'' *''[[Cissus hastata]]'' *''[[Cissus hypoglauca]]'' *''[[Cissus oblonga]]'' *''[[Cissus penninervis]]'' *''[[Cissus pentaclada]]'' *''[[Cissus reniformis]]'' *''[[Cissus repens]]'' *''[[Cissus sterculiifolia]]'' *''[[Cissus vinosa]]'' *''[[Clematicissus opaca]]'' *''[[Leea novoguineensis]]'' *''[[Leea rubra]]'' *''[[Tetrastigma crenatum]]'' *''[[Tetrastigma nitens]]'' *''[[Tetrastigma petraeum]]'' *''[[Tetrastigma pisicarpum]]'' *''[[Tetrastigma thorsborneorum]]'' {{div col end}} ==Winteraceae== {{div col|colwidth=24em}} *''[[Bubbia queenslandiana]]'' *''[[Bubbia semecarpoides]]'' *''[[Bubbia whiteana]]'' *''[[Tasmannia insipida]]'' *''[[Tasmannia membranea]]'' *''[[Tasmannia sp. Mt Bellenden Ker (J.R.Clarkson 6571)]]'' {{div col end}} ==Zamiaceae== *''[[Bowenia serrulata]]'' *''[[Bowenia spectabilis]]'' *''[[Lepidozamia hopei]]'' ==Zingiberaceae== {{div col|colwidth=18em}} *''[[Alpinia arctiflora]]'' *''[[Alpinia caerulea]]'' *''[[Alpinia hylandii]]'' *''[[Alpinia modesta]]'' *''[[Amomum queenslandicum]]'' *''[[Curcuma australasica]]'' *''[[Curcuma longa]]'' *''[[Etlingera australasica]]'' *''[[Hedychium coronarium]]'' *''[[Hornstedtia scottiana]]'' *''[[Meistera dallachyi]]'' *''[[Pleuranthodium racemigerum]]'' *''[[Zingiber zerumbet]]'' {{div col end}} ==Zygophyllaceae== *''[[Tribulopis homalococca]]'' *''[[Tribulopis solandri]]'' tds9hviigue6fsfbww990tl2hb6gw3x Victoria Quiralte 0 2033464 11322593 9613302 2026-10-22T03:59:48Z The editor 2345 2915305 11322593 wikitext text/x-wiki {{Image}} '''Victoria Quiralte''', Spanish palaeontologist. * Departamento de Paleobiología, Museo Nacional de Ciencias Naturales-CSIC, C/ José Gutiérrez Abascal 2, 28006, Madrid, Spain. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2010=== {{Sánchez et al., 2010}} ===2011=== {{Sánchez et al., 2011}} ===2015=== {{Sánchez et al., 2015a}} ===2018=== {{Sánchez et al., 2018}} {{Authority control}} {{DEFAULTSORT:Quiralte, Victoria}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] tw5hrn48vjkektlps3yxzykqhw6j4et Daniel DeMiguel 0 2033601 11322592 11321749 2026-10-22T03:59:21Z The editor 2345 2915305 11322592 wikitext text/x-wiki {{Image}} '''Daniel DeMiguel''', Spanish palaeontologist. * Departamento de Ciencias de la Tierra, and Instituto Universitario de Investigación en Ciencias Ambientales de Aragón (IUCA), Universidad de Zaragoza, 50009, Zaragoza, Spain, a.valenciano@unizar.es; azanza@unizar.es;3 ARAID foundation, 50018, Zaragoza, Spain. * Institut Català de Paleontologia Miquel Crusafont, Universidad Autònoma de Barcelona, Campus de la UAB, 08193, Cerdanyola del Vallès, Barcelona, Spain. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2011=== {{Sánchez et al., 2011}} ===2019=== {{Sánchez et al., 2019c}} ===2022=== {{Valenciano et al., 2022}} {{Authority control}} {{DEFAULTSORT:Demiguel, Daniel}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] d617r03i1mrl0wiettawyxu5h8pmj91 Dimitris S. Kostopoulos 0 2035237 11322599 10985883 2026-10-22T05:08:27Z The editor 2345 2915305 /* Publications */ 11322599 wikitext text/x-wiki {{Image}} '''Dimitris S. Kostopoulos''', Greek palaeontologist. {{el|Δημήτρης Σ. Κωστόπουλος}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2004=== {{Kostopoulos, 2004}} ===2006=== {{Kostopoulos & Koufos, 2006}} ===2009=== {{Bibi et al., 2009}} {{Kostopoulos, 2009}} ===2011=== {{Kostopoulos & Bernor, 2011}} ===2020=== {{Garcia et al., 2020}} {{Authority control}} {{DEFAULTSORT:Kostopoulos, Dimitris S.}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] ir5tefvyfqs99xeqjbm1rhten03tab2 Template:Vences et al., 2023b 10 2055612 11322332 9687906 2026-10-21T20:43:44Z Burmeister 9074 fix 11322332 wikitext text/x-wiki * {{a|Miguel Vences|Vences, M.}}, {{a|Malte Multzsch|Multzsch, M.}}, {{a|Jörn Köhler|Köhler, J.}}, {{a|Angelica Crottini|Crottini, A.}}, {{a|Franco Andreone|Andreone, F.}}, {{a|Andolalao Rakotoarison|Rakotoarison, A.}}, {{a|Mark D. Scherz|Scherz, M.D.}} & {{a|Frank Glaw|Glaw, F.}} 2023. Integrative revision of the ''Blommersia wittei'' complex, with description of a new species of frog from western and north-western Madagascar. {{Zootaxa|2023|5319|2|178|198|2}} {{Access|closed}} <includeonly>[[Template:Vences et al., 2023b|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 25 July 2023 * {{ZooBank|B0F1E485-5BF1-4B71-A59E-AA2CE354355F}} ==={{int:New names}} (1)=== * ''[[Blommersia bara]]'' [p. 192] [[Category:Reference templates]]</noinclude> jioonahjsk6e2d5221znq6s7gmqzi4g Template:Neumoegen & Dyar, 1893 10 2062606 11322191 10544764 2026-10-21T18:19:19Z FrankB157 2872707 Wrong template in reference 11322191 wikitext text/x-wiki *{{a|Berthold Neumoegen|Neumoegen B.}} & {{a|Harrison Gray Dyar|Dyar, H.G.}} 1893. New species and varieties of Bombyces. [[ISSN 0028-7199|''Journal of the New York Entomological Society'']] 1(1): 29–35 {{BHL|item/104430#page/43}}. <includeonly>[[Template:Neumoegen & Dyar, 1893|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> 0i0bmj6cyqlb8qaklz6ueiq6s6cgn5q Helictidinae 0 2124381 11322207 11299134 2026-10-21T18:33:45Z The editor 2345 2915305 /* Name */ 11322207 wikitext text/x-wiki {{Image|Burmese ferret badger.png|''[[Melogale personata]]''}} =={{int:Taxonavigation}}== {{Helictidinae}} Genera (1): {{glast|Melogale}} =={{int:Name}}== Helictidinae {{a|John Edward Gray|Gray|cat=y}}, 1865 * {{int:Type genus}}: ''[[Helictis]]'' {{aut|Gray}}, 1831 ==={{int:Synonymy}}=== * Helictidina {{aut|Gray}}, 1865: 103 [original status, as tribe] ** Helictidinae: {{a|Theodore Nicholas Gill|Gill}}, 1872: 66 [elevated to subfamiliy rank] =={{int:References}}== ==={{int:Primary references}}=== {{Gray, 1865a}} {{Gill, 1872}} ==={{int:Additional references}}=== * {{a|Jun J. Sato|Sato, J.J.}}, {{a|Tetsuji Hosoda|Hosoda, T.}}, {{a|Mieczysław Wolsan|Wolsan, M.}} & {{a|Hitoshi Suzuki|Suzuki, H.}} 2004. Molecular Phylogeny of Arctoids (Mammalia: Carnivora) with Emphasis on Phylogenetic and Taxonomic Positions of the Ferret-badgers and Skunks. ''[[ISSN 0289-0003|Zoological Science]]'' 21(1): 111–118. {{doi|10.2108/0289-0003(2004)21[111:MPOAMC]2.0.CO;2}}. m4i818wdhhiw0wrrikg0za49eksiuch Otala punctata 0 2160280 11322308 10706994 2026-10-21T20:13:51Z Isfisk 2639 11322308 wikitext text/x-wiki {{Image|Otala punctata2.jpg|''Otala punctata''}} =={{int:Taxonavigation}}== {{Otala}} Species: ''[[Otala punctata]]'' =={{int:Name}}== ''Otala punctata'' ({{a|Otto Friedrich Müller|Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix punctata'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} ==={{int:Additional references}}=== [1] Arrébola, J. (2011). "Otala punctata". IUCN Red List of Threatened Species. 2011: e.T156692A124239448. Retrieved 9 March 2021. [2] Cowie R. H., Dillon R. T., Robinson D. G. & Smith J. W. (2009). "Alien non-marine snails and slugs of priority quarantine importance in the United States: A preliminary risk assessment". American Malacological Bulletin 27: 113-132. PDF Archived 2016-06-16 at the Wayback Machine. =={{int:Vernacular names}}== {{VN|en=Spanish Snail}} {{Taxonbar|from=Q2711296}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] gyq92babgscnxyoky4lt2bbfh6sn7gy Template:Bridges, 1994b 10 2165653 11322357 11310956 2026-10-21T21:02:09Z John Tann 703224 open access 11322357 wikitext text/x-wiki * {{a|Charles Albert Bridges|Bridges, C.A.}} 1994. ''Catalogue of the family-group, genus-group and species-group names of the Odonata of the world (third edition)''. Bridges, Urbana, Illinois. {{BHL|page/15105990}} {{access|open}} <includeonly>[[Template:Bridges, 1994b|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> evm7bnpvmbksxlyq8cv4434i2fk6d86 11322364 11322357 2026-10-21T21:09:05Z John Tann 703224 DOI 11322364 wikitext text/x-wiki * {{a|Charles Albert Bridges|Bridges, C.A.}} 1994. ''Catalogue of the family-group, genus-group and species-group names of the Odonata of the world (third edition)''. Bridges, Urbana, Illinois. {{doi|10.5962/bhl.title.15291}} {{BHL|page/15105990}} {{access|open}} <includeonly>[[Template:Bridges, 1994b|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 81q2rm8yny7xtozmmdf1xtg2q6lsxkf Roy E. Smith 0 2171420 11322415 11071610 2026-10-21T22:06:29Z The editor 2345 2915305 11322415 wikitext text/x-wiki '''Roy E. Smith''', English paleontologist. * School of the Environment, Geography and Geological Sciences, University of Portsmouth, Burnaby Road, PO1 3QL, United Kingdom. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2020=== {{Smith et al., 2020a}} ===2021=== {{Smith et al., 2021}} {{Authority control}} {{DEFAULTSORT:Smith, Roy}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] kpxzwh1o9nghja7txgg1xd07sdu8fkq Template:Sadasivan & Sengupta, 2024 10 2190678 11322007 10915620 2026-10-21T14:05:47Z Sjl197 1805579 11322007 wikitext text/x-wiki * {{a|Kalesh Sadasivan|Sadasivan, K.}} & {{a|Ashok Sengupta|Sengupta, A.}} 2024. The Butterflies of Western Ghats: Their Status and Distribution. ''[[ISSN 0006-6982|Journal of the Bombay Natural History Society]]'' 121(2): 126–174. {{Doi|10.17087/jbnhs/2024/v121/164523}} [https://www.researchgate.net/publication/383667647_THE_BUTTERFLIES_OF_WESTERN_GHATS_THEIR_STATUS_AND_DISTRIBUTION PDF ResearchGate] {{Access|open}} <includeonly>[[Template:Sadasivan &#38; Sengupta, 2024|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 10yy16s8lpr090kqrw8v4pzeko064hl Keratoisididae 0 2195875 11322582 10978648 2026-10-22T03:50:46Z ~2026-56361-61 3040886 11322582 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Keratoisididae}} Genera: ''[[Acanella]]''&nbsp;- ''[[Adinisis]]''&nbsp;- ''[[Aethisis]]''&nbsp;- ''[[Bathygorgia]]''&nbsp;- ''[[Cladarisis]]''&nbsp;- ''[[Dentatisis]]''&nbsp;- ''[[Dokidisis]]''&nbsp;- ''[[Eknomisis]]''&nbsp;- ''[[Explorisis]]''&nbsp;- ''[[Isidella]]''&nbsp;- ''[[Jasonisis]]''&nbsp;- ''[[Keratoisis]]''&nbsp;- ''[[Lepidisis]]''&nbsp;- ''[[Onkoisis]]''&nbsp;- ''[[Orstomisis]]''&nbsp;- ''[[Parajasonisis]]''&nbsp;- ''[[Scottisis]]''&nbsp;- ''[[Tanyostea]]''&nbsp;- ''[[Tridentisis]]'' =={{int:Name}}== Keratoisididae [[John Edward Gray|Gray]], 1870 == {{int:References}} == {{Watling, Saucier & France, 2022}} dk6os54xfoal6juw9hg8bkv15lxukit Lyncodontini 0 2198233 11322195 10946423 2026-10-21T18:23:46Z The editor 2345 2915305 11322195 wikitext text/x-wiki {{Image|Galictis.jpg|''[[Galictis cuja]]''}} =={{int:Taxonavigation}}== {{Lyncodontini}} Genera (2 + †10): †{{g|Cernictis}} †{{g|Enhydrictis}} {{g|Galictis}} †{{g|Lutravus}} {{g|Lyncodon}} †{{g|Martellictis}} †{{g|Mustelercta}} †{{g|Oriensictis}} †{{g|Pannonictis}} †{{g|Sminthosinis}} †{{g|Stipanicicia}} †{{glast|Trigonictis}} =={{int:Name}}== Lyncodontini {{a|Reginald Innes Pocock|Pocock|cat=y}}, 1921 ==={{int:Synonyms}}=== * Grisoninae {{aut|Pocock}}, 1921:835 * Lyncodontinae {{a|Reginald Innes Pocock|Pocock|cat=y}}, 1921:{{BHL|page/31253614|836}} * Galictinae {{a|Osvaldo Alfredo Reig|Reig}}, 1956:225 * Galictini {{a|Jon A. Baskin|Baskin}}, 1998:164 * Lyncodontini {{aut|Sato}} ''et al.'', 2012:748 =={{int:References}}== ==={{int:Primary references}}=== {{Pocock, 1921}} ==={{int:Additional references}}=== * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1956. Note préliminaire sur un nouveau genre de Mustélidés fossiles du Pléistocène de la République Argentine. ''Mammalia'' 20(3): 223–230. * {{a|Jon A. Baskin|Baskin, J.A.}} 1998. Mustelidae, p. 152-173. In {{aut|Janis, C.}}, {{aut|Scott, K.M.}} & {{aut|Jacobs, L.L.}} (eds.), ''Evolution of Tertiary Mammals of North America: Volume 1, Terrestrial Carnivores, Ungulates, and Ungulate Like Mammals''. Cambridge University Press, Cambridge, United Kingdom. * {{a|Jun J. Sato|Sato, J.J.}}, {{a|Mieczyslaw Wolsan|Wolsan, M.}}, {{a|Francisco J. Prevosti|Prevosti, F.J.}}, {{a|Guillermo D’Elía|D’Elía, G.}}, {{a|Colleen Begg|Begg, C.}}, {{a|Keith Begg|Begg, K.}}, {{a|Tetsuji Hosoda|Hosoda, T.}}, {{a|Kevin L. Campbell|Campbell, K.L.}} & {{a|Hitoshi Suzuki|Suzuki, H.}} 2012. Evolutionary and biogeographic history of weasel-like carnivorans (Musteloidea). ''[[ISSN 1055-7903|Molecular Phylogenetics and Evolution]]'' 63(3):745–757. {{doi|10.1016/j.ympev.2012.02.025}}. 0cxcsaz92qqkf7qi1cj41ah2beuez5m Prostrepsiceros 0 2206766 11322528 10991298 2026-10-22T03:26:07Z The editor 2345 2915305 11322528 wikitext text/x-wiki {{Image|Prostrepsiceros houtumschindleri.JPG|''Prostrepsiceros houtumschindleri''}} =={{int:Taxonavigation}}== {{Prostrepsiceros}} Species (5): †{{sp|P|rostrepsiceros|axiosi}} †{{sp|P|rostrepsiceros|houtumschindleri}} †{{sp|P|rostrepsiceros|rotundicornis}} †{{sp|P|rostrepsiceros|vallesiensis}} †{{splast|P|rostrepsiceros|zitteli}} =={{int:Name}}== ''Prostrepsiceros'' {{a|Charles Immanuel Forsyth Major|Forsyth Major}}, 1891 * Type species: ''Prostrepsiceros vallesiensis'' {{aut|Bouvrain}}, 1982 =={{int:References}}== ==={{int:Primary references}}=== {{Forsyth Major, 1891}} [[Category:Charles Immanuel Forsyth Major taxa]] nts2q0q4qy5jg0h55jsylsx5fwbl8bg Torsten van der Heyden 0 2208150 11322144 11188364 2026-10-21T16:56:58Z Hiouf 2107144 /* 2026 */ 11322144 wikitext text/x-wiki '''Torsten van der Heyden''' (1959–), German entomologist. {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{Inc}} ===1987=== {{Van der Heyden & Paulmann, 1987}} ===1988=== {{Van der Heyden, 1988}} {{Van der Heyden, 1988a}} {{Van der Heyden, 1988b}} {{Van der Heyden & Paulmann, 1988}} ===1989=== {{Van der Heyden, 1989}} {{Van der Heyden, 1989a}} ===1990=== {{Van der Heyden, 1990}} ===1991=== {{Van der Heyden, 1991}} {{Van der Heyden, 1991a}} {{Van der Heyden, 1991b}} ===1992=== {{Van der Heyden, 1992}} {{Van der Heyden, 1992a}} {{Van der Heyden, 1992b}} ===1996=== {{Heiss et al., 1996}} {{Van der Heyden, 1996}} ===1997=== {{Van der Heyden, 1997}} ===2006=== {{Van der Heyden, 2006}} ===2007=== {{Van der Heyden, 2007}} {{Van der Heyden, 2007a}} ===2009=== {{Van der Heyden, 2009}} {{Van der Heyden, 2009a}} {{Van der Heyden, 2009b}} {{Van der Heyden, 2009c}} ===2010=== {{Sambhu & van der Heyden, 2010}} {{Van der Heyden, 2010}} ===2011=== {{Van der Heyden, 2011}} {{Van der Heyden, 2011a}} {{Van der Heyden, 2011b}} {{Van der Heyden, 2011c}} ===2012=== {{Van der Heyden, 2012}} {{Van der Heyden, 2012a}} {{Van der Heyden & Gamboa, 2012}} {{Van der Heyden & Graziano, 2012}} ===2013=== {{Van der Heyden, 2013}} {{Van der Heyden, 2013a}} {{Van der Heyden, 2013b}} {{Van der Heyden, 2013c}} {{Van der Heyden & Jiménez, 2013}} {{Van der Heyden & von Seth, 2013}} ===2014=== {{Van der Heyden, 2014}} {{Van der Heyden, 2014a}} {{Van der Heyden, 2014b}} {{Van der Heyden, 2014c}} {{Van der Heyden, 2014d}} {{Van der Heyden & Gamboa Hidalgo, 2014}} {{Van der Heyden, Gamboa Hidalgo & Gil-Santana, 2014}} ===2015=== {{Van der Heyden, 2015}} {{Van der Heyden, 2015a}} {{Van der Heyden, 2015b}} {{Van der Heyden, 2015c}} {{Van der Heyden, 2015d}} ===2016=== {{Van der Heyden, 2016}} {{Van der Heyden, 2016a}} {{Van der Heyden, 2016b}} {{Van der Heyden & Díaz, 2016}} ===2017=== {{Van der Heyden, 2017}} {{Van der Heyden, 2017a}} {{Van der Heyden, 2017b}} {{Van der Heyden, 2017c}} {{Van der Heyden, 2017d}} {{Van der Heyden, 2017e}} {{Van der Heyden, 2017f}} {{Van der Heyden, 2017g}} ===2018=== {{Van der Heyden, 2018}} {{Van der Heyden, 2018a}} {{Van der Heyden, 2018b}} {{Van der Heyden, 2018c}} {{Van der Heyden, 2018d}} {{Van der Heyden, 2018e}} {{Van der Heyden, 2018f}} {{Van der Heyden, 2018g}} {{Van der Heyden, 2018h}} {{Van der Heyden, 2018i}} ===2019=== {{Brailovsky & Van der Heyden, 2019}} {{Nemer et al., 2019}} {{Škorput et al., 2019}} {{Van der Heyden, 2019}} {{Van der Heyden, 2019a}} {{Van der Heyden, 2019b}} {{Van der Heyden, 2019c}} {{Van der Heyden, 2019d}} {{Van der Heyden, 2019e}} {{Van der Heyden, 2019f}} {{Van der Heyden, 2019g}} {{Van der Heyden, 2019h}} {{Van der Heyden, 2019i}} {{Van der Heyden, 2019j}} {{Van der Heyden, 2019k}} {{Van der Heyden & Dioli, 2019}} {{Van der Heyden & Zettel, 2019}} ===2020=== {{Grosso-Silva, Frias & Van der Heyden, 2020}} {{Grosso-Silva et al., 2020}} {{Lupoli, van der Heyden & Dioli, 2020}} {{Van der Heyden, 2020}} {{Van der Heyden, 2020a}} {{Van der Heyden, 2020b}} {{Van der Heyden, 2020c}} {{Van der Heyden, 2020d}} {{Van der Heyden, 2020e}} {{Van der Heyden, 2020f}} {{Van der Heyden, 2020g}} {{Van der Heyden, 2020h}} {{Van der Heyden & Dioli, 2020}} {{Van der Heyden & Grosso-Silva, 2020}} {{Van der Heyden & Faúndez, 2020}} ===2021=== {{Grosso-Silva et al., 2021}} {{Lupoli, van der Heyden & Dioli, 2021}} {{Van der Heyden, 2021}} {{Van der Heyden, 2021a}} {{Van der Heyden, 2021b}} {{Van der Heyden, 2021c}} {{Van der Heyden, 2021d}} {{Van der Heyden, 2021e}} {{Van der Heyden, 2021f}} {{Van der Heyden, 2021g}} {{Van der Heyden & Piterāns, 2021}} {{Van der Heyden, Saci & Dioli, 2021}} {{Van der Heyden & Schwarz, 2021}} {{Van der Heyden & von Seth, 2021}} ===2022=== {{Dioli & van der Heyden, 2022}} {{Kment & van der Heyden, 2022}} {{Van der Heyden, 2022}} {{Van der Heyden, 2022a}} {{Van der Heyden, 2022b}} {{Van der Heyden, 2022c}} {{Van der Heyden, 2022d}} {{Van der Heyden, 2022e}} {{Van der Heyden, 2022f}} {{Van der Heyden, 2022g}} {{Van der Heyden, 2022h}} {{Van der Heyden, 2022i}} {{Van der Heyden & Lupoli, 2022}} {{Van der Heyden & Nava, 2022}} ===2023=== {{Gaspar et al., 2023}} {{Grosso-Silva et al., 2023}} {{Van der Heyden, 2023h}} {{Van der Heyden, 2023}} {{Van der Heyden, 2023a}} {{Van der Heyden, 2023b}} {{Van der Heyden, 2023c}} {{Van der Heyden, 2023l}} {{Van der Heyden, 2023d}} {{Van der Heyden, 2023e}} {{Van der Heyden, 2023f}} {{Van der Heyden, 2023g}} {{Van der Heyden, 2023i}} {{Van der Heyden, 2023j}} {{Van der Heyden, 2023n}} {{Van der Heyden, 2023o}} {{Van der Heyden, 2023k}} {{Van der Heyden, 2023m}} {{Van der Heyden & Faúndez, 2023}} {{Van der Heyden & Petrovan, 2023}} {{Van der Heyden & Staudinger, 2023}} ===2024=== {{Ghahari et al., 2024e}} {{Grosso-Silva et al., 2024}} {{Lupoli & van der Heyden, 2024}} {{Van der Heyden, 2024}} {{Van der Heyden, 2024a}} {{Van der Heyden, 2024b}} {{Van der Heyden, 2024c}} {{Van der Heyden, 2024h}} {{Van der Heyden, 2024d}} {{Van der Heyden, 2024e}} {{Van der Heyden, 2024g}} {{Van der Heyden, 2024f}} {{Van der Heyden, 2024i}} {{Van der Heyden, 2024j}} {{Van der Heyden, 2024k}} {{Van der Heyden, Dhellemmes & Dioli, 2024}} {{Van der Heyden & Grosso-Silva, 2024}} {{Van der Heyden & Heiss, 2024}} {{Van der Heyden & Lupoli, 2024}} {{Van der Heyden, Morin & Dioli, 2024}} {{Zografou et al., 2024}} ===2025=== {{Grosso-Silva et al., 2025}} {{Lupoli & van der Heyden, 2025}} {{Van der Heyden, 2025a}} {{Van der Heyden, 2025}} {{Van der Heyden, 2025b}} {{Van der Heyden, 2025c}} {{Van der Heyden, 2025d}} {{Van der Heyden, 2025e}} {{Van der Heyden, 2025h}} {{Van der Heyden, 2025k}} {{Van der Heyden, 2025i}} {{Van der Heyden, 2025q}} {{Van der Heyden, 2025g}} {{Van der Heyden, 2025f}} {{Van der Heyden, 2025j}} {{Van der Heyden, 2025l}} {{Van der Heyden, 2025m}} {{Van der Heyden, 2025n}} {{Van der Heyden, 2025o}} {{Van der Heyden, 2025p}} {{Van der Heyden & Lupoli, 2025}} {{Van der Heyden & Plünnecke, 2025}} {{Van der Heyden & Tanco, 2025}} ===2026=== {{Van der Heyden, 2026}} {{Van der Heyden, 2026a}} {{Van der Heyden, 2026b}} {{Van der Heyden, 2026c}} {{Van der Heyden, 2026d}} {{Authority control}} {{DEFAULTSORT:van der Heyden, Torsten}} [[Category:Taxon authorities]] [[Category:Entomologists]] [[Category:Heteropterists]] cpxzbobmytqk9vm2mkhbz2usj4f7pmn Template:Bennett, 1833d 10 2208309 11322480 10850814 2026-10-21T23:59:58Z Burmeister 9074 fix 11322480 wikitext text/x-wiki * {{a|Edward Turner Bennett|Bennett, E.T.}} 1833. Notice of a New Genus of Viverridous Mammalia from Madagascar, presented by C. Telfair, Esq. ''[[ISSN 0370-2774|Proceedings of the Zoological Society of London]]'' 1833: 46. {{BHL|page/12859486}} <includeonly>[[Template:Bennett, 1833d|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 2842e586fs4o8y4y9fmo7jqxauiasln Rusingoryx 0 2211134 11322548 10859760 2026-10-22T03:33:34Z The editor 2345 2915305 11322548 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Rusingoryx}} Species (1): †{{splast|R|usingoryx|atopocranion}} =={{int:Name}}== ''Rusingoryx'' {{a|Martin Hubert Luke Pickford|Pickford}} & {{a|Herbert Thomas|Thomas}}, 1984 =={{int:References}}== ==={{int:Primary references}}=== {{Pickford & Thomas, 1984}} [[Category:Martin Hubert Luke Pickford taxa]] [[Category:Herbert Thomas taxa]] n2sxjd8lkc62qioiqctbfyr66xlui2c Rusingoryx atopocranion 0 2211136 11322550 10859762 2026-10-22T03:33:42Z The editor 2345 2915305 11322550 wikitext text/x-wiki {{Image|Rusingoryx drinking.png}} =={{int:Taxonavigation}}== {{Rusingoryx}} Species: †''[[Rusingoryx atopocranion]]'' =={{int:Name}}== ''Rusingoryx atopocranion'' {{a|Martin Hubert Luke Pickford|Pickford}} & {{a|Herbert Thomas|Thomas}}, 1984 =={{int:References}}== ==={{int:Primary references}}=== {{Pickford & Thomas, 1984}} [[Category:Martin Hubert Luke Pickford taxa]] [[Category:Herbert Thomas taxa]] 5jbmm2ubj3go3ur6u22j0mzagfatv03 Menelikia 0 2211347 11322534 10933393 2026-10-22T03:28:51Z The editor 2345 2915305 11322534 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Menelikia}} Species (2): †{{sp|M|enelikia|leakeyi}} †{{splast|M|enelikia|lyrocera}} =={{int:Name}}== ''Menelikia'' {{a|Camille Louis Joseph Arambourg|Arambourg}}, 1941 * {{int:Type species}}: ''Menelikia lyrocera'' {{aut|Arambourg}}, 1941 =={{int:References}}== ==={{int:Primary references}}=== {{Arambourg, 1941}} [[Category:Camille Louis Joseph Arambourg taxa]] it3ellnod1ukagakqhi55wrjrd3l7vv Enhydriodon 0 2216951 11322275 10877096 2026-10-21T19:48:47Z The editor 2345 2915305 11322275 wikitext text/x-wiki {{Image|Enhydriodon hendeyi africanus dentition.jpg}} =={{int:Taxonavigation}}== {{Enhydriodon}} Species (11): †{{sp|E|nhydriodon|afman}} †{{sp|E|nhydriodon|africanus}} †{{sp|E|nhydriodon|dikikae}} †{{sp|E|nhydriodon|ekecaman}} †{{sp|E|nhydriodon|falconeri}} †{{sp|E|nhydriodon|hendeyi}} †{{sp|E|nhydriodon|kamuhangirei}} †{{sp|E|nhydriodon|latipes}} †{{sp|E|nhydriodon|omoensis}} †{{sp|E|nhydriodon|sivalensis}} †{{splast|E|nhydriodon|soriae}} =={{int:Name}}== ''Enhydriodon'' {{a|Hugh Falconer|Falconer}}, 1868 * {{int:Type species}}: ''Enhydriodon sivalensis'' {{aut|Falconer}}, 1868 =={{int:References}}== ==={{int:Primary references}}=== {{Falconer, 1868}} [[Category:Hugh Falconer taxa]] 6b54ptksm2nnsm3veslvu0b282pzlmr Sardolutra 0 2216959 11322280 10877130 2026-10-21T19:51:23Z The editor 2345 2915305 11322280 wikitext text/x-wiki {{Image|D2740 Sardolutra.jpg}} =={{int:Taxonavigation}}== {{Sardolutra}} Species (1): †{{splast|S|ardolutra|ichnusae}} =={{int:Name}}== ''Sardolutra'' {{a|Gerard Willemsen|Willemsen}}, 1992 * {{int:Type species}}: ''Nesolutra ichnusae'' {{aut|Malatesta}}, 1977. =={{int:References}}== ==={{int:Primary references}}=== {{Willemsen, 1992}} [[Category:Gerard Willemsen taxa]] 4v1uywa5soiuc2qs3467hm3y006javy Maremmia 0 2224411 11322551 10991486 2026-10-22T03:34:31Z The editor 2345 2915305 11322551 wikitext text/x-wiki {{Image|Maremmia haupti 1.JPG|''Maremmia haupti''}} =={{int:Taxonavigation}}== {{Maremmia}} Species (2): †{{sp|M|aremmia|haupti}} †{{splast|M|aremmia|lorenzi}} =={{int:Name}}== ''Maremmia'' {{a|Johannes Hürzeler|Hürzeler}}, 1983 * Type species: ''Maremmia lorenzi'' {{aut|Hürzeler}}, 1983 =={{int:References}}== ==={{int:Primary references}}=== {{Hürzeler, 1983}} [[Catgeory:Johannes Hürzeler taxa]] k60fj31topkxditqvajes5nr8v31afo 11322556 11322551 2026-10-22T03:35:05Z The editor 2345 2915305 11322556 wikitext text/x-wiki {{Image|Maremmia haupti 1.JPG|''Maremmia haupti''}} =={{int:Taxonavigation}}== {{Maremmia}} Species (2): †{{sp|M|aremmia|haupti}} †{{splast|M|aremmia|lorenzi}} =={{int:Name}}== ''Maremmia'' {{a|Johannes Hürzeler|Hürzeler}}, 1983 * Type species: ''Maremmia lorenzi'' {{aut|Hürzeler}}, 1983 =={{int:References}}== ==={{int:Primary references}}=== {{Hürzeler, 1983}} [[Category:Johannes Hürzeler taxa]] de8sps9oracz6fiq3scnk0dxi763qor Nisidorcas 0 2227072 11322525 10910125 2026-10-22T03:24:41Z The editor 2345 2915305 11322525 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Nisidorcas}} Species (1): †{{splast|N|isidorcas|planicornis}} =={{int:Name}}== ''Nisidorcas'' {{a|Geneviève Bouvrain|Bouvrain}}, 1979 * {{int:Type species}}: ''Antilope planicornis'' {{aut|Pilgrim}}, 1939. =={{int:References}}== ==={{int:Primary references}}=== {{Bouvrain, 1979}} [[Category:Geneviève Bouvrain taxa]] 9dkdlhb21suxyw1jj9besxz061uyj94 Mesembriacerus 0 2227081 11322523 10910144 2026-10-22T03:22:34Z The editor 2345 2915305 11322523 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mesembriacerus}} Species (1): †{{splast|M|esembriacerus|melentisi}} =={{int:Name}}== ''Mesembriacerus'' {{a|Geneviève Bouvrain|Bouvrain}}, 1975 =={{int:References}}== ==={{int:Primary references}}=== {{Bouvrain, 1975}} [[Category:Geneviève Bouvrain taxa]] nisk1p04rnl8kjofn2qrlgm6001uj13 Mesembriacerus melentisi 0 2227083 11322524 10910146 2026-10-22T03:22:44Z The editor 2345 2915305 11322524 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mesembriacerus}} Species: †''[[Mesembriacerus melentisi]]'' =={{int:Name}}== ''Mesembriacerus melentisi'' {{a|Geneviève Bouvrain|Bouvrain}}, 1975 =={{int:References}}== ==={{int:Primary references}}=== {{Bouvrain, 1975}} [[Category:Geneviève Bouvrain taxa]] 54he1iu26dxats2mv8w18fa7orty8k9 Dorcadoxa 0 2227379 11322539 10911017 2026-10-22T03:29:57Z The editor 2345 2915305 11322539 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Dorcadoxa}} Species (1): †{{splast|D|orcadoxa|porrecticornis}} =={{int:Name}}== ''Dorcadoxa'' {{a|Guy Ellcock Pilgrim|Pilgrim}}, 1939 =={{int:References}}== ==={{int:Primary references}}=== {{Pilgrim, 1939}} [[Category:Guy Ellcock Pilgrim taxa]] kcs0yekehljbrwsypzjwznbaqasymnf 11322541 11322539 2026-10-22T03:30:55Z The editor 2345 2915305 11322541 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Dorcadoxa}} Species (1): †{{splast|D|orcadoxa|porrecticornis}} =={{int:Name}}== ''Dorcadoxa'' {{a|Guy Ellcock Pilgrim|Pilgrim}}, 1939 * {{int:Type species}}: ''Antilope porrecticornis'' {{aut|Lydekker}}, 1878. =={{int:References}}== ==={{int:Primary references}}=== {{Pilgrim, 1939}} [[Category:Guy Ellcock Pilgrim taxa]] 9kuawtzcmhfrl7uv69h4bk86vffvn21 Kobikeryx 0 2227381 11322531 10911020 2026-10-22T03:28:17Z The editor 2345 2915305 11322531 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Kobikeryx}} Species (1): †{{splast|K|obikeryx|atavus}} =={{int:Name}}== ''Kobikeryx'' {{a|Guy Ellcock Pilgrim|Pilgrim}}, 1939 =={{int:References}}== ==={{int:Primary references}}=== {{Pilgrim, 1939}} [[Category:Guy Ellcock Pilgrim taxa]] 0wsgavo7v3bvoexlywhul4bd9rg0v5m Kobikeryx atavus 0 2227383 11322532 10911022 2026-10-22T03:28:24Z The editor 2345 2915305 11322532 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Kobikeryx}} Species: †''[[Kobikeryx atavus]]'' =={{int:Name}}== ''Kobikeryx atavus'' {{a|Guy Ellcock Pilgrim|Pilgrim}}, 1939 =={{int:References}}== ==={{int:Primary references}}=== {{Pilgrim, 1939}} [[Category:Guy Ellcock Pilgrim taxa]] rg6iijg0xqqv0iod3yvvd2h49rl2cs4 Neotragocerus 0 2227432 11322603 10979522 2026-10-22T05:14:18Z The editor 2345 2915305 11322603 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Neotragocerus}} Species (1): †{{splast|N|eotragocerus|improvisus}} =={{int:Name}}== ''Neotragocerus'' {{a|William Diller Matthew|Matthew}} & {{a|Harold James Cook|Cook}}, 1909 =={{int:References}}== ==={{int:Primary references}}=== {{Matthew & Cook, 1909}} [[Category:William Diller Matthew taxa]] [[Category:Harold James Cook taxa]] 1ohfjyk35l4dhm72mzses77dj2rwtff Neotragocerus improvisus 0 2227434 11322604 10979404 2026-10-22T05:14:26Z The editor 2345 2915305 11322604 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Neotragocerus}} Species: †''[[Neotragocerus improvisus]]'' =={{int:Name}}== ''Neotragocerus improvisus'' {{a|William Diller Matthew|Matthew}} & {{a|Harold James Cook|Cook}}, 1909 =={{int:References}}== ==={{int:Primary references}}=== {{Matthew & Cook, 1909}} [[Category:William Diller Matthew taxa]] [[Category:Harold James Cook taxa]] fu2p6b4s3r06re1k4jh9vp4xd6tcxsm Procamptoceras 0 2227439 11322605 10979379 2026-10-22T05:15:00Z The editor 2345 2915305 11322605 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Procamptoceras}} Species (1): †{{splast|P|rocamptoceras|brivatense}} =={{int:Name}}== ''Procamptoceras'' {{a|Samuel Schaub|Schaub}}, 1923 =={{int:References}}== ==={{int:Primary references}}=== {{Schaub, 1923}} [[Category:Samuel Schaub taxa]] 83u8dx7dfraw5cv58g3kms0s840eq33 Procamptoceras brivatense 0 2227441 11322606 10979408 2026-10-22T05:15:10Z The editor 2345 2915305 11322606 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Procamptoceras}} Species: †''[[Procamptoceras brivatense]]'' =={{int:Name}}== ''Procamptoceras brivatense'' {{a|Samuel Schaub|Schaub}}, 1923 =={{int:References}}== ==={{int:Primary references}}=== {{Schaub, 1923}} [[Category:Samuel Schaub taxa]] n0mlb1nv96xeltikvpblyhnh74p6th9 Sporadotragus 0 2228142 11322521 10991287 2026-10-22T03:18:55Z The editor 2345 2915305 11322521 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Sporadotragus}} Species (2): †{{sp|S|poradotragus|parvidens}} †{{splast|S|poradotragus|vasili}} =={{int:Name}}== ''Sporadotragus'' {{a|Miklós Kretzoi|Kretzoi}}, 1968 * Type species: ''Palaeoryx parvidens'' {{aut|Gaudry}}, 1861 =={{int:References}}== ==={{int:Primary references}}=== {{Kretzoi, 1968}} [[Category:Miklós Kretzoi taxa]] jhdwkuhvuu3u0ipk50pjnqk80zqmf1h Megalotragus 0 2228157 11322546 10913862 2026-10-22T03:32:31Z The editor 2345 2915305 11322546 wikitext text/x-wiki {{Image|Megalotragus skull.jpg|''Megalotragus kattwinkeli''}} =={{int:Taxonavigation}}== {{Megalotragus}} Species (3): †{{sp|M|egalotragus|issaci}} †{{sp|M|egalotragus|kattwinkeli}} †{{splast|M|egalotragus|priscus}} =={{int:Name}}== ''Megalotragus'' {{a|Egbert Cornelis Nicolaas van Hoepen|van Hoepen}}, 1932 * Type species ''Megalotragus kattwinkeli'' {{aut|van Hoepen}}, 1932 =={{int:References}}== ==={{int:Primary references}}=== {{Van Hoepen, 1932}} [[Category:Egbert Cornelis Nicolaas van Hoepen taxa]] igxp9v3b830f1z83b79tqbljz4nbffo Megalotragus kattwinkeli 0 2228159 11322547 10913864 2026-10-22T03:32:45Z The editor 2345 2915305 11322547 wikitext text/x-wiki {{Image|Megalotragus kattwinkeli.JPG}} =={{int:Taxonavigation}}== {{Megalotragus}} Species: †''[[Megalotragus kattwinkeli]]'' =={{int:Name}}== ''Megalotragus kattwinkeli'' {{a|Egbert Cornelis Nicolaas van Hoepen|van Hoepen}}, 1932 =={{int:References}}== ==={{int:Primary references}}=== {{Van Hoepen, 1932}} [[Category:Egbert Cornelis Nicolaas van Hoepen taxa]] edtq0aytgx4quyn5wb341yetg1l7kxs Template:Neumoegen & Dyar, 1893a 10 2230009 11322206 10919411 2026-10-21T18:31:24Z FrankB157 2872707 11322206 wikitext text/x-wiki * {{a|Berthold Neumoegen|Neumoegen, B.}} & {{a|Harrison Gray Dyar|Dyar, H.G.}}, 1893. Notes on Lithosiidae and Arctiidae with descriptions of new varieties. [[ISSN 0013-872X|''Entomological News'']] 4(4): {{BHL|page/24655700|138–143}} <includeonly>[[Template:Neumoegen & Dyar, 1893a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> jgtl4osy5818ec3thn98awjju9jx2f2 Wellsiana 0 2231690 11322543 10979412 2026-10-22T03:31:32Z The editor 2345 2915305 11322543 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Wellsiana}} Species (1): †{{splast|W|ellsiana|torticornuta}} =={{int:Name}}== ''Wellsiana'' {{a|Elisabeth S. Vrba|Vrba}}, 1987 =={{int:References}}== ==={{int:Primary references}}=== {{Vrba, 1987}} [[Category:Elisabeth S. Vrba taxa]] m71yxfg6iad8055zm4dvw15crhet77i Wellsiana torticornuta 0 2231692 11322544 10979391 2026-10-22T03:31:39Z The editor 2345 2915305 11322544 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Wellsiana}} Species: †''[[Wellsiana torticornuta]]'' =={{int:Name}}== ''Wellsiana torticornuta'' {{a|Elisabeth S. Vrba|Vrba}}, 1987 =={{int:References}}== ==={{int:Primary references}}=== {{Vrba, 1987}} [[Category:Elisabeth S. Vrba taxa]] 97m6to391608a7bi65klxzsh52gr5f8 Zephyreduncinus 0 2231704 11322537 10979396 2026-10-22T03:29:31Z The editor 2345 2915305 11322537 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Zephyreduncinus}} Species (1): †{{splast|Z|ephyreduncinus|oundagaisus}} =={{int:Name}}== ''Zephyreduncinus'' {{a|Elisabeth S. Vrba|Vrba}} & {{a|Yohannes Haile-Selassie|Haile-Selassie}}, 2006 =={{int:References}}== ==={{int:Primary references}}=== {{Vrba & Haile-Selassie, 2006}} [[Category:Elisabeth S. Vrba taxa]] [[Category:Yohannes Haile-Selassie taxa]] hsqcvy75coakq08pt8p4wa47thon187 Zephyreduncinus oundagaisus 0 2231707 11322538 10979438 2026-10-22T03:29:38Z The editor 2345 2915305 11322538 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Zephyreduncinus}} Species: †''[[Zephyreduncinus oundagaisus]]'' =={{int:Name}}== ''Zephyreduncinus oundagaisus'' {{a|Elisabeth S. Vrba|Vrba}} & {{a|Yohannes Haile-Selassie|Haile-Selassie}}, 2006 =={{int:References}}== ==={{int:Primary references}}=== {{Vrba & Haile-Selassie, 2006}} [[Category:Elisabeth S. Vrba taxa]] [[Category:Yohannes Haile-Selassie taxa]] fj8lj7vmzw1yjwa1qempswmqwsta56u Sinoreas 0 2232384 11322526 10979508 2026-10-22T03:25:39Z The editor 2345 2915305 11322526 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Sinoreas}} Species (1): †{{splast|S|inoreas|cornucopia}} =={{int:Name}}== ''Sinoreas'' {{a|Pierre Teilhard de Chardin|Teilhard de Chardin}} & {{a|Maurice Trassaert|Trassaert}}, 1938 =={{int:References}}== ==={{int:Primary references}}=== {{Teilhard & Trassaert, 1938}} [[Category:Pierre Teilhard de Chardin taxa]] [[Category:Maurice Trassaert taxa]] rwom7jptowu06awj0ctmcy9oql28z0e Sinoreas cornucopia 0 2232386 11322527 10979502 2026-10-22T03:25:46Z The editor 2345 2915305 11322527 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Sinoreas}} Species: †''[[Sinoreas cornucopia]]'' =={{int:Name}}== ''Sinoreas cornucopia'' {{a|Pierre Teilhard de Chardin|Teilhard de Chardin}} & {{a|Maurice Trassaert|Trassaert}}, 1938 =={{int:References}}== ==={{int:Primary references}}=== {{Teilhard & Trassaert, 1938}} [[Category:Pierre Teilhard de Chardin taxa]] [[Category:Maurice Trassaert taxa]] b9fb9fwt4aymq7mt8br4lvezj1047mz Menelikia lyrocera 0 2233245 11322535 10933394 2026-10-22T03:28:58Z The editor 2345 2915305 11322535 wikitext text/x-wiki {{Image|Menelikia lyrocera.JPG}} =={{int:Taxonavigation}}== {{Menelikia}} Species: †''[[Menelikia lyrocera]]'' =={{int:Name}}== ''Menelikia lyrocera'' {{a|Camille Louis Joseph Arambourg|Arambourg}}, 1941 =={{int:References}}== ==={{int:Primary references}}=== {{Arambourg, 1941}} [[Category:Camille Louis Joseph Arambourg taxa]] esq1esxcsmyimxej200ye0dh4lyxz8z Maremmia lorenzi 0 2248846 11322552 10991487 2026-10-22T03:34:39Z The editor 2345 2915305 11322552 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Maremmia}} Species: †''[[Maremmia lorenzi]]'' =={{int:Name}}== ''Maremmia lorenzi'' {{a|Johannes Hürzeler|Hürzeler}}, 1983 =={{int:References}}== ==={{int:Primary references}}=== {{Hürzeler, 1983}} [[Catgeory:Johannes Hürzeler taxa]] rrqqcu9iymmp0c1m2cz1xsws5mllwh5 11322554 11322552 2026-10-22T03:34:55Z The editor 2345 2915305 11322554 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Maremmia}} Species: †''[[Maremmia lorenzi]]'' =={{int:Name}}== ''Maremmia lorenzi'' {{a|Johannes Hürzeler|Hürzeler}}, 1983 =={{int:References}}== ==={{int:Primary references}}=== {{Hürzeler, 1983}} [[Category:Johannes Hürzeler taxa]] oai9oycsryv63c3tg93wp1aa3h3ehqd Algarolutra 0 2251665 11322282 11002890 2026-10-21T19:52:58Z The editor 2345 2915305 11322282 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Algarolutra}} Species (1): †{{splast|A|lgarolutra|majori}} =={{int:Name}}== ''Algarolutra'' {{a|Alberto Malatesta|Malatesta}} & {{a|Gerard Willemsen|Willemsen}}, 1986 * {{int:Type species}}: ''Cyrnaonyx majori'' {{aut|Malatesta}}, 1978. =={{int:References}}== ==={{int:Primary references}}=== {{Malatesta & Willemsen, 1986}} [[Category:Alberto Malatesta taxa]] [[Category:Gerard Willemsen taxa]] l17ixtsnv1y9al7ruxokxqyty5usesh Matías Alberto Armella 0 2310949 11322240 11282469 2026-10-21T19:12:58Z Burmeister 9074 +1 11322240 wikitext text/x-wiki '''Matías Alberto Armella''', Argentine paleontologist. * Instituto Superior de Correlación Geológica (INSUGEO), Consejo Nacional de Investigaciones Científicas y Tecnológicas (CONICET). Avenida Presidente Perón S/N, 4107 Yerba Buena, Tucumán, Argentina. * Facultad de Ciencias Naturalese Instituto Miguel Lillo (IML), Universidad Nacional de Tucumán (UNT). Miguel Lillo 205, 4000 San Miguel de Tucumán, Tucumán, Argentina. * Facultad de Ciencias Exactas y Naturales (FaCEN), Universidad Nacional de Catamarca (UNCa). Belgrano 300, 4700San Fernando del Valle de Catamarca, Catamarca, Argentina. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2018=== {{Armella, García-López & Dominguez, 2018}} ===2025=== {{Armella et al., 2025}} ===2026=== {{Armella & Deforel, 2026}} {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Armella, Matias Alberto}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 2nuc97kgrhwsl2gafs4l3ex87v6ngw9 Template:Reig & Simpson, 1972 10 2323254 11322201 11284289 2026-10-21T18:27:25Z The editor 2345 2915305 /* */ 11322201 wikitext text/x-wiki * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} & {{a|George Gaylord Simpson|Simpson, G.G.}} 1972. ''Sparassocynus'' (Marsupialia, Didelphidae), a peculiar mammal from the late Cenozoic of Argentina. ''[[ISSN 0952-8369|Journal of Zoology]]'' 167(4): 511–539. {{doi|10.1111/j.1469-7998.1972.tb01742.x}} <includeonly>[[Template:Reig & Simpson, 1972|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> alkz89fbfso9z9z2h0p0aa47evolg14 Vanesa Serrudo 0 2323563 11322249 11285248 2026-10-21T19:19:22Z Burmeister 9074 +1 11322249 wikitext text/x-wiki '''Vanesa Serrudo''', Bolivian paleontologist. * Departamento de Paleontología, Museo Nacional de Historia Natural de Bolivia, Calle 26 s/n, Cota Cota, La Paz, Estado Plurinacional de Bolivia. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Abello et al., 2026}} {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Serrudo, Vanesa}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] e6l6n020tay1zzpyh2wv6e6ujwmf9kj Tortula reflexa 0 2333699 11322830 11315019 2026-10-22T09:15:56Z MILEPRI 924668 Removed redirect to [[Geheebia ferruginea]] 11322830 wikitext text/x-wiki #''Tortula reflexa'' Brid. = ''[[Geheebia ferruginea]]'' (Schimp. ex Besch.) R.H. Zander #''Tortula reflexa'' X.J. Li = ''[[Syntrichia ruralis]]'' (Hedw.) F. Weber & D. Mohr {{disambig}} exblgm1s58zjxe0pgdiwb14k2gowhmv Template:García-Mendoza et al., 2023 10 2335740 11322464 11320257 2026-10-21T22:54:43Z RLJ 134478 11322464 wikitext text/x-wiki * {{García-Mend.}}, {{a|Emmanuel Pérez-Calix|Pérez-Calix}} & {{a|Daniel Sandoval-Gutiérrez|D.Sandoval}} 2023. ''Graptopetalum irmasoniae'' (Crassulaceae), una especie nueva de Oaxaca, México, y lectotipificación de ''G. macdougallii''. [[ISSN 0187-7151|''Acta Botanica Mexicana'']] 130(e2253): 1–14. {{doi|10.21829/abm130.2023.2253}} {{Access|open}}<includeonly>[[Template:García-Mendoza et al., 2023|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]] =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum irmasoniae]]'' [[Category:Reference templates]]</noinclude> ogvuqgcfgretd0jegeazucalq5egcug 11322465 11322464 2026-10-21T22:55:46Z RLJ 134478 11322465 wikitext text/x-wiki * {{García-Mend.}}, {{a|Emmanuel Pérez-Calix|Pérez-Calix, E.}} & {{a|Daniel Sandoval-Gutiérrez|Sandoval-Gutiérrez, D.}} 2023. ''Graptopetalum irmasoniae'' (Crassulaceae), una especie nueva de Oaxaca, México, y lectotipificación de ''G. macdougallii''. [[ISSN 0187-7151|''Acta Botanica Mexicana'']] 130(e2253): 1–14. {{doi|10.21829/abm130.2023.2253}} {{Access|open}}<includeonly>[[Template:García-Mendoza et al., 2023|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]] =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum irmasoniae]]'' [[Category:Reference templates]]</noinclude> hsr2t5j4gp9fh3o11zjnpm34bgthc1b 11322466 11322465 2026-10-21T22:57:10Z RLJ 134478 11322466 wikitext text/x-wiki * {{García-Mend.}}, {{a|Emmanuel Pérez-Calix|Pérez-Calix, E.}} & {{a|Daniel Sandoval-Gutiérrez|Sandoval-Gutiérrez, D.}} 2023. ''Graptopetalum irmasoniae'' (Crassulaceae), una especie nueva de Oaxaca, México, y lectotipificación de ''G. macdougallii''. [[ISSN 0187-7151|''Acta Botanica Mexicana'']] 130(e2253): 1–14. {{doi|10.21829/abm130.2023.2253}} {{Access|open}} <includeonly>[[Template:García-Mendoza et al., 2023|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]] =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum irmasoniae]]'' [[Category:Reference templates]]</noinclude> gamsl9b2xt9nl8smspx7ki86ijzem49 Graptopetalum irmasoniae 0 2335743 11322467 11321196 2026-10-21T22:58:37Z RLJ 134478 11322467 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Graptopetalum ser. Stolonifera}} Species: ''[[Graptopetalum irmasoniae]]'' =={{int:Name}}== ''Graptopetalum irmasoniae'' {{a|Abisai Josue García-Mendoza|García-Mend.|cat=si}}, {{a|Emmanuel Pérez-Calix|Pérez-Calix|cat=si}} & {{a|Daniel Sandoval-Gutiérrez|D.Sandoval|cat=si}}, Acta Bot. Mex. 130(e2253): 3 (2023). {{nadi| * '''Continental: Northern America''' ** '''Regional: Mexico''' *** Mexico Southwest (Oaxaca). }} =={{int:References}}== ==={{int:Primary references}}=== {{García-Mendoza et al., 2023}} ==={{int:Links}}=== {{Catol-Hassler|2026|Oct|19}} {{IPNI||2026|Oct 19}} {{POWO|2026|Oct|19}} {{MBG|2026|Oct|19}} {{Taxonbar|from=Q141780351}} [[Category:Eponyms of Irma Sonia Franco Martínez]] 96jg1uw8xlej5jwjylfmzzqsgseusw4 Rui Zhang (mycologist) 0 2335858 11321995 11320579 2026-10-21T13:29:54Z Lichenes 716444 /* {{int:Publications}} */ 11321995 wikitext text/x-wiki '''Rui Zhang''' ([[fl.]] 2016), Chinese mycologist. {{IPNI standard form}} Address (2022): :Guangdong Provincial Key Laboratory for Plant Epigenetics, :Longhua Bioindustry and Innovation Research Institute, :College of Life Sciences and Oceanography, :Shenzhen University, Shenzhen, People's Republic of China :Key Laboratory of Optoelectronic Devices and Systems of Ministry of Education and Guangdong Province, :College of Optoelectronic Engineering, :Shenzhen University, Shenzhen, People's Republic of China :Program in Plant Biology and Conservation, :Northwestern University, Evanston, IL, United States :Key Laboratory of Biodiversity and Biogeography, :Kunming Institute of Botany, :Chinese Academy of Sciences, Kunming, People's Republic of China :Plant Conservation Science, :Chicago Botanic Garden, Glencoe, IL, United States {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Zhang, Rui}} [[Category:Taxon authorities]] [[Category:Mycologists]] 159xso7nq6l3io45tw1nb0tsgh9xsop Cantharellus chicagoensis 0 2335879 11322380 11320626 2026-10-21T21:27:04Z Lichenes 716444 /* {{int:References}} */ 11322380 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Cantharellus (Cantharellaceae)}} Species: ''[[Cantharellus chicagoensis]]'' =={{int:Name}}== ''Cantharellus chicagoensis'' {{a|Patrick R. Leacock|Leacock}}, {{a|Jill Riddell|J.Riddell}}, {{a|Rui Zhang (mycologist)|Rui Zhang}} & {{a|Gregory Michael Mueller|G.M.Muell.}} in {{a|Patrick R. Leacock|Leacock}} et al., ''Mycologia'' 108(4): 767 (2016). [MycoBank #812608] :'''Typification Details:''' Holotype F C0201027F :'''Host-Substratum/Locality:''' In woodland dominated by ''[[Quercus]]'': Illinois, U.S.A. =={{int:References}}== {{Leacock et al., 2016a}} ==={{int:Links}}=== * {{IndF|812608}} * {{MycoBank|812608}} =={{int:Vernacular names}}== [[Category:Patrick R. Leacock taxa]] [[Category:Jill Riddell taxa]] [[Category:Rui Zhang (mycologist) taxa]] [[Category:Gregory Michael Mueller taxa]] gb8i77dqc2wb6l3f3ne37l3bauuqjks Tortula bullata 0 2336053 11322827 11320979 2026-10-22T09:10:41Z MILEPRI 924668 Removed redirect to [[Stegonia latifolia]] 11322827 wikitext text/x-wiki *''Tortula bullata'' (Sommerf.) Lindb. = ''[[Stegonia latifolia]]'' (Schwägr.) Venturi ex Broth. *''Tortula bullata'' Herzog = ''[[Syntrichia ruralis]]'' (Hedw.) F. Weber & D. Mohr {{disambig}} 59ztbb59styrvu0rg17kypa4acrmnpx Anuromyzus acantholimonis 0 2336163 11323006 11321285 2026-10-22T10:49:28Z Hiouf 2107144 11323006 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Macrosiphini}} Genus: ''[[Anuromyzus]]'' Species: ''[[Anuromyzus acantholimonis]]'' =={{int:Name}}== ''Anuromyzus acantholimonis'' {{aut|Kök}}, {{a|Shalva Barjadze|Barjadze}} & {{a|Andrey Valerievich Stekolshchikov|Stekolshchikov}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Kök, Barjadze & Stekolshchikov, 2026}} {{Taxonbar|from=Q141795632}} [[Category:New species 2026]] [[Category:Shalva Barjadze taxa]] [[Category:Andrey Valerievich Stekolshchikov taxa]] cgipwudlaug1hgppkk9mbhva3igp5hn 11323007 11323006 2026-10-22T10:49:45Z Hiouf 2107144 11323007 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Macrosiphini}} Genus: {{gbr|Anuromyzus}} Species: ''[[Anuromyzus acantholimonis]]'' =={{int:Name}}== ''Anuromyzus acantholimonis'' {{aut|Kök}}, {{a|Shalva Barjadze|Barjadze}} & {{a|Andrey Valerievich Stekolshchikov|Stekolshchikov}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Kök, Barjadze & Stekolshchikov, 2026}} {{Taxonbar|from=Q141795632}} [[Category:New species 2026]] [[Category:Shalva Barjadze taxa]] [[Category:Andrey Valerievich Stekolshchikov taxa]] cfd6rfpoajmudw0d904q11cfnr15lz9 Template:Glaw & Vences, 1992 10 2336173 11322403 11321451 2026-10-21T22:01:14Z Burmeister 9074 typo 11322403 wikitext text/x-wiki * {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 1992. ''A fieldguide to the amphibians and reptiles of Madagascar''. Vences & Glaw Verlag: Köln. 331 pp. {{ISBN|978-3929449006}} <includeonly>[[Template:Glaw & Vences, 1992|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 1992 ==={{int:New names}} (5)=== * ''[[Mantidactylus cornutus]]'' [p. 272] * ''[[Anodonthyla nigrigularis]]'' [p. 273] * ''[[Boophis boehmei]]'' [p. 273] * ''[[Stumpffia gimmeli]]'' [p. 273] * ''[[Platypelis occultans]]'' [p. 274] [[Category:Reference templates]]</noinclude> knc0afo0sedo5zdx7x3i55v5qi14pb6 Beatriz Azanza 0 2336256 11322585 11321760 2026-10-22T03:53:36Z The editor 2345 2915305 11322585 wikitext text/x-wiki {{image}} '''Beatriz Azanza Asensio''', Spanish paleontologist. * Departamento de Ciencias de la Tierra, and Instituto Universitario de Investigación en Ciencias Ambientales de Aragón (IUCA), Universidad de Zaragoza, 50009, Zaragoza, Spain. {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{inc}} ===2022=== {{Valenciano et al., 2022}} {{Authority control}} {{DEFAULTSORT:Azanza, Beatriz}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] qf2njsbxumpnghn1h9xxassf8hba0rp Tegenaria baronii 0 2336405 11321984 2026-10-21T12:00:50Z PeterR 7354 new species after original bulletin 11321984 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Tegenaria}} Species: ''[[Tegenaria baronii]]'' =={{int:Name}}== ''Tegenaria baronii'' {{a|Paolo Marcello Brignoli|Brignoli}}, 1977: 48 Type locality: Italy, Marche, Grotta di Frasassi, Fabriano. Holotype: [[MCSNB]]. female ♀. IX.1964. legit C. Baroni Urbani. =={{int:References}}== ==={{int:Primary references}}=== {{Brignoli, 1977f}} [[Category:MCSNB]] [[Category:Paolo Marcello Brignoli taxa]] 7m1ivj3d949manbtll697c79wncv4u3 Eratigena vomeroi 0 2336406 11321985 2026-10-21T12:09:06Z PeterR 7354 new species after original bulletin 11321985 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Eratigena}} Species: ''[[Eratigena vomeroi]]'' =={{int:Name}}== ''Eratigena vomeroi'' ({{a|Paolo Marcello Brignoli|Brignoli}}, 1977) Type locality: Italy, Lueania - PZ - Grotta del Cervaro, Lagonegro. Holotype: [[MCSNB]]. male ♂. 09.XII.1966. legit V. Sbordoni. ==={{int:Synonymy}}=== * ''[[Tegenaria vomeroi]]'' {{a|Paolo Marcello Brignoli|Brignoli}}, 1977: 50 (original combination) * ''Malthonica vomeroi'' Brignoli - Guseinov, Marusik & Koponen, 2005: 164 * ''Eratigena vomeroi'' Brignoli - Bolzern, Burckhardt & Hänggi, 2013: 773 =={{int:References}}== ==={{int:Primary references}}=== {{Brignoli, 1977f}} [[Category:MCSNB]] [[Category:Paolo Marcello Brignoli taxa]] 1e8e6n4sm4h0xty2gqhbdipatnp3fkm 11321986 11321985 2026-10-21T12:09:21Z PeterR 7354 11321986 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Eratigena}} Species: ''[[Eratigena vomeroi]]'' =={{int:Name}}== ''Eratigena vomeroi'' ({{a|Paolo Marcello Brignoli|Brignoli}}, 1977) Type locality: Italy, Lueania - PZ - Grotta del Cervaro, Lagonegro. Holotype: [[MCSNB]]. male ♂. 09.XII.1966. legit V. Sbordoni. ==={{int:Synonymy}}=== * ''[[Tegenaria vomeroi]]'' {{a|Paolo Marcello Brignoli|Brignoli}}, 1977: 50 (original combination) * ''Malthonica vomeroi'' Brignoli - Guseinov, Marusik & Koponen, 2005: 164 * ''Eratigena vomeroi'' Brignoli - Bolzern, Burckhardt & Hänggi, 2013: 773 =={{int:References}}== ==={{int:Primary references}}=== {{Brignoli, 1977f}} jrdhzsl2pmy2hjljyjm62nw7yieckun Tegenaria vomeroi 0 2336407 11321987 2026-10-21T12:10:03Z PeterR 7354 Redirected page to [[Eratigena vomeroi]] 11321987 wikitext text/x-wiki #REDIRECT: [[Eratigena vomeroi]] [[Category:MCSNB]] [[Category:Paolo Marcello Brignoli taxa]] gn52o3twgkvpnsc2uf84fnys6ijz4ct Tegenaria capolongoi 0 2336408 11321988 2026-10-21T12:14:10Z PeterR 7354 new species after original bulletin 11321988 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Tegenaria}} Species: ''[[Tegenaria capolongoi]]'' =={{int:Name}}== ''Tegenaria capolongoi'' {{a|Paolo Marcello Brignoli|Brignoli}}, 1977: 51 Type locality: Italy, Campania - Grottieella vesuviana presso S. Sebastiano al Vesuvio. Holotype: [[MCSNB]]. female ♀. 19.III.1973. legit Capolongo & Cantilena. =={{int:References}}== ==={{int:Primary references}}=== {{Brignoli, 1977f}} [[Category:MCSNB]] [[Category:Paolo Marcello Brignoli taxa]] 3f4ddkjeguib6e1427vn0cdp95cy7up Hahnia maginii 0 2336409 11321989 2026-10-21T12:18:04Z PeterR 7354 new species after original bulletin 11321989 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Hahnia}} Species: ''[[Hahnia maginii]]'' =={{int:Name}}== ''Hahnia maginii'' {{a|Paolo Marcello Brignoli|Brignoli}}, 1977: 78 Type locality: Italy, Toscana - FI . Yetta alle Croci. Holotype: [[MCSNB]]. female ♀. 07.I.1973. legit F. Magini. =={{int:References}}== ==={{int:Primary references}}=== {{Brignoli, 1977f}} [[Category:MCSNB]] [[Category:Paolo Marcello Brignoli taxa]] tpayn793lbq83xkytra1pmcediohgpf Hahnia rossii 0 2336410 11321990 2026-10-21T12:20:10Z PeterR 7354 new species after original bulletin 11321990 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Hahnia}} Species: ''[[Hahnia rossii]]'' =={{int:Name}}== ''Hahnia rossii'' {{a|Paolo Marcello Brignoli|Brignoli}}, 1977: 79 Type locality: Italy, Marche . AN· grotta del Fiume. Holotype: [[MCSNB]]. female ♀. 10.VI.1972. legit W. Rossi. =={{int:References}}== ==={{int:Primary references}}=== {{Brignoli, 1977f}} [[Category:MCSNB]] [[Category:Paolo Marcello Brignoli taxa]] c1epajwi7dmoov7srirsh1ij2c9k71e Template:Leacock et al., 2016a 10 2336412 11321993 2026-10-21T13:19:33Z Lichenes 716444 Created page with "* {{a|Patrick R. Leacock|Leacock, P.R.}}, {{a|Jill Riddell|Riddell, J.}}, {{a|Andrew W. Wilson|Wilson, A.W.}}, {{a|Rui Zhang (mycologist)|Zhang, R.}}, {{a|Chen Ning|Ning, C.}} & {{a|Gregory Michael Mueller|Mueller, G.M.}} 2016. ''Cantharellus chicagoensis'' sp. nov. is supported by molecular and morphological analysis as a new yellow chanterelle in midwestern United States. [[ISSN 0027-5514|''Mycologia'']] 108(4): 765–772. {{doi|10.3852/15-230}} {{access|closed}}. {{Re..." 11321993 wikitext text/x-wiki * {{a|Patrick R. Leacock|Leacock, P.R.}}, {{a|Jill Riddell|Riddell, J.}}, {{a|Andrew W. Wilson|Wilson, A.W.}}, {{a|Rui Zhang (mycologist)|Zhang, R.}}, {{a|Chen Ning|Ning, C.}} & {{a|Gregory Michael Mueller|Mueller, G.M.}} 2016. ''Cantharellus chicagoensis'' sp. nov. is supported by molecular and morphological analysis as a new yellow chanterelle in midwestern United States. [[ISSN 0027-5514|''Mycologia'']] 108(4): 765–772. {{doi|10.3852/15-230}} {{access|closed}}. {{ResGate|302271010}} {{access|open}}. <includeonly>[[Template:Leacock et al., 2016a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> 1e8javgnioyvg6ov5q8p3kqvdlnjt40 Grateloupia dichotoma f. nana 0 2336413 11321997 2026-10-21T13:50:43Z Thiotrix 61739 Redirected page to [[Dermocorynus dichotomus]] 11321997 wikitext text/x-wiki #REDIRECT [[Dermocorynus dichotomus]] ngh6cg3agqnixssq905c8ig1lbdntg4 11321999 11321997 2026-10-21T13:51:17Z Thiotrix 61739 added [[Category:Francesco Ardissone taxa]] using [[Help:Gadget-HotCat|HotCat]] 11321999 wikitext text/x-wiki #REDIRECT [[Dermocorynus dichotomus]] [[Category:Francesco Ardissone taxa]] 5mew74kb96zx8o2rrk1el2nppbq1t05 Grateloupia dichotoma f. repens 0 2336414 11321998 2026-10-21T13:50:43Z Thiotrix 61739 Redirected page to [[Dermocorynus dichotomus]] 11321998 wikitext text/x-wiki #REDIRECT [[Dermocorynus dichotomus]] ngh6cg3agqnixssq905c8ig1lbdntg4 11322000 11321998 2026-10-21T13:51:24Z Thiotrix 61739 added [[Category:Francesco Ardissone taxa]] using [[Help:Gadget-HotCat|HotCat]] 11322000 wikitext text/x-wiki #REDIRECT [[Dermocorynus dichotomus]] [[Category:Francesco Ardissone taxa]] 5mew74kb96zx8o2rrk1el2nppbq1t05 Template:Glaw & Vences, 2007 10 2336415 11322003 2026-10-21T13:57:33Z Burmeister 9074 Created page with "* {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 2007. ''A Field Guide to the Amphibians and Reptiles of Madagascar''. 3rd edition. Vences & Glaw Verlag: Köln. 496 pp. {{ISBN|978-3929449037}}{{subst:ReftempZt}}" 11322003 wikitext text/x-wiki * {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 2007. ''A Field Guide to the Amphibians and Reptiles of Madagascar''. 3rd edition. Vences & Glaw Verlag: Köln. 496 pp. {{ISBN|978-3929449037}} <includeonly>[[Template:Glaw &#38; Vences, 2007|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> 3h6oc6qlbekm5u96h4z48imtzt47gmi 11322004 11322003 2026-10-21T13:58:43Z Burmeister 9074 +N.a. 11322004 wikitext text/x-wiki * {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 2007. ''A Field Guide to the Amphibians and Reptiles of Madagascar''. 3rd edition. Vences & Glaw Verlag: Köln. 496 pp. {{ISBN|978-3929449037}} <includeonly>[[Template:Glaw & Vences, 2007|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 2007 * {{int:No new names}} [[Category:Reference templates]]</noinclude> qflbtppxb1u4bwv3cy2x8li8xet4id5 Sadasivan 0 2336416 11322006 2026-10-21T14:04:08Z Sjl197 1805579 Redirected page to [[Kalesh Sadasivan]] 11322006 wikitext text/x-wiki #REDIRECT: [[Kalesh Sadasivan]] p00ya0y4u9nwihdb2dct26ioszvgznn Template:Schaus, 1914 10 2336417 11322011 2026-10-21T14:10:20Z FrankB157 2872707 New pub 11322011 wikitext text/x-wiki * {{a|William Schaus|Schaus, W.}} 1914. New species of Noctuid moths from tropical America. [[ISSN 0096-3801|''Proceedings of the United States National Museum'']] 46: 485–549. {{BHL|page/7705827}} <includeonly>[[Template:Schaus, 1914|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 29 January 1914 ==={{int:New names}} (145)=== * ''[[Angitia hermione]]'' * ''[[Angitia onerosa]]'' * ''[[Angitia orestes]]'' * ''[[Angitia thacia]]'' * ''[[Anorena]]'' * ''[[Anorena hyrtacides]]'' * ''[[Antarchaea polla]]'' * ''[[Apistis onerosa]]'' * ''[[Argyrostrotis eurysaces]]'' * ''[[Ateneria]]'' * ''[[Ateneria crinipuncta]]'' * ''[[Azatha pulchra]]'' * ''[[Baniana athamas]]'' * ''[[Baniana crucilla]]'' * ''[[Baniana gulussa]]'' * ''[[Baniana gyas]]'' * ''[[Baniana helle]]'' * ''[[Baniana herceus]]'' * ''[[Baniana nephele]]'' * ''[[Baniana phruxus]]'' * ''[[Baniana serpens]]'' * ''[[Bendis nigrilunata]]'' * ''[[Capnodes abas]]'' * ''[[Capnodes accumulata]]'' * ''[[Capnodes acron]]'' * ''[[Capnodes aeson]]'' * ''[[Capnodes anthea]]'' * ''[[Capnodes baccata]]'' * ''[[Capnodes barcas]]'' * ''[[Capnodes barine]]'' * ''[[Capnodes calais]]'' * ''[[Capnodes ceres]]'' * ''[[Capnodes deois]]'' * ''[[Capnodes gladysia]]'' * ''[[Capnodes hamilcar]]'' * ''[[Capnodes hannibal]]'' * ''[[Capnodes partita]]'' * ''[[Capnodes pelops]]'' * ''[[Capnodes phaedra]]'' * ''[[Capnodes tyroe]]'' * ''[[Ceromacra cebrenis]]'' * ''[[Chytonidia]]'' * ''[[Chytonidia chloristis]]'' * ''[[Chytonix chloe]]'' * ''[[Chytonix commixta]]'' * ''[[Chytonix pyrrha]]'' * ''[[Colodes]]'' * ''[[Colodes selecta]]'' * ''[[Corna oenone]]'' * ''[[Dagassa deucalion]]'' * ''[[Dagassa pyrrha]]'' * ''[[Elocussa fuscata]]'' * ''[[Encruphion]]'' * ''[[Encruphion phalereus]]'' * ''[[Encruphion porrima]]'' * ''[[Ensipia trilineata]]'' * ''[[Erebostrota albipicta]]'' * ''[[Eriopus orses]]'' * ''[[Eriopyga dromas]]'' * ''[[Erocha albifera]]'' * ''[[Erocha dipsas]]'' * ''[[Eromidia]]'' * ''[[Eromidia clotho]]'' * ''[[Eustrotia olenos]]'' * ''[[Focilla gradivus]]'' * ''[[Focilla masgaba]]'' * ''[[Glympis parvipuncta]]'' * ''[[Gonodes echion]]'' * ''[[Gonuris leonnatus]]'' * ''[[Heliocontia basipuncta]]'' * ''[[Herminodes albistriga]]'' * ''[[Herminodes hebes]]'' * ''[[Herminodes inculta]]'' * ''[[Herminodes longistriata]]'' * ''[[Herminodes parca]]'' * ''[[Herminodes pilosa]]'' * ''[[Herminodes regia]]'' * ''[[Herminodes umbrata]]'' * ''[[Leptoctenista crinipes]]'' * ''[[Leptoctenista funebris]]'' * ''[[Leptoctenista grandimacula]]'' * ''[[Leptoctenista hadenoides]]'' * ''[[Leptoctenista lignea]]'' * ''[[Leptoctenista malonia]]'' * ''[[Leptoctenista oreas]]'' * ''[[Lithacodia folium]]'' * ''[[Metalectra agriodos]]'' * ''[[Metalectra alcis]]'' * ''[[Metalectra astylos]]'' * ''[[Metalectra ceyx]]'' * ''[[Metalectra furva]]'' * ''[[Metalectra variata]]'' * ''[[Micromonodes excellens]]'' * ''[[Micromonodes leucosticta]]'' * ''[[Monodes isse]]'' * ''[[Monodes ixion]]'' * ''[[Monodes phlegyas]]'' * ''[[Mulelocha albibasalis]]'' * ''[[Mulelocha erebea]]'' * ''[[Nanamonodes trilineata]]'' * ''[[Neolita epicaste]]'' * ''[[Neoptodes]]'' * ''[[Neoptodes caicus]]'' * ''[[Neostrotia albescens]]'' * ''[[Oenoptera leda]]'' * ''[[Oenoptera rhea]]'' * ''[[Oroscopa belus]]'' * ''[[Orsa oculata]]'' * ''[[Orthogramma modesta]]'' * ''[[Oruza doto]]'' * ''[[Ostha cybele]]'' * ''[[Ostha oenopion]]'' * ''[[Ostha ofella]]'' * ''[[Ozarba angulilinea]]'' * ''[[Ozarba onytes]]'' * ''[[Pangrapta dilucida]]'' * ''[[Pangrapta subgeminata]]'' * ''[[Parangitia atys]]'' * ''[[Parangitia chlorosticta]]'' * ''[[Parangitia japyx]]'' * ''[[Perigea drusilla]]'' * ''[[Phobolosia admirabilis]]'' * ''[[Phobolosia atrifrons]]'' * ''[[Phuphena costata]]'' * ''[[Phuphena subvenata]]'' * ''[[Polygnamptia]]'' * ''[[Polygnamptia chloristicta]]'' * ''[[Pseudocraspedia ormenis]]'' * ''[[Sanys bebryx]]'' * ''[[Sanys pyrene]]'' * ''[[Sinosia]]'' * ''[[Sinosia inornata]]'' * ''[[Spodoptera evanida]]'' * ''[[Thermesia glycera]]'' * ''[[Thermesia ocresia]]'' * ''[[Triommatodes aberrans]]'' * ''[[Triommatodes agenor]]'' * ''[[Triommatodes belus]]'' * ''[[Triommatodes canidia]]'' * ''[[Triommatodes pygmalion]]'' * ''[[Triommatodes pylades]]'' * ''[[Trogoblemma lucens]]'' * ''[[Trogoblemma sericata]]'' * ''[[Ypsia exaggerata]]'' * ''[[Ypsia glycon]]'' [[Category:Reference templates]]</noinclude> 1oytv4qeyh6jyql0f3xuftv2os7on8w 11322013 11322011 2026-10-21T14:12:17Z FrankB157 2872707 11322013 wikitext text/x-wiki * {{a|William Schaus|Schaus, W.}} 1914. New species of Noctuid moths from tropical America. [[ISSN 0096-3801|''Proceedings of the United States National Museum'']] 46(2039): 485–549. {{BHL|page/7762006}} <includeonly>[[Template:Schaus, 1914|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 29 January 1914 ==={{int:New names}} (145)=== * ''[[Angitia hermione]]'' * ''[[Angitia onerosa]]'' * ''[[Angitia orestes]]'' * ''[[Angitia thacia]]'' * ''[[Anorena]]'' * ''[[Anorena hyrtacides]]'' * ''[[Antarchaea polla]]'' * ''[[Apistis onerosa]]'' * ''[[Argyrostrotis eurysaces]]'' * ''[[Ateneria]]'' * ''[[Ateneria crinipuncta]]'' * ''[[Azatha pulchra]]'' * ''[[Baniana athamas]]'' * ''[[Baniana crucilla]]'' * ''[[Baniana gulussa]]'' * ''[[Baniana gyas]]'' * ''[[Baniana helle]]'' * ''[[Baniana herceus]]'' * ''[[Baniana nephele]]'' * ''[[Baniana phruxus]]'' * ''[[Baniana serpens]]'' * ''[[Bendis nigrilunata]]'' * ''[[Capnodes abas]]'' * ''[[Capnodes accumulata]]'' * ''[[Capnodes acron]]'' * ''[[Capnodes aeson]]'' * ''[[Capnodes anthea]]'' * ''[[Capnodes baccata]]'' * ''[[Capnodes barcas]]'' * ''[[Capnodes barine]]'' * ''[[Capnodes calais]]'' * ''[[Capnodes ceres]]'' * ''[[Capnodes deois]]'' * ''[[Capnodes gladysia]]'' * ''[[Capnodes hamilcar]]'' * ''[[Capnodes hannibal]]'' * ''[[Capnodes partita]]'' * ''[[Capnodes pelops]]'' * ''[[Capnodes phaedra]]'' * ''[[Capnodes tyroe]]'' * ''[[Ceromacra cebrenis]]'' * ''[[Chytonidia]]'' * ''[[Chytonidia chloristis]]'' * ''[[Chytonix chloe]]'' * ''[[Chytonix commixta]]'' * ''[[Chytonix pyrrha]]'' * ''[[Colodes]]'' * ''[[Colodes selecta]]'' * ''[[Corna oenone]]'' * ''[[Dagassa deucalion]]'' * ''[[Dagassa pyrrha]]'' * ''[[Elocussa fuscata]]'' * ''[[Encruphion]]'' * ''[[Encruphion phalereus]]'' * ''[[Encruphion porrima]]'' * ''[[Ensipia trilineata]]'' * ''[[Erebostrota albipicta]]'' * ''[[Eriopus orses]]'' * ''[[Eriopyga dromas]]'' * ''[[Erocha albifera]]'' * ''[[Erocha dipsas]]'' * ''[[Eromidia]]'' * ''[[Eromidia clotho]]'' * ''[[Eustrotia olenos]]'' * ''[[Focilla gradivus]]'' * ''[[Focilla masgaba]]'' * ''[[Glympis parvipuncta]]'' * ''[[Gonodes echion]]'' * ''[[Gonuris leonnatus]]'' * ''[[Heliocontia basipuncta]]'' * ''[[Herminodes albistriga]]'' * ''[[Herminodes hebes]]'' * ''[[Herminodes inculta]]'' * ''[[Herminodes longistriata]]'' * ''[[Herminodes parca]]'' * ''[[Herminodes pilosa]]'' * ''[[Herminodes regia]]'' * ''[[Herminodes umbrata]]'' * ''[[Leptoctenista crinipes]]'' * ''[[Leptoctenista funebris]]'' * ''[[Leptoctenista grandimacula]]'' * ''[[Leptoctenista hadenoides]]'' * ''[[Leptoctenista lignea]]'' * ''[[Leptoctenista malonia]]'' * ''[[Leptoctenista oreas]]'' * ''[[Lithacodia folium]]'' * ''[[Metalectra agriodos]]'' * ''[[Metalectra alcis]]'' * ''[[Metalectra astylos]]'' * ''[[Metalectra ceyx]]'' * ''[[Metalectra furva]]'' * ''[[Metalectra variata]]'' * ''[[Micromonodes excellens]]'' * ''[[Micromonodes leucosticta]]'' * ''[[Monodes isse]]'' * ''[[Monodes ixion]]'' * ''[[Monodes phlegyas]]'' * ''[[Mulelocha albibasalis]]'' * ''[[Mulelocha erebea]]'' * ''[[Nanamonodes trilineata]]'' * ''[[Neolita epicaste]]'' * ''[[Neoptodes]]'' * ''[[Neoptodes caicus]]'' * ''[[Neostrotia albescens]]'' * ''[[Oenoptera leda]]'' * ''[[Oenoptera rhea]]'' * ''[[Oroscopa belus]]'' * ''[[Orsa oculata]]'' * ''[[Orthogramma modesta]]'' * ''[[Oruza doto]]'' * ''[[Ostha cybele]]'' * ''[[Ostha oenopion]]'' * ''[[Ostha ofella]]'' * ''[[Ozarba angulilinea]]'' * ''[[Ozarba onytes]]'' * ''[[Pangrapta dilucida]]'' * ''[[Pangrapta subgeminata]]'' * ''[[Parangitia atys]]'' * ''[[Parangitia chlorosticta]]'' * ''[[Parangitia japyx]]'' * ''[[Perigea drusilla]]'' * ''[[Phobolosia admirabilis]]'' * ''[[Phobolosia atrifrons]]'' * ''[[Phuphena costata]]'' * ''[[Phuphena subvenata]]'' * ''[[Polygnamptia]]'' * ''[[Polygnamptia chloristicta]]'' * ''[[Pseudocraspedia ormenis]]'' * ''[[Sanys bebryx]]'' * ''[[Sanys pyrene]]'' * ''[[Sinosia]]'' * ''[[Sinosia inornata]]'' * ''[[Spodoptera evanida]]'' * ''[[Thermesia glycera]]'' * ''[[Thermesia ocresia]]'' * ''[[Triommatodes aberrans]]'' * ''[[Triommatodes agenor]]'' * ''[[Triommatodes belus]]'' * ''[[Triommatodes canidia]]'' * ''[[Triommatodes pygmalion]]'' * ''[[Triommatodes pylades]]'' * ''[[Trogoblemma lucens]]'' * ''[[Trogoblemma sericata]]'' * ''[[Ypsia exaggerata]]'' * ''[[Ypsia glycon]]'' [[Category:Reference templates]]</noinclude> 9hzwvtvms1dlrqv4quuh8hyac05k2st Template:Densastromatidae 10 2336418 11322012 2026-10-21T14:12:13Z BashfulBenis22 2942367 Created page with "{{Actinostromatida}} Familia: †{{fbr|Densastromatidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322012 wikitext text/x-wiki {{Actinostromatida}} Familia: †{{fbr|Densastromatidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> o9cxot283qcb8eqqf7xih5t8jh6uknq Densastromatidae 0 2336419 11322018 2026-10-21T14:21:20Z BashfulBenis22 2942367 Created page with "=={{int:Taxonavigation}}== {{Densastromatidae}} Genera: †{{g|Acosmostroma}} †{{g|Araneosustroma}} †{{glast|Densastroma}} =={{int:Name}}== ''Densastromatidae'' {{aut|Bogoyavlenskaya}}, 1974 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Carl W. Stock|Stock, C. W.}} 2012. ''[[ISSN 2153-4012|Treatise Online]]'' no. 42: Part E, Revised, Volume 4, Chapter 16D: Actinostromatida. {{doi|10.17161/to.v0i0.4274}} {{Access|open}} ==={{int:Links}}=== * [https:/..." 11322018 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Densastromatidae}} Genera: †{{g|Acosmostroma}} †{{g|Araneosustroma}} †{{glast|Densastroma}} =={{int:Name}}== ''Densastromatidae'' {{aut|Bogoyavlenskaya}}, 1974 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Carl W. Stock|Stock, C. W.}} 2012. ''[[ISSN 2153-4012|Treatise Online]]'' no. 42: Part E, Revised, Volume 4, Chapter 16D: Actinostromatida. {{doi|10.17161/to.v0i0.4274}} {{Access|open}} ==={{int:Links}}=== * [https://paleobiodb.org/classic/checkTaxonInfo?taxon_no=108073&is_real_user=1 The Paleobiology Database] bchhdwl45wsjon7osmz73p8stm2hqup Template:Plumataliniidae 10 2336420 11322019 2026-10-21T14:24:02Z BashfulBenis22 2942367 Created page with "{{Actinostromatida}} Familia: †{{fbr|Plumataliniidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322019 wikitext text/x-wiki {{Actinostromatida}} Familia: †{{fbr|Plumataliniidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 7tie1mar7x99w9qr4zemup0hc61oomv Plumataliniidae 0 2336421 11322021 2026-10-21T14:31:38Z BashfulBenis22 2942367 Created page with "=={{int:Taxonavigation}}== {{Plumataliniidae}} Genera: †{{glast|Plumatalinia}} =={{int:Name}}== ''Plumataliniidae'' {{aut|Bogoyavlenskaya}}, 1969 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Carl W. Stock|Stock, C. W.}} 2012. ''[[ISSN 2153-4012|Treatise Online]]'' no. 42: Part E, Revised, Volume 4, Chapter 16D: Actinostromatida. {{doi|10.17161/to.v0i0.4274}} {{Access|open}} ==={{int:Links}}=== * [https://paleobiodb.org/classic/checkTaxonInfo?taxon_no..." 11322021 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Plumataliniidae}} Genera: †{{glast|Plumatalinia}} =={{int:Name}}== ''Plumataliniidae'' {{aut|Bogoyavlenskaya}}, 1969 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Carl W. Stock|Stock, C. W.}} 2012. ''[[ISSN 2153-4012|Treatise Online]]'' no. 42: Part E, Revised, Volume 4, Chapter 16D: Actinostromatida. {{doi|10.17161/to.v0i0.4274}} {{Access|open}} ==={{int:Links}}=== * [https://paleobiodb.org/classic/checkTaxonInfo?taxon_no=465524&is_real_user=1 The Paleobiology Database] mzkods0xrabos34pnmbbdhbvd2ngbtp Template:Pseudolabechiidae 10 2336422 11322022 2026-10-21T14:34:58Z BashfulBenis22 2942367 Created page with "{{Actinostromatida}} Familia: †{{fbr|Pseudolabechiidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322022 wikitext text/x-wiki {{Actinostromatida}} Familia: †{{fbr|Pseudolabechiidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> kuaph1vhncgn3r7xl8bdg530hh3l1c1 Pseudolabechiidae 0 2336423 11322024 2026-10-21T14:42:40Z BashfulBenis22 2942367 Created page with "=={{int:Taxonavigation}}== {{Pseudolabechiidae}} Genera: †{{g|Desmostroma}} †{{g|Pachystroma}} †{{g|Pseudolabechia}} †{{glast|Vikingia}} =={{int:Name}}== ''Pseudolabechiidae'' {{aut|Bogoyavlenskaya}}, 1969 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Carl W. Stock|Stock, C. W.}} 2012. ''[[ISSN 2153-4012|Treatise Online]]'' no. 42: Part E, Revised, Volume 4, Chapter 16D: Actinostromatida. {{doi|10.17161/to.v0i0.4274}} {{Access|open}} ==={{int:Li..." 11322024 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Pseudolabechiidae}} Genera: †{{g|Desmostroma}} †{{g|Pachystroma}} †{{g|Pseudolabechia}} †{{glast|Vikingia}} =={{int:Name}}== ''Pseudolabechiidae'' {{aut|Bogoyavlenskaya}}, 1969 =={{int:References}}== ==={{int:Primary references}}=== * {{a|Carl W. Stock|Stock, C. W.}} 2012. ''[[ISSN 2153-4012|Treatise Online]]'' no. 42: Part E, Revised, Volume 4, Chapter 16D: Actinostromatida. {{doi|10.17161/to.v0i0.4274}} {{Access|open}} ==={{int:Links}}=== * [https://paleobiodb.org/classic/checkTaxonInfo?taxon_no=108067&is_real_user=1 The Paleobiology Database] rrcgh2xncd9weaxr97xb5rohacwblxe Module:Cite/config 828 2336425 11322096 2025-04-06T18:24:10Z en>Trappist the monk 0 create; 11322096 Scribunto text/plain --[[--------------------------< E R R O R _ M E S S A G E S _ T >---------------------------------------------- ]] local error_messages_t = { missing = 'missing template name as first positional parameter', unknown = 'unknown template name: $1', -- $1 is value supplied as template name in first positional parameter } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { error_messages_t = error_messages_t, citation_classes_t = citation_classes_t, known_templates_t = known_templates_t, } 52ict7dig90htpm20mzytv72dfygenv 11322097 11322096 2025-04-06T18:52:40Z en>Trappist the monk 0 11322097 Scribunto text/plain --[[--------------------------< S E T T I N G S >-------------------------------------------------------------- settings definitions for i18n; translate only the rvalues ]] local settings_t = { err_category = 'cite module', -- name of category that lists article with Module:Cite errors help = 'help' -- help link display text for error messages } --[[--------------------------< E R R O R _ M E S S A G E S _ T >---------------------------------------------- ]] local error_messages_t = { missing = 'missing template name as first positional parameter', unknown = 'unknown template name: $1', -- $1 is value supplied as template name in first positional parameter } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { error_messages_t = error_messages_t, settings_t = settings_t, citation_classes_t = citation_classes_t, known_templates_t = known_templates_t, } 2r58zn22c6y4s43oav9n70y714ag3dq 11322098 11322097 2025-04-11T23:58:44Z en>Trappist the monk 0 11322098 Scribunto text/plain --[[--------------------------< S E T T I N G S >-------------------------------------------------------------- settings definitions for i18n; translate only the rvalues ]] local settings_t = { err_category = 'cite module', -- name of category that lists article with Module:Cite errors help = 'help', -- help link display text for error messages help_text_link = 'Help:CS1 errors#module_cite' -- help text for error messages can be found on this page } --[[--------------------------< E R R O R _ M E S S A G E S _ T >---------------------------------------------- ]] local error_messages_t = { missing = 'missing template name as first positional parameter', unknown = 'unknown template name: $1', -- $1 is value supplied as template name in first positional parameter } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { error_messages_t = error_messages_t, settings_t = settings_t, citation_classes_t = citation_classes_t, known_templates_t = known_templates_t, } 7vmx1c371s5xs6izlmf39ebxujl6xwj 11322099 11322098 2025-04-13T18:00:42Z en>MusikBot II 0 Protected "[[Module:Cite/config]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 13876 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) 11322098 Scribunto text/plain --[[--------------------------< S E T T I N G S >-------------------------------------------------------------- settings definitions for i18n; translate only the rvalues ]] local settings_t = { err_category = 'cite module', -- name of category that lists article with Module:Cite errors help = 'help', -- help link display text for error messages help_text_link = 'Help:CS1 errors#module_cite' -- help text for error messages can be found on this page } --[[--------------------------< E R R O R _ M E S S A G E S _ T >---------------------------------------------- ]] local error_messages_t = { missing = 'missing template name as first positional parameter', unknown = 'unknown template name: $1', -- $1 is value supplied as template name in first positional parameter } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { error_messages_t = error_messages_t, settings_t = settings_t, citation_classes_t = citation_classes_t, known_templates_t = known_templates_t, } 7vmx1c371s5xs6izlmf39ebxujl6xwj 11322100 11322099 2025-04-29T22:30:12Z en>Trappist the monk 0 sync from sandbox; 11322100 Scribunto text/plain --[[--------------------------< S E T T I N G S >-------------------------------------------------------------- settings definitions for i18n; translate only the rvalues ]] local settings_t = { err_category = 'CS1 errors: cite module', -- name of category that lists article with Module:Cite errors help = 'help', -- help link display text for error messages help_text_link = 'Help:CS1 errors#module_cite', -- help text for error messages can be found on this page unknown_name = 'unknown template name: $1', -- error message; $1 is lowercase value extracted from invoke function name } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >-------------------------------------------- list of all known cs1|2 templates by their lowercase names. key is lowercase template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these for which the canonical template name has multiple words (and the oddity that is class="encyclopaedia" – really ought to fix that in Module:Citation/CS1) key is lowercase canonical template name ]] local citation_classes_t = { ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { citation_classes_t = citation_classes_t, error_messages_t = error_messages_t, known_templates_t = known_templates_t, settings_t = settings_t, } i9ftoztbpcgwcdbwked6g3e4jsuw4qc 11322101 11322100 2025-11-15T16:00:37Z en>Trappist the monk 0 +TODO; 11322101 Scribunto text/plain --local cfg = mw.loadData ('Module:Citation/CS1/Configuration'); -- TODO: in future, use this to replace current <known_templates_t> and <citation_classes_t> --[[--------------------------< S E T T I N G S >-------------------------------------------------------------- settings definitions for i18n; translate only the rvalues ]] local settings_t = { err_category = 'CS1 errors: cite module', -- name of category that lists article with Module:Cite errors help = 'help', -- help link display text for error messages help_text_link = 'Help:CS1 errors#module_cite', -- help text for error messages can be found on this page unknown_name = 'unknown template name: $1', -- error message; $1 is lowercase value extracted from invoke function name } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >-------------------------------------------- list of all known cs1|2 templates by their lowercase names. key is lowercase template name ]] --[[ TODO: in future, use this to replace current <known_templates_t> and <citation_classes_t> local known_templates_t = {}; -- list of all known cs1|2 templates by their lowercase names. key is lowercase template name local citation_classes_t = {}; -- list of all known cs1|2 CitationClass values. key is lowercase template name for k, v in pairs (cfg.citation_class_map_t) do local template = v:gsub ('cite ', ''):lower(); -- remove 'cite ' prefix, set template name to lowercase known_templates_t[template] = true; -- add as a known template citation_classes_t[template] = k; -- add to list of citation classes end ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these for which the canonical template name has multiple words (and the oddity that is class="encyclopaedia" – really ought to fix that in Module:Citation/CS1) key is lowercase canonical template name ]] local citation_classes_t = { ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { citation_classes_t = citation_classes_t, error_messages_t = error_messages_t, known_templates_t = known_templates_t, settings_t = settings_t, } df9m193dc37c4zyqi3bvzrwlpoqnnb8 11322102 11322101 2026-10-21T16:13:12Z Pigsonthewing 1048 5 revisions imported from [[:en:Module:Cite/config]] 11322101 Scribunto text/plain --local cfg = mw.loadData ('Module:Citation/CS1/Configuration'); -- TODO: in future, use this to replace current <known_templates_t> and <citation_classes_t> --[[--------------------------< S E T T I N G S >-------------------------------------------------------------- settings definitions for i18n; translate only the rvalues ]] local settings_t = { err_category = 'CS1 errors: cite module', -- name of category that lists article with Module:Cite errors help = 'help', -- help link display text for error messages help_text_link = 'Help:CS1 errors#module_cite', -- help text for error messages can be found on this page unknown_name = 'unknown template name: $1', -- error message; $1 is lowercase value extracted from invoke function name } --[[--------------------------< K N O W N _ T E M P L A T E S _ T >-------------------------------------------- list of all known cs1|2 templates by their lowercase names. key is lowercase template name ]] --[[ TODO: in future, use this to replace current <known_templates_t> and <citation_classes_t> local known_templates_t = {}; -- list of all known cs1|2 templates by their lowercase names. key is lowercase template name local citation_classes_t = {}; -- list of all known cs1|2 CitationClass values. key is lowercase template name for k, v in pairs (cfg.citation_class_map_t) do local template = v:gsub ('cite ', ''):lower(); -- remove 'cite ' prefix, set template name to lowercase known_templates_t[template] = true; -- add as a known template citation_classes_t[template] = k; -- add to list of citation classes end ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these for which the canonical template name has multiple words (and the oddity that is class="encyclopaedia" – really ought to fix that in Module:Citation/CS1) key is lowercase canonical template name ]] local citation_classes_t = { ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { citation_classes_t = citation_classes_t, error_messages_t = error_messages_t, known_templates_t = known_templates_t, settings_t = settings_t, } df9m193dc37c4zyqi3bvzrwlpoqnnb8 Module:Cite Q/config 828 2336426 11322103 2026-10-19T22:59:07Z en>Jonathanischoice 0 comma 11322103 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ['expression-of-concern'] = "[[Category:Cite Q - cites a work with an expression of concern notice]]", ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", ["missing-author-first-last-names"] = "[[Category:Cite Q - authors with missing given and family names]]", ["supplied-ref"] = "[[Category:Cite Q - supplied citeref does not match]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 ['expression-of-concern'] = {id = "P14891", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 849lplfh0cg4ejvrr7m9hvut9i85o91 11322104 11322103 2026-10-21T16:15:10Z Pigsonthewing 1048 1 revision imported from [[:en:Module:Cite_Q/config]] 11322103 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ['expression-of-concern'] = "[[Category:Cite Q - cites a work with an expression of concern notice]]", ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", ["missing-author-first-last-names"] = "[[Category:Cite Q - authors with missing given and family names]]", ["supplied-ref"] = "[[Category:Cite Q - supplied citeref does not match]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 ['expression-of-concern'] = {id = "P14891", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 849lplfh0cg4ejvrr7m9hvut9i85o91 11322105 2025-11-15T02:43:41Z en>Ahecht 0 Split from [[Module:Cite Q]] 11322105 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcat"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } f4ndrdm1wnaiebz4qu5k4xkq7eere5k 11322106 11322105 2025-11-15T18:00:35Z en>MusikBot II 0 Protected "[[Module:Cite Q/config]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 16026 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) 11322105 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcat"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } f4ndrdm1wnaiebz4qu5k4xkq7eere5k 11322107 11322106 2026-02-01T15:57:29Z en>Trappist the monk 0 synch from sandbox; 11322107 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, -- gbooks = {id = "P675", maxvals = 1}, -- to be added to {{citation}} -- ia = {id = "P724", maxvals = 1}, -- to be added to {{citation}} arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place -- ['total-pages'] = {id = "P1104", maxvals = 0, linked = 'no'}, -- to be added to {{citation}} / COinS &rft.tpages= -- coden = {id = "P1159", maxvals = 1}, -- to be added to {{citation}} / COinS &rft.coden= s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) -- ['catalog-number'] = {id = "P528", maxvals = 0}, -- to be added to {{citation}} / COinS &rft.artnum= isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } e3bfg2vyialwdylahy7x8f49g4o0awu 11322108 11322107 2026-03-18T19:30:00Z en>Trappist the monk 0 -catalog id (p528); + article-number (p2322 article id); - stuff not likely to become part of cs1|2; 11322108 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } jpebza3azvq70hmo619nqicv359kbgi 11322109 11322108 2026-08-27T11:58:47Z en>Pigsonthewing 0 per talk & sandbox 11322109 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", -- ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 2u222ewcgnvr69xfpdgevdtnrwq5l4p 11322110 11322109 2026-09-01T18:41:21Z en>Pigsonthewing 0 sync from sandbox, per talk 11322110 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", -- ["unknown-author"] = mw.wikibase.getLabel("Q4233718"):gsub("^%l", mw.ustring.upper), ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, thesis_degree = {id = "P13338", maxvals = 1}, thesis_submitted_to = {id = "P4101", maxvals = 1}, retracted_by = {id = "P5824", maxvals = 1}, -- transient, non-CS1 citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 9yz0zffbht5rjp52kdnnk0ov48vewrn 11322111 11322110 2026-09-04T20:24:08Z en>Jonathanischoice 0 Sandbox sync: move qidonly lookups to config, disable deprecated CiteSeerX IDs 11322111 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 45216spm819y5ip0044fn7akb2fpt10 11322112 11322111 2026-09-12T23:11:15Z en>Jonathanischoice 0 add instance of 11322112 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 8i5eqfq9creaz71tftjg2p5zpe70v58 11322113 11322112 2026-09-13T04:21:53Z en>Jonathanischoice 0 Disable ISSN 11322113 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 -- issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } fxanrou4bjmgkesyoi98vs4f5ne779s 11322114 11322113 2026-09-22T11:44:16Z en>Jonathanischoice 0 Sandbox sync: Show expression of concern errors, only show ISSN when there are no article IDs 11322114 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ['expression-of-concern'] = "[[Category:Cite Q - cites a work with an expression of concern notice]]", ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 ['expression-of-concern'] = {id = "P14891", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } sh8leiv4beeyg8txngkgk1n9xbyiotl 11322115 11322114 2026-10-05T19:58:59Z en>Jonathanischoice 0 missing first/last names tracking category 11322115 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ['expression-of-concern'] = "[[Category:Cite Q - cites a work with an expression of concern notice]]", ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", ["missing-author-first-last-names"] = "[[Category:Cite Q - authors with missing given and family names]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 ['expression-of-concern'] = {id = "P14891", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } iehyoqm06tlnjyi6hccoj43lu1ez9j3 11322116 11322115 2026-10-19T22:58:40Z en>Jonathanischoice 0 add tracking category for supplied ref errors 11322116 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ['expression-of-concern'] = "[[Category:Cite Q - cites a work with an expression of concern notice]]", ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", ["missing-author-first-last-names"] = "[[Category:Cite Q - authors with missing given and family names]]", ["supplied-ref"] = "[[Category:Cite Q - supplied citeref does not match]]" }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 ['expression-of-concern'] = {id = "P14891", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 53x339gxkbmcgt36olg9560m9c4s9cq 11322117 11322104 2026-10-21T16:15:20Z Pigsonthewing 1048 12 revisions imported from [[:en:Module:Cite_Q/config]] 11322103 Scribunto text/plain --[[--------------------------< I 1 8 N _ T >----------------------------------- settings definitions for i18n ]] local i18n_t = { ["cite_q"] = "{{cite Q|", ["erratum"] = "(erratum)", ["wdq"] = "[[WDQ (identifier)|Wikidata]]", -- go through "WDQ (identifier)" redirect to reduce clutter in "What links here" and improve reverse lookup. Keep in sync with {{QID}}. ["wikisource"] = "enwikisource", ["errors"] = { ["local-article-not-found"] = "Local article not found.", ["no-label-or-title"] = "No label or title -- debug: ", }, ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }, ["ordinal"] = { [1] = "st", [2] = "nd", [3] = "rd", ["default"] = "th" }, ["trackingcats"] = { ['expression-of-concern'] = "[[Category:Cite Q - cites a work with an expression of concern notice]]", ["erratum"] = "[[Category:Cite Q - cites a work with an erratum]]", ["missing-wikidata"] = "[[Category:Articles with missing Wikidata information]]", -- TODO: point to a {{cite q}}-specific category; this one is specific to Module:WikidataIB ['no-label-or-title'] = '[[Category:Cite Q - missing label or title]]', ["retracted"] = "[[Category:Cite Q - cites a retracted work]]<!-- retracted -->", ["replaced"] = "[[Category:Cite Q - cites a replaced work]]<!-- replaced -->", ["unknown-author"] = "", -- [[Category:Cite Q - author unknown]] removed as misplaced; someone is welcome to restore it if it is placed outside of the template parameter value ["unknown-template"] = "[[Category:Cite Q - template unknown]]", ["missing-author-first-last-names"] = "[[Category:Cite Q - authors with missing given and family names]]", ["supplied-ref"] = "[[Category:Cite Q - supplied citeref does not match]]", }, } --[[----------------< S I M P L E _ P R O P E R T I E S _ T >------------------- Table of simple properties that can be fetched in roughly the same way: id = PXXX maxvals = maximum number of multiple values (0 for all) linked = "no" suppresses linking qidonly = true - fetch the QID rather than the label string populate_from_journal = true/false determines whether to look in a journal where the source is published rank = "best", "preferred", normal, etc. determines how Wikidata ranks are treated others = true - the value for the property goes to "others" section ]] local simple_properties_t = { publisher = {id = "P123", maxvals = 1}, oclc = {id = "P243", maxvals = 1}, ['publication-place'] = {id = "P291", maxvals = 0, linked = 'no'}, -- publication place (don't put into |place=; is treated specially in {{citation}} if both are given) doi = {id = "P356", maxvals = 1}, -- take care of |doi-broken-date= (WD "reason for deprecation"/"stated as") and |doi-access= (WD "access status")? issue = {id = "P433", maxvals = 0, populate_from_journal = true}, -- distinguish from |number= ("P1545"?) if both are given (still blocked by {{citation}}, but will be supported in the future) pmid = {id = "P698", maxvals = 1}, arxiv = {id = "P818", maxvals = 1}, bibcode = {id = "P819", maxvals = 1}, -- take care of |bibcode-access=? jstor = {id = "P888", maxvals = 1}, -- take care of |jstor-access=? mr = {id = "P889", maxvals = 1}, rfc = {id = "P892", maxvals = 1}, zbl = {id = "P894", maxvals = 1}, ssrn = {id = "P893", maxvals = 1}, place = {id = "P1071", maxvals = 0, linked = 'no'}, -- written-at place s2cid = {id = "P8299", maxvals = 1}, -- take care of |s2cid-access=? pmc = {id = "P932", maxvals = 1}, -- take care of |pmc-embargo-date= (WD "reason for deprecation")? lccn = {id = "P1144", maxvals = 1}, hdl = {id = "P1184", maxvals = 1}, -- take care of |hdl-access=? ismn = {id = "P1208", maxvals = 1}, journal = {id = "P1433", maxvals = 1}, ['instance-of'] = {id = "P31", qidonly=true, maxvals = 5}, -- transient, non-CS1 thesis_degree = {id = "P13338", maxvals = 1}, -- transient, non-CS1 thesis_submitted_to = {id = "P4101", maxvals = 1}, -- transient, non-CS1 retracted_by = {id = "P5824", qidonly=true, maxvals = 1}, -- transient, non-CS1 replaced_by = {id = "P1366", qidonly=true, maxvals = 1}, -- transient, non-CS1 erratum = {id = "P2507", qidonly=true, maxvals = 1}, -- transient, non-CS1 ['expression-of-concern'] = {id = "P14891", qidonly=true, maxvals = 1}, -- transient, non-CS1 -- citeseerx = {id = "P3784", maxvals = 1}, osti = {id = "P3894", maxvals = 1}, -- take care of |osti-access=? biorxiv = {id = "P3951", maxvals = 1}, asin = {id = "P5749", maxvals = 1}, -- What about |asin-tld=? (WD examples resolve to .com at present, but may change) ['article-number'] = {id = "P2322", maxvals = 1, populate_from_journal = true}, isbn = {id = "P212", maxvals = 1, populate_from_journal = true}, -- ISBN 13 issn = {id = "P236", maxvals = 1, populate_from_journal = true}, -- distinguish from |eissn= for electronic issues? -- jfm = {id = "P?", maxvals = 1}, -- Jahrbuch über die Fortschritte der Mathematik (not Zbl) -- sbn = {id = "P?", maxvals = 1}, -- Standard Book Number (predecessor of ISBN, not ICCU) -- message-id = {id = "P?", maxvals = 1}, -- Usenet message ID chapter = {id = "P792", maxvals = 1}, ['publication-date'] = {id = "P577", maxvals = 1, populate_from_journal = true}, -- publication date (don't use |date=; is treated specially in {{citation}} if both are given.) series = {id = "P179", maxvals = 1, populate_from_journal = true}, version = {id = "P348", maxvals = 0}, edition = {id = "P393", maxvals = 0}, volume = {id = "P478", maxvals = 0, populate_from_journal = true}, -- part = {id = "P1545"?, maxvals = 0}, -- to be added to {{citation}} / COinS &rft.part= title = {id = "P1476", rank="p n"}, -- url = {id = "P953", maxvals = 1}, -- deal with this along with archive-url pages = {id = "P304", maxvals = 0, populate_from_journal = true}, at = {id = "P958", maxvals = 0, populate_from_journal = true}, -- also incorporate lines (P7421) and columns (P3903) into this (cite map also supports |section=) -- sheets = {id = "P7416", maxvals = 0, populate_from_journal = true}, -- interviewer = {id = "P?", maxvals = 0}, -- does **not** go to "others" section! Multiple interviewers should be n-enumerated illustrator = {id = "P110", maxvals = 10, others = true}, -- goes to "others" section -- foreword and afterword, when contributions to another author's work, are contributions so belong in |contribution=; -- the writer's name goes in |contributor=; requires |title= and |author= -- However, this might need to add support for multiple contributors and their roles to {{citation}}, see Help_talk:Citation_Style_1#Others -- foreword = {id = "P2679", maxvals = 10, others = true}, -- goes to "others" section -- afterword = {id = "P2680", maxvals = 10, others = true}, -- goes to "others" section composer = {id = "P86", maxvals = 10, others = true}, -- goes to "others" section animator = {id = "P6942", maxvals = 10, others = true}, -- goes to "others" section director = {id = "P57", maxvals = 10, others = true}, -- goes to "others" section screenwriter = {id = "P58", maxvals = 10, others = true}, -- goes to "others" section signatory = {id = "P1891", maxvals = 10, others = true}, -- goes to "others" section presenter = {id = "P371", maxvals = 10, others = true}, -- goes to "others" section performer = {id = "P175", maxvals = 10, others = true}, -- goes to "others" section } --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return { i18n_t = i18n_t, simple_properties_t = simple_properties_t, } 849lplfh0cg4ejvrr7m9hvut9i85o91 Module:Cite 828 2336427 11322118 2025-01-05T19:28:38Z en>Trappist the monk 0 create; 11322118 Scribunto text/plain require ('strict'); --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['SSRN'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< C I T E >--------------------------------------------------------------------- test to prove that Module:Citation/CS1/sandbox can be called from another Module {{#invoke:Sandbox/trappist the monk/cite|cite|book|title=Title}} TODO: needs better error handling ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame); if not args_t[1] then -- this is the template name; we must have a template name return error ('missing template name as first positional parameter'); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not known_templates_t[template] then -- do we recognize this template name? return error ('unknown template name: ' .. template); -- nope; abandon with error message end local config_t = {['CitationClass'] = citation_classes_t[template] or template}; return require ('Module:Citation/CS1/sandbox')._citation (nil, args_t, config_t); end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } ai2km31ilmxlbw9jtrypv7wbqlv3ort 11322119 11322118 2025-03-05T00:04:03Z en>Trappist the monk 0 11322119 Scribunto text/plain require ('strict'); --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< C I T E >--------------------------------------------------------------------- test to prove that Module:Citation/CS1/sandbox can be called from another Module {{#invoke:Sandbox/trappist the monk/cite|cite|book|title=Title}} TODO: needs better error handling ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame); if not args_t[1] then -- this is the template name; we must have a template name return error ('missing template name as first positional parameter'); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not known_templates_t[template] then -- do we recognize this template name? return error ('unknown template name: ' .. template); -- nope; abandon with error message end local config_t = {['CitationClass'] = citation_classes_t[template] or template}; return require ('Module:Citation/CS1/sandbox')._citation (nil, args_t, config_t); end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } aqplimkasip2e7g1gum92y3i2r2pa2d 11322120 11322119 2025-04-06T00:16:59Z en>Trappist the monk 0 Trappist the monk moved page [[Module:Sandbox/trappist the monk/cite]] to [[Module:Cite]] without leaving a redirect: get it out of my sandbox; 11322119 Scribunto text/plain require ('strict'); --[[--------------------------< K N O W N _ T E M P L A T E S _ T >------------------------------------------- list of all known cs1|2 templates by their canonical names key is lowercase canonical template name ]] local known_templates_t = { ['arxiv'] = true, ['av media'] = true, ['av media notes'] = true, ['biorxiv'] = true, ['book'] = true, ['citation'] = true, ['citeseerx'] = true, ['conference'] = true, ['document'] = true, ['encyclopedia'] = true, ['episode'] = true, ['interview'] = true, ['journal'] = true, ['magazine'] = true, ['mailing list'] = true, ['map'] = true, ['medrxiv'] = true, ['news'] = true, ['newsgroup'] = true, ['podcast'] = true, ['press release'] = true, ['report'] = true, ['serial'] = true, ['sign'] = true, ['speech'] = true, ['ssrn'] = true, ['tech report'] = true, ['thesis'] = true, ['web'] = true, } --[[--------------------------< C I T A T I O N _ C L A S S E S _ T >----------------------------------------- |CitationClass= in the cs1|2 templates gets the lowercase template name except for these key is lowercase canonical template name ]] local citation_classes_t = { -- ['av media'] = 'audio-visual', ['av media notes'] = 'AV-media-notes', ['encyclopedia'] = 'encyclopaedia', ['mailing list'] = 'mailinglist', ['press release'] = 'pressrelease', ['tech report'] = 'techreport', } --[[--------------------------< C I T E >--------------------------------------------------------------------- test to prove that Module:Citation/CS1/sandbox can be called from another Module {{#invoke:Sandbox/trappist the monk/cite|cite|book|title=Title}} TODO: needs better error handling ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame); if not args_t[1] then -- this is the template name; we must have a template name return error ('missing template name as first positional parameter'); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not known_templates_t[template] then -- do we recognize this template name? return error ('unknown template name: ' .. template); -- nope; abandon with error message end local config_t = {['CitationClass'] = citation_classes_t[template] or template}; return require ('Module:Citation/CS1/sandbox')._citation (nil, args_t, config_t); end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } aqplimkasip2e7g1gum92y3i2r2pa2d 11322121 11322120 2025-04-06T19:02:48Z en>Trappist the monk 0 11322121 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg, nocat) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = ((0 == namespace) and not nocat) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: {{#invoke:$2}}: $3 ([[:$1|$4]])</span>$5', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (main namespace only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|cite|book|title=Title}} ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame); if not args_t[1] then -- this is the template name; we must have a template name return make_error_msg (frame, cfg.error_messages_t.missing); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.error_messages_t.unknown, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; return require ('Module:Citation/CS1/sandbox')._citation (nil, args_t, config_t); -- TODO: switch to live module end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } bbgqgg6ciffq2x3u3uqqdoq4cvg8zao 11322122 11322121 2025-04-11T17:33:06Z en>Trappist the monk 0 11322122 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg, nocat) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = ((0 == namespace) and not nocat) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: {{#invoke:$2}}: $3 ([[:$1|$4]])</span>$5', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (main namespace only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|cite|book|title=Title}} ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); if not args_t[1] then -- this is the template name; we must have a template name return make_error_msg (frame, cfg.error_messages_t.missing); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.error_messages_t.unknown, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; return require ('Module:Citation/CS1/sandbox')._citation (nil, args_t, config_t); -- TODO: switch to live module end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } qbtuad3xs3tkxfqanr81l07gvunzc2s 11322123 11322122 2025-04-12T00:06:03Z en>Trappist the monk 0 11322123 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg, nocat) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = ((0 == namespace) and not nocat) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (main namespace only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|cite|book|title=Title}} ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); if not args_t[1] then -- this is the template name; we must have a template name return make_error_msg (frame, cfg.error_messages_t.missing); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.error_messages_t.unknown, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; return require ('Module:Citation/CS1/sandbox')._citation (nil, args_t, config_t); -- TODO: switch to live module end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } 5slhdho4k4c5vb3zkfiq7czrfyf0ii8 11322124 11322123 2025-04-12T14:59:15Z en>Trappist the monk 0 11322124 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg, nocat) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = ((0 == namespace) and not nocat) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (main namespace only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|cite|book|title=Title}} ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); if not args_t[1] then -- this is the template name; we must have a template name return make_error_msg (frame, cfg.error_messages_t.missing); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.error_messages_t.unknown, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; return require ('Module:Citation/CS1')._citation (nil, args_t, config_t); -- go render the citation end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } jkb6j20lop0k4c8fwseh0tnxy6pdosz 11322125 11322124 2025-04-13T18:00:41Z en>MusikBot II 0 Protected "[[Module:Cite]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 13875 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite)) 11322124 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg, nocat) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = ((0 == namespace) and not nocat) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (main namespace only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|cite|book|title=Title}} ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); if not args_t[1] then -- this is the template name; we must have a template name return make_error_msg (frame, cfg.error_messages_t.missing); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.error_messages_t.unknown, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; return require ('Module:Citation/CS1')._citation (nil, args_t, config_t); -- go render the citation end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, } jkb6j20lop0k4c8fwseh0tnxy6pdosz 11322126 11322125 2025-04-15T14:57:04Z en>Trappist the monk 0 11322126 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg, nocat) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = ((0 == namespace) and not nocat) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (main namespace only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|cite|book|title=Title}} ]] local function cite (frame) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); if not args_t[1] then -- this is the template name; we must have a template name return make_error_msg (frame, cfg.error_messages_t.missing); -- no template name; abandon with error message end local template = args_t[1]:lower(); -- lowercase for table indexes args_t[1] = nil; -- unset, no longer needed (and would break the cs1|2 template) if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.error_messages_t.unknown, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; return require ('Module:Citation/CS1')._citation (nil, args_t, config_t); -- go render the citation end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return { cite = cite, Cite = cite, } i3fkeek4mzoc53a1g7qasj7beb94dd6 11322127 11322126 2025-04-29T22:31:59Z en>Trappist the monk 0 sync from sandbox; 11322127 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = (0 == namespace) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (for main namespace errors only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|book|title=Title}} ]] local function cite (frame, template) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); template = template:lower(); -- lowercase for table indexes if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.settings_t.unknown_name, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; -- set CitationClass value return require ('Module:Citation/CS1')._citation (nil, args_t, config_t); -- go render the citation end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] local p = {}; local function index (_, template) -- This function gets called by the metatable as index(table, key) return function (frame) return cite (frame, template) end; -- Return a function which calls cite() with the key name end local metatable = {['__index'] = index} -- Set __index, which is returned if table[key] is nil, to the index function setmetatable (p, metatable) -- Assign the metatable to the returned table return p gz9rxloe8y60k2xdggzcqwv5gc7enip 11322128 11322127 2025-05-14T20:15:34Z en>Ahecht 0 simplify 11322128 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = (0 == namespace) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (for main namespace errors only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|book|title=Title}} ]] local function cite (frame, template) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); template = template:lower(); -- lowercase for table indexes if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.settings_t.unknown_name, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; -- set CitationClass value return require ('Module:Citation/CS1')._citation (nil, args_t, config_t); -- go render the citation end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return setmetatable({}, {__index = -- returns an empty TABLE whose metatable has the __index set so that, for any given KEY, it returns function(_, template) -- this anonymous function called as function(TABLE, KEY) return function (frame) return cite (frame, template) end; -- which in turn returns a function that calls cite() with the KEY name end }) l6pdikgzfwcsvgn3rrywpr0ynosxu31 11322129 11322128 2026-10-21T16:17:34Z Pigsonthewing 1048 11 revisions imported from [[:en:Module:Cite]] 11322128 Scribunto text/plain require ('strict'); local cfg = mw.loadData ('Module:Cite/config'); --[[--------------------------< S U B S T I T U T E >---------------------------------------------------------- Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when <data_t> not nil; returns <message> else. ]] local function substitute (message, data_t) return data_t and mw.message.newRawMessage (message, data_t):plain() or message; end --[[--------------------------< M A K E _ E R R O R _ M S G >-------------------------------------------------- Assembles an error message from module name, message text, help link, and error category. ]] local function make_error_msg (frame, msg) local module_name = frame:getTitle(); -- get the module name for prefix and help-link label local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization local category_link = (0 == namespace) and substitute ('[[Category:$1]]', {cfg.settings_t.err_category}) or ''; return substitute ('<span style="color:#d33">Error: &#x7B;{[[$1|#invoke:$2]]}}: $3 ([[:$4|$5]])</span>$6', { module_name, -- the module name with namespace module_name:gsub ('Module:', ''), -- the module name without namespace msg, -- the error message cfg.settings_t.help_text_link, -- help wikilink to text at help page cfg.settings_t.help, -- help wikilink display text category_link -- link to error category (for main namespace errors only) }) end --[[--------------------------< C I T E >--------------------------------------------------------------------- Function to call Module:Citation/CS1/sandbox with appropriate parameters. For use when an article exceeds the post-expand include size limit. {{#invoke:cite|book|title=Title}} ]] local function cite (frame, template) local args_t = require ('Module:Arguments').getArgs (frame, {frameOnly=true}); template = template:lower(); -- lowercase for table indexes if not cfg.known_templates_t[template] then -- do we recognize this template name? return make_error_msg (frame, substitute (cfg.settings_t.unknown_name, {template})); -- nope; abandon with error message end local config_t = {['CitationClass'] = cfg.citation_classes_t[template] or template}; -- set CitationClass value return require ('Module:Citation/CS1')._citation (nil, args_t, config_t); -- go render the citation end --[[--------------------------< E X P O R T S >--------------------------------------------------------------- ]] return setmetatable({}, {__index = -- returns an empty TABLE whose metatable has the __index set so that, for any given KEY, it returns function(_, template) -- this anonymous function called as function(TABLE, KEY) return function (frame) return cite (frame, template) end; -- which in turn returns a function that calls cite() with the KEY name end }) l6pdikgzfwcsvgn3rrywpr0ynosxu31 WDQ (identifier) 0 2336428 11322131 2026-10-21T16:20:30Z Pigsonthewing 1048 Create redirect to [[Wikispecies:Project Wikidata]] (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]]) 11322131 wikitext text/x-wiki #REDIRECT [[Wikispecies:Project Wikidata]] 0tb8f81p5av0d2qxqgp2h7xedegg6oq Category:Cite Q - authors with missing given and family names 14 2336429 11322133 2026-10-21T16:35:27Z Pigsonthewing 1048 c 11322133 wikitext text/x-wiki {{empty category}} 1eqhfigdqfra29nbli1o8hne7owt8rt 11322139 11322133 2026-10-21T16:41:29Z Pigsonthewing 1048 added [[Category:Cite Q tracking categories]] using [[Help:Gadget-HotCat|HotCat]] 11322139 wikitext text/x-wiki {{empty category}} [[Category:Cite Q tracking categories]] ag27gl0ty1iip00r28afvbxb12h6dh9 Category:Cite Q tracking categories 14 2336430 11322135 2026-10-21T16:40:04Z Pigsonthewing 1048 Wikispecies maintenance 11322135 wikitext text/x-wiki See [[Template:Cite Q]]. [[Category:Wikispecies maintenance]] 89mzj7vuzyay5wzn2008dkrk5x9f19f Category talk:Cite Q tracking categories 15 2336431 11322136 2026-10-21T16:40:34Z Pigsonthewing 1048 Create redirect to [[Template talk:Cite Q]] (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]]) 11322136 wikitext text/x-wiki #REDIRECT [[Template talk:Cite Q]] 7kmmdbn0ovw3jui1kt7fjwffxxn88a6 Category talk:Cite Q - author unknown 15 2336432 11322137 2026-10-21T16:40:45Z Pigsonthewing 1048 Create redirect to [[Template talk:Cite Q]] (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]]) 11322137 wikitext text/x-wiki #REDIRECT [[Template talk:Cite Q]] 7kmmdbn0ovw3jui1kt7fjwffxxn88a6 Category talk:Cite Q - authors with missing given and family names 15 2336433 11322140 2026-10-21T16:41:45Z Pigsonthewing 1048 Create redirect to [[Template talk:Cite Q]] (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]]) 11322140 wikitext text/x-wiki #REDIRECT [[Template talk:Cite Q]] 7kmmdbn0ovw3jui1kt7fjwffxxn88a6 Template:Van der Heyden, 2026d 10 2336434 11322142 2026-10-21T16:56:23Z Hiouf 2107144 Created page with "* {{a|Torsten van der Heyden|van der Heyden, T.}} 2026. On the presence of ''Brachynema germarii'' ({{aut|Kolenati}}, 1846) (Hemiptera: Heteroptera: Pentatomidae) in Malta. ''[[ISSN 0354-9410|Acta Entomologica Serbica]]'' 31(2): 87–89. {{Doi|10.5281/zenodo.23420239}} {{Access|open}} {{ResearchGate Publication|416024812}} {{Access|open}} <includeonly>[[Template:Van der Heyden, 2026d|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Temp..." 11322142 wikitext text/x-wiki * {{a|Torsten van der Heyden|van der Heyden, T.}} 2026. On the presence of ''Brachynema germarii'' ({{aut|Kolenati}}, 1846) (Hemiptera: Heteroptera: Pentatomidae) in Malta. ''[[ISSN 0354-9410|Acta Entomologica Serbica]]'' 31(2): 87–89. {{Doi|10.5281/zenodo.23420239}} {{Access|open}} {{ResearchGate Publication|416024812}} {{Access|open}} <includeonly>[[Template:Van der Heyden, 2026d|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{ZooBank|12AAE0AE-3224-4C26-BE15-41E09FB37475}} [[Category:Reference templates]]</noinclude> hx8ax0amqxcjn1l1k66u8cju1exiydz 11322143 11322142 2026-10-21T16:56:35Z Hiouf 2107144 11322143 wikitext text/x-wiki * {{a|Torsten van der Heyden|van der Heyden, T.}} 2026. On the presence of ''Brachynema germarii'' ({{aut|Kolenati}}, 1846) (Hemiptera: Heteroptera: Pentatomidae) in Malta. ''[[ISSN 0354-9410|Acta Entomologica Serbica]]'' 31(2). {{Doi|10.5281/zenodo.23420239}} {{Access|open}} {{ResearchGate Publication|416024812}} {{Access|open}} <includeonly>[[Template:Van der Heyden, 2026d|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{ZooBank|12AAE0AE-3224-4C26-BE15-41E09FB37475}} [[Category:Reference templates]]</noinclude> hic148hpmvrtit3nupzhqwweo3jxlo2 Template:Hu et al., 2026c 10 2336435 11322146 2026-10-21T17:03:46Z Neferkheperre 947633 Created page with "* {{a|Zhu-Rong Hu|Hu, Z-R.}}, {{a|Xiu-Ping Chang|Chang, X-P.}}, {{a|Yu-Xuan Ma|Ma, Y-X.}}, {{a|Er-Shuai Li|Li, E-S.}}, {{a|Chang-Yi Guo|Guo, C-Y.}} & {{a|Hai-Li Yu|Yu, HL.}} 2026. The genus ''Sorolopha'' {{aut|Lower}}, 1901 (Lepidoptera, Tortricidae, Olethreutinae) in China: an annotated checklist, new DNA barcodes, and descriptions of two new species. [[ISSN 1313-2989|''ZooKeys'']] 1295: 53–84. {{doi|10.3897/zookeys.1295.202313}} {{Access|open}}{{subst:ReftempZt}}" 11322146 wikitext text/x-wiki * {{a|Zhu-Rong Hu|Hu, Z-R.}}, {{a|Xiu-Ping Chang|Chang, X-P.}}, {{a|Yu-Xuan Ma|Ma, Y-X.}}, {{a|Er-Shuai Li|Li, E-S.}}, {{a|Chang-Yi Guo|Guo, C-Y.}} & {{a|Hai-Li Yu|Yu, HL.}} 2026. The genus ''Sorolopha'' {{aut|Lower}}, 1901 (Lepidoptera, Tortricidae, Olethreutinae) in China: an annotated checklist, new DNA barcodes, and descriptions of two new species. [[ISSN 1313-2989|''ZooKeys'']] 1295: 53–84. {{doi|10.3897/zookeys.1295.202313}} {{Access|open}} <includeonly>[[Template:Hu et al., 2026c|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> tw0uvjsyu7st31k6g8y71uu9tae21z8 11322151 11322146 2026-10-21T17:19:05Z Neferkheperre 947633 11322151 wikitext text/x-wiki * {{a|Zhu-Rong Hu|Hu, Z-R.}}, {{a|Xiu-Ping Chang|Chang, X-P.}}, {{a|Yu-Xuan Ma|Ma, Y-X.}}, {{a|Er-Shuai Li|Li, E-S.}}, {{a|Chang-Yi Guo|Guo, C-Y.}} & {{a|Hai-Li Yu|Yu, H-L.}} 2026. The genus ''Sorolopha'' {{aut|Lower}}, 1901 (Lepidoptera, Tortricidae, Olethreutinae) in China: an annotated checklist, new DNA barcodes, and descriptions of two new species. [[ISSN 1313-2989|''ZooKeys'']] 1295: 53–84. {{doi|10.3897/zookeys.1295.202313}} {{Access|open}} <includeonly>[[Template:Hu et al., 2026c|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 20 October 2026 * {{ZooBank|71B7B711-305E-4B03-94BE-79B6EBC592E9}} ==={{int:New names}} (2)=== * ''[[Sorolopha irirectangulata]]'' {{aut|Hu & Yu}} * ''[[Sorolopha specialis]]'' {{aut|Hu & Yu}} [[Category:Reference templates]]</noinclude> 168ia4w4rsu9rnbjit1uxju6qpk3vky User:YourLocalUSBport 2 2336436 11322147 2026-10-21T17:04:37Z YourLocalUSBport 3035355 Created page with "hiiiii I'm a child I'm on wikipedia mostly I like [[Cyrtosia (Orchidaceae)|cyrtosias]]" 11322147 wikitext text/x-wiki hiiiii I'm a child I'm on wikipedia mostly I like [[Cyrtosia (Orchidaceae)|cyrtosias]] 6y968uz6sh4089tibiw72yixgaqkv3d 11322149 11322147 2026-10-21T17:14:23Z YourLocalUSBport 3035355 wx5tcfygubijnopo 11322149 wikitext text/x-wiki hiiiii I'm a child I'm on wikipedia mostly and I like [[Cyrtosia (Orchidaceae)|cyrtosias]] :) 6dkmzq7ngks05mr0evnucn6ul4dbwl8 User:Phoenix3452 2 2336437 11322148 2026-10-21T17:08:03Z Phoenix3452 3040724 Created page with "<div style="background:#062f2b;border:4px solid #c6a34a;padding:9px;color:#effcf7;font-family:Georgia,'Times New Roman',serif;"> <div style="background:linear-gradient(135deg,#073c35,#075b64,#102a56);border:2px solid #d9b65d;text-align:center;padding:32px 14px;"> <div style="font-size:12px;letter-spacing:5px;color:#e8d8a5;">NATURE • DIVERSITY • DISCOVERY</div> <div style="font-size:39px;font-weight:bold;color:#ffffff;margin-top:20px;">🦚 THE PEAFOWL</div> <div..." 11322148 wikitext text/x-wiki <div style="background:#062f2b;border:4px solid #c6a34a;padding:9px;color:#effcf7;font-family:Georgia,'Times New Roman',serif;"> <div style="background:linear-gradient(135deg,#073c35,#075b64,#102a56);border:2px solid #d9b65d;text-align:center;padding:32px 14px;"> <div style="font-size:12px;letter-spacing:5px;color:#e8d8a5;">NATURE • DIVERSITY • DISCOVERY</div> <div style="font-size:39px;font-weight:bold;color:#ffffff;margin-top:20px;">🦚 THE PEAFOWL</div> <div style="font-size:23px;letter-spacing:3px;color:#b6f0df;">NATURALIST'S CORNER</div> <div style="border-top:2px solid #d9b65d;width:65%;margin:20px auto;"></div> <div style="font-size:18px;font-style:italic;line-height:1.8;color:#effcf7;">Celebrating the diversity of life, one species at a time.</div> <div style="font-size:12px;letter-spacing:3px;color:#e8d8a5;margin-top:20px;">A PERSONAL PAGE ON WIKISPECIES</div> </div> <div style="background:#0b4945;border:2px solid #c6a34a;padding:13px;text-align:center;margin-top:10px;"> [[User:{{PAGENAME}}|<span style="color:#ffffff;">HOME</span>]] &nbsp; ◆ &nbsp; [[User talk:{{PAGENAME}}|<span style="color:#ffffff;">TALK PAGE</span>]] &nbsp; ◆ &nbsp; [[Special:Contributions/{{PAGENAME}}|<span style="color:#ffffff;">CONTRIBUTIONS</span>]] &nbsp; ◆ &nbsp; [[User:{{PAGENAME}}/sandbox|<span style="color:#ffffff;">SANDBOX</span>]] </div> <div style="background:#f0f8f3;color:#163b35;border:2px solid #c6a34a;padding:20px;margin-top:10px;line-height:1.9;"> <div style="background:#075b64;color:#ffffff;border-left:6px solid #d9b65d;padding:12px;font-size:22px;font-weight:bold;">I. WELCOME TO MY NATURAL HISTORY JOURNAL</div> Welcome to my corner of WikiSpecies! 🦚 This page celebrates the extraordinary diversity of life and the scientific work of documenting Earth's living organisms. I am interested in learning about species, exploring biological classification, improving my knowledge of wiki editing, and helping make taxonomic information easier to discover. The natural world is full of remarkable adaptations, evolutionary relationships, and discoveries waiting to be explored. Every well-documented species helps us better understand the living world. <div style="background:#075b64;color:#ffffff;border-left:6px solid #d9b65d;padding:12px;font-size:22px;font-weight:bold;margin-top:25px;">II. THE PEAFOWL GALLERY</div> <div style="background:#ffffff;border:2px solid #0b746b;padding:16px;margin-top:12px;text-align:center;"> <div style="font-size:24px;color:#075b64;font-weight:bold;">THE SPLENDOR OF THE PEAFOWL</div> Peafowl are large birds in the pheasant family, Phasianidae. The best-known species include the Indian peafowl (Pavo cristatus), the green peafowl (Pavo muticus), and the Congo peafowl (Afropavo congensis). Their striking appearance and elaborate courtship displays make them fascinating examples of avian diversity. <div style="font-size:13px;color:#476b60;margin-top:12px;">A reminder that beauty and scientific understanding can go hand in hand.</div> </div> <div style="background:#075b64;color:#ffffff;border-left:6px solid #d9b65d;padding:12px;font-size:22px;font-weight:bold;margin-top:25px;">III. THE TAXONOMY TRAIL</div> My interests include exploring: '''Taxonomy:''' the naming and classification of organisms. '''Biodiversity:''' the variety of life and its many forms. '''Ornithology:''' the study of birds and their biology. '''Evolution:''' the relationships and changes that shape living species. '''Scientific nomenclature:''' the rules and history behind scientific names. '''Conservation:''' understanding species diversity and the importance of protecting habitats. <div style="background:#075b64;color:#ffffff;border-left:6px solid #d9b65d;padding:12px;font-size:22px;font-weight:bold;margin-top:25px;">IV. THE NATURALIST'S PRINCIPLES</div> '''Accuracy matters.''' Scientific information should be supported by reliable sources. '''Names need context.''' Taxonomic names and classifications should be presented carefully. '''Evidence comes first.''' Claims should reflect published scientific knowledge. '''Respect the community.''' Collaboration helps improve shared reference resources. '''Keep learning.''' Scientific understanding develops as new evidence emerges. <div style="background:#075b64;color:#ffffff;border-left:6px solid #d9b65d;padding:12px;font-size:22px;font-weight:bold;margin-top:25px;">V. EXPLORE WIKISPECIES</div> [[Main Page|Explore the WikiSpecies main page]] [[Special:Search|Search species and taxonomic information]] [[Special:RecentChanges|Browse recent changes]] [[Special:Contributions/{{PAGENAME}}|View my contributions]] [[User talk:{{PAGENAME}}|Visit my talk page]] [[User:{{PAGENAME}}/sandbox|Experiment in my sandbox]] <div style="background:#075b64;color:#ffffff;border-left:6px solid #d9b65d;padding:12px;font-size:22px;font-weight:bold;margin-top:25px;">VI. THE FIELD NOTES</div> My goals are to develop my editing skills, learn more about taxonomy, understand how species information is documented, and contribute constructively to the project. This section can grow over time with genuine contributions, learning milestones, and projects related to biodiversity. <div style="background:#102a56;color:#ffffff;border:3px solid #c6a34a;padding:24px 14px;text-align:center;margin-top:25px;"> <div style="font-size:28px;font-weight:bold;color:#e8d8a5;">🦚 A WORLD OF WONDERS</div> <div style="font-size:18px;font-style:italic;line-height:1.9;margin-top:15px;">Observe with curiosity. Document with care. Celebrate the diversity of life.</div> <div style="border-top:1px solid #d9b65d;width:60%;margin:20px auto;"></div> <div style="font-size:12px;letter-spacing:3px;color:#b6f0df;">EMERALD • TEAL • ROYAL BLUE • GOLD</div> </div> </div> </div> klou8vyngunm2hpce4e6ptbefk9jqv9 Zhu-Rong Hu 0 2336438 11322155 2026-10-21T17:31:33Z Neferkheperre 947633 Created page with "{{Image|}} '''Zhu-Rong Hu''', Chinese entomologist * Shaanxi Key Laboratory for Animal Conservation, Northwest University, Xi’an, China {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Hu et al., 2026c}} {{Authority control}} {{DEFAULTSORT:Hu, Zhu-Rong}} [[Category:Taxon authorities]] [[Category:entomologists]]" 11322155 wikitext text/x-wiki {{Image|}} '''Zhu-Rong Hu''', Chinese entomologist * Shaanxi Key Laboratory for Animal Conservation, Northwest University, Xi’an, China {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Hu et al., 2026c}} {{Authority control}} {{DEFAULTSORT:Hu, Zhu-Rong}} [[Category:Taxon authorities]] [[Category:entomologists]] bh4a6s7y2d3hsjq1rkpocbb9vw99xs2 Category:Zhu-Rong Hu taxa 14 2336439 11322156 2026-10-21T17:52:50Z Neferkheperre 947633 Created page with "{{taxa by author|Zhu-Rong Hu|Hu, Zhu-Rong}}" 11322156 wikitext text/x-wiki {{taxa by author|Zhu-Rong Hu|Hu, Zhu-Rong}} 6v6zijfjtz9k2wwmkwhvajg1ymovfot Sminthosinis 0 2336440 11322192 2026-10-21T18:21:58Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Sminthosinis}} Species (1): †{{splast|S|minthosinis|bowleri}} =={{int:Name}}== ''Sminthosinis'' {{a|Philip Reese Bjork|Bjork}}, 1970 * {{int:Type species}}: ''Sminthosinis bowleri'' {{aut|Bjork}}, 1970. =={{int:References}}== ==={{int:Primary references}}=== {{Bjork, 1970}} {{Taxonbar}} [[Category:Philip Reese Bjork taxa]]" 11322192 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Sminthosinis}} Species (1): †{{splast|S|minthosinis|bowleri}} =={{int:Name}}== ''Sminthosinis'' {{a|Philip Reese Bjork|Bjork}}, 1970 * {{int:Type species}}: ''Sminthosinis bowleri'' {{aut|Bjork}}, 1970. =={{int:References}}== ==={{int:Primary references}}=== {{Bjork, 1970}} {{Taxonbar}} [[Category:Philip Reese Bjork taxa]] 48vlz0vf95qb4lrhbropbhcv1q3i5f2 Template:Sminthosinis 10 2336441 11322193 2026-10-21T18:22:38Z The editor 2345 2915305 Created page with "{{Lyncodontini}} Genus: †{{gbr|Sminthosinis}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322193 wikitext text/x-wiki {{Lyncodontini}} Genus: †{{gbr|Sminthosinis}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 8h8n8rheismdrqm02lngizg5csg7qge Sminthosinis bowleri 0 2336442 11322194 2026-10-21T18:23:27Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Sminthosinis}} Species: †''[[Sminthosinis bowleri]]'' =={{int:Name}}== ''Sminthosinis bowleri'' {{a|Philip Reese Bjork|Bjork}}, 1970 =={{int:References}}== ==={{int:Primary references}}=== {{Bjork, 1970}} {{Taxonbar}} [[Category:Philip Reese Bjork taxa]]" 11322194 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Sminthosinis}} Species: †''[[Sminthosinis bowleri]]'' =={{int:Name}}== ''Sminthosinis bowleri'' {{a|Philip Reese Bjork|Bjork}}, 1970 =={{int:References}}== ==={{int:Primary references}}=== {{Bjork, 1970}} {{Taxonbar}} [[Category:Philip Reese Bjork taxa]] qdspy144u9e8azaicywb1cuxktnatpq Template:Altriarabis 10 2336443 11322196 2026-10-21T18:25:13Z Andyboorman 251907 Created page with "{{Arabideae}} Genus: {{gbr|Altriarabis}}" 11322196 wikitext text/x-wiki {{Arabideae}} Genus: {{gbr|Altriarabis}} re0hc48jjo2w5gwwggzfpl4kno3rej0 Template:López, Roccatagliata & Doti, 2026 10 2336444 11322198 2026-10-21T18:25:56Z Neferkheperre 947633 Created page with "* {{a|Sofía Calderón López|López, S.C.}}, {{a|Daniel Roccatagliata|Roccatagliata, D.}} & {{a|Brenda Lía Doti|Doti, B.}} 2026. First record of the little-known family Katianiridae {{aut|Svavarsson}}, 1987 (Crustacea, Isopoda, Asellota) from the Southwest Atlantic Ocean, with description of two new species. [[ISSN 1313-2989|''ZooKeys'']] 1295: 111–128. {{doi|10.3897/zookeys.1295.205971}} {{Access|open}}{{subst:ReftempZt}}" 11322198 wikitext text/x-wiki * {{a|Sofía Calderón López|López, S.C.}}, {{a|Daniel Roccatagliata|Roccatagliata, D.}} & {{a|Brenda Lía Doti|Doti, B.}} 2026. First record of the little-known family Katianiridae {{aut|Svavarsson}}, 1987 (Crustacea, Isopoda, Asellota) from the Southwest Atlantic Ocean, with description of two new species. [[ISSN 1313-2989|''ZooKeys'']] 1295: 111–128. {{doi|10.3897/zookeys.1295.205971}} {{Access|open}} <includeonly>[[Template:López, Roccatagliata &#38; Doti, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> dqe93l578o4v7jzve4ktaoilb10afrn 11322217 11322198 2026-10-21T18:41:06Z Neferkheperre 947633 11322217 wikitext text/x-wiki * {{a|Sofía Calderón López|López, S.C.}}, {{a|Daniel Roccatagliata|Roccatagliata, D.}} & {{a|Brenda Lía Doti|Doti, B.}} 2026. First record of the little-known family Katianiridae {{aut|Svavarsson}}, 1987 (Crustacea, Isopoda, Asellota) from the Southwest Atlantic Ocean, with description of two new species. [[ISSN 1313-2989|''ZooKeys'']] 1295: 111–128. {{doi|10.3897/zookeys.1295.205971}} {{Access|open}} <includeonly>[[Template:López, Roccatagliata &#38; Doti, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 20 October 2026 * {{ZooBank|F2A9DE11-B436-468D-9D91-68BE5CB1A513}} ==={{int:New names}} (2)=== * ''[[Natalianira bicornuta]]'' * ''[[Natalianira megalocera]]'' [[Category:Reference templates]]</noinclude> a67x4ostq4lerevvs0wltqyt2vbw03w Template:Reig, 1956 10 2336445 11322199 2026-10-21T18:26:59Z The editor 2345 2915305 Created page with "* {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1956. {{lang|fr|Note préliminaire sur un nouveau genre de mustélidés fossiles du Pléistocène de la République argentine}}. ''[[ISSN 0025-1461|Mammalia]]'' 20(3), 223–230. <includeonly>[[Template:Reig, 1956|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude>" 11322199 wikitext text/x-wiki * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1956. {{lang|fr|Note préliminaire sur un nouveau genre de mustélidés fossiles du Pléistocène de la République argentine}}. ''[[ISSN 0025-1461|Mammalia]]'' 20(3), 223–230. <includeonly>[[Template:Reig, 1956|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> kj3r85vl3b0nuk706qg3sn13f3zv3yg 11322200 11322199 2026-10-21T18:27:15Z The editor 2345 2915305 /* */ 11322200 wikitext text/x-wiki * {{a|Osvaldo Alfredo Reig|Reig, O.A.}} 1956. {{lang|fr|Note préliminaire sur un nouveau genre de mustélidés fossiles du Pléistocène de la République argentine}}. ''[[ISSN 0025-1461|Mammalia]]'' 20(3): 223–230. <includeonly>[[Template:Reig, 1956|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> ctak3nz44x5piunrdaua6oju62opnu9 Stipanicicia 0 2336446 11322203 2026-10-21T18:29:26Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Stipanicicia}} Species (1): †{{splast|S|tipanicicia|pettorutii}} =={{int:Name}}== ''Stipanicicia'' {{a|Osvaldo Alfredo Reig|Reig}}, 1956 * {{int:Type species}}: ''Stipanicicia pettorutii'' {{aut|Reig}}, 1970. =={{int:References}}== ==={{int:Primary references}}=== {{Reig, 1956}} {{Taxonbar}} [[Category:Osvaldo Alfredo Reig taxa]]" 11322203 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Stipanicicia}} Species (1): †{{splast|S|tipanicicia|pettorutii}} =={{int:Name}}== ''Stipanicicia'' {{a|Osvaldo Alfredo Reig|Reig}}, 1956 * {{int:Type species}}: ''Stipanicicia pettorutii'' {{aut|Reig}}, 1970. =={{int:References}}== ==={{int:Primary references}}=== {{Reig, 1956}} {{Taxonbar}} [[Category:Osvaldo Alfredo Reig taxa]] 0zqgmq5djclvoir31cgknzt35zhp09i Template:Stipanicicia 10 2336447 11322204 2026-10-21T18:29:56Z The editor 2345 2915305 Created page with "{{Lyncodontini}} Genus: †{{gbr|Stipanicicia}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322204 wikitext text/x-wiki {{Lyncodontini}} Genus: †{{gbr|Stipanicicia}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> muset8m1iwf59qcgw66hazdxuj8ku9f Stipanicicia pettorutii 0 2336448 11322205 2026-10-21T18:30:38Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Stipanicicia}} Species: †''[[Stipanicicia pettorutii]]'' =={{int:Name}}== ''Stipanicicia pettorutii'' {{a|Osvaldo Alfredo Reig|Reig}}, 1956 =={{int:References}}== ==={{int:Primary references}}=== {{Reig, 1956}} {{Taxonbar}} [[Category:Osvaldo Alfredo Reig taxa]]" 11322205 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Stipanicicia}} Species: †''[[Stipanicicia pettorutii]]'' =={{int:Name}}== ''Stipanicicia pettorutii'' {{a|Osvaldo Alfredo Reig|Reig}}, 1956 =={{int:References}}== ==={{int:Primary references}}=== {{Reig, 1956}} {{Taxonbar}} [[Category:Osvaldo Alfredo Reig taxa]] ic2rm46mot0qdmnbqg6h5oztmc610gl Template:Neumoegen & Dyar, 1893b 10 2336449 11322208 2026-10-21T18:33:58Z FrankB157 2872707 New pub 11322208 wikitext text/x-wiki * {{a|Berthold Neumoegen|Neumoegen, B.}} & {{a|Harrison Gray Dyar|Dyar, H.G.}}, 1893. Notes on Lithosiidae and Arctiidae with descriptions of new varieties. [[ISSN 0013-872X|''Entomological News'']] 4(6): {{BHL|page/24655781|213–216}} <includeonly>[[Template:Neumoegen & Dyar, 1893b|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> qj5l32gx7x2teed4u8ovngvef6wi0z3 Altriarabis 0 2336450 11322209 2026-10-21T18:34:25Z Andyboorman 251907 Created page with "{{image}} =={{int:Taxonavigation}}== {{Altriarabis}} Species: {{sp|A|ltriarabis|amplexicaulis}} {{splast|A|ltriarabis|pterosperma}} =={{int:Name}}== ''Altriarabis'' {{a|Y.Z.Zhao}}, Collect. Works Zhao Yizhi: 209 (2018) * Type species: '''Altriarabis pterosperma''' (Edgew.) Y.Z.Zhao, Collect. Works Zhao Yizhi 209 (2018). {{nadi| *'''Continental: Asia-Temperate''' **'''Regional: China''' *** China South-Central, Qinghai, Tibet **'''Regional: Indian Subcontinent (Temperat..." 11322209 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Altriarabis}} Species: {{sp|A|ltriarabis|amplexicaulis}} {{splast|A|ltriarabis|pterosperma}} =={{int:Name}}== ''Altriarabis'' {{a|Y.Z.Zhao}}, Collect. Works Zhao Yizhi: 209 (2018) * Type species: '''Altriarabis pterosperma''' (Edgew.) Y.Z.Zhao, Collect. Works Zhao Yizhi 209 (2018). {{nadi| *'''Continental: Asia-Temperate''' **'''Regional: China''' *** China South-Central, Qinghai, Tibet **'''Regional: Indian Subcontinent (Temperate)''' *** Afghanistan, East Himalaya, Nepal, Pakistan, West Himalaya **'''Regional: Mongolia''' *** Mongolia }} =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Zhao, Y.Z.}} 2018. ''Collected Works of Zhao Yizhi'' 209. ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{Catol-Hassler|2026|Oct|21}} In synonymy of ''[[Arabis]]'' {{IPNI||2026|Oct 21}} 5wbu6hjnpb1331jxinbebn7hb70jt02 11322224 11322209 2026-10-21T18:47:29Z Andyboorman 251907 11322224 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Altriarabis}} Species: {{sp|A|ltriarabis|amplexicaulis}} {{splast|A|ltriarabis|pterosperma}} =={{int:Name}}== ''Altriarabis'' {{a|Y.Z.Zhao}}, Collect. Works Zhao Yizhi: 209 (2018) * Type species: ''Altriarabis pterosperma'' (Edgew.) Y.Z.Zhao, Collect. Works Zhao Yizhi 209 (2018). {{nadi| *'''Continental: Asia-Temperate''' **'''Regional: China''' *** China South-Central, Qinghai, Tibet **'''Regional: Indian Subcontinent (Temperate)''' *** Afghanistan, East Himalaya, Nepal, Pakistan, West Himalaya **'''Regional: Mongolia''' *** Mongolia }} =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Zhao, Y.Z.}} 2018. ''Collected Works of Zhao Yizhi'' 209. ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{Catol-Hassler|2026|Oct|21}} In synonymy of ''[[Arabis]]'' {{IPNI||2026|Oct 21}} qwhfre48xab76ahpt3wzd8p4d87mjxc Arabis pterosperma 0 2336451 11322213 2026-10-21T18:35:30Z Andyboorman 251907 Andyboorman moved page [[Arabis pterosperma]] to [[Altriarabis pterosperma]]: Move to the valid combination: not accepted by all 11322213 wikitext text/x-wiki #REDIRECT [[Altriarabis pterosperma]] mw6861fthsuhf77qjaiczkhv7j371nt Arabis amplexicaulis 0 2336452 11322216 2026-10-21T18:40:01Z Andyboorman 251907 Andyboorman moved page [[Arabis amplexicaulis]] to [[Altriarabis amplexicaulis]]: Move to the valid combination 11322216 wikitext text/x-wiki #REDIRECT [[Altriarabis amplexicaulis]] nma5bntblrsgvqrxmozq8v9zmlqr429 Template:Dyar, 1893a 10 2336453 11322219 2026-10-21T18:42:58Z FrankB157 2872707 new pub 11322219 wikitext text/x-wiki * {{a|Harrison Gray Dyar|Dyar, H.G.}}, 1893. Synonymic and structural notes. [[ISSN 0013-872X|''Entomological News'']] 4(1): {{BHL|page/24655564|33–36}}. <includeonly>[[Template:Dyar, 1893a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: January 1893 ==={{int:New names}} (2)=== * ''[[Elpis]]'' * ''[[Macrurocampa]]'' [[Category:Reference templates]]</noinclude> f2f85jlhlc9o6jz0aq2a8d7fn8ni8eg Template:Helicodraba 10 2336454 11322225 2026-10-21T18:50:58Z Andyboorman 251907 Created page with "{{Arabideae}} Genus: {{gbr|Helicodraba}}" 11322225 wikitext text/x-wiki {{Arabideae}} Genus: {{gbr|Helicodraba}} td7yphmqxg6bdy9mqmq8779uz5apml8 Sofía Calderón López 0 2336455 11322226 2026-10-21T18:56:49Z Neferkheperre 947633 Created page with "{{Image|}} '''Sofia Calderon Lopez''', Argentine carcinologist * Universidad de Buenos Aires, Facultad de Ciencias Exactas y Naturales, Departamento de Biodiversidad y Biología Experimental (DBBE), Buenos Aires, Argentina * Universidad de Buenos Aires – CONICET, Instituto de Biodiversidad y Biología Experimental y Aplicada (IBBEA), Buenos Aires, Argentina {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{López, Roccatagliata & Doti, 2026}} {{Authorit..." 11322226 wikitext text/x-wiki {{Image|}} '''Sofia Calderon Lopez''', Argentine carcinologist * Universidad de Buenos Aires, Facultad de Ciencias Exactas y Naturales, Departamento de Biodiversidad y Biología Experimental (DBBE), Buenos Aires, Argentina * Universidad de Buenos Aires – CONICET, Instituto de Biodiversidad y Biología Experimental y Aplicada (IBBEA), Buenos Aires, Argentina {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{López, Roccatagliata & Doti, 2026}} {{Authority control}} {{DEFAULTSORT:Lopez, Sofia}} [[Category:Taxon authorities]] [[Category:carcinologists]] t3qdy2ep4jf3l37f8ust7t3exfvkah1 Category:Sofía Calderón López taxa 14 2336456 11322227 2026-10-21T19:02:30Z Neferkheperre 947633 Created page with "{{taxa by author|Sofía Calderón López|Lopez, Sofia}}" 11322227 wikitext text/x-wiki {{taxa by author|Sofía Calderón López|Lopez, Sofia}} 7mke205qrpnmldzicv4q1hiywpvvhty Template:German & Koch, 2025 10 2336457 11322228 2026-10-21T19:02:51Z Andyboorman 251907 Created page with "* {{a|Dmitry Alexandrovich German|German, D.A.}} & {{a|Marcus A. Koch|Koch, M.}} 2025. ''Helicodraba'' is a new genus of the tribe Arabideae (Brassicaceae), endemic to Morocco. [[ISSN 1560-7259|''Turczaninowia'']] 28(1): 203. {{doi|10.14258/turczaninowia.28.1.20}} [https://turczaninowia.asu.ru/article/view/17104/14764 PDF] {{subst:Reftemp}}" 11322228 wikitext text/x-wiki * {{a|Dmitry Alexandrovich German|German, D.A.}} & {{a|Marcus A. Koch|Koch, M.}} 2025. ''Helicodraba'' is a new genus of the tribe Arabideae (Brassicaceae), endemic to Morocco. [[ISSN 1560-7259|''Turczaninowia'']] 28(1): 203. {{doi|10.14258/turczaninowia.28.1.20}} [https://turczaninowia.asu.ru/article/view/17104/14764 PDF] <includeonly>[[Template:German &#38; Koch, 2025|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> ourq7hdwk65l2atwfw5ez2si4yoim32 Helicodraba 0 2336458 11322231 2026-10-21T19:05:29Z Andyboorman 251907 Created page with "{{image}} =={{int:Taxonavigation}}== {{Helicodraba}} Species: {{sp|H|elicodraba|cossonii}} {{splast|H|elicodraba|hederifolia}} =={{int:Name}}== ''Helicodraba'' ({{a|O.E.Schulz}}) {{a|D.A.German}} & {{a|M.Koch}}, Turczaninowia 28(1): 203 (2025) * Type species: ''Helicodraba hederifolia'' (Coss.) D.A.German & M.Koch, Turczaninowia 28(1): 203 (2025) ==={{int:Synonyms}}=== {{BA}} **''Draba sect. Helicodraba'' O.E.Schulz, Pflanzenr. IV, 105(Heft 89): 145 (1927). {{nadi| *'..." 11322231 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Helicodraba}} Species: {{sp|H|elicodraba|cossonii}} {{splast|H|elicodraba|hederifolia}} =={{int:Name}}== ''Helicodraba'' ({{a|O.E.Schulz}}) {{a|D.A.German}} & {{a|M.Koch}}, Turczaninowia 28(1): 203 (2025) * Type species: ''Helicodraba hederifolia'' (Coss.) D.A.German & M.Koch, Turczaninowia 28(1): 203 (2025) ==={{int:Synonyms}}=== {{BA}} **''Draba sect. Helicodraba'' O.E.Schulz, Pflanzenr. IV, 105(Heft 89): 145 (1927). {{nadi| *'''Continental: Africa''' **'''Regional: Northwest Africa''' *** Morocco }} =={{int:References}}== ==={{int:Primary references}}=== {{German & Koch, 2025}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{World Plants|2026|Oct|21}} {{IPNI||2026|Oct 21}} 6enrzsx37fvp1ss5z78evs35u0qnrv7 Andinotoxodon bolivarensis 0 2336459 11322233 2026-10-21T19:08:50Z Burmeister 9074 Created page with "{{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species: †''[[Andinotoxodon bolivarensis]]'' =={{int:Name}}== ''Andinotoxodon bolivarensis'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar E. Wilson|Wilson}}, {{a|José L. Román-Carrión|Román-Carrión}}, {{a|Vanessa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} Category:Matías Alberto Armella ta..." 11322233 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species: †''[[Andinotoxodon bolivarensis]]'' =={{int:Name}}== ''Andinotoxodon bolivarensis'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar E. Wilson|Wilson}}, {{a|José L. Román-Carrión|Román-Carrión}}, {{a|Vanessa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} [[Category:Matías Alberto Armella taxa]] [[Category:Oscar E. Wilson taxa]] [[Category:José L. Román-Carrión taxa]] [[Category:Vanessa Serrudo taxa]] [[Category:Richard Harold Madden taxa]] 8amyfghlrw8at92psn49opxjb7zyyhb 11322243 11322233 2026-10-21T19:14:49Z Burmeister 9074 f.n. 11322243 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species: †''[[Andinotoxodon bolivarensis]]'' =={{int:Name}}== ''Andinotoxodon bolivarensis'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar Edward Wilson|Wilson}}, {{a|José Luis Román-Carrión|Román-Carrión}}, {{a|Vanessa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} [[Category:Matías Alberto Armella taxa]] [[Category:Oscar Edward Wilson taxa]] [[Category:José Luis Román-Carrión taxa]] [[Category:Vanessa Serrudo taxa]] [[Category:Richard Harold Madden taxa]] sn3j9yecwj8wzdml1z9yp4eo83n6xe9 11322251 11322243 2026-10-21T19:19:53Z Burmeister 9074 typo 11322251 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species: †''[[Andinotoxodon bolivarensis]]'' =={{int:Name}}== ''Andinotoxodon bolivarensis'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar Edward Wilson|Wilson}}, {{a|José Luis Román-Carrión|Román-Carrión}}, {{a|Vanesa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} [[Category:Matías Alberto Armella taxa]] [[Category:Oscar Edward Wilson taxa]] [[Category:José Luis Román-Carrión taxa]] [[Category:Vanesa Serrudo taxa]] [[Category:Richard Harold Madden taxa]] tfdxa6kspr5qsfbxkvk2tvx4u0t9ceo Template:Andinotoxodon 10 2336460 11322234 2026-10-21T19:09:20Z Burmeister 9074 Created page with "{{Toxodontidae}} Genus: †{{gbr|Andinotoxodon}} {{subst:Taxotemp}}" 11322234 wikitext text/x-wiki {{Toxodontidae}} Genus: †{{gbr|Andinotoxodon}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> d8mjf8dbuirdc1ympbmcy55wxvgzn66 Andinotoxodon 0 2336461 11322236 2026-10-21T19:09:58Z Burmeister 9074 Created page with "{{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species (1): †{{splast|A|ndinotoxodon|bolivarensis}} =={{int:Name}}== ''Andinotoxodon'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar E. Wilson|Wilson}}, {{a|José L. Román-Carrión|Román-Carrión}}, {{a|Vanessa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 * {{int:Type species}}: ''Andinotoxodon bolivarensis'' {{aut|Armella, Wilson, Román-Carrión, Serrudo & Madden}}, 2026, by original design..." 11322236 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species (1): †{{splast|A|ndinotoxodon|bolivarensis}} =={{int:Name}}== ''Andinotoxodon'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar E. Wilson|Wilson}}, {{a|José L. Román-Carrión|Román-Carrión}}, {{a|Vanessa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 * {{int:Type species}}: ''Andinotoxodon bolivarensis'' {{aut|Armella, Wilson, Román-Carrión, Serrudo & Madden}}, 2026, by original designation. =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} [[Category:Matías Alberto Armella taxa]] [[Category:Oscar E. Wilson taxa]] [[Category:José L. Román-Carrión taxa]] [[Category:Vanessa Serrudo taxa]] [[Category:Richard Harold Madden taxa]] dzupgjax31d4pzkqz1ld9mv116akw34 11322242 11322236 2026-10-21T19:14:28Z Burmeister 9074 f.n. 11322242 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species (1): †{{splast|A|ndinotoxodon|bolivarensis}} =={{int:Name}}== ''Andinotoxodon'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar Edward Wilson|Wilson}}, {{a|José Luis Román-Carrión|Román-Carrión}}, {{a|Vanessa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 * {{int:Type species}}: ''Andinotoxodon bolivarensis'' {{aut|Armella, Wilson, Román-Carrión, Serrudo & Madden}}, 2026, by original designation. =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} [[Category:Matías Alberto Armella taxa]] [[Category:Oscar Edward Wilson taxa]] [[Category:José Luis Román-Carrión taxa]] [[Category:Vanessa Serrudo taxa]] [[Category:Richard Harold Madden taxa]] l161kvuv4974bhhfdxvqtl5derrgz33 11322250 11322242 2026-10-21T19:19:37Z Burmeister 9074 typo 11322250 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Andinotoxodon}} Species (1): †{{splast|A|ndinotoxodon|bolivarensis}} =={{int:Name}}== ''Andinotoxodon'' {{a|Matías Alberto Armella|Armella}}, {{a|Oscar Edward Wilson|Wilson}}, {{a|José Luis Román-Carrión|Román-Carrión}}, {{a|Vanesa Serrudo|Serrudo}} & {{a|Richard Harold Madden|Madden}}, 2026 * {{int:Type species}}: ''Andinotoxodon bolivarensis'' {{aut|Armella, Wilson, Román-Carrión, Serrudo & Madden}}, 2026, by original designation. =={{int:References}}== ==={{int:Primary references}}=== {{Armella et al., 2026}} {{Taxonbar}} [[Category:Matías Alberto Armella taxa]] [[Category:Oscar Edward Wilson taxa]] [[Category:José Luis Román-Carrión taxa]] [[Category:Vanesa Serrudo taxa]] [[Category:Richard Harold Madden taxa]] hq94mgi97mq2kefvf61zgz5ue81fjal Template:Armella et al., 2026 10 2336462 11322237 2026-10-21T19:11:15Z Burmeister 9074 Created page with "* {{a|Matías Alberto Armella|Armella, M.A.}}, {{a|Oscar E. Wilson|Wilson, O.E.}}, {{a|José L. Román-Carrión|Román-Carrión, J.L.}}, {{a|Vanessa Serrudo|Serrudo, V.}} & {{a|Richard Harold Madden|Madden, R.H.}} 2026. Formalization of the long-used name ''Andinotoxodon bolivarensis'' {{aut|Madden}} (Toxodontidae, Notoungulata, Mammalia). ''[[Journal of Vertebrate Paleontology]]'' 46(3): e2677746. {{doi|}} {{Access|closed}}{{subst:ReftempZt}}" 11322237 wikitext text/x-wiki * {{a|Matías Alberto Armella|Armella, M.A.}}, {{a|Oscar E. Wilson|Wilson, O.E.}}, {{a|José L. Román-Carrión|Román-Carrión, J.L.}}, {{a|Vanessa Serrudo|Serrudo, V.}} & {{a|Richard Harold Madden|Madden, R.H.}} 2026. Formalization of the long-used name ''Andinotoxodon bolivarensis'' {{aut|Madden}} (Toxodontidae, Notoungulata, Mammalia). ''[[Journal of Vertebrate Paleontology]]'' 46(3): e2677746. {{doi|}} {{Access|closed}} <includeonly>[[Template:Armella et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> j6cngb9w5t4mejyaid20x7gz5c22vnk 11322238 11322237 2026-10-21T19:11:50Z Burmeister 9074 +N.a. 11322238 wikitext text/x-wiki * {{a|Matías Alberto Armella|Armella, M.A.}}, {{a|Oscar E. Wilson|Wilson, O.E.}}, {{a|José L. Román-Carrión|Román-Carrión, J.L.}}, {{a|Vanessa Serrudo|Serrudo, V.}} & {{a|Richard Harold Madden|Madden, R.H.}} 2026. Formalization of the long-used name ''Andinotoxodon bolivarensis'' {{aut|Madden}} (Toxodontidae, Notoungulata, Mammalia). ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'' 46(3): e2677746. {{doi|}} {{Access|closed}} <includeonly>[[Template:Armella et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 2026 ==={{int:New names}} (2)=== * ''[[Andinotoxodon]]'' * ''[[Andinotoxodon bolivarensis]]'' [[Category:Reference templates]]</noinclude> t2ih87u24r49tnrdg3xujxi1eq7nufv 11322241 11322238 2026-10-21T19:14:03Z Burmeister 9074 f. 11322241 wikitext text/x-wiki * {{a|Matías Alberto Armella|Armella, M.A.}}, {{a|Oscar Edward Wilson|Wilson, O.E.}}, {{a|José Luis Román-Carrión|Román-Carrión, J.L.}}, {{a|Vanessa Serrudo|Serrudo, V.}} & {{a|Richard Harold Madden|Madden, R.H.}} 2026. Formalization of the long-used name ''Andinotoxodon bolivarensis'' {{aut|Madden}} (Toxodontidae, Notoungulata, Mammalia). ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'' 46(3): e2677746. {{doi|10.1080/02724634.2026.2677746}} {{Access|closed}} <includeonly>[[Template:Armella et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 2026 ==={{int:New names}} (2)=== * ''[[Andinotoxodon]]'' * ''[[Andinotoxodon bolivarensis]]'' [[Category:Reference templates]]</noinclude> o7fo0udrkro864kxb4mtlopqivthys5 11322248 11322241 2026-10-21T19:19:08Z Burmeister 9074 f.n. 11322248 wikitext text/x-wiki * {{a|Matías Alberto Armella|Armella, M.A.}}, {{a|Oscar Edward Wilson|Wilson, O.E.}}, {{a|José Luis Román-Carrión|Román-Carrión, J.L.}}, {{a|Vanesa Serrudo|Serrudo, V.}} & {{a|Richard Harold Madden|Madden, R.H.}} 2026. Formalization of the long-used name ''Andinotoxodon bolivarensis'' {{aut|Madden}} (Toxodontidae, Notoungulata, Mammalia). ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'' 46(3): e2677746. {{doi|10.1080/02724634.2026.2677746}} {{Access|closed}} <includeonly>[[Template:Armella et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 2026 ==={{int:New names}} (2)=== * ''[[Andinotoxodon]]'' * ''[[Andinotoxodon bolivarensis]]'' [[Category:Reference templates]]</noinclude> 10vmr41aosy7ucln494m9nbdt7yhvy6 Oscar Edward Wilson 0 2336463 11322244 2026-10-21T19:16:55Z Burmeister 9074 Created page with "'''Oscar Edward Wilson''', Finish paleontologist. * Department of Geosciences and Geography, University of Helsinki, P.O. Box 64 (Gustaf Hällströmin katu 2), Helsinki, 00014, Finland. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Wilson, Oscar Edward}} [[Category:Taxon authorities]] [[Category:Palaeontologists]]" 11322244 wikitext text/x-wiki '''Oscar Edward Wilson''', Finish paleontologist. * Department of Geosciences and Geography, University of Helsinki, P.O. Box 64 (Gustaf Hällströmin katu 2), Helsinki, 00014, Finland. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Wilson, Oscar Edward}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 3vnl8nrx8kn5z0wwf50a16zk46si198 11322289 11322244 2026-10-21T20:01:15Z The editor 2345 2915305 He isn’t Finnish. 11322289 wikitext text/x-wiki '''Oscar Edward Wilson''', paleontologist. * Department of Geosciences and Geography, University of Helsinki, P.O. Box 64 (Gustaf Hällströmin katu 2), Helsinki, 00014, Finland. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Wilson, Oscar Edward}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] cas1xgde0ght7jstyrxvkrd3ieiq4ui 11322317 11322289 2026-10-21T20:25:43Z Burmeister 9074 11322317 wikitext text/x-wiki '''Oscar Edward Wilson''', English paleontologist. * Department of Geosciences and Geography, University of Helsinki, P.O. Box 64 (Gustaf Hällströmin katu 2), Helsinki, 00014, Finland. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Wilson, Oscar Edward}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 8d2tqonqwhm28fytlux7r7qrvb7p6bp José Luis Román-Carrión 0 2336464 11322245 2026-10-21T19:17:42Z Burmeister 9074 Created page with "'''José Luis Román-Carrión''', Ecuadorian paleontologist. * Departamento de Biología, Facultad de Ciencias, Escuela Politécnica Nacional, Casilla17-01-2759, Quito, Ecuador. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Roman-Carrion, Jose Luis}} [[Category:Taxon authorities]] [[Category:Palaeontologists]]" 11322245 wikitext text/x-wiki '''José Luis Román-Carrión''', Ecuadorian paleontologist. * Departamento de Biología, Facultad de Ciencias, Escuela Politécnica Nacional, Casilla17-01-2759, Quito, Ecuador. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Armella et al., 2026}} {{Authority control}} {{DEFAULTSORT:Roman-Carrion, Jose Luis}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] a20ajdk7hv89tiqun9s6wpgfcphyown Category:Oscar Edward Wilson taxa 14 2336467 11322252 2026-10-21T19:20:49Z Burmeister 9074 Created page with "{{Taxa by author|Oscar Edward Wilson|Wilson, Oscar Edward}}" 11322252 wikitext text/x-wiki {{Taxa by author|Oscar Edward Wilson|Wilson, Oscar Edward}} kz7ltharc9x66ceimhcxl24z2qn0vf1 Category:José Luis Román-Carrión taxa 14 2336468 11322254 2026-10-21T19:21:49Z Burmeister 9074 Created page with "{{Taxa by author|José Luis Román-Carrión|Roman-Carrion, Jose Luis}}" 11322254 wikitext text/x-wiki {{Taxa by author|José Luis Román-Carrión|Roman-Carrion, Jose Luis}} 02ig1fqcmu3d0g4i8n31jvasujjzpzz Román-Carrión 0 2336469 11322255 2026-10-21T19:22:10Z Burmeister 9074 Redirected page to [[José Luis Román-Carrión]] 11322255 wikitext text/x-wiki #REDIRECT [[José Luis Román-Carrión]] 9fqsu7amfv4dkfbtdxzvrwoei1k4lhl José L. Román-Carrión 0 2336470 11322256 2026-10-21T19:22:23Z Burmeister 9074 Redirected page to [[José Luis Román-Carrión]] 11322256 wikitext text/x-wiki #REDIRECT [[José Luis Román-Carrión]] 9fqsu7amfv4dkfbtdxzvrwoei1k4lhl Oscar E. Wilson 0 2336471 11322257 2026-10-21T19:22:56Z Burmeister 9074 Redirected page to [[Oscar Edward Wilson]] 11322257 wikitext text/x-wiki #REDIRECT [[Oscar Edward Wilson]] 9n257rdz1j7py8komlldcoxwivfbaur Matías A. Armella 0 2336472 11322258 2026-10-21T19:23:12Z Burmeister 9074 Redirected page to [[Matías Alberto Armella]] 11322258 wikitext text/x-wiki #REDIRECT [[Matías Alberto Armella]] k2g8fcupdhqg35uxpj80u1ae4hjiv6y Vitrina pellucida 0 2336474 11322267 2026-10-21T19:43:09Z Isfisk 2639 New 11322267 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Vitrina}} Species: ''[[Vitrina pellucida]]'' =={{int:Name}}== ''Vitrina pellucida'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix pellucida'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q1791116}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] 9d56ri6h2odth8u225oue923cf5jb0l Helix pellucida 0 2336475 11322268 2026-10-21T19:43:36Z Isfisk 2639 Redirected page to [[Vitrina pellucida]] 11322268 wikitext text/x-wiki #REDIRECT [[Vitrina pellucida]] gc60z4xw1nbt1asxbaf02pp229so6wc Template:× Brassarda 10 2336476 11322269 2026-10-21T19:44:05Z Andyboorman 251907 Created page with "{{Brassicaceae}} Genus: {{gbr|× Brassarda}}" 11322269 wikitext text/x-wiki {{Brassicaceae}} Genus: {{gbr|× Brassarda}} axpkj6bpn6ztwqw9g0iic5qb1oz60n2 Mionictis 0 2336477 11322270 2026-10-21T19:45:13Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Mionictis}} Species (4): †{{sp|M|ionictis|dubia}} †{{sp|M|ionictis|elegans}} †{{sp|M|ionictis|incertus}} †{{splast|M|ionictis|letifer}} =={{int:Name}}== ''Mionictis'' {{a|William Diller Matthew|Matthew}}, 1924 * {{int:Type species}}: ''Mionictis incertus'' {{aut|Matthew}}, 1924. =={{int:References}}== ==={{int:Primary references}}=== {{Matthew, 1924}} {{Taxonbar}} [[Category:William Diller Matthew taxa]]" 11322270 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mionictis}} Species (4): †{{sp|M|ionictis|dubia}} †{{sp|M|ionictis|elegans}} †{{sp|M|ionictis|incertus}} †{{splast|M|ionictis|letifer}} =={{int:Name}}== ''Mionictis'' {{a|William Diller Matthew|Matthew}}, 1924 * {{int:Type species}}: ''Mionictis incertus'' {{aut|Matthew}}, 1924. =={{int:References}}== ==={{int:Primary references}}=== {{Matthew, 1924}} {{Taxonbar}} [[Category:William Diller Matthew taxa]] nf3m1shyx9qke3im5nx9j38mdz8unxc 11322273 11322270 2026-10-21T19:47:12Z The editor 2345 2915305 11322273 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mionictis}} Species (4): †{{sp|M|ionictis|dubia}} †{{sp|M|ionictis|elegans}} †{{sp|M|ionictis|incertus}} †{{splast|M|ionictis|letifer}} =={{int:Name}}== ''Mionictis'' {{a|William Diller Matthew|Matthew}}, 1924 * {{int:Type species}}: ''Mionictis incertus'' {{aut|Matthew}}, 1924. =={{int:References}}== ==={{int:Primary references}}=== {{Matthew, 1924a}} {{Taxonbar}} [[Category:William Diller Matthew taxa]] g7d8ipy4c0zv0ttp8nhf9njb2iiavt5 Template:Mionictis 10 2336478 11322271 2026-10-21T19:45:47Z The editor 2345 2915305 Created page with "{{Lutrinae}} Genus: †{{gbr|Mionictis}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322271 wikitext text/x-wiki {{Lutrinae}} Genus: †{{gbr|Mionictis}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 3ekjjf3tkly12jwques9wftrab7zalw Mionictis incertus 0 2336479 11322272 2026-10-21T19:46:51Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Mionictis}} Species: †''[[Mionictis incertus]]'' =={{int:Name}}== ''Mionictis incertus'' {{a|William Diller Matthew|Matthew}}, 1924 =={{int:References}}== ==={{int:Primary references}}=== {{Matthew, 1924}} {{Taxonbar}} [[Category:William Diller Matthew taxa]]" 11322272 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mionictis}} Species: †''[[Mionictis incertus]]'' =={{int:Name}}== ''Mionictis incertus'' {{a|William Diller Matthew|Matthew}}, 1924 =={{int:References}}== ==={{int:Primary references}}=== {{Matthew, 1924}} {{Taxonbar}} [[Category:William Diller Matthew taxa]] nhyqrb72x8k4bct5ftsaxvg6sldcmra 11322274 11322272 2026-10-21T19:47:19Z The editor 2345 2915305 11322274 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Mionictis}} Species: †''[[Mionictis incertus]]'' =={{int:Name}}== ''Mionictis incertus'' {{a|William Diller Matthew|Matthew}}, 1924 =={{int:References}}== ==={{int:Primary references}}=== {{Matthew, 1924a}} {{Taxonbar}} [[Category:William Diller Matthew taxa]] 3vm6o2pejgsih2uzx52vkx0jfz3qi7p Enhydriodon sivalensis 0 2336480 11322276 2026-10-21T19:49:36Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Enhydriodon}} Species: †''[[Enhydriodon sivalensis]]'' =={{int:Name}}== ''Enhydriodon sivalensis'' {{a|Hugh Falconer|Falconer}}, 1868 =={{int:References}}== ==={{int:Primary references}}=== {{Falconer, 1868}} [[Category:Hugh Falconer taxa]]" 11322276 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Enhydriodon}} Species: †''[[Enhydriodon sivalensis]]'' =={{int:Name}}== ''Enhydriodon sivalensis'' {{a|Hugh Falconer|Falconer}}, 1868 =={{int:References}}== ==={{int:Primary references}}=== {{Falconer, 1868}} [[Category:Hugh Falconer taxa]] 5848oe59f2rr81lla2iqcdpzsmioyrz × Brassarda 0 2336481 11322277 2026-10-21T19:49:53Z Andyboorman 251907 Created page with "{{image}} =={{int:Taxonavigation}}== {{× Brassarda}} Species: {{splast|× B|rassarda|juncea}} =={{int:Name}}== ''× Brassarda'' {{a|Su Liu}} & {{a|Z.H.Feng}}, Phytoneuron 2024-85: 10 (2024) *{{fohy|Brassica|L., Sp. Pl. 2: 666 (1753)|Mutarda|Bernh., Syst. Verz. Erf.: 184 (1800)}} ==={{int:Synonyms}}=== {{HET}} **''Sinabraca'' G.H.Loos, Florist. Rundbr., Beih. 7: 131 (2004) {{nadi| *'''Continental: Asia-Temperate''' **'''Regional: Western Asia''' *** North Caucasus, Tr..." 11322277 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{× Brassarda}} Species: {{splast|× B|rassarda|juncea}} =={{int:Name}}== ''× Brassarda'' {{a|Su Liu}} & {{a|Z.H.Feng}}, Phytoneuron 2024-85: 10 (2024) *{{fohy|Brassica|L., Sp. Pl. 2: 666 (1753)|Mutarda|Bernh., Syst. Verz. Erf.: 184 (1800)}} ==={{int:Synonyms}}=== {{HET}} **''Sinabraca'' G.H.Loos, Florist. Rundbr., Beih. 7: 131 (2004) {{nadi| *'''Continental: Asia-Temperate''' **'''Regional: Western Asia''' *** North Caucasus, Transcaucasus Widely introduced and naturalised }} =={{int:References}}== ==={{int:Primary references}}=== {{Z.H.Feng et al., 2024}} ==={{int:Links}}=== {{POWO|2026|Oct|21}} {{IPNI||2026|Oct 21}} 416hj75anpos7tvwi5t508h3ysan8gw Papuina 0 2336482 11322278 2026-10-21T19:50:12Z Isfisk 2639 New 11322278 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Papuina}} Species: {{sp|P|apuina|pileus}} ... =={{int:Name}}== ''Charopa'' {{a|Eduard Carl von Martens|E. von Martens}}, 1860 =={{int:References}}== ==={{int:Primary references}}=== {{Albers & von Martens, 1860}} {{Commonscat}} {{Taxonbar|from=Q28028031}} [[Category:Eduard Carl von Martens taxa]] dx1a1czvapq3lstw5u6bmhvkmqy5s8w Template:Triapitsyn, Kim & Kang, 2026 10 2336483 11322279 2026-10-21T19:51:03Z Neferkheperre 947633 Created page with "* {{a|Serguei V. Triapitsyn|Triapitsyn, S.V.}}, {{a|Soohyun Kim|Kim, S.}} & {{a|Ilgoo Kang|Kamg, I.}} 2026. Checklist of Korean Mymaridae (Hymenoptera, Chalcidoidea) with new records and descriptions of two new species of ''Zeyanus'' from South Korea and Japan. [[ISSN 1313-2989|''ZooKeys'']] 1295: 129–159. {{doi|10.3897/zookeys.1295.200780}} {{Access|open}}{{subst:ReftempZt}}" 11322279 wikitext text/x-wiki * {{a|Serguei V. Triapitsyn|Triapitsyn, S.V.}}, {{a|Soohyun Kim|Kim, S.}} & {{a|Ilgoo Kang|Kamg, I.}} 2026. Checklist of Korean Mymaridae (Hymenoptera, Chalcidoidea) with new records and descriptions of two new species of ''Zeyanus'' from South Korea and Japan. [[ISSN 1313-2989|''ZooKeys'']] 1295: 129–159. {{doi|10.3897/zookeys.1295.200780}} {{Access|open}} <includeonly>[[Template:Triapitsyn, Kim &#38; Kang, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> jmyssuwdkarupfxki5kcb3di0g2cls8 11322298 11322279 2026-10-21T20:07:00Z Neferkheperre 947633 11322298 wikitext text/x-wiki * {{a|Serguei V. Triapitsyn|Triapitsyn, S.V.}}, {{a|Soohyun Kim|Kim, S.}} & {{a|Ilgoo Kang|Kamg, I.}} 2026. Checklist of Korean Mymaridae (Hymenoptera, Chalcidoidea) with new records and descriptions of two new species of ''Zeyanus'' from South Korea and Japan. [[ISSN 1313-2989|''ZooKeys'']] 1295: 129–159. {{doi|10.3897/zookeys.1295.200780}} {{Access|open}} <includeonly>[[Template:Triapitsyn, Kim &#38; Kang, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 21 October 2026 * {{ZooBank|E001B2F1-D84A-4CB5-B783-C3E155BE9759}} ==={{int:New names}} (2)=== * ''[[Zeyanus knuz]]'' {{aut|Triapitsyn & Kim}} * ''[[Zeyanus sunayez]]'' {{aut|Triapitsyn & Kim}} [[Category:Reference templates]]</noinclude> bzuclcig7e0oc1xce6tzpyt2veq3rwi 11322306 11322298 2026-10-21T20:12:38Z Neferkheperre 947633 11322306 wikitext text/x-wiki * {{a|Serguei V. Triapitsyn|Triapitsyn, S.V.}}, {{a|Soohyun Kim|Kim, S.}} & {{a|Ilgoo Kang|Kang, I.}} 2026. Checklist of Korean Mymaridae (Hymenoptera, Chalcidoidea) with new records and descriptions of two new species of ''Zeyanus'' from South Korea and Japan. [[ISSN 1313-2989|''ZooKeys'']] 1295: 129–159. {{doi|10.3897/zookeys.1295.200780}} {{Access|open}} <includeonly>[[Template:Triapitsyn, Kim &#38; Kang, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 21 October 2026 * {{ZooBank|E001B2F1-D84A-4CB5-B783-C3E155BE9759}} ==={{int:New names}} (2)=== * ''[[Zeyanus knuz]]'' {{aut|Triapitsyn & Kim}} * ''[[Zeyanus sunayez]]'' {{aut|Triapitsyn & Kim}} [[Category:Reference templates]]</noinclude> dq4ftdiocmrj7x3qklvc0pje5tefi03 Template:Papuina 10 2336484 11322281 2026-10-21T19:51:41Z Isfisk 2639 New 11322281 wikitext text/x-wiki {{Hadrinae}} Genus: ''[[Papuina]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> mnga3hvai6cdtvq36mys2xox80fz9dn Papuina pileus 0 2336485 11322283 2026-10-21T19:53:44Z Isfisk 2639 New 11322283 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Papuina}} Species: ''[[Papuina pileus]]'' =={{int:Name}}== ''Papuina pileus'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix pileus'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q106245020}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] 9osswgm90d5rkauiioh0se7u0po72cm Helix pileus 0 2336486 11322284 2026-10-21T19:53:50Z Isfisk 2639 Redirected page to [[Papuina pileus]] 11322284 wikitext text/x-wiki #REDIRECT [[Papuina pileus]] stj69d8kn070sfhm98fyw3yw1vxqh2g Theba pisana 0 2336487 11322286 2026-10-21T19:55:37Z Isfisk 2639 New 11322286 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Theba}} Species: ''[[Theba pisana]]'' =={{int:Name}}== ''Theba pisana'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix pisana'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q1940276}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] 0894mnlzm3gkq5req94ipz0yi7r4ov4 Helix pisana 0 2336488 11322287 2026-10-21T19:56:00Z Isfisk 2639 Redirected page to [[Theba pisana]] 11322287 wikitext text/x-wiki #REDIRECT [[Theba pisana]] iimc23b2gi47mo7p9jokgq5la0ms7qu Strophocheilus 0 2336489 11322293 2026-10-21T20:04:13Z Isfisk 2639 New 11322293 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Strophocheilus}} Species: {{sp|S|trophocheilus|calus}} {{sp|S|trophocheilus|debilis}} {{sp|S|trophocheilus|miersi}} {{splast|S|trophocheilus|pudicus}} =={{int:Name}}== ''Strophocheilus'' {{a|Spix}}, 1827 {{Commonscat}} {{Taxonbar|from=Q27982598}} 1rnv2z1rj4wcsrvqqxgpsvkf7wrb2nd Template:Strophocheilus 10 2336490 11322294 2026-10-21T20:04:56Z Isfisk 2639 New 11322294 wikitext text/x-wiki {{Strophocheilinae}} Genus: ''[[Strophocheilus]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> jgzw60ol0es1p0agabgbv88nnkmwt0f Template:Baskin, 2020 10 2336491 11322295 2026-10-21T20:05:24Z The editor 2345 2915305 Created page with "* {{a|Jon Alan Baskin|Baskin, J.A.}} 2020. Mustelidae from Observation Quarry (early Barstovian) of Nebraska, with comments on Sheep Creek and lower Snake Creek mustelids. ''[[ISSN 1091-0263|Paludicola]]'' 12(4): 223–246. <includeonly>[[Template:Baskin, 2020|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noincl..." 11322295 wikitext text/x-wiki * {{a|Jon Alan Baskin|Baskin, J.A.}} 2020. Mustelidae from Observation Quarry (early Barstovian) of Nebraska, with comments on Sheep Creek and lower Snake Creek mustelids. ''[[ISSN 1091-0263|Paludicola]]'' 12(4): 223–246. <includeonly>[[Template:Baskin, 2020|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> hd8ma86lo16qr8lj32s0k7ganch6swr Strophocheilus pudicus 0 2336492 11322296 2026-10-21T20:06:31Z Isfisk 2639 New 11322296 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Strophocheilus}} Species: ''[[Strophocheilus pudicus]]'' =={{int:Name}}== ''Strophocheilus pudicus'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix pudica'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q41021606}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] gn30z99ue1czd0tvdovh3qu3qaulfnq Helix pudica 0 2336493 11322297 2026-10-21T20:06:59Z Isfisk 2639 Redirected page to [[Strophocheilus pudicus]] 11322297 wikitext text/x-wiki #REDIRECT [[Strophocheilus pudicus]] 2213f34vqjoje06gvhkevxef21inyhi Skopelogale 0 2336494 11322300 2026-10-21T20:07:13Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Skopelogale}} Species (1): †{{splast|S|kopelogale|melitodes}} =={{int:Name}}== ''Skopelogale'' {{a|Jon Alan Baskin|Baskin}}, 2020 * {{int:Type species}}: ''Skopelogale melitodes'' {{aut|Baskin}}, 2020. =={{int:References}}== ==={{int:Primary references}}=== {{Baskin, 2020}} {{Taxonbar}} [[Category:Jon Alan Baskin taxa]]" 11322300 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Skopelogale}} Species (1): †{{splast|S|kopelogale|melitodes}} =={{int:Name}}== ''Skopelogale'' {{a|Jon Alan Baskin|Baskin}}, 2020 * {{int:Type species}}: ''Skopelogale melitodes'' {{aut|Baskin}}, 2020. =={{int:References}}== ==={{int:Primary references}}=== {{Baskin, 2020}} {{Taxonbar}} [[Category:Jon Alan Baskin taxa]] tvfrl79pe75wshe57i9zhh1f9vaf8uf Template:Skopelogale 10 2336495 11322301 2026-10-21T20:07:41Z The editor 2345 2915305 Created page with "{{Mustelinae}} Genus: †{{gbr|Skopelogale}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322301 wikitext text/x-wiki {{Mustelinae}} Genus: †{{gbr|Skopelogale}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> qocjkbruzaq4h27i365pdnqw3z44tci Skopelogale melitodes 0 2336496 11322302 2026-10-21T20:08:26Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Skopelogale}} Species: †''[[Skopelogale melitodes]]'' =={{int:Name}}== ''Skopelogale melitodes'' {{a|Jon Alan Baskin|Baskin}}, 2020 =={{int:References}}== ==={{int:Primary references}}=== {{Baskin, 2020}} {{Taxonbar}} [[Category:Jon Alan Baskin taxa]]" 11322302 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Skopelogale}} Species: †''[[Skopelogale melitodes]]'' =={{int:Name}}== ''Skopelogale melitodes'' {{a|Jon Alan Baskin|Baskin}}, 2020 =={{int:References}}== ==={{int:Primary references}}=== {{Baskin, 2020}} {{Taxonbar}} [[Category:Jon Alan Baskin taxa]] etechqfrveic0w4ht6s5m8iaswrx5fy Vallonia pulchella 0 2336497 11322303 2026-10-21T20:09:44Z Isfisk 2639 New 11322303 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Vallonia}} Species: ''[[Vallonia pulchella]]'' =={{int:Name}}== ''Vallonia pulchella'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix pulchella'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q3138089}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] 7o3u86gt4r6vjh4dlg1h0wwi0l79q7g Helix pulchella 0 2336498 11322304 2026-10-21T20:10:10Z Isfisk 2639 Redirected page to [[Vallonia pulchella]] 11322304 wikitext text/x-wiki #REDIRECT [[Vallonia pulchella]] 1po0bs95hfd0pm8566sojjg5ycp7nmj Helix punctata 0 2336499 11322312 2026-10-21T20:20:53Z Isfisk 2639 Redirected page to [[Otala punctata]] 11322312 wikitext text/x-wiki #REDIRECT [[Otala punctata]] n6u5f432ghq56xcokb6rpkm0sv95boj Barbara Rzebik-Kowalska 0 2336500 11322315 2026-10-21T20:23:25Z The editor 2345 2915305 Created page with "'''Barbara Rzebik-Kowalska''', Polish paleontologist. * Institute of Systematics and Evolution of Animals, Polish Academy of Sciences, Sławkowska 17, 31-016 Kraków, Poland. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===1981=== {{Rzebik-Kowalska, 1981}} ===2014=== {{Rzebik-Kowalska, 2014}} {{Authority control}} {{DEFAULTSORT:Rzebik-Kowalska, Barbara}} [[Category:Taxon authorities]] [[Category:Palaeontologists]]" 11322315 wikitext text/x-wiki '''Barbara Rzebik-Kowalska''', Polish paleontologist. * Institute of Systematics and Evolution of Animals, Polish Academy of Sciences, Sławkowska 17, 31-016 Kraków, Poland. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===1981=== {{Rzebik-Kowalska, 1981}} ===2014=== {{Rzebik-Kowalska, 2014}} {{Authority control}} {{DEFAULTSORT:Rzebik-Kowalska, Barbara}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] coby497f9r96hh5sj1uxsj2orw1qey7 11322330 11322315 2026-10-21T20:42:10Z The editor 2345 2915305 11322330 wikitext text/x-wiki '''Barbara Rzebik-Kowalska''', Polish paleontologist. * Institute of Systematics and Evolution of Animals, Polish Academy of Sciences, Sławkowska 17, 31-016 Kraków, Poland. {{Taxa authored}} =={{int:Publications}}== {{inc}} ===1975=== {{Rzebik-Kowalska, 1975}} ===1981=== {{Rzebik-Kowalska, 1981}} ===2014=== {{Rzebik-Kowalska, 2014}} {{Authority control}} {{DEFAULTSORT:Rzebik-Kowalska, Barbara}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] h9qnrwfhcssysp6fbvfe0z93ugp8myz 11322451 11322330 2026-10-21T22:28:13Z The editor 2345 2915305 11322451 wikitext text/x-wiki '''Barbara Rzebik-Kowalska''', Polish paleontologist. * Institute of Systematics and Evolution of Animals, Polish Academy of Sciences, Sławkowska 17, 31-016 Kraków, Poland. {{Taxa authored}} {{Eponyms}} =={{int:Publications}}== {{inc}} ===1975=== {{Rzebik-Kowalska, 1975}} ===1981=== {{Rzebik-Kowalska, 1981}} ===2014=== {{Rzebik-Kowalska, 2014}} {{Authority control}} {{DEFAULTSORT:Rzebik-Kowalska, Barbara}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] oejlsggs3odxkizybrok1iv9ugbj4lw Template:Rzebik-Kowalska, 1981 10 2336501 11322318 2026-10-21T20:27:21Z The editor 2345 2915305 Created page with "* {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 1981. The Pliocene and Pleistocene Insectivora (Mammalia) of Poland. IV. Soricidae: ''Neomysorex'' n. gen. and ''Episoriculus'' {{aut|Ellerman}} et {{aut|Morrison-Scott}} 1951 ''[[ISSN 0065-1710|Acta Zoologica Cracoviensia]]'' 25(8): 227-250. <includeonly>[[Template:Rzebik-Kowalska, 1981|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispeci..." 11322318 wikitext text/x-wiki * {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 1981. The Pliocene and Pleistocene Insectivora (Mammalia) of Poland. IV. Soricidae: ''Neomysorex'' n. gen. and ''Episoriculus'' {{aut|Ellerman}} et {{aut|Morrison-Scott}} 1951 ''[[ISSN 0065-1710|Acta Zoologica Cracoviensia]]'' 25(8): 227-250. <includeonly>[[Template:Rzebik-Kowalska, 1981|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> mbodlsoo7otbbg8lc96fdzcdakq8jci 11322336 11322318 2026-10-21T20:44:26Z The editor 2345 2915305 /* */ 11322336 wikitext text/x-wiki * {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 1981. The Pliocene and Pleistocene Insectivora (Mammalia) of Poland. IV. Soricidae: ''Neomysorex'' n. gen. and ''Episoriculus'' {{aut|Ellerman}} et {{aut|Morrison-Scott}} 1951. ''[[ISSN 0065-1710|Acta Zoologica Cracoviensia]]'' 25(8): 227-250. <includeonly>[[Template:Rzebik-Kowalska, 1981|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> hduykohlk172o57c57hinr2nz4vismz Jaminia 0 2336502 11322320 2026-10-21T20:29:46Z Isfisk 2639 New 11322320 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Jaminia}} Species: {{sp|J|aminia|loewii}} {{sp|J|aminia|quadridens}} {{splast|J|aminia|thiesseana}} =={{int:Name}}== ''Jaminia'' {{a|Antoine Risso|Risso}}, 1826 =={{int:References}}== ==={{int:Primary references}}=== {{Risso, 1826a}} {{Commonscat}} {{Taxonbar|from=Q18021134}} [[Category:Antoine Risso taxa]] i8fsjn5k5zlzkxj995qzgl2xjll3wul Template:Rzebik-Kowalska, 2014 10 2336503 11322321 2026-10-21T20:30:53Z The editor 2345 2915305 Created page with "* {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 2014. Review of the Pliocene and Pleistocene Talpidae (Soricomorpha, Mammalia) of Poland. ''[[ISSN 1935-3952|Palaeontologia Electronica]]'' 17 (2; 26A): 1-26. <includeonly>[[Template:Rzebik-Kowalska, 2014|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude>" 11322321 wikitext text/x-wiki * {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 2014. Review of the Pliocene and Pleistocene Talpidae (Soricomorpha, Mammalia) of Poland. ''[[ISSN 1935-3952|Palaeontologia Electronica]]'' 17 (2; 26A): 1-26. <includeonly>[[Template:Rzebik-Kowalska, 2014|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 8kfywtvnhzca9aukw44m7ip1rl1ompl Skoczenia 0 2336504 11322322 2026-10-21T20:33:07Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Skoczenia}} Species (1): †{{splast|S|koczenia|copernici}} =={{int:Name}}== ''Skoczenia'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 2014 * {{int:Type species}}: ''Geotrypus copernici'' {{aut|Skoczeń}}, 1980. =={{int:References}}== ==={{int:References}}=== {{Rzebik-Kowalska, 2014}} {{Taxonbar}} [[Category:Barbara Rzebik-Kowalska taxa]]" 11322322 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Skoczenia}} Species (1): †{{splast|S|koczenia|copernici}} =={{int:Name}}== ''Skoczenia'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 2014 * {{int:Type species}}: ''Geotrypus copernici'' {{aut|Skoczeń}}, 1980. =={{int:References}}== ==={{int:References}}=== {{Rzebik-Kowalska, 2014}} {{Taxonbar}} [[Category:Barbara Rzebik-Kowalska taxa]] ia0385gky5c4c6p113ryagd8fhu3eb9 Template:Skoczenia 10 2336505 11322324 2026-10-21T20:33:36Z The editor 2345 2915305 Created page with "{{Talpini}} Genus: †{{gbr|Skoczenia}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322324 wikitext text/x-wiki {{Talpini}} Genus: †{{gbr|Skoczenia}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 0fq9ven92aofnpdyeknb474ay9f2qh0 Soohyun Kim 0 2336506 11322325 2026-10-21T20:34:59Z Neferkheperre 947633 Created page with "{{Image|}} '''Soohyun Kim''', Korean entomologist * Department of Ecological Science, Kyungpook National University, Sangju, Republic of Korea {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Triapitsyn, Kim & Kang, 2026}} {{Authority control}} {{DEFAULTSORT:Kim, Soohyun}} [[Category:Taxon authorities]] [[Category:entomologists]]" 11322325 wikitext text/x-wiki {{Image|}} '''Soohyun Kim''', Korean entomologist * Department of Ecological Science, Kyungpook National University, Sangju, Republic of Korea {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Triapitsyn, Kim & Kang, 2026}} {{Authority control}} {{DEFAULTSORT:Kim, Soohyun}} [[Category:Taxon authorities]] [[Category:entomologists]] k7yaac9xt0775c0r3hkj6f967hmn15z 11322385 11322325 2026-10-21T21:32:26Z The editor 2345 2915305 11322385 wikitext text/x-wiki {{Image|}} '''Soohyun Kim''', South Korean entomologist. * Department of Ecological Science, Kyungpook National University, Sangju, Republic of Korea. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Triapitsyn, Kim & Kang, 2026}} {{Authority control}} {{DEFAULTSORT:Kim, Soohyun}} [[Category:Taxon authorities]] [[Category:entomologists]] alh1s5s44kdgbrr468nl5vzjmhl426u Category:Barbara Rzebik-Kowalska taxa 14 2336507 11322326 2026-10-21T20:35:36Z The editor 2345 2915305 Created page with "{{Taxa by author|Barbara Rzebik-Kowalska|Rzebik-Kowalska, Barbara}}" 11322326 wikitext text/x-wiki {{Taxa by author|Barbara Rzebik-Kowalska|Rzebik-Kowalska, Barbara}} l3okyf9udlzhvw93xp8495zqzr38t8l Category:Soohyun Kim taxa 14 2336508 11322333 2026-10-21T20:44:06Z Neferkheperre 947633 Created page with "{{taxa by author|Soohyun Kim|Kim, Soohyun}}" 11322333 wikitext text/x-wiki {{taxa by author|Soohyun Kim|Kim, Soohyun}} 3u2wzkaw966tfq1gmk0u6j4uew5c39z Template:Rzebik-Kowalska, 1975 10 2336509 11322334 2026-10-21T20:44:11Z The editor 2345 2915305 Created page with "* {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 1975. The Pliocene and Pleistocene insectivores (Mammalia) of Poland. II. Soricidae: ''Paranourosorex'' and ''Amblycoptus''. ''[[ISSN 0065-1710|Acta Zoologica Cracoviensia]]'' 20(6): 167-182. <includeonly>[[Template:Rzebik-Kowalska, 1975|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. Category:..." 11322334 wikitext text/x-wiki * {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 1975. The Pliocene and Pleistocene insectivores (Mammalia) of Poland. II. Soricidae: ''Paranourosorex'' and ''Amblycoptus''. ''[[ISSN 0065-1710|Acta Zoologica Cracoviensia]]'' 20(6): 167-182. <includeonly>[[Template:Rzebik-Kowalska, 1975|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 2cv4vbp7onpurld31foo3rsm9omv0gz 11322335 11322334 2026-10-21T20:44:20Z The editor 2345 2915305 /* */ 11322335 wikitext text/x-wiki * {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska, B.}} 1975. The Pliocene and Pleistocene insectivores (Mammalia) of Poland. II. Soricidae: ''Paranourosorex'' and ''Amblycoptus''. ''[[ISSN 0065-1710|Acta Zoologica Cracoviensia]]'' 20(6): 167–182. <includeonly>[[Template:Rzebik-Kowalska, 1975|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> r418b4xzo2rn9liflitgkm73ai4zh0b Paranourosorex gigas 0 2336510 11322337 2026-10-21T20:45:29Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Paranourosorex}} Species: †''[[Paranourosorex gigas]]'' =={{int:Name}}== ''Paranourosorex gigas'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 1975 =={{int:References}}== ==={{int:Primary references}}=== {{Rzebik-Kowalska, 1975}} {{Taxonbar}} [[Category:Barbara Rzebik-Kowalska taxa]]" 11322337 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Paranourosorex}} Species: †''[[Paranourosorex gigas]]'' =={{int:Name}}== ''Paranourosorex gigas'' {{a|Barbara Rzebik-Kowalska|Rzebik-Kowalska}}, 1975 =={{int:References}}== ==={{int:Primary references}}=== {{Rzebik-Kowalska, 1975}} {{Taxonbar}} [[Category:Barbara Rzebik-Kowalska taxa]] 3b8hduxxuhon33e6un5335itk79ewxr Template:Jaminia 10 2336511 11322338 2026-10-21T20:46:15Z Isfisk 2639 New 11322338 wikitext text/x-wiki {{Enini}} Genus: ''[[Jaminia]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> dc35ce07nlo6u02ei07x0bdd9iw97s0 Template:Kormos, 1926 10 2336512 11322343 2026-10-21T20:51:15Z The editor 2345 2915305 Created page with "* {{a|Tivadar Kormos|Kormos, T.}} 1926. {{lang|hu|''Amblycoptus oligodon''n. g. & n. sp. új cickány-féle a Magyarországi Pliocénból}}. ''[[ISSN 0521-4726|Annales historico-naturales Musei nationalis hungarici]]'' 24: 352–391. <includeonly>[[Template:Kormos, 1926|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. Category:Reference templates..." 11322343 wikitext text/x-wiki * {{a|Tivadar Kormos|Kormos, T.}} 1926. {{lang|hu|''Amblycoptus oligodon''n. g. & n. sp. új cickány-féle a Magyarországi Pliocénból}}. ''[[ISSN 0521-4726|Annales historico-naturales Musei nationalis hungarici]]'' 24: 352–391. <includeonly>[[Template:Kormos, 1926|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> omzlylq7xmb4yci3lbj3jz7glddgn7t 11322344 11322343 2026-10-21T20:51:25Z The editor 2345 2915305 /* */ 11322344 wikitext text/x-wiki * {{a|Tivadar Kormos|Kormos, T.}} 1926. {{lang|hu|''Amblycoptus oligodon'' n. g. & n. sp. új cickány-féle a Magyarországi Pliocénból}}. ''[[ISSN 0521-4726|Annales historico-naturales Musei nationalis hungarici]]'' 24: 352–391. <includeonly>[[Template:Kormos, 1926|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> dy4foejuj3clwgwnafxcfcq3dyro2gt Ferussacia 0 2336513 11322346 2026-10-21T20:53:49Z Isfisk 2639 New 11322346 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Ferussacia}} Species: {{sp|F|erussacia|folliculum}} ... =={{int:Name}}== ''Ferussacia'' {{a|Antoine Risso|Risso}}, 1826 =={{int:References}}== ==={{int:Primary references}}=== {{Risso, 1826a}} {{Commonscat}} {{Taxonbar|from=Q18606973}} [[Category:Antoine Risso taxa]] 8hjyzqpxe17m5wdhhznzu8u9nih31fd Amblycoptus oligodon 0 2336514 11322347 2026-10-21T20:54:26Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Amblycoptus}} Species: †''[[Amblycoptus oligodon]]'' =={{int:Name}}== ''Amblycoptus oligodon'' {{a|Tivadar Kormos|Kormos}}, 1926 =={{int:References}}== ==={{int:Primary references}}=== {{Kormos, 1926}} {{Taxonbar}} [[Category:Tivadar Kormos taxa]]" 11322347 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Amblycoptus}} Species: †''[[Amblycoptus oligodon]]'' =={{int:Name}}== ''Amblycoptus oligodon'' {{a|Tivadar Kormos|Kormos}}, 1926 =={{int:References}}== ==={{int:Primary references}}=== {{Kormos, 1926}} {{Taxonbar}} [[Category:Tivadar Kormos taxa]] rd872z8ijsezy1kdzi13gpv9g3n5dtw Template:Ferussacia 10 2336515 11322348 2026-10-21T20:54:29Z Isfisk 2639 New 11322348 wikitext text/x-wiki {{Ferussaciidae}} Genus: ''[[Ferussacia]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> tlb5rr4gje6lujogq2qbdz9pw7zk462 User:Pigsonthewing/sandbox 2 2336516 11322349 2026-10-21T20:55:17Z Pigsonthewing 1048 + 11322349 wikitext text/x-wiki ; <code><nowiki>{{cite q| Q109321060 |authorlink1=Mirjana Roksandic |last1=Roksandic |first1=M. |authorlink2=Predrag Radović |last2=Radović |first2=P. |authorlink3=Xiu-Jie Wu |last3=Wu |first3=X.-J. |authorlink4=Christopher J. Bae |last4=Bae |first4=C.J. |journal=Evolutionary Anthropology |doi-access=free |publication-date=2021}} </nowiki></code> : {{cite q| Q109321060 |authorlink1=Mirjana Roksandic |last1=Roksandic |first1=M. |authorlink2=Predrag Radović |last2=Radović |first2=P. |authorlink3=Xiu-Jie Wu |last3=Wu |first3=X.-J. |authorlink4=Christopher J. Bae |last4=Bae |first4=C.J. |journal=Evolutionary Anthropology |doi-access=free |publication-date=2021}} ; <code><nowiki>{{cite q| Q109321060 |authorlink1=Mirjana Roksandic |last1=Roksandic |first1=M. |authorlink2=Predrag Radović |last2=Radović |first2=P. |authorlink3=Xiu-Jie Wu |last3=Wu |first3=X.-J. |authorlink4=Christopher J. Bae |last4=Bae |first4=C.J. |journal=Evolutionary Anthropology |publication-date=2021}} </nowiki></code> : {{cite q| Q109321060 |authorlink1=Mirjana Roksandic |last1=Roksandic |first1=M. |authorlink2=Predrag Radović |last2=Radović |first2=P. |authorlink3=Xiu-Jie Wu |last3=Wu |first3=X.-J. |authorlink4=Christopher J. Bae |last4=Bae |first4=C.J. |journal=Evolutionary Anthropology |publication-date=2021}} nvg33lwi6ugzdiyi2j6owmf9zztjt1u Nemesis 0 2336517 11322353 2026-10-21T20:59:50Z Isfisk 2639 New 11322353 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Nemesis}} Species: {{sp|N|emesis|lamna}} ... =={{int:Name}}== ''Nemesis'' {{a|Antoine Risso|Risso}}, 1826 =={{int:References}}== ==={{int:Primary references}}=== {{Risso, 1826a}} {{Commonscat}} {{Taxonbar|from=Q10595940}} [[Category:Antoine Risso taxa]] gnmrcq2qgr4m922spm8be8ujm1tyrp7 Nemesis lamna 0 2336518 11322354 2026-10-21T21:01:10Z Isfisk 2639 New 11322354 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Nemesis}} Species: ''[[Nemesis lamna]]'' =={{int:Name}}== ''Nemesis lamna'' {{a|Antoine Risso|Risso}}, 1826 =={{int:References}}== ==={{int:Primary references}}=== {{Risso, 1826a}} {{Commonscat}} {{Taxonbar|from=Q4300158}} [[Category:Antoine Risso taxa]] [[Category:New species 1826]] cesdhs1jnr3ewwqrkfkithsj82qmlp1 Template:Nemesis 10 2336519 11322356 2026-10-21T21:01:48Z Isfisk 2639 New 11322356 wikitext text/x-wiki {{Eudactylinidae}} Genus: ''[[Nemesis]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> frueuod7flucf16pxr6gpsommk82nvq Zothea 0 2336520 11322362 2026-10-21T21:08:49Z Isfisk 2639 New 11322362 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Zothea}} Species: {{splast|Z|othea|meridionalis}} =={{int:Name}}== ''Zothea'' {{a|Antoine Risso|Risso}}, 1826 =={{int:References}}== ==={{int:Primary references}}=== {{Risso, 1826a}} {{Commonscat}} {{Taxonbar|from=Q32613644}} [[Category:Antoine Risso taxa]] k8vpimgflc87rc92ax964pjukq7xjsq Template:Zothea 10 2336521 11322365 2026-10-21T21:09:23Z Isfisk 2639 New 11322365 wikitext text/x-wiki {{Amphinomidae}} Genus: ''[[Zothea]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> t6zuf3ewcut796evy9pagtgdonwfaw4 Jaminia quadridens 0 2336522 11322373 2026-10-21T21:13:21Z Isfisk 2639 New 11322373 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Jaminia}} Species: ''[[Jaminia quadridens]]'' =={{int:Name}}== ''Jaminia quadridens'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix quadridens'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q14632454}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] 9egrrnaxwx37zn3ur1f09vknxxofvgx Helix quadridens 0 2336523 11322375 2026-10-21T21:13:58Z Isfisk 2639 Redirected page to [[Jaminia quadridens]] 11322375 wikitext text/x-wiki #REDIRECT [[Jaminia quadridens]] ks88lskwoh316lzcq199rlu24xzvync Trigonephrus rosaceus 0 2336524 11322376 2026-10-21T21:15:56Z Isfisk 2639 New 11322376 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{Trigonephrus}} Species: ''[[Trigonephrus rosaceus]]'' =={{int:Name}}== ''Trigonephrus rosaceus'' ({{a|Otto Friedrich Müller|O. F. Müller}}, 1774) ==={{int:Synonymy}}=== *''Helix rosacea'' {{aut|O. F. Müller}}, 1774 =={{int:References}}== ==={{int:Primary references}}=== {{Muller, 1774}} {{Taxonbar|from=Q106290857}} [[Category:Otto Friedrich Müller taxa]] [[Category:New species 1774]] 32n36x1ot2qx9p7htlr9v4jj7narrnb Helix rosacea 0 2336525 11322377 2026-10-21T21:16:21Z Isfisk 2639 Redirected page to [[Trigonephrus rosaceus]] 11322377 wikitext text/x-wiki #REDIRECT [[Trigonephrus rosaceus]] 6qsjg3fxxjeh92xti1a0mp4yfudrdpd Vavaea amicorum 0 2336526 11322378 2026-10-21T21:23:09Z Junglenut 2394078 Created page with "{{DISPLAYTITLE:''{{subst:FULLPAGENAME}}''}} {{Image}} =={{int:Taxonavigation}}== {{Vavaea}} Species: ''[[Vavaea amicorum]]'' =={{int:Name}}== ''Vavaea amicorum'' {{a|George Bentham|Benth.}}, London J. Bot. 2: 212 (1843) {{nadi| * '''Continental: Asia-Tropical''' ** '''Regional: Malesia''' *** Borneo, Jawa, Lesser Sunda Is., Maluku, Philippines, Sulawesi, Sumatera ** '''Regional: Papuasia''' *** Bismarck Archipelago, New Guinea, Solomon Is. * '''Continental: Australasia..." 11322378 wikitext text/x-wiki {{DISPLAYTITLE:''Vavaea amicorum''}} {{Image}} =={{int:Taxonavigation}}== {{Vavaea}} Species: ''[[Vavaea amicorum]]'' =={{int:Name}}== ''Vavaea amicorum'' {{a|George Bentham|Benth.}}, London J. Bot. 2: 212 (1843) {{nadi| * '''Continental: Asia-Tropical''' ** '''Regional: Malesia''' *** Borneo, Jawa, Lesser Sunda Is., Maluku, Philippines, Sulawesi, Sumatera ** '''Regional: Papuasia''' *** Bismarck Archipelago, New Guinea, Solomon Is. * '''Continental: Australasia''' ** '''Regional: Australia''' *** Northern Territory, Queensland * '''Continental: Pacific''' ** '''Regional: Southwestern Pacific''' *** Fiji, Tonga, Vanuatu ** '''Regional: Northwestern Pacific''' *** Caroline Is. }} =={{int:References}}== ==={{int:Primary references}}=== {{Benth.}} 1843. Vegetation of the Feejee Islands. ''[[The London journal of botany]]'' 2: 212. {{BHL|page/783494}} ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|67588}} {{PWOb|579883-1|2026|{{int:October}}|22|Vavaea amicorum}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|579883-1|2026|22 {{int:October}}}} {{WFO|wfo-0000418438|2026|{{int:October}}|22}} =={{int:Vernacular names}}== {{VN |en=Vavaea }} {{Commonscat}} {{Taxonbar}} [[Category:George Bentham taxa]] 20q87l4x4pqab6y45hpbkwhzwkmjbe7 11322379 11322378 2026-10-21T21:24:56Z Junglenut 2394078 11322379 wikitext text/x-wiki {{DISPLAYTITLE:''Vavaea amicorum''}} {{Image}} =={{int:Taxonavigation}}== {{Vavaea}} Species: ''[[Vavaea amicorum]]'' =={{int:Name}}== ''Vavaea amicorum'' {{a|George Bentham|Benth.}}, London J. Bot. 2: 212 (1843) ==={{int:Synonyms}}=== {{HET}} **''Vitex bantamensis'' {{aut|Koord. & Valeton}}, Bull. Inst. Bot. Buitenzorg 2: 12 (1899) **''Beilschmiedia brassii'' {{aut|C.K.Allen}}, J. Arnold Arbor. 23: 130 (1942) **''Lamiofrutex papuanus'' {{aut|Lauterb.}}, Nova Guinea 14: 147 (1924) **''Vavaea archboldiana'' {{aut|Merr. & L.M.Perry}}, J. Arnold Arbor. 21: 298 (1940) **''Vavaea ardisioides'' {{aut|Elmer}}, Leafl. Philipp. Bot. 7: 2767 (1915) **''Vavaea australiana'' {{aut|S.T.Blake}}, Austral. J. Bot. 2: 122 (1954) **''Vavaea bantamensis'' {{aut|(Koord. & Valeton) Koord. & Merr.}}, S.H.Koorders & T.Valeton, Atlas Baumart. Java 4(Verb. & Einfug.): 9 (1918) **''Vavaea bougainvillensis'' {{aut|B.L.Burtt}}, Bull. Misc. Inform. Kew 1935: 303 (1935) **''Vavaea brassii'' {{aut|(C.K.Allen) Kosterm.}}, Reinwardtia 5: 377 (1961) **''Vavaea brevipedunculata'' {{aut|Sa.Kurata}}, Bull. Tokyo Univ. Forest 35: 198 (1947) **''Vavaea chalmersii'' {{aut|C.DC.}}, Bull. Herb. Boissier, sér. 2, 3: 177 (1903) **''Vavaea chalmersii'' var. ''angustifolia'' {{aut|Merr. & L.M.Perry}}, J. Arnold Arbor. 21: 297 (1940) **''Vavaea harveyi'' {{aut|Seem.}}, Fl. Vit.: 35 (1865) **''Vavaea heterophylla'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 303 (1918) **''Vavaea kajewskii'' {{aut|Merr. & L.M.Perry}}, J. Arnold Arbor. 21: 298 (1940) **''Vavaea lamii'' {{aut|Steenis}}, Acta Bot. Neerl. 1: 92 (1952) **''Vavaea ledermannii'' {{aut|Harms}}, Bot. Jahrb. Syst. 72: 159 (1942) **''Vavaea oligantha'' {{aut|B.L.Burtt}}, Bull. Misc. Inform. Kew 1935: 304 (1935) **''Vavaea pachyphylla'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 304 (1918) **''Vavaea pauciflora'' {{aut|Ridl.}}, Trans. Linn. Soc. London, Bot. 9: 26 (1916), nom. illeg. homonym. post. **''Vavaea pauciflora'' {{aut|Volkens}}, Bot. Jahrb. Syst. 31: 465 (1901) **''Vavaea pilosa'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 302 (1918) **''Vavaea retusa'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 301 (1918) **''Vavaea scaevoloides'' {{aut|Guillaumin}}, J. Linn. Soc., Bot. 51: 550 (1938) **''Vavaea surigaoensis'' {{aut|Elmer}}, Leafl. Philipp. Bot. 7: 2768 (1915) **''Vavaea vitiensis'' {{aut|Seem.}}, Fl. Vit.: 35 (1865) {{nadi| * '''Continental: Asia-Tropical''' ** '''Regional: Malesia''' *** Borneo, Jawa, Lesser Sunda Is., Maluku, Philippines, Sulawesi, Sumatera ** '''Regional: Papuasia''' *** Bismarck Archipelago, New Guinea, Solomon Is. * '''Continental: Australasia''' ** '''Regional: Australia''' *** Northern Territory, Queensland * '''Continental: Pacific''' ** '''Regional: Southwestern Pacific''' *** Fiji, Tonga, Vanuatu ** '''Regional: Northwestern Pacific''' *** Caroline Is. }} =={{int:References}}== ==={{int:Primary references}}=== {{Benth.}} 1843. Vegetation of the Feejee Islands. ''[[The London journal of botany]]'' 2: 212. {{BHL|page/783494}} ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|67588}} {{PWOb|579883-1|2026|{{int:October}}|22|Vavaea amicorum}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|579883-1|2026|22 {{int:October}}}} {{WFO|wfo-0000418438|2026|{{int:October}}|22}} =={{int:Vernacular names}}== {{VN |en=Vavaea }} {{Commonscat}} {{Taxonbar}} [[Category:George Bentham taxa]] 6tgb9zv9ey1pzdl40n578f958q4qaya 11322392 11322379 2026-10-21T21:51:39Z Junglenut 2394078 11322392 wikitext text/x-wiki {{DISPLAYTITLE:''Vavaea amicorum''}} {{Image}} =={{int:Taxonavigation}}== {{Vavaea}} Species: ''[[Vavaea amicorum]]'' =={{int:Name}}== ''Vavaea amicorum'' {{a|George Bentham|Benth.}}, London J. Bot. 2: 212 (1843) ==={{int:Synonyms}}=== {{HET}} **''Vitex bantamensis'' {{aut|Koord. & Valeton}}, Bull. Inst. Bot. Buitenzorg 2: 12 (1899) **''Beilschmiedia brassii'' {{aut|C.K.Allen}}, J. Arnold Arbor. 23: 130 (1942) **''Lamiofrutex papuanus'' {{aut|Lauterb.}}, Nova Guinea 14: 147 (1924) **''Vavaea archboldiana'' {{aut|Merr. & L.M.Perry}}, J. Arnold Arbor. 21: 298 (1940) **''Vavaea ardisioides'' {{aut|Elmer}}, Leafl. Philipp. Bot. 7: 2767 (1915) **''Vavaea australiana'' {{aut|S.T.Blake}}, Austral. J. Bot. 2: 122 (1954) **''Vavaea bantamensis'' {{aut|(Koord. & Valeton) Koord. & Merr.}}, S.H.Koorders & T.Valeton, Atlas Baumart. Java 4(Verb. & Einfug.): 9 (1918) **''Vavaea bougainvillensis'' {{aut|B.L.Burtt}}, Bull. Misc. Inform. Kew 1935: 303 (1935) **''Vavaea brassii'' {{aut|(C.K.Allen) Kosterm.}}, Reinwardtia 5: 377 (1961) **''Vavaea brevipedunculata'' {{aut|Sa.Kurata}}, Bull. Tokyo Univ. Forest 35: 198 (1947) **''Vavaea chalmersii'' {{aut|C.DC.}}, Bull. Herb. Boissier, sér. 2, 3: 177 (1903) **''Vavaea chalmersii'' var. ''angustifolia'' {{aut|Merr. & L.M.Perry}}, J. Arnold Arbor. 21: 297 (1940) **''Vavaea harveyi'' {{aut|Seem.}}, Fl. Vit.: 35 (1865) **''Vavaea heterophylla'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 303 (1918) **''Vavaea kajewskii'' {{aut|Merr. & L.M.Perry}}, J. Arnold Arbor. 21: 298 (1940) **''Vavaea lamii'' {{aut|Steenis}}, Acta Bot. Neerl. 1: 92 (1952) **''Vavaea ledermannii'' {{aut|Harms}}, Bot. Jahrb. Syst. 72: 159 (1942) **''Vavaea oligantha'' {{aut|B.L.Burtt}}, Bull. Misc. Inform. Kew 1935: 304 (1935) **''Vavaea pachyphylla'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 304 (1918) **''Vavaea pauciflora'' {{aut|Ridl.}}, Trans. Linn. Soc. London, Bot. 9: 26 (1916), nom. illeg. homonym. post. **''Vavaea pauciflora'' {{aut|Volkens}}, Bot. Jahrb. Syst. 31: 465 (1901) **''Vavaea pilosa'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 302 (1918) **''Vavaea retusa'' {{aut|Merr.}}, Philipp. J. Sci., C 13: 301 (1918) **''Vavaea scaevoloides'' {{aut|Guillaumin}}, J. Linn. Soc., Bot. 51: 550 (1938) **''Vavaea surigaoensis'' {{aut|Elmer}}, Leafl. Philipp. Bot. 7: 2768 (1915) **''Vavaea vitiensis'' {{aut|Seem.}}, Fl. Vit.: 35 (1865) {{nadi| * '''Continental: Asia-Tropical''' ** '''Regional: Malesia''' *** Borneo, Jawa, Lesser Sunda Is., Maluku, Philippines, Sulawesi, Sumatera ** '''Regional: Papuasia''' *** Bismarck Archipelago, New Guinea, Solomon Is. * '''Continental: Australasia''' ** '''Regional: Australia''' *** Northern Territory, Queensland * '''Continental: Pacific''' ** '''Regional: Southwestern Pacific''' *** Fiji, Tonga, Vanuatu ** '''Regional: Northwestern Pacific''' *** Caroline Is. }} =={{int:References}}== ==={{int:Primary references}}=== * {{Benth.}} 1843. Vegetation of the Feejee Islands. ''[[The London journal of botany]]'' 2: 212. {{BHL|page/783494}} ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|67588}} {{PWOb|579883-1|2026|{{int:October}}|22|Vavaea amicorum}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|579883-1|2026|22 {{int:October}}}} {{WFO|wfo-0000418438|2026|{{int:October}}|22}} =={{int:Vernacular names}}== {{VN |en=Vavaea }} {{Commonscat}} {{Taxonbar}} [[Category:George Bentham taxa]] jhhporj30q5wj2zlewt9mk80xq00ebz Template:Serrano, 2022 10 2336527 11322383 2026-10-21T21:28:35Z Neferkheperre 947633 Created page with "* {{a|Artur R.M. Serrano|Serrano, A.R.M.}} 2022. The rose chafers (Coleoptera: Scarabaeidae: Cetoniinae) of Guinea-Bissau: an annotated checklist and new records. {{zootaxa|2022|5104|2|151|195|1}} {{Access|closed}}{{subst:Reftemp}}" 11322383 wikitext text/x-wiki * {{a|Artur R.M. Serrano|Serrano, A.R.M.}} 2022. The rose chafers (Coleoptera: Scarabaeidae: Cetoniinae) of Guinea-Bissau: an annotated checklist and new records. {{zootaxa|2022|5104|2|151|195|1}} {{Access|closed}} <includeonly>[[Template:Serrano, 2022|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> bzgqmhsprry96vp87yrrsr94cxgiw7g 11322384 11322383 2026-10-21T21:32:08Z Neferkheperre 947633 11322384 wikitext text/x-wiki * {{a|Artur R.M. Serrano|Serrano, A.R.M.}} 2022. The rose chafers (Coleoptera: Scarabaeidae: Cetoniinae) of Guinea-Bissau: an annotated checklist and new records. {{zootaxa|2022|5104|2|151|195|1}} {{Access|closed}} <includeonly>[[Template:Serrano, 2022|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. * {{int:date of publication}}: 25 February 2022 * {{zooBank|92754218-B79B-4AA8-8970-36E5E08FC984}} * {{int:no new names}} [[Category:Reference templates]]</noinclude> mjlrl6l2o5kwf5c47p7e0d1brxlbb7f Template:Amphiporaidae 10 2336528 11322389 2026-10-21T21:47:09Z BashfulBenis22 2942367 Created page with "{{Amphiporida}} Familia: †{{fbr|Amphiporaidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322389 wikitext text/x-wiki {{Amphiporida}} Familia: †{{fbr|Amphiporaidae}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 0w27ze0ff3gs2yp1gf08c9zkirqbzcd Template:Glos, Glaw & Vences, 2005 10 2336529 11322394 2026-10-21T21:53:50Z Burmeister 9074 Created page with "* {{a|Julian Glos|Glos, J.}}, {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 2005. A new species of ''Scaphiophryne'' from western Madagascar. ''[[Copeia]]'' 2005(2): 252–261. {{doi|10.1643/CH-04-238R2}} {{Access|closed}}{{subst:ReftempZt}}" 11322394 wikitext text/x-wiki * {{a|Julian Glos|Glos, J.}}, {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 2005. A new species of ''Scaphiophryne'' from western Madagascar. ''[[Copeia]]'' 2005(2): 252–261. {{doi|10.1643/CH-04-238R2}} {{Access|closed}} <includeonly>[[Template:Glos, Glaw &#38; Vences, 2005|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> 22jmypz653ypu7kvlnj34nprno4tnvh 11322396 11322394 2026-10-21T21:54:33Z Burmeister 9074 +N.a. 11322396 wikitext text/x-wiki * {{a|Julian Glos|Glos, J.}}, {{a|Frank Glaw|Glaw, F.}} & {{a|Miguel Vences|Vences, M.}} 2005. A new species of ''Scaphiophryne'' from western Madagascar. ''[[ISSN 0045-8511|Copeia]]'' 2005(2): 252–261. {{doi|10.1643/CH-04-238R2}} {{Access|closed}} <includeonly>[[Template:Glos, Glaw & Vences, 2005|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 1 May 2005 ==={{int:New names}} (1)=== * ''[[Scaphiophryne menabensis]]'' [p. 253] [[Category:Reference templates]]</noinclude> 0guo2kyfmob9qyes3k8uul7qkif052z Template:Alexander, 1940 10 2336530 11322398 2026-10-21T21:55:45Z Harlock81 398030 reference template 11322398 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1940. ''[[ISSN 0007-9367|Cact. Succ. J. (Los Angeles)]]'' 12: 161, fig.<includeonly>[[Template:Rose, 1911a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum macdougallii]]'' [[Category:Reference templates]]</noinclude> okmocpv1wpvk3x5fp54zc7ne692eg0a 11322407 11322398 2026-10-21T22:02:30Z Harlock81 398030 fix, wikilink 11322407 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1940. ''[[ISSN 0007-9367|Cact. Succ. J. (Los Angeles)]]'' 12: 161, fig. <includeonly>[[Template:Alexander, 1940|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum macdougallii]]'' [[Category:Reference templates]]</noinclude> fwteyi6c0l8oycn3e7apcfzph7huo9n 11322423 11322407 2026-10-21T22:11:00Z Harlock81 398030 complete page numbers 11322423 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1940. ''[[ISSN 0007-9367|Cact. Succ. J. (Los Angeles)]]'' 12: 161–163, fig. <includeonly>[[Template:Alexander, 1940|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum macdougallii]]'' [[Category:Reference templates]]</noinclude> behbx4xu6taptvb0qiysaxgcqt6fgct 11322471 11322423 2026-10-21T23:17:22Z RLJ 134478 11322471 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1940. New Species of ''Graptopetalum''. ''[[ISSN 0007-9367| Cactus and Succulent Journal]]'' 12: 161–163, fig. <includeonly>[[Template:Alexander, 1940|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum macdougallii]]'' [[Category:Reference templates]]</noinclude> 7hi4vbf4y583yiue9caifajljdp0jr3 Category:Patrick R. Leacock taxa 14 2336531 11322408 2026-10-21T22:02:41Z Lichenes 716444 Created page with "{{Taxa by author|Patrick R. Leacock|Leacock, Patrick}}" 11322408 wikitext text/x-wiki {{Taxa by author|Patrick R. Leacock|Leacock, Patrick}} s0kkm94q7in8yud26kk3a5vysci2duw Amphiporaidae 0 2336532 11322417 2026-10-21T22:08:18Z BashfulBenis22 2942367 Created page with "=={{int:Taxonavigation}}== {{Amphiporaidae}} Genera: †{{g|Amphipora}} †{{g|Novitella}} †{{glast|Paramphipora}} =={{int:Name}}== ''Amphiporaidae'' {{aut|Rukhin}}, 1938 ==={{int:Synonymy}}=== * ''Amphiporidae'' =={{int:References}}== ==={{int:Primary references}}=== * {{a|Colin Stearn|Stearn, C.}} 2011. Stromatoporellida, Stromatoporida, Syringostromatida, Amphiporida, and genera with uncertain affinities. ''[[ISSN 2153-4012|Treatise Online]]'', no. 19, Part E, Rev..." 11322417 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Amphiporaidae}} Genera: †{{g|Amphipora}} †{{g|Novitella}} †{{glast|Paramphipora}} =={{int:Name}}== ''Amphiporaidae'' {{aut|Rukhin}}, 1938 ==={{int:Synonymy}}=== * ''Amphiporidae'' =={{int:References}}== ==={{int:Primary references}}=== * {{a|Colin Stearn|Stearn, C.}} 2011. Stromatoporellida, Stromatoporida, Syringostromatida, Amphiporida, and genera with uncertain affinities. ''[[ISSN 2153-4012|Treatise Online]]'', no. 19, Part E, Revised, Volume 4, Chapter 16E {{doi|10.17161/to.v0i0.4092}} {{Access|open}} ==={{int:Additional references}}=== * OPINION 2317 (Case 3540) AMPHIPORIDAE Rukhin, 1938 (Porifera, Stromatoporata, Amphiporida): emended to AMPHIPORAIDAE to remove homonymy with AMPHIPORIDAE McIntosh, 1874 (Nemertea, Hoplonemertea). ''[[ISSN 2057-0570|The Bulletin of Zoological Nomenclature]]'' 70(2): p. 122-124. {{BHL|part/378138}} {{Access|open}} 1razn0hhe3kecygcvrpt4ij3n4wsg44 Patrick R. Leacock 0 2336533 11322420 2026-10-21T22:09:01Z Lichenes 716444 Created page with "'''Patrick R. Leacock''' ([[fl.]] 2016), American mycologist. {{IPNI standard form}} Address (2026): :School of the Art Institute of Chicago, Chicago, Illinois, U.S.A. :Field Museum of Natural History, Chicago, Illinois, U.S.A. {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Leacock, Patrick R.}} [[Category:Taxon authorities]] [[Category:Mycologists]]" 11322420 wikitext text/x-wiki '''Patrick R. Leacock''' ([[fl.]] 2016), American mycologist. {{IPNI standard form}} Address (2026): :School of the Art Institute of Chicago, Chicago, Illinois, U.S.A. :Field Museum of Natural History, Chicago, Illinois, U.S.A. {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Leacock, Patrick R.}} [[Category:Taxon authorities]] [[Category:Mycologists]] 3rwjdq9hyfs25kvvye2mrqlgt0eagi5 11322433 11322420 2026-10-21T22:21:07Z The editor 2345 2915305 11322433 wikitext text/x-wiki '''Patrick R. Leacock''' ([[fl.]] 2016), U.S. mycologist. {{IPNI standard form}} Address (2026): :School of the Art Institute of Chicago, Chicago, Illinois, U.S.A. :Field Museum of Natural History, Chicago, Illinois, U.S.A. {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Leacock, Patrick R.}} [[Category:Taxon authorities]] [[Category:Mycologists]] 4uwnd1uajsit8r65wf7ezrbea2ipkt1 Austromatthaea elegans 0 2336534 11322421 2026-10-21T22:09:07Z Junglenut 2394078 Created page with "{{DISPLAYTITLE:''{{subst:FULLPAGENAME}}''}} {{Image}} =={{int:Taxonavigation}}== {{Austromatthaea}} Species: ''[[Austromatthaea elegans]]'' =={{int:Name}}== ''Austromatthaea elegans'' {{a|Lindsay Stuart Smith|L.S.Sm.}}, Contr. Queensland Herb. 6: 6 (1969) {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:References}}== ==={{int:Primary references}}=== {{L.S.Sm.}} 1969. New species of and notes on Queensland plants, V. ''..." 11322421 wikitext text/x-wiki {{DISPLAYTITLE:''Austromatthaea elegans''}} {{Image}} =={{int:Taxonavigation}}== {{Austromatthaea}} Species: ''[[Austromatthaea elegans]]'' =={{int:Name}}== ''Austromatthaea elegans'' {{a|Lindsay Stuart Smith|L.S.Sm.}}, Contr. Queensland Herb. 6: 6 (1969) {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:References}}== ==={{int:Primary references}}=== {{L.S.Sm.}} 1969. New species of and notes on Queensland plants, V. ''[[Contributions from the Queensland Herbarium]]'' 6: 6. {{jstor|41781953}} ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|114388}} {{PWOb|581766-1|2026|{{int:October}}|22|Austromatthaea elegans}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|581766-1|2026|22 {{int:October}}}} {{WFO|wfo-0000557376|2026|{{int:October}}|22}} {{Commonscat}} {{Taxonbar}} [[Category:Lindsay Stuart Smith taxa]] qb467s77ekj85bb5dmta19hn3aodcqt Jill Riddell 0 2336535 11322424 2026-10-21T22:11:14Z Lichenes 716444 Created page with "'''Jill Riddell''' ([[fl.]] 2016), American mycologist. {{IPNI standard form}} Address (2026): :School of the Art Institute of Chicago, Chicago, Illinois, U.S.A. {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Riddell, Jill}} [[Category:Taxon authorities]] [[Category:Mycologists]]" 11322424 wikitext text/x-wiki '''Jill Riddell''' ([[fl.]] 2016), American mycologist. {{IPNI standard form}} Address (2026): :School of the Art Institute of Chicago, Chicago, Illinois, U.S.A. {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Riddell, Jill}} [[Category:Taxon authorities]] [[Category:Mycologists]] slanxl1g2fhtstzbhwx4u5b6gb71cvz 11322428 11322424 2026-10-21T22:16:24Z The editor 2345 2915305 /* */ 11322428 wikitext text/x-wiki '''Jill Riddell''' ([[fl.]] 2016), U.S. mycologist. {{IPNI standard form}} Address (2026): :School of the Art Institute of Chicago, Chicago, Illinois, U.S.A. {{Taxa authored}} =={{int:Publications}}== {{inc}} {{Leacock et al., 2016a}} {{Authority control}} {{DEFAULTSORT:Riddell, Jill}} [[Category:Taxon authorities]] [[Category:Mycologists]] 7ykrbbyechnzeg2kvxg76djf75mxsv4 Category:Jill Riddell taxa 14 2336536 11322425 2026-10-21T22:11:50Z Lichenes 716444 Created page with "{{Taxa by author|Jill Riddell|Riddell, Jill}}" 11322425 wikitext text/x-wiki {{Taxa by author|Jill Riddell|Riddell, Jill}} fs5uvmdbg4moq67j8ebwl71w3d89pu3 Cryptoprocta bevatabe 0 2336537 11322430 2026-10-21T22:19:47Z Burmeister 9074 Created page with "{{Image}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species: †''[[Cryptoprocta bevatabe]]'' =={{int:Name}}== ''Cryptoprocta bevatabe'' {{a|Margaret E. Lewis|Lewis}}, {{a|Zachary S. Klukkert|Klukkert}}, {{a|Nick Scroxton|Scroxton}}, {{a|Stephen J. Burns|Burns}}, {{a|Brooke E. Crowley|Crowley}}, {{a|David McGee|McGee}}, {{a|Kathleen M. Muldoon|Muldoon}}, {{a|Matthew Borths|Borths}}, {{a|Lindsay R. Meador|Meador}}, {{a|Phillip Lehman|Lehman}}, {{a|Patrick Widmann|Widma..." 11322430 wikitext text/x-wiki {{Image}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species: †''[[Cryptoprocta bevatabe]]'' =={{int:Name}}== ''Cryptoprocta bevatabe'' {{a|Margaret E. Lewis|Lewis}}, {{a|Zachary S. Klukkert|Klukkert}}, {{a|Nick Scroxton|Scroxton}}, {{a|Stephen J. Burns|Burns}}, {{a|Brooke E. Crowley|Crowley}}, {{a|David McGee|McGee}}, {{a|Kathleen M. Muldoon|Muldoon}}, {{a|Matthew Borths|Borths}}, {{a|Lindsay R. Meador|Meador}}, {{a|Phillip Lehman|Lehman}}, {{a|Patrick Widmann|Widmann}}, {{a|Noromamy J. Rahantaharivao|Rahantaharivao}}, {{a|Lovasoa Ranivoharimanana|Ranivoharimanana}} & {{a|Laurie R. Godfrey|Godfrey}}, 2026 * {{int:Holotype}}: {{rl|UABEC}} 0039. * {{int:Type locality and horizon}}: “Mitoho (24°02’51.85”S, 43°45’11.74”E) chimney, Holocene, older than 8.3 Ka”. =={{int:References}}== ==={{int:Primary references}}=== {{Lewis et al., 2026}} {{Taxonbar}} [[Category:Margaret E. Lewis taxa]] [[Category:Zachary S. Klukkert taxa]] [[Category:Nick Scroxton taxa]] [[Category:Stephen J. Burns taxa]] [[Category:Brooke E. Crowley taxa]] [[Category:David McGee taxa]] [[Category:Kathleen M. Muldoon taxa]] [[Category:Matthew Borths taxa]] [[Category:Lindsay R. Meador taxa]] [[Category:Phillip Lehman taxa]] [[Category:Patrick Widmann taxa]] [[Category:Noromamy J. Rahantaharivao taxa]] [[Category:Lovasoa Ranivoharimanana taxa]] [[Category:Laurie R. Godfrey taxa]] dhli8662pcfhjmcbavbfcfo2tdpduti 11322432 11322430 2026-10-21T22:20:28Z Burmeister 9074 f.n. 11322432 wikitext text/x-wiki {{Image}} =={{int:Taxonavigation}}== {{Cryptoprocta}} Species: †''[[Cryptoprocta bevatabe]]'' =={{int:Name}}== ''Cryptoprocta bevatabe'' {{a|Margaret E. Lewis|Lewis}}, {{a|Zachary S. Klukkert|Klukkert}}, {{a|Nick Scroxton|Scroxton}}, {{a|Stephen J. Burns|Burns}}, {{a|Brooke E. Crowley|Crowley}}, {{a|David McGee|McGee}}, {{a|Kathleen M. Muldoon|Muldoon}}, {{a|Matthew Robert Borths|Borths}}, {{a|Lindsay R. Meador|Meador}}, {{a|Phillip Lehman|Lehman}}, {{a|Patrick Widmann|Widmann}}, {{a|Noromamy J. Rahantaharivao|Rahantaharivao}}, {{a|Lovasoa Ranivoharimanana|Ranivoharimanana}} & {{a|Laurie R. Godfrey|Godfrey}}, 2026 * {{int:Holotype}}: {{rl|UABEC}} 0039. * {{int:Type locality and horizon}}: “Mitoho (24°02’51.85”S, 43°45’11.74”E) chimney, Holocene, older than 8.3 Ka”. =={{int:References}}== ==={{int:Primary references}}=== {{Lewis et al., 2026}} {{Taxonbar}} [[Category:Margaret E. Lewis taxa]] [[Category:Zachary S. Klukkert taxa]] [[Category:Nick Scroxton taxa]] [[Category:Stephen J. Burns taxa]] [[Category:Brooke E. Crowley taxa]] [[Category:David McGee taxa]] [[Category:Kathleen M. Muldoon taxa]] [[Category:Matthew Robert Borths taxa]] [[Category:Lindsay R. Meador taxa]] [[Category:Phillip Lehman taxa]] [[Category:Patrick Widmann taxa]] [[Category:Noromamy J. Rahantaharivao taxa]] [[Category:Lovasoa Ranivoharimanana taxa]] [[Category:Laurie R. Godfrey taxa]] fg5315g87o2yfzvmtg1sxncsjje1s4y Hedycarya loxocarya 0 2336538 11322435 2026-10-21T22:22:02Z Junglenut 2394078 Created page with "{{DISPLAYTITLE:''{{subst:FULLPAGENAME}}''}} {{Image}} =={{int:Taxonavigation}}== {{Hedycarya}} Species: ''[[Hedycarya loxocarya]]'' =={{int:Name}}== ''Hedycarya loxocarya'' ({{a|George Bentham|Benth.}}) {{a|William Douglas Francis|W.D.Francis}}, Bull. Misc. Inform. Kew 1931: 458 (1931) ==={{int:Synonyms}}=== {{BA}} **''Mollinedia loxocarya'' {{aut|Benth.}}, Fl. Austral. 5: 287 (1870) {{HOT}} **''Wilkiea loxocarya'' {{aut|(Benth.) Perkins}}, H.G.A.Engler (ed.), Pflanzen..." 11322435 wikitext text/x-wiki {{DISPLAYTITLE:''Hedycarya loxocarya''}} {{Image}} =={{int:Taxonavigation}}== {{Hedycarya}} Species: ''[[Hedycarya loxocarya]]'' =={{int:Name}}== ''Hedycarya loxocarya'' ({{a|George Bentham|Benth.}}) {{a|William Douglas Francis|W.D.Francis}}, Bull. Misc. Inform. Kew 1931: 458 (1931) ==={{int:Synonyms}}=== {{BA}} **''Mollinedia loxocarya'' {{aut|Benth.}}, Fl. Austral. 5: 287 (1870) {{HOT}} **''Wilkiea loxocarya'' {{aut|(Benth.) Perkins}}, H.G.A.Engler (ed.), Pflanzenr., IV, 101(Nachtr., Heft 49): 27 (1911) {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:References}}== ==={{int:Primary references}}=== * {{W.D.Francis}} 1931. Notes on some Australian Monimiaceae. ''[[Bulletin of Miscellaneous Information]]'' 1931(9): 457–458. {{DOI|10.2307/4102482}} ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|APNIID}} {{PWOb|POWOID|2026|{{int:October}}|22|Hedycarya loxocarya}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|POWOID|2026|22 {{int:October}}}} {{WFO|wfo-WFOID|2026|{{int:October}}|22}} =={{int:Vernacular names}}== {{VN |en=Yellow Beech }} {{Commonscat}} {{Taxonbar}} [[Category:William Douglas Francis taxa]] e76jtdbya9j33ozbx1vh9rwmt262364 Template:Storch, 1995 10 2336539 11322436 2026-10-21T22:22:09Z The editor 2345 2915305 Created page with "* {{a|Gerhard Storch|Storch, G.}} 1995. The Neogene mammalian faunas of Ertemte and Harr Obo in Inner Mongolia Nei Mongol, China. – 11. Soricidae (Insectivora). ''[[ISSN 0037-2110|Senckenbergiana lethaea]]'' 75(1/2): 221-251. <includeonly>[[Template:Storch, 1995|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noi..." 11322436 wikitext text/x-wiki * {{a|Gerhard Storch|Storch, G.}} 1995. The Neogene mammalian faunas of Ertemte and Harr Obo in Inner Mongolia Nei Mongol, China. – 11. Soricidae (Insectivora). ''[[ISSN 0037-2110|Senckenbergiana lethaea]]'' 75(1/2): 221-251. <includeonly>[[Template:Storch, 1995|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> 0nsh3y96zbud1e8daygj89pibl5n5bm 11322992 11322436 2026-10-22T10:36:20Z Tommy Kronkvist 596 Text formatting per Wikispecies' [[Help:Reference section|Reference section guideline]], i.e. en-dash rather than hyphen between page numbers. 11322992 wikitext text/x-wiki * {{a|Gerhard Storch|Storch, G.}} 1995. The Neogene mammalian faunas of Ertemte and Harr Obo in Inner Mongolia Nei Mongol, China. – 11. Soricidae (Insectivora). ''[[ISSN 0037-2110|Senckenbergiana lethaea]]'' 75(1/2): 221–251. <includeonly>[[Template:Storch, 1995|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> qh9p51974qql4owtg338dha505qzzr3 Template:Lewis et al., 2026 10 2336540 11322437 2026-10-21T22:22:16Z Burmeister 9074 Created page with "* {{a|Margaret E. Lewis|Lewis, M.E.}}, {{a|Zachary S. Klukkert|Klukkert, Z.S.}}, {{a|Nick Scroxton|Scroxton, N.}}, {{a|Stephen J. Burns|Burns, S.J.}}, {{a|Brooke E. Crowley|Crowley, B.E.}}, {{a|David McGee|McGee, M.}}, {{a|Kathleen M. Muldoon|Muldoon, K.M.}}, {{a|Matthew Robert Borths|Borths, M.}}, {{a|Lindsay R. Meador|Meador, L.R.}}, {{a|Phillip Lehman|Lehman, P.}}, {{a|Patrick Widmann|Widmann, P.}}, {{a|Noromamy J. Rahantaharivao|Rahantaharivao, N.J.}}, {{a|Lovasoa Ra..." 11322437 wikitext text/x-wiki * {{a|Margaret E. Lewis|Lewis, M.E.}}, {{a|Zachary S. Klukkert|Klukkert, Z.S.}}, {{a|Nick Scroxton|Scroxton, N.}}, {{a|Stephen J. Burns|Burns, S.J.}}, {{a|Brooke E. Crowley|Crowley, B.E.}}, {{a|David McGee|McGee, M.}}, {{a|Kathleen M. Muldoon|Muldoon, K.M.}}, {{a|Matthew Robert Borths|Borths, M.}}, {{a|Lindsay R. Meador|Meador, L.R.}}, {{a|Phillip Lehman|Lehman, P.}}, {{a|Patrick Widmann|Widmann, P.}}, {{a|Noromamy J. Rahantaharivao|Rahantaharivao, N.J.}}, {{a|Lovasoa Ranivoharimanana|Ranivoharimanana, L.}} & {{a|Laurie R. Godfrey|Godfrey, L.R.}} 2026. New large species of ''Cryptoprocta'' (Carnivora, Eupleridae) and new specimens of ''C. spelea'' from the Holocene of Tsimanampesotse National Park, southwest Madagascar. ''[[Journal of Vertebrate Paleontology]]'': 46(5): e2698802. {{doi|10.1080/02724634.2026.2698802}} {{Access|open}} <includeonly>[[Template:Lewis et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> hj5pyxwknw75shxy8cnkzi7yn5d54op 11322441 11322437 2026-10-21T22:23:28Z Burmeister 9074 +N.a. 11322441 wikitext text/x-wiki * {{a|Margaret E. Lewis|Lewis, M.E.}}, {{a|Zachary S. Klukkert|Klukkert, Z.S.}}, {{a|Nick Scroxton|Scroxton, N.}}, {{a|Stephen J. Burns|Burns, S.J.}}, {{a|Brooke E. Crowley|Crowley, B.E.}}, {{a|David McGee|McGee, M.}}, {{a|Kathleen M. Muldoon|Muldoon, K.M.}}, {{a|Matthew Robert Borths|Borths, M.}}, {{a|Lindsay R. Meador|Meador, L.R.}}, {{a|Phillip Lehman|Lehman, P.}}, {{a|Patrick Widmann|Widmann, P.}}, {{a|Noromamy J. Rahantaharivao|Rahantaharivao, N.J.}}, {{a|Lovasoa Ranivoharimanana|Ranivoharimanana, L.}} & {{a|Laurie R. Godfrey|Godfrey, L.R.}} 2026. New large species of ''Cryptoprocta'' (Carnivora, Eupleridae) and new specimens of ''C. spelea'' from the Holocene of Tsimanampesotse National Park, southwest Madagascar. ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'': 46(5): e2698802. {{doi|10.1080/02724634.2026.2698802}} {{Access|open}} <includeonly>[[Template:Lewis et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 24 August 2026 (online) ==={{int:New names}} (1)=== * ''[[Cryptoprocta bevatabe]]'' [[Category:Reference templates]]</noinclude> r593x3ipi23o8gk4zhf7teerb1dfus8 Template:Alexander, 1956 10 2336541 11322438 2026-10-21T22:22:19Z Harlock81 398030 New reference 11322438 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1956. ''[[ISSN 0007-9367|Cact. Succ. J. (Los Angeles)]]'' 28: 174–176. <includeonly>[[Template:Alexander, 1956|{{int:Reference page}}]. </includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum grande]]'' [[Category:Reference templates]]</noinclude> p69ygd4d6ck4oinnqx7ckvucy69k1iu 11322440 11322438 2026-10-21T22:23:02Z Harlock81 398030 typo 11322440 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1956. ''[[ISSN 0007-9367|Cact. Succ. J. (Los Angeles)]]'' 28: 174–176. <includeonly>[[Template:Alexander, 1956|{{int:Reference page}}]]. </includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum grande]]'' [[Category:Reference templates]]</noinclude> gr804bd7qcghbd2j3jara0gydmt4v78 11322472 11322440 2026-10-21T23:20:52Z RLJ 134478 11322472 wikitext text/x-wiki * {{a|Edward Johnston Alexander|Alexander, E.J.}} 1956. Another New ''Graptopetalum''. ''[[ISSN 0007-9367|Cactus and Succulent Journal]]'' 28: 174–176. <includeonly>[[Template:Alexander, 1956|{{int:Reference page}}]]. </includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== ==={{int:New names}} (1)=== * ''[[Graptopetalum grande]]'' [[Category:Reference templates]]</noinclude> l32sq74xya7y6f4ji787r5uovv0dn2y Template:Alloblarinella 10 2336542 11322442 2026-10-21T22:23:33Z The editor 2345 2915305 Created page with "{{Blarinellini}} Genus: †''[[Alloblarinella]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322442 wikitext text/x-wiki {{Blarinellini}} Genus: †''[[Alloblarinella]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> p6tbgurvgwk3klw6z1g4468kuvf4pca 11322995 11322442 2026-10-22T10:37:54Z Tommy Kronkvist 596 Added a [[Template:Gbr|Gbr template]], which automatically adds italics and a line break. 11322995 wikitext text/x-wiki {{Blarinellini}} Genus: †{{gbr|Alloblarinella}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 74smaqhjy8r8cpvzcbrw7m7q0fss0yu Template:Selys, 1862b 10 2336543 11322445 2026-10-21T22:25:05Z John Tann 703224 Create template 11322445 wikitext text/x-wiki * {{cite journal |last=Selys-Longchamps |first=E. de |authorlink=Edmond de Selys Longchamps |year=1862 |title={{lang|fr|Synopsis des Agrionines (suite)}} |journal=[[ISSN 0770-7509|Bulletins de l'Académie royale des sciences, des lettres et des beaux-arts de Belgique]] |series=2 |volume=14 |pages=5–44 |language=French }} {{BHL|page/36014862}} {{access|open}} (Third legion: ''Podagrion''.) <includeonly>[[Template:Selys, 1862b|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> r8cak4emf1uchs9hgmj4vqezq5zbzxh Cokia 0 2336544 11322447 2026-10-21T22:25:46Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Cokia}} Species (2): †{{sp|C|okia|kowalskae}} †{{splast|C|okia|robusta}} =={{int:Name}}== ''Cokia'' {{a|Gerhard Storch|Storch}}, 1995 * {{int:Type species}}: ''Cokia kowalskae'' {{aut|Storch}}, 1995. =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]]" 11322447 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Cokia}} Species (2): †{{sp|C|okia|kowalskae}} †{{splast|C|okia|robusta}} =={{int:Name}}== ''Cokia'' {{a|Gerhard Storch|Storch}}, 1995 * {{int:Type species}}: ''Cokia kowalskae'' {{aut|Storch}}, 1995. =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]] mcfxvyeg59t2tg8sdeumszpvqebeebk Template:Cokia 10 2336545 11322448 2026-10-21T22:26:09Z The editor 2345 2915305 Created page with "{{Blarinellini}} Genus: †''[[Cokia]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322448 wikitext text/x-wiki {{Blarinellini}} Genus: †''[[Cokia]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> n9q76ntek9l222ar12b2hduqnmdaf49 11322996 11322448 2026-10-22T10:38:42Z Tommy Kronkvist 596 Added a [[Template:Gbr|Gbr template]], which automatically adds italics and a line break. 11322996 wikitext text/x-wiki {{Blarinellini}} Genus: †{{gbr|Cokia}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> mqppdin0yi95emmkapt7oq81v75rfvd Cokia kowalskae 0 2336546 11322450 2026-10-21T22:27:38Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Cokia}} Species: †''[[Cokia kowalskae]]'' =={{int:Name}}== ''Cokia kowalskae'' {{a|Gerhard Storch|Storch}}, 1995 =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]] [[Category:Epnomys of Barbara Rzebik-Kowalska]]" 11322450 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Cokia}} Species: †''[[Cokia kowalskae]]'' =={{int:Name}}== ''Cokia kowalskae'' {{a|Gerhard Storch|Storch}}, 1995 =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]] [[Category:Epnomys of Barbara Rzebik-Kowalska]] 0u9otc5wsf4chnbbqq6yzl50jki4b5z 11322457 11322450 2026-10-21T22:30:21Z The editor 2345 2915305 11322457 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Cokia}} Species: †''[[Cokia kowalskae]]'' =={{int:Name}}== ''Cokia kowalskae'' {{a|Gerhard Storch|Storch}}, 1995 =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]] [[Category:Eponyms of Barbara Rzebik-Kowalska]] epw23nl1sgs93qz5xcbni8m6cf7w7jr Category:Eponyms of Barbara Rzebik-Kowalska 14 2336547 11322452 2026-10-21T22:29:21Z The editor 2345 2915305 Created page with "{{Eponyms of person|Barbara Rzebik-Kowalska|Rzebik-Kowalska, Barbara}}" 11322452 wikitext text/x-wiki {{Eponyms of person|Barbara Rzebik-Kowalska|Rzebik-Kowalska, Barbara}} nkfv1vzvsmn5a8bnvbf7u3oaolrbpy1 11322453 11322452 2026-10-21T22:29:44Z The editor 2345 2915305 The editor 2345 moved page [[Category:Epnomys of Barbara Rzebik-Kowalska]] to [[Category:Eponmys of Barbara Rzebik-Kowalska]] 11322452 wikitext text/x-wiki {{Eponyms of person|Barbara Rzebik-Kowalska|Rzebik-Kowalska, Barbara}} nkfv1vzvsmn5a8bnvbf7u3oaolrbpy1 11322455 11322453 2026-10-21T22:29:56Z The editor 2345 2915305 The editor 2345 moved page [[Category:Eponmys of Barbara Rzebik-Kowalska]] to [[Category:Eponyms of Barbara Rzebik-Kowalska]] 11322452 wikitext text/x-wiki {{Eponyms of person|Barbara Rzebik-Kowalska|Rzebik-Kowalska, Barbara}} nkfv1vzvsmn5a8bnvbf7u3oaolrbpy1 Category:Epnomys of Barbara Rzebik-Kowalska 14 2336548 11322454 2026-10-21T22:29:44Z The editor 2345 2915305 The editor 2345 moved page [[Category:Epnomys of Barbara Rzebik-Kowalska]] to [[Category:Eponmys of Barbara Rzebik-Kowalska]] 11322454 wikitext text/x-wiki #REDIRECT [[:Category:Eponmys of Barbara Rzebik-Kowalska]] jenfhoyltwoetjxm9invvhm9rp5jw9d Category:Eponmys of Barbara Rzebik-Kowalska 14 2336549 11322456 2026-10-21T22:29:56Z The editor 2345 2915305 The editor 2345 moved page [[Category:Eponmys of Barbara Rzebik-Kowalska]] to [[Category:Eponyms of Barbara Rzebik-Kowalska]] 11322456 wikitext text/x-wiki #REDIRECT [[:Category:Eponyms of Barbara Rzebik-Kowalska]] ki7mbgpeddkt9a47z5wkz1xpsaz3ev5 Paenepetenyia 0 2336550 11322458 2026-10-21T22:31:43Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Paenepetenyia}} Species (1): †{{splast|P|aenepetenyia|zhudingi}} =={{int:Name}}== ''Paenepetenyia'' {{a|Gerhard Storch|Storch}}, 1995 * {{int:Type species}}: ''Paenepetenyia zhudingi'' {{aut|Storch}}, 1995. =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]]" 11322458 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Paenepetenyia}} Species (1): †{{splast|P|aenepetenyia|zhudingi}} =={{int:Name}}== ''Paenepetenyia'' {{a|Gerhard Storch|Storch}}, 1995 * {{int:Type species}}: ''Paenepetenyia zhudingi'' {{aut|Storch}}, 1995. =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]] 1ow8wsm89uvci2bhfkrs3j3dykcrhwl Template:Paenepetenyia 10 2336551 11322459 2026-10-21T22:32:06Z The editor 2345 2915305 Created page with "{{Blarinellini}} Genus: †''[[Paenepetenyia]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322459 wikitext text/x-wiki {{Blarinellini}} Genus: †''[[Paenepetenyia]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 64q9c1v2pkzhvzni6ptipey8eq3nufi 11322997 11322459 2026-10-22T10:39:13Z Tommy Kronkvist 596 Added a [[Template:Gbr|Gbr template]], which automatically adds italics and a line break. 11322997 wikitext text/x-wiki {{Blarinellini}} Genus: †{{gbr|Paenepetenyia}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 046frjy0qagisceelh3dxb38mpegg9p Paenepetenyia zhudingi 0 2336552 11322460 2026-10-21T22:32:56Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Paenepetenyia}} Species: †''[[Paenepetenyia zhudingi]]'' =={{int:Name}}== ''Paenepetenyia zhudingi'' {{a|Gerhard Storch|Storch}}, 1995 =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]]" 11322460 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Paenepetenyia}} Species: †''[[Paenepetenyia zhudingi]]'' =={{int:Name}}== ''Paenepetenyia zhudingi'' {{a|Gerhard Storch|Storch}}, 1995 =={{int:References}}== ==={{int:Primary references}}=== {{Storch, 1995}} {{Taxonbar}} [[Category:Gerhard Storch taxa]] 33hzo9nzrqrycr3qtt2dwhen4vh9b2r Hemmantia webbii 0 2336553 11322468 2026-10-21T22:59:11Z Junglenut 2394078 Created page with "{{DISPLAYTITLE:''{{subst:FULLPAGENAME}}''}} {{Image}} =={{int:Taxonavigation}}== {{Hemmantia}} Species: ''[[Hemmantia webbii]]'' =={{int:Name}}== ''Hemmantia webbii'' {{a|Trevor Paul Whiffin|Whiffin}}, Fl. Australia 2: 453 (2007) * '''Type:''' Mt Hemmant, July 1973, L.J. Webb & J.G. Tracey 10908; Holo: BRI; Iso: BRI. {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:References}}== ==={{int:Primary references}}=== * {{a|Tre..." 11322468 wikitext text/x-wiki {{DISPLAYTITLE:''Hemmantia webbii''}} {{Image}} =={{int:Taxonavigation}}== {{Hemmantia}} Species: ''[[Hemmantia webbii]]'' =={{int:Name}}== ''Hemmantia webbii'' {{a|Trevor Paul Whiffin|Whiffin}}, Fl. Australia 2: 453 (2007) * '''Type:''' Mt Hemmant, July 1973, L.J. Webb & J.G. Tracey 10908; Holo: BRI; Iso: BRI. {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:References}}== ==={{int:Primary references}}=== * {{a|Trevor Paul Whiffin|Whiffin, T.P.}} & {{a|Donald Bruce Foreman|Foreman, D.B.}} 2007. In Wilson, A.J.G. (ed.). Appendix: Monimiaceae. '''''[[Flora of Australia]]''' Vol. 2: Winteraceae to Platanaceae''. [https://www.dcceew.gov.au/sites/default/files/env/pages/bf97195f-fe6d-4017-ac00-e16cd0249814/files/flora-australia-02-winteraceae-platanaceae.pdf PDF] ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|202434}} {{PWOb|77081972-1|2026|{{int:October}}|22|Hemmantia webbii}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|77081972-1|2026|22 {{int:October}}}} {{WFO|wfo-0000507411|2026|{{int:October}}|22}} {{Commonscat}} {{Taxonbar}} [[Category:Trevor Paul Whiffin taxa]] fe9gqrny9i7po31uquwkwhdwqiv42oe Template:Williamson, 1919 10 2336554 11322473 2026-10-21T23:43:24Z John Tann 703224 Create template 11322473 wikitext text/x-wiki * {{cite journal |last=Williamson |first=E.B. |authorlink=Edward Bruce Williamson |year=1919 |title=Results of the University of Michigan-Williamson expedition to Colombia, 1916–1917. III. ''Archaeogomphus'', a new genus of dragon-flies (Odonata) |journal=[[ISSN 0076-8413|Occasional Papers of the Museum of Zoology, University of Michigan]] |volume=63 |pages=1–9 }} {{BHL|page/13944022}} {{access|open}} <includeonly>[[Template:Williamson, 1919|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> emwrx24pbc4pyb8a6q8e6ic7p5njfkx Template:Williamson, 1919a 10 2336555 11322476 2026-10-21T23:51:22Z John Tann 703224 Create template 11322476 wikitext text/x-wiki * {{cite journal |last=Williamson |first=E.B. |authorlink=Edward Bruce Williamson |year=1919 |title=Results of the University of Michigan-Williamson expedition to Colombia, 1916–1917. IV. Notes on species of the genus ''Heteragrion'' Selys with descriptions of new species (Odonata) |journal=[[ISSN 0076-8413|Occasional Papers of the Museum of Zoology, University of Michigan]] |volume=68 |pages=1–88 }} {{BHL|page/13944057}} {{access|open}} <includeonly>[[Template:Williamson, 1919a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> of3ziphjz2pfqkgv1teuzv1s9yfy9zv J.Riddell 0 2336556 11322481 2026-10-22T00:03:39Z Lichenes 716444 Redirected page to [[Jill Riddell]] 11322481 wikitext text/x-wiki #REDIRECT [[Jill Riddell]] ls1onp995e4grmpj5we0fnf15glf1jq J. Riddell 0 2336557 11322482 2026-10-22T00:04:12Z Lichenes 716444 Redirected page to [[Jill Riddell]] 11322482 wikitext text/x-wiki #REDIRECT [[Jill Riddell]] ls1onp995e4grmpj5we0fnf15glf1jq Patrick Leacock 0 2336558 11322483 2026-10-22T00:09:09Z Lichenes 716444 Redirected page to [[Patrick R. Leacock]] 11322483 wikitext text/x-wiki #REDIRECT [[Patrick R. Leacock]] iinouvhqwl7mqtx1j40tjg78ui5di75 Lovasoa Ranivoharimanana 0 2336559 11322484 2026-10-22T00:14:01Z Burmeister 9074 Created page with "'''Lovasoa Ranivoharimanana''', Malagasy paleontologist. * Bassin Sédimentaire Evolution Conservation, Université d’Antananarivo, Antananarivo101, Madagascar. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2023=== {{Nesbitt et al., 2023}} ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Ranivoharimanana, Lovasoa}} [[Category:Taxon authorities]] [[Category:Palaeontologists]]" 11322484 wikitext text/x-wiki '''Lovasoa Ranivoharimanana''', Malagasy paleontologist. * Bassin Sédimentaire Evolution Conservation, Université d’Antananarivo, Antananarivo101, Madagascar. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2023=== {{Nesbitt et al., 2023}} ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Ranivoharimanana, Lovasoa}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 281fr0ckuq2gdkd0hdskmjsbuh7v821 Category:Lovasoa Ranivoharimanana taxa 14 2336560 11322485 2026-10-22T00:14:21Z Burmeister 9074 Created page with "{{Taxa by author|Lovasoa Ranivoharimanana|Ranivoharimanana, Lovasoa}}" 11322485 wikitext text/x-wiki {{Taxa by author|Lovasoa Ranivoharimanana|Ranivoharimanana, Lovasoa}} j2hopd47xxu230uy8tqtcw9iuul45t4 Ranivoharimanana 0 2336561 11322486 2026-10-22T00:14:36Z Burmeister 9074 Redirected page to [[Lovasoa Ranivoharimanana]] 11322486 wikitext text/x-wiki #REDIRECT [[Lovasoa Ranivoharimanana]] ojodyn2ci2yicnu4jrekjc348yqwphm Noromamy J. Rahantaharivao 0 2336562 11322487 2026-10-22T00:19:55Z Burmeister 9074 Created page with "'''Noromamy J. Rahantaharivao''', Malagasy paleontologist. * Bassin Sédimentaire Evolution Conservation, Université d’Antananarivo, Antananarivo101, Madagascar. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Rahantaharivao, Noromamy}} [[Category:Taxon authorities]] [[Category:Palaeontologists]]" 11322487 wikitext text/x-wiki '''Noromamy J. Rahantaharivao''', Malagasy paleontologist. * Bassin Sédimentaire Evolution Conservation, Université d’Antananarivo, Antananarivo101, Madagascar. {{Taxa authored}} =={{int:Publications}}== {{Inc}} ===2026=== {{Lewis et al., 2026}} {{Authority control}} {{DEFAULTSORT:Rahantaharivao, Noromamy}} [[Category:Taxon authorities]] [[Category:Palaeontologists]] 0w1m3svjsxnyybohsun4lxzsqggyaqr Category:Noromamy J. Rahantaharivao taxa 14 2336563 11322488 2026-10-22T00:20:18Z Burmeister 9074 Created page with "{{Taxa by author|Noromamy J. Rahantaharivao|Rahantaharivao, Noromamy}}" 11322488 wikitext text/x-wiki {{Taxa by author|Noromamy J. Rahantaharivao|Rahantaharivao, Noromamy}} abkkeg24thkk9xojraseq4pn48xue0w Rahantaharivao 0 2336564 11322489 2026-10-22T00:20:31Z Burmeister 9074 Redirected page to [[Noromamy J. Rahantaharivao]] 11322489 wikitext text/x-wiki #REDIRECT [[Noromamy J. Rahantaharivao]] 7r7bpnb398b000hjxvmxfrr223c3obk Template:Stirton, 1930 10 2336565 11322501 2026-10-22T01:07:38Z The editor 2345 2915305 Created page with "* {{a|Ruben Arthur Stirton|Stirton, R.A.}} 1930. A new genus of Soricidae from the Barstow Miocene of California. ''[[ISSN 0068-645X|University of California Publications, Bulletin of the Department of Geological Sciences]]'' 19: 217–228. <includeonly>[[Template:Stirton, 1930|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. Category:Reference t..." 11322501 wikitext text/x-wiki * {{a|Ruben Arthur Stirton|Stirton, R.A.}} 1930. A new genus of Soricidae from the Barstow Miocene of California. ''[[ISSN 0068-645X|University of California Publications, Bulletin of the Department of Geological Sciences]]'' 19: 217–228. <includeonly>[[Template:Stirton, 1930|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> g20odysvp4bkinzbepkg3gz0duro24t Limnoecus 0 2336566 11322503 2026-10-22T01:11:31Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Limnoecus}} Species (2): †{{sp|L|imnoecus|tricuspis}} †{{splast|L|imnoecus|vireti}} =={{int:Name}}== ''Limnoecus'' {{a|Ruben Arthur Stirton|Stirton}}, 1930 * {{int:Type species}}: ''Limnoecus tricuspis'' {{aut|Stirton}}, 1930. =={{int:References}}== ==={{int:Primary references}}=== {{Stirton, 1930}} {{Taxonbar}} [[Category:Ruben Arthur Stirton taxa]]" 11322503 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Limnoecus}} Species (2): †{{sp|L|imnoecus|tricuspis}} †{{splast|L|imnoecus|vireti}} =={{int:Name}}== ''Limnoecus'' {{a|Ruben Arthur Stirton|Stirton}}, 1930 * {{int:Type species}}: ''Limnoecus tricuspis'' {{aut|Stirton}}, 1930. =={{int:References}}== ==={{int:Primary references}}=== {{Stirton, 1930}} {{Taxonbar}} [[Category:Ruben Arthur Stirton taxa]] eotvw8orbcxtf7j0snonawpg557e4o8 Template:Limnoecus 10 2336567 11322504 2026-10-22T01:12:23Z The editor 2345 2915305 Created page with "{{Limnoecinae}} Genus: †''[[Limnoecus]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322504 wikitext text/x-wiki {{Limnoecinae}} Genus: †''[[Limnoecus]]''<br/> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> b3nl0z607xa5lryymh6ji4a3jb1yn9x 11322998 11322504 2026-10-22T10:40:57Z Tommy Kronkvist 596 Added a [[Template:Gbr|Gbr template]], which automatically adds italics and a line break. 11322998 wikitext text/x-wiki {{Limnoecinae}} Genus: †{{gbr|Limnoecus}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 3pc5giv2sb0az6i994klbl44sw68dfl Limnoecus tricuspis 0 2336568 11322505 2026-10-22T01:13:04Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Limnoecus}} Species: †''[[Limnoecus tricuspis]]'' =={{int:Name}}== ''Limnoecus tricuspis'' {{a|Ruben Arthur Stirton|Stirton}}, 1930 =={{int:References}}== ==={{int:Primary references}}=== {{Stirton, 1930}} {{Taxonbar}} [[Category:Ruben Arthur Stirton taxa]]" 11322505 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Limnoecus}} Species: †''[[Limnoecus tricuspis]]'' =={{int:Name}}== ''Limnoecus tricuspis'' {{a|Ruben Arthur Stirton|Stirton}}, 1930 =={{int:References}}== ==={{int:Primary references}}=== {{Stirton, 1930}} {{Taxonbar}} [[Category:Ruben Arthur Stirton taxa]] qfrqq5b013m0xzpnebgvmk1rvpi5bjs Template:Cerdeña et al., 2022 10 2336569 11322512 2026-10-22T02:02:05Z Neferkheperre 947633 Created page with "* {{a|José Alfredo Cerdeña|Cerdeña, J.}}, {{a|Jackie Farfán|Farfán, J.}}, {{a|Hector A. Vargas|Vargas, H.A.}}, {{a|Wilson Huanca-Mamani|Huanca-Mamani, W.}}, {{a|Gislene L. Gonçalves|Gonçalves, G.L.}} & {{a|Gilson Rudinei Pires Moreira|Moreira, G.R.P.}} 2022. A contribution to the knowledge of leaf-mining ''Phyllocnistis'' {{aut|Zeller}}, 1848 associated with ''Baccharis'' (Asteraceae), with description of two new species from Peru (Lepidoptera: Gracillariidae). {{..." 11322512 wikitext text/x-wiki * {{a|José Alfredo Cerdeña|Cerdeña, J.}}, {{a|Jackie Farfán|Farfán, J.}}, {{a|Hector A. Vargas|Vargas, H.A.}}, {{a|Wilson Huanca-Mamani|Huanca-Mamani, W.}}, {{a|Gislene L. Gonçalves|Gonçalves, G.L.}} & {{a|Gilson Rudinei Pires Moreira|Moreira, G.R.P.}} 2022. A contribution to the knowledge of leaf-mining ''Phyllocnistis'' {{aut|Zeller}}, 1848 associated with ''Baccharis'' (Asteraceae), with description of two new species from Peru (Lepidoptera: Gracillariidae). {{zootaxa|2022|5104|2|196|208|2}} {{Access|closed}} <includeonly>[[Template:Cerdeña et al., 2022|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> czonxcevpo9j0fgwmjtalp6vatoprsu 11322517 11322512 2026-10-22T02:24:26Z Neferkheperre 947633 11322517 wikitext text/x-wiki * {{a|José Alfredo Cerdeña|Cerdeña, J.}}, {{a|Jackie Farfán|Farfán, J.}}, {{a|Hector A. Vargas|Vargas, H.A.}}, {{a|Wilson Huanca-Mamani|Huanca-Mamani, W.}}, {{a|Gislene L. Gonçalves|Gonçalves, G.L.}} & {{a|Gilson Rudinei Pires Moreira|Moreira, G.R.P.}} 2022. A contribution to the knowledge of leaf-mining ''Phyllocnistis'' {{aut|Zeller}}, 1848 associated with ''Baccharis'' (Asteraceae), with description of two new species from Peru (Lepidoptera: Gracillariidae). {{zootaxa|2022|5104|2|196|208|2}} {{Access|closed}} <includeonly>[[Template:Cerdeña et al., 2022|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 25 February 2022 * {{ZooBank|B3654551-6DA6-4E7B-850E-E79C2AA2E407}} ==={{int:New names}} (2)=== * ''[[Phyllocnistis canta]]'' {{aut|Cerdeña & Farfán}} * ''[[Phyllocnistis elongata]]'' {{aut|Cerdeña & Farfán}} [[Category:Reference templates]]</noinclude> ss7mtv4m97l1agsy43lt04j5ohg0wnv Palmeria coriacea 0 2336570 11322515 2026-10-22T02:05:24Z Junglenut 2394078 Created page with "{{DISPLAYTITLE:''{{subst:FULLPAGENAME}}''}} {{Image}} =={{int:Taxonavigation}}== {{Palmeria (Monimiaceae)}} Species: ''[[Palmeria coriacea]]'' =={{int:Name}}== ''Palmeria coriacea'' {{a|Cyril Tenison White|C.T.White}}, Proc. Roy. Soc. Queensland 47: 75 (1935 publ. 1936) * '''Type:''' Thornton Peak, alt. 4,000 ft., L.J. Brass, No. 2282, in low scrub (ripe fruits); 14/3/32. {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:R..." 11322515 wikitext text/x-wiki {{DISPLAYTITLE:''Palmeria coriacea''}} {{Image}} =={{int:Taxonavigation}}== {{Palmeria (Monimiaceae)}} Species: ''[[Palmeria coriacea]]'' =={{int:Name}}== ''Palmeria coriacea'' {{a|Cyril Tenison White|C.T.White}}, Proc. Roy. Soc. Queensland 47: 75 (1935 publ. 1936) * '''Type:''' Thornton Peak, alt. 4,000 ft., L.J. Brass, No. 2282, in low scrub (ripe fruits); 14/3/32. {{nadi| * '''Continental: Australasia''' ** '''Regional: Australia''' *** Queensland }} =={{int:References}}== ==={{int:Primary references}}=== * {{C.T.White}} 1936. Contributions to the Queensland Flora, No. 5. ''[[Proceedings of the Royal Society of Queensland]]'' 47: 75 {{BHL|page/48934928}} ==={{int:Links}}=== {{APNI|22|{{int:October}}|2026|65238}} {{PWOb|582175-1|2026|{{int:October}}|22|Palmeria coriacea}} {{World Plants|2026|{{int:October}}|22}} {{IPNI|582175-1|2026|22 {{int:October}}}} {{WFO|wfo-0000474145|2026|{{int:October}}|22}} {{Commonscat}} {{Taxonbar}} [[Category:Cyril Tenison White taxa]] hh2qhp2upxmhxtak8e06djjeh260qcp Template:Gundlach, 1888a 10 2336571 11322520 2026-10-22T03:15:09Z John Tann 703224 Create template 11322520 wikitext text/x-wiki * {{cite book |last=Gundlach |first=J. |authorlink=Juan Gundlach |year=1888–1890 |title={{lang|es|Contribución a la Entomología Cubana. No. 2. Part 4. Neurópteros}} |pages=189–286 |language=Spanish }} {{BHL|page/46357700}} {{access|open}} <includeonly>[[Template:Gundlach, 1888a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> iqx4ummw4s2bugo1ql5bjkzd971ao3r 11322542 11322520 2026-10-22T03:31:14Z John Tann 703224 authorlink 11322542 wikitext text/x-wiki * {{cite book |last=Gundlach |first=J.C. |authorlink=Juan Cristóbal Gundlach |year=1888–1890 |title={{lang|es|Contribución a la Entomología Cubana. No. 2. Part 4. Neurópteros}} |pages=189–286 |language=Spanish }} {{BHL|page/46357700}} {{access|open}} <includeonly>[[Template:Gundlach, 1888a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> k3mny1o2ge8tjnpl99mbbc74wbz8al7 Megalovis latifrons 0 2336572 11322522 2026-10-22T03:20:45Z The editor 2345 2915305 Created page with "{{Image|Megalovis latifrons calco endocranico.JPG}} =={{int:Taxonavigation}}== {{Megalovis}} Species: †''[[Megalovis latifrons]]'' =={{int:Name}}== ''Megalovis latifrons'' {{a|Samuel Schaub|Schaub}}, 1923 =={{int:References}}== ==={{int:Primary references}}=== {{Schaub, 1923}} {{Authority control}} [[Category:Samuel Schaub taxa]]" 11322522 wikitext text/x-wiki {{Image|Megalovis latifrons calco endocranico.JPG}} =={{int:Taxonavigation}}== {{Megalovis}} Species: †''[[Megalovis latifrons]]'' =={{int:Name}}== ''Megalovis latifrons'' {{a|Samuel Schaub|Schaub}}, 1923 =={{int:References}}== ==={{int:Primary references}}=== {{Schaub, 1923}} {{Authority control}} [[Category:Samuel Schaub taxa]] k0k5rnnhvo0r1dtroxzopii1rlh5p6w Template:Gundlach, 1886 10 2336573 11322530 2026-10-22T03:27:49Z John Tann 703224 Create template 11322530 wikitext text/x-wiki * {{cite book |last=Gundlach |first=J. |authorlink=Juan Gundlach |year=1886 |title={{lang|es|Contribución a la entomología cubana}} |volume=2 |location=Habana |publisher=Imp. "La Antilla" de Cacho-Negrete |language=Spanish |doi=10.5962/bhl.title.49760 }} 396 pp. {{BHL|page/46357504}} {{access|open}} <includeonly>[[Template:Gundlach, 1886|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> f2k62xmaqcazvxzer3bfy2j4abv5uvw 11322540 11322530 2026-10-22T03:30:42Z John Tann 703224 authorlink 11322540 wikitext text/x-wiki * {{cite book |last=Gundlach |first=J.C. |authorlink=Juan Cristóbal Gundlach |year=1886 |title={{lang|es|Contribución a la entomología cubana}} |volume=2 |location=Habana |publisher=Imp. "La Antilla" de Cacho-Negrete |language=Spanish |doi=10.5962/bhl.title.49760 }} 396 pp. {{BHL|page/46357504}} {{access|open}} <includeonly>[[Template:Gundlach, 1886|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 1fh7y9yx12hpa1cunp7p7zfc4ahd1cz Cucullicoelotes beibei 0 2336574 11322545 2026-10-22T03:31:55Z PeterR 7354 new species 2026 after original bulletin 11322545 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes beibei]]'' =={{int:Name}}== ''Cucullicoelotes beibei'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 17 Type locality: China, Chongqing Muni.: Beibei Dist., Jinyun Mountain Nature reserve, Caijiagou, 29°50'15"N, 106°21'28"e, elev. 227 m. Holotype: [[SWUC]]. male ♂. SWuC-T-Ag-59-01. 12.XII.2010. legit Z.S. Zhang. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] rhaut56jnly0vge6oac5rllt9omsrbk Cucullicoelotes simianshan 0 2336575 11322553 2026-10-22T03:34:52Z PeterR 7354 new species 2026 after original bulletin 11322553 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes simianshan]]'' =={{int:Name}}== ''Cucullicoelotes simianshan'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 20 Type locality: China, Chongqing Muni.: Jiangjin Dist., Simian Mountain Nature reserve, Dawopu Administrative Station, 28°34'40"N, 106°21'3"e, elev. 1043 m. Holotype: [[SWUC]]. female ♀. SWuC-T-Ag-60-01. 05.I.2023. legit Z.S. Zhang, L.Y. Wang, Z. Fan, B.J. Wang, X.L. Chen and T.Y. Ren. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 8f64mmjh6800e5hkl20puqva5xltb6j Cucullicoelotes wuxi 0 2336576 11322561 2026-10-22T03:38:14Z PeterR 7354 new species 2026 after original bulletin 11322561 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes wuxi]]'' =={{int:Name}}== ''Cucullicoelotes wuxi'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 23 Type locality: China, Chongqing Muni.: Wuxi Co., Yintiaoling Nature reserve, Linkouzi, 31°28'28"N, 109°52'39"e, elev. 1259 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-61-01. 14.IV.2022. legit Z.S. Zhang, L.Y. Wang, T.Y. Ren, Q.L. Lu, B. Tan and B. Luo. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] lvrf6ene1791zztfmllt7ovjfprk32l Template:Lartet, 1851 10 2336577 11322566 2026-10-22T03:42:07Z The editor 2345 2915305 Created page with "* {{a|Jean Albert Gaudry|Gaudry, A.}} 1851. {{lang|fr|Notice sur la colline de Sansan, suivie d'une récapitulation des diverses espèces d'animaux vertébrés fossiles, trouvés soit à Sansan, soit dans d'autres gisements du terrain tertiaire miocène dans le bassin sous-pyrénéen.}} Auch: J.-A. Portes 43: 1–42. <includeonly>[[Template:Lartet, 1851|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Fin..." 11322566 wikitext text/x-wiki * {{a|Jean Albert Gaudry|Gaudry, A.}} 1851. {{lang|fr|Notice sur la colline de Sansan, suivie d'une récapitulation des diverses espèces d'animaux vertébrés fossiles, trouvés soit à Sansan, soit dans d'autres gisements du terrain tertiaire miocène dans le bassin sous-pyrénéen.}} Auch: J.-A. Portes 43: 1–42. <includeonly>[[Template:Lartet, 1851|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 0g1g8jcfqnbc3eil9llky70okljcxhb 11322568 11322566 2026-10-22T03:42:29Z The editor 2345 2915305 /* */ 11322568 wikitext text/x-wiki * {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet, É.}} 1851. {{lang|fr|Notice sur la colline de Sansan, suivie d'une récapitulation des diverses espèces d'animaux vertébrés fossiles, trouvés soit à Sansan, soit dans d'autres gisements du terrain tertiaire miocène dans le bassin sous-pyrénéen.}} Auch: J.-A. Portes 43: 1–42. <includeonly>[[Template:Lartet, 1851|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 2bfzk097hghawvrbqbnasoozhdhh19i 11322569 11322568 2026-10-22T03:42:34Z The editor 2345 2915305 /* */ 11322569 wikitext text/x-wiki * {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet, É.}} 1851. {{lang|fr|Notice sur la colline de Sansan, suivie d'une récapitulation des diverses espèces d'animaux vertébrés fossiles, trouvés soit à Sansan, soit dans d'autres gisements du terrain tertiaire miocène dans le bassin sous-pyrénéen.}} Auch: J.-A. Portes 43: 1–42.<includeonly>[[Template:Lartet, 1851|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 9ircdtlaeti1d9h1uz75n25tlk16rrh 11322570 11322569 2026-10-22T03:42:47Z The editor 2345 2915305 /* */ 11322570 wikitext text/x-wiki * {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet, É.}} 1851. {{lang|fr|Notice sur la colline de Sansan, suivie d'une récapitulation des diverses espèces d'animaux vertébrés fossiles, trouvés soit à Sansan, soit dans d'autres gisements du terrain tertiaire miocène dans le bassin sous-pyrénéen.}} Auch: J.-A. Portes 43: 1–42. <includeonly>[[Template:Lartet, 1851|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 2bfzk097hghawvrbqbnasoozhdhh19i Cucullicoelotes sinuolatus 0 2336578 11322567 2026-10-22T03:42:14Z PeterR 7354 new combination 2026 after original bulletin 11322567 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes sinuolatus]]'' =={{int:Name}}== ''Cucullicoelotes sinuolatus'' ({{a|Zhang}}, {{a|Zhu}} & {{a|Wang}}, 2017) Type locality: China, Chongqing Muni.: Wuxi Co., Yintiaoling Nature reserve, Linkouzi, 31°28'28"N, 109°52'39"e, elev. 1259 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-61-01. 14.IV.2022. legit Z.S. Zhang, L.Y. Wang, T.Y. Ren, Q.L. Lu, B. Tan and B. Luo. ==={{int:Synonymy}}=== * ''[[Coelotes sinuolatus]]'' {{a|Zhang}}, {{a|Zhu}} & {{a|Wang}}, 2017: 189. (original combination) =={{int:References}}== ==={{int:Primary references}}=== ==={{int:Additional references}}=== {{Wang et al., 2026b1}} atb0r8rhz3rtw461tij6mn8mu271wt3 11322573 11322567 2026-10-22T03:44:03Z PeterR 7354 11322573 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes sinuolatus]]'' =={{int:Name}}== ''Cucullicoelotes sinuolatus'' ({{a|Zhi-Sheng Zhang|Zhang]], {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) Type locality: China, Chongqing Muni.: Wuxi Co., Yintiaoling Nature reserve, Linkouzi, 31°28'28"N, 109°52'39"e, elev. 1259 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-61-01. 14.IV.2022. legit Z.S. Zhang, L.Y. Wang, T.Y. Ren, Q.L. Lu, B. Tan and B. Luo. ==={{int:Synonymy}}=== * ''[[Coelotes sinuolatus]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 189. (original combination) =={{int:References}}== ==={{int:Primary references}}=== ==={{int:Additional references}}=== {{Wang et al., 2026b1}} 3muf827p97ev5vnv06v47hxmmtjn122 11322574 11322573 2026-10-22T03:44:48Z PeterR 7354 11322574 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes sinuolatus]]'' =={{int:Name}}== ''Cucullicoelotes sinuolatus'' ({{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) {{int:Type locality}}: China, Guizhou, Daozhen County, Dashahe Nature Reserve, Qianshiyan. {{int:Holotype}}: [[MHBU]]. female ♀. 31.V.2004. legit Z.S. Zhang. ==={{int:Synonymy}}=== * ''[[Coelotes sinuolatus]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 189. (original combination) =={{int:References}}== ==={{int:Primary references}}=== ==={{int:Additional references}}=== {{Wang et al., 2026b1}} 0vvs4tdze1s0252nlxaas1gr0g1yemv 11322576 11322574 2026-10-22T03:45:59Z PeterR 7354 11322576 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes sinuolatus]]'' =={{int:Name}}== ''Cucullicoelotes sinuolatus'' ({{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) {{int:Type locality}}: China, Guizhou, Daozhen County, Dashahe Nature Reserve, Qianshiyan. {{int:Holotype}}: [[MHBU]]. female ♀. 31.V.2004. legit Z.S. Zhang. ==={{int:Synonymy}}=== * ''[[Coelotes sinuolatus]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 189. (original combination) * ''Cucullicoelotes sinuolatus'' Zhang, Zhu & Wang - Wang et al., 2026: 21 =={{int:References}}== ==={{int:Primary references}}=== ==={{int:Additional references}}=== {{Wang et al., 2026b1}} o192l9o5l4pjldt6z1zoasxjc7z5qgq 11322578 11322576 2026-10-22T03:46:46Z PeterR 7354 11322578 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Cucullicoelotes}} Species: ''[[Cucullicoelotes sinuolatus]]'' =={{int:Name}}== ''Cucullicoelotes sinuolatus'' ({{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) {{int:Type locality}}: China, Guizhou, Daozhen County, Dashahe Nature Reserve, Qianshiyan. {{int:Holotype}}: [[MHBU]]. female ♀. 31.V.2004. legit Z.S. Zhang. ==={{int:Synonymy}}=== * ''[[Coelotes sinuolatus]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 189. (original combination) * ''Cucullicoelotes sinuolatus'' Zhang, Zhu & Wang - Wang et al., 2026: 21 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} 6ikqzbowzhy5sak55b5m9u1okiit97e Micromeryx 0 2336579 11322575 2026-10-22T03:45:50Z The editor 2345 2915305 Created page with "{{Image|Zwerghirsch-Micromeryx-Skelett.jpg}} =={{int:Taxonavigation}}== {{Micromeryx}} Species (2): †{{sp|M|icromeryx|azanzae}} †{{splast|M|icromeryx|flourensianus}} =={{int:Name}}== '' Micromeryx'' {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet}}, 1851 * {{int:Type species}}: '' Micromeryx flourensianus'', {{aut|Lartet}}, 1851. =={{int:References}}== ==={{int:Primary references}}=== {{Lartet, 1851}} {{Taxonbar}} Category:Édouard Armand Isidore Hippolyte L..." 11322575 wikitext text/x-wiki {{Image|Zwerghirsch-Micromeryx-Skelett.jpg}} =={{int:Taxonavigation}}== {{Micromeryx}} Species (2): †{{sp|M|icromeryx|azanzae}} †{{splast|M|icromeryx|flourensianus}} =={{int:Name}}== '' Micromeryx'' {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet}}, 1851 * {{int:Type species}}: '' Micromeryx flourensianus'', {{aut|Lartet}}, 1851. =={{int:References}}== ==={{int:Primary references}}=== {{Lartet, 1851}} {{Taxonbar}} [[Category:Édouard Armand Isidore Hippolyte Lartet taxa]] 60rrqd92swpgydgdea77lw1577ndtev 11322581 11322575 2026-10-22T03:47:34Z The editor 2345 2915305 11322581 wikitext text/x-wiki {{Image|Zwerghirsch-Micromeryx-Skelett.jpg}} =={{int:Taxonavigation}}== {{Micromeryx}} Species (2): †{{sp|M|icromeryx|azanzae}} †{{splast|M|icromeryx|flourensianus}} =={{int:Name}}== '' Micromeryx'' {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet}}, 1851 * {{int:Type species}}: '' Micromeryx flourensianus'' {{aut|Lartet}}, 1851. =={{int:References}}== ==={{int:Primary references}}=== {{Lartet, 1851}} {{Taxonbar}} [[Category:Édouard Armand Isidore Hippolyte Lartet taxa]] mq5m37r74yefzja4dd5990s0q5e22v8 Template:Micromeryx 10 2336580 11322577 2026-10-22T03:46:27Z The editor 2345 2915305 Created page with "{{Moschidae}} Genus: †{{gbr|Micromeryx}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322577 wikitext text/x-wiki {{Moschidae}} Genus: †{{gbr|Micromeryx}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 9s3dqztbbqw7dwednwmtl0fwsa7425o Micromeryx flourensianus 0 2336581 11322580 2026-10-22T03:47:14Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Micromeryx}} Species: †''[[Micromeryx flourensianus]]'' =={{int:Name}}== '' Micromeryx flourensianus'' {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet}}, 1851 =={{int:References}}== ==={{int:Primary references}}=== {{Lartet, 1851}} {{Taxonbar}} [[Category:Édouard Armand Isidore Hippolyte Lartet taxa]]" 11322580 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Micromeryx}} Species: †''[[Micromeryx flourensianus]]'' =={{int:Name}}== '' Micromeryx flourensianus'' {{a|Édouard Armand Isidore Hippolyte Lartet|Lartet}}, 1851 =={{int:References}}== ==={{int:Primary references}}=== {{Lartet, 1851}} {{Taxonbar}} [[Category:Édouard Armand Isidore Hippolyte Lartet taxa]] 89nhfdyx86lztcirjjl90ua8o7jf8sy Dolabocoelotes 0 2336582 11322583 2026-10-22T03:51:01Z PeterR 7354 new genus 2026 after original bulletin 11322583 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: {{sp|D|olabocoelotes|jiangyongensis}} {{sp|D|olabocoelotes|wanzhou}} {{splast|D|olabocoelotes|xishuiensis}} =={{int:Name}}== ''Dolabocoelotes'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 26 Type species: ''Dolabocoelotes wanzhou'' {{aut|Wang}} et al., 2026 Gender: '''masculine''' =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 24xc0dvq21tlyk7yimsvsw28etg206b Template:Dolabocoelotes 10 2336583 11322584 2026-10-22T03:52:12Z PeterR 7354 Created page with "{{Coelotinae}} Genus: ''[[Dolabocoelotes]]'' <br />" 11322584 wikitext text/x-wiki {{Coelotinae}} Genus: ''[[Dolabocoelotes]]'' <br /> o6wgsda0sh19y5pm0a6gg4tu8mkq4wh Template:Sánchez et al., 2011 10 2336584 11322588 2026-10-22T03:58:42Z The editor 2345 2915305 Created page with "* {{a|Israel M. Sánchez|Sánchez, I.M.}}, {{a|Daniel DeMiguel|DeMiguel, D.}}, {{a|Victoria Quiralte|Quiralte, V.}} & {{a|Jorge Morales Romero|Morales, J.}} 2011. The first known Asian ''Hispanomeryx'' (Mammalia, Ruminantia, Moschidae). ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'' 31(6): 1397–1403. {{doi|10.1080/02724634.2011.618155}} <includeonly>[[Template:Sánchez et al., 2011|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLin..." 11322588 wikitext text/x-wiki * {{a|Israel M. Sánchez|Sánchez, I.M.}}, {{a|Daniel DeMiguel|DeMiguel, D.}}, {{a|Victoria Quiralte|Quiralte, V.}} & {{a|Jorge Morales Romero|Morales, J.}} 2011. The first known Asian ''Hispanomeryx'' (Mammalia, Ruminantia, Moschidae). ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'' 31(6): 1397–1403. {{doi|10.1080/02724634.2011.618155}} <includeonly>[[Template:Sánchez et al., 2011|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 4a1p013vivcydn82cd6mqbmiu7mybdj 11322589 11322588 2026-10-22T03:58:54Z The editor 2345 2915305 The editor 2345 moved page [[Template:Sánchez at al., 2011]] to [[Template:Sánchez et al., 2011]] 11322588 wikitext text/x-wiki * {{a|Israel M. Sánchez|Sánchez, I.M.}}, {{a|Daniel DeMiguel|DeMiguel, D.}}, {{a|Victoria Quiralte|Quiralte, V.}} & {{a|Jorge Morales Romero|Morales, J.}} 2011. The first known Asian ''Hispanomeryx'' (Mammalia, Ruminantia, Moschidae). ''[[ISSN 0272-4634|Journal of Vertebrate Paleontology]]'' 31(6): 1397–1403. {{doi|10.1080/02724634.2011.618155}} <includeonly>[[Template:Sánchez et al., 2011|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 4a1p013vivcydn82cd6mqbmiu7mybdj Template:Calvert, 1919 10 2336586 11322595 2026-10-22T04:01:45Z John Tann 703224 Create template 11322595 wikitext text/x-wiki * {{cite journal |last=Calvert |first=P.P. |authorlink=Philip Powell Calvert |year=1919 |title=Gundlach's work on the Odonata of Cuba: A critical study |journal=[[ISSN 0002-8320|Transactions of the American Entomological Society]] |volume=45 |issue=4 |pages=335–396 }} {{JSTOR|25077020}} {{access|open}} <includeonly>[[Template:Calvert, 1919|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> dyroq5sen5xc22mbm9qal4zuo576amb Hispanomeryx andrewsi 0 2336587 11322596 2026-10-22T04:02:21Z The editor 2345 2915305 Created page with "=={{int:Taxonavigation}}== {{Hispanomeryx}} Species: †''[[Hispanomeryx andrewsi]]'' =={{int:Name}}== ''Hispanomeryx andrewsi'' {{a|Israel M. Sánchez|Sánchez}}, {{a|Daniel DeMiguel|DeMiguel}}, {{a|Victoria Quiralte|Quiralte}} & {{a|Jorge Morales Romero|Morales}}, 2011 =={{int:References}}== ==={{int:Primary references}}=== {{Sánchez et al., 2011}} {{Taxonbar}} [[Category:Israel M. Sánchez taxa]] [[Category:Daniel DeMiguel taxa]] [[Category:Victoria Quiralte taxa]..." 11322596 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Hispanomeryx}} Species: †''[[Hispanomeryx andrewsi]]'' =={{int:Name}}== ''Hispanomeryx andrewsi'' {{a|Israel M. Sánchez|Sánchez}}, {{a|Daniel DeMiguel|DeMiguel}}, {{a|Victoria Quiralte|Quiralte}} & {{a|Jorge Morales Romero|Morales}}, 2011 =={{int:References}}== ==={{int:Primary references}}=== {{Sánchez et al., 2011}} {{Taxonbar}} [[Category:Israel M. Sánchez taxa]] [[Category:Daniel DeMiguel taxa]] [[Category:Victoria Quiralte taxa]] [[Category:Jorge Morales Romero taxa]] d9td34m1ascqt07ptx1b4vn4u69avj3 Template:Hagen, 1868 10 2336588 11322597 2026-10-22T04:37:08Z John Tann 703224 Create template 11322597 wikitext text/x-wiki * {{cite journal |last=Hagen |first=H.A. |authorlink=Hermann August Hagen |year=1868 |title=The Odonat-fauna of the island of Cuba |journal=[[ISSN 0270-2444|Proceedings of the Boston Society of Natural History]] |volume=11 |pages=289–294 }} {{BHL|page/8059624}} {{access|open}} <includeonly>[[Template:Hagen, 1868|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 82ooblsoacerwxwzbnp77fjbzy99vj4 Template:Calvert, 1891 10 2336589 11322598 2026-10-22T04:55:17Z John Tann 703224 Create template 11322598 wikitext text/x-wiki * {{cite journal |last=Calvert |first=P.P. |authorlink=Philip Powell Calvert |year=1891 |title=A new genus and species of Odonata from Jamaica |journal=[[Entomological news and proceedings of the Entomological Section of the Academy of Natural Sciences of Philadelphia|Entomological News, and Proceedings of the Entomological Section of the Academy of Natural Sciences of Philadelphia]] |volume=2 |page=199 }} {{BHL|page/2566115}} {{access|open}} <includeonly>[[Template:Calvert, 1891|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> i26izkchjmsea6fnyz6b5r8rxwijosh Template:Kostopoulos & Bernor, 2011 10 2336590 11322600 2026-10-22T05:10:33Z The editor 2345 2915305 Created page with "* {{a|Dimitris S. Kostopoulos|Kostopoulos, D.S.}} & {{a|Raymond L. Bernor|Bernor, R.L.}} 2011. The Maragheh bovids (Mammalia, Artiodactyla): systematic revision and biostratigraphic-zoogeographic interpretation. ''[[ISSN 1280-9659|Geodiversitas]]'', 33(4): 649–708. {{doi|10.5252/g2011n4a6}} <includeonly>[[Template:Kostopoulos &#38; Bernor, 2011|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all W..." 11322600 wikitext text/x-wiki * {{a|Dimitris S. Kostopoulos|Kostopoulos, D.S.}} & {{a|Raymond L. Bernor|Bernor, R.L.}} 2011. The Maragheh bovids (Mammalia, Artiodactyla): systematic revision and biostratigraphic-zoogeographic interpretation. ''[[ISSN 1280-9659|Geodiversitas]]'', 33(4): 649–708. {{doi|10.5252/g2011n4a6}} <includeonly>[[Template:Kostopoulos &#38; Bernor, 2011|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 0kq1aqq272zao1xvvmvqdzgct93tzh7 Kostopoulos 0 2336591 11322601 2026-10-22T05:11:03Z The editor 2345 2915305 Redirected page to [[Dimitris S. Kostopoulos]] 11322601 wikitext text/x-wiki #Redirect [[Dimitris S. Kostopoulos]] ek87rh8ohioau4xkz7dkhmbl7rk1hex Template:Barker, 2026 10 2336592 11322611 2026-10-22T06:56:31Z Hiouf 2107144 Created page with "* {{a|Stephen C. Barker|Barker, S.C.}} 2026. A new classification of the subfamily Ixodinae (Acari: Ixodida: Ixodidae). {{Zootaxa|2026|5894|1|84|98|5}} {{Access|closed}} <includeonly>[[Template:Barker, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 21 October 2026 * {{ZooBank|4AA1..." 11322611 wikitext text/x-wiki * {{a|Stephen C. Barker|Barker, S.C.}} 2026. A new classification of the subfamily Ixodinae (Acari: Ixodida: Ixodidae). {{Zootaxa|2026|5894|1|84|98|5}} {{Access|closed}} <includeonly>[[Template:Barker, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 21 October 2026 * {{ZooBank|4AA1A9FF-9158-462E-BF7E-BD5E2E48EAFE}} ==={{int:New names}} (1)=== * [[Australixodini]] trib. nov. [[Category:Reference templates]]</noinclude> 7tss0qsrdnj2qet0qe14zarpmm7v2qy Template:Australixodini 10 2336593 11322613 2026-10-22T07:02:37Z Hiouf 2107144 Created page with "{{Ixodinae}} Tribus: {{fbr|Australixodini}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly>" 11322613 wikitext text/x-wiki {{Ixodinae}} Tribus: {{fbr|Australixodini}} <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 1oslt8366ckjjttrms320lejclk04xs Australixodini 0 2336594 11322614 2026-10-22T07:04:25Z Hiouf 2107144 Created page with "=={{int:Taxonavigation}}== {{Australixodini}} Genera (6): {{g|Australixodes}} {{g|Ceratixodes}} {{g|Coxixodes}} {{g|Endopalpiger}} {{g|Exopalpiger}} {{glast|Sternalixodes}} =={{int:Name}}== Australixodini {{a|Stephen C. Barker|Barker}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Barker, 2026}} {{Commons}} {{Taxonbar}} [[Category:Stephen C. Barker taxa]]" 11322614 wikitext text/x-wiki =={{int:Taxonavigation}}== {{Australixodini}} Genera (6): {{g|Australixodes}} {{g|Ceratixodes}} {{g|Coxixodes}} {{g|Endopalpiger}} {{g|Exopalpiger}} {{glast|Sternalixodes}} =={{int:Name}}== Australixodini {{a|Stephen C. Barker|Barker}}, 2026 =={{int:References}}== ==={{int:Primary references}}=== {{Barker, 2026}} {{Commons}} {{Taxonbar}} [[Category:Stephen C. Barker taxa]] hvxrydpayypr3man92tgpwbsyj3dmc3 Template:Bineesh, Kasinath & Ebert, 2026 10 2336595 11322616 2026-10-22T07:11:03Z Hiouf 2107144 Created page with "* {{a|Kinattumkara K. Bineesh|Bineesh, K.K.}}, {{a|Anil Kasinath|Kasinath, A.|nolink=y}} & {{a|David A. Ebert|Ebert, D.A.}} 2026. ''Tetronarce ramanamurthyi'' sp. nov. (Torpediniformes: Torpedinidae), a new species of electric ray from the southeastern Arabian Sea, northern Indian Ocean. {{Zootaxa|2026|5890|4|557|570|7}} {{Access|closed}} <includeonly>[[Template:Bineesh, Kasinath & Ebert, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLink..." 11322616 wikitext text/x-wiki * {{a|Kinattumkara K. Bineesh|Bineesh, K.K.}}, {{a|Anil Kasinath|Kasinath, A.|nolink=y}} & {{a|David A. Ebert|Ebert, D.A.}} 2026. ''Tetronarce ramanamurthyi'' sp. nov. (Torpediniformes: Torpedinidae), a new species of electric ray from the southeastern Arabian Sea, northern Indian Ocean. {{Zootaxa|2026|5890|4|557|570|7}} {{Access|closed}} <includeonly>[[Template:Bineesh, Kasinath & Ebert, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 19 October 2026 * {{Zoobank|14AF7C55-AE73-4E68-AC5E-6BEB3CC18DF7}} ==={{int:New names}} (1)=== * ''[[Tetronarce ramanamurthyi]]'' sp. nov. [[Category:Reference templates]]</noinclude> 7xpde6j9jbkla19g91jdv74rlb1r37c Barbula montana 0 2336596 11322621 2026-10-22T07:29:33Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322621 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula montana 0 2336597 11322622 2026-10-22T07:29:33Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322622 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula intermedia 0 2336598 11322623 2026-10-22T07:29:33Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322623 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula ruralis subsp. intermedia 0 2336599 11322624 2026-10-22T07:29:34Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322624 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula ruralis var. intermedia 0 2336600 11322625 2026-10-22T07:29:34Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322625 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Syntrichia intermedia 0 2336601 11322626 2026-10-22T07:29:35Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322626 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula intermedia 0 2336602 11322627 2026-10-22T07:29:35Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322627 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula intermedia var. planifolia 0 2336603 11322628 2026-10-22T07:29:36Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322628 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Syntrichia montana var. planifolia 0 2336604 11322629 2026-10-22T07:29:36Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322629 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula intermedia var. planifolia 0 2336605 11322630 2026-10-22T07:29:37Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322630 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula montana var. planifolia 0 2336606 11322631 2026-10-22T07:29:37Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322631 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula intermedia var. rupestris 0 2336607 11322632 2026-10-22T07:29:38Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322632 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula pulvinata var. rupestris 0 2336608 11322633 2026-10-22T07:29:38Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322633 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula ruralis var. rupestris 0 2336609 11322634 2026-10-22T07:29:38Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322634 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Syntrichia montana subsp. subcalcicola 0 2336610 11322635 2026-10-22T07:29:39Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322635 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Syntrichia montana var. subcalcicola 0 2336611 11322636 2026-10-22T07:29:39Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322636 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula intermedia var. subcalcicola 0 2336612 11322637 2026-10-22T07:29:40Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322637 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula crinita 0 2336613 11322638 2026-10-22T07:29:40Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322638 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula ruralis var. crinita 0 2336614 11322639 2026-10-22T07:29:41Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322639 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula intermedia var. intermedia 0 2336615 11322640 2026-10-22T07:29:41Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322640 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula montana var. paludosa 0 2336616 11322641 2026-10-22T07:29:42Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322641 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula ruralis var. minor 0 2336617 11322642 2026-10-22T07:29:42Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322642 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Tortula ruralis var. rupestris 0 2336618 11322643 2026-10-22T07:29:43Z MILEPRI 924668 Redirected page to [[Syntrichia montana]] 11322643 wikitext text/x-wiki #REDIRECT [[Syntrichia montana]] blyteo9eo1nsjssqxqq7crnkhb6zp1f Barbula norvegica 0 2336619 11322645 2026-10-22T07:44:11Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322645 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia ruralis var. norvegica 0 2336620 11322646 2026-10-22T07:44:12Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322646 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula ruralis subsp. norvegica 0 2336621 11322647 2026-10-22T07:44:12Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322647 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula ruralis var. norvegica 0 2336622 11322648 2026-10-22T07:44:13Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322648 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Barbula aciphylla 0 2336623 11322649 2026-10-22T07:44:13Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322649 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Barbula ruralis subsp. aciphylla 0 2336624 11322650 2026-10-22T07:44:14Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322650 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia aciphylla 0 2336625 11322651 2026-10-22T07:44:14Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322651 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula aciphylla 0 2336626 11322652 2026-10-22T07:44:15Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322652 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Barbula brachyangia 0 2336627 11322653 2026-10-22T07:44:15Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322653 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula brachyangia 0 2336628 11322654 2026-10-22T07:44:16Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322654 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia aciphylla var. latipila 0 2336629 11322655 2026-10-22T07:44:16Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322655 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia montana f. rufipila 0 2336630 11322656 2026-10-22T07:44:17Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322656 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia montana var. rufipila 0 2336631 11322657 2026-10-22T07:44:17Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322657 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia ruralis f. compacta 0 2336632 11322658 2026-10-22T07:44:18Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322658 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula aciphylla var. compacta 0 2336633 11322659 2026-10-22T07:44:18Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322659 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia ruralis f. rufipila 0 2336634 11322660 2026-10-22T07:44:18Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322660 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia ruralis var. rufipila 0 2336635 11322661 2026-10-22T07:44:19Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322661 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula ruralis var. rufipila 0 2336636 11322662 2026-10-22T07:44:19Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322662 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Syntrichia ruralis var. pseudoaciphylla 0 2336637 11322663 2026-10-22T07:44:20Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322663 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula ruralis var. pseudoaciphylla 0 2336638 11322664 2026-10-22T07:44:20Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322664 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula alpina 0 2336639 11322665 2026-10-22T07:44:21Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322665 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula ruralis var. alpina 0 2336640 11322666 2026-10-22T07:44:21Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322666 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula norvegica var. norvegica 0 2336641 11322667 2026-10-22T07:44:22Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322667 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula remotifolia 0 2336642 11322668 2026-10-22T07:44:22Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322668 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Tortula rubripila 0 2336643 11322669 2026-10-22T07:44:22Z MILEPRI 924668 Redirected page to [[Syntrichia norvegica]] 11322669 wikitext text/x-wiki #REDIRECT [[Syntrichia norvegica]] skoqj53yzweoaz366kgxxtk2wy3a7a8 Brassica juncea 0 2336644 11322671 2026-10-22T07:52:23Z Andyboorman 251907 Andyboorman moved page [[Brassica juncea]] to [[× Brassarda juncea]]: Move to the valid combination: see references 11322671 wikitext text/x-wiki #REDIRECT [[× Brassarda juncea]] okvlodrdzfnp2tf6sdvhyijucirldkl Barbula alpina subsp. pagorum 0 2336645 11322675 2026-10-22T08:03:29Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322675 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula laevipila f. pagorum 0 2336646 11322676 2026-10-22T08:03:29Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322676 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula laevipila subsp. pagorum 0 2336647 11322677 2026-10-22T08:03:30Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322677 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula laevipila var. pagorum 0 2336648 11322678 2026-10-22T08:03:30Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322678 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula pagorum 0 2336649 11322679 2026-10-22T08:03:31Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322679 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Syntrichia laevipila var. pagorum 0 2336650 11322680 2026-10-22T08:03:31Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322680 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula asperifolia 0 2336651 11322681 2026-10-22T08:03:32Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322681 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula crawfordii 0 2336652 11322682 2026-10-22T08:03:33Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322682 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula crawfordii 0 2336653 11322683 2026-10-22T08:03:33Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322683 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Barbula saccardoana 0 2336654 11322684 2026-10-22T08:03:33Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322684 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula laevipila var. saccardoana 0 2336655 11322685 2026-10-22T08:03:34Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322685 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula saccardoana 0 2336656 11322686 2026-10-22T08:03:34Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322686 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Syntrichia laevipila var. propagulifera 0 2336657 11322687 2026-10-22T08:03:35Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322687 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula alpina var. propagulifera (Lindb.) E.B. Bartram 0 2336658 11322688 2026-10-22T08:03:35Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322688 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula laevipila var. propagulifera 0 2336659 11322689 2026-10-22T08:03:36Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322689 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Syntrichia laevipila var. wachteri 0 2336660 11322690 2026-10-22T08:03:36Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322690 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula laevipila var. wachteri 0 2336661 11322691 2026-10-22T08:03:37Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322691 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula asperifolia 0 2336662 11322692 2026-10-22T08:03:37Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322692 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula laevipila var. notarisii 0 2336663 11322693 2026-10-22T08:03:38Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322693 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Tortula propagulata 0 2336664 11322694 2026-10-22T08:03:38Z MILEPRI 924668 Redirected page to [[Syntrichia pagorum]] 11322694 wikitext text/x-wiki #REDIRECT [[Syntrichia pagorum]] 2826io452xygadcdg2ia6ep3744ma83 Template:× Rapistrosymbrium 10 2336665 11322695 2026-10-22T08:09:24Z Andyboorman 251907 Created page with "{{Brassicaceae}} Genus: {{gbr|× Rapistrosymbrium}}" 11322695 wikitext text/x-wiki {{Brassicaceae}} Genus: {{gbr|× Rapistrosymbrium}} s1msdm08bln68ytsgehccplqzov1d26 Dolabocoelotes wanzhou 0 2336666 11322696 2026-10-22T08:09:52Z PeterR 7354 new species 2026 after original bulletin 11322696 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes wanzhou]]'' =={{int:Name}}== ''Dolabocoelotes wanzhou'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 26 Type locality: China, Chongqing Muni.: Wanzhou Dist., Wangerbao Nature reserve, 30°39'38"N, 108°43'36"e, elev. 1180 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-62-01. 25.X.2020. legit L.Y. Wang, Y. Zhang, J.X. Zhao and J.S. Luo. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 9435ajzdli93bvgmwe7v0ce53ff0vk5 Dolabocoelotes xishuiensis 0 2336667 11322697 2026-10-22T08:14:30Z PeterR 7354 new combination 2026 after original bulletin 11322697 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes xishuiensis]]'' =={{int:Name}}== ''Dolabocoelotes xishuiensis'' ({{a|Zhang}}, {{a|Zhu}} & {{a|Wang}}, 2017}}, 2017) {{int:Type locality}}: China, Guizhou, Daozhen County, Dashahe Nature Reserve, Qianshiyan. {{int:Holotype}}: [[MHBU]]. female ♀. 31.V.2004. legit Z.S. Zhang. ==={{int:Synonymy}}=== * ''[[Draconarius xishuiensis]]'' {{a|Zhang}}, {{a|Zhu}} & {{a|Wang}}, 2017: 410. (original combination) * ''Dolabocoelotes xishuiensis'' Zhang, Zhu & Wang - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} e9jt9niho90hbsedxo5ccmqk3icwwk9 11322698 11322697 2026-10-22T08:16:25Z PeterR 7354 11322698 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes xishuiensis]]'' =={{int:Name}}== ''Dolabocoelotes xishuiensis'' ({{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) {{int:Type locality}}: China, Guizhou, Daozhen County, Dashahe Nature Reserve, Qianshiyan. {{int:Holotype}}: [[MHBU]]. female ♀. 31.V.2004. legit Z.S. Zhang. ==={{int:Synonymy}}=== * ''[[Draconarius xishuiensis]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 410. (original combination) * ''Dolabocoelotes xishuiensis'' Zhang, Zhu & Wang - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} ka73ltz2y6fkpb0rmres6p6pabnzhs7 11322699 11322698 2026-10-22T08:17:03Z PeterR 7354 11322699 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes xishuiensis]]'' =={{int:Name}}== ''Dolabocoelotes xishuiensis'' ({{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) {{int:Type locality}}: China, Giuzhou, Xishui Nature Reserve. {{int:Holotype}}: [[MHBU]]. female ♀. 26.VII.2004. legit H.M. Chen. ==={{int:Synonymy}}=== * ''[[Draconarius xishuiensis]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 410. (original combination) * ''Dolabocoelotes xishuiensis'' Zhang, Zhu & Wang - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} tmt6hzksrjuq8c43yungcrbkywts5u8 Barbula laevipila subsp. papillosa 0 2336668 11322702 2026-10-22T08:18:50Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322702 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula papillosa 0 2336669 11322703 2026-10-22T08:18:50Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322703 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula baileyi 0 2336670 11322704 2026-10-22T08:18:51Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322704 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Syntrichia baileyi 0 2336671 11322705 2026-10-22T08:18:52Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322705 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula baileyi 0 2336672 11322706 2026-10-22T08:18:52Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322706 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula reticularia 0 2336673 11322707 2026-10-22T08:18:52Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322707 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula reticularia 0 2336674 11322708 2026-10-22T08:18:53Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322708 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula rotundifolia 0 2336675 11322709 2026-10-22T08:18:53Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322709 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula rotundifolia 0 2336676 11322710 2026-10-22T08:18:54Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322710 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula streptopogoniacea 0 2336677 11322711 2026-10-22T08:18:54Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322711 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula streptopogoniacea 0 2336678 11322712 2026-10-22T08:18:55Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322712 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula vesiculosa 0 2336679 11322713 2026-10-22T08:18:55Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322713 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula vesiculosa 0 2336680 11322714 2026-10-22T08:18:56Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322714 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Barbula vesiculosa var. involucrata 0 2336681 11322715 2026-10-22T08:18:56Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322715 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula involucrata 0 2336682 11322716 2026-10-22T08:18:56Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322716 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula vesiculosa var. involucrata 0 2336683 11322717 2026-10-22T08:18:57Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322717 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Syntrichia papillosa f. saxatilis 0 2336684 11322718 2026-10-22T08:18:57Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322718 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Syntrichia papillosa var. saxatilis 0 2336685 11322719 2026-10-22T08:18:58Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322719 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula papillosa var. saxatilis 0 2336686 11322720 2026-10-22T08:18:58Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322720 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Syntrichia papillosa var. chilensis 0 2336687 11322721 2026-10-22T08:18:59Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322721 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula papillosa var. chilensis 0 2336688 11322722 2026-10-22T08:18:59Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322722 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Syntrichia papillosa var. meridionalis 0 2336689 11322723 2026-10-22T08:19:00Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322723 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Tortula papillosa var. meridionalis 0 2336690 11322724 2026-10-22T08:19:00Z MILEPRI 924668 Redirected page to [[Syntrichia papillosa]] 11322724 wikitext text/x-wiki #REDIRECT [[Syntrichia papillosa]] 5qe5qmpx6p0ec2rstkfpqlvxxi0pm36 Dolabocoelotes jiangyongensis 0 2336691 11322725 2026-10-22T08:21:39Z PeterR 7354 new combination 2026 after original bulletin 11322725 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017) {{int:Type locality}}: China, Giuzhou, Xishui Nature Reserve. {{int:Holotype}}: [[MHBU]]. female ♀. 26.VII.2004. legit H.M. Chen. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Zhi-Sheng Zhang|Zhang}}, {{a|Ming-Sheng Zhu|Zhu}} & {{a|Xin-Ping Wang|Wang}}, 2017: 410. (original combination) * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} sgcmmnlnxcp1uh5muxhp3rordiqrbi1 11322727 11322725 2026-10-22T08:24:19Z PeterR 7354 11322727 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{Joo-Pil Kim|Kim}}, 1996) {{int:Type locality}}: China, Giuzhou, Xishui Nature Reserve. {{int:Holotype}}: [[MHBU]]. female ♀. 26.VII.2004. legit H.M. Chen. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{Joo-Pil Kim|Kim}}, 1996: 19. (original combination) * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} j9oek9o7ij82mcznaadj90w7xpvqkmw 11322728 11322727 2026-10-22T08:25:02Z PeterR 7354 11322728 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{Joo-Pil Kim|Kim}}, 1996) Type locality: Jiangyong County, Hunan Province, China. Holotype: HNU. female ♀. 01.X.1991. legit Gong Lian-Su. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{Joo-Pil Kim|Kim}}, 1996: 19. (original combination) * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Zhang, Zhu & Wang, 2017}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} 1tddo0xzl3uxdlwubchiruds0tx2q8o 11322729 11322728 2026-10-22T08:25:59Z PeterR 7354 11322729 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996) Type locality: Jiangyong County, Hunan Province, China. Holotype: HNU. female ♀. 01.X.1991. legit Gong Lian-Su. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996: 19. (original combination) * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Peng, Gong & Kim, 1996}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} ege996kj5gaizyu2h8jlxisoxsi5s02 11322731 11322729 2026-10-22T08:26:55Z PeterR 7354 11322731 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996) Type locality: Jiangyong County, Hunan Province, China. Holotype: HNU. female ♀. 01.X.1991. legit Gong Lian-Su. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996: 19. (original combination) * ''Draconarius jiangyongensis'' Peng, Gong & Kim - * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Peng, Gong & Kim, 1996}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} 6oagvaljvbrhqcwcg9ltpv2yy8ojrfy 11322732 11322731 2026-10-22T08:27:28Z PeterR 7354 11322732 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996) Type locality: Jiangyong County, Hunan Province, China. Holotype: HNU. female ♀. 01.X.1991. legit Gong Lian-Su. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996: 19. (original combination) * ''Draconarius jiangyongensis'' Peng, Gong & Kim - Wang, 2003: 536 * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Peng, Gong & Kim, 1996}} ==={{int:Additional references}}=== {{Wang et al., 2026b1}} ro3nbolh557lqcd00mnvndw85ugx6ov 11322733 11322732 2026-10-22T08:28:12Z PeterR 7354 11322733 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Dolabocoelotes}} Species: ''[[Dolabocoelotes jiangyongensis]]'' =={{int:Name}}== ''Dolabocoelotes jiangyongensis'' ({{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996) Type locality: Jiangyong County, Hunan Province, China. Holotype: HNU. female ♀. 01.X.1991. legit Gong Lian-Su. ==={{int:Synonymy}}=== * ''[[Coelotes jiangyongensis ]]'' {{a|Xian-Jin Peng|Peng}}, {{a|Lian-Su Gong|Gong}} & {{a|Joo-Pil Kim|Kim}}, 1996: 19. (original combination) * ''Draconarius jiangyongensis'' Peng, Gong & Kim - Wang, 2003: 536 * ''Dolabocoelotes jiangyongensis'' Peng, Gong & Kim - Wang et al., 2026: 28 =={{int:References}}== ==={{int:Primary references}}=== {{Peng, Gong & Kim, 1996}} ==={{int:Additional references}}=== {{Wang, 2003}} {{Wang et al., 2026b1}} k973nuyznnnaj1sk61x2f5973pjwck8 Talk:Alsia 1 2336692 11322730 2026-10-22T08:26:49Z ~2026-56281-11 3040660 /* Leptodontaceae = Neckeraceae */ new section 11322730 wikitext text/x-wiki == Leptodontaceae = Neckeraceae == In GBIF is Alsia not a Leptodontaceae but a Neckeraceae. Why, I don't know, but I still learned, that Leptodontaceae is a synonym. [[Special:Contributions/~2026-56281-11|~2026-56281-11]] ([[User talk:~2026-56281-11|talk]]) 08:26, 22 October 2026 (UTC) mbhgrgz5j8ucrguqtiid24jcpzckhdb Barbula princeps 0 2336693 11322736 2026-10-22T08:31:15Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322736 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula chrysopila 0 2336694 11322737 2026-10-22T08:31:16Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322737 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula chrysopila 0 2336695 11322738 2026-10-22T08:31:16Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322738 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula megalocarpa 0 2336696 11322739 2026-10-22T08:31:17Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322739 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula megalocarpa 0 2336697 11322740 2026-10-22T08:31:17Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322740 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula mollis 0 2336698 11322741 2026-10-22T08:31:18Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322741 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Syntrichia mollis 0 2336699 11322742 2026-10-22T08:31:18Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322742 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula mollis 0 2336700 11322743 2026-10-22T08:31:19Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322743 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula muelleri 0 2336701 11322744 2026-10-22T08:31:19Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322744 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula princeps var. brachycarpa 0 2336702 11322745 2026-10-22T08:31:20Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322745 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Syntrichia princeps var. brachycarpa 0 2336703 11322746 2026-10-22T08:31:20Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322746 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula princeps var. brachycarpa 0 2336704 11322747 2026-10-22T08:31:21Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322747 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula pseudoantarctica 0 2336705 11322748 2026-10-22T08:31:21Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322748 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula pseudoantarctica 0 2336706 11322749 2026-10-22T08:31:22Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322749 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Barbula semirubra 0 2336707 11322750 2026-10-22T08:31:22Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322750 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula semirubra 0 2336708 11322751 2026-10-22T08:31:22Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322751 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Grimmia muelleri 0 2336709 11322752 2026-10-22T08:31:23Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322752 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Syntrichia princeps var. parnassica 0 2336710 11322753 2026-10-22T08:31:23Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322753 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula muelleri var. parnassica 0 2336711 11322754 2026-10-22T08:31:24Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322754 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula princeps subsp. parnassica 0 2336712 11322755 2026-10-22T08:31:24Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322755 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula princeps var. parnassica 0 2336713 11322756 2026-10-22T08:31:25Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322756 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Syntrichia ruralis var. spiralis 0 2336714 11322757 2026-10-22T08:31:25Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322757 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula ruralis var. spiralis 0 2336715 11322758 2026-10-22T08:31:25Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322758 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula spiralis 0 2336716 11322759 2026-10-22T08:31:26Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322759 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula muelleri 0 2336717 11322760 2026-10-22T08:31:26Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322760 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o Tortula princeps subsp. princeps 0 2336718 11322761 2026-10-22T08:31:27Z MILEPRI 924668 Redirected page to [[Syntrichia princeps]] 11322761 wikitext text/x-wiki #REDIRECT [[Syntrichia princeps]] o34f8yf4z3vhkv37euo1qvrszu3m02o × Rapistrosymbrium 0 2336719 11322762 2026-10-22T08:34:15Z Andyboorman 251907 Created page with "{{image}} =={{int:Taxonavigation}}== {{× Rapistrosymbrium}} Species: {{splast|× R|apistrosymbrium|cabanesii}} =={{int:Name}}== ''× Rapistrosymbrium'' {{a|P.Fourn.}} ex {{a|Madiot}}, Monde Pl. 33: 43 (1932) * {{fohy|Rapistrum|Crantz Cl. Crucif. Emend.: 62 (1769), nom. cons.|Sisymbrium| L., Sp. Pl. 2: 657. (1753)}} {{nadi| *'''Continental: Europe''' **'''Regional: Western Europe''' *** France }} =={{int:References}}== ==={{int:Links}}=== {{EMD|2026|Oct|22}} {{POWO|20..." 11322762 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{× Rapistrosymbrium}} Species: {{splast|× R|apistrosymbrium|cabanesii}} =={{int:Name}}== ''× Rapistrosymbrium'' {{a|P.Fourn.}} ex {{a|Madiot}}, Monde Pl. 33: 43 (1932) * {{fohy|Rapistrum|Crantz Cl. Crucif. Emend.: 62 (1769), nom. cons.|Sisymbrium| L., Sp. Pl. 2: 657. (1753)}} {{nadi| *'''Continental: Europe''' **'''Regional: Western Europe''' *** France }} =={{int:References}}== ==={{int:Links}}=== {{EMD|2026|Oct|22}} {{POWO|2026|Oct|22}} {{IPNI||2026|Oct 22}} gmhv4wnfbgobgt4nd7agvsthw2vg3dx 11322961 11322762 2026-10-22T10:25:45Z Andyboorman 251907 11322961 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{× Rapistrosymbrium}} Species: {{splast|× R|apistrosymbrium|cabanesii}} =={{int:Name}}== ''× Rapistrosymbrium'' {{a|P.Fourn.}} ex {{a|Madiot}}, Monde Pl. 33: 43 (1932) * {{fohy|Rapistrum|Crantz Cl. Crucif. Emend.: 62 (1769), nom. cons.|Sisymbrium| L., Sp. Pl. 2: 657. (1753)}} {{nadi| *'''Continental: Europe''' **'''Regional: Western Europe''' *** France }} =={{int:References}}== ==={{int:Links}}=== {{POWO|2026|Oct|22}} {{IPNI||2026|Oct 22}} tc1eaobgmu6q2opf1bjf4o2u44jce6e Syntrichia pseudorobusta 0 2336720 11322764 2026-10-22T08:38:56Z MILEPRI 924668 nuevo taxón 11322764 wikitext text/x-wiki {{image|Syntrichia pseudorobusta.jpg}} =={{int:Taxonavigation}}== {{Syntrichia}} Species: ''[[Syntrichia pseudorobusta]]'' =={{int:Name}}== ''Syntrichia pseudorobusta'' (Dusén) {{a|R.H.Zander}}, 1993 ==={{int:Synonyms}}=== *''Tortula pseudorobusta'' Dusén (BAS) =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Zander, R. H.}} (1993). Genera of the Pottiaceae: mosses of harsh environments. ''[[Bulletin of the Buffalo Society of Natural Sciences]]'', 32, vi + 378 pp. https://www.tropicos.org/reference/9012912 ==={{int:Additional references}}=== * Crosby, M. R., Magill, R. E., Allen, B. H., & He, S. (2000). In A Checklist of the Mosses. Missouri Botanical Garden, St. Louis. https://www.tropicos.org/reference/9021789 ==={{int:Links}}=== {{Catol-Hassler|2026|October|22}} {{MBG|2026|October!22}} {{GBIF||2026|October|22}} <!-- =={{int:Vernacular names}}== {{VN |en= }} --> {{Commonscat}} {{Taxonbar|from=Q15316594}} [[Category:Richard Henry Zander taxa]] p5le6v26bbhzpwz80etv2p5olv5v1by Tortula pseudorobusta 0 2336721 11322765 2026-10-22T08:39:02Z MILEPRI 924668 Redirected page to [[Syntrichia pseudorobusta]] 11322765 wikitext text/x-wiki #REDIRECT [[Syntrichia pseudorobusta]] ly91oj1h7ztnc2jz4obh6z623gox09r Template:Kim, Gim & Hartung, 2026 10 2336722 11322766 2026-10-22T08:41:00Z Hiouf 2107144 Created page with "* {{a|Jung-Gon Kim|Kim, J.}}, {{a|Yeongguk Gim|Gim, Y.|nolink=y}} & {{a|Viktor Hartung|Hartung, V.|nolink=y}} 2026. Type-based redescription and lectotype designation of ''Phaenacantha (Phaenacantha) sedula'' (Hemiptera: Heteroptera: Colobathristidae). {{Zootaxa|2026|5890|4|511|526|4}} {{Access|closed}} <includeonly>[[Template:Kim, Gim & Hartung, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find..." 11322766 wikitext text/x-wiki * {{a|Jung-Gon Kim|Kim, J.}}, {{a|Yeongguk Gim|Gim, Y.|nolink=y}} & {{a|Viktor Hartung|Hartung, V.|nolink=y}} 2026. Type-based redescription and lectotype designation of ''Phaenacantha (Phaenacantha) sedula'' (Hemiptera: Heteroptera: Colobathristidae). {{Zootaxa|2026|5890|4|511|526|4}} {{Access|closed}} <includeonly>[[Template:Kim, Gim & Hartung, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 19 October 2026 * {{ZooBank|F74CF375-0B2B-4544-A8B7-1E2C7296CAC3}} [[Category:Reference templates]]</noinclude> kjmcbuvtcc0byjlfe465h9cp1yeek0b Draconarius yu 0 2336723 11322768 2026-10-22T08:43:03Z PeterR 7354 new species 2026 after original bulletin 11322768 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius yu]]'' =={{int:Name}}== ''Draconarius yu'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 26 Type locality: China, Chongqing Muni.: Beibei Dist., Jinyun Mountain Nature reserve, qingfengdu, 29°50'9"N, 106°23'11"e, elev. 740 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-63-01. 10.XI.2021. legit L.Y. Wang, Z. Fan, T.Y. Ren, B. Luo, B. Tan and X.W. Zhou. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 7zsbf4p83804kzlb8wxsxzoqbeziqj5 Template:Horváth, 1904a 10 2336724 11322769 2026-10-22T08:46:51Z Hiouf 2107144 Created page with "* {{a|Géza Horváth|Horváth, G.}} 1904. Monographia Colobathristinarum. [[ISSN 0521-4726|''Annales historico-naturales Musei nationalis hungarici'']] 2(1): 117–172. {{BHL|page/56376098}} <includeonly>[[Template:Horváth, 1904a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude>" 11322769 wikitext text/x-wiki * {{a|Géza Horváth|Horváth, G.}} 1904. Monographia Colobathristinarum. [[ISSN 0521-4726|''Annales historico-naturales Musei nationalis hungarici'']] 2(1): 117–172. {{BHL|page/56376098}} <includeonly>[[Template:Horváth, 1904a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> 7d4lkbwjwrej38i9pf2r0jbabkvj9jj Draconarius yunyang 0 2336725 11322771 2026-10-22T08:47:08Z PeterR 7354 new species 2026 after original bulletin 11322771 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius yunyang]]'' =={{int:Name}}== ''Draconarius yunyang'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 34 Type locality: China, Chongqing Muni.: Yunyang Co., Qingshui Township, Qishan Vill., 30°38'27"N, 108°57'44"e, elev. 1171 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-64-01. 04.XII.2021. legit Z.S. Zhang, L.Y. Wang, X.W. Zhou, B. Luo, B. Tan, T.Y. Ren, Z.J. Shi and X.N. Cao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 22qss4h0r4khx02xh6s8icz0ht419jk Draconarius zouma 0 2336726 11322773 2026-10-22T08:50:27Z PeterR 7354 new species 2026 after original bulletin 11322773 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius zouma]]'' =={{int:Name}}== ''Draconarius zouma'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 36 Type locality: China, Chongqing Muni.: Wanzhou Dist., Zouma Town, Zoumaling, 30°34'29"N, 108°26'3"e, elev. 711 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-65-01. 29.XI.2021. legit Z.S. Zhang, L.Y. Wang, X.W. Zhou, B. Luo, B. Tan, T.Y. Ren, Z.J. Shi and X.N. Cao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] tiuna0qk3f1lerjrjstcx9m860a660a 11322781 11322773 2026-10-22T08:57:36Z PeterR 7354 11322781 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius zouma]]'' =={{int:Name}}== ''Draconarius zouma'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 36 Type locality: China, Chongqing Muni.: Wanzhou Dist., Zouma Town, Zoumaling, 30°34'29"N, 108°26'3"E, elev. 711 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-65-01. 29.XI.2021. legit Z.S. Zhang, L.Y. Wang, X.W. Zhou, B. Luo, B. Tan, T.Y. Ren, Z.J. Shi and X.N. Cao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] ezmu1iwwbum5mfiuqi32xu4d0z8xnmz Template:Datta et al., 2026 10 2336727 11322775 2026-10-22T08:52:27Z Hiouf 2107144 Created page with "* {{a|Anindita Datta|Datta, A.|nolink=y}}, {{a|Shalvinder Kour|Kour, S.|nolink=y}}, {{a|Soumi Dey|Dey, S.|nolink=y}}, {{a|Janvi Bali|Bali, J.|nolink=y}}, {{a|Sandip Mandal|Mandal S.|nolink=y}}, {{a|Gulzar Hussain|Hussain, G.}}, {{a|Vikas Kumar|Kumar, V.}}, {{a|Sash Pal|Pal, S.|nolink=y}} & {{a|Kaomud Tyagi|Tyagi, K.}} 2026. The genus ''Aeolothrips'' {{aut|Haliday}} (Thysanoptera: Aeolothripidae) from India, with descriptions of two new species and a new record. {{Zootaxa..." 11322775 wikitext text/x-wiki * {{a|Anindita Datta|Datta, A.|nolink=y}}, {{a|Shalvinder Kour|Kour, S.|nolink=y}}, {{a|Soumi Dey|Dey, S.|nolink=y}}, {{a|Janvi Bali|Bali, J.|nolink=y}}, {{a|Sandip Mandal|Mandal S.|nolink=y}}, {{a|Gulzar Hussain|Hussain, G.}}, {{a|Vikas Kumar|Kumar, V.}}, {{a|Sash Pal|Pal, S.|nolink=y}} & {{a|Kaomud Tyagi|Tyagi, K.}} 2026. The genus ''Aeolothrips'' {{aut|Haliday}} (Thysanoptera: Aeolothripidae) from India, with descriptions of two new species and a new record. {{Zootaxa|2026|5890|4|493|510|3}} {{Access|closed}} <includeonly>[[Template:Datta et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 19 October 2026 * {{ZooBank|223D93CA-5346-4371-B4CD-73C328EF7159}} ==={{int:New names}} (2)=== * ''[[Aeolothrips patharsahibensis]]'' sp. nov. * ''[[Aeolothrips sambuci]]'' sp. nov. [[Category:Reference templates]]</noinclude> 991uq4n49wq2xa9rl3so52jf4lejqds 11322776 11322775 2026-10-22T08:52:40Z Hiouf 2107144 11322776 wikitext text/x-wiki * {{a|Anindita Datta|Datta, A.|nolink=y}}, {{a|Shalvinder Kour|Kour, S.|nolink=y}}, {{a|Soumi Dey|Dey, S.|nolink=y}}, {{a|Janvi Bali|Bali, J.|nolink=y}}, {{a|Sandip Mandal|Mandal S.|nolink=y}}, {{a|Gulzar Hussain|Hussain, G.|nolink=y}}, {{a|Vikas Kumar|Kumar, V.}}, {{a|Sash Pal|Pal, S.|nolink=y}} & {{a|Kaomud Tyagi|Tyagi, K.}} 2026. The genus ''Aeolothrips'' {{aut|Haliday}} (Thysanoptera: Aeolothripidae) from India, with descriptions of two new species and a new record. {{Zootaxa|2026|5890|4|493|510|3}} {{Access|closed}} <includeonly>[[Template:Datta et al., 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 19 October 2026 * {{ZooBank|223D93CA-5346-4371-B4CD-73C328EF7159}} ==={{int:New names}} (2)=== * ''[[Aeolothrips patharsahibensis]]'' sp. nov. * ''[[Aeolothrips sambuci]]'' sp. nov. [[Category:Reference templates]]</noinclude> 5op1prw75ex9i92e0plxlpz35ogig0n Draconarius cerebriformis 0 2336728 11322780 2026-10-22T08:57:09Z PeterR 7354 new species 2026 after original bulletin 11322780 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius cerebriformis]]'' =={{int:Name}}== ''Draconarius cerebriformis'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 39 Type locality: China, Chongqing Muni.: Wanzhou Dist., Wangerbao Nature reserve, 30°39'38"N, 108°43'36"E, elev. 1180 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-66-01. 25.X.2020. legit L.Y. Wang, Y. Zhang, J.S. Luo and J.X. Zhao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 7v8efdy3k8clupjjgbefzqzx2yx92ng Draconarius fengjie 0 2336729 11322782 2026-10-22T09:01:02Z PeterR 7354 new species 2026 after original bulletin 11322782 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius fengjie]]'' =={{int:Name}}== ''Draconarius fengjie'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 40 Type locality: China, Chongqing Muni.: Fengjie Co., Tiankengdifeng Scenic Spot, 30°44'53"N, 109°28'18"E, elev. 1309 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-67-01. 03.XII.2021. legit Z.S. Zhang, L.Y. Wang, X.W. Zhou, B. Luo, B. Tan, T.Y. Ren, Z.J. Shi and X.N. Cao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] o3xh8ow121p51d9z23casbijfrsj7xt Barbula ruralis 0 2336730 11322784 2026-10-22T09:04:03Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322784 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Bryum rurale 0 2336731 11322785 2026-10-22T09:04:04Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322785 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula papillinervis 0 2336732 11322786 2026-10-22T09:04:04Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322786 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula pulvinata subsp. papillinervis 0 2336733 11322787 2026-10-22T09:04:05Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322787 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula pulvinata subsp. papillinervis 0 2336734 11322788 2026-10-22T09:04:05Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322788 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula pseudoaciphylla 0 2336735 11322789 2026-10-22T09:04:06Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322789 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula pseudoaciphylla 0 2336736 11322790 2026-10-22T09:04:06Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322790 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula rufipila 0 2336737 11322791 2026-10-22T09:04:07Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322791 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula rufipila 0 2336738 11322792 2026-10-22T09:04:07Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322792 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula ruralis subsp. alaskana 0 2336739 11322793 2026-10-22T09:04:08Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322793 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis subsp. alaskana 0 2336740 11322794 2026-10-22T09:04:08Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322794 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula ruralis var. densiretis 0 2336741 11322795 2026-10-22T09:04:09Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322795 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis subvar. densiretis 0 2336742 11322796 2026-10-22T09:04:09Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322796 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis var. densiretis 0 2336743 11322797 2026-10-22T09:04:10Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322797 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. densiretis 0 2336744 11322798 2026-10-22T09:04:10Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322798 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Barbula ruralis var. elongata 0 2336745 11322799 2026-10-22T09:04:10Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322799 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia densa 0 2336746 11322800 2026-10-22T09:04:11Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322800 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula densa 0 2336747 11322801 2026-10-22T09:04:11Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322801 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. densa 0 2336748 11322802 2026-10-22T09:04:12Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322802 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia reflexa 0 2336749 11322803 2026-10-22T09:04:12Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322803 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis f. brevipila 0 2336750 11322804 2026-10-22T09:04:13Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322804 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. brevipila 0 2336751 11322805 2026-10-22T09:04:13Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322805 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis f. gracilis 0 2336752 11322806 2026-10-22T09:04:14Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322806 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis f. subrufa 0 2336753 11322807 2026-10-22T09:04:14Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322807 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis f. subrufa 0 2336754 11322808 2026-10-22T09:04:15Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322808 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis f. viridis 0 2336755 11322809 2026-10-22T09:04:15Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322809 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis f. viridis 0 2336756 11322810 2026-10-22T09:04:16Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322810 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis subvar. glacialis 0 2336757 11322811 2026-10-22T09:04:16Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322811 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis var. glacialis 0 2336758 11322812 2026-10-22T09:04:16Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322812 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Syntrichia ruralis var. pontresinae 0 2336759 11322813 2026-10-22T09:04:17Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322813 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula pontresinae 0 2336760 11322814 2026-10-22T09:04:17Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322814 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. pontresinae 0 2336761 11322815 2026-10-22T09:04:18Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322815 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralifomis 0 2336762 11322816 2026-10-22T09:04:19Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322816 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruraliformis 0 2336763 11322817 2026-10-22T09:04:20Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322817 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruraliformis var. ruraliformis 0 2336764 11322818 2026-10-22T09:04:20Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322818 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis f. fuscipila 0 2336765 11322819 2026-10-22T09:04:21Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322819 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis f. gracilis 0 2336766 11322820 2026-10-22T09:04:21Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322820 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis f. pseudoruraliformis 0 2336767 11322821 2026-10-22T09:04:21Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322821 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis f. rhizinifera 0 2336768 11322822 2026-10-22T09:04:22Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322822 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis subsp. ruralis 0 2336769 11322823 2026-10-22T09:04:22Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322823 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. fulv 0 2336770 11322824 2026-10-22T09:04:23Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322824 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. montana 0 2336771 11322825 2026-10-22T09:04:23Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322825 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Tortula ruralis var. ruralis 0 2336772 11322826 2026-10-22T09:04:24Z MILEPRI 924668 Redirected page to [[Syntrichia ruralis]] 11322826 wikitext text/x-wiki #REDIRECT [[Syntrichia ruralis]] 43p8jhxvsdempgd5iuim095aybtjnj6 Draconarius jiangjin 0 2336773 11322828 2026-10-22T09:12:19Z PeterR 7354 new species 2026 after original bulletin 11322828 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius jiangjin]]'' =={{int:Name}}== ''Draconarius jiangjin'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 40 Type locality: China, Chongqing Muni.: Jiangjin Dist., Baisha Town, Zhanggong Vill., Zhanggong Mountain, Xiannv Cave, 28°57'9"N, 106°8'57"e, elev. 771 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-68-01. 02.II.2022. legit H.L. Chen, H.P. Zhou and Z.R. Zeng. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 7fl6elywk9wos3587rot36qza74wtr4 Draconarius pengshui 0 2336774 11322829 2026-10-22T09:15:28Z PeterR 7354 new species 2026 after original bulletin 11322829 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius pengshui]]'' =={{int:Name}}== ''Draconarius pengshui'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 42 Type locality: China, Chongqing Muni.: Pengshui Miao and Tujia Autonomous Co., Anzi Town, Baifuchang, the Cave without name, 29°6'42"N, 108°24'20"E, elev. 601 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-69-01. 14.XII.2021. legit L.Y. Wang, X.W. Zhou, J.S. Luo, B. Tan and L. Xiao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] qz2e3k5v62q4cblixc1r81so7wh7lgb Draconarius shizhu 0 2336775 11322852 2026-10-22T09:29:35Z PeterR 7354 new species 2026 after original bulletin 11322852 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius shizhu]]'' =={{int:Name}}== ''Draconarius shizhu'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 43 Type locality: China, Chongqing Muni.: Shizhu Tujia Autonomous Co., Huangshui Town, Dafengbao Scenic Spot, 30°11'28"N, 108°22'32"E, elev. 1693 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-70-01. 28.XI.2021. legit Z.S. Zhang, L.Y. Wang, X.W. Zhou, B. Luo, B. Tan, T.Y. Ren, Z.J. Shi and X.N. Cao. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] qwb88ckm2pniz9m4i1vnh0r8x34hopx Draconarius wulong 0 2336776 11322857 2026-10-22T09:32:47Z PeterR 7354 new species 2026 after original bulletin 11322857 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius wulong]]'' =={{int:Name}}== ''Draconarius wulong'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 45 Type locality: China, Chongqing Muni.: Wulong Dist., Xiannvshan, Dacaoyuan, 29°30'31"N, 107°45'22"E, elev. 1837 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-71-01. 05.XI.2008. legit Z.S. Zhang. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 7khdh20x3ioo8fba4zky0jmdw6c3rpf Barbula ruralis var. virescens 0 2336777 11322859 2026-10-22T09:34:35Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322859 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula virescens 0 2336778 11322860 2026-10-22T09:34:35Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322860 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula ruralis var. virescens 0 2336779 11322861 2026-10-22T09:34:36Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322861 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula danica 0 2336780 11322862 2026-10-22T09:34:37Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322862 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula danica 0 2336781 11322863 2026-10-22T09:34:37Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322863 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula ruralis subsp. danica 0 2336782 11322864 2026-10-22T09:34:38Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322864 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula ruralis var. danica 0 2336783 11322865 2026-10-22T09:34:38Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322865 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula intermedia var. pulvinata 0 2336784 11322866 2026-10-22T09:34:39Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322866 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula pulvinata 0 2336785 11322867 2026-10-22T09:34:39Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322867 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula ruralis subsp. pulvinata 0 2336786 11322868 2026-10-22T09:34:40Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322868 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula ruralis var. pulvinata 0 2336787 11322869 2026-10-22T09:34:40Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322869 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia pulvinata 0 2336788 11322870 2026-10-22T09:34:40Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322870 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula pulvinata 0 2336789 11322871 2026-10-22T09:34:41Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322871 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula latoexcisa 0 2336790 11322872 2026-10-22T09:34:41Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322872 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula pulvinata subsp. latoexcisa 0 2336791 11322873 2026-10-22T09:34:42Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322873 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula pulvinata var. latoexcisa 0 2336792 11322874 2026-10-22T09:34:42Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322874 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula pulvinata var. latoexcisa 0 2336793 11322875 2026-10-22T09:34:43Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322875 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula rotundoemarginata 0 2336794 11322876 2026-10-22T09:34:43Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322876 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula rotundoemarginata 0 2336795 11322877 2026-10-22T09:34:44Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322877 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Barbula ruralis var. gracilis 0 2336796 11322878 2026-10-22T09:34:44Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322878 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia ruralis var. gracilis 0 2336797 11322879 2026-10-22T09:34:45Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322879 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula ruralis var. gracilis 0 2336798 11322880 2026-10-22T09:34:45Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322880 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia aciphylla var. densa 0 2336799 11322881 2026-10-22T09:34:46Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322881 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia montana var. nivalis 0 2336800 11322882 2026-10-22T09:34:46Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322882 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia pulvinata f. macrophylla 0 2336801 11322883 2026-10-22T09:34:46Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322883 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia pulvinata var. macrophylla 0 2336802 11322884 2026-10-22T09:34:47Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322884 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula pulvinata var. macrophylla 0 2336803 11322885 2026-10-22T09:34:47Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322885 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia pulvinata f. microphylla 0 2336804 11322886 2026-10-22T09:34:48Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322886 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia pulvinata var. microphylla 0 2336805 11322887 2026-10-22T09:34:48Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322887 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula pulvinata var. microphylla 0 2336806 11322888 2026-10-22T09:34:49Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322888 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia pulvinata f. versispora 0 2336807 11322889 2026-10-22T09:34:49Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322889 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula pulvinata var. versispora 0 2336808 11322890 2026-10-22T09:34:50Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322890 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia rupicola 0 2336809 11322891 2026-10-22T09:34:50Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322891 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia ruralis var. substereidosa 0 2336810 11322892 2026-10-22T09:34:50Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322892 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia substereidosa 0 2336811 11322893 2026-10-22T09:34:51Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322893 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula ruralis var. substereidosa 0 2336812 11322894 2026-10-22T09:34:51Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322894 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Syntrichia virescens var. iranica 0 2336813 11322895 2026-10-22T09:34:52Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322895 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula virescens var. iranica 0 2336814 11322896 2026-10-22T09:34:52Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322896 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula virescens subsp. virescens 0 2336815 11322897 2026-10-22T09:34:53Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322897 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Tortula virescens var. virescens 0 2336816 11322898 2026-10-22T09:34:53Z MILEPRI 924668 Redirected page to [[Syntrichia virescens]] 11322898 wikitext text/x-wiki #REDIRECT [[Syntrichia virescens]] 1n5mkd5lj0j9q6zkuguo0lgac0gd9wo Draconarius xulongi 0 2336817 11322928 2026-10-22T09:54:05Z PeterR 7354 new species 2026 after original bulletin 11322928 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius xulongi]]'' =={{int:Name}}== ''Draconarius xulongi'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 47 Type locality: China, Chongqing Muni.: Wuxi Co., Yintiaoling Nature reserve, guanshan, Modaoxi, 31°31'0"N, 109°44'33"E, elev. 1958 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-72-01. 22.IX.2022. legit X.L. Chen. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] my0c0nuuyyzi5b62qh2jbk4xdjlpza7 Category:Eponyms of Martinus Beijerinck 14 2336818 11322930 2026-10-22T09:57:58Z Thiotrix 61739 new category 11322930 wikitext text/x-wiki {{Eponyms of person|Martinus Beijerinck|Beijerinck, Martinus}} 4egdow2soai1h4kq9jcx6iwa8sidthz MediaWiki:PDF available 8 2336819 11322939 2026-10-22T10:02:23Z Tommy Kronkvist 596 Created page with "PDF available" 11322939 wikitext text/x-wiki PDF available rn0ge5cpyo9scz1rft67y2fmjyds0g1 MediaWiki:PDF available/sv 8 2336820 11322940 2026-10-22T10:02:37Z Tommy Kronkvist 596 Created page with "PDF finns tillgänglig" 11322940 wikitext text/x-wiki PDF finns tillgänglig q0g09vymhn3w1klghf73skp63u9lpn5 MediaWiki:PDF available/de 8 2336821 11322941 2026-10-22T10:03:24Z Tommy Kronkvist 596 Created page with "PDF verfügbar" 11322941 wikitext text/x-wiki PDF verfügbar mkdqwxq5t3qseyypa798fgfjawmzesd Template:Sen, 2007 10 2336822 11322942 2026-10-22T10:04:34Z Tommy Kronkvist 596 New reference template. 11322942 wikitext text/x-wiki * {{a|Nibedita Sen|Sen, N.}} 2007. Description of a new species of ''Brachydanio'' {{aut|Weber}} and {{aut|de Beaufort}}, 1916 (Pisces: Cypriniformes: Cyprinidae) from Meghalaya, north east India with a note on comparative studies of other known species. ''[[ISSN 0375-1511|Records of the Zoological Survey of India]]'' 107(4): 27–31. {{Doi|10.26515/rzsi/v107/i4/2007/159109}} ({{int:PDF available}}.) <includeonly>[[Template:Sen, 2007|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 3a9ci0lcczf9rezy61wvptopn38fsvh Draconarius youyang 0 2336823 11322943 2026-10-22T10:06:56Z PeterR 7354 new species 2026 after original bulletin 11322943 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius youyang]]'' =={{int:Name}}== ''Draconarius youyang'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 48 Type locality: China, Chongqing Muni.: Youyang Tujia and Miao Autonomous Co., Xiaoba Township, Xinqiao Village, Binglin Cave, 28°50'28"N, 108°43'8"E, elev. 901 m. Holotype: [[SWUC]]. female ♀. SWUC-T-AG-73-01. 12.XII.2021. legit L.Y. Wang, X.W. Zhou, L. Xiao, J.S. Luo and B. Tan. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] o7iuk8v82r5p2jczxpm3jnqqoubzwi4 Syntrichiadelphus 0 2336824 11322952 2026-10-22T10:19:56Z MILEPRI 924668 nuevo taxón 11322952 wikitext text/x-wiki {{image|Annales des sciences naturelles (1834-1937) (18382137906).jpg|''Syntrichiadelphus flagellaris''}} =={{int:Taxonavigation}}== {{Syntrichiadelphus}} Species: {{splast|S|yntrichiadelphus|flagellaris}} =={{int:Name}}== ''Syntrichiadelphus'' {{a|Brinda}}, {{a|Jáuregui-Lazo}} & {{a|Mishler}}, 2021 * {{Moty}} =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Brinda, J. C., Jáuregui-Lazo, J. A., Oliver, M. J., & Mishler, B. D.}} (2021). Notes on the genus Syntrichia with a revised infrageneric classification and the recognition of a new genus Syntrichiadelphus (Bryophyta, Pottiaceae). ''[[Phytologia]]'', 103(4), 90–103. https://www.tropicos.org/reference/100047883 ==={{int:Links}}=== {{Catol-Hassler|2026|October|20}} {{MBG|2026|October!20}} {{GBIF||2026|October|20}} <!-- =={{int:Vernacular names}}== {{VN |en= }} --> {{Commonscat}} {{Taxonbar|from= }} [[Category:John Carroll Brinda taxa]] [[Category:Javier Andrés Jáuregui-Lazo taxa]] [[Category:Brent D. Mishler taxa]] njy36af3qkqwacy4t1dod8xxdlco15n 11323004 11322952 2026-10-22T10:47:41Z MILEPRI 924668 11323004 wikitext text/x-wiki {{image|Annales des sciences naturelles (1834-1937) (18382137906).jpg|''Syntrichiadelphus flagellaris''}} =={{int:Taxonavigation}}== {{Syntrichiadelphus}} Species: {{splast|S|yntrichiadelphus|flagellaris}} =={{int:Name}}== ''Syntrichiadelphus'' {{a|Brinda}}, {{a|Jáuregui-Lazo}} & {{a|Mishler}}, 2021 * {{Moty}} =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Brinda, J. C., Jáuregui-Lazo, J. A., Oliver, M. J., & Mishler, B. D.}} (2021). Notes on the genus Syntrichia with a revised infrageneric classification and the recognition of a new genus Syntrichiadelphus (Bryophyta, Pottiaceae). ''[[Phytologia]]'', 103(4), 90–103. https://www.tropicos.org/reference/100047883 ==={{int:Links}}=== {{Catol-Hassler|2026|October|20}} {{MBG|2026|October!20}} {{GBIF||2026|October|20}} <!-- =={{int:Vernacular names}}== {{VN |en= }} --> {{Commonscat}} {{Taxonbar|from=Q141806804}} [[Category:John Carroll Brinda taxa]] [[Category:Javier Andrés Jáuregui-Lazo taxa]] [[Category:Brent D. Mishler taxa]] 26ucps7ciz5m9q5ls55ae9krro5jhzq Template:Syntrichiadelphus 10 2336825 11322953 2026-10-22T10:21:41Z MILEPRI 924668 nuevo taxón 11322953 wikitext text/x-wiki {{Pottiaceae}} Genus: ''[[Syntrichiadelphus]]'' <br> <noinclude>[[Category:Taxonavigation templates]]</noinclude> <includeonly>[[Category:Pages with taxonavigation templates]]</includeonly> 3syoolddzrlwf2l3b22fto3n20ismm6 Template:D.E.Stone 10 2336826 11322955 2026-10-22T10:22:26Z RLJ 134478 Created page with "{{a|Donald Eugene Stone|Stone, D.E.}}<noinclude>[[Category:Author templates|{{PAGENAME}}]]</noinclude>" 11322955 wikitext text/x-wiki {{a|Donald Eugene Stone|Stone, D.E.}}<noinclude>[[Category:Author templates|{{PAGENAME}}]]</noinclude> bf5za7xhm6y9p59zjgy0rsakb8a38se Mishler 0 2336827 11322957 2026-10-22T10:23:01Z MILEPRI 924668 Redirected page to [[Brent D. Mishler]] 11322957 wikitext text/x-wiki #REDIRECT [[Brent D. Mishler]] 492q10tu1k6e3ywy1869bqp8xua61q0 Danio jaintianensis 0 2336828 11322959 2026-10-22T10:23:41Z Tommy Kronkvist 596 New species page. 11322959 wikitext text/x-wiki {{Image}} =={{int:Taxonavigation}}== {{Danio}} Species: ''[[Danio jaintianensis]]'' =={{int:Name}}== ''Danio jaintianensis'' ({{a|Nibedita Sen|Sen}}, 2007) * {{int:Holotype}}: {{Repository link|NERC|V/A/ERS}}/1933. {{int:Paratypes}}: {{Repository link|NERC|V/A/ERS}}/1934 (15), {{Repository link|NERC|V/A/ERS}}/1935 (5). * {{int:Type locality}}: Rangriang Jowai, Jaintia Hills district, Meghalaya, 25°26'11.9"N, 92°11'08.7"E, India, elevation 1234 meters. ==={{int:Synonymy}}=== * ''Brachydanio jaintianensis'' {{aut|Sen, 2007}} =={{int:References}}== ==={{int:Primary references}}=== {{Sen, 2007}} {{Taxonbar}} [[Category:Nibedita Sen taxa]] nisl8xeuo924b05o5n68ddhb5g20qw2 Brent D. Mishler 0 2336829 11322962 2026-10-22T10:26:10Z MILEPRI 924668 nuevo taxón 11322962 wikitext text/x-wiki {{image}} '''Brent D. Mishler''' (1973–), bryologist. {{IPNI standard form|Mishler}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Authority control}} {{DEFAULTSORTMishler, Brent D.}} [[Category:Taxon authorities]] [[Category:Bryologists]] ce34uchkml9h4nnodl0xhtnf8ruu2vn 11322963 11322962 2026-10-22T10:26:27Z MILEPRI 924668 11322963 wikitext text/x-wiki {{image}} '''Brent D. Mishler''' (1973–), bryologist. {{IPNI standard form|Mishler}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Authority control}} {{DEFAULTSORT|Mishler, Brent D.}} [[Category:Taxon authorities]] [[Category:Bryologists]] oqguz1gh4zungwom18pgiodb96dmx6u 11322964 11322963 2026-10-22T10:26:56Z MILEPRI 924668 11322964 wikitext text/x-wiki {{image}} '''Brent D. Mishler''' (1973–), bryologist. {{IPNI standard form|Mishler}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Authority control}} {{DEFAULTSORT:Mishler, Brent D.}} [[Category:Taxon authorities]] [[Category:Bryologists]] td2cwgb194b6xs8w8jy77ql04zw92lf 11322988 11322964 2026-10-22T10:34:52Z MILEPRI 924668 11322988 wikitext text/x-wiki {{image}} '''Brent D. Mishler''' (fl. 1953-), bryologist. {{IPNI standard form|Mishler}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Authority control}} {{DEFAULTSORT:Mishler, Brent D.}} [[Category:Taxon authorities]] [[Category:Bryologists]] 86sr0vh5pzczyezmd7z9oyscp0tu76o Category:Brent D. Mishler taxa 14 2336830 11322968 2026-10-22T10:27:45Z MILEPRI 924668 Created page with "{{taxa bu author|Brent D. Mishler|Mishler, Brent D.}}" 11322968 wikitext text/x-wiki {{taxa bu author|Brent D. Mishler|Mishler, Brent D.}} jauuecqm3ta1dph9ntij0bvo1s9x9fn 11322970 11322968 2026-10-22T10:28:34Z MILEPRI 924668 11322970 wikitext text/x-wiki {{taxa by author|Brent D. Mishler|Mishler, Brent D.}} t2zvmfkfolhef3b6wf361fu9mrtxoei Jáuregui-Lazo 0 2336831 11322975 2026-10-22T10:30:04Z MILEPRI 924668 Redirected page to [[Javier Andrés Jáuregui-Lazo]] 11322975 wikitext text/x-wiki #REDIRECT [[Javier Andrés Jáuregui-Lazo]] ra4vgobyl6gjnwx75mc44vlstyi59yo Template:Shcherbakov, Emeljanov & Perkovsky, 2026 10 2336832 11322980 2026-10-22T10:32:30Z Hiouf 2107144 Created page with "* {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}}, {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} 2026. The oldest fossil Fulgoridae (Hemiptera, Fulgoromorpha) from the earliest Eocene of Denmark. {{Zootaxa|2026|5890|3|431|441|5}} {{Access|closed}} <includeonly>[[Template:Shcherbakov, Emeljanov & Perkovsky, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{..." 11322980 wikitext text/x-wiki * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}}, {{a|Alexander Fyodorovich Emeljanov|Emeljanov, A.F.}} & {{a|Evgeny Eduardovich Perkovsky|Perkovsky, E.E.}} 2026. The oldest fossil Fulgoridae (Hemiptera, Fulgoromorpha) from the earliest Eocene of Denmark. {{Zootaxa|2026|5890|3|431|441|5}} {{Access|closed}} <includeonly>[[Template:Shcherbakov, Emeljanov & Perkovsky, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 16 October 2026 * {{Zoobank|031C8DD5-6176-443A-9A7F-EEADED1FC528}} ==={{int:New names}} (1)=== * †''[[Wedelphus nielseni]]'' sp. nov. [[Category:Reference templates]]</noinclude> ogv713dpj3j7me5jrje7j2fj7sqmcng Javier Andrés Jáuregui-Lazo 0 2336833 11322981 2026-10-22T10:32:36Z MILEPRI 924668 nuevo taxón 11322981 wikitext text/x-wiki {{image}} '''Javier Andrés Jáuregui-Lazo''' (1985–), bryologist. {{IPNI standard form|Jáuregui-Lazo}} {{Taxa authored}} =={{int:Publications}}== {{Inc}} {{Authority control}} {{DEFAULTSORT:Jáuregui-Lazo, Javier Andrés }} [[Category:Taxon authorities]] [[Category:Bryologists]] rw7dklwf3hqd420y7u14ofgazzp1jlz Category:Javier Andrés Jáuregui-Lazo taxa 14 2336834 11322986 2026-10-22T10:33:31Z MILEPRI 924668 Created page with "{{taxa by author|Javier Andrés Jáuregui-Lazo|Jáuregui-Lazo, Javier Andrés}}" 11322986 wikitext text/x-wiki {{taxa by author|Javier Andrés Jáuregui-Lazo|Jáuregui-Lazo, Javier Andrés}} 2fhsg01mq7s8uinf0otnvjj7ggg88jg Eggysodon 0 2336835 11322990 2026-10-22T10:36:04Z ~2026-56613-63 3040979 a herbivourus 11322990 wikitext text/x-wiki eggysodon is a herbivorus eggysodont 8l7i6igj3lh4vyj4bpst215tcoydsji × Rapistrosymbrium cabanesii 0 2336836 11322991 2026-10-22T10:36:07Z Andyboorman 251907 Created page with "{{image}} =={{int:Taxonavigation}}== {{× Rapistrosymbrium}} Species: ''[[× Rapistrosymbrium cabanesii]]'' =={{int:Name}}== ''× Rapistrosymbrium cabanesii'' {{a|Madiot}}, Monde Pl. 33: 43 (1932) * {{fohy|Rapistrum rugosum|All., Fl. Pedem. 1: 257. (1785)|Sisymbrium irio|L., Sp. Pl. 2: 659 (1753)}} =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Madiot, P.}} 1932. Monde des Plantes 33: 43. ==={{int:Links}}=== {{POWO|2026|Oct|22}} {{IPNI||2026|Oct 22}}" 11322991 wikitext text/x-wiki {{image}} =={{int:Taxonavigation}}== {{× Rapistrosymbrium}} Species: ''[[× Rapistrosymbrium cabanesii]]'' =={{int:Name}}== ''× Rapistrosymbrium cabanesii'' {{a|Madiot}}, Monde Pl. 33: 43 (1932) * {{fohy|Rapistrum rugosum|All., Fl. Pedem. 1: 257. (1785)|Sisymbrium irio|L., Sp. Pl. 2: 659 (1753)}} =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Madiot, P.}} 1932. Monde des Plantes 33: 43. ==={{int:Links}}=== {{POWO|2026|Oct|22}} {{IPNI||2026|Oct 22}} pukwpb7vddw66kr9qods0yqrv3ddrxh Template:Shcherbakov, 2025b 10 2336837 11322999 2026-10-22T10:40:59Z Hiouf 2107144 Created page with "* {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2025. The Headless Hexapod—on the Identity of ''Planocephalus aselloides'' {{aut|Scudder}}, 1885 (Trichoptera, Hydropsychidae; New Placement) from the Eocene of Florissant. ''[[ISSN 0013-8738|Entomological Review]]'' 104(4): 302–304 (2024). {{Doi|10.1134/S0013873824040079}} {{Access|closed}} {{ResearchGate Publication|388563518}} {{Access|open}} <includeonly>[[Template:Shcherbakov, 2025b|{{int:Reference page}}]..." 11322999 wikitext text/x-wiki * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2025. The Headless Hexapod—on the Identity of ''Planocephalus aselloides'' {{aut|Scudder}}, 1885 (Trichoptera, Hydropsychidae; New Placement) from the Eocene of Florissant. ''[[ISSN 0013-8738|Entomological Review]]'' 104(4): 302–304 (2024). {{Doi|10.1134/S0013873824040079}} {{Access|closed}} {{ResearchGate Publication|388563518}} {{Access|open}} <includeonly>[[Template:Shcherbakov, 2025b|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 31 January 2025 [[Category:Reference templates]]</noinclude> jg4xy38t7veyjbpuj6gd34481cz693i Template:Shcherbakov, 2025c 10 2336838 11323001 2026-10-22T10:43:32Z Hiouf 2107144 Created page with "* {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2025. Ecdysozoa are descendants of Articulata. ''[[ISSN 1812-9250|Invertebrate Zoology]]'' 22(1): 168–177. {{Doi|10.15298/invertzool.22.1.11}} {{Access|open}} {{ResearchGate Publication|390108171}} {{Access|open}} <includeonly>[[Template:Shcherbakov, 2025c|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this..." 11323001 wikitext text/x-wiki * {{a|Dmitry Evgenievich Shcherbakov|Shcherbakov, D.E.}} 2025. Ecdysozoa are descendants of Articulata. ''[[ISSN 1812-9250|Invertebrate Zoology]]'' 22(1): 168–177. {{Doi|10.15298/invertzool.22.1.11}} {{Access|open}} {{ResearchGate Publication|390108171}} {{Access|open}} <includeonly>[[Template:Shcherbakov, 2025c|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. [[Category:Reference templates]]</noinclude> 3djuipij72uhy57vmsx12c0p0xprha2 Syntrichiadelphus flagellaris 0 2336839 11323003 2026-10-22T10:44:05Z MILEPRI 924668 nuevo taxón 11323003 wikitext text/x-wiki {{image|Annales des sciences naturelles (1834-1937) (18382137906).jpg}} =={{int:Taxonavigation}}== {{Syntrichiadelphus}} Species: ''[[Syntrichiadelphus flagellaris]]'' =={{int:Name}}== ''Syntrichiadelphus flagellaris'' (Schimp.) {{a|Brinda}}, {{a|Jáuregui-Lazo}} & {{a|Mishler}}, 2021 ==={{int:Synonyms}}=== *''Barbula flagellaris'' Schimp. (BAS) *''Syntrichia flagellaris'' (Schimp.) R.H. Zander *''Tortula flagellaris'' (Schimp.) Mont. *''Barbula contorta'' Hampe ex Müll. Hal. *''Tortula contorta'' (Hampe ex Müll. Hal.) Mont. *''Syntrichia flagellaris var. densiretis'' (Thér.) R.H. Zander *''Tortula flagellaris var. densiretis'' Thér. *''Syntrichia flagellaris var. flagellaris'' *''Tortula perflaccida'' Broth. ex Dusén *''Tortula ruralis var. australis'' Mont. =={{int:References}}== ==={{int:Primary references}}=== * {{aut|Brinda, J. C., Jáuregui-Lazo, J. A., Oliver, M. J., & Mishler, B. D.}} (2021). Notes on the genus Syntrichia with a revised infrageneric classification and the recognition of a new genus Syntrichiadelphus (Bryophyta, Pottiaceae). ''[[Phytologia]]'', 103(4), 90–103. https://www.tropicos.org/reference/100047883 ==={{int:Additional references}}=== * Cano, M. J., & Gallego, M. T. (2008). The genus Tortula (Pottiaceae, Bryophyta) in South America. Botanical Journal of the Linnean Society, 156, 173–220. https://www.tropicos.org/reference/9034397 ==={{int:Links}}=== {{Catol-Hassler|2026|October|20}} {{MBG|2026|October!20}} {{GBIF||2026|October|20}} <!-- =={{int:Vernacular names}}== {{VN |en= }} --> {{Commonscat}} {{Taxonbar|from=Q141806789}} [[Category:John Carroll Brinda taxa]] [[Category:Javier Andrés Jáuregui-Lazo taxa]] [[Category:Brent D. Mishler taxa]] mh6ez95ij99070mtuira62ohhjhf8ty Template:Kök, Barjadze & Stekolshchikov, 2026 10 2336840 11323005 2026-10-22T10:48:08Z Hiouf 2107144 Created page with "* {{a|Şahi̇n Kök|Kök, S.|nolink=y}}, {{a|Shalva Barjadze|Barjadze, S.}} & {{a|Andrey Valerievich Stekolshchikov|Stekolshchikov, A.V.}} 2026. Revision of the genus ''Anuromyzus'' {{aut|Shaposhnikov}}, 1959 (Hemiptera: Aphididae). {{Zootaxa|2026|5890|3|345|378|2}} {{Access|closed}} <includeonly>[[Template:Kök, Barjadze & Stekolshchikov, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wik..." 11323005 wikitext text/x-wiki * {{a|Şahi̇n Kök|Kök, S.|nolink=y}}, {{a|Shalva Barjadze|Barjadze, S.}} & {{a|Andrey Valerievich Stekolshchikov|Stekolshchikov, A.V.}} 2026. Revision of the genus ''Anuromyzus'' {{aut|Shaposhnikov}}, 1959 (Hemiptera: Aphididae). {{Zootaxa|2026|5890|3|345|378|2}} {{Access|closed}} <includeonly>[[Template:Kök, Barjadze & Stekolshchikov, 2026|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 16 October 2026 * {{ZooBank|B0CC057A-C038-479C-A074-7853D9A12575}} ==={{int:New names}} (1)=== * ''[[Anuromyzus acantholimonis]]'' sp. nov. [[Category:Reference templates]]</noinclude> 3l3nuh91zurat5gcojka003ggv0s9wf Draconarius dayuandong 0 2336841 11323041 2026-10-22T11:35:27Z PeterR 7354 new species 2026 after original bulletin 11323041 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius dayuandong]]'' =={{int:Name}}== ''Draconarius dayuandong'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 50 Type locality: China, Chongqing Muni.: Jiangjin Dist., Yongxing Town, Dayuandong Forest Park, Kongzimiao Administrative Station, 28°53'5"N, 106°15'40"E, elev. 734 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-74-01. 06.I.2023. legit Z.S. Zhang, L.Y. Wang, Z. Fan, T.Y. Ren, B.J. Wang and X.L. Chen. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] bnh1jox4z2pqd3dxjomr22e2h1irv0v Draconarius fengdui 0 2336842 11323042 2026-10-22T11:38:31Z PeterR 7354 new species 2026 after original bulletin 11323042 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius fengdui]]'' =={{int:Name}}== ''Draconarius fengdui'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 51 Type locality: China, Chongqing Muni.: Jiangjin Dist., Simian Mountain Nature reserve, Dawopu, 28°34'40"N, 106°21'3"E, elev. 1043 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-75-01. 19.I.2022. legit D. Feng =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] mgwhop2z9wdpa7dnkx5ghn5ua273vkh Template:Xia et al., 2025a 10 2336843 11323044 2026-10-22T11:41:56Z Lichenes 716444 Created page with "* {{a|Zeng-Qiang Xia|Xia, Z.-Q.}}, {{a|Ting Wang|Wang, T.}}, {{a|Hui Shang|Shang, H.}}, {{a|Zuo-Ying Wei|Wei, Z.-Y.}}, {{a|Quan Yuan|Yuan, Q.}}, {{a|Li-Yun Nie|Nie, L.-Y.}}, {{a|Ting-Zhang Li|Li, T.-Z.}}, {{a|Li Liu|Liu, L.}}, {{a|Rui Zhang (botanist)|Zhang, R.}}, {{a|Yue-Hong Yan|Yan, Y.-H.}}, {{a|Fa-Guo Wang|Wang, F.-G.}} & {{a|Hui Shen|Shen, H.}} 2025. Phylotranscriptomic analyses reveal the reticulate evolution in Dennstaedtiaceae. ISSN 1674-4918|''Journal of Syste..." 11323044 wikitext text/x-wiki * {{a|Zeng-Qiang Xia|Xia, Z.-Q.}}, {{a|Ting Wang|Wang, T.}}, {{a|Hui Shang|Shang, H.}}, {{a|Zuo-Ying Wei|Wei, Z.-Y.}}, {{a|Quan Yuan|Yuan, Q.}}, {{a|Li-Yun Nie|Nie, L.-Y.}}, {{a|Ting-Zhang Li|Li, T.-Z.}}, {{a|Li Liu|Liu, L.}}, {{a|Rui Zhang (botanist)|Zhang, R.}}, {{a|Yue-Hong Yan|Yan, Y.-H.}}, {{a|Fa-Guo Wang|Wang, F.-G.}} & {{a|Hui Shen|Shen, H.}} 2025. Phylotranscriptomic analyses reveal the reticulate evolution in Dennstaedtiaceae. [[ISSN 1674-4918|''Journal of Systematics and Evolution'']] 63(4): 835–850. {{doi|10.1111/jse.13164}} {{access|open}}. {{ResGate|389955263}} {{access|open}}. <includeonly>[[Template:Xia et al., 2025a|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]].[[Category:Reference templates]]</noinclude> n4diomr1i37achya1t9h2abeu2c50s5 Draconarius jinyun 0 2336844 11323045 2026-10-22T11:42:13Z PeterR 7354 new species 2026 after original bulletin 11323045 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius jinyun]]'' =={{int:Name}}== ''Draconarius jinyun'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 53 Type locality: China, Chongqing Muni.: Beibei Dist., Jinyun Mountain Nature reserve, 29°49'58"N, 106°23'2"E, elev. 804 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-76-01. 25.X.2021. legit L.Y. Wang and T.Y. Ren. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 50lnnjekxux1xt330rnh7yj86h7izps Draconarius xiema 0 2336845 11323046 2026-10-22T11:45:28Z PeterR 7354 new species 2026 after original bulletin 11323046 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius xiema]]'' =={{int:Name}}== ''Draconarius xiema'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 54 Type locality: China, Chongqing Muni.: Beibei Dist., Xiema Town, Hutou Village, Jinyun Mountain Nature reserve, 29°45'28"N, 106°19'29"E, elev. 442 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-77-01. 09.XI.2021. legit L.Y. Wang, T.Y. Ren, X.W. Zhou, B. Luo and B. Tan. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] 2z65yw0vamwqau9psms7iltlc6wlg3c Draconarius chengkou 0 2336846 11323049 2026-10-22T11:50:11Z PeterR 7354 new species 2026 after original bulletin 11323049 wikitext text/x-wiki {{Image|}} =={{int:Taxonavigation}}== {{Draconarius}} Species: ''[[Draconarius chengkou]]'' =={{int:Name}}== ''Draconarius chengkou'' {{a|Lu-Yu Wang|Wang}} et al., 2026: 58 Type locality: China, Chongqing Muni.: Chengkou Co., Longtian Township, Wuli Vill., 32°04'35"N, 108°39'3"E, elev. 1417 m. Holotype: [[SWUC]]. male ♂. SWUC-T-AG-79-01. 17.IX.2012. legit L.Y. Wang and X.K. Jiang. =={{int:References}}== ==={{int:Primary references}}=== {{Wang et al., 2026b1}} [[Category:SWUC]] [[Category:Lu-Yu Wang taxa]] [[Category:Muhammad Irfan taxa]] [[Category:Zi-Jian Shi taxa]] [[Category:Zhi-Sheng Zhang taxa]] dllaq35oeb93nlniczr5crp4uiao2by Template:Vences & Glaw, 2001 10 2336847 11323051 2026-10-22T11:52:28Z Burmeister 9074 Created page with "* {{a|Miguel Vences|Vences, M.}} & {{a|Frank Glaw|Glaw, F.}} 2001. When molecules claim for taxonomic changes: new proposals on the classification of Old World treefrogs (Amphibia, Anura, Ranoidea). ''[[Spixiana]]'' 24(1): 85–92.{{subst:ReftempZt}}" 11323051 wikitext text/x-wiki * {{a|Miguel Vences|Vences, M.}} & {{a|Frank Glaw|Glaw, F.}} 2001. When molecules claim for taxonomic changes: new proposals on the classification of Old World treefrogs (Amphibia, Anura, Ranoidea). ''[[Spixiana]]'' 24(1): 85–92. <includeonly>[[Template:Vences &#38; Glaw, 2001|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: * {{ZooBank|{{{1}}}}} ==={{int:New names}} ()=== * ''[[]]'' [[Category:Reference templates]]</noinclude> nt99ir0zp1toh56pbus6w7jk2tg5j9t 11323053 11323051 2026-10-22T11:54:57Z Burmeister 9074 +N.a. 11323053 wikitext text/x-wiki * {{a|Miguel Vences|Vences, M.}} & {{a|Frank Glaw|Glaw, F.}} 2001. When molecules claim for taxonomic changes: new proposals on the classification of Old World treefrogs (Amphibia, Anura, Ranoidea). ''[[ISSN 0341-8391|Spixiana]]'' 24(1): 85–92. {{BHL|page/28196391}} <includeonly>[[Template:Vences & Glaw, 2001|{{int:Reference page}}]].</includeonly>&nbsp;<noinclude> ** [[Special:WhatLinksHere/Template:{{BASEPAGENAME}}|{{int:Find all Wikispecies pages which cite this reference}}]]. =={{int:Nomenclatural acts}}== * {{int:Date of publication}}: 1 March 2001 ==={{int:New names}} (2)=== * [[Boophinae]] [p. 88] * [[Laliostominae]] [p. 88] [[Category:Reference templates]]</noinclude> 16nr8yewdj2vjxorano72mmxgqjwp42