pennmarc 1.0.23 → 1.0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pennmarc/helpers/creator.rb +84 -21
- data/lib/pennmarc/mappings/locations.yml +6 -0
- data/lib/pennmarc/version.rb +1 -1
- data/spec/lib/pennmarc/helpers/creator_spec.rb +33 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59881d630f244bc6d8b76665df84f4b22297de2d51c44f5272df4226f4e27e75
|
4
|
+
data.tar.gz: 8d4e78c359dea40f482adc5b4deaa3fbb75bbe15a4fce5955ad48de054ce82c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a3a43ff1cecadf978a8c50d59b382c2592925116cacd757f368ea0a698e9b370a94e74fd98e1a6a06a3b837ab0dbdce2efece991aaf3da4b53c74396a73ee2e
|
7
|
+
data.tar.gz: 7f5468f9891c9fe15003160fb4d5a6c04cd8291ead5e803f0652368376e1fd67381195a7bdffd7ea9a7aa996c071b75240405dd956c46d879753f6811eca1b0a
|
@@ -21,6 +21,12 @@ module PennMARC
|
|
21
21
|
|
22
22
|
CONTRIBUTOR_TAGS = %w[700 710].freeze
|
23
23
|
|
24
|
+
FACET_SOURCE_MAP = {
|
25
|
+
100 => 'abcdjq', 110 => 'abcdjq', 111 => 'abcen',
|
26
|
+
700 => 'abcdjq', 710 => 'abcdjq', 711 => 'abcen',
|
27
|
+
800 => 'abcdjq', 810 => 'abcdjq', 811 => 'abcen'
|
28
|
+
}.freeze
|
29
|
+
|
24
30
|
# Author/Creator search field. Includes all subfield values (even ǂ0 URIs) from
|
25
31
|
# {https://www.oclc.org/bibformats/en/1xx/100.html 100 Main Entry--Personal Name} and
|
26
32
|
# {https://www.oclc.org/bibformats/en/1xx/110.html 110 Main Entry--Corporate Name}. Maps any relator codes found
|
@@ -51,19 +57,33 @@ module PennMARC
|
|
51
57
|
end
|
52
58
|
|
53
59
|
# Retrieve creator values for display from fields {https://www.loc.gov/marc/bibliographic/bd100.html 100}
|
54
|
-
# and {https://www.loc.gov/marc/bibliographic/bd110.html 110} and their linked alternates.
|
55
|
-
#
|
60
|
+
# and {https://www.loc.gov/marc/bibliographic/bd110.html 110} and their linked alternates. First, joins subfields
|
61
|
+
# other than $0, $1, $4, $6, $8, $e, and w. Then, appends any encoded relators found in $4.
|
62
|
+
# If there are no valid encoded relators, uses the value found in $e.
|
56
63
|
# @param [MARC::Record] record
|
57
64
|
# @return [Array<String>] array of author/creator values for display
|
58
65
|
def show(record, relator_map: Mappers.relator)
|
59
66
|
fields = record.fields(TAGS)
|
60
67
|
fields += record.fields('880').select { |field| subfield_value?(field, '6', /^(#{TAGS.join('|')})/) }
|
61
68
|
fields.filter_map { |field|
|
62
|
-
|
63
|
-
append_relator(field: field, joined_subfields: creator, relator_term_sf: 'e', relator_map: relator_map)
|
69
|
+
parse_show_value(field, relator_map: relator_map)
|
64
70
|
}.uniq
|
65
71
|
end
|
66
72
|
|
73
|
+
# Hash with main creator show values as the fields and the corresponding facet as the values.
|
74
|
+
# Does not include linked 880s.
|
75
|
+
# @param [MARC::Record] record
|
76
|
+
# @param [Hash] relator_map
|
77
|
+
# @return [Hash]
|
78
|
+
def show_facet_map(record, relator_map: Mappers.relator)
|
79
|
+
creators = record.fields(TAGS).filter_map do |field|
|
80
|
+
show = parse_show_value(field, relator_map: relator_map)
|
81
|
+
facet = parse_facet_value(field, FACET_SOURCE_MAP[field.tag.to_i].chars)
|
82
|
+
{ show: show, facet: facet }
|
83
|
+
end
|
84
|
+
creators.to_h { |h| [h[:show], h[:facet]] }
|
85
|
+
end
|
86
|
+
|
67
87
|
# All author/creator values for display (like #show, but multivalued?) - no 880 linkage
|
68
88
|
# Performs additional normalization of author names
|
69
89
|
# @note ported from get_author_creator_values (indexed as author_creator_a) - shown on results page
|
@@ -94,14 +114,9 @@ module PennMARC
|
|
94
114
|
# @param [MARC::Record] record
|
95
115
|
# @return [Array<String>] array of author/creator values for faceting
|
96
116
|
def facet(record)
|
97
|
-
|
98
|
-
100 => 'abcdjq', 110 => 'abcdjq', 111 => 'abcen',
|
99
|
-
700 => 'abcdjq', 710 => 'abcdjq', 711 => 'abcen',
|
100
|
-
800 => 'abcdjq', 810 => 'abcdjq', 811 => 'abcen'
|
101
|
-
}
|
102
|
-
source_map.flat_map { |field_num, subfields|
|
117
|
+
FACET_SOURCE_MAP.flat_map { |field_num, subfields|
|
103
118
|
record.fields(field_num.to_s).map do |field|
|
104
|
-
|
119
|
+
parse_facet_value(field, subfields.chars)
|
105
120
|
end
|
106
121
|
}.uniq
|
107
122
|
end
|
@@ -117,7 +132,11 @@ module PennMARC
|
|
117
132
|
}.uniq
|
118
133
|
end
|
119
134
|
|
120
|
-
# Conference detailed display, intended for record show page.
|
135
|
+
# Conference detailed display, intended for record show page. Retrieve conference values for record display from
|
136
|
+
# {https://www.loc.gov/marc/bibliographic/bd111.html 111}, {https://www.loc.gov/marc/bibliographic/bd711.html 711}
|
137
|
+
# , and their linked 880s. If there is no $i, we join subfield $i we join subfield values other than
|
138
|
+
# $0, $4, $5, $6, $8, $e, $j, and $w. to create the conference value. We then join the conference subunit value
|
139
|
+
# using subfields $e and $w. We append any relators, preferring those defined in $4 and using $j as a fallback.
|
121
140
|
# @note ported from get_conference_values
|
122
141
|
# @todo what is ǂi for?
|
123
142
|
# @param [MARC::Record] record
|
@@ -126,15 +145,7 @@ module PennMARC
|
|
126
145
|
conferences = record.fields(%w[111 711]).filter_map do |field|
|
127
146
|
next unless field.indicator2.in? ['', ' ']
|
128
147
|
|
129
|
-
|
130
|
-
join_subfields field, &subfield_not_in?(%w[0 4 5 6 8 e j w])
|
131
|
-
else
|
132
|
-
''
|
133
|
-
end
|
134
|
-
sub_unit = join_subfields(field, &subfield_in?(%w[e w]))
|
135
|
-
conf = [conf, sub_unit].compact_blank.join(' ')
|
136
|
-
|
137
|
-
append_relator(field: field, joined_subfields: conf, relator_term_sf: 'j', relator_map: relator_map)
|
148
|
+
parse_conference_detail_show_value(field, relator_map: relator_map)
|
138
149
|
end
|
139
150
|
conferences += record.fields('880').filter_map do |field|
|
140
151
|
next unless subfield_value? field, '6', /^(111|711)/
|
@@ -150,6 +161,24 @@ module PennMARC
|
|
150
161
|
conferences.uniq
|
151
162
|
end
|
152
163
|
|
164
|
+
# Return hash of detailed conference values mapped to their corresponding facets from fields
|
165
|
+
# {https://www.loc.gov/marc/bibliographic/bd111.html 111} and
|
166
|
+
# {https://www.loc.gov/marc/bibliographic/bd711.html 711}. Does not include linked 880s.
|
167
|
+
# @param [MARC::Record] record
|
168
|
+
# @param [Hash] relator_map
|
169
|
+
# @return [Hash]
|
170
|
+
def conference_detail_show_facet_map(record, relator_map: Mappers.relator)
|
171
|
+
conferences = record.fields(%w[111 711]).filter_map do |field|
|
172
|
+
next unless field.indicator2.in? ['', ' ']
|
173
|
+
|
174
|
+
show = parse_conference_detail_show_value(field, relator_map: relator_map)
|
175
|
+
facet = parse_facet_value(field, FACET_SOURCE_MAP[field.tag.to_i].chars)
|
176
|
+
{ show: show, facet: facet }
|
177
|
+
end
|
178
|
+
|
179
|
+
conferences.to_h { |conf| [conf[:show], conf[:facet]] }
|
180
|
+
end
|
181
|
+
|
153
182
|
# Conference name values for searching
|
154
183
|
# @param [MARC::Record] record
|
155
184
|
# @return [Array<String>]
|
@@ -264,6 +293,40 @@ module PennMARC
|
|
264
293
|
before_comma = substring_before(name, ', ')
|
265
294
|
"#{after_comma} #{before_comma}".squish
|
266
295
|
end
|
296
|
+
|
297
|
+
# Parse creator facet value from given creator field and desired subfields
|
298
|
+
# @param [MARC::Field] field
|
299
|
+
# @param [Array<String>] subfields
|
300
|
+
# @return [String]
|
301
|
+
def parse_facet_value(field, subfields)
|
302
|
+
trim_punctuation(join_subfields(field, &subfield_in?(subfields)))
|
303
|
+
end
|
304
|
+
|
305
|
+
# Parse creator show value from given main creator fields (100/110).
|
306
|
+
# @param [MARC::Field] field
|
307
|
+
# @param [Hash] relator_map
|
308
|
+
# @return [String]
|
309
|
+
def parse_show_value(field, relator_map: Mappers.relator)
|
310
|
+
creator = join_subfields(field, &subfield_not_in?(%w[0 1 4 6 8 e w]))
|
311
|
+
append_relator(field: field, joined_subfields: creator, relator_term_sf: 'e', relator_map: relator_map)
|
312
|
+
end
|
313
|
+
|
314
|
+
# Parse detailed conference show value from given conference field (111/711). If there is no $i, we join subfield
|
315
|
+
# values other than $0, $4, $5, $6, $8, $e, $j, and $w to create conference value. We join subfields $e and $w to
|
316
|
+
# determine the subunit value. We append any relators, preferring those defined in $4 and using $j as a fallback.
|
317
|
+
# @param [MARC::Field] field
|
318
|
+
# @return [String]
|
319
|
+
def parse_conference_detail_show_value(field, relator_map: Mappers.relator)
|
320
|
+
conf = if subfield_undefined? field, 'i'
|
321
|
+
join_subfields field, &subfield_not_in?(%w[0 4 5 6 8 e j w])
|
322
|
+
else
|
323
|
+
''
|
324
|
+
end
|
325
|
+
sub_unit = join_subfields(field, &subfield_in?(%w[e w]))
|
326
|
+
conf = [conf, sub_unit].compact_blank.join(' ')
|
327
|
+
|
328
|
+
append_relator(field: field, joined_subfields: conf, relator_term_sf: 'j', relator_map: relator_map)
|
329
|
+
end
|
267
330
|
end
|
268
331
|
end
|
269
332
|
end
|
@@ -547,6 +547,12 @@ dent:
|
|
547
547
|
- Health Sciences Libraries
|
548
548
|
- Levy Dental Medicine Library
|
549
549
|
display: Levy Dental Medicine Library - Stacks
|
550
|
+
dentpcare:
|
551
|
+
specific_location: Levy Dental Medicine Library - PCare
|
552
|
+
library:
|
553
|
+
- Health Sciences Libraries
|
554
|
+
- Levy Dental Medicine Library
|
555
|
+
display: Levy Dental Medicine Library - PCare
|
550
556
|
dentrare:
|
551
557
|
specific_location: Levy Dental Medicine Library - Rare Books
|
552
558
|
library:
|
data/lib/pennmarc/version.rb
CHANGED
@@ -95,6 +95,23 @@ describe 'PennMARC::Creator' do
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
describe '.show_facet_map' do
|
99
|
+
let(:record) do
|
100
|
+
marc_record fields: [
|
101
|
+
marc_field(tag: '100', subfields: { a: 'Surname, Name', '0': 'http://cool.uri/12345', d: '1900-2000',
|
102
|
+
e: 'author.', '4': 'http://cool.uri/vocabulary/relators/aut' }),
|
103
|
+
marc_field(tag: '110', subfields: { a: 'Group of People', b: 'Annual Meeting', '4': 'aut' }),
|
104
|
+
marc_field(tag: '880', subfields: { a: 'Ignore', '6': '100' })
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'returns expected hash' do
|
109
|
+
values = helper.show_facet_map(record, relator_map: mapping)
|
110
|
+
expect(values).to eq({ 'Surname, Name 1900-2000, author.' => 'Surname, Name 1900-2000',
|
111
|
+
'Group of People Annual Meeting, Author.' => 'Group of People Annual Meeting' })
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
98
115
|
describe '.show_aux' do
|
99
116
|
let(:record) { marc_record fields: fields }
|
100
117
|
|
@@ -257,6 +274,22 @@ describe 'PennMARC::Creator' do
|
|
257
274
|
end
|
258
275
|
end
|
259
276
|
|
277
|
+
describe '.conference_detail_show_facet_map' do
|
278
|
+
let(:record) do
|
279
|
+
marc_record fields: [
|
280
|
+
marc_field(tag: '111', subfields: { a: 'Council of Trent', d: '(1545-1563 :', c: 'Trento, Italy)' }),
|
281
|
+
marc_field(tag: '711', subfields: { a: 'Code4Lib', n: '(18th :', d: '2024 :', c: 'Ann Arbor, MI)' }),
|
282
|
+
marc_field(tag: '880', subfields: { a: 'Alt Ignore', '6': '111' })
|
283
|
+
]
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'returns the expected hash' do
|
287
|
+
value = helper.conference_detail_show_facet_map(record)
|
288
|
+
expect(value).to eq({ 'Council of Trent (1545-1563 : Trento, Italy)' => 'Council of Trent Trento, Italy)',
|
289
|
+
'Code4Lib (18th : 2024 : Ann Arbor, MI)' => 'Code4Lib (18th : Ann Arbor, MI)' })
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
260
293
|
describe '.conference_search' do
|
261
294
|
let(:record) do
|
262
295
|
marc_record fields: [
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pennmarc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Kanning
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-06-
|
13
|
+
date: 2024-06-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|