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.
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