@ca-plant-list/ca-plant-list 0.4.9 → 0.4.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -56,6 +56,8 @@ Acanthomintha lanceolata,37516943,jpg,cc-by,Ken-ichi Ueda
56
56
  Acer campestre,304282317,jpg,cc-by-nc,Soumil
57
57
  Acer campestre,21762680,jpeg,cc-by-nc,wolf3178
58
58
  Acer campestre,10775,jpg,cc-by-nc,AnneTanne
59
+ Acer campestre,451583323,jpeg,cc-by-nc,Marek Koszorek
60
+ Acer campestre,451583345,jpeg,cc-by-nc,Marek Koszorek
59
61
  Acer macrophyllum,105744044,jpeg,cc-by-nc,Olivia Tittaferrante
60
62
  Acer macrophyllum,34737887,jpeg,cc-by-nc,Rene Burk
61
63
  Acer macrophyllum,30451227,jpeg,cc-by-nc,Barbara L. Wilson
@@ -76,6 +78,9 @@ Achyrachaena mollis,120782896,jpg,cc-by-nc,Sandy Bernhard
76
78
  Achyrachaena mollis,37638783,jpg,cc-by,Sula Vanderplank
77
79
  Achyrachaena mollis,3276295,JPG,cc-by-nc,James Bailey
78
80
  Achyrachaena mollis,36450224,jpg,cc-by,Mary K. Hanson
81
+ Acmispon americanus var. americanus,137953721,jpg,cc-by-nc,Charlie Russell
82
+ Acmispon americanus var. americanus,309771490,jpg,cc-by-nc,Dan Antonaccio
83
+ Acmispon americanus var. americanus,135171065,jpeg,cc-by-nc,Morgan Stickrod
79
84
  Acmispon brachycarpus,70511717,jpg,cc-by-nc,Gustavo Vasquez
80
85
  Acmispon brachycarpus,126604380,jpg,cc-by,Ken-ichi Ueda
81
86
  Acmispon brachycarpus,7807378,jpg,cc-by-nc,Cat Chang
@@ -213,6 +218,7 @@ Allium peninsulare var. peninsulare,1741008,JPG,cc-by-nc,James Bailey
213
218
  Allium serra,7382660,jpg,cc-by-nc,Cat Chang
214
219
  Allium serra,797131,jpg,cc-by-nc,J. Maughn
215
220
  Allium serra,1717488,jpg,cc-by-nc,Liam O'Brien
221
+ Allium sharsmithiae,64788581,jpeg,cc-by-nc,Morgan Stickrod
216
222
  Allium unifolium,38202930,jpg,cc-by-nc,bugg
217
223
  Allium unifolium,36594374,jpg,cc-by-nc,wyattherp
218
224
  Allophyllum divaricatum,848078,jpg,cc-by,Ken-ichi Ueda
@@ -371,6 +377,11 @@ Antirrhinum majus,34886142,jpeg,cc-by-nc,Marcel Hospers
371
377
  Antirrhinum thompsonii,41440,jpg,cc-by,Ken-ichi Ueda
372
378
  Antirrhinum thompsonii,41384,jpg,cc-by,marlin harms
373
379
  Antirrhinum thompsonii,75285845,jpg,cc-by-nc,jtomala
380
+ Aphanes occidentalis,272953944,jpg,cc-by-nc,madge
381
+ Aphanes occidentalis,265353003,jpg,cc-by-nc,madge
382
+ Aphanes occidentalis,178663495,jpeg,cc-by-nc,Shane Hanofee
383
+ Aphanes occidentalis,275727400,jpeg,cc-by-nc,Peter Zika
384
+ Aphanes occidentalis,178663476,jpeg,cc-by-nc,Shane Hanofee
374
385
  Aphyllon californicum subsp. jepsonii,2274004,jpg,cc-by,Calibas
375
386
  Aphyllon epigalium subsp. epigalium,15224,jpg,cc-by,Ken-ichi Ueda
376
387
  Aphyllon epigalium subsp. epigalium,15225,jpg,cc-by,Ken-ichi Ueda
@@ -717,7 +728,11 @@ Bidens laevis,73368057,jpg,cc-by-nc,A Clarke
717
728
  Bidens laevis,2587585,jpg,cc-by,Michael D Fox
718
729
  Bidens laevis,512698,jpg,cc-by-nc,Matthew Herron
719
730
  Blepharizonia laxa,10507539,jpeg,cc-by,Ken-ichi Ueda
731
+ Blepharizonia laxa,94791085,jpeg,cc0,Alex Heyman
732
+ Blepharizonia laxa,98116007,jpg,cc-by-nc,Chloe Novak
733
+ Blepharizonia laxa,10515436,jpg,cc-by,Ken-ichi Ueda
720
734
  Blepharizonia plumosa,89389742,jpg,cc-by-nc,Chloe Novak
735
+ Blepharizonia plumosa,89389624,jpg,cc-by-nc,Chloe Novak
721
736
  Boechera breweri subsp. breweri,854971,jpg,cc-by-nc,Robert
722
737
  Bolboschoenus fluviatilis,5421230,jpg,cc-by-nc,sarahaj
723
738
  Bolboschoenus maritimus subsp. paludosus,132800260,jpeg,cc-by-nc,Peter Zika
@@ -904,6 +919,7 @@ Calochortus umbellatus,3061,jpg,cc-by,Ken-ichi Ueda
904
919
  Calochortus umbellatus,26898,jpg,cc-by,Tom Hilton
905
920
  Calochortus umbellatus,26897,jpg,cc-by,Tom Hilton
906
921
  Calochortus umbellatus,270671042,jpeg,cc-by-nc,Valentina L.
922
+ Calochortus umbellatus,392254006,jpeg,cc-by-nc,Sue Lindner
907
923
  Calochortus venustus,129369125,jpeg,cc-by-nc,Denise Wight
908
924
  Calochortus venustus,91765,jpg,cc-by,Zack Abbey
909
925
  Calochortus venustus,206217015,jpg,cc-by-nc,Dan Fitzgerald (Fitz)
@@ -1473,6 +1489,8 @@ Corethrogyne filaginifolia,23537046,jpeg,cc-by-nc,Asa Spade
1473
1489
  Corethrogyne filaginifolia,56579,jpg,cc-by,Jerry Kirkhart
1474
1490
  Cornus glabrata,38925157,jpeg,cc-by-nc,Rob Irwin
1475
1491
  Cornus glabrata,38925165,jpeg,cc-by-nc,Rob Irwin
1492
+ Cornus glabrata,74189069,jpg,cc-by-nc,Tim Messick
1493
+ Cornus glabrata,70648152,jpg,cc-by-nc,Rob Irwin
1476
1494
  Cornus sericea subsp. occidentalis,89793568,jpeg,cc-by-nc,Greg Froelich
1477
1495
  Cornus sericea subsp. occidentalis,89793590,jpeg,cc-by-nc,Greg Froelich
1478
1496
  Cornus sericea subsp. sericea,89010941,jpeg,cc-by-nc,Morgan Stickrod
@@ -1986,7 +2004,6 @@ Elodea canadensis,14784467,jpeg,cc-by-nc,Sean Blaney
1986
2004
  Elodea canadensis,5316445,jpg,cc-by,Radio Tonreg
1987
2005
  Elodea canadensis,45053113,jpg,cc-by,Justin
1988
2006
  Elodea canadensis,57234967,jpeg,cc-by-nc,eugenezakharov
1989
- Elymus ×gouldii,128311999,jpg,cc-by-nc,jrebman
1990
2007
  Elymus caput-medusae,24101478,jpeg,cc-by-nc,Rob Irwin
1991
2008
  Elymus caput-medusae,13162675,jpg,cc-by-nc,Jennifer Rycenga
1992
2009
  Elymus glaucus subsp. virescens,3807104,JPG,cc-by-nc,emwest
@@ -2002,6 +2019,7 @@ Elymus ponticus,4122272,jpg,cc-by-nc,Kathleen Sayce
2002
2019
  Elymus ponticus,106811004,jpg,cc-by,Jared Shorma
2003
2020
  Elymus ponticus,83692446,jpg,cc-by-nc,Ulysses M
2004
2021
  Elymus ponticus,83253203,jpeg,cc-by-nc,Phyllis Holst
2022
+ Elymus stebbinsii,449433127,jpeg,cc-by-nc,Matt Reala
2005
2023
  Elymus trachycaulus subsp. trachycaulus,146511572,jpg,cc-by-nc,TeMarChi
2006
2024
  Elymus trachycaulus subsp. trachycaulus,114083182,jpeg,cc-by-nc,John Koenig
2007
2025
  Elymus trachycaulus subsp. trachycaulus,163912630,jpg,cc-by,Eric Lamb
@@ -2009,6 +2027,7 @@ Elymus triticoides,389174390,jpg,cc-by-nc,Paul Barnett
2009
2027
  Elymus triticoides,13913918,jpg,cc-by,Jim Morefield
2010
2028
  Elymus triticoides,26984620,jpg,cc-by-nc,2008 Zoya Akulova
2011
2029
  Elymus triticoides,26984619,jpg,cc-by-nc,2010 Zoya Akulova
2030
+ Elymus ×gouldii,128311999,jpg,cc-by-nc,jrebman
2012
2031
  Emmenanthe penduliflora,34464275,jpg,cc-by-nc,Timothy Eric Robinson
2013
2032
  Emmenanthe penduliflora,263226896,jpg,cc-by-nc,nathantay
2014
2033
  Emmenanthe penduliflora,263226911,jpg,cc-by-nc,nathantay
@@ -2031,6 +2050,8 @@ Epilobium brachycarpum,23989929,jpg,cc-by-nc,Cat Chang
2031
2050
  Epilobium brachycarpum,4239069,jpg,cc-by,Andrey Zharkikh
2032
2051
  Epilobium brachycarpum,4239070,jpg,cc-by,Andrey Zharkikh
2033
2052
  Epilobium campestre,7627757,jpeg,cc-by-nc,James Bailey
2053
+ Epilobium campestre,79205774,jpg,cc-by-nc,Christian Schwarz
2054
+ Epilobium campestre,80750322,jpeg,cc-by-nc,frankiecoburn
2034
2055
  Epilobium canum subsp. canum,43958421,jpeg,cc-by-nc,Ron Vanderhoff
2035
2056
  Epilobium canum subsp. canum,158630917,jpeg,cc-by-nc,mhrains
2036
2057
  Epilobium canum subsp. canum,80364468,jpeg,cc-by,Millie Basden
@@ -2091,8 +2112,14 @@ Eragrostis hypnoides,164046029,jpg,cc-by-nc,Pat Deacon
2091
2112
  Eragrostis hypnoides,164045951,jpg,cc-by-nc,Pat Deacon
2092
2113
  Eragrostis mexicana subsp. virescens,4248627,jpg,cc-by-nc,Steve Jones
2093
2114
  Eragrostis mexicana subsp. virescens,4248602,jpg,cc-by-nc,Steve Jones
2115
+ Eragrostis mexicana subsp. virescens,421992570,jpeg,cc-by-nc,Věra Kafková
2116
+ Eragrostis mexicana subsp. virescens,421992786,jpeg,cc-by-nc,Věra Kafková
2094
2117
  Eragrostis pectinacea var. pectinacea,10331618,jpg,cc-by-nc,Pat Deacon
2095
2118
  Eremalche exilis,6527589,jpg,cc-by,W. Terry Hunefeld
2119
+ Eremalche exilis,350833945,jpg,cc-by-nc,nathantay
2120
+ Eremalche exilis,362953560,jpeg,cc-by-nc,Rachel Woodard
2121
+ Eremalche exilis,360231454,jpg,cc-by-nc,D Roy
2122
+ Eremalche exilis,358557932,jpg,cc-by-nc,James Bardo
2096
2123
  Eriastrum abramsii,1979365,JPG,cc-by-nc,kevinhintsa
2097
2124
  Eriastrum abramsii,859835,jpg,cc0,
2098
2125
  Eriastrum abramsii,859836,jpg,cc0,
@@ -2436,6 +2463,7 @@ Extriplex joaquinana,189169450,jpg,cc-by-nc,Dylan Winkler
2436
2463
  Extriplex joaquinana,122136102,jpg,cc-by,Chloe and Trevor Van Loon
2437
2464
  Extriplex joaquinana,189169955,jpg,cc-by-nc,Dylan Winkler
2438
2465
  Fallopia japonica,158604528,jpg,cc-by-nc,Lara Maynard
2466
+ Fallopia japonica,160080625,jpg,cc-by-nc,空猫 T. N
2439
2467
  Festuca arundinacea,29121494,jpeg,cc-by-nc,James Bailey
2440
2468
  Festuca arundinacea,308793068,jpeg,cc-by-nc,Věra Kafková
2441
2469
  Festuca arundinacea,106530308,jpg,cc-by-nc,Alexey P. Seregin
@@ -2718,6 +2746,8 @@ Hedypnois rhagadioloides,122232888,jpg,cc-by-nc,Богданович Светл
2718
2746
  Hedypnois rhagadioloides,34900325,jpg,cc-by-nc,Sarah
2719
2747
  Hedypnois rhagadioloides,3210726,JPG,cc-by-nc,James Bailey
2720
2748
  Helenium bigelovii,47216819,jpg,cc-by-nc,Aaron Echols
2749
+ Helenium bigelovii,316292622,jpeg,cc-by-nc,Howard W Erbe
2750
+ Helenium bigelovii,141300006,jpeg,cc-by-nc,Ethan
2721
2751
  Helenium puberulum,404884351,jpg,cc-by-nc,nathantay
2722
2752
  Helenium puberulum,404884500,jpg,cc-by-nc,nathantay
2723
2753
  Helenium puberulum,4037319,JPG,cc-by-nc,Chris Evers
@@ -3144,6 +3174,7 @@ Lathyrus jepsonii var. californicus,70821184,jpg,cc-by-nc,Rob Irwin
3144
3174
  Lathyrus latifolius,41528872,jpg,cc-by-nc,Andreas Rockstein
3145
3175
  Lathyrus latifolius,43406461,jpeg,cc-by-nc,mobbini
3146
3176
  Lathyrus latifolius,98792094,jpg,cc-by-nc,esdena
3177
+ Lathyrus latifolius,290743350,jpeg,cc-by,Gavin Slater
3147
3178
  Lathyrus vestitus var. vestitus,20085,jpg,cc-by,Tom Hilton
3148
3179
  Lathyrus vestitus var. vestitus,62792953,jpeg,cc-by-nc,shrike2
3149
3180
  Lathyrus vestitus var. vestitus,18307531,jpg,cc-by-nc,shrike2
@@ -3664,9 +3695,6 @@ Melilotus indicus,66820236,jpg,cc-by-nc,Alan King
3664
3695
  Melissa officinalis,82807082,jpg,cc-by-nc,Steve Kelley
3665
3696
  Melissa officinalis,115806500,jpeg,cc-by,Eleftherios Katsillis
3666
3697
  Melissa officinalis,122530581,jpeg,cc-by-nc,nico2007
3667
- Mentha ×gracilis,31529239,jpg,cc-by-nc,Aleksandr Ebel
3668
- Mentha ×piperita,4677970,jpeg,cc-by-nc,Chevaun
3669
- Mentha ×piperita,947761,jpg,cc-by-nc,Hidetsugu Tonomura
3670
3698
  Mentha aquatica,437878448,jpg,cc-by-nc,mobbini
3671
3699
  Mentha aquatica,315881232,jpg,cc-by-nc,Иван Матершев
3672
3700
  Mentha aquatica,58267279,jpg,cc-by-nc,A Emmerson
@@ -3692,6 +3720,9 @@ Mentha spicata,85965702,jpg,cc0,
3692
3720
  Mentha spicata,1186003,jpg,cc-by,Jon Sullivan
3693
3721
  Mentha spicata,47507014,jpg,cc-by-nc,Chloe and Trevor Van Loon
3694
3722
  Mentha suaveolens,28457953,jpeg,cc-by,Duarte Frade
3723
+ Mentha ×gracilis,31529239,jpg,cc-by-nc,Aleksandr Ebel
3724
+ Mentha ×piperita,4677970,jpeg,cc-by-nc,Chevaun
3725
+ Mentha ×piperita,947761,jpg,cc-by-nc,Hidetsugu Tonomura
3695
3726
  Mentzelia laevicaulis var. laevicaulis,12966945,jpg,cc-by-nc,mhays
3696
3727
  Mentzelia lindleyi,1024864,jpg,cc-by-nc,Amelia Ryan
3697
3728
  Mentzelia lindleyi,119069149,jpg,cc-by,Dee Shea Himes
@@ -3885,6 +3916,11 @@ Navarretia squarrosa,79748116,jpg,cc-by-nc,Alan Siegel
3885
3916
  Navarretia viscidula,944084,jpg,cc0,
3886
3917
  Navarretia viscidula,41343887,jpg,cc-by-nc,Neil O. Frakes
3887
3918
  Navarretia viscidula,944083,jpg,cc0,
3919
+ Nemacladus capillaris,79260550,jpg,cc-by-nc,Damon Tighe
3920
+ Nemacladus capillaris,79260558,jpg,cc-by-nc,Damon Tighe
3921
+ Nemacladus capillaris,79260568,jpg,cc-by-nc,Damon Tighe
3922
+ Nemacladus capillaris,1026228,jpg,cc-by-nc,2013 Scot Loring
3923
+ Nemacladus capillaris,1026229,jpg,cc-by-nc,2013 Scot Loring
3888
3924
  Nemophila heterophylla,6852120,jpg,cc-by-nc,Michael A. Voeltz
3889
3925
  Nemophila heterophylla,14110056,jpeg,cc-by-nc,Rob Irwin
3890
3926
  Nemophila heterophylla,105517,jpg,cc-by,dloarie
@@ -3907,6 +3943,8 @@ Nicotiana acuminata var. multiflora,328298852,jpg,cc-by-nc,Dan Antonaccio
3907
3943
  Nicotiana attenuata,21912630,jpg,cc-by-nc,Cat Chang
3908
3944
  Nicotiana attenuata,21937008,jpg,cc-by-nc,Liam O'Brien
3909
3945
  Nicotiana attenuata,21912646,jpg,cc-by-nc,Cat Chang
3946
+ Nicotiana attenuata,163826554,jpg,cc-by,Steve Matson
3947
+ Nicotiana attenuata,163826744,jpg,cc-by,Steve Matson
3910
3948
  Nicotiana glauca,26703,jpg,cc-by,Scott Zona
3911
3949
  Nicotiana glauca,343854850,jpg,cc-by,Connor Margetts
3912
3950
  Nicotiana glauca,343854730,jpg,cc-by,Connor Margetts
@@ -4467,9 +4505,16 @@ Polypogon viridis,11486827,jpeg,cc-by-nc,Tim Quinn
4467
4505
  Polypogon viridis,129503350,jpeg,cc-by-nc,Ron Vanderhoff
4468
4506
  Polypogon viridis,55763555,jpeg,cc-by-nc,lern
4469
4507
  Polypogon viridis,71977150,jpeg,cc-by,Daniel Cahen
4508
+ Polystichum californicum,425119886,jpg,cc-by,Timothy McNitt
4509
+ Polystichum californicum,183073570,jpeg,cc-by-nc,Steve Ansell
4510
+ Polystichum californicum,449265176,jpeg,cc-by-nc,ehappy
4470
4511
  Polystichum imbricans subsp. imbricans,882385,jpg,cc-by,benet2006
4471
4512
  Polystichum imbricans subsp. imbricans,9885744,jpg,cc-by-nc,Todd Ramsden
4472
4513
  Polystichum munitum,879724,jpg,cc-by-nc,kqedquest
4514
+ Polystichum munitum,412744739,jpeg,cc-by-nc,mme_renn
4515
+ Polystichum munitum,382846807,jpg,cc-by-nc,myosoto
4516
+ Polystichum munitum,338428197,jpg,cc-by-nc,tuesdaytumbleweed
4517
+ Polystichum munitum,219027536,jpeg,cc0,Quentin Groom
4473
4518
  Populus trichocarpa,440702,png,cc-by-nc,Thayne Tuason
4474
4519
  Populus trichocarpa,177932421,jpg,cc-by-nc,myrrhtle
4475
4520
  Populus trichocarpa,8057333,jpg,cc-by-nc,Ashley Connors
@@ -4694,6 +4739,7 @@ Quercus douglasii,244111877,jpeg,cc-by-nc,kevinhintsa
4694
4739
  Quercus douglasii,188209585,jpeg,cc-by-nc,Mart Hughes
4695
4740
  Quercus douglasii,3195952,jpeg,cc-by-nc,Alex Jones
4696
4741
  Quercus douglasii,1701488,jpg,cc-by,Ken-ichi Ueda
4742
+ Quercus douglasii,398060264,jpeg,cc-by-nc,Marisol Villarreal
4697
4743
  Quercus durata var. durata,6441485,jpg,cc-by-nc,Ken-ichi Ueda
4698
4744
  Quercus durata var. durata,22846295,jpg,cc-by-nc,Ken-ichi Ueda
4699
4745
  Quercus durata var. durata,2378132,jpg,cc0,rockybajada
@@ -4806,6 +4852,7 @@ Rhinotropis californica,121640,jpg,cc-by,Don Loarie
4806
4852
  Rhus aromatica,3578615,jpg,cc-by-nc,Chuck Sexton
4807
4853
  Rhus aromatica,168104108,jpeg,cc-by-nc,Jesús Niño C.
4808
4854
  Rhus aromatica,14541423,jpg,cc-by,Matt Berger
4855
+ Rhus aromatica,310253516,jpg,cc-by,Catherine C. Galley
4809
4856
  Ribes amarum,79956311,jpg,cc-by-nc,Stephanie Calloway
4810
4857
  Ribes amarum,250145643,jpg,cc-by-nc,bradleytsalyuk
4811
4858
  Ribes californicum var. californicum,10908,jpg,cc-by,Ken-ichi Ueda
@@ -4944,12 +4991,19 @@ Ruppia maritima,41269117,jpeg,cc-by-nc,James Coquat
4944
4991
  Ruppia maritima,9025147,png,cc-by-nc,jiayizhou-zoe
4945
4992
  Rytidosperma caespitosum,415436,jpg,cc-by,Harry Rose
4946
4993
  Rytidosperma caespitosum,415437,jpg,cc-by,Harry Rose
4994
+ Rytidosperma caespitosum,95674316,jpg,cc-by,Kym Nicolson
4995
+ Rytidosperma caespitosum,95674356,jpg,cc-by,Kym Nicolson
4996
+ Rytidosperma caespitosum,163217365,jpg,cc-by,Ben Fisher
4947
4997
  Rytidosperma penicillatum,322700849,jpeg,cc-by,Kevin Faccenda
4948
4998
  Rytidosperma penicillatum,322700890,jpeg,cc-by,Kevin Faccenda
4949
4999
  Rytidosperma penicillatum,322700790,jpeg,cc-by,Kevin Faccenda
4950
5000
  Rytidosperma penicillatum,322700724,jpeg,cc-by,Kevin Faccenda
4951
5001
  Rytidosperma penicillatum,4439174,jpg,cc-by-nc,Raphaela E. Floreani Buzbee
4952
5002
  Rytidosperma racemosum,68345797,jpg,cc-by-nc,Margaret Alcorn
5003
+ Rytidosperma racemosum,17831219,jpg,cc-by-nc,reinderw
5004
+ Rytidosperma racemosum,108375616,jpg,cc-by-nc,reinderw
5005
+ Rytidosperma racemosum,339325287,jpeg,cc-by-nc,Kurtis
5006
+ Rytidosperma racemosum,360394861,jpg,cc-by,Petra Holland
4953
5007
  Sabulina douglasii,14107428,jpg,cc-by-nc,mhays
4954
5008
  Sabulina douglasii,1737562,jpg,cc-by,Ken-ichi Ueda
4955
5009
  Sabulina douglasii,1561728,JPG,cc-by-nc,kevinhintsa
@@ -4973,6 +5027,10 @@ Sagittaria latifolia,89848802,jpg,cc-by-nc,Susan Elliott
4973
5027
  Sagittaria latifolia,92971300,jpg,cc-by-nc,roy pilcher
4974
5028
  Sagittaria latifolia,10083800,jpg,cc-by-nc,Ian Bryson
4975
5029
  Sagittaria latifolia,4391482,jpg,cc-by-nc,Liana May
5030
+ Sagittaria montevidensis subsp. calycina,23908573,jpeg,cc-by-nc,Nathan Taylor
5031
+ Sagittaria montevidensis subsp. calycina,23776957,jpeg,cc-by-nc,Joseph D Kurtz
5032
+ Sagittaria montevidensis subsp. calycina,53648830,jpeg,cc-by-nc,jim_keesling
5033
+ Sagittaria montevidensis subsp. calycina,225270837,jpeg,cc-by-nc,pine-wood
4976
5034
  Salicornia depressa,23010186,jpg,cc-by-nc,Norman Welsh
4977
5035
  Salicornia depressa,135973750,jpg,cc-by-nc,Chase Mathey
4978
5036
  Salicornia pacifica,161785604,jpg,cc-by-nc,Dani Montijo
@@ -5467,6 +5525,10 @@ Stellaria pallida,66236079,jpeg,cc-by-nc,Václav Dvořák
5467
5525
  Stellaria pallida,173854425,jpg,cc-by-nc,Valerio Lazzeri
5468
5526
  Stenotaphrum secundatum,66591991,jpeg,cc-by-nc,mattward
5469
5527
  Stenotaphrum secundatum,126466342,jpg,cc-by-nc,Jamee Moulton
5528
+ Stephanomeria elata,4287353,jpeg,cc-by,Don Loarie
5529
+ Stephanomeria elata,421569534,jpeg,cc-by-nc,Fred Watson
5530
+ Stephanomeria elata,421706175,jpeg,cc-by-nc,Fred Watson
5531
+ Stephanomeria elata,141166677,jpg,cc0,Irene
5470
5532
  Stephanomeria exigua subsp. coronaria,18547528,jpg,cc-by,Jim Morefield
5471
5533
  Stephanomeria exigua subsp. coronaria,14048144,jpg,cc-by,Jim Morefield
5472
5534
  Stephanomeria virgata subsp. pleurocarpa,17618,jpg,cc-by,Ken-ichi Ueda
@@ -5640,6 +5702,8 @@ Toxicoscordion paniculatum,18853230,jpg,cc-by-nc,Frank Fogarty
5640
5702
  Toxicoscordion paniculatum,39029901,jpg,cc-by-nc,Rick Williams
5641
5703
  Toxicoscordion paniculatum,4181166,jpg,cc-by-nc,2008 Gary A. Monroe
5642
5704
  Toxicoscordion paniculatum,39489863,jpg,cc-by,Andrey Zharkikh
5705
+ Toxicoscordion venenosum var. venenosum,286053222,jpg,cc-by-nc,Eric Koberle
5706
+ Toxicoscordion venenosum var. venenosum,76985646,jpg,cc-by-nc,emily_jeanne
5643
5707
  Tradescantia fluminensis,247170901,jpeg,cc-by-nc,Johnson Chen
5644
5708
  Tradescantia fluminensis,96861636,jpeg,cc-by-nc,Lucía Rodríguez-Tricot
5645
5709
  Tradescantia fluminensis,46110772,jpeg,cc-by-nc,金翼白眉
package/lib/csv.js CHANGED
@@ -3,6 +3,7 @@ import path from "node:path";
3
3
  import { finished } from "stream/promises";
4
4
  import { parse as parseSync } from "csv-parse/sync";
5
5
  import { parse } from "csv-parse";
6
+ import { stringify } from "csv-stringify/sync";
6
7
 
7
8
  class CSV {
8
9
  /**
@@ -57,12 +58,10 @@ class CSV {
57
58
  * @param {string} fileName
58
59
  * @param {boolean|import("csv-parse").ColumnOption[]|function (string[]):string[]} [columns]
59
60
  * @param {string} [delimiter]
61
+ * @deprecated use readFile
60
62
  */
61
63
  static parseFile(dir, fileName, columns = true, delimiter) {
62
- const content = fs.readFileSync(dir + "/" + fileName);
63
-
64
- const options = this.#getOptions(fileName, columns, delimiter);
65
- return parseSync(content, options);
64
+ return this.readFile(dir + "/" + fileName, columns, delimiter);
66
65
  }
67
66
 
68
67
  /**
@@ -77,7 +76,7 @@ class CSV {
77
76
  fileName,
78
77
  columns = true,
79
78
  delimiter,
80
- callback
79
+ callback,
81
80
  ) {
82
81
  const options = this.#getOptions(fileName, columns, delimiter);
83
82
  const processFile = async () => {
@@ -98,6 +97,29 @@ class CSV {
98
97
  // Parse the CSV content
99
98
  await processFile();
100
99
  }
100
+
101
+ /**
102
+ * @param {string} fileName
103
+ * @param {boolean|import("csv-parse").ColumnOption[]|function (string[]):string[]} [columns]
104
+ * @param {string} [delimiter]
105
+ */
106
+ static readFile(fileName, columns = true, delimiter) {
107
+ const content = fs.readFileSync(fileName);
108
+ const options = this.#getOptions(fileName, columns, delimiter);
109
+ return parseSync(content, options);
110
+ }
111
+
112
+ /**
113
+ *
114
+ * @param {string} fileName
115
+ * @param {string[][]} data
116
+ * @param {string[]} [headerData]
117
+ */
118
+ static writeFile(fileName, data, headerData) {
119
+ const header = headerData ? stringify([headerData]) : "";
120
+ const content = header + stringify(data);
121
+ fs.writeFileSync(fileName, content);
122
+ }
101
123
  }
102
124
 
103
125
  export { CSV };
package/lib/taxa.js CHANGED
@@ -48,7 +48,7 @@ class Taxa {
48
48
  taxonFactory = (td, g) => new Taxon(td, g),
49
49
  extraTaxa = [],
50
50
  extraSynonyms = [],
51
- includePhotos = true
51
+ includePhotos = true,
52
52
  ) {
53
53
  this.#isSubset = inclusionList !== true;
54
54
 
@@ -68,7 +68,7 @@ class Taxa {
68
68
  extraTaxa,
69
69
  inclusionList,
70
70
  taxonFactory,
71
- showFlowerErrors
71
+ showFlowerErrors,
72
72
  );
73
73
 
74
74
  // Make sure everything in the inclusionList has been loaded.
@@ -79,12 +79,11 @@ class Taxa {
79
79
  }
80
80
 
81
81
  this.#sortedTaxa = Object.values(this.#taxa).sort((a, b) =>
82
- a.getName().localeCompare(b.getName())
82
+ a.getName().localeCompare(b.getName()),
83
83
  );
84
84
 
85
-
86
- if ( includePhotos ) {
87
- this.#loadInatPhotos( dataDir );
85
+ if (includePhotos) {
86
+ this.#loadInatPhotos(dataDir);
88
87
  }
89
88
 
90
89
  const synCSV = CSV.parseFile(dataDir, "synonyms.csv");
@@ -95,22 +94,24 @@ class Taxa {
95
94
  /**
96
95
  * @param {string} dataDir
97
96
  */
98
- #loadInatPhotos( dataDir ) {
97
+ #loadInatPhotos(dataDir) {
99
98
  const photosFileName = "inattaxonphotos.csv";
100
- if ( fs.existsSync( path.join( dataDir, photosFileName ) ) ) {
99
+ if (fs.existsSync(path.join(dataDir, photosFileName))) {
101
100
  /** @type {InatCsvPhoto[]} */
102
- const csvPhotos = CSV.parseFile( dataDir, photosFileName );
103
- for ( const csvPhoto of csvPhotos ) {
101
+ const csvPhotos = CSV.parseFile(dataDir, photosFileName);
102
+ for (const csvPhoto of csvPhotos) {
104
103
  const taxon = this.getTaxon(csvPhoto.name);
105
- if(!taxon) {
104
+ if (!taxon) {
106
105
  continue;
107
106
  }
108
- taxon.addPhoto(new InatPhoto(
109
- csvPhoto.id,
110
- csvPhoto.ext,
111
- csvPhoto.licenseCode,
112
- csvPhoto.attrName
113
- ) );
107
+ taxon.addPhoto(
108
+ new InatPhoto(
109
+ csvPhoto.id,
110
+ csvPhoto.ext,
111
+ csvPhoto.licenseCode,
112
+ csvPhoto.attrName,
113
+ ),
114
+ );
114
115
  }
115
116
  }
116
117
  }
@@ -121,7 +122,7 @@ class Taxa {
121
122
 
122
123
  getFlowerColors() {
123
124
  return Object.values(this.#flower_colors).filter(
124
- (fc) => fc.getTaxa().length > 0
125
+ (fc) => fc.getTaxa().length > 0,
125
126
  );
126
127
  }
127
128
 
@@ -209,10 +210,10 @@ class Taxa {
209
210
  const color = this.#flower_colors[colorName];
210
211
  if (!color) {
211
212
  throw new Error(
212
- "flower color \"" +
213
+ 'flower color "' +
213
214
  colorName +
214
- "\" not found for " +
215
- name
215
+ '" not found for ' +
216
+ name,
216
217
  );
217
218
  }
218
219
  color.addTaxon(taxon);
@@ -229,7 +230,7 @@ class Taxa {
229
230
  ) {
230
231
  this.#errorLog.log(
231
232
  name,
232
- "does not have all flower info"
233
+ "does not have all flower info",
233
234
  );
234
235
  }
235
236
  } else {
package/lib/util.js CHANGED
@@ -3,8 +3,9 @@
3
3
  * https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore?tab=readme-ov-file#_chunk
4
4
  * @param {any[]} input
5
5
  * @param {number} size
6
+ * @returns {any[][]}
6
7
  */
7
- export function chunk( input, size ) {
8
+ export function chunk(input, size) {
8
9
  return input.reduce((arr, item, idx) => {
9
10
  return idx % size === 0
10
11
  ? [...arr, [item]]
@@ -15,6 +16,6 @@ export function chunk( input, size ) {
15
16
  /**
16
17
  * @param {number} time
17
18
  */
18
- export async function sleep( time ) {
19
- return new Promise( resolve => setTimeout( resolve, time ) );
19
+ export async function sleep(time) {
20
+ return new Promise((resolve) => setTimeout(resolve, time));
20
21
  }
@@ -0,0 +1,90 @@
1
+ import { ProgressMeter } from "../progressmeter.js";
2
+ import { chunk, sleep } from "../util.js";
3
+
4
+ const ALLOWED_LICENSE_CODES = ["cc0", "cc-by", "cc-by-nc"];
5
+
6
+ /**
7
+ * @param {Taxon[]} taxa
8
+ * @return {Promise<InatApiTaxon[]>}
9
+ */
10
+ async function fetchInatTaxa(taxa) {
11
+ const inatTaxonIDs = taxa.map((taxon) => taxon.getINatID()).filter(Boolean);
12
+ const url = `https://api.inaturalist.org/v2/taxa/${inatTaxonIDs.join(",")}?fields=(taxon_photos:(photo:(medium_url:!t,attribution:!t,license_code:!t)))`;
13
+ const resp = await fetch(url);
14
+ if (!resp.ok) {
15
+ const error = await resp.text();
16
+ throw new Error(`Failed to fetch taxa from iNat: ${error}`);
17
+ }
18
+ const json = await resp.json();
19
+ return json.results;
20
+ }
21
+
22
+ /**
23
+ * @param {Taxon[]} taxaToUpdate
24
+ * @returns {Promise<Map<string,InatPhotoInfo[]>>}
25
+ */
26
+ export async function getTaxonPhotos(taxaToUpdate) {
27
+ /** @type {Map<string,string>} */
28
+ const idMap = new Map();
29
+
30
+ for (const taxon of taxaToUpdate) {
31
+ if (taxon.getINatID()) {
32
+ idMap.set(taxon.getINatID(), taxon.getName());
33
+ }
34
+ }
35
+
36
+ /** @type {Map<string,InatPhotoInfo[]>} */
37
+ const photos = new Map();
38
+
39
+ const meter = new ProgressMeter("retrieving taxa", taxaToUpdate.length);
40
+ let taxaRetrieved = 0;
41
+
42
+ for (const batch of chunk(taxaToUpdate, 30)) {
43
+ const inatTaxa = await fetchInatTaxa(batch);
44
+ for (const iNatTaxon of inatTaxa) {
45
+ const iNatTaxonPhotos = iNatTaxon.taxon_photos
46
+ .filter((tp) =>
47
+ ALLOWED_LICENSE_CODES.includes(tp.photo.license_code),
48
+ )
49
+ .slice(0, 5);
50
+
51
+ const taxonName = idMap.get(iNatTaxon.id.toString());
52
+ if (!taxonName) {
53
+ throw new Error(`iNat id ${iNatTaxon.id} not found`);
54
+ }
55
+ /** @type {InatPhotoInfo[]} */
56
+ const taxonPhotos = [];
57
+ for (const taxonPhoto of iNatTaxonPhotos) {
58
+ const ext = taxonPhoto.photo.medium_url.split(".").at(-1);
59
+ if (!ext) {
60
+ continue;
61
+ }
62
+ /** @type {InatPhotoInfo} */
63
+ const obj = {
64
+ id: taxonPhoto.photo.id.toString(),
65
+ ext: ext,
66
+ licenseCode: taxonPhoto.photo.license_code,
67
+ attrName:
68
+ // Photographers retain copyright for most CC licenses,
69
+ // except CC0, so attribution is a bit different
70
+ taxonPhoto.photo.attribution.match(
71
+ /\(c\) (.*?),/,
72
+ )?.[1] ||
73
+ taxonPhoto.photo.attribution.match(
74
+ /uploaded by (.*)/,
75
+ )?.[1],
76
+ };
77
+
78
+ taxonPhotos.push(obj);
79
+ }
80
+ photos.set(taxonName, taxonPhotos);
81
+ }
82
+ taxaRetrieved += batch.length;
83
+ meter.update(taxaRetrieved);
84
+ await sleep(1_100);
85
+ }
86
+
87
+ meter.stop();
88
+
89
+ return photos;
90
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ca-plant-list/ca-plant-list",
3
- "version": "0.4.9",
3
+ "version": "0.4.10",
4
4
  "description": "Tools to create Jekyll files for a website listing plants in an area of California.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -16,7 +16,7 @@
16
16
  "bin": {
17
17
  "ca-plant-list": "scripts/build-site.js",
18
18
  "ca-plant-book": "scripts/build-ebook.js",
19
- "photo-tools": "scripts/photos.js"
19
+ "cpl-photos": "scripts/cpl-photos.js"
20
20
  },
21
21
  "dependencies": {
22
22
  "archiver": "^5.3.1",