Module: CocinaDisplay::Concerns::Contributors

Included in:
CocinaDisplay::CocinaRecord, RelatedResource
Defined in:
lib/cocina_display/concerns/contributors.rb

Overview

Methods for finding and formatting names for contributors

Instance Method Summary collapse

Instance Method Details

#additional_contributor_names(with_date: false) ⇒ Array<String>

All contributor names except the main one, formatted for display.

Parameters:

  • with_date (Boolean) (defaults to: false)

    Include life dates, if present

Returns:

  • (Array<String>)


20
21
22
# File 'lib/cocina_display/concerns/contributors.rb', line 20

def additional_contributor_names(with_date: false)
  additional_contributors.flat_map { |c| c.display_names(with_date: with_date) }.compact
end

#additional_contributorsArray<Contributor>

All contributors except the main one.

Returns:

  • (Array<Contributor>)


134
135
136
137
# File 'lib/cocina_display/concerns/contributors.rb', line 134

def additional_contributors
  return [] if contributors.empty? || contributors.one?
  contributors - [main_contributor]
end

#conference_contributor_namesArray<String>

All names of contributors that are conferences, formatted for display.

Returns:

  • (Array<String>)


53
54
55
# File 'lib/cocina_display/concerns/contributors.rb', line 53

def conference_contributor_names
  contributors.filter(&:conference?).flat_map(&:display_names).compact
end

#contributor_display_dataArray<DisplayData>

DisplayData for Contributors, one per role. Contributors with no role are grouped under a default heading.

Returns:



86
87
88
89
90
91
92
# File 'lib/cocina_display/concerns/contributors.rb', line 86

def contributor_display_data
  contributors_by_role.map do |role, contributors|
    label = I18n.t(role, scope: "cocina_display.contributor.role",
      default: role&.capitalize || I18n.t("default", scope: "cocina_display.contributor.role"))
    DisplayData.new(label: label, objects: contributors)
  end
end

#contributor_names_by_role(with_date: false) ⇒ Hash<String, Array<String>>

A hash mapping role names to the names of contributors with that role.

Parameters:

  • with_date (Boolean) (defaults to: false)

    Include life dates, if present

Returns:

  • (Hash<String, Array<String>>)


60
61
62
63
64
# File 'lib/cocina_display/concerns/contributors.rb', line 60

def contributor_names_by_role(with_date: false)
  contributors_by_role(with_date: with_date)
    .transform_values { |contributor_list| contributor_list.flat_map { |contributor| contributor.display_names(with_date: with_date) }.compact_blank }
    .compact_blank
end

#contributorsArray<Contributor>

All contributors for the object, including authors, editors, etc. Checks both description.contributor and description.event.contributor.

Returns:

  • (Array<Contributor>)


107
108
109
110
111
112
# File 'lib/cocina_display/concerns/contributors.rb', line 107

def contributors
  @contributors ||= Enumerator::Chain.new(
    path("$.description.contributor.*"),
    path("$.description.event.*.contributor.*")
  ).map { |c| CocinaDisplay::Contributors::Contributor.new(c) }
end

#contributors_by_role(with_date: false) ⇒ Hash<[String,NilClass], Array<Contributor>>

A hash mapping role names to the names of contributors with that role.

Parameters:

  • with_date (Boolean) (defaults to: false)

    Include life dates, if present

Returns:

  • (Hash<[String,NilClass], Array<Contributor>>)


69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/cocina_display/concerns/contributors.rb', line 69

def contributors_by_role(with_date: false)
  @contributors_by_role ||= contributors.each_with_object({}) do |contributor, hash|
    if contributor.roles.empty?
      hash[nil] ||= []
      hash[nil] << contributor
    else
      contributor.roles.each do |role|
        hash[role.to_s] ||= []
        hash[role.to_s] << contributor
      end
    end
  end
end

#impersonal_contributor_namesArray<String>

All names of non-person contributors, formatted for display. This includes organizations, conferences, families, etc.



41
42
43
# File 'lib/cocina_display/concerns/contributors.rb', line 41

def impersonal_contributor_names
  contributors.reject(&:person?).flat_map(&:display_names).compact
end

#main_contributorContributor?

Object representing the main contributor. Selected according to the following rules:

  1. If there are contributors marked as primary, use the first one.

  2. If there are no primary contributors, use the first contributor with no role.

  3. If there are no contributors without a role, use the first contributor.

Returns:

  • (Contributor)
  • (nil)

    if there are no contributors at all



128
129
130
# File 'lib/cocina_display/concerns/contributors.rb', line 128

def main_contributor
  contributors.find(&:primary?).presence || contributors.find { |c| !c.role? }.presence || contributors.first
end

#main_contributor_name(with_date: false) ⇒ String?

The main contributor’s name, formatted for display.

Examples:

record.main_contributor_name #=> "Smith, John"

with date

record.main_contributor_name(with_date: true) #=> "Smith, John, 1970-2020"

Parameters:

  • with_date (Boolean) (defaults to: false)

    Include life dates, if present

Returns:

  • (String)
  • (nil)

    if no main contributor is found



13
14
15
# File 'lib/cocina_display/concerns/contributors.rb', line 13

def main_contributor_name(with_date: false)
  main_contributor&.display_name(with_date: with_date)
end

#organization_contributor_namesArray<String>

All names of contributors that are organizations, formatted for display.

Returns:

  • (Array<String>)


47
48
49
# File 'lib/cocina_display/concerns/contributors.rb', line 47

def organization_contributor_names
  contributors.filter(&:organization?).flat_map(&:display_names).compact
end

#person_contributor_names(with_date: false) ⇒ Array<String>

All names of contributors who are people, formatted for display.

Parameters:

  • with_date (Boolean) (defaults to: false)

    Include life dates, if present

Returns:

  • (Array<String>)


33
34
35
# File 'lib/cocina_display/concerns/contributors.rb', line 33

def person_contributor_names(with_date: false)
  contributors.filter(&:person?).flat_map { |c| c.display_names(with_date: with_date) }.compact
end

#publisher_contributorsArray<Contributor>

All contributors with a “publisher” role.

Returns:

  • (Array<Contributor>)

See Also:

  • Contributor#publisher?


117
118
119
# File 'lib/cocina_display/concerns/contributors.rb', line 117

def publisher_contributors
  contributors.filter(&:publisher?)
end

#publisher_namesArray<String>

All names of publishers, formatted for display.

Returns:

  • (Array<String>)


26
27
28
# File 'lib/cocina_display/concerns/contributors.rb', line 26

def publisher_names
  publisher_contributors.flat_map(&:display_names).compact
end

#sort_contributor_nameString

A string value for sorting by contributor that sorts missing values last. Appends the sort title to break ties between contributor names. Ignores punctuation and leading/trailing spaces.

Returns:

  • (String)


98
99
100
101
102
# File 'lib/cocina_display/concerns/contributors.rb', line 98

def sort_contributor_name
  sort_name = main_contributor&.display_name || "\u{10FFFF}"
  sort_name_title = [sort_name, sort_title].join(" ")
  sort_name_title.gsub(/[[:punct:]]*/, "").strip
end