mods 0.0.16 → 0.0.17
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|