Class: PennMARC::Identifier

Inherits:
Helper
  • Object
show all
Defined in:
lib/pennmarc/helpers/identifier.rb

Overview

Parser methods for extracting identifier values.

Class Method Summary collapse

Methods included from Util

#datafield_and_linked_alternate, #join_and_squish, #join_subfields, #linked_alternate, #linked_alternate_not_6_or_8, #prefixed_subject_and_alternate, #remove_paren_value_from_subfield_i, #subfield_defined?, #subfield_in?, #subfield_not_in?, #subfield_undefined?, #subfield_value?, #subfield_value_in?, #subfield_value_not_in?, #subfield_values, #subfield_values_for, #substring_after, #substring_before, #translate_relator, #trim_trailing, #valid_subject_genre_source_code?

Class Method Details

.doi_show(record) ⇒ Array<String>

Retrieve DOI values stored in 024. Penn MARC records give the first indicator a value of ‘7’ and ǂ2 a value of ‘doi’ to denote that ǂa is a doi.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


149
150
151
152
153
154
155
156
157
158
# File 'lib/pennmarc/helpers/identifier.rb', line 149

def doi_show(record)
  record.fields('024').filter_map do |field|
    # skip unless indicator1 is '7'
    next unless field.indicator1.in?(%w[7])
    # skip unless ǂ2 is the string literal 'doi'
    next unless subfield_value_in?(field, '2', %w[doi])

    join_subfields(field, &subfield_in?(%w[a]))
  end
end

.fingerprint_show(record) ⇒ Array<String>

Retrieve fingerprint for display from the 026 field

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


139
140
141
142
143
# File 'lib/pennmarc/helpers/identifier.rb', line 139

def fingerprint_show(record)
  record.fields('026').map do |field|
    join_subfields(field, &subfield_not_in?(%w[2 5 6 8]))
  end
end

.isbn_show(record) ⇒ Array<String>

Get ISBN values for display from the 020 field and related 880 field.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


36
37
38
39
40
41
42
# File 'lib/pennmarc/helpers/identifier.rb', line 36

def isbn_show(record)
  isbn_values = record.fields('020').filter_map do |field|
    joined_isbn = join_subfields(field, &subfield_in?(%w[a]))
    joined_isbn.presence
  end
  isbn_values + linked_alternate(record, '020', &subfield_in?(%w[a]))
end

.issn_show(record) ⇒ Array<String>

Get ISSN values for display from the 022 field and related 880 field.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


49
50
51
52
53
54
55
# File 'lib/pennmarc/helpers/identifier.rb', line 49

def issn_show(record)
  issn_values = record.fields('022').filter_map do |field|
    joined_issn = join_subfields(field, &subfield_in?(%w[a]))
    joined_issn.presence
  end
  issn_values + linked_alternate(record, '022', &subfield_in?(%w[a]))
end

.isxn_search(record) ⇒ Array<String>

Get normalized ISXN values for searching of a record. Values aggregated from subfield ‘a’ and ‘z’ of the 020 field, and subfield ‘a’, ‘l’, and ‘z’ of the the 022 field.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


21
22
23
24
25
26
27
28
29
# File 'lib/pennmarc/helpers/identifier.rb', line 21

def isxn_search(record)
  record.fields(%w[020 022]).filter_map { |field|
    if field.tag == '020'
      field.filter_map { |subfield| normalize_isbn(subfield.value) if subfield_in?(%w[a z]).call(subfield) }
    else
      field.filter_map { |subfield| subfield.value if subfield_in?(%w[a l m y z]).call(subfield) }
    end
  }.flatten.uniq
end

.mmsid(record) ⇒ String

Get Alma MMS ID value

Parameters:

  • record (MARC::Record)

Returns:

  • (String)


11
12
13
# File 'lib/pennmarc/helpers/identifier.rb', line 11

def mmsid(record)
  record.fields('001').first.value
end

.oclc_id_search(record) ⇒ Array<String>

Retrieve valid and invalid numeric OCLC IDs from 035 field for search.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/pennmarc/helpers/identifier.rb', line 84

def oclc_id_search(record)
  record.fields('035').flat_map do |field|
    field.filter_map do |subfield|
      # skip unless subfield 'a' or 'z'
      next unless subfield.code.in?(%w[a z])

      # skip unless subfield value matches OCLC ID
      next unless subfield_is_oclc?(subfield)

      # search for numeric part of oclc id
      match = match_oclc_number(subfield)

      # skip unless search to find numeric part of oclc id has a match
      next unless match

      match[1]
    end
  end
end

.oclc_id_show(record) ⇒ String?

Get numeric OCLC ID of first 035 field with an OCLC ID defined in subfield ‘a’.

Parameters:

  • record (MARC::Record)

Returns:

  • (String, nil)


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/pennmarc/helpers/identifier.rb', line 61

def oclc_id_show(record)
  ids = Array.wrap(record.fields('035')
                     .find { |field| field.any? { |subfield| subfield_a_is_oclc?(subfield) } })
  ids.flat_map { |field|
    field.filter_map do |subfield|
      # skip unless subfield 'a' is an oclc id value
      next unless subfield_a_is_oclc?(subfield)

      # search for numeric part of oclc id (e.g. '610094484' in '(OCoLC)ocn610094484')
      match = match_oclc_number(subfield)

      # skip unless search to find numeric part of oclc id has a match
      next unless match

      match[1]
    end
  }.first
end

.publisher_number_search(record) ⇒ Array<String>

Get publisher issued identifiers for searching of a record. Values extracted from fields 024 and 028.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<String>)


129
130
131
132
133
134
# File 'lib/pennmarc/helpers/identifier.rb', line 129

def publisher_number_search(record)
  record.fields(%w[024 028]).filter_map do |field|
    joined_identifiers = join_subfields(field, &subfield_in?(%w[a]))
    joined_identifiers.presence
  end
end

.publisher_number_show(record) ⇒ Array<string>

Get publisher issued identifiers from fields 024, 028, and related 880 field. We do not return DOI values stored in 024 ǂ2, see doi_show for parsing DOI values.

Parameters:

  • record (MARC::Record)

Returns:

  • (Array<string>)


111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/pennmarc/helpers/identifier.rb', line 111

def publisher_number_show(record)
  record.fields(%w[024 028 880]).filter_map do |field|
    next if field.tag == '880' && subfield_value_not_in?(field, '6', %w[024 028])

    # do not return doi values from 024 ǂ2
    if field.tag == '024' && subfield_value_in?(field, '2', %w[doi])
      join_subfields(field, &subfield_not_in?(%w[a 2 5 6])).presence
    else
      join_subfields(field, &subfield_not_in?(%w[5 6])).presence
    end
  end
end