72 lines
1.7 KiB
Ruby
72 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Referator
|
|
class Footnotes
|
|
attr_reader :config
|
|
|
|
def initialize(config)
|
|
self.config = config
|
|
|
|
@references = {}
|
|
end
|
|
|
|
def make_ref(category, id)
|
|
category = category.to_sym if category.instance_of? String
|
|
config.categories.exists! category
|
|
@references[category] ||= []
|
|
@references[category].each do |reference|
|
|
return reference if reference.category == category && reference.id == id
|
|
end
|
|
reference = config.repo[category, id]
|
|
@references[category] << reference
|
|
reference
|
|
end
|
|
|
|
def fetch_footnotes = notes
|
|
|
|
def fetch_note(category, id)
|
|
category = category.to_sym if category.instance_of? String
|
|
config.categories.exists! category
|
|
index = 0
|
|
config.categories.names.each do |cur_category|
|
|
(@references[cur_category] ||= []).each do |reference|
|
|
index += 1
|
|
next if cur_category != category
|
|
|
|
return Note.new index, reference if reference.id == id
|
|
end
|
|
end
|
|
raise 'Unused note'
|
|
end
|
|
|
|
def render_footnotes(format)
|
|
format = format.to_sym if format.instance_of? String
|
|
config.formats.render_footnotes format, notes
|
|
end
|
|
|
|
private
|
|
|
|
def config=(config)
|
|
unless config.instance_of? Config
|
|
raise TypeError, "Expected #{Config}, got #{config.class}"
|
|
end
|
|
|
|
@config = config
|
|
end
|
|
|
|
def notes
|
|
index = 0
|
|
|
|
config.categories.names.to_h do |category|
|
|
[
|
|
category,
|
|
(@references[category] ||= [])
|
|
.map { |reference| Note.new (index += 1), reference }
|
|
.map(&:to_h)
|
|
.freeze,
|
|
]
|
|
end.freeze
|
|
end
|
|
end
|
|
end
|