Sha256: c4ef58c381fd14c5bf0990e5ea4b89f8464ed28229a58b44abb93a64a50e7ff7

Contents?: true

Size: 1.96 KB

Versions: 5

Compression:

Stored size: 1.96 KB

Contents

require "nokogiri"
require "liquid"
require 'pp'

module Relaton::Cli
  class XmlToHtmlRenderer
    def initialize(liquid_dir: nil, stylesheet: nil)
      @liquid_dir = liquid_dir
      @stylesheet = read_file(stylesheet)
      init_liquid_template_and_filesystem
    end

    def render(index_xml)
      Liquid::Template.
        parse(template).
        render(build_liquid_document(index_xml), { strict_variables: true })
    end

    def uri_for_extension(uri, extension)
      unless uri.nil?
        uri.sub(/\.[^.]+$/, ".#{extension.to_s}")
      end
    end

    # Render HTML
    #
    # This interface allow us to convert a Relaton XML to HTML
    # using the specified liquid template and stylesheets. It
    # also do some minor clean during this conversion.
    #
    def self.render(file, options)
      new(options).render(file)
    end

    private

    attr_reader :stylesheet, :liquid_dir, :template

    def read_file(file)
      File.read(file, encoding: "utf-8")
    end

    def build_liquid_document(source)
      bibcollection = build_bibcollection(source)

      hash_to_liquid({
        depth: 2,
        css: stylesheet,
        title: bibcollection.title,
        author: bibcollection.author,
        documents: document_items(bibcollection)
      })
    end

    def init_liquid_template_and_filesystem
      file_system = Liquid::LocalFileSystem.new(liquid_dir)
      @template = read_file(file_system.full_path("index"))

      Liquid::Template.file_system = file_system
    end

    # TODO: This should be recursive, but it's not
    def hash_to_liquid(hash)
      hash.map { |key, value| [key.to_s, empty2nil(value)] }.to_h
    end

    def empty2nil(value)
      value unless value.is_a?(String) && value.empty? && !value.nil?
    end

    def build_bibcollection(source)
      Relaton::Bibcollection.from_xml(Nokogiri::XML(source))
    end

    def document_items(bibcollection)
      bibcollection.to_h["root"]["items"].map { |item| hash_to_liquid(item) }
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
relaton-cli-0.8.2 lib/relaton/cli/xml_to_html_renderer.rb
relaton-cli-0.8.1 lib/relaton/cli/xml_to_html_renderer.rb
relaton-cli-0.8.0 lib/relaton/cli/xml_to_html_renderer.rb
relaton-cli-0.7.0 lib/relaton/cli/xml_to_html_renderer.rb
relaton-cli-0.6.0 lib/relaton/cli/xml_to_html_renderer.rb