relaton-render 3.0.0.pre.alpha.4 → 3.0.0.pre.alpha.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee63b0602a2be7f4c00c3d0fee7795387cac5b695037ffec618271b380ce6098
4
- data.tar.gz: 1bd28b75e32a979ba82cedc675851d61c26769010c62823a85180a5c8236a8a5
3
+ metadata.gz: 8cf356647bbf5280c9c9e4300c861917b428fc8d248db8a94b3c7b66916a0c01
4
+ data.tar.gz: 81bbe019e929ae84c4db8ca0808a10029c55dce0f61c94e072aa03c9d01127be
5
5
  SHA512:
6
- metadata.gz: '070696e6d0f15855bb40365c0e5953f05a80ea0fc0b453b2c1b62da371d9bfa0459c9d7e593ba79add4227c4ecc97af247561cd78345d835a5262f9be30ee651'
7
- data.tar.gz: 660e8b5815000dd129e2893f39584d64999eda4d863c704ba9a4ee1e8cda9d68bdefbdfb8675a2aea25309a649709d7fa24458e5682c27c5932344cbe5e8ceed
6
+ metadata.gz: 61831187b3aba40f2e3701e00b0af1d89e25f219dc735cbb1d36877a0431c0e548776b39d1b90ee8606dfdb4968962a58f61c82f83ba734b9ba4756bb02cd11e
7
+ data.tar.gz: 640b3659f2bd48a9b6cfb46c063f8d4ed7ecfe15fef2c7961c208875b56a9c7514a0641edcad9e3f335ba7fab91581044d832b737944c9a8c7a9cd134d77cb23
@@ -29,6 +29,14 @@ module Relaton
29
29
  value&.content.to_s
30
30
  end
31
31
 
32
+ # Localizable values scoped to the render language: the variants
33
+ # declared in that language, or all of them when none matches
34
+ def titles_in_lang(values)
35
+ titles = Array(values)
36
+ in_lang = titles.select { |t| Array(t.language).include?(@i18n.lang) }
37
+ in_lang.empty? ? titles : in_lang
38
+ end
39
+
32
40
  def contributors(role)
33
41
  Array(@model.contributor).select { |c| has_role?(c, role) }
34
42
  end
@@ -40,7 +40,8 @@ module Relaton
40
40
  def host_title_text
41
41
  return localized(relation&.description) if host.nil?
42
42
 
43
- Array(host.title).map { |t| localized(t) }.join(" ").strip
43
+ titles_in_lang(host.title).map { |t| localized(t) }
44
+ .join(" ").strip
44
45
  end
45
46
 
46
47
  def host_title
@@ -36,7 +36,8 @@ module Relaton
36
36
  end
37
37
 
38
38
  def series_title
39
- Array(series&.title).map { |t| localized(t) }.join(" ").strip
39
+ titles_in_lang(series&.title).map { |t| localized(t) }
40
+ .join(" ").strip
40
41
  end
41
42
 
42
43
  def number
@@ -33,10 +33,14 @@ module Relaton
33
33
  .include?(Kinds.kind_for(@model.type))
34
34
  end
35
35
 
36
+ # A typed main title wins; an untyped title is main by
37
+ # default, but yields to a typed one
36
38
  def main_title
37
- t = Array(@model.title).find { |x| (x.type || "main") == "main" } ||
38
- Array(@model.title).first
39
- localized(t)
39
+ titles = Array(@model.title)
40
+ mains = titles.select { |x| x.type == "main" }
41
+ mains = titles.select { |x| x.type.nil? } if mains.empty?
42
+ mains = titles if mains.empty?
43
+ localized(titles_in_lang(mains).first)
40
44
  end
41
45
  end
42
46
  end
@@ -35,7 +35,18 @@ module Relaton
35
35
  def element_field(slot)
36
36
  element = Elements.build(slot, @model, style: @style, i18n: @i18n)
37
37
  text = element.render.to_s
38
- Template::Field[element.present? && !text.empty?, text]
38
+ if element.present? && !text.empty?
39
+ return Template::Field[true, text]
40
+ end
41
+
42
+ fallback = @style.fallback_for(item_kind, slot)
43
+ return Template::Field[true, fallback] if fallback
44
+
45
+ Template::Field[false, ""]
46
+ end
47
+
48
+ def item_kind
49
+ Kinds.kind_for(@model.type)
39
50
  end
40
51
 
41
52
  def name_fields
@@ -16,15 +16,19 @@ module Relaton
16
16
  "MRN" => ->(content) { content },
17
17
  }.freeze
18
18
 
19
+ # Flavor-registered kinds, consulted before the built-ins; the
20
+ # registry is process-wide by design
21
+ OVERRIDES = {}
22
+
19
23
  class << self
20
24
  def register(type, kind)
21
- KINDS[type] = kind
25
+ OVERRIDES[type] = kind
22
26
  kind
23
27
  end
24
28
 
25
29
  def render(docidentifier)
26
30
  content = docidentifier.content.to_s
27
- kind = KINDS[docidentifier.type]
31
+ kind = OVERRIDES[docidentifier.type] || KINDS[docidentifier.type]
28
32
  kind ? kind.call(content) : content
29
33
  end
30
34
  end
@@ -12,6 +12,7 @@ module Relaton
12
12
  attribute :series, :string
13
13
  attribute :title, :string
14
14
  attribute :home, :boolean
15
+ attribute :fallbacks, :hash, default: -> { {} }
15
16
 
16
17
  key_value do
17
18
  map "type", to: :type
@@ -19,6 +20,7 @@ module Relaton
19
20
  map "series", to: :series
20
21
  map "title", to: :title
21
22
  map "home", to: :home
23
+ map "fallbacks", to: :fallbacks
22
24
  end
23
25
  end
24
26
  end
@@ -52,6 +52,15 @@ module Relaton
52
52
  candidates.first&.template || templates.reference
53
53
  end
54
54
 
55
+ def type_template_for(type)
56
+ per_type.find { |t| t.type == type.to_s }
57
+ end
58
+
59
+ # The absent-slot replacement text declared for a type, when any
60
+ def fallback_for(type, slot)
61
+ type_template_for(type)&.fallbacks&.[](slot.to_s)
62
+ end
63
+
55
64
  def title_form_for(type)
56
65
  per_type.lazy.select { |t| t.type == type.to_s }
57
66
  .find { |t| t.title && !t.title.empty? }&.title
@@ -1,5 +1,5 @@
1
1
  module Relaton
2
2
  module Render
3
- VERSION = "3.0.0.pre.alpha.4".freeze
3
+ VERSION = "3.0.0.pre.alpha.5".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton-render
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.pre.alpha.4
4
+ version: 3.0.0.pre.alpha.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.