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
@@ -3,8 +3,11 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Identifier < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
7
|
-
ModsDisplay::Values.new(
|
6
|
+
return_fields = @stanford_mods_elements.map do |identifier_element|
|
7
|
+
ModsDisplay::Values.new(
|
8
|
+
label: displayLabel(identifier_element) || identifier_label(identifier_element),
|
9
|
+
values: [element_text(identifier_element)]
|
10
|
+
)
|
8
11
|
end
|
9
12
|
collapse_fields(return_fields)
|
10
13
|
end
|
@@ -9,28 +9,28 @@ module ModsDisplay
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def origin_info_data
|
12
|
-
@
|
12
|
+
@stanford_mods_elements.map do |origin_info_element|
|
13
13
|
return_fields = []
|
14
14
|
|
15
|
-
edition = edition_element(
|
16
|
-
place = place_element(
|
17
|
-
publisher = publisher_element(
|
18
|
-
parts = parts_element(
|
15
|
+
edition = edition_element(origin_info_element)
|
16
|
+
place = place_element(origin_info_element)
|
17
|
+
publisher = publisher_element(origin_info_element)
|
18
|
+
parts = parts_element(origin_info_element)
|
19
19
|
place_pub = compact_and_join_with_delimiter([place, publisher], ' : ')
|
20
20
|
edition_place = compact_and_join_with_delimiter([edition, place_pub], ' - ')
|
21
21
|
joined_place_parts = compact_and_join_with_delimiter([edition_place, parts], ', ')
|
22
22
|
|
23
23
|
unless joined_place_parts.empty?
|
24
24
|
return_fields << ModsDisplay::Values.new(
|
25
|
-
label: displayLabel(
|
25
|
+
label: displayLabel(origin_info_element) || I18n.t('mods_display.imprint'),
|
26
26
|
values: [joined_place_parts]
|
27
27
|
)
|
28
28
|
end
|
29
|
-
return_fields.concat(date_values(
|
29
|
+
return_fields.concat(date_values(origin_info_element))
|
30
30
|
|
31
|
-
other_pub_info(
|
31
|
+
other_pub_info(origin_info_element).each do |pub_info|
|
32
32
|
return_fields << ModsDisplay::Values.new(
|
33
|
-
label: displayLabel(
|
33
|
+
label: displayLabel(origin_info_element) || pub_info_labels[pub_info.name.to_sym],
|
34
34
|
values: [element_text(pub_info)]
|
35
35
|
)
|
36
36
|
end
|
@@ -48,7 +48,7 @@ module ModsDisplay
|
|
48
48
|
|
49
49
|
ModsDisplay::Values.new(
|
50
50
|
label: displayLabel(element) || pub_info_labels[date_field],
|
51
|
-
values:
|
51
|
+
values: select_best_date(date_values)
|
52
52
|
)
|
53
53
|
end.compact
|
54
54
|
end
|
@@ -117,6 +117,8 @@ module ModsDisplay
|
|
117
117
|
end.map(&:text).join(' ').strip
|
118
118
|
end
|
119
119
|
|
120
|
+
# not an exact duplicate of the method in ModsDisplay::Place, particularly trailing punctuation code
|
121
|
+
# as ModsDisplay::Place is not intended to combine with publisher in an imprint string
|
120
122
|
def place_element(value)
|
121
123
|
return if value.place.text.strip.empty?
|
122
124
|
|
@@ -142,7 +144,7 @@ module ModsDisplay
|
|
142
144
|
date_values = imprint.dates([date_field])
|
143
145
|
next if date_values.empty?
|
144
146
|
|
145
|
-
|
147
|
+
select_best_date(date_values)
|
146
148
|
end.flatten.compact.reject do |date|
|
147
149
|
date.strip.empty?
|
148
150
|
end.map(&:strip)
|
@@ -162,30 +164,5 @@ module ModsDisplay
|
|
162
164
|
issuance: I18n.t('mods_display.issuance'),
|
163
165
|
frequency: I18n.t('mods_display.frequency') }
|
164
166
|
end
|
165
|
-
|
166
|
-
def select_the_best_date(dates)
|
167
|
-
# ensure dates are unique with respect to their base values
|
168
|
-
dates = dates.group_by(&:base_value).map do |_value, group|
|
169
|
-
group.first if group.one?
|
170
|
-
|
171
|
-
# if one of the duplicates wasn't encoded, use that one. see:
|
172
|
-
# https://consul.stanford.edu/display/chimera/MODS+display+rules#MODSdisplayrules-3b.%3CoriginInfo%3E
|
173
|
-
if group.reject(&:encoding).any?
|
174
|
-
group.reject(&:encoding).first
|
175
|
-
|
176
|
-
# otherwise just randomly pick the last in the group
|
177
|
-
else
|
178
|
-
group.last
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
# if any single dates are already part of a range, discard them
|
183
|
-
range_base_values = dates.select { |date| date.is_a?(Stanford::Mods::Imprint::DateRange) }
|
184
|
-
.map(&:base_values).flatten
|
185
|
-
dates = dates.reject { |date| range_base_values.include?(date.base_value) }
|
186
|
-
|
187
|
-
# output formatted dates with qualifiers, CE/BCE, etc.
|
188
|
-
dates.map(&:qualified_value)
|
189
|
-
end
|
190
167
|
end
|
191
168
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class Issuance < Field
|
5
|
+
def fields
|
6
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
7
|
+
issuance_value = origin_info_element.issuance&.text&.strip
|
8
|
+
next unless issuance_value.present?
|
9
|
+
|
10
|
+
ModsDisplay::Values.new(
|
11
|
+
label: I18n.t('mods_display.issuance'),
|
12
|
+
values: [issuance_value],
|
13
|
+
field: self
|
14
|
+
)
|
15
|
+
end.compact
|
16
|
+
collapse_fields(return_fields)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -3,14 +3,14 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Language < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
7
|
-
next unless
|
6
|
+
return_fields = @stanford_mods_elements.map do |language_element|
|
7
|
+
next unless language_element.respond_to?(:languageTerm)
|
8
8
|
|
9
|
-
|
9
|
+
language_element.languageTerm.map do |term|
|
10
10
|
next unless term.attributes['type'].respond_to?(:value) && term.attributes['type'].value == 'code'
|
11
11
|
|
12
12
|
ModsDisplay::Values.new(
|
13
|
-
label: displayLabel(
|
13
|
+
label: displayLabel(language_element) || displayLabel(term) || I18n.t('mods_display.language'),
|
14
14
|
values: [language_codes[element_text(term)]]
|
15
15
|
)
|
16
16
|
end.flatten.compact
|
@@ -4,20 +4,20 @@ module ModsDisplay
|
|
4
4
|
class Location < Field
|
5
5
|
def fields
|
6
6
|
return_fields = []
|
7
|
-
@
|
8
|
-
|
7
|
+
@stanford_mods_elements.each do |location_element|
|
8
|
+
location_element.children.each do |child|
|
9
9
|
next unless location_field_keys.include?(child.name.to_sym)
|
10
10
|
|
11
11
|
if child.name.to_sym == :url
|
12
|
-
loc_label = displayLabel(
|
12
|
+
loc_label = displayLabel(location_element) || I18n.t('mods_display.location')
|
13
13
|
value = "<a href='#{element_text(child)}'>#{(displayLabel(child) || element_text(child)).gsub(/:$/,
|
14
14
|
'')}</a>"
|
15
15
|
else
|
16
|
-
loc_label = location_label(child) || displayLabel(
|
16
|
+
loc_label = location_label(child) || displayLabel(location_element) || I18n.t('mods_display.location')
|
17
17
|
value = element_text(child)
|
18
18
|
end
|
19
19
|
return_fields << ModsDisplay::Values.new(
|
20
|
-
label: loc_label || displayLabel(
|
20
|
+
label: loc_label || displayLabel(location_element) || I18n.t('mods_display.location'),
|
21
21
|
values: [value]
|
22
22
|
)
|
23
23
|
end
|
@@ -4,15 +4,16 @@ module ModsDisplay
|
|
4
4
|
class Name < Field
|
5
5
|
include ModsDisplay::RelatorCodes
|
6
6
|
|
7
|
-
#
|
8
|
-
# { role1 label => [ ModsDisplay:Name:Person, ModsDisplay:Name:Person, ...],
|
7
|
+
# returns a hash:
|
8
|
+
# { role1 label => [ ModsDisplay:Name:Person, ModsDisplay:Name:Person, ...],
|
9
|
+
# role2 label => [ ModsDisplay:Name:Person, ModsDisplay:Name:Person, ...] }
|
9
10
|
def fields
|
10
|
-
return_fields = @
|
11
|
-
name_parts = ModsDisplay::NameFormatter.format(
|
12
|
-
person = name_parts ? ModsDisplay::Name::Person.new(name: name_parts, name_identifiers:
|
11
|
+
return_fields = @stanford_mods_elements.map do |plain_name_element|
|
12
|
+
name_parts = ModsDisplay::NameFormatter.format(plain_name_element)
|
13
|
+
person = name_parts ? ModsDisplay::Name::Person.new(name: name_parts, name_identifiers: plain_name_element.xpath('mods:nameIdentifier', mods: MODS_NS)) : nil
|
13
14
|
# The person may have multiple roles, so we have to divide them up into an array
|
14
|
-
role_labels(
|
15
|
-
ModsDisplay::Values.new(label: displayLabel(
|
15
|
+
role_labels(plain_name_element).collect do |role_label|
|
16
|
+
ModsDisplay::Values.new(label: displayLabel(plain_name_element) || role_label, values: [person]) if person
|
16
17
|
end
|
17
18
|
end.flatten.compact
|
18
19
|
collapse_roles(collapse_fields(return_fields))
|
@@ -8,62 +8,70 @@ module ModsDisplay
|
|
8
8
|
class NestedRelatedItem < Field
|
9
9
|
include ModsDisplay::RelatedItemConcerns
|
10
10
|
|
11
|
+
def initialize(values, value_renderer: ValueRenderer)
|
12
|
+
super(values)
|
13
|
+
@value_renderer = value_renderer
|
14
|
+
end
|
15
|
+
|
11
16
|
def fields
|
12
17
|
@fields ||= begin
|
13
|
-
return_fields = RelatedItemValue.for_values(@
|
14
|
-
next if
|
15
|
-
next unless render_nested_related_item?(
|
18
|
+
return_fields = RelatedItemValue.for_values(@stanford_mods_elements).map do |related_item_element|
|
19
|
+
next if related_item_element.collection?
|
20
|
+
next unless render_nested_related_item?(related_item_element)
|
16
21
|
|
17
|
-
|
22
|
+
related_item_text = @value_renderer.new(related_item_element).render
|
23
|
+
|
24
|
+
ModsDisplay::Values.new(
|
25
|
+
label: related_item_label(related_item_element),
|
26
|
+
values: [related_item_text]
|
27
|
+
)
|
18
28
|
end.compact
|
19
29
|
collapse_fields(return_fields)
|
20
30
|
end
|
21
31
|
end
|
22
32
|
|
23
|
-
|
24
|
-
|
33
|
+
# this class provides html markup and is subclassed in purl application
|
34
|
+
class ValueRenderer
|
35
|
+
def initialize(related_item_element)
|
36
|
+
@related_item_element = related_item_element
|
37
|
+
end
|
25
38
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
list_html_attributes: { class: 'mods_display_nested_related_items' },
|
30
|
-
list_item_html_attributes: { class: 'mods_display_nested_related_item open' }
|
31
|
-
)
|
39
|
+
def render
|
40
|
+
[Array.wrap(mods_display_html.title).first, body_presence(mods_display_html.body)].compact.join
|
41
|
+
end
|
32
42
|
|
33
|
-
|
34
|
-
end
|
43
|
+
protected
|
35
44
|
|
36
|
-
|
45
|
+
attr_reader :related_item_element
|
37
46
|
|
38
|
-
|
39
|
-
|
40
|
-
# dup'ing the value adds the appropriate namespaces, but...
|
41
|
-
munged_node = value.dup.tap do |x|
|
42
|
-
# ... the mods gem also expects the root of the document to have the root tag <mods>
|
43
|
-
x.name = 'mods'
|
44
|
-
end
|
45
|
-
|
46
|
-
r.from_nk_node(munged_node)
|
47
|
+
def mods_display_html
|
48
|
+
@mods_display_html ||= ModsDisplay::HTML.new(mods)
|
47
49
|
end
|
48
|
-
related_item = ModsDisplay::HTML.new(mods)
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
51
|
+
def mods
|
52
|
+
@mods ||= ::Stanford::Mods::Record.new.tap do |r|
|
53
|
+
# dup'ing the value adds the appropriate namespaces, but...
|
54
|
+
munged_node = related_item_element.dup.tap do |x|
|
55
|
+
# ... the mods gem also expects the root of the document to have the root tag <mods>
|
56
|
+
x.name = 'mods'
|
57
|
+
end
|
55
58
|
|
56
|
-
|
57
|
-
|
59
|
+
r.from_nk_node(munged_node)
|
60
|
+
end
|
61
|
+
end
|
58
62
|
|
59
|
-
|
63
|
+
def body_presence(body)
|
64
|
+
return if body == '<dl></dl>'
|
60
65
|
|
61
|
-
|
66
|
+
body
|
67
|
+
end
|
62
68
|
end
|
63
69
|
|
64
|
-
|
65
|
-
|
66
|
-
|
70
|
+
private
|
71
|
+
|
72
|
+
def related_item_label(related_item_element)
|
73
|
+
return displayLabel(related_item_element) if displayLabel(related_item_element)
|
74
|
+
return I18n.t('mods_display.constituent') if related_item_element.constituent?
|
67
75
|
|
68
76
|
I18n.t('mods_display.host')
|
69
77
|
end
|
@@ -3,9 +3,12 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Note < Field
|
5
5
|
def fields
|
6
|
-
return_fields = note_fields.map do |
|
7
|
-
ModsDisplay::Values.new(
|
8
|
-
|
6
|
+
return_fields = note_fields.map do |note_element|
|
7
|
+
ModsDisplay::Values.new(
|
8
|
+
label: displayLabel(note_element) || note_label(note_element),
|
9
|
+
values: [element_text(note_element)],
|
10
|
+
field: self
|
11
|
+
)
|
9
12
|
end
|
10
13
|
collapse_fields(return_fields)
|
11
14
|
end
|
@@ -17,10 +20,10 @@ module ModsDisplay
|
|
17
20
|
end
|
18
21
|
|
19
22
|
def note_fields
|
20
|
-
@
|
21
|
-
|
22
|
-
|
23
|
-
|
23
|
+
@stanford_mods_elements.select do |note_element|
|
24
|
+
!note_element.attributes['type'].respond_to?(:value) ||
|
25
|
+
(note_element.attributes['type'].respond_to?(:value) &&
|
26
|
+
note_element.attributes['type'].value.downcase != 'contact')
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class Place < Field
|
5
|
+
include ModsDisplay::CountryCodes
|
6
|
+
|
7
|
+
def fields
|
8
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
9
|
+
place_value = place_element(origin_info_element)
|
10
|
+
next unless place_value.present?
|
11
|
+
|
12
|
+
ModsDisplay::Values.new(
|
13
|
+
label: I18n.t('mods_display.place'),
|
14
|
+
values: [place_value],
|
15
|
+
field: self
|
16
|
+
)
|
17
|
+
end.compact
|
18
|
+
collapse_fields(return_fields)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# not an exact duplicate of the method in Imprint, particularly trailing punctuation code
|
24
|
+
def place_element(origin_info_element)
|
25
|
+
return if origin_info_element.place.text.strip.empty?
|
26
|
+
|
27
|
+
places = ModsDisplay::Imprint.new(origin_info_element).place_terms(origin_info_element).filter_map { |p| p.text unless p.text.strip.empty? }
|
28
|
+
compact_and_remove_trailing_delimiter(places, ':').join
|
29
|
+
end
|
30
|
+
|
31
|
+
def compact_and_remove_trailing_delimiter(values, delimiter = ':')
|
32
|
+
values.flatten.filter_map { |v| v.gsub(/ *#{delimiter}$/, '') if v.present? }.compact
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class Publisher < Field
|
5
|
+
def fields
|
6
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
7
|
+
publisher_value = Stanford::Mods::Imprint.new(origin_info_element).publisher_vals_str
|
8
|
+
next unless publisher_value.present?
|
9
|
+
|
10
|
+
publisher_value.gsub!(/ *,$/, '')
|
11
|
+
|
12
|
+
ModsDisplay::Values.new(
|
13
|
+
label: I18n.t('mods_display.publisher'),
|
14
|
+
values: [publisher_value],
|
15
|
+
field: self
|
16
|
+
)
|
17
|
+
end.compact
|
18
|
+
collapse_fields(return_fields)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class ReferenceTitle < Field
|
5
|
+
def fields
|
6
|
+
# Reference title is a composite field that includes parts from elsewhere in the record.
|
7
|
+
return [] unless @stanford_mods_elements.present?
|
8
|
+
|
9
|
+
return_fields = [ModsDisplay::Values.new(label: displayLabel(@stanford_mods_elements.first) || label, values: [title_value].compact)]
|
10
|
+
collapse_fields(return_fields)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def root
|
16
|
+
@root ||= @stanford_mods_elements.first.document.root
|
17
|
+
end
|
18
|
+
|
19
|
+
def displayLabel(element)
|
20
|
+
super(element) || I18n.t('mods_display.referenced_by')
|
21
|
+
end
|
22
|
+
|
23
|
+
def title_value
|
24
|
+
[@stanford_mods_elements,
|
25
|
+
root.xpath('mods:originInfo/mods:dateOther', mods: MODS_NS),
|
26
|
+
root.xpath('mods:part/mods:detail/mods:number', mods: MODS_NS),
|
27
|
+
root.xpath('mods:note', mods: MODS_NS)].flatten.compact.map!(&:text).map!(&:strip).join(' ').presence
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -4,65 +4,84 @@ module ModsDisplay
|
|
4
4
|
class RelatedItem < Field
|
5
5
|
include ModsDisplay::RelatedItemConcerns
|
6
6
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def initialize(values, value_renderer: ValueRenderer)
|
8
|
+
super(values)
|
9
|
+
@value_renderer = value_renderer
|
10
|
+
end
|
11
11
|
|
12
|
-
|
12
|
+
def fields
|
13
|
+
return_fields = RelatedItemValue.for_values(@stanford_mods_elements).map do |related_item_element|
|
14
|
+
next if related_item_element.collection?
|
15
|
+
next if render_nested_related_item?(related_item_element)
|
13
16
|
|
17
|
+
text = @value_renderer.new(related_item_element).render
|
14
18
|
next if text.nil? || text.empty?
|
15
19
|
|
16
|
-
ModsDisplay::Values.new(
|
20
|
+
ModsDisplay::Values.new(
|
21
|
+
label: related_item_label(related_item_element),
|
22
|
+
values: [text]
|
23
|
+
)
|
17
24
|
end.compact
|
18
25
|
collapse_fields(return_fields)
|
19
26
|
end
|
20
27
|
|
21
|
-
|
28
|
+
# this class provides html markup and is mimicking the same class
|
29
|
+
# in NestedRelatedItem (which is subclassed in purl application)
|
30
|
+
class ValueRenderer
|
31
|
+
def initialize(related_item_element)
|
32
|
+
@related_item_element = related_item_element
|
33
|
+
end
|
22
34
|
|
23
|
-
|
24
|
-
|
25
|
-
|
35
|
+
def render
|
36
|
+
if related_item_element.location?
|
37
|
+
element_text(related_item_element.location_nodeset)
|
38
|
+
elsif related_item_element.reference?
|
39
|
+
reference_title(related_item_element)
|
40
|
+
elsif related_item_element.titleInfo_nodeset.any?
|
41
|
+
title = element_text(related_item_element.titleInfo_nodeset)
|
42
|
+
location = nil
|
43
|
+
location = element_text(related_item_element.location_url_nodeset) if related_item_element.location_url_nodeset.length.positive?
|
44
|
+
|
45
|
+
return if title.empty?
|
46
|
+
|
47
|
+
if location
|
48
|
+
"<a href='#{location}'>#{title}</a>".html_safe
|
49
|
+
else
|
50
|
+
title
|
51
|
+
end
|
52
|
+
elsif related_item_element.note_nodeset.any?
|
53
|
+
citation = related_item_element.note_nodeset.find { |note| note['type'] == 'preferred citation' }
|
26
54
|
|
27
|
-
|
28
|
-
if item.location?
|
29
|
-
element_text(item.location_nodeset)
|
30
|
-
elsif item.reference?
|
31
|
-
reference_title(item)
|
32
|
-
elsif item.titleInfo_nodeset.any?
|
33
|
-
title = element_text(item.titleInfo_nodeset)
|
34
|
-
location = nil
|
35
|
-
location = element_text(item.location_url_nodeset) if item.location_url_nodeset.length.positive?
|
36
|
-
|
37
|
-
return if title.empty?
|
38
|
-
|
39
|
-
if location
|
40
|
-
"<a href='#{location}'>#{title}</a>".html_safe
|
41
|
-
else
|
42
|
-
title
|
55
|
+
element_text(citation) if citation
|
43
56
|
end
|
44
|
-
|
45
|
-
|
57
|
+
end
|
58
|
+
|
59
|
+
protected
|
46
60
|
|
47
|
-
|
61
|
+
attr_reader :related_item_element
|
62
|
+
|
63
|
+
def element_text(element)
|
64
|
+
element.xpath('.//text()').to_html.strip
|
48
65
|
end
|
49
|
-
end
|
50
66
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
67
|
+
def reference_title(related_item_element)
|
68
|
+
[related_item_element.titleInfo_nodeset,
|
69
|
+
related_item_element.originInfo.dateOther,
|
70
|
+
related_item_element.part.detail.number,
|
71
|
+
related_item_element.note_nodeset].flatten.compact.map!(&:text).map!(&:strip).join(' ')
|
72
|
+
end
|
56
73
|
end
|
57
74
|
|
58
|
-
|
59
|
-
|
60
|
-
|
75
|
+
private
|
76
|
+
|
77
|
+
def related_item_label(related_item_element)
|
78
|
+
if displayLabel(related_item_element)
|
79
|
+
displayLabel(related_item_element)
|
61
80
|
else
|
62
81
|
case
|
63
|
-
when
|
82
|
+
when related_item_element.location?
|
64
83
|
return I18n.t('mods_display.location')
|
65
|
-
when
|
84
|
+
when related_item_element.reference?
|
66
85
|
return I18n.t('mods_display.referenced_by')
|
67
86
|
end
|
68
87
|
I18n.t('mods_display.related_item')
|
@@ -3,16 +3,19 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class ResourceType < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
7
|
-
ModsDisplay::Values.new(
|
6
|
+
return_fields = @stanford_mods_elements.map do |type_of_resource_element|
|
7
|
+
ModsDisplay::Values.new(
|
8
|
+
label: displayLabel(type_of_resource_element) || label,
|
9
|
+
values: [element_text(type_of_resource_element)]
|
10
|
+
)
|
8
11
|
end
|
9
12
|
collapse_fields(return_fields)
|
10
13
|
end
|
11
14
|
|
12
15
|
private
|
13
16
|
|
14
|
-
def displayLabel(
|
15
|
-
super(
|
17
|
+
def displayLabel(type_of_resource_element)
|
18
|
+
super(type_of_resource_element) || I18n.t('mods_display.type_of_resource')
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -4,11 +4,11 @@ module ModsDisplay
|
|
4
4
|
class Subject < Field
|
5
5
|
def fields
|
6
6
|
return_fields = []
|
7
|
-
@
|
7
|
+
@stanford_mods_elements.each do |subject_element|
|
8
8
|
return_values = []
|
9
|
-
label = displayLabel(
|
9
|
+
label = displayLabel(subject_element) || I18n.t('mods_display.subject')
|
10
10
|
return_text = []
|
11
|
-
selected_subjects(
|
11
|
+
selected_subjects(subject_element).each do |child|
|
12
12
|
if respond_to?(:"process_#{child.name}")
|
13
13
|
method_send = send(:"process_#{child.name}", child)
|
14
14
|
return_text << method_send unless method_send.to_s.empty?
|