@ca-plant-list/ca-plant-list 0.4.30 → 0.4.32

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.
package/data/synonyms.csv CHANGED
@@ -89,10 +89,12 @@ Amerosedum radiatum,Sedum radiatum
89
89
  Amerosedum radiatum subsp. radiatum,Sedum radiatum subsp. radiatum
90
90
  Ammannia coccinea subsp. purpurea,Ammannia coccinea
91
91
  Amsinckia gloriosa,Amsinckia tessellata var. gloriosa
92
+ Amsinckia helleri,Amsinckia retrorsa
92
93
  Amsinckia intermedia var. eastwoodiae,Amsinckia eastwoodiae
93
94
  Amsinckia intermedia var. echinata,Amsinckia intermedia
94
95
  Amsinckia menziesii var. intermedia,Amsinckia intermedia,INAT
95
96
  Amsinckia menziesii var. menziesii,Amsinckia menziesii
97
+ Amsinckia menziesii var. menziesii,Amsinckia retrorsa,INAT
96
98
  Amsinckia micrantha,Amsinckia menziesii
97
99
  Amsinckia straminea,Amsinckia lycopsoides
98
100
  Amsinckia tessellata var. elegans,Amsinckia tessellata var. tessellata
@@ -684,6 +686,7 @@ Erigeron peregrinus var. callianthemus,Erigeron glacialis var. glacialis
684
686
  Eriocoma lemmonii subsp. lemmonii,Stipa lemmonii var. lemmonii,INAT
685
687
  Eriogonella membranacea,Chorizanthe membranacea
686
688
  Eriogonum acetoselloides,Eriogonum gracile var. gracile
689
+ Eriogonum arachnoideum,Eriogonum latifolium
687
690
  Eriogonum auriculatum,Eriogonum nudum var. auriculatum
688
691
  Eriogonum caninum,Eriogonum luteolum var. caninum
689
692
  Eriogonum curvatum,Eriogonum wrightii var. subscaposum
@@ -704,6 +707,7 @@ Eriogonum lobbii var. minus,Eriogonum lobbii
704
707
  Eriogonum marifolium var. incanum,Eriogonum incanum
705
708
  Eriogonum nivale,Eriogonum ovalifolium var. nivale
706
709
  Eriogonum nudum subsp. pauciflorum,Eriogonum nudum var. pauciflorum
710
+ Eriogonum oblongifolium,Eriogonum latifolium
707
711
  Eriogonum polifolium,Eriogonum fasciculatum var. polifolium
708
712
  Eriogonum polyanthum var. bahiiforme,Eriogonum umbellatum var. bahiiforme
709
713
  Eriogonum revolutum,Eriogonum fasciculatum var. polifolium
package/data/taxa.csv CHANGED
@@ -94,7 +94,8 @@ Amsinckia grandiflora,large-flowered fiddleneck,N,13130,323,75424,202030,,Large-
94
94
  Amsinckia intermedia,fiddleneck,N,13131,11324,49141,202031,,Common Fiddleneck
95
95
  Amsinckia lunaris,bent-flower fiddleneck,N,13139,324,75425,202032,,Bent Flowered Fiddleneck,,,,,5,1B.2,,,S3,G3
96
96
  Amsinckia lycopsoides,,N,13140,325,58048,202033,,Bugloss-flowered Fiddleneck
97
- Amsinckia menziesii,rancher's fireweed,N,13145,326,55436,202034,,Menzies' Fiddleneck,,orange
97
+ Amsinckia menziesii,rancher's fireweed,N,13145,326,55436,202034,,Menzies' Fiddleneck,annual,orange
98
+ Amsinckia retrorsa,rigid fiddleneck,N,13147,11325,58049,202037,,Rigid Fiddleneck,annual,yellow,2,5
98
99
  Amsinckia tessellata var. gloriosa,,N,77019,333,80365,202042,,Carrizo Fiddleneck
99
100
  Amsinckia tessellata var. tessellata,devil's lettuce,N,77020,334,58852,202043,,Desert Fiddleneck
100
101
  Amsinckia vernicosa,,N,13155,335,58051,202027,,Green Fiddleneck
@@ -236,7 +237,7 @@ Brickellia californica,California brickelbush,N,1794,1152,58803,202493,true,Bric
236
237
  Briza maxima,quaking grass,X,16135,1165,57157,136989,true
237
238
  Briza minor,little quaking grass,X,16137,1166,57162,136993,true
238
239
  Brodiaea elegans subsp. elegans,harvest brodiaea,N,49461,1175,57127,202520,true,Harvest Brodiaea,corm,purple,4,8
239
- Brodiaea terrestris subsp. terrestris,,N,49464,1188,59081,202533,true,Dwarf Brodiaea,corm
240
+ Brodiaea terrestris subsp. terrestris,,N,49464,1188,59081,202533,true,Dwarf Brodiaea,corm,purple,4,7
240
241
  Bromus arenarius,Australian chess,X,16216,1191,58368,137101,true
241
242
  Bromus berteroanus,Chilean chess,X,16219,9740,75897,137110,true
242
243
  Bromus catharticus var. catharticus,rescue grass,X,85279,11433,80494,169088,true
@@ -274,9 +275,9 @@ Callitriche marginata,water-starwort,N,16692,1259,58093,64128,true,Winged Water
274
275
  Callitriche trochlearis,,N,16702,1261,69994,64137,true,Effluent Water-starwort
275
276
  Calochortus albus,white globe lily,N,16710,1264,51315,202570,true,White Globe Lily,,white,4,6
276
277
  Calochortus argillosus,clay mariposa lily,N,76542,1268,64330,202576,true,Clay Mariposa Lily,bulb,"white,pink",4,6
277
- Calochortus clavatus var. pallidus,bulb,N,55455,1275,58360,202583,true,Pale Yellow Mariposa
278
- Calochortus invenustus,bulb,N,16733,1284,64432,202590,true,Plain Mariposa Lily
279
- Calochortus leichtlinii,bulb,N,16735,1288,52542,202594,true,Leichtlin's Mariposa Lily
278
+ Calochortus clavatus var. pallidus,,N,55455,1275,58360,202583,true,Pale Yellow Mariposa
279
+ Calochortus invenustus,,N,16733,1284,64432,202590,true,Plain Mariposa Lily
280
+ Calochortus leichtlinii,,N,16735,1288,52542,202594,true,Leichtlin's Mariposa Lily
280
281
  Calochortus luteus,yellow mariposa lily,N,16737,1290,51077,202595,true,Yellow Mariposa Lily,bulb,yellow,4,6
281
282
  Calochortus pulchellus,Mt. Diablo fairy lantern,N,16755,1303,47326,202609,true,Mt. Diablo Fairy Lantern,bulb,,,,50,1B.2,,,S2,G2
282
283
  Calochortus splendens,,N,16759,1306,58361,202611,true,Splendid Mariposa Lily,bulb
@@ -363,7 +364,7 @@ Ceanothus thyrsiflorus,blue blossom,N,18501,1830,56617,12790,true,Blueblossom Ce
363
364
  Centaurea calcitrapa,purple star-thistle,X,1922,1845,56865,202776,true
364
365
  Centaurea cyanus,"bachelor's button,cornflower",X,1925,1846,933404,202778,true
365
366
  Centaurea iberica,Iberian starthistle,X,1931,1849,76212,206620,true
366
- Centaurea melitensis,"tocalote,Maltese start-thistle",X,1934,1851,57922,202785,true
367
+ Centaurea melitensis,"tocalote,Maltese star-thistle",X,1934,1851,57922,202785,true
367
368
  Centaurea solstitialis,yellow star-thistle,X,1946,1853,52588,202793,true
368
369
  Centranthus ruber,red valerian,X,18595,1864,57283,202799
369
370
  Centromadia fitchii,Fitch's spikeweed,N,77593,10809,58804,202801,true,Fitch Spikeweed
@@ -442,7 +443,7 @@ Claytonia exigua subsp. glauca,,N,76949,2233,57229,127855,true,Serpentine Spring
442
443
  Claytonia gypsophiloides,candy stripers,N,19620,2234,55344,112597,true,Gypsum Springbeauty,annual,pink,3,5
443
444
  Claytonia parviflora subsp. parviflora,,N,74695,2242,58296,127861,true,Utah Miner's Lettuce,"annual,perennial",white,3,6
444
445
  Claytonia perfoliata subsp. mexicana,,N,76956,2245,53004,127866,true,Southern Miner's Lettuce,annual,white,2,4
445
- Claytonia perfoliata subsp. perfoliata,Miner's lettuce,N,49921,2246,53002,127867,true,Miner's Lettuce,annual,white,1,5
446
+ Claytonia perfoliata subsp. perfoliata,miner's lettuce,N,49921,2246,53002,127867,true,Miner's Lettuce,annual,white,1,5
446
447
  Claytonia rubra subsp. depressa,red stem spring beauty,N,76957,2248,79751,127869,true,Miner's Lettuce,annual,white,2,4
447
448
  Clematis lasiantha,pipestems,N,19682,2254,49876,13749,true,Chaparral Clematis,,white,1,6
448
449
  Clematis ligusticifolia,virgin's bower,N,19683,2255,58996,13750,true,Virgin's Bower,,white,6,9
@@ -637,7 +638,7 @@ Elymus condensatus,giant wild-rye,N,24165,11636,164673,140055,Leymus condensatus
637
638
  Elymus elymoides var. elymoides,squirreltail,N,72180,11639,58377,211223,Elymus elymoides subsp. elymoides,Squirreltail
638
639
  Elymus glaucus subsp. glaucus,blue wildrye,N,50264,2937,57171,167143,true,Western Rye Grass
639
640
  Elymus glaucus subsp. virescens,,N,50266,2939,61203,206754,true,Blue Wildrye
640
- Elymus hispidus,wheatgrass,X,24153,11640,155848,140096,Thinopyrum intermedium subsp. barbulatum
641
+ Elymus hispidus,wheatgrass,X,24153,11640,155848,140096,Thinopyrum intermedium
641
642
  Elymus mollis subsp. mollis,,N,70142,11641,118426,206755,Leymus mollis subsp. mollis,Dune Wild Rye
642
643
  Elymus multisetus,big squirreltail,N,24122,2941,57167,140134,true,Big Squirreltail
643
644
  Elymus ponticus,tall wheatgrass,X,91896,11643,1301269,206756,Thinopyrum ponticum
@@ -700,6 +701,7 @@ Eriogonum fasciculatum var. polifolium,,N,58546,3247,58272,129983,true,Interior
700
701
  Eriogonum gracile var. gracile,slender buckwheat,N,58563,3257,58982,129999,true,Slender Woolly Wild Buckwheat
701
702
  Eriogonum incanum,frosted buckwheat,N,24809,3279,62680,114044,true,Frosted Wild Buckwheat,perennial,yellow,6,9
702
703
  Eriogonum inerme var. inerme,unarmed buckwheat,N,58586,9110,80799,130026,true,Unarmed Wild Buckwheat
704
+ Eriogonum latifolium,seaside wild buckwheat,N,24832,3293,57211,114060,true,Coast Buckwheat,perennial,"white,pink",1,12
703
705
  Eriogonum lobbii,granite buckwheat,N,24839,9935,77005,114067,true,Lobb's Buckwheat,perennial,"white,pink",6,8
704
706
  Eriogonum luteolum var. caninum,Tiburon buckwheat,N,58623,3297,61205,130067,true,Tiburon Buckwheat,,,,,733,1B.2,,,S2,G5T2
705
707
  Eriogonum luteolum var. luteolum,,N,58624,3298,64226,130068,true,Golden-carpet Wild Buckwheat
@@ -784,7 +786,7 @@ Festuca elmeri,Elmer fescue,N,25798,3580,64333,141011,true,Elmer Fescue
784
786
  Festuca idahoensis,Idaho fescue,N,25808,3581,61200,141076,true,Idaho Fescue
785
787
  Festuca microstachys,,N,25865,11688,77138,141123,Vulpia microstachys var. ciliata,Pacific Fescue
786
788
  Festuca myuros,zorro grass,X,25869,11689,77140,141133,Vulpia myuros
787
- Festuca octoflora,six-week's fescue,N,25872,11690,77141,141148,Vulpia octoflora var. hirtella,Six Weeks Fescue
789
+ Festuca octoflora,six-week's fescue,N,25872,11690,77141,141148,Vulpia octoflora,Six Weeks Fescue
788
790
  Festuca perennis,Italian ryegrass,X,91964,11691,52801,203852,Lolium multiflorum
789
791
  Festuca rubra,red fescue,N,25825,3586,61061,141223,true,Red Fescue
790
792
  Festuca temulenta,darnel,X,93753,11692,164712,203853,Lolium temulentum
@@ -1088,10 +1090,10 @@ Logfia gallica,,X,31363,9521,56949,204736,true,,annual,"brown,yellow",3,7
1088
1090
  Lomatium californicum,chu-chu-pate,N,31389,4950,56824,204737,,California Lomatium,,yellow,4,6
1089
1091
  Lomatium caruifolium var. caruifolium,,N,61026,4953,64328,204739,,Alkali Desertparsley
1090
1092
  Lomatium caruifolium var. denticulatum,,N,61027,4954,60123,204740
1091
- Lomatium dasycarpum subsp. dasycarpum,,N,51334,4960,56829,204743,,Woolly Fruited Lomatium,,white,3,6
1092
- Lomatium macrocarpum,,N,31433,4974,56826,204754,,Bigseed Biscuitroot
1093
+ Lomatium dasycarpum subsp. dasycarpum,,N,51334,4960,56829,204743,,Woolly Fruited Lomatium,perennial,white,3,6
1094
+ Lomatium macrocarpum,,N,31433,4974,56826,204754,,Bigseed Biscuitroot,perennial,white,4,6
1093
1095
  Lomatium nudicaule,,N,31441,4983,77818,204759,,Barestem Biscuitroot
1094
- Lomatium utriculatum,,N,31473,4999,56827,204766,,Common Lomatium,,yellow,2,5
1096
+ Lomatium utriculatum,,N,31473,4999,56827,204766,,Common Lomatium,perennial,yellow,2,5
1095
1097
  Lonicera hispidula,California honeysuckle,N,31505,10075,53416,204768,,Pink Honeysuckle,,pink,5,6
1096
1098
  Lonicera interrupta,chaparral honeysuckle,N,31506,5009,60878,204770,,Chaparral Honeysuckle,,"yellow,white",4,5
1097
1099
  Lonicera involucrata var. ledebourii,black twinberry,N,61081,5012,60990,204773,,Twinberry Honeysuckle
@@ -1195,8 +1197,8 @@ Mercurialis annua,annual mercury,X,33300,5450,68838,25939,true
1195
1197
  Mesembryanthemum nodiflorum,,X,33363,5461,71191,116177,true
1196
1198
  Micranthes californica,,N,91942,11841,78023,26022,true,California Saxifrage
1197
1199
  Micropus amphibolus,,N,33474,5462,78034,204946,true,Mount Diablo Cottonseed,,,,,1507,3.2,,,S3S4,G3G4
1198
- Micropus californicus var. californicus,slender cottonweed,N,7993,5464,58030,204950,true,Cottontop
1199
- Micropus californicus var. subvestitus,,N,7994,5465,81107,207081,true,Q-tips
1200
+ Micropus californicus var. californicus,slender cottonweed,N,7993,5464,58030,204950,true,Cottontop,annual,white,3,6
1201
+ Micropus californicus var. subvestitus,Q-tips,N,7994,5465,81107,207081,true,Q-tips,annual,white,4,6
1200
1202
  Microseris acuminata,,N,4146,5466,60142,204953,true,Sierra Foothill Silverpuffs
1201
1203
  Microseris bigelovii,,N,4147,5467,60977,204954,true,Coastal Silverpuffs
1202
1204
  Microseris campestris,,N,4149,5469,58031,204955,true,San Joaquin Silverpuffs
@@ -1558,7 +1560,7 @@ Romulea rosea var. australis,,X,65230,7162,68895,207249
1558
1560
  Rorippa curvisiliqua,yellow cress,N,41580,7168,58866,30089,true,Curvepod Yellowcress
1559
1561
  Rorippa palustris subsp. palustris,,N,52673,11988,64157,43562,true,Bog Yellowcress
1560
1562
  Rosa californica,California rose,N,41631,7179,53437,30158,true,California Wildrose,,pink
1561
- Rosa gymnocarpa,wood rose,N,41652,7182,53441,30212,true,Baldhip Rose,,pink
1563
+ Rosa gymnocarpa,wood rose,N,41652,7182,53441,30212,true,Wood Rose,,pink
1562
1564
  Rosa rubiginosa,sweet-brier,X,41648,11057,78886,30313,true
1563
1565
  Rosa spithamea,ground rose,N,41696,7187,53442,30338,true,Ground Rose
1564
1566
  Rubus armeniacus,Himalayan blackberry,X,87465,10319,61317,30459
@@ -1738,7 +1740,7 @@ Stephanomeria virgata subsp. pleurocarpa,,N,6227,7806,58849,206092,true,Wand Wir
1738
1740
  Stipa cernua,nodding needlegrass,N,45640,12042,165654,149288,Nassella cernua,Nodding Needle Grass
1739
1741
  Stipa lemmonii var. lemmonii,Lemmon's needlegrass,N,73899,12053,1220756,173006,Achnatherum lemmonii subsp. lemmonii
1740
1742
  Stipa lepida,foothill needlegrass,N,45641,12054,165656,149399,Nassella lepida,Foothill Needlegrass
1741
- Stipa miliacea var. miliacea,smilo grass,X,91920,12058,524183,206097,Piptatherum miliaceum subsp. miliaceum
1743
+ Stipa miliacea var. miliacea,smilo grass,X,91920,12058,524183,206097,Piptatherum miliaceum
1742
1744
  Stipa pulchra,purple needlegrass,N,45644,12067,165659,149498,Nassella pulchra,Purple Needlegrass
1743
1745
  Streptanthus albidus subsp. peramoenus,most beautiful jewelflower,N,53142,7814,58783,258754,Streptanthus glandulosus subsp. glandulosus,,,,,,1490,1B.2,,,S2,G2T2
1744
1746
  Streptanthus breweri,,N,45725,7822,79258,32606,true,Brewer's Jewelflower
@@ -1832,8 +1834,8 @@ Triphysaria eriantha subsp. eriantha,butter-and-eggs,N,53279,8129,59332,96567,tr
1832
1834
  Triphysaria pusilla,,N,47296,8133,57276,78297,true,Dwarf Owl's-clover
1833
1835
  Triphysaria versicolor subsp. faucibarbata,,N,53281,8135,60737,206269,true,Triphysaria
1834
1836
  Trisetum canescens,,N,47326,8139,1538928,150155,true,Tall False Oat
1835
- Triteleia hyacinthina,white brodiaea,N,47356,8154,57132,206275,true,White Brodiaea
1836
- Triteleia laxa,Ithuriel's spear,N,47359,8160,51085,206281,true,Ithuriel's Spear
1837
+ Triteleia hyacinthina,white brodiaea,N,47356,8154,57132,206275,true,White Brodiaea,corm,white,3,7
1838
+ Triteleia laxa,Ithuriel's spear,N,47359,8160,51085,206281,true,Ithuriel's Spear,corm,blue,3,6
1837
1839
  Triteleia peduncularis,,N,47363,8164,57133,206284,true,Long Rayed Brodiaea
1838
1840
  Tropaeolum majus,garden nasturtium,X,47408,8167,54329,34321,true
1839
1841
  Tropidocarpum capparideum,caper-fruited tropidocarpum,N,47411,8168,79456,34327,true,Caper-fruited Tropidocarpum,annual,yellow,3,4,1255,1B.1,,,S1,G1
@@ -0,0 +1 @@
1
+ Base of flower funnel-shaped.
@@ -0,0 +1 @@
1
+ Base of flower bell-shaped.
@@ -88,20 +88,26 @@ export class ExternalSites {
88
88
  }
89
89
 
90
90
  /**
91
- * @param {import("./types.js").Taxon} taxon
91
+ * @param {{taxon_id?:string,taxon_name?:string,subview?:"map"|"table",view?:"species"}} params
92
92
  * @param {import("./config.js").Config} config
93
93
  * @returns {URL|undefined}
94
94
  */
95
- static getInatObsLink(taxon, config) {
96
- const iNatID = taxon.getINatID();
97
- if (!iNatID) {
98
- return;
99
- }
100
-
95
+ static getInatObsLink(params, config) {
101
96
  const url = new URL(
102
- "https://www.inaturalist.org/observations?subview=map",
97
+ "https://www.inaturalist.org/observations?subview=map&iconic_taxa=Plantae",
103
98
  );
104
- url.searchParams.set("taxon_id", iNatID);
99
+ if (params.subview) {
100
+ url.searchParams.set("subview", params.subview);
101
+ }
102
+ if (params.taxon_id) {
103
+ url.searchParams.set("taxon_id", params.taxon_id);
104
+ }
105
+ if (params.taxon_name) {
106
+ url.searchParams.set("taxon_name", params.taxon_name);
107
+ }
108
+ if (params.view) {
109
+ url.searchParams.set("view", params.view);
110
+ }
105
111
  for (const p of ["place_id", "project_id"]) {
106
112
  const v = config.getConfigValue("inat", p);
107
113
  if (v) {
package/lib/htmltaxon.js CHANGED
@@ -60,7 +60,11 @@ const OBSLINKS = {
60
60
  },
61
61
  inat: {
62
62
  label: "iNaturalist",
63
- href: (taxon, config) => ExternalSites.getInatObsLink(taxon, config),
63
+ href: (taxon, config) =>
64
+ ExternalSites.getInatObsLink(
65
+ { taxon_id: taxon.getINatID() },
66
+ config,
67
+ ),
64
68
  },
65
69
  };
66
70
 
@@ -120,6 +124,45 @@ class HTMLTaxon {
120
124
  */
121
125
  static addObsLink(links, taxon, config, sourceCode, label) {
122
126
  const source = OBSLINKS[sourceCode];
127
+ if (sourceCode === "inat") {
128
+ const iNatName = taxon.getINatName().split(" ");
129
+ /** @type {string[]} */
130
+ const iNatLinks = [];
131
+ iNatLinks.push(
132
+ HTML.getLink(
133
+ ExternalSites.getInatObsLink(
134
+ { taxon_name: iNatName[0], view: "species" },
135
+ config,
136
+ ),
137
+ `Genus ${iNatName[0]}`,
138
+ undefined,
139
+ true,
140
+ ),
141
+ );
142
+ if (iNatName.length > 2) {
143
+ const species = `${iNatName[0]} ${iNatName[1]}`;
144
+ iNatLinks.push(
145
+ HTML.getLink(
146
+ ExternalSites.getInatObsLink(
147
+ { taxon_name: species },
148
+ config,
149
+ ),
150
+ species,
151
+ undefined,
152
+ true,
153
+ ),
154
+ );
155
+ }
156
+ this.addLink(
157
+ iNatLinks,
158
+ source.href(taxon, config),
159
+ taxon.getINatSyn() ?? taxon.getName(),
160
+ );
161
+
162
+ const html = HTML.textElement("span", label ?? source.label);
163
+ links.push(html + HTML.wrap("ul", HTML.arrayToLI(iNatLinks)));
164
+ return;
165
+ }
123
166
  this.addLink(links, source.href(taxon, config), label ?? source.label);
124
167
  }
125
168
 
package/lib/photo.js CHANGED
@@ -10,10 +10,10 @@ export class Photo {
10
10
  #rights;
11
11
 
12
12
  /**
13
- * @param {number} id
13
+ * @param {string} id
14
14
  * @param {string} ext
15
- * @param {import("./utils/inat-tools.js").InatLicenseCode} licenseCode
16
- * @param {string} rightsHolder
15
+ * @param {import("./utils/inat-tools.js").AllowedLicenseCode} licenseCode
16
+ * @param {string|undefined} rightsHolder
17
17
  */
18
18
  constructor(id, ext, licenseCode, rightsHolder) {
19
19
  this.#id = id;
@@ -22,7 +22,9 @@ export class Photo {
22
22
  if (licenseCode === "cc0") this.#rights = "CC0";
23
23
  else if (licenseCode === "cc-by") this.#rights = "CC BY";
24
24
  else if (licenseCode === "cc-by-nc") this.#rights = "CC BY-NC";
25
- else this.#rights = "C";
25
+ else {
26
+ throw new Error(`unexpected license code ${licenseCode}`);
27
+ }
26
28
  }
27
29
 
28
30
  /**
@@ -115,27 +115,7 @@ class Taxa {
115
115
  #loadPhotosFromFile(dataDir, filename) {
116
116
  if (!fs.existsSync(path.join(dataDir, filename))) return;
117
117
  /** @type {import("../utils/inat-tools.js").InatCsvPhoto[]} */
118
- const csvPhotos = CSV.parseFile(dataDir, filename).map((row) => {
119
- /** @type {import("../utils/inat-tools.js").InatLicenseCode} */
120
- let licenseCode = "cc-by";
121
- if (row.licenseCode === "cc-by-nc-sa") licenseCode = "cc-by-nc-sa";
122
- else if (row.licenseCode === "cc-by-nc") licenseCode = "cc-by-nc";
123
- else if (row.licenseCode === "cc-by-nc-nd")
124
- licenseCode = "cc-by-nc-nd";
125
- else if (row.licenseCode === "cc-by") licenseCode = "cc-by";
126
- else if (row.licenseCode === "cc-by-sa") licenseCode = "cc-by-sa";
127
- else if (row.licenseCode === "cc-by-nd") licenseCode = "cc-by-nd";
128
- else if (row.licenseCode === "pd") licenseCode = "pd";
129
- else if (row.licenseCode === "gdfl") licenseCode = "gdfl";
130
- else if (row.licenseCode === "cc0") licenseCode = "cc0";
131
- return {
132
- attrName: row.attrName,
133
- ext: row.ext,
134
- id: Number(row.id),
135
- licenseCode,
136
- name: row.name,
137
- };
138
- });
118
+ const csvPhotos = CSV.readFile(path.join(dataDir, filename));
139
119
  for (const csvPhoto of csvPhotos) {
140
120
  const taxon = this.getTaxon(csvPhoto.name);
141
121
  if (!taxon) {
@@ -156,8 +136,9 @@ class Taxa {
156
136
  * @param {string} dataDir
157
137
  */
158
138
  #loadInatPhotos(dataDir) {
159
- this.#loadPhotosFromFile("./data", "inatphotos.csv");
139
+ // Prefer taxon photos, as they are somewhat curated.
160
140
  this.#loadPhotosFromFile(dataDir, "inattaxonphotos.csv");
141
+ this.#loadPhotosFromFile("./data", "inatobsphotos.csv");
161
142
  this.#loadPhotosFromFile(dataDir, "inatobsphotos.csv");
162
143
  }
163
144
 
package/lib/tools/inat.js CHANGED
@@ -3,6 +3,7 @@ import { Files } from "../files.js";
3
3
  import { CSV } from "../csv.js";
4
4
  import { sleep } from "../util.js";
5
5
  import { TaxaCSV } from "./taxacsv.js";
6
+ import { SynCSV } from "./syncsv.js";
6
7
 
7
8
  /**
8
9
  * @typedef {{id:string,
@@ -65,8 +66,10 @@ export class INat {
65
66
 
66
67
  const missingTaxa = [];
67
68
 
68
- /**@type {Map<string,string>} */
69
+ /** @type {Map<string,string>} */
69
70
  const idsToUpdate = new Map();
71
+ /** @type {import("./syncsv.js").SynData[]} */
72
+ const synonymsToAdd = [];
70
73
 
71
74
  for (const taxon of taxa.getTaxonList()) {
72
75
  const name = taxon.getName();
@@ -103,12 +106,14 @@ export class INat {
103
106
  errorLog,
104
107
  data.name,
105
108
  data.iNatName,
109
+ synonymsToAdd,
106
110
  );
107
111
  }
108
112
 
109
113
  this.#checkExceptions(taxa, exceptions, errorLog);
110
114
 
111
115
  if (update) {
116
+ updateSynCSV(dataDir, synonymsToAdd);
112
117
  updateTaxaCSV(dataDir, idsToUpdate);
113
118
  }
114
119
  }
@@ -167,14 +172,21 @@ export class INat {
167
172
  }
168
173
 
169
174
  /**
170
- *
171
175
  * @param {import("../types.js").Taxa} taxa
172
176
  * @param {import("../exceptions.js").Exceptions} exceptions
173
177
  * @param {import("../errorlog.js").ErrorLog} errorLog
174
178
  * @param {string} name
175
179
  * @param {string} iNatName
180
+ * @param {import("./syncsv.js").SynData[]} synonymsToAdd
176
181
  */
177
- static async #findCurrentName(taxa, exceptions, errorLog, name, iNatName) {
182
+ static async #findCurrentName(
183
+ taxa,
184
+ exceptions,
185
+ errorLog,
186
+ name,
187
+ iNatName,
188
+ synonymsToAdd,
189
+ ) {
178
190
  /**
179
191
  * @param {{matched_term:string,name:string,rank:string}[]} results
180
192
  * @param {string} iNatName
@@ -242,11 +254,17 @@ export class INat {
242
254
  }
243
255
  }
244
256
  } else {
257
+ const formerName = this.makeSynonymName(result, errorLog);
245
258
  errorLog.log(
246
259
  name,
247
260
  "found iNat synonym",
248
- this.makeSynonymName(result, errorLog) + "," + name + ",INAT",
261
+ formerName + "," + name + ",INAT",
249
262
  );
263
+ synonymsToAdd.push({
264
+ Former: formerName,
265
+ Current: name,
266
+ Type: "INAT",
267
+ });
250
268
  }
251
269
 
252
270
  // Delay to throttle queries to iNat API.
@@ -297,6 +315,17 @@ class InatTaxon {
297
315
  }
298
316
  }
299
317
 
318
+ /**
319
+ * @param {string} dataDir
320
+ * @param {import("./syncsv.js").SynData[]} synonymsToAdd
321
+ */
322
+ function updateSynCSV(dataDir, synonymsToAdd) {
323
+ const csv = new SynCSV(dataDir);
324
+ const data = csv.getData();
325
+ data.push(...synonymsToAdd);
326
+ csv.write();
327
+ }
328
+
300
329
  /**
301
330
  * @param {string} dataDir
302
331
  * @param {Map<string,string>} idsToUpdate