stanford-mods 1.3.4 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/stanford-mods/date_parsing.rb +80 -34
- data/lib/stanford-mods/origin_info.rb +143 -88
- data/lib/stanford-mods/searchworks.rb +1 -0
- data/lib/stanford-mods/version.rb +1 -1
- data/spec/date_parsing_spec.rb +121 -6
- data/spec/origin_info_spec.rb +80 -35
- data/spec/searchworks_format_spec.rb +1 -0
- data/spec/searchworks_pub_dates_spec.rb +154 -137
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77f36520f38dfd83cd8cc79480fc5fbda45b2df6
|
4
|
+
data.tar.gz: b1e7a4db9be39cdbeeca3124a62e3c0403ba31a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd0ab891b9f578611b928231dcf45debcffc209068032fdbcd98d93ada56e95fc5afa82be97dfc163287297e190ff1ef258abef27dcd58170ec18152381da398
|
7
|
+
data.tar.gz: f604d45d319fbce30215ff436ad62ebc23a0bab11d995d6599bef137dae9a5465344d69d2492d84b29436711106ae7e80ce9090cb3005c3be4fe1fb004b58b7e
|
@@ -12,7 +12,14 @@ module Stanford
|
|
12
12
|
# @param [String] date_str String containing a date (we hope)
|
13
13
|
# @return [String, nil] String facet value for year if we could parse one, nil otherwise
|
14
14
|
def self.facet_string_from_date_str(date_str)
|
15
|
-
|
15
|
+
DateParsing.new(date_str).facet_string_from_date_str
|
16
|
+
end
|
17
|
+
|
18
|
+
# get year as Integer if we can parse date_str to get a year.
|
19
|
+
# @param [String] date_str String containing a date (we hope)
|
20
|
+
# @return [Integer, nil] Integer year if we could parse one, nil otherwise
|
21
|
+
def self.year_int_from_date_str(date_str)
|
22
|
+
DateParsing.new(date_str).year_int_from_date_str
|
16
23
|
end
|
17
24
|
|
18
25
|
# get String sortable value year if we can parse date_str to get a year.
|
@@ -22,7 +29,7 @@ module Stanford
|
|
22
29
|
# @return [String, nil] String sortable year if we could parse one, nil otherwise
|
23
30
|
# note that these values must *lexically* sort to create a chronological sort.
|
24
31
|
def self.sortable_year_string_from_date_str(date_str)
|
25
|
-
|
32
|
+
DateParsing.new(date_str).sortable_year_string_from_date_str
|
26
33
|
end
|
27
34
|
|
28
35
|
# true if the year is between -999 and (current year + 1)
|
@@ -33,6 +40,13 @@ module Stanford
|
|
33
40
|
(-1000 < year_str.to_i) && (year_str.to_i < Date.today.year + 2)
|
34
41
|
end
|
35
42
|
|
43
|
+
# true if the year is between -9999 and (current year + 1)
|
44
|
+
# @return [Boolean] true if the year is between -9999 and (current year + 1); false otherwise
|
45
|
+
def self.year_int_valid?(year)
|
46
|
+
return false unless year.is_a? Integer
|
47
|
+
(-1000 < year.to_i) && (year < Date.today.year + 2)
|
48
|
+
end
|
49
|
+
|
36
50
|
attr_reader :orig_date_str
|
37
51
|
|
38
52
|
def initialize(date_str)
|
@@ -48,18 +62,11 @@ module Stanford
|
|
48
62
|
return if orig_date_str == '0000-00-00' # shpc collection has these useless dates
|
49
63
|
# B.C. first in case there are 4 digits, e.g. 1600 B.C.
|
50
64
|
return facet_string_for_bc if orig_date_str.match(BC_REGEX)
|
51
|
-
|
52
|
-
result ||= sortable_year_for_yyyy
|
53
|
-
# 2 digit year will always be 19xx or 20xx; sortable version will make a good facet string
|
54
|
-
result ||= sortable_year_for_yy
|
55
|
-
# decades are always 19xx or 20xx; sortable version will make a good facet string
|
56
|
-
result ||= sortable_year_for_decade
|
65
|
+
result = sortable_year_for_yyyy_yy_or_decade
|
57
66
|
unless result
|
58
67
|
# try removing brackets between digits in case we have 169[5] or [18]91
|
59
|
-
|
60
|
-
|
61
|
-
return DateParsing.new(no_brackets).facet_string_from_date_str
|
62
|
-
end
|
68
|
+
no_brackets = remove_brackets
|
69
|
+
return DateParsing.new(no_brackets).facet_string_from_date_str if no_brackets
|
63
70
|
end
|
64
71
|
# parsing below this line gives string inapprop for year_str_valid?
|
65
72
|
unless self.class.year_str_valid?(result)
|
@@ -71,6 +78,23 @@ module Stanford
|
|
71
78
|
result
|
72
79
|
end
|
73
80
|
|
81
|
+
# get Integer year if we can parse date_str to get a year.
|
82
|
+
# @return [Integer, nil] Integer year if we could parse one, nil otherwise
|
83
|
+
def year_int_from_date_str
|
84
|
+
return if orig_date_str == '0000-00-00' # shpc collection has these useless dates
|
85
|
+
# B.C. first in case there are 4 digits, e.g. 1600 B.C.
|
86
|
+
return sortable_year_int_for_bc if orig_date_str.match(BC_REGEX)
|
87
|
+
result = sortable_year_for_yyyy_yy_or_decade
|
88
|
+
result ||= sortable_year_for_century
|
89
|
+
result ||= sortable_year_int_for_early_numeric
|
90
|
+
unless result
|
91
|
+
# try removing brackets between digits in case we have 169[5] or [18]91
|
92
|
+
no_brackets = remove_brackets
|
93
|
+
return DateParsing.new(no_brackets).year_int_from_date_str if no_brackets
|
94
|
+
end
|
95
|
+
result.to_i if result && self.class.year_int_valid?(result.to_i)
|
96
|
+
end
|
97
|
+
|
74
98
|
# get String sortable value year if we can parse date_str to get a year.
|
75
99
|
# SearchWorks currently uses a string field for pub date sorting; thus so does Spotlight.
|
76
100
|
# The values returned must *lexically* sort in chronological order, so the B.C. dates are tricky
|
@@ -79,28 +103,39 @@ module Stanford
|
|
79
103
|
def sortable_year_string_from_date_str
|
80
104
|
return if orig_date_str == '0000-00-00' # shpc collection has these useless dates
|
81
105
|
# B.C. first in case there are 4 digits, e.g. 1600 B.C.
|
82
|
-
return
|
83
|
-
|
84
|
-
result = sortable_year_for_yyyy
|
85
|
-
result ||= sortable_year_for_yy
|
86
|
-
result ||= sortable_year_for_decade
|
106
|
+
return sortable_year_str_for_bc if orig_date_str.match(BC_REGEX)
|
107
|
+
result = sortable_year_for_yyyy_yy_or_decade
|
87
108
|
result ||= sortable_year_for_century
|
88
|
-
result ||=
|
109
|
+
result ||= sortable_year_str_for_early_numeric
|
89
110
|
unless result
|
90
111
|
# try removing brackets between digits in case we have 169[5] or [18]91
|
91
|
-
|
92
|
-
|
93
|
-
return DateParsing.new(no_brackets).sortable_year_string_from_date_str
|
94
|
-
end
|
112
|
+
no_brackets = remove_brackets
|
113
|
+
return DateParsing.new(no_brackets).sortable_year_string_from_date_str if no_brackets
|
95
114
|
end
|
96
115
|
result if self.class.year_str_valid?(result)
|
97
116
|
end
|
98
117
|
|
118
|
+
# get String sortable value year if we can parse date_str to get a year.
|
119
|
+
# @return [String, nil] String sortable year if we could parse one, nil otherwise
|
120
|
+
# note that these values must *lexically* sort to create a chronological sort.
|
121
|
+
def sortable_year_for_yyyy_yy_or_decade
|
122
|
+
# most date strings have a four digit year
|
123
|
+
result = sortable_year_for_yyyy
|
124
|
+
result ||= sortable_year_for_yy # 19xx or 20xx
|
125
|
+
result ||= sortable_year_for_decade # 19xx or 20xx
|
126
|
+
result
|
127
|
+
end
|
128
|
+
|
129
|
+
# removes brackets between digits such as 169[5] or [18]91
|
130
|
+
def remove_brackets
|
131
|
+
orig_date_str.delete('[]') if orig_date_str.match(BRACKETS_BETWEEN_DIGITS_REXEXP)
|
132
|
+
end
|
133
|
+
|
99
134
|
# looks for 4 consecutive digits in orig_date_str and returns first occurrence if found
|
100
135
|
# @return [String, nil] 4 digit year (e.g. 1865, 0950) if orig_date_str has yyyy, nil otherwise
|
101
136
|
def sortable_year_for_yyyy
|
102
137
|
matches = orig_date_str.match(/\d{4}/) if orig_date_str
|
103
|
-
|
138
|
+
matches.to_s if matches
|
104
139
|
end
|
105
140
|
|
106
141
|
# returns 4 digit year as String if we have a x/x/yy or x-x-yy pattern
|
@@ -131,10 +166,8 @@ module Stanford
|
|
131
166
|
# @return [String, nil] 4 digit year (e.g. 1860, 1950) if orig_date_str matches pattern, nil otherwise
|
132
167
|
def sortable_year_for_decade
|
133
168
|
decade_matches = orig_date_str.match(/\d{3}[u\-?x]/) if orig_date_str
|
134
|
-
if decade_matches
|
135
|
-
|
136
|
-
return DateParsing.new(changed_to_zero).sortable_year_for_yyyy
|
137
|
-
end
|
169
|
+
changed_to_zero = decade_matches.to_s.tr('u\-?x', '0') if decade_matches
|
170
|
+
DateParsing.new(changed_to_zero).sortable_year_for_yyyy if changed_to_zero
|
138
171
|
end
|
139
172
|
|
140
173
|
CENTURY_WORD_REGEXP = Regexp.new('(\d{1,2}).*century')
|
@@ -177,22 +210,29 @@ module Stanford
|
|
177
210
|
|
178
211
|
BC_REGEX = Regexp.new('(\d{1,4}).*' + Regexp.escape('B.C.'))
|
179
212
|
|
180
|
-
# get String sortable value for B.C. if we have
|
213
|
+
# get String sortable value for B.C. if we have B.C. pattern
|
181
214
|
# note that these values must *lexically* sort to create a chronological sort.
|
182
215
|
# We know our data does not contain B.C. dates older than 999, so we can make them
|
183
216
|
# lexically sort by subtracting 1000. So we get:
|
184
217
|
# -700 for 300 B.C., -750 for 250 B.C., -800 for 200 B.C., -801 for 199 B.C.
|
185
218
|
# @return [String, nil] String sortable -ddd if B.C. in pattern; nil otherwise
|
186
|
-
def
|
219
|
+
def sortable_year_str_for_bc
|
220
|
+
bc_matches = orig_date_str.match(BC_REGEX) if orig_date_str
|
221
|
+
($1.to_i - 1000).to_s if bc_matches
|
222
|
+
end
|
223
|
+
|
224
|
+
# get Integer sortable value for B.C. if we have B.C. pattern
|
225
|
+
# @return [Integer, nil] Integer sortable -ddd if B.C. in pattern; nil otherwise
|
226
|
+
def sortable_year_int_for_bc
|
187
227
|
bc_matches = orig_date_str.match(BC_REGEX) if orig_date_str
|
188
|
-
|
228
|
+
"-#{$1}".to_i if bc_matches
|
189
229
|
end
|
190
230
|
|
191
231
|
# get single facet value for B.C. if we have B.C. pattern
|
192
232
|
# @return [String, nil] ddd B.C. if ddd B.C. in pattern; nil otherwise
|
193
233
|
def facet_string_for_bc
|
194
234
|
bc_matches = orig_date_str.match(BC_REGEX) if orig_date_str
|
195
|
-
|
235
|
+
bc_matches.to_s if bc_matches
|
196
236
|
end
|
197
237
|
|
198
238
|
EARLY_NUMERIC = Regexp.new('^\-?\d{1,3}$')
|
@@ -203,7 +243,7 @@ module Stanford
|
|
203
243
|
# lexically sort by subtracting 1000. So we get:
|
204
244
|
# -983 for -17, -999 for -1, 0000 for 0, 0001 for 1, 0017 for 17
|
205
245
|
# @return [String, nil] String sortable -ddd if orig_date_str matches pattern; nil otherwise
|
206
|
-
def
|
246
|
+
def sortable_year_str_for_early_numeric
|
207
247
|
return unless orig_date_str.match(EARLY_NUMERIC)
|
208
248
|
if orig_date_str.match(/^\-/)
|
209
249
|
# negative number becomes x - 1000 for sorting; -005 for -995
|
@@ -214,6 +254,13 @@ module Stanford
|
|
214
254
|
end
|
215
255
|
end
|
216
256
|
|
257
|
+
# get Integer sortable value from date String containing yyy, yy, y, -y, -yy, -yyy, -yyyy
|
258
|
+
# @return [Integer, nil] Integer sortable -ddd if orig_date_str matches pattern; nil otherwise
|
259
|
+
def sortable_year_int_for_early_numeric
|
260
|
+
return orig_date_str.to_i if orig_date_str.match(EARLY_NUMERIC)
|
261
|
+
orig_date_str.to_i if orig_date_str.match(/^-\d{4}$/)
|
262
|
+
end
|
263
|
+
|
217
264
|
# get single facet value for date String containing yyy, yy, y, -y, -yy, -yyy
|
218
265
|
# negative number strings will be changed to B.C. strings
|
219
266
|
def facet_string_for_early_numeric
|
@@ -239,7 +286,6 @@ module Stanford
|
|
239
286
|
rescue ArgumentError
|
240
287
|
nil # explicitly want nil if date won't parse
|
241
288
|
end
|
242
|
-
|
243
289
|
end
|
244
290
|
end
|
245
|
-
end
|
291
|
+
end
|
@@ -19,12 +19,18 @@ module Stanford
|
|
19
19
|
# should be ignored; false if approximate dates should be included
|
20
20
|
# @return [String] single String containing publication year for facet use
|
21
21
|
def pub_date_facet_single_value(ignore_approximate = false)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
single_pub_year(ignore_approximate, :year_facet_str)
|
23
|
+
end
|
24
|
+
|
25
|
+
# return pub year as an Integer
|
26
|
+
# prefer dateIssued (any) before dateCreated (any) before dateCaptured (any)
|
27
|
+
# look for a keyDate and use it if there is one; otherwise pick earliest date
|
28
|
+
# @param [Boolean] ignore_approximate true if approximate dates (per qualifier attribute)
|
29
|
+
# should be ignored; false if approximate dates should be included
|
30
|
+
# @return [Integer] publication year as an Integer
|
31
|
+
# note that for sorting 5 B.C. => -5; 666 B.C. => -666
|
32
|
+
def pub_year_int(ignore_approximate = false)
|
33
|
+
single_pub_year(ignore_approximate, :year_int)
|
28
34
|
end
|
29
35
|
|
30
36
|
# return a single string intended for lexical sorting for pub date
|
@@ -34,47 +40,44 @@ module Stanford
|
|
34
40
|
# should be ignored; false if approximate dates should be included
|
35
41
|
# @return [String] single String containing publication year for lexical sorting
|
36
42
|
# note that for string sorting 5 B.C. = -5 => -995; 6 B.C. => -994 so 6 B.C. sorts before 5 B.C.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
result ||= pub_date_best_sort_str_value(date_created_elements(ignore_approximate))
|
41
|
-
# dateCaptured for web archive seed records
|
42
|
-
result ||= pub_date_best_sort_str_value(@mods_ng_xml.origin_info.dateCaptured.to_a)
|
43
|
-
result
|
43
|
+
# @deprecated use pub_year_int
|
44
|
+
def pub_year_sort_str(ignore_approximate = false)
|
45
|
+
single_pub_year(ignore_approximate, :year_sort_str)
|
44
46
|
end
|
45
47
|
|
46
48
|
# given the passed date elements, look for a single keyDate and use it if there is one;
|
47
49
|
# otherwise pick earliest parseable date
|
48
50
|
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
49
51
|
# @return [String] single String containing publication year for facet use
|
50
|
-
def
|
51
|
-
|
52
|
-
# prefer keyDate
|
53
|
-
key_date_el = self.class.keyDate(date_el_array)
|
54
|
-
result = DateParsing.facet_string_from_date_str(key_date_el.content) if key_date_el
|
52
|
+
def year_facet_str(date_el_array)
|
53
|
+
result = date_parsing_result(date_el_array, :facet_string_from_date_str)
|
55
54
|
return result if result
|
56
|
-
|
57
|
-
_ignore, orig_str_to_parse = self.class.earliest_date(date_el_array)
|
55
|
+
_ignore, orig_str_to_parse = self.class.earliest_year_str(date_el_array)
|
58
56
|
DateParsing.facet_string_from_date_str(orig_str_to_parse) if orig_str_to_parse
|
59
57
|
end
|
60
58
|
|
59
|
+
# given the passed date elements, look for a single keyDate and use it if there is one;
|
60
|
+
# otherwise pick earliest parseable date
|
61
|
+
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
62
|
+
# @return [Integer] publication year as an Integer
|
63
|
+
def year_int(date_el_array)
|
64
|
+
result = date_parsing_result(date_el_array, :year_int_from_date_str)
|
65
|
+
return result if result
|
66
|
+
year_int, _ignore = self.class.earliest_year_int(date_el_array)
|
67
|
+
year_int if year_int
|
68
|
+
end
|
69
|
+
|
61
70
|
# given the passed date elements, look for a single keyDate and use it if there is one;
|
62
71
|
# otherwise pick earliest parseable date
|
63
72
|
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
64
73
|
# @return [String] single String containing publication year for lexical sorting
|
65
|
-
def
|
66
|
-
|
67
|
-
# prefer keyDate
|
68
|
-
key_date_el = self.class.keyDate(date_el_array)
|
69
|
-
result = DateParsing.sortable_year_string_from_date_str(key_date_el.content) if key_date_el
|
74
|
+
def year_sort_str(date_el_array)
|
75
|
+
result = date_parsing_result(date_el_array, :sortable_year_string_from_date_str)
|
70
76
|
return result if result
|
71
|
-
|
72
|
-
sortable_str, _ignore = self.class.earliest_date(date_el_array)
|
77
|
+
sortable_str, _ignore = self.class.earliest_year_str(date_el_array)
|
73
78
|
sortable_str if sortable_str
|
74
79
|
end
|
75
80
|
|
76
|
-
protected :pub_date_best_single_facet_value, :pub_date_best_sort_str_value
|
77
|
-
|
78
81
|
# return /originInfo/dateCreated elements in MODS records
|
79
82
|
# @param [Boolean] ignore_approximate true if approximate dates (per qualifier attribute)
|
80
83
|
# should be excluded; false approximate dates should be included
|
@@ -122,19 +125,71 @@ module Stanford
|
|
122
125
|
qualifier == 'approximate' || qualifier == 'questionable'
|
123
126
|
end
|
124
127
|
|
125
|
-
# get earliest parseable
|
128
|
+
# get earliest parseable year (as an Integer) from the passed date elements
|
126
129
|
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
127
130
|
# @return two String values:
|
128
|
-
# the first is the
|
131
|
+
# the first is the Integer value of the earliest year;
|
129
132
|
# the second is the original String value of the chosen element
|
130
|
-
def self.
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
133
|
+
def self.earliest_year_int(date_el_array)
|
134
|
+
earliest_year(date_el_array, :year_int_from_date_str)
|
135
|
+
end
|
136
|
+
|
137
|
+
# get earliest parseable year (as a String) from the passed date elements
|
138
|
+
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
139
|
+
# @return two String values:
|
140
|
+
# the first is the lexically sortable String value of the earliest year;
|
141
|
+
# the second is the original String value of the chosen element
|
142
|
+
def self.earliest_year_str(date_el_array)
|
143
|
+
earliest_year(date_el_array, :sortable_year_string_from_date_str)
|
144
|
+
end
|
145
|
+
|
146
|
+
# return a single value intended for pub date flavor indicated by method_sym
|
147
|
+
# prefer dateIssued (any) before dateCreated (any) before dateCaptured (any)
|
148
|
+
# look for a keyDate and use it if there is one; otherwise pick earliest date
|
149
|
+
# @param [Boolean] ignore_approximate true if approximate dates (per qualifier attribute)
|
150
|
+
# should be ignored; false if approximate dates should be included
|
151
|
+
# @param [Symbol] method_sym method name in DateParsing, as a symbol
|
152
|
+
# @return [String, Integer] publication year as String or Integer
|
153
|
+
def single_pub_year(ignore_approximate, method_sym)
|
154
|
+
result = send(method_sym, date_issued_elements(ignore_approximate))
|
155
|
+
result ||= send(method_sym, date_created_elements(ignore_approximate))
|
156
|
+
# dateCaptured for web archive seed records
|
157
|
+
result ||= send(method_sym, @mods_ng_xml.origin_info.dateCaptured.to_a)
|
158
|
+
result
|
159
|
+
end
|
160
|
+
|
161
|
+
# given the passed date elements, look for a single keyDate and use it if there is one;
|
162
|
+
# otherwise pick earliest parseable date
|
163
|
+
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
164
|
+
# @param [Symbol] method_sym method name in DateParsing, as a symbol
|
165
|
+
# @return [Integer, String] year as a String or Integer, depending on method_sym
|
166
|
+
def date_parsing_result(date_el_array, method_sym)
|
167
|
+
return if date_el_array.empty?
|
168
|
+
# prefer keyDate
|
169
|
+
key_date_el = self.class.keyDate(date_el_array)
|
170
|
+
DateParsing.send(method_sym, key_date_el.content) if key_date_el
|
171
|
+
end
|
172
|
+
# temporarily use this technique to mark methods private until we get rid of old date parsing methods below
|
173
|
+
private :single_pub_year, :date_parsing_result
|
174
|
+
|
175
|
+
class << self
|
176
|
+
private
|
177
|
+
# get earliest parseable year from the passed date elements
|
178
|
+
# @param [Array<Nokogiri::XML::Element>] date_el_array the elements from which to select a pub date
|
179
|
+
# @param [Symbol] method_sym method name in DateParsing, as a symbol
|
180
|
+
# @return two values:
|
181
|
+
# the first is either: the lexically sortable String value of the earliest date or the Integer value of same,
|
182
|
+
# depending on the method_sym passed in
|
183
|
+
# the second is the original String value of the chosen element
|
184
|
+
def earliest_year(date_el_array, method_sym)
|
185
|
+
poss_results = {}
|
186
|
+
date_el_array.each { |el|
|
187
|
+
result = DateParsing.send(method_sym, el.content)
|
188
|
+
poss_results[result] = el.content if result
|
189
|
+
}
|
190
|
+
earliest = poss_results.keys.sort.first if poss_results.present?
|
191
|
+
return earliest, poss_results[earliest] if earliest
|
192
|
+
end
|
138
193
|
end
|
139
194
|
|
140
195
|
|
@@ -145,25 +200,58 @@ module Stanford
|
|
145
200
|
vals
|
146
201
|
end
|
147
202
|
|
203
|
+
# Values for the pub date facet. This is less strict than the 4 year date requirements for pub_date
|
204
|
+
# Jan 2016: used to populate Solr pub_date field for Spotlight and SearchWorks
|
205
|
+
# Spotlight: pub_date field should be replaced by pub_year_w_approx_isi and pub_year_no_approx_isi
|
206
|
+
# SearchWorks: pub_date field used for display in search results and show view; for sorting nearby-on-shelf
|
207
|
+
# these could be done with more approp fields/methods (pub_year_int for sorting; new pub year methods to populate field)
|
208
|
+
# TODO: prob should deprecated this in favor of pub_date_facet_single_value;
|
209
|
+
# need head-to-head testing with pub_date_facet_single_value
|
210
|
+
# @return <Array[String]> with values for the pub date facet
|
211
|
+
def pub_date_facet
|
212
|
+
if pub_date
|
213
|
+
if pub_date.start_with?('-')
|
214
|
+
return (pub_date.to_i + 1000).to_s + ' B.C.'
|
215
|
+
end
|
216
|
+
if pub_date.include? '--'
|
217
|
+
cent = pub_date[0, 2].to_i
|
218
|
+
cent += 1
|
219
|
+
cent = cent.to_s + 'th century'
|
220
|
+
return cent
|
221
|
+
else
|
222
|
+
return pub_date
|
223
|
+
end
|
224
|
+
end
|
225
|
+
nil
|
226
|
+
end
|
227
|
+
|
228
|
+
# creates a date suitable for sorting. Guarnteed to be 4 digits or nil
|
229
|
+
# @deprecated: use pub_year_int, or pub_year_sort_str if you must have a string (why?)
|
230
|
+
def pub_date_sort
|
231
|
+
if pub_date
|
232
|
+
pd = pub_date
|
233
|
+
pd = '0' + pd if pd.length == 3
|
234
|
+
pd = pd.gsub('--', '00')
|
235
|
+
end
|
236
|
+
fail "pub_date_sort was about to return a non 4 digit value #{pd}!" if pd && pd.length != 4
|
237
|
+
pd
|
238
|
+
end
|
239
|
+
|
148
240
|
# For the date display only, the first place to look is in the dates without encoding=marc array.
|
149
241
|
# If no such dates, select the first date in the dates_marc_encoding array. Otherwise return nil
|
150
242
|
# @return [String] value for the pub_date_display Solr field for this document or nil if none
|
243
|
+
# @deprecated: DO NOT USE: this is no longer used in SW, Revs or Spotlight Jan 2016
|
151
244
|
def pub_date_display
|
152
245
|
return dates_no_marc_encoding.first unless dates_no_marc_encoding.empty?
|
153
246
|
return dates_marc_encoding.first unless dates_marc_encoding.empty?
|
154
247
|
nil
|
155
248
|
end
|
156
249
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
def pub_dates
|
161
|
-
return dates_marc_encoding unless dates_marc_encoding.empty?
|
162
|
-
return dates_no_marc_encoding unless dates_no_marc_encoding.empty?
|
163
|
-
nil
|
164
|
-
end
|
250
|
+
# ---- old date parsing protected methods will be deprecated/replaced with new date parsing methods (see also DateParsing)
|
251
|
+
|
252
|
+
protected
|
165
253
|
|
166
|
-
#
|
254
|
+
# The year the object was published
|
167
255
|
# @return [String] 4 character year or nil if no valid date was found
|
168
256
|
def pub_year
|
169
257
|
# use the cached year if there is one
|
@@ -201,47 +289,17 @@ module Stanford
|
|
201
289
|
@pub_year = ''
|
202
290
|
nil
|
203
291
|
end
|
292
|
+
alias_method :pub_date, :pub_year
|
204
293
|
|
205
|
-
#
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
end
|
212
|
-
fail "pub_date_sort was about to return a non 4 digit value #{pd}!" if pd && pd.length != 4
|
213
|
-
pd
|
214
|
-
end
|
215
|
-
|
216
|
-
# The year the object was published, filtered based on max_pub_date and min_pub_date from the config file
|
217
|
-
# @return [String] 4 character year or nil
|
218
|
-
def pub_date
|
219
|
-
pub_year || nil
|
220
|
-
end
|
221
|
-
|
222
|
-
# Values for the pub date facet. This is less strict than the 4 year date requirements for pub_date
|
223
|
-
# @return <Array[String]> with values for the pub date facet
|
224
|
-
def pub_date_facet
|
225
|
-
if pub_date
|
226
|
-
if pub_date.start_with?('-')
|
227
|
-
return (pub_date.to_i + 1000).to_s + ' B.C.'
|
228
|
-
end
|
229
|
-
if pub_date.include? '--'
|
230
|
-
cent = pub_date[0, 2].to_i
|
231
|
-
cent += 1
|
232
|
-
cent = cent.to_s + 'th century'
|
233
|
-
return cent
|
234
|
-
else
|
235
|
-
return pub_date
|
236
|
-
end
|
237
|
-
end
|
294
|
+
# For the date indexing, sorting and faceting, the first place to look is in the dates with encoding=marc array.
|
295
|
+
# If that doesn't exist, look in the dates without encoding=marc array. Otherwise return nil
|
296
|
+
# @return [Array<String>] values for the date Solr field for this document or nil if none
|
297
|
+
def pub_dates
|
298
|
+
return dates_marc_encoding unless dates_marc_encoding.empty?
|
299
|
+
return dates_no_marc_encoding unless dates_no_marc_encoding.empty?
|
238
300
|
nil
|
239
301
|
end
|
240
302
|
|
241
|
-
# ---- old date parsing methods will be deprecated/replaced with new date parsing methods
|
242
|
-
|
243
|
-
protected
|
244
|
-
|
245
303
|
# @return [Array<String>] dates from dateIssued and dateCreated tags from origin_info with encoding="marc"
|
246
304
|
def dates_marc_encoding
|
247
305
|
@dates_marc_encoding ||= begin
|
@@ -279,7 +337,6 @@ module Stanford
|
|
279
337
|
}
|
280
338
|
end
|
281
339
|
|
282
|
-
|
283
340
|
def is_number?(object)
|
284
341
|
true if Integer(object) rescue false
|
285
342
|
end
|
@@ -288,8 +345,6 @@ module Stanford
|
|
288
345
|
true if Date.parse(object) rescue false
|
289
346
|
end
|
290
347
|
|
291
|
-
# TODO: need tests for these methods
|
292
|
-
|
293
348
|
# get a 4 digit year like 1865 from array of dates
|
294
349
|
# @param [Array<String>] dates an array of potential year strings
|
295
350
|
def get_plain_four_digit_year(dates)
|