biodiversity19 3.1.5 → 3.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +10 -0
- data/.ruby-version +1 -1
- data/CHANGELOG +2 -0
- data/LICENSE +1 -1
- data/README.md +3 -3
- data/Rakefile +14 -14
- data/biodiversity.gemspec +19 -19
- data/lib/biodiversity/parser.rb +1 -1
- data/lib/biodiversity/parser/scientific_name_canonical.rb +13 -13
- data/lib/biodiversity/parser/scientific_name_canonical.treetop +17 -17
- data/lib/biodiversity/parser/scientific_name_clean.rb +163 -131
- data/lib/biodiversity/parser/scientific_name_clean.treetop +62 -56
- data/lib/biodiversity/parser/scientific_name_dirty.rb +36 -36
- data/lib/biodiversity/parser/scientific_name_dirty.treetop +50 -53
- data/lib/biodiversity/version.rb +2 -2
- data/spec/files/test_data.txt +6 -1
- data/spec/parser/scientific_name_canonical_spec.rb +21 -21
- data/spec/parser/scientific_name_clean_spec.rb +750 -500
- data/spec/parser/scientific_name_dirty_spec.rb +91 -90
- data/spec/parser/scientific_name_spec.rb +3 -1
- data/spec/spec_helper.rb +21 -21
- metadata +17 -16
@@ -1,16 +1,16 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require
|
2
|
+
require "unicode_utils"
|
3
3
|
|
4
4
|
grammar ScientificNameClean
|
5
5
|
|
6
6
|
rule root
|
7
7
|
space a:scientific_name_5 space {
|
8
8
|
def value
|
9
|
-
a.value.gsub(/\s{2,}/,
|
9
|
+
a.value.gsub(/\s{2,}/, " ").strip
|
10
10
|
end
|
11
11
|
|
12
12
|
def canonical
|
13
|
-
a.canonical.gsub(/\s{2,}/,
|
13
|
+
a.canonical.gsub(/\s{2,}/, " ").strip
|
14
14
|
end
|
15
15
|
|
16
16
|
def pos
|
@@ -218,7 +218,7 @@ grammar ScientificNameClean
|
|
218
218
|
.+ space {
|
219
219
|
|
220
220
|
def value
|
221
|
-
|
221
|
+
""
|
222
222
|
end
|
223
223
|
|
224
224
|
def hybrid
|
@@ -226,11 +226,11 @@ grammar ScientificNameClean
|
|
226
226
|
end
|
227
227
|
|
228
228
|
def canonical
|
229
|
-
|
229
|
+
""
|
230
230
|
end
|
231
231
|
|
232
232
|
def pos
|
233
|
-
{interval.begin => [
|
233
|
+
{interval.begin => ["unparsed", interval.end]}
|
234
234
|
end
|
235
235
|
|
236
236
|
def details
|
@@ -513,14 +513,14 @@ grammar ScientificNameClean
|
|
513
513
|
|
514
514
|
def pos
|
515
515
|
def a.pos
|
516
|
-
{interval.begin => [
|
516
|
+
{interval.begin => ["infraspecies", a.interval.end]}
|
517
517
|
end
|
518
518
|
aid.pos(a)
|
519
519
|
end
|
520
520
|
|
521
521
|
def details
|
522
522
|
def a.details
|
523
|
-
{:infraspecies => {:string => value, :rank =>
|
523
|
+
{:infraspecies => {:string => value, :rank => "n/a"}}
|
524
524
|
end
|
525
525
|
aid.details(a)
|
526
526
|
end
|
@@ -536,11 +536,11 @@ grammar ScientificNameClean
|
|
536
536
|
end
|
537
537
|
|
538
538
|
def pos
|
539
|
-
{interval.begin => [
|
539
|
+
{interval.begin => ["infraspecies", interval.end]}
|
540
540
|
end
|
541
541
|
|
542
542
|
def details
|
543
|
-
{:infraspecies => {:string => value, :rank =>
|
543
|
+
{:infraspecies => {:string => value, :rank => "n/a"}}
|
544
544
|
end
|
545
545
|
}
|
546
546
|
end
|
@@ -560,7 +560,7 @@ grammar ScientificNameClean
|
|
560
560
|
end
|
561
561
|
|
562
562
|
rule rank
|
563
|
-
("morph."/"f.sp."/"B "/"ssp."/"ssp "/"mut."/"nat "/"nothosubsp."/"convar."/"pseudovar."/"sect."/"ser."/"var."/"subvar."/ "[var.]" /"var "/"subsp."/"subsp "/"subf."/"race "/"forma "/"fma."/"fma "/"form."/"form "/"fo."/"fo "/"f."/"α"/"ββ"/"β"/"γ"/"δ"/"ε"/"φ"/"θ"/"μ"/"a."/"b."/"c."/"d."/"e."/"g."/"k."/"****"/"**"/"*")
|
563
|
+
("morph."/"f.sp."/"B "/"ssp."/"ssp "/"mut."/"nat "/"nothosubsp."/"convar."/"pseudovar."/"sect."/"ser."/"var."/"subvar."/ "[var.]" /"var "/"subsp."/"subsp "/"subf."/"race "/"forma."/"forma "/"fma."/"fma "/"form."/"form "/"fo."/"fo "/"f."/"α"/"ββ"/"β"/"γ"/"δ"/"ε"/"φ"/"θ"/"μ"/"a."/"b."/"c."/"d."/"e."/"g."/"k."/"****"/"**"/"*")
|
564
564
|
{
|
565
565
|
def value
|
566
566
|
text_value.strip
|
@@ -575,8 +575,8 @@ grammar ScientificNameClean
|
|
575
575
|
end
|
576
576
|
|
577
577
|
def pos(a)
|
578
|
-
interval_end = text_value[-1] ==
|
579
|
-
{interval.begin => [
|
578
|
+
interval_end = text_value[-1] == " " ? interval.end - 1 : interval.end
|
579
|
+
{interval.begin => ["infraspecific_type", interval_end], a.interval.begin => ["infraspecies", a.interval.end]}
|
580
580
|
end
|
581
581
|
|
582
582
|
def details(a = nil)
|
@@ -592,7 +592,7 @@ grammar ScientificNameClean
|
|
592
592
|
end
|
593
593
|
|
594
594
|
def pos(uni)
|
595
|
-
{interval.begin => [
|
595
|
+
{interval.begin => ["rank_uninomial", interval.end], uni.interval.begin => ["uninomial", uni.interval.end]}
|
596
596
|
end
|
597
597
|
|
598
598
|
def details(uni)
|
@@ -634,7 +634,7 @@ grammar ScientificNameClean
|
|
634
634
|
end
|
635
635
|
|
636
636
|
def pos
|
637
|
-
{interval.begin => [
|
637
|
+
{interval.begin => ["species", interval.end]}
|
638
638
|
end
|
639
639
|
|
640
640
|
def hybrid
|
@@ -660,7 +660,7 @@ grammar ScientificNameClean
|
|
660
660
|
end
|
661
661
|
|
662
662
|
def pos
|
663
|
-
{a.interval.begin => [
|
663
|
+
{a.interval.begin => ["infragenus", a.interval.end]}
|
664
664
|
end
|
665
665
|
|
666
666
|
def details
|
@@ -676,7 +676,7 @@ grammar ScientificNameClean
|
|
676
676
|
end
|
677
677
|
|
678
678
|
def pos
|
679
|
-
{a.interval.begin => [
|
679
|
+
{a.interval.begin => ["genus", a.interval.end]}
|
680
680
|
end
|
681
681
|
|
682
682
|
def canonical
|
@@ -786,7 +786,7 @@ grammar ScientificNameClean
|
|
786
786
|
end
|
787
787
|
|
788
788
|
def pos
|
789
|
-
{interval.begin => [
|
789
|
+
{interval.begin => ["uninomial", interval.end]}
|
790
790
|
end
|
791
791
|
|
792
792
|
def hybrid
|
@@ -909,11 +909,11 @@ grammar ScientificNameClean
|
|
909
909
|
end
|
910
910
|
|
911
911
|
def pos
|
912
|
-
{a.interval.begin => [
|
912
|
+
{a.interval.begin => ["unknown_author", a.interval.end]}
|
913
913
|
end
|
914
914
|
|
915
915
|
def details
|
916
|
-
{:authorship => text_value, :basionymAuthorTeam => {:authorTeam => text_value, :author => [
|
916
|
+
{:authorship => text_value, :basionymAuthorTeam => {:authorTeam => text_value, :author => ["?"]}}
|
917
917
|
end
|
918
918
|
}
|
919
919
|
end
|
@@ -949,7 +949,7 @@ grammar ScientificNameClean
|
|
949
949
|
details_with_arg(:basionymAuthorTeam)
|
950
950
|
end
|
951
951
|
|
952
|
-
def details_with_arg(authorTeamType =
|
952
|
+
def details_with_arg(authorTeamType = "basionymAuthorTeam")
|
953
953
|
{ :authorship => text_value,
|
954
954
|
authorTeamType.to_sym => {
|
955
955
|
:authorTeam => a.text_value.strip
|
@@ -971,7 +971,7 @@ grammar ScientificNameClean
|
|
971
971
|
details_with_arg(:basionymAuthorTeam)
|
972
972
|
end
|
973
973
|
|
974
|
-
def details_with_arg(authorTeamType =
|
974
|
+
def details_with_arg(authorTeamType = "basionymAuthorTeam")
|
975
975
|
{ :authorship => text_value,
|
976
976
|
authorTeamType.to_sym => {
|
977
977
|
:authorTeam => a.text_value.strip
|
@@ -987,7 +987,7 @@ grammar ScientificNameClean
|
|
987
987
|
details
|
988
988
|
end
|
989
989
|
|
990
|
-
def details_with_arg(authorTeamType =
|
990
|
+
def details_with_arg(authorTeamType = "basionymAuthorTeam")
|
991
991
|
{ :authorship => text_value,
|
992
992
|
authorTeamType.to_sym => {
|
993
993
|
:authorTeam => text_value,
|
@@ -1025,7 +1025,7 @@ grammar ScientificNameClean
|
|
1025
1025
|
end
|
1026
1026
|
|
1027
1027
|
def pos
|
1028
|
-
{interval.begin => [
|
1028
|
+
{interval.begin => ["unknown_author", interval.end]}
|
1029
1029
|
end
|
1030
1030
|
|
1031
1031
|
def details
|
@@ -1059,7 +1059,7 @@ grammar ScientificNameClean
|
|
1059
1059
|
rule author_name
|
1060
1060
|
space a:author_name_without_postfix space b:author_postfix_word space !latin_word {
|
1061
1061
|
def value
|
1062
|
-
a.value +
|
1062
|
+
a.value + " " + b.value
|
1063
1063
|
end
|
1064
1064
|
|
1065
1065
|
def pos
|
@@ -1113,7 +1113,7 @@ grammar ScientificNameClean
|
|
1113
1113
|
end
|
1114
1114
|
|
1115
1115
|
def pos
|
1116
|
-
{interval.begin => [
|
1116
|
+
{interval.begin => ["author_word", 1], (interval.begin + 2) => ["author_word", 2], (interval.begin + 5) => ["author_word", 2]}
|
1117
1117
|
end
|
1118
1118
|
|
1119
1119
|
def details
|
@@ -1128,7 +1128,7 @@ grammar ScientificNameClean
|
|
1128
1128
|
|
1129
1129
|
def pos
|
1130
1130
|
#cheating because there are several words in some of them
|
1131
|
-
{interval.begin => [
|
1131
|
+
{interval.begin => ["author_word", interval.end]}
|
1132
1132
|
end
|
1133
1133
|
|
1134
1134
|
def details
|
@@ -1144,7 +1144,7 @@ grammar ScientificNameClean
|
|
1144
1144
|
end
|
1145
1145
|
|
1146
1146
|
def pos
|
1147
|
-
{interval.begin => [
|
1147
|
+
{interval.begin => ["author_word", interval.end]}
|
1148
1148
|
end
|
1149
1149
|
|
1150
1150
|
def details
|
@@ -1158,7 +1158,7 @@ grammar ScientificNameClean
|
|
1158
1158
|
end
|
1159
1159
|
|
1160
1160
|
def pos
|
1161
|
-
{interval.begin => [
|
1161
|
+
{interval.begin => ["author_word", interval.end]}
|
1162
1162
|
end
|
1163
1163
|
|
1164
1164
|
def details
|
@@ -1177,7 +1177,7 @@ grammar ScientificNameClean
|
|
1177
1177
|
|
1178
1178
|
def pos
|
1179
1179
|
#cheating because there are several words in some of them
|
1180
|
-
{interval.begin => [
|
1180
|
+
{interval.begin => ["author_word", interval.end]}
|
1181
1181
|
end
|
1182
1182
|
}
|
1183
1183
|
end
|
@@ -1189,7 +1189,7 @@ grammar ScientificNameClean
|
|
1189
1189
|
end
|
1190
1190
|
|
1191
1191
|
def pos
|
1192
|
-
{interval.begin => [
|
1192
|
+
{interval.begin => ["author_word", interval.end]}
|
1193
1193
|
end
|
1194
1194
|
}
|
1195
1195
|
end
|
@@ -1217,7 +1217,7 @@ grammar ScientificNameClean
|
|
1217
1217
|
/
|
1218
1218
|
a:("AE"/"OE") b:latin_word {
|
1219
1219
|
def value
|
1220
|
-
a.text_value[0..0] +
|
1220
|
+
a.text_value[0..0] + "e" + b.value
|
1221
1221
|
end
|
1222
1222
|
}
|
1223
1223
|
/
|
@@ -1251,7 +1251,7 @@ grammar ScientificNameClean
|
|
1251
1251
|
end
|
1252
1252
|
|
1253
1253
|
def pos
|
1254
|
-
{b.interval.begin => [
|
1254
|
+
{b.interval.begin => ["species", b.interval.end]}
|
1255
1255
|
end
|
1256
1256
|
|
1257
1257
|
def details
|
@@ -1273,7 +1273,7 @@ grammar ScientificNameClean
|
|
1273
1273
|
end
|
1274
1274
|
|
1275
1275
|
def pos
|
1276
|
-
{b.interval.begin => [
|
1276
|
+
{b.interval.begin => ["species", b.interval.end]}
|
1277
1277
|
end
|
1278
1278
|
|
1279
1279
|
def details
|
@@ -1295,7 +1295,7 @@ grammar ScientificNameClean
|
|
1295
1295
|
end
|
1296
1296
|
|
1297
1297
|
def pos
|
1298
|
-
{b.interval.begin => [
|
1298
|
+
{b.interval.begin => ["species", b.interval.end]}
|
1299
1299
|
end
|
1300
1300
|
|
1301
1301
|
def details
|
@@ -1312,16 +1312,16 @@ grammar ScientificNameClean
|
|
1312
1312
|
end
|
1313
1313
|
|
1314
1314
|
def apply(sp)
|
1315
|
-
|
1315
|
+
""
|
1316
1316
|
end
|
1317
1317
|
|
1318
1318
|
def canonical(sp)
|
1319
|
-
|
1319
|
+
""
|
1320
1320
|
end
|
1321
1321
|
|
1322
1322
|
def pos(sp)
|
1323
|
-
interval_end = text_value[-1] ==
|
1324
|
-
{interval.begin => [
|
1323
|
+
interval_end = text_value[-1] == " " ? interval.end - 1 : interval.end
|
1324
|
+
{interval.begin => ["annotation_identification", interval.end]}
|
1325
1325
|
end
|
1326
1326
|
|
1327
1327
|
def details(sp)
|
@@ -1335,16 +1335,16 @@ grammar ScientificNameClean
|
|
1335
1335
|
end
|
1336
1336
|
|
1337
1337
|
def apply(sp)
|
1338
|
-
|
1338
|
+
" " + value + " " + sp.value
|
1339
1339
|
end
|
1340
1340
|
|
1341
1341
|
def canonical(sp)
|
1342
|
-
|
1342
|
+
" " + sp.canonical
|
1343
1343
|
end
|
1344
1344
|
|
1345
1345
|
def pos(sp)
|
1346
|
-
interval_end = text_value[-1] ==
|
1347
|
-
{interval.begin => [
|
1346
|
+
interval_end = text_value[-1] == " " ? interval.end - 1 : interval.end
|
1347
|
+
{interval.begin => ["annotation_identification", interval.end]}.merge(sp.pos)
|
1348
1348
|
end
|
1349
1349
|
|
1350
1350
|
def details(sp)
|
@@ -1372,12 +1372,18 @@ grammar ScientificNameClean
|
|
1372
1372
|
end
|
1373
1373
|
}
|
1374
1374
|
/
|
1375
|
-
"o
|
1375
|
+
"o'donelli" {
|
1376
1376
|
def value
|
1377
1377
|
"odonelli"
|
1378
1378
|
end
|
1379
1379
|
}
|
1380
1380
|
/
|
1381
|
+
"o'neili" {
|
1382
|
+
def value
|
1383
|
+
"oneili"
|
1384
|
+
end
|
1385
|
+
}
|
1386
|
+
/
|
1381
1387
|
a:valid_name_letter b:valid_name_letters {
|
1382
1388
|
def value
|
1383
1389
|
a.value + b.value
|
@@ -1388,13 +1394,13 @@ grammar ScientificNameClean
|
|
1388
1394
|
rule valid_name_letters
|
1389
1395
|
[a-zëæœ]+ {
|
1390
1396
|
def value
|
1391
|
-
res =
|
1392
|
-
text_value.split(
|
1393
|
-
l =
|
1394
|
-
l =
|
1397
|
+
res = ""
|
1398
|
+
text_value.split("").each do |l|
|
1399
|
+
l = "ae" if l == "æ"
|
1400
|
+
l = "oe" if l == "œ"
|
1395
1401
|
# We normalize ë as well. It is legal in botanical code, but it
|
1396
1402
|
# is beneficial to normalize it for the reconsiliation purposes
|
1397
|
-
l =
|
1403
|
+
l = "e" if l == "ë"
|
1398
1404
|
res << l
|
1399
1405
|
end
|
1400
1406
|
res
|
@@ -1406,9 +1412,9 @@ grammar ScientificNameClean
|
|
1406
1412
|
[a-zëæœ] {
|
1407
1413
|
def value
|
1408
1414
|
res = text_value
|
1409
|
-
res =
|
1410
|
-
res =
|
1411
|
-
res =
|
1415
|
+
res = "ae" if res == "æ"
|
1416
|
+
res = "oe" if res == "œ"
|
1417
|
+
res = "e" if res == "ë"
|
1412
1418
|
res
|
1413
1419
|
end
|
1414
1420
|
}
|
@@ -1418,13 +1424,13 @@ grammar ScientificNameClean
|
|
1418
1424
|
rule cap_digraph
|
1419
1425
|
"Æ" {
|
1420
1426
|
def value
|
1421
|
-
|
1427
|
+
"Ae"
|
1422
1428
|
end
|
1423
1429
|
}
|
1424
1430
|
/
|
1425
1431
|
"Œ" {
|
1426
1432
|
def value
|
1427
|
-
|
1433
|
+
"Oe"
|
1428
1434
|
end
|
1429
1435
|
}
|
1430
1436
|
end
|
@@ -1456,7 +1462,7 @@ grammar ScientificNameClean
|
|
1456
1462
|
end
|
1457
1463
|
|
1458
1464
|
def pos
|
1459
|
-
{interval.begin => [
|
1465
|
+
{interval.begin => ["year", interval.end]}
|
1460
1466
|
end
|
1461
1467
|
|
1462
1468
|
def details
|
@@ -1472,7 +1478,7 @@ grammar ScientificNameClean
|
|
1472
1478
|
end
|
1473
1479
|
|
1474
1480
|
def pos
|
1475
|
-
{interval.begin => [
|
1481
|
+
{interval.begin => ["year", interval.end]}
|
1476
1482
|
end
|
1477
1483
|
|
1478
1484
|
def details
|
@@ -27,21 +27,21 @@ module ScientificNameDirty
|
|
27
27
|
|
28
28
|
module Root1
|
29
29
|
def value
|
30
|
-
a.value.gsub(/\s{2,}/,
|
30
|
+
a.value.gsub(/\s{2,}/, " ").strip
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def canonical
|
34
|
-
a.canonical.gsub(/\s{2,}/,
|
34
|
+
a.canonical.gsub(/\s{2,}/, " ").strip
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def pos
|
38
38
|
a.pos
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def hybrid
|
42
42
|
a.hybrid
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def details
|
46
46
|
a.details.class == Array ? a.details : [a.details]
|
47
47
|
end
|
@@ -101,15 +101,15 @@ module ScientificNameDirty
|
|
101
101
|
def value
|
102
102
|
a.value
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
def canonical
|
106
106
|
a.canonical
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
def pos
|
110
110
|
a.pos
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
def details
|
114
114
|
a.details
|
115
115
|
end
|
@@ -333,15 +333,15 @@ module ScientificNameDirty
|
|
333
333
|
def value
|
334
334
|
a.value + " " + b.value
|
335
335
|
end
|
336
|
-
|
336
|
+
|
337
337
|
def canonical
|
338
338
|
a.canonical
|
339
339
|
end
|
340
|
-
|
340
|
+
|
341
341
|
def pos
|
342
342
|
a.pos.merge(b.pos)
|
343
343
|
end
|
344
|
-
|
344
|
+
|
345
345
|
def details
|
346
346
|
{:species => a.details[:species].merge(b.details)}
|
347
347
|
end
|
@@ -409,14 +409,14 @@ module ScientificNameDirty
|
|
409
409
|
|
410
410
|
module LatinWord1
|
411
411
|
def value
|
412
|
-
res =
|
413
|
-
text_value.split(
|
414
|
-
l =
|
415
|
-
l =
|
412
|
+
res = ""
|
413
|
+
text_value.split("").each do |l|
|
414
|
+
l = "ae" if l == "æ"
|
415
|
+
l = "oe" if l == "œ"
|
416
416
|
res << l
|
417
417
|
end
|
418
|
-
res.tr(
|
419
|
-
|
418
|
+
res.tr("àâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž",
|
419
|
+
"aaaaaacceeeiiinnnoooooouuurrrsssz")
|
420
420
|
end
|
421
421
|
end
|
422
422
|
|
@@ -460,14 +460,14 @@ module ScientificNameDirty
|
|
460
460
|
|
461
461
|
module ValidNameLetters0
|
462
462
|
def value
|
463
|
-
res =
|
464
|
-
text_value.split(
|
465
|
-
l =
|
466
|
-
l =
|
463
|
+
res = ""
|
464
|
+
text_value.split("").each do |l|
|
465
|
+
l = "ae" if l == "æ"
|
466
|
+
l = "oe" if l == "œ"
|
467
467
|
res << l
|
468
468
|
end
|
469
|
-
res.tr(
|
470
|
-
|
469
|
+
res.tr("àâåãäáçčëéèíìïňññóòôøõöúùüŕřŗššşž",
|
470
|
+
"aaaaaacceeeiiinnnoooooouuurrrsssz")
|
471
471
|
|
472
472
|
end
|
473
473
|
end
|
@@ -665,11 +665,11 @@ module ScientificNameDirty
|
|
665
665
|
def value
|
666
666
|
a.value + " " + b.value
|
667
667
|
end
|
668
|
-
|
668
|
+
|
669
669
|
def pos
|
670
670
|
a.pos.merge(b.pos)
|
671
671
|
end
|
672
|
-
|
672
|
+
|
673
673
|
def details
|
674
674
|
{:year => a.value, :approximate_year => b.value}
|
675
675
|
end
|
@@ -693,11 +693,11 @@ module ScientificNameDirty
|
|
693
693
|
def value
|
694
694
|
a.text_value
|
695
695
|
end
|
696
|
-
|
696
|
+
|
697
697
|
def pos
|
698
|
-
{a.interval.begin => [
|
698
|
+
{a.interval.begin => ["year", a.interval.end]}
|
699
699
|
end
|
700
|
-
|
700
|
+
|
701
701
|
def details
|
702
702
|
{:year => value}
|
703
703
|
end
|
@@ -814,11 +814,11 @@ module ScientificNameDirty
|
|
814
814
|
def value
|
815
815
|
"(" + a.text_value + ")"
|
816
816
|
end
|
817
|
-
|
817
|
+
|
818
818
|
def pos
|
819
|
-
{a.interval.begin => [
|
819
|
+
{a.interval.begin => ["year", a.interval.end]}
|
820
820
|
end
|
821
|
-
|
821
|
+
|
822
822
|
def details
|
823
823
|
{:approximate_year => value}
|
824
824
|
end
|
@@ -905,11 +905,11 @@ module ScientificNameDirty
|
|
905
905
|
def value
|
906
906
|
text_value
|
907
907
|
end
|
908
|
-
|
908
|
+
|
909
909
|
def pos
|
910
|
-
{interval.begin => [
|
910
|
+
{interval.begin => ["year", interval.end]}
|
911
911
|
end
|
912
|
-
|
912
|
+
|
913
913
|
def details
|
914
914
|
{:year => value}
|
915
915
|
end
|
@@ -1020,7 +1020,7 @@ module ScientificNameDirty
|
|
1020
1020
|
end
|
1021
1021
|
|
1022
1022
|
def pos
|
1023
|
-
{interval.begin => [
|
1023
|
+
{interval.begin => ["year", interval.end]}
|
1024
1024
|
end
|
1025
1025
|
|
1026
1026
|
def details
|