mods_display 1.4.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -0
- data/README.md +10 -18
- data/app/components/mods_display/row_field_component.html.erb +11 -0
- data/app/components/mods_display/row_field_component.rb +43 -0
- data/app/helpers/mods_display/record_helper.rb +20 -0
- data/config/locales/en.yml +3 -0
- data/lib/mods_display/fields/access_condition.rb +5 -5
- data/lib/mods_display/fields/cartographics.rb +7 -9
- data/lib/mods_display/fields/collection.rb +14 -14
- data/lib/mods_display/fields/contact.rb +7 -7
- data/lib/mods_display/fields/contents.rb +5 -1
- data/lib/mods_display/fields/copyright_date.rb +9 -0
- data/lib/mods_display/fields/date_captured.rb +9 -0
- data/lib/mods_display/fields/date_created.rb +9 -0
- data/lib/mods_display/fields/date_issued.rb +9 -0
- data/lib/mods_display/fields/date_modified.rb +9 -0
- data/lib/mods_display/fields/date_other.rb +26 -0
- data/lib/mods_display/fields/date_valid.rb +9 -0
- data/lib/mods_display/fields/description.rb +6 -3
- data/lib/mods_display/fields/edition.rb +22 -0
- data/lib/mods_display/fields/extent.rb +4 -4
- data/lib/mods_display/fields/field.rb +54 -8
- data/lib/mods_display/fields/form.rb +4 -4
- data/lib/mods_display/fields/frequency.rb +19 -0
- data/lib/mods_display/fields/genre.rb +5 -2
- data/lib/mods_display/fields/geo.rb +2 -2
- data/lib/mods_display/fields/identifier.rb +5 -2
- data/lib/mods_display/fields/imprint.rb +13 -36
- data/lib/mods_display/fields/issuance.rb +19 -0
- data/lib/mods_display/fields/language.rb +4 -4
- data/lib/mods_display/fields/location.rb +5 -5
- data/lib/mods_display/fields/name.rb +8 -7
- data/lib/mods_display/fields/nested_related_item.rb +45 -37
- data/lib/mods_display/fields/note.rb +10 -7
- data/lib/mods_display/fields/place.rb +35 -0
- data/lib/mods_display/fields/publisher.rb +21 -0
- data/lib/mods_display/fields/reference_title.rb +30 -0
- data/lib/mods_display/fields/related_item.rb +59 -40
- data/lib/mods_display/fields/resource_type.rb +7 -4
- data/lib/mods_display/fields/subject.rb +3 -3
- data/lib/mods_display/fields/title.rb +46 -30
- data/lib/mods_display/fields/values.rb +1 -0
- data/lib/mods_display/html.rb +25 -10
- data/lib/mods_display/version.rb +1 -1
- data/lib/mods_display.rb +13 -0
- data/mods_display.gemspec +1 -1
- metadata +21 -5
@@ -2,11 +2,16 @@
|
|
2
2
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Title < Field
|
5
|
+
def initialize(values, link: nil)
|
6
|
+
@link = link
|
7
|
+
super(values)
|
8
|
+
end
|
9
|
+
|
5
10
|
def fields
|
6
|
-
return_values =
|
11
|
+
return_values = sorted_title_info_elements.map do |title_info_element|
|
7
12
|
ModsDisplay::Values.new(
|
8
|
-
label: displayLabel(
|
9
|
-
values: [assemble_title(
|
13
|
+
label: displayLabel(title_info_element) || title_label(title_info_element),
|
14
|
+
values: [assemble_title(title_info_element)]
|
10
15
|
)
|
11
16
|
end
|
12
17
|
collapse_fields(return_values)
|
@@ -15,51 +20,62 @@ module ModsDisplay
|
|
15
20
|
private
|
16
21
|
|
17
22
|
# If there is a node with usage="primary", then it should come first.
|
18
|
-
def
|
19
|
-
Array(@
|
23
|
+
def sorted_title_info_elements
|
24
|
+
Array(@stanford_mods_elements).sort_by { |title_info_element| title_info_element['usage'] == 'primary' ? 0 : 1 }
|
20
25
|
end
|
21
26
|
|
22
27
|
def delimiter
|
23
28
|
'<br />'.html_safe
|
24
29
|
end
|
25
30
|
|
26
|
-
def assemble_title(
|
31
|
+
def assemble_title(title_info_element)
|
27
32
|
title = ''
|
28
33
|
previous_element = nil
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
next if
|
33
|
-
|
34
|
-
delimiter =
|
35
|
-
nil
|
36
|
-
elsif previous_element&.name == 'nonSort' && title.end_with?('-', '\'')
|
37
|
-
nil
|
38
|
-
elsif title.end_with?('.', ',', ':', ';')
|
39
|
-
' '
|
40
|
-
elsif value.name == 'subTitle'
|
41
|
-
' : '
|
42
|
-
elsif value.name == 'partName' && previous_element.name == 'partNumber'
|
43
|
-
', '
|
44
|
-
elsif value.name == 'partNumber' || value.name == 'partName'
|
45
|
-
'. '
|
46
|
-
else
|
47
|
-
' '
|
48
|
-
end
|
35
|
+
title_info_element.children.select { |child| title_parts.include? child.name }.each do |child|
|
36
|
+
text = child.text.strip
|
37
|
+
next if text.empty?
|
38
|
+
|
39
|
+
delimiter = title_delimiter(title, previous_element, child)
|
49
40
|
|
50
41
|
title += delimiter if delimiter
|
51
|
-
title +=
|
42
|
+
title += text
|
52
43
|
|
53
|
-
previous_element =
|
44
|
+
previous_element = child
|
54
45
|
end
|
55
46
|
|
56
|
-
if
|
57
|
-
|
47
|
+
full_title = if title_info_element['type'] == 'uniform' && title_info_element['nameTitleGroup'].present?
|
48
|
+
[uniform_title_name_part(title_info_element), title].compact.join('. ')
|
49
|
+
else
|
50
|
+
title
|
51
|
+
end
|
52
|
+
linked_title(full_title)
|
53
|
+
end
|
54
|
+
|
55
|
+
def title_delimiter(title, previous_element, child)
|
56
|
+
if title.empty? || title.end_with?(' ')
|
57
|
+
nil
|
58
|
+
elsif previous_element&.name == 'nonSort' && title.end_with?('-', '\'')
|
59
|
+
nil
|
60
|
+
elsif title.end_with?('.', ',', ':', ';')
|
61
|
+
' '
|
62
|
+
elsif child.name == 'subTitle'
|
63
|
+
' : '
|
64
|
+
elsif child.name == 'partName' && previous_element.name == 'partNumber'
|
65
|
+
', '
|
66
|
+
elsif child.name == 'partNumber' || child.name == 'partName'
|
67
|
+
'. '
|
58
68
|
else
|
59
|
-
|
69
|
+
' '
|
60
70
|
end
|
61
71
|
end
|
62
72
|
|
73
|
+
def linked_title(title)
|
74
|
+
return title unless @link
|
75
|
+
|
76
|
+
"<a href=\"#{@link}\">#{title}</a>"
|
77
|
+
end
|
78
|
+
|
63
79
|
def uniform_title_name_part(element)
|
64
80
|
names = element.xpath("//m:name[@nameTitleGroup=\"#{element['nameTitleGroup']}\"]", **Mods::Record::NS_HASH)
|
65
81
|
names = element.xpath("//name[@nameTitleGroup=\"#{element['nameTitleGroup']}\"]") if names.empty?
|
data/lib/mods_display/html.rb
CHANGED
@@ -5,13 +5,26 @@ module ModsDisplay
|
|
5
5
|
MODS_DISPLAY_FIELD_MAPPING = {
|
6
6
|
title: :title_info,
|
7
7
|
subTitle: :title_info,
|
8
|
+
referenceTitle: :title_info,
|
8
9
|
name: :plain_name,
|
9
10
|
resourceType: :typeOfResource,
|
10
11
|
genre: :genre,
|
11
12
|
form: :physical_description,
|
12
13
|
extent: :physical_description,
|
13
14
|
geo: :extension,
|
15
|
+
copyrightDate: :origin_info,
|
16
|
+
dateCaptured: :origin_info,
|
17
|
+
dateCreated: :origin_info,
|
18
|
+
dateIssued: :origin_info,
|
19
|
+
dateModified: :origin_info,
|
20
|
+
dateOther: :origin_info,
|
21
|
+
dateValid: :origin_info,
|
22
|
+
edition: :origin_info,
|
23
|
+
frequency: :origin_info,
|
14
24
|
imprint: :origin_info,
|
25
|
+
issuance: :origin_info,
|
26
|
+
place: :origin_info,
|
27
|
+
publisher: :origin_info,
|
15
28
|
language: :language,
|
16
29
|
description: :physical_description,
|
17
30
|
cartographics: :subject,
|
@@ -29,11 +42,13 @@ module ModsDisplay
|
|
29
42
|
accessCondition: :accessCondition
|
30
43
|
}.freeze
|
31
44
|
|
32
|
-
def initialize(
|
33
|
-
@
|
34
|
-
@xml =
|
45
|
+
def initialize(mods)
|
46
|
+
@mods = mods
|
47
|
+
@xml = mods.mods_ng_xml
|
35
48
|
end
|
36
49
|
|
50
|
+
attr_reader :xml
|
51
|
+
|
37
52
|
def title
|
38
53
|
title_fields = mods_field(:title).fields
|
39
54
|
title_fields.empty? ? '' : title_fields.first.values
|
@@ -46,8 +61,8 @@ module ModsDisplay
|
|
46
61
|
# Need to figure out how to get the 1st title out of the list.
|
47
62
|
# Maybe have a separate class that will omit the first title natively
|
48
63
|
# and replace the first key in the the fields list with that.
|
49
|
-
def body(view_context = ApplicationController.renderer)
|
50
|
-
view_context.render
|
64
|
+
def body(view_context = ApplicationController.renderer, html_attributes: {}, component: ModsDisplay::RecordComponent)
|
65
|
+
view_context.render component.new(record: self, html_attributes: html_attributes), layout: false
|
51
66
|
end
|
52
67
|
|
53
68
|
# @deprecated
|
@@ -56,22 +71,22 @@ module ModsDisplay
|
|
56
71
|
view_context.render ModsDisplay::RecordComponent.new(record: self, fields: fields), layout: false
|
57
72
|
end
|
58
73
|
|
59
|
-
MODS_DISPLAY_FIELD_MAPPING.
|
74
|
+
MODS_DISPLAY_FIELD_MAPPING.each_key do |key|
|
60
75
|
next if key == :title
|
61
76
|
|
62
|
-
define_method(key) do |raw: false|
|
63
|
-
field = mods_field(key)
|
77
|
+
define_method(key) do |raw: false, **field_args|
|
78
|
+
field = mods_field(key, field_args: field_args)
|
64
79
|
next field if raw
|
65
80
|
|
66
81
|
field.fields
|
67
82
|
end
|
68
83
|
end
|
69
84
|
|
70
|
-
def mods_field(key)
|
85
|
+
def mods_field(key, field_args: {})
|
71
86
|
raise ArgumentError unless MODS_DISPLAY_FIELD_MAPPING[key] && @xml.respond_to?(MODS_DISPLAY_FIELD_MAPPING[key])
|
72
87
|
|
73
88
|
field = @xml.public_send(MODS_DISPLAY_FIELD_MAPPING[key])
|
74
|
-
mods_field_class(key).new(field)
|
89
|
+
mods_field_class(key).new(field, **field_args)
|
75
90
|
end
|
76
91
|
|
77
92
|
private
|
data/lib/mods_display/version.rb
CHANGED
data/lib/mods_display.rb
CHANGED
@@ -13,20 +13,33 @@ require 'mods_display/fields/audience'
|
|
13
13
|
require 'mods_display/fields/collection'
|
14
14
|
require 'mods_display/fields/contact'
|
15
15
|
require 'mods_display/fields/contents'
|
16
|
+
require 'mods_display/fields/copyright_date'
|
16
17
|
require 'mods_display/fields/cartographics'
|
18
|
+
require 'mods_display/fields/date_created'
|
19
|
+
require 'mods_display/fields/date_captured'
|
20
|
+
require 'mods_display/fields/date_issued'
|
21
|
+
require 'mods_display/fields/date_modified'
|
22
|
+
require 'mods_display/fields/date_other'
|
23
|
+
require 'mods_display/fields/date_valid'
|
17
24
|
require 'mods_display/fields/description'
|
25
|
+
require 'mods_display/fields/edition'
|
18
26
|
require 'mods_display/fields/extent'
|
27
|
+
require 'mods_display/fields/frequency'
|
19
28
|
require 'mods_display/fields/form'
|
20
29
|
require 'mods_display/fields/genre'
|
21
30
|
require 'mods_display/fields/geo'
|
22
31
|
require 'mods_display/fields/identifier'
|
23
32
|
require 'mods_display/fields/imprint'
|
33
|
+
require 'mods_display/fields/issuance'
|
24
34
|
require 'mods_display/fields/language'
|
25
35
|
require 'mods_display/fields/location'
|
26
36
|
require 'mods_display/fields/name'
|
27
37
|
require 'mods_display/fields/nested_related_item'
|
28
38
|
require 'mods_display/fields/note'
|
39
|
+
require 'mods_display/fields/place'
|
40
|
+
require 'mods_display/fields/publisher'
|
29
41
|
require 'mods_display/fields/related_item'
|
42
|
+
require 'mods_display/fields/reference_title'
|
30
43
|
require 'mods_display/fields/resource_type'
|
31
44
|
require 'mods_display/fields/subject'
|
32
45
|
require 'mods_display/fields/title'
|
data/mods_display.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.executables = gem.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
22
22
|
gem.require_paths = ["lib"]
|
23
23
|
|
24
|
-
gem.add_dependency 'stanford-mods', '~> 3.3', '>=3.3.
|
24
|
+
gem.add_dependency 'stanford-mods', '~> 3.3', '>=3.3.9' # require stanford-mods 3.3.9 for edition field
|
25
25
|
gem.add_dependency 'i18n'
|
26
26
|
gem.add_dependency 'view_component'
|
27
27
|
gem.add_dependency 'rails_autolink'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mods_display
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jessie Keck
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stanford-mods
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '3.3'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 3.3.
|
22
|
+
version: 3.3.9
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '3.3'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 3.3.
|
32
|
+
version: 3.3.9
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: i18n
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,6 +177,7 @@ executables: []
|
|
177
177
|
extensions: []
|
178
178
|
extra_rdoc_files: []
|
179
179
|
files:
|
180
|
+
- ".rspec"
|
180
181
|
- ".rubocop.yml"
|
181
182
|
- ".rubocop_todo.yml"
|
182
183
|
- Gemfile
|
@@ -189,6 +190,8 @@ files:
|
|
189
190
|
- app/components/mods_display/list_field_component.rb
|
190
191
|
- app/components/mods_display/record_component.html.erb
|
191
192
|
- app/components/mods_display/record_component.rb
|
193
|
+
- app/components/mods_display/row_field_component.html.erb
|
194
|
+
- app/components/mods_display/row_field_component.rb
|
192
195
|
- app/helpers/mods_display/record_helper.rb
|
193
196
|
- app/models/mods_display/record.rb
|
194
197
|
- config.ru
|
@@ -203,19 +206,32 @@ files:
|
|
203
206
|
- lib/mods_display/fields/collection.rb
|
204
207
|
- lib/mods_display/fields/contact.rb
|
205
208
|
- lib/mods_display/fields/contents.rb
|
209
|
+
- lib/mods_display/fields/copyright_date.rb
|
210
|
+
- lib/mods_display/fields/date_captured.rb
|
211
|
+
- lib/mods_display/fields/date_created.rb
|
212
|
+
- lib/mods_display/fields/date_issued.rb
|
213
|
+
- lib/mods_display/fields/date_modified.rb
|
214
|
+
- lib/mods_display/fields/date_other.rb
|
215
|
+
- lib/mods_display/fields/date_valid.rb
|
206
216
|
- lib/mods_display/fields/description.rb
|
217
|
+
- lib/mods_display/fields/edition.rb
|
207
218
|
- lib/mods_display/fields/extent.rb
|
208
219
|
- lib/mods_display/fields/field.rb
|
209
220
|
- lib/mods_display/fields/form.rb
|
221
|
+
- lib/mods_display/fields/frequency.rb
|
210
222
|
- lib/mods_display/fields/genre.rb
|
211
223
|
- lib/mods_display/fields/geo.rb
|
212
224
|
- lib/mods_display/fields/identifier.rb
|
213
225
|
- lib/mods_display/fields/imprint.rb
|
226
|
+
- lib/mods_display/fields/issuance.rb
|
214
227
|
- lib/mods_display/fields/language.rb
|
215
228
|
- lib/mods_display/fields/location.rb
|
216
229
|
- lib/mods_display/fields/name.rb
|
217
230
|
- lib/mods_display/fields/nested_related_item.rb
|
218
231
|
- lib/mods_display/fields/note.rb
|
232
|
+
- lib/mods_display/fields/place.rb
|
233
|
+
- lib/mods_display/fields/publisher.rb
|
234
|
+
- lib/mods_display/fields/reference_title.rb
|
219
235
|
- lib/mods_display/fields/related_item.rb
|
220
236
|
- lib/mods_display/fields/resource_type.rb
|
221
237
|
- lib/mods_display/fields/sub_title.rb
|
@@ -246,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
246
262
|
- !ruby/object:Gem::Version
|
247
263
|
version: '0'
|
248
264
|
requirements: []
|
249
|
-
rubygems_version: 3.
|
265
|
+
rubygems_version: 3.4.13
|
250
266
|
signing_key:
|
251
267
|
specification_version: 4
|
252
268
|
summary: The MODS Display gem allows implementers to configure a customized display
|