stanford-mods 3.0.0.alpha1 → 3.2.0
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.
- checksums.yaml +4 -4
- data/lib/stanford-mods/concerns/name.rb +1 -1
- data/lib/stanford-mods/concerns/origin_info.rb +10 -6
- data/lib/stanford-mods/concerns/title.rb +34 -26
- data/lib/stanford-mods/coordinate.rb +5 -2
- data/lib/stanford-mods/date_parsing.rb +4 -4
- data/lib/stanford-mods/imprint.rb +44 -19
- data/lib/stanford-mods/version.rb +1 -1
- data/spec/fixtures/searchworks_imprint_data.rb +11 -11
- data/spec/fixtures/searchworks_pub_date_data.rb +14 -14
- data/spec/fixtures/spotlight_pub_date_data.rb +3 -3
- data/spec/imprint_spec.rb +35 -10
- data/spec/lib/stanford-mods/coordinate_spec.rb +3 -5
- data/spec/origin_info_spec.rb +2 -2
- data/spec/searchworks_title_spec.rb +4 -4
- data/stanford-mods.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57865ef64be3774919a58f9771243fb7f5090b09867fae098d3fa5ae6e2523cf
|
4
|
+
data.tar.gz: 1a09641f450a3739c9c61598ec4ad7a4f1f7b410c804d12df6d50530fb249cb7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c86f9171a032d1349068b43f6cf1272fbdf4a24419a58f66040132d7de2ea745853707b803608ea3344a137e544eff0e7e291a7b9c3922c09fe0568c68409a5e
|
7
|
+
data.tar.gz: d031a52bb328ae6efa0e42e7050fc4f990295509e4ee0a4b4c1f93f51b2412049b16c87091f27b95a02ed95be1278ccd5cbcc11771f59272bf77f82d73bd3bb2
|
@@ -25,7 +25,7 @@ module Stanford
|
|
25
25
|
|
26
26
|
# @return [Array<String>] values for author_person_facet, author_person_display
|
27
27
|
def sw_person_authors
|
28
|
-
mods_ng_xml.
|
28
|
+
mods_ng_xml.personal_name.map(&:display_value_w_date)
|
29
29
|
end
|
30
30
|
|
31
31
|
# return the display_value_w_date for all <mods><name> elements that do not have type='personal'
|
@@ -15,7 +15,7 @@ module Stanford
|
|
15
15
|
# look for a keyDate and use it if there is one; otherwise pick earliest date
|
16
16
|
# @param [Boolean] ignore_approximate true if approximate dates (per qualifier attribute) should be ignored; false if approximate dates should be included
|
17
17
|
# @return [Integer] publication year as an Integer
|
18
|
-
# @note for sorting: 5
|
18
|
+
# @note for sorting: 5 BCE => -5; 666 BCE => -666
|
19
19
|
def pub_year_int(fields = [:dateIssued, :dateCreated, :dateCaptured], ignore_approximate: false)
|
20
20
|
fields.each do |date_key|
|
21
21
|
values = mods_ng_xml.origin_info.send(date_key)
|
@@ -31,7 +31,7 @@ module Stanford
|
|
31
31
|
# look for a keyDate and use it if there is one; otherwise pick earliest date
|
32
32
|
# @param [Boolean] ignore_approximate true if approximate dates (per qualifier attribute) should be ignored; false if approximate dates should be included
|
33
33
|
# @return [String] single String containing publication year for lexical sorting
|
34
|
-
# @note for string sorting 5
|
34
|
+
# @note for string sorting 5 BCE = -5 => -995; 6 BCE => -994, so 6 BCE sorts before 5 BCE
|
35
35
|
# @deprecated use pub_year_int
|
36
36
|
def pub_year_sort_str(fields = [:dateIssued, :dateCreated, :dateCaptured], ignore_approximate: false)
|
37
37
|
fields.each do |date_key|
|
@@ -44,12 +44,12 @@ module Stanford
|
|
44
44
|
end
|
45
45
|
|
46
46
|
# return a single string intended for display of pub year
|
47
|
-
# 0 < year < 1000: add
|
48
|
-
# year < 0: add
|
47
|
+
# 0 < year < 1000: add CE suffix
|
48
|
+
# year < 0: add BCE suffix. ('-5' => '5 BCE', '700 BCE' => '700 BCE')
|
49
49
|
# 195u => 195x
|
50
50
|
# 19uu => 19xx
|
51
|
-
# '-5' => '5
|
52
|
-
# '700
|
51
|
+
# '-5' => '5 BCE'
|
52
|
+
# '700 BCE' => '700 BCE'
|
53
53
|
# '7th century' => '7th century'
|
54
54
|
# date ranges?
|
55
55
|
# prefer dateIssued (any) before dateCreated (any) before dateCaptured (any)
|
@@ -72,6 +72,10 @@ module Stanford
|
|
72
72
|
origin_info.map { |el| Stanford::Mods::Imprint.new(el) }
|
73
73
|
end
|
74
74
|
|
75
|
+
def place
|
76
|
+
term_values([:origin_info, :place, :placeTerm])
|
77
|
+
end
|
78
|
+
|
75
79
|
# @return [String] single String containing imprint information for display
|
76
80
|
def imprint_display_str
|
77
81
|
imprints.map(&:display_str).reject(&:empty?).join('; ')
|
@@ -9,41 +9,49 @@ module Stanford
|
|
9
9
|
# Searchworks requires that the MODS has a '//titleInfo/title'
|
10
10
|
# @return [String] value for title_245_search, title_full_display
|
11
11
|
def sw_full_title(title_info = first_title_info_node, sortable: false)
|
12
|
-
return unless title_info
|
12
|
+
return unless title_info&.children&.any?
|
13
13
|
|
14
14
|
title = title_info.title&.text&.strip
|
15
|
-
|
16
15
|
return if title.nil? || title.empty?
|
17
16
|
|
18
|
-
|
17
|
+
title = ''
|
18
|
+
previous_element = nil
|
19
|
+
|
20
|
+
title_info.children.select { |value| title_parts.include? value.name }.each do |value|
|
21
|
+
next if value.name == 'nonSort' && sortable
|
19
22
|
|
20
|
-
|
23
|
+
str = value.text.strip
|
24
|
+
next if str.empty?
|
21
25
|
|
22
|
-
|
26
|
+
delimiter = if title.empty? || title.end_with?(' ')
|
27
|
+
nil
|
28
|
+
elsif previous_element&.name == 'nonSort' && title.end_with?('-', '\'')
|
29
|
+
nil
|
30
|
+
elsif title.end_with?('.', ',', ':', ';')
|
31
|
+
' '
|
32
|
+
elsif value.name == 'subTitle'
|
33
|
+
' : '
|
34
|
+
elsif value.name == 'partName' && previous_element.name == 'partNumber'
|
35
|
+
', '
|
36
|
+
elsif value.name == 'partNumber' || value.name == 'partName'
|
37
|
+
'. '
|
38
|
+
else
|
39
|
+
' '
|
40
|
+
end
|
23
41
|
|
24
|
-
|
25
|
-
|
26
|
-
preParts.sub!(/\.$/, '') if preParts # remove trailing period
|
42
|
+
title += delimiter if delimiter
|
43
|
+
title += str
|
27
44
|
|
28
|
-
|
29
|
-
partNumber = title_info.partNumber.text.strip unless title_info.partNumber.text.strip.empty?
|
30
|
-
partNumber.sub!(/,$/, '') if partNumber # remove trailing comma
|
31
|
-
if partNumber && partName
|
32
|
-
parts = partNumber + ", " + partName
|
33
|
-
elsif partNumber
|
34
|
-
parts = partNumber
|
35
|
-
elsif partName
|
36
|
-
parts = partName
|
45
|
+
previous_element = value
|
37
46
|
end
|
38
|
-
parts.sub!(/\.$/, '') if parts
|
39
47
|
|
40
|
-
|
41
|
-
|
48
|
+
title += "." unless title =~ /\s*[[:punct:]]$/
|
49
|
+
|
50
|
+
title.strip
|
51
|
+
end
|
42
52
|
|
43
|
-
|
44
|
-
|
45
|
-
result = nil if result.empty?
|
46
|
-
result
|
53
|
+
def title_parts
|
54
|
+
%w[nonSort title subTitle partName partNumber]
|
47
55
|
end
|
48
56
|
|
49
57
|
# like sw_full_title without trailing \,/;:.
|
@@ -57,7 +65,7 @@ module Stanford
|
|
57
65
|
# this includes all titles except
|
58
66
|
# @return [Array<String>] values for title_variant_search
|
59
67
|
def sw_addl_titles
|
60
|
-
(full_titles - first_title_info_node
|
68
|
+
(full_titles - Array(first_title_info_node&.full_title)).reject(&:blank?)
|
61
69
|
end
|
62
70
|
|
63
71
|
# Returns a sortable version of the main title
|
@@ -76,4 +84,4 @@ module Stanford
|
|
76
84
|
end
|
77
85
|
end
|
78
86
|
end
|
79
|
-
end
|
87
|
+
end
|
@@ -65,11 +65,14 @@ module Stanford
|
|
65
65
|
# @param [String] point coordinate point in degrees notation
|
66
66
|
# @return [Float] converted value in decimal notation
|
67
67
|
def coord_to_decimal(point)
|
68
|
-
regex =
|
68
|
+
regex = Regexp.union(
|
69
|
+
/(?<dir>[NESW])\s*(?<deg>\d+)[°⁰º](?:(?<min>\d+)[ʹ'])?(?:(?<sec>\d+)[ʺ"])?/,
|
70
|
+
/^\s*(?<dir>[NESW])\s*(?<deg>\d+(?:[.]\d+)?)\s*$/
|
71
|
+
)
|
69
72
|
match = regex.match(point)
|
70
73
|
return Float::INFINITY unless match
|
71
74
|
|
72
|
-
dec = match['deg'].
|
75
|
+
dec = match['deg'].to_f
|
73
76
|
dec += match['min'].to_f / 60
|
74
77
|
dec += match['sec'].to_f / 60 / 60
|
75
78
|
dec = -1 * dec if match['dir'] == 'W' || match['dir'] == 'S'
|
@@ -15,7 +15,7 @@ module Stanford
|
|
15
15
|
@xml = xml
|
16
16
|
end
|
17
17
|
|
18
|
-
# get display value for year, generally an explicit year or "17th century" or "5
|
18
|
+
# get display value for year, generally an explicit year or "17th century" or "5 BCE" or "1950s" or '845 CE'
|
19
19
|
# @return [String, nil] String value for year if we could parse one, nil otherwise
|
20
20
|
def date_str_for_display
|
21
21
|
date = xml&.as_object&.date
|
@@ -32,9 +32,9 @@ module Stanford
|
|
32
32
|
if !self.class.year_int_valid? date.year
|
33
33
|
xml.text
|
34
34
|
elsif date.year < 1
|
35
|
-
"#{date.year.abs + 1}
|
35
|
+
"#{date.year.abs + 1} BCE"
|
36
36
|
elsif date.year < 1000
|
37
|
-
"#{date.year}
|
37
|
+
"#{date.year} CE"
|
38
38
|
else
|
39
39
|
date.year.to_s
|
40
40
|
end
|
@@ -49,7 +49,7 @@ module Stanford
|
|
49
49
|
|
50
50
|
# get String sortable value year if we can parse date_str to get a year.
|
51
51
|
# SearchWorks currently uses a string field for pub date sorting; thus so does Spotlight.
|
52
|
-
# The values returned must *lexically* sort in chronological order, so the
|
52
|
+
# The values returned must *lexically* sort in chronological order, so the BCE dates are tricky
|
53
53
|
# @return [String, nil] String sortable year if we could parse one, nil otherwise
|
54
54
|
# note that these values must *lexically* sort to create a chronological sort.
|
55
55
|
def sortable_year_string_from_date_str
|
@@ -149,7 +149,7 @@ module Stanford
|
|
149
149
|
end
|
150
150
|
|
151
151
|
# Element text reduced to digits and hyphen. Captures date ranges and
|
152
|
-
# negative (
|
152
|
+
# negative (BCE) dates. Used for comparison/deduping.
|
153
153
|
def base_value
|
154
154
|
if text =~ /^\[?1\d{3}-\d{2}\??\]?$/
|
155
155
|
return text.sub(/(\d{2})(\d{2})-(\d{2})/, '\1\2-\1\3')
|
@@ -166,8 +166,26 @@ module Stanford
|
|
166
166
|
return text.strip unless text =~ /^-?\d+$/ || text =~ /^[\dXxu?-]{4}$/
|
167
167
|
end
|
168
168
|
|
169
|
-
|
170
|
-
|
169
|
+
if date.is_a?(EDTF::Interval)
|
170
|
+
if value.precision == :century || value.precision == :decade
|
171
|
+
return format_date(date, value.precision)
|
172
|
+
end
|
173
|
+
|
174
|
+
range = [
|
175
|
+
format_date(date.min, date.min.precision),
|
176
|
+
format_date(date.max, date.max.precision)
|
177
|
+
].uniq.compact
|
178
|
+
|
179
|
+
return text.strip if range.empty?
|
180
|
+
|
181
|
+
range.join(' - ')
|
182
|
+
else
|
183
|
+
format_date(date, value.precision) || text.strip
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def format_date(date, precision)
|
188
|
+
case precision
|
171
189
|
when :day
|
172
190
|
date.strftime('%B %e, %Y')
|
173
191
|
when :month
|
@@ -175,32 +193,39 @@ module Stanford
|
|
175
193
|
when :year
|
176
194
|
year = date.year
|
177
195
|
if year < 1
|
178
|
-
"#{year.abs + 1}
|
179
|
-
# Any dates before the year 1000 are explicitly marked
|
196
|
+
"#{year.abs + 1} BCE"
|
197
|
+
# Any dates before the year 1000 are explicitly marked CE
|
180
198
|
elsif year > 1 && year < 1000
|
181
|
-
"#{year}
|
199
|
+
"#{year} CE"
|
182
200
|
else
|
183
201
|
year.to_s
|
184
202
|
end
|
185
203
|
when :century
|
186
|
-
|
204
|
+
if date.year.negative?
|
205
|
+
"#{((date.year / 100).abs + 1).ordinalize} century BCE"
|
206
|
+
else
|
207
|
+
"#{((date.year / 100) + 1).ordinalize} century"
|
208
|
+
end
|
187
209
|
when :decade
|
188
|
-
|
189
|
-
else
|
190
|
-
text.strip
|
210
|
+
"#{date.year}s"
|
191
211
|
end
|
192
212
|
end
|
193
213
|
|
194
|
-
# Decoded date with "
|
214
|
+
# Decoded date with "BCE" or "CE" and qualifier markers. See (outdated):
|
195
215
|
# https://consul.stanford.edu/display/chimera/MODS+display+rules#MODSdisplayrules-3b.%3CoriginInfo%3E
|
196
216
|
def qualified_value
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
217
|
+
qualified_format = case qualifier
|
218
|
+
when 'approximate'
|
219
|
+
'[ca. %s]'
|
220
|
+
when 'questionable'
|
221
|
+
'[%s?]'
|
222
|
+
when 'inferred'
|
223
|
+
'[%s]'
|
224
|
+
else
|
225
|
+
'%s'
|
226
|
+
end
|
202
227
|
|
203
|
-
|
228
|
+
format(qualified_format, decoded_value)
|
204
229
|
end
|
205
230
|
end
|
206
231
|
|
@@ -225,7 +250,7 @@ module Stanford
|
|
225
250
|
@start&.encoding || @stop&.encoding
|
226
251
|
end
|
227
252
|
|
228
|
-
# Decoded dates with "
|
253
|
+
# Decoded dates with "BCE" or "CE" and qualifier markers applied to
|
229
254
|
# the entire range, or individually if dates differ.
|
230
255
|
def qualified_value
|
231
256
|
if @start&.qualifier == @stop&.qualifier
|
@@ -281,7 +306,7 @@ module Stanford
|
|
281
306
|
|
282
307
|
dates = dates - duplicated_ranges
|
283
308
|
|
284
|
-
# output formatted dates with qualifiers,
|
309
|
+
# output formatted dates with qualifiers, CE/BCE, etc.
|
285
310
|
dates.map(&:qualified_value)
|
286
311
|
end
|
287
312
|
end
|
@@ -700,7 +700,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
700
700
|
<dateIssued encoding="marc" point="start" keyDate="yes">0850</dateIssued>
|
701
701
|
<dateIssued encoding="marc" point="end">1499</dateIssued>
|
702
702
|
<issuance>monographic</issuance>' +
|
703
|
-
mods_origin_info_end_str => 'California, 850
|
703
|
+
mods_origin_info_end_str => 'California, 850 CE - 1499',
|
704
704
|
# coll rec bd001pp3337
|
705
705
|
# coll rec fn508pj9953
|
706
706
|
mods_origin_info_start_str +
|
@@ -728,7 +728,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
728
728
|
<dateCreated point="start" qualifier="approximate" keyDate="yes">850</dateCreated>
|
729
729
|
<dateCreated point="end" qualifier="approximate">1499</dateCreated>
|
730
730
|
<issuance>monographic</issuance>' +
|
731
|
-
mods_origin_info_end_str => 'England, [ca. 850
|
731
|
+
mods_origin_info_end_str => 'England, [ca. 850 CE - 1499]',
|
732
732
|
# sc582cv9633
|
733
733
|
mods_origin_info_start_str +
|
734
734
|
'<dateCreated keydate="yes">1314</dateCreated>
|
@@ -1055,7 +1055,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1055
1055
|
<originInfo>
|
1056
1056
|
<dateCreated encoding="edtf" point="start" keyDate="yes">-18</dateCreated>
|
1057
1057
|
<dateCreated encoding="edtf" point="end">-17</dateCreated>' +
|
1058
|
-
mods_origin_info_end_str => 'Spain; 19
|
1058
|
+
mods_origin_info_end_str => 'Spain; 19 BCE - 18 BCE',
|
1059
1059
|
# bb408km1389
|
1060
1060
|
mods_origin_info_start_str +
|
1061
1061
|
' <place supplied="yes">
|
@@ -1065,7 +1065,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1065
1065
|
<originInfo>
|
1066
1066
|
<dateCreated encoding="edtf" point="start" keyDate="yes">-1</dateCreated>
|
1067
1067
|
<dateCreated encoding="edtf" point="end">11</dateCreated>' +
|
1068
|
-
mods_origin_info_end_str => 'Lyon (France); 2
|
1068
|
+
mods_origin_info_end_str => 'Lyon (France); 2 BCE - 11 CE',
|
1069
1069
|
# cs470ng8064
|
1070
1070
|
mods_origin_info_start_str +
|
1071
1071
|
' <place supplied="yes">
|
@@ -1075,7 +1075,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1075
1075
|
<originInfo>
|
1076
1076
|
<dateCreated encoding="edtf" point="start" keyDate="yes">-1</dateCreated>
|
1077
1077
|
<dateCreated encoding="edtf" point="end">0</dateCreated>' +
|
1078
|
-
mods_origin_info_end_str => 'Antioch (Turkey) (?); 2
|
1078
|
+
mods_origin_info_end_str => 'Antioch (Turkey) (?); 2 BCE - 1 BCE',
|
1079
1079
|
# vh834jh5059
|
1080
1080
|
mods_origin_info_start_str +
|
1081
1081
|
' <place supplied="yes">
|
@@ -1085,7 +1085,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1085
1085
|
<originInfo>
|
1086
1086
|
<dateCreated encoding="edtf" point="start" keyDate="yes">13</dateCreated>
|
1087
1087
|
<dateCreated encoding="edtf" point="end">14</dateCreated>' +
|
1088
|
-
mods_origin_info_end_str => 'Lyon (France); 13
|
1088
|
+
mods_origin_info_end_str => 'Lyon (France); 13 CE - 14 CE',
|
1089
1089
|
# sk424bh9379
|
1090
1090
|
mods_origin_info_start_str +
|
1091
1091
|
' <place supplied="yes">
|
@@ -1095,7 +1095,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1095
1095
|
<originInfo>
|
1096
1096
|
<dateCreated encoding="edtf" point="start" keyDate="yes">34</dateCreated>
|
1097
1097
|
<dateCreated encoding="edtf" point="end">35</dateCreated>' +
|
1098
|
-
mods_origin_info_end_str => 'Alexandria (Egypt); 34
|
1098
|
+
mods_origin_info_end_str => 'Alexandria (Egypt); 34 CE - 35 CE'
|
1099
1099
|
},
|
1100
1100
|
# rigler
|
1101
1101
|
'rumsey' =>
|
@@ -1235,7 +1235,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1235
1235
|
'<dateIssued encoding="marc" point="start">800</dateIssued>
|
1236
1236
|
<dateIssued encoding="marc" point="end">1899</dateIssued>
|
1237
1237
|
<issuance>monographic</issuance>' +
|
1238
|
-
mods_origin_info_end_str => '800
|
1238
|
+
mods_origin_info_end_str => '800 CE - 1899',
|
1239
1239
|
# dc882bs3541
|
1240
1240
|
mods_origin_info_start_str +
|
1241
1241
|
'<place>
|
@@ -1245,7 +1245,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1245
1245
|
<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">0799</dateCreated>
|
1246
1246
|
<dateCreated encoding="w3cdtf" keyDate="yes"/>
|
1247
1247
|
<issuance>monographic</issuance>' +
|
1248
|
-
mods_origin_info_end_str => 'Egypt, [ca. 700
|
1248
|
+
mods_origin_info_end_str => 'Egypt, [ca. 700 CE - 799 CE]',
|
1249
1249
|
# hg026ds6978
|
1250
1250
|
mods_origin_info_start_str +
|
1251
1251
|
'<place>
|
@@ -1253,7 +1253,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1253
1253
|
</place>
|
1254
1254
|
<dateCreated encoding="w3cdtf" keyDate="yes">0816</dateCreated>
|
1255
1255
|
<issuance>monographic</issuance>' +
|
1256
|
-
mods_origin_info_end_str => 'Central Arab lands, 816
|
1256
|
+
mods_origin_info_end_str => 'Central Arab lands, 816 CE',
|
1257
1257
|
# ch617yk2621
|
1258
1258
|
mods_origin_info_start_str +
|
1259
1259
|
'<place>
|
@@ -1273,7 +1273,7 @@ SEARCHWORKS_IMPRINT_DATA = {
|
|
1273
1273
|
<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">1000</dateCreated>
|
1274
1274
|
<dateCreated encoding="w3cdtf" keyDate="yes"/>
|
1275
1275
|
<issuance>monographic</issuance>' +
|
1276
|
-
mods_origin_info_end_str => 'Byzantine Empire, [ca. 950
|
1276
|
+
mods_origin_info_end_str => 'Byzantine Empire, [ca. 950 CE - 1000]',
|
1277
1277
|
# hj537kj5737
|
1278
1278
|
mods_origin_info_start_str +
|
1279
1279
|
'<dateIssued>15th century CE</dateIssued>
|
@@ -607,7 +607,7 @@ SEARCHWORKS_PUB_DATE_DATA = {
|
|
607
607
|
mods_origin_info_start_str +
|
608
608
|
'<dateIssued encoding="marc" point="start" keyDate="yes">0850</dateIssued>' +
|
609
609
|
'<dateIssued encoding="marc" point="end">1499</dateIssued>' +
|
610
|
-
mods_origin_info_end_str => [850, '850
|
610
|
+
mods_origin_info_end_str => [850, '850 CE - 1499'],
|
611
611
|
# coll rec bd001pp3337
|
612
612
|
mods_origin_info_start_str +
|
613
613
|
'<dateIssued encoding="marc" keyDate="yes" point="start">1000</dateIssued>' +
|
@@ -637,7 +637,7 @@ SEARCHWORKS_PUB_DATE_DATA = {
|
|
637
637
|
mods_origin_info_start_str +
|
638
638
|
'<dateCreated point="start" qualifier="approximate" keyDate="yes">850</dateCreated>' +
|
639
639
|
'<dateCreated point="end" qualifier="approximate">1499</dateCreated>' +
|
640
|
-
mods_origin_info_end_str => [850, '850
|
640
|
+
mods_origin_info_end_str => [850, '850 CE - 1499'],
|
641
641
|
# sc582cv9633
|
642
642
|
mods_origin_info_start_str +
|
643
643
|
'<dateCreated keydate="yes">1314</dateCreated>' +
|
@@ -722,12 +722,12 @@ SEARCHWORKS_PUB_DATE_DATA = {
|
|
722
722
|
mods_origin_info_start_str +
|
723
723
|
'<dateCreated keyDate="yes" point="start" qualifier="approximate">199 B.C.</dateCreated>' +
|
724
724
|
'<dateCreated keyDate="yes" point="end" qualifier="approximate">100 B.C.</dateCreated>' +
|
725
|
-
mods_origin_info_end_str => [-198, '199
|
725
|
+
mods_origin_info_end_str => [-198, '199 BCE - 100 BCE'],
|
726
726
|
# ww728rz0477
|
727
727
|
mods_origin_info_start_str +
|
728
728
|
'<dateCreated keyDate="yes" point="start" qualifier="approximate">211 B.C.</dateCreated>' +
|
729
729
|
'<dateCreated keyDate="yes" point="end" qualifier="approximate">150 B.C.</dateCreated>' +
|
730
|
-
mods_origin_info_end_str => [-210, '211
|
730
|
+
mods_origin_info_end_str => [-210, '211 BCE - 150 BCE']
|
731
731
|
},
|
732
732
|
# pcc
|
733
733
|
# peace
|
@@ -796,27 +796,27 @@ SEARCHWORKS_PUB_DATE_DATA = {
|
|
796
796
|
mods_origin_info_start_str +
|
797
797
|
'<dateCreated encoding="edtf" point="start" keyDate="yes">-18</dateCreated>' +
|
798
798
|
'<dateCreated encoding="edtf" point="end">-17</dateCreated>' +
|
799
|
-
mods_origin_info_end_str => [-18, '19
|
799
|
+
mods_origin_info_end_str => [-18, '19 BCE - 17 BCE'],
|
800
800
|
# bb408km1389
|
801
801
|
mods_origin_info_start_str +
|
802
802
|
'<dateCreated encoding="edtf" point="start" keyDate="yes">-1</dateCreated>' +
|
803
803
|
'<dateCreated encoding="edtf" point="end">11</dateCreated>' +
|
804
|
-
mods_origin_info_end_str => [-1, '2
|
804
|
+
mods_origin_info_end_str => [-1, '2 BCE - 11 CE'],
|
805
805
|
# cs470ng8064
|
806
806
|
mods_origin_info_start_str +
|
807
807
|
'<dateCreated encoding="edtf" point="start" keyDate="yes">-1</dateCreated>' +
|
808
808
|
'<dateCreated encoding="edtf" point="end">0</dateCreated>' +
|
809
|
-
mods_origin_info_end_str => [-1, '2
|
809
|
+
mods_origin_info_end_str => [-1, '2 BCE - 0 CE'],
|
810
810
|
# vh834jh5059
|
811
811
|
mods_origin_info_start_str +
|
812
812
|
'<dateCreated encoding="edtf" point="start" keyDate="yes">13</dateCreated>' +
|
813
813
|
'<dateCreated encoding="edtf" point="end">14</dateCreated>' +
|
814
|
-
mods_origin_info_end_str => [13, '13
|
814
|
+
mods_origin_info_end_str => [13, '13 CE - 14 CE'],
|
815
815
|
# sk424bh9379
|
816
816
|
mods_origin_info_start_str +
|
817
817
|
'<dateCreated encoding="edtf" point="start" keyDate="yes">34</dateCreated>' +
|
818
818
|
'<dateCreated encoding="edtf" point="end">35</dateCreated>' +
|
819
|
-
mods_origin_info_end_str => [34, '34
|
819
|
+
mods_origin_info_end_str => [34, '34 CE - 35 CE']
|
820
820
|
},
|
821
821
|
# rigler
|
822
822
|
# rumsey
|
@@ -931,23 +931,23 @@ SEARCHWORKS_PUB_DATE_DATA = {
|
|
931
931
|
mods_origin_info_start_str +
|
932
932
|
'<dateIssued encoding="marc" point="start">800</dateIssued>' +
|
933
933
|
'<dateIssued encoding="marc" point="start">1899</dateIssued>' +
|
934
|
-
mods_origin_info_end_str => [800, '800
|
934
|
+
mods_origin_info_end_str => [800, '800 CE'],
|
935
935
|
# dc882bs3541
|
936
936
|
mods_origin_info_start_str +
|
937
937
|
'<dateCreated encoding="w3cdtf" point="start" qualifier="approximate" keyDate="yes">0700</dateCreated>' +
|
938
938
|
'<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">0799</dateCreated>' +
|
939
939
|
'<dateCreated encoding="w3cdtf" keyDate="yes"/>' +
|
940
|
-
mods_origin_info_end_str => [700, '700
|
940
|
+
mods_origin_info_end_str => [700, '700 CE - 799 CE'],
|
941
941
|
# hg026ds6978
|
942
942
|
mods_origin_info_start_str +
|
943
943
|
'<dateCreated encoding="w3cdtf" keyDate="yes">0816</dateCreated>' +
|
944
|
-
mods_origin_info_end_str => [816, '816
|
944
|
+
mods_origin_info_end_str => [816, '816 CE'],
|
945
945
|
# ct437ht0445
|
946
946
|
mods_origin_info_start_str +
|
947
947
|
'<dateCreated encoding="w3cdtf" keyDate="yes" point="start" qualifier="approximate">0900</dateCreated>' +
|
948
948
|
'<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">0999</dateCreated>' +
|
949
949
|
'<dateCreated encoding="w3cdtf" keyDate="yes"/>' +
|
950
|
-
mods_origin_info_end_str => [900, '900
|
950
|
+
mods_origin_info_end_str => [900, '900 CE - 999 CE'],
|
951
951
|
# ch617yk2621
|
952
952
|
mods_origin_info_start_str +
|
953
953
|
'<dateCreated encoding="w3cdtf" keyDate="yes" point="start" qualifier="approximate">1000</dateCreated>' +
|
@@ -959,7 +959,7 @@ SEARCHWORKS_PUB_DATE_DATA = {
|
|
959
959
|
'<dateCreated encoding="w3cdtf" keyDate="yes" point="start" qualifier="approximate">0950</dateCreated>' +
|
960
960
|
'<dateCreated encoding="w3cdtf" point="end" qualifier="approximate">1000</dateCreated>' +
|
961
961
|
'<dateCreated encoding="w3cdtf" keyDate="yes"/>' +
|
962
|
-
mods_origin_info_end_str => [950, '950
|
962
|
+
mods_origin_info_end_str => [950, '950 CE - 1000'],
|
963
963
|
# hj537kj5737
|
964
964
|
mods_origin_info_start_str +
|
965
965
|
'<dateIssued>15th century CE</dateIssued>' +
|
@@ -156,7 +156,7 @@ SPOTLIGHT_PUB_DATE_DATA = {
|
|
156
156
|
mods_origin_info_start_str +
|
157
157
|
'<dateIssued encoding="marc" point="start" keyDate="yes">0850</dateIssued>' +
|
158
158
|
'<dateIssued encoding="marc" point="end">1499</dateIssued>' +
|
159
|
-
mods_origin_info_end_str => ['0850', '850
|
159
|
+
mods_origin_info_end_str => ['0850', '850 CE'],
|
160
160
|
# nc881qb8504
|
161
161
|
mods_origin_info_start_str +
|
162
162
|
'<dateCreated point="start" qualifier="approximate" keyDate="yes">1000</dateCreated>' +
|
@@ -236,12 +236,12 @@ SPOTLIGHT_PUB_DATE_DATA = {
|
|
236
236
|
mods_origin_info_start_str +
|
237
237
|
'<dateCreated keyDate="yes" point="start" qualifier="approximate">200 B.C.</dateCreated>' +
|
238
238
|
'<dateCreated keyDate="yes" point="end" qualifier="approximate">180 B.C.</dateCreated>' +
|
239
|
-
mods_origin_info_end_str => ['-801', '200
|
239
|
+
mods_origin_info_end_str => ['-801', '200 BCE'],
|
240
240
|
# ww728rz0477
|
241
241
|
mods_origin_info_start_str +
|
242
242
|
'<dateCreated keyDate="yes" point="start" qualifier="approximate">211 B.C.</dateCreated>' +
|
243
243
|
'<dateCreated keyDate="yes" point="end" qualifier="approximate">150 B.C.</dateCreated>' +
|
244
|
-
mods_origin_info_end_str => ['-790', '211
|
244
|
+
mods_origin_info_end_str => ['-790', '211 BCE']
|
245
245
|
},
|
246
246
|
'renaissance' =>
|
247
247
|
{ # key is mods_xml; values = [pub date sortable facet value, pub date single string facet value]
|
data/spec/imprint_spec.rb
CHANGED
@@ -108,7 +108,7 @@ describe Stanford::Mods::Imprint do
|
|
108
108
|
it 'presents centuries' do
|
109
109
|
smods_rec.from_str <<-XML
|
110
110
|
#{mods_origin_info_start_str}
|
111
|
-
<dateIssued encoding="edtf">
|
111
|
+
<dateIssued encoding="edtf">18xx</dateIssued>
|
112
112
|
#{mods_origin_info_end_str}
|
113
113
|
XML
|
114
114
|
|
@@ -120,7 +120,7 @@ describe Stanford::Mods::Imprint do
|
|
120
120
|
it 'presents decades' do
|
121
121
|
smods_rec.from_str <<-XML
|
122
122
|
#{mods_origin_info_start_str}
|
123
|
-
<dateIssued encoding="edtf">
|
123
|
+
<dateIssued encoding="edtf">147x</dateIssued>
|
124
124
|
#{mods_origin_info_end_str}
|
125
125
|
XML
|
126
126
|
|
@@ -129,7 +129,7 @@ describe Stanford::Mods::Imprint do
|
|
129
129
|
expect(updated_element).to eq '1470s'
|
130
130
|
end
|
131
131
|
|
132
|
-
it 'adds
|
132
|
+
it 'adds CE to early years' do
|
133
133
|
smods_rec.from_str <<-XML
|
134
134
|
#{mods_origin_info_start_str}
|
135
135
|
<dateIssued encoding="edtf">988</dateIssued>
|
@@ -138,10 +138,10 @@ describe Stanford::Mods::Imprint do
|
|
138
138
|
|
139
139
|
imp = stanford_mods_imprint(smods_rec)
|
140
140
|
updated_element = imp.send(:date_str)
|
141
|
-
expect(updated_element).to eq '988
|
141
|
+
expect(updated_element).to eq '988 CE'
|
142
142
|
end
|
143
143
|
|
144
|
-
it 'adds
|
144
|
+
it 'adds BCE to BCE years' do
|
145
145
|
smods_rec.from_str <<-XML
|
146
146
|
#{mods_origin_info_start_str}
|
147
147
|
<dateIssued encoding="edtf">-5</dateIssued>
|
@@ -150,10 +150,10 @@ describe Stanford::Mods::Imprint do
|
|
150
150
|
|
151
151
|
imp = stanford_mods_imprint(smods_rec)
|
152
152
|
updated_element = imp.send(:date_str)
|
153
|
-
expect(updated_element).to eq '6
|
153
|
+
expect(updated_element).to eq '6 BCE'
|
154
154
|
end
|
155
155
|
|
156
|
-
it 'has special handling for the year 0 (1
|
156
|
+
it 'has special handling for the year 0 (1 BCE)' do
|
157
157
|
smods_rec.from_str <<-XML
|
158
158
|
#{mods_origin_info_start_str}
|
159
159
|
<dateIssued>0</dateIssued>
|
@@ -162,7 +162,7 @@ describe Stanford::Mods::Imprint do
|
|
162
162
|
|
163
163
|
imp = stanford_mods_imprint(smods_rec)
|
164
164
|
updated_element = imp.send(:date_str)
|
165
|
-
expect(updated_element).to eq '1
|
165
|
+
expect(updated_element).to eq '1 BCE'
|
166
166
|
end
|
167
167
|
|
168
168
|
it 'presents years + months' do
|
@@ -189,6 +189,31 @@ describe Stanford::Mods::Imprint do
|
|
189
189
|
expect(updated_element).to eq 'April 2, 1948'
|
190
190
|
end
|
191
191
|
|
192
|
+
it 'handles very precise EDTF ranges' do
|
193
|
+
smods_rec.from_str <<-XML
|
194
|
+
#{mods_origin_info_start_str}
|
195
|
+
<dateIssued encoding="edtf">2014-01/2020-12-31</dateIssued>
|
196
|
+
#{mods_origin_info_end_str}
|
197
|
+
XML
|
198
|
+
|
199
|
+
imp = stanford_mods_imprint(smods_rec)
|
200
|
+
updated_element = imp.send(:date_str)
|
201
|
+
expect(updated_element).to eq 'January 2014 - December 31, 2020'
|
202
|
+
end
|
203
|
+
|
204
|
+
xit 'handles BC EDTF centuries' do
|
205
|
+
# ruby-edtf apparently can't handle this format
|
206
|
+
smods_rec.from_str <<-XML
|
207
|
+
#{mods_origin_info_start_str}
|
208
|
+
<dateIssued encoding="edtf">-09XX</dateIssued>
|
209
|
+
#{mods_origin_info_end_str}
|
210
|
+
XML
|
211
|
+
|
212
|
+
imp = stanford_mods_imprint(smods_rec)
|
213
|
+
updated_element = imp.send(:date_str)
|
214
|
+
expect(updated_element).to eq '10th century BCE'
|
215
|
+
end
|
216
|
+
|
192
217
|
it 'handles the approximate qualifier' do
|
193
218
|
smods_rec.from_str <<-XML
|
194
219
|
#{mods_origin_info_start_str}
|
@@ -210,13 +235,13 @@ describe Stanford::Mods::Imprint do
|
|
210
235
|
|
211
236
|
imp = stanford_mods_imprint(smods_rec)
|
212
237
|
updated_element = imp.send(:date_str)
|
213
|
-
expect(updated_element).to eq '[322
|
238
|
+
expect(updated_element).to eq '[322 CE?]'
|
214
239
|
end
|
215
240
|
|
216
241
|
it 'handles the inferred qualifier' do
|
217
242
|
smods_rec.from_str <<-XML
|
218
243
|
#{mods_origin_info_start_str}
|
219
|
-
<dateIssued encoding="edtf" qualifier="inferred">
|
244
|
+
<dateIssued encoding="edtf" qualifier="inferred">190x</dateIssued>
|
220
245
|
#{mods_origin_info_end_str}
|
221
246
|
XML
|
222
247
|
|
@@ -9,10 +9,6 @@ describe Stanford::Mods::Coordinate do
|
|
9
9
|
expect(described_class.new('W80°--E100°/N487°--S42°')).not_to be_valid
|
10
10
|
end
|
11
11
|
|
12
|
-
it 'rejects coordinates without degree symbols' do
|
13
|
-
expect(described_class.new('W 650--W 100/N 700--N 550')).not_to be_valid
|
14
|
-
end
|
15
|
-
|
16
12
|
it 'rejects malformed coordinates' do
|
17
13
|
expect(described_class.new('(E29°--E35/°S12°--S16°).')).not_to be_valid
|
18
14
|
end
|
@@ -43,7 +39,9 @@ describe Stanford::Mods::Coordinate do
|
|
43
39
|
%((W 170⁰--E 55⁰/N 40⁰--S 36⁰).) =>
|
44
40
|
'-170.0 -36.0 55.0 40.0', # superscript 0 is almost a degree character..
|
45
41
|
%((W 0°-W 0°/S 90°---S 90°)) =>
|
46
|
-
'-0.0 -90.0 -0.0 -90.0' # one dash, two dashes, three dashes.. what's the difference?
|
42
|
+
'-0.0 -90.0 -0.0 -90.0', # one dash, two dashes, three dashes.. what's the difference?
|
43
|
+
%((W 030.6--E 068.1/N 041.7--S 042.4)) =>
|
44
|
+
'-30.6 -42.4 68.1 41.7'
|
47
45
|
}.each do |value, expected|
|
48
46
|
describe 'parsing' do
|
49
47
|
let(:subject) { described_class.new(value) }
|
data/spec/origin_info_spec.rb
CHANGED
@@ -89,7 +89,7 @@ describe "computations from /originInfo field" do
|
|
89
89
|
context '#pub_year_int' do
|
90
90
|
it_behaves_like "single pub date value", :pub_year_int, 0
|
91
91
|
# papyri - the only Spotlight data with BC dates
|
92
|
-
it '-
|
92
|
+
it '-199 for 200 B.C.' do
|
93
93
|
# hd778hw9236
|
94
94
|
mods_str = mods_origin_info_start_str +
|
95
95
|
'<dateCreated keyDate="yes" point="start" qualifier="approximate">200 B.C.</dateCreated>' +
|
@@ -98,7 +98,7 @@ describe "computations from /originInfo field" do
|
|
98
98
|
smods_rec.from_str(mods_str)
|
99
99
|
expect(smods_rec.pub_year_int).to eq(-199)
|
100
100
|
end
|
101
|
-
it '-
|
101
|
+
it '-210 for 211 B.C.' do
|
102
102
|
# ww728rz0477
|
103
103
|
mods_str = mods_origin_info_start_str +
|
104
104
|
'<dateCreated keyDate="yes" point="start" qualifier="approximate">211 B.C.</dateCreated>' +
|
@@ -3,7 +3,7 @@ describe 'title fields (searchworks.rb)' do
|
|
3
3
|
before(:all) do
|
4
4
|
@smods_rec = Stanford::Mods::Record.new
|
5
5
|
@ns_decl = "xmlns='#{Mods::MODS_NS}'"
|
6
|
-
m = "<mods #{@ns_decl}><titleInfo><title>Jerk</title><subTitle>A Tale of Tourettes</subTitle
|
6
|
+
m = "<mods #{@ns_decl}><titleInfo><nonSort>The</nonSort><title>Jerk</title><subTitle>A Tale of Tourettes</subTitle></titleInfo></mods>"
|
7
7
|
@smods_rec.from_str m
|
8
8
|
end
|
9
9
|
|
@@ -19,7 +19,7 @@ describe 'title fields (searchworks.rb)' do
|
|
19
19
|
|
20
20
|
context 'blank title node' do
|
21
21
|
it 'should deal with a second blank titleInfo node' do
|
22
|
-
m = "<mods #{@ns_decl}><titleInfo> </titleInfo><otherStuff>goes here</otherStuff><titleInfo><title>Jerk</title><subTitle>A Tale of Tourettes</subTitle
|
22
|
+
m = "<mods #{@ns_decl}><titleInfo> </titleInfo><otherStuff>goes here</otherStuff><titleInfo><nonSort>The</nonSort><title>Jerk</title><subTitle>A Tale of Tourettes</subTitle>></titleInfo></mods>"
|
23
23
|
smods_rec_blank_node = Stanford::Mods::Record.new
|
24
24
|
smods_rec_blank_node.from_str m
|
25
25
|
expect(smods_rec_blank_node.sw_short_title).to eq 'The Jerk'
|
@@ -113,7 +113,7 @@ describe 'title fields (searchworks.rb)' do
|
|
113
113
|
<subTitle>a history</subTitle>
|
114
114
|
</titleInfo></mods>"
|
115
115
|
@smods_rec.from_str(m)
|
116
|
-
expect(@smods_rec.sw_full_title).to eq 'The Olympics
|
116
|
+
expect(@smods_rec.sw_full_title).to eq 'The Olympics: a history.'
|
117
117
|
end #
|
118
118
|
# "end subtitle with period" - see above
|
119
119
|
it 'subtitle already ends with period' do
|
@@ -389,7 +389,7 @@ describe 'title fields (searchworks.rb)' do
|
|
389
389
|
<subTitle>a history</subTitle>
|
390
390
|
</titleInfo></mods>"
|
391
391
|
@smods_rec.from_str(m)
|
392
|
-
expect(@smods_rec.sw_title_display).to eq 'The Olympics
|
392
|
+
expect(@smods_rec.sw_title_display).to eq 'The Olympics: a history'
|
393
393
|
end #
|
394
394
|
# "end subtitle with period" - see above
|
395
395
|
it 'subtitle already ends with period' do
|
data/stanford-mods.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.test_files = gem.files.grep(%r{^spec/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
|
19
|
-
gem.add_dependency 'mods', '~> 3.0', '>= 3.0.
|
19
|
+
gem.add_dependency 'mods', '~> 3.0', '>= 3.0.3'
|
20
20
|
# active_support for .ordinalize, eg. 1 -> 1st, 2 -> 2nd for centuries
|
21
21
|
gem.add_dependency 'activesupport'
|
22
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stanford-mods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Naomi Dushay
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-
|
12
|
+
date: 2022-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mods
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
version: '3.0'
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 3.0.
|
23
|
+
version: 3.0.3
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
version: '3.0'
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.0.
|
33
|
+
version: 3.0.3
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: activesupport
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,11 +213,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
213
213
|
version: '0'
|
214
214
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
215
|
requirements:
|
216
|
-
- - "
|
216
|
+
- - ">="
|
217
217
|
- !ruby/object:Gem::Version
|
218
|
-
version:
|
218
|
+
version: '0'
|
219
219
|
requirements: []
|
220
|
-
rubygems_version: 3.
|
220
|
+
rubygems_version: 3.3.7
|
221
221
|
signing_key:
|
222
222
|
specification_version: 4
|
223
223
|
summary: Stanford specific wrangling of MODS metadata
|