Class: Relaton::Render::Citations
- Inherits:
-
Object
- Object
- Relaton::Render::Citations
- Defined in:
- lib/relaton/render/general/citations.rb
Instance Method Summary collapse
- #add_date_accessed(cite, uri, status) ⇒ Object
- #author_date_breakdown(ret) ⇒ Object
- #author_date_to_hash(ret) ⇒ Object
-
#citations(ret) ⇒ Object
TODO: configure how multiple ids are joined, from template?.
- #citations_iterate_cite_styles(bib, i18n) ⇒ Object
-
#disambig_author_date_citations(ret) ⇒ Object
takes array of { id, type, author, date, ord, data }.
- #enhance_data(cites) ⇒ Object
- #extract_uri_for_lookup(cite) ⇒ Object
- #extract_uris_for_lookup(cites) ⇒ Object
-
#initialize(opt = {}) ⇒ Citations
constructor
A new instance of Citations.
-
#render(ret) ⇒ Object
takes array of { id, type, author, date, ord, data }.
- #render1(cit) ⇒ Object
- #render1_prep(cit) ⇒ Object
- #renderer(_cite) ⇒ Object
- #sort_ord(ret) ⇒ Object
- #suffix_date(ret) ⇒ Object
- #suffix_date1(ret, key1, key2) ⇒ Object
- #use_terminator?(ref, final, _cit) ⇒ Boolean
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 (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 (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 = (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 (ret) (suffix_date(sort_ord((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 |, v| v.each_key do |date| ret[][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
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 |