mabmapper 1.0.0.pre18 → 2.0.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.
@@ -8,7 +8,7 @@ module Mabmapper
8
8
  # Id
9
9
  #
10
10
  field :id do
11
- doc.controlfield('SYS').join
11
+ source.controlfield('SYS').values.join
12
12
  end
13
13
 
14
14
  #
@@ -18,14 +18,14 @@ module Mabmapper
18
18
  value = 'A'
19
19
 
20
20
  # gelöscht -> LDR Position 6 == 'd'
21
- value = 'D' if doc.controlfield('LDR').at(5) == 'd'
21
+ value = 'D' if source.controlfield('LDR').at(5) == 'd'
22
22
  # ausgesondert über Feld 078
23
- value = 'D' if doc.field('078', ind1: 'r').subfield('a').get.value.try(:downcase) == 'aus'
23
+ value = 'D' if source.datafields('078', ind1: 'r').subfields('a').value.try(:downcase) == 'aus'
24
24
  # Standort Detmold unterdrücken
25
- detmold_locations = doc.field('LOC').subfield('n').get.values.flatten
25
+ detmold_locations = source.datafields('LOC').subfields('n').values.flatten
26
26
  value = 'D' if detmold_locations.present? && detmold_locations.all?{|v| v == '50'}
27
27
  # Interimsaufnahmen unterdrücken
28
- value = 'D' if doc.field('537', ind1: '-', ind2: '1').subfield('a').get.values.flatten.any? { |v| v.downcase.include? 'interimsaufnahme' }
28
+ value = 'D' if source.datafields('537', ind1: '-', ind2: '1').subfields('a').values.flatten.any? { |v| v.downcase.include? 'interimsaufnahme' }
29
29
 
30
30
  value
31
31
  end
@@ -34,21 +34,21 @@ module Mabmapper
34
34
  # HT Nummer
35
35
  #
36
36
  field :ht_number do
37
- doc.field('001', ind2: '1').subfield('a').get.value
37
+ source.datafields('001', ind2: '1').subfields('a').value
38
38
  end
39
39
 
40
40
  #
41
41
  # Creation date
42
42
  #
43
43
  field :creation_date do
44
- doc.field('LOC', ind2: ' ').subfield('k').get.values.flatten.map(&:presence).compact.uniq
44
+ source.datafields('LOC', ind2: :blank).subfields('k').values.flatten.map(&:presence).compact.uniq
45
45
  end
46
46
 
47
47
  #
48
48
  # Materialtyp
49
49
  #
50
50
  field :materialtyp do
51
- f050 = doc.controlfield('050')
51
+ f050 = source.controlfield('050')
52
52
  type = case
53
53
  when (%w(a ).include?(f050.at( 0)) ) then 'print'
54
54
  when (%w(a b c).include?(f050.at( 3)) ) then 'microform'
@@ -68,10 +68,10 @@ module Mabmapper
68
68
  # Inhaltstyp
69
69
  #
70
70
  field :inhaltstyp do
71
- f051 = doc.controlfield('051')
72
- f052 = doc.controlfield('052')
73
- f051s = f051.join.slice(1..3) || ""
74
- f052s = f052.join.slice(1..6) || ""
71
+ f051 = source.controlfield('051')
72
+ f052 = source.controlfield('052')
73
+ f051s = f051.values.join.slice(1..3) || ""
74
+ f052s = f052.values.join.slice(1..6) || ""
75
75
 
76
76
  type = case
77
77
  # Monos
@@ -112,7 +112,7 @@ module Mabmapper
112
112
  # Bandzählung von Reihen
113
113
  volumes = []
114
114
  (456..496).step(10) do |f|
115
- value = doc.field("#{f}", ind2: '1').subfield('a').get.value
115
+ value = source.datafields("#{f}", ind2: '1').subfields('a').value
116
116
  volumes << value if value.present?
117
117
  end
118
118
  volumes.first
@@ -122,20 +122,20 @@ module Mabmapper
122
122
  # Title
123
123
  #
124
124
  field :title do
125
- f331_2 = doc.field('331', ind2: '2').subfield('a').get.value
126
- f333_2 = doc.field('333', ind2: '2').subfield('a').get.value
127
- f335_2 = doc.field('335', ind2: '2').subfield('a').get.value
128
- f360_2 = doc.field('360', ind2: '2').subfield('a').get.value
129
-
130
- f089_1 = doc.field('089', ind2: '1').subfield('a').get.value
131
- f331_1 = doc.field('331', ind2: '1').subfield('a').get.value
132
- f333_1 = doc.field('333', ind2: '1').subfield('a').get.value
133
- f335_1 = doc.field('335', ind2: '1').subfield('a').get.value
134
- f360_1 = doc.field('360', ind2: '1').subfield('a').get.value
135
- f304_1 = doc.field('304', ind2: '1').subfield('a').get.value
136
- f310_1 = doc.field('310', ind2: '1').subfield('a').get.value
137
- f340_1 = doc.field('340', ind2: '1').subfield('a').get.value
138
- f341_1 = doc.field('341', ind2: '1').subfield('a').get.value
125
+ f331_2 = source.datafields('331', ind2: '2').subfields('a').value
126
+ f333_2 = source.datafields('333', ind2: '2').subfields('a').value
127
+ f335_2 = source.datafields('335', ind2: '2').subfields('a').value
128
+ f360_2 = source.datafields('360', ind2: '2').subfields('a').value
129
+
130
+ f089_1 = source.datafields('089', ind2: '1').subfields('a').values.join(" ").presence # can occur multple times
131
+ f331_1 = source.datafields('331', ind2: '1').subfields('a').value
132
+ f333_1 = source.datafields('333', ind2: '1').subfields('a').value
133
+ f335_1 = source.datafields('335', ind2: '1').subfields('a').value
134
+ f360_1 = source.datafields('360', ind2: '1').subfields('a').value
135
+ f304_1 = source.datafields('304', ind2: '1').subfields('a').value
136
+ f310_1 = source.datafields('310', ind2: '1').subfields('a').value
137
+ f340_1 = source.datafields('340', ind2: '1').subfields('a').value
138
+ f341_1 = source.datafields('341', ind2: '1').subfields('a').value
139
139
 
140
140
  title = merge(title, f331_2, delimiter: '. ')
141
141
  title = merge(title, f333_2, delimiter: ' / ')
@@ -163,35 +163,42 @@ module Mabmapper
163
163
  end
164
164
 
165
165
  field :short_title_display do
166
- f089_1 = doc.field('089', ind2: '1').subfield('a').get.value # Bandangabe in Vorlageform
167
- f310_1 = doc.field('310', ind1: ['-', 'a'], ind2: '1').subfield('a').get.value # Hauptsachtitel in Ansetzungsform
168
- f331_1 = doc.field('331', ind2: '1').subfield('a').get.value # Hauptsachtitel in Vorlageform oder Mischform
169
- f331_2 = doc.field('331', ind2: '2').subfield('a').get.value #
170
- f334_1 = doc.field('334', ind1: '-', ind2: '1').get.value # Allgemeine Materialbenennung
171
- f335_1 = doc.field('335', ind2: '1').subfield('a').get.value # Zusätze zum Hauptsachtitel
172
-
173
- short_title = if f310_1
174
- f310_1
175
- elsif (f331_1 && f334_1 && f335_1)
176
- "#{f331_1} [#{f334_1}] : #{f335_1}"
177
- elsif (f331_1 && f335_1)
178
- "#{f331_1} : #{f335_1}"
179
- elsif f331_1 && f334_1
180
- "#{f331_1} [#{f334_1}]"
181
- elsif f331_1
182
- f331_1
183
- elsif f089_1 && f089_1.length > 3 && f089_1[/\A(\d|\s)+\Z/].nil? && !['buch', 'hauptbd.'].include?(f089_1.gsub(/\[|\]/, '').downcase)
184
- f089_1.gsub(/.*(bd|Bd).*\,/, '') # Try to remove volume count from
185
- elsif f331_2
186
- f331_2
187
- else
188
- ''
189
- end
166
+ bandangabe_in_vorlageform = source.datafields('089', ind2: '1').subfields('a').values.join(" ")
167
+ hauptsachtitel_in_ansetzungsform = source.datafields('310', ind1: ['-', 'a'], ind2: '1').subfields('a').value
168
+ hauptsachtitel_in_vorlageform = source.datafields('331', ind2: '1').subfields('a').value
169
+ hauptsachtitel_der_überordnung_in_vorlageform = source.datafields('331', ind2: '2').subfields('a').value
170
+ allgemeine_materialbenennung = source.datafields('334', ind1: '-', ind2: '1').value
171
+ zusätze_zum_hauptsachtitel = source.datafields('335', ind2: '1').subfields('a').value
172
+
173
+ # helper
174
+ bandangabe_may_be_used_as_title = -> (bandangabe) {
175
+ has_minimal_length = bandangabe_in_vorlageform.length > 3
176
+ does_not_only_contain_numbers_or_spaces = bandangabe_in_vorlageform[/\A(\d|\s)+\Z/].nil?
177
+ is_no_well_known_identifier = !['buch', 'hauptbd.'].include?(bandangabe_in_vorlageform.gsub(/\[|\]/, '').downcase)
178
+
179
+ has_minimal_length && does_not_only_contain_numbers_or_spaces && is_no_well_known_identifier
180
+ }
190
181
 
191
- short_title.gsub!(/<<|>>/, '')
192
- short_title.strip!
193
- short_title[0] = short_title[0].upcase if short_title.present?
194
- short_title.presence
182
+ if hauptsachtitel_in_ansetzungsform
183
+ hauptsachtitel_in_ansetzungsform
184
+ elsif hauptsachtitel_in_vorlageform
185
+ [
186
+ "#{hauptsachtitel_in_vorlageform}",
187
+ if allgemeine_materialbenennung then "[#{allgemeine_materialbenennung}]" end,
188
+ if zusätze_zum_hauptsachtitel then ": #{zusätze_zum_hauptsachtitel}" end
189
+ ]
190
+ .compact.join(" ")
191
+ elsif bandangabe_may_be_used_as_title.call(bandangabe_in_vorlageform)
192
+ bandangabe_in_vorlageform.gsub(/.*(bd|Bd).*\,/, '') # Try to remove volume count from
193
+ elsif hauptsachtitel_der_überordnung_in_vorlageform
194
+ hauptsachtitel_der_überordnung_in_vorlageform
195
+ end
196
+ .try do |_title|
197
+ _title.gsub(/<<|>>/, '').strip.presence
198
+ end
199
+ .try do |_cleaned_title|
200
+ _cleaned_title[0].upcase << _cleaned_title[1..-1]
201
+ end
195
202
  end
196
203
 
197
204
  field :title_search do
@@ -199,24 +206,24 @@ module Mabmapper
199
206
  search_titles << ref(:title_display)
200
207
 
201
208
  (342..355).each do |f|
202
- search_titles << doc.field("#{f}", ind2: '1').subfield('a').get.values
209
+ search_titles << source.datafields("#{f}", ind2: '1').subfields('a').values
203
210
  end
204
211
 
205
- search_titles << doc.field('370', ind2: '1').subfield('a').get.values
212
+ search_titles << source.datafields('370', ind2: '1').subfields('a').values
206
213
 
207
- search_titles << doc.field('376', ind2: '1').subfield('a').get.values
214
+ search_titles << source.datafields('376', ind2: '1').subfields('a').values
208
215
  (451..491).step(10).each do |f|
209
- search_titles << doc.field("#{f}", ind2: '1').subfield('a').get.values
216
+ search_titles << source.datafields("#{f}", ind2: '1').subfields('a').values
210
217
  end
211
- search_titles << doc.field('502', ind2: '1').subfield('a').get.values
212
- search_titles << doc.field('504', ind2: '1').subfield('a').get.values
213
- search_titles << doc.field('505', ind2: '1').subfield('a').get.values
218
+ search_titles << source.datafields('502', ind2: '1').subfields('a').values
219
+ search_titles << source.datafields('504', ind2: '1').subfields('a').values
220
+ search_titles << source.datafields('505', ind2: '1').subfields('a').values
214
221
  (526..534).each do |f|
215
- search_titles << doc.field("#{f}", ind2: '1').subfield('a').get.values
222
+ search_titles << source.datafields("#{f}", ind2: '1').subfields('a').values
216
223
  end
217
- search_titles << doc.field('621', ind2: '1').subfield('a').get.values
218
- search_titles << doc.field('627', ind2: '1').subfield('a').get.values
219
- search_titles << doc.field('633', ind2: '1').subfield('a').get.values
224
+ search_titles << source.datafields('621', ind2: '1').subfields('a').values
225
+ search_titles << source.datafields('627', ind2: '1').subfields('a').values
226
+ search_titles << source.datafields('633', ind2: '1').subfields('a').values
220
227
 
221
228
  search_titles
222
229
  .flatten
@@ -242,26 +249,26 @@ module Mabmapper
242
249
 
243
250
  # Personen
244
251
  (100..196).step(4) do |f|
245
- doc.field("#{f}", ind1: ['-', 'a'], ind2: ['1', '2']).get.fields.each do |field|
246
- creators << (field.get_subfield('a').try(:value) || field.get_subfield('p').try(:value) || field.get_subfield('c').try(:value))
252
+ source.datafields("#{f}", ind1: ['-', 'a'], ind2: ['1', '2']).each do |datafield|
253
+ creators << (datafield.subfields('a').value || datafield.subfields('p').value || datafield.subfields('c').value)
247
254
  end
248
255
  end
249
256
 
250
- creators.map(&:presence).compact.uniq
257
+ creators.map(&:presence).compact.uniq.map { |element| element.gsub(/<<|>>/, '') }
251
258
  end
252
259
 
253
- def self.corporate_body_from_field(field)
254
- subfield_a = field.get_subfield('a').try(:value) # Körperschafts-/Kongressname/Geografikum ohne IDN-Verknüpfung (NW)
255
- subfield_b = field.get_subfield('b').try(:value) # Unterordnung
256
- subfield_c = field.get_subfield('c').try(:value) # Ort (NW)
257
- subfield_d = field.get_subfield('d').try(:value) # Datum (NW)
258
- subfield_e = field.get_subfield('e').try(:value) # Kongressname (NW)
259
- subfield_g = field.get_subfield('g').try(:value) # Name des Geografikums (NW)
260
- subfield_h = field.get_subfield('h').try(:value) # Zusatz
261
- subfield_k = field.get_subfield('k').try(:value) # Körperschaftsname (NW)
262
- subfield_n = field.get_subfield('n').try(:value) # Zählung (W)
263
- subfield_x = field.get_subfield('x').try(:value) # nachgeordneter Teil (W)
264
- subfield_z = field.get_subfield('x').try(:value) # geografische Unterteilung (W)
260
+ def self.corporate_body_from_field(datafield)
261
+ subfield_a = datafield.subfields('a').value # Körperschafts-/Kongressname/Geografikum ohne IDN-Verknüpfung (NW)
262
+ subfield_b = datafield.subfields('b').value # Unterordnung
263
+ subfield_c = datafield.subfields('c').value # Ort (NW)
264
+ subfield_d = datafield.subfields('d').value # Datum (NW)
265
+ subfield_e = datafield.subfields('e').value # Kongressname (NW)
266
+ subfield_g = datafield.subfields('g').value # Name des Geografikums (NW)
267
+ subfield_h = datafield.subfields('h').value # Zusatz
268
+ subfield_k = datafield.subfields('k').value # Körperschaftsname (NW)
269
+ subfield_n = datafield.subfields('n').value # Zählung (W)
270
+ subfield_x = datafield.subfields('x').value # nachgeordneter Teil (W)
271
+ subfield_z = datafield.subfields('x').value # geografische Unterteilung (W)
265
272
 
266
273
  if !subfield_a && subfield_b && !subfield_c && !subfield_e && !subfield_g && subfield_h && subfield_k && !subfield_x && !subfield_z
267
274
  "#{subfield_k} <#{subfield_h}> / #{subfield_b}"
@@ -282,7 +289,7 @@ module Mabmapper
282
289
 
283
290
  # Körpferschaften
284
291
  (200..296).step(4) do |f|
285
- doc.field("#{f}", ind1: ['-', 'a'], ind2: ['1', '2']).get.fields.each do |field|
292
+ source.datafields("#{f}", ind1: ['-', 'a'], ind2: ['1', '2']).each do |field|
286
293
  creators << engine.corporate_body_from_field(field)
287
294
  end
288
295
  end
@@ -291,8 +298,8 @@ module Mabmapper
291
298
  end
292
299
 
293
300
  field :author_statement do
294
- f359_1 = doc.field('359', ind1:"-", ind2:'1').subfield('a').get.values.flatten.presence
295
- f359_2 = doc.field('359', ind1:"-", ind2:'2').subfield('a').get.values.flatten.presence
301
+ f359_1 = source.datafields('359', ind1: :blank, ind2:'1').subfields('a').values.flatten.presence
302
+ f359_2 = source.datafields('359', ind1: :blank, ind2:'2').subfields('a').values.flatten.presence
296
303
  f359_1 || f359_2
297
304
  end
298
305
 
@@ -304,9 +311,9 @@ module Mabmapper
304
311
 
305
312
  # Personen
306
313
  (100..196).step(4) do |f|
307
- doc.field("#{f}", ind1: ['b', 'c', 'e', 'f'], ind2: ['1', '2']).get.fields.each do |field|
308
- name = (field.get_subfield('a').try(:value) || field.get_subfield('p').try(:value) || field.get_subfield('c').try(:value))
309
- action_designator = field.get_subfield('b').try(:value)
314
+ source.datafields("#{f}", ind1: ['b', 'c', 'e', 'f'], ind2: ['1', '2']).each do |datafield|
315
+ name = (datafield.subfields('a').value || datafield.subfields('p').value || datafield.subfields('c').value)
316
+ action_designator = datafield.subfields('b').value
310
317
  contributors << [name, action_designator].map(&:presence).compact.join(' ')
311
318
  end
312
319
  end
@@ -319,7 +326,7 @@ module Mabmapper
319
326
 
320
327
  # Körpferschaften
321
328
  (200..296).step(4) do |f|
322
- doc.field("#{f}", ind1: ['b', 'c', 'e', 'f'], ind2: ['1', '2']).get.fields.each do |field|
329
+ source.datafields("#{f}", ind1: ['b', 'c', 'e', 'f'], ind2: ['1', '2']).each do |field|
323
330
  contributors << engine.corporate_body_from_field(field)
324
331
  end
325
332
  end
@@ -332,16 +339,16 @@ module Mabmapper
332
339
 
333
340
  # Personen
334
341
  (100..196).step(4) do |f|
335
- creators << doc.field("#{f}", ind2: ['1', '2']).subfield(['a','p','c','n','b']).get.value
342
+ creators << source.datafields("#{f}", ind2: ['1', '2']).map { |_field| _field.subfields(['a','p','n','c','b']).values.presence.try(:join, " ") }
336
343
  end
337
344
 
338
345
  # Körperschaften
339
346
  (200..296).step(4) do |f|
340
- creators << doc.field("#{f}", ind2: ['1', '2']).subfield(['a','k','b','e','c','n','g','h']).get.value
347
+ creators << source.datafields("#{f}", ind2: ['1', '2']).map { |_field| _field.subfields(['a','k','b','e','n','c','g','h']).values.presence.try(:join, " ") }
341
348
  end
342
349
 
343
350
  # Sonderfall: Verfasserangaben aus 359 -> [u.a.]
344
- t = doc.field("359", ind2: '1').subfield('a').get.value.presence
351
+ t = source.datafields("359", ind2: '1').subfields('a').value
345
352
  creators << '[u.a.]' if t && t.match(/\.\.\.|\[u\.a\.\]/i)
346
353
 
347
354
  # Cleanup
@@ -371,15 +378,15 @@ module Mabmapper
371
378
  creators.reject!{|e| e == '[u.a.]'}
372
379
 
373
380
  # + Index Felder für Personen
374
- creators << doc.field('PPE').subfield(['a', 'p']).get.values
381
+ creators << source.datafields('PPE').subfields(['a', 'p']).values
375
382
 
376
383
  # + zweiteilige Nebeneintragungen / beigefügte oder enthaltene Werke
377
384
  (800..824).step(6) do |f|
378
- creators << doc.field("#{f}").subfield(['a','p','c','n','b']).get.values
385
+ creators << source.datafields("#{f}").subfields(['a','p','c','n','b']).values
379
386
  end
380
387
 
381
388
  # + Index Felder für Körperschaften
382
- creators << doc.field('PKO').subfield(['a','k','b','e','g']).get.values
389
+ creators << source.datafields('PKO').subfields(['a','k','b','e','g']).values
383
390
 
384
391
  # Füge alle Teile zusammen
385
392
  creators = creators.flatten.compact
@@ -393,9 +400,9 @@ module Mabmapper
393
400
  # Edition
394
401
  #
395
402
  field :edition do
396
- f403_1 = doc.field('403', ind2: '1').subfield('a').get.value
397
- f403_2 = doc.field('403', ind2: '2').subfield('a').get.value
398
- f407_1 = doc.field('407', ind2: '1').subfield('a').get.value
403
+ f403_1 = source.datafields('403', ind2: '1').subfields('a').value
404
+ f403_2 = source.datafields('403', ind2: '2').subfields('a').value
405
+ f407_1 = source.datafields('407', ind2: '1').subfields('a').value
399
406
 
400
407
  f403_1.presence || f403_2.presence || f407_1.presence
401
408
  end
@@ -404,62 +411,83 @@ module Mabmapper
404
411
  # Publisher
405
412
  #
406
413
  field :publisher do
407
- # Verlagsort
408
- f410_1 = doc.field('410', ind2: '1').subfield('a').get.value
409
- f410_2 = doc.field('410', ind2: '2').subfield('a').get.value
410
- f415_1 = doc.field('415', ind2: '1').subfield('a').get.value
411
- f415_2 = doc.field('415', ind2: '2').subfield('a').get.value
414
+ publisher = []
415
+
416
+ is_rda_record = source.datafields('419').present?
412
417
 
413
- f410 = f410_1.presence or f410_2.presence
414
- f415 = f415_1.presence or f415_2.presence
418
+ if is_rda_record
419
+ source.datafields('419').each do |_veröffentlichungsangabe|
420
+ verlagsorte = _veröffentlichungsangabe.subfields('a').values.first.try(:split, ';').try(:map!, &:strip)
421
+ verlagsname = _veröffentlichungsangabe.subfields('b').value
422
+ erster_verlagsort = verlagsorte.try(:first)
415
423
 
416
- # Verleger
417
- f412_1 = doc.field('412', ind2: '1').subfield('a').get.value
418
- f412_2 = doc.field('412', ind2: '2').subfield('a').get.value
419
- f417_1 = doc.field('417', ind2: '1').subfield('a').get.value
420
- f417_2 = doc.field('417', ind2: '2').subfield('a').get.value
424
+ if verlagsname.present?
425
+ publisher << [erster_verlagsort, verlagsname].compact.join(" : ")
426
+ end
427
+ end
428
+ else # is rak record
429
+ orte_der_ersten_verleger = source.datafields('410', ind2: '1').subfields('a').values.presence
430
+ orte_der_ersten_verleger_der_überordnung = source.datafields('410', ind2: '2').subfields('a').values.presence
431
+ orte_der_zweiten_verleger = source.datafields('415', ind2: '1').subfields('a').values.presence
432
+ orte_der_zweiten_verleger_der_überordnung = source.datafields('415', ind2: '2').subfields('a').values.presence
421
433
 
422
- f412 = f412_1.presence or f412_2.presence
423
- f417 = f417_1.presence or f417_2.presence
424
- # ... weitere Verleger in 418 ohne Ortsangabe ignorieren wir
434
+ orte_der_ersten_verleger ||= orte_der_ersten_verleger_der_überordnung
435
+ orte_der_zweiten_verleger ||= orte_der_zweiten_verleger_der_überordnung
425
436
 
426
- publisher = []
427
- publisher << [f410, f412].map(&:presence).compact.join(' : ')
428
- publisher << [f415, f417].map(&:presence).compact.join(' : ')
429
- publisher.map(&:presence).compact.map { |element| element.gsub(/<<|>>/, '') }
437
+ namen_der_ersten_verleger = source.datafields('412', ind2: '1').subfields('a').values.presence
438
+ namen_der_ersten_verleger_der_überordnung = source.datafields('412', ind2: '2').subfields('a').values.presence
439
+ namen_der_zweiten_verleger = source.datafields('417', ind2: '1').subfields('a').values.presence
440
+ namen_der_zweiten_verleger_der_überordnung = source.datafields('417', ind2: '2').subfields('a').values.presence
441
+
442
+ namen_der_ersten_verleger ||= namen_der_ersten_verleger_der_überordnung
443
+ namen_der_zweiten_verleger ||= namen_der_zweiten_verleger_der_überordnung
444
+
445
+ # ... weitere Verleger in 418 ohne Ortsangabe ignorieren wir
446
+
447
+ erste_verleger = namen_der_ersten_verleger
448
+ .try(:map).try(:with_index) do |_name_eines_ersten_verlegers, _index|
449
+ [orte_der_ersten_verleger.try(:[], _index), _name_eines_ersten_verlegers].compact.join(" : ")
450
+ end
451
+
452
+ zweite_verleger = namen_der_zweiten_verleger
453
+ .try(:map).try(:with_index) do |_name_eines_zweiten_verlegers, _index|
454
+ [orte_der_zweiten_verleger.try(:[], _index), _name_eines_zweiten_verlegers].compact.join(" : ")
455
+ end
456
+
457
+ publisher.concat(erste_verleger) if erste_verleger.present?
458
+ publisher.concat(zweite_verleger) if zweite_verleger.present?
459
+ end
460
+
461
+ publisher.map! { |_verleger| _verleger.gsub(/<<|>>/, '') }
430
462
  end
431
463
 
432
464
  #
433
465
  # Creation date
434
466
  #
435
467
  field :creationdate do
436
- f051 = doc.controlfield('051')
437
- f052 = doc.controlfield('052')
438
-
439
- f425_a1 = doc.field('425', ind1: 'a', ind2: '1').subfield('a').get.value # Erscheinungsjahr in Sortierform
440
- f425_b1 = doc.field('425', ind1: 'b', ind2: '1').subfield('a').get.value # Erscheinungsjahr in Sortierform des frühsten Bandes
441
- f425_c1 = doc.field('425', ind1: 'c', ind2: '1').subfield('a').get.value # Erscheinungsjahr in Sortierform des letzten Bandes
442
- f425_p1 = doc.field('425', ind1: 'p', ind2: '1').subfield('a').get.value # Erscheinungsjahr in Sortierform eines Tonträgers
443
- f595 = doc.field('595').get.value # Erscheinungsjahr der Quelle
444
-
445
- if f595.present?
446
- f595 # Erscheinungsjahr der Quelle hat Vorrang vor dem eigentlichen Erscheinungsjahr (falls vorhanden)
447
- elsif %w(n t).include?(f051.at(0)) or %w(r p).include?(f052.at(0)) # es handelt sich um eine Überordnung
448
- if f425_b1.present? and f425_c1.present?
449
- if f425_b1 == f425_c1
450
- f425_b1
451
- else
452
- "#{f425_b1} – #{f425_c1}"
453
- end
454
- elsif f425_b1.present? and not f425_c1.present?
455
- "#{f425_b1} –"
456
- elsif f425_c1.present? and not f425_b1.present?
457
- "– #{f425_c1}"
458
- else
459
- f425_a1.presence || f425_p1.presence
460
- end
468
+ is_superorder = begin
469
+ f051 = source.controlfield('051')
470
+ f052 = source.controlfield('052')
471
+
472
+ %w(n t).include?(f051.at(0)) || %w(r p).include?(f052.at(0))
473
+ end
474
+
475
+ erscheinungsjahr_in_ansetzungsform = source.datafields('425', ind1: 'a', ind2: '1').subfields('a').value
476
+ erscheinungsjahr_des_ersten_bandes = source.datafields('425', ind1: 'b', ind2: '1').subfields('a').value
477
+ erscheinungsjahr_des_letzten_bandes = source.datafields('425', ind1: 'c', ind2: '1').subfields('a').value
478
+ publikationsdatum_bei_tonträgern = source.datafields('425', ind1: 'p', ind2: '1').subfields('a').value
479
+ erscheinungsjahr_der_quelle = source.datafields('595').value
480
+
481
+ if erscheinungsjahr_der_quelle
482
+ erscheinungsjahr_der_quelle # hat Vorrang vor dem eigentlichen Erscheinungsjahr
483
+ elsif is_superorder && (erscheinungsjahr_des_ersten_bandes || erscheinungsjahr_des_letzten_bandes)
484
+ [
485
+ erscheinungsjahr_des_ersten_bandes,
486
+ erscheinungsjahr_des_letzten_bandes
487
+ ]
488
+ .uniq.join(" - ").strip # returns either "xxxx -", "xxxx - yyyy" or "- yyyy"
461
489
  else
462
- f425_a1.presence || f425_p1.presence
490
+ erscheinungsjahr_in_ansetzungsform || publikationsdatum_bei_tonträgern
463
491
  end
464
492
  end
465
493
 
@@ -474,11 +502,11 @@ module Mabmapper
474
502
  # Format
475
503
  #
476
504
  field :format do
477
- f433 = doc.field('433', ind2: '1').subfield('a').get.value
478
- f434 = doc.field('434', ind2: '1').subfield('a').get.values.join(', ')
479
- f435 = doc.field('435', ind2: '1').subfield('a').get.value
480
- f437 = doc.field('437', ind2: '1').subfield('a').get.value
481
- f653 = doc.field('653', ind2: '1').subfield('a').get.values.join(', ')
505
+ f433 = source.datafields('433', ind2: '1').subfields('a').value
506
+ f434 = source.datafields('434', ind2: '1').subfields('a').values.join(', ')
507
+ f435 = source.datafields('435', ind2: '1').subfields('a').value
508
+ f437 = source.datafields('437', ind2: '1').subfields('a').value
509
+ f653 = source.datafields('653', ind2: '1').subfields('a').values.join(', ')
482
510
 
483
511
  format = f433
484
512
  format = merge(format, f434, delimiter: ' : ')
@@ -493,16 +521,16 @@ module Mabmapper
493
521
  # Is part of
494
522
  #
495
523
  field :is_part_of do
496
- f525 = doc.field('525', ind2: '1').subfield(['p','a']).get.value(join_subfields: ': ')
497
- f590 = doc.field('590', ind2: '1').subfield('a').get.value
498
- f591 = doc.field('591', ind2: '1').subfield('a').get.value
499
- f592 = doc.field('592', ind2: '1').subfield('a').get.value
500
- f593 = doc.field('593', ind2: '1').subfield('a').get.value
501
- f594 = doc.field('594', ind2: '1').subfield('a').get.value
502
- f595 = doc.field('595', ind2: '1').subfield('a').get.value
503
- f596 = doc.field('596', ind2: '1').subfield('a').get.value
504
- f597 = doc.field('597', ind2: '1').subfield('a').get.value
505
- f598 = doc.field('598', ind2: '1').subfield('a').get.value
524
+ f525 = source.datafields('525', ind2: '1').subfields(['p','a']).values.presence.try(:join, ': ')
525
+ f590 = source.datafields('590', ind2: '1').subfields('a').value
526
+ f591 = source.datafields('591', ind2: '1').subfields('a').value
527
+ f592 = source.datafields('592', ind2: '1').subfields('a').value
528
+ f593 = source.datafields('593', ind2: '1').subfields('a').value
529
+ f594 = source.datafields('594', ind2: '1').subfields('a').value
530
+ f595 = source.datafields('595', ind2: '1').subfields('a').value
531
+ f596 = source.datafields('596', ind2: '1').subfields('a').value
532
+ f597 = source.datafields('597', ind2: '1').subfields('a').value
533
+ f598 = source.datafields('598', ind2: '1').subfields('a').value
506
534
 
507
535
  #f599_1 = doc.datafield('599', ind1: 'a,b', ind2: '1', subfield: 'a', multiple: true).join(' ') # ISSN
508
536
  #f599_2 = doc.datafield('599', ind1: 'c,d', ind2: '1', subfield: 'a', multiple: true).join(' ') # ISBN
@@ -533,9 +561,15 @@ module Mabmapper
533
561
  #
534
562
  field :isbn do
535
563
  isbns = []
536
- isbns << doc.field('540', ind1: '-z', ind2: '1').subfield('a').get.values
537
- isbns << doc.field('634', ind1: '-z', ind2: '1').subfield('a').get.values
538
- isbns << doc.field('086', ind2: '1').subfield(['b','c','d']).get.values
564
+ source.datafields('540', ind2: '1').each do |_datafield|
565
+ isbns << _datafield.subfields('a').values if _datafield.ind1 != "z"
566
+ end
567
+
568
+ source.datafields('634', ind2: '1').each do |_datafield|
569
+ isbns << _datafield.subfields('a').values if _datafield.ind1 != "z"
570
+ end
571
+
572
+ isbns << source.datafields('086', ind2: '1').subfields(['b','c','d']).values
539
573
  isbns.flatten.map{|v| v.gsub(/[^0-9\-x]/i, '').strip if v.present?}.map(&:presence).compact.uniq
540
574
  end
541
575
 
@@ -544,9 +578,15 @@ module Mabmapper
544
578
  #
545
579
  field :issn do
546
580
  issns = []
547
- issns << doc.field('542', ind1: '-z', ind2: '1').subfield('a').get.values
548
- issns << doc.field('635', ind1: '-z', ind2: '1').subfield('a').get.values
549
- issns << doc.field('545', ind2: '1').subfield(['a','b','c','d']).get.values
581
+ source.datafields('542', ind2: '1').each do |_datafield|
582
+ issns << _datafield.subfields('a').values if _datafield.ind1 != "z"
583
+ end
584
+
585
+ source.datafields('635', ind2: '1').each do |_datafield|
586
+ issns << _datafield.subfields('a').values if _datafield.ind1 != "z"
587
+ end
588
+
589
+ issns << source.datafields('545', ind2: '1').subfields(['a','b','c','d']).values
550
590
  issns.flatten.map{|v| v.gsub(/[^0-9\-x]/i, '').strip if v.present?}.map(&:presence).compact.uniq
551
591
  end
552
592
 
@@ -555,7 +595,7 @@ module Mabmapper
555
595
  #
556
596
  field :zdb_id do
557
597
  zdb_ids = []
558
- zdb_ids << doc.field('025', ind1: 'z', ind2: '1').subfield('a').get.values
598
+ zdb_ids << source.datafields('025', ind1: 'z', ind2: '1').subfields('a').values
559
599
  zdb_ids.flatten.map(&:presence).compact.uniq
560
600
  end
561
601
 
@@ -565,11 +605,11 @@ module Mabmapper
565
605
  field :subject do
566
606
  subjects = []
567
607
 
568
- subjects << doc.field('902').subfield(['a','p','k','s','g','e','t']).get.values
608
+ subjects << source.datafields('902').subfields(['a','p','k','s','g','e','t']).values
569
609
 
570
610
  # Beispiel aus 740: New York (N.Y.)--Social life and customs--20th century--Fiction.
571
611
  %w(710 711 740).each do |f|
572
- t = doc.field(f).subfield('a').get.values
612
+ t = source.datafields(f).subfields('a').values
573
613
  t = t.flatten.map(&:presence).compact
574
614
  t = t.map{|a| a.split('--')}.flatten.map{|s| s.end_with?('.') ? s[0..-2].strip : s}.map(&:presence).compact.uniq
575
615
  subjects = subjects + t
@@ -585,7 +625,7 @@ module Mabmapper
585
625
  subjects << ref(:subject)
586
626
 
587
627
  # + Index Felder für weitere Schlagworte
588
- subjects << doc.field('PSW').subfield(['a','k','e','g','s','p','t','f','z']).get.values
628
+ subjects << source.datafields('PSW').subfields(['a','k','e','g','s','p','t','f','z']).values
589
629
 
590
630
  subjects.flatten.map(&:presence).compact.map{|f| f.delete('<').delete('>')}.uniq
591
631
  end
@@ -595,8 +635,8 @@ module Mabmapper
595
635
  #
596
636
  field :ddc do
597
637
  ddc_fields = []
598
- ddc_fields << doc.field('700', ind1: 'b', ind2: '1').subfield('a').get.values
599
- ddc_fields << doc.field('705', ind1: ' ', ind2: '1').subfield('a').get.values
638
+ ddc_fields << source.datafields('700', ind1: 'b', ind2: '1').subfields('a').values
639
+ ddc_fields << source.datafields('705', ind1: :blank, ind2: '1').subfields('a').values
600
640
 
601
641
  ddc_fields.flatten.map(&:presence).compact.uniq
602
642
  end
@@ -607,9 +647,9 @@ module Mabmapper
607
647
  field :abstract do
608
648
  abstracts = []
609
649
 
610
- abstracts << doc.field('750').subfield('a').get.value
611
- abstracts << doc.field('753').subfield('a').get.value
612
- abstracts << doc.field('756').subfield('a').get.value
650
+ abstracts << source.datafields('750').subfields('a').value
651
+ abstracts << source.datafields('753').subfields('a').value
652
+ abstracts << source.datafields('756').subfields('a').value
613
653
 
614
654
  abstracts.map(&:presence).compact
615
655
  end
@@ -619,7 +659,7 @@ module Mabmapper
619
659
  #
620
660
  field :language do
621
661
  languages = []
622
- languages << doc.field('037', ind1: 'b', ind2: ['1','2']).subfield('a').get.values
662
+ languages << source.datafields('037', ind1: 'b', ind2: ['1','2']).subfields('a').values
623
663
  languages.flatten.map(&:presence).compact.uniq
624
664
  end
625
665
 
@@ -629,14 +669,14 @@ module Mabmapper
629
669
  field :relation do
630
670
  relations = []
631
671
 
632
- if (f021a = doc.field('021').subfield('a').get.value).present?
672
+ if (f021a = source.datafields('021').subfields('a').value).present?
633
673
  relations << {
634
674
  ht_number: f021a,
635
675
  label: 'Primärform'
636
676
  }
637
677
  end
638
678
 
639
- if (f022a = doc.field('022').subfield('a').get.value).present?
679
+ if (f022a = source.datafields('022').subfields('a').value).present?
640
680
  relations << {
641
681
  ht_number: f022a,
642
682
  label: 'Sekundärform'
@@ -644,11 +684,11 @@ module Mabmapper
644
684
  end
645
685
 
646
686
  (526..534).each do |mab_field_number|
647
- doc.field("#{mab_field_number}", ind2: '1').get.fields.each do |field|
648
- ht_number = field.get_subfield('9').try(:value).presence
687
+ source.datafields("#{mab_field_number}", ind2: '1').each do |datafield|
688
+ ht_number = datafield.subfields('9').value
649
689
  label = [
650
- field.get_subfield('p').try(:value).presence,
651
- field.get_subfield('a').try(:value).try(:gsub, /<<|>>/, '').presence
690
+ datafield.subfields('p').value,
691
+ datafield.subfields('a').value.try(:gsub, /<<|>>/, '')
652
692
  ].compact.join(' ')
653
693
 
654
694
  relations << {ht_number: ht_number, label: label} if label
@@ -666,23 +706,24 @@ module Mabmapper
666
706
 
667
707
  # Link zur Überordung eines mehrbändigen Werkes
668
708
  superorders << {
669
- ht_number: doc.field('010', ind2: '1').subfield('a').get.value,
670
- label: doc.field('331', ind2: '2').subfield('a').get.value,
671
- volume_count: doc.field('089', ind2: '1').subfield('a').get.value # Bandzählung dieses Werkes innerhalb der entsprechenden Überordnung
709
+ ht_number: source.datafields('010', ind2: '1').subfields('a').value,
710
+ label: source.datafields('331', ind2: '2').subfields('a').value,
711
+ volume_count: source.datafields('089', ind2: '1').subfields('a').values.presence.try(:join, " ") # Bandzählung dieses Werkes innerhalb der entsprechenden Überordnung
672
712
  }
673
713
 
674
714
  # 451 ff
675
715
  (451..491).step(10) do |f|
676
716
  superorders << {
677
- ht_number: doc.field("#{f+2}", ind2: '1').subfield('a').get.value,
678
- label: [doc.field("#{f}", ind2: '1').subfield('a').get.value, doc.field("#{f}", ind2: '2').subfield('a').get.value].compact.reject { |label| label[/\A\.\.\.\s+(;|:)/] }.first,
679
- volume_count: doc.field("#{f+4}", ind2: '1').subfield('a').get.value
717
+ ht_number: source.datafields("#{f+2}", ind2: '1').subfields('a').value,
718
+ label: [source.datafields("#{f}", ind2: '1').subfields('a').value, source.datafields("#{f}", ind2: '2').subfields('a').value].compact.reject { |label| label[/\A\.\.\.\s+(;|:)/] }.first,
719
+ volume_count: source.datafields("#{f+4}", ind2: '1').subfields('a').value
680
720
  }
681
721
  end
682
722
 
683
723
  superorders
684
724
  .map(&:presence)
685
725
  .delete_if { |element| element[:label].blank? }
726
+ .deep_dup # to be able tu use .gsub!
686
727
  .each do |element|
687
728
  # remove 'not sort' indicators from label
688
729
  element[:label].try(:gsub!, /<<|>>/, '')
@@ -726,8 +767,8 @@ module Mabmapper
726
767
  field :superorder do
727
768
  superorders = []
728
769
 
729
- f623 = doc.field('623').get.value # Identifikationsnummer des 1. GT der Sekundärform
730
- f629 = doc.field('629').get.value # Identifikationsnummer des 2. GT der Sekundärform
770
+ f623 = source.datafields('623').value # Identifikationsnummer des 1. GT der Sekundärform
771
+ f629 = source.datafields('629').value # Identifikationsnummer des 2. GT der Sekundärform
731
772
 
732
773
  superorders << if (json_encoded_superorders_display = ref(:superorder_display)).present?
733
774
  superorders_display = json_encoded_superorders_display.map { |json_encoded_superorder_display| JSON.parse(json_encoded_superorder_display) }
@@ -744,8 +785,8 @@ module Mabmapper
744
785
  # Sind wir eine Überordnung?
745
786
  #
746
787
  field :is_superorder do
747
- f051 = doc.controlfield('051')
748
- f052 = doc.controlfield('052')
788
+ f051 = source.controlfield('051')
789
+ f052 = source.controlfield('052')
749
790
 
750
791
  f051.at(0) == 'n' || f051.at(0) == 't' || f052.at(0) == 'p' || f052.at(0) == 'r' || f052.at(0) == 'z'
751
792
  end
@@ -761,10 +802,10 @@ module Mabmapper
761
802
  # Erscheinungsform
762
803
  #
763
804
  field :erscheinungsform do
764
- f051 = doc.controlfield('051')
765
- f052 = doc.controlfield('052')
766
- f051s = f051.join.slice(1..3) || ""
767
- f052s = f052.join.slice(1..6) || ""
805
+ f051 = source.controlfield('051')
806
+ f052 = source.controlfield('052')
807
+ f051s = f051.values.join.slice(1..3) || ""
808
+ f052s = f052.values.join.slice(1..6) || ""
768
809
 
769
810
  type = case
770
811
  when (f051.at(0) == 'a') then 'article'
@@ -802,20 +843,20 @@ module Mabmapper
802
843
  descriptions = []
803
844
 
804
845
  # 405 - Erscheinungsverlauf von Zeitschriften
805
- descriptions << doc.field('405', ind2: '1').subfield(['a', 'p']).get.values(join_subfields: ': ')
846
+ descriptions << source.datafields('405', ind2: '1').map { |_field| _field.subfields(['p', 'a']).values.join(': ') }
806
847
 
807
848
  # 522 - Teilungsvermerk bei fortlaufenden Sammelwerken
808
- descriptions << doc.field('522', ind2: '1').subfield(['a', 'p']).get.values(join_subfields: ': ')
849
+ descriptions << source.datafields('522', ind2: '1').map { |_field| _field.subfields(['p', 'a']).values.join(': ') }
809
850
 
810
851
  # 523 - Erscheinungsverlauf von Monos
811
- descriptions << doc.field('523', ind2: '1').subfield(['a', 'p']).get.values(join_subfields: ': ')
852
+ descriptions << source.datafields('523', ind2: '1').map { |_field| _field.subfields(['p', 'a']).values.join(': ') }
812
853
 
813
854
  (501..519).each do |f|
814
- descriptions << doc.field("#{f}", ind2: '1').subfield(['a', 'p']).get.values(join_subfields: ': ')
855
+ descriptions << source.datafields("#{f}", ind2: '1').map { |_field| _field.subfields(['p', 'a']).values.join(': ') }
815
856
  end
816
857
 
817
858
  (536..537).each do |f|
818
- descriptions << doc.field("#{f}", ind2: '1').subfield(['a', 'p']).get.values(join_subfields: ': ') unless f == 537 && ref(:erscheinungsform) == "journal"
859
+ descriptions << source.datafields("#{f}", ind2: '1').map { |_field| _field.subfields(['p', 'a']).values.join(': ') } unless f == 537 && ref(:erscheinungsform) == "journal"
819
860
  end
820
861
 
821
862
  # Finally...
@@ -840,16 +881,16 @@ module Mabmapper
840
881
 
841
882
  field :volume_count_sort do
842
883
  possible_values = []
843
- possible_values << doc.field('090', ind2: '1').subfield('a').get.value
844
- (451..491).step(10) { |f| possible_values << doc.field("#{f+5}", ind2: '1').subfield('a').get.value }
884
+ possible_values << source.datafields('090', ind2: '1').subfields('a').value
885
+ (451..491).step(10) { |f| possible_values << source.datafields("#{f+5}", ind2: '1').subfields('a').value }
845
886
  count = possible_values.map(&:presence).compact.uniq.first
846
887
  count.rjust(15, '0') if count.present?
847
888
  end
848
889
 
849
890
  field :volume_count_sort2 do
850
891
  possible_values = []
851
- possible_values << doc.field('090', ind2: '1').subfield('a').get.value
852
- (451..491).step(10) { |f| possible_values << doc.field("#{f+5}", ind2: '1').subfield('a').get.value }
892
+ possible_values << source.datafields('090', ind2: '1').subfields('a').value
893
+ (451..491).step(10) { |f| possible_values << source.datafields("#{f+5}", ind2: '1').subfields('a').value }
853
894
  count = possible_values.map(&:presence).compact.uniq.first
854
895
 
855
896
  if count.present?
@@ -876,7 +917,7 @@ module Mabmapper
876
917
  # Notation
877
918
  #
878
919
  field :notation do
879
- doc.field('700', ind2: ' ').subfield('a').get.values(join_subfields: '')
920
+ source.datafields('700', ind2: ' ').subfields('a').values
880
921
  end
881
922
 
882
923
  field :notation_sort do
@@ -887,7 +928,7 @@ module Mabmapper
887
928
  # Table of contents
888
929
  #
889
930
  field :toc do
890
- doc.field('TXT').subfield('a').get.values.join(' ')
931
+ source.datafields('TXT').subfields('a').values.join(' ')
891
932
  end
892
933
 
893
934
  #
@@ -897,11 +938,11 @@ module Mabmapper
897
938
  signatures = []
898
939
 
899
940
  # Lade LOC Felder für Signaturen-Extraktion
900
- fields = doc.field('LOC').subfield(['b','d','5']).get.fields.presence || []
941
+ fields = source.datafields('LOC')
901
942
  # Lösche alle Felder die kein Unterfeld d haben (ausgesondert)
902
- fields = fields.reject{|f| f.subfields.find{|sf| sf.name == "d"}.blank?}
943
+ fields = fields.reject{|f| f.subfields.find{|sf| sf.code == "d"}.blank?}
903
944
  # Prüfe ob alle Exemplare im Magazin stehen
904
- all_stack = fields.map{|f| f.subfields.find {|sf| sf.name == 'b' && sf.value.match(/02|03|04|07/)}.present?}.all?
945
+ all_stack = fields.map{|f| f.subfields.find {|sf| sf.code == 'b' && sf.value.match(/02|03|04|07/)}.present?}.all?
905
946
 
906
947
  # Zeitschriftensignatur (haben Vorrgang, falls vorhanden)
907
948
  #
@@ -909,16 +950,16 @@ module Mabmapper
909
950
  # Darüber hinaus kann dieses Feld mehrfach vorkommen. Wir nehmen an, dass Subfeld 0 eine Art Zählung angibt, weshalb dort
910
951
  # ein Wert von '1' zu bevorzugen ist.
911
952
  #
912
- signatures << doc.field('200', ind1: ' ', ind2: ' ').get.fields
913
- .select { |f| f.get_subfield('f').present? }
914
- .select { |f| (value = f.get_subfield('0').try(:value)) == '1' || value.nil? }
915
- .map { |f| f.get_subfield('f').value.try(:gsub, ' ', '') }
953
+ signatures << source.datafields('200', ind1: ' ', ind2: ' ')
954
+ .select { |f| f.subfields('f').present? }
955
+ .select { |f| (value = f.subfields('0').value) == '1' || value.nil? }
956
+ .map { |f| f.subfields('f').value.try(:gsub, ' ', '') }
916
957
  .first.presence
917
958
 
918
959
  # Wenn alle Exemplare im Magzin stehen, dann nimm nur die erste signatur
919
960
  if all_stack
920
961
  fields.each do |field|
921
- subfield = field.subfields.find{|f| f.name == "d"}
962
+ subfield = field.subfields.find{|f| f.code == "d"}
922
963
  if subfield.present? && subfield.value.present?
923
964
  signatures << subfield.value
924
965
  break
@@ -927,14 +968,14 @@ module Mabmapper
927
968
  # ansonsten extrahiere aus den normalen Signaturen eine Basis-Signatur
928
969
  else
929
970
  # Lösche alle Felder die als Standordkennziffer eine Magazinkennung haben
930
- fields = fields.reject{|f| f.subfields.find{|sf| sf.name == 'b' && sf.value.match(/02|03|04|07/)}.present?}
971
+ fields = fields.reject{|f| f.subfields.find{|sf| sf.code == 'b' && sf.value.match(/02|03|04|07/)}.present?}
931
972
 
932
973
  # Sortiere die restlichen Felder nach Unterfeld 5 (Strichcode)
933
974
  fields = fields.sort do |x, y|
934
- x5 = x.subfields.find{|f| f.name == "5"}
935
- y5 = y.subfields.find{|f| f.name == "5"}
975
+ x5 = x.subfields.find{|f| f.code == "5"}
976
+ y5 = y.subfields.find{|f| f.code == "5"}
936
977
  if x5 && y5
937
- x5.value <=> y.value
978
+ x5.value <=> y5.value
938
979
  else
939
980
  0
940
981
  end
@@ -942,7 +983,7 @@ module Mabmapper
942
983
 
943
984
  # Extrahiere die Signaturen aus Unterfeld d und erzeuge eine Basis-Signatur
944
985
  fields.each do |field|
945
- subfield = field.subfields.find{|f| f.name == "d"}
986
+ subfield = field.subfields.find{|f| f.code == "d"}
946
987
  if subfield.present? && subfield.value.present?
947
988
  signature = subfield.value
948
989
  index = signature.index('+') || signature.length
@@ -953,7 +994,7 @@ module Mabmapper
953
994
  end
954
995
 
955
996
  # Stücktitel Signatur
956
- signatures << doc.field('100', ind2: ' ').subfield('a').get.value
997
+ signatures << source.datafields('100', ind2: ' ').subfields('a').value
957
998
 
958
999
  # Some additional love for journal signatures
959
1000
  signatures.map! do |signature|
@@ -961,9 +1002,9 @@ module Mabmapper
961
1002
  if signature.try(:[], /\d+[A-Za-z]\d+$/).present?
962
1003
  # unless there is a leading standortkennziffer
963
1004
  unless signature.starts_with?('P')
964
- standort_kennziffer = if (loc_standort_kennziffer = doc.field('LOC').subfield('b').get.value).present?
1005
+ standort_kennziffer = if (loc_standort_kennziffer = source.datafields('LOC').subfields('b').value).present?
965
1006
  loc_standort_kennziffer
966
- elsif (f105a = doc.field('105').subfield('a').get.value).present?
1007
+ elsif (f105a = source.datafields('105').subfields('a').value).present?
967
1008
  f105a
968
1009
  end
969
1010
 
@@ -982,11 +1023,11 @@ module Mabmapper
982
1023
 
983
1024
  field :signature_search do
984
1025
  signatures = []
985
- signatures = signatures + doc.field('LOC').subfield('d').get.values
1026
+ signatures = signatures + source.datafields('LOC').subfields('d').values
986
1027
  # Stücktitel Signatur
987
- signatures << doc.field('100', ind2: ' ').subfield('a').get.value
1028
+ signatures << source.datafields('100', ind2: ' ').subfields('a').value
988
1029
  # Zeitschriftensignatur
989
- signatures << doc.field('200', ind1: ' ', ind2: ' ').subfield('f').get.values
1030
+ signatures << source.datafields('200', ind1: ' ', ind2: ' ').subfields('f').values
990
1031
 
991
1032
  signatures = signatures.flatten.map(&:presence).compact
992
1033
  .map do |signature|
@@ -1006,9 +1047,9 @@ module Mabmapper
1006
1047
  if (journal_signature = signatures.select { |signature| signature.try(:[], /\d+[A-Za-z]\d+$/).present? }.first).present?
1007
1048
  if signatures.none? { |signature| signature.starts_with? 'P' }
1008
1049
  # TODO: code duplication with :signature
1009
- standort_kennziffer = if (loc_standort_kennziffer = doc.field('LOC').subfield('b').get.value).present?
1050
+ standort_kennziffer = if (loc_standort_kennziffer = source.datafields('LOC').subfields('b').value).present?
1010
1051
  loc_standort_kennziffer
1011
- elsif (f105a = doc.field('105').subfield('a').get.value).present?
1052
+ elsif (f105a = source.datafields('105').subfields('a').value).present?
1012
1053
  f105a
1013
1054
  end
1014
1055
 
@@ -1037,12 +1078,11 @@ module Mabmapper
1037
1078
  field :resource_link do
1038
1079
  fulltext_links = []
1039
1080
 
1040
- links = doc.field('655').subfield(['u', '3', 'z', 't']).get.fields
1041
- links.each do |link|
1042
- url = link.get_subfield('u').try(:value)
1043
- subfield_3 = link.get_subfield('3') # HBZ Inhaltsverzeichnisse
1044
- subfield_z = link.get_subfield('z') # BVB Inhaltsverzeichnisse
1045
- subfield_t = link.get_subfield('t') # Type: VIEW => Adam Inhaltsverzeichnis
1081
+ source.datafields('655').each do |datafield|
1082
+ url = datafield.subfields('u').value
1083
+ subfield_3 = datafield.subfields('3') # HBZ Inhaltsverzeichnisse
1084
+ subfield_z = datafield.subfields('z') # BVB Inhaltsverzeichnisse
1085
+ subfield_t = datafield.subfields('t') # Type: VIEW => Adam Inhaltsverzeichnis
1046
1086
 
1047
1087
  unless (url.present? && subfield_3.present? && subfield_3.value =~ /^inhalt/i) ||
1048
1088
  (url.present? && subfield_z.present? && subfield_z.value =~ /^inhalt/i) ||
@@ -1060,12 +1100,11 @@ module Mabmapper
1060
1100
  field :link_to_toc do
1061
1101
  toc_links = []
1062
1102
 
1063
- links = doc.field('655').subfield(['u', '3', 'z', 't']).get.fields
1064
- links.each do |link|
1065
- url = link.get_subfield('u').try(:value)
1066
- subfield_3 = link.get_subfield('3') # HBZ Inhaltsverzeichnisse
1067
- subfield_z = link.get_subfield('z') # BVB Inhaltsverzeichnisse
1068
- subfield_t = link.get_subfield('t') # Type: VIEW => Adam Inhaltsverzeichnis
1103
+ source.datafields('655').each do |datafield|
1104
+ url = datafield.subfields('u').value
1105
+ subfield_3 = datafield.subfields('3') # HBZ Inhaltsverzeichnisse
1106
+ subfield_z = datafield.subfields('z') # BVB Inhaltsverzeichnisse
1107
+ subfield_t = datafield.subfields('t') # Type: VIEW => Adam Inhaltsverzeichnis
1069
1108
 
1070
1109
  if (url.present? && subfield_3.present? && subfield_3.value =~ /^inhaltsv/i) ||
1071
1110
  (url.present? && subfield_z.present? && subfield_z.value =~ /^inhaltsv/i) ||
@@ -1082,7 +1121,7 @@ module Mabmapper
1082
1121
  #
1083
1122
  field :selection_code do
1084
1123
  codes = []
1085
- codes << doc.field('078', ind1: ['e', 'r']).subfield('a').get.values
1124
+ codes << source.datafields('078', ind1: ['e', 'r']).subfields('a').values
1086
1125
 
1087
1126
  codes.flatten.map(&:presence).compact.uniq
1088
1127
  end
@@ -1101,21 +1140,20 @@ module Mabmapper
1101
1140
  # f - Signatur
1102
1141
  r = []
1103
1142
 
1104
- fields = doc.field('200', ind2: ' ').subfield(['0', 'a', 'b', 'c', 'e', 'f']).get.fields
1105
- fields.each do |field|
1106
- field_0 = field.get_subfield('0')
1107
- field_a = field.get_subfield('a')
1108
- field_b = field.get_subfield('b')
1109
- field_c = field.get_subfield('c')
1110
- field_e = field.get_subfield('e')
1111
- field_f = field.get_subfield('f')
1143
+ source.datafields('200', ind2: ' ').each do |field|
1144
+ field_0 = field.subfields('0')
1145
+ field_a = field.subfields('a')
1146
+ field_b = field.subfields('b')
1147
+ field_c = field.subfields('c')
1148
+ field_e = field.subfields('e')
1149
+ field_f = field.subfields('f')
1112
1150
 
1113
1151
  s = ""
1114
- s = merge(s, field_a.try(:value), delimiter: ' ')
1115
- s = merge(s, field_b.try(:value), delimiter: ': ')
1116
- s = merge(s, field_c.try(:value), delimiter: ' ')
1117
- s = merge(s, field_e.try(:value), delimiter: '. ')
1118
- s = merge(s, field_f.try(:value), delimiter: ' <strong>Zeitschriftensignatur</strong>: ')
1152
+ s = merge(s, field_a.value, delimiter: ' ')
1153
+ s = merge(s, field_b.value, delimiter: ': ')
1154
+ s = merge(s, field_c.value, delimiter: ' ')
1155
+ s = merge(s, field_e.value, delimiter: '. ')
1156
+ s = merge(s, field_f.value, delimiter: ' <strong>Zeitschriftensignatur</strong>: ')
1119
1157
 
1120
1158
  # Cleanup
1121
1159
  s = s.gsub(/^\- /, '') # Z.b. "- Index: Foo Bar"
@@ -1142,11 +1180,11 @@ module Mabmapper
1142
1180
  #
1143
1181
  field :frbr_t do
1144
1182
  value = 1
1145
- f052 = doc.controlfield('052')
1146
- ffmt = doc.controlfield('FMT')
1147
- f100 = doc.field('100').subfield(['a','p']).get.value
1148
- f200 = doc.field('200').subfield(['a','k','g','e']).get.value
1149
- f300 = doc.field('300', ind2: '2').subfield('a').get.value
1183
+ f052 = source.controlfield('052')
1184
+ ffmt = source.controlfield('FMT')
1185
+ f100 = source.datafields('100').subfields(['a','p']).value
1186
+ f200 = source.datafields('200').subfields(['a','k','g','e']).value
1187
+ f300 = source.datafields('300', ind2: '2').subfields('a').value
1150
1188
 
1151
1189
  if (f052.present? and ['p','z','r','j'].include?(f052.at(0)))
1152
1190
  value = 99
@@ -1164,11 +1202,11 @@ module Mabmapper
1164
1202
  #
1165
1203
  field :frbr_k1 do
1166
1204
  value = nil
1167
- ffmt = doc.controlfield('FMT')
1168
- f052 = doc.controlfield('052')
1169
- f334 = doc.field('334', ind2: '1').subfield('a').get.value.try(:downcase)
1170
- f100_1 = doc.naco_normalization(doc.field('100', ind1: '-', ind2: '1').subfield(['a','p']).get.value).presence
1171
- f100_2 = doc.naco_normalization(doc.field('100', ind1: 'b', ind2: '1').subfield(['a','p']).get.value).presence
1205
+ ffmt = source.controlfield('FMT')
1206
+ f052 = source.controlfield('052')
1207
+ f334 = source.datafields('334', ind2: '1').subfields('a').value.try(:downcase)
1208
+ f100_1 = doc.naco_normalization(source.datafields('100', ind1: '-', ind2: '1').subfields(['a','p']).value).presence
1209
+ f100_2 = doc.naco_normalization(source.datafields('100', ind1: 'b', ind2: '1').subfields(['a','p']).value).presence
1172
1210
 
1173
1211
  if (f100_1.present?)
1174
1212
  value = "$$Kpad#{f100_1}$$AA"
@@ -1184,54 +1222,57 @@ module Mabmapper
1184
1222
  end
1185
1223
 
1186
1224
  field :redactional_remark do
1187
- doc.field("537", ind2: '1').subfield(['a', 'p']).get.values(join_subfields: ': ').presence.try(:join)
1225
+ source.datafields("537", ind2: '1').map do |_datafield|
1226
+ _datafield.subfields(['a', 'p']).values.join(': ')
1227
+ end
1228
+ .presence.try(:join)
1188
1229
  end
1189
1230
 
1190
1231
  #
1191
1232
  # Sekundärformen
1192
1233
  #
1193
1234
  field :is_secondary_form do
1194
- (doc.field('610').get.value || doc.field('611').get.value || doc.field('619').get.value || doc.field('621').get.value) != nil
1235
+ (source.datafields('610').value || source.datafields('611').value || source.datafields('619').value || source.datafields('621').value) != nil
1195
1236
  end
1196
1237
 
1197
1238
  field :secondary_form_preliminary_phrase do
1198
- doc.field('610', ind1: '-', ind2: '1').get.value
1239
+ source.datafields('610', ind1: '-', ind2: '1').value
1199
1240
  end
1200
1241
 
1201
1242
  field :secondary_form_publisher do
1202
- (doc.field('611').get.value.to_s << ' : ' << doc.field('613').get.value.to_s).gsub(/\A : /, '').presence
1243
+ (source.datafields('611').value.to_s << ' : ' << source.datafields('613').value.to_s).gsub(/\A : /, '').presence
1203
1244
  end
1204
1245
 
1205
1246
  field :secondary_form_creationdate do
1206
- doc.field('619').get.value
1247
+ source.datafields('619').value
1207
1248
  end
1208
1249
 
1209
1250
  field :secondary_form_isbn do
1210
- doc.field('634').get.value
1251
+ source.datafields('634').value
1211
1252
  end
1212
1253
 
1213
1254
  field :secondary_form_physical_description do
1214
- doc.field('637').get.value
1255
+ source.datafields('637').value
1215
1256
  end
1216
1257
 
1217
1258
  # there can at most be two of 'em
1218
1259
  field :secondary_form_superorder do
1219
1260
  [
1220
1261
  {
1221
- ht_number: doc.field('623').get.value,
1222
- label: doc.field('621').get.value,
1223
- volume_count: doc.field('625').get.value
1262
+ ht_number: source.datafields('623').value,
1263
+ label: source.datafields('621').value,
1264
+ volume_count: source.datafields('625').value
1224
1265
  },
1225
1266
  {
1226
- ht_number: doc.field('629').get.value,
1227
- label: doc.field('627').get.value,
1228
- volume_count: doc.field('631').get.value
1267
+ ht_number: source.datafields('629').value,
1268
+ label: source.datafields('627').value,
1269
+ volume_count: source.datafields('631').value
1229
1270
  }
1230
1271
  ].select { |superorder| superorder[:label].present? }.map(&:to_json).presence
1231
1272
  end
1232
1273
 
1233
1274
  field :local_comment do
1234
- doc.field('125', ind1: ' ', ind2: ' ').subfield(['_', 'a']).get.fields.map(&:values).flatten.uniq.presence
1275
+ source.datafields('125', ind1: ' ', ind2: ' ').subfields(['_', 'a']).values.flatten.uniq.presence
1235
1276
  end
1236
1277
 
1237
1278
  #