mods 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +17 -16
- data/lib/mods/nom_terminology.rb +442 -342
- data/lib/mods/record.rb +12 -16
- data/lib/mods/version.rb +1 -1
- data/spec/name_spec.rb +256 -2
- data/spec/record_spec.rb +31 -3
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -37,19 +37,20 @@ TODO: Write usage instructions here
|
|
37
37
|
|
38
38
|
== Releases
|
39
39
|
|
40
|
-
0.0.
|
41
|
-
0.0.
|
42
|
-
0.0.
|
43
|
-
0.0.
|
44
|
-
0.0.
|
45
|
-
0.0.
|
46
|
-
0.0.
|
47
|
-
0.0.
|
48
|
-
0.0.
|
49
|
-
0.0.
|
50
|
-
0.0.
|
51
|
-
0.0.
|
52
|
-
0.0.
|
53
|
-
0.0.
|
54
|
-
0.0.
|
55
|
-
0.0.
|
40
|
+
* <b>0.0.17</b> add display_value and display_value_w_date to name node; add personal_names_w_dates to record
|
41
|
+
* <b>0.0.16</b> add role convenience methods (within name node)
|
42
|
+
* <b>0.0.15</b> make namespace aware processing the default
|
43
|
+
* <b>0.0.14</b> don't lose xml encoding in reader.normalize_mods under jruby
|
44
|
+
* <b>0.0.13</b> really really fix removal of xsi:schemaLocation in jruby
|
45
|
+
* <b>0.0.12</b> fix failing jruby test
|
46
|
+
* <b>0.0.11</b> fix remove xsi:schemaLocation attribute from mods element when not using namespaces
|
47
|
+
* <b>0.0.10</b> remove xsi:schemaLocation attribute from mods element when not using namespaces
|
48
|
+
* <b>0.0.9</b> implement from_nk_node as way to load record object
|
49
|
+
* <b>0.0.8</b> implement relatedItem and attributes on all simple top level elements
|
50
|
+
* <b>0.0.7</b> implement part
|
51
|
+
* <b>0.0.6</b> implement recordInfo, fix to work under jruby
|
52
|
+
* <b>0.0.5</b> implement subject, change a few constants
|
53
|
+
* <b>0.0.4</b> implement language, location, origin_info, physical_description
|
54
|
+
* <b>0.0.3</b> use nom-xml gem and make this more nokogiri-ish; implement name, title, and simple top level elements with no subelements
|
55
|
+
* <b>0.0.2</b> Set up rake tasks, publishing rdoc, and continuous integration.
|
56
|
+
* <b>0.0.1</b> Grab the name
|
data/lib/mods/nom_terminology.rb
CHANGED
@@ -16,52 +16,52 @@ module Mods
|
|
16
16
|
|
17
17
|
class Record
|
18
18
|
|
19
|
-
# set the NOM terminology;
|
19
|
+
# set the NOM terminology; WITH namespaces
|
20
20
|
# NOTES:
|
21
21
|
# 1. certain words, such as 'type' 'name' 'description' are reserved words in jruby or nokogiri
|
22
22
|
# when the terminology would use these words, a suffix of '_at' is added if it is an attribute,
|
23
23
|
# (e.g. 'type_at' for @type) and a suffix of '_el' is added if it is an element.
|
24
24
|
# 2. the underscore prefix variant terms are a way of making subterms for a node available
|
25
25
|
# to any instance of said node and are not intended to be used externally
|
26
|
-
# @param mods_ng_xml a Nokogiri::Xml::Document object containing MODS (
|
27
|
-
def
|
28
|
-
mods_ng_xml.set_terminology() do |t|
|
26
|
+
# @param mods_ng_xml a Nokogiri::Xml::Document object containing MODS (with namespaces)
|
27
|
+
def set_terminology_ns(mods_ng_xml)
|
28
|
+
mods_ng_xml.set_terminology(:namespaces => { 'm' => Mods::MODS_NS }) do |t|
|
29
29
|
|
30
30
|
# FIXME: may want to deal with camelcase vs. underscore in method_missing
|
31
31
|
|
32
32
|
# ABSTRACT -------------------------------------------------------------------------------
|
33
|
-
t.abstract :path => '/mods/abstract'
|
34
|
-
t._abstract :path => '//abstract' do |n|
|
33
|
+
t.abstract :path => '/m:mods/m:abstract'
|
34
|
+
t._abstract :path => '//m:abstract' do |n|
|
35
35
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
36
36
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
# ACCESS_CONDITION -----------------------------------------------------------------------
|
40
|
-
t.accessCondition :path => '/mods/accessCondition'
|
41
|
-
t._accessCondition :path => '//accessCondition' do |n|
|
40
|
+
t.accessCondition :path => '/m:mods/m:accessCondition'
|
41
|
+
t._accessCondition :path => '//m:accessCondition' do |n|
|
42
42
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
43
43
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# CLASSIFICATION -------------------------------------------------------------------------
|
47
|
-
t.classification :path => '/mods/classification'
|
48
|
-
t._classification :path => '//classification' do |n|
|
47
|
+
t.classification :path => '/m:mods/m:classification'
|
48
|
+
t._classification :path => '//m:classification' do |n|
|
49
49
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
50
50
|
n.edition :path => '@edition', :accessor => lambda { |a| a.text }
|
51
51
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
52
52
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
53
53
|
}
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
# EXTENSION ------------------------------------------------------------------------------
|
57
|
-
t.extension :path => '/mods/extension'
|
58
|
-
t._extension :path => '//extension' do |n|
|
57
|
+
t.extension :path => '/m:mods/m:extension'
|
58
|
+
t._extension :path => '//m:extension' do |n|
|
59
59
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# GENRE ----------------------------------------------------------------------------------
|
63
|
-
t.genre :path => '/mods/genre'
|
64
|
-
t._genre :path => '//genre' do |n|
|
63
|
+
t.genre :path => '/m:mods/m:genre'
|
64
|
+
t._genre :path => '//m:genre' do |n|
|
65
65
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
66
66
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
67
67
|
n.usage :path => '@usage', :accessor => lambda { |a| a.text }
|
@@ -69,24 +69,24 @@ module Mods
|
|
69
69
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
70
70
|
}
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
# IDENTIIER ------------------------------------------------------------------------------
|
74
|
-
t.identifier :path => '/mods/identifier'
|
75
|
-
t._identifier :path => '//identifier' do |n|
|
74
|
+
t.identifier :path => '/m:mods/m:identifier'
|
75
|
+
t._identifier :path => '//m:identifier' do |n|
|
76
76
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
77
77
|
n.invalid :path => '@invalid', :accessor => lambda { |a| a.text }
|
78
78
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
# LANGUAGE -------------------------------------------------------------------------------
|
82
|
-
t.language :path => '/mods/language'
|
83
|
-
t._language :path => '//language' do |n|
|
84
|
-
n.languageTerm :path => 'languageTerm'
|
85
|
-
n.code_term :path => 'languageTerm[@type="code"]'
|
86
|
-
n.text_term :path => 'languageTerm[@type="text"]'
|
87
|
-
n.scriptTerm :path => 'scriptTerm'
|
82
|
+
t.language :path => '/m:mods/m:language'
|
83
|
+
t._language :path => '//m:language' do |n|
|
84
|
+
n.languageTerm :path => 'm:languageTerm'
|
85
|
+
n.code_term :path => 'm:languageTerm[@type="code"]'
|
86
|
+
n.text_term :path => 'm:languageTerm[@type="text"]'
|
87
|
+
n.scriptTerm :path => 'm:scriptTerm'
|
88
88
|
end
|
89
|
-
t._languageTerm :path => '//languageTerm' do |lt|
|
89
|
+
t._languageTerm :path => '//m:languageTerm' do |lt|
|
90
90
|
lt.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
91
91
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
92
92
|
lt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -94,29 +94,29 @@ module Mods
|
|
94
94
|
end # t.language
|
95
95
|
|
96
96
|
# LOCATION -------------------------------------------------------------------------------
|
97
|
-
t.location :path => '/mods/location'
|
98
|
-
t._location :path => '//location' do |n|
|
99
|
-
n.physicalLocation :path => 'physicalLocation' do |e|
|
97
|
+
t.location :path => '/m:mods/m:location'
|
98
|
+
t._location :path => '//m:location' do |n|
|
99
|
+
n.physicalLocation :path => 'm:physicalLocation' do |e|
|
100
100
|
e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
101
101
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
102
102
|
e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
103
103
|
}
|
104
104
|
end
|
105
|
-
n.shelfLocator :path => 'shelfLocator'
|
106
|
-
n.url :path => 'url' do |e|
|
105
|
+
n.shelfLocator :path => 'm:shelfLocator'
|
106
|
+
n.url :path => 'm:url' do |e|
|
107
107
|
e.dateLastAccessed :path => '@dateLastAccessed', :accessor => lambda { |a| a.text }
|
108
108
|
e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
109
109
|
e.note :path => '@note', :accessor => lambda { |a| a.text }
|
110
110
|
e.access :path => '@access', :accessor => lambda { |a| a.text }
|
111
111
|
e.usage :path => '@usage', :accessor => lambda { |a| a.text }
|
112
112
|
end
|
113
|
-
n.holdingSimple :path => 'holdingSimple'
|
114
|
-
n.holdingExternal :path => 'holdingExternal'
|
113
|
+
n.holdingSimple :path => 'm:holdingSimple'
|
114
|
+
n.holdingExternal :path => 'm:holdingExternal'
|
115
115
|
end # t.location
|
116
|
-
|
116
|
+
|
117
117
|
# NAME ------------------------------------------------------------------------------------
|
118
|
-
t.plain_name :path => '/mods/name'
|
119
|
-
t._plain_name :path => '//name' do |n|
|
118
|
+
t.plain_name :path => '/m:mods/m:name'
|
119
|
+
t._plain_name :path => '//m:name' do |n|
|
120
120
|
Mods::Name::ATTRIBUTES.each { |attr_name|
|
121
121
|
if attr_name != 'type'
|
122
122
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -125,23 +125,28 @@ module Mods
|
|
125
125
|
end
|
126
126
|
}
|
127
127
|
# elements
|
128
|
-
n.namePart :path => 'namePart' do |np|
|
128
|
+
n.namePart :path => 'm:namePart' do |np|
|
129
129
|
np.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
130
130
|
end
|
131
|
-
n.
|
132
|
-
n.
|
133
|
-
n.
|
134
|
-
n.
|
135
|
-
|
131
|
+
n.family_name :path => 'm:namePart[@type="family"]'
|
132
|
+
n.given_name :path => 'm:namePart[@type="given"]'
|
133
|
+
n.termsOfAddress :path => 'm:namePart[@type="termsOfAddress"]'
|
134
|
+
n.date :path => 'm:namePart[@type="date"]'
|
135
|
+
|
136
|
+
n.displayForm :path => 'm:displayForm'
|
137
|
+
n.affiliation :path => 'm:affiliation'
|
138
|
+
n.description_el :path => 'm:description' # description is used by Nokogiri
|
139
|
+
n.role :path => 'm:role' do |r|
|
140
|
+
r.roleTerm :path => 'm:roleTerm' do |rt|
|
136
141
|
rt.type_at :path => "@type", :accessor => lambda { |a| a.text }
|
137
142
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
138
143
|
rt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
139
144
|
}
|
140
145
|
end
|
141
|
-
# convenience method
|
146
|
+
# role convenience method
|
142
147
|
r.authority :path => '.', :accessor => lambda { |role_node|
|
143
148
|
a = nil
|
144
|
-
role_node.roleTerm.each { |role_t|
|
149
|
+
role_node.roleTerm.each { |role_t|
|
145
150
|
# role_t.authority will be [] if it is missing from an earlier roleTerm
|
146
151
|
if role_t.authority && (!a || a.size == 0)
|
147
152
|
a = role_t.authority
|
@@ -149,21 +154,21 @@ module Mods
|
|
149
154
|
}
|
150
155
|
a
|
151
156
|
}
|
152
|
-
# convenience method
|
157
|
+
# role convenience method
|
153
158
|
r.code :path => '.', :accessor => lambda { |role_node|
|
154
159
|
c = nil
|
155
160
|
role_node.roleTerm.each { |role_t|
|
156
|
-
if role_t.type_at == 'code'
|
161
|
+
if role_t.type_at == 'code'
|
157
162
|
c ||= role_t.text
|
158
163
|
end
|
159
164
|
}
|
160
165
|
c
|
161
166
|
}
|
162
|
-
# convenience method
|
167
|
+
# role convenience method
|
163
168
|
r.value :path => '.', :accessor => lambda { |role_node|
|
164
169
|
val = nil
|
165
170
|
role_node.roleTerm.each { |role_t|
|
166
|
-
if role_t.type_at == 'text'
|
171
|
+
if role_t.type_at == 'text'
|
167
172
|
val ||= role_t.text
|
168
173
|
end
|
169
174
|
}
|
@@ -174,43 +179,89 @@ module Mods
|
|
174
179
|
val
|
175
180
|
}
|
176
181
|
end # role node
|
182
|
+
|
183
|
+
# name convenience method
|
184
|
+
# uses the displayForm of a name if present
|
185
|
+
# if no displayForm, try to make a string from family, given and terms of address
|
186
|
+
# otherwise, return all non-date nameParts concatenated together
|
187
|
+
n.display_value :path => '.', :single => true, :accessor => lambda {|name_node|
|
188
|
+
dv = ''
|
189
|
+
if name_node.displayForm && name_node.displayForm.text.size > 0
|
190
|
+
dv = name_node.displayForm.text
|
191
|
+
end
|
192
|
+
if dv.empty?
|
193
|
+
if name_node.type_at == 'personal'
|
194
|
+
if name_node.family_name.size > 0
|
195
|
+
dv = name_node.given_name.size > 0 ? "#{name_node.family_name.text}, #{name_node.given_name.text}" : name_node.family_name.text
|
196
|
+
elsif name_node.given_name.size > 0
|
197
|
+
dv = name_node.given_name.text
|
198
|
+
end
|
199
|
+
if !dv.empty?
|
200
|
+
first = true
|
201
|
+
name_node.namePart.each { |np|
|
202
|
+
if np.type_at == 'termsOfAddress' && !np.text.empty?
|
203
|
+
if first
|
204
|
+
dv = dv + " " + np.text
|
205
|
+
first = false
|
206
|
+
else
|
207
|
+
dv = dv + ", " + np.text
|
208
|
+
end
|
209
|
+
end
|
210
|
+
}
|
211
|
+
else # no family or given name
|
212
|
+
dv = name_node.namePart.select {|np| np.type_at != 'date' && !np.text.empty?}.join(" ")
|
213
|
+
end
|
214
|
+
else # not a personal name
|
215
|
+
dv = name_node.namePart.select {|np| np.type_at != 'date' && !np.text.empty?}.join(" ")
|
216
|
+
end
|
217
|
+
end
|
218
|
+
dv.strip.empty? ? nil : dv.strip
|
219
|
+
}
|
220
|
+
|
221
|
+
# name convenience method
|
222
|
+
n.display_value_w_date :path => '.', :single => true, :accessor => lambda {|name_node|
|
223
|
+
dv = '' + name_node.display_value
|
224
|
+
name_node.namePart.each { |np|
|
225
|
+
if np.type_at == 'date' && !np.text.empty? && !dv.end_with?(np.text)
|
226
|
+
dv = dv + ", #{np.text}"
|
227
|
+
end
|
228
|
+
}
|
229
|
+
if dv.start_with?(', ')
|
230
|
+
dv.sub(', ', '')
|
231
|
+
end
|
232
|
+
dv.strip.empty? ? nil : dv.strip
|
233
|
+
}
|
177
234
|
end # t._plain_name
|
178
235
|
|
179
|
-
t.personal_name :path => '/mods/name[@type="personal"]'
|
180
|
-
t._personal_name :path => '//name[@type="personal"]'
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
t.corporate_name :path => '/mods/name[@type="corporate"]'
|
188
|
-
t._corporate_name :path => '//name[@type="corporate"]'
|
189
|
-
t.conference_name :path => '/mods/name[@type="conference"]'
|
190
|
-
t._conference_name :path => '//name[@type="conference"]'
|
236
|
+
t.personal_name :path => '/m:mods/m:name[@type="personal"]'
|
237
|
+
t._personal_name :path => '//m:name[@type="personal"]'
|
238
|
+
t.corporate_name :path => '/m:mods/m:name[@type="corporate"]'
|
239
|
+
t._corporate_name :path => '//m:name[@type="corporate"]'
|
240
|
+
t.conference_name :path => '/m:mods/m:name[@type="conference"]'
|
241
|
+
t._conference_name :path => '//m:name[@type="conference"]'
|
191
242
|
|
192
243
|
# NOTE ---------------------------------------------------------------------------------
|
193
|
-
t.note :path => '/mods/note'
|
194
|
-
t._note :path => '//note' do |n|
|
244
|
+
t.note :path => '/m:mods/m:note'
|
245
|
+
t._note :path => '//m:note' do |n|
|
195
246
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
196
247
|
n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
|
197
248
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
198
249
|
end
|
199
|
-
|
250
|
+
|
200
251
|
# ORIGIN_INFO --------------------------------------------------------------------------
|
201
|
-
t.origin_info :path => '/mods/originInfo'
|
202
|
-
t._origin_info :path => '//originInfo' do |n|
|
203
|
-
n.place :path => 'place' do |e|
|
204
|
-
e.placeTerm :path => 'placeTerm' do |ee|
|
252
|
+
t.origin_info :path => '/m:mods/m:originInfo'
|
253
|
+
t._origin_info :path => '//m:originInfo' do |n|
|
254
|
+
n.place :path => 'm:place' do |e|
|
255
|
+
e.placeTerm :path => 'm:placeTerm' do |ee|
|
205
256
|
ee.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
206
257
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
207
258
|
ee.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
208
259
|
}
|
209
260
|
end
|
210
261
|
end
|
211
|
-
n.publisher :path => 'publisher'
|
262
|
+
n.publisher :path => 'm:publisher'
|
212
263
|
Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |date_el|
|
213
|
-
n.send date_el, :path => "
|
264
|
+
n.send date_el, :path => "m:#{date_el}" do |d|
|
214
265
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
215
266
|
d.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
216
267
|
}
|
@@ -219,161 +270,161 @@ module Mods
|
|
219
270
|
end
|
220
271
|
end
|
221
272
|
}
|
222
|
-
n.edition :path => 'edition'
|
223
|
-
n.issuance :path => 'issuance'
|
224
|
-
n.frequency :path => 'frequency' do |f|
|
273
|
+
n.edition :path => 'm:edition'
|
274
|
+
n.issuance :path => 'm:issuance'
|
275
|
+
n.frequency :path => 'm:frequency' do |f|
|
225
276
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
226
277
|
f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
227
278
|
}
|
228
279
|
end
|
229
280
|
end # t.origin_info
|
230
|
-
|
281
|
+
|
231
282
|
# PART -----------------------------------------------------------------------------------
|
232
|
-
t.part :path => '/mods/part'
|
233
|
-
t._part :path => '//part' do |n|
|
283
|
+
t.part :path => '/m:mods/m:part'
|
284
|
+
t._part :path => '//m:part' do |n|
|
234
285
|
# attributes
|
235
286
|
n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
|
236
287
|
n.order :path => '@order', :accessor => lambda { |a| a.text }
|
237
288
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
238
289
|
# child elements
|
239
|
-
n.detail :path => 'detail' do |e|
|
290
|
+
n.detail :path => 'm:detail' do |e|
|
240
291
|
# attributes
|
241
292
|
e.level :path => '@level', :accessor => lambda { |a| a.text }
|
242
293
|
e.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
243
294
|
# elements
|
244
|
-
e.number :path => 'number'
|
245
|
-
e.caption :path => 'caption'
|
246
|
-
e.title :path => 'title'
|
295
|
+
e.number :path => 'm:number'
|
296
|
+
e.caption :path => 'm:caption'
|
297
|
+
e.title :path => 'm:title'
|
247
298
|
end
|
248
|
-
n.extent :path => 'extent' do |e| # TODO: extent is ordered in xml schema
|
299
|
+
n.extent :path => 'm:extent' do |e| # TODO: extent is ordered in xml schema
|
249
300
|
# attributes
|
250
301
|
e.unit :path => '@unit', :accessor => lambda { |a| a.text }
|
251
302
|
# elements
|
252
|
-
e.start :path => 'start'
|
253
|
-
e.end :path => 'end'
|
254
|
-
e.total :path => 'total'
|
255
|
-
e.list :path => 'list'
|
303
|
+
e.start :path => 'm:start'
|
304
|
+
e.end :path => 'm:end'
|
305
|
+
e.total :path => 'm:total'
|
306
|
+
e.list :path => 'm:list'
|
256
307
|
end
|
257
|
-
n.date :path => 'date' do |e|
|
308
|
+
n.date :path => 'm:date' do |e|
|
258
309
|
Mods::DATE_ATTRIBS.reject { |a| a == 'keyDate' }.each { |attr_name|
|
259
310
|
e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
260
311
|
}
|
261
312
|
end
|
262
|
-
n.text_el :path => 'text' do |e|
|
313
|
+
n.text_el :path => 'm:text' do |e|
|
263
314
|
e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
264
315
|
e.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
265
316
|
end
|
266
317
|
end # t._part
|
267
|
-
|
318
|
+
|
268
319
|
# PHYSICAL_DESCRIPTION -------------------------------------------------------------------
|
269
|
-
t.physical_description :path => '/mods/physicalDescription'
|
270
|
-
t._physical_description :path => '//physicalDescription' do |n|
|
271
|
-
n.digitalOrigin :path => 'digitalOrigin'
|
272
|
-
n.extent :path => 'extent'
|
273
|
-
n.form :path => 'form' do |f|
|
320
|
+
t.physical_description :path => '/m:mods/m:physicalDescription'
|
321
|
+
t._physical_description :path => '//m:physicalDescription' do |n|
|
322
|
+
n.digitalOrigin :path => 'm:digitalOrigin'
|
323
|
+
n.extent :path => 'm:extent'
|
324
|
+
n.form :path => 'm:form' do |f|
|
274
325
|
f.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
275
326
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
276
327
|
f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
277
328
|
}
|
278
329
|
end
|
279
|
-
n.internetMediaType :path => 'internetMediaType'
|
280
|
-
n.note :path => 'note' do |nn|
|
330
|
+
n.internetMediaType :path => 'm:internetMediaType'
|
331
|
+
n.note :path => 'm:note' do |nn|
|
281
332
|
nn.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
282
333
|
nn.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
283
334
|
end
|
284
|
-
n.reformattingQuality :path => 'reformattingQuality'
|
335
|
+
n.reformattingQuality :path => 'm:reformattingQuality'
|
285
336
|
end
|
286
|
-
|
337
|
+
|
287
338
|
# RECORD_INFO --------------------------------------------------------------------------
|
288
|
-
t.record_info :path => '/mods/recordInfo'
|
289
|
-
t._record_info :path => '//recordInfo' do |n|
|
339
|
+
t.record_info :path => '/m:mods/m:recordInfo'
|
340
|
+
t._record_info :path => '//m:recordInfo' do |n|
|
290
341
|
# attributes
|
291
342
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
292
343
|
Mods::LANG_ATTRIBS.each { |attr_name|
|
293
344
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
294
345
|
}
|
295
346
|
# child elements
|
296
|
-
n.recordContentSource :path => 'recordContentSource' do |r|
|
347
|
+
n.recordContentSource :path => 'm:recordContentSource' do |r|
|
297
348
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
298
349
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
299
350
|
}
|
300
351
|
end
|
301
|
-
n.recordCreationDate :path => 'recordCreationDate' do |r|
|
352
|
+
n.recordCreationDate :path => 'm:recordCreationDate' do |r|
|
302
353
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
303
354
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
304
355
|
}
|
305
356
|
end
|
306
|
-
n.recordChangeDate :path => 'recordChangeDate' do |r|
|
357
|
+
n.recordChangeDate :path => 'm:recordChangeDate' do |r|
|
307
358
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
308
359
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
309
360
|
}
|
310
361
|
end
|
311
|
-
n.recordIdentifier :path => 'recordIdentifier' do |r|
|
362
|
+
n.recordIdentifier :path => 'm:recordIdentifier' do |r|
|
312
363
|
r.source :path => '@source', :accessor => lambda { |a| a.text }
|
313
364
|
end
|
314
|
-
n.recordOrigin :path => 'recordOrigin'
|
315
|
-
n.languageOfCataloging :path => 'languageOfCataloging' do |r|
|
365
|
+
n.recordOrigin :path => 'm:recordOrigin'
|
366
|
+
n.languageOfCataloging :path => 'm:languageOfCataloging' do |r|
|
316
367
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
317
368
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
318
369
|
}
|
319
|
-
r.languageTerm :path => 'languageTerm'
|
320
|
-
r.scriptTerm :path => 'scriptTerm'
|
370
|
+
r.languageTerm :path => 'm:languageTerm'
|
371
|
+
r.scriptTerm :path => 'm:scriptTerm'
|
321
372
|
end
|
322
|
-
n.descriptionStandard :path => 'descriptionStandard' do |r|
|
373
|
+
n.descriptionStandard :path => 'm:descriptionStandard' do |r|
|
323
374
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
324
375
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
325
376
|
}
|
326
377
|
end
|
327
378
|
end # t._record_info
|
328
|
-
|
379
|
+
|
329
380
|
# RELATED_ITEM-------------------------------------------------------------------------
|
330
|
-
t.related_item :path => '/mods/relatedItem' do |n|
|
381
|
+
t.related_item :path => '/m:mods/m:relatedItem' do |n|
|
331
382
|
# attributes
|
332
383
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
333
384
|
n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
|
334
385
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
335
386
|
# elements
|
336
387
|
n.abstract :path => 'abstract'
|
337
|
-
n.accessCondition :path => 'accessCondition'
|
338
|
-
n.classification :path => 'classification'
|
339
|
-
n.extension :path => 'extension'
|
340
|
-
n.genre :path => 'genre'
|
341
|
-
n.identifier :path => 'identifier'
|
342
|
-
n.language :path => 'language'
|
343
|
-
n.location :path => 'location'
|
344
|
-
n.name_el :path => 'name' # Note: 'name' is used by Nokogiri
|
345
|
-
n.personal_name :path => 'name[@type="personal"]'
|
346
|
-
n.corporate_name :path => 'name[@type="corporate"]'
|
347
|
-
n.conference_name :path => 'name[@type="conference"]'
|
348
|
-
n.note :path => 'note'
|
349
|
-
n.originInfo :path => 'originInfo'
|
350
|
-
n.part :path => 'part'
|
351
|
-
n.physicalDescription :path => 'physicalDescription'
|
352
|
-
n.recordInfo :path => 'recordInfo'
|
353
|
-
n.subject :path => 'subject'
|
354
|
-
n.tableOfContents :path => 'tableOfContents'
|
355
|
-
n.targetAudience :path => 'targetAudience'
|
356
|
-
n.titleInfo :path => 'titleInfo'
|
357
|
-
n.typeOfResource :path => 'typeOfResource'
|
388
|
+
n.accessCondition :path => 'm:accessCondition'
|
389
|
+
n.classification :path => 'm:classification'
|
390
|
+
n.extension :path => 'm:extension'
|
391
|
+
n.genre :path => 'm:genre'
|
392
|
+
n.identifier :path => 'm:identifier'
|
393
|
+
n.language :path => 'm:language'
|
394
|
+
n.location :path => 'm:location'
|
395
|
+
n.name_el :path => 'm:name' # Note: 'name' is used by Nokogiri
|
396
|
+
n.personal_name :path => 'm:name[@type="personal"]'
|
397
|
+
n.corporate_name :path => 'm:name[@type="corporate"]'
|
398
|
+
n.conference_name :path => 'm:name[@type="conference"]'
|
399
|
+
n.note :path => 'm:note'
|
400
|
+
n.originInfo :path => 'm:originInfo'
|
401
|
+
n.part :path => 'm:part'
|
402
|
+
n.physicalDescription :path => 'm:physicalDescription'
|
403
|
+
n.recordInfo :path => 'm:recordInfo'
|
404
|
+
n.subject :path => 'm:subject'
|
405
|
+
n.tableOfContents :path => 'm:tableOfContents'
|
406
|
+
n.targetAudience :path => 'm:targetAudience'
|
407
|
+
n.titleInfo :path => 'm:titleInfo'
|
408
|
+
n.typeOfResource :path => 'm:typeOfResource'
|
358
409
|
end
|
359
410
|
|
360
411
|
# SUBJECT -----------------------------------------------------------------------------
|
361
|
-
t.subject :path => '/mods/subject'
|
362
|
-
t._subject :path => '//subject' do |n|
|
412
|
+
t.subject :path => '/m:mods/m:subject'
|
413
|
+
t._subject :path => '//m:subject' do |n|
|
363
414
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
364
415
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
365
416
|
}
|
366
|
-
n.topic :path => 'topic' do |n1|
|
417
|
+
n.topic :path => 'm:topic' do |n1|
|
367
418
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
368
419
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
369
420
|
}
|
370
421
|
end
|
371
|
-
n.geographic :path => 'geographic' do |n1|
|
422
|
+
n.geographic :path => 'm:geographic' do |n1|
|
372
423
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
373
424
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
374
425
|
}
|
375
426
|
end
|
376
|
-
n.temporal :path => 'temporal' do |n1|
|
427
|
+
n.temporal :path => 'm:temporal' do |n1|
|
377
428
|
# date attributes as elements
|
378
429
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
379
430
|
n1.send attr_name, :path => "#{attr_name}"
|
@@ -386,73 +437,73 @@ module Mods
|
|
386
437
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
387
438
|
}
|
388
439
|
end
|
389
|
-
n.titleInfo :path => 'titleInfo' do |t1|
|
440
|
+
n.titleInfo :path => 'm:titleInfo' do |t1|
|
390
441
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
391
442
|
t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
392
443
|
}
|
393
444
|
end
|
394
445
|
# Note: 'name' is used by Nokogiri
|
395
|
-
n.name_el :path => 'name' do |t1|
|
446
|
+
n.name_el :path => 'm:name' do |t1|
|
396
447
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
397
448
|
t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
398
449
|
}
|
399
450
|
end
|
400
|
-
n.personal_name :path => 'name[@type="personal"]'
|
401
|
-
n.corporate_name :path => 'name[@type="corporate"]'
|
402
|
-
n.conference_name :path => 'name[@type="conference"]'
|
403
|
-
n.geographicCode :path => 'geographicCode' do |g|
|
451
|
+
n.personal_name :path => 'm:name[@type="personal"]'
|
452
|
+
n.corporate_name :path => 'm:name[@type="corporate"]'
|
453
|
+
n.conference_name :path => 'm:name[@type="conference"]'
|
454
|
+
n.geographicCode :path => 'm:geographicCode' do |g|
|
404
455
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
405
456
|
g.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
406
457
|
}
|
407
458
|
end
|
408
|
-
n.genre :path => 'genre' do |n1|
|
459
|
+
n.genre :path => 'm:genre' do |n1|
|
409
460
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
410
461
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
411
462
|
}
|
412
463
|
end
|
413
|
-
n.hierarchicalGeographic :path => 'hierarchicalGeographic' do |n1|
|
464
|
+
n.hierarchicalGeographic :path => 'm:hierarchicalGeographic' do |n1|
|
414
465
|
Mods::Subject::HIER_GEO_CHILD_ELEMENTS.each { |elname|
|
415
|
-
n1.send elname, :path => "
|
466
|
+
n1.send elname, :path => "m:#{elname}"
|
416
467
|
}
|
417
468
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
418
469
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
419
470
|
}
|
420
471
|
end
|
421
|
-
n.cartographics :path => 'cartographics' do |n1|
|
422
|
-
n1.scale :path => 'scale'
|
423
|
-
n1.projection :path => 'projection'
|
424
|
-
n1.coordinates :path => 'coordinates'
|
472
|
+
n.cartographics :path => 'm:cartographics' do |n1|
|
473
|
+
n1.scale :path => 'm:scale'
|
474
|
+
n1.projection :path => 'm:projection'
|
475
|
+
n1.coordinates :path => 'm:coordinates'
|
425
476
|
Mods::Subject::CARTOGRAPHICS_CHILD_ELEMENTS.each { |elname|
|
426
|
-
n1.send elname, :path => "
|
477
|
+
n1.send elname, :path => "m:#{elname}"
|
427
478
|
}
|
428
479
|
end
|
429
|
-
n.occupation :path => 'occupation' do |n1|
|
480
|
+
n.occupation :path => 'm:occupation' do |n1|
|
430
481
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
431
482
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
432
483
|
}
|
433
484
|
end
|
434
485
|
end # t.subject
|
435
|
-
|
486
|
+
|
436
487
|
# TABLE_OF_CONTENTS ---------------------------------------------------------------------
|
437
|
-
t.tableOfContents :path => '/mods/tableOfContents'
|
438
|
-
t._tableOfContents :path => '//tableOfContents' do |n|
|
488
|
+
t.tableOfContents :path => '/m:mods/m:tableOfContents'
|
489
|
+
t._tableOfContents :path => '//m:tableOfContents' do |n|
|
439
490
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
440
491
|
n.shareable :path => '@shareable', :accessor => lambda { |a| a.text }
|
441
492
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
442
493
|
end
|
443
|
-
|
494
|
+
|
444
495
|
# TARGET_AUDIENCE -----------------------------------------------------------------------
|
445
|
-
t.targetAudience :path => '/mods/targetAudience'
|
446
|
-
t._targetAudience :path => '//targetAudience' do |n|
|
496
|
+
t.targetAudience :path => '/m:mods/m:targetAudience'
|
497
|
+
t._targetAudience :path => '//m:targetAudience' do |n|
|
447
498
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
448
499
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
449
500
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
450
501
|
}
|
451
502
|
end
|
452
|
-
|
503
|
+
|
453
504
|
# TITLE_INFO ----------------------------------------------------------------------------
|
454
|
-
t.title_info :path => '/mods/titleInfo'
|
455
|
-
t._title_info :path => '//titleInfo' do |n|
|
505
|
+
t.title_info :path => '/m:mods/m:titleInfo'
|
506
|
+
t._title_info :path => '//m:titleInfo' do |n|
|
456
507
|
Mods::TitleInfo::ATTRIBUTES.each { |attr_name|
|
457
508
|
if attr_name != 'type'
|
458
509
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -460,27 +511,32 @@ module Mods
|
|
460
511
|
n.type_at :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
461
512
|
end
|
462
513
|
}
|
463
|
-
n.title :path => 'title'
|
464
|
-
n.subTitle :path => 'subTitle'
|
465
|
-
n.nonSort :path => 'nonSort'
|
466
|
-
n.partNumber :path => 'partNumber'
|
467
|
-
n.partName :path => 'partName'
|
514
|
+
n.title :path => 'm:title'
|
515
|
+
n.subTitle :path => 'm:subTitle'
|
516
|
+
n.nonSort :path => 'm:nonSort'
|
517
|
+
n.partNumber :path => 'm:partNumber'
|
518
|
+
n.partName :path => 'm:partName'
|
519
|
+
# convenience method
|
468
520
|
n.sort_title :path => '.', :accessor => lambda { |node|
|
469
|
-
if node.type_at != "alternative" || (node.type_at == "alternative" &&
|
521
|
+
if node.type_at != "alternative" || (node.type_at == "alternative" &&
|
522
|
+
mods_ng_xml.xpath('/m:mods/m:titleInfo', {'m' => Mods::MODS_NS}).size == 1)
|
470
523
|
node.title.text + (!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
|
471
524
|
end
|
472
525
|
}
|
526
|
+
# convenience method
|
473
527
|
n.full_title :path => '.', :accessor => lambda { |node|
|
474
528
|
(!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
|
475
529
|
node.title.text +
|
476
530
|
(!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
|
477
531
|
}
|
532
|
+
# convenience method
|
478
533
|
n.short_title :path => '.', :accessor => lambda { |node|
|
479
534
|
if node.type_at != "alternative"
|
480
535
|
(!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
|
481
536
|
node.title.text
|
482
537
|
end
|
483
538
|
}
|
539
|
+
# convenience method
|
484
540
|
n.alternative_title :path => '.', :accessor => lambda { |node|
|
485
541
|
if node.type_at == "alternative"
|
486
542
|
(!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
|
@@ -488,53 +544,52 @@ module Mods
|
|
488
544
|
end
|
489
545
|
}
|
490
546
|
end # t._title_info
|
491
|
-
|
547
|
+
|
492
548
|
# TYPE_OF_RESOURCE --------------------------------------------------------------------
|
493
|
-
t.typeOfResource :path => '/mods/typeOfResource'
|
494
|
-
t._typeOfResource :path => '//typeOfResource' do |n|
|
549
|
+
t.typeOfResource :path => '/m:mods/m:typeOfResource'
|
550
|
+
t._typeOfResource :path => '//m:typeOfResource' do |n|
|
495
551
|
n.collection :path => '@collection', :accessor => lambda { |a| a.text }
|
496
552
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
497
553
|
n.manuscript :path => '@manuscript', :accessor => lambda { |a| a.text }
|
498
554
|
n.usage :path => '@usage', :accessor => lambda { |a| a.text }
|
499
555
|
end
|
500
|
-
|
501
|
-
end # terminology
|
502
556
|
|
503
|
-
|
557
|
+
end # terminology
|
558
|
+
|
559
|
+
mods_ng_xml.nom!
|
504
560
|
mods_ng_xml
|
505
|
-
end #
|
506
|
-
|
507
|
-
|
508
|
-
# set the NOM terminology; WITH namespaces
|
561
|
+
end # set_terminology_ns
|
562
|
+
|
563
|
+
# set the NOM terminology; do NOT use namespaces
|
509
564
|
# NOTES:
|
510
565
|
# 1. certain words, such as 'type' 'name' 'description' are reserved words in jruby or nokogiri
|
511
566
|
# when the terminology would use these words, a suffix of '_at' is added if it is an attribute,
|
512
567
|
# (e.g. 'type_at' for @type) and a suffix of '_el' is added if it is an element.
|
513
568
|
# 2. the underscore prefix variant terms are a way of making subterms for a node available
|
514
569
|
# to any instance of said node and are not intended to be used externally
|
515
|
-
# @param mods_ng_xml a Nokogiri::Xml::Document object containing MODS (
|
516
|
-
def
|
517
|
-
mods_ng_xml.set_terminology(
|
570
|
+
# @param mods_ng_xml a Nokogiri::Xml::Document object containing MODS (without namespaces)
|
571
|
+
def set_terminology_no_ns(mods_ng_xml)
|
572
|
+
mods_ng_xml.set_terminology() do |t|
|
518
573
|
|
519
574
|
# FIXME: may want to deal with camelcase vs. underscore in method_missing
|
520
575
|
|
521
576
|
# ABSTRACT -------------------------------------------------------------------------------
|
522
|
-
t.abstract :path => '/
|
523
|
-
t._abstract :path => '//
|
577
|
+
t.abstract :path => '/mods/abstract'
|
578
|
+
t._abstract :path => '//abstract' do |n|
|
524
579
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
525
580
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
526
581
|
end
|
527
582
|
|
528
583
|
# ACCESS_CONDITION -----------------------------------------------------------------------
|
529
|
-
t.accessCondition :path => '/
|
530
|
-
t._accessCondition :path => '//
|
584
|
+
t.accessCondition :path => '/mods/accessCondition'
|
585
|
+
t._accessCondition :path => '//accessCondition' do |n|
|
531
586
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
532
587
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
533
588
|
end
|
534
589
|
|
535
590
|
# CLASSIFICATION -------------------------------------------------------------------------
|
536
|
-
t.classification :path => '/
|
537
|
-
t._classification :path => '//
|
591
|
+
t.classification :path => '/mods/classification'
|
592
|
+
t._classification :path => '//classification' do |n|
|
538
593
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
539
594
|
n.edition :path => '@edition', :accessor => lambda { |a| a.text }
|
540
595
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
@@ -543,14 +598,14 @@ module Mods
|
|
543
598
|
end
|
544
599
|
|
545
600
|
# EXTENSION ------------------------------------------------------------------------------
|
546
|
-
t.extension :path => '/
|
547
|
-
t._extension :path => '//
|
601
|
+
t.extension :path => '/mods/extension'
|
602
|
+
t._extension :path => '//extension' do |n|
|
548
603
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
549
604
|
end
|
550
605
|
|
551
606
|
# GENRE ----------------------------------------------------------------------------------
|
552
|
-
t.genre :path => '/
|
553
|
-
t._genre :path => '//
|
607
|
+
t.genre :path => '/mods/genre'
|
608
|
+
t._genre :path => '//genre' do |n|
|
554
609
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
555
610
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
556
611
|
n.usage :path => '@usage', :accessor => lambda { |a| a.text }
|
@@ -560,22 +615,22 @@ module Mods
|
|
560
615
|
end
|
561
616
|
|
562
617
|
# IDENTIIER ------------------------------------------------------------------------------
|
563
|
-
t.identifier :path => '/
|
564
|
-
t._identifier :path => '//
|
618
|
+
t.identifier :path => '/mods/identifier'
|
619
|
+
t._identifier :path => '//identifier' do |n|
|
565
620
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
566
621
|
n.invalid :path => '@invalid', :accessor => lambda { |a| a.text }
|
567
622
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
568
623
|
end
|
569
624
|
|
570
625
|
# LANGUAGE -------------------------------------------------------------------------------
|
571
|
-
t.language :path => '/
|
572
|
-
t._language :path => '//
|
573
|
-
n.languageTerm :path => '
|
574
|
-
n.code_term :path => '
|
575
|
-
n.text_term :path => '
|
576
|
-
n.scriptTerm :path => '
|
626
|
+
t.language :path => '/mods/language'
|
627
|
+
t._language :path => '//language' do |n|
|
628
|
+
n.languageTerm :path => 'languageTerm'
|
629
|
+
n.code_term :path => 'languageTerm[@type="code"]'
|
630
|
+
n.text_term :path => 'languageTerm[@type="text"]'
|
631
|
+
n.scriptTerm :path => 'scriptTerm'
|
577
632
|
end
|
578
|
-
t._languageTerm :path => '//
|
633
|
+
t._languageTerm :path => '//languageTerm' do |lt|
|
579
634
|
lt.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
580
635
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
581
636
|
lt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -583,29 +638,29 @@ module Mods
|
|
583
638
|
end # t.language
|
584
639
|
|
585
640
|
# LOCATION -------------------------------------------------------------------------------
|
586
|
-
t.location :path => '/
|
587
|
-
t._location :path => '//
|
588
|
-
n.physicalLocation :path => '
|
641
|
+
t.location :path => '/mods/location'
|
642
|
+
t._location :path => '//location' do |n|
|
643
|
+
n.physicalLocation :path => 'physicalLocation' do |e|
|
589
644
|
e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
590
645
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
591
646
|
e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
592
647
|
}
|
593
648
|
end
|
594
|
-
n.shelfLocator :path => '
|
595
|
-
n.url :path => '
|
649
|
+
n.shelfLocator :path => 'shelfLocator'
|
650
|
+
n.url :path => 'url' do |e|
|
596
651
|
e.dateLastAccessed :path => '@dateLastAccessed', :accessor => lambda { |a| a.text }
|
597
652
|
e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
598
653
|
e.note :path => '@note', :accessor => lambda { |a| a.text }
|
599
654
|
e.access :path => '@access', :accessor => lambda { |a| a.text }
|
600
655
|
e.usage :path => '@usage', :accessor => lambda { |a| a.text }
|
601
656
|
end
|
602
|
-
n.holdingSimple :path => '
|
603
|
-
n.holdingExternal :path => '
|
657
|
+
n.holdingSimple :path => 'holdingSimple'
|
658
|
+
n.holdingExternal :path => 'holdingExternal'
|
604
659
|
end # t.location
|
605
660
|
|
606
661
|
# NAME ------------------------------------------------------------------------------------
|
607
|
-
t.plain_name :path => '/
|
608
|
-
t._plain_name :path => '//
|
662
|
+
t.plain_name :path => '/mods/name'
|
663
|
+
t._plain_name :path => '//name' do |n|
|
609
664
|
Mods::Name::ATTRIBUTES.each { |attr_name|
|
610
665
|
if attr_name != 'type'
|
611
666
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -614,14 +669,19 @@ module Mods
|
|
614
669
|
end
|
615
670
|
}
|
616
671
|
# elements
|
617
|
-
n.namePart :path => '
|
672
|
+
n.namePart :path => 'namePart' do |np|
|
618
673
|
np.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
619
|
-
end
|
620
|
-
n.
|
621
|
-
n.
|
622
|
-
n.
|
623
|
-
n.
|
624
|
-
|
674
|
+
end
|
675
|
+
n.family_name :path => 'namePart[@type="family"]'
|
676
|
+
n.given_name :path => 'namePart[@type="given"]'
|
677
|
+
n.termsOfAddress :path => 'namePart[@type="termsOfAddress"]'
|
678
|
+
n.date :path => 'namePart[@type="date"]'
|
679
|
+
|
680
|
+
n.displayForm :path => 'displayForm'
|
681
|
+
n.affiliation :path => 'affiliation'
|
682
|
+
n.description_el :path => 'description' # description is used by Nokogiri
|
683
|
+
n.role :path => 'role' do |r|
|
684
|
+
r.roleTerm :path => 'roleTerm' do |rt|
|
625
685
|
rt.type_at :path => "@type", :accessor => lambda { |a| a.text }
|
626
686
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
627
687
|
rt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -630,7 +690,7 @@ module Mods
|
|
630
690
|
# convenience method
|
631
691
|
r.authority :path => '.', :accessor => lambda { |role_node|
|
632
692
|
a = nil
|
633
|
-
role_node.roleTerm.each { |role_t|
|
693
|
+
role_node.roleTerm.each { |role_t|
|
634
694
|
# role_t.authority will be [] if it is missing from an earlier roleTerm
|
635
695
|
if role_t.authority && (!a || a.size == 0)
|
636
696
|
a = role_t.authority
|
@@ -642,7 +702,7 @@ module Mods
|
|
642
702
|
r.code :path => '.', :accessor => lambda { |role_node|
|
643
703
|
c = nil
|
644
704
|
role_node.roleTerm.each { |role_t|
|
645
|
-
if role_t.type_at == 'code'
|
705
|
+
if role_t.type_at == 'code'
|
646
706
|
c ||= role_t.text
|
647
707
|
end
|
648
708
|
}
|
@@ -652,7 +712,7 @@ module Mods
|
|
652
712
|
r.value :path => '.', :accessor => lambda { |role_node|
|
653
713
|
val = nil
|
654
714
|
role_node.roleTerm.each { |role_t|
|
655
|
-
if role_t.type_at == 'text'
|
715
|
+
if role_t.type_at == 'text'
|
656
716
|
val ||= role_t.text
|
657
717
|
end
|
658
718
|
}
|
@@ -663,43 +723,89 @@ module Mods
|
|
663
723
|
val
|
664
724
|
}
|
665
725
|
end # role node
|
666
|
-
end # t._plain_name
|
667
726
|
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
n.
|
673
|
-
|
674
|
-
|
727
|
+
# name convenience method
|
728
|
+
# uses the displayForm of a name if present
|
729
|
+
# if no displayForm, try to make a string from family, given and terms of address
|
730
|
+
# otherwise, return all non-date nameParts concatenated together
|
731
|
+
n.display_value :path => '.', :single => true, :accessor => lambda {|name_node|
|
732
|
+
dv = ''
|
733
|
+
if name_node.displayForm && name_node.displayForm.text.size > 0
|
734
|
+
dv = name_node.displayForm.text
|
735
|
+
end
|
736
|
+
if dv.empty?
|
737
|
+
if name_node.type_at == 'personal'
|
738
|
+
if name_node.family_name.size > 0
|
739
|
+
dv = name_node.given_name.size > 0 ? "#{name_node.family_name.text}, #{name_node.given_name.text}" : name_node.family_name.text
|
740
|
+
elsif name_node.given_name.size > 0
|
741
|
+
dv = name_node.given_name.text
|
742
|
+
end
|
743
|
+
if !dv.empty?
|
744
|
+
first = true
|
745
|
+
name_node.namePart.each { |np|
|
746
|
+
if np.type_at == 'termsOfAddress' && !np.text.empty?
|
747
|
+
if first
|
748
|
+
dv = dv + " " + np.text
|
749
|
+
first = false
|
750
|
+
else
|
751
|
+
dv = dv + ", " + np.text
|
752
|
+
end
|
753
|
+
end
|
754
|
+
}
|
755
|
+
else # no family or given name
|
756
|
+
dv = name_node.namePart.select {|np| np.type_at != 'date' && !np.text.empty?}.join(" ")
|
757
|
+
end
|
758
|
+
else # not a personal name
|
759
|
+
dv = name_node.namePart.select {|np| np.type_at != 'date' && !np.text.empty?}.join(" ")
|
760
|
+
end
|
761
|
+
end
|
762
|
+
dv.strip.empty? ? nil : dv.strip
|
763
|
+
}
|
764
|
+
|
765
|
+
# name convenience method
|
766
|
+
n.display_value_w_date :path => '.', :single => true, :accessor => lambda {|name_node|
|
767
|
+
dv = '' + name_node.display_value
|
768
|
+
name_node.namePart.each { |np|
|
769
|
+
if np.type_at == 'date' && !np.text.empty? && !dv.end_with?(np.text)
|
770
|
+
dv = dv + ", #{np.text}"
|
771
|
+
end
|
772
|
+
}
|
773
|
+
if dv.start_with?(', ')
|
774
|
+
dv.sub(', ', '')
|
775
|
+
end
|
776
|
+
dv.strip.empty? ? nil : dv.strip
|
777
|
+
}
|
778
|
+
end # t._plain_name
|
675
779
|
|
676
|
-
t.
|
677
|
-
t.
|
678
|
-
t.
|
679
|
-
t.
|
780
|
+
t.personal_name :path => '/mods/name[@type="personal"]'
|
781
|
+
t._personal_name :path => '//name[@type="personal"]'
|
782
|
+
t.corporate_name :path => '/mods/name[@type="corporate"]'
|
783
|
+
t._corporate_name :path => '//name[@type="corporate"]'
|
784
|
+
t.conference_name :path => '/mods/name[@type="conference"]'
|
785
|
+
t._conference_name :path => '//name[@type="conference"]'
|
680
786
|
|
681
787
|
# NOTE ---------------------------------------------------------------------------------
|
682
|
-
t.note :path => '/
|
683
|
-
t._note :path => '//
|
788
|
+
t.note :path => '/mods/note'
|
789
|
+
t._note :path => '//note' do |n|
|
684
790
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
685
791
|
n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
|
686
792
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
687
793
|
end
|
688
794
|
|
689
795
|
# ORIGIN_INFO --------------------------------------------------------------------------
|
690
|
-
t.origin_info :path => '/
|
691
|
-
t._origin_info :path => '//
|
692
|
-
n.place :path => '
|
693
|
-
e.placeTerm :path => '
|
796
|
+
t.origin_info :path => '/mods/originInfo'
|
797
|
+
t._origin_info :path => '//originInfo' do |n|
|
798
|
+
n.place :path => 'place' do |e|
|
799
|
+
e.placeTerm :path => 'placeTerm' do |ee|
|
694
800
|
ee.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
695
801
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
696
802
|
ee.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
697
803
|
}
|
698
804
|
end
|
699
805
|
end
|
700
|
-
n.publisher :path => '
|
806
|
+
n.publisher :path => 'publisher'
|
701
807
|
Mods::ORIGIN_INFO_DATE_ELEMENTS.each { |date_el|
|
702
|
-
n.send date_el, :path => "
|
808
|
+
n.send date_el, :path => "#{date_el}" do |d|
|
703
809
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
704
810
|
d.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
705
811
|
}
|
@@ -708,9 +814,9 @@ module Mods
|
|
708
814
|
end
|
709
815
|
end
|
710
816
|
}
|
711
|
-
n.edition :path => '
|
712
|
-
n.issuance :path => '
|
713
|
-
n.frequency :path => '
|
817
|
+
n.edition :path => 'edition'
|
818
|
+
n.issuance :path => 'issuance'
|
819
|
+
n.frequency :path => 'frequency' do |f|
|
714
820
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
715
821
|
f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
716
822
|
}
|
@@ -718,97 +824,97 @@ module Mods
|
|
718
824
|
end # t.origin_info
|
719
825
|
|
720
826
|
# PART -----------------------------------------------------------------------------------
|
721
|
-
t.part :path => '/
|
722
|
-
t._part :path => '//
|
827
|
+
t.part :path => '/mods/part'
|
828
|
+
t._part :path => '//part' do |n|
|
723
829
|
# attributes
|
724
830
|
n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
|
725
831
|
n.order :path => '@order', :accessor => lambda { |a| a.text }
|
726
832
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
727
833
|
# child elements
|
728
|
-
n.detail :path => '
|
834
|
+
n.detail :path => 'detail' do |e|
|
729
835
|
# attributes
|
730
836
|
e.level :path => '@level', :accessor => lambda { |a| a.text }
|
731
837
|
e.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
732
838
|
# elements
|
733
|
-
e.number :path => '
|
734
|
-
e.caption :path => '
|
735
|
-
e.title :path => '
|
839
|
+
e.number :path => 'number'
|
840
|
+
e.caption :path => 'caption'
|
841
|
+
e.title :path => 'title'
|
736
842
|
end
|
737
|
-
n.extent :path => '
|
843
|
+
n.extent :path => 'extent' do |e| # TODO: extent is ordered in xml schema
|
738
844
|
# attributes
|
739
845
|
e.unit :path => '@unit', :accessor => lambda { |a| a.text }
|
740
846
|
# elements
|
741
|
-
e.start :path => '
|
742
|
-
e.end :path => '
|
743
|
-
e.total :path => '
|
744
|
-
e.list :path => '
|
847
|
+
e.start :path => 'start'
|
848
|
+
e.end :path => 'end'
|
849
|
+
e.total :path => 'total'
|
850
|
+
e.list :path => 'list'
|
745
851
|
end
|
746
|
-
n.date :path => '
|
852
|
+
n.date :path => 'date' do |e|
|
747
853
|
Mods::DATE_ATTRIBS.reject { |a| a == 'keyDate' }.each { |attr_name|
|
748
854
|
e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
749
855
|
}
|
750
856
|
end
|
751
|
-
n.text_el :path => '
|
857
|
+
n.text_el :path => 'text' do |e|
|
752
858
|
e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
753
859
|
e.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
754
860
|
end
|
755
861
|
end # t._part
|
756
862
|
|
757
863
|
# PHYSICAL_DESCRIPTION -------------------------------------------------------------------
|
758
|
-
t.physical_description :path => '/
|
759
|
-
t._physical_description :path => '//
|
760
|
-
n.digitalOrigin :path => '
|
761
|
-
n.extent :path => '
|
762
|
-
n.form :path => '
|
864
|
+
t.physical_description :path => '/mods/physicalDescription'
|
865
|
+
t._physical_description :path => '//physicalDescription' do |n|
|
866
|
+
n.digitalOrigin :path => 'digitalOrigin'
|
867
|
+
n.extent :path => 'extent'
|
868
|
+
n.form :path => 'form' do |f|
|
763
869
|
f.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
764
870
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
765
871
|
f.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
766
872
|
}
|
767
873
|
end
|
768
|
-
n.internetMediaType :path => '
|
769
|
-
n.note :path => '
|
874
|
+
n.internetMediaType :path => 'internetMediaType'
|
875
|
+
n.note :path => 'note' do |nn|
|
770
876
|
nn.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
771
877
|
nn.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
772
878
|
end
|
773
|
-
n.reformattingQuality :path => '
|
879
|
+
n.reformattingQuality :path => 'reformattingQuality'
|
774
880
|
end
|
775
881
|
|
776
882
|
# RECORD_INFO --------------------------------------------------------------------------
|
777
|
-
t.record_info :path => '/
|
778
|
-
t._record_info :path => '//
|
883
|
+
t.record_info :path => '/mods/recordInfo'
|
884
|
+
t._record_info :path => '//recordInfo' do |n|
|
779
885
|
# attributes
|
780
886
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
781
887
|
Mods::LANG_ATTRIBS.each { |attr_name|
|
782
888
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
783
889
|
}
|
784
890
|
# child elements
|
785
|
-
n.recordContentSource :path => '
|
891
|
+
n.recordContentSource :path => 'recordContentSource' do |r|
|
786
892
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
787
893
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
788
894
|
}
|
789
895
|
end
|
790
|
-
n.recordCreationDate :path => '
|
896
|
+
n.recordCreationDate :path => 'recordCreationDate' do |r|
|
791
897
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
792
898
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
793
899
|
}
|
794
900
|
end
|
795
|
-
n.recordChangeDate :path => '
|
901
|
+
n.recordChangeDate :path => 'recordChangeDate' do |r|
|
796
902
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
797
903
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
798
904
|
}
|
799
905
|
end
|
800
|
-
n.recordIdentifier :path => '
|
906
|
+
n.recordIdentifier :path => 'recordIdentifier' do |r|
|
801
907
|
r.source :path => '@source', :accessor => lambda { |a| a.text }
|
802
908
|
end
|
803
|
-
n.recordOrigin :path => '
|
804
|
-
n.languageOfCataloging :path => '
|
909
|
+
n.recordOrigin :path => 'recordOrigin'
|
910
|
+
n.languageOfCataloging :path => 'languageOfCataloging' do |r|
|
805
911
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
806
912
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
807
913
|
}
|
808
|
-
r.languageTerm :path => '
|
809
|
-
r.scriptTerm :path => '
|
914
|
+
r.languageTerm :path => 'languageTerm'
|
915
|
+
r.scriptTerm :path => 'scriptTerm'
|
810
916
|
end
|
811
|
-
n.descriptionStandard :path => '
|
917
|
+
n.descriptionStandard :path => 'descriptionStandard' do |r|
|
812
918
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
813
919
|
r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
814
920
|
}
|
@@ -816,53 +922,53 @@ module Mods
|
|
816
922
|
end # t._record_info
|
817
923
|
|
818
924
|
# RELATED_ITEM-------------------------------------------------------------------------
|
819
|
-
t.related_item :path => '/
|
925
|
+
t.related_item :path => '/mods/relatedItem' do |n|
|
820
926
|
# attributes
|
821
927
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
822
928
|
n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
|
823
929
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
824
930
|
# elements
|
825
931
|
n.abstract :path => 'abstract'
|
826
|
-
n.accessCondition :path => '
|
827
|
-
n.classification :path => '
|
828
|
-
n.extension :path => '
|
829
|
-
n.genre :path => '
|
830
|
-
n.identifier :path => '
|
831
|
-
n.language :path => '
|
832
|
-
n.location :path => '
|
833
|
-
n.name_el :path => '
|
834
|
-
n.personal_name :path => '
|
835
|
-
n.corporate_name :path => '
|
836
|
-
n.conference_name :path => '
|
837
|
-
n.note :path => '
|
838
|
-
n.originInfo :path => '
|
839
|
-
n.part :path => '
|
840
|
-
n.physicalDescription :path => '
|
841
|
-
n.recordInfo :path => '
|
842
|
-
n.subject :path => '
|
843
|
-
n.tableOfContents :path => '
|
844
|
-
n.targetAudience :path => '
|
845
|
-
n.titleInfo :path => '
|
846
|
-
n.typeOfResource :path => '
|
932
|
+
n.accessCondition :path => 'accessCondition'
|
933
|
+
n.classification :path => 'classification'
|
934
|
+
n.extension :path => 'extension'
|
935
|
+
n.genre :path => 'genre'
|
936
|
+
n.identifier :path => 'identifier'
|
937
|
+
n.language :path => 'language'
|
938
|
+
n.location :path => 'location'
|
939
|
+
n.name_el :path => 'name' # Note: 'name' is used by Nokogiri
|
940
|
+
n.personal_name :path => 'name[@type="personal"]'
|
941
|
+
n.corporate_name :path => 'name[@type="corporate"]'
|
942
|
+
n.conference_name :path => 'name[@type="conference"]'
|
943
|
+
n.note :path => 'note'
|
944
|
+
n.originInfo :path => 'originInfo'
|
945
|
+
n.part :path => 'part'
|
946
|
+
n.physicalDescription :path => 'physicalDescription'
|
947
|
+
n.recordInfo :path => 'recordInfo'
|
948
|
+
n.subject :path => 'subject'
|
949
|
+
n.tableOfContents :path => 'tableOfContents'
|
950
|
+
n.targetAudience :path => 'targetAudience'
|
951
|
+
n.titleInfo :path => 'titleInfo'
|
952
|
+
n.typeOfResource :path => 'typeOfResource'
|
847
953
|
end
|
848
954
|
|
849
955
|
# SUBJECT -----------------------------------------------------------------------------
|
850
|
-
t.subject :path => '/
|
851
|
-
t._subject :path => '//
|
956
|
+
t.subject :path => '/mods/subject'
|
957
|
+
t._subject :path => '//subject' do |n|
|
852
958
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
853
959
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
854
960
|
}
|
855
|
-
n.topic :path => '
|
961
|
+
n.topic :path => 'topic' do |n1|
|
856
962
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
857
963
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
858
964
|
}
|
859
965
|
end
|
860
|
-
n.geographic :path => '
|
966
|
+
n.geographic :path => 'geographic' do |n1|
|
861
967
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
862
968
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
863
969
|
}
|
864
970
|
end
|
865
|
-
n.temporal :path => '
|
971
|
+
n.temporal :path => 'temporal' do |n1|
|
866
972
|
# date attributes as elements
|
867
973
|
Mods::DATE_ATTRIBS.each { |attr_name|
|
868
974
|
n1.send attr_name, :path => "#{attr_name}"
|
@@ -875,47 +981,47 @@ module Mods
|
|
875
981
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
876
982
|
}
|
877
983
|
end
|
878
|
-
n.titleInfo :path => '
|
984
|
+
n.titleInfo :path => 'titleInfo' do |t1|
|
879
985
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
880
986
|
t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
881
987
|
}
|
882
988
|
end
|
883
989
|
# Note: 'name' is used by Nokogiri
|
884
|
-
n.name_el :path => '
|
990
|
+
n.name_el :path => 'name' do |t1|
|
885
991
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
886
992
|
t1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
887
993
|
}
|
888
994
|
end
|
889
|
-
n.personal_name :path => '
|
890
|
-
n.corporate_name :path => '
|
891
|
-
n.conference_name :path => '
|
892
|
-
n.geographicCode :path => '
|
995
|
+
n.personal_name :path => 'name[@type="personal"]'
|
996
|
+
n.corporate_name :path => 'name[@type="corporate"]'
|
997
|
+
n.conference_name :path => 'name[@type="conference"]'
|
998
|
+
n.geographicCode :path => 'geographicCode' do |g|
|
893
999
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
894
1000
|
g.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
895
1001
|
}
|
896
1002
|
end
|
897
|
-
n.genre :path => '
|
1003
|
+
n.genre :path => 'genre' do |n1|
|
898
1004
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
899
1005
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
900
1006
|
}
|
901
1007
|
end
|
902
|
-
n.hierarchicalGeographic :path => '
|
1008
|
+
n.hierarchicalGeographic :path => 'hierarchicalGeographic' do |n1|
|
903
1009
|
Mods::Subject::HIER_GEO_CHILD_ELEMENTS.each { |elname|
|
904
|
-
n1.send elname, :path => "
|
1010
|
+
n1.send elname, :path => "#{elname}"
|
905
1011
|
}
|
906
1012
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
907
1013
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
908
1014
|
}
|
909
1015
|
end
|
910
|
-
n.cartographics :path => '
|
911
|
-
n1.scale :path => '
|
912
|
-
n1.projection :path => '
|
913
|
-
n1.coordinates :path => '
|
1016
|
+
n.cartographics :path => 'cartographics' do |n1|
|
1017
|
+
n1.scale :path => 'scale'
|
1018
|
+
n1.projection :path => 'projection'
|
1019
|
+
n1.coordinates :path => 'coordinates'
|
914
1020
|
Mods::Subject::CARTOGRAPHICS_CHILD_ELEMENTS.each { |elname|
|
915
|
-
n1.send elname, :path => "
|
1021
|
+
n1.send elname, :path => "#{elname}"
|
916
1022
|
}
|
917
1023
|
end
|
918
|
-
n.occupation :path => '
|
1024
|
+
n.occupation :path => 'occupation' do |n1|
|
919
1025
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
920
1026
|
n1.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
921
1027
|
}
|
@@ -923,16 +1029,16 @@ module Mods
|
|
923
1029
|
end # t.subject
|
924
1030
|
|
925
1031
|
# TABLE_OF_CONTENTS ---------------------------------------------------------------------
|
926
|
-
t.tableOfContents :path => '/
|
927
|
-
t._tableOfContents :path => '//
|
1032
|
+
t.tableOfContents :path => '/mods/tableOfContents'
|
1033
|
+
t._tableOfContents :path => '//tableOfContents' do |n|
|
928
1034
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
929
1035
|
n.shareable :path => '@shareable', :accessor => lambda { |a| a.text }
|
930
1036
|
n.type_at :path => '@type', :accessor => lambda { |a| a.text }
|
931
1037
|
end
|
932
1038
|
|
933
1039
|
# TARGET_AUDIENCE -----------------------------------------------------------------------
|
934
|
-
t.targetAudience :path => '/
|
935
|
-
t._targetAudience :path => '//
|
1040
|
+
t.targetAudience :path => '/mods/targetAudience'
|
1041
|
+
t._targetAudience :path => '//targetAudience' do |n|
|
936
1042
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
937
1043
|
Mods::AUTHORITY_ATTRIBS.each { |attr_name|
|
938
1044
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -940,8 +1046,8 @@ module Mods
|
|
940
1046
|
end
|
941
1047
|
|
942
1048
|
# TITLE_INFO ----------------------------------------------------------------------------
|
943
|
-
t.title_info :path => '/
|
944
|
-
t._title_info :path => '//
|
1049
|
+
t.title_info :path => '/mods/titleInfo'
|
1050
|
+
t._title_info :path => '//titleInfo' do |n|
|
945
1051
|
Mods::TitleInfo::ATTRIBUTES.each { |attr_name|
|
946
1052
|
if attr_name != 'type'
|
947
1053
|
n.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
@@ -949,32 +1055,27 @@ module Mods
|
|
949
1055
|
n.type_at :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
|
950
1056
|
end
|
951
1057
|
}
|
952
|
-
n.title :path => '
|
953
|
-
n.subTitle :path => '
|
954
|
-
n.nonSort :path => '
|
955
|
-
n.partNumber :path => '
|
956
|
-
n.partName :path => '
|
957
|
-
# convenience method
|
1058
|
+
n.title :path => 'title'
|
1059
|
+
n.subTitle :path => 'subTitle'
|
1060
|
+
n.nonSort :path => 'nonSort'
|
1061
|
+
n.partNumber :path => 'partNumber'
|
1062
|
+
n.partName :path => 'partName'
|
958
1063
|
n.sort_title :path => '.', :accessor => lambda { |node|
|
959
|
-
if node.type_at != "alternative" || (node.type_at == "alternative" &&
|
960
|
-
mods_ng_xml.xpath('/m:mods/m:titleInfo', {'m' => Mods::MODS_NS}).size == 1)
|
1064
|
+
if node.type_at != "alternative" || (node.type_at == "alternative" && mods_ng_xml.xpath('/mods/titleInfo').size == 1)
|
961
1065
|
node.title.text + (!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
|
962
1066
|
end
|
963
1067
|
}
|
964
|
-
# convenience method
|
965
1068
|
n.full_title :path => '.', :accessor => lambda { |node|
|
966
1069
|
(!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
|
967
1070
|
node.title.text +
|
968
1071
|
(!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
|
969
1072
|
}
|
970
|
-
# convenience method
|
971
1073
|
n.short_title :path => '.', :accessor => lambda { |node|
|
972
1074
|
if node.type_at != "alternative"
|
973
1075
|
(!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
|
974
1076
|
node.title.text
|
975
1077
|
end
|
976
1078
|
}
|
977
|
-
# convenience method
|
978
1079
|
n.alternative_title :path => '.', :accessor => lambda { |node|
|
979
1080
|
if node.type_at == "alternative"
|
980
1081
|
(!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
|
@@ -984,8 +1085,8 @@ module Mods
|
|
984
1085
|
end # t._title_info
|
985
1086
|
|
986
1087
|
# TYPE_OF_RESOURCE --------------------------------------------------------------------
|
987
|
-
t.typeOfResource :path => '/
|
988
|
-
t._typeOfResource :path => '//
|
1088
|
+
t.typeOfResource :path => '/mods/typeOfResource'
|
1089
|
+
t._typeOfResource :path => '//typeOfResource' do |n|
|
989
1090
|
n.collection :path => '@collection', :accessor => lambda { |a| a.text }
|
990
1091
|
n.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
|
991
1092
|
n.manuscript :path => '@manuscript', :accessor => lambda { |a| a.text }
|
@@ -993,12 +1094,11 @@ module Mods
|
|
993
1094
|
end
|
994
1095
|
|
995
1096
|
end # terminology
|
996
|
-
|
997
|
-
mods_ng_xml.nom!
|
1097
|
+
|
1098
|
+
mods_ng_xml.nom!
|
998
1099
|
mods_ng_xml
|
999
|
-
end #
|
1000
|
-
|
1001
|
-
end
|
1002
|
-
|
1003
|
-
end
|
1100
|
+
end # set_terminology_no_ns
|
1101
|
+
|
1102
|
+
end # Record class
|
1103
|
+
end # Mods module
|
1004
1104
|
|