Module: Europeana::Blacklight::Document::LangMaps

Included in:
Europeana::Blacklight::Document
Defined in:
app/models/europeana/blacklight/document/lang_maps.rb

Overview

Methods for working with “LangMap” data types in API JSON responses

Constant Summary collapse

DEPRECATED_ISO_LANG_CODES =
%w(in iw jaw ji jw mo mol scc scr sh)
NON_ISO_LANG_CODES =
TODO:

Empty key acceptance is a workaround for malformed API data output; remove when fixed at source

Special keys API may return in a LangMap, not ISO codes

['def', '']

Instance Method Summary collapse

Instance Method Details

#dereferenced_lang_map_value(value) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/models/europeana/blacklight/document/lang_maps.rb', line 47

def dereferenced_lang_map_value(value)
  return nil if value.nil?

  if value.is_a?(Array)
    return value.map { |v| dereferenced_lang_map_value(v) }
  end

  return value unless value.is_a?(String)

  concept = root.fetch('concepts', []).detect { |c| c[:about] == value }
  if concept.present? && concept.key?(:prefLabel)
    localize_lang_map(concept[:prefLabel])
  else
    return value
  end
end

#known_lang_map_key?(key) ⇒ Boolean

Returns:

  • (Boolean)


22
23
24
25
26
27
# File 'app/models/europeana/blacklight/document/lang_maps.rb', line 22

def known_lang_map_key?(key)
  key = key.dup.downcase
  DEPRECATED_ISO_LANG_CODES.include?(key) ||
    NON_ISO_LANG_CODES.include?(key) ||
    !ISO_639.find(key.split('-').first).nil?
end

#lang_map?(obj) ⇒ Boolean

TODO:

Are three-letter language codes valid in EDM?

Returns:

  • (Boolean)


17
18
19
20
# File 'app/models/europeana/blacklight/document/lang_maps.rb', line 17

def lang_map?(obj)
  return false unless obj.is_a?(Hash)
  obj.keys.map(&:to_s).all? { |key| known_lang_map_key?(key) }
end

#lang_map_value(lang_map, locale) ⇒ Object



41
42
43
44
45
# File 'app/models/europeana/blacklight/document/lang_maps.rb', line 41

def lang_map_value(lang_map, locale)
  keys = salient_lang_map_keys(lang_map, locale)
  return nil unless keys.present?
  keys.map { |k| lang_map[k] }.flatten.uniq
end

#localize_lang_map(lang_map) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
# File 'app/models/europeana/blacklight/document/lang_maps.rb', line 29

def localize_lang_map(lang_map)
  if lang_map.is_a?(Array)
    return lang_map.map { |l| localize_lang_map(l) }
  end

  return lang_map unless lang_map?(lang_map)

  lang_map_value(lang_map, ::I18n.locale.to_s) ||
    lang_map_value(lang_map, ::I18n.default_locale.to_s) ||
    lang_map.values
end