Class: Relaton::Render::Citations

Inherits:
Object
  • Object
show all
Defined in:
lib/relaton/render/general/citations.rb

Instance Method Summary collapse

Constructor Details

#initialize(opt = {}) ⇒ Citations

Returns a new instance of Citations.



4
5
6
7
8
9
10
11
# File 'lib/relaton/render/general/citations.rb', line 4

def initialize(opt = {})
  # invoking i18n hash, but we preference the specific renderer's i18n
  @i18n = opt[:i18n]
  @lang = opt[:lang] # document lang and script
  @script = opt[:script]
  # hash of renderers, to be applied to specific citation by selector
  @renderer = opt[:renderer]
end

Instance Method Details

#add_date_accessed(cite, uri, status) ⇒ Object



54
55
56
57
58
59
60
61
62
63
# File 'lib/relaton/render/general/citations.rb', line 54

def add_date_accessed(cite, uri, status)
  r = renderer(cite)
  if status
    cite[:data][:date_accessed] = { on: ::Date.today.to_s }
    cite[:data] = r.fieldsklass.new(renderer: r)
      .compound_fields_format(cite[:data])
  else
    r.url_warn(uri)
  end
end

#author_date_breakdown(ret) ⇒ Object



119
120
121
122
123
124
125
# File 'lib/relaton/render/general/citations.rb', line 119

def author_date_breakdown(ret)
  ret.each_with_object({}) do |b, m|
    m[b[:author]] ||= {}
    m[b[:author]][b[:date]] ||= []
    m[b[:author]][b[:date]] << b
  end
end

#author_date_to_hash(ret) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
# File 'lib/relaton/render/general/citations.rb', line 155

def author_date_to_hash(ret)
  ret.each_with_object({}) do |(_k, v), m|
    v.each_value do |v1|
      v1.each do |b|
        m[b[:id]] = { author: @i18n.select(b[:data]).l10n(b[:author]),
                      date: b[:date], citation: {},
                      data: b[:data], type: b[:type] }
      end
    end
  end
end

#citations(ret) ⇒ Object

TODO: configure how multiple ids are joined, from template?



91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/relaton/render/general/citations.rb', line 91

def citations(ret)
  ret = disambig_author_date_citations(ret)
  ret.each_value do |b|
    i = @i18n.select(b[:data])
    b[:citation][:default] =
      i.l10n(b[:data][:authoritative_identifier]&.first || "")
    b[:citation][:short] = i.l10n(renderer(b).citeshorttemplate
      .render(b[:data].merge(citestyle: "short"), b[:data]))
    citations_iterate_cite_styles(b, i)
  end
  ret
end

#citations_iterate_cite_styles(bib, i18n) ⇒ Object



104
105
106
107
108
109
110
111
112
# File 'lib/relaton/render/general/citations.rb', line 104

def citations_iterate_cite_styles(bib, i18n)
  r = renderer(bib)
  r.citetemplate.citation_styles.each do |style|
    bib[:citation][style] =
      i18n.l10n(r.citetemplate
      .render(bib.merge(citestyle: style)
      .merge(bib[:data]), bib[:data]))
  end
end

#disambig_author_date_citations(ret) ⇒ Object

takes array of { id, type, author, date, ord, data }



115
116
117
# File 'lib/relaton/render/general/citations.rb', line 115

def disambig_author_date_citations(ret)
  author_date_to_hash(suffix_date(sort_ord(author_date_breakdown(ret))))
end

#enhance_data(cites) ⇒ Object



27
28
29
30
31
32
33
34
# File 'lib/relaton/render/general/citations.rb', line 27

def enhance_data(cites)
  ret = extract_uris_for_lookup(cites)
  ret.empty? and return
  # functionality removed: date needs to be given explicitly
  # @renderer.urls_exist_concurrent(ret.keys).each do |k, v|
  # ret[k].each { |u| add_date_accessed(cites[u], k, v) }
  # end
end

#extract_uri_for_lookup(cite) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/relaton/render/general/citations.rb', line 44

def extract_uri_for_lookup(cite)
  t = renderer(cite).renderer(cite[:type] || "misc").template_raw
  c = cite[:data]
  t.is_a?(String) or return
  (/\{\{\s*date_accessed\s*\}\}/.match?(t) &&
  /\{\{\s*uri\s*\}\}/.match?(t) &&
  c[:uri_raw] && !c[:date_accessed]) or return
  c[:uri_raw]
end

#extract_uris_for_lookup(cites) ⇒ Object



36
37
38
39
40
41
42
# File 'lib/relaton/render/general/citations.rb', line 36

def extract_uris_for_lookup(cites)
  cites.each_with_object({}) do |(k, v), m|
    u = extract_uri_for_lookup(v) or next
    m[u] ||= []
    m[u] << k
  end
end

#render(ret) ⇒ Object

takes array of { id, type, author, date, ord, data }



18
19
20
21
22
23
24
25
# File 'lib/relaton/render/general/citations.rb', line 18

def render(ret)
  cites = citations(ret)
  enhance_data(cites)
  cites.each_key do |k|
    cites[k] = render1(cites[k])
  end
  cites
end

#render1(cit) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/relaton/render/general/citations.rb', line 65

def render1(cit)
  ref, ref1, r = render1_prep(cit)
  i = @i18n.select(cit[:data])
  cit[:formattedref] =
    r.valid_parse(i.l10n(ref1))
  cit[:citation][:full] = r.valid_parse(i.l10n(ref))
  %i(type data renderer).each { |x| cit.delete(x) }
  cit
end

#render1_prep(cit) ⇒ Object



80
81
82
83
84
85
86
87
88
# File 'lib/relaton/render/general/citations.rb', line 80

def render1_prep(cit)
  r = renderer(cit)
  ref = r.renderer(cit[:type] || "misc").render(cit[:data], cit[:data])
  final = @i18n.select(cit[:data]).get
    .dig("punct", "biblio-terminator") || "."
  ref1 = ref
  use_terminator?(ref, final, cit) and ref1 += final
  [ref, ref1, r]
end

#renderer(_cite) ⇒ Object



13
14
15
# File 'lib/relaton/render/general/citations.rb', line 13

def renderer(_cite)
  @renderer[:default]
end

#sort_ord(ret) ⇒ Object



127
128
129
130
131
132
133
# File 'lib/relaton/render/general/citations.rb', line 127

def sort_ord(ret)
  ret.each do |author, v|
    v.each_key do |date|
      ret[author][date].sort_by! { |a| a[:ord] }
    end
  end
end

#suffix_date(ret) ⇒ Object



135
136
137
138
139
140
141
142
143
144
# File 'lib/relaton/render/general/citations.rb', line 135

def suffix_date(ret)
  ret.each do |k, v|
    v.each do |k1, v1|
      next if v1.reject { |b| b[:date].nil? }.size < 2

      suffix_date1(ret, k, k1)
    end
  end
  ret
end

#suffix_date1(ret, key1, key2) ⇒ Object



146
147
148
149
150
151
152
153
# File 'lib/relaton/render/general/citations.rb', line 146

def suffix_date1(ret, key1, key2)
  key1.nil? and return
  ret[key1][key2].each_with_index do |b, i|
    b[:date].nil? and next
    b[:date] += ("a".ord + i).chr.to_s
    b[:data][:date] = b[:date]
  end
end

#use_terminator?(ref, final, _cit) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
78
# File 'lib/relaton/render/general/citations.rb', line 75

def use_terminator?(ref, final, _cit)
  !ref || ref.empty? and return false
  !ref.end_with?(final)
end