mods 2.4.1 → 3.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +24 -0
  3. data/.gitignore +1 -0
  4. data/README.md +0 -1
  5. data/lib/mods/marc_country_codes.rb +12 -10
  6. data/lib/mods/nom_terminology.rb +108 -844
  7. data/lib/mods/reader.rb +9 -39
  8. data/lib/mods/record.rb +13 -28
  9. data/lib/mods/version.rb +1 -1
  10. data/mods.gemspec +2 -2
  11. data/spec/fixture_data/hp566jq8781.xml +334 -0
  12. data/spec/integration/parker_spec.rb +217 -0
  13. data/spec/{date_spec.rb → lib/date_spec.rb} +0 -0
  14. data/spec/lib/language_spec.rb +123 -0
  15. data/spec/lib/location_spec.rb +175 -0
  16. data/spec/lib/name_spec.rb +366 -0
  17. data/spec/lib/origin_info_spec.rb +134 -0
  18. data/spec/lib/part_spec.rb +162 -0
  19. data/spec/lib/physical_description_spec.rb +72 -0
  20. data/spec/{reader_spec.rb → lib/reader_spec.rb} +1 -41
  21. data/spec/lib/record_info_spec.rb +114 -0
  22. data/spec/lib/record_spec.rb +287 -0
  23. data/spec/lib/related_item_spec.rb +124 -0
  24. data/spec/lib/subject_spec.rb +427 -0
  25. data/spec/lib/title_spec.rb +108 -0
  26. data/spec/lib/top_level_elmnts_simple_spec.rb +169 -0
  27. data/spec/spec_helper.rb +86 -5
  28. data/spec/support/fixtures.rb +9 -0
  29. metadata +51 -46
  30. data/.travis.yml +0 -16
  31. data/spec/language_spec.rb +0 -118
  32. data/spec/location_spec.rb +0 -295
  33. data/spec/name_spec.rb +0 -759
  34. data/spec/origin_info_spec.rb +0 -447
  35. data/spec/part_spec.rb +0 -471
  36. data/spec/physical_description_spec.rb +0 -144
  37. data/spec/record_info_spec.rb +0 -493
  38. data/spec/record_spec.rb +0 -356
  39. data/spec/related_item_spec.rb +0 -305
  40. data/spec/subject_spec.rb +0 -809
  41. data/spec/title_spec.rb +0 -226
  42. data/spec/top_level_elmnts_simple_spec.rb +0 -369
@@ -16,6 +16,13 @@ module Mods
16
16
 
17
17
  class Record
18
18
 
19
+ def with_attributes(element, attributes = [], method_mappings: { 'type' => 'type_at', 'ID' => 'id_at' })
20
+ attributes.each do |attr_name|
21
+ attr_method = method_mappings.fetch(attr_name, attr_name)
22
+ element.send attr_method, path: "@#{attr_name}", accessor: lambda { |a| a.text }
23
+ end
24
+ end
25
+
19
26
  # set the NOM terminology; WITH namespaces
20
27
  # NOTES:
21
28
  # 1. certain words, such as 'type' 'name' 'description' are reserved words in jruby or nokogiri
@@ -27,80 +34,47 @@ module Mods
27
34
  def set_terminology_ns(mods_ng_xml)
28
35
  mods_ng_xml.set_terminology(:namespaces => { 'm' => Mods::MODS_NS }) do |t|
29
36
 
30
- # FIXME: may want to deal with camelcase vs. underscore in method_missing
31
-
32
37
  # ABSTRACT -------------------------------------------------------------------------------
33
38
  t.abstract :path => '/m:mods/m:abstract'
34
39
  t._abstract :path => '//m:abstract' do |n|
35
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
36
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
37
- Mods::LANG_ATTRIBS.each { |attr_name|
38
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
39
- }
40
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel type])
40
41
  end
41
42
 
42
43
  # ACCESS_CONDITION -----------------------------------------------------------------------
43
44
  t.accessCondition :path => '/m:mods/m:accessCondition'
44
45
  t._accessCondition :path => '//m:accessCondition' do |n|
45
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
46
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
47
- Mods::LANG_ATTRIBS.each { |attr_name|
48
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
49
- }
46
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel type])
50
47
  end
51
48
 
52
49
  # CLASSIFICATION -------------------------------------------------------------------------
53
50
  t.classification :path => '/m:mods/m:classification'
54
51
  t._classification :path => '//m:classification' do |n|
55
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
56
- n.edition :path => '@edition', :accessor => lambda { |a| a.text }
57
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
58
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
59
- }
60
- Mods::LANG_ATTRIBS.each { |attr_name|
61
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
62
- }
52
+ with_attributes(n, Mods::AUTHORITY_ATTRIBS | Mods::LANG_ATTRIBS | %w[displayLabel edition])
63
53
  end
64
54
 
65
55
  # EXTENSION ------------------------------------------------------------------------------
66
56
  t.extension :path => '/m:mods/m:extension'
67
57
  t._extension :path => '//m:extension' do |n|
68
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
58
+ with_attributes(n, %w[displayLabel])
69
59
  end
70
60
 
71
61
  # GENRE ----------------------------------------------------------------------------------
72
62
  t.genre :path => '/m:mods/m:genre'
73
63
  t._genre :path => '//m:genre' do |n|
74
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
75
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
76
- n.usage :path => '@usage', :accessor => lambda { |a| a.text }
77
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
78
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
79
- }
80
- Mods::LANG_ATTRIBS.each { |attr_name|
81
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
82
- }
64
+ with_attributes(n, Mods::AUTHORITY_ATTRIBS | Mods::LANG_ATTRIBS | %w[displayLabel type usage])
83
65
  end
84
66
 
85
67
  # IDENTIIER ------------------------------------------------------------------------------
86
68
  t.identifier :path => '/m:mods/m:identifier'
87
69
  t._identifier :path => '//m:identifier' do |n|
88
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
89
- n.invalid :path => '@invalid', :accessor => lambda { |a| a.text }
90
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
91
- Mods::LANG_ATTRIBS.each { |attr_name|
92
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
93
- }
70
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel type invalid])
94
71
  end
95
72
 
96
73
  # LANGUAGE -------------------------------------------------------------------------------
97
74
  t.language :path => '/m:mods/m:language'
98
75
  t._language :path => '//m:language' do |n|
99
76
  # attributes
100
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
101
- Mods::LANG_ATTRIBS.each { |attr_name|
102
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
103
- }
77
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel])
104
78
  # child elements
105
79
  n.languageTerm :path => 'm:languageTerm'
106
80
  n.code_term :path => 'm:languageTerm[@type="code"]'
@@ -108,102 +82,97 @@ module Mods
108
82
  n.scriptTerm :path => 'm:scriptTerm'
109
83
  end
110
84
  t._languageTerm :path => '//m:languageTerm' do |lt|
111
- lt.type_at :path => '@type', :accessor => lambda { |a| a.text }
112
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
113
- lt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
114
- }
85
+ with_attributes(lt, Mods::AUTHORITY_ATTRIBS | %w[type])
115
86
  end # t.language
116
87
 
117
88
  # LOCATION -------------------------------------------------------------------------------
118
89
  t.location :path => '/m:mods/m:location'
119
90
  t._location :path => '//m:location' do |n|
120
91
  # attributes
121
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
122
- Mods::LANG_ATTRIBS.each { |attr_name|
123
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
124
- }
92
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel])
125
93
  # child elements
126
94
  n.physicalLocation :path => 'm:physicalLocation' do |e|
127
- e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
128
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
129
- e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
130
- }
95
+ with_attributes(e, Mods::AUTHORITY_ATTRIBS | %w[displayLabel type])
131
96
  end
132
97
  n.shelfLocator :path => 'm:shelfLocator'
133
98
  n.url :path => 'm:url' do |e|
134
- e.dateLastAccessed :path => '@dateLastAccessed', :accessor => lambda { |a| a.text }
135
- e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
136
- e.note :path => '@note', :accessor => lambda { |a| a.text }
137
- e.access :path => '@access', :accessor => lambda { |a| a.text }
138
- e.usage :path => '@usage', :accessor => lambda { |a| a.text }
99
+ with_attributes(e, %w[dateLastAccessed displayLabel note access usage])
100
+ end
101
+ n.holdingSimple :path => 'm:holdingSimple' do |h|
102
+ h.copyInformation path: 'm:copyInformation' do |c|
103
+ c.form path: 'm:form' do |f|
104
+ with_attributes(f, Mods::LANG_ATTRIBS | %w[type])
105
+ end
106
+ c.sub_location path: 'm:subLocation' do |s|
107
+ with_attributes(s, Mods::LANG_ATTRIBS)
108
+ end
109
+
110
+ c.shelf_locator path: 'm:shelfLocator' do |s|
111
+ with_attributes(s, Mods::LANG_ATTRIBS)
112
+ end
113
+ c.electronic_locator path: 'm:electronicLocator'
114
+ c.note path: 'm:note' do |note|
115
+ with_attributes(note, Mods::LANG_ATTRIBS | %w[displayLabel type])
116
+ end
117
+ c.enumeration_and_chronology path: 'm:enumerationAndChronology' do |e|
118
+ with_attributes(e, Mods::LANG_ATTRIBS | %w[unitType])
119
+ end
120
+ c.item_identifier path: 'm:itemIdentifier' do |i|
121
+ with_attributes(i, %w[type])
122
+ end
123
+ end
139
124
  end
140
- n.holdingSimple :path => 'm:holdingSimple'
141
125
  n.holdingExternal :path => 'm:holdingExternal'
142
126
  end # t.location
143
127
 
144
128
  # NAME ------------------------------------------------------------------------------------
145
129
  t.plain_name :path => '/m:mods/m:name'
146
- t._plain_name :path => '//m:name' do |n|
147
- Mods::Name::ATTRIBUTES.each { |attr_name|
148
- if attr_name != 'type'
149
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
150
- else
151
- n.type_at :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
152
- end
153
- }
130
+ t._plain_name :path => '(//m:name|//m:alternativeName)' do |n|
131
+ with_attributes(n, Mods::Name::ATTRIBUTES)
154
132
  # elements
155
133
  n.namePart :path => 'm:namePart' do |np|
156
- np.type_at :path => '@type', :accessor => lambda { |a| a.text }
134
+ with_attributes(np, %w[type])
157
135
  end
158
136
  n.family_name :path => 'm:namePart[@type="family"]'
159
137
  n.given_name :path => 'm:namePart[@type="given"]'
160
138
  n.termsOfAddress :path => 'm:namePart[@type="termsOfAddress"]'
161
139
  n.date :path => 'm:namePart[@type="date"]'
162
140
 
141
+ n.alternative_name :path => 'm:alternativeName' do |alt|
142
+ with_attributes(alt, %w[altType])
143
+ end
163
144
  n.displayForm :path => 'm:displayForm'
164
145
  n.affiliation :path => 'm:affiliation'
165
146
  n.description_el :path => 'm:description' # description is used by Nokogiri
166
147
  n.role :path => 'm:role' do |r|
167
148
  r.roleTerm :path => 'm:roleTerm' do |rt|
168
- rt.type_at :path => "@type", :accessor => lambda { |a| a.text }
169
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
170
- rt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
171
- }
149
+ with_attributes(rt, Mods::AUTHORITY_ATTRIBS | %w[type])
150
+
151
+ rt.value path: '.', accessor: (lambda do |roleTerm|
152
+ text = roleTerm.text.strip
153
+
154
+ if roleTerm.type_at == 'code' && roleTerm.authority == 'marcrelator'
155
+ MARC_RELATOR.fetch(text, text)
156
+ else
157
+ text
158
+ end
159
+ end)
172
160
  end
161
+
173
162
  # role convenience method
174
163
  r.authority :path => '.', :accessor => lambda { |role_node|
175
- a = nil
176
- role_node.roleTerm.each { |role_t|
177
- # role_t.authority will be [] if it is missing from an earlier roleTerm
178
- if role_t.authority && (!a || a.size == 0)
179
- a = role_t.authority
180
- end
181
- }
182
- a
164
+ role_node.roleTerm.authority.first
183
165
  }
166
+
184
167
  # role convenience method
185
168
  r.code :path => '.', :accessor => lambda { |role_node|
186
- c = nil
187
- role_node.roleTerm.each { |role_t|
188
- if role_t.type_at == 'code'
189
- c ||= role_t.text
190
- end
191
- }
192
- c
169
+ role_node.roleTerm.select { |role_t| role_t.type_at == 'code' }.first&.text
193
170
  }
171
+
194
172
  # role convenience method
195
173
  r.value :path => '.', :accessor => lambda { |role_node|
196
- val = nil
197
- role_node.roleTerm.each { |role_t|
198
- if role_t.type_at == 'text'
199
- val ||= role_t.text
200
- end
201
- }
202
- # FIXME: this is broken if there are multiple role codes and some of them are not marcrelator
203
- if !val && role_node.code && role_node.authority.first =~ /marcrelator/
204
- val = MARC_RELATOR[role_node.code.first]
205
- end
206
- val
174
+ val = role_node.roleTerm.select { |role_t| role_t.type_at == 'text' }.first&.text
175
+ val || role_node.roleTerm.select { |role_t| role_t.type_at == 'code' && role_t.authority.match?(/marcrelator/) }.first&.value
207
176
  }
208
177
  end # role node
209
178
 
@@ -271,12 +240,7 @@ module Mods
271
240
  # NOTE ---------------------------------------------------------------------------------
272
241
  t.note :path => '/m:mods/m:note'
273
242
  t._note :path => '//m:note' do |n|
274
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
275
- n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
276
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
277
- Mods::LANG_ATTRIBS.each { |attr_name|
278
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
279
- }
243
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[ID displayLabel type])
280
244
  end
281
245
 
282
246
  # ORIGIN_INFO --------------------------------------------------------------------------
@@ -284,17 +248,11 @@ module Mods
284
248
  t._origin_info :path => '//m:originInfo' do |n|
285
249
  n.as_object :path => '.', :accessor => lambda { |a| Mods::OriginInfo.new(a) }
286
250
  # attributes
287
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
288
- Mods::LANG_ATTRIBS.each { |attr_name|
289
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
290
- }
251
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel])
291
252
  # child elements
292
253
  n.place :path => 'm:place' do |e|
293
254
  e.placeTerm :path => 'm:placeTerm' do |ee|
294
- ee.type_at :path => '@type', :accessor => lambda { |a| a.text }
295
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
296
- ee.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
297
- }
255
+ with_attributes(ee, Mods::AUTHORITY_ATTRIBS | %w[type])
298
256
  end
299
257
  end
300
258
  n.publisher :path => 'm:publisher'
@@ -302,20 +260,15 @@ module Mods
302
260
  n.send date_el, :path => "m:#{date_el}" do |d|
303
261
  d.as_object :path => '.', :accessor => lambda { |a| Mods::Date.from_element(a) }
304
262
 
305
- Mods::DATE_ATTRIBS.each { |attr_name|
306
- d.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
307
- }
308
- if date_el == 'dateOther'
309
- d.type_at :path => '@type', :accessor => lambda { |a| a.text }
310
- end
263
+ with_attributes(d, Mods::DATE_ATTRIBS)
264
+
265
+ with_attributes(d, %w[type]) if date_el == 'dateOther'
311
266
  end
312
267
  }
313
268
  n.edition :path => 'm:edition'
314
269
  n.issuance :path => 'm:issuance'
315
270
  n.frequency :path => 'm:frequency' do |f|
316
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
317
- f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
318
- }
271
+ with_attributes(f, Mods::AUTHORITY_ATTRIBS)
319
272
  end
320
273
  end # t.origin_info
321
274
 
@@ -323,18 +276,11 @@ module Mods
323
276
  t.part :path => '/m:mods/m:part'
324
277
  t._part :path => '//m:part' do |n|
325
278
  # attributes
326
- n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
327
- n.order :path => '@order', :accessor => lambda { |a| a.text }
328
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
329
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
330
- Mods::LANG_ATTRIBS.each { |attr_name|
331
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
332
- }
279
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[ID order type displayLabel])
333
280
  # child elements
334
281
  n.detail :path => 'm:detail' do |e|
335
282
  # attributes
336
- e.level :path => '@level', :accessor => lambda { |a| a.text }
337
- e.type_at :path => '@type', :accessor => lambda { |a| a.text }
283
+ with_attributes(e, %w[level type])
338
284
  # elements
339
285
  e.number :path => 'm:number'
340
286
  e.caption :path => 'm:caption'
@@ -342,7 +288,7 @@ module Mods
342
288
  end
343
289
  n.extent :path => 'm:extent' do |e| # TODO: extent is ordered in xml schema
344
290
  # attributes
345
- e.unit :path => '@unit', :accessor => lambda { |a| a.text }
291
+ with_attributes(e, %w[unit])
346
292
  # elements
347
293
  e.start :path => 'm:start'
348
294
  e.end :path => 'm:end'
@@ -350,13 +296,10 @@ module Mods
350
296
  e.list :path => 'm:list'
351
297
  end
352
298
  n.date :path => 'm:date' do |e|
353
- Mods::DATE_ATTRIBS.reject { |a| a == 'keyDate' }.each { |attr_name|
354
- e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
355
- }
299
+ with_attributes(e, Mods::DATE_ATTRIBS - ['keyDate'])
356
300
  end
357
301
  n.text_el :path => 'm:text' do |e|
358
- e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
359
- e.type_at :path => '@type', :accessor => lambda { |a| a.text }
302
+ with_attributes(e, %w[displayLabel type])
360
303
  end
361
304
  end # t._part
362
305
 
@@ -364,23 +307,16 @@ module Mods
364
307
  t.physical_description :path => '/m:mods/m:physicalDescription'
365
308
  t._physical_description :path => '//m:physicalDescription' do |n|
366
309
  # attributes
367
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
368
- Mods::LANG_ATTRIBS.each { |attr_name|
369
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
370
- }
310
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel])
371
311
  # child elements
372
312
  n.digitalOrigin :path => 'm:digitalOrigin'
373
313
  n.extent :path => 'm:extent'
374
314
  n.form :path => 'm:form' do |f|
375
- f.type_at :path => '@type', :accessor => lambda { |a| a.text }
376
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
377
- f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
378
- }
315
+ with_attributes(f, Mods::AUTHORITY_ATTRIBS | %w[type])
379
316
  end
380
317
  n.internetMediaType :path => 'm:internetMediaType'
381
318
  n.note :path => 'm:note' do |nn|
382
- nn.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
383
- nn.type_at :path => '@type', :accessor => lambda { |a| a.text }
319
+ with_attributes(nn, %w[displayLabel type])
384
320
  end
385
321
  n.reformattingQuality :path => 'm:reformattingQuality'
386
322
  end
@@ -389,52 +325,37 @@ module Mods
389
325
  t.record_info :path => '/m:mods/m:recordInfo'
390
326
  t._record_info :path => '//m:recordInfo' do |n|
391
327
  # attributes
392
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
393
- Mods::LANG_ATTRIBS.each { |attr_name|
394
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
395
- }
328
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel])
396
329
  # child elements
397
330
  n.recordContentSource :path => 'm:recordContentSource' do |r|
398
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
399
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
400
- }
331
+ with_attributes(r, Mods::AUTHORITY_ATTRIBS)
401
332
  end
402
333
  n.recordCreationDate :path => 'm:recordCreationDate' do |r|
403
- Mods::DATE_ATTRIBS.each { |attr_name|
404
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
405
- }
334
+ with_attributes(r, Mods::DATE_ATTRIBS)
406
335
  end
407
336
  n.recordChangeDate :path => 'm:recordChangeDate' do |r|
408
- Mods::DATE_ATTRIBS.each { |attr_name|
409
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
410
- }
337
+ with_attributes(r, Mods::DATE_ATTRIBS)
411
338
  end
412
339
  n.recordIdentifier :path => 'm:recordIdentifier' do |r|
413
- r.source :path => '@source', :accessor => lambda { |a| a.text }
340
+ with_attributes(r, ['source'])
414
341
  end
415
342
  n.recordOrigin :path => 'm:recordOrigin'
416
343
  n.languageOfCataloging :path => 'm:languageOfCataloging' do |r|
417
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
418
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
419
- }
344
+ with_attributes(r, Mods::AUTHORITY_ATTRIBS)
420
345
  r.languageTerm :path => 'm:languageTerm'
421
346
  r.scriptTerm :path => 'm:scriptTerm'
422
347
  end
423
348
  n.descriptionStandard :path => 'm:descriptionStandard' do |r|
424
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
425
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
426
- }
349
+ with_attributes(r, Mods::AUTHORITY_ATTRIBS)
427
350
  end
428
351
  end # t._record_info
429
352
 
430
353
  # RELATED_ITEM-------------------------------------------------------------------------
431
354
  t.related_item :path => '/m:mods/m:relatedItem' do |n|
432
355
  # attributes
433
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
434
- n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
435
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
356
+ with_attributes(n, %w[ID displayLabel type])
436
357
  # elements
437
- n.abstract :path => 'abstract'
358
+ n.abstract :path => 'm:abstract'
438
359
  n.accessCondition :path => 'm:accessCondition'
439
360
  n.classification :path => 'm:classification'
440
361
  n.extension :path => 'm:extension'
@@ -462,13 +383,7 @@ module Mods
462
383
  t.subject :path => '/m:mods/m:subject'
463
384
  t._subject :path => '//m:subject' do |n|
464
385
  # attributes
465
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
466
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
467
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
468
- }
469
- Mods::LANG_ATTRIBS.each { |attr_name|
470
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
471
- }
386
+ with_attributes(n, Mods::AUTHORITY_ATTRIBS | Mods::LANG_ATTRIBS | %w[displayLabel])
472
387
  # child elements
473
388
  n.cartographics :path => 'm:cartographics' do |n1|
474
389
  n1.scale :path => 'm:scale'
@@ -479,19 +394,13 @@ module Mods
479
394
  }
480
395
  end
481
396
  n.genre :path => 'm:genre' do |n1|
482
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
483
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
484
- }
397
+ with_attributes(n1, Mods::AUTHORITY_ATTRIBS)
485
398
  end
486
399
  n.geographic :path => 'm:geographic' do |n1|
487
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
488
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
489
- }
400
+ with_attributes(n1, Mods::AUTHORITY_ATTRIBS)
490
401
  end
491
402
  n.geographicCode :path => 'm:geographicCode' do |gc|
492
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
493
- gc.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
494
- }
403
+ with_attributes(gc, Mods::AUTHORITY_ATTRIBS)
495
404
  # convenience method
496
405
  gc.translated_value :path => '.', :accessor => lambda { |gc_node|
497
406
  code_val ||= gc_node.text
@@ -511,78 +420,45 @@ module Mods
511
420
  Mods::Subject::HIER_GEO_CHILD_ELEMENTS.each { |elname|
512
421
  n1.send elname, :path => "m:#{elname}"
513
422
  }
514
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
515
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
516
- }
423
+ with_attributes(n1, Mods::AUTHORITY_ATTRIBS)
517
424
  end
518
425
  # Note: 'name' is used by Nokogiri
519
426
  n.name_el :path => 'm:name' do |t1|
520
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
521
- t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
522
- }
427
+ with_attributes(t1, Mods::AUTHORITY_ATTRIBS)
523
428
  end
524
429
  n.personal_name :path => 'm:name[@type="personal"]'
525
430
  n.corporate_name :path => 'm:name[@type="corporate"]'
526
431
  n.conference_name :path => 'm:name[@type="conference"]'
527
432
  n.occupation :path => 'm:occupation' do |n1|
528
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
529
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
530
- }
433
+ with_attributes(n1, Mods::AUTHORITY_ATTRIBS)
531
434
  end
532
435
  n.temporal :path => 'm:temporal' do |n1|
533
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
534
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
535
- }
536
- # date attributes as attributes
537
- Mods::DATE_ATTRIBS.each { |attr_name|
538
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
539
- }
436
+ with_attributes(n1, Mods::AUTHORITY_ATTRIBS | Mods::DATE_ATTRIBS)
540
437
  end
541
438
  n.titleInfo :path => 'm:titleInfo' do |t1|
542
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
543
- t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
544
- }
439
+ with_attributes(t1, Mods::AUTHORITY_ATTRIBS)
545
440
  end
546
441
  n.topic :path => 'm:topic' do |n1|
547
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
548
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
549
- }
442
+ with_attributes(n1, Mods::AUTHORITY_ATTRIBS)
550
443
  end
551
444
  end # t.subject
552
445
 
553
446
  # TABLE_OF_CONTENTS ---------------------------------------------------------------------
554
447
  t.tableOfContents :path => '/m:mods/m:tableOfContents'
555
448
  t._tableOfContents :path => '//m:tableOfContents' do |n|
556
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
557
- n.shareable :path => '@shareable', :accessor => lambda { |a| a.text }
558
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
559
- Mods::LANG_ATTRIBS.each { |attr_name|
560
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
561
- }
449
+ with_attributes(n, Mods::LANG_ATTRIBS | %w[displayLabel shareable type])
562
450
  end
563
451
 
564
452
  # TARGET_AUDIENCE -----------------------------------------------------------------------
565
453
  t.targetAudience :path => '/m:mods/m:targetAudience'
566
454
  t._targetAudience :path => '//m:targetAudience' do |n|
567
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
568
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
569
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
570
- }
571
- Mods::LANG_ATTRIBS.each { |attr_name|
572
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
573
- }
455
+ with_attributes(n, Mods::AUTHORITY_ATTRIBS | Mods::LANG_ATTRIBS | %w[displayLabel])
574
456
  end
575
457
 
576
458
  # TITLE_INFO ----------------------------------------------------------------------------
577
459
  t.title_info :path => '/m:mods/m:titleInfo'
578
460
  t._title_info :path => '//m:titleInfo' do |n|
579
- Mods::TitleInfo::ATTRIBUTES.each { |attr_name|
580
- if attr_name != 'type'
581
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
582
- else
583
- n.type_at :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
584
- end
585
- }
461
+ with_attributes(n, Mods::TitleInfo::ATTRIBUTES)
586
462
  n.title :path => 'm:title'
587
463
  n.subTitle :path => 'm:subTitle'
588
464
  n.nonSort :path => 'm:nonSort'
@@ -620,624 +496,12 @@ module Mods
620
496
  # TYPE_OF_RESOURCE --------------------------------------------------------------------
621
497
  t.typeOfResource :path => '/m:mods/m:typeOfResource'
622
498
  t._typeOfResource :path => '//m:typeOfResource' do |n|
623
- n.collection :path => '@collection', :accessor => lambda { |a| a.text }
624
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
625
- n.manuscript :path => '@manuscript', :accessor => lambda { |a| a.text }
626
- n.usage :path => '@usage', :accessor => lambda { |a| a.text }
627
- end
628
-
629
- end # terminology
630
-
631
- mods_ng_xml.nom!
632
- mods_ng_xml
633
- end # set_terminology_ns
634
-
635
- # set the NOM terminology; do NOT use namespaces
636
- # NOTES:
637
- # 1. certain words, such as 'type' 'name' 'description' are reserved words in jruby or nokogiri
638
- # when the terminology would use these words, a suffix of '_at' is added if it is an attribute,
639
- # (e.g. 'type_at' for @type) and a suffix of '_el' is added if it is an element.
640
- # 2. the underscore prefix variant terms are a way of making subterms for a node available
641
- # to any instance of said node and are not intended to be used externally
642
- # @param mods_ng_xml a Nokogiri::Xml::Document object containing MODS (without namespaces)
643
- def set_terminology_no_ns(mods_ng_xml)
644
- mods_ng_xml.set_terminology() do |t|
645
-
646
- # FIXME: may want to deal with camelcase vs. underscore in method_missing
647
-
648
- # ABSTRACT -------------------------------------------------------------------------------
649
- t.abstract :path => '/mods/abstract'
650
- t._abstract :path => '//abstract' do |n|
651
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
652
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
653
- Mods::LANG_ATTRIBS.each { |attr_name|
654
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
655
- }
656
- end
657
-
658
- # ACCESS_CONDITION -----------------------------------------------------------------------
659
- t.accessCondition :path => '/mods/accessCondition'
660
- t._accessCondition :path => '//accessCondition' do |n|
661
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
662
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
663
- Mods::LANG_ATTRIBS.each { |attr_name|
664
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
665
- }
666
- end
667
-
668
- # CLASSIFICATION -------------------------------------------------------------------------
669
- t.classification :path => '/mods/classification'
670
- t._classification :path => '//classification' do |n|
671
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
672
- n.edition :path => '@edition', :accessor => lambda { |a| a.text }
673
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
674
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
675
- }
676
- Mods::LANG_ATTRIBS.each { |attr_name|
677
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
678
- }
679
- end
680
-
681
- # EXTENSION ------------------------------------------------------------------------------
682
- t.extension :path => '/mods/extension'
683
- t._extension :path => '//extension' do |n|
684
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
685
- end
686
-
687
- # GENRE ----------------------------------------------------------------------------------
688
- t.genre :path => '/mods/genre'
689
- t._genre :path => '//genre' do |n|
690
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
691
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
692
- n.usage :path => '@usage', :accessor => lambda { |a| a.text }
693
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
694
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
695
- }
696
- Mods::LANG_ATTRIBS.each { |attr_name|
697
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
698
- }
699
- end
700
-
701
- # IDENTIIER ------------------------------------------------------------------------------
702
- t.identifier :path => '/mods/identifier'
703
- t._identifier :path => '//identifier' do |n|
704
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
705
- n.invalid :path => '@invalid', :accessor => lambda { |a| a.text }
706
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
707
- Mods::LANG_ATTRIBS.each { |attr_name|
708
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
709
- }
710
- end
711
-
712
- # LANGUAGE -------------------------------------------------------------------------------
713
- t.language :path => '/mods/language'
714
- t._language :path => '//language' do |n|
715
- # attributes
716
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
717
- Mods::LANG_ATTRIBS.each { |attr_name|
718
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
719
- }
720
- # child elements
721
- n.languageTerm :path => 'languageTerm'
722
- n.code_term :path => 'languageTerm[@type="code"]'
723
- n.text_term :path => 'languageTerm[@type="text"]'
724
- n.scriptTerm :path => 'scriptTerm'
725
- end
726
- t._languageTerm :path => '//languageTerm' do |lt|
727
- lt.type_at :path => '@type', :accessor => lambda { |a| a.text }
728
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
729
- lt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
730
- }
731
- end # t.language
732
-
733
- # LOCATION -------------------------------------------------------------------------------
734
- t.location :path => '/mods/location'
735
- t._location :path => '//location' do |n|
736
- # attributes
737
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
738
- Mods::LANG_ATTRIBS.each { |attr_name|
739
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
740
- }
741
- # child elements
742
- n.physicalLocation :path => 'physicalLocation' do |e|
743
- e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
744
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
745
- e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
746
- }
747
- end
748
- n.shelfLocator :path => 'shelfLocator'
749
- n.url :path => 'url' do |e|
750
- e.dateLastAccessed :path => '@dateLastAccessed', :accessor => lambda { |a| a.text }
751
- e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
752
- e.note :path => '@note', :accessor => lambda { |a| a.text }
753
- e.access :path => '@access', :accessor => lambda { |a| a.text }
754
- e.usage :path => '@usage', :accessor => lambda { |a| a.text }
755
- end
756
- n.holdingSimple :path => 'holdingSimple'
757
- n.holdingExternal :path => 'holdingExternal'
758
- end # t.location
759
-
760
- # NAME ------------------------------------------------------------------------------------
761
- t.plain_name :path => '/mods/name'
762
- t._plain_name :path => '//name' do |n|
763
- Mods::Name::ATTRIBUTES.each { |attr_name|
764
- if attr_name != 'type'
765
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
766
- else
767
- n.type_at :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
768
- end
769
- }
770
- # elements
771
- n.namePart :path => 'namePart' do |np|
772
- np.type_at :path => '@type', :accessor => lambda { |a| a.text }
773
- end
774
- n.family_name :path => 'namePart[@type="family"]'
775
- n.given_name :path => 'namePart[@type="given"]'
776
- n.termsOfAddress :path => 'namePart[@type="termsOfAddress"]'
777
- n.date :path => 'namePart[@type="date"]'
778
-
779
- n.displayForm :path => 'displayForm'
780
- n.affiliation :path => 'affiliation'
781
- n.description_el :path => 'description' # description is used by Nokogiri
782
- n.role :path => 'role' do |r|
783
- r.roleTerm :path => 'roleTerm' do |rt|
784
- rt.type_at :path => "@type", :accessor => lambda { |a| a.text }
785
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
786
- rt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
787
- }
788
- end
789
- # convenience method
790
- r.authority :path => '.', :accessor => lambda { |role_node|
791
- a = nil
792
- role_node.roleTerm.each { |role_t|
793
- # role_t.authority will be [] if it is missing from an earlier roleTerm
794
- if role_t.authority && (!a || a.size == 0)
795
- a = role_t.authority
796
- end
797
- }
798
- a
799
- }
800
- # convenience method
801
- r.code :path => '.', :accessor => lambda { |role_node|
802
- c = nil
803
- role_node.roleTerm.each { |role_t|
804
- if role_t.type_at == 'code'
805
- c ||= role_t.text
806
- end
807
- }
808
- c
809
- }
810
- # convenience method
811
- r.value :path => '.', :accessor => lambda { |role_node|
812
- val = nil
813
- role_node.roleTerm.each { |role_t|
814
- if role_t.type_at == 'text'
815
- val ||= role_t.text
816
- end
817
- }
818
- # FIXME: this is broken if there are multiple role codes and some of them are not marcrelator
819
- if !val && role_node.code && role_node.authority.first =~ /marcrelator/
820
- val = MARC_RELATOR[role_node.code.first]
821
- end
822
- val
823
- }
824
- end # role node
825
-
826
- # name convenience method
827
- # uses the displayForm of a name if present
828
- # if no displayForm, try to make a string from family, given and terms of address
829
- # otherwise, return all non-date nameParts concatenated together
830
- n.display_value :path => '.', :single => true, :accessor => lambda {|name_node|
831
- dv = ''
832
- if name_node.displayForm && name_node.displayForm.text.size > 0
833
- dv = name_node.displayForm.text
834
- end
835
- if dv.empty?
836
- if name_node.type_at == 'personal'
837
- if name_node.family_name.size > 0
838
- dv = name_node.given_name.size > 0 ? "#{name_node.family_name.text}, #{name_node.given_name.text}" : name_node.family_name.text
839
- elsif name_node.given_name.size > 0
840
- dv = name_node.given_name.text
841
- end
842
- if !dv.empty?
843
- first = true
844
- name_node.namePart.each { |np|
845
- if np.type_at == 'termsOfAddress' && !np.text.empty?
846
- if first
847
- dv = dv + " " + np.text
848
- first = false
849
- else
850
- dv = dv + ", " + np.text
851
- end
852
- end
853
- }
854
- else # no family or given name
855
- dv = name_node.namePart.select {|np| np.type_at != 'date' && !np.text.empty?}.join(" ")
856
- end
857
- else # not a personal name
858
- dv = name_node.namePart.select {|np| np.type_at != 'date' && !np.text.empty?}.join(" ")
859
- end
860
- end
861
- dv.strip.empty? ? nil : dv.strip
862
- }
863
-
864
- # name convenience method
865
- n.display_value_w_date :path => '.', :single => true, :accessor => lambda {|name_node|
866
- dv = '' + name_node.display_value
867
- name_node.namePart.each { |np|
868
- if np.type_at == 'date' && !np.text.empty? && !dv.end_with?(np.text)
869
- dv = dv + ", #{np.text}"
870
- end
871
- }
872
- if dv.start_with?(', ')
873
- dv.sub(', ', '')
874
- end
875
- dv.strip.empty? ? nil : dv.strip
876
- }
877
- end # t._plain_name
878
-
879
- t.personal_name :path => '/mods/name[@type="personal"]'
880
- t._personal_name :path => '//name[@type="personal"]'
881
- t.corporate_name :path => '/mods/name[@type="corporate"]'
882
- t._corporate_name :path => '//name[@type="corporate"]'
883
- t.conference_name :path => '/mods/name[@type="conference"]'
884
- t._conference_name :path => '//name[@type="conference"]'
885
-
886
- # NOTE ---------------------------------------------------------------------------------
887
- t.note :path => '/mods/note'
888
- t._note :path => '//note' do |n|
889
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
890
- n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
891
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
892
- Mods::LANG_ATTRIBS.each { |attr_name|
893
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
894
- }
895
- end
896
-
897
- # ORIGIN_INFO --------------------------------------------------------------------------
898
- t.origin_info :path => '/mods/originInfo'
899
- t._origin_info :path => '//originInfo' do |n|
900
- # attributes
901
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
902
- Mods::LANG_ATTRIBS.each { |attr_name|
903
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
904
- }
905
- # child elements
906
- n.place :path => 'place' do |e|
907
- e.placeTerm :path => 'placeTerm' do |ee|
908
- ee.type_at :path => '@type', :accessor => lambda { |a| a.text }
909
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
910
- ee.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
911
- }
912
- end
913
- end
914
- n.publisher :path => 'publisher'
915
- Mods::OriginInfo::DATE_ELEMENTS.each { |date_el|
916
- n.send date_el, :path => "#{date_el}" do |d|
917
- Mods::DATE_ATTRIBS.each { |attr_name|
918
- d.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
919
- }
920
- if date_el == 'dateOther'
921
- d.type_at :path => '@type', :accessor => lambda { |a| a.text }
922
- end
923
- end
924
- }
925
- n.edition :path => 'edition'
926
- n.issuance :path => 'issuance'
927
- n.frequency :path => 'frequency' do |f|
928
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
929
- f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
930
- }
931
- end
932
- end # t.origin_info
933
-
934
- # PART -----------------------------------------------------------------------------------
935
- t.part :path => '/mods/part'
936
- t._part :path => '//part' do |n|
937
- # attributes
938
- n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
939
- n.order :path => '@order', :accessor => lambda { |a| a.text }
940
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
941
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
942
- Mods::LANG_ATTRIBS.each { |attr_name|
943
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
944
- }
945
- # child elements
946
- n.detail :path => 'detail' do |e|
947
- # attributes
948
- e.level :path => '@level', :accessor => lambda { |a| a.text }
949
- e.type_at :path => '@type', :accessor => lambda { |a| a.text }
950
- # elements
951
- e.number :path => 'number'
952
- e.caption :path => 'caption'
953
- e.title :path => 'title'
954
- end
955
- n.extent :path => 'extent' do |e| # TODO: extent is ordered in xml schema
956
- # attributes
957
- e.unit :path => '@unit', :accessor => lambda { |a| a.text }
958
- # elements
959
- e.start :path => 'start'
960
- e.end :path => 'end'
961
- e.total :path => 'total'
962
- e.list :path => 'list'
963
- end
964
- n.date :path => 'date' do |e|
965
- Mods::DATE_ATTRIBS.reject { |a| a == 'keyDate' }.each { |attr_name|
966
- e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
967
- }
968
- end
969
- n.text_el :path => 'text' do |e|
970
- e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
971
- e.type_at :path => '@type', :accessor => lambda { |a| a.text }
972
- end
973
- end # t._part
974
-
975
- # PHYSICAL_DESCRIPTION -------------------------------------------------------------------
976
- t.physical_description :path => '/mods/physicalDescription'
977
- t._physical_description :path => '//physicalDescription' do |n|
978
- # attributes
979
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
980
- Mods::LANG_ATTRIBS.each { |attr_name|
981
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
982
- }
983
- # child elements
984
- n.digitalOrigin :path => 'digitalOrigin'
985
- n.extent :path => 'extent'
986
- n.form :path => 'form' do |f|
987
- f.type_at :path => '@type', :accessor => lambda { |a| a.text }
988
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
989
- f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
990
- }
991
- end
992
- n.internetMediaType :path => 'internetMediaType'
993
- n.note :path => 'note' do |nn|
994
- nn.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
995
- nn.type_at :path => '@type', :accessor => lambda { |a| a.text }
996
- end
997
- n.reformattingQuality :path => 'reformattingQuality'
998
- end
999
-
1000
- # RECORD_INFO --------------------------------------------------------------------------
1001
- t.record_info :path => '/mods/recordInfo'
1002
- t._record_info :path => '//recordInfo' do |n|
1003
- # attributes
1004
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
1005
- Mods::LANG_ATTRIBS.each { |attr_name|
1006
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1007
- }
1008
- # child elements
1009
- n.recordContentSource :path => 'recordContentSource' do |r|
1010
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1011
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1012
- }
1013
- end
1014
- n.recordCreationDate :path => 'recordCreationDate' do |r|
1015
- Mods::DATE_ATTRIBS.each { |attr_name|
1016
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1017
- }
1018
- end
1019
- n.recordChangeDate :path => 'recordChangeDate' do |r|
1020
- Mods::DATE_ATTRIBS.each { |attr_name|
1021
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1022
- }
1023
- end
1024
- n.recordIdentifier :path => 'recordIdentifier' do |r|
1025
- r.source :path => '@source', :accessor => lambda { |a| a.text }
1026
- end
1027
- n.recordOrigin :path => 'recordOrigin'
1028
- n.languageOfCataloging :path => 'languageOfCataloging' do |r|
1029
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1030
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1031
- }
1032
- r.languageTerm :path => 'languageTerm'
1033
- r.scriptTerm :path => 'scriptTerm'
1034
- end
1035
- n.descriptionStandard :path => 'descriptionStandard' do |r|
1036
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1037
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1038
- }
1039
- end
1040
- end # t._record_info
1041
-
1042
- # RELATED_ITEM-------------------------------------------------------------------------
1043
- t.related_item :path => '/mods/relatedItem' do |n|
1044
- # attributes
1045
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
1046
- n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
1047
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
1048
- # elements
1049
- n.abstract :path => 'abstract'
1050
- n.accessCondition :path => 'accessCondition'
1051
- n.classification :path => 'classification'
1052
- n.extension :path => 'extension'
1053
- n.genre :path => 'genre'
1054
- n.identifier :path => 'identifier'
1055
- n.language :path => 'language'
1056
- n.location :path => 'location'
1057
- n.name_el :path => 'name' # Note: 'name' is used by Nokogiri
1058
- n.personal_name :path => 'name[@type="personal"]'
1059
- n.corporate_name :path => 'name[@type="corporate"]'
1060
- n.conference_name :path => 'name[@type="conference"]'
1061
- n.note :path => 'note'
1062
- n.originInfo :path => 'originInfo'
1063
- n.part :path => 'part'
1064
- n.physicalDescription :path => 'physicalDescription'
1065
- n.recordInfo :path => 'recordInfo'
1066
- n.subject :path => 'subject'
1067
- n.tableOfContents :path => 'tableOfContents'
1068
- n.targetAudience :path => 'targetAudience'
1069
- n.titleInfo :path => 'titleInfo'
1070
- n.typeOfResource :path => 'typeOfResource'
499
+ with_attributes(n, %w[collection displayLabel manuscript usage])
1071
500
  end
1072
-
1073
- # SUBJECT -----------------------------------------------------------------------------
1074
- t.subject :path => '/mods/subject'
1075
- t._subject :path => '//subject' do |n|
1076
- # attributes
1077
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
1078
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1079
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1080
- }
1081
- Mods::LANG_ATTRIBS.each { |attr_name|
1082
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1083
- }
1084
- # child elements
1085
- n.cartographics :path => 'cartographics' do |n1|
1086
- n1.scale :path => 'scale'
1087
- n1.projection :path => 'projection'
1088
- n1.coordinates :path => 'coordinates'
1089
- Mods::Subject::CARTOGRAPHICS_CHILD_ELEMENTS.each { |elname|
1090
- n1.send elname, :path => "#{elname}"
1091
- }
1092
- end
1093
- n.geographic :path => 'geographic' do |n1|
1094
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1095
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1096
- }
1097
- end
1098
- n.genre :path => 'genre' do |n1|
1099
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1100
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1101
- }
1102
- end
1103
- n.geographicCode :path => 'geographicCode' do |gc|
1104
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1105
- gc.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1106
- }
1107
- # convenience method
1108
- gc.translated_value :path => '.', :accessor => lambda { |gc_node|
1109
- code_val ||= gc_node.text
1110
- xval = nil
1111
- if code_val
1112
- case gc_node.authority
1113
- when 'marcgac'
1114
- xval = MARC_GEOGRAPHIC_AREA[code_val]
1115
- when 'marccountry'
1116
- xval = MARC_COUNTRY[code_val]
1117
- end
1118
- end
1119
- xval
1120
- }
1121
- end
1122
- n.hierarchicalGeographic :path => 'hierarchicalGeographic' do |n1|
1123
- Mods::Subject::HIER_GEO_CHILD_ELEMENTS.each { |elname|
1124
- n1.send elname, :path => "#{elname}"
1125
- }
1126
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1127
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1128
- }
1129
- end
1130
- # Note: 'name' is used by Nokogiri
1131
- n.name_el :path => 'name' do |t1|
1132
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1133
- t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1134
- }
1135
- end
1136
- n.personal_name :path => 'name[@type="personal"]'
1137
- n.corporate_name :path => 'name[@type="corporate"]'
1138
- n.conference_name :path => 'name[@type="conference"]'
1139
- n.occupation :path => 'occupation' do |n1|
1140
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1141
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1142
- }
1143
- end
1144
- n.temporal :path => 'temporal' do |n1|
1145
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1146
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1147
- }
1148
- # date attributes as attributes
1149
- Mods::DATE_ATTRIBS.each { |attr_name|
1150
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1151
- }
1152
- end
1153
- n.titleInfo :path => 'titleInfo' do |t1|
1154
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1155
- t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1156
- }
1157
- end
1158
- n.topic :path => 'topic' do |n1|
1159
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1160
- n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1161
- }
1162
- end
1163
- end # t.subject
1164
-
1165
- # TABLE_OF_CONTENTS ---------------------------------------------------------------------
1166
- t.tableOfContents :path => '/mods/tableOfContents'
1167
- t._tableOfContents :path => '//tableOfContents' do |n|
1168
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
1169
- n.shareable :path => '@shareable', :accessor => lambda { |a| a.text }
1170
- n.type_at :path => '@type', :accessor => lambda { |a| a.text }
1171
- Mods::LANG_ATTRIBS.each { |attr_name|
1172
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1173
- }
1174
- end
1175
-
1176
- # TARGET_AUDIENCE -----------------------------------------------------------------------
1177
- t.targetAudience :path => '/mods/targetAudience'
1178
- t._targetAudience :path => '//targetAudience' do |n|
1179
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
1180
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
1181
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1182
- }
1183
- Mods::LANG_ATTRIBS.each { |attr_name|
1184
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1185
- }
1186
- end
1187
-
1188
- # TITLE_INFO ----------------------------------------------------------------------------
1189
- t.title_info :path => '/mods/titleInfo'
1190
- t._title_info :path => '//titleInfo' do |n|
1191
- Mods::TitleInfo::ATTRIBUTES.each { |attr_name|
1192
- if attr_name != 'type'
1193
- n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1194
- else
1195
- n.type_at :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
1196
- end
1197
- }
1198
- n.title :path => 'title'
1199
- n.subTitle :path => 'subTitle'
1200
- n.nonSort :path => 'nonSort'
1201
- n.partNumber :path => 'partNumber'
1202
- n.partName :path => 'partName'
1203
- n.sort_title :path => '.', :accessor => lambda { |node|
1204
- if node.type_at != "alternative" || (node.type_at == "alternative" && mods_ng_xml.xpath('/mods/titleInfo').size == 1)
1205
- node.title.text + (!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
1206
- end
1207
- }
1208
- n.full_title :path => '.', :accessor => lambda { |node|
1209
- (!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
1210
- node.title.text +
1211
- (!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
1212
- }
1213
- n.short_title :path => '.', :accessor => lambda { |node|
1214
- if node.type_at != "alternative"
1215
- (!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
1216
- node.title.text
1217
- end
1218
- }
1219
- n.alternative_title :path => '.', :accessor => lambda { |node|
1220
- if node.type_at == "alternative"
1221
- (!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
1222
- node.title.text
1223
- end
1224
- }
1225
- end # t._title_info
1226
-
1227
- # TYPE_OF_RESOURCE --------------------------------------------------------------------
1228
- t.typeOfResource :path => '/mods/typeOfResource'
1229
- t._typeOfResource :path => '//typeOfResource' do |n|
1230
- n.collection :path => '@collection', :accessor => lambda { |a| a.text }
1231
- n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
1232
- n.manuscript :path => '@manuscript', :accessor => lambda { |a| a.text }
1233
- n.usage :path => '@usage', :accessor => lambda { |a| a.text }
1234
- end
1235
-
1236
- end # terminology
501
+ end
1237
502
 
1238
503
  mods_ng_xml.nom!
1239
504
  mods_ng_xml
1240
- end # set_terminology_no_ns
1241
-
1242
- end # Record class
1243
- end # Mods module
505
+ end
506
+ end
507
+ end