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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/README.md +10 -18
  4. data/app/components/mods_display/row_field_component.html.erb +11 -0
  5. data/app/components/mods_display/row_field_component.rb +43 -0
  6. data/app/helpers/mods_display/record_helper.rb +20 -0
  7. data/config/locales/en.yml +3 -0
  8. data/lib/mods_display/fields/access_condition.rb +5 -5
  9. data/lib/mods_display/fields/cartographics.rb +7 -9
  10. data/lib/mods_display/fields/collection.rb +14 -14
  11. data/lib/mods_display/fields/contact.rb +7 -7
  12. data/lib/mods_display/fields/contents.rb +5 -1
  13. data/lib/mods_display/fields/copyright_date.rb +9 -0
  14. data/lib/mods_display/fields/date_captured.rb +9 -0
  15. data/lib/mods_display/fields/date_created.rb +9 -0
  16. data/lib/mods_display/fields/date_issued.rb +9 -0
  17. data/lib/mods_display/fields/date_modified.rb +9 -0
  18. data/lib/mods_display/fields/date_other.rb +26 -0
  19. data/lib/mods_display/fields/date_valid.rb +9 -0
  20. data/lib/mods_display/fields/description.rb +6 -3
  21. data/lib/mods_display/fields/edition.rb +22 -0
  22. data/lib/mods_display/fields/extent.rb +4 -4
  23. data/lib/mods_display/fields/field.rb +54 -8
  24. data/lib/mods_display/fields/form.rb +4 -4
  25. data/lib/mods_display/fields/frequency.rb +19 -0
  26. data/lib/mods_display/fields/genre.rb +5 -2
  27. data/lib/mods_display/fields/geo.rb +2 -2
  28. data/lib/mods_display/fields/identifier.rb +5 -2
  29. data/lib/mods_display/fields/imprint.rb +13 -36
  30. data/lib/mods_display/fields/issuance.rb +19 -0
  31. data/lib/mods_display/fields/language.rb +4 -4
  32. data/lib/mods_display/fields/location.rb +5 -5
  33. data/lib/mods_display/fields/name.rb +8 -7
  34. data/lib/mods_display/fields/nested_related_item.rb +45 -37
  35. data/lib/mods_display/fields/note.rb +10 -7
  36. data/lib/mods_display/fields/place.rb +35 -0
  37. data/lib/mods_display/fields/publisher.rb +21 -0
  38. data/lib/mods_display/fields/reference_title.rb +30 -0
  39. data/lib/mods_display/fields/related_item.rb +59 -40
  40. data/lib/mods_display/fields/resource_type.rb +7 -4
  41. data/lib/mods_display/fields/subject.rb +3 -3
  42. data/lib/mods_display/fields/title.rb +46 -30
  43. data/lib/mods_display/fields/values.rb +1 -0
  44. data/lib/mods_display/html.rb +25 -10
  45. data/lib/mods_display/version.rb +1 -1
  46. data/lib/mods_display.rb +13 -0
  47. data/mods_display.gemspec +1 -1
  48. 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 = sorted_values.map do |value|
11
+ return_values = sorted_title_info_elements.map do |title_info_element|
7
12
  ModsDisplay::Values.new(
8
- label: displayLabel(value) || title_label(value),
9
- values: [assemble_title(value)]
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 sorted_values
19
- Array(@values).sort_by { |node| node['usage'] == 'primary' ? 0 : 1 }
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(element)
31
+ def assemble_title(title_info_element)
27
32
  title = ''
28
33
  previous_element = nil
29
34
 
30
- element.children.select { |value| title_parts.include? value.name }.each do |value|
31
- str = value.text.strip
32
- next if str.empty?
33
-
34
- delimiter = if title.empty? || title.end_with?(' ')
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 += str
42
+ title += text
52
43
 
53
- previous_element = value
44
+ previous_element = child
54
45
  end
55
46
 
56
- if element['type'] == 'uniform' && element['nameTitleGroup'].present?
57
- [uniform_title_name_part(element), title].compact.join('. ')
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
- title
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?
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModsDisplay
4
+ # This class has what is needed by view code in downstream applications
4
5
  class Values
5
6
  attr_accessor :label, :values, :field
6
7
 
@@ -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(xml)
33
- @stanford_mods = xml
34
- @xml = xml.mods_ng_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 ModsDisplay::RecordComponent.new(record: self), layout: false
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.each do |key, _value|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModsDisplay
4
- VERSION = '1.4.0'
4
+ VERSION = '1.6.0'
5
5
  end
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.7' # require stanford-mods 3.3.7 for orcid support
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.0
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-10 00:00:00.000000000 Z
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.7
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.7
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.3.7
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