mods_display 1.5.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/config/locales/en.yml +1 -0
- data/lib/mods_display/fields/access_condition.rb +5 -5
- data/lib/mods_display/fields/cartographics.rb +6 -8
- 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/date_other.rb +26 -0
- data/lib/mods_display/fields/description.rb +6 -3
- data/lib/mods_display/fields/edition.rb +3 -3
- data/lib/mods_display/fields/extent.rb +4 -4
- data/lib/mods_display/fields/field.rb +24 -19
- data/lib/mods_display/fields/form.rb +4 -4
- data/lib/mods_display/fields/frequency.rb +1 -1
- 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 +9 -9
- data/lib/mods_display/fields/issuance.rb +2 -2
- 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 +13 -12
- data/lib/mods_display/fields/note.rb +10 -7
- data/lib/mods_display/fields/place.rb +5 -5
- data/lib/mods_display/fields/publisher.rb +2 -2
- data/lib/mods_display/fields/reference_title.rb +4 -4
- data/lib/mods_display/fields/related_item.rb +32 -34
- 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 +18 -18
- data/lib/mods_display/fields/values.rb +1 -0
- data/lib/mods_display/html.rb +1 -0
- data/lib/mods_display/version.rb +1 -1
- data/lib/mods_display.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz: '
|
3
|
+
metadata.gz: 4152dce7ec61d92e04a5cddf9c5c152c414eeb725c05b975be1ec66eeadc2fa7
|
4
|
+
data.tar.gz: '087502061c3666fe0b4eec7c00a2a93e9532610cb4b35d7de6555a3dd7d2a8c8'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1843e6a4f59a79c0f54f757e9c99820af6235681eea8a2c494bb40a6291db2f0408b6af26a6b8541bd91348cd1572c87329e510c12713df2afe9e72aea1a6baa
|
7
|
+
data.tar.gz: b4f433ae7fe636d51b92222cf64e8cbabdadcdc3aca05333165d9f0699957a59f94a4d254efad3e43e908f2b8991d12d7e70a652cdd10b15e639a7317b98d889
|
data/config/locales/en.yml
CHANGED
@@ -19,6 +19,7 @@ en:
|
|
19
19
|
date_created: "Date created:"
|
20
20
|
date_issued: "Publication date:"
|
21
21
|
date_modified: "Date modified:"
|
22
|
+
date_other: "Other date:"
|
22
23
|
date_sequential_designation: "Date/Sequential designation:"
|
23
24
|
date_valid: "Date valid:"
|
24
25
|
digital_origin: "Digital origin:"
|
@@ -51,10 +51,10 @@ module ModsDisplay
|
|
51
51
|
}.freeze
|
52
52
|
|
53
53
|
def fields
|
54
|
-
return_fields = @
|
54
|
+
return_fields = @stanford_mods_elements.map do |stanford_mods_element|
|
55
55
|
ModsDisplay::Values.new(
|
56
|
-
label: displayLabel(
|
57
|
-
values: [process_access_statement(
|
56
|
+
label: displayLabel(stanford_mods_element) || access_label(stanford_mods_element),
|
57
|
+
values: [process_access_statement(stanford_mods_element)],
|
58
58
|
field: self
|
59
59
|
)
|
60
60
|
end
|
@@ -85,7 +85,7 @@ module ModsDisplay
|
|
85
85
|
def license_statement(element)
|
86
86
|
element_text = element_text(element)
|
87
87
|
legacy_matches = element_text.match(/^(?<code>.*) (?<type>.*):(?<description>.*)$/)
|
88
|
-
return legacy_license_statement(
|
88
|
+
return legacy_license_statement(legacy_matches) if legacy_matches
|
89
89
|
|
90
90
|
matches = element_text.match(/^This work is licensed under a (.+?)\.$/)
|
91
91
|
return linked_licensed_statement(element, matches) if matches && element['xlink:href'].present?
|
@@ -97,7 +97,7 @@ module ModsDisplay
|
|
97
97
|
"This work is licensed under a <a href='#{element['xlink:href']}'>#{matches[1]}</a>."
|
98
98
|
end
|
99
99
|
|
100
|
-
def legacy_license_statement(
|
100
|
+
def legacy_license_statement(matches)
|
101
101
|
code = matches[:code].downcase
|
102
102
|
type = matches[:type].downcase
|
103
103
|
description = license_description(code, type) || matches[:description]
|
@@ -3,20 +3,18 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Cartographics < Field
|
5
5
|
def fields
|
6
|
-
return nil if @
|
6
|
+
return nil if @stanford_mods_elements.nil?
|
7
7
|
|
8
8
|
return_fields = []
|
9
|
-
@
|
10
|
-
next unless
|
9
|
+
@stanford_mods_elements.each do |subject_element|
|
10
|
+
next unless subject_element.respond_to?(:cartographics)
|
11
11
|
|
12
|
-
|
12
|
+
subject_element.cartographics.each do |field|
|
13
13
|
scale = field.scale.empty? ? 'Scale not given' : element_text(field.scale)
|
14
14
|
projection = field.projection.empty? ? nil : element_text(field.projection)
|
15
15
|
coordinates = field.coordinates.empty? ? nil : element_text(field.coordinates)
|
16
|
-
post_scale = if [projection,
|
17
|
-
|
18
|
-
[projection, coordinates].compact.join(' ')
|
19
|
-
end
|
16
|
+
post_scale = [projection, coordinates].compact.join(' ') if [projection, coordinates].compact.length.positive?
|
17
|
+
|
20
18
|
return_fields << ModsDisplay::Values.new(
|
21
19
|
label: displayLabel(field) || label || I18n.t('mods_display.map_data'),
|
22
20
|
values: [[scale, post_scale].compact.join(' ; ')]
|
@@ -5,18 +5,18 @@ module ModsDisplay
|
|
5
5
|
# Collection class to parse collection data out of Mods relatedItem fields
|
6
6
|
###
|
7
7
|
class Collection < Field
|
8
|
-
def collection_label(
|
9
|
-
displayLabel(
|
8
|
+
def collection_label(related_item_element)
|
9
|
+
displayLabel(related_item_element) || I18n.t('mods_display.collection')
|
10
10
|
end
|
11
11
|
|
12
12
|
def fields
|
13
13
|
return_fields = []
|
14
|
-
@
|
15
|
-
next unless related_item_is_a_collection?(
|
14
|
+
@stanford_mods_elements.each do |related_item_element|
|
15
|
+
next unless related_item_is_a_collection?(related_item_element)
|
16
16
|
|
17
17
|
return_fields << ModsDisplay::Values.new(
|
18
|
-
label: collection_label(
|
19
|
-
values: [element_text(
|
18
|
+
label: collection_label(related_item_element),
|
19
|
+
values: [element_text(related_item_element.titleInfo)]
|
20
20
|
)
|
21
21
|
end
|
22
22
|
collapse_fields(return_fields)
|
@@ -24,17 +24,17 @@ module ModsDisplay
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
def related_item_is_a_collection?(
|
28
|
-
|
27
|
+
def related_item_is_a_collection?(related_item_element)
|
28
|
+
related_item_element.respond_to?(:titleInfo) && resource_type_is_collection?(related_item_element)
|
29
29
|
end
|
30
30
|
|
31
|
-
def resource_type_is_collection?(
|
32
|
-
return false unless
|
33
|
-
return false unless
|
31
|
+
def resource_type_is_collection?(related_item_element)
|
32
|
+
return false unless related_item_element.respond_to?(:typeOfResource)
|
33
|
+
return false unless related_item_element.typeOfResource.attributes.length.positive?
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
related_item_element.typeOfResource.attributes.length.positive? &&
|
36
|
+
related_item_element.typeOfResource.attributes.first.key?('collection') &&
|
37
|
+
related_item_element.typeOfResource.attributes.first['collection'].value == 'yes'
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -3,10 +3,10 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Contact < Field
|
5
5
|
def fields
|
6
|
-
return_fields =
|
6
|
+
return_fields = contact_elements.map do |contact_element|
|
7
7
|
ModsDisplay::Values.new(
|
8
|
-
label: displayLabel(
|
9
|
-
values: [element_text(
|
8
|
+
label: displayLabel(contact_element) || I18n.t('mods_display.contact'),
|
9
|
+
values: [element_text(contact_element)]
|
10
10
|
)
|
11
11
|
end
|
12
12
|
collapse_fields(return_fields)
|
@@ -14,10 +14,10 @@ module ModsDisplay
|
|
14
14
|
|
15
15
|
private
|
16
16
|
|
17
|
-
def
|
18
|
-
@
|
19
|
-
|
20
|
-
|
17
|
+
def contact_elements
|
18
|
+
@stanford_mods_elements.select do |note_element|
|
19
|
+
note_element.attributes['type'].respond_to?(:value) &&
|
20
|
+
note_element.attributes['type'].value.downcase == 'contact'
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -4,7 +4,11 @@ module ModsDisplay
|
|
4
4
|
class Contents < Field
|
5
5
|
def to_html(view_context = ApplicationController.renderer)
|
6
6
|
f = fields.map do |field|
|
7
|
-
ModsDisplay::Values.new(
|
7
|
+
ModsDisplay::Values.new(
|
8
|
+
label: field.label,
|
9
|
+
values: [field.values.join("\n\n")],
|
10
|
+
field: self
|
11
|
+
)
|
8
12
|
end
|
9
13
|
|
10
14
|
helpers = view_context.respond_to?(:simple_format) ? view_context : ApplicationController.new.view_context
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class DateOther < Field
|
5
|
+
def fields
|
6
|
+
date_fields(:dateOther)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
# this is called from the Field.select_best_date method
|
12
|
+
# @param date [Stanford::Mods::Imprint::Date]
|
13
|
+
def qualified_value_with_type(date)
|
14
|
+
type = type_attribute_value(date)
|
15
|
+
type ? "#{date.qualified_value} (#{type})" : date.qualified_value
|
16
|
+
end
|
17
|
+
|
18
|
+
def type_attribute_value(date)
|
19
|
+
if date.is_a?(Stanford::Mods::Imprint::DateRange)
|
20
|
+
date.start.value.type || date.stop.value.type
|
21
|
+
else
|
22
|
+
date.value.type
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -3,8 +3,11 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Description < Field
|
5
5
|
def fields
|
6
|
-
return_fields = description_fields.map do |
|
7
|
-
ModsDisplay::Values.new(
|
6
|
+
return_fields = description_fields.map do |element|
|
7
|
+
ModsDisplay::Values.new(
|
8
|
+
label: description_label(element),
|
9
|
+
values: [element_text(element)]
|
10
|
+
)
|
8
11
|
end
|
9
12
|
collapse_fields(return_fields)
|
10
13
|
end
|
@@ -16,7 +19,7 @@ module ModsDisplay
|
|
16
19
|
private
|
17
20
|
|
18
21
|
def description_fields
|
19
|
-
@
|
22
|
+
@stanford_mods_elements.children.select do |child|
|
20
23
|
labels.keys.include?(child.name.to_sym)
|
21
24
|
end
|
22
25
|
end
|
@@ -3,11 +3,11 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Edition < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
7
|
-
edition_value = Stanford::Mods::Imprint.new(
|
6
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
7
|
+
edition_value = Stanford::Mods::Imprint.new(origin_info_element).edition_vals_str
|
8
8
|
next unless edition_value.present?
|
9
9
|
|
10
|
-
# remove trailing spaces (thanks MARC for catalog card formatting!)
|
10
|
+
# remove trailing spaces (thanks MARC, for catalog card formatting!)
|
11
11
|
edition_value.gsub!(%r{ */$}, '')
|
12
12
|
|
13
13
|
ModsDisplay::Values.new(
|
@@ -3,20 +3,20 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Extent < Field
|
5
5
|
def fields
|
6
|
-
return [] unless
|
6
|
+
return [] unless extent_elements.present?
|
7
7
|
|
8
8
|
[
|
9
9
|
ModsDisplay::Values.new(
|
10
10
|
label: I18n.t('mods_display.extent'),
|
11
|
-
values:
|
11
|
+
values: extent_elements.map { |x| element_text(x) }
|
12
12
|
)
|
13
13
|
]
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
def
|
19
|
-
@
|
18
|
+
def extent_elements
|
19
|
+
@stanford_mods_elements.map(&:extent).flatten
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -1,16 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module ModsDisplay
|
4
|
+
# superclass for processing stanford-mods elements into ModsDisplay::Values retrieved by the fields method
|
5
|
+
# by consuming applications.
|
4
6
|
class Field
|
5
|
-
|
6
|
-
|
7
|
+
# @stanford_mods_elements is an array of Nokogiri::XML::Element-ish objects from stanford-mods
|
8
|
+
# per ModsDisplay::HTML::MODS_DISPLAY_FIELD_MAPPING
|
9
|
+
def initialize(stanford_mods_elements)
|
10
|
+
@stanford_mods_elements = stanford_mods_elements
|
7
11
|
end
|
8
12
|
|
9
13
|
def fields
|
10
|
-
return_fields = @
|
14
|
+
return_fields = @stanford_mods_elements.map do |stanford_mods_element|
|
11
15
|
ModsDisplay::Values.new(
|
12
|
-
label: displayLabel(
|
13
|
-
values: [element_text(
|
16
|
+
label: displayLabel(stanford_mods_element) || label,
|
17
|
+
values: [element_text(stanford_mods_element)],
|
14
18
|
field: self
|
15
19
|
)
|
16
20
|
end
|
@@ -18,9 +22,9 @@ module ModsDisplay
|
|
18
22
|
end
|
19
23
|
|
20
24
|
def label
|
21
|
-
return nil if @
|
25
|
+
return nil if @stanford_mods_elements.nil?
|
22
26
|
|
23
|
-
displayLabel(@
|
27
|
+
displayLabel(@stanford_mods_elements.first)
|
24
28
|
end
|
25
29
|
|
26
30
|
def to_html(view_context = ApplicationController.renderer)
|
@@ -50,7 +54,10 @@ module ModsDisplay
|
|
50
54
|
display_fields.slice_when { |before, after| before.label != after.label }.map do |group|
|
51
55
|
next group.first if group.length == 1
|
52
56
|
|
53
|
-
ModsDisplay::Values.new(
|
57
|
+
ModsDisplay::Values.new(
|
58
|
+
label: group.first.label,
|
59
|
+
values: group.map(&:values).flatten(1)
|
60
|
+
)
|
54
61
|
end
|
55
62
|
end
|
56
63
|
|
@@ -60,8 +67,8 @@ module ModsDisplay
|
|
60
67
|
|
61
68
|
# used for originInfo date fields, e.g. DateCreated, DateIssued ...
|
62
69
|
def date_fields(date_symbol)
|
63
|
-
return_fields = @
|
64
|
-
date_values = Stanford::Mods::Imprint.new(
|
70
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
71
|
+
date_values = Stanford::Mods::Imprint.new(origin_info_element).dates([date_symbol])
|
65
72
|
next unless date_values.present?
|
66
73
|
|
67
74
|
ModsDisplay::Values.new(
|
@@ -79,15 +86,10 @@ module ModsDisplay
|
|
79
86
|
dates = dates.group_by(&:base_value).map do |_value, group|
|
80
87
|
group.first if group.one?
|
81
88
|
|
82
|
-
# if one of the duplicates wasn't encoded, use that one
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
# otherwise just randomly pick the last in the group
|
88
|
-
else
|
89
|
-
group.last
|
90
|
-
end
|
89
|
+
# if one of the duplicates wasn't encoded, use that one (see:
|
90
|
+
# https://consul.stanford.edu/display/chimera/MODS+display+rules#MODSdisplayrules-3b.%3CoriginInfo%3E),
|
91
|
+
# otherwise just randomly pick the last in the group
|
92
|
+
group.reject(&:encoding).first || group.last
|
91
93
|
end
|
92
94
|
|
93
95
|
# if any single dates are already part of a range, discard them
|
@@ -95,6 +97,9 @@ module ModsDisplay
|
|
95
97
|
.map(&:base_values).flatten
|
96
98
|
dates = dates.reject { |date| range_base_values.include?(date.base_value) }
|
97
99
|
|
100
|
+
# for DateOther field (but not for Imprint field), include the type attribute value in parens
|
101
|
+
return dates.map { |date| qualified_value_with_type(date) } if instance_of?(ModsDisplay::DateOther)
|
102
|
+
|
98
103
|
# output formatted dates with qualifiers, CE/BCE, etc.
|
99
104
|
dates.map(&:qualified_value)
|
100
105
|
end
|
@@ -3,20 +3,20 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Form < Field
|
5
5
|
def fields
|
6
|
-
return [] unless
|
6
|
+
return [] unless form_elements.present?
|
7
7
|
|
8
8
|
[
|
9
9
|
ModsDisplay::Values.new(
|
10
10
|
label: I18n.t('mods_display.form'),
|
11
|
-
values:
|
11
|
+
values: form_elements.map { |x| element_text(x) }.uniq { |x| x.downcase.gsub(/\s/, '').gsub(/[[:punct:]]/, '') }
|
12
12
|
)
|
13
13
|
]
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
def
|
19
|
-
@
|
18
|
+
def form_elements
|
19
|
+
@stanford_mods_elements.map(&:form).flatten
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Frequency < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
6
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
7
7
|
frequency_value = origin_info_element.frequency&.text&.strip
|
8
8
|
next unless frequency_value.present?
|
9
9
|
|
@@ -3,8 +3,11 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Genre < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
7
|
-
ModsDisplay::Values.new(
|
6
|
+
return_fields = @stanford_mods_elements.map do |genre_element|
|
7
|
+
ModsDisplay::Values.new(
|
8
|
+
label: displayLabel(genre_element) || label,
|
9
|
+
values: [element_text(genre_element).capitalize].flatten
|
10
|
+
)
|
8
11
|
end
|
9
12
|
collapse_fields(return_fields)
|
10
13
|
end
|
@@ -25,8 +25,8 @@ module ModsDisplay
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def geo_extensions
|
28
|
-
@geo_values ||= @
|
29
|
-
displayLabel(
|
28
|
+
@geo_values ||= @stanford_mods_elements.select do |extension_element|
|
29
|
+
displayLabel(extension_element) =~ /^geo:?$/
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -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
|
@@ -3,12 +3,12 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Issuance < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
6
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
7
7
|
issuance_value = origin_info_element.issuance&.text&.strip
|
8
8
|
next unless issuance_value.present?
|
9
9
|
|
10
10
|
ModsDisplay::Values.new(
|
11
|
-
label:
|
11
|
+
label: I18n.t('mods_display.issuance'),
|
12
12
|
values: [issuance_value],
|
13
13
|
field: self
|
14
14
|
)
|
@@ -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))
|
@@ -15,14 +15,14 @@ module ModsDisplay
|
|
15
15
|
|
16
16
|
def fields
|
17
17
|
@fields ||= begin
|
18
|
-
return_fields = RelatedItemValue.for_values(@
|
19
|
-
next if
|
20
|
-
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)
|
21
21
|
|
22
|
-
related_item_text = @value_renderer.new(
|
22
|
+
related_item_text = @value_renderer.new(related_item_element).render
|
23
23
|
|
24
24
|
ModsDisplay::Values.new(
|
25
|
-
label: related_item_label(
|
25
|
+
label: related_item_label(related_item_element),
|
26
26
|
values: [related_item_text]
|
27
27
|
)
|
28
28
|
end.compact
|
@@ -30,9 +30,10 @@ module ModsDisplay
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
# this class provides html markup and is subclassed in purl application
|
33
34
|
class ValueRenderer
|
34
|
-
def initialize(
|
35
|
-
@
|
35
|
+
def initialize(related_item_element)
|
36
|
+
@related_item_element = related_item_element
|
36
37
|
end
|
37
38
|
|
38
39
|
def render
|
@@ -41,7 +42,7 @@ module ModsDisplay
|
|
41
42
|
|
42
43
|
protected
|
43
44
|
|
44
|
-
attr_reader :
|
45
|
+
attr_reader :related_item_element
|
45
46
|
|
46
47
|
def mods_display_html
|
47
48
|
@mods_display_html ||= ModsDisplay::HTML.new(mods)
|
@@ -50,7 +51,7 @@ module ModsDisplay
|
|
50
51
|
def mods
|
51
52
|
@mods ||= ::Stanford::Mods::Record.new.tap do |r|
|
52
53
|
# dup'ing the value adds the appropriate namespaces, but...
|
53
|
-
munged_node =
|
54
|
+
munged_node = related_item_element.dup.tap do |x|
|
54
55
|
# ... the mods gem also expects the root of the document to have the root tag <mods>
|
55
56
|
x.name = 'mods'
|
56
57
|
end
|
@@ -68,9 +69,9 @@ module ModsDisplay
|
|
68
69
|
|
69
70
|
private
|
70
71
|
|
71
|
-
def related_item_label(
|
72
|
-
return displayLabel(
|
73
|
-
return I18n.t('mods_display.constituent') if
|
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?
|
74
75
|
|
75
76
|
I18n.t('mods_display.host')
|
76
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
|
|
@@ -5,8 +5,8 @@ module ModsDisplay
|
|
5
5
|
include ModsDisplay::CountryCodes
|
6
6
|
|
7
7
|
def fields
|
8
|
-
return_fields = @
|
9
|
-
place_value = place_element(
|
8
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
9
|
+
place_value = place_element(origin_info_element)
|
10
10
|
next unless place_value.present?
|
11
11
|
|
12
12
|
ModsDisplay::Values.new(
|
@@ -21,10 +21,10 @@ module ModsDisplay
|
|
21
21
|
private
|
22
22
|
|
23
23
|
# not an exact duplicate of the method in Imprint, particularly trailing punctuation code
|
24
|
-
def place_element(
|
25
|
-
return if
|
24
|
+
def place_element(origin_info_element)
|
25
|
+
return if origin_info_element.place.text.strip.empty?
|
26
26
|
|
27
|
-
places = ModsDisplay::Imprint.new(
|
27
|
+
places = ModsDisplay::Imprint.new(origin_info_element).place_terms(origin_info_element).filter_map { |p| p.text unless p.text.strip.empty? }
|
28
28
|
compact_and_remove_trailing_delimiter(places, ':').join
|
29
29
|
end
|
30
30
|
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module ModsDisplay
|
4
4
|
class Publisher < Field
|
5
5
|
def fields
|
6
|
-
return_fields = @
|
7
|
-
publisher_value = Stanford::Mods::Imprint.new(
|
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
8
|
next unless publisher_value.present?
|
9
9
|
|
10
10
|
publisher_value.gsub!(/ *,$/, '')
|
@@ -4,16 +4,16 @@ module ModsDisplay
|
|
4
4
|
class ReferenceTitle < Field
|
5
5
|
def fields
|
6
6
|
# Reference title is a composite field that includes parts from elsewhere in the record.
|
7
|
-
return [] unless @
|
7
|
+
return [] unless @stanford_mods_elements.present?
|
8
8
|
|
9
|
-
return_fields = [ModsDisplay::Values.new(label: displayLabel(@
|
9
|
+
return_fields = [ModsDisplay::Values.new(label: displayLabel(@stanford_mods_elements.first) || label, values: [title_value].compact)]
|
10
10
|
collapse_fields(return_fields)
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def root
|
16
|
-
@root ||= @
|
16
|
+
@root ||= @stanford_mods_elements.first.document.root
|
17
17
|
end
|
18
18
|
|
19
19
|
def displayLabel(element)
|
@@ -21,7 +21,7 @@ module ModsDisplay
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def title_value
|
24
|
-
[@
|
24
|
+
[@stanford_mods_elements,
|
25
25
|
root.xpath('mods:originInfo/mods:dateOther', mods: MODS_NS),
|
26
26
|
root.xpath('mods:part/mods:detail/mods:number', mods: MODS_NS),
|
27
27
|
root.xpath('mods:note', mods: MODS_NS)].flatten.compact.map!(&:text).map!(&:strip).join(' ').presence
|
@@ -10,33 +10,37 @@ module ModsDisplay
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def fields
|
13
|
-
return_fields = RelatedItemValue.for_values(@
|
14
|
-
next if
|
15
|
-
next if render_nested_related_item?(
|
16
|
-
|
17
|
-
text = @value_renderer.new(value).render
|
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)
|
18
16
|
|
17
|
+
text = @value_renderer.new(related_item_element).render
|
19
18
|
next if text.nil? || text.empty?
|
20
19
|
|
21
|
-
ModsDisplay::Values.new(
|
20
|
+
ModsDisplay::Values.new(
|
21
|
+
label: related_item_label(related_item_element),
|
22
|
+
values: [text]
|
23
|
+
)
|
22
24
|
end.compact
|
23
25
|
collapse_fields(return_fields)
|
24
26
|
end
|
25
27
|
|
28
|
+
# this class provides html markup and is mimicking the same class
|
29
|
+
# in NestedRelatedItem (which is subclassed in purl application)
|
26
30
|
class ValueRenderer
|
27
|
-
def initialize(
|
28
|
-
@
|
31
|
+
def initialize(related_item_element)
|
32
|
+
@related_item_element = related_item_element
|
29
33
|
end
|
30
34
|
|
31
35
|
def render
|
32
|
-
if
|
33
|
-
element_text(
|
34
|
-
elsif
|
35
|
-
reference_title(
|
36
|
-
elsif
|
37
|
-
title = element_text(
|
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)
|
38
42
|
location = nil
|
39
|
-
location = element_text(
|
43
|
+
location = element_text(related_item_element.location_url_nodeset) if related_item_element.location_url_nodeset.length.positive?
|
40
44
|
|
41
45
|
return if title.empty?
|
42
46
|
|
@@ -45,8 +49,8 @@ module ModsDisplay
|
|
45
49
|
else
|
46
50
|
title
|
47
51
|
end
|
48
|
-
elsif
|
49
|
-
citation =
|
52
|
+
elsif related_item_element.note_nodeset.any?
|
53
|
+
citation = related_item_element.note_nodeset.find { |note| note['type'] == 'preferred citation' }
|
50
54
|
|
51
55
|
element_text(citation) if citation
|
52
56
|
end
|
@@ -54,36 +58,30 @@ module ModsDisplay
|
|
54
58
|
|
55
59
|
protected
|
56
60
|
|
57
|
-
attr_reader :
|
61
|
+
attr_reader :related_item_element
|
58
62
|
|
59
63
|
def element_text(element)
|
60
64
|
element.xpath('.//text()').to_html.strip
|
61
65
|
end
|
62
66
|
|
63
|
-
def reference_title(
|
64
|
-
[
|
65
|
-
|
66
|
-
|
67
|
-
|
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(' ')
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
71
75
|
private
|
72
76
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
'<br />'.html_safe
|
77
|
-
end
|
78
|
-
|
79
|
-
def related_item_label(item)
|
80
|
-
if displayLabel(item)
|
81
|
-
displayLabel(item)
|
77
|
+
def related_item_label(related_item_element)
|
78
|
+
if displayLabel(related_item_element)
|
79
|
+
displayLabel(related_item_element)
|
82
80
|
else
|
83
81
|
case
|
84
|
-
when
|
82
|
+
when related_item_element.location?
|
85
83
|
return I18n.t('mods_display.location')
|
86
|
-
when
|
84
|
+
when related_item_element.reference?
|
87
85
|
return I18n.t('mods_display.referenced_by')
|
88
86
|
end
|
89
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?
|
@@ -8,10 +8,10 @@ module ModsDisplay
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def fields
|
11
|
-
return_values =
|
11
|
+
return_values = sorted_title_info_elements.map do |title_info_element|
|
12
12
|
ModsDisplay::Values.new(
|
13
|
-
label: displayLabel(
|
14
|
-
values: [assemble_title(
|
13
|
+
label: displayLabel(title_info_element) || title_label(title_info_element),
|
14
|
+
values: [assemble_title(title_info_element)]
|
15
15
|
)
|
16
16
|
end
|
17
17
|
collapse_fields(return_values)
|
@@ -20,50 +20,50 @@ module ModsDisplay
|
|
20
20
|
private
|
21
21
|
|
22
22
|
# If there is a node with usage="primary", then it should come first.
|
23
|
-
def
|
24
|
-
Array(@
|
23
|
+
def sorted_title_info_elements
|
24
|
+
Array(@stanford_mods_elements).sort_by { |title_info_element| title_info_element['usage'] == 'primary' ? 0 : 1 }
|
25
25
|
end
|
26
26
|
|
27
27
|
def delimiter
|
28
28
|
'<br />'.html_safe
|
29
29
|
end
|
30
30
|
|
31
|
-
def assemble_title(
|
31
|
+
def assemble_title(title_info_element)
|
32
32
|
title = ''
|
33
33
|
previous_element = nil
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
next if
|
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
38
|
|
39
|
-
delimiter = title_delimiter(title, previous_element,
|
39
|
+
delimiter = title_delimiter(title, previous_element, child)
|
40
40
|
|
41
41
|
title += delimiter if delimiter
|
42
|
-
title +=
|
42
|
+
title += text
|
43
43
|
|
44
|
-
previous_element =
|
44
|
+
previous_element = child
|
45
45
|
end
|
46
46
|
|
47
|
-
full_title = if
|
48
|
-
[uniform_title_name_part(
|
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
49
|
else
|
50
50
|
title
|
51
51
|
end
|
52
52
|
linked_title(full_title)
|
53
53
|
end
|
54
54
|
|
55
|
-
def title_delimiter(title, previous_element,
|
55
|
+
def title_delimiter(title, previous_element, child)
|
56
56
|
if title.empty? || title.end_with?(' ')
|
57
57
|
nil
|
58
58
|
elsif previous_element&.name == 'nonSort' && title.end_with?('-', '\'')
|
59
59
|
nil
|
60
60
|
elsif title.end_with?('.', ',', ':', ';')
|
61
61
|
' '
|
62
|
-
elsif
|
62
|
+
elsif child.name == 'subTitle'
|
63
63
|
' : '
|
64
|
-
elsif
|
64
|
+
elsif child.name == 'partName' && previous_element.name == 'partNumber'
|
65
65
|
', '
|
66
|
-
elsif
|
66
|
+
elsif child.name == 'partNumber' || child.name == 'partName'
|
67
67
|
'. '
|
68
68
|
else
|
69
69
|
' '
|
data/lib/mods_display/html.rb
CHANGED
data/lib/mods_display/version.rb
CHANGED
data/lib/mods_display.rb
CHANGED
@@ -19,6 +19,7 @@ require 'mods_display/fields/date_created'
|
|
19
19
|
require 'mods_display/fields/date_captured'
|
20
20
|
require 'mods_display/fields/date_issued'
|
21
21
|
require 'mods_display/fields/date_modified'
|
22
|
+
require 'mods_display/fields/date_other'
|
22
23
|
require 'mods_display/fields/date_valid'
|
23
24
|
require 'mods_display/fields/description'
|
24
25
|
require 'mods_display/fields/edition'
|
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-12-
|
11
|
+
date: 2023-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stanford-mods
|
@@ -211,6 +211,7 @@ files:
|
|
211
211
|
- lib/mods_display/fields/date_created.rb
|
212
212
|
- lib/mods_display/fields/date_issued.rb
|
213
213
|
- lib/mods_display/fields/date_modified.rb
|
214
|
+
- lib/mods_display/fields/date_other.rb
|
214
215
|
- lib/mods_display/fields/date_valid.rb
|
215
216
|
- lib/mods_display/fields/description.rb
|
216
217
|
- lib/mods_display/fields/edition.rb
|
@@ -261,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
261
262
|
- !ruby/object:Gem::Version
|
262
263
|
version: '0'
|
263
264
|
requirements: []
|
264
|
-
rubygems_version: 3.
|
265
|
+
rubygems_version: 3.4.13
|
265
266
|
signing_key:
|
266
267
|
specification_version: 4
|
267
268
|
summary: The MODS Display gem allows implementers to configure a customized display
|