mods_display 1.3.5 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7b58f76634c11ddf5ce7fef2a844fadbf2d2062ff59f44fc3f903f29fea6d64
4
- data.tar.gz: c523ccc3a1534e2eab97a0bc755c52922f4efa5387cf8d2982857fc021b72727
3
+ metadata.gz: cd385f9d4aea6c14524378831877c327c6fdfd2664356e148b457af9c26a5623
4
+ data.tar.gz: b66857f71c766dc6edb03b8783d1d63486e94c63c8e9a71a0474f6b5a11d44cc
5
5
  SHA512:
6
- metadata.gz: 70b984e51af9009c0f453d24012574ef6641fbd5d2a9b6d42a4d46386d161314c04533d84e6fe7cee7ea08592bc4a9710f39cc0d2a079fc715c08358377ec1f3
7
- data.tar.gz: 33b3ccefd6e79b06f8127421aaa3d6c2cd9241a03c423bed1e0a4f184feb63177781365a7905fbc0094e29d41f6a50f2be1731723bbd6505a808c8deff885367
6
+ metadata.gz: 6b4760e8eee0c1eef22badaf5087b4095c4c88766c3b128bbaa1e841e2b1aa34294ced0be7199875b6aa57cdf1b3385dd5c11d624f4ce818afcc7fa4f1da25ab
7
+ data.tar.gz: 93c93c4249b55816c9716b1c632d0b4c5b5a2874365e33139fbbf6cd9421f01d3aa9800d347c72ae7837bcf98ef763650e8151a3cab547cecb287a72ff7a9ace
@@ -7,12 +7,9 @@ module ModsDisplay
7
7
  # this returns a hash:
8
8
  # { role1 label => [ ModsDisplay:Name:Person, ModsDisplay:Name:Person, ...], role2 label => [ ModsDisplay:Name:Person, ModsDisplay:Name:Person, ...] }
9
9
  def fields
10
- return_fields = NameValue.for_values(@values).map do |value|
11
- person = if value.displayForm_nodeset.length.positive?
12
- ModsDisplay::Name::Person.new(name: element_text(value.displayForm_nodeset), name_identifiers: value.nameIdentifier_nodeset)
13
- elsif !(name_parts = name_parts(value)).empty?
14
- ModsDisplay::Name::Person.new(name: name_parts, name_identifiers: value.nameIdentifier_nodeset)
15
- end
10
+ return_fields = @values.map do |value|
11
+ name_parts = ModsDisplay::NameFormatter.format(value)
12
+ person = name_parts ? ModsDisplay::Name::Person.new(name: name_parts, name_identifiers: value.xpath('mods:nameIdentifier', mods: MODS_NS)) : nil
16
13
  # The person may have multiple roles, so we have to divide them up into an array
17
14
  role_labels(value).collect do |role_label|
18
15
  ModsDisplay::Values.new(label: displayLabel(value) || role_label, values: [person]) if person
@@ -51,7 +48,7 @@ module ModsDisplay
51
48
  default_label = I18n.t('mods_display.associated_with')
52
49
  return [default_label] unless element.xpath('mods:role/mods:roleTerm', mods: MODS_NS).present?
53
50
 
54
- element.role_nodeset.collect do |role|
51
+ element.xpath('mods:role', mods: MODS_NS).collect do |role|
55
52
  codes, text = role.xpath('mods:roleTerm', mods: MODS_NS).partition { |term| term['type'] == 'code' }
56
53
 
57
54
  # prefer mappable role term codes
@@ -69,40 +66,6 @@ module ModsDisplay
69
66
  element_text(element).capitalize.sub(/[.,:;]+$/, '')
70
67
  end
71
68
 
72
- def name_parts(element)
73
- output = [unqualified_name_parts(element),
74
- qualified_name_parts(element, 'family'),
75
- qualified_name_parts(element, 'given')].flatten.compact.join(', ')
76
- terms = qualified_name_parts(element, 'termsOfAddress')
77
- unless terms.empty?
78
- term_delimiter = ', '
79
- term_delimiter = ' ' if name_part_begins_with_roman_numeral?(terms.first)
80
- output = [output, terms.join(', ')].flatten.compact.join(term_delimiter)
81
- end
82
- dates = qualified_name_parts(element, 'date')
83
- output = [output, dates].flatten.compact.join(', ') unless dates.empty?
84
- output
85
- end
86
-
87
- def unqualified_name_parts(element)
88
- element.namePart_nodeset.map do |part|
89
- element_text(part) unless part.attributes['type']
90
- end.compact
91
- end
92
-
93
- def qualified_name_parts(element, type)
94
- element.namePart_nodeset.map do |part|
95
- element_text(part) if part.get_attribute('type') == type
96
- end.compact
97
- end
98
-
99
- def name_part_begins_with_roman_numeral?(part)
100
- first_part = part.split(/\s|,/).first.strip
101
- first_part.chars.all? do |char|
102
- %w[I X C L V].include? char
103
- end
104
- end
105
-
106
69
  # Consolidate all names under label headings
107
70
  def consolidate_under_labels(fields)
108
71
  results = {}
@@ -162,27 +125,5 @@ module ModsDisplay
162
125
  orcid.first&.text
163
126
  end
164
127
  end
165
-
166
- class NameValue < SimpleDelegator
167
- def self.for_values(values)
168
- values.map { |value| new(value) }
169
- end
170
-
171
- def nameIdentifier_nodeset
172
- @nameIdentifier_nodeset ||= xpath('mods:nameIdentifier', mods: MODS_NS)
173
- end
174
-
175
- def displayForm_nodeset
176
- @displayForm_nodeset ||= xpath('mods:displayForm', mods: MODS_NS)
177
- end
178
-
179
- def namePart_nodeset
180
- @namePart_nodeset ||= xpath('mods:namePart', mods: MODS_NS)
181
- end
182
-
183
- def role_nodeset
184
- @role_nodeset ||= xpath('mods:role', mods: MODS_NS)
185
- end
186
- end
187
128
  end
188
129
  end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ModsDisplay
4
+ class NameFormatter
5
+ def self.format(element)
6
+ new(element).format
7
+ end
8
+
9
+ def initialize(element)
10
+ @element = element
11
+ end
12
+
13
+ def format
14
+ return element_text(display_form_nodeset) if display_form_nodeset.present?
15
+ return name_parts if name_parts.present?
16
+
17
+ nil
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :element
23
+
24
+ def name_parts
25
+ @name_parts ||= begin
26
+ output = [unqualified_name_parts(name_part_nodeset),
27
+ qualified_name_parts(name_part_nodeset, 'family'),
28
+ qualified_name_parts(name_part_nodeset, 'given')].flatten.compact.join(', ')
29
+ terms = qualified_name_parts(name_part_nodeset, 'termsOfAddress')
30
+ unless terms.empty?
31
+ term_delimiter = ', '
32
+ term_delimiter = ' ' if name_part_begins_with_roman_numeral?(terms.first)
33
+ output = [output, terms.join(', ')].flatten.compact.join(term_delimiter)
34
+ end
35
+ dates = qualified_name_parts(name_part_nodeset, 'date')
36
+ output = [output, dates].flatten.compact.join(', ') unless dates.empty?
37
+ output
38
+ end
39
+ end
40
+
41
+ def unqualified_name_parts(name_part_nodeset)
42
+ name_part_nodeset.map do |part|
43
+ element_text(part) unless part.attributes['type']
44
+ end.compact
45
+ end
46
+
47
+ def qualified_name_parts(name_part_nodeset, type)
48
+ name_part_nodeset.map do |part|
49
+ element_text(part) if part.get_attribute('type') == type
50
+ end.compact
51
+ end
52
+
53
+ def name_part_begins_with_roman_numeral?(part)
54
+ first_part = part.split(/\s|,/).first.strip
55
+ first_part.chars.all? do |char|
56
+ %w[I X C L V].include? char
57
+ end
58
+ end
59
+
60
+ def element_text(element)
61
+ element.text.strip
62
+ end
63
+
64
+ def name_part_nodeset
65
+ @name_part_nodeset ||= element.xpath('mods:namePart', mods: MODS_NS)
66
+ end
67
+
68
+ def display_form_nodeset
69
+ @display_form_nodeset ||= element.xpath('mods:displayForm', mods: MODS_NS)
70
+ end
71
+ end
72
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ModsDisplay
4
- VERSION = '1.3.5'
4
+ VERSION = '1.4.0'
5
5
  end
data/lib/mods_display.rb CHANGED
@@ -5,6 +5,7 @@ require 'mods_display/html'
5
5
  require 'mods_display/country_codes'
6
6
  require 'mods_display/relator_codes'
7
7
  require 'mods_display/related_item_concerns'
8
+ require 'mods_display/name_formatter'
8
9
  require 'mods_display/fields/field'
9
10
  require 'mods_display/fields/abstract'
10
11
  require 'mods_display/fields/access_condition'
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.3.5
4
+ version: 1.4.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-03 00:00:00.000000000 Z
11
+ date: 2023-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: stanford-mods
@@ -223,6 +223,7 @@ files:
223
223
  - lib/mods_display/fields/title.rb
224
224
  - lib/mods_display/fields/values.rb
225
225
  - lib/mods_display/html.rb
226
+ - lib/mods_display/name_formatter.rb
226
227
  - lib/mods_display/related_item_concerns.rb
227
228
  - lib/mods_display/relator_codes.rb
228
229
  - lib/mods_display/version.rb