mods_display 1.4.0 → 1.6.0
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.
- 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
|