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
# File 'lib/relaton/render/general/citations.rb', line 4

def initialize(opt = {})
  @type = opt[:type]
  @i18n = opt[:i18n]
  @renderer = opt[:renderer]
end

Instance Method Details

#breakdown(ret) ⇒ Object



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

def 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

#citations(ret) ⇒ Object



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

def citations(ret)
  case @type
  when "author-date" then disambig_author_date_citations(ret)
  when nil then generic_citation(ret)
  else raise "Unimplemented citation type"
  end
end

#disambig_author_date_citations(ret) ⇒ Object

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



43
44
45
# File 'lib/relaton/render/general/citations.rb', line 43

def disambig_author_date_citations(ret)
  to_hash(suffix_date(sort_ord(breakdown(ret))))
end

#generic_citation(ret) ⇒ Object



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

def generic_citation(ret)
  ret.each_with_object({}) do |b, m|
    m[b[:id]] = { data_liquid: b[:data_liquid], type: b[:type],
                  citation: b[:data_liquid][:docidentifier] }
  end
end

#render(ret) ⇒ Object

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



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

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

#render1(cit) ⇒ Object



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

def render1(cit)
  r = @renderer.renderer(cit[:type] || "misc")
  cit[:formattedref] =
    @renderer.valid_parse(@i18n.l10n(r.render(cit[:data_liquid])))
  i(type data_liquid).each { |x| cit.delete(x) }
  cit
end

#sort_ord(ret) ⇒ Object



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

def sort_ord(ret)
  ret.each do |author, v|
    v.each_key do |date|
      ret[author][date].sort! { |a, b| a[:ord] <=> b[:ord] }
    end
  end
end

#suffix_date(ret) ⇒ Object



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

def suffix_date(ret)
  ret.each_value do |v|
    v.each_value do |v1|
      next if v1.size < 2

      v1.each_with_index do |b, i|
        b[:date] += ("a".ord + i).chr.to_s
        b[:data_liquid][:date] = b[:date]
      end
    end
  end
  ret
end

#to_hash(ret) ⇒ Object



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

def to_hash(ret)
  ret.each_with_object({}) do |(_k, v), m|
    v.each do |_k1, v1|
      v1.each do |b|
        m[b[:id]] = { author: b[:author], date: b[:date],
                      citation: "#{b[:author]} #{b[:date]}",
                      data_liquid: b[:data_liquid], type: b[:type] }
      end
    end
  end
end