mabmapper 1.0.0.pre18 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  #