lib/princely.rb in princely-1.2.5 vs lib/princely.rb in princely-1.3.0

- old
+ new

@@ -14,26 +14,48 @@ # :type => 'application/pdf' # ) # $:.unshift(File.dirname(__FILE__)) require 'logger' +require 'princely/rails' if defined?(Rails) class Princely - VERSION = "1.0.0" unless const_defined?("VERSION") - attr_accessor :exe_path, :style_sheets, :log_file, :logger # Initialize method # - def initialize() + def initialize(options={}) # Finds where the application lives, so we can call it. - @exe_path = `which prince`.chomp + @exe_path = options[:path] || find_prince_executable raise "Cannot find prince command-line app in $PATH" if @exe_path.length == 0 - @style_sheets = '' - @log_file = "#{RAILS_ROOT}/log/prince.log" - @logger = RAILS_DEFAULT_LOGGER + raise "Cannot find prince command-line app at #{@exe_path}" if @exe_path && !File.executable?(@exe_path) + @style_sheets = '' + @log_file = options[:log_file] + @logger = options[:logger] end + + def logger + @logger ||= defined?(Rails) ? Rails.logger : StdoutLogger + end + + def log_file + @log_file ||= defined?(Rails) ? + Rails.root.join("log/prince.log") : + File.expand_path(File.dirname(__FILE__) + "/log/prince.log") + end + + def ruby_platform + RUBY_PLATFORM + end + + def find_prince_executable + if ruby_platform =~ /mswin32/ + "C:/Program Files/Prince/Engine/bin/prince" + else + `which prince`.chomp + end + end # Sets stylesheets... # Can pass in multiple paths for css files. # def add_style_sheets(*sheets) @@ -45,11 +67,11 @@ # Returns fully formed executable path with any command line switches # we've set based on our variables. # def exe_path # Add any standard cmd line arguments we need to pass - @exe_path << " --input=html --server --log=#{@log_file} " + @exe_path << " --input=html --server --log=#{log_file} " @exe_path << @style_sheets return @exe_path end # Makes a pdf from a passed in string. @@ -72,18 +94,19 @@ pdf = IO.popen(path, "w+") pdf.puts(string) pdf.close_write result = pdf.gets(nil) pdf.close_read + result.force_encoding('BINARY') if RUBY_VERSION >= "1.9" return result end def pdf_from_string_to_file(string, output_file) path = self.exe_path() # Don't spew errors to the standard out...and set up to take IO # as input and output - path << " --silent - -o #{output_file} >> #{@log_file} 2>> #{@log_file}" + path << " --silent - -o '#{output_file}' >> '#{log_file}' 2>> '#{log_file}'" # Show the command used... logger.info "\n\nPRINCE XML PDF COMMAND" logger.info path logger.info '' @@ -91,6 +114,12 @@ # Actually call the prince command, and pass the entire data stream back. pdf = IO.popen(path, "w+") pdf.puts(string) pdf.close end -end \ No newline at end of file + + class StdoutLogger + def self.info(msg) + puts msg + end + end +end