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.
- 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
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/.rspec
ADDED
data/README.md
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
# ModsDisplay
|
2
2
|
|
3
|
-
A gem for displaying MODS Metadata in a configurable way.
|
3
|
+
A gem for displaying MODS Metadata in a configurable way.
|
4
|
+
|
5
|
+
This gem is used to centralize the display logic of MODS metadata by creating html fragments such as
|
6
|
+
|
7
|
+
```
|
8
|
+
<dt>Publisher</dt>
|
9
|
+
<dd>Diagon Alley Publications</dd>
|
10
|
+
```
|
11
|
+
|
12
|
+
which can be styled in consuming apps such as SearchWorks or Exhibits.
|
4
13
|
|
5
14
|
## Demo
|
6
15
|
|
@@ -20,23 +29,6 @@ Or install it yourself as:
|
|
20
29
|
|
21
30
|
$ gem install mods_display
|
22
31
|
|
23
|
-
## Release/Upgrade Notes
|
24
|
-
|
25
|
-
#### v0.5.0
|
26
|
-
There are three major changes in this version.
|
27
|
-
|
28
|
-
1. RelatedItem nodes with a type of `constituent` or `host` are now treated separately and will render the full MODS display of any nested metadata. If accessing the `ModsDisplay::Values` directly through their accessors (e.g. custom grouping), this new metadata is available under `.nested_related_items`.
|
29
|
-
* _**Note:** You may want to style and add some javascript toggling behavior (see exhibits for an example)._
|
30
|
-
2. Name nodes are now grouped/labeled by their role. If you were iterating over the names and splitting them out by their labels, that will need to change.
|
31
|
-
3. Table of contents/Summaries are now split on `--` and rendered as an unordered list.
|
32
|
-
* _**Note:** You may want to style this list._
|
33
|
-
|
34
|
-
#### v0.3.0
|
35
|
-
|
36
|
-
Labels now have internationalization support. We have added colons to the english labels due to certain languages' punctuation rules requiring different spacing between the label and colon.
|
37
|
-
|
38
|
-
Given that fact, you will want to update any pre 0.3.0 code that searches for elements by label in a way that would fail with the presence of a colon.
|
39
|
-
|
40
32
|
## Contributing
|
41
33
|
|
42
34
|
1. Fork it
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class RowFieldComponent < ViewComponent::Base
|
5
|
+
with_collection_parameter :field
|
6
|
+
|
7
|
+
def initialize(field:, delimiter: nil, label_html_attributes: {}, value_html_attributes: {}, value_transformer: nil)
|
8
|
+
super
|
9
|
+
|
10
|
+
@field = field
|
11
|
+
@delimiter = delimiter
|
12
|
+
@value_transformer = value_transformer
|
13
|
+
@label_html_attributes = label_html_attributes
|
14
|
+
@value_html_attributes = value_html_attributes
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :field, :delimiter, :label_html_attributes, :value_html_attributes
|
18
|
+
|
19
|
+
def render?
|
20
|
+
field.values.any?(&:present?)
|
21
|
+
end
|
22
|
+
|
23
|
+
def format_value(value)
|
24
|
+
if @value_transformer
|
25
|
+
@value_transformer.call(value)
|
26
|
+
else
|
27
|
+
helpers.format_mods_html(value, field: field)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def values
|
32
|
+
if delimiter
|
33
|
+
[safe_join(field.values.select(&:present?).map { |value| format_value(value) }, delimiter)]
|
34
|
+
else
|
35
|
+
field.values.select(&:present?).map { |value| format_value(value) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def label
|
40
|
+
field.label&.sub(/:$/, '')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -17,6 +17,14 @@ module ModsDisplay
|
|
17
17
|
render component.new(field: field, delimiter: delimiter, value_transformer: block)
|
18
18
|
end
|
19
19
|
|
20
|
+
def mods_record_definition_field(field, delimiter: nil, label_html_attributes: {}, &block)
|
21
|
+
render ModsDisplay::FieldComponent.new(field: field, delimiter: delimiter, label_html_attributes: label_html_attributes, value_transformer: block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def mods_record_row_field(field, delimiter: ', ', &block)
|
25
|
+
render ModsDisplay::RowFieldComponent.new(field: field, delimiter: delimiter, value_transformer: block)
|
26
|
+
end
|
27
|
+
|
20
28
|
# this returns a role's label and the display names for ModsDisplay:Name:Person
|
21
29
|
def mods_name_field(field)
|
22
30
|
mods_record_field(field) do |name|
|
@@ -41,12 +49,24 @@ module ModsDisplay
|
|
41
49
|
end
|
42
50
|
end
|
43
51
|
|
52
|
+
def mods_subject_row_field(field, delimiter: nil, &block)
|
53
|
+
mods_record_row_field(field, delimiter: delimiter) do |subject_line|
|
54
|
+
safe_join(link_mods_subjects(subject_line, &block), ' > ')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
44
58
|
def mods_genre_field(field, &block)
|
45
59
|
mods_record_field(field) do |genre_line|
|
46
60
|
link_to_mods_subject(genre_line, &block)
|
47
61
|
end
|
48
62
|
end
|
49
63
|
|
64
|
+
def mods_genre_row_field(field, delimiter: nil, &block)
|
65
|
+
mods_record_row_field(field, delimiter: delimiter) do |genre_line|
|
66
|
+
link_to_mods_subject(genre_line, &block)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
50
70
|
# @private
|
51
71
|
def link_mods_genres(genre, &block)
|
52
72
|
link_buffer = []
|
data/config/locales/en.yml
CHANGED
@@ -17,11 +17,14 @@ en:
|
|
17
17
|
creation_production_credits: "Creation/Production credits:"
|
18
18
|
date_captured: "Date captured:"
|
19
19
|
date_created: "Date created:"
|
20
|
+
date_issued: "Publication date:"
|
20
21
|
date_modified: "Date modified:"
|
22
|
+
date_other: "Other date:"
|
21
23
|
date_sequential_designation: "Date/Sequential designation:"
|
22
24
|
date_valid: "Date valid:"
|
23
25
|
digital_origin: "Digital origin:"
|
24
26
|
doi: "DOI:"
|
27
|
+
edition: "Edition:"
|
25
28
|
extent: "Extent:"
|
26
29
|
form: "Form:"
|
27
30
|
frequency: "Frequency:"
|
@@ -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,22 +3,20 @@
|
|
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
|
-
label:
|
19
|
+
label: displayLabel(field) || label || I18n.t('mods_display.map_data'),
|
22
20
|
values: [[scale, post_scale].compact.join(' ; ')]
|
23
21
|
)
|
24
22
|
end
|
@@ -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
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class Edition < Field
|
5
|
+
def fields
|
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
|
+
next unless edition_value.present?
|
9
|
+
|
10
|
+
# remove trailing spaces (thanks MARC, for catalog card formatting!)
|
11
|
+
edition_value.gsub!(%r{ */$}, '')
|
12
|
+
|
13
|
+
ModsDisplay::Values.new(
|
14
|
+
label: I18n.t('mods_display.edition'),
|
15
|
+
values: [edition_value],
|
16
|
+
field: self
|
17
|
+
)
|
18
|
+
end.compact
|
19
|
+
collapse_fields(return_fields)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -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,12 +54,54 @@ 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
|
|
57
64
|
def element_text(element)
|
58
65
|
element.xpath('.//text()').to_html.strip
|
59
66
|
end
|
67
|
+
|
68
|
+
# used for originInfo date fields, e.g. DateCreated, DateIssued ...
|
69
|
+
def date_fields(date_symbol)
|
70
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
71
|
+
date_values = Stanford::Mods::Imprint.new(origin_info_element).dates([date_symbol])
|
72
|
+
next unless date_values.present?
|
73
|
+
|
74
|
+
ModsDisplay::Values.new(
|
75
|
+
label: I18n.t("mods_display.#{date_symbol.to_s.underscore}"),
|
76
|
+
values: select_best_date(date_values),
|
77
|
+
field: self
|
78
|
+
)
|
79
|
+
end.compact
|
80
|
+
collapse_fields(return_fields)
|
81
|
+
end
|
82
|
+
|
83
|
+
# used for originInfo dates, e.g. for Imprint, DateCreated, DateIssued, etc.
|
84
|
+
def select_best_date(dates)
|
85
|
+
# ensure dates are unique with respect to their base values
|
86
|
+
dates = dates.group_by(&:base_value).map do |_value, group|
|
87
|
+
group.first if group.one?
|
88
|
+
|
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
|
93
|
+
end
|
94
|
+
|
95
|
+
# if any single dates are already part of a range, discard them
|
96
|
+
range_base_values = dates.select { |date| date.is_a?(Stanford::Mods::Imprint::DateRange) }
|
97
|
+
.map(&:base_values).flatten
|
98
|
+
dates = dates.reject { |date| range_base_values.include?(date.base_value) }
|
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
|
+
|
103
|
+
# output formatted dates with qualifiers, CE/BCE, etc.
|
104
|
+
dates.map(&:qualified_value)
|
105
|
+
end
|
60
106
|
end
|
61
107
|
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
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ModsDisplay
|
4
|
+
class Frequency < Field
|
5
|
+
def fields
|
6
|
+
return_fields = @stanford_mods_elements.map do |origin_info_element|
|
7
|
+
frequency_value = origin_info_element.frequency&.text&.strip
|
8
|
+
next unless frequency_value.present?
|
9
|
+
|
10
|
+
ModsDisplay::Values.new(
|
11
|
+
label: I18n.t('mods_display.frequency'),
|
12
|
+
values: [frequency_value],
|
13
|
+
field: self
|
14
|
+
)
|
15
|
+
end.compact
|
16
|
+
collapse_fields(return_fields)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -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
|