class ChupaText::Decomposers::LibreOfficeGeneral

Public Class Methods

new(options) click to toggle source
Calls superclass method
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 25
def initialize(options)
  super
  @command = find_command
  debug do
    if @command
      "#{log_tag}[command][found] #{@command.path}"
    else
      "#{log_tag}[command][not-found]"
    end
  end
end

Public Instance Methods

decompose(data) { |pdf_data| ... } click to toggle source
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 43
def decompose(data)
  pdf_data = convert_to_pdf(data)
  return if pdf_data.nil?
  yield(pdf_data)
end
target?(data) click to toggle source
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 37
def target?(data)
  return false if @command.nil?
  @extensions.include?(data.extension) or
    @mime_types.include?(data.mime_type)
end

Private Instance Methods

convert_to_pdf(data) click to toggle source
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 74
def convert_to_pdf(data)
  Dir.mktmpdir do |temporary_directory|
    home_directory = File.join(temporary_directory, "home")
    FileUtils.mkdir_p(home_directory)
    output_directory = File.join(temporary_directory, "output")
    FileUtils.mkdir_p(output_directory)
    stdout_path = File.join(temporary_directory, "stdout.log")
    stderr_path = File.join(temporary_directory, "stderr.log")
    succeeded = @command.run("--nologo",
                             "--nolockcheck",
                             "--norestore",
                             "--headless",
                             "--convert-to", "pdf",
                             "--outdir", output_directory,
                             data.path.to_s,
                             {
                               :data => data,
                               :env => {
                                 "HOME" => home_directory,
                               },
                               :spawn_options => {
                                 :out => stdout_path,
                                 :err => stderr_path,
                               },
                             })
    unless succeeded
      error do
        tag = "#{log_tag}[convert][exited][abnormally]"
        [
          tag,
          "output: <#{File.read(stdout_path)}>",
          "error: <#{File.read(stderr_path)}>",
        ].join("\n")
      end
      return nil
    end
    pdf_path, = Dir.glob("#{output_directory}/*.pdf")
    if pdf_path.nil?
      error do
        tag = "#{log_tag}[convert][failed]"
        [
          "#{tag}: LibreOffice may be running",
          "output: <#{File.read(stdout_path)}>",
          "error: <#{File.read(stderr_path)}>",
        ].join("\n")
      end
      return nil
    end
    normalized_pdf_uri = data.uri.to_s.gsub(/\.[^.]+\z/, ".pdf")
    File.open(pdf_path, "rb") do |pdf|
      VirtualFileData.new(normalized_pdf_uri,
                          pdf,
                          :source_data => data)
    end
  end
end
expand_candidate(candidate) click to toggle source
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 69
def expand_candidate(candidate)
  Dir.glob("/opt/libreoffice*/program/#{candidate}").first or
    Dir.glob("C:/Program Files*/libreoffice*/program/#{candidate}.exe").first
end
find_command() click to toggle source
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 50
def find_command
  candidates = [
    @options[:libreoffice],
    ENV["LIBREOFFICE"],
    "libreoffice",
    "soffice",
  ]
  candidates.each do |candidate|
    next if candidate.nil?
    command = ExternalCommand.new(candidate)
    return command if command.exist?
    expanded_candidate = expand_candidate(candidate)
    next if expanded_candidate.nil?
    command = ExternalCommand.new(expanded_candidate)
    return command if command.exist?
  end
  nil
end
log_tag() click to toggle source
# File lib/chupa-text/decomposers/libreoffice-general.rb, line 131
def log_tag
  "[decomposer][libreoffice]"
end