From a7791635aa98f012d35f97c3c5288494bbb28e38 Mon Sep 17 00:00:00 2001 From: Miquel Sabaté Solà Date: Wed, 13 Mar 2024 18:03:43 +0100 Subject: Initial commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miquel Sabaté Solà --- lib/uoc_exporter.rb | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 lib/uoc_exporter.rb (limited to 'lib/uoc_exporter.rb') diff --git a/lib/uoc_exporter.rb b/lib/uoc_exporter.rb new file mode 100644 index 0000000..9a83d7c --- /dev/null +++ b/lib/uoc_exporter.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +class UocExporter < BaseExporter + def export + @things.map.with_index do |thing, idx| + if idx.zero? + "\\hypertarget{#{thing.target}}{#{head(thing:)} #{body(thing:)}}" + else + "#{tex_new_line}\\hypertarget{#{thing.target}}{#{head(thing:)} #{body(thing:)}}" + end + end.join("\n\n") + end + + protected + + # Returns the head of a line, containing authors, year, title and, if + # available, the "inside of" information. + def head(thing:) + str = "#{parse_authors(thing:)} (#{thing.year}). \\emph{#{thing.title}}." + + if thing.insideof.present? + str += " #{inside_of(thing.insideof)}" + str += thing.pages.present? ? ", #{thing.pages}." : '.' + end + + str + end + + # Parse the authors as delivered by `thing.authors` and render them in the + # proper format. + def parse_authors(thing:) + str = thing.authors.split(',').map do |author| + first, last = parse_author(author: author.strip) + last.blank? ? "\\textsc{#{first}}" : "\\textsc{#{last}}, #{first}" + end.join('; ') + + str += ' (eds.)' if thing.editors + str + end + + # Returns the proper 'inside of' translated text. + def inside_of(sub) + str = if sub.downcase.start_with?(*%w[a e i o u]) + I18n.t('general.insideof-vowel') + else + I18n.t('general.insideof') + end + + str + " \\emph{#{sub}}" + end + + # Returns the 'body' of the line, which is the rest of it (i.e. note, + # publisher, year). + def body(thing:) + union, tail = thing_union_tail(thing:) + + if thing.publisher.present? + pub = thing.note.present? ? "#{thing.note}. #{thing.publisher}" : thing.publisher + pub + union + tail + else + tail + end + end + + # Returns a two-sized array containing the last bits of info from a line, + # being either the address, the url + access date, or just a final dot. The + # first item contains the 'union' of the last item of the returned array and + # the expected string that is going to be prefixed to it. + def thing_union_tail(thing:) + if thing.address.present? + [', ', "#{thing.address}: #{thing.year}."] + elsif thing.url.present? + ['. ', + "[\\url{#{thing.url}}]. [#{I18n.t('activerecord.attributes.thing.access')}: #{I18n.l( + thing.access, format: :long + ).downcase}]."] + else + ['', '.'] + end + end +end -- cgit v1.2.3