Skip to content

Commit 81415e5

Browse files
committed
parse name hybrid with comparison (fix #286)
1 parent 27c29a0 commit 81415e5

6 files changed

Lines changed: 65 additions & 44 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
## [v1.11.5] - 2025-03-30 Sun
6+
7+
- Fix [#286]: parse names with named hybrid and comparison.
8+
59
## [v1.11.4] - 2025-03-10 Mon
610

711
- Add: improve flatten output.

ent/parser/ast.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ func (p *Engine) newNamedGenusHybridNode(n *node32) *namedGenusHybridNode {
297297
if n.pegRule != ruleHybridChar {
298298
return nhn
299299
}
300+
annot := parsed.NoAnnot
300301
hybr := p.newWordNode(n, parsed.HybridCharType)
301302
n = n.next
302303
n = n.up
@@ -305,6 +306,11 @@ func (p *Engine) newNamedGenusHybridNode(n *node32) *namedGenusHybridNode {
305306
p.addWarn(parsed.HybridCharNoSpaceWarn)
306307
}
307308
switch n.pegRule {
309+
case ruleNameComp:
310+
p.addWarn(parsed.NameComparisonWarn)
311+
annot = parsed.ComparisonAnnot
312+
p.surrogate = &annot
313+
name = p.newComparisonNode(n)
308314
case ruleUninomial:
309315
name = p.newUninomialNode(n)
310316
case ruleUninomialCombo:

gnparser_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,17 @@ func TestBacterialCode(t *testing.T) {
248248
}
249249
}
250250

251+
func TestHybridCF(t *testing.T) {
252+
assert := assert.New(t)
253+
name := "x Espostocactus cf. mirabilis (Rauh & Backeb.) G.D.Rowley"
254+
gnp := gnparser.New(gnparser.NewConfig())
255+
res := gnp.ParseName(name)
256+
assert.Equal(
257+
"× Espostocactus cf. mirabilis (Rauh & Backeb.) G. D. Rowley",
258+
res.Normalized,
259+
)
260+
}
261+
251262
func TestOutputRestore(t *testing.T) {
252263
name := "Homo zapiens Linn. 1758"
253264
cfg := gnparser.NewConfig(gnparser.OptWithDetails(true))

go.mod

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
module github.com/gnames/gnparser
22

3-
go 1.23.6
3+
go 1.24.1
44

55
require (
66
github.com/dustin/go-humanize v1.0.1
7-
github.com/gnames/gnfmt v0.5.4
8-
github.com/gnames/gnlib v0.44.0
9-
github.com/gnames/gnsys v0.3.6
10-
github.com/gnames/gnuuid v0.1.2
7+
github.com/gnames/gnfmt v0.5.7
8+
github.com/gnames/gnlib v0.47.0
9+
github.com/gnames/gnsys v0.3.8
10+
github.com/gnames/gnuuid v0.2.0
1111
github.com/gnames/organizer v0.1.1
1212
github.com/gnames/tribool v0.1.1
1313
github.com/labstack/echo/v4 v4.13.3
@@ -16,16 +16,16 @@ require (
1616
github.com/rendon/testcli v1.0.0
1717
github.com/spf13/cobra v1.9.1
1818
github.com/stretchr/testify v1.10.0
19-
golang.org/x/net v0.35.0
20-
golang.org/x/perf v0.0.0-20250214215153-c95ad7d5b636
21-
golang.org/x/text v0.22.0
22-
golang.org/x/tools v0.30.0
19+
golang.org/x/net v0.38.0
20+
golang.org/x/perf v0.0.0-20250305200902-02a15fd477ba
21+
golang.org/x/text v0.23.0
22+
golang.org/x/tools v0.31.0
2323
)
2424

2525
require (
2626
github.com/VividCortex/ewma v1.2.0 // indirect
2727
github.com/aclements/go-moremath v0.0.0-20241023150245-c8bbc672ef66 // indirect
28-
github.com/cheggaaa/pb/v3 v3.1.6 // indirect
28+
github.com/cheggaaa/pb/v3 v3.1.7 // indirect
2929
github.com/davecgh/go-spew v1.1.1 // indirect
3030
github.com/fatih/color v1.18.0 // indirect
3131
github.com/google/uuid v1.6.0 // indirect
@@ -45,10 +45,10 @@ require (
4545
github.com/ulikunitz/xz v0.5.12 // indirect
4646
github.com/valyala/bytebufferpool v1.0.0 // indirect
4747
github.com/valyala/fasttemplate v1.2.2 // indirect
48-
golang.org/x/crypto v0.33.0 // indirect
49-
golang.org/x/mod v0.23.0 // indirect
50-
golang.org/x/sync v0.11.0 // indirect
51-
golang.org/x/sys v0.30.0 // indirect
52-
golang.org/x/time v0.10.0 // indirect
48+
golang.org/x/crypto v0.36.0 // indirect
49+
golang.org/x/mod v0.24.0 // indirect
50+
golang.org/x/sync v0.12.0 // indirect
51+
golang.org/x/sys v0.31.0 // indirect
52+
golang.org/x/time v0.11.0 // indirect
5353
gopkg.in/yaml.v3 v3.0.1 // indirect
5454
)

go.sum

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1o
22
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
33
github.com/aclements/go-moremath v0.0.0-20241023150245-c8bbc672ef66 h1:siNQlUMcFUDZWCOt0p+RHl7et5Nnwwyq/sFZmr4iG1I=
44
github.com/aclements/go-moremath v0.0.0-20241023150245-c8bbc672ef66/go.mod h1:FDw7qicTbJ1y1SZcNnOvym2BogPdC3lY9Z1iUM4MVhw=
5-
github.com/cheggaaa/pb/v3 v3.1.6 h1:h0x+vd7EiUohAJ29DJtJy+SNAc55t/elW3jCD086EXk=
6-
github.com/cheggaaa/pb/v3 v3.1.6/go.mod h1:urxmfVtaxT+9aWk92DbsvXFZtNSWQSO5TRAp+MJ3l1s=
5+
github.com/cheggaaa/pb/v3 v3.1.7 h1:2FsIW307kt7A/rz/ZI2lvPO+v3wKazzE4K/0LtTWsOI=
6+
github.com/cheggaaa/pb/v3 v3.1.7/go.mod h1:/Ji89zfVPeC/u5j8ukD0MBPHt2bzTYp74lQ7KlgFWTQ=
77
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
88
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
99
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -13,14 +13,14 @@ github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+m
1313
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
1414
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
1515
github.com/gnames/gnfmt v0.1.0/go.mod h1:WG9c3CoiVrGc1SDsxLk7zjmv2B4UIzI00m4K5Khc/d0=
16-
github.com/gnames/gnfmt v0.5.4 h1:oT3qL/VILqdSCUuD8lgWBc+C79VZUSEUffq7zV1b0SI=
17-
github.com/gnames/gnfmt v0.5.4/go.mod h1:fAX78TlB0ECBRiZRQ2HTpVPwzWkwkIe32Pf/rUu7QmM=
18-
github.com/gnames/gnlib v0.44.0 h1:nIvVW9+iO+BJFGEvo9zVSer9xz0DM6WlLt6SU7IdDFY=
19-
github.com/gnames/gnlib v0.44.0/go.mod h1:Om7iEOZmSXapYwxriIxxCNR4aPYsrCVdtzJAX7TY15E=
20-
github.com/gnames/gnsys v0.3.6 h1:jd/1GS8i2jrMtaaTqvBqqZZMYqP8G9QHRJpwyVm43FA=
21-
github.com/gnames/gnsys v0.3.6/go.mod h1:bx40EIiVpUs3QzmdV1Wmodbj74GMeVEvcWDB5OaeAys=
22-
github.com/gnames/gnuuid v0.1.2 h1:VAaZqggCUaLys86z6bZhDjWn60iVIgX/1vstKgCW0q8=
23-
github.com/gnames/gnuuid v0.1.2/go.mod h1:9mfrGGK+czM2uLFO6S0F+lF5gCkMhnBvKKJqpRp1om4=
16+
github.com/gnames/gnfmt v0.5.7 h1:RPS5vU4fjXrV5BzWOLJfzlD5Jrmn7M0hvhXotiLSBj8=
17+
github.com/gnames/gnfmt v0.5.7/go.mod h1:tA38UNZPP/Pm+V3D+20Kob0dnQeLR6BdwD4p+LIG9/c=
18+
github.com/gnames/gnlib v0.47.0 h1:cuhYHwA/9+R9kA3/st94yh9bo8p8xkeaSKxLXuuglrs=
19+
github.com/gnames/gnlib v0.47.0/go.mod h1:b6xRhWgaoWpK0tpotqO/iVsw5w+IVBMwrRPR9XBglL8=
20+
github.com/gnames/gnsys v0.3.8 h1:6TZEgInUxxzbt/Zi0oqfPR7qTwA407lgJSB0pZe0z+k=
21+
github.com/gnames/gnsys v0.3.8/go.mod h1:pgixTtKMkP1FBBAdTPUM0KX8pl0aAO+h7M6m5zDEJjU=
22+
github.com/gnames/gnuuid v0.2.0 h1:r6rRKQvPLEB5Woj9sTzC6Y13LZeRqN4iTFzVPt0HaFY=
23+
github.com/gnames/gnuuid v0.2.0/go.mod h1:XLcmCV/e0YRE9ED3B6jc8c4V3lTUlZiSb/fYnWD2HV0=
2424
github.com/gnames/organizer v0.1.1 h1:3Xcz4QWS6cDBKI5sFK6ZJjpNptMJV6Fsq4N9gmC7Um8=
2525
github.com/gnames/organizer v0.1.1/go.mod h1:IZrbsFCqHb7DzKWmM9gf17khqRmSTG5ywuPF5BdM6qU=
2626
github.com/gnames/tribool v0.1.1 h1:kktNme8blgibopZVgQ02kkJGHMpxslD2Tv5UZCyb/vw=
@@ -85,25 +85,25 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
8585
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
8686
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
8787
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
88-
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
89-
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
90-
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
91-
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
92-
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
93-
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
94-
golang.org/x/perf v0.0.0-20250214215153-c95ad7d5b636 h1:MqbkwAT6CqEIjLPIjXz5ggsU+u3s5tWKRG24FaFVB6s=
95-
golang.org/x/perf v0.0.0-20250214215153-c95ad7d5b636/go.mod h1:icvmpsXVagfHXXvKGjV9OCZRIVvB7Y/HpqVHqOevFy8=
96-
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
97-
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
88+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
89+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
90+
golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
91+
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
92+
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
93+
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
94+
golang.org/x/perf v0.0.0-20250305200902-02a15fd477ba h1:0iM7SkkyXtZKGBWfn+ka1Rj6VOCRyFMkEHaCWsaR7no=
95+
golang.org/x/perf v0.0.0-20250305200902-02a15fd477ba/go.mod h1:YEhzh+7vn0fUjydWEf27T4XWyeMDdRK44swFIgYh/nY=
96+
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
97+
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
9898
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
99-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
100-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
101-
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
102-
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
103-
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
104-
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
105-
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
106-
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
99+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
100+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
101+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
102+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
103+
golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
104+
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
105+
golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
106+
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
107107
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
108108
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
109109
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package gnparser
33
var (
44
// Version is the version of the gnparser package. When Makefile is
55
// used, the version is calculated out of Git tags.
6-
Version = "v1.11.4"
6+
Version = "v1.11.5"
77
// Build is a timestamp of when Makefile was used to compile
88
// the gnparser code. If go build was used, Build stays empty.
99
Build string

0 commit comments

Comments
 (0)