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. 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> <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> <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> <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> <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> <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:
* 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> <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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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 .. "]] <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 (''', '\''); -- 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]] [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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 (''', '\''); -- 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.. ' [[: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]] <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(''', '\''); -- 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.. ' [[: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]] <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(''', '\''); -- 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.. ' [[: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]] <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(''', '\''); -- 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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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]] <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(''', '\''); -- 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 .. " <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 .. " <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 .. " <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.. ' [[: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 & Walsh, 2010|{{int:Reference page}}]].</includeonly> <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 & Walsh, 2010|{{int:Reference page}}]].</includeonly> <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> <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 & Tobin, 1984|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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> <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 & Sengupta, 2024|{{int:Reference page}}]].</includeonly> <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]]'' - ''[[Adinisis]]'' - ''[[Aethisis]]'' - ''[[Bathygorgia]]'' - ''[[Cladarisis]]'' - ''[[Dentatisis]]'' - ''[[Dokidisis]]'' - ''[[Eknomisis]]'' - ''[[Explorisis]]'' - ''[[Isidella]]'' - ''[[Jasonisis]]'' - ''[[Keratoisis]]'' - ''[[Lepidisis]]'' - ''[[Onkoisis]]'' - ''[[Orstomisis]]'' - ''[[Parajasonisis]]'' - ''[[Scottisis]]'' - ''[[Tanyostea]]'' - ''[[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> <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> <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> <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> <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> <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> <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> <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> <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 & Vences, 2007|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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: {{[[$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: {{[[$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: {{[[$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: {{[[$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: {{[[$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: {{[[$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: {{[[$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> <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> <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> <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> <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> <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>]] ◆
[[User talk:{{PAGENAME}}|<span style="color:#ffffff;">TALK PAGE</span>]] ◆
[[Special:Contributions/{{PAGENAME}}|<span style="color:#ffffff;">CONTRIBUTIONS</span>]] ◆
[[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 & Doti, 2026|{{int:Reference page}}]].</includeonly> <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 & Doti, 2026|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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> <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> <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 & Koch, 2025|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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> <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 & Kang, 2026|{{int:Reference page}}]].</includeonly> <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 & Kang, 2026|{{int:Reference page}}]].</includeonly> <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 & Kang, 2026|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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 & Vences, 2005|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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 & Bernor, 2011|{{int:Reference page}}]].</includeonly> <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 & Bernor, 2011|{{int:Reference page}}]].</includeonly> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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> <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 & Glaw, 2001|{{int:Reference page}}]].</includeonly> <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> <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